@bevel-software/platform-core-backend 0.14.0 → 0.15.1
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/THIRD-PARTY-NOTICES.md +6 -6
- package/dist/core/catalog-cache-invalidation.d.ts +29 -0
- package/dist/core/catalog-cache-invalidation.d.ts.map +1 -0
- package/dist/core/catalog-cache-invalidation.js +71 -0
- package/dist/core/catalog-cache-invalidation.js.map +1 -0
- package/dist/core/create-core-server.d.ts.map +1 -1
- package/dist/core/create-core-server.js +99 -8
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +18 -1
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +96 -43
- package/dist/core/create-core-services.js.map +1 -1
- package/dist/modules/access/access-control.interface.d.ts +18 -6
- package/dist/modules/access/access-control.interface.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.d.ts +26 -1
- package/dist/modules/access/access-control.service.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.js +213 -71
- package/dist/modules/access/access-control.service.js.map +1 -1
- package/dist/modules/access/access.routes.d.ts.map +1 -1
- package/dist/modules/access/access.routes.js +59 -7
- package/dist/modules/access/access.routes.js.map +1 -1
- package/dist/modules/access-model/access-grammar.d.ts +51 -1
- package/dist/modules/access-model/access-grammar.d.ts.map +1 -1
- package/dist/modules/access-model/access-grammar.js +95 -1
- package/dist/modules/access-model/access-grammar.js.map +1 -1
- package/dist/modules/access-model/group-files.d.ts.map +1 -1
- package/dist/modules/access-model/group-files.js +4 -1
- package/dist/modules/access-model/group-files.js.map +1 -1
- package/dist/modules/access-model/plugin-principals.d.ts +49 -0
- package/dist/modules/access-model/plugin-principals.d.ts.map +1 -0
- package/dist/modules/access-model/plugin-principals.js +125 -0
- package/dist/modules/access-model/plugin-principals.js.map +1 -0
- package/dist/modules/database/core-schema.d.ts +326 -0
- package/dist/modules/database/core-schema.d.ts.map +1 -1
- package/dist/modules/database/core-schema.js +52 -0
- package/dist/modules/database/core-schema.js.map +1 -1
- package/dist/modules/kb-sync/index.d.ts +6 -0
- package/dist/modules/kb-sync/index.d.ts.map +1 -0
- package/dist/modules/kb-sync/index.js +5 -0
- package/dist/modules/kb-sync/index.js.map +1 -0
- package/dist/modules/kb-sync/kb-sync.interface.d.ts +77 -0
- package/dist/modules/kb-sync/kb-sync.interface.d.ts.map +1 -0
- package/dist/modules/kb-sync/kb-sync.interface.js +2 -0
- package/dist/modules/kb-sync/kb-sync.interface.js.map +1 -0
- package/dist/modules/kb-sync/kb-sync.routes.d.ts +70 -0
- package/dist/modules/kb-sync/kb-sync.routes.d.ts.map +1 -0
- package/dist/modules/kb-sync/kb-sync.routes.js +135 -0
- package/dist/modules/kb-sync/kb-sync.routes.js.map +1 -0
- package/dist/modules/kb-sync/kb-sync.service.d.ts +45 -0
- package/dist/modules/kb-sync/kb-sync.service.d.ts.map +1 -0
- package/dist/modules/kb-sync/kb-sync.service.js +183 -0
- package/dist/modules/kb-sync/kb-sync.service.js.map +1 -0
- package/dist/modules/kb-sync/sync-auth.d.ts +59 -0
- package/dist/modules/kb-sync/sync-auth.d.ts.map +1 -0
- package/dist/modules/kb-sync/sync-auth.js +62 -0
- package/dist/modules/kb-sync/sync-auth.js.map +1 -0
- package/dist/modules/kb-sync/sync-payload.d.ts +32 -0
- package/dist/modules/kb-sync/sync-payload.d.ts.map +1 -0
- package/dist/modules/kb-sync/sync-payload.js +105 -0
- package/dist/modules/kb-sync/sync-payload.js.map +1 -0
- package/dist/modules/marketplace/git-http.routes.d.ts +42 -0
- package/dist/modules/marketplace/git-http.routes.d.ts.map +1 -0
- package/dist/modules/marketplace/git-http.routes.js +190 -0
- package/dist/modules/marketplace/git-http.routes.js.map +1 -0
- package/dist/modules/marketplace/github-facade/github-facade-admin.routes.d.ts +23 -0
- package/dist/modules/marketplace/github-facade/github-facade-admin.routes.d.ts.map +1 -0
- package/dist/modules/marketplace/github-facade/github-facade-admin.routes.js +59 -0
- package/dist/modules/marketplace/github-facade/github-facade-admin.routes.js.map +1 -0
- package/dist/modules/marketplace/github-facade/github-facade-codes.store.d.ts +59 -0
- package/dist/modules/marketplace/github-facade/github-facade-codes.store.d.ts.map +1 -0
- package/dist/modules/marketplace/github-facade/github-facade-codes.store.js +96 -0
- package/dist/modules/marketplace/github-facade/github-facade-codes.store.js.map +1 -0
- package/dist/modules/marketplace/github-facade/github-facade-credentials.service.d.ts +99 -0
- package/dist/modules/marketplace/github-facade/github-facade-credentials.service.d.ts.map +1 -0
- package/dist/modules/marketplace/github-facade/github-facade-credentials.service.js +147 -0
- package/dist/modules/marketplace/github-facade/github-facade-credentials.service.js.map +1 -0
- package/dist/modules/marketplace/github-facade/github-facade.routes.d.ts +47 -0
- package/dist/modules/marketplace/github-facade/github-facade.routes.d.ts.map +1 -0
- package/dist/modules/marketplace/github-facade/github-facade.routes.js +228 -0
- package/dist/modules/marketplace/github-facade/github-facade.routes.js.map +1 -0
- package/dist/modules/marketplace/github-facade/github-facade.service.d.ts +109 -0
- package/dist/modules/marketplace/github-facade/github-facade.service.d.ts.map +1 -0
- package/dist/modules/marketplace/github-facade/github-facade.service.js +172 -0
- package/dist/modules/marketplace/github-facade/github-facade.service.js.map +1 -0
- package/dist/modules/marketplace/github-facade/index.d.ts +6 -0
- package/dist/modules/marketplace/github-facade/index.d.ts.map +1 -0
- package/dist/modules/marketplace/github-facade/index.js +6 -0
- package/dist/modules/marketplace/github-facade/index.js.map +1 -0
- package/dist/modules/marketplace/index.d.ts +4 -0
- package/dist/modules/marketplace/index.d.ts.map +1 -0
- package/dist/modules/marketplace/index.js +4 -0
- package/dist/modules/marketplace/index.js.map +1 -0
- package/dist/modules/marketplace/marketplace-repo.service.d.ts +122 -0
- package/dist/modules/marketplace/marketplace-repo.service.d.ts.map +1 -0
- package/dist/modules/marketplace/marketplace-repo.service.js +300 -0
- package/dist/modules/marketplace/marketplace-repo.service.js.map +1 -0
- package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts.map +1 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js +4 -0
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js.map +1 -1
- package/dist/modules/mcp/oauth/oauth-consent.routes.d.ts +14 -8
- package/dist/modules/mcp/oauth/oauth-consent.routes.d.ts.map +1 -1
- package/dist/modules/mcp/oauth/oauth-consent.routes.js +13 -1
- package/dist/modules/mcp/oauth/oauth-consent.routes.js.map +1 -1
- package/dist/modules/mcp/oauth/oauth-state.d.ts +13 -2
- package/dist/modules/mcp/oauth/oauth-state.d.ts.map +1 -1
- package/dist/modules/mcp/oauth/oauth-state.js +3 -1
- package/dist/modules/mcp/oauth/oauth-state.js.map +1 -1
- package/dist/modules/plugins/compile/compile-marketplace.d.ts +97 -0
- package/dist/modules/plugins/compile/compile-marketplace.d.ts.map +1 -0
- package/dist/modules/plugins/compile/compile-marketplace.js +240 -0
- package/dist/modules/plugins/compile/compile-marketplace.js.map +1 -0
- package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts +66 -0
- package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts.map +1 -0
- package/dist/modules/plugins/compile/marketplace-compiler.service.js +132 -0
- package/dist/modules/plugins/compile/marketplace-compiler.service.js.map +1 -0
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.d.ts +37 -0
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.d.ts.map +1 -0
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js +135 -0
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js.map +1 -0
- package/dist/modules/plugins/discovery/bundle-dialect/registry.d.ts +45 -0
- package/dist/modules/plugins/discovery/bundle-dialect/registry.d.ts.map +1 -0
- package/dist/modules/plugins/discovery/bundle-dialect/registry.js +147 -0
- package/dist/modules/plugins/discovery/bundle-dialect/registry.js.map +1 -0
- package/dist/modules/plugins/discovery/kb-plugin-source.d.ts +37 -0
- package/dist/modules/plugins/discovery/kb-plugin-source.d.ts.map +1 -0
- package/dist/modules/plugins/discovery/kb-plugin-source.js +107 -0
- package/dist/modules/plugins/discovery/kb-plugin-source.js.map +1 -0
- package/dist/modules/plugins/discovery/native.source.d.ts +15 -0
- package/dist/modules/plugins/discovery/native.source.d.ts.map +1 -0
- package/dist/modules/plugins/discovery/native.source.js +102 -0
- package/dist/modules/plugins/discovery/native.source.js.map +1 -0
- package/dist/modules/plugins/discovery/plugin-source.d.ts +96 -0
- package/dist/modules/plugins/discovery/plugin-source.d.ts.map +1 -0
- package/dist/modules/plugins/discovery/plugin-source.js +2 -0
- package/dist/modules/plugins/discovery/plugin-source.js.map +1 -0
- package/dist/modules/plugins/index.d.ts +10 -1
- package/dist/modules/plugins/index.d.ts.map +1 -1
- package/dist/modules/plugins/index.js +8 -0
- package/dist/modules/plugins/index.js.map +1 -1
- package/dist/modules/plugins/plugin-links.d.ts +66 -0
- package/dist/modules/plugins/plugin-links.d.ts.map +1 -0
- package/dist/modules/plugins/plugin-links.js +160 -0
- package/dist/modules/plugins/plugin-links.js.map +1 -0
- package/dist/modules/plugins/plugin-links.service.d.ts +114 -0
- package/dist/modules/plugins/plugin-links.service.d.ts.map +1 -0
- package/dist/modules/plugins/plugin-links.service.js +304 -0
- package/dist/modules/plugins/plugin-links.service.js.map +1 -0
- package/dist/modules/plugins/plugin-provision.service.d.ts +39 -3
- package/dist/modules/plugins/plugin-provision.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-provision.service.js +152 -52
- package/dist/modules/plugins/plugin-provision.service.js.map +1 -1
- package/dist/modules/plugins/plugin-rename.service.d.ts +69 -0
- package/dist/modules/plugins/plugin-rename.service.d.ts.map +1 -0
- package/dist/modules/plugins/plugin-rename.service.js +245 -0
- package/dist/modules/plugins/plugin-rename.service.js.map +1 -0
- package/dist/modules/plugins/plugins.contract.d.ts +27 -1
- package/dist/modules/plugins/plugins.contract.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.routes.d.ts +7 -1
- package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.routes.js +120 -12
- package/dist/modules/plugins/plugins.routes.js.map +1 -1
- package/dist/modules/plugins/plugins.service.d.ts +50 -3
- package/dist/modules/plugins/plugins.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.service.js +108 -47
- package/dist/modules/plugins/plugins.service.js.map +1 -1
- package/dist/modules/settings/deployment-settings.service.d.ts +9 -0
- package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
- package/dist/modules/settings/deployment-settings.service.js +82 -2
- package/dist/modules/settings/deployment-settings.service.js.map +1 -1
- package/dist/modules/settings/setup.routes.d.ts +26 -0
- package/dist/modules/settings/setup.routes.d.ts.map +1 -1
- package/dist/modules/settings/setup.routes.js +9 -1
- package/dist/modules/settings/setup.routes.js.map +1 -1
- package/dist/modules/skills/index.d.ts +1 -0
- package/dist/modules/skills/index.d.ts.map +1 -1
- package/dist/modules/skills/index.js +1 -0
- package/dist/modules/skills/index.js.map +1 -1
- package/dist/modules/skills/pending-skills.service.d.ts.map +1 -1
- package/dist/modules/skills/pending-skills.service.js +9 -4
- package/dist/modules/skills/pending-skills.service.js.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.d.ts +38 -0
- package/dist/modules/skills/skill-access-requests.routes.d.ts.map +1 -0
- package/dist/modules/skills/skill-access-requests.routes.js +168 -0
- package/dist/modules/skills/skill-access-requests.routes.js.map +1 -0
- package/dist/modules/skills/skills.contract.d.ts +31 -0
- package/dist/modules/skills/skills.contract.d.ts.map +1 -1
- package/dist/modules/skills/skills.routes.d.ts +28 -3
- package/dist/modules/skills/skills.routes.d.ts.map +1 -1
- package/dist/modules/skills/skills.routes.js +42 -3
- package/dist/modules/skills/skills.routes.js.map +1 -1
- package/dist/modules/skills/skills.service.d.ts +4 -0
- package/dist/modules/skills/skills.service.d.ts.map +1 -1
- package/dist/modules/skills/skills.service.js +83 -22
- package/dist/modules/skills/skills.service.js.map +1 -1
- package/dist/modules/tool-auth/external-api-key.interface.d.ts +18 -1
- package/dist/modules/tool-auth/external-api-key.interface.d.ts.map +1 -1
- package/dist/modules/tool-auth/external-api-key.interface.js +2 -1
- package/dist/modules/tool-auth/external-api-key.interface.js.map +1 -1
- package/dist/modules/tool-auth/external-api-key.service.d.ts +13 -4
- package/dist/modules/tool-auth/external-api-key.service.d.ts.map +1 -1
- package/dist/modules/tool-auth/external-api-key.service.js +26 -9
- package/dist/modules/tool-auth/external-api-key.service.js.map +1 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.d.ts +36 -0
- package/dist/modules/tool-manuals/mcp-json-discovery.d.ts.map +1 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.js +130 -92
- package/dist/modules/tool-manuals/mcp-json-discovery.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts +6 -1
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.js +18 -25
- package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
- package/dist/modules/workflow/git/git.service.d.ts +40 -2
- package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/git.service.js +227 -54
- package/dist/modules/workflow/git/git.service.js.map +1 -1
- package/dist/modules/workflow/git/pull-request.service.d.ts +6 -0
- package/dist/modules/workflow/git/pull-request.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/pull-request.service.js +8 -0
- package/dist/modules/workflow/git/pull-request.service.js.map +1 -1
- package/dist/modules/workflow/workflow.service.d.ts +52 -1
- package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.service.js +242 -9
- package/dist/modules/workflow/workflow.service.js.map +1 -1
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.d.ts +35 -0
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.d.ts.map +1 -0
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.js +121 -0
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.js.map +1 -0
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.js +46 -2
- package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.js +112 -25
- package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
- package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.routes.js +9 -9
- package/dist/modules/workspace/workspace.routes.js.map +1 -1
- package/dist/modules/workspace/workspace.service.d.ts +33 -0
- package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.service.js +110 -16
- package/dist/modules/workspace/workspace.service.js.map +1 -1
- package/dist/shared/domain-errors.d.ts +20 -0
- package/dist/shared/domain-errors.d.ts.map +1 -1
- package/dist/shared/domain-errors.js +29 -0
- package/dist/shared/domain-errors.js.map +1 -1
- package/dist/shared/fs-errors.d.ts +8 -0
- package/dist/shared/fs-errors.d.ts.map +1 -0
- package/dist/shared/fs-errors.js +11 -0
- package/dist/shared/fs-errors.js.map +1 -0
- package/dist/shared/fs-walk.d.ts +20 -6
- package/dist/shared/fs-walk.d.ts.map +1 -1
- package/dist/shared/fs-walk.js +35 -27
- package/dist/shared/fs-walk.js.map +1 -1
- package/dist/shared/kb-walk.d.ts +52 -0
- package/dist/shared/kb-walk.d.ts.map +1 -0
- package/dist/shared/kb-walk.js +76 -0
- package/dist/shared/kb-walk.js.map +1 -0
- package/dist/shared/path-order.d.ts +18 -0
- package/dist/shared/path-order.d.ts.map +1 -0
- package/dist/shared/path-order.js +35 -0
- package/dist/shared/path-order.js.map +1 -0
- package/dist/shared/ttl-cache.d.ts +28 -1
- package/dist/shared/ttl-cache.d.ts.map +1 -1
- package/dist/shared/ttl-cache.js +33 -1
- package/dist/shared/ttl-cache.js.map +1 -1
- package/kb-template/.bevelignore +1 -1
- package/kb-template/AGENTS.md +95 -30
- package/kb-template/Skills/.gitkeep +0 -0
- package/migrations/0005_github_facade.sql +25 -0
- package/migrations/meta/0005_snapshot.json +1717 -0
- package/migrations/meta/_journal.json +7 -0
- package/package.json +6 -6
- package/src/__tests__/kb-layout-config.test.ts +110 -0
- package/src/core/__tests__/catalog-cache-invalidation.test.ts +146 -0
- package/src/core/catalog-cache-invalidation.ts +92 -0
- package/src/core/create-core-server.ts +123 -7
- package/src/core/create-core-services.ts +162 -41
- package/src/modules/access/__tests__/access-control.invalidate-race.test.ts +86 -0
- package/src/modules/access/__tests__/access-control.service.test.ts +19 -3
- package/src/modules/access/__tests__/access-plugin-principals.test.ts +368 -0
- package/src/modules/access/__tests__/groups-admin.service.test.ts +8 -0
- package/src/modules/access/access-control.interface.ts +20 -9
- package/src/modules/access/access-control.service.ts +240 -78
- package/src/modules/access/access.routes.ts +96 -14
- package/src/modules/access-model/__tests__/access-grammar.test.ts +18 -0
- package/src/modules/access-model/__tests__/plugin-token-canonical.test.ts +40 -0
- package/src/modules/access-model/access-grammar.ts +114 -2
- package/src/modules/access-model/group-files.ts +4 -0
- package/src/modules/access-model/plugin-principals.ts +137 -0
- package/src/modules/database/core-schema.ts +54 -0
- package/src/modules/kb-sync/__tests__/kb-sync.routes.test.ts +297 -0
- package/src/modules/kb-sync/__tests__/kb-sync.service.test.ts +295 -0
- package/src/modules/kb-sync/__tests__/sync-auth.test.ts +118 -0
- package/src/modules/kb-sync/__tests__/sync-payload.test.ts +148 -0
- package/src/modules/kb-sync/index.ts +19 -0
- package/src/modules/kb-sync/kb-sync.interface.ts +79 -0
- package/src/modules/kb-sync/kb-sync.routes.ts +197 -0
- package/src/modules/kb-sync/kb-sync.service.ts +201 -0
- package/src/modules/kb-sync/sync-auth.ts +118 -0
- package/src/modules/kb-sync/sync-payload.ts +143 -0
- package/src/modules/marketplace/__tests__/github-facade.test.ts +443 -0
- package/src/modules/marketplace/__tests__/marketplace-git.test.ts +179 -0
- package/src/modules/marketplace/git-http.routes.ts +193 -0
- package/src/modules/marketplace/github-facade/github-facade-admin.routes.ts +78 -0
- package/src/modules/marketplace/github-facade/github-facade-codes.store.ts +145 -0
- package/src/modules/marketplace/github-facade/github-facade-credentials.service.ts +208 -0
- package/src/modules/marketplace/github-facade/github-facade.routes.ts +268 -0
- package/src/modules/marketplace/github-facade/github-facade.service.ts +221 -0
- package/src/modules/marketplace/github-facade/index.ts +25 -0
- package/src/modules/marketplace/index.ts +3 -0
- package/src/modules/marketplace/marketplace-repo.service.ts +337 -0
- package/src/modules/mcp/oauth/bevel-oauth-provider.ts +3 -0
- package/src/modules/mcp/oauth/oauth-consent.routes.ts +24 -2
- package/src/modules/mcp/oauth/oauth-state.ts +15 -3
- package/src/modules/plugins/__tests__/bundle-dialect.e2e.test.ts +163 -0
- package/src/modules/plugins/__tests__/compile-marketplace.test.ts +294 -0
- package/src/modules/plugins/__tests__/plugin-index.service.test.ts +56 -12
- package/src/modules/plugins/__tests__/plugin-links.service.test.ts +287 -0
- package/src/modules/plugins/__tests__/plugin-provision.service.test.ts +205 -5
- package/src/modules/plugins/__tests__/plugin-rename.service.test.ts +394 -0
- package/src/modules/plugins/__tests__/plugins.routes.test.ts +80 -33
- package/src/modules/plugins/compile/compile-marketplace.ts +403 -0
- package/src/modules/plugins/compile/marketplace-compiler.service.ts +150 -0
- package/src/modules/plugins/discovery/__tests__/kb-plugin-source.test.ts +329 -0
- package/src/modules/plugins/discovery/bundle-dialect/bundle.source.ts +140 -0
- package/src/modules/plugins/discovery/bundle-dialect/registry.ts +175 -0
- package/src/modules/plugins/discovery/kb-plugin-source.ts +114 -0
- package/src/modules/plugins/discovery/native.source.ts +122 -0
- package/src/modules/plugins/discovery/plugin-source.ts +99 -0
- package/src/modules/plugins/index.ts +10 -0
- package/src/modules/plugins/plugin-links.service.ts +363 -0
- package/src/modules/plugins/plugin-links.ts +184 -0
- package/src/modules/plugins/plugin-provision.service.ts +160 -54
- package/src/modules/plugins/plugin-rename.service.ts +298 -0
- package/src/modules/plugins/plugins.contract.ts +28 -1
- package/src/modules/plugins/plugins.routes.ts +128 -11
- package/src/modules/plugins/plugins.service.ts +106 -53
- package/src/modules/settings/__tests__/deployment-settings.service.test.ts +57 -0
- package/src/modules/settings/__tests__/setup.routes.sync-status.test.ts +77 -0
- package/src/modules/settings/deployment-settings.service.ts +95 -2
- package/src/modules/settings/setup.routes.ts +24 -0
- package/src/modules/skills/__tests__/skill-access-requests.routes.test.ts +128 -0
- package/src/modules/skills/__tests__/skills.service.test.ts +85 -0
- package/src/modules/skills/index.ts +1 -0
- package/src/modules/skills/pending-skills.service.ts +7 -5
- package/src/modules/skills/skill-access-requests.routes.ts +199 -0
- package/src/modules/skills/skills.contract.ts +32 -0
- package/src/modules/skills/skills.routes.ts +59 -3
- package/src/modules/skills/skills.service.ts +84 -22
- package/src/modules/tool-auth/external-api-key.interface.ts +20 -1
- package/src/modules/tool-auth/external-api-key.service.ts +31 -13
- package/src/modules/tool-manuals/__tests__/mcp-json-discovery.test.ts +24 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.cli.test.ts +2 -0
- package/src/modules/tool-manuals/mcp-json-discovery.ts +154 -88
- package/src/modules/tool-manuals/tool-manuals.service.ts +14 -23
- package/src/modules/workflow/__tests__/preserve-roles-yaml.test.ts +1 -1
- package/src/modules/workflow/__tests__/workflow.service.commitFileWhileLocked.test.ts +1 -0
- package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +2 -2
- package/src/modules/workflow/__tests__/workflow.service.releaseLock.test.ts +119 -2
- package/src/modules/workflow/__tests__/workflow.service.sync.test.ts +437 -0
- package/src/modules/workflow/git/__tests__/git.service.postMergePull.test.ts +3 -3
- package/src/modules/workflow/git/__tests__/git.service.pull.test.ts +47 -4
- package/src/modules/workflow/git/__tests__/git.service.syncFromRemote.test.ts +253 -0
- package/src/modules/workflow/git/git.service.ts +239 -56
- package/src/modules/workflow/git/pull-request.service.ts +9 -0
- package/src/modules/workflow/workflow.service.ts +260 -9
- package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +6 -7
- package/src/modules/workspace/__tests__/workspace.service.list-cloned.test.ts +93 -0
- package/src/modules/workspace/__tests__/workspace.service.missing-branch.test.ts +28 -0
- package/src/modules/workspace/__tests__/workspace.service.read-filter.test.ts +42 -12
- package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +219 -4
- package/src/modules/workspace/startup/steps/plugin-manifests.step.ts +129 -0
- package/src/modules/workspace/startup/steps/seed-tree.ts +44 -2
- package/src/modules/workspace/startup/steps/template-files.step.ts +131 -27
- package/src/modules/workspace/workspace.routes.ts +9 -17
- package/src/modules/workspace/workspace.service.ts +107 -16
- package/src/shared/__tests__/filename.test.ts +0 -0
- package/src/shared/__tests__/fs-walk.test.ts +22 -1
- package/src/shared/__tests__/kb-walk.test.ts +107 -0
- package/src/shared/__tests__/path-order.test.ts +24 -0
- package/src/shared/__tests__/ttl-cache.test.ts +55 -0
- package/src/shared/domain-errors.ts +29 -0
- package/src/shared/fs-errors.ts +10 -0
- package/src/shared/fs-walk.ts +38 -23
- package/src/shared/kb-walk.ts +95 -0
- package/src/shared/path-order.ts +33 -0
- package/src/shared/ttl-cache.ts +33 -1
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { DEFAULT_BRANCH, PLUGIN_MANIFEST_FILE, linkedSkillRoots, normalizeSkillRoot, pluginManifestName, renderPluginManifest, skillUnderRoot, withLinkedSkillRoots, } from '@bevel-software/platform-shared';
|
|
4
|
+
import { AccessMutationService, accessMdPathForFolder } from '../access/access-mutation.service.js';
|
|
5
|
+
import { pluginPrincipalKey } from '../access-model/access-grammar.js';
|
|
6
|
+
import { WorkspaceMutex } from '../kb-fs/mutex.js';
|
|
7
|
+
import { linksWorkspaceId } from './plugin-links.js';
|
|
8
|
+
/** A refusal the route passes through: message + HTTP status + a machine-readable kind. */
|
|
9
|
+
export class PluginLinkError extends Error {
|
|
10
|
+
status;
|
|
11
|
+
payload;
|
|
12
|
+
constructor(message, status, payload = {}) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.status = status;
|
|
15
|
+
this.payload = payload;
|
|
16
|
+
this.name = 'PluginLinkError';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Linking shared skills into plugins — the writer behind "add an existing
|
|
21
|
+
* skill to this plugin".
|
|
22
|
+
*
|
|
23
|
+
* A link is TWO edits that only make sense together:
|
|
24
|
+
*
|
|
25
|
+
* 1. the skill's root goes into the plugin manifest's
|
|
26
|
+
* `extensions["software.bevel.hexis"].skills` list (see
|
|
27
|
+
* `HEXIS_LINKED_SKILLS_KEY`), which is what the catalog, the plugin page
|
|
28
|
+
* and the compiled distribution read;
|
|
29
|
+
* 2. the skill folder's own `access.md` grants `read` to
|
|
30
|
+
* `plugin/<Name>/read` and `write` to `plugin/<Name>/write`, which is
|
|
31
|
+
* what lets the plugin's members actually read it — ownership decides,
|
|
32
|
+
* the plugin is a view (see `plugin-principals.ts`).
|
|
33
|
+
*
|
|
34
|
+
* Which is why linking needs write on BOTH sides: on the plugin folder (to
|
|
35
|
+
* edit its manifest) and on the skill's root (to edit its access rules). A
|
|
36
|
+
* manager who lacks the second gets a 409 the UI turns into "request write
|
|
37
|
+
* access", not a link that silently shares nothing.
|
|
38
|
+
*
|
|
39
|
+
* Unlinking removes the manifest entry, and revokes the two tokens only when
|
|
40
|
+
* the actor may edit the skill's rules — otherwise the grant stays, and the
|
|
41
|
+
* skill page says so, for a skill editor to remove.
|
|
42
|
+
*
|
|
43
|
+
* Repair re-grants the tokens for a link that exists but whose grant was
|
|
44
|
+
* hand-removed: the amber dot's one action.
|
|
45
|
+
*
|
|
46
|
+
* Every operation is serialised on BOTH sides it writes — the plugin's
|
|
47
|
+
* manifest slug (the same key provisioning locks on) and the skill root whose
|
|
48
|
+
* access.md carries the grant — and lands as ordinary default-branch commits
|
|
49
|
+
* through the pending-commit driver, so the write gate and the per-user push
|
|
50
|
+
* gate apply exactly as they do to any edit.
|
|
51
|
+
*/
|
|
52
|
+
export class PluginLinksService {
|
|
53
|
+
workspaceService;
|
|
54
|
+
commits;
|
|
55
|
+
accessControl;
|
|
56
|
+
skillService;
|
|
57
|
+
links;
|
|
58
|
+
kbDirName;
|
|
59
|
+
events;
|
|
60
|
+
onChanged;
|
|
61
|
+
locks = new WorkspaceMutex();
|
|
62
|
+
mutation;
|
|
63
|
+
constructor(workspaceService, commits, accessControl, skillService, links, kbDirName, events, onChanged) {
|
|
64
|
+
this.workspaceService = workspaceService;
|
|
65
|
+
this.commits = commits;
|
|
66
|
+
this.accessControl = accessControl;
|
|
67
|
+
this.skillService = skillService;
|
|
68
|
+
this.links = links;
|
|
69
|
+
this.kbDirName = kbDirName;
|
|
70
|
+
this.events = events;
|
|
71
|
+
this.onChanged = onChanged;
|
|
72
|
+
this.mutation = new AccessMutationService(workspaceService, accessControl, kbDirName);
|
|
73
|
+
}
|
|
74
|
+
async link(user, plugin, rawRoot) {
|
|
75
|
+
const folder = await this.pluginFolder(plugin);
|
|
76
|
+
const root = this.rootOrThrow(rawRoot);
|
|
77
|
+
const wsId = linksWorkspaceId();
|
|
78
|
+
await this.requirePluginWrite(wsId, user, folder);
|
|
79
|
+
const skills = await this.resolvedSkills(root);
|
|
80
|
+
if (skills.length === 0) {
|
|
81
|
+
throw new PluginLinkError(`"${root}" holds no released skill. Link a skill folder, or a folder that contains skills.`, 422, { kind: 'no-skills', root });
|
|
82
|
+
}
|
|
83
|
+
if (!(await this.accessControl.canWrite(wsId, user.email, accessMdPathForFolder(root)))) {
|
|
84
|
+
// The manager may edit the plugin but not the skill's rules — the link
|
|
85
|
+
// would share nothing. The UI offers the request path on this shape.
|
|
86
|
+
throw new PluginLinkError(`You can't change who may read "${root}". Ask its editors for write access first.`, 409, { kind: 'needs-skill-write', root });
|
|
87
|
+
}
|
|
88
|
+
return this.locks.runAll(this.lockKeys(folder, root), async () => {
|
|
89
|
+
const { manifest, manifestRel } = await this.readManifest(wsId, folder);
|
|
90
|
+
const roots = linkedSkillRoots(manifest);
|
|
91
|
+
// Manifest FIRST, grant second — two commits, deliberately in this
|
|
92
|
+
// order. The two files live in different folders and the commit
|
|
93
|
+
// pipeline is path-scoped, so there is no single commit to be had; what
|
|
94
|
+
// can be chosen is which half-state a failure leaves. Listed-but-not-
|
|
95
|
+
// shared is the visible one: the link index reports the missing grant,
|
|
96
|
+
// the card wears the amber dot, and Repair finishes the job. The other
|
|
97
|
+
// order would leave shared-but-not-listed — an over-share nothing
|
|
98
|
+
// surfaces.
|
|
99
|
+
if (!roots.includes(root)) {
|
|
100
|
+
await this.workspaceService.writeFile(wsId, manifestRel, `${JSON.stringify(withLinkedSkillRoots(manifest, [...roots, root]), null, 2)}\n`);
|
|
101
|
+
await this.commits.runPendingCommit(wsId, DEFAULT_BRANCH, manifestRel, user);
|
|
102
|
+
}
|
|
103
|
+
await this.grantTokens(wsId, user, folder, root);
|
|
104
|
+
this.changed(wsId);
|
|
105
|
+
return { root, skills };
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
async unlink(user, plugin, rawRoot) {
|
|
109
|
+
const folder = await this.pluginFolder(plugin);
|
|
110
|
+
const root = this.rootOrThrow(rawRoot);
|
|
111
|
+
const wsId = linksWorkspaceId();
|
|
112
|
+
await this.requirePluginWrite(wsId, user, folder);
|
|
113
|
+
return this.locks.runAll(this.lockKeys(folder, root), async () => {
|
|
114
|
+
const { manifest, manifestRel } = await this.readManifest(wsId, folder);
|
|
115
|
+
const roots = linkedSkillRoots(manifest);
|
|
116
|
+
if (!roots.includes(root)) {
|
|
117
|
+
throw new PluginLinkError(`"${root}" is not linked into ${folder}.`, 404, { kind: 'not-linked', root });
|
|
118
|
+
}
|
|
119
|
+
// Revoke FIRST, manifest second — the mirror of `link`'s ordering and
|
|
120
|
+
// for the same reason: a failure between the two must leave the
|
|
121
|
+
// visible half-state (listed, no grant → amber dot, Repair), never the
|
|
122
|
+
// silent one (unlisted, still shared). Revoke only where the actor may
|
|
123
|
+
// edit the skill's rules; otherwise the grant stays for a skill editor
|
|
124
|
+
// to remove — never a silent no-op that pretends it happened.
|
|
125
|
+
let revoked = false;
|
|
126
|
+
if (await this.accessControl.canWrite(wsId, user.email, accessMdPathForFolder(root))) {
|
|
127
|
+
let changed = false;
|
|
128
|
+
for (const principal of this.tokens(folder)) {
|
|
129
|
+
const r = await this.mutation.revoke(wsId, 'folder', root, principal, user.email, undefined, {
|
|
130
|
+
tokenMatch: 'exact',
|
|
131
|
+
});
|
|
132
|
+
changed ||= r.changed;
|
|
133
|
+
}
|
|
134
|
+
if (changed) {
|
|
135
|
+
await this.commits.runPendingCommit(wsId, DEFAULT_BRANCH, `${this.kbDirName}/${accessMdPathForFolder(root)}`, user);
|
|
136
|
+
}
|
|
137
|
+
revoked = true;
|
|
138
|
+
}
|
|
139
|
+
await this.workspaceService.writeFile(wsId, manifestRel, `${JSON.stringify(withLinkedSkillRoots(manifest, roots.filter((r) => r !== root)), null, 2)}\n`);
|
|
140
|
+
await this.commits.runPendingCommit(wsId, DEFAULT_BRANCH, manifestRel, user);
|
|
141
|
+
this.changed(wsId);
|
|
142
|
+
return { root, revoked };
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
async repair(user, plugin, rawRoot) {
|
|
146
|
+
const folder = await this.pluginFolder(plugin);
|
|
147
|
+
const root = this.rootOrThrow(rawRoot);
|
|
148
|
+
const wsId = linksWorkspaceId();
|
|
149
|
+
// Everything under the lock, the manifest read included: a repair that
|
|
150
|
+
// checked the link and then waited on an unlink would re-grant a root the
|
|
151
|
+
// manifest no longer names.
|
|
152
|
+
return this.locks.runAll(this.lockKeys(folder, root), async () => {
|
|
153
|
+
const { manifest } = await this.readManifest(wsId, folder);
|
|
154
|
+
if (!linkedSkillRoots(manifest).includes(root)) {
|
|
155
|
+
throw new PluginLinkError(`"${root}" is not linked into ${folder}.`, 404, { kind: 'not-linked', root });
|
|
156
|
+
}
|
|
157
|
+
if (!(await this.accessControl.canWrite(wsId, user.email, accessMdPathForFolder(root)))) {
|
|
158
|
+
throw new PluginLinkError(`You can't change who may read "${root}".`, 403, {
|
|
159
|
+
kind: 'needs-skill-write',
|
|
160
|
+
root,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
// The same retired-skill rule as `link`: a repair re-grants on the root.
|
|
164
|
+
await this.resolvedSkills(root);
|
|
165
|
+
await this.grantTokens(wsId, user, folder, root);
|
|
166
|
+
this.changed(wsId);
|
|
167
|
+
return { root };
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
// --- internal --------------------------------------------------------------
|
|
171
|
+
/**
|
|
172
|
+
* ONE reservation for both sides of a link: the plugin's manifest AND the
|
|
173
|
+
* skill root's access.md. Two plugins linking the same root write the same
|
|
174
|
+
* file, and serialising on the plugin alone let them interleave, one splice
|
|
175
|
+
* overwriting the other's grant. `runAll` takes both keys atomically, so
|
|
176
|
+
* nothing nests and no ordering discipline is needed.
|
|
177
|
+
*/
|
|
178
|
+
lockKeys(folder, root) {
|
|
179
|
+
return [`plugin:${pluginManifestName(folder)}`, `root:${root}`];
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* The two grants a link carries: members read, managers write — written as
|
|
183
|
+
* the CANONICAL keys (slugged name), the spelling every comparison uses, so
|
|
184
|
+
* a repeated link finds its grant and an unlink finds what to revoke
|
|
185
|
+
* whatever the folder is called.
|
|
186
|
+
*/
|
|
187
|
+
tokens(folder) {
|
|
188
|
+
const slug = pluginManifestName(folder);
|
|
189
|
+
return [
|
|
190
|
+
{ kind: 'role', role: pluginPrincipalKey(slug, 'read') },
|
|
191
|
+
{ kind: 'role', role: pluginPrincipalKey(slug, 'write') },
|
|
192
|
+
];
|
|
193
|
+
}
|
|
194
|
+
async grantTokens(wsId, user, folder, root) {
|
|
195
|
+
const [read, write] = this.tokens(folder);
|
|
196
|
+
const a = await this.mutation.grant(wsId, 'folder', root, 'read', read);
|
|
197
|
+
const b = await this.mutation.grant(wsId, 'folder', root, 'write', write);
|
|
198
|
+
if (a.changed || b.changed) {
|
|
199
|
+
await this.commits.runPendingCommit(wsId, DEFAULT_BRANCH, `${this.kbDirName}/${a.editPath}`, user);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
rootOrThrow(raw) {
|
|
203
|
+
const root = normalizeSkillRoot(raw);
|
|
204
|
+
if (root === null) {
|
|
205
|
+
throw new PluginLinkError('A skill path must be a repo-relative folder path.', 422, { kind: 'bad-root' });
|
|
206
|
+
}
|
|
207
|
+
return root;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Released skills under the root — the catalog's answer, not the file
|
|
211
|
+
* system's. A RETIRED skill is kept for its owners and never shared onward:
|
|
212
|
+
* the grant lands on the ROOT folder, so a root that holds a retired skill
|
|
213
|
+
* anywhere beneath it cannot be linked at all — the grant would reach the
|
|
214
|
+
* retired one too. The refusal names them so the manager can link the
|
|
215
|
+
* active skills individually instead.
|
|
216
|
+
*/
|
|
217
|
+
async resolvedSkills(root) {
|
|
218
|
+
const under = (await this.skillService.listSkills(undefined)).filter((s) => skillUnderRoot(s.path, root));
|
|
219
|
+
const retired = under.filter((s) => s.lifecycle === 'retired').map((s) => s.path);
|
|
220
|
+
if (retired.length > 0) {
|
|
221
|
+
throw new PluginLinkError(`"${root}" holds retired skills (${retired.join(', ')}); a retired skill is never shared onward. Link the active skills one by one.`, 422, { kind: 'retired-skills', root, retired });
|
|
222
|
+
}
|
|
223
|
+
return under.map((s) => s.path);
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* The exact on-disk plugin folder for `name`, or 404. Personal folders are
|
|
227
|
+
* not plugins, but that is the MEMBERSHIP's verdict (discovery marks the
|
|
228
|
+
* `personal-*` prefix personal only directly under the root), not a rule
|
|
229
|
+
* on the name — a nested plugin may be called anything.
|
|
230
|
+
*/
|
|
231
|
+
async pluginFolder(name) {
|
|
232
|
+
const trimmed = name.trim();
|
|
233
|
+
if (!trimmed || trimmed.includes('/') || trimmed.includes('\\')) {
|
|
234
|
+
throw new PluginLinkError('Unknown plugin', 404, { kind: 'unknown-plugin' });
|
|
235
|
+
}
|
|
236
|
+
const membership = await this.links.membership();
|
|
237
|
+
const links = membership.byPlugin.get(trimmed);
|
|
238
|
+
if (!links) {
|
|
239
|
+
throw new PluginLinkError('Unknown plugin', 404, { kind: 'unknown-plugin' });
|
|
240
|
+
}
|
|
241
|
+
if (!links.linksAreManaged) {
|
|
242
|
+
// A dialect plugin's links live in a file this platform does not write.
|
|
243
|
+
throw new PluginLinkError(`${trimmed} is read from an external plugin format; edit its links in that repository.`, 409, { kind: 'read-only-links' });
|
|
244
|
+
}
|
|
245
|
+
return trimmed;
|
|
246
|
+
}
|
|
247
|
+
/** The repo-relative folder of a known plugin (any depth). */
|
|
248
|
+
async folderOf(plugin) {
|
|
249
|
+
const links = (await this.links.membership()).byPlugin.get(plugin);
|
|
250
|
+
if (!links)
|
|
251
|
+
throw new PluginLinkError('Unknown plugin', 404, { kind: 'unknown-plugin' });
|
|
252
|
+
return links.folder;
|
|
253
|
+
}
|
|
254
|
+
async requirePluginWrite(wsId, user, plugin) {
|
|
255
|
+
if (!(await this.accessControl.canWrite(wsId, user.email, await this.folderOf(plugin)))) {
|
|
256
|
+
// Same answer as an unknown plugin, so probing confirms nothing.
|
|
257
|
+
throw new PluginLinkError('Unknown plugin', 404, { kind: 'unknown-plugin' });
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
async readManifest(wsId, plugin) {
|
|
261
|
+
const folder = await this.folderOf(plugin);
|
|
262
|
+
const manifestRel = `${this.kbDirName}/${folder}/${PLUGIN_MANIFEST_FILE}`;
|
|
263
|
+
const abs = path.join(await this.workspaceService.getWorkspacePath(wsId), manifestRel);
|
|
264
|
+
let manifest = null;
|
|
265
|
+
let text = null;
|
|
266
|
+
try {
|
|
267
|
+
text = await fs.readFile(abs, 'utf-8');
|
|
268
|
+
}
|
|
269
|
+
catch (err) {
|
|
270
|
+
// Only a PROVEN absence gets the fresh minimal manifest a pre-manifest
|
|
271
|
+
// folder deserves. Any other failure must surface: the caller writes the
|
|
272
|
+
// manifest back, and a skeleton over a real one would erase its
|
|
273
|
+
// version, description and MCP extension block.
|
|
274
|
+
const code = err?.code;
|
|
275
|
+
if (code !== 'ENOENT' && code !== 'ENOTDIR')
|
|
276
|
+
throw err;
|
|
277
|
+
}
|
|
278
|
+
if (text !== null) {
|
|
279
|
+
try {
|
|
280
|
+
const parsed = JSON.parse(text);
|
|
281
|
+
if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {
|
|
282
|
+
manifest = parsed;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
catch {
|
|
286
|
+
/* unparsable */
|
|
287
|
+
}
|
|
288
|
+
if (manifest === null) {
|
|
289
|
+
throw new PluginLinkError(`${manifestRel} is not a JSON object; fix the manifest before changing its links.`, 422, { kind: 'bad-manifest' });
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
return {
|
|
293
|
+
manifest: manifest ?? JSON.parse(renderPluginManifest(path.posix.basename(folder))),
|
|
294
|
+
manifestRel,
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
changed(wsId) {
|
|
298
|
+
this.links.invalidate();
|
|
299
|
+
this.accessControl.invalidate(wsId);
|
|
300
|
+
this.onChanged?.();
|
|
301
|
+
this.events?.emit({ kind: 'fs-tree-changed', workspaceId: wsId, branch: DEFAULT_BRANCH });
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
//# sourceMappingURL=plugin-links.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-links.service.js","sourceRoot":"","sources":["../../../src/modules/plugins/plugin-links.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
* body names its owner. Created lazily (ensure semantics) on the first
|
|
31
31
|
* personal skill.
|
|
32
32
|
*/
|
|
33
|
+
import type { PluginSource } from './discovery/plugin-source.js';
|
|
33
34
|
import { type AuthUser } from '@bevel-software/platform-shared';
|
|
34
35
|
import type { WorkspaceService } from '../workspace/workspace.service.js';
|
|
35
36
|
import type { IAccessControl } from '../access/access-control.interface.js';
|
|
@@ -42,6 +43,8 @@ export interface ProvisionCommitDriver {
|
|
|
42
43
|
export interface ProvisionedPlugin {
|
|
43
44
|
/** The folder name under `Plugins/` (not the full path). */
|
|
44
45
|
folder: string;
|
|
46
|
+
/** The plugin's identity — the manifest name written for it. */
|
|
47
|
+
name: string;
|
|
45
48
|
/** False when an ensure found the folder already there. */
|
|
46
49
|
created: boolean;
|
|
47
50
|
}
|
|
@@ -56,6 +59,8 @@ export declare class PluginProvisionService {
|
|
|
56
59
|
private readonly accessControl;
|
|
57
60
|
private readonly kbDirName;
|
|
58
61
|
private readonly events?;
|
|
62
|
+
/** Which names are TAKEN is discovery's answer — the same one every catalog gets. */
|
|
63
|
+
private readonly source;
|
|
59
64
|
/**
|
|
60
65
|
* Serialises creations and deletions by MANIFEST SLUG
|
|
61
66
|
* (`pluginManifestName(name)`). The wx write arbitrates same-path races,
|
|
@@ -71,7 +76,9 @@ export declare class PluginProvisionService {
|
|
|
71
76
|
workspaceId: string;
|
|
72
77
|
branch: string;
|
|
73
78
|
}): void;
|
|
74
|
-
} | undefined
|
|
79
|
+
} | undefined,
|
|
80
|
+
/** Which names are TAKEN is discovery's answer — the same one every catalog gets. */
|
|
81
|
+
source?: PluginSource);
|
|
75
82
|
/**
|
|
76
83
|
* Create `Plugins/<name>/` for `user`. Throws `PluginProvisionError` 422 on a
|
|
77
84
|
* name the filesystem or the model cannot carry, 409 when the name is taken
|
|
@@ -103,10 +110,39 @@ export declare class PluginProvisionService {
|
|
|
103
110
|
* never interleave with a re-creation of the same name (the key derives
|
|
104
111
|
* from the name, so both spell it identically).
|
|
105
112
|
*/
|
|
106
|
-
deletePlugin(user: AuthUser,
|
|
113
|
+
deletePlugin(user: AuthUser, rawFolder: string): Promise<void>;
|
|
114
|
+
/**
|
|
115
|
+
* Whether `segments` names a directory below `root` with every component
|
|
116
|
+
* spelled exactly as on disk — by listing each level, which is the one
|
|
117
|
+
* question a case-insensitive filesystem answers honestly.
|
|
118
|
+
*/
|
|
119
|
+
private exactFolderExists;
|
|
107
120
|
/** The taken name (in its on-disk casing) colliding with `name`, or null. */
|
|
108
121
|
private existingFolder;
|
|
109
|
-
/**
|
|
122
|
+
/**
|
|
123
|
+
* The identity discovery gives the plugin at `folder`, or the folder's own
|
|
124
|
+
* slug when it lists none there. ONE rule for every write provisioning
|
|
125
|
+
* makes — create, delete — as for the rename: no write over a discovery
|
|
126
|
+
* with a hole in it, whether or not the hole is where this plugin lives.
|
|
127
|
+
* An operation that parks and commits against an identity set it could
|
|
128
|
+
* not fully see is the class of mistake the rule exists to make impossible.
|
|
129
|
+
*/
|
|
130
|
+
private discoveredIdentity;
|
|
131
|
+
/** One discovery over the knowledge base checkout. */
|
|
132
|
+
private discovered;
|
|
133
|
+
/**
|
|
134
|
+
* An existing plugin — at ANY depth, in either file shape — whose identity
|
|
135
|
+
* folds to the same slug as `name`'s, as its repo-relative folder; or null.
|
|
136
|
+
* Discovery's answer, so creation and every catalog agree on what is taken:
|
|
137
|
+
* a nested plugin claims its identity as fully as a top-level one, and a
|
|
138
|
+
* parked delete (dot-prefixed, invisible to the walk) claims nothing.
|
|
139
|
+
* Personal folders count — they publish a plugin.json like any plugin
|
|
140
|
+
* (though the reservation above means a named plugin never reaches this
|
|
141
|
+
* check with a personal slug). A loose file at the root is not a plugin.
|
|
142
|
+
*
|
|
143
|
+
* Refuses on a HOLE: a listing that could not see part of the tree cannot
|
|
144
|
+
* prove a name free.
|
|
145
|
+
*/
|
|
110
146
|
private manifestNameTwin;
|
|
111
147
|
private provision;
|
|
112
148
|
private readyWorkspaceId;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-provision.service.d.ts","sourceRoot":"","sources":["../../../src/modules/plugins/plugin-provision.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;
|
|
1
|
+
{"version":3,"file":"plugin-provision.service.d.ts","sourceRoot":"","sources":["../../../src/modules/plugins/plugin-provision.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAMH,OAAO,KAAK,EAAa,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAG5E,OAAO,EAUL,KAAK,QAAQ,EACd,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAK5E,sFAAsF;AACtF,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,CACd,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,QAAQ,EACd,IAAI,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;KAAE,GACpC,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB;AA+BD,MAAM,WAAW,iBAAiB;IAChC,4DAA4D;IAC5D,MAAM,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,mEAAmE;AACnE,qBAAa,oBAAqB,SAAQ,KAAK;IAG3C,QAAQ,CAAC,MAAM,EAAE,MAAM;gBADvB,OAAO,EAAE,MAAM,EACN,MAAM,EAAE,MAAM;CAK1B;AAED,qBAAa,sBAAsB;IAY/B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IACxB,qFAAqF;IACrF,OAAO,CAAC,QAAQ,CAAC,MAAM;IAjBzB;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAwB;gBAG/B,gBAAgB,EAAE,gBAAgB,EAClC,OAAO,EAAE,qBAAqB,EAC9B,aAAa,EAAE,cAAc,EAC7B,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,KAAK,EAAE;YAAE,IAAI,EAAE,iBAAiB,CAAC;YAAC,WAAW,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAA;KAAE,YAAA;IACjH,qFAAqF;IACpE,MAAM,GAAE,YAAmC;IAG9D;;;;;OAKG;IACG,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAuD/E;;;OAGG;IACG,oBAAoB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAqBtE;;;;;;;;;;;;;;;;;;OAkBG;IACG,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA4FpE;;;;OAIG;YACW,iBAAiB;IAY/B,6EAA6E;YAC/D,cAAc;IAU5B;;;;;;;OAOG;YACW,kBAAkB;IAWhC,sDAAsD;YACxC,UAAU;IAMxB;;;;;;;;;;;;OAYG;YACW,gBAAgB;YAOhB,SAAS;YA4DT,gBAAgB;CAI/B;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAE/E;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAEjF"}
|