@bevel-software/platform-core-backend 0.25.2 → 0.27.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/agent-guide/access-control.md +251 -0
- package/agent-guide/conventions.md +35 -0
- package/agent-guide/directory-structure.md +145 -0
- package/agent-guide/finding-things.md +7 -0
- package/agent-guide/html-views.md +83 -0
- package/agent-guide/introduction.md +27 -0
- package/agent-guide/new-knowledge-base.md +24 -0
- package/agent-guide/skills.md +47 -0
- package/agent-guide/tool-manuals.md +227 -0
- package/agent-guide/where-a-new-file-goes.md +36 -0
- package/dist/assets.d.ts +26 -0
- package/dist/assets.d.ts.map +1 -1
- package/dist/assets.js +35 -2
- package/dist/assets.js.map +1 -1
- package/dist/core/catalog-revision.d.ts +19 -1
- package/dist/core/catalog-revision.d.ts.map +1 -1
- package/dist/core/catalog-revision.js +14 -3
- package/dist/core/catalog-revision.js.map +1 -1
- package/dist/core/core-ports.d.ts +11 -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 +5 -0
- package/dist/core/create-core-server.d.ts.map +1 -1
- package/dist/core/create-core-server.js +65 -3
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +35 -0
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +114 -12
- package/dist/core/create-core-services.js.map +1 -1
- package/dist/core/lifecycle.d.ts +16 -1
- package/dist/core/lifecycle.d.ts.map +1 -1
- package/dist/core/lifecycle.js +18 -1
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/core-config.d.ts +21 -0
- package/dist/core-config.d.ts.map +1 -1
- package/dist/core-config.js +22 -1
- package/dist/core-config.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/modules/access/access-control.interface.d.ts +17 -0
- package/dist/modules/access/access-control.interface.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.d.ts +2 -0
- package/dist/modules/access/access-control.service.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.js +27 -0
- package/dist/modules/access/access-control.service.js.map +1 -1
- package/dist/modules/access/directory-sync-bot.js +1 -1
- package/dist/modules/access/directory-sync-bot.js.map +1 -1
- package/dist/modules/agent-guide/agent-guide.d.ts +145 -0
- package/dist/modules/agent-guide/agent-guide.d.ts.map +1 -0
- package/dist/modules/agent-guide/agent-guide.js +199 -0
- package/dist/modules/agent-guide/agent-guide.js.map +1 -0
- package/dist/modules/agent-guide/agent-guide.tools.d.ts +24 -0
- package/dist/modules/agent-guide/agent-guide.tools.d.ts.map +1 -0
- package/dist/modules/agent-guide/agent-guide.tools.js +100 -0
- package/dist/modules/agent-guide/agent-guide.tools.js.map +1 -0
- package/dist/modules/agent-guide/index.d.ts +4 -0
- package/dist/modules/agent-guide/index.d.ts.map +1 -0
- package/dist/modules/agent-guide/index.js +4 -0
- package/dist/modules/agent-guide/index.js.map +1 -0
- package/dist/modules/agent-instructions/agent-instructions.routes.d.ts +3 -2
- package/dist/modules/agent-instructions/agent-instructions.routes.d.ts.map +1 -1
- package/dist/modules/agent-instructions/agent-instructions.routes.js +3 -2
- package/dist/modules/agent-instructions/agent-instructions.routes.js.map +1 -1
- package/dist/modules/agent-instructions/compose.d.ts +14 -6
- package/dist/modules/agent-instructions/compose.d.ts.map +1 -1
- package/dist/modules/agent-instructions/compose.js +28 -8
- package/dist/modules/agent-instructions/compose.js.map +1 -1
- package/dist/modules/agent-instructions/index.d.ts +1 -1
- package/dist/modules/agent-instructions/index.d.ts.map +1 -1
- package/dist/modules/agent-instructions/index.js +1 -1
- package/dist/modules/agent-instructions/index.js.map +1 -1
- package/dist/modules/agent-instructions/shared-file-rules.d.ts +10 -50
- package/dist/modules/agent-instructions/shared-file-rules.d.ts.map +1 -1
- package/dist/modules/agent-instructions/shared-file-rules.js +51 -104
- package/dist/modules/agent-instructions/shared-file-rules.js.map +1 -1
- package/dist/modules/audit/agent-audit.service.d.ts +21 -2
- package/dist/modules/audit/agent-audit.service.d.ts.map +1 -1
- package/dist/modules/audit/agent-audit.service.js +43 -2
- package/dist/modules/audit/agent-audit.service.js.map +1 -1
- package/dist/modules/audit/agent-connection.routes.d.ts +34 -0
- package/dist/modules/audit/agent-connection.routes.d.ts.map +1 -0
- package/dist/modules/audit/agent-connection.routes.js +38 -0
- package/dist/modules/audit/agent-connection.routes.js.map +1 -0
- package/dist/modules/audit/audit.contract.d.ts +24 -0
- package/dist/modules/audit/audit.contract.d.ts.map +1 -1
- package/dist/modules/audit/audit.contract.js.map +1 -1
- package/dist/modules/audit/index.d.ts +1 -0
- package/dist/modules/audit/index.d.ts.map +1 -1
- package/dist/modules/audit/index.js +1 -0
- package/dist/modules/audit/index.js.map +1 -1
- package/dist/modules/auth/account.routes.d.ts.map +1 -1
- package/dist/modules/auth/account.routes.js +10 -3
- package/dist/modules/auth/account.routes.js.map +1 -1
- package/dist/modules/auth/auth.middleware.d.ts +7 -0
- package/dist/modules/auth/auth.middleware.d.ts.map +1 -1
- package/dist/modules/auth/auth.middleware.js +1 -1
- package/dist/modules/auth/auth.middleware.js.map +1 -1
- package/dist/modules/code-mode/code-mode.tool.d.ts.map +1 -1
- package/dist/modules/code-mode/code-mode.tool.js +11 -3
- package/dist/modules/code-mode/code-mode.tool.js.map +1 -1
- package/dist/modules/database/core-schema.d.ts +96 -0
- package/dist/modules/database/core-schema.d.ts.map +1 -1
- package/dist/modules/database/core-schema.js +32 -3
- package/dist/modules/database/core-schema.js.map +1 -1
- package/dist/modules/embed/account-link.service.d.ts +42 -0
- package/dist/modules/embed/account-link.service.d.ts.map +1 -0
- package/dist/modules/embed/account-link.service.js +50 -0
- package/dist/modules/embed/account-link.service.js.map +1 -0
- package/dist/modules/embed/embed-link.d.ts +58 -0
- package/dist/modules/embed/embed-link.d.ts.map +1 -0
- package/dist/modules/embed/embed-link.js +160 -0
- package/dist/modules/embed/embed-link.js.map +1 -0
- package/dist/modules/embed/embed.errors.d.ts +30 -0
- package/dist/modules/embed/embed.errors.d.ts.map +1 -0
- package/dist/modules/embed/embed.errors.js +42 -0
- package/dist/modules/embed/embed.errors.js.map +1 -0
- package/dist/modules/embed/embed.interface.d.ts +204 -0
- package/dist/modules/embed/embed.interface.d.ts.map +1 -0
- package/dist/modules/embed/embed.interface.js +2 -0
- package/dist/modules/embed/embed.interface.js.map +1 -0
- package/dist/modules/embed/embed.routes.d.ts +59 -0
- package/dist/modules/embed/embed.routes.d.ts.map +1 -0
- package/dist/modules/embed/embed.routes.js +343 -0
- package/dist/modules/embed/embed.routes.js.map +1 -0
- package/dist/modules/embed/embed.service.d.ts +169 -0
- package/dist/modules/embed/embed.service.d.ts.map +1 -0
- package/dist/modules/embed/embed.service.js +627 -0
- package/dist/modules/embed/embed.service.js.map +1 -0
- package/dist/modules/embed/embed.tools.d.ts +51 -0
- package/dist/modules/embed/embed.tools.d.ts.map +1 -0
- package/dist/modules/embed/embed.tools.js +170 -0
- package/dist/modules/embed/embed.tools.js.map +1 -0
- package/dist/modules/embed/mcp-app.d.ts +64 -0
- package/dist/modules/embed/mcp-app.d.ts.map +1 -0
- package/dist/modules/embed/mcp-app.js +147 -0
- package/dist/modules/embed/mcp-app.js.map +1 -0
- package/dist/modules/embed/mcp-app.routes.d.ts +21 -0
- package/dist/modules/embed/mcp-app.routes.d.ts.map +1 -0
- package/dist/modules/embed/mcp-app.routes.js +36 -0
- package/dist/modules/embed/mcp-app.routes.js.map +1 -0
- package/dist/modules/github-app/github-app.connection.d.ts +15 -0
- package/dist/modules/github-app/github-app.connection.d.ts.map +1 -1
- package/dist/modules/github-app/github-app.connection.js +34 -3
- package/dist/modules/github-app/github-app.connection.js.map +1 -1
- package/dist/modules/kb-fs/locking-filesystem.d.ts +65 -0
- package/dist/modules/kb-fs/locking-filesystem.d.ts.map +1 -1
- package/dist/modules/kb-fs/locking-filesystem.js +300 -0
- package/dist/modules/kb-fs/locking-filesystem.js.map +1 -1
- package/dist/modules/kb-sync/kb-sync.interface.d.ts +5 -0
- package/dist/modules/kb-sync/kb-sync.interface.d.ts.map +1 -1
- package/dist/modules/kb-sync/kb-sync.service.d.ts.map +1 -1
- package/dist/modules/kb-sync/kb-sync.service.js +6 -0
- package/dist/modules/kb-sync/kb-sync.service.js.map +1 -1
- package/dist/modules/mcp/mcp-auth.middleware.d.ts.map +1 -1
- package/dist/modules/mcp/mcp-auth.middleware.js +2 -1
- package/dist/modules/mcp/mcp-auth.middleware.js.map +1 -1
- package/dist/modules/mcp/mcp.service.d.ts +57 -3
- package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.service.js +177 -24
- package/dist/modules/mcp/mcp.service.js.map +1 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts +24 -0
- package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts.map +1 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js +32 -4
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js.map +1 -1
- package/dist/modules/mcp/tool-schema-guard.d.ts +105 -0
- package/dist/modules/mcp/tool-schema-guard.d.ts.map +1 -0
- package/dist/modules/mcp/tool-schema-guard.js +171 -0
- package/dist/modules/mcp/tool-schema-guard.js.map +1 -0
- package/dist/modules/onboarding/onboarding.contract.d.ts +80 -0
- package/dist/modules/onboarding/onboarding.contract.d.ts.map +1 -0
- package/dist/modules/onboarding/onboarding.contract.js +7 -0
- package/dist/modules/onboarding/onboarding.contract.js.map +1 -0
- package/dist/modules/onboarding/onboarding.routes.d.ts +18 -0
- package/dist/modules/onboarding/onboarding.routes.d.ts.map +1 -0
- package/dist/modules/onboarding/onboarding.routes.js +81 -0
- package/dist/modules/onboarding/onboarding.routes.js.map +1 -0
- package/dist/modules/onboarding/starter-pack.service.d.ts +213 -0
- package/dist/modules/onboarding/starter-pack.service.d.ts.map +1 -0
- package/dist/modules/onboarding/starter-pack.service.js +492 -0
- package/dist/modules/onboarding/starter-pack.service.js.map +1 -0
- package/dist/modules/onboarding/starter-packs.d.ts +78 -0
- package/dist/modules/onboarding/starter-packs.d.ts.map +1 -0
- package/dist/modules/onboarding/starter-packs.js +156 -0
- package/dist/modules/onboarding/starter-packs.js.map +1 -0
- 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/plugin-provision.service.d.ts +19 -0
- package/dist/modules/plugins/plugin-provision.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-provision.service.js +18 -1
- package/dist/modules/plugins/plugin-provision.service.js.map +1 -1
- package/dist/modules/plugins/plugins.routes.d.ts +0 -36
- package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.routes.js +31 -0
- package/dist/modules/plugins/plugins.routes.js.map +1 -1
- package/dist/modules/plugins/plugins.tools.d.ts +36 -2
- package/dist/modules/plugins/plugins.tools.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.tools.js +71 -14
- package/dist/modules/plugins/plugins.tools.js.map +1 -1
- package/dist/modules/settings/deployment-settings.service.d.ts +34 -7
- package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
- package/dist/modules/settings/deployment-settings.service.js +148 -54
- package/dist/modules/settings/deployment-settings.service.js.map +1 -1
- package/dist/modules/settings/repository-source.d.ts +1 -0
- package/dist/modules/settings/repository-source.d.ts.map +1 -1
- package/dist/modules/settings/repository-source.js +3 -3
- package/dist/modules/settings/repository-source.js.map +1 -1
- package/dist/modules/settings/setup.routes.d.ts.map +1 -1
- package/dist/modules/settings/setup.routes.js +3 -6
- package/dist/modules/settings/setup.routes.js.map +1 -1
- package/dist/modules/skills/skills.tools.d.ts.map +1 -1
- package/dist/modules/skills/skills.tools.js +103 -43
- package/dist/modules/skills/skills.tools.js.map +1 -1
- package/dist/modules/tool-auth/connection-key-rejection.d.ts +10 -1
- package/dist/modules/tool-auth/connection-key-rejection.d.ts.map +1 -1
- package/dist/modules/tool-auth/connection-key-rejection.js +11 -3
- package/dist/modules/tool-auth/connection-key-rejection.js.map +1 -1
- package/dist/modules/tool-auth/external-api-key.interface.d.ts +8 -0
- package/dist/modules/tool-auth/external-api-key.interface.d.ts.map +1 -1
- package/dist/modules/tool-auth/external-api-key.service.d.ts +24 -2
- package/dist/modules/tool-auth/external-api-key.service.d.ts.map +1 -1
- package/dist/modules/tool-auth/external-api-key.service.js +59 -2
- package/dist/modules/tool-auth/external-api-key.service.js.map +1 -1
- package/dist/modules/tool-auth/tool-auth.middleware.d.ts.map +1 -1
- package/dist/modules/tool-auth/tool-auth.middleware.js +9 -4
- package/dist/modules/tool-auth/tool-auth.middleware.js.map +1 -1
- package/dist/modules/tool-helpers/index.d.ts +28 -1
- package/dist/modules/tool-helpers/index.d.ts.map +1 -1
- package/dist/modules/tool-helpers/index.js +28 -1
- package/dist/modules/tool-helpers/index.js.map +1 -1
- package/dist/modules/tool-helpers/route-argument-check.d.ts +10 -0
- package/dist/modules/tool-helpers/route-argument-check.d.ts.map +1 -0
- package/dist/modules/tool-helpers/route-argument-check.js +132 -0
- package/dist/modules/tool-helpers/route-argument-check.js.map +1 -0
- package/dist/modules/tool-helpers/route-tool-schemas.d.ts +89 -0
- package/dist/modules/tool-helpers/route-tool-schemas.d.ts.map +1 -0
- package/dist/modules/tool-helpers/route-tool-schemas.js +113 -0
- package/dist/modules/tool-helpers/route-tool-schemas.js.map +1 -0
- package/dist/modules/tool-helpers/tool-def.d.ts +71 -0
- package/dist/modules/tool-helpers/tool-def.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-def.js +70 -6
- package/dist/modules/tool-helpers/tool-def.js.map +1 -1
- package/dist/modules/tool-helpers/tool-handler.d.ts +46 -6
- package/dist/modules/tool-helpers/tool-handler.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-handler.js +157 -8
- package/dist/modules/tool-helpers/tool-handler.js.map +1 -1
- package/dist/modules/tool-helpers/tool.contract.d.ts +9 -0
- package/dist/modules/tool-helpers/tool.contract.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool.contract.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.contract.d.ts +23 -4
- package/dist/modules/tool-manuals/tool-manuals.contract.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.contract.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts +4 -0
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.js +14 -0
- package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +7 -0
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.js +77 -38
- package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
- package/dist/modules/tool-registry/description-length.d.ts +20 -16
- package/dist/modules/tool-registry/description-length.d.ts.map +1 -1
- package/dist/modules/tool-registry/description-length.js +50 -30
- package/dist/modules/tool-registry/description-length.js.map +1 -1
- package/dist/modules/tool-registry/guide-first.d.ts +27 -0
- package/dist/modules/tool-registry/guide-first.d.ts.map +1 -0
- package/dist/modules/tool-registry/guide-first.js +40 -0
- package/dist/modules/tool-registry/guide-first.js.map +1 -0
- package/dist/modules/tool-registry/tool-registry.d.ts +6 -0
- package/dist/modules/tool-registry/tool-registry.d.ts.map +1 -1
- package/dist/modules/tool-registry/tool-registry.js +9 -2
- package/dist/modules/tool-registry/tool-registry.js.map +1 -1
- package/dist/modules/workflow/agent-tools/change-request-read-shape.d.ts +449 -0
- package/dist/modules/workflow/agent-tools/change-request-read-shape.d.ts.map +1 -0
- package/dist/modules/workflow/agent-tools/change-request-read-shape.js +481 -0
- package/dist/modules/workflow/agent-tools/change-request-read-shape.js.map +1 -0
- package/dist/modules/workflow/agent-tools/change-request-read.tools.d.ts +126 -0
- package/dist/modules/workflow/agent-tools/change-request-read.tools.d.ts.map +1 -0
- package/dist/modules/workflow/agent-tools/change-request-read.tools.js +611 -0
- package/dist/modules/workflow/agent-tools/change-request-read.tools.js.map +1 -0
- package/dist/modules/workflow/agent-tools/change-request-summary.d.ts +12 -1
- package/dist/modules/workflow/agent-tools/change-request-summary.d.ts.map +1 -1
- package/dist/modules/workflow/agent-tools/change-request-summary.js +5 -1
- package/dist/modules/workflow/agent-tools/change-request-summary.js.map +1 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts +8 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.js +133 -37
- package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
- package/dist/modules/workflow/file-lock.service.d.ts +29 -5
- package/dist/modules/workflow/file-lock.service.d.ts.map +1 -1
- package/dist/modules/workflow/file-lock.service.js +62 -5
- package/dist/modules/workflow/file-lock.service.js.map +1 -1
- package/dist/modules/workflow/git/git.service.d.ts +282 -14
- package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/git.service.js +627 -126
- package/dist/modules/workflow/git/git.service.js.map +1 -1
- package/dist/modules/workflow/git/merge-commit.d.ts +73 -0
- package/dist/modules/workflow/git/merge-commit.d.ts.map +1 -0
- package/dist/modules/workflow/git/merge-commit.js +89 -0
- package/dist/modules/workflow/git/merge-commit.js.map +1 -0
- package/dist/modules/workflow/git/node-git-runner.d.ts +15 -0
- package/dist/modules/workflow/git/node-git-runner.d.ts.map +1 -1
- package/dist/modules/workflow/git/node-git-runner.js +78 -6
- package/dist/modules/workflow/git/node-git-runner.js.map +1 -1
- package/dist/modules/workflow/git/pull-request.service.d.ts +94 -1
- package/dist/modules/workflow/git/pull-request.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/pull-request.service.js +332 -37
- package/dist/modules/workflow/git/pull-request.service.js.map +1 -1
- package/dist/modules/workflow/pending-commits.service.d.ts +15 -0
- package/dist/modules/workflow/pending-commits.service.d.ts.map +1 -1
- package/dist/modules/workflow/pending-commits.service.js +25 -1
- package/dist/modules/workflow/pending-commits.service.js.map +1 -1
- package/dist/modules/workflow/pending-commits.worker.d.ts +6 -1
- package/dist/modules/workflow/pending-commits.worker.d.ts.map +1 -1
- package/dist/modules/workflow/pending-commits.worker.js +23 -6
- package/dist/modules/workflow/pending-commits.worker.js.map +1 -1
- package/dist/modules/workflow/recovery-bot.js +1 -1
- package/dist/modules/workflow/recovery-bot.js.map +1 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts +35 -0
- package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.js +180 -13
- package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +1 -1
- package/dist/modules/workflow/sanitize-error.d.ts +16 -0
- package/dist/modules/workflow/sanitize-error.d.ts.map +1 -1
- package/dist/modules/workflow/sanitize-error.js +45 -0
- package/dist/modules/workflow/sanitize-error.js.map +1 -1
- package/dist/modules/workflow/workflow.routes.d.ts +6 -2
- package/dist/modules/workflow/workflow.routes.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.routes.js +7 -2
- package/dist/modules/workflow/workflow.routes.js.map +1 -1
- package/dist/modules/workflow/workflow.service.d.ts +187 -15
- package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.service.js +808 -106
- package/dist/modules/workflow/workflow.service.js.map +1 -1
- package/dist/modules/workspace/agent-download.builder.d.ts +105 -0
- package/dist/modules/workspace/agent-download.builder.d.ts.map +1 -0
- package/dist/modules/workspace/agent-download.builder.js +238 -0
- package/dist/modules/workspace/agent-download.builder.js.map +1 -0
- package/dist/modules/workspace/agent-download.routes.d.ts +77 -0
- package/dist/modules/workspace/agent-download.routes.d.ts.map +1 -0
- package/dist/modules/workspace/agent-download.routes.js +156 -0
- package/dist/modules/workspace/agent-download.routes.js.map +1 -0
- package/dist/modules/workspace/agent-download.store.d.ts +225 -0
- package/dist/modules/workspace/agent-download.store.d.ts.map +1 -0
- package/dist/modules/workspace/agent-download.store.js +423 -0
- package/dist/modules/workspace/agent-download.store.js.map +1 -0
- package/dist/modules/workspace/agent-upload.store.d.ts +10 -1
- package/dist/modules/workspace/agent-upload.store.d.ts.map +1 -1
- package/dist/modules/workspace/agent-upload.store.js +16 -6
- package/dist/modules/workspace/agent-upload.store.js.map +1 -1
- package/dist/modules/workspace/file-readers/raw-mime.d.ts +6 -0
- package/dist/modules/workspace/file-readers/raw-mime.d.ts.map +1 -0
- package/dist/modules/workspace/file-readers/raw-mime.js +38 -0
- package/dist/modules/workspace/file-readers/raw-mime.js.map +1 -0
- package/dist/modules/workspace/file-readers/text-reader.d.ts +5 -5
- package/dist/modules/workspace/file-readers/text-reader.d.ts.map +1 -1
- package/dist/modules/workspace/file-readers/text-reader.js +5 -8
- package/dist/modules/workspace/file-readers/text-reader.js.map +1 -1
- package/dist/modules/workspace/first-run.d.ts +111 -0
- package/dist/modules/workspace/first-run.d.ts.map +1 -0
- package/dist/modules/workspace/first-run.js +181 -0
- package/dist/modules/workspace/first-run.js.map +1 -0
- package/dist/modules/workspace/move-links.d.ts +92 -0
- package/dist/modules/workspace/move-links.d.ts.map +1 -0
- package/dist/modules/workspace/move-links.js +173 -0
- package/dist/modules/workspace/move-links.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 +24 -39
- package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts +58 -52
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.js +209 -223
- package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.d.ts +5 -3
- package/dist/modules/workspace/startup/steps/template-source.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.js +5 -3
- package/dist/modules/workspace/startup/steps/template-source.js.map +1 -1
- package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.routes.js +63 -22
- package/dist/modules/workspace/workspace.routes.js.map +1 -1
- package/dist/modules/workspace/workspace.service.d.ts +75 -2
- package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.service.js +197 -24
- package/dist/modules/workspace/workspace.service.js.map +1 -1
- package/dist/modules/workspace/workspace.tools.d.ts +68 -1
- package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.tools.js +642 -71
- package/dist/modules/workspace/workspace.tools.js.map +1 -1
- package/dist/modules/write-access/write-access.d.ts.map +1 -1
- package/dist/modules/write-access/write-access.js +9 -0
- package/dist/modules/write-access/write-access.js.map +1 -1
- package/dist/shared/domain-errors.d.ts +84 -1
- package/dist/shared/domain-errors.d.ts.map +1 -1
- package/dist/shared/domain-errors.js +100 -12
- package/dist/shared/domain-errors.js.map +1 -1
- package/dist/shared/git.contract.d.ts +10 -1
- package/dist/shared/git.contract.d.ts.map +1 -1
- package/dist/shared/git.contract.js.map +1 -1
- package/dist/shared/hidden-tools.d.ts +44 -0
- package/dist/shared/hidden-tools.d.ts.map +1 -0
- package/dist/shared/hidden-tools.js +13 -0
- package/dist/shared/hidden-tools.js.map +1 -0
- package/dist/shared/utf8-text.d.ts +15 -0
- package/dist/shared/utf8-text.d.ts.map +1 -0
- package/dist/shared/utf8-text.js +20 -0
- package/dist/shared/utf8-text.js.map +1 -0
- package/dist/tenancy/static-tenant-source.d.ts +2 -1
- package/dist/tenancy/static-tenant-source.d.ts.map +1 -1
- package/dist/tenancy/static-tenant-source.js +9 -2
- package/dist/tenancy/static-tenant-source.js.map +1 -1
- package/kb-template/.bevelignore +0 -5
- package/mcp-app/page.html +349 -0
- package/migrations/0017_atlassian_account_links.sql +37 -0
- package/migrations/meta/0017_snapshot.json +2396 -0
- package/migrations/meta/_journal.json +8 -1
- package/package.json +6 -3
- package/src/__tests__/kb-layout-config.test.ts +10 -100
- package/src/__tests__/packaged-assets-ship.test.ts +66 -0
- package/src/assets.ts +38 -2
- package/src/core/__tests__/catalog-revision.test.ts +40 -0
- package/src/core/__tests__/gated-boot.test.ts +1 -0
- package/src/core/__tests__/lifecycle.test.ts +14 -0
- package/src/core/catalog-revision.ts +15 -2
- package/src/core/core-ports.ts +11 -0
- package/src/core/create-core-server.ts +78 -3
- package/src/core/create-core-services.ts +168 -10
- package/src/core/lifecycle.ts +28 -2
- package/src/core-config.ts +24 -1
- package/src/index.ts +2 -2
- package/src/modules/access/__tests__/access-control.atref-batch.test.ts +58 -0
- package/src/modules/access/__tests__/access-control.platform-restore.test.ts +8 -7
- package/src/modules/access/__tests__/access-control.service.test.ts +19 -0
- package/src/modules/access/__tests__/access-personal-plugin.test.ts +1 -18
- package/src/modules/access/access-control.interface.ts +28 -0
- package/src/modules/access/access-control.service.ts +37 -0
- package/src/modules/access/directory-sync-bot.ts +1 -1
- package/src/modules/agent-guide/__tests__/agent-guide.test.ts +386 -0
- package/src/modules/agent-guide/__tests__/agent-guide.tools.test.ts +207 -0
- package/src/modules/agent-guide/agent-guide.tools.ts +122 -0
- package/src/modules/agent-guide/agent-guide.ts +300 -0
- package/src/modules/agent-guide/index.ts +22 -0
- package/src/modules/agent-instructions/__tests__/shared-file-rules.test.ts +39 -118
- package/src/modules/agent-instructions/agent-instructions.routes.ts +3 -2
- package/src/modules/agent-instructions/compose.ts +26 -8
- package/src/modules/agent-instructions/index.ts +0 -3
- package/src/modules/agent-instructions/shared-file-rules.ts +50 -112
- package/src/modules/audit/__tests__/agent-audit.service.test.ts +64 -4
- package/src/modules/audit/__tests__/agent-connection.routes.test.ts +102 -0
- package/src/modules/audit/agent-audit.service.ts +58 -3
- package/src/modules/audit/agent-connection.routes.ts +56 -0
- package/src/modules/audit/audit.contract.ts +26 -0
- package/src/modules/audit/index.ts +1 -0
- package/src/modules/auth/__tests__/account.routes.test.ts +5 -3
- package/src/modules/auth/account.routes.ts +10 -3
- package/src/modules/auth/auth.middleware.ts +1 -1
- package/src/modules/code-mode/__tests__/code-mode.tool.test.ts +18 -2
- package/src/modules/code-mode/code-mode.tool.ts +13 -2
- package/src/modules/database/core-schema.ts +33 -3
- package/src/modules/embed/__tests__/account-links.migration.test.ts +98 -0
- package/src/modules/embed/__tests__/embed-link.test.ts +122 -0
- package/src/modules/embed/__tests__/embed.routes.test.ts +362 -0
- package/src/modules/embed/__tests__/embed.service.lock.test.ts +193 -0
- package/src/modules/embed/__tests__/embed.service.test.ts +805 -0
- package/src/modules/embed/__tests__/embed.tools.test.ts +304 -0
- package/src/modules/embed/__tests__/mcp-app.test.ts +207 -0
- package/src/modules/embed/account-link.service.ts +76 -0
- package/src/modules/embed/embed-link.ts +180 -0
- package/src/modules/embed/embed.errors.ts +43 -0
- package/src/modules/embed/embed.interface.ts +203 -0
- package/src/modules/embed/embed.routes.ts +363 -0
- package/src/modules/embed/embed.service.ts +705 -0
- package/src/modules/embed/embed.tools.ts +206 -0
- package/src/modules/embed/mcp-app.routes.ts +41 -0
- package/src/modules/embed/mcp-app.ts +173 -0
- package/src/modules/github-app/__tests__/github-app.test.ts +76 -0
- package/src/modules/github-app/github-app.connection.ts +38 -4
- package/src/modules/kb-fs/__tests__/move-with-edits.test.ts +304 -0
- package/src/modules/kb-fs/locking-filesystem.ts +287 -0
- package/src/modules/kb-sync/__tests__/kb-sync.service.test.ts +35 -0
- package/src/modules/kb-sync/kb-sync.interface.ts +2 -0
- package/src/modules/kb-sync/kb-sync.service.ts +6 -0
- package/src/modules/mcp/__tests__/bevel-oauth-provider.test.ts +68 -11
- package/src/modules/mcp/__tests__/fake-downstream-mcp-server.ts +14 -3
- package/src/modules/mcp/__tests__/mcp-proxy-helpers.test.ts +37 -2
- package/src/modules/mcp/__tests__/mcp.app.e2e.test.ts +200 -0
- package/src/modules/mcp/__tests__/mcp.e2e.test.ts +252 -0
- package/src/modules/mcp/__tests__/mcp.service.test.ts +42 -24
- package/src/modules/mcp/__tests__/tool-call-interface.e2e.test.ts +499 -0
- package/src/modules/mcp/__tests__/tool-schema-guard.test.ts +266 -0
- package/src/modules/mcp/mcp-auth.middleware.ts +2 -1
- package/src/modules/mcp/mcp.service.ts +218 -31
- package/src/modules/mcp/oauth/bevel-oauth-provider.ts +42 -4
- package/src/modules/mcp/tool-schema-guard.ts +196 -0
- package/src/modules/onboarding/__tests__/onboarding.routes.test.ts +163 -0
- package/src/modules/onboarding/__tests__/starter-pack.service.test.ts +635 -0
- package/src/modules/onboarding/__tests__/starter-packs.test.ts +169 -0
- package/src/modules/onboarding/onboarding.contract.ts +85 -0
- package/src/modules/onboarding/onboarding.routes.ts +85 -0
- package/src/modules/onboarding/starter-pack.service.ts +580 -0
- package/src/modules/onboarding/starter-packs.ts +182 -0
- package/src/modules/plugins/__tests__/plugins.tools.test.ts +177 -4
- package/src/modules/plugins/index.ts +1 -0
- package/src/modules/plugins/plugin-provision.service.ts +22 -1
- package/src/modules/plugins/plugins.routes.ts +29 -0
- package/src/modules/plugins/plugins.tools.ts +75 -15
- package/src/modules/settings/__tests__/deployment-settings.service.test.ts +176 -56
- package/src/modules/settings/__tests__/repository-source.test.ts +9 -0
- package/src/modules/settings/deployment-settings.service.ts +144 -55
- package/src/modules/settings/repository-source.ts +4 -4
- package/src/modules/settings/setup.routes.ts +3 -6
- package/src/modules/skills/__tests__/skills.tools.description.test.ts +95 -0
- package/src/modules/skills/skills.tools.ts +112 -46
- package/src/modules/tool-auth/__tests__/connection-key-rejection.test.ts +32 -0
- package/src/modules/tool-auth/__tests__/external-api-key.service.test.ts +65 -0
- package/src/modules/tool-auth/connection-key-rejection.ts +13 -3
- package/src/modules/tool-auth/external-api-key.interface.ts +9 -0
- package/src/modules/tool-auth/external-api-key.service.ts +61 -4
- package/src/modules/tool-auth/tool-auth.middleware.ts +13 -4
- package/src/modules/tool-helpers/__tests__/branch-declaration.test.ts +502 -0
- package/src/modules/tool-helpers/__tests__/route-argument-check.test.ts +337 -0
- package/src/modules/tool-helpers/index.ts +34 -1
- package/src/modules/tool-helpers/route-argument-check.ts +149 -0
- package/src/modules/tool-helpers/route-tool-schemas.ts +171 -0
- package/src/modules/tool-helpers/tool-def.ts +132 -7
- package/src/modules/tool-helpers/tool-handler.ts +196 -8
- package/src/modules/tool-helpers/tool.contract.ts +9 -0
- package/src/modules/tool-manuals/__tests__/tool-manuals.detail.route.test.ts +57 -0
- package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +73 -4
- package/src/modules/tool-manuals/tool-manuals.contract.ts +24 -4
- package/src/modules/tool-manuals/tool-manuals.service.ts +17 -0
- package/src/modules/tool-manuals/tool-manuals.tools.ts +86 -38
- package/src/modules/tool-registry/__tests__/own-tool-schemas.test.ts +173 -0
- package/src/modules/tool-registry/__tests__/tool-description-length.test.ts +81 -66
- package/src/modules/tool-registry/description-length.ts +57 -32
- package/src/modules/tool-registry/guide-first.ts +41 -0
- package/src/modules/tool-registry/tool-registry.ts +9 -2
- package/src/modules/workflow/__tests__/apply-failure.test.ts +6 -1
- package/src/modules/workflow/__tests__/file-lock.service.deletion-gate.test.ts +104 -0
- package/src/modules/workflow/__tests__/pending-commits.repository-replaced.test.ts +66 -0
- package/src/modules/workflow/__tests__/pending-commits.worker.test.ts +31 -2
- package/src/modules/workflow/__tests__/preserve-roles-yaml.test.ts +110 -6
- package/src/modules/workflow/__tests__/sanitize-error.test.ts +89 -1
- package/src/modules/workflow/__tests__/workflow.routes.push-refused.test.ts +202 -0
- package/src/modules/workflow/__tests__/workflow.service.branch-in-use.test.ts +6 -6
- package/src/modules/workflow/__tests__/workflow.service.delete-branch.test.ts +1026 -0
- package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +468 -10
- package/src/modules/workflow/__tests__/workflow.service.folder-proposals.test.ts +4 -0
- package/src/modules/workflow/__tests__/workflow.service.releaseLock.test.ts +5 -4
- package/src/modules/workflow/__tests__/workflow.service.update-from-target.test.ts +54 -2
- package/src/modules/workflow/agent-tools/__tests__/change-request-read-shape.test.ts +705 -0
- package/src/modules/workflow/agent-tools/__tests__/change-request-read.tools.test.ts +1554 -0
- package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +150 -4
- package/src/modules/workflow/agent-tools/change-request-read-shape.ts +712 -0
- package/src/modules/workflow/agent-tools/change-request-read.tools.ts +759 -0
- package/src/modules/workflow/agent-tools/change-request-summary.ts +5 -1
- package/src/modules/workflow/agent-tools/workflow.tools.ts +137 -35
- package/src/modules/workflow/file-lock.service.ts +67 -5
- package/src/modules/workflow/git/__tests__/git.service.appliedChange.test.ts +285 -0
- package/src/modules/workflow/git/__tests__/git.service.changedFilesForPr.test.ts +124 -0
- package/src/modules/workflow/git/__tests__/git.service.deleteBranch.test.ts +164 -0
- package/src/modules/workflow/git/__tests__/git.service.mergeChangeRequest.test.ts +334 -0
- package/src/modules/workflow/git/__tests__/git.service.pull.test.ts +48 -1
- package/src/modules/workflow/git/__tests__/node-git-runner.test.ts +231 -2
- package/src/modules/workflow/git/__tests__/pull-request.service.list-fetch.test.ts +72 -2
- package/src/modules/workflow/git/__tests__/pull-request.service.placeholder.test.ts +24 -2
- package/src/modules/workflow/git/__tests__/pull-request.service.test.ts +620 -1
- package/src/modules/workflow/git/git.service.ts +714 -133
- package/src/modules/workflow/git/merge-commit.ts +88 -0
- package/src/modules/workflow/git/node-git-runner.ts +82 -7
- package/src/modules/workflow/git/pull-request.service.ts +380 -54
- package/src/modules/workflow/pending-commits.service.ts +29 -1
- package/src/modules/workflow/pending-commits.worker.ts +24 -6
- package/src/modules/workflow/recovery-bot.ts +1 -1
- package/src/modules/workflow/review-workflow/__tests__/approval-states.test.ts +7 -1
- package/src/modules/workflow/review-workflow/__tests__/merge-records-own-commit.test.ts +407 -0
- package/src/modules/workflow/review-workflow/review-workflow.service.ts +191 -12
- package/src/modules/workflow/sanitize-error.ts +50 -0
- package/src/modules/workflow/workflow.routes.ts +7 -2
- package/src/modules/workflow/workflow.service.ts +886 -112
- package/src/modules/workspace/__tests__/agent-downloads.test.ts +823 -0
- package/src/modules/workspace/__tests__/escape-sequences.routes.test.ts +4 -3
- package/src/modules/workspace/__tests__/first-run.test.ts +234 -0
- package/src/modules/workspace/__tests__/git-internals.security.test.ts +5 -2
- package/src/modules/workspace/__tests__/md-links.test.ts +353 -0
- package/src/modules/workspace/__tests__/move-links.test.ts +261 -0
- package/src/modules/workspace/__tests__/rest-tool-arguments.test.ts +219 -0
- package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +3 -0
- package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +102 -0
- package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +52 -5
- package/src/modules/workspace/__tests__/workspace.routes.folder-zip-access.test.ts +190 -0
- package/src/modules/workspace/__tests__/workspace.routes.move-platform-files.test.ts +21 -10
- package/src/modules/workspace/__tests__/workspace.service.forget-clone-races.test.ts +8 -4
- package/src/modules/workspace/__tests__/workspace.service.test.ts +50 -8
- package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +33 -55
- package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +44 -1
- package/src/modules/workspace/__tests__/workspace.tools.test.ts +664 -34
- package/src/modules/workspace/agent-download.builder.ts +308 -0
- package/src/modules/workspace/agent-download.routes.ts +183 -0
- package/src/modules/workspace/agent-download.store.ts +533 -0
- package/src/modules/workspace/agent-upload.store.ts +23 -7
- package/src/modules/workspace/file-readers/raw-mime.ts +40 -0
- package/src/modules/workspace/file-readers/text-reader.ts +5 -8
- package/src/modules/workspace/first-run.ts +222 -0
- package/src/modules/workspace/move-links.ts +237 -0
- package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +191 -489
- package/src/modules/workspace/startup/steps/seed-tree.ts +23 -38
- package/src/modules/workspace/startup/steps/template-files.step.ts +217 -249
- package/src/modules/workspace/startup/steps/template-source.ts +5 -3
- package/src/modules/workspace/workspace.routes.ts +64 -22
- package/src/modules/workspace/workspace.service.ts +202 -25
- package/src/modules/workspace/workspace.tools.ts +707 -68
- package/src/modules/write-access/__tests__/write-access.test.ts +13 -0
- package/src/modules/write-access/write-access.ts +9 -0
- package/src/shared/domain-errors.ts +123 -11
- package/src/shared/git.contract.ts +8 -1
- package/src/shared/hidden-tools.ts +45 -0
- package/src/shared/utf8-text.ts +21 -0
- package/src/tenancy/__tests__/static-tenant-source.test.ts +1 -0
- package/src/tenancy/static-tenant-source.ts +10 -2
- package/starter-packs/README.md +103 -0
- package/starter-packs/engineering/KnowledgeBase/About us.md +9 -0
- package/starter-packs/engineering/KnowledgeBase/Architecture.md +9 -0
- package/starter-packs/engineering/KnowledgeBase/Glossary.md +9 -0
- package/starter-packs/engineering/KnowledgeBase/How we ship.md +9 -0
- package/starter-packs/engineering/Plugins/engineering-starter/LICENSE +21 -0
- package/starter-packs/engineering/Plugins/engineering-starter/SOURCE.md +20 -0
- package/starter-packs/engineering/Plugins/engineering-starter/access.md +19 -0
- package/starter-packs/engineering/Plugins/engineering-starter/plugin.json +10 -0
- package/starter-packs/engineering/Plugins/engineering-starter/skills/office-hours/SKILL.md +171 -0
- package/starter-packs/engineering/Plugins/engineering-starter/skills/office-hours/sections/phase-2a-startup-diagnostic.md +157 -0
- package/starter-packs/engineering/Plugins/engineering-starter/skills/office-hours/sections/phase-2b-builder-brainstorm.md +39 -0
- package/starter-packs/engineering/Plugins/engineering-starter/skills/plan-ceo-review/SKILL.md +144 -0
- package/starter-packs/engineering/Plugins/engineering-starter/skills/plan-eng-review/SKILL.md +144 -0
- package/starter-packs/engineering/Plugins/engineering-starter/skills/review/SKILL.md +80 -0
- package/starter-packs/engineering/Plugins/engineering-starter/skills/review/checklist.md +184 -0
- package/starter-packs/engineering/pack.yaml +11 -0
- package/starter-packs/general/KnowledgeBase/About us.md +9 -0
- package/starter-packs/general/KnowledgeBase/Glossary.md +9 -0
- package/starter-packs/general/KnowledgeBase/How we work.md +9 -0
- package/starter-packs/general/Plugins/general-starter/LICENSE +202 -0
- package/starter-packs/general/Plugins/general-starter/SOURCE.md +10 -0
- package/starter-packs/general/Plugins/general-starter/access.md +19 -0
- package/starter-packs/general/Plugins/general-starter/plugin.json +10 -0
- package/starter-packs/general/Plugins/general-starter/skills/memory-management/SKILL.md +332 -0
- package/starter-packs/general/Plugins/general-starter/skills/productivity-start/SKILL.md +163 -0
- package/starter-packs/general/Plugins/general-starter/skills/productivity-update/SKILL.md +167 -0
- package/starter-packs/general/Plugins/general-starter/skills/task-management/SKILL.md +83 -0
- package/starter-packs/general/pack.yaml +10 -0
- package/starter-packs/operations/KnowledgeBase/Glossary.md +9 -0
- package/starter-packs/operations/KnowledgeBase/How we work.md +9 -0
- package/starter-packs/operations/KnowledgeBase/Processes.md +9 -0
- package/starter-packs/operations/KnowledgeBase/Tools we use.md +9 -0
- package/starter-packs/operations/KnowledgeBase/Vendors.md +9 -0
- package/starter-packs/operations/Plugins/operations-starter/LICENSE +202 -0
- package/starter-packs/operations/Plugins/operations-starter/SOURCE.md +10 -0
- package/starter-packs/operations/Plugins/operations-starter/access.md +19 -0
- package/starter-packs/operations/Plugins/operations-starter/plugin.json +10 -0
- package/starter-packs/operations/Plugins/operations-starter/skills/capacity-plan/SKILL.md +111 -0
- package/starter-packs/operations/Plugins/operations-starter/skills/change-request/SKILL.md +119 -0
- package/starter-packs/operations/Plugins/operations-starter/skills/compliance-tracking/SKILL.md +44 -0
- package/starter-packs/operations/Plugins/operations-starter/skills/process-doc/SKILL.md +80 -0
- package/starter-packs/operations/Plugins/operations-starter/skills/process-optimization/SKILL.md +39 -0
- package/starter-packs/operations/Plugins/operations-starter/skills/risk-assessment/SKILL.md +40 -0
- package/starter-packs/operations/Plugins/operations-starter/skills/runbook/SKILL.md +85 -0
- package/starter-packs/operations/Plugins/operations-starter/skills/status-report/SKILL.md +75 -0
- package/starter-packs/operations/Plugins/operations-starter/skills/vendor-review/SKILL.md +102 -0
- package/starter-packs/operations/pack.yaml +12 -0
- package/starter-packs/sales/KnowledgeBase/About us.md +9 -0
- package/starter-packs/sales/KnowledgeBase/Customers.md +9 -0
- package/starter-packs/sales/KnowledgeBase/Glossary.md +9 -0
- package/starter-packs/sales/KnowledgeBase/How we sell.md +9 -0
- package/starter-packs/sales/KnowledgeBase/Objections.md +9 -0
- package/starter-packs/sales/KnowledgeBase/Pricing.md +9 -0
- package/starter-packs/sales/Plugins/sales-starter/LICENSE +202 -0
- package/starter-packs/sales/Plugins/sales-starter/SOURCE.md +10 -0
- package/starter-packs/sales/Plugins/sales-starter/access.md +19 -0
- package/starter-packs/sales/Plugins/sales-starter/plugin.json +10 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/account-context/SKILL.md +94 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/account-plan/SKILL.md +95 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/account-research/SKILL.md +99 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/account-tiering/SKILL.md +101 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/call-prep/SKILL.md +111 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/call-summary/SKILL.md +111 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/close-plan/SKILL.md +106 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/competitive-intelligence/SKILL.md +102 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/create-an-asset/SKILL.md +105 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/crm-hygiene-check/SKILL.md +103 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/customer-health/SKILL.md +108 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/customer-voice/SKILL.md +94 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/daily-briefing/SKILL.md +61 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/deal-advance-gap/SKILL.md +102 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/deal-review/SKILL.md +105 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/deal-signals/SKILL.md +96 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/deal-slip-scenario/SKILL.md +104 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/draft-outreach/SKILL.md +116 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/end-of-day/SKILL.md +114 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/expansion-whitespace/SKILL.md +97 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/forecast/SKILL.md +100 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/handle-objection/SKILL.md +93 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/inbox-sweep/SKILL.md +114 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/lead-triage/SKILL.md +106 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/log-activity/SKILL.md +111 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/pipeline-review/SKILL.md +97 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/renewal-radar/SKILL.md +95 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/rep-context/SKILL.md +90 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/route-lead/SKILL.md +111 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/sales-setup/SKILL.md +200 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/schedule-meeting/SKILL.md +99 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/stakeholder-map/SKILL.md +107 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/team-pipeline/SKILL.md +105 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/update-opportunity/SKILL.md +112 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/weekly-wrap/SKILL.md +90 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/win-loss-review/SKILL.md +88 -0
- package/starter-packs/sales/pack.yaml +13 -0
- package/starter-packs/support/KnowledgeBase/Escalations.md +9 -0
- package/starter-packs/support/KnowledgeBase/Glossary.md +9 -0
- package/starter-packs/support/KnowledgeBase/Known issues.md +9 -0
- package/starter-packs/support/KnowledgeBase/Products.md +9 -0
- package/starter-packs/support/KnowledgeBase/Tone of voice.md +9 -0
- package/starter-packs/support/Plugins/support-starter/LICENSE +202 -0
- package/starter-packs/support/Plugins/support-starter/SOURCE.md +10 -0
- package/starter-packs/support/Plugins/support-starter/access.md +19 -0
- package/starter-packs/support/Plugins/support-starter/plugin.json +10 -0
- package/starter-packs/support/Plugins/support-starter/skills/customer-escalation/SKILL.md +246 -0
- package/starter-packs/support/Plugins/support-starter/skills/customer-research/SKILL.md +250 -0
- package/starter-packs/support/Plugins/support-starter/skills/draft-response/SKILL.md +416 -0
- package/starter-packs/support/Plugins/support-starter/skills/kb-article/SKILL.md +350 -0
- package/starter-packs/support/Plugins/support-starter/skills/ticket-triage/SKILL.md +273 -0
- package/starter-packs/support/pack.yaml +12 -0
- package/kb-template/AGENTS.md +0 -730
|
@@ -17,6 +17,10 @@ import { getDb, type Database } from '../modules/database/connection.js';
|
|
|
17
17
|
import { runCoreMigrations } from '../modules/database/migrate.js';
|
|
18
18
|
import { coreMigrationsDir } from '../assets.js';
|
|
19
19
|
import { WorkspaceService } from '../modules/workspace/workspace.service.js';
|
|
20
|
+
import { AccountLinkService } from '../modules/embed/account-link.service.js';
|
|
21
|
+
import { EmbedService } from '../modules/embed/embed.service.js';
|
|
22
|
+
import { McpAppService, type IMcpAppService } from '../modules/embed/mcp-app.js';
|
|
23
|
+
import { createFileReaderRegistry } from '../modules/workspace/file-readers/file-reader.registry.js';
|
|
20
24
|
import { RoutineWritePolicyService } from '../modules/workspace/routine-write-policy.js';
|
|
21
25
|
import { KbStartupRunner } from '../modules/workspace/startup/kb-startup-runner.js';
|
|
22
26
|
import { GroupsToPluginsStep } from '../modules/workspace/startup/steps/groups-to-plugins.step.js';
|
|
@@ -26,7 +30,7 @@ import { PersonalSpacesStep } from '../modules/workspace/startup/steps/personal-
|
|
|
26
30
|
import { TemplateFilesStep } from '../modules/workspace/startup/steps/template-files.step.js';
|
|
27
31
|
import { RolesYamlStep } from '../modules/workspace/startup/steps/roles-yaml.step.js';
|
|
28
32
|
import { buildSeedTree } from '../modules/workspace/startup/steps/seed-tree.js';
|
|
29
|
-
import { DeploymentSettingsService } from '../modules/settings/deployment-settings.service.js';
|
|
33
|
+
import { DeploymentSettingsService, retireMergedBranchesOn } from '../modules/settings/deployment-settings.service.js';
|
|
30
34
|
import { KbSyncService } from '../modules/kb-sync/kb-sync.service.js';
|
|
31
35
|
import { NodeFs } from '../modules/kb-fs/node-fs.js';
|
|
32
36
|
import { assertKbDirNameFree } from '../modules/kb-fs/repo-path.js';
|
|
@@ -55,17 +59,21 @@ function parseDomainList(raw: string): string[] {
|
|
|
55
59
|
}
|
|
56
60
|
import { SpillStore } from '../modules/workspace/spill-store.js';
|
|
57
61
|
import { AgentUploadStore, assertUploadsRootOutsideWorkspaces } from '../modules/workspace/agent-upload.store.js';
|
|
62
|
+
import { AgentDownloadStore, type IAgentDownloadStore } from '../modules/workspace/agent-download.store.js';
|
|
63
|
+
import { createDownloadFetcherIdentifier } from '../modules/workspace/agent-download.routes.js';
|
|
64
|
+
import type { Request } from 'express';
|
|
58
65
|
import { DocExtractService } from '../modules/workspace/file-readers/doc-extract.service.js';
|
|
59
66
|
import { UuidSessionSink, type ISessionSink } from '../modules/workspace/session-sink.js';
|
|
60
67
|
import { AuthService } from '../modules/auth/auth.service.js';
|
|
61
68
|
import { AccountErasureService } from '../modules/auth/account-erasure.service.js';
|
|
62
69
|
import { OidcAuthProvider, oidcSettingsFrom } from '../modules/auth/oidc-auth-provider.js';
|
|
63
|
-
import { createAuthMiddleware } from '../modules/auth/auth.middleware.js';
|
|
70
|
+
import { createAuthMiddleware, readAuthCookie } from '../modules/auth/auth.middleware.js';
|
|
64
71
|
import { AccessControlService, loadActiveGroups } from '../modules/access/access-control.service.js';
|
|
65
72
|
import { CreatorAccessService } from '../modules/access/creator-access.js';
|
|
66
73
|
import { ChangeReadGate } from '../modules/access/change-read-gate.js';
|
|
67
74
|
import { GroupsAdminService } from '../modules/access/groups-admin.service.js';
|
|
68
75
|
import { UserAccessRemovalService } from '../modules/access/user-access-removal.service.js';
|
|
76
|
+
import { makeRolesYamlWriteValidator } from '../modules/access-model/roles-yaml-guard.js';
|
|
69
77
|
import { PendingSkillsService, SkillService } from '../modules/skills/index.js';
|
|
70
78
|
import { PendingToolsService, ToolManualService } from '../modules/tool-manuals/index.js';
|
|
71
79
|
import { McpServerEditService } from '../modules/tool-manuals/mcp-server-edit.service.js';
|
|
@@ -110,6 +118,7 @@ import { ReviewWorkflowService } from '../modules/workflow/review-workflow/revie
|
|
|
110
118
|
import { FileLockService } from '../modules/workflow/file-lock.service.js';
|
|
111
119
|
import { WorkflowEventBus } from '../modules/workflow/event-bus.js';
|
|
112
120
|
import { FileChangeNotifier } from '../modules/kb-fs/file-change-notifier.js';
|
|
121
|
+
import { StarterPackService } from '../modules/onboarding/starter-pack.service.js';
|
|
113
122
|
import { WorkflowService } from '../modules/workflow/workflow.service.js';
|
|
114
123
|
import { WorkflowHooks } from '../modules/workflow/workflow-hooks.js';
|
|
115
124
|
import { PendingCommitsService } from '../modules/workflow/pending-commits.service.js';
|
|
@@ -132,12 +141,19 @@ import {
|
|
|
132
141
|
} from '../modules/tool-auth/internal-token.service.js';
|
|
133
142
|
import {
|
|
134
143
|
createToolAuthMiddleware,
|
|
144
|
+
createTokenVerifier,
|
|
135
145
|
createManualAuthMiddleware,
|
|
136
146
|
} from '../modules/tool-auth/tool-auth.middleware.js';
|
|
137
147
|
import { unmeteredLlmUsage, type ILlmUsageMeter } from '../modules/tool-auth/llm-usage-meter.js';
|
|
138
148
|
import { McpService } from '../modules/mcp/mcp.service.js';
|
|
139
149
|
import { AgentAuditService, retentionDaysFrom } from '../modules/audit/agent-audit.service.js';
|
|
140
150
|
import { readAgentPreamble, type AgentPreambleReader } from '../modules/agent-instructions/index.js';
|
|
151
|
+
import {
|
|
152
|
+
agentGuideSections,
|
|
153
|
+
joinGuideSections,
|
|
154
|
+
type AgentGuideReader,
|
|
155
|
+
type AgentGuideSectionsReader,
|
|
156
|
+
} from '../modules/agent-guide/index.js';
|
|
141
157
|
import { createMcpAuthMiddleware } from '../modules/mcp/mcp-auth.middleware.js';
|
|
142
158
|
import { BevelOAuthProvider } from '../modules/mcp/oauth/bevel-oauth-provider.js';
|
|
143
159
|
import { getOAuthProtectedResourceMetadataUrl } from '@modelcontextprotocol/sdk/server/auth/router.js';
|
|
@@ -223,6 +239,14 @@ export interface CoreServices {
|
|
|
223
239
|
spillStore: SpillStore;
|
|
224
240
|
/** The bytes an agent uploaded, held until `apply_file_upload` lands them or their token expires. */
|
|
225
241
|
agentUploadStore: AgentUploadStore;
|
|
242
|
+
/** The bytes `request_file_download` captured, held until their one-time link is fetched or expires. */
|
|
243
|
+
agentDownloadStore: IAgentDownloadStore;
|
|
244
|
+
/**
|
|
245
|
+
* Every user a download fetch identifies itself as, by its bearer and its
|
|
246
|
+
* session cookie — none when it carries none that verifies — so the
|
|
247
|
+
* download route can refuse a link presented by someone it was not issued to.
|
|
248
|
+
*/
|
|
249
|
+
agentDownloadFetcher: (req: Request) => Promise<string[]>;
|
|
226
250
|
docExtractService: DocExtractService;
|
|
227
251
|
accessControl: AccessControlService;
|
|
228
252
|
creatorAccess: CreatorAccessService;
|
|
@@ -239,11 +263,24 @@ export interface CoreServices {
|
|
|
239
263
|
* and `GET /api/agent/instructions`. See modules/agent-instructions.
|
|
240
264
|
*/
|
|
241
265
|
readAgentPreamble: AgentPreambleReader;
|
|
266
|
+
/**
|
|
267
|
+
* Composes the platform's agent guide for the layout in effect, through
|
|
268
|
+
* the distribution's hook when it passed one: what `get_agent_guide` and a
|
|
269
|
+
* `read_file` of the guide's name answer. See modules/agent-guide.
|
|
270
|
+
*/
|
|
271
|
+
agentGuide: AgentGuideReader;
|
|
272
|
+
/** The same guide as its sections, each with its title — what `get_agent_guide` lists and serves one of. */
|
|
273
|
+
agentGuideSections: AgentGuideSectionsReader;
|
|
242
274
|
mcpServerEditService: McpServerEditService;
|
|
243
275
|
/** Deleting one tool — the owner's verb (see ToolDeleteService). */
|
|
244
276
|
toolDeleteService: ToolDeleteService;
|
|
245
277
|
pluginIndexService: PluginIndexService;
|
|
246
278
|
pluginProvisionService: PluginProvisionService;
|
|
279
|
+
/**
|
|
280
|
+
* "What does your team do?" — the starter pack a new knowledge base's admin
|
|
281
|
+
* may fill it from, and the record of what was chosen. See modules/onboarding.
|
|
282
|
+
*/
|
|
283
|
+
starterPackService: StarterPackService;
|
|
247
284
|
joinRequestsService: JoinRequestsService;
|
|
248
285
|
/**
|
|
249
286
|
* Records a join request and finishes it in the background. Its `sweep()`
|
|
@@ -321,6 +358,14 @@ export interface CoreServices {
|
|
|
321
358
|
connectionProbeService: ConnectionProbeService;
|
|
322
359
|
externalApiKeyService: ExternalApiKeyService;
|
|
323
360
|
internalTokenService: InternalTokenService;
|
|
361
|
+
/**
|
|
362
|
+
* The embed surface: the token-minted page a chat host frames, and the
|
|
363
|
+
* account links that let an outside identity reach it. Exposed so an
|
|
364
|
+
* overlay can mint for its own consumers and register a node-id resolver.
|
|
365
|
+
*/
|
|
366
|
+
embedService: EmbedService;
|
|
367
|
+
/** The MCP Apps this deployment serves — the `open_page` view and its sandbox metadata. */
|
|
368
|
+
mcpAppService: IMcpAppService;
|
|
324
369
|
mcpService: McpService;
|
|
325
370
|
mcpAuthMiddleware: ReturnType<typeof createMcpAuthMiddleware>;
|
|
326
371
|
mcpOAuthProvider: BevelOAuthProvider;
|
|
@@ -606,10 +651,7 @@ export async function createCoreServices(
|
|
|
606
651
|
// backfill would walk a tree still missing those manifests.
|
|
607
652
|
new PluginDisplayNamesStep(disk, kb),
|
|
608
653
|
new PersonalSpacesStep(disk, kb),
|
|
609
|
-
|
|
610
|
-
// still hold the defaults, and the save that completes first-run setup
|
|
611
|
-
// applies the admin's answer afterwards.
|
|
612
|
-
new TemplateFilesStep(disk, kb, extraDirs, () => settings.resolveAgentsFileLink()),
|
|
654
|
+
new TemplateFilesStep(disk, kb, extraDirs),
|
|
613
655
|
new RolesYamlStep(disk, [config.adminEmail]),
|
|
614
656
|
...(ports.kbStartupSteps ?? []),
|
|
615
657
|
];
|
|
@@ -674,6 +716,29 @@ export async function createCoreServices(
|
|
|
674
716
|
publicBaseUrl: config.publicBackendUrl,
|
|
675
717
|
tokenPrefix: config.uploadTokenPrefix,
|
|
676
718
|
});
|
|
719
|
+
// The way OUT: bytes `request_file_download` captured, held beside the
|
|
720
|
+
// upload root — outside every workspace, for the same reason — until their
|
|
721
|
+
// one-time link is fetched or expires.
|
|
722
|
+
const agentDownloadsRoot = path.resolve(config.agentUploadsRoot, '..', 'agent-downloads');
|
|
723
|
+
// An upload root that is itself named `agent-downloads` would make the two
|
|
724
|
+
// stores one directory, each sweeping the other's files.
|
|
725
|
+
if (agentDownloadsRoot === path.resolve(config.agentUploadsRoot)) {
|
|
726
|
+
throw new Error(
|
|
727
|
+
'AGENT_UPLOADS_ROOT must not be a directory named `agent-downloads`: that name, beside it, is the agent download root.',
|
|
728
|
+
);
|
|
729
|
+
}
|
|
730
|
+
await assertUploadsRootOutsideWorkspaces(agentDownloadsRoot, config.workspacesRoot, {
|
|
731
|
+
name: 'The agent download root (`agent-downloads`, beside AGENT_UPLOADS_ROOT)',
|
|
732
|
+
why:
|
|
733
|
+
'captured download bytes wait there for their one-time links, so a root inside a workspace would let the ' +
|
|
734
|
+
'file tools read them. Point AGENT_UPLOADS_ROOT at a directory whose parent is outside WORKSPACES_ROOT.',
|
|
735
|
+
});
|
|
736
|
+
const agentDownloadStore = new AgentDownloadStore({
|
|
737
|
+
root: agentDownloadsRoot,
|
|
738
|
+
publicBaseUrl: config.publicBackendUrl,
|
|
739
|
+
// `<tenant>-down_`: recognisable by shape beside the upload token.
|
|
740
|
+
tokenPrefix: config.uploadTokenPrefix.replace(/up_$/, 'down_'),
|
|
741
|
+
});
|
|
677
742
|
// Office-document/PDF text extraction for `read_file`/`grep`, cached by
|
|
678
743
|
// content hash beside the workspaces root (see `DocExtractionCache`).
|
|
679
744
|
const docExtractService = new DocExtractService(config.docExtractCacheRoot);
|
|
@@ -858,6 +923,9 @@ export async function createCoreServices(
|
|
|
858
923
|
// it reach every hook point.
|
|
859
924
|
workflowHooks,
|
|
860
925
|
);
|
|
926
|
+
// The leftover-branch cleanup asks the Deployment page at every round, so
|
|
927
|
+
// switching it off there applies without a restart.
|
|
928
|
+
workflowService.leftoverCleanupEnabled = () => retireMergedBranchesOn(settings.resolve('retireMergedBranches'));
|
|
861
929
|
|
|
862
930
|
// Join requests: derived entirely from two copies of a plugin's `access.md`
|
|
863
931
|
// (the request's branch vs the default branch), so it holds no state — it
|
|
@@ -1042,6 +1110,27 @@ export async function createCoreServices(
|
|
|
1042
1110
|
[config.adminEmail],
|
|
1043
1111
|
);
|
|
1044
1112
|
|
|
1113
|
+
// The starter-pack question: one commit on the default branch through the
|
|
1114
|
+
// same batch write the roles admin uses, the choice kept as a deployment
|
|
1115
|
+
// setting. Read by its routes and by `start_session`'s first-run note.
|
|
1116
|
+
const starterPackService = new StarterPackService({
|
|
1117
|
+
packsDir: config.starterPacksDir,
|
|
1118
|
+
kb,
|
|
1119
|
+
workspaceService,
|
|
1120
|
+
workflow: workflowService,
|
|
1121
|
+
adminAccess,
|
|
1122
|
+
settings,
|
|
1123
|
+
accessControl,
|
|
1124
|
+
disk,
|
|
1125
|
+
pluginSource,
|
|
1126
|
+
pluginLocks: pluginProvisionService,
|
|
1127
|
+
events: eventBus,
|
|
1128
|
+
fileChanges: fileChangeNotifier,
|
|
1129
|
+
// Its own lock: one starter-pack choice at a time, a concern no other
|
|
1130
|
+
// service's mutex serialises.
|
|
1131
|
+
choosing: new WorkspaceMutex(),
|
|
1132
|
+
});
|
|
1133
|
+
|
|
1045
1134
|
// In-app update check: lazily compares the running release version against
|
|
1046
1135
|
// the newest published GitHub release, only when an admin's browser asks —
|
|
1047
1136
|
// no timers, so a deployment nobody looks at makes zero calls. The flag
|
|
@@ -1141,9 +1230,13 @@ export async function createCoreServices(
|
|
|
1141
1230
|
// Connection keys also come as GitHub-shaped links (`gho_…`, kind
|
|
1142
1231
|
// `github-link`): the same key, minted by the marketplace facade below when
|
|
1143
1232
|
// a person connects an account on claude.ai, told apart by its stored kind.
|
|
1144
|
-
const externalApiKeyService = new ExternalApiKeyService(
|
|
1145
|
-
|
|
1146
|
-
|
|
1233
|
+
const externalApiKeyService = new ExternalApiKeyService(
|
|
1234
|
+
db,
|
|
1235
|
+
config.externalApiKeyPrefix,
|
|
1236
|
+
{ [GITHUB_LINK_KEY_KIND]: GITHUB_LINK_KEY_SPEC },
|
|
1237
|
+
// A key's first use tells its owner's open tabs that the agent arrived.
|
|
1238
|
+
eventBus,
|
|
1239
|
+
);
|
|
1147
1240
|
|
|
1148
1241
|
// The facade that lets products which sync marketplaces only from a GitHub
|
|
1149
1242
|
// Enterprise Server (claude.ai, Cowork) add the per-user marketplace:
|
|
@@ -1168,6 +1261,12 @@ export async function createCoreServices(
|
|
|
1168
1261
|
// the proxy below composes in-process per request; the agent-facing route
|
|
1169
1262
|
// serves the same composition to the local bridge and the frontend card.
|
|
1170
1263
|
const readPreamble: AgentPreambleReader = () => readAgentPreamble(workspaceService, kb, disk);
|
|
1264
|
+
// The guide every agent is told to read first, composed when asked for —
|
|
1265
|
+
// the layout is read per call, so a name the setup save applies lands
|
|
1266
|
+
// without a restart, and the distribution's hook sees every composition.
|
|
1267
|
+
const agentGuideSectionsReader: AgentGuideSectionsReader = () =>
|
|
1268
|
+
agentGuideSections(kb.layout, ports.agentGuide, { kbDirName });
|
|
1269
|
+
const agentGuide: AgentGuideReader = async () => joinGuideSections(await agentGuideSectionsReader());
|
|
1171
1270
|
// The Audit log. Records through the proxy below (every call an external
|
|
1172
1271
|
// agent makes), reads keys through the key service so their shape is
|
|
1173
1272
|
// defined once, and prunes past the retention setting — read per sweep, so
|
|
@@ -1175,6 +1274,34 @@ export async function createCoreServices(
|
|
|
1175
1274
|
const agentAuditService = new AgentAuditService(db, externalApiKeyService, () =>
|
|
1176
1275
|
retentionDaysFrom(settings.resolve('auditRetentionDays')),
|
|
1177
1276
|
);
|
|
1277
|
+
// The embed surface. It reads files through the workspace service and
|
|
1278
|
+
// judges them with the same access resolver the app file page uses, so what
|
|
1279
|
+
// a reader may see and change inside a chat is what they may see and change
|
|
1280
|
+
// in the app — never a second answer to the same question.
|
|
1281
|
+
const embedService = new EmbedService(
|
|
1282
|
+
// The RESOLVED checkout folder, not the env's: `config.kbDirName` is only
|
|
1283
|
+
// the environment value, empty on a deployment that took the default or
|
|
1284
|
+
// named it in setup, and every path the embed builds starts with it.
|
|
1285
|
+
{ ...config, kbDirName },
|
|
1286
|
+
kb,
|
|
1287
|
+
workspaceService,
|
|
1288
|
+
accessControl,
|
|
1289
|
+
authService,
|
|
1290
|
+
workflowService,
|
|
1291
|
+
gitService,
|
|
1292
|
+
new AccountLinkService(db),
|
|
1293
|
+
// The SAME extension-to-reader registry `read_file` dispatches on, so the
|
|
1294
|
+
// embed answer to "is this text, or bytes a renderer fetches?" cannot
|
|
1295
|
+
// disagree with what a read of the file returns.
|
|
1296
|
+
createFileReaderRegistry(docExtractService),
|
|
1297
|
+
// The SAME pre-disk gate the file editor and the agent tools run: a
|
|
1298
|
+
// `roles.yaml` that would not parse is refused before it is written, from
|
|
1299
|
+
// a chat exactly as from the app.
|
|
1300
|
+
makeRolesYamlWriteValidator(kbDirName),
|
|
1301
|
+
);
|
|
1302
|
+
// The `ui://` view `open_page` carries, with the one origin it may frame:
|
|
1303
|
+
// this deployment own public origin.
|
|
1304
|
+
const mcpAppService = new McpAppService({ publicFrontendUrl: config.publicFrontendUrl });
|
|
1178
1305
|
const mcpService = new McpService(
|
|
1179
1306
|
{
|
|
1180
1307
|
// Loopback to our own REST tool surface — 127.0.0.1 (not localhost) to pin
|
|
@@ -1208,12 +1335,20 @@ export async function createCoreServices(
|
|
|
1208
1335
|
(bearer) => mcpOAuthProvider.revokeByAccessToken(bearer),
|
|
1209
1336
|
// Every attributable call lands in the Audit log through this.
|
|
1210
1337
|
agentAuditService,
|
|
1338
|
+
// The views the endpoint serves over resources/read, and the tools that
|
|
1339
|
+
// carry them.
|
|
1340
|
+
mcpAppService,
|
|
1211
1341
|
);
|
|
1212
1342
|
// A changed secret invalidates what the proxy built from the old value for
|
|
1213
1343
|
// that user (null = shared secret → everyone): remembered manual failures,
|
|
1214
1344
|
// so a just-repaired credential is retried on the very next request instead
|
|
1215
1345
|
// of waiting out the failure memo's TTL, and pooled downstream connections.
|
|
1216
1346
|
secretsVaultService.onMutation((changedUserId) => mcpService.onSecretsChanged(changedUserId));
|
|
1347
|
+
// The proxy is the one place a connected server's tools are loaded, so it is
|
|
1348
|
+
// the one place their schemas are checked — and the tool catalog is where the
|
|
1349
|
+
// people who manage a server read what it found. Setter injection, like the
|
|
1350
|
+
// OAuth discovery above: the proxy is constructed after the catalog.
|
|
1351
|
+
toolManualService.setHiddenTools(mcpService.hiddenTools);
|
|
1217
1352
|
// MCP OAuth 2.1 authorization server (our own AS): lets MCP clients with no
|
|
1218
1353
|
// pre-shared connection key connect via the standard 401 → discovery → DCR →
|
|
1219
1354
|
// authorize (PKCE) flow. The authorize step routes the browser to /connect
|
|
@@ -1225,6 +1360,8 @@ export async function createCoreServices(
|
|
|
1225
1360
|
stateSecret: config.jwtSecret,
|
|
1226
1361
|
publicFrontendUrl: config.publicFrontendUrl,
|
|
1227
1362
|
tokenPrefix: config.mcpOAuthTokenPrefix,
|
|
1363
|
+
// An agent connection's first use tells its owner's open tabs the agent arrived.
|
|
1364
|
+
events: eventBus,
|
|
1228
1365
|
});
|
|
1229
1366
|
// RFC 9728 pointer carried on every MCP 401 challenge so OAuth-capable
|
|
1230
1367
|
// clients discover the AS. Single source of truth for the resource id.
|
|
@@ -1261,8 +1398,22 @@ export async function createCoreServices(
|
|
|
1261
1398
|
loadActiveGroups,
|
|
1262
1399
|
});
|
|
1263
1400
|
const writeAccess = ports.writeAccess ?? alwaysWritable;
|
|
1264
|
-
|
|
1401
|
+
// The branch every tool call runs on is resolved by the handler, before the
|
|
1402
|
+
// tool: the default read live (a rename in the settings is the next call's
|
|
1403
|
+
// default), the existence asked without cloning anything.
|
|
1404
|
+
const toolHandlerFactory = createToolHandlerFactory(resolveToolContext, writeAccess, {
|
|
1405
|
+
defaultBranch: () => kb.defaultBranch,
|
|
1406
|
+
isMissing: (branch) => workspaceService.isBranchMissing(branch),
|
|
1407
|
+
});
|
|
1265
1408
|
const toolAuthMiddleware = createToolAuthMiddleware(externalApiKeyService, internalTokenService, authService);
|
|
1409
|
+
const verifyToolToken = createTokenVerifier(externalApiKeyService, internalTokenService, authService);
|
|
1410
|
+
// Every credential kind this server issues — connection keys, internal
|
|
1411
|
+
// tokens and app sessions (bearer or cookie) — so a fetch carrying another
|
|
1412
|
+
// user's identity of ANY kind is refused the link.
|
|
1413
|
+
const agentDownloadFetcher: (req: Request) => Promise<string[]> = createDownloadFetcherIdentifier(
|
|
1414
|
+
{ verifyToolToken, verifySession: (token) => authService.verifyToken(token) },
|
|
1415
|
+
readAuthCookie,
|
|
1416
|
+
);
|
|
1266
1417
|
// Read-only manual endpoints accept the above PLUS a browser JWT, so a
|
|
1267
1418
|
// logged-in user can browse the catalog with their session. Execution routes
|
|
1268
1419
|
// keep `toolAuthMiddleware` (no JWT), so a session can read but not invoke.
|
|
@@ -1430,6 +1581,8 @@ export async function createCoreServices(
|
|
|
1430
1581
|
kbDirName,
|
|
1431
1582
|
spillStore,
|
|
1432
1583
|
agentUploadStore,
|
|
1584
|
+
agentDownloadStore,
|
|
1585
|
+
agentDownloadFetcher,
|
|
1433
1586
|
docExtractService,
|
|
1434
1587
|
accessControl,
|
|
1435
1588
|
creatorAccess,
|
|
@@ -1440,8 +1593,11 @@ export async function createCoreServices(
|
|
|
1440
1593
|
toolManualService,
|
|
1441
1594
|
pendingToolsService,
|
|
1442
1595
|
readAgentPreamble: readPreamble,
|
|
1596
|
+
agentGuide,
|
|
1597
|
+
agentGuideSections: agentGuideSectionsReader,
|
|
1443
1598
|
pluginIndexService,
|
|
1444
1599
|
pluginProvisionService,
|
|
1600
|
+
starterPackService,
|
|
1445
1601
|
joinRequestsService,
|
|
1446
1602
|
pluginJoinRequestJobs,
|
|
1447
1603
|
pluginLinkIndex,
|
|
@@ -1475,6 +1631,8 @@ export async function createCoreServices(
|
|
|
1475
1631
|
connectionProbeService,
|
|
1476
1632
|
externalApiKeyService,
|
|
1477
1633
|
internalTokenService,
|
|
1634
|
+
embedService,
|
|
1635
|
+
mcpAppService,
|
|
1478
1636
|
mcpService,
|
|
1479
1637
|
mcpAuthMiddleware,
|
|
1480
1638
|
mcpOAuthProvider,
|
package/src/core/lifecycle.ts
CHANGED
|
@@ -291,7 +291,7 @@ export interface BootableCore {
|
|
|
291
291
|
config: { workspacesRoot: string };
|
|
292
292
|
kbDirName: string;
|
|
293
293
|
kbStartupRunner: Pick<KbStartupRunner, 'runAll' | 'retryUntilMaintained'>;
|
|
294
|
-
workflowService: Pick<WorkflowService, 'closeChangeRequestsWithDeletedBranches'>;
|
|
294
|
+
workflowService: Pick<WorkflowService, 'closeChangeRequestsWithDeletedBranches' | 'tidyAfterSweep'>;
|
|
295
295
|
pluginJoinRequestJobs: Pick<PluginJoinRequestJobs, 'startSweeping'>;
|
|
296
296
|
/**
|
|
297
297
|
* The startup phase's retry, when the boot survived an unreachable remote
|
|
@@ -390,7 +390,11 @@ export async function startCore<C extends BootableCore>(
|
|
|
390
390
|
crLog.info(`closed ${n} change request${n === 1 ? '' : 's'} with a deleted branch`);
|
|
391
391
|
}
|
|
392
392
|
})
|
|
393
|
-
.catch((err) => crLog.warn('deleted-branch sweep failed:', { err }))
|
|
393
|
+
.catch((err) => crLog.warn('deleted-branch sweep failed:', { err }))
|
|
394
|
+
// Then the tidy-up: open requests that propose nothing are closed, and the
|
|
395
|
+
// branches merged requests left behind removed (behind its own setting).
|
|
396
|
+
// Fails safe on a failed fetch, and never throws.
|
|
397
|
+
.then(() => core.workflowService.tidyAfterSweep());
|
|
394
398
|
|
|
395
399
|
// Recorded join requests that are still owed, resumed — now, and then on a
|
|
396
400
|
// timer. SEQUENCED AFTER the startup phase for the same reason as the sweep
|
|
@@ -437,6 +441,15 @@ export interface CoreStopDeps {
|
|
|
437
441
|
* Optional: a caller that has not built one passes nothing.
|
|
438
442
|
*/
|
|
439
443
|
agentUploadStore?: { stopSweeping(): void; drainSweep(): Promise<void> };
|
|
444
|
+
/** The agent download store, whose sweep deletes captured bytes nobody fetched — stopped for the same reason. */
|
|
445
|
+
agentDownloadStore?: { stopSweeping(): void; drainSweep(): Promise<void> };
|
|
446
|
+
/**
|
|
447
|
+
* The workflow service, for the tidy-up it runs after each sweep (closing
|
|
448
|
+
* empty requests, removing leftover branches): detached from whatever
|
|
449
|
+
* started it, so stopped and awaited here before the pool goes. Optional:
|
|
450
|
+
* a caller that has not built one passes nothing.
|
|
451
|
+
*/
|
|
452
|
+
workflowService?: { stopTidying(): void; drainTidy(): Promise<void> };
|
|
440
453
|
/** The startup phase's retry, if the boot left one asking — see {@link BootableCore.startupRetry}. */
|
|
441
454
|
startupRetry?: { stop(): void } | null;
|
|
442
455
|
/** The database — its pool is ended last, once nothing above can still need it. */
|
|
@@ -524,10 +537,14 @@ async function releaseCore(deps: CoreStopDeps, remaining: () => number, log: (m:
|
|
|
524
537
|
// synchronous, and it only clears an interval and tells a sweep already
|
|
525
538
|
// running to stop deleting.
|
|
526
539
|
deps.agentUploadStore?.stopSweeping();
|
|
540
|
+
deps.agentDownloadStore?.stopSweeping();
|
|
527
541
|
// A startup phase still asking for an unreachable remote stops asking:
|
|
528
542
|
// synchronous, and nothing after it must be able to clone into a
|
|
529
543
|
// workspaces folder that is about to belong to nobody.
|
|
530
544
|
deps.startupRetry?.stop();
|
|
545
|
+
// The post-sweep tidy-up: no new round, and the one under way stops at its
|
|
546
|
+
// next request or branch. Synchronous.
|
|
547
|
+
deps.workflowService?.stopTidying();
|
|
531
548
|
// Clearing the interval stops future ticks; it does nothing to a job a
|
|
532
549
|
// tick already started, which holds a claim it heartbeats through the
|
|
533
550
|
// pool and is mid-clone or mid-push. Awaited here, in the budget: a job
|
|
@@ -543,6 +560,15 @@ async function releaseCore(deps: CoreStopDeps, remaining: () => number, log: (m:
|
|
|
543
560
|
if (deps.agentUploadStore) {
|
|
544
561
|
await bounded(deps.agentUploadStore.drainSweep(), remaining(), 'finishing the upload sweep', log);
|
|
545
562
|
}
|
|
563
|
+
if (deps.agentDownloadStore) {
|
|
564
|
+
await bounded(deps.agentDownloadStore.drainSweep(), remaining(), 'finishing the download sweep', log);
|
|
565
|
+
}
|
|
566
|
+
// The tidy-up in flight fetches and deletes branches through the pool and
|
|
567
|
+
// the default branch's checkout: awaited, so the next graph for this
|
|
568
|
+
// tenant cannot find a branch deletion still running under it.
|
|
569
|
+
if (deps.workflowService) {
|
|
570
|
+
await bounded(deps.workflowService.drainTidy(), remaining(), 'finishing the branch tidy-up', log);
|
|
571
|
+
}
|
|
546
572
|
await bounded(deps.commitWorker.stop(), remaining(), 'stopping the commit worker', log);
|
|
547
573
|
if (deps.secretsScope !== undefined) unregisterBevelSecretsVariableLoader(deps.secretsScope);
|
|
548
574
|
await bounded(closeDb(deps.db), remaining(), 'ending the database pool', log);
|
package/src/core-config.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import dotenv from 'dotenv';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { fileURLToPath } from 'node:url';
|
|
4
|
-
import { defaultKbTemplateDir } from './assets.js';
|
|
4
|
+
import { defaultKbTemplateDir, defaultStarterPacksDir } from './assets.js';
|
|
5
5
|
import { assertKeyDecodesTo32Bytes } from './shared/token-crypto.js';
|
|
6
6
|
import { DEFAULT_GIT_TIMEOUT_MS } from './modules/workflow/git/node-git-runner.js';
|
|
7
7
|
import { DEFAULT_DB_SCHEMA, assertSchemaName } from './modules/database/connection.js';
|
|
@@ -103,11 +103,13 @@ export interface TenantConfig {
|
|
|
103
103
|
readonly gitUsername: string;
|
|
104
104
|
readonly gitToken: string;
|
|
105
105
|
readonly kbTemplateDir: string;
|
|
106
|
+
readonly starterPacksDir: string;
|
|
106
107
|
readonly updateCheckEnabled: boolean;
|
|
107
108
|
readonly loginPasswordEnabled: boolean;
|
|
108
109
|
readonly allowedEmailDomains: string[];
|
|
109
110
|
readonly secretsEncKey: string;
|
|
110
111
|
readonly internalTokenSecret: string;
|
|
112
|
+
readonly embedSharedSecret: string;
|
|
111
113
|
readonly trustProxy: string;
|
|
112
114
|
readonly gitTimeoutMs: number;
|
|
113
115
|
readonly publicBackendUrl: string;
|
|
@@ -276,6 +278,14 @@ export class CoreConfig implements TenantConfig, ProcessConfig {
|
|
|
276
278
|
* existing one. Override with `KB_TEMPLATE_DIR`.
|
|
277
279
|
*/
|
|
278
280
|
readonly kbTemplateDir: string;
|
|
281
|
+
/**
|
|
282
|
+
* Filesystem path to the starter packs a new knowledge base's admin may
|
|
283
|
+
* pick from (the `starter-packs/` folder shipped inside this package — see
|
|
284
|
+
* `defaultStarterPacksDir()`): one folder per team, each a `pack.yaml` with
|
|
285
|
+
* the pages and the plugin it adds. A distribution offers its own with
|
|
286
|
+
* `STARTER_PACKS_DIR`; a folder holding no valid pack offers none.
|
|
287
|
+
*/
|
|
288
|
+
readonly starterPacksDir: string;
|
|
279
289
|
/**
|
|
280
290
|
* In-app update check. When true (default), `GET /api/update-check` lazily
|
|
281
291
|
* asks api.github.com for the newest Hexis release — only when an admin's
|
|
@@ -337,6 +347,17 @@ export class CoreConfig implements TenantConfig, ProcessConfig {
|
|
|
337
347
|
* independently of user sessions.
|
|
338
348
|
*/
|
|
339
349
|
readonly internalTokenSecret: string;
|
|
350
|
+
/**
|
|
351
|
+
* The shared secret the Atlassian connector presents to \`POST
|
|
352
|
+
* /api/embed/token\` (\`EMBED_SHARED_SECRET\`). Unset on a deployment that
|
|
353
|
+
* has no connector pointed at it, which 404s that one route — the embed
|
|
354
|
+
* surface itself needs no secret, because the MCP App mints through the
|
|
355
|
+
* authenticated MCP session instead.
|
|
356
|
+
*
|
|
357
|
+
* There is deliberately NO framing setting beside it: any site may frame
|
|
358
|
+
* the embed page (see the embed module), so there is no allowlist to keep.
|
|
359
|
+
*/
|
|
360
|
+
readonly embedSharedSecret: string;
|
|
340
361
|
/**
|
|
341
362
|
* Express `trust proxy` setting, from `TRUST_PROXY`: the number of reverse
|
|
342
363
|
* proxy hops in front of this backend (e.g. `1`), or an address/CIDR list
|
|
@@ -477,6 +498,7 @@ export class CoreConfig implements TenantConfig, ProcessConfig {
|
|
|
477
498
|
// Default: the `kb-template/` folder shipped inside this package (works
|
|
478
499
|
// both from src/ and compiled dist/ — see assets.ts).
|
|
479
500
|
this.kbTemplateDir = process.env.KB_TEMPLATE_DIR || defaultKbTemplateDir();
|
|
501
|
+
this.starterPacksDir = process.env.STARTER_PACKS_DIR || defaultStarterPacksDir();
|
|
480
502
|
this.updateCheckEnabled =
|
|
481
503
|
(process.env.UPDATE_CHECK ?? 'true').trim().toLowerCase() !== 'false';
|
|
482
504
|
this.allowedEmailDomains = (process.env.ALLOWED_EMAIL_DOMAINS || '')
|
|
@@ -503,6 +525,7 @@ export class CoreConfig implements TenantConfig, ProcessConfig {
|
|
|
503
525
|
// key never gets past this line.
|
|
504
526
|
assertKeyDecodesTo32Bytes(this.secretsEncKey, secretsKeySource);
|
|
505
527
|
this.internalTokenSecret = (process.env.INTERNAL_TOKEN_SECRET || '').trim();
|
|
528
|
+
this.embedSharedSecret = (process.env.EMBED_SHARED_SECRET || '').trim();
|
|
506
529
|
// Setting DOMAIN declares "the bundled Caddy `https` profile fronts this
|
|
507
530
|
// deployment" — one proxy hop, and the public origin IS that domain. The
|
|
508
531
|
// three values below therefore default from it, so `DOMAIN=x.example.com`
|
package/src/index.ts
CHANGED
|
@@ -47,8 +47,8 @@ export {
|
|
|
47
47
|
type LeasedWorker,
|
|
48
48
|
} from './core/lifecycle.js';
|
|
49
49
|
|
|
50
|
-
// Packaged assets (migrations/, kb-template/) + the migration runners.
|
|
51
|
-
export { coreMigrationsDir, defaultKbTemplateDir } from './assets.js';
|
|
50
|
+
// Packaged assets (migrations/, kb-template/, agent-guide/, starter-packs/) + the migration runners.
|
|
51
|
+
export { agentGuideDir, coreMigrationsDir, defaultKbTemplateDir, defaultStarterPacksDir } from './assets.js';
|
|
52
52
|
export {
|
|
53
53
|
runCoreMigrations,
|
|
54
54
|
runEnterpriseMigrations,
|
|
@@ -25,6 +25,8 @@ describe('AccessControlService — at-ref batch reads (git cat-file --batch)', (
|
|
|
25
25
|
let svc: AccessControlService;
|
|
26
26
|
const workspaceId = 'ws-atref-1';
|
|
27
27
|
const admin = 'razvan@bevel.software';
|
|
28
|
+
/** In no role and named nowhere — read is default-deny for them. */
|
|
29
|
+
const stranger = 'mia@bevel.software';
|
|
28
30
|
|
|
29
31
|
async function git(...args: string[]): Promise<void> {
|
|
30
32
|
await execFileAsync('git', ['-C', repo, ...args]);
|
|
@@ -44,6 +46,10 @@ describe('AccessControlService — at-ref batch reads (git cat-file --batch)', (
|
|
|
44
46
|
'---\nwrite:\n - deny razvan <razvan@bevel.software>\n---\n# denied\n',
|
|
45
47
|
);
|
|
46
48
|
await fs.writeFile(path.join(repo, 'Knowledge/with space.md'), '# spaced\n');
|
|
49
|
+
// For the read batch: a folder the whole organisation may open.
|
|
50
|
+
await fs.mkdir(path.join(repo, 'Knowledge/shared'), { recursive: true });
|
|
51
|
+
await fs.writeFile(path.join(repo, 'Knowledge/shared/access.md'), '---\nread:\n - everyone\n---\n');
|
|
52
|
+
await fs.writeFile(path.join(repo, 'Knowledge/shared/note.md'), '# shared\n');
|
|
47
53
|
|
|
48
54
|
await execFileAsync('git', ['init', '-b', 'main', repo]);
|
|
49
55
|
await git('config', 'user.email', 'test@example.com');
|
|
@@ -96,4 +102,56 @@ describe('AccessControlService — at-ref batch reads (git cat-file --batch)', (
|
|
|
96
102
|
expect(map!.get('Knowledge/denied.md')!.emails.has(admin)).toBe(false);
|
|
97
103
|
expect(map!.get('Knowledge/plain.md')!.emails.has(admin)).toBe(true);
|
|
98
104
|
});
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* The read side of the same batch, used by the change-request read tools to
|
|
108
|
+
* decide which of a request's files their caller may see. The verdicts must
|
|
109
|
+
* be identical to the single-path `canReadAtRef` the app's own content routes
|
|
110
|
+
* gate on — a batch that answered even one path differently would show an
|
|
111
|
+
* agent a file the app refuses to open.
|
|
112
|
+
*/
|
|
113
|
+
it('canReadBatchAtRef answers default-deny, an `everyone` grant, and write-implies-read in one pass', async () => {
|
|
114
|
+
const paths = [
|
|
115
|
+
'Knowledge/plain.md',
|
|
116
|
+
'Knowledge/shared/note.md',
|
|
117
|
+
'Knowledge/with space.md',
|
|
118
|
+
'Knowledge/not-there.md',
|
|
119
|
+
];
|
|
120
|
+
const forStranger = await svc.canReadBatchAtRef(workspaceId, 'main', stranger, paths);
|
|
121
|
+
expect(forStranger).not.toBeNull();
|
|
122
|
+
// Nothing names them, so read is refused — except where the folder says everyone.
|
|
123
|
+
expect(forStranger!.get('Knowledge/plain.md')).toBe(false);
|
|
124
|
+
expect(forStranger!.get('Knowledge/shared/note.md')).toBe(true);
|
|
125
|
+
expect(forStranger!.get('Knowledge/with space.md')).toBe(false);
|
|
126
|
+
expect(forStranger!.get('Knowledge/not-there.md')).toBe(false);
|
|
127
|
+
|
|
128
|
+
// The Admin write grant folds into read.
|
|
129
|
+
const forAdmin = await svc.canReadBatchAtRef(workspaceId, 'main', admin, paths);
|
|
130
|
+
expect([...forAdmin!.values()]).toEqual([true, true, true, true]);
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
it('canReadBatchAtRef matches the single-path read verdict on every path', async () => {
|
|
134
|
+
const paths = [
|
|
135
|
+
'Knowledge/plain.md',
|
|
136
|
+
'Knowledge/shared/note.md',
|
|
137
|
+
'Knowledge/with space.md',
|
|
138
|
+
'Knowledge/not-there.md',
|
|
139
|
+
];
|
|
140
|
+
for (const who of [admin, stranger]) {
|
|
141
|
+
const batch = await svc.canReadBatchAtRef(workspaceId, 'main', who, paths);
|
|
142
|
+
for (const path of paths) {
|
|
143
|
+
const single = await svc.canReadAtRef(workspaceId, 'main', who, path);
|
|
144
|
+
expect(batch!.get(path), `${who} on ${path}`).toBe(single);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
it('canReadBatchAtRef answers an empty map for no paths, and null for a ref it cannot resolve', async () => {
|
|
150
|
+
expect(await svc.canReadBatchAtRef(workspaceId, 'main', admin, [])).toEqual(new Map());
|
|
151
|
+
expect(await svc.canReadBatchAtRef(workspaceId, 'no-such-ref', admin, ['Knowledge/plain.md'])).toBeNull();
|
|
152
|
+
// The null-semantics hold for the empty set too: the ref is validated
|
|
153
|
+
// whatever was asked about, so no caller can read an empty map as proof
|
|
154
|
+
// that the ref resolved.
|
|
155
|
+
expect(await svc.canReadBatchAtRef(workspaceId, 'no-such-ref', admin, [])).toBeNull();
|
|
156
|
+
});
|
|
99
157
|
});
|
|
@@ -67,9 +67,10 @@ describe('restoring a platform file', () => {
|
|
|
67
67
|
// only because it is the file that says who the admin is — the repository
|
|
68
68
|
// that lost that one too is the last case in this file.
|
|
69
69
|
const svc = service();
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
70
|
+
expect(await svc.canRestorePlatformFile(WS, ADMIN, '.bevelignore')).toBe(true);
|
|
71
|
+
// The agent guide is not a platform file: it is served from code, never
|
|
72
|
+
// written to the root, so a root `AGENTS.md` is content and no restore.
|
|
73
|
+
expect(await svc.canRestorePlatformFile(WS, ADMIN, 'AGENTS.md')).toBe(false);
|
|
73
74
|
// Nothing is missing at `roles.yaml`: the root has one. A move is a rename
|
|
74
75
|
// on disk, so landing another there would REPLACE the admin model rather
|
|
75
76
|
// than put it back, and no exception carries that.
|
|
@@ -95,9 +96,9 @@ describe('restoring a platform file', () => {
|
|
|
95
96
|
expect(await svc.canRestorePlatformFile(WS, ENGINEER, 'Sales/Legal/access.md')).toBe(false);
|
|
96
97
|
});
|
|
97
98
|
|
|
98
|
-
it('the
|
|
99
|
+
it('the root-only names are a restore at the root and nowhere else', async () => {
|
|
99
100
|
const svc = service();
|
|
100
|
-
for (const dest of ['Sales/roles.yaml', 'Sales/.bevelignore'
|
|
101
|
+
for (const dest of ['Sales/roles.yaml', 'Sales/.bevelignore']) {
|
|
101
102
|
expect(await svc.canRestorePlatformFile(WS, ADMIN, dest)).toBe(false);
|
|
102
103
|
}
|
|
103
104
|
});
|
|
@@ -113,14 +114,14 @@ describe('restoring a platform file', () => {
|
|
|
113
114
|
|
|
114
115
|
it('a non-admin never gets the exception, wherever it would land', async () => {
|
|
115
116
|
const svc = service();
|
|
116
|
-
for (const dest of ['roles.yaml', '.bevelignore', '
|
|
117
|
+
for (const dest of ['roles.yaml', '.bevelignore', 'access.md', 'Legal/access.md']) {
|
|
117
118
|
expect(await svc.canRestorePlatformFile(WS, ENGINEER, dest)).toBe(false);
|
|
118
119
|
}
|
|
119
120
|
});
|
|
120
121
|
|
|
121
122
|
it('the deployment owner is an admin for it, and an ordinary destination is not a restore for anyone', async () => {
|
|
122
123
|
const svc = service();
|
|
123
|
-
expect(await svc.canRestorePlatformFile(WS, OWNER, '
|
|
124
|
+
expect(await svc.canRestorePlatformFile(WS, OWNER, '.bevelignore')).toBe(true);
|
|
124
125
|
for (const email of [ADMIN, OWNER]) {
|
|
125
126
|
expect(await svc.canRestorePlatformFile(WS, email, 'Sales/deal.md')).toBe(false);
|
|
126
127
|
expect(await svc.canRestorePlatformFile(WS, email, 'Sales/notes.md')).toBe(false);
|
|
@@ -216,6 +216,25 @@ describe('AccessControlService', () => {
|
|
|
216
216
|
expect(await svc.canWrite(workspaceId, 'ali@bevel.software', 'Knowledge/Secret/Foo.md')).toBe(false);
|
|
217
217
|
});
|
|
218
218
|
|
|
219
|
+
// What deleting a nested access.md (delete_file, or the app's delete) does:
|
|
220
|
+
// the folder falls back to its parent's rules, nothing else to undo.
|
|
221
|
+
it('once a nested access.md is deleted, its folder follows the parent\'s rules', async () => {
|
|
222
|
+
const { workspaceDir, repo } = await seedWorkspace(root, workspaceId);
|
|
223
|
+
await writeFile(repo, 'roles.yaml', ROLES_YAML);
|
|
224
|
+
await writeFile(repo, 'access.md', '---\nread:\n - everyone\nwrite:\n - Admin\n---\n');
|
|
225
|
+
await writeFile(repo, 'Team/access.md', '---\nread:\n - deny Felix Kissel <felix@example.com>\n---\n');
|
|
226
|
+
await writeFile(repo, 'Team/plan.md', 'plan');
|
|
227
|
+
|
|
228
|
+
const svc = new AccessControlService(stubWorkspaceService(workspaceId, workspaceDir), PROCESS_MAP_DIR, new NodeFs());
|
|
229
|
+
expect(await svc.canRead(workspaceId, 'felix@example.com', 'Team/plan.md')).toBe(false);
|
|
230
|
+
|
|
231
|
+
await fs.rm(path.join(repo, 'Team/access.md'));
|
|
232
|
+
svc.invalidate(workspaceId);
|
|
233
|
+
|
|
234
|
+
expect(await svc.canRead(workspaceId, 'felix@example.com', 'Team/plan.md')).toBe(true);
|
|
235
|
+
expect(await svc.canWrite(workspaceId, 'felix@example.com', 'Team/plan.md')).toBe(false);
|
|
236
|
+
});
|
|
237
|
+
|
|
219
238
|
it('closeness beats tier: a closer everyone grant overrides a farther email deny', async () => {
|
|
220
239
|
const { workspaceDir, repo } = await seedWorkspace(root, workspaceId);
|
|
221
240
|
await writeFile(repo, 'roles.yaml', ROLES_YAML);
|