@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
|
@@ -40,9 +40,11 @@ export const TEMPLATE_SOURCE_FALLBACKS: ReadonlyMap<string, string> = new Map([
|
|
|
40
40
|
]);
|
|
41
41
|
|
|
42
42
|
/**
|
|
43
|
-
* Where
|
|
44
|
-
*
|
|
45
|
-
*
|
|
43
|
+
* Where a template file may ask for the rules every file tool shares. The
|
|
44
|
+
* packaged template no longer does — the guide is composed in code, see
|
|
45
|
+
* `modules/agent-guide` — but a distribution's template may. Not a layout
|
|
46
|
+
* placeholder: the layout renderer lives in `platform-shared`, which the
|
|
47
|
+
* frontend also reads, and the rules are backend text.
|
|
46
48
|
*/
|
|
47
49
|
export const SHARED_FILE_RULES_PLACEHOLDER = '{{sharedFileRules}}';
|
|
48
50
|
|
|
@@ -13,9 +13,13 @@ import {
|
|
|
13
13
|
canonicalRelativePath,
|
|
14
14
|
folderPlaceholderPath,
|
|
15
15
|
isPlatformFile,
|
|
16
|
+
isPlatformFolder,
|
|
16
17
|
isPlatformRestoreShape,
|
|
18
|
+
isRepositoryOwnFile,
|
|
19
|
+
repositoryOwnFileDeleteRefusal,
|
|
17
20
|
platformFileCreationRefusal,
|
|
18
21
|
platformFileRefusal,
|
|
22
|
+
platformFolderRefusal,
|
|
19
23
|
reservedRootDirNames,
|
|
20
24
|
} from '@bevel-software/platform-shared';
|
|
21
25
|
import { FolderTooLargeError, type ReadTreeFilter } from './workspace.service.js';
|
|
@@ -39,6 +43,7 @@ import { removeEmptyDirs } from './empty-dirs.js';
|
|
|
39
43
|
import '../auth/auth.middleware.js'; // Express Request augmentation
|
|
40
44
|
import type { SkillSaveCheck } from './workspace.tools.js';
|
|
41
45
|
import { MAX_UPLOAD_BYTES } from './upload-limits.js';
|
|
46
|
+
import { OCTET_STREAM, rawExtensionOf, rawMimeFor } from './file-readers/raw-mime.js';
|
|
42
47
|
|
|
43
48
|
/**
|
|
44
49
|
* One file identity from one request field, or `null` when the caller sent
|
|
@@ -571,8 +576,11 @@ export function createWorkspaceRoutes(
|
|
|
571
576
|
res: express.Response,
|
|
572
577
|
workspaceId: string,
|
|
573
578
|
relativePath: string,
|
|
579
|
+
// A caller that has already resolved the user hands it over, so one
|
|
580
|
+
// request is not looked up twice.
|
|
581
|
+
resolvedUser?: { email: string },
|
|
574
582
|
): Promise<boolean> {
|
|
575
|
-
const user = await requireUser(req, res);
|
|
583
|
+
const user = resolvedUser ?? (await requireUser(req, res));
|
|
576
584
|
if (!user) return false;
|
|
577
585
|
let allowed: boolean;
|
|
578
586
|
try {
|
|
@@ -852,27 +860,15 @@ export function createWorkspaceRoutes(
|
|
|
852
860
|
// its own weak ETag and answers a matching If-None-Match with a 304.
|
|
853
861
|
res.setHeader('ETag', `"${at.blobId}"`);
|
|
854
862
|
}
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
'.jpeg': 'image/jpeg',
|
|
860
|
-
'.gif': 'image/gif',
|
|
861
|
-
'.webp': 'image/webp',
|
|
862
|
-
'.svg': 'image/svg+xml',
|
|
863
|
-
'.bmp': 'image/bmp',
|
|
864
|
-
'.ico': 'image/x-icon',
|
|
865
|
-
'.pdf': 'application/pdf',
|
|
866
|
-
'.docx':
|
|
867
|
-
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
|
868
|
-
'.xlsx':
|
|
869
|
-
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
|
870
|
-
};
|
|
863
|
+
// The type from the extension, the one table the embed's raw route
|
|
864
|
+
// serves from as well (`file-readers/raw-mime.ts`).
|
|
865
|
+
const ext = rawExtensionOf(filePath);
|
|
866
|
+
const inlineMime = rawMimeFor(filePath);
|
|
871
867
|
// SVG is active web content (it can carry <script>), and it is active in
|
|
872
868
|
// BOTH directions: a saved-to-disk SVG re-opened later runs its scripts
|
|
873
869
|
// under the file:// origin, so a download is forced to octet-stream.
|
|
874
|
-
const downloadMime = ext === '.svg' ?
|
|
875
|
-
res.setHeader('Content-Type', wantsDownload ? downloadMime :
|
|
870
|
+
const downloadMime = ext === '.svg' ? OCTET_STREAM : inlineMime;
|
|
871
|
+
res.setHeader('Content-Type', wantsDownload ? downloadMime : inlineMime);
|
|
876
872
|
// Block MIME-sniffing so a misdeclared file can't be promoted to
|
|
877
873
|
// active content by the browser.
|
|
878
874
|
res.setHeader('X-Content-Type-Options', 'nosniff');
|
|
@@ -978,9 +974,33 @@ export function createWorkspaceRoutes(
|
|
|
978
974
|
res.status(400).json({ error: 'download=1 is required for folder zip downloads' });
|
|
979
975
|
return;
|
|
980
976
|
}
|
|
981
|
-
|
|
977
|
+
const user = await requireUser(req, res);
|
|
978
|
+
if (!user) return;
|
|
979
|
+
if (!(await requireDownloadPermission(req, res, id, folderPath, user))) return;
|
|
980
|
+
// `download` on the folder lets the caller ASK for the zip. What goes in
|
|
981
|
+
// it is judged file by file, through the two gates the per-file route
|
|
982
|
+
// runs in the same order: a file the caller may not read is left out, and
|
|
983
|
+
// so is one they may read but not download. Nothing in the answer names a
|
|
984
|
+
// left-out file; the count below covers only files the caller could
|
|
985
|
+
// already see in the tree, so it discloses nothing the tree does not.
|
|
986
|
+
let withheld = 0;
|
|
987
|
+
const include = async (paths: string[]): Promise<ReadonlySet<string>> => {
|
|
988
|
+
const readable = await accessControl.canReadBatch(id, user.email, paths);
|
|
989
|
+
const visible = paths.filter((p) => readable.get(p) === true);
|
|
990
|
+
const downloadable = await accessControl.canDownloadBatch(id, user.email, visible);
|
|
991
|
+
const kept = new Set(visible.filter((p) => downloadable.get(p) === true));
|
|
992
|
+
withheld = visible.length - kept.size;
|
|
993
|
+
return kept;
|
|
994
|
+
};
|
|
982
995
|
try {
|
|
983
|
-
const buffer = await workspaceService.createFolderZip(id, folderPath);
|
|
996
|
+
const buffer = await workspaceService.createFolderZip(id, folderPath, include);
|
|
997
|
+
res.setHeader('X-Withheld-Files', String(withheld));
|
|
998
|
+
// One caller's archive: which files it holds, and the count beside it,
|
|
999
|
+
// are that caller's verdicts. `private` keeps a shared cache from
|
|
1000
|
+
// handing it to the next caller; `no-store` because, unlike the single
|
|
1001
|
+
// file, nothing here can be revalidated (no ETag), so a copy is never
|
|
1002
|
+
// worth keeping.
|
|
1003
|
+
res.setHeader('Cache-Control', 'private, no-store');
|
|
984
1004
|
// `|| 'folder'` covers the edge case where `folderPath` itself was
|
|
985
1005
|
// a single bare slash (`/`) that survived the trim — the service
|
|
986
1006
|
// would still reject it as path traversal, but the basename
|
|
@@ -999,7 +1019,11 @@ export function createWorkspaceRoutes(
|
|
|
999
1019
|
res.status(413).json({ error: error.message });
|
|
1000
1020
|
return;
|
|
1001
1021
|
}
|
|
1002
|
-
|
|
1022
|
+
// A traversal refusal (`PathTraversalError`), or the access tree failing
|
|
1023
|
+
// to load while the entries were judged (`AccessConfigError`): both are
|
|
1024
|
+
// domain errors carrying their own status and payload, the same ones
|
|
1025
|
+
// the single-file gate answers with.
|
|
1026
|
+
if (error instanceof WorkflowDomainError) {
|
|
1003
1027
|
sendError(res, error);
|
|
1004
1028
|
return;
|
|
1005
1029
|
}
|
|
@@ -1098,6 +1122,16 @@ export function createWorkspaceRoutes(
|
|
|
1098
1122
|
// Not on disk — let workspaceService.deleteFile return its own 404.
|
|
1099
1123
|
}
|
|
1100
1124
|
if (stat?.isDirectory()) {
|
|
1125
|
+
// A platform folder — the repository root, whose sweep would take the
|
|
1126
|
+
// root's `access.md` and `roles.yaml` with it, or one of the reserved
|
|
1127
|
+
// top-level folders that hold a whole section of the knowledge base —
|
|
1128
|
+
// is refused here as `delete_folder` refuses it, by the same rule.
|
|
1129
|
+
const trimmedFolder = filePath.replace(/\/+$/, '');
|
|
1130
|
+
const folderRel = trimmedFolder === kbDirName ? '' : toKbRelative(trimmedFolder, kbDirName);
|
|
1131
|
+
if (folderRel !== null && isPlatformFolder(folderRel, kb.layout)) {
|
|
1132
|
+
res.status(409).json({ error: platformFolderRefusal(folderRel) });
|
|
1133
|
+
return;
|
|
1134
|
+
}
|
|
1101
1135
|
const branch = branchForWorkspaceId(id);
|
|
1102
1136
|
// In the folder's turn: keeping a folder under this one (a file delete
|
|
1103
1137
|
// racing this one) waits until the sweep is done, and then finds the
|
|
@@ -1166,6 +1200,14 @@ export function createWorkspaceRoutes(
|
|
|
1166
1200
|
res.json({ status: 'deleted', count: filesInDir.length });
|
|
1167
1201
|
return;
|
|
1168
1202
|
}
|
|
1203
|
+
// The root's `access.md` and `roles.yaml` govern the whole repository:
|
|
1204
|
+
// nobody deletes them, here or through the agent tools. A nested
|
|
1205
|
+
// `access.md` is deleted like any file its caller may write.
|
|
1206
|
+
const rel = toKbRelative(filePath, kbDirName);
|
|
1207
|
+
if (rel !== null && isRepositoryOwnFile(rel, kb.layout)) {
|
|
1208
|
+
res.status(409).json({ error: repositoryOwnFileDeleteRefusal(rel) });
|
|
1209
|
+
return;
|
|
1210
|
+
}
|
|
1169
1211
|
await withLock(id, user, filePath, () => workspaceService.deleteFile(id, filePath));
|
|
1170
1212
|
// Deleting content is not deleting structure: an emptied folder stays.
|
|
1171
1213
|
await keepFolderOf(id, user, filePath);
|
|
@@ -13,13 +13,14 @@ import {
|
|
|
13
13
|
entryExistsMessage,
|
|
14
14
|
type ExistingEntryKind,
|
|
15
15
|
} from '@bevel-software/platform-shared';
|
|
16
|
-
import { isAbsence, type ITreeWalker, type TreeWalkOptions } from '../../shared/fs.contract.js';
|
|
16
|
+
import { isAbsence, type IgnoreRules, type ITreeWalker, type TreeWalkOptions } from '../../shared/fs.contract.js';
|
|
17
|
+
import { BevelIgnoreStack } from '../kb-fs/bevel-ignore.js';
|
|
17
18
|
import {
|
|
18
19
|
DestinationTakenError,
|
|
19
20
|
inspectDestination,
|
|
20
21
|
renameNoReplace,
|
|
21
22
|
} from '../../shared/rename-no-replace.js';
|
|
22
|
-
import type
|
|
23
|
+
import { GitRunError, type IGitRunner } from '../../shared/git.contract.js';
|
|
23
24
|
import type { KbContext } from '../../shared/kb-context.js';
|
|
24
25
|
import { NodeGitRunner } from '../workflow/git/node-git-runner.js';
|
|
25
26
|
import { assertWithinDirectory } from '../../shared/path-containment.js';
|
|
@@ -47,6 +48,7 @@ import { setAsideClone, setAsideRootFor, setAsideStamp } from './set-aside-clone
|
|
|
47
48
|
import {
|
|
48
49
|
cloneCredentialArgs,
|
|
49
50
|
cloneCredentialConfigArgs,
|
|
51
|
+
credentialHelperValue,
|
|
50
52
|
cloneTrackingConfigArgs,
|
|
51
53
|
SAFE_IMPLICIT_FETCH_ARGS,
|
|
52
54
|
} from '../kb-fs/clone-config.js';
|
|
@@ -98,7 +100,20 @@ const UNZIP_MAX_TOTAL_BYTES = 500 * 1024 * 1024; // 500 MB across the whole arch
|
|
|
98
100
|
// Folder-download cap. The whole zip is built in memory by adm-zip (no
|
|
99
101
|
// streaming) so the cap also bounds peak heap usage for one download.
|
|
100
102
|
// Reuses the unzip total as a single "fits in a workspace" budget.
|
|
101
|
-
const ZIP_DOWNLOAD_MAX_BYTES = UNZIP_MAX_TOTAL_BYTES;
|
|
103
|
+
export const ZIP_DOWNLOAD_MAX_BYTES = UNZIP_MAX_TOTAL_BYTES;
|
|
104
|
+
|
|
105
|
+
// How many files one agent download request may carry: what one zip may hold
|
|
106
|
+
// for `apply_file_upload` to unzip it back, and a bound on the lists a
|
|
107
|
+
// request builds before anything is judged.
|
|
108
|
+
export const DOWNLOAD_MAX_FILES = UNZIP_MAX_ENTRIES;
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Which of a folder's files a zip may pack: handed every file the walk found
|
|
112
|
+
* (repository-relative, POSIX separators), answers the set to include. The
|
|
113
|
+
* route builds one from the caller's `read` and `download` verdicts — see
|
|
114
|
+
* `createFolderZip` for why it is required.
|
|
115
|
+
*/
|
|
116
|
+
export type ZipEntryFilter = (repoRelativePaths: string[]) => Promise<ReadonlySet<string>>;
|
|
102
117
|
|
|
103
118
|
/**
|
|
104
119
|
* Thrown by `createFolderZip` when the cumulative uncompressed bytes exceed
|
|
@@ -429,6 +444,50 @@ export class WorkspaceService implements IWorkspaceService {
|
|
|
429
444
|
}
|
|
430
445
|
}
|
|
431
446
|
|
|
447
|
+
/**
|
|
448
|
+
* Does `branch` certainly not exist? Asked by the tool handler before a tool
|
|
449
|
+
* runs, so a call naming a branch nobody ever pushed is answered 404 without
|
|
450
|
+
* a workspace being created for it.
|
|
451
|
+
*
|
|
452
|
+
* Never clones and never creates a directory. A branch this platform has a
|
|
453
|
+
* clone of, is cloning, or has ever heard of is NOT missing: one that origin
|
|
454
|
+
* has since deleted is left to the open, which answers its 410. Anything
|
|
455
|
+
* else is asked of origin with `ls-remote`, and only origin's "no such ref"
|
|
456
|
+
* makes it missing. A name that is malformed, or a remote that could not be
|
|
457
|
+
* asked, is `false` too: the open then answers for it, exactly as before.
|
|
458
|
+
* A storage fault reading what this platform has heard of is NOT read as
|
|
459
|
+
* either answer: it propagates, the 500 the operator reads.
|
|
460
|
+
*/
|
|
461
|
+
async isBranchMissing(branch: string): Promise<boolean> {
|
|
462
|
+
try {
|
|
463
|
+
assertValidBranchName(branch);
|
|
464
|
+
} catch {
|
|
465
|
+
return false;
|
|
466
|
+
}
|
|
467
|
+
if (this.branchDirs.has(branch) || this.inFlightBootstraps.has(branch)) return false;
|
|
468
|
+
if (await this.hasHeardOfBranch(branch)) return false;
|
|
469
|
+
const helper = credentialHelperValue(this.gitRunner.credentials);
|
|
470
|
+
try {
|
|
471
|
+
const { stdout } = await this.gitRunner.run(this.workspacesRoot, [
|
|
472
|
+
...(helper ? ['-c', `credential.helper=${helper}`] : []),
|
|
473
|
+
'ls-remote',
|
|
474
|
+
'--exit-code',
|
|
475
|
+
'--heads',
|
|
476
|
+
'--end-of-options',
|
|
477
|
+
this.kbRepoUrl(),
|
|
478
|
+
`refs/heads/${branch}`,
|
|
479
|
+
]);
|
|
480
|
+
// The argument is a PATTERN, matched at any slash boundary: it also
|
|
481
|
+
// lists `refs/heads/refs/heads/<branch>`. Only the exact ref counts.
|
|
482
|
+
const ref = `refs/heads/${branch}`;
|
|
483
|
+
return !stdout.split('\n').some((line) => line.split('\t')[1]?.trim() === ref);
|
|
484
|
+
} catch (err) {
|
|
485
|
+
// `--exit-code`: 2 is "the remote answered, and has no matching ref".
|
|
486
|
+
// Every other failure is a remote we could not ask.
|
|
487
|
+
return err instanceof GitRunError && err.exitCode === 2;
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
|
|
432
491
|
/**
|
|
433
492
|
* Build git clone args. Credentials go in as `clone --config`, which both
|
|
434
493
|
* authenticates this clone and leaves the helper in the new repo's config for
|
|
@@ -1309,6 +1368,25 @@ export class WorkspaceService implements IWorkspaceService {
|
|
|
1309
1368
|
return fs.readFile(absolutePath);
|
|
1310
1369
|
}
|
|
1311
1370
|
|
|
1371
|
+
/**
|
|
1372
|
+
* Whether a FILE is at `wsPath` — the same guards as a read, without the
|
|
1373
|
+
* read: for a caller that only has to know the file is there (the embed
|
|
1374
|
+
* mint), on a file that may be hundreds of megabytes.
|
|
1375
|
+
*/
|
|
1376
|
+
async isFile(workspaceId: string, wsPath: string): Promise<boolean> {
|
|
1377
|
+
const { workspaceDir, relativePath, absolutePath } = await this.resolveInsideRepo(workspaceId, wsPath);
|
|
1378
|
+
assertNoGitInternalsSegment(relativePath);
|
|
1379
|
+
await assertNotGitInternals(workspaceDir, relativePath, absolutePath);
|
|
1380
|
+
await this.assertNotThroughLink(absolutePath, workspaceDir);
|
|
1381
|
+
try {
|
|
1382
|
+
return (await fs.stat(absolutePath)).isFile();
|
|
1383
|
+
} catch (err) {
|
|
1384
|
+
const code = (err as NodeJS.ErrnoException).code;
|
|
1385
|
+
if (code === 'ENOENT' || code === 'ENOTDIR') return false;
|
|
1386
|
+
throw err;
|
|
1387
|
+
}
|
|
1388
|
+
}
|
|
1389
|
+
|
|
1312
1390
|
/**
|
|
1313
1391
|
* Refuse a path that reaches its file through a symbolic link — as the
|
|
1314
1392
|
* final component, or as any directory between the workspace root and it.
|
|
@@ -1406,7 +1484,23 @@ export class WorkspaceService implements IWorkspaceService {
|
|
|
1406
1484
|
* size crosses `ZIP_DOWNLOAD_MAX_BYTES`. Buffered in memory (adm-zip has
|
|
1407
1485
|
* no streaming API); the cap therefore doubles as a peak-heap bound.
|
|
1408
1486
|
*/
|
|
1409
|
-
|
|
1487
|
+
/**
|
|
1488
|
+
* Zip a folder. `include` is asked, ONCE, which of the folder's files may
|
|
1489
|
+
* go in: it is handed every file the walk found, as repository-relative
|
|
1490
|
+
* paths, and answers the set to pack. Required, not optional, and with no
|
|
1491
|
+
* default that packs everything: the route used to gate `download` on the
|
|
1492
|
+
* folder alone and pack every file under it, so a caller with `download`
|
|
1493
|
+
* on a folder got files whose own rules (frontmatter, a nested access.md)
|
|
1494
|
+
* denied them `read` or `download` — files the per-file route refused and
|
|
1495
|
+
* the file tree never showed. A caller that wants everything says so by
|
|
1496
|
+
* returning everything; it cannot get it by saying nothing.
|
|
1497
|
+
*
|
|
1498
|
+
* Two passes rather than a judgement per file inside the walk: the access
|
|
1499
|
+
* model answers a list in one load, and a folder of a thousand files is
|
|
1500
|
+
* the case a per-file call would make slow. The size cap counts only the
|
|
1501
|
+
* files packed; a withheld file costs nothing and reveals nothing.
|
|
1502
|
+
*/
|
|
1503
|
+
async createFolderZip(workspaceId: string, wsPath: string, include: ZipEntryFilter): Promise<Buffer> {
|
|
1410
1504
|
const { workspaceDir, relativePath, absolutePath: absoluteRoot } = await this.resolveInsideRepo(workspaceId, wsPath);
|
|
1411
1505
|
assertNoGitInternalsSegment(relativePath);
|
|
1412
1506
|
await assertNotGitInternals(workspaceDir, relativePath, absoluteRoot);
|
|
@@ -1415,36 +1509,101 @@ export class WorkspaceService implements IWorkspaceService {
|
|
|
1415
1509
|
throw new Error('Not a directory');
|
|
1416
1510
|
}
|
|
1417
1511
|
|
|
1512
|
+
// `relativePath` is workspace-relative, `<kbDirName>/<folder>`; the
|
|
1513
|
+
// access rules are keyed inside the repository, so the prefix comes off
|
|
1514
|
+
// here (and the repository root itself is the empty prefix).
|
|
1515
|
+
// A trailing slash the caller wrote (`docs/`) survives normalisation and
|
|
1516
|
+
// would key every file as `docs//x.md`, which no verdict matches: the
|
|
1517
|
+
// filter would then withhold the whole folder in silence.
|
|
1518
|
+
const folderInRepo = (relativePath === this.kbDirName ? '' : relativePath.slice(this.kbDirName.length + 1)).replace(/\/+$/, '');
|
|
1519
|
+
const found: { dir: string; name: string; repoRelative: string }[] = [];
|
|
1520
|
+
await this.disk.walk(absoluteRoot, explorerWalk(), [
|
|
1521
|
+
{
|
|
1522
|
+
async onFile(dir, name) {
|
|
1523
|
+
found.push({ dir, name, repoRelative: [folderInRepo, dir, name].filter(Boolean).join('/') });
|
|
1524
|
+
},
|
|
1525
|
+
},
|
|
1526
|
+
]);
|
|
1527
|
+
const allowed = await include(found.map((f) => f.repoRelative));
|
|
1528
|
+
|
|
1418
1529
|
const zipRoot = path.basename(absoluteRoot) || 'folder';
|
|
1419
1530
|
const zip = new AdmZip();
|
|
1420
1531
|
let totalBytes = 0;
|
|
1532
|
+
for (const { dir, name, repoRelative } of found) {
|
|
1533
|
+
if (!allowed.has(repoRelative)) continue;
|
|
1534
|
+
const childAbs = path.join(absoluteRoot, dir, name);
|
|
1535
|
+
// Check the size cap BEFORE reading the file into memory. Reading
|
|
1536
|
+
// first would let a single hostile 2 GB file allocate the whole
|
|
1537
|
+
// buffer before the throw — defeating the cap as a peak-heap
|
|
1538
|
+
// bound. `stat.size` is an upper bound that we re-verify after
|
|
1539
|
+
// the read in case the file grew between stat and readFile.
|
|
1540
|
+
const stat = await fs.stat(childAbs);
|
|
1541
|
+
if (totalBytes + stat.size > ZIP_DOWNLOAD_MAX_BYTES) {
|
|
1542
|
+
throw new FolderTooLargeError(ZIP_DOWNLOAD_MAX_BYTES);
|
|
1543
|
+
}
|
|
1544
|
+
const data = await fs.readFile(childAbs);
|
|
1545
|
+
if (totalBytes + data.byteLength > ZIP_DOWNLOAD_MAX_BYTES) {
|
|
1546
|
+
throw new FolderTooLargeError(ZIP_DOWNLOAD_MAX_BYTES);
|
|
1547
|
+
}
|
|
1548
|
+
totalBytes += data.byteLength;
|
|
1549
|
+
// Path inside the archive: <folderName>/<relPathUnderFolder>, POSIX
|
|
1550
|
+
// separators regardless of host OS so the zip extracts cleanly
|
|
1551
|
+
// on Windows/Mac/Linux alike.
|
|
1552
|
+
zip.addFile(`${zipRoot}/${dir ? `${dir}/${name}` : name}`, data);
|
|
1553
|
+
}
|
|
1554
|
+
return zip.toBuffer();
|
|
1555
|
+
}
|
|
1421
1556
|
|
|
1422
|
-
|
|
1557
|
+
/**
|
|
1558
|
+
* What is at `wsPath`, for an agent download: nothing, one file, or a folder
|
|
1559
|
+
* and every file the explorer shows under it (the folder download's walk —
|
|
1560
|
+
* no `.git/`, no `.gitkeep`, no `.bevelignore`d path, no link). Files come
|
|
1561
|
+
* back repository-relative, with their size on disk; nothing is read, and
|
|
1562
|
+
* nothing is judged — the caller judges every path on its own.
|
|
1563
|
+
*
|
|
1564
|
+
* The `.bevelignore` rules are those in force at the folder, its ancestors'
|
|
1565
|
+
* included, as the explorer's walk from the root has them: a folder an
|
|
1566
|
+
* ancestor's rule hides holds no files. The whole folder is walked, as the
|
|
1567
|
+
* explorer walks it: a cap here would be a cap on files the caller may not
|
|
1568
|
+
* read as much as on the ones they may, and the limit a request is held to
|
|
1569
|
+
* is the caller's own count, judged after the read verdicts.
|
|
1570
|
+
*
|
|
1571
|
+
* A path that reaches its target through a link, or names the git folder,
|
|
1572
|
+
* is refused as the reads refuse it; a path with nothing at it is
|
|
1573
|
+
* `missing`, which the caller answers exactly as a path it may not read.
|
|
1574
|
+
*/
|
|
1575
|
+
async downloadCandidatesAt(
|
|
1576
|
+
workspaceId: string,
|
|
1577
|
+
wsPath: string,
|
|
1578
|
+
): Promise<{ kind: 'missing' } | { kind: 'file' | 'folder'; files: { path: string; bytes: number }[] }> {
|
|
1579
|
+
const { workspaceDir, relativePath, absolutePath } = await this.resolveInsideRepo(workspaceId, wsPath);
|
|
1580
|
+
assertNoGitInternalsSegment(relativePath);
|
|
1581
|
+
await assertNotGitInternals(workspaceDir, relativePath, absolutePath);
|
|
1582
|
+
await this.assertNotThroughLink(absolutePath, workspaceDir);
|
|
1583
|
+
let stat;
|
|
1584
|
+
try {
|
|
1585
|
+
stat = await fs.lstat(absolutePath);
|
|
1586
|
+
} catch (err) {
|
|
1587
|
+
if ((err as NodeJS.ErrnoException).code === 'ENOENT' || (err as NodeJS.ErrnoException).code === 'ENOTDIR') {
|
|
1588
|
+
return { kind: 'missing' };
|
|
1589
|
+
}
|
|
1590
|
+
throw err;
|
|
1591
|
+
}
|
|
1592
|
+
const inRepo = (relativePath === this.kbDirName ? '' : relativePath.slice(this.kbDirName.length + 1)).replace(/\/+$/, '');
|
|
1593
|
+
if (stat.isFile()) return { kind: 'file', files: [{ path: inRepo, bytes: stat.size }] };
|
|
1594
|
+
if (!stat.isDirectory()) return { kind: 'missing' };
|
|
1595
|
+
const files: { path: string; bytes: number }[] = [];
|
|
1596
|
+
const rules = await ignoreRulesAbove(path.join(workspaceDir, this.kbDirName), inRepo);
|
|
1597
|
+
if (!rules) return { kind: 'folder', files };
|
|
1598
|
+
await this.disk.walk(absolutePath, { ...explorerWalk(), ignore: rules }, [
|
|
1423
1599
|
{
|
|
1424
1600
|
async onFile(dir, name) {
|
|
1425
|
-
const
|
|
1426
|
-
|
|
1427
|
-
// first would let a single hostile 2 GB file allocate the whole
|
|
1428
|
-
// buffer before the throw — defeating the cap as a peak-heap
|
|
1429
|
-
// bound. `stat.size` is an upper bound that we re-verify after
|
|
1430
|
-
// the read in case the file grew between stat and readFile.
|
|
1431
|
-
const stat = await fs.stat(childAbs);
|
|
1432
|
-
if (totalBytes + stat.size > ZIP_DOWNLOAD_MAX_BYTES) {
|
|
1433
|
-
throw new FolderTooLargeError(ZIP_DOWNLOAD_MAX_BYTES);
|
|
1434
|
-
}
|
|
1435
|
-
const data = await fs.readFile(childAbs);
|
|
1436
|
-
if (totalBytes + data.byteLength > ZIP_DOWNLOAD_MAX_BYTES) {
|
|
1437
|
-
throw new FolderTooLargeError(ZIP_DOWNLOAD_MAX_BYTES);
|
|
1438
|
-
}
|
|
1439
|
-
totalBytes += data.byteLength;
|
|
1440
|
-
// Path inside the archive: <folderName>/<relPathUnderFolder>, POSIX
|
|
1441
|
-
// separators regardless of host OS so the zip extracts cleanly
|
|
1442
|
-
// on Windows/Mac/Linux alike.
|
|
1443
|
-
zip.addFile(`${zipRoot}/${dir ? `${dir}/${name}` : name}`, data);
|
|
1601
|
+
const size = (await fs.lstat(path.join(absolutePath, dir, name))).size;
|
|
1602
|
+
files.push({ path: [inRepo, dir, name].filter(Boolean).join('/'), bytes: size });
|
|
1444
1603
|
},
|
|
1445
1604
|
},
|
|
1446
1605
|
]);
|
|
1447
|
-
return
|
|
1606
|
+
return { kind: 'folder', files };
|
|
1448
1607
|
}
|
|
1449
1608
|
|
|
1450
1609
|
/**
|
|
@@ -2514,6 +2673,24 @@ export class WorkspaceService implements IWorkspaceService {
|
|
|
2514
2673
|
}
|
|
2515
2674
|
}
|
|
2516
2675
|
|
|
2676
|
+
/**
|
|
2677
|
+
* The `.bevelignore` rules in force ABOVE the folder `inRepo` (repository-
|
|
2678
|
+
* relative, `''` for the root) — the root's file and every ancestor's, not
|
|
2679
|
+
* the folder's own, which a walk from the folder layers itself — or null when
|
|
2680
|
+
* one of those rules hides the folder or an ancestor, as the explorer's walk
|
|
2681
|
+
* from the root would never enter it.
|
|
2682
|
+
*/
|
|
2683
|
+
async function ignoreRulesAbove(repoRoot: string, inRepo: string): Promise<IgnoreRules | null> {
|
|
2684
|
+
let rules: IgnoreRules = BevelIgnoreStack.empty();
|
|
2685
|
+
let dir = repoRoot;
|
|
2686
|
+
for (const segment of inRepo.split('/').filter(Boolean)) {
|
|
2687
|
+
rules = await rules.extendedWith(dir);
|
|
2688
|
+
dir = path.join(dir, segment);
|
|
2689
|
+
if (rules.isIgnored(dir, true)) return null;
|
|
2690
|
+
}
|
|
2691
|
+
return rules;
|
|
2692
|
+
}
|
|
2693
|
+
|
|
2517
2694
|
/**
|
|
2518
2695
|
* The explorer's walk of a workspace: no git internals (never user content,
|
|
2519
2696
|
* and listing it would blow up the tree), no `.gitkeep` (the empty-folder
|