@bevel-software/platform-core-backend 0.20.0 → 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/catalog-cache-invalidation.d.ts +7 -2
- package/dist/core/catalog-cache-invalidation.d.ts.map +1 -1
- package/dist/core/catalog-cache-invalidation.js +8 -9
- package/dist/core/catalog-cache-invalidation.js.map +1 -1
- package/dist/core/core-ports.d.ts +19 -0
- package/dist/core/core-ports.d.ts.map +1 -1
- package/dist/core/core-ports.js.map +1 -1
- package/dist/core/create-core-server.d.ts +2 -0
- package/dist/core/create-core-server.d.ts.map +1 -1
- package/dist/core/create-core-server.js +55 -107
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +41 -4
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +183 -82
- package/dist/core/create-core-services.js.map +1 -1
- package/dist/core/lifecycle.d.ts +74 -28
- package/dist/core/lifecycle.d.ts.map +1 -1
- package/dist/core/lifecycle.js +157 -20
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/core/public-config.d.ts +5 -1
- package/dist/core/public-config.d.ts.map +1 -1
- package/dist/core/public-config.js +7 -5
- package/dist/core/public-config.js.map +1 -1
- package/dist/core-config.d.ts +95 -1
- package/dist/core-config.d.ts.map +1 -1
- package/dist/core-config.js +24 -8
- package/dist/core-config.js.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/modules/access/access-control.service.d.ts +18 -1
- package/dist/modules/access/access-control.service.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.js +19 -8
- package/dist/modules/access/access-control.service.js.map +1 -1
- package/dist/modules/access/access-requests.contract.d.ts +75 -0
- package/dist/modules/access/access-requests.contract.d.ts.map +1 -0
- package/dist/modules/access/access-requests.contract.js +20 -0
- package/dist/modules/access/access-requests.contract.js.map +1 -0
- package/dist/modules/access/access-requests.routes.d.ts +35 -0
- package/dist/modules/access/access-requests.routes.d.ts.map +1 -0
- package/dist/modules/access/access-requests.routes.js +237 -0
- package/dist/modules/access/access-requests.routes.js.map +1 -0
- package/dist/modules/access/access-requests.service.d.ts +123 -0
- package/dist/modules/access/access-requests.service.d.ts.map +1 -0
- package/dist/modules/access/access-requests.service.js +337 -0
- package/dist/modules/access/access-requests.service.js.map +1 -0
- package/dist/modules/access/access.routes.d.ts +2 -1
- package/dist/modules/access/access.routes.d.ts.map +1 -1
- package/dist/modules/access/access.routes.js +10 -10
- package/dist/modules/access/access.routes.js.map +1 -1
- package/dist/modules/access/change-read-gate.d.ts +6 -3
- package/dist/modules/access/change-read-gate.d.ts.map +1 -1
- package/dist/modules/access/change-read-gate.js +9 -6
- package/dist/modules/access/change-read-gate.js.map +1 -1
- package/dist/modules/access/creator-access.d.ts +4 -2
- package/dist/modules/access/creator-access.d.ts.map +1 -1
- package/dist/modules/access/creator-access.js +7 -4
- package/dist/modules/access/creator-access.js.map +1 -1
- package/dist/modules/access-model/access-grammar.d.ts +12 -0
- package/dist/modules/access-model/access-grammar.d.ts.map +1 -1
- package/dist/modules/access-model/access-grammar.js +24 -0
- package/dist/modules/access-model/access-grammar.js.map +1 -1
- package/dist/modules/agent-instructions/read-preamble.d.ts +2 -1
- package/dist/modules/agent-instructions/read-preamble.d.ts.map +1 -1
- package/dist/modules/agent-instructions/read-preamble.js +6 -9
- package/dist/modules/agent-instructions/read-preamble.js.map +1 -1
- package/dist/modules/auth/account-admission.d.ts +40 -0
- package/dist/modules/auth/account-admission.d.ts.map +1 -0
- package/dist/modules/auth/account-admission.js +17 -0
- package/dist/modules/auth/account-admission.js.map +1 -0
- package/dist/modules/auth/account.routes.d.ts.map +1 -1
- package/dist/modules/auth/account.routes.js +4 -1
- package/dist/modules/auth/account.routes.js.map +1 -1
- package/dist/modules/auth/auth.service.d.ts +45 -2
- package/dist/modules/auth/auth.service.d.ts.map +1 -1
- package/dist/modules/auth/auth.service.js +44 -3
- package/dist/modules/auth/auth.service.js.map +1 -1
- package/dist/modules/auth/oidc-auth-provider.d.ts.map +1 -1
- package/dist/modules/auth/oidc-auth-provider.js +9 -0
- package/dist/modules/auth/oidc-auth-provider.js.map +1 -1
- package/dist/modules/connection-probe/connection-probe.service.d.ts +13 -1
- package/dist/modules/connection-probe/connection-probe.service.d.ts.map +1 -1
- package/dist/modules/connection-probe/connection-probe.service.js +10 -2
- package/dist/modules/connection-probe/connection-probe.service.js.map +1 -1
- package/dist/modules/database/advisory-lock.d.ts +17 -0
- package/dist/modules/database/advisory-lock.d.ts.map +1 -1
- package/dist/modules/database/advisory-lock.js +24 -3
- package/dist/modules/database/advisory-lock.js.map +1 -1
- package/dist/modules/database/connection.d.ts +67 -2
- package/dist/modules/database/connection.d.ts.map +1 -1
- package/dist/modules/database/connection.js +118 -12
- package/dist/modules/database/connection.js.map +1 -1
- package/dist/modules/database/migrate.d.ts +1 -1
- package/dist/modules/database/migrate.d.ts.map +1 -1
- package/dist/modules/database/migrate.js +27 -3
- package/dist/modules/database/migrate.js.map +1 -1
- package/dist/modules/github-app/github-app.client.d.ts +101 -0
- package/dist/modules/github-app/github-app.client.d.ts.map +1 -0
- package/dist/modules/github-app/github-app.client.js +222 -0
- package/dist/modules/github-app/github-app.client.js.map +1 -0
- package/dist/modules/github-app/github-app.connection.d.ts +102 -0
- package/dist/modules/github-app/github-app.connection.d.ts.map +1 -0
- package/dist/modules/github-app/github-app.connection.js +185 -0
- package/dist/modules/github-app/github-app.connection.js.map +1 -0
- package/dist/modules/github-app/github-app.routes.d.ts +59 -0
- package/dist/modules/github-app/github-app.routes.d.ts.map +1 -0
- package/dist/modules/github-app/github-app.routes.js +323 -0
- package/dist/modules/github-app/github-app.routes.js.map +1 -0
- package/dist/modules/github-app/index.d.ts +4 -0
- package/dist/modules/github-app/index.d.ts.map +1 -0
- package/dist/modules/github-app/index.js +4 -0
- package/dist/modules/github-app/index.js.map +1 -0
- package/dist/modules/kb-fs/branch-name.d.ts +0 -1
- package/dist/modules/kb-fs/branch-name.d.ts.map +1 -1
- package/dist/modules/kb-fs/branch-name.js +3 -3
- package/dist/modules/kb-fs/branch-name.js.map +1 -1
- package/dist/modules/kb-fs/clone-config.d.ts +9 -8
- package/dist/modules/kb-fs/clone-config.d.ts.map +1 -1
- package/dist/modules/kb-fs/clone-config.js +14 -12
- package/dist/modules/kb-fs/clone-config.js.map +1 -1
- package/dist/modules/kb-fs/remote-url.d.ts +22 -0
- package/dist/modules/kb-fs/remote-url.d.ts.map +1 -0
- package/dist/modules/kb-fs/remote-url.js +35 -0
- package/dist/modules/kb-fs/remote-url.js.map +1 -0
- package/dist/modules/mcp/mcp.service.d.ts +7 -0
- package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.service.js +4 -4
- package/dist/modules/mcp/mcp.service.js.map +1 -1
- package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts +4 -4
- package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts.map +1 -1
- package/dist/modules/plugins/compile/marketplace-compiler.service.js +7 -10
- package/dist/modules/plugins/compile/marketplace-compiler.service.js.map +1 -1
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.d.ts +4 -1
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.d.ts.map +1 -1
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js +5 -3
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js.map +1 -1
- package/dist/modules/plugins/discovery/kb-plugin-source.d.ts +6 -1
- package/dist/modules/plugins/discovery/kb-plugin-source.d.ts.map +1 -1
- package/dist/modules/plugins/discovery/kb-plugin-source.js +14 -9
- package/dist/modules/plugins/discovery/kb-plugin-source.js.map +1 -1
- package/dist/modules/plugins/discovery/native.source.d.ts +4 -1
- package/dist/modules/plugins/discovery/native.source.d.ts.map +1 -1
- package/dist/modules/plugins/discovery/native.source.js +4 -2
- package/dist/modules/plugins/discovery/native.source.js.map +1 -1
- package/dist/modules/plugins/index.d.ts +1 -1
- package/dist/modules/plugins/index.d.ts.map +1 -1
- package/dist/modules/plugins/index.js +1 -1
- package/dist/modules/plugins/index.js.map +1 -1
- package/dist/modules/plugins/join-proposals.d.ts +17 -5
- package/dist/modules/plugins/join-proposals.d.ts.map +1 -1
- package/dist/modules/plugins/join-proposals.js +76 -22
- package/dist/modules/plugins/join-proposals.js.map +1 -1
- package/dist/modules/plugins/join-request-jobs.service.d.ts +3 -1
- package/dist/modules/plugins/join-request-jobs.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-request-jobs.service.js +6 -6
- package/dist/modules/plugins/join-request-jobs.service.js.map +1 -1
- package/dist/modules/plugins/join-requests.service.d.ts +113 -18
- package/dist/modules/plugins/join-requests.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-requests.service.js +178 -33
- package/dist/modules/plugins/join-requests.service.js.map +1 -1
- package/dist/modules/plugins/plugin-links.d.ts +65 -10
- package/dist/modules/plugins/plugin-links.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-links.js +136 -31
- package/dist/modules/plugins/plugin-links.js.map +1 -1
- package/dist/modules/plugins/plugin-links.service.d.ts +107 -5
- package/dist/modules/plugins/plugin-links.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-links.service.js +151 -21
- package/dist/modules/plugins/plugin-links.service.js.map +1 -1
- package/dist/modules/plugins/plugin-provision.service.d.ts +10 -3
- package/dist/modules/plugins/plugin-provision.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-provision.service.js +33 -26
- package/dist/modules/plugins/plugin-provision.service.js.map +1 -1
- package/dist/modules/plugins/plugin-rename.service.d.ts +4 -2
- package/dist/modules/plugins/plugin-rename.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-rename.service.js +10 -12
- package/dist/modules/plugins/plugin-rename.service.js.map +1 -1
- package/dist/modules/plugins/plugins.routes.d.ts +3 -0
- package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.routes.js +48 -17
- package/dist/modules/plugins/plugins.routes.js.map +1 -1
- package/dist/modules/plugins/plugins.service.d.ts +4 -4
- package/dist/modules/plugins/plugins.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.service.js +7 -10
- package/dist/modules/plugins/plugins.service.js.map +1 -1
- package/dist/modules/plugins/teams.routes.d.ts +4 -1
- package/dist/modules/plugins/teams.routes.d.ts.map +1 -1
- package/dist/modules/plugins/teams.routes.js +11 -9
- package/dist/modules/plugins/teams.routes.js.map +1 -1
- package/dist/modules/secrets-vault/index.d.ts +1 -1
- package/dist/modules/secrets-vault/index.d.ts.map +1 -1
- package/dist/modules/secrets-vault/index.js +1 -1
- package/dist/modules/secrets-vault/index.js.map +1 -1
- package/dist/modules/secrets-vault/secrets-variable-loader.d.ts +29 -11
- package/dist/modules/secrets-vault/secrets-variable-loader.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-variable-loader.js +46 -21
- package/dist/modules/secrets-vault/secrets-variable-loader.js.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts +3 -0
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.js +4 -6
- package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -1
- package/dist/modules/settings/deployment-settings.service.d.ts +34 -9
- package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
- package/dist/modules/settings/deployment-settings.service.js +113 -26
- package/dist/modules/settings/deployment-settings.service.js.map +1 -1
- package/dist/modules/settings/managed-repository.d.ts +43 -0
- package/dist/modules/settings/managed-repository.d.ts.map +1 -0
- package/dist/modules/settings/managed-repository.js +60 -0
- package/dist/modules/settings/managed-repository.js.map +1 -0
- package/dist/modules/settings/repository-source.d.ts +128 -0
- package/dist/modules/settings/repository-source.d.ts.map +1 -0
- package/dist/modules/settings/repository-source.js +150 -0
- package/dist/modules/settings/repository-source.js.map +1 -0
- package/dist/modules/settings/setup.routes.d.ts +34 -4
- package/dist/modules/settings/setup.routes.d.ts.map +1 -1
- package/dist/modules/settings/setup.routes.js +198 -18
- package/dist/modules/settings/setup.routes.js.map +1 -1
- package/dist/modules/skills/allowed-tools-check.d.ts +4 -3
- package/dist/modules/skills/allowed-tools-check.d.ts.map +1 -1
- package/dist/modules/skills/allowed-tools-check.js +8 -8
- package/dist/modules/skills/allowed-tools-check.js.map +1 -1
- package/dist/modules/skills/pending-skills.service.d.ts +3 -1
- package/dist/modules/skills/pending-skills.service.d.ts.map +1 -1
- package/dist/modules/skills/pending-skills.service.js +9 -6
- package/dist/modules/skills/pending-skills.service.js.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.d.ts +8 -9
- package/dist/modules/skills/skill-access-requests.routes.d.ts.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.js +26 -65
- package/dist/modules/skills/skill-access-requests.routes.js.map +1 -1
- package/dist/modules/skills/skills.routes.d.ts +4 -1
- package/dist/modules/skills/skills.routes.d.ts.map +1 -1
- package/dist/modules/skills/skills.routes.js +4 -4
- package/dist/modules/skills/skills.routes.js.map +1 -1
- package/dist/modules/skills/skills.service.d.ts +4 -2
- package/dist/modules/skills/skills.service.d.ts.map +1 -1
- package/dist/modules/skills/skills.service.js +13 -11
- package/dist/modules/skills/skills.service.js.map +1 -1
- package/dist/modules/tool-helpers/tool-context.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-context.js +15 -0
- package/dist/modules/tool-helpers/tool-context.js.map +1 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.d.ts +2 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.d.ts.map +1 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.js +6 -5
- package/dist/modules/tool-manuals/mcp-json-discovery.js.map +1 -1
- package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts +4 -2
- package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/mcp-server-edit.service.js +12 -10
- package/dist/modules/tool-manuals/mcp-server-edit.service.js.map +1 -1
- package/dist/modules/tool-manuals/pending-tools.service.d.ts +3 -1
- package/dist/modules/tool-manuals/pending-tools.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/pending-tools.service.js +19 -16
- package/dist/modules/tool-manuals/pending-tools.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-delete.service.d.ts +4 -2
- package/dist/modules/tool-manuals/tool-delete.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-delete.service.js +14 -12
- package/dist/modules/tool-manuals/tool-delete.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.d.ts +3 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.js +7 -7
- package/dist/modules/tool-manuals/tool-manuals.routes.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts +4 -2
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.js +15 -12
- package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +3 -0
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.js +4 -6
- package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts +3 -2
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.js +47 -11
- package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
- package/dist/modules/workflow/git/git.service.d.ts +14 -6
- package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/git.service.js +40 -18
- package/dist/modules/workflow/git/git.service.js.map +1 -1
- package/dist/modules/workflow/git/node-git-runner.d.ts +26 -2
- package/dist/modules/workflow/git/node-git-runner.d.ts.map +1 -1
- package/dist/modules/workflow/git/node-git-runner.js +40 -5
- package/dist/modules/workflow/git/node-git-runner.js.map +1 -1
- package/dist/modules/workflow/git/pull-request.service.d.ts +45 -0
- package/dist/modules/workflow/git/pull-request.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/pull-request.service.js +99 -0
- package/dist/modules/workflow/git/pull-request.service.js.map +1 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.js +9 -4
- package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +1 -1
- package/dist/modules/workflow/session-ontology.service.d.ts +6 -1
- package/dist/modules/workflow/session-ontology.service.d.ts.map +1 -1
- package/dist/modules/workflow/session-ontology.service.js +6 -2
- package/dist/modules/workflow/session-ontology.service.js.map +1 -1
- package/dist/modules/workflow/workflow.routes.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.routes.js +3 -1
- package/dist/modules/workflow/workflow.routes.js.map +1 -1
- package/dist/modules/workflow/workflow.service.d.ts +42 -10
- package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.service.js +181 -71
- package/dist/modules/workflow/workflow.service.js.map +1 -1
- package/dist/modules/workspace/session-ontology.gate.d.ts +3 -1
- package/dist/modules/workspace/session-ontology.gate.d.ts.map +1 -1
- package/dist/modules/workspace/session-ontology.gate.js +3 -3
- package/dist/modules/workspace/session-ontology.gate.js.map +1 -1
- package/dist/modules/workspace/startup/kb-git.d.ts +4 -3
- package/dist/modules/workspace/startup/kb-git.d.ts.map +1 -1
- package/dist/modules/workspace/startup/kb-git.js +15 -13
- package/dist/modules/workspace/startup/kb-git.js.map +1 -1
- package/dist/modules/workspace/startup/kb-startup-runner.d.ts +70 -7
- package/dist/modules/workspace/startup/kb-startup-runner.d.ts.map +1 -1
- package/dist/modules/workspace/startup/kb-startup-runner.js +183 -38
- package/dist/modules/workspace/startup/kb-startup-runner.js.map +1 -1
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.d.ts +7 -1
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js +23 -16
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/personal-spaces.step.d.ts +7 -1
- package/dist/modules/workspace/startup/steps/personal-spaces.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/personal-spaces.step.js +12 -5
- package/dist/modules/workspace/startup/steps/personal-spaces.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.d.ts +7 -1
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.js +12 -5
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.d.ts +7 -1
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.js +12 -5
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts +4 -1
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.js +14 -11
- package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts +17 -3
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.js +36 -30
- package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.d.ts +6 -1
- package/dist/modules/workspace/startup/steps/template-source.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.js +10 -6
- package/dist/modules/workspace/startup/steps/template-source.js.map +1 -1
- package/dist/modules/workspace/workspace.routes.d.ts +2 -1
- package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.routes.js +8 -7
- package/dist/modules/workspace/workspace.routes.js.map +1 -1
- package/dist/modules/workspace/workspace.service.d.ts +18 -12
- package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.service.js +49 -29
- package/dist/modules/workspace/workspace.service.js.map +1 -1
- package/dist/modules/workspace/workspace.tools.d.ts +2 -1
- package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.tools.js +48 -20
- package/dist/modules/workspace/workspace.tools.js.map +1 -1
- package/dist/modules/workspace/write-denial.d.ts +3 -2
- package/dist/modules/workspace/write-denial.d.ts.map +1 -1
- package/dist/modules/workspace/write-denial.js +6 -5
- package/dist/modules/workspace/write-denial.js.map +1 -1
- package/dist/shared/domain-errors.d.ts +39 -0
- package/dist/shared/domain-errors.d.ts.map +1 -1
- package/dist/shared/domain-errors.js +55 -0
- package/dist/shared/domain-errors.js.map +1 -1
- package/dist/shared/git.contract.d.ts +62 -7
- package/dist/shared/git.contract.d.ts.map +1 -1
- package/dist/shared/git.contract.js +30 -8
- package/dist/shared/git.contract.js.map +1 -1
- package/dist/shared/kb-context.d.ts +76 -0
- package/dist/shared/kb-context.d.ts.map +1 -0
- package/dist/shared/kb-context.js +108 -0
- package/dist/shared/kb-context.js.map +1 -0
- package/dist/shared/kb-layout.d.ts +3 -2
- package/dist/shared/kb-layout.d.ts.map +1 -1
- package/dist/shared/kb-layout.js +4 -3
- package/dist/shared/kb-layout.js.map +1 -1
- package/dist/shared/kb-layout.test.js +35 -27
- package/dist/shared/kb-layout.test.js.map +1 -1
- package/dist/shared/pending-proposals.d.ts +4 -1
- package/dist/shared/pending-proposals.d.ts.map +1 -1
- package/dist/shared/pending-proposals.js +3 -4
- package/dist/shared/pending-proposals.js.map +1 -1
- package/dist/shared/redact-secret.d.ts +5 -5
- package/dist/shared/redact-secret.js +5 -5
- package/dist/tenancy/index.d.ts +13 -0
- package/dist/tenancy/index.d.ts.map +1 -0
- package/dist/tenancy/index.js +13 -0
- package/dist/tenancy/index.js.map +1 -0
- package/dist/tenancy/static-tenant-source.d.ts +98 -0
- package/dist/tenancy/static-tenant-source.d.ts.map +1 -0
- package/dist/tenancy/static-tenant-source.js +220 -0
- package/dist/tenancy/static-tenant-source.js.map +1 -0
- package/dist/tenancy/tenant-host.d.ts +80 -0
- package/dist/tenancy/tenant-host.d.ts.map +1 -0
- package/dist/tenancy/tenant-host.js +217 -0
- package/dist/tenancy/tenant-host.js.map +1 -0
- package/dist/tenancy/tenant-runtime.d.ts +91 -0
- package/dist/tenancy/tenant-runtime.d.ts.map +1 -0
- package/dist/tenancy/tenant-runtime.js +174 -0
- package/dist/tenancy/tenant-runtime.js.map +1 -0
- package/dist/tenancy/tenant-secrets.d.ts +24 -0
- package/dist/tenancy/tenant-secrets.d.ts.map +1 -0
- package/dist/tenancy/tenant-secrets.js +30 -0
- package/dist/tenancy/tenant-secrets.js.map +1 -0
- package/dist/tenancy/tenant-source.contract.d.ts +45 -0
- package/dist/tenancy/tenant-source.contract.d.ts.map +1 -0
- package/dist/tenancy/tenant-source.contract.js +21 -0
- package/dist/tenancy/tenant-source.contract.js.map +1 -0
- package/migrations/0000_core_init.sql +14 -14
- package/migrations/0003_deployment_settings.sql +1 -1
- package/migrations/0005_github_facade.sql +1 -1
- package/migrations/0012_agent_audit.sql +6 -6
- package/package.json +3 -3
- package/src/__tests__/branch-model.test.ts +7 -6
- package/src/__tests__/kb-context.ts +30 -0
- package/src/__tests__/kb-layout-config.test.ts +35 -30
- package/src/core/__tests__/catalog-cache-invalidation.test.ts +2 -1
- package/src/core/__tests__/lifecycle.test.ts +78 -1
- package/src/core/__tests__/public-config.test.ts +5 -1
- package/src/core/catalog-cache-invalidation.ts +16 -11
- package/src/core/core-ports.ts +19 -0
- package/src/core/create-core-server.ts +64 -107
- package/src/core/create-core-services.ts +238 -96
- package/src/core/lifecycle.ts +214 -29
- package/src/core/public-config.ts +8 -5
- package/src/core-config.ts +107 -8
- package/src/index.ts +25 -2
- package/src/modules/access/__tests__/access-control.admin-root-floor.test.ts +2 -1
- package/src/modules/access/__tests__/access-requests.recut.test.ts +134 -0
- package/src/modules/access/__tests__/access-requests.routes.test.ts +610 -0
- package/src/modules/access/__tests__/access.routes.batch.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.folder-governs.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.group-grant.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.overrides.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.proposal-branch.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.prospective.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.revoke.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.unknown-email.test.ts +2 -1
- package/src/modules/access/__tests__/change-read-gate.test.ts +13 -11
- package/src/modules/access/__tests__/creator-access.test.ts +3 -2
- package/src/modules/access/__tests__/roles.routes.test.ts +2 -1
- package/src/modules/access/access-control.service.ts +20 -6
- package/src/modules/access/access-requests.contract.ts +93 -0
- package/src/modules/access/access-requests.routes.ts +286 -0
- package/src/modules/access/access-requests.service.ts +420 -0
- package/src/modules/access/access.routes.ts +10 -13
- package/src/modules/access/change-read-gate.ts +10 -4
- package/src/modules/access/creator-access.ts +7 -2
- package/src/modules/access-model/access-grammar.ts +22 -0
- package/src/modules/agent-instructions/__tests__/read-preamble.test.ts +13 -12
- package/src/modules/agent-instructions/read-preamble.ts +10 -12
- package/src/modules/auth/__tests__/account.routes.test.ts +15 -0
- package/src/modules/auth/__tests__/auth.service.test.ts +98 -0
- package/src/modules/auth/account-admission.ts +44 -0
- package/src/modules/auth/account.routes.ts +4 -1
- package/src/modules/auth/auth.service.ts +61 -2
- package/src/modules/auth/oidc-auth-provider.ts +9 -0
- package/src/modules/connection-probe/connection-probe.service.ts +7 -1
- package/src/modules/database/__tests__/advisory-lock.test.ts +23 -1
- package/src/modules/database/__tests__/connection.test.ts +98 -0
- package/src/modules/database/__tests__/migrations-unqualified.test.ts +32 -0
- package/src/modules/database/advisory-lock.ts +28 -4
- package/src/modules/database/connection.ts +143 -13
- package/src/modules/database/migrate.ts +48 -14
- package/src/modules/diff/__tests__/diff.service.seed-atomicity.test.ts +2 -1
- package/src/modules/diff/__tests__/diff.service.test.ts +2 -1
- package/src/modules/github-app/__tests__/github-app.test.ts +848 -0
- package/src/modules/github-app/github-app.client.ts +268 -0
- package/src/modules/github-app/github-app.connection.ts +204 -0
- package/src/modules/github-app/github-app.routes.ts +359 -0
- package/src/modules/github-app/index.ts +19 -0
- package/src/modules/kb-fs/__tests__/branch-name.test.ts +6 -6
- package/src/modules/kb-fs/__tests__/clone-config.test.ts +24 -20
- package/src/modules/kb-fs/__tests__/remote-url.test.ts +38 -0
- package/src/modules/kb-fs/branch-name.ts +3 -3
- package/src/modules/kb-fs/clone-config.ts +15 -12
- package/src/modules/kb-fs/remote-url.ts +35 -0
- package/src/modules/marketplace/__tests__/marketplace-repo.head.test.ts +2 -1
- package/src/modules/mcp/mcp.service.ts +11 -4
- package/src/modules/plugins/__tests__/bundle-dialect.e2e.test.ts +12 -11
- package/src/modules/plugins/__tests__/bundle-dialect.test.ts +2 -1
- package/src/modules/plugins/__tests__/compile-marketplace.test.ts +6 -4
- package/src/modules/plugins/__tests__/join-proposals.test.ts +100 -19
- package/src/modules/plugins/__tests__/join-request-jobs.service.test.ts +2 -1
- package/src/modules/plugins/__tests__/join-requests.service.test.ts +28 -11
- package/src/modules/plugins/__tests__/join-requests.settlement.test.ts +371 -0
- package/src/modules/plugins/__tests__/plugin-creation-display-name.test.ts +4 -3
- package/src/modules/plugins/__tests__/plugin-index.service.test.ts +6 -4
- package/src/modules/plugins/__tests__/plugin-links.service.test.ts +220 -5
- package/src/modules/plugins/__tests__/plugin-provision.service.test.ts +3 -1
- package/src/modules/plugins/__tests__/plugin-rename.service.test.ts +7 -6
- package/src/modules/plugins/__tests__/plugins.routes.test.ts +12 -3
- package/src/modules/plugins/__tests__/teams.routes.test.ts +2 -1
- package/src/modules/plugins/compile/marketplace-compiler.service.ts +7 -9
- package/src/modules/plugins/discovery/__tests__/kb-plugin-source.test.ts +20 -16
- package/src/modules/plugins/discovery/bundle-dialect/bundle.source.ts +9 -2
- package/src/modules/plugins/discovery/kb-plugin-source.ts +15 -8
- package/src/modules/plugins/discovery/native.source.ts +4 -1
- package/src/modules/plugins/index.ts +1 -1
- package/src/modules/plugins/join-proposals.ts +87 -19
- package/src/modules/plugins/join-request-jobs.service.ts +8 -7
- package/src/modules/plugins/join-requests.service.ts +203 -43
- package/src/modules/plugins/plugin-links.service.ts +192 -19
- package/src/modules/plugins/plugin-links.ts +147 -27
- package/src/modules/plugins/plugin-provision.service.ts +54 -27
- package/src/modules/plugins/plugin-rename.service.ts +10 -10
- package/src/modules/plugins/plugins.routes.ts +48 -17
- package/src/modules/plugins/plugins.service.ts +7 -11
- package/src/modules/plugins/teams.routes.ts +16 -8
- package/src/modules/secrets-vault/__tests__/connect-pending.route.test.ts +7 -0
- package/src/modules/secrets-vault/__tests__/secrets-variable-loader.test.ts +40 -0
- package/src/modules/secrets-vault/__tests__/tool-owner-gate.route.test.ts +2 -0
- package/src/modules/secrets-vault/index.ts +2 -0
- package/src/modules/secrets-vault/secrets-variable-loader.ts +51 -21
- package/src/modules/secrets-vault/secrets-vault.routes.ts +7 -6
- package/src/modules/settings/__tests__/deployment-settings.service.test.ts +24 -11
- package/src/modules/settings/__tests__/git-root-folders.test.ts +2 -1
- package/src/modules/settings/__tests__/repository-source.test.ts +191 -0
- package/src/modules/settings/__tests__/setup.routes.boot-failure.test.ts +2 -1
- package/src/modules/settings/__tests__/setup.routes.git-mode.test.ts +353 -0
- package/src/modules/settings/__tests__/setup.routes.github-app.test.ts +282 -0
- package/src/modules/settings/__tests__/setup.routes.layout-phase.test.ts +7 -4
- package/src/modules/settings/__tests__/setup.routes.managed-phase.test.ts +233 -0
- package/src/modules/settings/__tests__/setup.routes.oidc.test.ts +2 -0
- package/src/modules/settings/__tests__/setup.routes.sync-status.test.ts +2 -0
- package/src/modules/settings/__tests__/setup.routes.test.ts +33 -52
- package/src/modules/settings/deployment-settings.service.ts +130 -23
- package/src/modules/settings/managed-repository.ts +68 -0
- package/src/modules/settings/repository-source.ts +197 -0
- package/src/modules/settings/setup.routes.ts +233 -19
- package/src/modules/skills/__tests__/allowed-tools-check.test.ts +11 -10
- package/src/modules/skills/__tests__/allowed-tools-warn.tools.test.ts +4 -3
- package/src/modules/skills/__tests__/pending-skills.service.test.ts +3 -1
- package/src/modules/skills/__tests__/skill-access-requests.routes.test.ts +7 -2
- package/src/modules/skills/__tests__/skills.routes.warnings.test.ts +2 -1
- package/src/modules/skills/__tests__/skills.service.test.ts +3 -2
- package/src/modules/skills/allowed-tools-check.ts +7 -6
- package/src/modules/skills/pending-skills.service.ts +9 -8
- package/src/modules/skills/skill-access-requests.routes.ts +29 -79
- package/src/modules/skills/skills.routes.ts +4 -3
- package/src/modules/skills/skills.service.ts +13 -9
- package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +3 -2
- package/src/modules/tool-helpers/__tests__/phase4-tools.test.ts +3 -2
- package/src/modules/tool-helpers/tool-context.ts +15 -0
- package/src/modules/tool-manuals/__tests__/mcp-json-discovery.test.ts +17 -12
- package/src/modules/tool-manuals/__tests__/mcp-server-edit.service.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/pending-tools.service.test.ts +4 -1
- package/src/modules/tool-manuals/__tests__/tool-delete.service.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.archive.route.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.cli.test.ts +5 -4
- package/src/modules/tool-manuals/__tests__/tool-manuals.detail.route.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.invalid.routes.test.ts +4 -2
- package/src/modules/tool-manuals/__tests__/tool-manuals.invalid.test.ts +13 -5
- package/src/modules/tool-manuals/__tests__/tool-manuals.mcp-oauth.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.restart.test.ts +9 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.service.test.ts +3 -2
- package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +2 -0
- package/src/modules/tool-manuals/mcp-json-discovery.ts +6 -4
- package/src/modules/tool-manuals/mcp-server-edit.service.ts +13 -11
- package/src/modules/tool-manuals/pending-tools.service.ts +19 -16
- package/src/modules/tool-manuals/tool-delete.service.ts +13 -10
- package/src/modules/tool-manuals/tool-manuals.routes.ts +10 -8
- package/src/modules/tool-manuals/tool-manuals.service.ts +15 -13
- package/src/modules/tool-manuals/tool-manuals.tools.ts +7 -6
- package/src/modules/workflow/__tests__/apply-failure.test.ts +11 -2
- package/src/modules/workflow/__tests__/merge-announces-tree.test.ts +14 -26
- package/src/modules/workflow/__tests__/preserve-roles-yaml.test.ts +2 -1
- package/src/modules/workflow/__tests__/session-ontology.service.test.ts +3 -2
- package/src/modules/workflow/__tests__/workflow.routes.lock-path.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.branch-in-use.test.ts +3 -10
- package/src/modules/workflow/__tests__/workflow.service.commitFileWhileLocked.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.deleted-branch-sweep.test.ts +3 -10
- package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +187 -35
- package/src/modules/workflow/__tests__/workflow.service.folder-proposals.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.platform-restore.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.read-gate.test.ts +3 -2
- package/src/modules/workflow/__tests__/workflow.service.releaseLock.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.sync.test.ts +5 -4
- package/src/modules/workflow/__tests__/workflow.service.update-from-target.test.ts +148 -41
- package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +143 -2
- package/src/modules/workflow/agent-tools/workflow.tools.ts +60 -12
- package/src/modules/workflow/git/__tests__/git.service.accessGating.test.ts +5 -4
- package/src/modules/workflow/git/__tests__/git.service.changedFilesForPr.test.ts +12 -11
- package/src/modules/workflow/git/__tests__/git.service.commitChanges.test.ts +9 -8
- package/src/modules/workflow/git/__tests__/git.service.commitFile.strayPath.test.ts +8 -7
- package/src/modules/workflow/git/__tests__/git.service.commitFile.test.ts +6 -5
- package/src/modules/workflow/git/__tests__/git.service.createBranch.test.ts +3 -2
- package/src/modules/workflow/git/__tests__/git.service.deleteBranch.test.ts +3 -2
- package/src/modules/workflow/git/__tests__/git.service.diffFileAtCommit.test.ts +7 -6
- package/src/modules/workflow/git/__tests__/git.service.diffFileBetweenBranches.test.ts +16 -15
- package/src/modules/workflow/git/__tests__/git.service.fileContentsAtCommit.test.ts +3 -2
- package/src/modules/workflow/git/__tests__/git.service.forkPoint.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.history-guards.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.list-branches.test.ts +10 -9
- package/src/modules/workflow/git/__tests__/git.service.listTrackedFiles.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.logForFile.test.ts +6 -5
- package/src/modules/workflow/git/__tests__/git.service.mergeChangeRequest.test.ts +9 -8
- package/src/modules/workflow/git/__tests__/git.service.pendingChanges.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.postMergePull.test.ts +4 -3
- package/src/modules/workflow/git/__tests__/git.service.pull.test.ts +130 -8
- package/src/modules/workflow/git/__tests__/git.service.readFileAtRef.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.revertPathsAndPush.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.status.test.ts +4 -3
- package/src/modules/workflow/git/__tests__/git.service.syncFromRemote.test.ts +8 -7
- package/src/modules/workflow/git/__tests__/node-git-runner.test.ts +41 -3
- package/src/modules/workflow/git/__tests__/pull-request.service.getPrDetail.test.ts +145 -2
- package/src/modules/workflow/git/__tests__/pull-request.service.viewer-can-delete.test.ts +166 -0
- package/src/modules/workflow/git/git.service.ts +49 -17
- package/src/modules/workflow/git/node-git-runner.ts +43 -4
- package/src/modules/workflow/git/pull-request.service.ts +119 -0
- package/src/modules/workflow/review-workflow/review-workflow.service.ts +9 -6
- package/src/modules/workflow/session-ontology.service.ts +7 -2
- package/src/modules/workflow/workflow.routes.ts +3 -1
- package/src/modules/workflow/workflow.service.ts +201 -76
- package/src/modules/workspace/__tests__/file-stat-access.test.ts +3 -2
- package/src/modules/workspace/__tests__/git-internals.security.test.ts +10 -9
- package/src/modules/workspace/__tests__/session-ontology.gate.test.ts +4 -2
- package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +3 -2
- package/src/modules/workspace/__tests__/workspace.routes.branch-errors.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.create-grant.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.download-implies-read.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.file-writes.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.folders.test.ts +5 -4
- package/src/modules/workspace/__tests__/workspace.routes.move-platform-files.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.service.ensure-remotes-fetched.test.ts +2 -2
- package/src/modules/workspace/__tests__/workspace.service.list-cloned.test.ts +6 -5
- package/src/modules/workspace/__tests__/workspace.service.move-never-overwrites.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.service.read-filter.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.service.test.ts +84 -50
- package/src/modules/workspace/__tests__/workspace.service.unknown-branch.test.ts +45 -1
- package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +10 -7
- package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +237 -10
- package/src/modules/workspace/__tests__/workspace.tools.test.ts +44 -11
- package/src/modules/workspace/__tests__/write-denial.test.ts +5 -4
- package/src/modules/workspace/session-ontology.gate.ts +6 -4
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.degraded.test.ts +6 -2
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.test.ts +240 -21
- package/src/modules/workspace/startup/kb-git.ts +15 -22
- package/src/modules/workspace/startup/kb-startup-runner.ts +198 -45
- package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +104 -98
- package/src/modules/workspace/startup/steps/groups-to-plugins.step.ts +24 -16
- package/src/modules/workspace/startup/steps/personal-spaces.step.ts +14 -5
- package/src/modules/workspace/startup/steps/plugin-display-names.step.ts +13 -5
- package/src/modules/workspace/startup/steps/plugin-manifests.step.ts +14 -5
- package/src/modules/workspace/startup/steps/seed-tree.ts +11 -9
- package/src/modules/workspace/startup/steps/template-files.step.ts +43 -34
- package/src/modules/workspace/startup/steps/template-source.ts +8 -5
- package/src/modules/workspace/workspace.routes.ts +8 -7
- package/src/modules/workspace/workspace.service.ts +47 -28
- package/src/modules/workspace/workspace.tools.ts +56 -20
- package/src/modules/workspace/write-denial.ts +7 -5
- package/src/shared/__tests__/kb-layout.plugin.test.ts +19 -16
- package/src/shared/domain-errors.ts +58 -0
- package/src/shared/git.contract.ts +80 -8
- package/src/shared/kb-context.ts +130 -0
- package/src/shared/kb-layout.test.ts +37 -27
- package/src/shared/kb-layout.ts +4 -3
- package/src/shared/pending-proposals.ts +7 -4
- package/src/shared/redact-secret.ts +5 -5
- package/src/tenancy/__tests__/static-tenant-source.test.ts +177 -0
- package/src/tenancy/__tests__/tenant-host.test.ts +372 -0
- package/src/tenancy/__tests__/tenant-runtime.test.ts +221 -0
- package/src/tenancy/__tests__/tenant-secrets.test.ts +35 -0
- package/src/tenancy/index.ts +35 -0
- package/src/tenancy/static-tenant-source.ts +296 -0
- package/src/tenancy/tenant-host.ts +261 -0
- package/src/tenancy/tenant-runtime.ts +208 -0
- package/src/tenancy/tenant-secrets.ts +41 -0
- package/src/tenancy/tenant-source.contract.ts +59 -0
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
+
import {
|
|
3
|
+
DEFAULT_BRANCH,
|
|
4
|
+
joinBranchFor,
|
|
5
|
+
type AuthUser,
|
|
6
|
+
type ChangeRequest,
|
|
7
|
+
type IWorkflowService,
|
|
8
|
+
} from '@bevel-software/platform-shared';
|
|
9
|
+
import { type WorkspaceService } from '../../workspace/workspace.service.js';
|
|
10
|
+
import type { IAccessControl } from '../../access/access-control.interface.js';
|
|
11
|
+
import { folderTarget } from '../../access/access-requests.contract.js';
|
|
12
|
+
import { JoinRequestsService } from '../join-requests.service.js';
|
|
13
|
+
import { spliceGrant } from '../../access-model/access-splice.js';
|
|
14
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* A request ends when the person it names HOLDS what it asked for — however
|
|
18
|
+
* they came to hold it.
|
|
19
|
+
*
|
|
20
|
+
* The file diff alone cannot see that. Owner covers Can edit without putting
|
|
21
|
+
* a `write:` line anywhere; a role or a group carries access without naming
|
|
22
|
+
* anybody; a grant on a parent folder never touches this file at all. Each of
|
|
23
|
+
* those leaves the branch proposing something no editor can usefully accept,
|
|
24
|
+
* and the request sits open forever. These are the cases that asking the
|
|
25
|
+
* resolver instead settles — including for the two Library request kinds,
|
|
26
|
+
* which go through exactly this service.
|
|
27
|
+
*/
|
|
28
|
+
const ALI = 'ali@bevel.software';
|
|
29
|
+
const FOLDER = 'Plugins/GTM';
|
|
30
|
+
const ACCESS_MD = `${FOLDER}/access.md`;
|
|
31
|
+
const ACTOR: AuthUser = { id: 'u-1', email: 'olga@bevel.software', name: 'Olga Ivanova' };
|
|
32
|
+
const BRANCH = joinBranchFor(ALI, 'GTM');
|
|
33
|
+
|
|
34
|
+
const base = (body: string) => `---\nread:\n - everyone\n---\n${body}`;
|
|
35
|
+
const DEFAULT_MD = base('read:\n - GTM Team\n');
|
|
36
|
+
const ASKS_WRITE = base(`read:\n - GTM Team\nwrite:\n - Ali Baba <${ALI}>\n`);
|
|
37
|
+
const ASKS_FOR_A_ROLE = base('read:\n - GTM Team\n - role/Analysts\n');
|
|
38
|
+
|
|
39
|
+
function cr(over: Partial<ChangeRequest> = {}): ChangeRequest {
|
|
40
|
+
return {
|
|
41
|
+
number: 7,
|
|
42
|
+
title: 'Access request: GTM',
|
|
43
|
+
author: { login: 'user-abc' },
|
|
44
|
+
authorId: 'hash-ali',
|
|
45
|
+
appAuthor: { name: 'Ali Baba' },
|
|
46
|
+
branch: BRANCH,
|
|
47
|
+
base: DEFAULT_BRANCH,
|
|
48
|
+
state: 'open',
|
|
49
|
+
createdAt: '2026-01-01T00:00:00.000Z',
|
|
50
|
+
touchedNodePaths: [ACCESS_MD],
|
|
51
|
+
review: { approvals: 0, changesRequested: 0, pendingLogins: [] },
|
|
52
|
+
url: '/change-requests/7',
|
|
53
|
+
...over,
|
|
54
|
+
} as ChangeRequest;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function makeHarness(
|
|
58
|
+
branchMd: string | undefined,
|
|
59
|
+
holds: Partial<Record<'canRead' | 'canWrite' | 'canOwner' | 'canDownload', boolean>> = {},
|
|
60
|
+
/** Refs that only appear once a FORCED fetch has run — a branch just pushed. */
|
|
61
|
+
arrivesOnForcedFetch: string | undefined = undefined,
|
|
62
|
+
liveMd: string = DEFAULT_MD,
|
|
63
|
+
) {
|
|
64
|
+
const byRef: Record<string, string> = {
|
|
65
|
+
[`origin/${DEFAULT_BRANCH}`]: liveMd,
|
|
66
|
+
...(branchMd === undefined ? {} : { [`origin/${BRANCH}`]: branchMd }),
|
|
67
|
+
};
|
|
68
|
+
const fetches: { force: boolean }[] = [];
|
|
69
|
+
const workspaceService = {
|
|
70
|
+
ensureRemotesFetched: vi.fn(async (_ws: string, opts: { force?: boolean } = {}) => {
|
|
71
|
+
fetches.push({ force: !!opts.force });
|
|
72
|
+
if (opts.force && arrivesOnForcedFetch !== undefined) {
|
|
73
|
+
byRef[`origin/${BRANCH}`] = arrivesOnForcedFetch;
|
|
74
|
+
}
|
|
75
|
+
}),
|
|
76
|
+
readFileAtRef: vi.fn(async (_ws: string, ref: string, p: string) => {
|
|
77
|
+
if (p !== ACCESS_MD) return null;
|
|
78
|
+
const text = byRef[ref];
|
|
79
|
+
// A ref this clone has not heard of is not an empty file — it throws,
|
|
80
|
+
// exactly as `git show` does for an unknown ref.
|
|
81
|
+
if (text === undefined) throw new Error(`unknown revision ${ref}`);
|
|
82
|
+
return text;
|
|
83
|
+
}),
|
|
84
|
+
} as unknown as WorkspaceService;
|
|
85
|
+
const workflow = {
|
|
86
|
+
rejectChangeRequest: vi.fn(async () => ({ number: 7, state: 'closed' })),
|
|
87
|
+
deleteBranch: vi.fn(async () => undefined),
|
|
88
|
+
} as unknown as IWorkflowService;
|
|
89
|
+
const asked: { verb: string; path: string; email: string }[] = [];
|
|
90
|
+
const answer = (verb: 'canRead' | 'canWrite' | 'canOwner' | 'canDownload') =>
|
|
91
|
+
vi.fn(async (_ws: string, email: string, path: string) => {
|
|
92
|
+
asked.push({ verb, path, email });
|
|
93
|
+
return holds[verb] ?? false;
|
|
94
|
+
});
|
|
95
|
+
const accessControl = {
|
|
96
|
+
canRead: answer('canRead'),
|
|
97
|
+
canWrite: answer('canWrite'),
|
|
98
|
+
canOwner: answer('canOwner'),
|
|
99
|
+
canDownload: answer('canDownload'),
|
|
100
|
+
} as unknown as IAccessControl;
|
|
101
|
+
return {
|
|
102
|
+
svc: new JoinRequestsService(workspaceService, workflow, testKbContext(), accessControl),
|
|
103
|
+
workflow,
|
|
104
|
+
asked,
|
|
105
|
+
fetches,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
describe('a request settles once the person holds what it asked for', () => {
|
|
110
|
+
it('settles a write request when Owner already covers it', async () => {
|
|
111
|
+
// `canWrite` is the resolver's own question, and owner folds into write —
|
|
112
|
+
// so an owner grant made in the dialog retires the Can edit request.
|
|
113
|
+
const h = makeHarness(ASKS_WRITE, { canWrite: true });
|
|
114
|
+
await expect(h.svc.list('GTM', folderTarget(FOLDER), [cr()], ACTOR)).resolves.toEqual([]);
|
|
115
|
+
expect(h.workflow.rejectChangeRequest).toHaveBeenCalled();
|
|
116
|
+
expect(h.workflow.deleteBranch).toHaveBeenCalledWith(expect.anything(), BRANCH, ACTOR);
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
it('asks about the ITEM, not its rules file — a folder request is about the folder', async () => {
|
|
120
|
+
const h = makeHarness(ASKS_WRITE, { canWrite: true });
|
|
121
|
+
await h.svc.list('GTM', folderTarget(FOLDER), [cr()], ACTOR);
|
|
122
|
+
expect(h.asked).toContainEqual({ verb: 'canWrite', path: FOLDER, email: ALI });
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
it('settles through a role or group the person has since joined', async () => {
|
|
126
|
+
// Nothing in the file names Ali, yet the resolver says he writes here:
|
|
127
|
+
// that is a role, a group, or a grant on a parent folder.
|
|
128
|
+
const h = makeHarness(ASKS_WRITE, { canWrite: true });
|
|
129
|
+
await expect(h.svc.reconcile('GTM', folderTarget(FOLDER), cr(), ACTOR)).resolves.toBe(true);
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
it('leaves the request open while the person still holds nothing', async () => {
|
|
133
|
+
const h = makeHarness(ASKS_WRITE);
|
|
134
|
+
const out = await h.svc.list('GTM', folderTarget(FOLDER), [cr()], ACTOR);
|
|
135
|
+
expect(out).toHaveLength(1);
|
|
136
|
+
expect(out[0].proposals.map((p) => p.verb)).toEqual(['write']);
|
|
137
|
+
expect(h.workflow.rejectChangeRequest).not.toHaveBeenCalled();
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
it('keeps today\'s literal rule for a proposal naming a ROLE', async () => {
|
|
141
|
+
// "Does this role hold read here" is not a question the per-person
|
|
142
|
+
// resolver answers, so a role proposal is settled by the live rules
|
|
143
|
+
// carrying it — never by what some person happens to hold.
|
|
144
|
+
const h = makeHarness(ASKS_FOR_A_ROLE, { canRead: true, canWrite: true, canOwner: true });
|
|
145
|
+
const out = await h.svc.list('GTM', folderTarget(FOLDER), [cr()], ACTOR);
|
|
146
|
+
expect(out).toHaveLength(1);
|
|
147
|
+
expect(out[0].proposals.map((p) => p.label)).toEqual(['role/Analysts']);
|
|
148
|
+
expect(h.workflow.rejectChangeRequest).not.toHaveBeenCalled();
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
it('leaves the request open when the resolver cannot answer', async () => {
|
|
152
|
+
const h = makeHarness(ASKS_WRITE);
|
|
153
|
+
const svc = h.svc as unknown as { accessControl: { canWrite: () => Promise<boolean> } };
|
|
154
|
+
svc.accessControl.canWrite = () => Promise.reject(new Error('resolver down'));
|
|
155
|
+
const warn = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
156
|
+
const out = await h.svc.list('GTM', folderTarget(FOLDER), [cr()], ACTOR);
|
|
157
|
+
expect(out).toHaveLength(1);
|
|
158
|
+
expect(h.workflow.rejectChangeRequest).not.toHaveBeenCalled();
|
|
159
|
+
warn.mockRestore();
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
describe('a branch that cannot be read settles nothing', () => {
|
|
164
|
+
/**
|
|
165
|
+
* The failure this guards against, in full: these reads go through
|
|
166
|
+
* `origin/<branch>` in the DEFAULT branch's clone, and that clone's fetch is
|
|
167
|
+
* throttled. A request opened seconds ago names a ref the clone has not
|
|
168
|
+
* heard of. Read as "the branch proposes nothing" — which is what an empty
|
|
169
|
+
* diff against a missing file looks like — the request is CLOSED, by
|
|
170
|
+
* nobody, before any editor has seen it, and the person is told their
|
|
171
|
+
* request was not accepted.
|
|
172
|
+
*
|
|
173
|
+
* So: a miss is retried behind a forced fetch, and a miss that survives that
|
|
174
|
+
* leaves the request exactly where it was.
|
|
175
|
+
*/
|
|
176
|
+
|
|
177
|
+
it('retries behind a FORCED fetch before believing a branch says nothing', async () => {
|
|
178
|
+
// Present on origin, absent from this clone's refs until it fetches.
|
|
179
|
+
const h = makeHarness(undefined, {}, ASKS_WRITE);
|
|
180
|
+
const out = await h.svc.list('GTM', folderTarget(FOLDER), [cr()], ACTOR);
|
|
181
|
+
|
|
182
|
+
expect(h.fetches.some((f) => f.force)).toBe(true);
|
|
183
|
+
expect(out).toHaveLength(1);
|
|
184
|
+
expect(out[0].proposals.map((p) => p.verb)).toEqual(['write']);
|
|
185
|
+
expect(h.workflow.rejectChangeRequest).not.toHaveBeenCalled();
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
it('leaves the request open — and unclosed — when the branch still cannot be read', async () => {
|
|
189
|
+
const h = makeHarness(undefined);
|
|
190
|
+
await expect(h.svc.list('GTM', folderTarget(FOLDER), [cr()], ACTOR)).resolves.toEqual([]);
|
|
191
|
+
expect(h.workflow.rejectChangeRequest).not.toHaveBeenCalled();
|
|
192
|
+
expect(h.workflow.deleteBranch).not.toHaveBeenCalled();
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
it('reconcile refuses to settle one it could not read', async () => {
|
|
196
|
+
const h = makeHarness(undefined);
|
|
197
|
+
await expect(h.svc.reconcile('GTM', folderTarget(FOLDER), cr(), ACTOR)).resolves.toBe(false);
|
|
198
|
+
expect(h.workflow.rejectChangeRequest).not.toHaveBeenCalled();
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
it('still settles a branch it DID read that proposes nothing', async () => {
|
|
202
|
+
// The distinction has to cut both ways, or nothing would ever retire.
|
|
203
|
+
const h = makeHarness(DEFAULT_MD);
|
|
204
|
+
await expect(h.svc.reconcile('GTM', folderTarget(FOLDER), cr(), ACTOR)).resolves.toBe(true);
|
|
205
|
+
expect(h.workflow.rejectChangeRequest).toHaveBeenCalled();
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
describe('a person the rules explicitly deny', () => {
|
|
210
|
+
/**
|
|
211
|
+
* `ARTest5`-shaped rules: read granted, write DENIED, and the branch
|
|
212
|
+
* proposing the write anyway. The resolver says that person cannot write
|
|
213
|
+
* (verified against the real one), so their proposal is unmet and must
|
|
214
|
+
* survive to reach an editor — "Accept … includes a person the rules
|
|
215
|
+
* explicitly deny" is unreachable otherwise, and the requester is told a
|
|
216
|
+
* refusal nobody made.
|
|
217
|
+
*/
|
|
218
|
+
const DENIED_MD = base(`read:\n - Ali Baba <${ALI}>\nwrite:\n - deny Ali Baba <${ALI}>\n`);
|
|
219
|
+
const ASKS_DESPITE_DENY = base(
|
|
220
|
+
`read:\n - Ali Baba <${ALI}>\nwrite:\n - deny Ali Baba <${ALI}>\n - Ali Baba <${ALI}>\n`,
|
|
221
|
+
);
|
|
222
|
+
|
|
223
|
+
it('keeps their proposal, so an editor can still accept it', async () => {
|
|
224
|
+
// Live DENIES the write; the branch adds the grant beside the deny, which
|
|
225
|
+
// is exactly the text the dialog's own grant writes for this person.
|
|
226
|
+
const h = makeHarness(ASKS_DESPITE_DENY, { canRead: true, canWrite: false }, undefined, DENIED_MD);
|
|
227
|
+
const out = await h.svc.list('GTM', folderTarget(FOLDER), [cr()], ACTOR);
|
|
228
|
+
expect(out).toHaveLength(1);
|
|
229
|
+
expect(out[0].proposals.map((p) => p.verb)).toEqual(['write']);
|
|
230
|
+
expect(h.workflow.rejectChangeRequest).not.toHaveBeenCalled();
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
it('retires it once the grant has landed and the resolver says they write', async () => {
|
|
234
|
+
// What Accept does: a same-scope grant beats a same-scope deny, so the
|
|
235
|
+
// resolver then reports write and the request has nothing left to ask.
|
|
236
|
+
const h = makeHarness(ASKS_DESPITE_DENY, { canWrite: true }, undefined, DENIED_MD);
|
|
237
|
+
await expect(h.svc.reconcile('GTM', folderTarget(FOLDER), cr(), ACTOR)).resolves.toBe(true);
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
describe('a stale ref must not be mistaken for a finished request', () => {
|
|
242
|
+
/**
|
|
243
|
+
* The nastier half of the same hazard. Here the branch's ref RESOLVES — it
|
|
244
|
+
* is simply a few seconds behind, pointing at the commit before the
|
|
245
|
+
* proposal was pushed. That reads as a file identical to live, which is an
|
|
246
|
+
* empty diff, which looks exactly like a request whose grants have all
|
|
247
|
+
* landed. Nothing about it looks like a failure, and the request is closed.
|
|
248
|
+
*/
|
|
249
|
+
|
|
250
|
+
/** Stale: the branch answers with live's own text until a forced fetch. */
|
|
251
|
+
const staleHarness = () => makeHarness(DEFAULT_MD, {}, ASKS_WRITE);
|
|
252
|
+
|
|
253
|
+
it('does not settle a request whose proposal only shows after a fresh fetch', async () => {
|
|
254
|
+
const h = staleHarness();
|
|
255
|
+
const out = await h.svc.list('GTM', folderTarget(FOLDER), [cr()], ACTOR);
|
|
256
|
+
|
|
257
|
+
expect(h.workflow.rejectChangeRequest).not.toHaveBeenCalled();
|
|
258
|
+
expect(h.workflow.deleteBranch).not.toHaveBeenCalled();
|
|
259
|
+
// And having fetched, it reports the proposal rather than nothing.
|
|
260
|
+
expect(out).toHaveLength(1);
|
|
261
|
+
expect(out[0].proposals.map((p) => p.verb)).toEqual(['write']);
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
it('reconcile refuses to settle it either', async () => {
|
|
265
|
+
const h = staleHarness();
|
|
266
|
+
await expect(h.svc.reconcile('GTM', folderTarget(FOLDER), cr(), ACTOR)).resolves.toBe(false);
|
|
267
|
+
expect(h.workflow.rejectChangeRequest).not.toHaveBeenCalled();
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
it('confirms with a FORCED fetch before closing anything', async () => {
|
|
271
|
+
const h = makeHarness(DEFAULT_MD);
|
|
272
|
+
await h.svc.list('GTM', folderTarget(FOLDER), [cr()], ACTOR);
|
|
273
|
+
expect(h.fetches.some((f) => f.force)).toBe(true);
|
|
274
|
+
// Genuinely finished — the confirming read agrees, so it closes.
|
|
275
|
+
expect(h.workflow.rejectChangeRequest).toHaveBeenCalled();
|
|
276
|
+
});
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
describe('a request whose target is a FILE', () => {
|
|
280
|
+
/**
|
|
281
|
+
* The staging failure, at the level it happened. Every file-target request
|
|
282
|
+
* self-closed on the editors' FIRST listing: the listing answered
|
|
283
|
+
* `{"requests":[]}` and closed the change request in the same call, and the
|
|
284
|
+
* requester's status dropped to "none". Nobody had seen the line.
|
|
285
|
+
*
|
|
286
|
+
* A file's rules are its own frontmatter, and `spliceGrant` writes one grant
|
|
287
|
+
* there as a scalar — the same bytes the dialog's ordinary grant writes, and
|
|
288
|
+
* the resolver honours them. Read with the folder grammar it is a parse
|
|
289
|
+
* error, which yielded no grants, which reads as a finished request.
|
|
290
|
+
*
|
|
291
|
+
* So this exercises the real splice output against the real reader, with the
|
|
292
|
+
* target the request was actually made about.
|
|
293
|
+
*/
|
|
294
|
+
const FILE = 'Plugins/GTM/page.md';
|
|
295
|
+
const LIVE_FILE = '---\nnodeType: "[Note](../NodeTypes/Note.md)"\n---\n# Page\n\nbody\n';
|
|
296
|
+
const fileTarget = { path: FILE, kind: 'file' as const };
|
|
297
|
+
|
|
298
|
+
/** Exactly what the request opener writes onto the branch for a file. */
|
|
299
|
+
const asksWrite = spliceGrant(
|
|
300
|
+
LIVE_FILE,
|
|
301
|
+
'write',
|
|
302
|
+
{ kind: 'user', email: ALI, displayName: 'Ali Baba' },
|
|
303
|
+
{ allowScalar: true, target: 'node' },
|
|
304
|
+
).text;
|
|
305
|
+
|
|
306
|
+
/** The harness above is keyed on an access.md; this one answers for a file. */
|
|
307
|
+
function fileHarness(branchText: string, holds: Record<string, boolean> = {}) {
|
|
308
|
+
const byRef: Record<string, string> = {
|
|
309
|
+
[`origin/${DEFAULT_BRANCH}`]: LIVE_FILE,
|
|
310
|
+
[`origin/${BRANCH}`]: branchText,
|
|
311
|
+
};
|
|
312
|
+
const workspaceService = {
|
|
313
|
+
ensureRemotesFetched: vi.fn(async () => undefined),
|
|
314
|
+
readFileAtRef: vi.fn(async (_ws: string, ref: string, p: string) => {
|
|
315
|
+
if (p !== FILE) throw new Error(`unexpected path ${p}`);
|
|
316
|
+
const text = byRef[ref];
|
|
317
|
+
if (text === undefined) throw new Error(`unknown revision ${ref}`);
|
|
318
|
+
return text;
|
|
319
|
+
}),
|
|
320
|
+
} as unknown as WorkspaceService;
|
|
321
|
+
const workflow = {
|
|
322
|
+
rejectChangeRequest: vi.fn(async () => ({ number: 7, state: 'closed' })),
|
|
323
|
+
deleteBranch: vi.fn(async () => undefined),
|
|
324
|
+
} as unknown as IWorkflowService;
|
|
325
|
+
const answer = (verb: string) => vi.fn(async () => holds[verb] ?? false);
|
|
326
|
+
const accessControl = {
|
|
327
|
+
canRead: answer('canRead'),
|
|
328
|
+
canWrite: answer('canWrite'),
|
|
329
|
+
canOwner: answer('canOwner'),
|
|
330
|
+
canDownload: answer('canDownload'),
|
|
331
|
+
} as unknown as IAccessControl;
|
|
332
|
+
return {
|
|
333
|
+
svc: new JoinRequestsService(workspaceService, workflow, testKbContext(), accessControl),
|
|
334
|
+
workflow,
|
|
335
|
+
workspaceService,
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
it('reads the file\'s OWN frontmatter, so the request survives the first listing', async () => {
|
|
340
|
+
const h = fileHarness(asksWrite);
|
|
341
|
+
const out = await h.svc.list('GTM', fileTarget, [cr()], ACTOR);
|
|
342
|
+
|
|
343
|
+
expect(out).toHaveLength(1);
|
|
344
|
+
expect(out[0].proposals.map((p) => p.verb)).toEqual(['write']);
|
|
345
|
+
expect(h.workflow.rejectChangeRequest).not.toHaveBeenCalled();
|
|
346
|
+
expect(h.workflow.deleteBranch).not.toHaveBeenCalled();
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
it('reads the FILE itself, never an access.md beside it', async () => {
|
|
350
|
+
// A request on a file changes only that file's rules, so the only path it
|
|
351
|
+
// may read is the file. The harness throws on anything else.
|
|
352
|
+
const h = fileHarness(asksWrite);
|
|
353
|
+
await h.svc.list('GTM', fileTarget, [cr()], ACTOR);
|
|
354
|
+
const paths = (h.workspaceService.readFileAtRef as ReturnType<typeof vi.fn>).mock.calls.map(
|
|
355
|
+
(c) => c[2],
|
|
356
|
+
);
|
|
357
|
+
expect(new Set(paths)).toEqual(new Set([FILE]));
|
|
358
|
+
});
|
|
359
|
+
|
|
360
|
+
it('retires it once the person holds the level on the file', async () => {
|
|
361
|
+
const h = fileHarness(asksWrite, { canWrite: true });
|
|
362
|
+
await expect(h.svc.reconcile('GTM', fileTarget, cr(), ACTOR)).resolves.toBe(true);
|
|
363
|
+
});
|
|
364
|
+
|
|
365
|
+
it('retires it once the grant has landed on live', async () => {
|
|
366
|
+
const h = fileHarness(asksWrite);
|
|
367
|
+
const byRef = h.workspaceService.readFileAtRef as ReturnType<typeof vi.fn>;
|
|
368
|
+
byRef.mockImplementation(async () => asksWrite); // both refs carry it now
|
|
369
|
+
await expect(h.svc.reconcile('GTM', fileTarget, cr(), ACTOR)).resolves.toBe(true);
|
|
370
|
+
});
|
|
371
|
+
});
|
|
@@ -12,6 +12,7 @@ import { KbPluginSource } from '../discovery/kb-plugin-source.js';
|
|
|
12
12
|
import { PluginProvisionService } from '../plugin-provision.service.js';
|
|
13
13
|
import { createPluginCreationRoutes } from '../plugins.routes.js';
|
|
14
14
|
import { CREATE_PLUGIN } from '../plugins.tools.js';
|
|
15
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
15
16
|
|
|
16
17
|
/**
|
|
17
18
|
* Both doors into plugin creation, through the code each one really runs.
|
|
@@ -72,9 +73,9 @@ async function makeHarness(): Promise<Harness> {
|
|
|
72
73
|
workspaceService,
|
|
73
74
|
{ runPendingCommit: vi.fn(async () => undefined) },
|
|
74
75
|
{ invalidate: vi.fn() } as unknown as IAccessControl,
|
|
75
|
-
KB,
|
|
76
|
+
testKbContext({ kbDirName: KB }),
|
|
76
77
|
undefined,
|
|
77
|
-
new KbPluginSource(new NodeFs()),
|
|
78
|
+
new KbPluginSource(new NodeFs(), testKbContext({ kbDirName: KB })),
|
|
78
79
|
new NodeFs(),
|
|
79
80
|
);
|
|
80
81
|
|
|
@@ -185,7 +186,7 @@ describe('creation derives and stores the display name the same way through ever
|
|
|
185
186
|
await h.byTool('design');
|
|
186
187
|
// `access.md` is what makes a folder exist to discovery; provisioning
|
|
187
188
|
// wrote it, so the catalog sees both plugins.
|
|
188
|
-
const { plugins } = await new KbPluginSource(new NodeFs()).discover(path.join(h.dir, KB));
|
|
189
|
+
const { plugins } = await new KbPluginSource(new NodeFs(), testKbContext({ kbDirName: KB })).discover(path.join(h.dir, KB));
|
|
189
190
|
// Walk order, which is the folders' — `design` before `Sales Team`.
|
|
190
191
|
expect(plugins.map((p) => [p.name, p.displayName])).toEqual([
|
|
191
192
|
['design', 'design'],
|
|
@@ -12,9 +12,11 @@ import type { WorkspaceService } from '../../workspace/workspace.service.js';
|
|
|
12
12
|
import type { IAccessControl } from '../../access/access-control.interface.js';
|
|
13
13
|
import type { ISkillService, SkillSummary } from '../../skills/skills.contract.js';
|
|
14
14
|
import type { IToolManualService, ToolManualSummary } from '../../tool-manuals/tool-manuals.contract.js';
|
|
15
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
15
16
|
|
|
16
17
|
const KB_DIR = 'knowledge-base';
|
|
17
18
|
const wsId = workspaceIdForBranch(DEFAULT_BRANCH);
|
|
19
|
+
const kbContext = testKbContext({ kbDirName: KB_DIR });
|
|
18
20
|
|
|
19
21
|
const OLGA = { name: 'Olga Ivanova', email: 'olga@bevel.software' };
|
|
20
22
|
|
|
@@ -70,8 +72,8 @@ describe('PluginIndexService', () => {
|
|
|
70
72
|
opts.access ?? principals,
|
|
71
73
|
skillService(opts.skills),
|
|
72
74
|
toolService(opts.tools),
|
|
73
|
-
|
|
74
|
-
new KbPluginSource(new NodeFs()),
|
|
75
|
+
kbContext,
|
|
76
|
+
new KbPluginSource(new NodeFs(), kbContext),
|
|
75
77
|
Date.now,
|
|
76
78
|
opts.links,
|
|
77
79
|
);
|
|
@@ -261,8 +263,8 @@ describe('PluginIndexService', () => {
|
|
|
261
263
|
principals,
|
|
262
264
|
skillService(skills('Skills/Eng/deploy', 'Skills/Eng/rollback', 'Plugins/Product/roadmap')),
|
|
263
265
|
toolService(),
|
|
264
|
-
|
|
265
|
-
new KbPluginSource(new NodeFs()),
|
|
266
|
+
kbContext,
|
|
267
|
+
new KbPluginSource(new NodeFs(), kbContext),
|
|
266
268
|
Date.now,
|
|
267
269
|
links,
|
|
268
270
|
).catalog();
|