@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
|
@@ -38,8 +38,6 @@ import type { IFsProbe } from '../../shared/fs.contract.js';
|
|
|
38
38
|
import type { Discovery, PluginSource } from './discovery/plugin-source.js';
|
|
39
39
|
|
|
40
40
|
import {
|
|
41
|
-
DEFAULT_BRANCH,
|
|
42
|
-
PLUGINS_DIR,
|
|
43
41
|
PLUGIN_MANIFEST_FILE,
|
|
44
42
|
PLUGIN_SKILLS_DIR,
|
|
45
43
|
pluginDisplayNameOf,
|
|
@@ -52,6 +50,7 @@ import {
|
|
|
52
50
|
validateFilename,
|
|
53
51
|
type AuthUser,
|
|
54
52
|
} from '@bevel-software/platform-shared';
|
|
53
|
+
import type { KbContext } from '../../shared/kb-context.js';
|
|
55
54
|
import type { WorkspaceService } from '../workspace/workspace.service.js';
|
|
56
55
|
import type { IAccessControl } from '../access/access-control.interface.js';
|
|
57
56
|
import { creatorPrincipal } from '../access-model/creator.js';
|
|
@@ -65,7 +64,8 @@ export interface ProvisionCommitDriver {
|
|
|
65
64
|
branch: string,
|
|
66
65
|
targetPath: string,
|
|
67
66
|
user: AuthUser,
|
|
68
|
-
|
|
67
|
+
/** `summary` overrides the path-derived commit subject — see `GitService.commitFile`. */
|
|
68
|
+
opts?: { systemAuthorized?: boolean; summary?: string },
|
|
69
69
|
): Promise<void>;
|
|
70
70
|
}
|
|
71
71
|
|
|
@@ -129,8 +129,14 @@ export class PluginProvisionError extends Error {
|
|
|
129
129
|
}
|
|
130
130
|
|
|
131
131
|
/** The one shape every provisioning answer has: the folder in both spellings, and where its skills go. */
|
|
132
|
-
function provisioned(
|
|
133
|
-
|
|
132
|
+
function provisioned(
|
|
133
|
+
pluginsDir: string,
|
|
134
|
+
folder: string,
|
|
135
|
+
name: string,
|
|
136
|
+
displayName: string,
|
|
137
|
+
created: boolean,
|
|
138
|
+
): ProvisionedPlugin {
|
|
139
|
+
const path = `${pluginsDir}/${folder}`;
|
|
134
140
|
return { folder, path, skillsDir: `${path}/${PLUGIN_SKILLS_DIR}`, name, displayName, created };
|
|
135
141
|
}
|
|
136
142
|
|
|
@@ -149,13 +155,22 @@ export class PluginProvisionService {
|
|
|
149
155
|
private readonly workspaceService: WorkspaceService,
|
|
150
156
|
private readonly commits: ProvisionCommitDriver,
|
|
151
157
|
private readonly accessControl: IAccessControl,
|
|
152
|
-
private readonly
|
|
158
|
+
private readonly kb: KbContext,
|
|
153
159
|
private readonly events: { emit(event: { kind: 'fs-tree-changed'; workspaceId: string; branch: string }): void } | undefined,
|
|
154
160
|
/** Which names are TAKEN is discovery's answer — the same one every catalog gets. */
|
|
155
161
|
private readonly source: PluginSource,
|
|
156
162
|
private readonly disk: IFsProbe,
|
|
157
163
|
) {}
|
|
158
164
|
|
|
165
|
+
private get kbDirName(): string {
|
|
166
|
+
return this.kb.kbDirName;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/** The plugins root's name, read per use: a deployment may rename it from the setup screen. */
|
|
170
|
+
private get pluginsRoot(): string {
|
|
171
|
+
return this.kb.layout.pluginsDir;
|
|
172
|
+
}
|
|
173
|
+
|
|
159
174
|
/**
|
|
160
175
|
* Create `Plugins/<name>/` — or `Plugins/<parent>/<name>/` — for `user`.
|
|
161
176
|
* Throws `PluginProvisionError` 422 on a name the filesystem or the model
|
|
@@ -226,7 +241,7 @@ export class PluginProvisionService {
|
|
|
226
241
|
// `name` is the creator's own spelling, trimmed — the folder's leaf AND
|
|
227
242
|
// the display name persisted for it, whether or not it equals either.
|
|
228
243
|
await this.provision(user, folder, name, pluginAccessMd(user));
|
|
229
|
-
return provisioned(folder, pluginManifestName(name), name, true);
|
|
244
|
+
return provisioned(this.pluginsRoot, folder, pluginManifestName(name), name, true);
|
|
230
245
|
});
|
|
231
246
|
}
|
|
232
247
|
|
|
@@ -246,7 +261,7 @@ export class PluginProvisionService {
|
|
|
246
261
|
if (segments.some((s) => validateFilename(s) !== null || s.startsWith('.'))) {
|
|
247
262
|
throw new PluginProvisionError(`"${rawParent}" is not a folder name the knowledge base can carry.`, 422);
|
|
248
263
|
}
|
|
249
|
-
const rel = `${
|
|
264
|
+
const rel = `${this.pluginsRoot}/${rawParent}`;
|
|
250
265
|
// The personal namespace is the FIRST segment below the root — the same
|
|
251
266
|
// structural rule as `isPersonalPluginDir`, applied to the parent and
|
|
252
267
|
// everything under it. A `personal-*` folder there is a personal space
|
|
@@ -257,8 +272,8 @@ export class PluginProvisionService {
|
|
|
257
272
|
}
|
|
258
273
|
const wsId = await this.readyWorkspaceId();
|
|
259
274
|
const wsDir = await this.workspaceService.getWorkspacePath(wsId);
|
|
260
|
-
if (!(await this.exactFolderExists(path.join(wsDir, this.kbDirName,
|
|
261
|
-
throw new PluginProvisionError(`There is no folder "${rawParent}" under ${
|
|
275
|
+
if (!(await this.exactFolderExists(path.join(wsDir, this.kbDirName, this.pluginsRoot), segments))) {
|
|
276
|
+
throw new PluginProvisionError(`There is no folder "${rawParent}" under ${this.pluginsRoot}/.`, 404);
|
|
262
277
|
}
|
|
263
278
|
// Judged against every folder discovery CLAIMS, not only the plugins it
|
|
264
279
|
// lists: a twin skipped for its slug still owns its subtree, and a
|
|
@@ -287,7 +302,13 @@ export class PluginProvisionService {
|
|
|
287
302
|
return this.creations.run(`plugin:${pluginManifestName(folder)}`, async () => {
|
|
288
303
|
const existing = await this.existingFolder(folder);
|
|
289
304
|
if (existing !== null) {
|
|
290
|
-
return provisioned(
|
|
305
|
+
return provisioned(
|
|
306
|
+
this.pluginsRoot,
|
|
307
|
+
folder,
|
|
308
|
+
pluginManifestName(folder),
|
|
309
|
+
await this.persistedDisplayName(existing, folder),
|
|
310
|
+
false,
|
|
311
|
+
);
|
|
291
312
|
}
|
|
292
313
|
try {
|
|
293
314
|
await this.provision(user, folder, folder, personalAccessMd(user));
|
|
@@ -296,11 +317,17 @@ export class PluginProvisionService {
|
|
|
296
317
|
// process, a checkout that appeared between check and write): the
|
|
297
318
|
// folder existing is this method's success case, never its error.
|
|
298
319
|
if (err instanceof PluginProvisionError && err.status === 409) {
|
|
299
|
-
return provisioned(
|
|
320
|
+
return provisioned(
|
|
321
|
+
this.pluginsRoot,
|
|
322
|
+
folder,
|
|
323
|
+
pluginManifestName(folder),
|
|
324
|
+
await this.persistedDisplayName(folder, folder),
|
|
325
|
+
false,
|
|
326
|
+
);
|
|
300
327
|
}
|
|
301
328
|
throw err;
|
|
302
329
|
}
|
|
303
|
-
return provisioned(folder, pluginManifestName(folder), folder, true);
|
|
330
|
+
return provisioned(this.pluginsRoot, folder, pluginManifestName(folder), folder, true);
|
|
304
331
|
});
|
|
305
332
|
}
|
|
306
333
|
|
|
@@ -343,14 +370,14 @@ export class PluginProvisionService {
|
|
|
343
370
|
if (!name || segments.some((s) => validateFilename(s) !== null || s.startsWith('.'))) {
|
|
344
371
|
throw new PluginProvisionError('A plugin needs a name.', 422);
|
|
345
372
|
}
|
|
346
|
-
if (isPersonalPluginDir(`${
|
|
373
|
+
if (isPersonalPluginDir(`${this.pluginsRoot}/${name}`, this.kb.layout)) {
|
|
347
374
|
// Personal folders are not plugins (the catalog never lists them), and
|
|
348
375
|
// nobody deletes somebody's private shelf through the plugin door.
|
|
349
376
|
throw new PluginProvisionError('Unknown plugin', 404);
|
|
350
377
|
}
|
|
351
378
|
const wsId = await this.readyWorkspaceId();
|
|
352
379
|
const wsDir = await this.workspaceService.getWorkspacePath(wsId);
|
|
353
|
-
const pluginsDir = path.join(wsDir, this.kbDirName,
|
|
380
|
+
const pluginsDir = path.join(wsDir, this.kbDirName, this.pluginsRoot);
|
|
354
381
|
const folderDir = path.join(pluginsDir, ...segments);
|
|
355
382
|
// Locked on the plugin's IDENTITY — the same key a creation of that name
|
|
356
383
|
// takes — not on a slug of the folder path, which for a nested plugin is a
|
|
@@ -361,7 +388,7 @@ export class PluginProvisionService {
|
|
|
361
388
|
// discovery refuses, as it does for creation. A folder discovery does not
|
|
362
389
|
// list (no manifest at all) locks on its own slug — nothing else can
|
|
363
390
|
// claim that identity either.
|
|
364
|
-
const identity = await this.discoveredIdentity(`${
|
|
391
|
+
const identity = await this.discoveredIdentity(`${this.pluginsRoot}/${name}`, segments[segments.length - 1]!);
|
|
365
392
|
return this.creations.run(`plugin:${identity}`, async () => {
|
|
366
393
|
// Exact spelling of EVERY component — the catalog hands the route the
|
|
367
394
|
// on-disk spelling, so a mismatch means the plugin is gone (or was
|
|
@@ -392,8 +419,8 @@ export class PluginProvisionService {
|
|
|
392
419
|
// deletion under it: one commit, one removed plugin.
|
|
393
420
|
await this.commits.runPendingCommit(
|
|
394
421
|
wsId,
|
|
395
|
-
|
|
396
|
-
`${this.kbDirName}/${
|
|
422
|
+
this.kb.defaultBranch,
|
|
423
|
+
`${this.kbDirName}/${this.pluginsRoot}/${name}`,
|
|
397
424
|
user,
|
|
398
425
|
{ systemAuthorized: true },
|
|
399
426
|
);
|
|
@@ -411,7 +438,7 @@ export class PluginProvisionService {
|
|
|
411
438
|
// The folder's rules left the access model — drop the resolver cache
|
|
412
439
|
// so the very next check runs against a tree without them.
|
|
413
440
|
this.accessControl.invalidate(wsId);
|
|
414
|
-
this.events?.emit({ kind: 'fs-tree-changed', workspaceId: wsId, branch:
|
|
441
|
+
this.events?.emit({ kind: 'fs-tree-changed', workspaceId: wsId, branch: this.kb.defaultBranch });
|
|
415
442
|
});
|
|
416
443
|
}
|
|
417
444
|
|
|
@@ -422,7 +449,7 @@ export class PluginProvisionService {
|
|
|
422
449
|
*/
|
|
423
450
|
private async exactFolderExists(root: string, segments: string[]): Promise<boolean> {
|
|
424
451
|
let dir = root;
|
|
425
|
-
let rel =
|
|
452
|
+
let rel = this.pluginsRoot;
|
|
426
453
|
for (const segment of segments) {
|
|
427
454
|
const entries = await listDirOrIncomplete(this.disk, dir, rel);
|
|
428
455
|
if (!entries?.some((e) => e.isDirectory() && e.name === segment)) return false;
|
|
@@ -439,7 +466,7 @@ export class PluginProvisionService {
|
|
|
439
466
|
private async existingFolder(name: string, parent = ''): Promise<string | null> {
|
|
440
467
|
const wsId = await this.readyWorkspaceId();
|
|
441
468
|
const wsDir = await this.workspaceService.getWorkspacePath(wsId);
|
|
442
|
-
const rel = parent ? `${
|
|
469
|
+
const rel = parent ? `${this.pluginsRoot}/${parent}` : this.pluginsRoot;
|
|
443
470
|
// No Plugins/ root yet — nothing can collide.
|
|
444
471
|
const children = await listDirOrIncomplete(this.disk, path.join(wsDir, this.kbDirName, rel), rel);
|
|
445
472
|
if (!children) return null;
|
|
@@ -461,7 +488,7 @@ export class PluginProvisionService {
|
|
|
461
488
|
const wsId = await this.readyWorkspaceId();
|
|
462
489
|
const wsDir = await this.workspaceService.getWorkspacePath(wsId);
|
|
463
490
|
const manifest = await this.disk.readJsonObject(
|
|
464
|
-
path.join(wsDir, this.kbDirName,
|
|
491
|
+
path.join(wsDir, this.kbDirName, this.pluginsRoot, ...folder.split('/'), PLUGIN_MANIFEST_FILE),
|
|
465
492
|
);
|
|
466
493
|
return pluginDisplayNameOf(manifest) || fallback;
|
|
467
494
|
}
|
|
@@ -518,7 +545,7 @@ export class PluginProvisionService {
|
|
|
518
545
|
*/
|
|
519
546
|
private async provision(user: AuthUser, folder: string, leaf: string, accessMd: string): Promise<void> {
|
|
520
547
|
const wsId = await this.readyWorkspaceId();
|
|
521
|
-
const folderPath = `${this.kbDirName}/${
|
|
548
|
+
const folderPath = `${this.kbDirName}/${this.pluginsRoot}/${folder}`;
|
|
522
549
|
const wsRelPath = `${folderPath}/access.md`;
|
|
523
550
|
try {
|
|
524
551
|
// Exclusive create — the fs is the arbiter of a same-name race, not
|
|
@@ -557,7 +584,7 @@ export class PluginProvisionService {
|
|
|
557
584
|
// rule this endpoint exists to carve through. The endpoint has already
|
|
558
585
|
// authorized the write (any signed-in user, unused name, exclusive
|
|
559
586
|
// create), so the per-user gate is skipped for exactly this commit.
|
|
560
|
-
await this.commits.runPendingCommit(wsId,
|
|
587
|
+
await this.commits.runPendingCommit(wsId, this.kb.defaultBranch, folderPath, user, {
|
|
561
588
|
systemAuthorized: true,
|
|
562
589
|
});
|
|
563
590
|
} catch (err) {
|
|
@@ -568,7 +595,7 @@ export class PluginProvisionService {
|
|
|
568
595
|
// so a concurrent writer's bytes can't be collateral.
|
|
569
596
|
try {
|
|
570
597
|
const wsDir = await this.workspaceService.getWorkspacePath(wsId);
|
|
571
|
-
const folderDir = path.join(wsDir, this.kbDirName,
|
|
598
|
+
const folderDir = path.join(wsDir, this.kbDirName, this.pluginsRoot, folder);
|
|
572
599
|
await fs.rm(path.join(folderDir, 'access.md'), { force: true });
|
|
573
600
|
await fs.rm(path.join(folderDir, PLUGIN_MANIFEST_FILE), { force: true });
|
|
574
601
|
await fs.rmdir(folderDir).catch(() => {});
|
|
@@ -580,11 +607,11 @@ export class PluginProvisionService {
|
|
|
580
607
|
// The folder's rules changed the access model — drop the resolver cache
|
|
581
608
|
// so the very next check (the creator's first skill write) sees them.
|
|
582
609
|
this.accessControl.invalidate(wsId);
|
|
583
|
-
this.events?.emit({ kind: 'fs-tree-changed', workspaceId: wsId, branch:
|
|
610
|
+
this.events?.emit({ kind: 'fs-tree-changed', workspaceId: wsId, branch: this.kb.defaultBranch });
|
|
584
611
|
}
|
|
585
612
|
|
|
586
613
|
private async readyWorkspaceId(): Promise<string> {
|
|
587
|
-
const ws = await this.workspaceService.getOrCreateForBranch(
|
|
614
|
+
const ws = await this.workspaceService.getOrCreateForBranch(this.kb.defaultBranch);
|
|
588
615
|
return ws.id;
|
|
589
616
|
}
|
|
590
617
|
}
|
|
@@ -18,8 +18,8 @@ import {
|
|
|
18
18
|
parsePluginPrincipalKey,
|
|
19
19
|
} from '../access-model/access-grammar.js';
|
|
20
20
|
import type { WorkspaceService } from '../workspace/workspace.service.js';
|
|
21
|
+
import type { KbContext } from '../../shared/kb-context.js';
|
|
21
22
|
import type { PluginSource } from './discovery/plugin-source.js';
|
|
22
|
-
import { linksWorkspaceId } from './plugin-links.js';
|
|
23
23
|
|
|
24
24
|
export class PluginRenameError extends Error {
|
|
25
25
|
constructor(
|
|
@@ -70,15 +70,19 @@ export class PluginRenameService {
|
|
|
70
70
|
private readonly accessControl: IAccessControl,
|
|
71
71
|
private readonly source: PluginSource,
|
|
72
72
|
private readonly disk: ITreeWalker,
|
|
73
|
-
private readonly
|
|
73
|
+
private readonly kb: KbContext,
|
|
74
74
|
private readonly events?: {
|
|
75
75
|
emit(event: { kind: 'fs-tree-changed'; workspaceId: string; branch: string }): void;
|
|
76
76
|
},
|
|
77
77
|
private readonly onChanged?: () => void,
|
|
78
78
|
) {}
|
|
79
79
|
|
|
80
|
+
private get kbDirName(): string {
|
|
81
|
+
return this.kb.kbDirName;
|
|
82
|
+
}
|
|
83
|
+
|
|
80
84
|
private noteChanged(wsId: string): void {
|
|
81
|
-
noteChangedFor(this.accessControl, this.events, this.onChanged, wsId);
|
|
85
|
+
noteChangedFor(this.accessControl, this.events, this.onChanged, wsId, this.kb.defaultBranch);
|
|
82
86
|
}
|
|
83
87
|
|
|
84
88
|
/** The READ phase must have seen everything it needed; a hole refuses the rename before any write. */
|
|
@@ -96,7 +100,7 @@ export class PluginRenameService {
|
|
|
96
100
|
current: string,
|
|
97
101
|
patch: { name?: unknown; displayName?: unknown },
|
|
98
102
|
): Promise<RenameResult> {
|
|
99
|
-
const wsId =
|
|
103
|
+
const wsId = this.kb.defaultWorkspaceId();
|
|
100
104
|
const kbRoot = path.join(await this.workspaceService.getWorkspacePath(wsId), this.kbDirName);
|
|
101
105
|
// ONE walk of the checkout for everything the rename needs to know:
|
|
102
106
|
// the plugins (discovery's listener) and every file that can carry a
|
|
@@ -277,9 +281,10 @@ function noteChangedFor(
|
|
|
277
281
|
events: PluginRenameService['events'],
|
|
278
282
|
onChanged: (() => void) | undefined,
|
|
279
283
|
wsId: string,
|
|
284
|
+
branch: string,
|
|
280
285
|
): void {
|
|
281
286
|
accessControl.invalidate(wsId);
|
|
282
|
-
events?.emit({ kind: 'fs-tree-changed', workspaceId: wsId, branch
|
|
287
|
+
events?.emit({ kind: 'fs-tree-changed', workspaceId: wsId, branch });
|
|
283
288
|
onChanged?.();
|
|
284
289
|
}
|
|
285
290
|
|
|
@@ -303,8 +308,3 @@ export function renamePluginPrincipalInText(text: string, oldName: string, nextN
|
|
|
303
308
|
})
|
|
304
309
|
.join('\n');
|
|
305
310
|
}
|
|
306
|
-
|
|
307
|
-
function linksWorkspaceIdBranch(): string {
|
|
308
|
-
// The default branch's workspace id IS its encoded branch name.
|
|
309
|
-
return decodeURIComponent(linksWorkspaceId());
|
|
310
|
-
}
|
|
@@ -13,11 +13,13 @@ import {
|
|
|
13
13
|
import type { IAccessControl } from '../access/access-control.interface.js';
|
|
14
14
|
import { WorkflowDomainError } from '../../shared/domain-errors.js';
|
|
15
15
|
import { domainErrorBody } from '../../shared/http-errors.js';
|
|
16
|
-
import {
|
|
16
|
+
import { pluginFolderBelowRoot } from './plugins.service.js';
|
|
17
|
+
import type { KbContext } from '../../shared/kb-context.js';
|
|
17
18
|
import { PluginProvisionError, type PluginProvisionService } from './plugin-provision.service.js';
|
|
18
19
|
import { PluginLinkError, type PluginLinksService } from './plugin-links.service.js';
|
|
19
20
|
import { PluginRenameError, type PluginRenameService } from './plugin-rename.service.js';
|
|
20
21
|
import type { JoinRequestsService } from './join-requests.service.js';
|
|
22
|
+
import { folderTarget } from '../access/access-requests.contract.js';
|
|
21
23
|
import type { PluginJoinRequestJobs } from './join-request-jobs.service.js';
|
|
22
24
|
import type { JoinRequestRecord } from './join-request-records.store.js';
|
|
23
25
|
import type {
|
|
@@ -159,6 +161,8 @@ export function createPluginsRoutes(
|
|
|
159
161
|
joinRequestJobs: PluginJoinRequestJobs,
|
|
160
162
|
provision: PluginProvisionService,
|
|
161
163
|
resolveUser: (req: express.Request) => Promise<AuthUser | null>,
|
|
164
|
+
/** The released branch's clone — every verdict here is read from it. */
|
|
165
|
+
kb: Pick<KbContext, 'defaultWorkspaceId'>,
|
|
162
166
|
/** Optional: a host without the link machinery simply has no link routes. */
|
|
163
167
|
links?: PluginLinksService,
|
|
164
168
|
/** Optional: a host without it has no rename route. */
|
|
@@ -209,11 +213,30 @@ export function createPluginsRoutes(
|
|
|
209
213
|
* POST /api/plugins/:name/links { skillPath } → { root, skills }
|
|
210
214
|
* DELETE /api/plugins/:name/links?skillPath= → { root, revoked }
|
|
211
215
|
* POST /api/plugins/:name/links/repair { skillPath } → { root }
|
|
216
|
+
* POST /api/plugins/:name/links/repair-all → { repaired, skipped }
|
|
212
217
|
*
|
|
213
218
|
* Refusals carry a `kind` the UI branches on — `needs-skill-write` (409) is
|
|
214
219
|
* the one that becomes "request write access".
|
|
220
|
+
*
|
|
221
|
+
* `repair-all` is the plugin PAGE's: it repairs every link of the plugin the
|
|
222
|
+
* caller can, and reports what it could not. A caller who may not write the
|
|
223
|
+
* plugin gets the same 404 every other link route gives them, so probing it
|
|
224
|
+
* confirms nothing about a plugin they cannot see.
|
|
215
225
|
*/
|
|
216
226
|
if (links) {
|
|
227
|
+
/** The one refusal mapping every link route answers with. */
|
|
228
|
+
const linkFailure = (res: express.Response, err: unknown) => {
|
|
229
|
+
if (err instanceof PluginLinkError) {
|
|
230
|
+
res.status(err.status).json({ error: err.message, ...err.payload });
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
if (err instanceof WorkflowDomainError) {
|
|
234
|
+
res.status(err.status).json(domainErrorBody(err));
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
log.error('link operation failed:', { err });
|
|
238
|
+
res.status(500).json({ error: 'Failed to update the plugin\'s links' });
|
|
239
|
+
};
|
|
217
240
|
const linkOp = async (
|
|
218
241
|
req: express.Request,
|
|
219
242
|
res: express.Response,
|
|
@@ -237,16 +260,7 @@ export function createPluginsRoutes(
|
|
|
237
260
|
try {
|
|
238
261
|
res.json(await op(user, String(req.params.name), skillPath));
|
|
239
262
|
} catch (err) {
|
|
240
|
-
|
|
241
|
-
res.status(err.status).json({ error: err.message, ...err.payload });
|
|
242
|
-
return;
|
|
243
|
-
}
|
|
244
|
-
if (err instanceof WorkflowDomainError) {
|
|
245
|
-
res.status(err.status).json(domainErrorBody(err));
|
|
246
|
-
return;
|
|
247
|
-
}
|
|
248
|
-
log.error('link operation failed:', { err });
|
|
249
|
-
res.status(500).json({ error: 'Failed to update the plugin\'s links' });
|
|
263
|
+
linkFailure(res, err);
|
|
250
264
|
}
|
|
251
265
|
};
|
|
252
266
|
const bodyPath = (req: express.Request) => ((req.body ?? {}) as { skillPath?: unknown }).skillPath;
|
|
@@ -254,6 +268,23 @@ export function createPluginsRoutes(
|
|
|
254
268
|
router.post('/plugins/:name/links/repair', (req, res) =>
|
|
255
269
|
linkOp(req, res, (u, p, s) => links.repair(u, p, s), bodyPath),
|
|
256
270
|
);
|
|
271
|
+
// No `skillPath`: this one is about the plugin, so it cannot ride `linkOp`.
|
|
272
|
+
router.post('/plugins/:name/links/repair-all', async (req, res) => {
|
|
273
|
+
if (!req.userEmail) {
|
|
274
|
+
res.status(401).json({ error: 'Unauthenticated' });
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
const user = await resolveUser(req);
|
|
278
|
+
if (!user) {
|
|
279
|
+
res.status(401).json({ error: 'Unauthenticated' });
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
try {
|
|
283
|
+
res.json(await links.repairAll(user, String(req.params.name)));
|
|
284
|
+
} catch (err) {
|
|
285
|
+
linkFailure(res, err);
|
|
286
|
+
}
|
|
287
|
+
});
|
|
257
288
|
router.delete('/plugins/:name/links', (req, res) =>
|
|
258
289
|
linkOp(req, res, (u, p, s) => links.unlink(u, p, s), (r) => r.query.skillPath),
|
|
259
290
|
);
|
|
@@ -296,7 +327,7 @@ export function createPluginsRoutes(
|
|
|
296
327
|
res.json({ plugins: [] });
|
|
297
328
|
return;
|
|
298
329
|
}
|
|
299
|
-
const wsId =
|
|
330
|
+
const wsId = kb.defaultWorkspaceId();
|
|
300
331
|
const probes = probesFor(catalog);
|
|
301
332
|
const [readable, writable, owned] = await Promise.all([
|
|
302
333
|
accessControl.canReadBatch(wsId, email, probes),
|
|
@@ -453,7 +484,7 @@ export function createPluginsRoutes(
|
|
|
453
484
|
}
|
|
454
485
|
// By identity — the manifest name the catalog keys on.
|
|
455
486
|
const plugin = (await pluginIndex.catalog()).find((g) => g.name === req.params.name);
|
|
456
|
-
const wsId =
|
|
487
|
+
const wsId = kb.defaultWorkspaceId();
|
|
457
488
|
const ownerVerdicts = plugin
|
|
458
489
|
? await Promise.all(
|
|
459
490
|
plugin.folders.map((f) => accessControl.canOwner(wsId, email, memberProbe(f))),
|
|
@@ -494,7 +525,7 @@ export function createPluginsRoutes(
|
|
|
494
525
|
const catalog = await pluginIndex.catalog();
|
|
495
526
|
// By identity — the manifest name the catalog keys on.
|
|
496
527
|
const plugin = catalog.find((g) => g.name === req.params.name);
|
|
497
|
-
const wsId =
|
|
528
|
+
const wsId = kb.defaultWorkspaceId();
|
|
498
529
|
// Same ANY-folder shape `GET /plugins` resolves with, so a plugin can
|
|
499
530
|
// never be listed as discoverable there and rejected as unknown here.
|
|
500
531
|
const verdicts = plugin
|
|
@@ -567,7 +598,7 @@ export function createPluginsRoutes(
|
|
|
567
598
|
return null;
|
|
568
599
|
}
|
|
569
600
|
const writable = await accessControl.canWriteBatch(
|
|
570
|
-
|
|
601
|
+
kb.defaultWorkspaceId(),
|
|
571
602
|
email,
|
|
572
603
|
plugin.folders.map(accessMdOf),
|
|
573
604
|
);
|
|
@@ -589,7 +620,7 @@ export function createPluginsRoutes(
|
|
|
589
620
|
if (!ctx) return;
|
|
590
621
|
const crs = await workflow.listChangeRequests();
|
|
591
622
|
res.json({
|
|
592
|
-
requests: await joinRequests.list(joinKeyOf(ctx.plugin), ctx.folder, crs, ctx.user),
|
|
623
|
+
requests: await joinRequests.list(joinKeyOf(ctx.plugin), folderTarget(ctx.folder), crs, ctx.user),
|
|
593
624
|
});
|
|
594
625
|
} catch (err) {
|
|
595
626
|
log.error('failed to list join requests:', { err });
|
|
@@ -619,7 +650,7 @@ export function createPluginsRoutes(
|
|
|
619
650
|
res.status(404).json({ error: 'Not found' });
|
|
620
651
|
return;
|
|
621
652
|
}
|
|
622
|
-
res.json({ closed: await joinRequests.reconcile(joinKeyOf(ctx.plugin), ctx.folder, cr, ctx.user) });
|
|
653
|
+
res.json({ closed: await joinRequests.reconcile(joinKeyOf(ctx.plugin), folderTarget(ctx.folder), cr, ctx.user) });
|
|
623
654
|
} catch (err) {
|
|
624
655
|
log.error('failed to reconcile a join request:', { err });
|
|
625
656
|
res.status(500).json({ error: 'Failed to update the request' });
|
|
@@ -3,13 +3,10 @@ import { logger } from '../../shared/logging.js';
|
|
|
3
3
|
|
|
4
4
|
const log = logger('plugins');
|
|
5
5
|
import path from 'node:path';
|
|
6
|
-
import {
|
|
7
|
-
DEFAULT_BRANCH,
|
|
8
|
-
} from '@bevel-software/platform-shared';
|
|
9
6
|
import { isPrivateAccessMd } from '../access-model/access-grammar.js';
|
|
10
7
|
import { isAbsence } from '../../shared/fs.contract.js';
|
|
11
8
|
import type { WorkspaceService } from '../workspace/workspace.service.js';
|
|
12
|
-
import {
|
|
9
|
+
import type { KbContext } from '../../shared/kb-context.js';
|
|
13
10
|
import type { IAccessControl } from '../access/access-control.interface.js';
|
|
14
11
|
import type { ISkillService } from '../skills/skills.contract.js';
|
|
15
12
|
import type { IToolManualService } from '../tool-manuals/tool-manuals.contract.js';
|
|
@@ -63,7 +60,7 @@ export class PluginIndexService implements IPluginIndexService {
|
|
|
63
60
|
private readonly accessControl: IAccessControl,
|
|
64
61
|
private readonly skillService: ISkillService,
|
|
65
62
|
private readonly toolManualService: IToolManualService,
|
|
66
|
-
private readonly
|
|
63
|
+
private readonly kb: KbContext,
|
|
67
64
|
/** Where plugins come from — the one discovery every catalog shares. */
|
|
68
65
|
private readonly source: PluginSource,
|
|
69
66
|
now: () => number = Date.now,
|
|
@@ -77,6 +74,10 @@ export class PluginIndexService implements IPluginIndexService {
|
|
|
77
74
|
this.cache = new TtlCache(CACHE_TTL_MS, now);
|
|
78
75
|
}
|
|
79
76
|
|
|
77
|
+
private get kbDirName(): string {
|
|
78
|
+
return this.kb.kbDirName;
|
|
79
|
+
}
|
|
80
|
+
|
|
80
81
|
invalidate(): void {
|
|
81
82
|
this.cache.invalidate();
|
|
82
83
|
}
|
|
@@ -115,7 +116,7 @@ export class PluginIndexService implements IPluginIndexService {
|
|
|
115
116
|
*/
|
|
116
117
|
private async build(): Promise<PluginCatalogEntry[] | null> {
|
|
117
118
|
try {
|
|
118
|
-
const wsId = (await this.workspaceService.getOrCreateForBranch(
|
|
119
|
+
const wsId = (await this.workspaceService.getOrCreateForBranch(this.kb.defaultBranch)).id;
|
|
119
120
|
const kbRoot = path.join(await this.workspaceService.getWorkspacePath(wsId), this.kbDirName);
|
|
120
121
|
|
|
121
122
|
const scanned = await this.scanFolders(kbRoot);
|
|
@@ -301,11 +302,6 @@ function bucketByFolder(items: { path: string }[], folders: Map<string, string[]
|
|
|
301
302
|
return counts;
|
|
302
303
|
}
|
|
303
304
|
|
|
304
|
-
/** The default-branch workspace id every plugin resolution runs against. */
|
|
305
|
-
export function pluginsWorkspaceId(): string {
|
|
306
|
-
return workspaceIdForBranch(DEFAULT_BRANCH);
|
|
307
|
-
}
|
|
308
|
-
|
|
309
305
|
/**
|
|
310
306
|
* A plugin folder's path BELOW the plugins root: `GTM`, or `teams/deep`.
|
|
311
307
|
*
|
|
@@ -2,12 +2,17 @@ import express from 'express';
|
|
|
2
2
|
import { logger } from '../../shared/logging.js';
|
|
3
3
|
|
|
4
4
|
const log = logger('teams');
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
isPersonalPluginDir,
|
|
7
|
+
isPersonalPluginFolder,
|
|
8
|
+
pluginOfPath,
|
|
9
|
+
type KbLayout,
|
|
10
|
+
} from '@bevel-software/platform-shared';
|
|
6
11
|
import type { IAccessControl } from '../access/access-control.interface.js';
|
|
12
|
+
import type { KbContext } from '../../shared/kb-context.js';
|
|
7
13
|
import type { ISkillService } from '../skills/skills.contract.js';
|
|
8
14
|
import type { IToolManualService } from '../tool-manuals/tool-manuals.contract.js';
|
|
9
15
|
import type { IPluginIndexService, PluginCatalogEntry } from './plugins.contract.js';
|
|
10
|
-
import { pluginsWorkspaceId } from './plugins.service.js';
|
|
11
16
|
|
|
12
17
|
/**
|
|
13
18
|
* What one team can use, by id — the Library's "Your teams" lens.
|
|
@@ -51,6 +56,8 @@ export function createTeamsRoutes(
|
|
|
51
56
|
pluginIndex: IPluginIndexService,
|
|
52
57
|
skillService: Pick<ISkillService, 'listSkills'>,
|
|
53
58
|
toolManuals: Pick<IToolManualService, 'listAllSummaries'>,
|
|
59
|
+
/** The released branch's clone the verdicts are read from, and the layout that names the plugins root. */
|
|
60
|
+
kb: Pick<KbContext, 'defaultWorkspaceId' | 'layout'>,
|
|
54
61
|
): express.Router {
|
|
55
62
|
const router = express.Router();
|
|
56
63
|
|
|
@@ -61,7 +68,7 @@ export function createTeamsRoutes(
|
|
|
61
68
|
return;
|
|
62
69
|
}
|
|
63
70
|
try {
|
|
64
|
-
const wsId =
|
|
71
|
+
const wsId = kb.defaultWorkspaceId();
|
|
65
72
|
const [{ groups }, catalog, allSkills, allTools] = await Promise.all([
|
|
66
73
|
accessControl.kbPrincipals(wsId),
|
|
67
74
|
pluginIndex.catalog(),
|
|
@@ -73,9 +80,10 @@ export function createTeamsRoutes(
|
|
|
73
80
|
// be a team's to read — whatever a hand-written grant in there says.
|
|
74
81
|
// One rule for the plugin and for its contents, so the two cannot
|
|
75
82
|
// disagree.
|
|
76
|
-
const
|
|
77
|
-
const
|
|
78
|
-
const
|
|
83
|
+
const layout = kb.layout;
|
|
84
|
+
const plugins = catalog.filter((g) => !g.folders.every((f) => isPersonalPluginDir(f, layout)));
|
|
85
|
+
const skills = allSkills.filter((s) => !inPersonalPlugin(s.path, layout));
|
|
86
|
+
const tools = allTools.filter((t) => !inPersonalPlugin(t.path, layout));
|
|
79
87
|
const folderProbes = plugins.flatMap((g) => g.folders);
|
|
80
88
|
const discoverProbes = folderProbes.map(accessMdOf);
|
|
81
89
|
const skillProbes = skills.map((s) => skillMdOf(s.path));
|
|
@@ -123,7 +131,7 @@ export function createTeamsRoutes(
|
|
|
123
131
|
const accessMdOf = (folder: string) => `${folder}/access.md`;
|
|
124
132
|
const skillMdOf = (skillPath: string) => `${skillPath}/SKILL.md`;
|
|
125
133
|
/** Under `Plugins/personal-<id>/…` — one person's space, whatever it grants. */
|
|
126
|
-
const inPersonalPlugin = (repoPath: string) => {
|
|
127
|
-
const folder = pluginOfPath(repoPath);
|
|
134
|
+
const inPersonalPlugin = (repoPath: string, layout: KbLayout) => {
|
|
135
|
+
const folder = pluginOfPath(repoPath, layout);
|
|
128
136
|
return folder !== null && isPersonalPluginFolder(folder);
|
|
129
137
|
};
|
|
@@ -2,6 +2,7 @@ import type { Server as HttpServer } from 'node:http';
|
|
|
2
2
|
import express from 'express';
|
|
3
3
|
import { afterEach, describe, expect, it } from 'vitest';
|
|
4
4
|
import { createSecretsVaultRoutes } from '../secrets-vault.routes.js';
|
|
5
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* The aggregated `/connect/pending` surface: everything standing between the
|
|
@@ -85,6 +86,7 @@ async function baseUrlWith(auth: { userId?: string; email?: string }): Promise<s
|
|
|
85
86
|
app.use(
|
|
86
87
|
'/api',
|
|
87
88
|
createSecretsVaultRoutes({
|
|
89
|
+
kb: testKbContext(),
|
|
88
90
|
secretsVault,
|
|
89
91
|
toolManualService,
|
|
90
92
|
accessControl,
|
|
@@ -170,6 +172,7 @@ describe('GET /api/connect/pending — the workspace tier', () => {
|
|
|
170
172
|
app.use(
|
|
171
173
|
'/api',
|
|
172
174
|
createSecretsVaultRoutes({
|
|
175
|
+
kb: testKbContext(),
|
|
173
176
|
secretsVault: {
|
|
174
177
|
statusFor: async (_u: string, keys: string[]) =>
|
|
175
178
|
keys.map((key) => ({
|
|
@@ -258,6 +261,7 @@ describe('GET /api/connect/pending — readability', () => {
|
|
|
258
261
|
app.use(
|
|
259
262
|
'/api',
|
|
260
263
|
createSecretsVaultRoutes({
|
|
264
|
+
kb: testKbContext(),
|
|
261
265
|
secretsVault: {
|
|
262
266
|
statusFor: async (_u: string, keys: string[]) =>
|
|
263
267
|
keys.map((key) => ({
|
|
@@ -384,6 +388,7 @@ describe('GET /api/connect/pending — OAuth scope coverage', () => {
|
|
|
384
388
|
app.use(
|
|
385
389
|
'/api',
|
|
386
390
|
createSecretsVaultRoutes({
|
|
391
|
+
kb: testKbContext(),
|
|
387
392
|
secretsVault: vaultWithGranted(grantedScopes),
|
|
388
393
|
toolManualService: oauthTool,
|
|
389
394
|
accessControl,
|
|
@@ -478,6 +483,7 @@ describe('GET /api/connect/pending — tool sign-ins are not double-listed as st
|
|
|
478
483
|
app.use(
|
|
479
484
|
'/api',
|
|
480
485
|
createSecretsVaultRoutes({
|
|
486
|
+
kb: testKbContext(),
|
|
481
487
|
secretsVault: vault,
|
|
482
488
|
toolManualService: oauthTool,
|
|
483
489
|
accessControl,
|
|
@@ -538,6 +544,7 @@ describe('GET /api/connect/pending — a row of the wrong KIND is not "set up"',
|
|
|
538
544
|
app.use(
|
|
539
545
|
'/api',
|
|
540
546
|
createSecretsVaultRoutes({
|
|
547
|
+
kb: testKbContext(),
|
|
541
548
|
secretsVault: {
|
|
542
549
|
statusFor: async (_u: string, keys: string[]) => keys.map(opts.status),
|
|
543
550
|
list: async () => [],
|