@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
|
@@ -5,7 +5,6 @@ import {
|
|
|
5
5
|
HEXIS_EXTENSION_NS,
|
|
6
6
|
HEXIS_TOOLS_DIR,
|
|
7
7
|
LEGACY_GROUPS_DIR,
|
|
8
|
-
PLUGINS_DIR,
|
|
9
8
|
PLUGIN_MANIFEST_FILE,
|
|
10
9
|
PLUGIN_MCP_FILE,
|
|
11
10
|
PLUGIN_MCP_SCHEMA,
|
|
@@ -18,6 +17,7 @@ import { parseOwnAccessEntries } from '../../../access-model/access-grammar.js';
|
|
|
18
17
|
import { containsVariableReference } from '../../../../shared/variable-refs.js';
|
|
19
18
|
import { IGNORE_FILENAME, isAbsence, isSkippedEntry, type IFsProbe, type ITreeWalker } from '../../../../shared/fs.contract.js';
|
|
20
19
|
import type { KbBranch, OnServerStart, ServerStartContext, StepResult } from '../on-server-start.js';
|
|
20
|
+
import type { KbContext } from '../../../../shared/kb-context.js';
|
|
21
21
|
import { withoutIgnoreLine } from './template-files.step.js';
|
|
22
22
|
import { PluginLayout, hasManifestEntry } from './plugin-layout.js';
|
|
23
23
|
|
|
@@ -163,10 +163,18 @@ export class GroupsToPluginsStep implements OnServerStart {
|
|
|
163
163
|
/** The plugin-shaped questions, answered the same way the manifests step answers them. */
|
|
164
164
|
private readonly layout: PluginLayout;
|
|
165
165
|
|
|
166
|
-
constructor(
|
|
166
|
+
constructor(
|
|
167
|
+
private readonly disk: IFsProbe & ITreeWalker,
|
|
168
|
+
/** Read per run, never captured: the setup-completing save may rename the plugins root first. */
|
|
169
|
+
private readonly kb: Pick<KbContext, 'layout'>,
|
|
170
|
+
) {
|
|
167
171
|
this.layout = new PluginLayout(disk);
|
|
168
172
|
}
|
|
169
173
|
|
|
174
|
+
private get pluginsDir(): string {
|
|
175
|
+
return this.kb.layout.pluginsDir;
|
|
176
|
+
}
|
|
177
|
+
|
|
170
178
|
async run(ctx: ServerStartContext): Promise<StepResult> {
|
|
171
179
|
const refusals: string[] = [];
|
|
172
180
|
for (const branch of await ctx.allBranches()) {
|
|
@@ -184,7 +192,7 @@ export class GroupsToPluginsStep implements OnServerStart {
|
|
|
184
192
|
private async migrateBranch(branch: KbBranch, refusals: string[]): Promise<void> {
|
|
185
193
|
const repoDir = await branch.repoDir();
|
|
186
194
|
const legacyDir = path.join(repoDir, LEGACY_GROUPS_DIR);
|
|
187
|
-
const pluginsDir = path.join(repoDir,
|
|
195
|
+
const pluginsDir = path.join(repoDir, this.pluginsDir);
|
|
188
196
|
|
|
189
197
|
const hasLegacy = await this.disk.isDirectory(legacyDir);
|
|
190
198
|
const hasPlugins = await this.disk.isDirectory(pluginsDir);
|
|
@@ -199,9 +207,9 @@ export class GroupsToPluginsStep implements OnServerStart {
|
|
|
199
207
|
// template-files.step.ts's reserved-dir check).
|
|
200
208
|
if (!hasPlugins && (await this.disk.exists(pluginsDir))) {
|
|
201
209
|
throw new Error(
|
|
202
|
-
`Branch "${branch.name}": "${
|
|
203
|
-
(hasLegacy ? `, so ${LEGACY_GROUPS_DIR}/ cannot be renamed to ${
|
|
204
|
-
`. Remove or rename the "${
|
|
210
|
+
`Branch "${branch.name}": "${this.pluginsDir}" exists but is not a directory` +
|
|
211
|
+
(hasLegacy ? `, so ${LEGACY_GROUPS_DIR}/ cannot be renamed to ${this.pluginsDir}/` : '') +
|
|
212
|
+
`. Remove or rename the "${this.pluginsDir}" entry — the platform requires this name to be a folder.`,
|
|
205
213
|
);
|
|
206
214
|
}
|
|
207
215
|
|
|
@@ -216,7 +224,7 @@ export class GroupsToPluginsStep implements OnServerStart {
|
|
|
216
224
|
// branch with both roots (refused below) or neither (nothing to migrate)
|
|
217
225
|
// is no less stale. Idempotent: nothing to drop, nothing declared.
|
|
218
226
|
const changed = await this.retireIgnoreRootRules(repoDir, branch, details);
|
|
219
|
-
const retiredSubject = `Retire the stale ${LEGACY_GROUPS_DIR}/ and ${
|
|
227
|
+
const retiredSubject = `Retire the stale ${LEGACY_GROUPS_DIR}/ and ${this.pluginsDir}/ ignore rules`;
|
|
220
228
|
|
|
221
229
|
if (hasLegacy && hasPlugins) {
|
|
222
230
|
// Both present: somebody is mid-migration by hand, or two branches merged
|
|
@@ -226,12 +234,12 @@ export class GroupsToPluginsStep implements OnServerStart {
|
|
|
226
234
|
// ops, only a note (which surfaces in a commit only if the ignore
|
|
227
235
|
// retirement above, or a later step, dirties it).
|
|
228
236
|
log.warn(
|
|
229
|
-
`${branch.name}: both ${LEGACY_GROUPS_DIR}/ and ${
|
|
230
|
-
`Merge ${LEGACY_GROUPS_DIR}/ into ${
|
|
237
|
+
`${branch.name}: both ${LEGACY_GROUPS_DIR}/ and ${this.pluginsDir}/ exist — leaving both alone. ` +
|
|
238
|
+
`Merge ${LEGACY_GROUPS_DIR}/ into ${this.pluginsDir}/ by hand; nothing is being migrated automatically.`,
|
|
231
239
|
);
|
|
232
240
|
if (changed) branch.note(retiredSubject);
|
|
233
241
|
branch.note(
|
|
234
|
-
`${LEGACY_GROUPS_DIR}/ and ${
|
|
242
|
+
`${LEGACY_GROUPS_DIR}/ and ${this.pluginsDir}/ both exist — merge by hand; nothing was migrated automatically`,
|
|
235
243
|
);
|
|
236
244
|
for (const line of details) branch.note(line);
|
|
237
245
|
return;
|
|
@@ -255,8 +263,8 @@ export class GroupsToPluginsStep implements OnServerStart {
|
|
|
255
263
|
let migrated = false;
|
|
256
264
|
if (hasLegacy) {
|
|
257
265
|
// The Groups→Plugins root rename is ONE declared op, directory and all.
|
|
258
|
-
branch.move(LEGACY_GROUPS_DIR,
|
|
259
|
-
details.push(`${LEGACY_GROUPS_DIR}/ → ${
|
|
266
|
+
branch.move(LEGACY_GROUPS_DIR, this.pluginsDir);
|
|
267
|
+
details.push(`${LEGACY_GROUPS_DIR}/ → ${this.pluginsDir}/`);
|
|
260
268
|
migrated = true;
|
|
261
269
|
}
|
|
262
270
|
|
|
@@ -284,9 +292,9 @@ export class GroupsToPluginsStep implements OnServerStart {
|
|
|
284
292
|
// was not reorganised.
|
|
285
293
|
branch.note(
|
|
286
294
|
hasLegacy
|
|
287
|
-
? `Move ${LEGACY_GROUPS_DIR}/ to ${
|
|
295
|
+
? `Move ${LEGACY_GROUPS_DIR}/ to ${this.pluginsDir}/ (Agent Plugins layout)`
|
|
288
296
|
: migrated
|
|
289
|
-
? `Reorganise ${
|
|
297
|
+
? `Reorganise ${this.pluginsDir}/ to the Agent Plugins layout`
|
|
290
298
|
: retiredSubject,
|
|
291
299
|
);
|
|
292
300
|
for (const line of details) branch.note(line);
|
|
@@ -321,7 +329,7 @@ export class GroupsToPluginsStep implements OnServerStart {
|
|
|
321
329
|
if (isAbsence(err)) return false;
|
|
322
330
|
throw err;
|
|
323
331
|
}
|
|
324
|
-
const stale = [`${LEGACY_GROUPS_DIR}/`, `${
|
|
332
|
+
const stale = [`${LEGACY_GROUPS_DIR}/`, `${this.pluginsDir}/`];
|
|
325
333
|
const present = stale.filter((rule) => current.split('\n').some((l) => l.trim() === rule));
|
|
326
334
|
if (present.length === 0) return false;
|
|
327
335
|
// The same drop the template step makes, so a platform comment above a
|
|
@@ -344,7 +352,7 @@ export class GroupsToPluginsStep implements OnServerStart {
|
|
|
344
352
|
details: string[],
|
|
345
353
|
refusals: string[],
|
|
346
354
|
): Promise<boolean> {
|
|
347
|
-
const relPlugin = `${
|
|
355
|
+
const relPlugin = `${this.pluginsDir}/${folderName}`;
|
|
348
356
|
let changed = false;
|
|
349
357
|
|
|
350
358
|
const entries = await this.disk.listDir(folderDir);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
-
import {
|
|
3
|
+
import { isPersonalPluginFolder } from '@bevel-software/platform-shared';
|
|
4
|
+
import type { KbContext } from '../../../../shared/kb-context.js';
|
|
4
5
|
import {
|
|
5
6
|
EVERYONE_CANONICAL,
|
|
6
7
|
KNOWN_VERBS,
|
|
@@ -41,7 +42,15 @@ import type { KbBranch, OnServerStart, ServerStartContext, StepResult } from '..
|
|
|
41
42
|
export class PersonalSpacesStep implements OnServerStart {
|
|
42
43
|
readonly name = 'personal-spaces';
|
|
43
44
|
|
|
44
|
-
constructor(
|
|
45
|
+
constructor(
|
|
46
|
+
private readonly disk: IFsProbe,
|
|
47
|
+
/** Read per run, never captured: the setup-completing save may rename the plugins root first. */
|
|
48
|
+
private readonly kb: Pick<KbContext, 'layout'>,
|
|
49
|
+
) {}
|
|
50
|
+
|
|
51
|
+
private get pluginsDir(): string {
|
|
52
|
+
return this.kb.layout.pluginsDir;
|
|
53
|
+
}
|
|
45
54
|
|
|
46
55
|
async run(ctx: ServerStartContext): Promise<StepResult> {
|
|
47
56
|
for (const branch of await ctx.allBranches()) {
|
|
@@ -52,12 +61,12 @@ export class PersonalSpacesStep implements OnServerStart {
|
|
|
52
61
|
|
|
53
62
|
private async closePersonalSpaces(branch: KbBranch): Promise<void> {
|
|
54
63
|
const repoDir = await branch.repoDir();
|
|
55
|
-
const entries = await this.disk.listDir(path.join(repoDir,
|
|
64
|
+
const entries = await this.disk.listDir(path.join(repoDir, this.pluginsDir));
|
|
56
65
|
if (entries === null) return;
|
|
57
66
|
const closed: string[] = [];
|
|
58
67
|
for (const entry of entries) {
|
|
59
68
|
if (!entry.isDirectory() || !isPersonalPluginFolder(entry.name)) continue;
|
|
60
|
-
const rel = `${
|
|
69
|
+
const rel = `${this.pluginsDir}/${entry.name}/access.md`;
|
|
61
70
|
let text: string;
|
|
62
71
|
try {
|
|
63
72
|
text = await fs.readFile(path.join(repoDir, rel), 'utf8');
|
|
@@ -72,7 +81,7 @@ export class PersonalSpacesStep implements OnServerStart {
|
|
|
72
81
|
}
|
|
73
82
|
if (closed.length === 0) return;
|
|
74
83
|
branch.note(`Keep ${closed.length === 1 ? 'a personal space' : `${closed.length} personal spaces`} private`);
|
|
75
|
-
for (const name of closed) branch.note(`${
|
|
84
|
+
for (const name of closed) branch.note(`${this.pluginsDir}/${name}/access.md: read denies everyone`);
|
|
76
85
|
}
|
|
77
86
|
}
|
|
78
87
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
2
|
import {
|
|
3
|
-
PLUGINS_DIR,
|
|
4
3
|
PLUGIN_MANIFEST_FILE,
|
|
5
4
|
pluginDisplayNameOf,
|
|
6
5
|
} from '@bevel-software/platform-shared';
|
|
7
6
|
import type { IFsProbe, ITreeWalker } from '../../../../shared/fs.contract.js';
|
|
7
|
+
import type { KbContext } from '../../../../shared/kb-context.js';
|
|
8
8
|
import { hasManifestEntry } from './plugin-layout.js';
|
|
9
9
|
import type { KbBranch, OnServerStart, ServerStartContext, StepResult } from '../on-server-start.js';
|
|
10
10
|
|
|
@@ -52,7 +52,15 @@ import type { KbBranch, OnServerStart, ServerStartContext, StepResult } from '..
|
|
|
52
52
|
export class PluginDisplayNamesStep implements OnServerStart {
|
|
53
53
|
readonly name = 'plugin-display-names';
|
|
54
54
|
|
|
55
|
-
constructor(
|
|
55
|
+
constructor(
|
|
56
|
+
private readonly disk: IFsProbe & ITreeWalker,
|
|
57
|
+
/** Read per run, never captured: the setup-completing save may rename the plugins root first. */
|
|
58
|
+
private readonly kb: Pick<KbContext, 'layout'>,
|
|
59
|
+
) {}
|
|
60
|
+
|
|
61
|
+
private get pluginsDir(): string {
|
|
62
|
+
return this.kb.layout.pluginsDir;
|
|
63
|
+
}
|
|
56
64
|
|
|
57
65
|
async run(ctx: ServerStartContext): Promise<StepResult> {
|
|
58
66
|
for (const branch of await ctx.allBranches()) {
|
|
@@ -63,7 +71,7 @@ export class PluginDisplayNamesStep implements OnServerStart {
|
|
|
63
71
|
|
|
64
72
|
private async backfill(branch: KbBranch): Promise<void> {
|
|
65
73
|
const repoDir = await branch.repoDir();
|
|
66
|
-
const root = path.join(repoDir,
|
|
74
|
+
const root = path.join(repoDir, this.pluginsDir);
|
|
67
75
|
|
|
68
76
|
// Plugin folders by the judgement discovery makes, entry for entry: a
|
|
69
77
|
// manifest as a REGULAR file, and nothing beneath a plugin is a plugin.
|
|
@@ -119,7 +127,7 @@ export class PluginDisplayNamesStep implements OnServerStart {
|
|
|
119
127
|
// the file for no change anyone can see.
|
|
120
128
|
if (folderName === pluginDisplayNameOf(manifest)) continue;
|
|
121
129
|
branch.write(
|
|
122
|
-
`${
|
|
130
|
+
`${this.pluginsDir}/${rel}/${PLUGIN_MANIFEST_FILE}`,
|
|
123
131
|
`${JSON.stringify(withDisplayName(manifest, folderName), null, 2)}\n`,
|
|
124
132
|
);
|
|
125
133
|
filled.push(rel);
|
|
@@ -131,7 +139,7 @@ export class PluginDisplayNamesStep implements OnServerStart {
|
|
|
131
139
|
? "Record a plugin's display name in its manifest"
|
|
132
140
|
: `Record the display names of ${filled.length} plugins in their manifests`,
|
|
133
141
|
);
|
|
134
|
-
for (const rel of filled) branch.note(`${
|
|
142
|
+
for (const rel of filled) branch.note(`${this.pluginsDir}/${rel}: displayName "${path.posix.basename(rel)}"`);
|
|
135
143
|
}
|
|
136
144
|
}
|
|
137
145
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
|
-
import {
|
|
2
|
+
import { PLUGIN_MANIFEST_FILE, renderPluginManifest } from '@bevel-software/platform-shared';
|
|
3
3
|
import type { ITreeWalker, WalkedEntry } from '../../../../shared/fs.contract.js';
|
|
4
|
+
import type { KbContext } from '../../../../shared/kb-context.js';
|
|
4
5
|
import { PluginLayout, hasManifestEntry } from './plugin-layout.js';
|
|
5
6
|
import type { KbBranch, OnServerStart, ServerStartContext, StepResult } from '../on-server-start.js';
|
|
6
7
|
|
|
@@ -39,10 +40,18 @@ export class PluginManifestsStep implements OnServerStart {
|
|
|
39
40
|
|
|
40
41
|
private readonly layout: PluginLayout;
|
|
41
42
|
|
|
42
|
-
constructor(
|
|
43
|
+
constructor(
|
|
44
|
+
private readonly disk: ITreeWalker,
|
|
45
|
+
/** Read per run, never captured: the setup-completing save may rename the plugins root first. */
|
|
46
|
+
private readonly kb: Pick<KbContext, 'layout'>,
|
|
47
|
+
) {
|
|
43
48
|
this.layout = new PluginLayout(disk);
|
|
44
49
|
}
|
|
45
50
|
|
|
51
|
+
private get pluginsDir(): string {
|
|
52
|
+
return this.kb.layout.pluginsDir;
|
|
53
|
+
}
|
|
54
|
+
|
|
46
55
|
async run(ctx: ServerStartContext): Promise<StepResult> {
|
|
47
56
|
for (const branch of await ctx.allBranches()) {
|
|
48
57
|
await this.addManifests(branch);
|
|
@@ -52,7 +61,7 @@ export class PluginManifestsStep implements OnServerStart {
|
|
|
52
61
|
|
|
53
62
|
private async addManifests(branch: KbBranch): Promise<void> {
|
|
54
63
|
const repoDir = await branch.repoDir();
|
|
55
|
-
const root = path.join(repoDir,
|
|
64
|
+
const root = path.join(repoDir, this.pluginsDir);
|
|
56
65
|
const added: string[] = [];
|
|
57
66
|
|
|
58
67
|
// A plugin is a folder whose OWN listing holds a manifest as a regular
|
|
@@ -78,13 +87,13 @@ export class PluginManifestsStep implements OnServerStart {
|
|
|
78
87
|
// A grouping folder — plugins beneath it — is never a plugin itself.
|
|
79
88
|
if (plugins.some((p) => p.startsWith(`${rel}/`))) continue;
|
|
80
89
|
if (!(await this.layout.looksLikeLegacyPlugin(path.join(root, rel), entries))) continue;
|
|
81
|
-
branch.write(`${
|
|
90
|
+
branch.write(`${this.pluginsDir}/${rel}/${PLUGIN_MANIFEST_FILE}`, renderPluginManifest(rel));
|
|
82
91
|
added.push(rel);
|
|
83
92
|
}
|
|
84
93
|
if (added.length === 0) return;
|
|
85
94
|
branch.note(
|
|
86
95
|
`Add plugin manifests to ${added.length === 1 ? 'a legacy plugin folder' : `${added.length} legacy plugin folders`}`,
|
|
87
96
|
);
|
|
88
|
-
for (const rel of added) branch.note(`${
|
|
97
|
+
for (const rel of added) branch.note(`${this.pluginsDir}/${rel}: ${PLUGIN_MANIFEST_FILE} written`);
|
|
89
98
|
}
|
|
90
99
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import {
|
|
4
|
-
AGENTS_FILE,
|
|
5
4
|
LEGACY_AGENTS_FILE,
|
|
6
5
|
renderKbLayoutPlaceholders,
|
|
7
6
|
} from '@bevel-software/platform-shared';
|
|
8
7
|
import type { IFsProbe, ITreeWalker } from '../../../../shared/fs.contract.js';
|
|
8
|
+
import type { KbContext } from '../../../../shared/kb-context.js';
|
|
9
9
|
import { renderRolesYaml } from '../../../access-model/render-roles-yaml.js';
|
|
10
10
|
import { reservedRootDirs } from './template-files.step.js';
|
|
11
11
|
import { TEMPLATE_SOURCE_FALLBACKS, TemplateSource } from './template-source.js';
|
|
@@ -36,11 +36,12 @@ export function buildSeedTree(
|
|
|
36
36
|
templateDir: string,
|
|
37
37
|
extraRootDirs: readonly string[],
|
|
38
38
|
seedAdminEmails: readonly string[],
|
|
39
|
+
/** Read per seed, never captured: the setup-completing save may apply the layout after this builder was composed. */
|
|
40
|
+
kb: Pick<KbContext, 'layout'>,
|
|
39
41
|
): (dir: string) => Promise<string[]> {
|
|
40
|
-
// Validated eagerly; resolved per seed.
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
const seeder = new KbSeedTree(disk, new TemplateSource(disk, templateDir), extraRootDirs, seedAdminEmails);
|
|
42
|
+
// Validated eagerly; resolved per seed.
|
|
43
|
+
reservedRootDirs(extraRootDirs, kb.layout);
|
|
44
|
+
const seeder = new KbSeedTree(disk, new TemplateSource(disk, templateDir, kb), extraRootDirs, seedAdminEmails, kb);
|
|
44
45
|
return (dir) => seeder.seed(dir);
|
|
45
46
|
}
|
|
46
47
|
|
|
@@ -58,6 +59,7 @@ class KbSeedTree {
|
|
|
58
59
|
private readonly templates: TemplateSource,
|
|
59
60
|
private readonly extraRootDirs: readonly string[],
|
|
60
61
|
private readonly seedAdminEmails: readonly string[],
|
|
62
|
+
private readonly kb: Pick<KbContext, 'layout'>,
|
|
61
63
|
) {}
|
|
62
64
|
|
|
63
65
|
/** Fill `dir` with a complete knowledge base; resolve to what was GENERATED. */
|
|
@@ -72,7 +74,7 @@ class KbSeedTree {
|
|
|
72
74
|
// root never gets a pointless placeholder beside it.
|
|
73
75
|
// Resolved NOW, not when the builder was composed: a seed that runs on the
|
|
74
76
|
// save completing first-run setup must lay down the names that save applied.
|
|
75
|
-
for (const rootDir of reservedRootDirs(this.extraRootDirs)) {
|
|
77
|
+
for (const rootDir of reservedRootDirs(this.extraRootDirs, this.kb.layout)) {
|
|
76
78
|
const abs = path.join(dir, rootDir);
|
|
77
79
|
const found = await this.disk.lstatOrNull(abs);
|
|
78
80
|
if (found) {
|
|
@@ -149,7 +151,7 @@ class KbSeedTree {
|
|
|
149
151
|
// `AGENTS.md` this seed had just laid down — two commits saying opposite
|
|
150
152
|
// things about a knowledge base nobody had used yet.
|
|
151
153
|
if (relDir === '' && name === LEGACY_AGENTS_FILE) {
|
|
152
|
-
await this.copyTemplateFile(name, dest,
|
|
154
|
+
await this.copyTemplateFile(name, dest, this.kb.layout.agentsFile);
|
|
153
155
|
return;
|
|
154
156
|
}
|
|
155
157
|
// TWO template entries, ONE destination. A custom template that happens to
|
|
@@ -161,7 +163,7 @@ class KbSeedTree {
|
|
|
161
163
|
// is the file the platform owns, refreshes from the packaged template on
|
|
162
164
|
// every start and tells every agent to read. The twin is skipped, on the
|
|
163
165
|
// same reasoning as the packable spelling above.
|
|
164
|
-
if (relDir === '' && name ===
|
|
166
|
+
if (relDir === '' && name === this.kb.layout.agentsFile && (await this.templates.carries(LEGACY_AGENTS_FILE))) {
|
|
165
167
|
return;
|
|
166
168
|
}
|
|
167
169
|
await this.copyTemplateFile(relDir ? path.join(relDir, name) : name, dest);
|
|
@@ -190,7 +192,7 @@ class KbSeedTree {
|
|
|
190
192
|
if (text === null) {
|
|
191
193
|
await fs.copyFile(from, to);
|
|
192
194
|
} else {
|
|
193
|
-
await fs.writeFile(to, renderKbLayoutPlaceholders(text), 'utf8');
|
|
195
|
+
await fs.writeFile(to, renderKbLayoutPlaceholders(text, this.kb.layout), 'utf8');
|
|
194
196
|
}
|
|
195
197
|
await fs.chmod(to, (await fs.stat(from)).mode & 0o777);
|
|
196
198
|
}
|
|
@@ -1,18 +1,16 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import {
|
|
4
|
-
AGENTS_FILE,
|
|
5
|
-
KNOWLEDGE_BASE_DIR,
|
|
6
4
|
LEGACY_AGENTS_FILE,
|
|
7
|
-
PLUGINS_DIR,
|
|
8
|
-
SKILLS_DIR,
|
|
9
5
|
agentsFilePointerSentence,
|
|
10
6
|
gitignoreLiteral,
|
|
11
7
|
mentionsAgentsFile,
|
|
12
8
|
retargetAgentsFilePointer,
|
|
13
9
|
validateKbRootName,
|
|
10
|
+
type KbLayout,
|
|
14
11
|
} from '@bevel-software/platform-shared';
|
|
15
12
|
import { IGNORE_FILENAME, isAbsence, type IFsProbe } from '../../../../shared/fs.contract.js';
|
|
13
|
+
import type { KbContext } from '../../../../shared/kb-context.js';
|
|
16
14
|
import { PREAMBLE_FILE } from '../../../agent-instructions/compose.js';
|
|
17
15
|
import { TemplateSource } from './template-source.js';
|
|
18
16
|
import type { KbBranch, OnServerStart, ServerStartContext, StepResult } from '../on-server-start.js';
|
|
@@ -38,14 +36,14 @@ const PREAMBLE_IGNORE_PATTERN = `/${PREAMBLE_FILE}`;
|
|
|
38
36
|
* generated from `ADMIN_EMAIL` (see roles-yaml.step.ts), so a repo can't be
|
|
39
37
|
* seeded with a stale hard-coded Admin list.
|
|
40
38
|
*/
|
|
41
|
-
export function requiredFiles(): readonly string[] {
|
|
39
|
+
export function requiredFiles(layout: Required<KbLayout>): readonly string[] {
|
|
42
40
|
return [
|
|
43
41
|
'access.md',
|
|
44
42
|
// The managed agent guide, under whatever this deployment calls it. The
|
|
45
43
|
// PACKAGED template still carries it as `AGENTS.md` — one file, one
|
|
46
44
|
// spelling in the tarball — so the write target and the template source
|
|
47
45
|
// part company here and nowhere else (see {@link templateNameOf}).
|
|
48
|
-
|
|
46
|
+
layout.agentsFile,
|
|
49
47
|
'.bevelignore',
|
|
50
48
|
'.gitignore',
|
|
51
49
|
// The deployment preamble every connected agent is told at session start
|
|
@@ -61,8 +59,8 @@ export function requiredFiles(): readonly string[] {
|
|
|
61
59
|
* name on disk is a deployment's choice while its name in the template is
|
|
62
60
|
* fixed; everything else is spelled the same on both sides.
|
|
63
61
|
*/
|
|
64
|
-
function templateNameOf(repoRel: string): string {
|
|
65
|
-
return repoRel ===
|
|
62
|
+
function templateNameOf(repoRel: string, agentsFile: string): string {
|
|
63
|
+
return repoRel === agentsFile ? LEGACY_AGENTS_FILE : repoRel;
|
|
66
64
|
}
|
|
67
65
|
|
|
68
66
|
/**
|
|
@@ -105,11 +103,11 @@ export const GENERATED_FILES: readonly string[] = ['roles.yaml'];
|
|
|
105
103
|
* that has them still renders them as roots rather than folding them into
|
|
106
104
|
* Knowledge.
|
|
107
105
|
*
|
|
108
|
-
* A function: the three names are deployment-configurable
|
|
106
|
+
* A function of the layout: the three names are deployment-configurable, and
|
|
109
107
|
* a module-scope array would snapshot the defaults before configuration.
|
|
110
108
|
*/
|
|
111
|
-
function coreRequiredDirs(): readonly string[] {
|
|
112
|
-
return [
|
|
109
|
+
function coreRequiredDirs(layout: Required<KbLayout>): readonly string[] {
|
|
110
|
+
return [layout.knowledgeBaseDir, layout.skillsDir, layout.pluginsDir];
|
|
113
111
|
}
|
|
114
112
|
|
|
115
113
|
/**
|
|
@@ -145,20 +143,20 @@ function assertRootSegment(dir: string): void {
|
|
|
145
143
|
* base. Shared with the empty-remote seed builder (seed-tree.ts) so the two
|
|
146
144
|
* paths can never disagree about what a deployment guarantees.
|
|
147
145
|
*/
|
|
148
|
-
export function reservedRootDirs(extraRootDirs: readonly string[]): readonly string[] {
|
|
146
|
+
export function reservedRootDirs(extraRootDirs: readonly string[], layout: Required<KbLayout>): readonly string[] {
|
|
149
147
|
for (const dir of extraRootDirs) {
|
|
150
148
|
assertRootSegment(dir);
|
|
151
149
|
// A root named after a required OR generated FILE is a typo with a silent
|
|
152
150
|
// outcome: the file is laid down first, so the dir check finds the path
|
|
153
151
|
// taken and skips it, and the directory the caller asked for never appears
|
|
154
152
|
// with nothing said about why.
|
|
155
|
-
if (requiredFiles().includes(dir) || GENERATED_FILES.includes(dir)) {
|
|
153
|
+
if (requiredFiles(layout).includes(dir) || GENERATED_FILES.includes(dir)) {
|
|
156
154
|
throw new Error(
|
|
157
155
|
`Reserved KB root "${dir}" collides with a required or generated file of the same name`,
|
|
158
156
|
);
|
|
159
157
|
}
|
|
160
158
|
}
|
|
161
|
-
return [...coreRequiredDirs(), ...extraRootDirs];
|
|
159
|
+
return [...coreRequiredDirs(layout), ...extraRootDirs];
|
|
162
160
|
}
|
|
163
161
|
|
|
164
162
|
/**
|
|
@@ -195,15 +193,18 @@ export class TemplateFilesStep implements OnServerStart {
|
|
|
195
193
|
*/
|
|
196
194
|
constructor(
|
|
197
195
|
private readonly disk: IFsProbe,
|
|
196
|
+
/**
|
|
197
|
+
* Read per run, never captured: the save that completes first-run setup
|
|
198
|
+
* applies the admin's names after this step was built. A snapshot taken
|
|
199
|
+
* here scaffolded `Skills/` beside the `skills/` they had just chosen.
|
|
200
|
+
*/
|
|
201
|
+
private readonly kb: Pick<KbContext, 'layout'>,
|
|
198
202
|
private readonly extraRootDirs: readonly string[] = [],
|
|
199
203
|
private readonly agentsFileLink: () => boolean = () => true,
|
|
200
204
|
) {
|
|
201
205
|
// Validated NOW, so a bad extra fails at boot beside the rest of the
|
|
202
|
-
// wiring — but the list itself is NOT kept
|
|
203
|
-
|
|
204
|
-
// admin's names after this step was built. A snapshot taken here
|
|
205
|
-
// scaffolded `Skills/` beside the `skills/` they had just chosen.
|
|
206
|
-
reservedRootDirs(extraRootDirs);
|
|
206
|
+
// wiring — but the list itself is NOT kept, for the reason `kb` says.
|
|
207
|
+
reservedRootDirs(extraRootDirs, kb.layout);
|
|
207
208
|
}
|
|
208
209
|
|
|
209
210
|
async run(ctx: ServerStartContext): Promise<StepResult> {
|
|
@@ -217,15 +218,16 @@ export class TemplateFilesStep implements OnServerStart {
|
|
|
217
218
|
// The template directory is runtime data (the start context's), the disk
|
|
218
219
|
// port is the injected dependency — bound together once here so nothing
|
|
219
220
|
// below has to carry either as an argument.
|
|
220
|
-
const templates = new TemplateSource(this.disk, templateDir);
|
|
221
|
+
const templates = new TemplateSource(this.disk, templateDir, this.kb);
|
|
221
222
|
const repoDir = await branch.repoDir();
|
|
222
223
|
const added: string[] = [];
|
|
223
|
-
// Read ONCE per branch:
|
|
224
|
-
//
|
|
225
|
-
const
|
|
224
|
+
// Read ONCE per branch: a value re-read between the write and the ignore
|
|
225
|
+
// rule could disagree with itself.
|
|
226
|
+
const layout = this.kb.layout;
|
|
227
|
+
const agentsFile = layout.agentsFile;
|
|
226
228
|
const renamed = agentsFile !== LEGACY_AGENTS_FILE;
|
|
227
229
|
|
|
228
|
-
for (const rel of requiredFiles()) {
|
|
230
|
+
for (const rel of requiredFiles(layout)) {
|
|
229
231
|
// `lstat`, not `exists`: a DIRECTORY or SYMLINK squatting a required
|
|
230
232
|
// file's name would read as "present", and a skip-if-present check
|
|
231
233
|
// would then report success over a knowledge base whose root access
|
|
@@ -240,7 +242,7 @@ export class TemplateFilesStep implements OnServerStart {
|
|
|
240
242
|
'Remove or rename it — the platform requires this name to be a readable file.',
|
|
241
243
|
);
|
|
242
244
|
}
|
|
243
|
-
let content = await templates.read(templateNameOf(rel));
|
|
245
|
+
let content = await templates.read(templateNameOf(rel, agentsFile));
|
|
244
246
|
// The on-disk merge below only runs against an EXISTING ignore file; a
|
|
245
247
|
// freshly-declared one was merely assumed to carry the guide's rule —
|
|
246
248
|
// true of the packaged template, not necessarily of a distribution's
|
|
@@ -259,10 +261,14 @@ export class TemplateFilesStep implements OnServerStart {
|
|
|
259
261
|
content = withPlatformIgnorePatternRespelled(content, PREAMBLE_FILE, PREAMBLE_IGNORE_PATTERN);
|
|
260
262
|
content = withoutIgnoreLine(
|
|
261
263
|
withoutPlatformIgnorePattern(
|
|
262
|
-
withIgnorePattern(
|
|
263
|
-
|
|
264
|
+
withIgnorePattern(
|
|
265
|
+
withIgnorePattern(content, gitignoreLiteral(agentsFile), agentsFile),
|
|
266
|
+
PREAMBLE_IGNORE_PATTERN,
|
|
267
|
+
agentsFile,
|
|
268
|
+
),
|
|
269
|
+
`${layout.skillsDir}/`,
|
|
264
270
|
),
|
|
265
|
-
`${
|
|
271
|
+
`${layout.pluginsDir}/`,
|
|
266
272
|
);
|
|
267
273
|
// …and a template (a distribution's, a stale packaged one) still
|
|
268
274
|
// hiding `AGENTS.md` while this deployment's guide is called something
|
|
@@ -316,8 +322,8 @@ export class TemplateFilesStep implements OnServerStart {
|
|
|
316
322
|
// As a gitignore PATTERN: a guide name that reads as syntax there is
|
|
317
323
|
// escaped, or the rule would hide nothing.
|
|
318
324
|
add: [gitignoreLiteral(agentsFile), PREAMBLE_IGNORE_PATTERN],
|
|
319
|
-
drop: [`${
|
|
320
|
-
dropEvery: [`${
|
|
325
|
+
drop: [`${this.kb.layout.skillsDir}/`],
|
|
326
|
+
dropEvery: [`${this.kb.layout.pluginsDir}/`],
|
|
321
327
|
// The guide's rule FOLLOWS its name. Once the guide is `HEXIS.md`, the
|
|
322
328
|
// root's `AGENTS.md` is the customer's own conventions file and they
|
|
323
329
|
// must be able to see and edit it in the app — so the platform's own
|
|
@@ -472,7 +478,7 @@ export class TemplateFilesStep implements OnServerStart {
|
|
|
472
478
|
*/
|
|
473
479
|
private async missingDirs(repoDir: string): Promise<string[]> {
|
|
474
480
|
const missing: string[] = [];
|
|
475
|
-
for (const rootDir of reservedRootDirs(this.extraRootDirs)) {
|
|
481
|
+
for (const rootDir of reservedRootDirs(this.extraRootDirs, this.kb.layout)) {
|
|
476
482
|
const found = await this.disk.lstatOrNull(path.join(repoDir, rootDir));
|
|
477
483
|
if (found) {
|
|
478
484
|
if (found.isDirectory()) continue;
|
|
@@ -547,7 +553,10 @@ export class TemplateFilesStep implements OnServerStart {
|
|
|
547
553
|
(text, [from, to]) => withPlatformIgnorePatternRespelled(text, from, to),
|
|
548
554
|
current,
|
|
549
555
|
);
|
|
550
|
-
const added = rules.add.reduce(
|
|
556
|
+
const added = rules.add.reduce(
|
|
557
|
+
(text, pattern) => withIgnorePattern(text, pattern, this.kb.layout.agentsFile),
|
|
558
|
+
respelled,
|
|
559
|
+
);
|
|
551
560
|
const dropped = (rules.dropEvery ?? []).reduce(
|
|
552
561
|
(text, pattern) => withoutIgnoreLine(text, pattern),
|
|
553
562
|
rules.drop.reduce((text, pattern) => withoutPlatformIgnorePattern(text, pattern), added),
|
|
@@ -796,7 +805,7 @@ function withPlatformIgnorePatternRespelled(text: string, from: string, to: stri
|
|
|
796
805
|
* still standing here is the operator's: it already hides the file, and
|
|
797
806
|
* appending the anchored rule beside it would say nothing they have not.
|
|
798
807
|
*/
|
|
799
|
-
function withIgnorePattern(text: string, pattern: string): string {
|
|
808
|
+
function withIgnorePattern(text: string, pattern: string, agentsFile: string): string {
|
|
800
809
|
const lines = text.split('\n').map((l) => l.trim());
|
|
801
810
|
const operatorPreambleRule =
|
|
802
811
|
pattern === PREAMBLE_IGNORE_PATTERN &&
|
|
@@ -808,7 +817,7 @@ function withIgnorePattern(text: string, pattern: string): string {
|
|
|
808
817
|
const comment =
|
|
809
818
|
pattern === PREAMBLE_IGNORE_PATTERN
|
|
810
819
|
? PREAMBLE_RULE_COMMENT
|
|
811
|
-
: pattern === gitignoreLiteral(
|
|
820
|
+
: pattern === gitignoreLiteral(agentsFile)
|
|
812
821
|
? AGENTS_RULE_COMMENT
|
|
813
822
|
: PLATFORM_RULE_COMMENT;
|
|
814
823
|
return `${text}${separator}\n${comment}\n${pattern}\n`;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
|
-
import {
|
|
2
|
+
import { gitignoreLiteral, renderKbLayoutPlaceholders } from '@bevel-software/platform-shared';
|
|
3
3
|
import { IGNORE_FILENAME, isAbsence, type EntryStat, type IFsProbe } from '../../../../shared/fs.contract.js';
|
|
4
|
+
import type { KbContext } from '../../../../shared/kb-context.js';
|
|
4
5
|
import { PREAMBLE_FILE } from '../../../agent-instructions/compose.js';
|
|
5
6
|
import { defaultKbTemplateDir } from '../../../../assets.js';
|
|
6
7
|
import { logger } from '../../../../shared/logging.js';
|
|
@@ -57,6 +58,8 @@ export class TemplateSource {
|
|
|
57
58
|
constructor(
|
|
58
59
|
private readonly disk: IFsProbe,
|
|
59
60
|
private readonly templateDir: string,
|
|
61
|
+
/** The layout the placeholders render as — read per file, so a name applied by setup is the one written. */
|
|
62
|
+
private readonly kb: Pick<KbContext, 'layout'>,
|
|
60
63
|
) {}
|
|
61
64
|
|
|
62
65
|
/**
|
|
@@ -125,7 +128,7 @@ export class TemplateSource {
|
|
|
125
128
|
);
|
|
126
129
|
// The packaged copy, read the same way — it renders its own
|
|
127
130
|
// placeholders and cannot fall back again (its guard is this one).
|
|
128
|
-
return new TemplateSource(this.disk, packaged).read(relPath);
|
|
131
|
+
return new TemplateSource(this.disk, packaged, this.kb).read(relPath);
|
|
129
132
|
}
|
|
130
133
|
// In the ignore file the guide's name is a PATTERN, and a name gitignore
|
|
131
134
|
// reads as syntax (`#Guide.md`, `!Guide.md`, brackets) would hide nothing
|
|
@@ -133,11 +136,11 @@ export class TemplateSource {
|
|
|
133
136
|
// placeholder is prose. ONE render, with the escaped name as the layout's
|
|
134
137
|
// — a second pass over the rendered text would read a name that happens
|
|
135
138
|
// to contain a placeholder as one.
|
|
139
|
+
const layout = this.kb.layout;
|
|
136
140
|
if (relPath === IGNORE_FILENAME) {
|
|
137
|
-
|
|
138
|
-
return renderKbLayoutPlaceholders(raw, { ...layout, agentsFile: gitignoreLiteral(agentsFileOf(layout)) });
|
|
141
|
+
return renderKbLayoutPlaceholders(raw, { ...layout, agentsFile: gitignoreLiteral(layout.agentsFile) });
|
|
139
142
|
}
|
|
140
|
-
return renderKbLayoutPlaceholders(raw);
|
|
143
|
+
return renderKbLayoutPlaceholders(raw, layout);
|
|
141
144
|
}
|
|
142
145
|
|
|
143
146
|
/**
|