@bevel-software/platform-core-backend 0.19.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 +45 -105
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +33 -5
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +146 -82
- package/dist/core/create-core-services.js.map +1 -1
- package/dist/core/lifecycle.d.ts +74 -28
- package/dist/core/lifecycle.d.ts.map +1 -1
- package/dist/core/lifecycle.js +157 -20
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/core/public-config.d.ts +5 -1
- package/dist/core/public-config.d.ts.map +1 -1
- package/dist/core/public-config.js +7 -5
- package/dist/core/public-config.js.map +1 -1
- package/dist/core-config.d.ts +95 -1
- package/dist/core-config.d.ts.map +1 -1
- package/dist/core-config.js +24 -8
- package/dist/core-config.js.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/modules/access/access-control.service.d.ts +18 -1
- package/dist/modules/access/access-control.service.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.js +19 -8
- package/dist/modules/access/access-control.service.js.map +1 -1
- package/dist/modules/access/access.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/audit/agent-audit.service.d.ts +54 -0
- package/dist/modules/audit/agent-audit.service.d.ts.map +1 -0
- package/dist/modules/audit/agent-audit.service.js +290 -0
- package/dist/modules/audit/agent-audit.service.js.map +1 -0
- package/dist/modules/audit/agent-rest-audit.middleware.d.ts +40 -0
- package/dist/modules/audit/agent-rest-audit.middleware.d.ts.map +1 -0
- package/dist/modules/audit/agent-rest-audit.middleware.js +75 -0
- package/dist/modules/audit/agent-rest-audit.middleware.js.map +1 -0
- package/dist/modules/audit/audit.contract.d.ts +145 -0
- package/dist/modules/audit/audit.contract.d.ts.map +1 -0
- package/dist/modules/audit/audit.contract.js +35 -0
- package/dist/modules/audit/audit.contract.js.map +1 -0
- package/dist/modules/audit/audit.routes.d.ts +21 -0
- package/dist/modules/audit/audit.routes.d.ts.map +1 -0
- package/dist/modules/audit/audit.routes.js +157 -0
- package/dist/modules/audit/audit.routes.js.map +1 -0
- package/dist/modules/audit/event-classifier.d.ts +52 -0
- package/dist/modules/audit/event-classifier.d.ts.map +1 -0
- package/dist/modules/audit/event-classifier.js +123 -0
- package/dist/modules/audit/event-classifier.js.map +1 -0
- package/dist/modules/audit/index.d.ts +7 -0
- package/dist/modules/audit/index.d.ts.map +1 -0
- package/dist/modules/audit/index.js +7 -0
- package/dist/modules/audit/index.js.map +1 -0
- package/dist/modules/audit/request-audit.d.ts +57 -0
- package/dist/modules/audit/request-audit.d.ts.map +1 -0
- package/dist/modules/audit/request-audit.js +117 -0
- package/dist/modules/audit/request-audit.js.map +1 -0
- 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/core-schema.d.ts +414 -0
- package/dist/modules/database/core-schema.d.ts.map +1 -1
- package/dist/modules/database/core-schema.js +99 -0
- package/dist/modules/database/core-schema.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/diff/diff.service.d.ts.map +1 -1
- package/dist/modules/diff/diff.service.js +6 -1
- package/dist/modules/diff/diff.service.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/kb-fs/git-guarded-filesystem.d.ts +9 -1
- package/dist/modules/kb-fs/git-guarded-filesystem.d.ts.map +1 -1
- package/dist/modules/kb-fs/git-guarded-filesystem.js +16 -3
- package/dist/modules/kb-fs/git-guarded-filesystem.js.map +1 -1
- package/dist/modules/mcp/mcp-auth.middleware.d.ts +1 -0
- package/dist/modules/mcp/mcp-auth.middleware.d.ts.map +1 -1
- package/dist/modules/mcp/mcp-auth.middleware.js +32 -0
- package/dist/modules/mcp/mcp-auth.middleware.js.map +1 -1
- package/dist/modules/mcp/mcp.routes.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.routes.js +8 -1
- package/dist/modules/mcp/mcp.routes.js.map +1 -1
- package/dist/modules/mcp/mcp.service.d.ts +16 -1
- package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.service.js +52 -9
- package/dist/modules/mcp/mcp.service.js.map +1 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts +59 -0
- package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts.map +1 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js +180 -8
- package/dist/modules/mcp/oauth/bevel-oauth-provider.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 +22 -10
- package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
- package/dist/modules/settings/deployment-settings.service.js +52 -28
- 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-auth/external-api-key.interface.d.ts +21 -5
- package/dist/modules/tool-auth/external-api-key.interface.d.ts.map +1 -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 +1 -0
- package/dist/modules/tool-auth/external-api-key.service.d.ts.map +1 -1
- package/dist/modules/tool-auth/external-api-key.service.js +22 -9
- package/dist/modules/tool-auth/external-api-key.service.js.map +1 -1
- package/dist/modules/tool-auth/internal-token.service.d.ts +10 -0
- package/dist/modules/tool-auth/internal-token.service.d.ts.map +1 -1
- package/dist/modules/tool-auth/internal-token.service.js +1 -0
- package/dist/modules/tool-auth/internal-token.service.js.map +1 -1
- package/dist/modules/tool-auth/tool-auth.middleware.d.ts +8 -0
- package/dist/modules/tool-auth/tool-auth.middleware.d.ts.map +1 -1
- package/dist/modules/tool-auth/tool-auth.middleware.js +9 -1
- package/dist/modules/tool-auth/tool-auth.middleware.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 +26 -12
- package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.service.js +41 -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 +69 -31
- 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-internals.d.ts +7 -1
- package/dist/shared/git-internals.d.ts.map +1 -1
- package/dist/shared/git-internals.js +67 -9
- package/dist/shared/git-internals.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 +41 -0
- package/migrations/0013_agent_identity_and_key_soft_delete.sql +29 -0
- package/migrations/meta/0012_snapshot.json +2247 -0
- package/migrations/meta/0013_snapshot.json +2259 -0
- package/migrations/meta/_journal.json +14 -0
- package/package.json +4 -4
- 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 +55 -106
- package/src/core/create-core-services.ts +193 -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/audit/__tests__/agent-audit.service.test.ts +370 -0
- package/src/modules/audit/__tests__/agent-rest-audit.middleware.test.ts +113 -0
- package/src/modules/audit/__tests__/audit.routes.test.ts +201 -0
- package/src/modules/audit/__tests__/event-classifier.test.ts +121 -0
- package/src/modules/audit/agent-audit.service.ts +316 -0
- package/src/modules/audit/agent-rest-audit.middleware.ts +83 -0
- package/src/modules/audit/audit.contract.ts +164 -0
- package/src/modules/audit/audit.routes.ts +168 -0
- package/src/modules/audit/event-classifier.ts +155 -0
- package/src/modules/audit/index.ts +14 -0
- package/src/modules/audit/request-audit.ts +141 -0
- 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/core-schema.ts +104 -0
- 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/diff/diff.service.ts +6 -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/kb-fs/git-guarded-filesystem.ts +16 -3
- package/src/modules/marketplace/__tests__/marketplace-repo.head.test.ts +2 -1
- package/src/modules/mcp/__tests__/bevel-oauth-provider.test.ts +183 -13
- package/src/modules/mcp/__tests__/mcp-auth.middleware.test.ts +60 -2
- package/src/modules/mcp/__tests__/mcp.routes.local-token.test.ts +24 -4
- package/src/modules/mcp/__tests__/mcp.routes.stateless.test.ts +1 -1
- package/src/modules/mcp/__tests__/mcp.service.test.ts +120 -3
- package/src/modules/mcp/mcp-auth.middleware.ts +31 -0
- package/src/modules/mcp/mcp.routes.ts +11 -1
- package/src/modules/mcp/mcp.service.ts +73 -8
- package/src/modules/mcp/oauth/bevel-oauth-provider.ts +184 -6
- 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 +59 -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 +68 -28
- 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-auth/__tests__/external-api-key.service.test.ts +29 -8
- package/src/modules/tool-auth/__tests__/internal-token.service.test.ts +6 -0
- package/src/modules/tool-auth/external-api-key.interface.ts +22 -5
- package/src/modules/tool-auth/external-api-key.service.ts +25 -8
- package/src/modules/tool-auth/internal-token.service.ts +11 -0
- package/src/modules/tool-auth/tool-auth.middleware.ts +17 -1
- 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 +144 -52
- 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 +39 -27
- package/src/modules/workspace/workspace.tools.ts +68 -31
- package/src/modules/workspace/write-denial.ts +7 -5
- package/src/shared/__tests__/git-internals.test.ts +41 -0
- package/src/shared/__tests__/kb-layout.plugin.test.ts +19 -16
- package/src/shared/git-internals.ts +61 -6
- 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
- package/dist/modules/access/access-errors.d.ts +0 -34
- package/dist/modules/access/access-errors.d.ts.map +0 -1
- package/dist/modules/access/access-errors.js +0 -40
- package/dist/modules/access/access-errors.js.map +0 -1
- package/dist/modules/access/access-splice.d.ts +0 -140
- package/dist/modules/access/access-splice.d.ts.map +0 -1
- package/dist/modules/access/access-splice.js +0 -389
- package/dist/modules/access/access-splice.js.map +0 -1
- package/dist/modules/access/group-files.d.ts +0 -83
- package/dist/modules/access/group-files.d.ts.map +0 -1
- package/dist/modules/access/group-files.js +0 -167
- package/dist/modules/access/group-files.js.map +0 -1
- package/dist/modules/access/kb-read-filter.d.ts +0 -41
- package/dist/modules/access/kb-read-filter.d.ts.map +0 -1
- package/dist/modules/access/kb-read-filter.js +0 -60
- package/dist/modules/access/kb-read-filter.js.map +0 -1
- package/dist/modules/access/render-roles-yaml.d.ts +0 -22
- package/dist/modules/access/render-roles-yaml.d.ts.map +0 -1
- package/dist/modules/access/render-roles-yaml.js +0 -56
- package/dist/modules/access/render-roles-yaml.js.map +0 -1
- package/dist/modules/access/roles-yaml-guard.d.ts +0 -56
- package/dist/modules/access/roles-yaml-guard.d.ts.map +0 -1
- package/dist/modules/access/roles-yaml-guard.js +0 -79
- package/dist/modules/access/roles-yaml-guard.js.map +0 -1
- package/dist/modules/diff/diff-paths.d.ts +0 -2
- package/dist/modules/diff/diff-paths.d.ts.map +0 -1
- package/dist/modules/diff/diff-paths.js +0 -9
- package/dist/modules/diff/diff-paths.js.map +0 -1
- package/dist/modules/groups/group-provision.service.d.ts +0 -130
- package/dist/modules/groups/group-provision.service.d.ts.map +0 -1
- package/dist/modules/groups/group-provision.service.js +0 -288
- package/dist/modules/groups/group-provision.service.js.map +0 -1
- package/dist/modules/groups/groups.contract.d.ts +0 -106
- package/dist/modules/groups/groups.contract.d.ts.map +0 -1
- package/dist/modules/groups/groups.contract.js +0 -36
- package/dist/modules/groups/groups.contract.js.map +0 -1
- package/dist/modules/groups/groups.routes.d.ts +0 -42
- package/dist/modules/groups/groups.routes.d.ts.map +0 -1
- package/dist/modules/groups/groups.routes.js +0 -379
- package/dist/modules/groups/groups.routes.js.map +0 -1
- package/dist/modules/groups/groups.service.d.ts +0 -60
- package/dist/modules/groups/groups.service.d.ts.map +0 -1
- package/dist/modules/groups/groups.service.js +0 -172
- package/dist/modules/groups/groups.service.js.map +0 -1
- package/dist/modules/groups/index.d.ts +0 -7
- package/dist/modules/groups/index.d.ts.map +0 -1
- package/dist/modules/groups/index.js +0 -6
- package/dist/modules/groups/index.js.map +0 -1
- package/dist/modules/groups/join-proposals.d.ts +0 -53
- package/dist/modules/groups/join-proposals.d.ts.map +0 -1
- package/dist/modules/groups/join-proposals.js +0 -67
- package/dist/modules/groups/join-proposals.js.map +0 -1
- package/dist/modules/groups/join-requests.service.d.ts +0 -81
- package/dist/modules/groups/join-requests.service.d.ts.map +0 -1
- package/dist/modules/groups/join-requests.service.js +0 -135
- package/dist/modules/groups/join-requests.service.js.map +0 -1
- package/dist/modules/mcp/mcp-session-store.d.ts +0 -74
- package/dist/modules/mcp/mcp-session-store.d.ts.map +0 -1
- package/dist/modules/mcp/mcp-session-store.js +0 -131
- package/dist/modules/mcp/mcp-session-store.js.map +0 -1
- package/dist/modules/workflow/file-change-notifier.d.ts +0 -38
- package/dist/modules/workflow/file-change-notifier.d.ts.map +0 -1
- package/dist/modules/workflow/file-change-notifier.js +0 -22
- package/dist/modules/workflow/file-change-notifier.js.map +0 -1
- package/dist/modules/workflow/git/branch-name.d.ts +0 -10
- package/dist/modules/workflow/git/branch-name.d.ts.map +0 -1
- package/dist/modules/workflow/git/branch-name.js +0 -76
- package/dist/modules/workflow/git/branch-name.js.map +0 -1
- package/dist/modules/workflow/git/clone-config.d.ts +0 -61
- package/dist/modules/workflow/git/clone-config.d.ts.map +0 -1
- package/dist/modules/workflow/git/clone-config.js +0 -69
- package/dist/modules/workflow/git/clone-config.js.map +0 -1
- package/dist/modules/workflow/git/mutex.d.ts +0 -11
- package/dist/modules/workflow/git/mutex.d.ts.map +0 -1
- package/dist/modules/workflow/git/mutex.js +0 -23
- package/dist/modules/workflow/git/mutex.js.map +0 -1
- package/dist/modules/workflow/locking-filesystem.d.ts +0 -137
- package/dist/modules/workflow/locking-filesystem.d.ts.map +0 -1
- package/dist/modules/workflow/locking-filesystem.js +0 -553
- package/dist/modules/workflow/locking-filesystem.js.map +0 -1
- package/dist/modules/workflow/read-only-filesystem.d.ts +0 -24
- package/dist/modules/workflow/read-only-filesystem.d.ts.map +0 -1
- package/dist/modules/workflow/read-only-filesystem.js +0 -39
- package/dist/modules/workflow/read-only-filesystem.js.map +0 -1
- package/dist/modules/workflow/workflow.errors.d.ts +0 -197
- package/dist/modules/workflow/workflow.errors.d.ts.map +0 -1
- package/dist/modules/workflow/workflow.errors.js +0 -298
- package/dist/modules/workflow/workflow.errors.js.map +0 -1
- package/dist/modules/workspace/bevel-ignore.d.ts +0 -30
- package/dist/modules/workspace/bevel-ignore.d.ts.map +0 -1
- package/dist/modules/workspace/bevel-ignore.js +0 -61
- package/dist/modules/workspace/bevel-ignore.js.map +0 -1
- package/dist/modules/workspace/kb-seed.interface.d.ts +0 -36
- package/dist/modules/workspace/kb-seed.interface.d.ts.map +0 -1
- package/dist/modules/workspace/kb-seed.interface.js +0 -2
- package/dist/modules/workspace/kb-seed.interface.js.map +0 -1
- package/dist/modules/workspace/kb-seed.service.d.ts +0 -125
- package/dist/modules/workspace/kb-seed.service.d.ts.map +0 -1
- package/dist/modules/workspace/kb-seed.service.js +0 -535
- package/dist/modules/workspace/kb-seed.service.js.map +0 -1
- package/dist/modules/workspace/plugins-migration.d.ts +0 -50
- package/dist/modules/workspace/plugins-migration.d.ts.map +0 -1
- package/dist/modules/workspace/plugins-migration.js +0 -379
- package/dist/modules/workspace/plugins-migration.js.map +0 -1
- package/dist/shared/fs-errors.d.ts +0 -8
- package/dist/shared/fs-errors.d.ts.map +0 -1
- package/dist/shared/fs-errors.js +0 -11
- package/dist/shared/fs-errors.js.map +0 -1
- package/dist/shared/fs-walk.d.ts +0 -23
- package/dist/shared/fs-walk.d.ts.map +0 -1
- package/dist/shared/fs-walk.js +0 -42
- package/dist/shared/fs-walk.js.map +0 -1
- package/dist/shared/hash-email.d.ts +0 -11
- package/dist/shared/hash-email.d.ts.map +0 -1
- package/dist/shared/hash-email.js +0 -14
- package/dist/shared/hash-email.js.map +0 -1
- package/dist/shared/kb-walk.d.ts +0 -52
- package/dist/shared/kb-walk.d.ts.map +0 -1
- package/dist/shared/kb-walk.js +0 -76
- package/dist/shared/kb-walk.js.map +0 -1
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
import { createHmac } from 'node:crypto';
|
|
16
16
|
import { TokenCrypto } from '../../shared/token-crypto.js';
|
|
17
17
|
import { assertKbDirNameFree } from '../kb-fs/repo-path.js';
|
|
18
|
+
import { parseRetentionWindow } from '../audit/audit.contract.js';
|
|
18
19
|
import { normalizeIssuerUrl } from './oidc-check.js';
|
|
19
20
|
|
|
20
21
|
/**
|
|
@@ -39,7 +40,7 @@ export interface SettingDef {
|
|
|
39
40
|
*/
|
|
40
41
|
envVar?: string;
|
|
41
42
|
/** Which block of the setup screen it belongs to. */
|
|
42
|
-
section: 'knowledge-base' | 'sign-in';
|
|
43
|
+
section: 'knowledge-base' | 'sign-in' | 'audit';
|
|
43
44
|
secret?: boolean;
|
|
44
45
|
/** Applied on save; the message is shown against the field. */
|
|
45
46
|
validate?(value: string): string | null;
|
|
@@ -49,6 +50,14 @@ export interface SettingDef {
|
|
|
49
50
|
* was copied into a service at construction is not.
|
|
50
51
|
*/
|
|
51
52
|
restartToApply?: boolean;
|
|
53
|
+
/**
|
|
54
|
+
* A blank field on save CLEARS the stored value, putting the default back.
|
|
55
|
+
* The rule everywhere else is that blank means "leave it alone" — a stray
|
|
56
|
+
* Enter must not unconfigure a repository — and that stays the rule; this
|
|
57
|
+
* is for a setting whose readers already treat "unset" as its default, so
|
|
58
|
+
* clearing it is the one way back to that default and never a loss.
|
|
59
|
+
*/
|
|
60
|
+
blankMeansDefault?: boolean;
|
|
52
61
|
/**
|
|
53
62
|
* What an UNSET setting already means to the code that reads it — the
|
|
54
63
|
* layout's defaults, the pointer consent's "on unless turned off".
|
|
@@ -172,7 +181,9 @@ export const CORE_SETTINGS: SettingDef[] = [
|
|
|
172
181
|
*/
|
|
173
182
|
key: 'agentsFile',
|
|
174
183
|
section: 'knowledge-base',
|
|
175
|
-
|
|
184
|
+
// Judged against the default roots here; the quartet check in `plan`
|
|
185
|
+
// judges it against the roots the same save puts in effect.
|
|
186
|
+
validate: (v) => validateAgentsFileName(v, DEFAULT_KB_LAYOUT),
|
|
176
187
|
restartToApply: true,
|
|
177
188
|
unsetMeans: DEFAULT_KB_LAYOUT.agentsFile,
|
|
178
189
|
},
|
|
@@ -285,6 +296,23 @@ export const CORE_SETTINGS: SettingDef[] = [
|
|
|
285
296
|
section: 'sign-in',
|
|
286
297
|
restartToApply: true,
|
|
287
298
|
},
|
|
299
|
+
|
|
300
|
+
{
|
|
301
|
+
/**
|
|
302
|
+
* How long the Audit log keeps an agent's events: a number of days, or
|
|
303
|
+
* — blank, zero, negative — forever. Read at every prune, so it applies
|
|
304
|
+
* without a restart. The window's rule lives with the audit service and
|
|
305
|
+
* is applied here on save and there on every read, so the environment
|
|
306
|
+
* variable is held to exactly what the Deployment page is. A blanked
|
|
307
|
+
* field clears the stored value, which is how "forever" is chosen back.
|
|
308
|
+
*/
|
|
309
|
+
key: 'auditRetentionDays',
|
|
310
|
+
envVar: 'AUDIT_RETENTION_DAYS',
|
|
311
|
+
section: 'audit',
|
|
312
|
+
blankMeansDefault: true,
|
|
313
|
+
validate: (v) =>
|
|
314
|
+
parseRetentionWindow(v) === null ? 'Enter a whole number of days, or 0 to keep events forever.' : null,
|
|
315
|
+
},
|
|
288
316
|
];
|
|
289
317
|
|
|
290
318
|
/**
|
|
@@ -396,11 +424,23 @@ export class DeploymentSettingsService {
|
|
|
396
424
|
private stored = new Map<string, string>();
|
|
397
425
|
private readonly crypto: TokenCrypto | null;
|
|
398
426
|
|
|
427
|
+
/**
|
|
428
|
+
* The environment the env-first layer reads. The process's own for a
|
|
429
|
+
* single-tenant deployment; a host serving several knowledge bases hands
|
|
430
|
+
* each graph one built from its tenant record, so a variable set on the
|
|
431
|
+
* host process can never leak into every tenant, and a record's values
|
|
432
|
+
* behave exactly as environment-pinned ones do (they win over the setup
|
|
433
|
+
* screen and the screen shows them as such).
|
|
434
|
+
*/
|
|
435
|
+
private readonly env: NodeJS.ProcessEnv;
|
|
436
|
+
|
|
399
437
|
constructor(
|
|
400
438
|
private readonly db: Database,
|
|
401
439
|
private readonly secretsEncKey: string,
|
|
402
440
|
defs: SettingDef[] = CORE_SETTINGS,
|
|
441
|
+
options: { env?: NodeJS.ProcessEnv } = {},
|
|
403
442
|
) {
|
|
443
|
+
this.env = options.env ?? process.env;
|
|
404
444
|
for (const def of defs) this.defs.set(def.key, def);
|
|
405
445
|
// No key configured means secrets cannot be stored — surfaced when someone
|
|
406
446
|
// tries, rather than pretended away by writing plaintext.
|
|
@@ -444,7 +484,7 @@ export class DeploymentSettingsService {
|
|
|
444
484
|
resolve(key: string): string {
|
|
445
485
|
const def = this.defs.get(key);
|
|
446
486
|
if (!def) return '';
|
|
447
|
-
const fromEnv = def.envVar ? (
|
|
487
|
+
const fromEnv = def.envVar ? (this.env[def.envVar] ?? '').trim() : '';
|
|
448
488
|
if (fromEnv) return fromEnv;
|
|
449
489
|
return (this.stored.get(key) ?? '').trim();
|
|
450
490
|
}
|
|
@@ -495,7 +535,7 @@ export class DeploymentSettingsService {
|
|
|
495
535
|
*/
|
|
496
536
|
async importLegacyLayoutEnv(): Promise<void> {
|
|
497
537
|
for (const [key, envVar] of Object.entries(LEGACY_LAYOUT_ENV_VARS)) {
|
|
498
|
-
const fromEnv = (
|
|
538
|
+
const fromEnv = (this.env[envVar] ?? '').trim();
|
|
499
539
|
if (!fromEnv) continue;
|
|
500
540
|
const saved = (this.stored.get(key) ?? '').trim();
|
|
501
541
|
if (saved) {
|
|
@@ -533,7 +573,7 @@ export class DeploymentSettingsService {
|
|
|
533
573
|
// A setting with no variable can never read `env`, whatever the process
|
|
534
574
|
// environment happens to hold — which is what makes the layout fields
|
|
535
575
|
// editable in the app on a deployment that still sets the old variables.
|
|
536
|
-
if (def.envVar && (
|
|
576
|
+
if (def.envVar && (this.env[def.envVar] ?? '').trim()) return 'env';
|
|
537
577
|
return (this.stored.get(key) ?? '').trim() ? 'stored' : 'unset';
|
|
538
578
|
}
|
|
539
579
|
|
|
@@ -577,10 +617,13 @@ export class DeploymentSettingsService {
|
|
|
577
617
|
entries: Record<string, string>,
|
|
578
618
|
updatedBy: string | null,
|
|
579
619
|
): Promise<{ restartRequired: boolean; restartKeys: string[] }> {
|
|
580
|
-
const toWrite = this.plan(entries);
|
|
620
|
+
const { toWrite, toClear } = this.plan(entries);
|
|
581
621
|
|
|
582
622
|
/** The settings this save changed that a running server cannot pick up. */
|
|
583
623
|
const restartKeys: string[] = [];
|
|
624
|
+
// A blanked blank-means-default setting: its row goes, and its readers
|
|
625
|
+
// are back on the default from the next read.
|
|
626
|
+
for (const key of toClear) await this.clear(key);
|
|
584
627
|
for (const { key, value, def } of toWrite) {
|
|
585
628
|
// Compared against the EFFECTIVE value: a setting that was unset was
|
|
586
629
|
// already running on whatever its readers make of "unset" — the layout
|
|
@@ -600,10 +643,9 @@ export class DeploymentSettingsService {
|
|
|
600
643
|
this.stored.set(key, value);
|
|
601
644
|
}
|
|
602
645
|
|
|
603
|
-
//
|
|
604
|
-
//
|
|
605
|
-
//
|
|
606
|
-
this.syncGitTokenEnv();
|
|
646
|
+
// A token saved here is in effect at once: the git runner's credentials
|
|
647
|
+
// read `resolve('gitToken')` on every call, so nothing is published to
|
|
648
|
+
// the process environment and no restart is needed.
|
|
607
649
|
return { restartRequired: restartKeys.length > 0, restartKeys };
|
|
608
650
|
}
|
|
609
651
|
|
|
@@ -615,14 +657,19 @@ export class DeploymentSettingsService {
|
|
|
615
657
|
* before letting the save happen.
|
|
616
658
|
*/
|
|
617
659
|
resolveAfter(entries: Record<string, string>): (key: string) => string {
|
|
618
|
-
const toWrite = this.plan(entries);
|
|
619
|
-
return (key) =>
|
|
660
|
+
const { toWrite, toClear } = this.plan(entries);
|
|
661
|
+
return (key) =>
|
|
662
|
+
toClear.includes(key) ? '' : (toWrite.find((w) => w.key === key)?.value ?? this.resolve(key));
|
|
620
663
|
}
|
|
621
664
|
|
|
622
|
-
/** Validate a batch and return the writes it amounts to; throws on any problem. */
|
|
623
|
-
private plan(entries: Record<string, string>): {
|
|
665
|
+
/** Validate a batch and return the writes (and the clears) it amounts to; throws on any problem. */
|
|
666
|
+
private plan(entries: Record<string, string>): {
|
|
667
|
+
toWrite: { key: string; value: string; def: SettingDef }[];
|
|
668
|
+
toClear: string[];
|
|
669
|
+
} {
|
|
624
670
|
const problems: Record<string, string> = {};
|
|
625
671
|
const toWrite: { key: string; value: string; def: SettingDef }[] = [];
|
|
672
|
+
const toClear: string[] = [];
|
|
626
673
|
|
|
627
674
|
for (const [key, raw] of Object.entries(entries)) {
|
|
628
675
|
const def = this.defs.get(key);
|
|
@@ -638,7 +685,12 @@ export class DeploymentSettingsService {
|
|
|
638
685
|
// An empty field means "leave it alone", not "erase it". Clearing a
|
|
639
686
|
// setting is not something the setup screen offers, and treating a blank
|
|
640
687
|
// input as a delete would let a stray Enter unconfigure a deployment.
|
|
641
|
-
|
|
688
|
+
// The one exception is a setting that SAYS a blank is its default (see
|
|
689
|
+
// `SettingDef.blankMeansDefault`): for it a blank clears the stored row.
|
|
690
|
+
if (!value) {
|
|
691
|
+
if (def.blankMeansDefault) toClear.push(key);
|
|
692
|
+
continue;
|
|
693
|
+
}
|
|
642
694
|
const problem = def.validate?.(value);
|
|
643
695
|
if (problem) {
|
|
644
696
|
problems[key] = problem;
|
|
@@ -722,7 +774,7 @@ export class DeploymentSettingsService {
|
|
|
722
774
|
}
|
|
723
775
|
|
|
724
776
|
if (Object.keys(problems).length > 0) throw new SettingsValidationError(problems);
|
|
725
|
-
return toWrite;
|
|
777
|
+
return { toWrite, toClear };
|
|
726
778
|
}
|
|
727
779
|
|
|
728
780
|
/** Drop stored rows for settings this build no longer defines. */
|
|
@@ -738,18 +790,6 @@ export class DeploymentSettingsService {
|
|
|
738
790
|
}
|
|
739
791
|
}
|
|
740
792
|
|
|
741
|
-
/**
|
|
742
|
-
* Publish the resolved git token as `GITHUB_TOKEN`, the name the credential
|
|
743
|
-
* helper and every redaction path already read. Only when the environment did
|
|
744
|
-
* not supply one — otherwise this would overwrite the operator's value with
|
|
745
|
-
* a stored fallback, inverting the precedence everything else here obeys.
|
|
746
|
-
*/
|
|
747
|
-
syncGitTokenEnv(): void {
|
|
748
|
-
if (this.sourceOf('gitToken') !== 'stored') return;
|
|
749
|
-
const token = this.resolve('gitToken');
|
|
750
|
-
if (token) process.env.GITHUB_TOKEN = token;
|
|
751
|
-
}
|
|
752
|
-
|
|
753
793
|
/** The single sign-on values in effect, issuer normalized the way the provider uses it. */
|
|
754
794
|
resolveOidcCredentials(): OidcCredentials {
|
|
755
795
|
return {
|
|
@@ -23,13 +23,11 @@ import {
|
|
|
23
23
|
type RepositoryConnection,
|
|
24
24
|
} from './connection-check.js';
|
|
25
25
|
import {
|
|
26
|
-
configureBranchModel,
|
|
27
|
-
configureKbLayout,
|
|
28
|
-
isBranchModelConfigured,
|
|
29
26
|
isDefaultKbLayout,
|
|
30
27
|
validateBranchModel,
|
|
31
28
|
validateKbLayout,
|
|
32
29
|
} from '@bevel-software/platform-shared';
|
|
30
|
+
import type { KbContext } from '../../shared/kb-context.js';
|
|
33
31
|
import { failureOf, type GitFailure } from '../../shared/git-failure.js';
|
|
34
32
|
import { redactSecret, urlQuerySecrets } from '../../shared/redact-secret.js';
|
|
35
33
|
import { listRootFolders, pickListingBranch } from './git-root-folders.js';
|
|
@@ -105,6 +103,12 @@ export function createSetupRoutes(
|
|
|
105
103
|
/** That failure classified, for the setup screen; absent, the message is read instead. */
|
|
106
104
|
lastFailureKind?(): GitFailure | null;
|
|
107
105
|
},
|
|
106
|
+
/**
|
|
107
|
+
* The knowledge base's context as the running graph holds it: the save
|
|
108
|
+
* that completes setup applies the branch model and the layout to it, so
|
|
109
|
+
* every service reads the admin's answer without a restart.
|
|
110
|
+
*/
|
|
111
|
+
kb: KbContext,
|
|
108
112
|
/**
|
|
109
113
|
* The remote-sync facts the Deployment page shows beside the sync secret:
|
|
110
114
|
* the address a webhook or pipeline must call, and what the last call did.
|
|
@@ -180,7 +184,7 @@ export function createSetupRoutes(
|
|
|
180
184
|
};
|
|
181
185
|
/** The app-gate answer: settings complete AND the KB phase settled clean, whoever ran it. */
|
|
182
186
|
const kbReady = () =>
|
|
183
|
-
isComplete(settings) && kbInit === null && kbInitInFlight === null && bootFailure() === null;
|
|
187
|
+
isComplete(settings, kb) && kbInit === null && kbInitInFlight === null && bootFailure() === null;
|
|
184
188
|
|
|
185
189
|
const requireAdmin: express.RequestHandler = async (req, res, next) => {
|
|
186
190
|
if (!(await adminAccess.isAdmin(req.userEmail))) {
|
|
@@ -215,7 +219,7 @@ export function createSetupRoutes(
|
|
|
215
219
|
}
|
|
216
220
|
res.json({
|
|
217
221
|
complete: kbReady(),
|
|
218
|
-
awaitingRestart: awaitingRestart(settings),
|
|
222
|
+
awaitingRestart: awaitingRestart(settings, kb),
|
|
219
223
|
isAdmin: true,
|
|
220
224
|
settings: settings.describe(),
|
|
221
225
|
oidcVerification: await settings.oidcVerification(),
|
|
@@ -261,7 +265,7 @@ export function createSetupRoutes(
|
|
|
261
265
|
// save that flips it false→true — whichever field arrives last — is the
|
|
262
266
|
// one that must run the KB startup phase, regardless of which save
|
|
263
267
|
// configured the branch model.
|
|
264
|
-
const wasComplete = isComplete(settings);
|
|
268
|
+
const wasComplete = isComplete(settings, kb);
|
|
265
269
|
if (!(await connectionHoldsFor(entries, wasComplete, res))) return;
|
|
266
270
|
const oidc = await signInHoldsFor(entries, res);
|
|
267
271
|
if (!oidc) return;
|
|
@@ -292,13 +296,13 @@ export function createSetupRoutes(
|
|
|
292
296
|
* capturing it at construction, which is what makes applying it here
|
|
293
297
|
* enough.
|
|
294
298
|
*/
|
|
295
|
-
if (!isBranchModelConfigured()) {
|
|
299
|
+
if (!kb.isBranchModelConfigured()) {
|
|
296
300
|
const model = {
|
|
297
301
|
defaultBranch: settings.resolve('defaultBranch'),
|
|
298
302
|
protectedBranches: settings.resolve('protectedBranches'),
|
|
299
303
|
};
|
|
300
304
|
if (!validateBranchModel(model)) {
|
|
301
|
-
|
|
305
|
+
kb.applyBranchModel(model);
|
|
302
306
|
branchModelApplied = true;
|
|
303
307
|
}
|
|
304
308
|
}
|
|
@@ -316,7 +320,7 @@ export function createSetupRoutes(
|
|
|
316
320
|
* on a re-save of a complete, healthy setup: with the gate open,
|
|
317
321
|
* sessions may be live and that is no longer a quiet moment.
|
|
318
322
|
*/
|
|
319
|
-
if ((!wasComplete || kbInit !== null || bootFailure() !== null) && isComplete(settings)) {
|
|
323
|
+
if ((!wasComplete || kbInit !== null || bootFailure() !== null) && isComplete(settings, kb)) {
|
|
320
324
|
/**
|
|
321
325
|
* The folder names, applied BEFORE the phase for the same reason as
|
|
322
326
|
* the branch model above: they are otherwise applied once at boot, so
|
|
@@ -327,10 +331,10 @@ export function createSetupRoutes(
|
|
|
327
331
|
* the names an earlier setup save applied before a run that failed:
|
|
328
332
|
* the gate never opened, so the retry initializes what is saved now.
|
|
329
333
|
*/
|
|
330
|
-
if (isDefaultKbLayout() || (kbInit !== null && layoutAppliedBySetup)) {
|
|
334
|
+
if (isDefaultKbLayout(kb.layout) || (kbInit !== null && layoutAppliedBySetup)) {
|
|
331
335
|
const layout = settings.resolveKbLayout();
|
|
332
336
|
if (!validateKbLayout(layout)) {
|
|
333
|
-
|
|
337
|
+
kb.applyLayout(layout);
|
|
334
338
|
layoutApplied = true;
|
|
335
339
|
layoutAppliedBySetup = true;
|
|
336
340
|
}
|
|
@@ -382,7 +386,7 @@ export function createSetupRoutes(
|
|
|
382
386
|
)
|
|
383
387
|
: restartRequired,
|
|
384
388
|
complete: kbReady(),
|
|
385
|
-
awaitingRestart: awaitingRestart(settings),
|
|
389
|
+
awaitingRestart: awaitingRestart(settings, kb),
|
|
386
390
|
settings: settings.describe(),
|
|
387
391
|
oidcVerification: await settings.oidcVerification(),
|
|
388
392
|
});
|
|
@@ -784,11 +788,17 @@ export function settingsAnswered(settings: DeploymentSettingsService): boolean {
|
|
|
784
788
|
* that puts it there. {@link awaitingRestart} is what tells the screen to ask
|
|
785
789
|
* for one rather than claim a field is missing.
|
|
786
790
|
*/
|
|
787
|
-
export function isComplete(
|
|
788
|
-
|
|
791
|
+
export function isComplete(
|
|
792
|
+
settings: DeploymentSettingsService,
|
|
793
|
+
kb: Pick<KbContext, 'isBranchModelConfigured'>,
|
|
794
|
+
): boolean {
|
|
795
|
+
return settingsAnswered(settings) && kb.isBranchModelConfigured();
|
|
789
796
|
}
|
|
790
797
|
|
|
791
798
|
/** Answered, but not yet in effect: everything is stored, the process is stale. */
|
|
792
|
-
export function awaitingRestart(
|
|
793
|
-
|
|
799
|
+
export function awaitingRestart(
|
|
800
|
+
settings: DeploymentSettingsService,
|
|
801
|
+
kb: Pick<KbContext, 'isBranchModelConfigured'>,
|
|
802
|
+
): boolean {
|
|
803
|
+
return settingsAnswered(settings) && !kb.isBranchModelConfigured();
|
|
794
804
|
}
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
} from '../allowed-tools-check.js';
|
|
8
8
|
import type { UtcpTool } from '../../tool-registry/tool.contract.js';
|
|
9
9
|
import type { ToolManualDetail, ToolManualSummary } from '../../tool-manuals/tool-manuals.contract.js';
|
|
10
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
10
11
|
|
|
11
12
|
const visible: VisibleTools = {
|
|
12
13
|
core: ['read_file', 'get_skill', 'list_skills'],
|
|
@@ -110,10 +111,10 @@ describe('checkAllowedTools', () => {
|
|
|
110
111
|
|
|
111
112
|
describe('skillFileRepoPath', () => {
|
|
112
113
|
test('recognises skill files under the plugin and skills roots only', () => {
|
|
113
|
-
expect(skillFileRepoPath(
|
|
114
|
-
expect(skillFileRepoPath(
|
|
115
|
-
expect(skillFileRepoPath(
|
|
116
|
-
expect(skillFileRepoPath(
|
|
114
|
+
expect(skillFileRepoPath(testKbContext(),'knowledge-base/Plugins/Sales/rfi/SKILL.md')).toBe('Plugins/Sales/rfi/SKILL.md');
|
|
115
|
+
expect(skillFileRepoPath(testKbContext(),'./knowledge-base/Skills/triage/SKILL.md')).toBe('Skills/triage/SKILL.md');
|
|
116
|
+
expect(skillFileRepoPath(testKbContext(),'knowledge-base/Plugins/Sales/rfi/notes.md')).toBeNull();
|
|
117
|
+
expect(skillFileRepoPath(testKbContext(),'knowledge-base/Data/SKILL.md')).toBeNull();
|
|
117
118
|
});
|
|
118
119
|
});
|
|
119
120
|
|
|
@@ -138,7 +139,7 @@ describe('AllowedToolsChecker', () => {
|
|
|
138
139
|
}
|
|
139
140
|
: null,
|
|
140
141
|
};
|
|
141
|
-
const checker = new AllowedToolsChecker(registry, manuals,
|
|
142
|
+
const checker = new AllowedToolsChecker(registry, manuals, testKbContext());
|
|
142
143
|
|
|
143
144
|
const skill = (tools: string) => `---\nname: rfi\ndescription: RFI.\nallowed-tools: ${tools}\n---\n\n# RFI\n`;
|
|
144
145
|
|
|
@@ -160,7 +161,7 @@ describe('AllowedToolsChecker', () => {
|
|
|
160
161
|
const broken = new AllowedToolsChecker(
|
|
161
162
|
{ listExternal: async () => { throw new Error('down'); } },
|
|
162
163
|
manuals,
|
|
163
|
-
|
|
164
|
+
testKbContext(),
|
|
164
165
|
);
|
|
165
166
|
await expect(
|
|
166
167
|
broken.checkSave('a@x.com', 'knowledge-base/Plugins/Sales/rfi/SKILL.md', skill('hubspot.serch')),
|
|
@@ -168,7 +169,7 @@ describe('AllowedToolsChecker', () => {
|
|
|
168
169
|
});
|
|
169
170
|
|
|
170
171
|
test('a capped capability list is treated as unknown, never as proof of absence', async () => {
|
|
171
|
-
const capped = new AllowedToolsChecker(registry, manuals,
|
|
172
|
+
const capped = new AllowedToolsChecker(registry, manuals, testKbContext(), 1);
|
|
172
173
|
expect(await capped.check('a@x.com', ['hubspot.whatever'])).toEqual([]);
|
|
173
174
|
});
|
|
174
175
|
|
|
@@ -179,7 +180,7 @@ describe('AllowedToolsChecker', () => {
|
|
|
179
180
|
const listExternal = vi.fn(registry.listExternal);
|
|
180
181
|
const listAccessible = vi.fn(manuals.listAccessible);
|
|
181
182
|
const getDetail = vi.fn(manuals.getDetail);
|
|
182
|
-
const spying = new AllowedToolsChecker({ listExternal }, { listAccessible, getDetail },
|
|
183
|
+
const spying = new AllowedToolsChecker({ listExternal }, { listAccessible, getDetail }, testKbContext());
|
|
183
184
|
|
|
184
185
|
expect(entries(await spying.check('alice@example.com', ['hubspot.serch']))).toEqual(['hubspot.serch']);
|
|
185
186
|
expect(listExternal).toHaveBeenCalledWith({ userEmail: 'alice@example.com' });
|
|
@@ -193,7 +194,7 @@ describe('AllowedToolsChecker', () => {
|
|
|
193
194
|
const listExternal = vi.fn(registry.listExternal);
|
|
194
195
|
const listAccessible = vi.fn(manuals.listAccessible);
|
|
195
196
|
const getDetail = vi.fn(manuals.getDetail);
|
|
196
|
-
const spying = new AllowedToolsChecker({ listExternal }, { listAccessible, getDetail },
|
|
197
|
+
const spying = new AllowedToolsChecker({ listExternal }, { listAccessible, getDetail }, testKbContext());
|
|
197
198
|
|
|
198
199
|
const results = await spying.checkSaves('a@x.com', [
|
|
199
200
|
{ path: 'knowledge-base/Plugins/Sales/rfi/SKILL.md', content: skill('hubspot.serch') },
|
|
@@ -214,7 +215,7 @@ describe('AllowedToolsChecker', () => {
|
|
|
214
215
|
const listExternal = vi.fn(registry.listExternal);
|
|
215
216
|
const listAccessible = vi.fn(manuals.listAccessible);
|
|
216
217
|
const getDetail = vi.fn(manuals.getDetail);
|
|
217
|
-
const spying = new AllowedToolsChecker({ listExternal }, { listAccessible, getDetail },
|
|
218
|
+
const spying = new AllowedToolsChecker({ listExternal }, { listAccessible, getDetail }, testKbContext());
|
|
218
219
|
|
|
219
220
|
expect(await spying.check('a@x.com', ['Bash', 'Read', 'Bash(git:*)', 'mcp__github__create_issue', 'shell'])).toEqual([]);
|
|
220
221
|
expect(listExternal).not.toHaveBeenCalled();
|
|
@@ -19,6 +19,7 @@ import type { ToolManualDetail, ToolManualSummary } from '../../tool-manuals/too
|
|
|
19
19
|
import { registerSkillsTools } from '../skills.tools.js';
|
|
20
20
|
import type { ISkillService } from '../skills.contract.js';
|
|
21
21
|
import { AllowedToolsChecker } from '../allowed-tools-check.js';
|
|
22
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
22
23
|
|
|
23
24
|
/**
|
|
24
25
|
* The agent surfaces end to end: a SKILL.md written through the file tools
|
|
@@ -41,7 +42,7 @@ const checker = new AllowedToolsChecker(
|
|
|
41
42
|
capabilities: [{ name: 'search', description: null }],
|
|
42
43
|
}),
|
|
43
44
|
},
|
|
44
|
-
KB_DIR,
|
|
45
|
+
testKbContext({ kbDirName: KB_DIR }),
|
|
45
46
|
);
|
|
46
47
|
|
|
47
48
|
/** What the tool handed the service on its last `getSkill` — the tool's one job is to pass it on. */
|
|
@@ -109,8 +110,8 @@ async function start(): Promise<string> {
|
|
|
109
110
|
const router = express.Router();
|
|
110
111
|
registerWorkspaceTools(
|
|
111
112
|
registry, router, fakeAuth, toolHandler,
|
|
112
|
-
new SpillStore(join(tmpdir(), 'bevel-test-spills')), new DocExtractService(join(tmpdir(), 'bevel-test-doc-extract')), allowAll, KB_DIR,
|
|
113
|
-
{ service: {} as never, enabled: false, kbDirName: KB_DIR, recoveryBotEmail: 'recovery-bot@bevel.local', hooks: new WorkflowHooks() },
|
|
113
|
+
new SpillStore(join(tmpdir(), 'bevel-test-spills')), new DocExtractService(join(tmpdir(), 'bevel-test-doc-extract')), allowAll, testKbContext({ kbDirName: KB_DIR }),
|
|
114
|
+
{ service: {} as never, enabled: false, kb: testKbContext({ kbDirName: KB_DIR }), recoveryBotEmail: 'recovery-bot@bevel.local', hooks: new WorkflowHooks() },
|
|
114
115
|
new RoutineWritePolicyService(),
|
|
115
116
|
{} as never,
|
|
116
117
|
checker,
|
|
@@ -5,6 +5,7 @@ import { hashEmail } from '../../../shared/email-identity.js';
|
|
|
5
5
|
import type { WorkspaceService } from '../../workspace/workspace.service.js';
|
|
6
6
|
import type { IAccessControl } from '../../access/access-control.interface.js';
|
|
7
7
|
import type { ISkillService, SkillSummary } from '../skills.contract.js';
|
|
8
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* The half of the catalog that is NOT on the default branch.
|
|
@@ -77,7 +78,7 @@ function harness(opts: {
|
|
|
77
78
|
listChangeRequests: async () => opts.crs,
|
|
78
79
|
} as unknown as IWorkflowService;
|
|
79
80
|
|
|
80
|
-
return new PendingSkillsService(workspaceService, accessControl, skillService, workflow);
|
|
81
|
+
return new PendingSkillsService(workspaceService, accessControl, skillService, workflow, testKbContext());
|
|
81
82
|
}
|
|
82
83
|
|
|
83
84
|
const ADMIN_WRITES = {
|
|
@@ -210,6 +211,7 @@ describe('PendingSkillsService', () => {
|
|
|
210
211
|
{} as unknown as IAccessControl,
|
|
211
212
|
{ listSkills: async () => [] } as unknown as ISkillService,
|
|
212
213
|
workflow,
|
|
214
|
+
testKbContext(),
|
|
213
215
|
);
|
|
214
216
|
await expect(svc.listPendingSkills(AUTHOR)).resolves.toEqual([]);
|
|
215
217
|
});
|
|
@@ -11,6 +11,7 @@ import type { IAccessControl } from '../../access/access-control.interface.js';
|
|
|
11
11
|
import type { JoinRequestsService } from '../../plugins/join-requests.service.js';
|
|
12
12
|
import type { ISkillService } from '../skills.contract.js';
|
|
13
13
|
import { createSkillAccessRequestRoutes } from '../skill-access-requests.routes.js';
|
|
14
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
14
15
|
|
|
15
16
|
/**
|
|
16
17
|
* The branch probe behind an access request: the listing is used to PROVE a
|
|
@@ -52,7 +53,7 @@ async function makeHarness(listBranches: IWorkflowService['listBranches']) {
|
|
|
52
53
|
workflow,
|
|
53
54
|
workspaceService,
|
|
54
55
|
joinRequests: { list: vi.fn(), reconcile: vi.fn() } as unknown as JoinRequestsService,
|
|
55
|
-
kbDirName: KB,
|
|
56
|
+
kb: testKbContext({ kbDirName: KB }),
|
|
56
57
|
resolveUser: async () => MIA,
|
|
57
58
|
}),
|
|
58
59
|
);
|
|
@@ -5,6 +5,7 @@ import '../../auth/auth.middleware.js'; // Express Request.userEmail augmentatio
|
|
|
5
5
|
import { createSkillsRoutes } from '../skills.routes.js';
|
|
6
6
|
import type { ISkillService } from '../skills.contract.js';
|
|
7
7
|
import type { IAllowedToolsChecker } from '../allowed-tools-check.js';
|
|
8
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* The browser's skill read carries the same `allowed-tools` warnings as
|
|
@@ -42,7 +43,7 @@ async function start(checker?: IAllowedToolsChecker): Promise<string> {
|
|
|
42
43
|
req.userEmail = EMAIL;
|
|
43
44
|
next();
|
|
44
45
|
});
|
|
45
|
-
app.use('/api', createSkillsRoutes(skillService, undefined, undefined, undefined, checker));
|
|
46
|
+
app.use('/api', createSkillsRoutes(skillService, testKbContext(), undefined, undefined, undefined, checker));
|
|
46
47
|
server = await new Promise<Server>((resolve) => {
|
|
47
48
|
const s = app.listen(0, () => resolve(s));
|
|
48
49
|
});
|
|
@@ -13,6 +13,7 @@ import { execFile } from 'node:child_process';
|
|
|
13
13
|
import { promisify } from 'node:util';
|
|
14
14
|
import { WorkflowHooks } from '../../workflow/workflow-hooks.js';
|
|
15
15
|
import { GitService } from '../../workflow/git/git.service.js';
|
|
16
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
16
17
|
|
|
17
18
|
const execFileAsync = promisify(execFile);
|
|
18
19
|
|
|
@@ -53,7 +54,7 @@ describe('SkillService', () => {
|
|
|
53
54
|
} as unknown as IAccessControl;
|
|
54
55
|
|
|
55
56
|
const svc = (access: IAccessControl = allowAll) =>
|
|
56
|
-
new SkillService(workspaceService, access, KB_DIR, new NodeFs());
|
|
57
|
+
new SkillService(workspaceService, access, testKbContext({ kbDirName: KB_DIR }), new NodeFs());
|
|
57
58
|
|
|
58
59
|
beforeEach(async () => {
|
|
59
60
|
root = await mkdtemp(join(tmpdir(), 'skills-'));
|
|
@@ -377,7 +378,7 @@ describe('SkillService', () => {
|
|
|
377
378
|
|
|
378
379
|
const versioned = (access: IAccessControl = allowAll) => {
|
|
379
380
|
const service = svc(access);
|
|
380
|
-
service.setHistory(new GitService(workspaceService, new WorkflowHooks(), KB_DIR));
|
|
381
|
+
service.setHistory(new GitService(workspaceService, new WorkflowHooks(), testKbContext({ kbDirName: KB_DIR })));
|
|
381
382
|
return service;
|
|
382
383
|
};
|
|
383
384
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { PLUGINS_DIR, SKILLS_DIR } from '@bevel-software/platform-shared';
|
|
2
1
|
import { logger } from '../../shared/logging.js';
|
|
2
|
+
import type { KbContext } from '../../shared/kb-context.js';
|
|
3
3
|
import type { IToolRegistry } from '../tool-registry/tool.contract.js';
|
|
4
4
|
import {
|
|
5
5
|
EXTERNAL_KB_MANUAL_NAME,
|
|
@@ -236,11 +236,12 @@ function editDistance(a: string, b: string): number {
|
|
|
236
236
|
* Accepts the workspace spelling (`<kbDirName>/Plugins/…`) the save
|
|
237
237
|
* surfaces receive.
|
|
238
238
|
*/
|
|
239
|
-
export function skillFileRepoPath(
|
|
239
|
+
export function skillFileRepoPath(kb: Pick<KbContext, 'kbDirName' | 'layout'>, workspacePath: string): string | null {
|
|
240
240
|
const parts = workspacePath.split('/').filter((p) => p && p !== '.');
|
|
241
|
-
if (parts[0] === kbDirName) parts.shift();
|
|
241
|
+
if (parts[0] === kb.kbDirName) parts.shift();
|
|
242
242
|
if (parts.length < 3 || parts[parts.length - 1] !== 'SKILL.md') return null;
|
|
243
|
-
|
|
243
|
+
const { pluginsDir, skillsDir } = kb.layout;
|
|
244
|
+
return parts[0] === pluginsDir || parts[0] === skillsDir ? parts.join('/') : null;
|
|
244
245
|
}
|
|
245
246
|
|
|
246
247
|
/** What the save surfaces and `get_skill` depend on. */
|
|
@@ -267,7 +268,7 @@ export class AllowedToolsChecker implements IAllowedToolsChecker {
|
|
|
267
268
|
constructor(
|
|
268
269
|
private readonly registry: Pick<IToolRegistry, 'listExternal'>,
|
|
269
270
|
private readonly manuals: Pick<IToolManualService, 'listAccessible' | 'getDetail'>,
|
|
270
|
-
private readonly
|
|
271
|
+
private readonly kb: Pick<KbContext, 'kbDirName' | 'layout'>,
|
|
271
272
|
/**
|
|
272
273
|
* The cap `getDetail` applies to a manual's capabilities. Taken from the
|
|
273
274
|
* projection itself: a copy of the number here would silently start
|
|
@@ -300,7 +301,7 @@ export class AllowedToolsChecker implements IAllowedToolsChecker {
|
|
|
300
301
|
* fail because a check could not run).
|
|
301
302
|
*/
|
|
302
303
|
private declaredTools(workspacePath: string, content: string): readonly string[] | undefined {
|
|
303
|
-
if (skillFileRepoPath(this.
|
|
304
|
+
if (skillFileRepoPath(this.kb, workspacePath) === null) return undefined;
|
|
304
305
|
try {
|
|
305
306
|
return parseSkillFrontmatter(content).allowedTools;
|
|
306
307
|
} catch (err) {
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
PLUGINS_DIR,
|
|
3
|
-
SKILLS_DIR,
|
|
4
|
-
} from '@bevel-software/platform-shared';
|
|
1
|
+
import type { KbLayout } from '@bevel-software/platform-shared';
|
|
5
2
|
import { type WorkspaceService } from '../workspace/workspace.service.js';
|
|
6
3
|
import type { IAccessControl } from '../access/access-control.interface.js';
|
|
4
|
+
import type { KbContext } from '../../shared/kb-context.js';
|
|
7
5
|
import { resolveDeclaredId } from '../../shared/frontmatter-id.js';
|
|
8
6
|
import { visibleProposedFiles } from '../../shared/pending-proposals.js';
|
|
9
7
|
import { isSafeSkillName, parseSkillFrontmatter } from './skills.service.js';
|
|
@@ -40,6 +38,7 @@ export class PendingSkillsService implements IPendingSkillService {
|
|
|
40
38
|
private readonly accessControl: IAccessControl,
|
|
41
39
|
private readonly skillService: ISkillService,
|
|
42
40
|
private readonly workflow: IWorkflowService,
|
|
41
|
+
private readonly kb: KbContext,
|
|
43
42
|
) {}
|
|
44
43
|
|
|
45
44
|
async listPendingSkills(userEmail: string): Promise<PendingSkill[]> {
|
|
@@ -54,14 +53,16 @@ export class PendingSkillsService implements IPendingSkillService {
|
|
|
54
53
|
return [];
|
|
55
54
|
}
|
|
56
55
|
|
|
56
|
+
const layout = this.kb.layout;
|
|
57
57
|
const proposed = await visibleProposedFiles(
|
|
58
58
|
{
|
|
59
59
|
workspaceService: this.workspaceService,
|
|
60
60
|
accessControl: this.accessControl,
|
|
61
61
|
workflow: this.workflow,
|
|
62
|
+
kb: this.kb,
|
|
62
63
|
},
|
|
63
64
|
userEmail,
|
|
64
|
-
(p) => isSkillDoc(p) && !released.has(folderOf(p)),
|
|
65
|
+
(p) => isSkillDoc(p, layout) && !released.has(folderOf(p)),
|
|
65
66
|
);
|
|
66
67
|
|
|
67
68
|
const out: PendingSkill[] = proposed.map(({ cr, path, content, isAuthor }) => {
|
|
@@ -96,12 +97,12 @@ export class PendingSkillsService implements IPendingSkillService {
|
|
|
96
97
|
* catalog already supports. `Plugins/<plugin>/SKILL.md` is NOT a skill — a plugin
|
|
97
98
|
* folder is not itself one.
|
|
98
99
|
*/
|
|
99
|
-
function isSkillDoc(repoRelPath: string): boolean {
|
|
100
|
+
function isSkillDoc(repoRelPath: string, layout: KbLayout): boolean {
|
|
100
101
|
const segments = repoRelPath.split('/');
|
|
101
102
|
if (segments[segments.length - 1] !== SKILL_DOC) return false;
|
|
102
103
|
// Under `Skills/` a skill may sit directly below the root: `Skills/<skill>/SKILL.md`.
|
|
103
|
-
if (segments[0] ===
|
|
104
|
-
return segments.length >= 4 && segments[0] ===
|
|
104
|
+
if (segments[0] === layout.skillsDir) return segments.length >= 3;
|
|
105
|
+
return segments.length >= 4 && segments[0] === layout.pluginsDir;
|
|
105
106
|
}
|
|
106
107
|
|
|
107
108
|
/** The skill folder holding a SKILL.md. */
|