@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
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
-
import { isBranchModelConfigured } from '@bevel-software/platform-shared';
|
|
4
3
|
import { logger } from '../../../shared/logging.js';
|
|
5
4
|
|
|
6
5
|
// `startupLog` rather than `log`: `retryUntilMaintained` takes a `log`
|
|
@@ -19,6 +18,7 @@ import {
|
|
|
19
18
|
type GitFailure,
|
|
20
19
|
} from '../../../shared/git-failure.js';
|
|
21
20
|
import { redactSecret, urlQuerySecrets } from '../../../shared/redact-secret.js';
|
|
21
|
+
import { normalizeRepositoryAddress, sameRepository } from '../../kb-fs/remote-url.js';
|
|
22
22
|
|
|
23
23
|
/**
|
|
24
24
|
* The KB startup phase: run every registered {@link OnServerStart} step, in
|
|
@@ -44,17 +44,24 @@ import { redactSecret, urlQuerySecrets } from '../../../shared/redact-secret.js'
|
|
|
44
44
|
*/
|
|
45
45
|
|
|
46
46
|
export interface KbStartupRunnerOptions {
|
|
47
|
-
/**
|
|
47
|
+
/**
|
|
48
|
+
* How git is run — see `shared/git.contract.ts`. It carries the credentials
|
|
49
|
+
* every command of the phase authenticates with, and the token the phase
|
|
50
|
+
* scrubs from every message it throws or logs.
|
|
51
|
+
*/
|
|
48
52
|
gitRunner: IGitRunner;
|
|
49
53
|
kbRepoUrl: () => string;
|
|
50
|
-
|
|
54
|
+
workspacesRoot: string;
|
|
51
55
|
/**
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
56
|
+
* Where a working copy of a repository that is no longer the configured
|
|
57
|
+
* one is moved to, under a folder named for the moment it happened — see
|
|
58
|
+
* `reconcileClonesWithConfiguredRepository`. NOT under `workspacesRoot`:
|
|
59
|
+
* the workspace service's orphan sweep removes every folder there that is
|
|
60
|
+
* not a known branch's, and what is set aside has to outlive that sweep.
|
|
61
|
+
* The composition root names a folder under the backups root, which is a
|
|
62
|
+
* persistent volume of its own. Default: a sibling of `workspacesRoot`.
|
|
55
63
|
*/
|
|
56
|
-
|
|
57
|
-
workspacesRoot: string;
|
|
64
|
+
setAsideRoot?: string;
|
|
58
65
|
kbDirName: string;
|
|
59
66
|
templateDir: string;
|
|
60
67
|
defaultBranch: () => string;
|
|
@@ -131,7 +138,7 @@ export class KbStartupRunner {
|
|
|
131
138
|
* them without the URL around them.
|
|
132
139
|
*/
|
|
133
140
|
private redact(text: string): string {
|
|
134
|
-
return redactSecret(text, [this.opts.
|
|
141
|
+
return redactSecret(text, [this.opts.gitRunner.credentials.token(), ...urlQuerySecrets(this.opts.kbRepoUrl())]);
|
|
135
142
|
}
|
|
136
143
|
|
|
137
144
|
/**
|
|
@@ -260,7 +267,8 @@ export class KbStartupRunner {
|
|
|
260
267
|
}
|
|
261
268
|
|
|
262
269
|
private async runAllOnce(): Promise<void> {
|
|
263
|
-
|
|
270
|
+
// An empty default branch IS the unconfigured model (see `KbContext`).
|
|
271
|
+
if (!this.opts.defaultBranch()) {
|
|
264
272
|
startupLog.info('branch model not configured yet — phase skipped until setup completes.');
|
|
265
273
|
return;
|
|
266
274
|
}
|
|
@@ -304,6 +312,10 @@ export class KbStartupRunner {
|
|
|
304
312
|
);
|
|
305
313
|
}
|
|
306
314
|
const heads = await this.ensureRemote();
|
|
315
|
+
// AFTER the remote answered: the configured address is known to be a
|
|
316
|
+
// repository we can reach, so a clone of a different one is stale, not
|
|
317
|
+
// a casualty of a typo in the address.
|
|
318
|
+
await this.reconcileClonesWithConfiguredRepository();
|
|
307
319
|
const ctx = this.buildContext(heads, handles);
|
|
308
320
|
|
|
309
321
|
for (const step of this.opts.steps) {
|
|
@@ -389,13 +401,12 @@ export class KbStartupRunner {
|
|
|
389
401
|
*/
|
|
390
402
|
private async ensureRemote(): Promise<Set<string>> {
|
|
391
403
|
const url = this.opts.kbRepoUrl();
|
|
392
|
-
const user = this.opts.gitUsername();
|
|
393
404
|
// The first question asked of the remote, and the one that answers
|
|
394
405
|
// "can we get there at all". Everything after it — seeding, pushing —
|
|
395
406
|
// fails for reasons of ours; this fails for reasons of the host's.
|
|
396
407
|
let heads: Set<string>;
|
|
397
408
|
try {
|
|
398
|
-
heads = await lsRemoteHeads(this.opts.gitRunner, url
|
|
409
|
+
heads = await lsRemoteHeads(this.opts.gitRunner, url);
|
|
399
410
|
this.remoteContact = { at: Date.now(), ok: true };
|
|
400
411
|
} catch (err) {
|
|
401
412
|
// Git that never ran — no executable, a spawn refused — is a fact about
|
|
@@ -423,23 +434,23 @@ export class KbStartupRunner {
|
|
|
423
434
|
);
|
|
424
435
|
}
|
|
425
436
|
const seededByOther = await withTempDir(async (dir) => {
|
|
426
|
-
await git(this.opts.gitRunner, dir,
|
|
427
|
-
await stampIdentity(this.opts.gitRunner, dir
|
|
437
|
+
await git(this.opts.gitRunner, dir, ['init', '-b', defaultBranch]);
|
|
438
|
+
await stampIdentity(this.opts.gitRunner, dir);
|
|
428
439
|
const generated = await this.opts.buildSeedTree(dir);
|
|
429
|
-
await git(this.opts.gitRunner, dir,
|
|
440
|
+
await git(this.opts.gitRunner, dir, ['add', '-A']);
|
|
430
441
|
// The template may ship a `.gitignore` whose rules happen to match a
|
|
431
442
|
// GENERATED seed file (roles.yaml, a reserved root's .gitkeep) —
|
|
432
443
|
// `add -A` would silently drop it from the seed commit. Force-add
|
|
433
444
|
// exactly what the builder generated; `-f` on an already-staged path
|
|
434
445
|
// is a no-op.
|
|
435
|
-
if (generated.length > 0) await git(this.opts.gitRunner, dir,
|
|
436
|
-
await git(this.opts.gitRunner, dir,
|
|
446
|
+
if (generated.length > 0) await git(this.opts.gitRunner, dir, ['add', '-f', '--', ...generated]);
|
|
447
|
+
await git(this.opts.gitRunner, dir, ['commit', '-m', 'Seed knowledge base from Bevel template']);
|
|
437
448
|
for (const b of protectedBranches) {
|
|
438
|
-
if (b !== defaultBranch) await git(this.opts.gitRunner, dir,
|
|
449
|
+
if (b !== defaultBranch) await git(this.opts.gitRunner, dir, ['branch', b]);
|
|
439
450
|
}
|
|
440
|
-
await git(this.opts.gitRunner, dir,
|
|
451
|
+
await git(this.opts.gitRunner, dir, ['remote', 'add', 'origin', url]);
|
|
441
452
|
try {
|
|
442
|
-
await git(this.opts.gitRunner, dir,
|
|
453
|
+
await git(this.opts.gitRunner, dir, ['push', '-u', 'origin', ...protectedBranches]);
|
|
443
454
|
return null;
|
|
444
455
|
} catch (err) {
|
|
445
456
|
// Two replicas racing to seed the same empty remote: both saw it
|
|
@@ -452,7 +463,7 @@ export class KbStartupRunner {
|
|
|
452
463
|
// who seeded. A foreign seed is just an "existing remote"
|
|
453
464
|
// discovered late, the same contract as a repo populated before
|
|
454
465
|
// boot.
|
|
455
|
-
const reread = await lsRemoteHeads(this.opts.gitRunner, url
|
|
466
|
+
const reread = await lsRemoteHeads(this.opts.gitRunner, url);
|
|
456
467
|
if (protectedBranches.every((b) => reread.has(b))) return reread;
|
|
457
468
|
throw err;
|
|
458
469
|
}
|
|
@@ -473,8 +484,8 @@ export class KbStartupRunner {
|
|
|
473
484
|
for (const b of protectedBranches) {
|
|
474
485
|
if (heads.has(b)) continue;
|
|
475
486
|
await withTempDir(async (dir) => {
|
|
476
|
-
await git(this.opts.gitRunner, dir,
|
|
477
|
-
await git(this.opts.gitRunner, path.join(dir, 'seed'),
|
|
487
|
+
await git(this.opts.gitRunner, dir, ['clone', '--depth', '1', '-b', base, url, 'seed']);
|
|
488
|
+
await git(this.opts.gitRunner, path.join(dir, 'seed'), ['push', 'origin', `HEAD:refs/heads/${b}`]);
|
|
478
489
|
});
|
|
479
490
|
heads.add(b);
|
|
480
491
|
startupLog.info(`created missing protected branch "${b}" from "${base}"`);
|
|
@@ -505,6 +516,150 @@ export class KbStartupRunner {
|
|
|
505
516
|
};
|
|
506
517
|
}
|
|
507
518
|
|
|
519
|
+
/**
|
|
520
|
+
* Bring every working copy on disk into line with the configured
|
|
521
|
+
* repository, WITHOUT DELETING ANYTHING.
|
|
522
|
+
*
|
|
523
|
+
* A clone fetches and pushes through the address stored in its own
|
|
524
|
+
* `remote.origin.url`, which nothing updates when the configured address
|
|
525
|
+
* changes. After an operator replaced the repository (2026-09-28: the old
|
|
526
|
+
* one deleted, a new one saved on the setup screen) every surviving clone
|
|
527
|
+
* kept asking the old address: Save and Retry failed, and the restart
|
|
528
|
+
* stopped the boot on `repository … not found`, taking the setup screen
|
|
529
|
+
* with it.
|
|
530
|
+
*
|
|
531
|
+
* A clone whose address differs from the configured one is one of two
|
|
532
|
+
* things, and the histories say which:
|
|
533
|
+
*
|
|
534
|
+
* - THE SAME REPOSITORY AT A NEW ADDRESS — moved, renamed, mirrored. The
|
|
535
|
+
* one change the setup screen tells an admin to make ("only change this
|
|
536
|
+
* if the same repository was moved or renamed"). Its history is on the
|
|
537
|
+
* configured remote, so the clone is pointed at the new address and
|
|
538
|
+
* kept, unpushed commits included: they are pushed where they belonged
|
|
539
|
+
* all along.
|
|
540
|
+
* - ANOTHER REPOSITORY. Re-pointing it would push one repository's
|
|
541
|
+
* commits into the other, so it cannot stay where the workspace service
|
|
542
|
+
* would adopt it. It is MOVED to {@link KbStartupRunnerOptions.setAsideRoot}
|
|
543
|
+
* and the log says where. Never removed: when the old repository is gone
|
|
544
|
+
* — as it was that day — these clones are the last copy of the
|
|
545
|
+
* knowledge base that exists, and the unpushed work in them exists
|
|
546
|
+
* nowhere else at all.
|
|
547
|
+
*
|
|
548
|
+
* Every clone under the workspaces root, not only the branches this phase
|
|
549
|
+
* touches: the workspace service adopts whatever it finds there. A clone
|
|
550
|
+
* whose address cannot be read is left where it is — "could not tell" is
|
|
551
|
+
* no reason to move someone's work. One that cannot be set aside stops the
|
|
552
|
+
* boot with the reason: leaving it would fail the boot a step later with
|
|
553
|
+
* git's words about a repository nobody configured.
|
|
554
|
+
*/
|
|
555
|
+
private async reconcileClonesWithConfiguredRepository(): Promise<void> {
|
|
556
|
+
const configured = this.opts.kbRepoUrl();
|
|
557
|
+
let entries: import('node:fs').Dirent[];
|
|
558
|
+
try {
|
|
559
|
+
entries = await fs.readdir(this.opts.workspacesRoot, { withFileTypes: true });
|
|
560
|
+
} catch {
|
|
561
|
+
return; // no workspaces yet
|
|
562
|
+
}
|
|
563
|
+
// One folder per run, so what was set aside together stays together.
|
|
564
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
565
|
+
const setAsideRoot =
|
|
566
|
+
this.opts.setAsideRoot ?? path.resolve(this.opts.workspacesRoot, '..', 'replaced-working-copies');
|
|
567
|
+
for (const entry of entries) {
|
|
568
|
+
if (!entry.isDirectory()) continue;
|
|
569
|
+
const repoDir = path.join(this.opts.workspacesRoot, entry.name, this.opts.kbDirName);
|
|
570
|
+
const hasGit = await fs.access(path.join(repoDir, '.git')).then(() => true, () => false);
|
|
571
|
+
if (!hasGit) continue;
|
|
572
|
+
let origin: string;
|
|
573
|
+
try {
|
|
574
|
+
origin = (await git(this.opts.gitRunner, repoDir, ['config', '--get', 'remote.origin.url'])).trim();
|
|
575
|
+
} catch {
|
|
576
|
+
continue;
|
|
577
|
+
}
|
|
578
|
+
if (origin === '' || sameRepository(origin, configured)) continue;
|
|
579
|
+
// The normalized form carries no userinfo, and the scrub covers the rest.
|
|
580
|
+
const was = this.redact(normalizeRepositoryAddress(origin));
|
|
581
|
+
if (await this.sharesHistoryWithConfigured(repoDir, configured)) {
|
|
582
|
+
await git(this.opts.gitRunner, repoDir, ['remote', 'set-url', 'origin', configured]);
|
|
583
|
+
startupLog.warn(
|
|
584
|
+
`working copy "${entry.name}" was cloned from ${was}, whose history the configured repository holds: ` +
|
|
585
|
+
'the same repository at a new address. Pointed at the configured address and kept, unpushed work included.',
|
|
586
|
+
);
|
|
587
|
+
continue;
|
|
588
|
+
}
|
|
589
|
+
const kept = path.join(setAsideRoot, stamp, entry.name);
|
|
590
|
+
await this.setAside(repoDir, kept);
|
|
591
|
+
startupLog.warn(
|
|
592
|
+
`working copy "${entry.name}" is a clone of another repository (${was}). Set aside at ${kept}; nothing was ` +
|
|
593
|
+
'deleted, and it will be cloned fresh from the configured one. Work that was never pushed is in that ' +
|
|
594
|
+
'folder: `git log` there shows it, and `git push <address> <branch>` from there sends it to a repository.',
|
|
595
|
+
);
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
/**
|
|
600
|
+
* Whether the configured repository holds history this clone has too —
|
|
601
|
+
* asked of git, not guessed from the two addresses. The configured
|
|
602
|
+
* remote's branches are fetched under a namespace of their own and the
|
|
603
|
+
* clone's HEAD is tested for a common ancestor with any of them.
|
|
604
|
+
*
|
|
605
|
+
* "Could not tell" answers false: a fetch that fails, a clone with no
|
|
606
|
+
* commit to compare. False sets the clone aside, which loses nothing, where
|
|
607
|
+
* a wrong true would push a stranger's commits into the configured
|
|
608
|
+
* repository.
|
|
609
|
+
*/
|
|
610
|
+
private async sharesHistoryWithConfigured(repoDir: string, configured: string): Promise<boolean> {
|
|
611
|
+
const probe = 'refs/hexis-probe';
|
|
612
|
+
let theirs: string[] = [];
|
|
613
|
+
try {
|
|
614
|
+
await git(this.opts.gitRunner, repoDir, ['fetch', '--no-tags', '--quiet', configured, `+refs/heads/*:${probe}/*`]);
|
|
615
|
+
theirs = (await git(this.opts.gitRunner, repoDir, ['for-each-ref', '--format=%(refname)', `${probe}/`]))
|
|
616
|
+
.split('\n')
|
|
617
|
+
.map((ref) => ref.trim())
|
|
618
|
+
.filter(Boolean);
|
|
619
|
+
if (theirs.length === 0) return false;
|
|
620
|
+
// One question for all of them: a common ancestor of HEAD and ANY of
|
|
621
|
+
// their branches is a common ancestor of HEAD and their merge. Capped,
|
|
622
|
+
// so a remote with thousands of branches cannot outgrow a command line.
|
|
623
|
+
await git(this.opts.gitRunner, repoDir, ['merge-base', 'HEAD', ...theirs.slice(0, 200)]);
|
|
624
|
+
return true;
|
|
625
|
+
} catch {
|
|
626
|
+
return false;
|
|
627
|
+
} finally {
|
|
628
|
+
// The probe leaves nothing behind in a clone that stays in use.
|
|
629
|
+
for (const ref of theirs) {
|
|
630
|
+
await git(this.opts.gitRunner, repoDir, ['update-ref', '-d', ref]).catch(() => undefined);
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
/**
|
|
636
|
+
* Move a working copy out of the workspaces root, whole. A rename where
|
|
637
|
+
* the two folders share a volume; a copy and then a removal where they do
|
|
638
|
+
* not (the backups root is a volume of its own in the shipped compose
|
|
639
|
+
* files), with the original removed only once the copy is complete.
|
|
640
|
+
*/
|
|
641
|
+
private async setAside(repoDir: string, dest: string): Promise<void> {
|
|
642
|
+
await fs.mkdir(path.dirname(dest), { recursive: true });
|
|
643
|
+
try {
|
|
644
|
+
await fs.rename(repoDir, dest);
|
|
645
|
+
return;
|
|
646
|
+
} catch {
|
|
647
|
+
// Another volume, or a handle held open on it: copy instead.
|
|
648
|
+
}
|
|
649
|
+
try {
|
|
650
|
+
await fs.cp(repoDir, dest, { recursive: true, errorOnExist: true, force: false, verbatimSymlinks: true });
|
|
651
|
+
} catch (err) {
|
|
652
|
+
await fs.rm(dest, { recursive: true, force: true }).catch(() => undefined);
|
|
653
|
+
throw new Error(
|
|
654
|
+
`Could not set aside the working copy at ${repoDir}, a clone of a repository that is no longer the ` +
|
|
655
|
+
`configured one, into ${dest}: ${err instanceof Error ? err.message : String(err)}. Nothing was deleted. ` +
|
|
656
|
+
'Make room there, or move that folder away by hand, and start again.',
|
|
657
|
+
{ cause: err },
|
|
658
|
+
);
|
|
659
|
+
}
|
|
660
|
+
await fs.rm(repoDir, { recursive: true, force: true });
|
|
661
|
+
}
|
|
662
|
+
|
|
508
663
|
/**
|
|
509
664
|
* The branch's working copy at the runtime layout
|
|
510
665
|
* (`<workspacesRoot>/<id>/<kbDirName>`), so the workspace service finds it
|
|
@@ -515,25 +670,24 @@ export class KbStartupRunner {
|
|
|
515
670
|
* commit recovery owns that work, not this phase.
|
|
516
671
|
*/
|
|
517
672
|
private async ensureClone(branch: string): Promise<string> {
|
|
518
|
-
const user = this.opts.gitUsername();
|
|
519
673
|
const workspaceDir = path.join(this.opts.workspacesRoot, workspaceIdForBranch(branch));
|
|
520
674
|
const repoDir = path.join(workspaceDir, this.opts.kbDirName);
|
|
521
675
|
const hasGit = await fs.access(path.join(repoDir, '.git')).then(() => true, () => false);
|
|
522
676
|
if (!hasGit) {
|
|
523
677
|
await fs.mkdir(workspaceDir, { recursive: true });
|
|
524
678
|
await fs.rm(repoDir, { recursive: true, force: true });
|
|
525
|
-
await git(this.opts.gitRunner, workspaceDir,
|
|
526
|
-
await git(this.opts.gitRunner, repoDir,
|
|
527
|
-
await stampIdentity(this.opts.gitRunner, repoDir
|
|
679
|
+
await git(this.opts.gitRunner, workspaceDir, ['clone', '-b', branch, this.opts.kbRepoUrl(), repoDir]);
|
|
680
|
+
await git(this.opts.gitRunner, repoDir, ['config', 'core.longpaths', 'true']);
|
|
681
|
+
await stampIdentity(this.opts.gitRunner, repoDir);
|
|
528
682
|
return repoDir;
|
|
529
683
|
}
|
|
530
|
-
await git(this.opts.gitRunner, repoDir,
|
|
531
|
-
const local = (await git(this.opts.gitRunner, repoDir,
|
|
532
|
-
const remote = (await git(this.opts.gitRunner, repoDir,
|
|
684
|
+
await git(this.opts.gitRunner, repoDir, ['fetch', 'origin', branch]);
|
|
685
|
+
const local = (await git(this.opts.gitRunner, repoDir, ['rev-parse', 'HEAD'])).trim();
|
|
686
|
+
const remote = (await git(this.opts.gitRunner, repoDir, ['rev-parse', `origin/${branch}`])).trim();
|
|
533
687
|
if (local !== remote) {
|
|
534
|
-
const mergeBase = (await git(this.opts.gitRunner, repoDir,
|
|
688
|
+
const mergeBase = (await git(this.opts.gitRunner, repoDir, ['merge-base', 'HEAD', `origin/${branch}`])).trim();
|
|
535
689
|
if (mergeBase === local) {
|
|
536
|
-
await git(this.opts.gitRunner, repoDir,
|
|
690
|
+
await git(this.opts.gitRunner, repoDir, ['reset', '--hard', `origin/${branch}`]);
|
|
537
691
|
}
|
|
538
692
|
// Ahead or diverged: committed-but-unpushed work lives here; not ours to discard.
|
|
539
693
|
}
|
|
@@ -544,13 +698,12 @@ export class KbStartupRunner {
|
|
|
544
698
|
private async finalize(h: BranchHandle): Promise<void> {
|
|
545
699
|
if (!h.dirty) return;
|
|
546
700
|
const repoDir = await h.repoDir();
|
|
547
|
-
|
|
548
|
-
await stampIdentity(this.opts.gitRunner, repoDir, user);
|
|
701
|
+
await stampIdentity(this.opts.gitRunner, repoDir);
|
|
549
702
|
// Drop any PRE-EXISTING index state first (a crashed tool may have left
|
|
550
703
|
// edits staged): `git commit` publishes the whole index, and the phase
|
|
551
704
|
// must commit exactly its own staged set. The edits stay in the working
|
|
552
705
|
// tree, unstaged and unpublished — preserved, not adopted.
|
|
553
|
-
await git(this.opts.gitRunner, repoDir,
|
|
706
|
+
await git(this.opts.gitRunner, repoDir, ['reset', '-q']);
|
|
554
707
|
// Stage ONLY the paths the phase's ops touched — sources and targets both
|
|
555
708
|
// (a move's `from` and a remove's path stage as deletions; `add -A -- <path>`
|
|
556
709
|
// handles a deleted path, `-f` handles one a branch `.gitignore` matches).
|
|
@@ -566,7 +719,7 @@ export class KbStartupRunner {
|
|
|
566
719
|
for (const rel of h.appliedPaths()) {
|
|
567
720
|
const onDisk = await fs.access(path.join(repoDir, rel)).then(() => true, () => false);
|
|
568
721
|
if (!onDisk) {
|
|
569
|
-
const known = (await git(this.opts.gitRunner, repoDir,
|
|
722
|
+
const known = (await git(this.opts.gitRunner, repoDir, ['ls-files', '--', `:(literal)${rel}`])).trim();
|
|
570
723
|
if (known === '') continue;
|
|
571
724
|
}
|
|
572
725
|
touched.push(rel);
|
|
@@ -574,7 +727,7 @@ export class KbStartupRunner {
|
|
|
574
727
|
// `:(literal)` — these are file paths, not pathspecs; chunked so a large
|
|
575
728
|
// migration cannot overflow the platform's argv limit.
|
|
576
729
|
for (let i = 0; i < touched.length; i += 100) {
|
|
577
|
-
await git(this.opts.gitRunner, repoDir,
|
|
730
|
+
await git(this.opts.gitRunner, repoDir, [
|
|
578
731
|
'add',
|
|
579
732
|
'-A',
|
|
580
733
|
'-f',
|
|
@@ -585,7 +738,7 @@ export class KbStartupRunner {
|
|
|
585
738
|
// Exit 0 = nothing staged: the ops converged to no byte changes. (An
|
|
586
739
|
// errored diff reads as "something staged"; a genuinely broken repo then
|
|
587
740
|
// fails loudly at commit rather than being silently skipped here.)
|
|
588
|
-
const nothingStaged = await git(this.opts.gitRunner, repoDir,
|
|
741
|
+
const nothingStaged = await git(this.opts.gitRunner, repoDir, ['diff', '--cached', '--quiet']).then(
|
|
589
742
|
() => true,
|
|
590
743
|
() => false,
|
|
591
744
|
);
|
|
@@ -594,10 +747,10 @@ export class KbStartupRunner {
|
|
|
594
747
|
// can undo exactly it — and ONLY it. Resetting to origin/<name> instead
|
|
595
748
|
// would also nuke a pre-existing committed-but-unpushed (AHEAD) commit
|
|
596
749
|
// that ensureClone deliberately preserved.
|
|
597
|
-
const preCommit = (await git(this.opts.gitRunner, repoDir,
|
|
598
|
-
await git(this.opts.gitRunner, repoDir,
|
|
750
|
+
const preCommit = (await git(this.opts.gitRunner, repoDir, ['rev-parse', 'HEAD'])).trim();
|
|
751
|
+
await git(this.opts.gitRunner, repoDir, ['commit', '-m', h.commitMessage()]);
|
|
599
752
|
try {
|
|
600
|
-
await git(this.opts.gitRunner, repoDir,
|
|
753
|
+
await git(this.opts.gitRunner, repoDir, ['push', 'origin', `HEAD:refs/heads/${h.name}`]);
|
|
601
754
|
startupLog.info(`${h.name}: ${h.commitSubject()}`);
|
|
602
755
|
// Committed AND pushed: nothing of the phase remains uncommitted here,
|
|
603
756
|
// so a LATER branch's failure under KB_SAFE_BOOT must not rewind this
|
|
@@ -621,7 +774,7 @@ export class KbStartupRunner {
|
|
|
621
774
|
startupLog.warn(`${h.name}: push rejected (concurrent replica?) — rolling back local commit.`, {
|
|
622
775
|
detail: this.redact(msg),
|
|
623
776
|
});
|
|
624
|
-
await git(this.opts.gitRunner, repoDir,
|
|
777
|
+
await git(this.opts.gitRunner, repoDir, ['reset', '--hard', preCommit]).catch(() => {});
|
|
625
778
|
}
|
|
626
779
|
}
|
|
627
780
|
}
|
|
@@ -655,7 +808,7 @@ class BranchHandle implements KbBranch {
|
|
|
655
808
|
// resetUncommitted resets to THIS sha rather than HEAD, so a finalize
|
|
656
809
|
// commit that was created but failed to push rolls back too instead of
|
|
657
810
|
// surviving as a stranded local commit no later boot would ever push.
|
|
658
|
-
this.prePhaseSha = (await git(this.gitRunner, dir,
|
|
811
|
+
this.prePhaseSha = (await git(this.gitRunner, dir, ['rev-parse', 'HEAD'])).trim();
|
|
659
812
|
return dir;
|
|
660
813
|
});
|
|
661
814
|
}
|
|
@@ -777,12 +930,12 @@ class BranchHandle implements KbBranch {
|
|
|
777
930
|
async resetUncommitted(): Promise<void> {
|
|
778
931
|
if (!this.dirty) return;
|
|
779
932
|
const repoDir = await this.repoDir();
|
|
780
|
-
await git(this.gitRunner, repoDir,
|
|
933
|
+
await git(this.gitRunner, repoDir, ['reset', '--hard', this.prePhaseSha ?? 'HEAD']).catch(() => {});
|
|
781
934
|
if (this.applied.size > 0) {
|
|
782
935
|
// `:(literal)` — these are file paths, not pathspecs: a name that
|
|
783
936
|
// happens to contain glob or magic characters must match itself only,
|
|
784
937
|
// never broaden the cleanup.
|
|
785
|
-
await git(this.gitRunner, repoDir,
|
|
938
|
+
await git(this.gitRunner, repoDir, [
|
|
786
939
|
'clean',
|
|
787
940
|
'-fdx',
|
|
788
941
|
'--',
|