@bevel-software/platform-core-backend 0.20.0 → 0.21.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 +23 -105
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +30 -5
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +136 -81
- 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.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/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 +19 -1
- package/dist/modules/auth/auth.service.d.ts.map +1 -1
- package/dist/modules/auth/auth.service.js +33 -1
- 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/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/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-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 +3 -1
- package/dist/modules/plugins/join-requests.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-requests.service.js +9 -8
- 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 +45 -15
- 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 +12 -8
- package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
- package/dist/modules/settings/deployment-settings.service.js +20 -22
- package/dist/modules/settings/deployment-settings.service.js.map +1 -1
- package/dist/modules/settings/setup.routes.d.ts +9 -2
- package/dist/modules/settings/setup.routes.d.ts.map +1 -1
- package/dist/modules/settings/setup.routes.js +20 -14
- 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 +2 -1
- package/dist/modules/skills/skill-access-requests.routes.d.ts.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.js +6 -6
- 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-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 +9 -9
- package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
- package/dist/modules/workflow/git/git.service.d.ts +11 -5
- package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/git.service.js +23 -14
- 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 +35 -5
- package/dist/modules/workflow/git/node-git-runner.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.service.d.ts +8 -3
- package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.service.js +33 -23
- 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 +5 -8
- package/dist/modules/workspace/startup/kb-startup-runner.d.ts.map +1 -1
- package/dist/modules/workspace/startup/kb-startup-runner.js +35 -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 +32 -28
- 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 +20 -18
- 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/git.contract.d.ts +52 -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 +27 -106
- package/src/core/create-core-services.ts +180 -95
- 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.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.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/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 +60 -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 +33 -1
- 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/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/branch-name.ts +3 -3
- package/src/modules/kb-fs/clone-config.ts +15 -12
- 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-request-jobs.service.test.ts +2 -1
- package/src/modules/plugins/__tests__/join-requests.service.test.ts +2 -1
- 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 +11 -2
- 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-request-jobs.service.ts +8 -7
- package/src/modules/plugins/join-requests.service.ts +7 -7
- 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 +45 -15
- 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__/setup.routes.boot-failure.test.ts +2 -1
- package/src/modules/settings/__tests__/setup.routes.layout-phase.test.ts +7 -4
- 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 +21 -20
- package/src/modules/settings/setup.routes.ts +26 -16
- 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 +2 -1
- 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 +7 -7
- 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-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 +2 -1
- 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 +28 -27
- 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 +2 -1
- package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +2 -1
- package/src/modules/workflow/agent-tools/workflow.tools.ts +11 -9
- 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 +9 -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/git.service.ts +24 -13
- package/src/modules/workflow/git/node-git-runner.ts +37 -4
- 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.service.ts +31 -24
- 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 +2 -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 +4 -3
- package/src/modules/workspace/__tests__/workspace.tools.test.ts +9 -8
- 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 +29 -21
- package/src/modules/workspace/startup/kb-git.ts +15 -22
- package/src/modules/workspace/startup/kb-startup-runner.ts +40 -46
- 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 +30 -27
- package/src/modules/workspace/workspace.tools.ts +21 -20
- package/src/modules/workspace/write-denial.ts +7 -5
- package/src/shared/__tests__/kb-layout.plugin.test.ts +19 -16
- package/src/shared/git.contract.ts +70 -8
- package/src/shared/kb-context.ts +130 -0
- package/src/shared/kb-layout.test.ts +37 -27
- package/src/shared/kb-layout.ts +4 -3
- package/src/shared/pending-proposals.ts +7 -4
- package/src/shared/redact-secret.ts +5 -5
- package/src/tenancy/__tests__/static-tenant-source.test.ts +177 -0
- package/src/tenancy/__tests__/tenant-host.test.ts +372 -0
- package/src/tenancy/__tests__/tenant-runtime.test.ts +221 -0
- package/src/tenancy/__tests__/tenant-secrets.test.ts +35 -0
- package/src/tenancy/index.ts +35 -0
- package/src/tenancy/static-tenant-source.ts +296 -0
- package/src/tenancy/tenant-host.ts +261 -0
- package/src/tenancy/tenant-runtime.ts +208 -0
- package/src/tenancy/tenant-secrets.ts +41 -0
- package/src/tenancy/tenant-source.contract.ts +59 -0
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
|
-
import {
|
|
2
|
+
import { PLUGIN_MANIFEST_FILE, pluginManifestName, type KbLayout } from '@bevel-software/platform-shared';
|
|
3
3
|
import type { DiscoveredPlugin, Discovery, PluginSource, PluginSourceWalk } from './plugin-source.js';
|
|
4
4
|
import type { IFsProbe, ITreeWalker, WalkListener } from '../../../shared/fs.contract.js';
|
|
5
|
+
import type { KbContext } from '../../../shared/kb-context.js';
|
|
5
6
|
import { readNativePlugin } from './native.source.js';
|
|
6
7
|
import { BUNDLE_FILE, loadRegistry, readBundlePlugin } from './bundle-dialect/bundle.source.js';
|
|
7
8
|
import type { McpRegistry } from './bundle-dialect/registry.js';
|
|
@@ -38,7 +39,11 @@ import type { McpRegistry } from './bundle-dialect/registry.js';
|
|
|
38
39
|
export class KbPluginSource implements PluginSource {
|
|
39
40
|
readonly dialect = 'kb';
|
|
40
41
|
|
|
41
|
-
constructor(
|
|
42
|
+
constructor(
|
|
43
|
+
private readonly disk: ITreeWalker & IFsProbe,
|
|
44
|
+
/** Read per walk, never captured: the plugins root is renameable from the setup screen. */
|
|
45
|
+
private readonly kb: Pick<KbContext, 'layout'>,
|
|
46
|
+
) {}
|
|
42
47
|
|
|
43
48
|
async discover(kbRoot: string): Promise<Discovery> {
|
|
44
49
|
return (await this.walkWith(kbRoot, [])).discovery;
|
|
@@ -47,7 +52,7 @@ export class KbPluginSource implements PluginSource {
|
|
|
47
52
|
async walkWith(kbRoot: string, listeners: readonly WalkListener[]): Promise<PluginSourceWalk> {
|
|
48
53
|
const warnings: string[] = [];
|
|
49
54
|
const registry = await loadRegistry(kbRoot, warnings);
|
|
50
|
-
const listener = pluginListener(this.disk, kbRoot, registry, warnings);
|
|
55
|
+
const listener = pluginListener(this.disk, kbRoot, this.kb.layout, registry, warnings);
|
|
51
56
|
const { holes } = await this.disk.walkKb(kbRoot, [listener.listener, ...listeners]);
|
|
52
57
|
return { discovery: listener.result(), holes };
|
|
53
58
|
}
|
|
@@ -57,16 +62,18 @@ export class KbPluginSource implements PluginSource {
|
|
|
57
62
|
function pluginListener(
|
|
58
63
|
disk: IFsProbe,
|
|
59
64
|
kbRoot: string,
|
|
65
|
+
layout: KbLayout,
|
|
60
66
|
registry: McpRegistry | null,
|
|
61
67
|
warnings: string[],
|
|
62
68
|
): { listener: WalkListener; result(): Discovery } {
|
|
69
|
+
const { pluginsDir } = layout;
|
|
63
70
|
const unreadable: string[] = [];
|
|
64
71
|
const plugins: DiscoveredPlugin[] = [];
|
|
65
72
|
const seen = new Map<string, string>();
|
|
66
73
|
/** Folders claimed as plugins (or as holes standing where a plugin may be): nothing beneath is looked at. */
|
|
67
74
|
const claimed: string[] = [];
|
|
68
75
|
|
|
69
|
-
const underRoot = (rel: string) => rel ===
|
|
76
|
+
const underRoot = (rel: string) => rel === pluginsDir || rel.startsWith(`${pluginsDir}/`);
|
|
70
77
|
const beneathClaimed = (rel: string) => claimed.some((c) => rel === c || rel.startsWith(`${c}/`));
|
|
71
78
|
|
|
72
79
|
// Uniqueness is judged on the MANIFEST SLUG, not the raw name: `Sales Team`
|
|
@@ -87,18 +94,18 @@ function pluginListener(
|
|
|
87
94
|
return {
|
|
88
95
|
listener: {
|
|
89
96
|
async onDir(rel, entries) {
|
|
90
|
-
if (!underRoot(rel) || rel ===
|
|
97
|
+
if (!underRoot(rel) || rel === pluginsDir || beneathClaimed(rel)) return;
|
|
91
98
|
const has = (name: string) => entries.some((e) => e.isFile() && e.name === name);
|
|
92
99
|
const dir = path.join(kbRoot, rel);
|
|
93
|
-
const relFolder = rel.slice(
|
|
100
|
+
const relFolder = rel.slice(pluginsDir.length + 1);
|
|
94
101
|
if (has(PLUGIN_MANIFEST_FILE)) {
|
|
95
102
|
claimed.push(rel);
|
|
96
103
|
// A manifest that could not be read: a hole, and still claimed.
|
|
97
|
-
const native = await readNativePlugin(disk, dir, rel, relFolder, warnings, unreadable);
|
|
104
|
+
const native = await readNativePlugin(disk, dir, rel, relFolder, warnings, unreadable, layout);
|
|
98
105
|
if (native) claim(native);
|
|
99
106
|
} else if (has(BUNDLE_FILE)) {
|
|
100
107
|
claimed.push(rel);
|
|
101
|
-
const bundle = await readBundlePlugin(dir, rel, relFolder, registry, warnings, unreadable);
|
|
108
|
+
const bundle = await readBundlePlugin(dir, rel, relFolder, registry, warnings, unreadable, layout);
|
|
102
109
|
if (bundle) claim(bundle);
|
|
103
110
|
}
|
|
104
111
|
},
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
linkedSkillRoots,
|
|
9
9
|
pluginDisplayNameOf,
|
|
10
10
|
pluginIdentityOf,
|
|
11
|
+
type KbLayout,
|
|
11
12
|
} from '@bevel-software/platform-shared';
|
|
12
13
|
import { isAbsence, type IFsProbe } from '../../../shared/fs.contract.js';
|
|
13
14
|
import type { DiscoveredPlugin } from './plugin-source.js';
|
|
@@ -31,6 +32,8 @@ export async function readNativePlugin(
|
|
|
31
32
|
relFolder: string,
|
|
32
33
|
warnings: string[],
|
|
33
34
|
unreadable: string[],
|
|
35
|
+
/** Names the plugins root a personal folder sits directly under. */
|
|
36
|
+
layout: KbLayout,
|
|
34
37
|
): Promise<DiscoveredPlugin | null> {
|
|
35
38
|
const folderName = path.posix.basename(relFolder);
|
|
36
39
|
const manifestRead = await readText(path.join(dir, PLUGIN_MANIFEST_FILE), folder, warnings);
|
|
@@ -97,7 +100,7 @@ export async function readNativePlugin(
|
|
|
97
100
|
folder,
|
|
98
101
|
relFolder,
|
|
99
102
|
// The one structural rule: a direct child of the root with the prefix.
|
|
100
|
-
personal: isPersonalPluginDir(folder),
|
|
103
|
+
personal: isPersonalPluginDir(folder, layout),
|
|
101
104
|
exists,
|
|
102
105
|
manifest,
|
|
103
106
|
manifestText,
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import {
|
|
2
|
-
DEFAULT_BRANCH,
|
|
3
2
|
joinBranchFor,
|
|
4
3
|
type AuthUser,
|
|
5
4
|
type ChangeRequestState,
|
|
@@ -9,8 +8,8 @@ import { spliceGrant } from '../access-model/access-splice.js';
|
|
|
9
8
|
import { sanitizeError } from '../workflow/sanitize-error.js';
|
|
10
9
|
import { logger } from '../../shared/logging.js';
|
|
11
10
|
import { printable } from '../../shared/printable.js';
|
|
11
|
+
import type { KbContext } from '../../shared/kb-context.js';
|
|
12
12
|
import type { WorkspaceService } from '../workspace/workspace.service.js';
|
|
13
|
-
import { pluginsWorkspaceId } from './plugins.service.js';
|
|
14
13
|
import type {
|
|
15
14
|
ClaimedJoinRequest,
|
|
16
15
|
JoinRequestRecord,
|
|
@@ -148,7 +147,8 @@ export interface JoinRequestJobsDeps {
|
|
|
148
147
|
| 'listChangeRequestsAuthoredBy'
|
|
149
148
|
>;
|
|
150
149
|
workspaceService: Pick<WorkspaceService, 'getOrCreateForBranch' | 'readFile' | 'writeFile'>;
|
|
151
|
-
|
|
150
|
+
/** The checkout folder, and which branch the request is cut from and aimed at. */
|
|
151
|
+
kb: Pick<KbContext, 'kbDirName' | 'defaultBranch' | 'defaultWorkspaceId'>;
|
|
152
152
|
/**
|
|
153
153
|
* The plugin a recorded key still names, or null when nothing does — it was
|
|
154
154
|
* deleted, or its folder moved out from under the record.
|
|
@@ -508,7 +508,8 @@ export class PluginJoinRequestJobs {
|
|
|
508
508
|
claim: ClaimedJoinRequest,
|
|
509
509
|
stillOurs: () => Promise<void>,
|
|
510
510
|
): Promise<void> {
|
|
511
|
-
const { workflow, workspaceService,
|
|
511
|
+
const { workflow, workspaceService, kb } = this.deps;
|
|
512
|
+
const { kbDirName } = kb;
|
|
512
513
|
const target = await this.deps.target(record.pluginKey);
|
|
513
514
|
if (!target) throw new Error('the plugin is no longer available');
|
|
514
515
|
const user = await this.deps.requester(record.requesterEmail);
|
|
@@ -607,7 +608,7 @@ export class PluginJoinRequestJobs {
|
|
|
607
608
|
}
|
|
608
609
|
const detail = await workflow.openChangeRequest(ws.id, user, {
|
|
609
610
|
sourceBranch: branch,
|
|
610
|
-
targetBranch:
|
|
611
|
+
targetBranch: kb.defaultBranch,
|
|
611
612
|
// People read these: the display name, not the identifier.
|
|
612
613
|
title: `Join request: ${target.displayName}`,
|
|
613
614
|
description:
|
|
@@ -637,9 +638,9 @@ export class PluginJoinRequestJobs {
|
|
|
637
638
|
* leaves the next click free to retry the same row.
|
|
638
639
|
*/
|
|
639
640
|
private async ensureBranch(branch: string): Promise<void> {
|
|
640
|
-
const wsId =
|
|
641
|
+
const wsId = this.deps.kb.defaultWorkspaceId();
|
|
641
642
|
try {
|
|
642
|
-
await this.deps.workflow.createBranch(wsId, branch,
|
|
643
|
+
await this.deps.workflow.createBranch(wsId, branch, this.deps.kb.defaultBranch);
|
|
643
644
|
return;
|
|
644
645
|
} catch (err) {
|
|
645
646
|
const branches = await this.deps.workflow.listBranches(wsId, {
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import {
|
|
2
|
-
DEFAULT_BRANCH,
|
|
3
2
|
isJoinBranchFor,
|
|
4
3
|
type AuthUser,
|
|
5
4
|
type ChangeRequest,
|
|
@@ -9,7 +8,7 @@ import { type WorkspaceService } from '../workspace/workspace.service.js';
|
|
|
9
8
|
import { logger } from '../../shared/logging.js';
|
|
10
9
|
|
|
11
10
|
const log = logger('plugins');
|
|
12
|
-
import {
|
|
11
|
+
import type { KbContext } from '../../shared/kb-context.js';
|
|
13
12
|
import { pendingProposals, type JoinProposal } from './join-proposals.js';
|
|
14
13
|
|
|
15
14
|
/** One open join change request, with what it still proposes. */
|
|
@@ -46,6 +45,7 @@ export class JoinRequestsService {
|
|
|
46
45
|
constructor(
|
|
47
46
|
private readonly workspaceService: WorkspaceService,
|
|
48
47
|
private readonly workflow: IWorkflowService,
|
|
48
|
+
private readonly kb: Pick<KbContext, 'defaultBranch' | 'defaultWorkspaceId'>,
|
|
49
49
|
) {}
|
|
50
50
|
|
|
51
51
|
/**
|
|
@@ -64,7 +64,7 @@ export class JoinRequestsService {
|
|
|
64
64
|
): Promise<JoinRequest[]> {
|
|
65
65
|
await this.refresh();
|
|
66
66
|
const accessPath = `${folder}/access.md`;
|
|
67
|
-
const baseText = await this.readAt(
|
|
67
|
+
const baseText = await this.readAt(this.kb.defaultBranch, accessPath);
|
|
68
68
|
const out: JoinRequest[] = [];
|
|
69
69
|
for (const cr of crs) {
|
|
70
70
|
if (cr.state !== 'open' || !isJoinBranchFor(cr.branch, plugin)) continue;
|
|
@@ -104,7 +104,7 @@ export class JoinRequestsService {
|
|
|
104
104
|
const accessPath = `${folder}/access.md`;
|
|
105
105
|
const proposals = pendingProposals(
|
|
106
106
|
await this.readAt(cr.branch, accessPath),
|
|
107
|
-
await this.readAt(
|
|
107
|
+
await this.readAt(this.kb.defaultBranch, accessPath),
|
|
108
108
|
accessPath,
|
|
109
109
|
);
|
|
110
110
|
if (proposals.length > 0) return false;
|
|
@@ -125,7 +125,7 @@ export class JoinRequestsService {
|
|
|
125
125
|
* next pass tries again.
|
|
126
126
|
*/
|
|
127
127
|
private async settle(cr: ChangeRequest, actor: AuthUser): Promise<void> {
|
|
128
|
-
const wsId =
|
|
128
|
+
const wsId = this.kb.defaultWorkspaceId();
|
|
129
129
|
try {
|
|
130
130
|
await this.workflow.rejectChangeRequest(
|
|
131
131
|
cr.number,
|
|
@@ -167,7 +167,7 @@ export class JoinRequestsService {
|
|
|
167
167
|
private async readAt(branch: string, repoRelPath: string): Promise<string | null> {
|
|
168
168
|
try {
|
|
169
169
|
return await this.workspaceService.readFileAtRef(
|
|
170
|
-
|
|
170
|
+
this.kb.defaultWorkspaceId(),
|
|
171
171
|
`origin/${branch}`,
|
|
172
172
|
repoRelPath,
|
|
173
173
|
);
|
|
@@ -183,7 +183,7 @@ export class JoinRequestsService {
|
|
|
183
183
|
*/
|
|
184
184
|
private async refresh(): Promise<void> {
|
|
185
185
|
await this.workspaceService
|
|
186
|
-
.ensureRemotesFetched(
|
|
186
|
+
.ensureRemotesFetched(this.kb.defaultWorkspaceId())
|
|
187
187
|
.catch(() => undefined);
|
|
188
188
|
}
|
|
189
189
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import {
|
|
4
|
-
DEFAULT_BRANCH,
|
|
5
4
|
PLUGIN_MANIFEST_FILE,
|
|
6
5
|
linkedSkillRoots,
|
|
7
6
|
normalizeSkillRoot,
|
|
@@ -19,8 +18,57 @@ import { pluginPrincipalKey } from '../access-model/access-grammar.js';
|
|
|
19
18
|
import type { Principal } from '../access-model/access-splice.js';
|
|
20
19
|
import { WorkspaceMutex } from '../kb-fs/mutex.js';
|
|
21
20
|
import type { ISkillService } from '../skills/skills.contract.js';
|
|
21
|
+
import { logger } from '../../shared/logging.js';
|
|
22
22
|
import type { ProvisionCommitDriver } from './plugin-provision.service.js';
|
|
23
|
-
import {
|
|
23
|
+
import type { PluginLinkIndex } from './plugin-links.js';
|
|
24
|
+
import type { KbContext } from '../../shared/kb-context.js';
|
|
25
|
+
|
|
26
|
+
const log = logger('plugins');
|
|
27
|
+
|
|
28
|
+
/** Who may edit one skill root's access file, in the terms the banner names them. */
|
|
29
|
+
export interface LinkEditors {
|
|
30
|
+
roles: string[];
|
|
31
|
+
users: { name: string; email: string }[];
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** One link the automatic repair left alone, and why — see `repairAll`. */
|
|
35
|
+
export interface UnrepairedLink {
|
|
36
|
+
/** Repo-relative root, as the manifest declares it. */
|
|
37
|
+
root: string;
|
|
38
|
+
/**
|
|
39
|
+
* `needs-skill-write` — the viewer may not write the root's access file, so
|
|
40
|
+
* nothing was attempted; `failed` — the write was attempted and did not
|
|
41
|
+
* land; `denied` — both lines are already in the file and the link is still
|
|
42
|
+
* not granted, which is a `deny` of the plugin at that root: nothing to
|
|
43
|
+
* write, and only an editor removing the deny would change it. All three
|
|
44
|
+
* leave the link broken and all three keep the banner.
|
|
45
|
+
*/
|
|
46
|
+
reason: 'needs-skill-write' | 'failed' | 'denied';
|
|
47
|
+
/** The skills the plugin's members still cannot read through the root. */
|
|
48
|
+
skills: { path: string; name: string }[];
|
|
49
|
+
/** Who can repair it from the skill page. */
|
|
50
|
+
editors: LinkEditors;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** What one page-open repair did and what it could not do. */
|
|
54
|
+
export interface LinkRepairReport {
|
|
55
|
+
/** Roots whose two grant lines are now in place (silent: nothing to show). */
|
|
56
|
+
repaired: string[];
|
|
57
|
+
/** What is still broken, and who can fix it. */
|
|
58
|
+
skipped: UnrepairedLink[];
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* The commit subject for an automatic repair. It names the plugin, the root
|
|
63
|
+
* and the fact that nobody asked for it — the commit is the ONLY trace a
|
|
64
|
+
* silent repair leaves, so the history has to explain itself. Falls back to
|
|
65
|
+
* the path-derived default when a very long root would blow the 200-character
|
|
66
|
+
* subject limit: a missed explanation is not worth a failed repair.
|
|
67
|
+
*/
|
|
68
|
+
function repairSummary(plugin: string, root: string): string | undefined {
|
|
69
|
+
const subject = `Repair link: ${plugin} → ${root} (automatic, on opening the plugin page)`;
|
|
70
|
+
return subject.length <= 200 ? subject : undefined;
|
|
71
|
+
}
|
|
24
72
|
|
|
25
73
|
/** A refusal the route passes through: message + HTTP status + a machine-readable kind. */
|
|
26
74
|
export class PluginLinkError extends Error {
|
|
@@ -59,7 +107,9 @@ export class PluginLinkError extends Error {
|
|
|
59
107
|
* skill page says so, for a skill editor to remove.
|
|
60
108
|
*
|
|
61
109
|
* Repair re-grants the tokens for a link that exists but whose grant was
|
|
62
|
-
* hand-removed
|
|
110
|
+
* hand-removed — the amber dot's one action, run one link at a time from the
|
|
111
|
+
* skill page, or over a whole plugin's links by `repairAll` the moment
|
|
112
|
+
* somebody who may write that plugin opens its page.
|
|
63
113
|
*
|
|
64
114
|
* Every operation is serialised on BOTH sides it writes — the plugin's
|
|
65
115
|
* manifest slug (the same key provisioning locks on) and the skill root whose
|
|
@@ -77,19 +127,23 @@ export class PluginLinksService {
|
|
|
77
127
|
private readonly accessControl: IAccessControl,
|
|
78
128
|
private readonly skillService: ISkillService,
|
|
79
129
|
private readonly links: PluginLinkIndex,
|
|
80
|
-
private readonly
|
|
130
|
+
private readonly kb: KbContext,
|
|
81
131
|
private readonly events?: {
|
|
82
132
|
emit(event: { kind: 'fs-tree-changed'; workspaceId: string; branch: string }): void;
|
|
83
133
|
},
|
|
84
134
|
private readonly onChanged?: () => void,
|
|
85
135
|
) {
|
|
86
|
-
this.mutation = new AccessMutationService(workspaceService, accessControl, kbDirName);
|
|
136
|
+
this.mutation = new AccessMutationService(workspaceService, accessControl, kb.kbDirName);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
private get kbDirName(): string {
|
|
140
|
+
return this.kb.kbDirName;
|
|
87
141
|
}
|
|
88
142
|
|
|
89
143
|
async link(user: AuthUser, plugin: string, rawRoot: string): Promise<{ root: string; skills: string[] }> {
|
|
90
144
|
const folder = await this.pluginFolder(plugin);
|
|
91
145
|
const root = this.rootOrThrow(rawRoot);
|
|
92
|
-
const wsId =
|
|
146
|
+
const wsId = this.kb.defaultWorkspaceId();
|
|
93
147
|
await this.requirePluginWrite(wsId, user, folder);
|
|
94
148
|
const skills = await this.resolvedSkills(root);
|
|
95
149
|
if (skills.length === 0) {
|
|
@@ -125,7 +179,7 @@ export class PluginLinksService {
|
|
|
125
179
|
manifestRel,
|
|
126
180
|
`${JSON.stringify(withLinkedSkillRoots(manifest, [...roots, root]), null, 2)}\n`,
|
|
127
181
|
);
|
|
128
|
-
await this.commits.runPendingCommit(wsId,
|
|
182
|
+
await this.commits.runPendingCommit(wsId, this.kb.defaultBranch, manifestRel, user);
|
|
129
183
|
}
|
|
130
184
|
await this.grantTokens(wsId, user, folder, root);
|
|
131
185
|
this.changed(wsId);
|
|
@@ -136,7 +190,7 @@ export class PluginLinksService {
|
|
|
136
190
|
async unlink(user: AuthUser, plugin: string, rawRoot: string): Promise<{ root: string; revoked: boolean }> {
|
|
137
191
|
const folder = await this.pluginFolder(plugin);
|
|
138
192
|
const root = this.rootOrThrow(rawRoot);
|
|
139
|
-
const wsId =
|
|
193
|
+
const wsId = this.kb.defaultWorkspaceId();
|
|
140
194
|
await this.requirePluginWrite(wsId, user, folder);
|
|
141
195
|
return this.locks.runAll(this.lockKeys(folder, root), async () => {
|
|
142
196
|
const { manifest, manifestRel } = await this.readManifest(wsId, folder);
|
|
@@ -163,7 +217,7 @@ export class PluginLinksService {
|
|
|
163
217
|
if (changed) {
|
|
164
218
|
await this.commits.runPendingCommit(
|
|
165
219
|
wsId,
|
|
166
|
-
|
|
220
|
+
this.kb.defaultBranch,
|
|
167
221
|
`${this.kbDirName}/${accessMdPathForFolder(root)}`,
|
|
168
222
|
user,
|
|
169
223
|
);
|
|
@@ -175,16 +229,36 @@ export class PluginLinksService {
|
|
|
175
229
|
manifestRel,
|
|
176
230
|
`${JSON.stringify(withLinkedSkillRoots(manifest, roots.filter((r) => r !== root)), null, 2)}\n`,
|
|
177
231
|
);
|
|
178
|
-
await this.commits.runPendingCommit(wsId,
|
|
232
|
+
await this.commits.runPendingCommit(wsId, this.kb.defaultBranch, manifestRel, user);
|
|
179
233
|
this.changed(wsId);
|
|
180
234
|
return { root, revoked };
|
|
181
235
|
});
|
|
182
236
|
}
|
|
183
237
|
|
|
184
|
-
|
|
238
|
+
/**
|
|
239
|
+
* Re-grant one link's two tokens. The skill EDITOR's verb (the plugin side
|
|
240
|
+
* is not consulted): the amber dot's one manual action, and the single
|
|
241
|
+
* write the automatic repair runs too — see {@link repairAll}.
|
|
242
|
+
*
|
|
243
|
+
* `summary` is the commit subject when the caller has a better one than the
|
|
244
|
+
* path-derived default; the automatic repair passes one that says it was
|
|
245
|
+
* automatic, because the commit is the only trace it leaves.
|
|
246
|
+
*
|
|
247
|
+
* `written` says whether the file changed. A root that already carried
|
|
248
|
+
* both lines is left alone and reports false — which, for a root the index
|
|
249
|
+
* called ungranted, means the lines are not what is missing (a `deny`
|
|
250
|
+
* beside them is): the automatic repair reads it as "still broken", not as
|
|
251
|
+
* repaired.
|
|
252
|
+
*/
|
|
253
|
+
async repair(
|
|
254
|
+
user: AuthUser,
|
|
255
|
+
plugin: string,
|
|
256
|
+
rawRoot: string,
|
|
257
|
+
opts?: { summary?: string },
|
|
258
|
+
): Promise<{ root: string; written: boolean }> {
|
|
185
259
|
const folder = await this.pluginFolder(plugin);
|
|
186
260
|
const root = this.rootOrThrow(rawRoot);
|
|
187
|
-
const wsId =
|
|
261
|
+
const wsId = this.kb.defaultWorkspaceId();
|
|
188
262
|
// Everything under the lock, the manifest read included: a repair that
|
|
189
263
|
// checked the link and then waited on an unlink would re-grant a root the
|
|
190
264
|
// manifest no longer names.
|
|
@@ -199,14 +273,98 @@ export class PluginLinksService {
|
|
|
199
273
|
root,
|
|
200
274
|
});
|
|
201
275
|
}
|
|
202
|
-
await this.grantTokens(wsId, user, folder, root);
|
|
276
|
+
const written = await this.grantTokens(wsId, user, folder, root, opts?.summary);
|
|
203
277
|
this.changed(wsId);
|
|
204
|
-
return { root };
|
|
278
|
+
return { root, written };
|
|
205
279
|
});
|
|
206
280
|
}
|
|
207
281
|
|
|
282
|
+
/**
|
|
283
|
+
* Repair EVERY link of `plugin` that is missing its grants — what opening
|
|
284
|
+
* the plugin's page runs for someone who may write the plugin.
|
|
285
|
+
*
|
|
286
|
+
* Two gates, in this order: the caller must be able to write the PLUGIN
|
|
287
|
+
* (this is the plugin's page repairing its own links, not a way to write
|
|
288
|
+
* other people's access files), and then, per root, to write that root's
|
|
289
|
+
* access file. A root they cannot write is left exactly as it is and comes
|
|
290
|
+
* back in `skipped` with the people who CAN write it, which is the sentence
|
|
291
|
+
* the banner then says. Nothing comes back for a root that was repaired:
|
|
292
|
+
* the commit is the trace, the page simply renders with the link healthy.
|
|
293
|
+
*
|
|
294
|
+
* Root by root through {@link repair} — the same write, the same manifest
|
|
295
|
+
* check, the same pair of locks — so the automatic path and the button on
|
|
296
|
+
* the skill page can never write different things. Each root's failure is
|
|
297
|
+
* caught into `skipped`: one unwritable file must not cost the others their
|
|
298
|
+
* repair, nor the page its render.
|
|
299
|
+
*
|
|
300
|
+
* A root the repair did not have to write is NOT repaired. The work list
|
|
301
|
+
* holds only roots the index called ungranted, so a root whose two lines
|
|
302
|
+
* were already there is broken by something the lines cannot fix — a `deny`
|
|
303
|
+
* of the plugin in that same file — and reporting it repaired would hide
|
|
304
|
+
* the one link the writer opening this page could not see anywhere else.
|
|
305
|
+
*/
|
|
306
|
+
async repairAll(user: AuthUser, plugin: string): Promise<LinkRepairReport> {
|
|
307
|
+
const folder = await this.pluginFolder(plugin);
|
|
308
|
+
const wsId = this.kb.defaultWorkspaceId();
|
|
309
|
+
await this.requirePluginWrite(wsId, user, folder);
|
|
310
|
+
// Read the work list ONCE, before the first write: `repair` invalidates
|
|
311
|
+
// the index, and re-reading it per root would rebuild the whole membership
|
|
312
|
+
// between every commit.
|
|
313
|
+
const work = (await this.links.membership()).byPlugin.get(folder)?.ungrantedRoots ?? [];
|
|
314
|
+
if (work.length === 0) return { repaired: [], skipped: [] };
|
|
315
|
+
const named = new Map((await this.skillService.listSkills(undefined)).map((s) => [s.path, s.name]));
|
|
316
|
+
const repaired: string[] = [];
|
|
317
|
+
const skipped: UnrepairedLink[] = [];
|
|
318
|
+
const leftBroken = async (item: (typeof work)[number], reason: UnrepairedLink['reason']) => {
|
|
319
|
+
skipped.push({
|
|
320
|
+
root: item.root,
|
|
321
|
+
reason,
|
|
322
|
+
skills: item.skills.map((path) => ({ path, name: named.get(path) ?? path.split('/').pop() ?? path })),
|
|
323
|
+
editors: await this.editorsOf(wsId, item.root),
|
|
324
|
+
});
|
|
325
|
+
};
|
|
326
|
+
for (const item of work) {
|
|
327
|
+
try {
|
|
328
|
+
const { written } = await this.repair(user, folder, item.root, { summary: repairSummary(folder, item.root) });
|
|
329
|
+
if (written) repaired.push(item.root);
|
|
330
|
+
else await leftBroken(item, 'denied');
|
|
331
|
+
} catch (err) {
|
|
332
|
+
const needsWrite = err instanceof PluginLinkError && err.payload.kind === 'needs-skill-write';
|
|
333
|
+
if (!needsWrite) log.warn('automatic link repair failed:', { plugin: folder, root: item.root, err });
|
|
334
|
+
await leftBroken(item, needsWrite ? 'needs-skill-write' : 'failed');
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
return { repaired, skipped };
|
|
338
|
+
}
|
|
339
|
+
|
|
208
340
|
// --- internal --------------------------------------------------------------
|
|
209
341
|
|
|
342
|
+
/**
|
|
343
|
+
* Who may edit a root's access file — the principals the banner names as
|
|
344
|
+
* the people who can repair a link this viewer cannot.
|
|
345
|
+
*
|
|
346
|
+
* Plugin principals are dropped: `plugin/gtm/write` is a real holder of the
|
|
347
|
+
* verb, and naming it in a sentence addressed to a person says nothing they
|
|
348
|
+
* could act on. The eligible lists carry emails and no display names, so an
|
|
349
|
+
* email stands in — every name here has to be something a reader can go and
|
|
350
|
+
* ask. A lookup that fails names nobody rather than failing the whole
|
|
351
|
+
* repair — the banner has a sentence for that.
|
|
352
|
+
*/
|
|
353
|
+
private async editorsOf(wsId: string, root: string): Promise<LinkEditors> {
|
|
354
|
+
try {
|
|
355
|
+
const writers = await this.accessControl.eligibleWriters(wsId, accessMdPathForFolder(root));
|
|
356
|
+
return {
|
|
357
|
+
roles: writers.principals
|
|
358
|
+
? writers.principals.filter((p) => p.kind !== 'plugin').map((p) => p.name)
|
|
359
|
+
: writers.roles,
|
|
360
|
+
users: writers.users.map((u) => ({ name: u.name || u.email, email: u.email })),
|
|
361
|
+
};
|
|
362
|
+
} catch (err) {
|
|
363
|
+
log.warn("couldn't resolve a skill root's editors:", { root, err });
|
|
364
|
+
return { roles: [], users: [] };
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
|
|
210
368
|
/**
|
|
211
369
|
* ONE reservation for both sides of a link: the plugin's manifest AND the
|
|
212
370
|
* skill root's access.md. Two plugins linking the same root write the same
|
|
@@ -232,13 +390,28 @@ export class PluginLinksService {
|
|
|
232
390
|
];
|
|
233
391
|
}
|
|
234
392
|
|
|
235
|
-
|
|
393
|
+
/**
|
|
394
|
+
* The two lines, and a commit only if they were not already there — the
|
|
395
|
+
* `changed` check is what makes re-linking, Repair and the page-open repair
|
|
396
|
+
* idempotent rather than a stream of empty commits. Returns whether the
|
|
397
|
+
* file changed, so a caller can tell a repair that wrote from one that had
|
|
398
|
+
* nothing to write.
|
|
399
|
+
*/
|
|
400
|
+
private async grantTokens(
|
|
401
|
+
wsId: string,
|
|
402
|
+
user: AuthUser,
|
|
403
|
+
folder: string,
|
|
404
|
+
root: string,
|
|
405
|
+
summary?: string,
|
|
406
|
+
): Promise<boolean> {
|
|
236
407
|
const [read, write] = this.tokens(folder);
|
|
237
408
|
const a = await this.mutation.grant(wsId, 'folder', root, 'read', read);
|
|
238
409
|
const b = await this.mutation.grant(wsId, 'folder', root, 'write', write);
|
|
239
|
-
if (a.changed || b.changed)
|
|
240
|
-
|
|
241
|
-
|
|
410
|
+
if (!(a.changed || b.changed)) return false;
|
|
411
|
+
await this.commits.runPendingCommit(wsId, this.kb.defaultBranch, `${this.kbDirName}/${a.editPath}`, user, {
|
|
412
|
+
summary,
|
|
413
|
+
});
|
|
414
|
+
return true;
|
|
242
415
|
}
|
|
243
416
|
|
|
244
417
|
private rootOrThrow(raw: string): string {
|
|
@@ -345,6 +518,6 @@ export class PluginLinksService {
|
|
|
345
518
|
this.links.invalidate();
|
|
346
519
|
this.accessControl.invalidate(wsId);
|
|
347
520
|
this.onChanged?.();
|
|
348
|
-
this.events?.emit({ kind: 'fs-tree-changed', workspaceId: wsId, branch:
|
|
521
|
+
this.events?.emit({ kind: 'fs-tree-changed', workspaceId: wsId, branch: this.kb.defaultBranch });
|
|
349
522
|
}
|
|
350
523
|
}
|