@bevel-software/platform-core-backend 0.20.0 → 0.22.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 +55 -107
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +41 -4
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +183 -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-requests.contract.d.ts +75 -0
- package/dist/modules/access/access-requests.contract.d.ts.map +1 -0
- package/dist/modules/access/access-requests.contract.js +20 -0
- package/dist/modules/access/access-requests.contract.js.map +1 -0
- package/dist/modules/access/access-requests.routes.d.ts +35 -0
- package/dist/modules/access/access-requests.routes.d.ts.map +1 -0
- package/dist/modules/access/access-requests.routes.js +237 -0
- package/dist/modules/access/access-requests.routes.js.map +1 -0
- package/dist/modules/access/access-requests.service.d.ts +123 -0
- package/dist/modules/access/access-requests.service.d.ts.map +1 -0
- package/dist/modules/access/access-requests.service.js +337 -0
- package/dist/modules/access/access-requests.service.js.map +1 -0
- package/dist/modules/access/access.routes.d.ts +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/access-model/access-grammar.d.ts +12 -0
- package/dist/modules/access-model/access-grammar.d.ts.map +1 -1
- package/dist/modules/access-model/access-grammar.js +24 -0
- package/dist/modules/access-model/access-grammar.js.map +1 -1
- package/dist/modules/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 +45 -2
- package/dist/modules/auth/auth.service.d.ts.map +1 -1
- package/dist/modules/auth/auth.service.js +44 -3
- 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/github-app/github-app.client.d.ts +101 -0
- package/dist/modules/github-app/github-app.client.d.ts.map +1 -0
- package/dist/modules/github-app/github-app.client.js +222 -0
- package/dist/modules/github-app/github-app.client.js.map +1 -0
- package/dist/modules/github-app/github-app.connection.d.ts +102 -0
- package/dist/modules/github-app/github-app.connection.d.ts.map +1 -0
- package/dist/modules/github-app/github-app.connection.js +185 -0
- package/dist/modules/github-app/github-app.connection.js.map +1 -0
- package/dist/modules/github-app/github-app.routes.d.ts +59 -0
- package/dist/modules/github-app/github-app.routes.d.ts.map +1 -0
- package/dist/modules/github-app/github-app.routes.js +323 -0
- package/dist/modules/github-app/github-app.routes.js.map +1 -0
- package/dist/modules/github-app/index.d.ts +4 -0
- package/dist/modules/github-app/index.d.ts.map +1 -0
- package/dist/modules/github-app/index.js +4 -0
- package/dist/modules/github-app/index.js.map +1 -0
- package/dist/modules/kb-fs/branch-name.d.ts +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/remote-url.d.ts +22 -0
- package/dist/modules/kb-fs/remote-url.d.ts.map +1 -0
- package/dist/modules/kb-fs/remote-url.js +35 -0
- package/dist/modules/kb-fs/remote-url.js.map +1 -0
- package/dist/modules/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-proposals.d.ts +17 -5
- package/dist/modules/plugins/join-proposals.d.ts.map +1 -1
- package/dist/modules/plugins/join-proposals.js +76 -22
- package/dist/modules/plugins/join-proposals.js.map +1 -1
- package/dist/modules/plugins/join-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 +113 -18
- package/dist/modules/plugins/join-requests.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-requests.service.js +178 -33
- 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 +48 -17
- 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 +34 -9
- package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
- package/dist/modules/settings/deployment-settings.service.js +113 -26
- package/dist/modules/settings/deployment-settings.service.js.map +1 -1
- package/dist/modules/settings/managed-repository.d.ts +43 -0
- package/dist/modules/settings/managed-repository.d.ts.map +1 -0
- package/dist/modules/settings/managed-repository.js +60 -0
- package/dist/modules/settings/managed-repository.js.map +1 -0
- package/dist/modules/settings/repository-source.d.ts +128 -0
- package/dist/modules/settings/repository-source.d.ts.map +1 -0
- package/dist/modules/settings/repository-source.js +150 -0
- package/dist/modules/settings/repository-source.js.map +1 -0
- package/dist/modules/settings/setup.routes.d.ts +34 -4
- package/dist/modules/settings/setup.routes.d.ts.map +1 -1
- package/dist/modules/settings/setup.routes.js +198 -18
- 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 +8 -9
- package/dist/modules/skills/skill-access-requests.routes.d.ts.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.js +26 -65
- 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-helpers/tool-context.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-context.js +15 -0
- package/dist/modules/tool-helpers/tool-context.js.map +1 -1
- package/dist/modules/tool-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 +47 -11
- package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
- package/dist/modules/workflow/git/git.service.d.ts +14 -6
- package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/git.service.js +40 -18
- 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 +40 -5
- package/dist/modules/workflow/git/node-git-runner.js.map +1 -1
- package/dist/modules/workflow/git/pull-request.service.d.ts +45 -0
- package/dist/modules/workflow/git/pull-request.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/pull-request.service.js +99 -0
- package/dist/modules/workflow/git/pull-request.service.js.map +1 -1
- package/dist/modules/workflow/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.routes.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.routes.js +3 -1
- package/dist/modules/workflow/workflow.routes.js.map +1 -1
- package/dist/modules/workflow/workflow.service.d.ts +42 -10
- package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.service.js +181 -71
- 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 +70 -7
- package/dist/modules/workspace/startup/kb-startup-runner.d.ts.map +1 -1
- package/dist/modules/workspace/startup/kb-startup-runner.js +183 -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 +49 -29
- 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 +48 -20
- 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/domain-errors.d.ts +39 -0
- package/dist/shared/domain-errors.d.ts.map +1 -1
- package/dist/shared/domain-errors.js +55 -0
- package/dist/shared/domain-errors.js.map +1 -1
- package/dist/shared/git.contract.d.ts +62 -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 +64 -107
- package/src/core/create-core-services.ts +238 -96
- 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-requests.recut.test.ts +134 -0
- package/src/modules/access/__tests__/access-requests.routes.test.ts +610 -0
- package/src/modules/access/__tests__/access.routes.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-requests.contract.ts +93 -0
- package/src/modules/access/access-requests.routes.ts +286 -0
- package/src/modules/access/access-requests.service.ts +420 -0
- package/src/modules/access/access.routes.ts +10 -13
- package/src/modules/access/change-read-gate.ts +10 -4
- package/src/modules/access/creator-access.ts +7 -2
- package/src/modules/access-model/access-grammar.ts +22 -0
- 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 +98 -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 +61 -2
- 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/github-app/__tests__/github-app.test.ts +848 -0
- package/src/modules/github-app/github-app.client.ts +268 -0
- package/src/modules/github-app/github-app.connection.ts +204 -0
- package/src/modules/github-app/github-app.routes.ts +359 -0
- package/src/modules/github-app/index.ts +19 -0
- package/src/modules/kb-fs/__tests__/branch-name.test.ts +6 -6
- package/src/modules/kb-fs/__tests__/clone-config.test.ts +24 -20
- package/src/modules/kb-fs/__tests__/remote-url.test.ts +38 -0
- 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/remote-url.ts +35 -0
- 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-proposals.test.ts +100 -19
- package/src/modules/plugins/__tests__/join-request-jobs.service.test.ts +2 -1
- package/src/modules/plugins/__tests__/join-requests.service.test.ts +28 -11
- package/src/modules/plugins/__tests__/join-requests.settlement.test.ts +371 -0
- 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 +12 -3
- 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-proposals.ts +87 -19
- package/src/modules/plugins/join-request-jobs.service.ts +8 -7
- package/src/modules/plugins/join-requests.service.ts +203 -43
- 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 +48 -17
- 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__/repository-source.test.ts +191 -0
- package/src/modules/settings/__tests__/setup.routes.boot-failure.test.ts +2 -1
- package/src/modules/settings/__tests__/setup.routes.git-mode.test.ts +353 -0
- package/src/modules/settings/__tests__/setup.routes.github-app.test.ts +282 -0
- package/src/modules/settings/__tests__/setup.routes.layout-phase.test.ts +7 -4
- package/src/modules/settings/__tests__/setup.routes.managed-phase.test.ts +233 -0
- 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 +130 -23
- package/src/modules/settings/managed-repository.ts +68 -0
- package/src/modules/settings/repository-source.ts +197 -0
- package/src/modules/settings/setup.routes.ts +233 -19
- 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 +7 -2
- 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 +29 -79
- 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-helpers/tool-context.ts +15 -0
- 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 +11 -2
- 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 +187 -35
- 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 +148 -41
- package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +143 -2
- package/src/modules/workflow/agent-tools/workflow.tools.ts +60 -12
- 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 +130 -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/__tests__/pull-request.service.getPrDetail.test.ts +145 -2
- package/src/modules/workflow/git/__tests__/pull-request.service.viewer-can-delete.test.ts +166 -0
- package/src/modules/workflow/git/git.service.ts +49 -17
- package/src/modules/workflow/git/node-git-runner.ts +43 -4
- package/src/modules/workflow/git/pull-request.service.ts +119 -0
- 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.routes.ts +3 -1
- package/src/modules/workflow/workflow.service.ts +201 -76
- 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 +45 -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 +237 -10
- package/src/modules/workspace/__tests__/workspace.tools.test.ts +44 -11
- 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 +240 -21
- package/src/modules/workspace/startup/kb-git.ts +15 -22
- package/src/modules/workspace/startup/kb-startup-runner.ts +198 -45
- 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 +47 -28
- package/src/modules/workspace/workspace.tools.ts +56 -20
- package/src/modules/workspace/write-denial.ts +7 -5
- package/src/shared/__tests__/kb-layout.plugin.test.ts +19 -16
- package/src/shared/domain-errors.ts +58 -0
- package/src/shared/git.contract.ts +80 -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,233 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import fs from 'node:fs/promises';
|
|
3
|
+
import type { Server as HttpServer } from 'node:http';
|
|
4
|
+
import type { AddressInfo } from 'node:net';
|
|
5
|
+
import os from 'node:os';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import { promisify } from 'node:util';
|
|
8
|
+
import express from 'express';
|
|
9
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
10
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
11
|
+
import { createSetupRoutes } from '../setup.routes.js';
|
|
12
|
+
import { DeploymentSettingsService } from '../deployment-settings.service.js';
|
|
13
|
+
import { ManagedRepository } from '../managed-repository.js';
|
|
14
|
+
import { RepositorySource } from '../repository-source.js';
|
|
15
|
+
import { KbStartupRunner } from '../../workspace/startup/kb-startup-runner.js';
|
|
16
|
+
import { NodeGitRunner } from '../../workflow/git/node-git-runner.js';
|
|
17
|
+
import { TemplateFilesStep } from '../../workspace/startup/steps/template-files.step.js';
|
|
18
|
+
import { NodeFs } from '../../kb-fs/node-fs.js';
|
|
19
|
+
import { defaultKbTemplateDir } from '../../../assets.js';
|
|
20
|
+
import type { Database } from '../../database/connection.js';
|
|
21
|
+
import type { IAdminAccessService } from '../../admin/admin.interface.js';
|
|
22
|
+
import type { KbContext } from '../../../shared/kb-context.js';
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* A repository the deployment keeps, and the REAL startup phase, wired the
|
|
26
|
+
* way the composition root wires them: the phase asks the repository source
|
|
27
|
+
* where the repository is, and git runs with what the source presents.
|
|
28
|
+
*
|
|
29
|
+
* A fake phase proves the routes chose the right address. It cannot see
|
|
30
|
+
* whether a bare repository on a disk is something the phase can seed,
|
|
31
|
+
* clone and push to, or what happens to the working copies of a repository
|
|
32
|
+
* the deployment has moved away from. This looks at the disk afterwards.
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
const execFileAsync = promisify(execFile);
|
|
36
|
+
const ENC_KEY = 'kToAi8FXWDpDn3A6yQ/60O39bv05N7XzVOIu/0CJrFc=';
|
|
37
|
+
const KB_ENV = ['KB_REPO_URL', 'GIT_TOKEN', 'GIT_USERNAME', 'GIT_MODE', 'GITHUB_TOKEN', 'DEFAULT_BRANCH', 'PROTECTED_BRANCHES'] as const;
|
|
38
|
+
|
|
39
|
+
const gitEnv = {
|
|
40
|
+
...process.env,
|
|
41
|
+
GIT_AUTHOR_NAME: 'Test',
|
|
42
|
+
GIT_AUTHOR_EMAIL: 't@x.com',
|
|
43
|
+
GIT_COMMITTER_NAME: 'Test',
|
|
44
|
+
GIT_COMMITTER_EMAIL: 't@x.com',
|
|
45
|
+
};
|
|
46
|
+
const git = async (cwd: string, args: string[]) =>
|
|
47
|
+
(await execFileAsync('git', args, { cwd, env: gitEnv })).stdout.toString().trim();
|
|
48
|
+
|
|
49
|
+
let root: string;
|
|
50
|
+
let server: HttpServer | null = null;
|
|
51
|
+
let savedEnv: Partial<Record<(typeof KB_ENV)[number], string | undefined>> = {};
|
|
52
|
+
|
|
53
|
+
beforeEach(async () => {
|
|
54
|
+
savedEnv = {};
|
|
55
|
+
for (const k of KB_ENV) {
|
|
56
|
+
savedEnv[k] = process.env[k];
|
|
57
|
+
delete process.env[k];
|
|
58
|
+
}
|
|
59
|
+
root = await fs.mkdtemp(path.join(os.tmpdir(), 'setup-managed-phase-'));
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
afterEach(async () => {
|
|
63
|
+
server?.close();
|
|
64
|
+
server = null;
|
|
65
|
+
for (const k of KB_ENV) {
|
|
66
|
+
const original = savedEnv[k];
|
|
67
|
+
if (original === undefined) delete process.env[k];
|
|
68
|
+
else process.env[k] = original;
|
|
69
|
+
}
|
|
70
|
+
await fs.rm(root, { recursive: true, force: true });
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
/** A deployment: its settings, its repository source, the real phase, and the setup routes over them. */
|
|
74
|
+
function boot(kb: KbContext) {
|
|
75
|
+
const db = {
|
|
76
|
+
select: () => ({ from: () => Promise.resolve([]) }),
|
|
77
|
+
insert: () => ({ values: () => ({ onConflictDoUpdate: () => Promise.resolve() }) }),
|
|
78
|
+
delete: () => ({ where: () => Promise.resolve() }),
|
|
79
|
+
} as unknown as Database;
|
|
80
|
+
const settings = new DeploymentSettingsService(db, ENC_KEY);
|
|
81
|
+
const managed = new ManagedRepository(path.join(root, 'backups', 'managed-repository'));
|
|
82
|
+
// A deployment reaching a repository by its address has one on a host; here
|
|
83
|
+
// it is a folder, which the source hands over as it would hand a URL.
|
|
84
|
+
const hosted = path.join(root, 'hosted.git');
|
|
85
|
+
const source = new RepositorySource({
|
|
86
|
+
read: (key) => (key === 'kbRepoUrl' && settings.resolve('kbRepoUrl') ? hosted : settings.resolve(key)),
|
|
87
|
+
managed,
|
|
88
|
+
});
|
|
89
|
+
const gitRunner = new NodeGitRunner(60_000, source.credentials);
|
|
90
|
+
const workspacesRoot = path.join(root, 'workspaces');
|
|
91
|
+
const setAsideRoot = path.join(root, 'backups', 'replaced-working-copies');
|
|
92
|
+
const runner = new KbStartupRunner({
|
|
93
|
+
gitRunner,
|
|
94
|
+
kbRepoUrl: () => source.url(),
|
|
95
|
+
workspacesRoot,
|
|
96
|
+
setAsideRoot,
|
|
97
|
+
kbDirName: 'knowledge-base',
|
|
98
|
+
templateDir: defaultKbTemplateDir(),
|
|
99
|
+
defaultBranch: () => kb.defaultBranch,
|
|
100
|
+
protectedBranches: () => [...kb.protectedBranches],
|
|
101
|
+
seedAdminEmails: ['admin@example.com'],
|
|
102
|
+
// A step that works on every branch, so the phase makes each its working copy.
|
|
103
|
+
steps: [new TemplateFilesStep(new NodeFs(), kb)],
|
|
104
|
+
buildSeedTree: async (dir) => {
|
|
105
|
+
await fs.writeFile(path.join(dir, 'WELCOME.md'), 'seeded\n', 'utf8');
|
|
106
|
+
return ['WELCOME.md'];
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
const app = express();
|
|
110
|
+
app.use(express.json());
|
|
111
|
+
app.use((req, _res, next) => {
|
|
112
|
+
req.userEmail = 'root@example.com';
|
|
113
|
+
req.userId = 'user-1';
|
|
114
|
+
next();
|
|
115
|
+
});
|
|
116
|
+
app.use(
|
|
117
|
+
'/api',
|
|
118
|
+
createSetupRoutes(
|
|
119
|
+
settings,
|
|
120
|
+
{ isAdmin: async () => true } as IAdminAccessService,
|
|
121
|
+
runner,
|
|
122
|
+
kb,
|
|
123
|
+
undefined,
|
|
124
|
+
async () => ({ outcome: 'connected', branches: ['main'], defaultBranch: 'main', empty: false }),
|
|
125
|
+
undefined,
|
|
126
|
+
undefined,
|
|
127
|
+
undefined,
|
|
128
|
+
undefined,
|
|
129
|
+
{ source, ensureManaged: (branch) => managed.ensure(gitRunner, branch) },
|
|
130
|
+
),
|
|
131
|
+
);
|
|
132
|
+
server = app.listen(0);
|
|
133
|
+
const base = `http://127.0.0.1:${(server.address() as AddressInfo).port}`;
|
|
134
|
+
const save = async (entries: Record<string, string>) => {
|
|
135
|
+
const res = await fetch(`${base}/api/setup/settings`, {
|
|
136
|
+
method: 'POST',
|
|
137
|
+
headers: { 'content-type': 'application/json' },
|
|
138
|
+
body: JSON.stringify({ settings: entries }),
|
|
139
|
+
});
|
|
140
|
+
return { status: res.status, body: (await res.json()) as Record<string, unknown> };
|
|
141
|
+
};
|
|
142
|
+
const workingCopy = (branch: string) => path.join(workspacesRoot, encodeURIComponent(branch), 'knowledge-base');
|
|
143
|
+
return { save, managed, hosted, runner, source, workingCopy, setAsideRoot };
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
describe('the save that chooses a repository the deployment keeps', () => {
|
|
147
|
+
it('creates it, seeds it and clones from it, asking for nothing else', async () => {
|
|
148
|
+
const { save, managed, workingCopy } = boot(testKbContext({ branchModel: null }));
|
|
149
|
+
const { status, body } = await save({ gitMode: 'managed' });
|
|
150
|
+
expect(status, JSON.stringify(body)).toBe(200);
|
|
151
|
+
expect(body).toMatchObject({ complete: true, restartRequired: false });
|
|
152
|
+
|
|
153
|
+
// The repository is where the source says, bare, and holds the seed on the branch named for it.
|
|
154
|
+
expect(await git(managed.path, ['rev-parse', '--is-bare-repository'])).toBe('true');
|
|
155
|
+
expect(await git(managed.path, ['for-each-ref', '--format=%(refname)'])).toBe('refs/heads/main');
|
|
156
|
+
expect(await git(managed.path, ['ls-tree', '-r', '--name-only', 'main'])).toContain('WELCOME.md');
|
|
157
|
+
|
|
158
|
+
// The working copy is a clone of it, and carries no credential helper: there is no credential.
|
|
159
|
+
const copy = workingCopy('main');
|
|
160
|
+
expect(await git(copy, ['config', '--get', 'remote.origin.url'])).toBe(managed.path);
|
|
161
|
+
expect((await fs.readFile(path.join(copy, 'WELCOME.md'), 'utf8')).replace(/\r\n/g, '\n')).toBe('seeded\n');
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
it('takes a push from a working copy, like any remote', async () => {
|
|
165
|
+
const { save, managed, workingCopy } = boot(testKbContext({ branchModel: null }));
|
|
166
|
+
await save({ gitMode: 'managed' });
|
|
167
|
+
const copy = workingCopy('main');
|
|
168
|
+
await fs.writeFile(path.join(copy, 'note.md'), 'a change\n', 'utf8');
|
|
169
|
+
await git(copy, ['add', '-A']);
|
|
170
|
+
await git(copy, ['commit', '-m', 'a change']);
|
|
171
|
+
await git(copy, ['push', 'origin', 'main']);
|
|
172
|
+
expect(await git(managed.path, ['ls-tree', '-r', '--name-only', 'main'])).toContain('note.md');
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
describe('a deployment that moves to a repository it keeps', () => {
|
|
177
|
+
it('leaves the repository it had untouched and sets its working copies aside, unpushed work included', async () => {
|
|
178
|
+
const { save, managed, hosted, runner, source, workingCopy, setAsideRoot } = boot(
|
|
179
|
+
testKbContext({ branchModel: { defaultBranch: 'main', protectedBranches: ['main'] } }),
|
|
180
|
+
);
|
|
181
|
+
// A deployment on a repository of its own, set up and serving. The
|
|
182
|
+
// repository has a history of ITS OWN, written here and not by the
|
|
183
|
+
// startup phase: two empty repositories the phase seeds within the
|
|
184
|
+
// same second get the same first commit (same tree, same author, same
|
|
185
|
+
// time), and the phase would then read them, rightly, as one repository
|
|
186
|
+
// at two addresses, and keep the working copy instead of setting it
|
|
187
|
+
// aside. A fast machine did exactly that.
|
|
188
|
+
await git(root, ['init', '--bare', '-b', 'main', hosted]);
|
|
189
|
+
const theirs = path.join(root, 'theirs');
|
|
190
|
+
await fs.mkdir(theirs);
|
|
191
|
+
await git(theirs, ['init', '-b', 'main']);
|
|
192
|
+
await fs.writeFile(path.join(theirs, 'HANDBOOK.md'), 'what this organisation had before\n', 'utf8');
|
|
193
|
+
await git(theirs, ['add', '-A']);
|
|
194
|
+
await git(theirs, ['commit', '-m', 'the handbook']);
|
|
195
|
+
await git(theirs, ['push', hosted, 'main']);
|
|
196
|
+
const first = await save({ kbRepoUrl: 'https://git.example.com/acme/kb.git', gitToken: 'a-token', defaultBranch: 'main', protectedBranches: 'main' });
|
|
197
|
+
expect(first.status, JSON.stringify(first.body)).toBe(200);
|
|
198
|
+
const copy = workingCopy('main');
|
|
199
|
+
expect(await git(copy, ['config', '--get', 'remote.origin.url'])).toBe(hosted);
|
|
200
|
+
// Work that was committed and never pushed.
|
|
201
|
+
await fs.writeFile(path.join(copy, 'unpushed.md'), 'only here\n', 'utf8');
|
|
202
|
+
await git(copy, ['add', '-A']);
|
|
203
|
+
await git(copy, ['commit', '-m', 'never pushed']);
|
|
204
|
+
const hostedBefore = await git(hosted, ['for-each-ref']);
|
|
205
|
+
|
|
206
|
+
const moved = await save({ gitMode: 'managed' });
|
|
207
|
+
expect(moved.body).toMatchObject({ ok: true, restartRequired: true });
|
|
208
|
+
// Until the restart the working copy is where it was, and so is the
|
|
209
|
+
// deployment: the repository it has is the one it goes on talking to.
|
|
210
|
+
expect(await git(copy, ['config', '--get', 'remote.origin.url'])).toBe(hosted);
|
|
211
|
+
expect(source.url()).toBe(hosted);
|
|
212
|
+
|
|
213
|
+
// The restart: the deployment is built on the mode chosen, and the
|
|
214
|
+
// phase brings the working copies into line.
|
|
215
|
+
source.takeEffect();
|
|
216
|
+
await runner.runAll();
|
|
217
|
+
|
|
218
|
+
expect(await git(hosted, ['for-each-ref'])).toBe(hostedBefore);
|
|
219
|
+
expect(await git(copy, ['config', '--get', 'remote.origin.url'])).toBe(managed.path);
|
|
220
|
+
expect(await fs.access(path.join(copy, 'unpushed.md')).then(() => true, () => false)).toBe(false);
|
|
221
|
+
const managedHolds = await git(managed.path, ['ls-tree', '-r', '--name-only', 'main']);
|
|
222
|
+
expect(managedHolds).toContain('WELCOME.md');
|
|
223
|
+
// Nothing of one repository was pushed into the other.
|
|
224
|
+
expect(managedHolds).not.toContain('HANDBOOK.md');
|
|
225
|
+
expect(managedHolds).not.toContain('unpushed.md');
|
|
226
|
+
|
|
227
|
+
// What was set aside is whole: the commit nobody pushed is in it.
|
|
228
|
+
const [stamp] = await fs.readdir(setAsideRoot);
|
|
229
|
+
const kept = path.join(setAsideRoot, stamp!, encodeURIComponent('main'));
|
|
230
|
+
expect(await git(kept, ['log', '-1', '--format=%s'])).toBe('never pushed');
|
|
231
|
+
expect((await fs.readFile(path.join(kept, 'unpushed.md'), 'utf8')).replace(/\r\n/g, '\n')).toBe('only here\n');
|
|
232
|
+
});
|
|
233
|
+
});
|
|
@@ -9,6 +9,7 @@ import { OidcAuthProvider, oidcSettingsFrom } from '../../auth/oidc-auth-provide
|
|
|
9
9
|
import type { AuthService } from '../../auth/auth.service.js';
|
|
10
10
|
import type { Database } from '../../database/connection.js';
|
|
11
11
|
import type { IAdminAccessService } from '../../admin/admin.interface.js';
|
|
12
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
12
13
|
|
|
13
14
|
const ENC_KEY = 'kToAi8FXWDpDn3A6yQ/60O39bv05N7XzVOIu/0CJrFc=';
|
|
14
15
|
const ISSUER = 'https://login.example.com/tenant/v2.0';
|
|
@@ -118,6 +119,7 @@ function listen(opts: {
|
|
|
118
119
|
settings,
|
|
119
120
|
{ isAdmin: async () => opts.isAdmin ?? true } as IAdminAccessService,
|
|
120
121
|
{ runAll: async () => {} },
|
|
122
|
+
testKbContext(),
|
|
121
123
|
undefined,
|
|
122
124
|
// No repository in these suites, so the connection check is never reached.
|
|
123
125
|
async () => {
|
|
@@ -7,6 +7,7 @@ import { createSetupRoutes, type LastSyncStatus } from '../setup.routes.js';
|
|
|
7
7
|
import { DeploymentSettingsService } from '../deployment-settings.service.js';
|
|
8
8
|
import type { IAdminAccessService } from '../../admin/admin.interface.js';
|
|
9
9
|
import type { Database } from '../../database/connection.js';
|
|
10
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
10
11
|
|
|
11
12
|
/**
|
|
12
13
|
* The remote-sync facts on `GET /setup/status`: the address a hook calls and
|
|
@@ -41,6 +42,7 @@ function listen(isAdmin: boolean, last: LastSyncStatus | null) {
|
|
|
41
42
|
settings,
|
|
42
43
|
{ isAdmin: async () => isAdmin } as IAdminAccessService,
|
|
43
44
|
{ runAll: async () => {} },
|
|
45
|
+
testKbContext(),
|
|
44
46
|
{ url: 'https://hexis.example.test/api/sync', lastSync: () => last },
|
|
45
47
|
),
|
|
46
48
|
);
|
|
@@ -1,34 +1,10 @@
|
|
|
1
1
|
import type { Server as HttpServer } from 'node:http';
|
|
2
2
|
import type { AddressInfo } from 'node:net';
|
|
3
3
|
import express from 'express';
|
|
4
|
-
import { afterEach, beforeEach, describe, expect, it
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
configureBranchModel,
|
|
9
|
-
configureKbLayout,
|
|
10
|
-
currentKbLayout,
|
|
11
|
-
type KbLayout,
|
|
12
|
-
} from '@bevel-software/platform-shared';
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* test-setup configures the branch model from the environment, and nothing
|
|
16
|
-
* unconfigures it; a test that needs the first-run "no branch model yet" state
|
|
17
|
-
* says so here. Everything else is the real module.
|
|
18
|
-
*/
|
|
19
|
-
const branchModel = vi.hoisted(() => ({ pretendUnconfigured: false }));
|
|
20
|
-
vi.mock('@bevel-software/platform-shared', async (importOriginal) => {
|
|
21
|
-
const actual = await importOriginal<typeof import('@bevel-software/platform-shared')>();
|
|
22
|
-
return {
|
|
23
|
-
...actual,
|
|
24
|
-
isBranchModelConfigured: () => !branchModel.pretendUnconfigured && actual.isBranchModelConfigured(),
|
|
25
|
-
// Applying a model configures it, as the real module does.
|
|
26
|
-
configureBranchModel: (model: Parameters<typeof actual.configureBranchModel>[0]) => {
|
|
27
|
-
actual.configureBranchModel(model);
|
|
28
|
-
branchModel.pretendUnconfigured = false;
|
|
29
|
-
},
|
|
30
|
-
};
|
|
31
|
-
});
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
5
|
+
import type { KbLayout } from '@bevel-software/platform-shared';
|
|
6
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
7
|
+
import type { KbContext } from '../../../shared/kb-context.js';
|
|
32
8
|
import { createSetupRoutes } from '../setup.routes.js';
|
|
33
9
|
import { DeploymentSettingsService } from '../deployment-settings.service.js';
|
|
34
10
|
import type { Database } from '../../database/connection.js';
|
|
@@ -98,6 +74,12 @@ function listen(
|
|
|
98
74
|
runAll: () => Promise<void> = async () => {},
|
|
99
75
|
checkConnection?: (connection: RepositoryConnection) => Promise<ConnectionCheck>,
|
|
100
76
|
listFolders?: (listing: RootFolderListing) => Promise<string[] | null>,
|
|
77
|
+
/**
|
|
78
|
+
* The running graph's knowledge-base context, which the completing save
|
|
79
|
+
* applies the admin's names to. The default is a configured deployment; a
|
|
80
|
+
* suite that needs the first-run "no branch model yet" state passes its own.
|
|
81
|
+
*/
|
|
82
|
+
kb: KbContext = testKbContext(),
|
|
101
83
|
) {
|
|
102
84
|
const db = {
|
|
103
85
|
select: () => ({ from: () => Promise.resolve([]) }),
|
|
@@ -122,6 +104,7 @@ function listen(
|
|
|
122
104
|
// Default no-op: most suites never complete setup, so the runner is
|
|
123
105
|
// never reached. The completion-transition suite passes its own spy.
|
|
124
106
|
{ runAll },
|
|
107
|
+
kb,
|
|
125
108
|
undefined,
|
|
126
109
|
checkConnection,
|
|
127
110
|
listFolders,
|
|
@@ -129,7 +112,7 @@ function listen(
|
|
|
129
112
|
);
|
|
130
113
|
server = app.listen(0);
|
|
131
114
|
const { port } = server.address() as AddressInfo;
|
|
132
|
-
return { base: `http://127.0.0.1:${port}`, settings };
|
|
115
|
+
return { base: `http://127.0.0.1:${port}`, settings, kb };
|
|
133
116
|
}
|
|
134
117
|
|
|
135
118
|
const post = (base: string, path: string, body: unknown) =>
|
|
@@ -576,13 +559,13 @@ describe('POST /setup/settings — the completion transition and the KB startup
|
|
|
576
559
|
*/
|
|
577
560
|
describe('POST /setup/settings — the folder names on the completing save', () => {
|
|
578
561
|
const completing = { kbRepoUrl: 'https://example.com/acme/kb.git', gitToken: 'ghp_x' };
|
|
579
|
-
afterEach(() => configureKbLayout({ ...DEFAULT_KB_LAYOUT }));
|
|
580
562
|
|
|
581
563
|
it('applies them before the phase runs, and asks for no restart over them', async () => {
|
|
582
564
|
const seenByPhase: KbLayout[] = [];
|
|
565
|
+
const kb = testKbContext();
|
|
583
566
|
const { base } = listen(true, async () => {
|
|
584
|
-
seenByPhase.push(
|
|
585
|
-
}, connectedCheck().check);
|
|
567
|
+
seenByPhase.push(kb.layout);
|
|
568
|
+
}, connectedCheck().check, undefined, kb);
|
|
586
569
|
const res = await post(base, '/api/setup/settings', {
|
|
587
570
|
settings: { ...completing, knowledgeBaseDir: 'Docs', skillsDir: 'skills' },
|
|
588
571
|
});
|
|
@@ -592,35 +575,36 @@ describe('POST /setup/settings — the folder names on the completing save', ()
|
|
|
592
575
|
expect(body.restartRequired).toBe(false);
|
|
593
576
|
const applied = { knowledgeBaseDir: 'Docs', skillsDir: 'skills', pluginsDir: 'Plugins', agentsFile: 'AGENTS.md' };
|
|
594
577
|
expect(seenByPhase).toEqual([applied]);
|
|
595
|
-
expect(
|
|
578
|
+
expect(kb.layout).toEqual(applied);
|
|
596
579
|
});
|
|
597
580
|
|
|
598
581
|
it('applies names stored by an earlier, incomplete save', async () => {
|
|
599
582
|
const seenByPhase: KbLayout[] = [];
|
|
583
|
+
const kb = testKbContext();
|
|
600
584
|
const { base } = listen(true, async () => {
|
|
601
|
-
seenByPhase.push(
|
|
602
|
-
}, connectedCheck().check);
|
|
585
|
+
seenByPhase.push(kb.layout);
|
|
586
|
+
}, connectedCheck().check, undefined, kb);
|
|
603
587
|
await post(base, '/api/setup/settings', { settings: { pluginsDir: 'plugins' } });
|
|
604
|
-
expect(
|
|
588
|
+
expect(kb.layout.pluginsDir).toBe('Plugins');
|
|
605
589
|
await post(base, '/api/setup/settings', { settings: completing });
|
|
606
590
|
expect(seenByPhase[0]?.pluginsDir).toBe('plugins');
|
|
607
591
|
});
|
|
608
592
|
|
|
609
593
|
it('leaves them restart-to-apply once setup is complete', async () => {
|
|
610
|
-
const { base } = listen(true, undefined, connectedCheck().check);
|
|
594
|
+
const { base, kb } = listen(true, undefined, connectedCheck().check);
|
|
611
595
|
await post(base, '/api/setup/settings', { settings: completing });
|
|
612
596
|
const res = await post(base, '/api/setup/settings', { settings: { pluginsDir: 'plugins' } });
|
|
613
597
|
expect(res.status).toBe(200);
|
|
614
598
|
expect((await res.json()).restartRequired).toBe(true);
|
|
615
|
-
expect(
|
|
599
|
+
expect(kb.layout.pluginsDir).toBe('Plugins');
|
|
616
600
|
});
|
|
617
601
|
|
|
618
602
|
it('does not replace a layout the process already runs', async () => {
|
|
619
|
-
|
|
603
|
+
const kb = testKbContext({ layout: { knowledgeBaseDir: 'docs', skillsDir: 'skills', pluginsDir: 'plugins' } });
|
|
620
604
|
const seenByPhase: KbLayout[] = [];
|
|
621
605
|
const { base } = listen(true, async () => {
|
|
622
|
-
seenByPhase.push(
|
|
623
|
-
}, connectedCheck().check);
|
|
606
|
+
seenByPhase.push(kb.layout);
|
|
607
|
+
}, connectedCheck().check, undefined, kb);
|
|
624
608
|
const res = await post(base, '/api/setup/settings', {
|
|
625
609
|
settings: { ...completing, skillsDir: 'capabilities' },
|
|
626
610
|
});
|
|
@@ -634,10 +618,11 @@ describe('POST /setup/settings — the folder names on the completing save', ()
|
|
|
634
618
|
try {
|
|
635
619
|
const seenByPhase: KbLayout[] = [];
|
|
636
620
|
let fail = true;
|
|
621
|
+
const kb = testKbContext();
|
|
637
622
|
const { base } = listen(true, async () => {
|
|
638
|
-
seenByPhase.push(
|
|
623
|
+
seenByPhase.push(kb.layout);
|
|
639
624
|
if (fail) throw new Error('remote said no');
|
|
640
|
-
}, connectedCheck().check);
|
|
625
|
+
}, connectedCheck().check, undefined, kb);
|
|
641
626
|
const first = await post(base, '/api/setup/settings', {
|
|
642
627
|
settings: { ...completing, skillsDir: 'skills' },
|
|
643
628
|
});
|
|
@@ -650,7 +635,7 @@ describe('POST /setup/settings — the folder names on the completing save', ()
|
|
|
650
635
|
expect(body.complete).toBe(true);
|
|
651
636
|
expect(body.restartRequired).toBe(false);
|
|
652
637
|
expect(seenByPhase.map((l) => l.skillsDir)).toEqual(['skills', 'capabilities']);
|
|
653
|
-
expect(
|
|
638
|
+
expect(kb.layout.skillsDir).toBe('capabilities');
|
|
654
639
|
} finally {
|
|
655
640
|
console.error = consoleError;
|
|
656
641
|
}
|
|
@@ -671,16 +656,14 @@ describe('POST /setup/settings — the folder names on the completing save', ()
|
|
|
671
656
|
if (value === undefined) delete process.env[key];
|
|
672
657
|
else process.env[key] = value;
|
|
673
658
|
}
|
|
674
|
-
// Whatever the test applied, the rest of the worker runs on the pinned model.
|
|
675
|
-
configureBranchModel(branchModelFromEnv());
|
|
676
659
|
}
|
|
677
660
|
}
|
|
678
661
|
|
|
679
662
|
it('asks for no restart over a branch model the completing save also applied', () =>
|
|
680
663
|
withoutBranchEnv(async () => {
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
const { base } = listen(true, undefined, connectedCheck().check);
|
|
664
|
+
// A fresh deployment: no branch model yet, so the save applies the one it carries.
|
|
665
|
+
const fresh = testKbContext({ branchModel: null });
|
|
666
|
+
const { base, kb } = listen(true, undefined, connectedCheck().check, undefined, fresh);
|
|
684
667
|
const res = await post(base, '/api/setup/settings', {
|
|
685
668
|
settings: {
|
|
686
669
|
...completing,
|
|
@@ -693,9 +676,7 @@ describe('POST /setup/settings — the folder names on the completing save', ()
|
|
|
693
676
|
const body = await res.json();
|
|
694
677
|
expect(body.complete).toBe(true);
|
|
695
678
|
expect(body.restartRequired).toBe(false);
|
|
696
|
-
|
|
697
|
-
branchModel.pretendUnconfigured = false;
|
|
698
|
-
}
|
|
679
|
+
expect(kb.defaultBranch).toBe('production');
|
|
699
680
|
}));
|
|
700
681
|
|
|
701
682
|
it('still asks for a restart over a branch change once a branch model is in effect', () =>
|