@bevel-software/platform-core-backend 0.26.0 → 0.28.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 +17 -0
- package/agent-guide/conventions.md +8 -0
- package/agent-guide/html-views.md +83 -0
- package/agent-guide/new-knowledge-base.md +24 -0
- package/agent-guide/tool-manuals.md +10 -0
- package/dist/assets.d.ts +19 -0
- package/dist/assets.d.ts.map +1 -1
- package/dist/assets.js +26 -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/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 +56 -5
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +33 -0
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +105 -8
- 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 +31 -0
- package/dist/modules/access/access-control.service.js.map +1 -1
- package/dist/modules/access/access.routes.d.ts +4 -1
- package/dist/modules/access/access.routes.d.ts.map +1 -1
- package/dist/modules/access/access.routes.js +66 -7
- package/dist/modules/access/access.routes.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/access/roles-admin.service.d.ts +35 -6
- package/dist/modules/access/roles-admin.service.d.ts.map +1 -1
- package/dist/modules/access/roles-admin.service.js +36 -9
- package/dist/modules/access/roles-admin.service.js.map +1 -1
- package/dist/modules/access/user-access-removal.service.js +1 -1
- package/dist/modules/access/user-access-removal.service.js.map +1 -1
- package/dist/modules/agent-guide/agent-guide.d.ts +6 -0
- package/dist/modules/agent-guide/agent-guide.d.ts.map +1 -1
- package/dist/modules/agent-guide/agent-guide.js +8 -0
- package/dist/modules/agent-guide/agent-guide.js.map +1 -1
- package/dist/modules/agent-guide/index.d.ts +1 -1
- package/dist/modules/agent-guide/index.d.ts.map +1 -1
- package/dist/modules/agent-guide/index.js +1 -1
- package/dist/modules/agent-guide/index.js.map +1 -1
- package/dist/modules/agent-instructions/compose.d.ts +5 -0
- package/dist/modules/agent-instructions/compose.d.ts.map +1 -1
- package/dist/modules/agent-instructions/compose.js +19 -2
- package/dist/modules/agent-instructions/compose.js.map +1 -1
- package/dist/modules/agent-instructions/shared-file-rules.js +19 -19
- 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-hooks.d.ts +46 -0
- package/dist/modules/auth/account-hooks.d.ts.map +1 -0
- package/dist/modules/auth/account-hooks.js +25 -0
- package/dist/modules/auth/account-hooks.js.map +1 -0
- package/dist/modules/auth/account-switch-guard.d.ts +15 -0
- package/dist/modules/auth/account-switch-guard.d.ts.map +1 -0
- package/dist/modules/auth/account-switch-guard.js +2 -0
- package/dist/modules/auth/account-switch-guard.js.map +1 -0
- package/dist/modules/auth/account-switch-lock.d.ts +34 -0
- package/dist/modules/auth/account-switch-lock.d.ts.map +1 -0
- package/dist/modules/auth/account-switch-lock.js +48 -0
- package/dist/modules/auth/account-switch-lock.js.map +1 -0
- package/dist/modules/auth/account.routes.d.ts +4 -1
- package/dist/modules/auth/account.routes.d.ts.map +1 -1
- package/dist/modules/auth/account.routes.js +110 -13
- 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/auth/auth.service.d.ts +101 -6
- package/dist/modules/auth/auth.service.d.ts.map +1 -1
- package/dist/modules/auth/auth.service.js +246 -51
- package/dist/modules/auth/auth.service.js.map +1 -1
- package/dist/modules/auth/password-hash.d.ts +5 -2
- package/dist/modules/auth/password-hash.d.ts.map +1 -1
- package/dist/modules/auth/password-hash.js +5 -2
- package/dist/modules/auth/password-hash.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/database/pg-error.d.ts +9 -0
- package/dist/modules/database/pg-error.d.ts.map +1 -0
- package/dist/modules/database/pg-error.js +17 -0
- package/dist/modules/database/pg-error.js.map +1 -0
- 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 +28 -1
- package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.service.js +64 -8
- 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/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/settings/deployment-settings.service.d.ts +34 -0
- package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
- package/dist/modules/settings/deployment-settings.service.js +134 -1
- 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/skills/skills.tools.d.ts.map +1 -1
- package/dist/modules/skills/skills.tools.js +50 -32
- 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.tools.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.js +14 -5
- package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
- package/dist/modules/tool-registry/description-length.d.ts +6 -2
- package/dist/modules/tool-registry/description-length.d.ts.map +1 -1
- package/dist/modules/tool-registry/description-length.js +27 -5
- package/dist/modules/tool-registry/description-length.js.map +1 -1
- package/dist/modules/tool-registry/guide-first.d.ts +4 -0
- package/dist/modules/tool-registry/guide-first.d.ts.map +1 -1
- package/dist/modules/tool-registry/guide-first.js +9 -1
- package/dist/modules/tool-registry/guide-first.js.map +1 -1
- package/dist/modules/workflow/agent-tools/change-request-read.tools.d.ts +53 -0
- package/dist/modules/workflow/agent-tools/change-request-read.tools.d.ts.map +1 -1
- package/dist/modules/workflow/agent-tools/change-request-read.tools.js +97 -68
- package/dist/modules/workflow/agent-tools/change-request-read.tools.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 +124 -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 +72 -1
- package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/git.service.js +172 -36
- package/dist/modules/workflow/git/git.service.js.map +1 -1
- 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/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.map +1 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.js +2 -1
- 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.service.d.ts +183 -15
- package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.service.js +807 -107
- 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 +3 -13
- package/dist/modules/workspace/startup/steps/seed-tree.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 +59 -1
- package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.tools.js +443 -65
- 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 +73 -1
- package/dist/shared/domain-errors.d.ts.map +1 -1
- package/dist/shared/domain-errors.js +86 -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/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/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 +5 -3
- package/src/__tests__/packaged-assets-ship.test.ts +16 -4
- package/src/__tests__/pg-scratch.ts +48 -0
- package/src/assets.ts +28 -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/create-core-server.ts +69 -3
- package/src/core/create-core-services.ts +151 -6
- 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.admin-root-floor.test.ts +1 -0
- package/src/modules/access/__tests__/access-control.service.test.ts +19 -0
- package/src/modules/access/__tests__/access.routes.admins.test.ts +203 -0
- package/src/modules/access/__tests__/access.routes.batch.test.ts +25 -5
- package/src/modules/access/__tests__/access.routes.folder-governs.test.ts +1 -0
- package/src/modules/access/__tests__/access.routes.group-grant.test.ts +1 -1
- package/src/modules/access/__tests__/access.routes.overrides.test.ts +1 -1
- package/src/modules/access/__tests__/access.routes.proposal-branch.test.ts +1 -0
- package/src/modules/access/__tests__/access.routes.prospective.test.ts +1 -0
- package/src/modules/access/__tests__/access.routes.revoke.test.ts +1 -1
- package/src/modules/access/__tests__/access.routes.unknown-email.test.ts +1 -0
- package/src/modules/access/__tests__/roles-admin.security.test.ts +1 -1
- package/src/modules/access/__tests__/roles-admin.service.test.ts +15 -2
- package/src/modules/access/__tests__/roles.routes.test.ts +132 -7
- package/src/modules/access/__tests__/user-access-removal.service.test.ts +2 -2
- package/src/modules/access/__tests__/users-db-double.ts +12 -3
- package/src/modules/access/access-control.interface.ts +23 -0
- package/src/modules/access/access-control.service.ts +35 -0
- package/src/modules/access/access.routes.ts +67 -6
- package/src/modules/access/directory-sync-bot.ts +1 -1
- package/src/modules/access/roles-admin.service.ts +51 -11
- package/src/modules/access/user-access-removal.service.ts +1 -1
- package/src/modules/agent-guide/__tests__/agent-guide.test.ts +58 -0
- package/src/modules/agent-guide/__tests__/agent-guide.tools.test.ts +19 -1
- package/src/modules/agent-guide/agent-guide.ts +9 -0
- package/src/modules/agent-guide/index.ts +1 -0
- package/src/modules/agent-instructions/__tests__/shared-file-rules.test.ts +14 -0
- package/src/modules/agent-instructions/compose.ts +17 -2
- package/src/modules/agent-instructions/shared-file-rules.ts +19 -19
- 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-deactivation.test.ts +145 -16
- package/src/modules/auth/__tests__/account-hooks.test.ts +57 -0
- package/src/modules/auth/__tests__/account-switch-lock.pg.test.ts +78 -0
- package/src/modules/auth/__tests__/account-switch-lock.test.ts +43 -0
- package/src/modules/auth/__tests__/account.routes.test.ts +387 -9
- package/src/modules/auth/__tests__/auth.service.created.pg.test.ts +69 -0
- package/src/modules/auth/__tests__/auth.service.test.ts +159 -1
- package/src/modules/auth/account-hooks.ts +69 -0
- package/src/modules/auth/account-switch-guard.ts +14 -0
- package/src/modules/auth/account-switch-lock.ts +58 -0
- package/src/modules/auth/account.routes.ts +122 -13
- package/src/modules/auth/auth.middleware.ts +1 -1
- package/src/modules/auth/auth.service.ts +268 -52
- package/src/modules/auth/password-hash.ts +5 -2
- 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/__tests__/pg-error.test.ts +21 -0
- package/src/modules/database/__tests__/pii-backfill.pg.test.ts +6 -27
- package/src/modules/database/core-schema.ts +33 -3
- package/src/modules/database/pg-error.ts +15 -0
- 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__/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 +3 -1
- package/src/modules/mcp/__tests__/mcp.service.test.ts +23 -13
- package/src/modules/mcp/__tests__/tool-call-interface.e2e.test.ts +499 -0
- package/src/modules/mcp/mcp-auth.middleware.ts +2 -1
- package/src/modules/mcp/mcp.service.ts +81 -12
- package/src/modules/mcp/oauth/bevel-oauth-provider.ts +42 -4
- 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 +25 -2
- 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/settings/__tests__/deployment-settings.service.test.ts +150 -1
- package/src/modules/settings/__tests__/repository-source.test.ts +9 -0
- package/src/modules/settings/deployment-settings.service.ts +131 -1
- package/src/modules/settings/repository-source.ts +4 -4
- package/src/modules/skills/__tests__/skills.tools.description.test.ts +5 -1
- package/src/modules/skills/skills.tools.ts +55 -35
- 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/tool-manuals.tools.ts +15 -5
- package/src/modules/tool-registry/__tests__/own-tool-schemas.test.ts +14 -1
- package/src/modules/tool-registry/__tests__/tool-description-length.test.ts +23 -10
- package/src/modules/tool-registry/description-length.ts +34 -7
- package/src/modules/tool-registry/guide-first.ts +8 -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.tools.test.ts +41 -5
- package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +127 -2
- package/src/modules/workflow/agent-tools/change-request-read.tools.ts +157 -122
- package/src/modules/workflow/agent-tools/workflow.tools.ts +129 -35
- package/src/modules/workflow/file-lock.service.ts +67 -5
- package/src/modules/workflow/git/__tests__/git.service.deleteBranch.test.ts +164 -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/git.service.ts +176 -38
- package/src/modules/workflow/git/node-git-runner.ts +82 -7
- 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/review-workflow.service.ts +2 -1
- package/src/modules/workflow/sanitize-error.ts +50 -0
- package/src/modules/workflow/workflow.service.ts +881 -113
- package/src/modules/workspace/__tests__/agent-downloads.test.ts +823 -0
- 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.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.branch-errors.test.ts +44 -1
- package/src/modules/workspace/__tests__/workspace.tools.test.ts +409 -12
- 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/seed-tree.ts +3 -12
- 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 +492 -63
- 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 +108 -11
- package/src/shared/git.contract.ts +8 -1
- 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
|
@@ -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,22 @@ 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';
|
|
68
|
+
import { AccountHooks, type IAccountHooks } from '../modules/auth/account-hooks.js';
|
|
61
69
|
import { AccountErasureService } from '../modules/auth/account-erasure.service.js';
|
|
62
70
|
import { OidcAuthProvider, oidcSettingsFrom } from '../modules/auth/oidc-auth-provider.js';
|
|
63
|
-
import { createAuthMiddleware } from '../modules/auth/auth.middleware.js';
|
|
71
|
+
import { createAuthMiddleware, readAuthCookie } from '../modules/auth/auth.middleware.js';
|
|
64
72
|
import { AccessControlService, loadActiveGroups } from '../modules/access/access-control.service.js';
|
|
65
73
|
import { CreatorAccessService } from '../modules/access/creator-access.js';
|
|
66
74
|
import { ChangeReadGate } from '../modules/access/change-read-gate.js';
|
|
67
75
|
import { GroupsAdminService } from '../modules/access/groups-admin.service.js';
|
|
68
76
|
import { UserAccessRemovalService } from '../modules/access/user-access-removal.service.js';
|
|
77
|
+
import { makeRolesYamlWriteValidator } from '../modules/access-model/roles-yaml-guard.js';
|
|
69
78
|
import { PendingSkillsService, SkillService } from '../modules/skills/index.js';
|
|
70
79
|
import { PendingToolsService, ToolManualService } from '../modules/tool-manuals/index.js';
|
|
71
80
|
import { McpServerEditService } from '../modules/tool-manuals/mcp-server-edit.service.js';
|
|
@@ -110,6 +119,7 @@ import { ReviewWorkflowService } from '../modules/workflow/review-workflow/revie
|
|
|
110
119
|
import { FileLockService } from '../modules/workflow/file-lock.service.js';
|
|
111
120
|
import { WorkflowEventBus } from '../modules/workflow/event-bus.js';
|
|
112
121
|
import { FileChangeNotifier } from '../modules/kb-fs/file-change-notifier.js';
|
|
122
|
+
import { StarterPackService } from '../modules/onboarding/starter-pack.service.js';
|
|
113
123
|
import { WorkflowService } from '../modules/workflow/workflow.service.js';
|
|
114
124
|
import { WorkflowHooks } from '../modules/workflow/workflow-hooks.js';
|
|
115
125
|
import { PendingCommitsService } from '../modules/workflow/pending-commits.service.js';
|
|
@@ -132,6 +142,7 @@ import {
|
|
|
132
142
|
} from '../modules/tool-auth/internal-token.service.js';
|
|
133
143
|
import {
|
|
134
144
|
createToolAuthMiddleware,
|
|
145
|
+
createTokenVerifier,
|
|
135
146
|
createManualAuthMiddleware,
|
|
136
147
|
} from '../modules/tool-auth/tool-auth.middleware.js';
|
|
137
148
|
import { unmeteredLlmUsage, type ILlmUsageMeter } from '../modules/tool-auth/llm-usage-meter.js';
|
|
@@ -229,6 +240,14 @@ export interface CoreServices {
|
|
|
229
240
|
spillStore: SpillStore;
|
|
230
241
|
/** The bytes an agent uploaded, held until `apply_file_upload` lands them or their token expires. */
|
|
231
242
|
agentUploadStore: AgentUploadStore;
|
|
243
|
+
/** The bytes `request_file_download` captured, held until their one-time link is fetched or expires. */
|
|
244
|
+
agentDownloadStore: IAgentDownloadStore;
|
|
245
|
+
/**
|
|
246
|
+
* Every user a download fetch identifies itself as, by its bearer and its
|
|
247
|
+
* session cookie — none when it carries none that verifies — so the
|
|
248
|
+
* download route can refuse a link presented by someone it was not issued to.
|
|
249
|
+
*/
|
|
250
|
+
agentDownloadFetcher: (req: Request) => Promise<string[]>;
|
|
232
251
|
docExtractService: DocExtractService;
|
|
233
252
|
accessControl: AccessControlService;
|
|
234
253
|
creatorAccess: CreatorAccessService;
|
|
@@ -258,6 +277,11 @@ export interface CoreServices {
|
|
|
258
277
|
toolDeleteService: ToolDeleteService;
|
|
259
278
|
pluginIndexService: PluginIndexService;
|
|
260
279
|
pluginProvisionService: PluginProvisionService;
|
|
280
|
+
/**
|
|
281
|
+
* "What does your team do?" — the starter pack a new knowledge base's admin
|
|
282
|
+
* may fill it from, and the record of what was chosen. See modules/onboarding.
|
|
283
|
+
*/
|
|
284
|
+
starterPackService: StarterPackService;
|
|
261
285
|
joinRequestsService: JoinRequestsService;
|
|
262
286
|
/**
|
|
263
287
|
* Records a join request and finishes it in the background. Its `sweep()`
|
|
@@ -279,6 +303,12 @@ export interface CoreServices {
|
|
|
279
303
|
githubFacade: GitHubFacade;
|
|
280
304
|
githubFacadeCredentials: GitHubFacadeCredentialsService;
|
|
281
305
|
authService: AuthService;
|
|
306
|
+
/**
|
|
307
|
+
* The seam for "an account was invited": a deployment registers here how
|
|
308
|
+
* the person is told (the cloud's mail, say), and the invite's answer says
|
|
309
|
+
* whether somebody did. Core registers nothing.
|
|
310
|
+
*/
|
|
311
|
+
accountHooks: IAccountHooks;
|
|
282
312
|
authMiddleware: ReturnType<typeof createAuthMiddleware>;
|
|
283
313
|
accountErasureService: AccountErasureService;
|
|
284
314
|
gitService: GitService;
|
|
@@ -335,6 +365,14 @@ export interface CoreServices {
|
|
|
335
365
|
connectionProbeService: ConnectionProbeService;
|
|
336
366
|
externalApiKeyService: ExternalApiKeyService;
|
|
337
367
|
internalTokenService: InternalTokenService;
|
|
368
|
+
/**
|
|
369
|
+
* The embed surface: the token-minted page a chat host frames, and the
|
|
370
|
+
* account links that let an outside identity reach it. Exposed so an
|
|
371
|
+
* overlay can mint for its own consumers and register a node-id resolver.
|
|
372
|
+
*/
|
|
373
|
+
embedService: EmbedService;
|
|
374
|
+
/** The MCP Apps this deployment serves — the `open_page` view and its sandbox metadata. */
|
|
375
|
+
mcpAppService: IMcpAppService;
|
|
338
376
|
mcpService: McpService;
|
|
339
377
|
mcpAuthMiddleware: ReturnType<typeof createMcpAuthMiddleware>;
|
|
340
378
|
mcpOAuthProvider: BevelOAuthProvider;
|
|
@@ -685,6 +723,29 @@ export async function createCoreServices(
|
|
|
685
723
|
publicBaseUrl: config.publicBackendUrl,
|
|
686
724
|
tokenPrefix: config.uploadTokenPrefix,
|
|
687
725
|
});
|
|
726
|
+
// The way OUT: bytes `request_file_download` captured, held beside the
|
|
727
|
+
// upload root — outside every workspace, for the same reason — until their
|
|
728
|
+
// one-time link is fetched or expires.
|
|
729
|
+
const agentDownloadsRoot = path.resolve(config.agentUploadsRoot, '..', 'agent-downloads');
|
|
730
|
+
// An upload root that is itself named `agent-downloads` would make the two
|
|
731
|
+
// stores one directory, each sweeping the other's files.
|
|
732
|
+
if (agentDownloadsRoot === path.resolve(config.agentUploadsRoot)) {
|
|
733
|
+
throw new Error(
|
|
734
|
+
'AGENT_UPLOADS_ROOT must not be a directory named `agent-downloads`: that name, beside it, is the agent download root.',
|
|
735
|
+
);
|
|
736
|
+
}
|
|
737
|
+
await assertUploadsRootOutsideWorkspaces(agentDownloadsRoot, config.workspacesRoot, {
|
|
738
|
+
name: 'The agent download root (`agent-downloads`, beside AGENT_UPLOADS_ROOT)',
|
|
739
|
+
why:
|
|
740
|
+
'captured download bytes wait there for their one-time links, so a root inside a workspace would let the ' +
|
|
741
|
+
'file tools read them. Point AGENT_UPLOADS_ROOT at a directory whose parent is outside WORKSPACES_ROOT.',
|
|
742
|
+
});
|
|
743
|
+
const agentDownloadStore = new AgentDownloadStore({
|
|
744
|
+
root: agentDownloadsRoot,
|
|
745
|
+
publicBaseUrl: config.publicBackendUrl,
|
|
746
|
+
// `<tenant>-down_`: recognisable by shape beside the upload token.
|
|
747
|
+
tokenPrefix: config.uploadTokenPrefix.replace(/up_$/, 'down_'),
|
|
748
|
+
});
|
|
688
749
|
// Office-document/PDF text extraction for `read_file`/`grep`, cached by
|
|
689
750
|
// content hash beside the workspaces root (see `DocExtractionCache`).
|
|
690
751
|
const docExtractService = new DocExtractService(config.docExtractCacheRoot);
|
|
@@ -761,6 +822,9 @@ export async function createCoreServices(
|
|
|
761
822
|
ports.accountAdmission,
|
|
762
823
|
);
|
|
763
824
|
const authMiddleware = createAuthMiddleware(authService);
|
|
825
|
+
// Who tells an invited person: the composition root of a distribution
|
|
826
|
+
// registers its listener here, after this returns (see `AccountHooks`).
|
|
827
|
+
const accountHooks = new AccountHooks();
|
|
764
828
|
|
|
765
829
|
// Shared mutex so git and diff operations on the same workspace serialize
|
|
766
830
|
// against each other — a backup-reseed races a concurrent commit otherwise.
|
|
@@ -869,6 +933,9 @@ export async function createCoreServices(
|
|
|
869
933
|
// it reach every hook point.
|
|
870
934
|
workflowHooks,
|
|
871
935
|
);
|
|
936
|
+
// The leftover-branch cleanup asks the Deployment page at every round, so
|
|
937
|
+
// switching it off there applies without a restart.
|
|
938
|
+
workflowService.leftoverCleanupEnabled = () => retireMergedBranchesOn(settings.resolve('retireMergedBranches'));
|
|
872
939
|
|
|
873
940
|
// Join requests: derived entirely from two copies of a plugin's `access.md`
|
|
874
941
|
// (the request's branch vs the default branch), so it holds no state — it
|
|
@@ -1053,6 +1120,27 @@ export async function createCoreServices(
|
|
|
1053
1120
|
[config.adminEmail],
|
|
1054
1121
|
);
|
|
1055
1122
|
|
|
1123
|
+
// The starter-pack question: one commit on the default branch through the
|
|
1124
|
+
// same batch write the roles admin uses, the choice kept as a deployment
|
|
1125
|
+
// setting. Read by its routes and by `start_session`'s first-run note.
|
|
1126
|
+
const starterPackService = new StarterPackService({
|
|
1127
|
+
packsDir: config.starterPacksDir,
|
|
1128
|
+
kb,
|
|
1129
|
+
workspaceService,
|
|
1130
|
+
workflow: workflowService,
|
|
1131
|
+
adminAccess,
|
|
1132
|
+
settings,
|
|
1133
|
+
accessControl,
|
|
1134
|
+
disk,
|
|
1135
|
+
pluginSource,
|
|
1136
|
+
pluginLocks: pluginProvisionService,
|
|
1137
|
+
events: eventBus,
|
|
1138
|
+
fileChanges: fileChangeNotifier,
|
|
1139
|
+
// Its own lock: one starter-pack choice at a time, a concern no other
|
|
1140
|
+
// service's mutex serialises.
|
|
1141
|
+
choosing: new WorkspaceMutex(),
|
|
1142
|
+
});
|
|
1143
|
+
|
|
1056
1144
|
// In-app update check: lazily compares the running release version against
|
|
1057
1145
|
// the newest published GitHub release, only when an admin's browser asks —
|
|
1058
1146
|
// no timers, so a deployment nobody looks at makes zero calls. The flag
|
|
@@ -1152,9 +1240,13 @@ export async function createCoreServices(
|
|
|
1152
1240
|
// Connection keys also come as GitHub-shaped links (`gho_…`, kind
|
|
1153
1241
|
// `github-link`): the same key, minted by the marketplace facade below when
|
|
1154
1242
|
// a person connects an account on claude.ai, told apart by its stored kind.
|
|
1155
|
-
const externalApiKeyService = new ExternalApiKeyService(
|
|
1156
|
-
|
|
1157
|
-
|
|
1243
|
+
const externalApiKeyService = new ExternalApiKeyService(
|
|
1244
|
+
db,
|
|
1245
|
+
config.externalApiKeyPrefix,
|
|
1246
|
+
{ [GITHUB_LINK_KEY_KIND]: GITHUB_LINK_KEY_SPEC },
|
|
1247
|
+
// A key's first use tells its owner's open tabs that the agent arrived.
|
|
1248
|
+
eventBus,
|
|
1249
|
+
);
|
|
1158
1250
|
|
|
1159
1251
|
// The facade that lets products which sync marketplaces only from a GitHub
|
|
1160
1252
|
// Enterprise Server (claude.ai, Cowork) add the per-user marketplace:
|
|
@@ -1192,6 +1284,34 @@ export async function createCoreServices(
|
|
|
1192
1284
|
const agentAuditService = new AgentAuditService(db, externalApiKeyService, () =>
|
|
1193
1285
|
retentionDaysFrom(settings.resolve('auditRetentionDays')),
|
|
1194
1286
|
);
|
|
1287
|
+
// The embed surface. It reads files through the workspace service and
|
|
1288
|
+
// judges them with the same access resolver the app file page uses, so what
|
|
1289
|
+
// a reader may see and change inside a chat is what they may see and change
|
|
1290
|
+
// in the app — never a second answer to the same question.
|
|
1291
|
+
const embedService = new EmbedService(
|
|
1292
|
+
// The RESOLVED checkout folder, not the env's: `config.kbDirName` is only
|
|
1293
|
+
// the environment value, empty on a deployment that took the default or
|
|
1294
|
+
// named it in setup, and every path the embed builds starts with it.
|
|
1295
|
+
{ ...config, kbDirName },
|
|
1296
|
+
kb,
|
|
1297
|
+
workspaceService,
|
|
1298
|
+
accessControl,
|
|
1299
|
+
authService,
|
|
1300
|
+
workflowService,
|
|
1301
|
+
gitService,
|
|
1302
|
+
new AccountLinkService(db),
|
|
1303
|
+
// The SAME extension-to-reader registry `read_file` dispatches on, so the
|
|
1304
|
+
// embed answer to "is this text, or bytes a renderer fetches?" cannot
|
|
1305
|
+
// disagree with what a read of the file returns.
|
|
1306
|
+
createFileReaderRegistry(docExtractService),
|
|
1307
|
+
// The SAME pre-disk gate the file editor and the agent tools run: a
|
|
1308
|
+
// `roles.yaml` that would not parse is refused before it is written, from
|
|
1309
|
+
// a chat exactly as from the app.
|
|
1310
|
+
makeRolesYamlWriteValidator(kbDirName),
|
|
1311
|
+
);
|
|
1312
|
+
// The `ui://` view `open_page` carries, with the one origin it may frame:
|
|
1313
|
+
// this deployment own public origin.
|
|
1314
|
+
const mcpAppService = new McpAppService({ publicFrontendUrl: config.publicFrontendUrl });
|
|
1195
1315
|
const mcpService = new McpService(
|
|
1196
1316
|
{
|
|
1197
1317
|
// Loopback to our own REST tool surface — 127.0.0.1 (not localhost) to pin
|
|
@@ -1225,6 +1345,9 @@ export async function createCoreServices(
|
|
|
1225
1345
|
(bearer) => mcpOAuthProvider.revokeByAccessToken(bearer),
|
|
1226
1346
|
// Every attributable call lands in the Audit log through this.
|
|
1227
1347
|
agentAuditService,
|
|
1348
|
+
// The views the endpoint serves over resources/read, and the tools that
|
|
1349
|
+
// carry them.
|
|
1350
|
+
mcpAppService,
|
|
1228
1351
|
);
|
|
1229
1352
|
// A changed secret invalidates what the proxy built from the old value for
|
|
1230
1353
|
// that user (null = shared secret → everyone): remembered manual failures,
|
|
@@ -1247,6 +1370,8 @@ export async function createCoreServices(
|
|
|
1247
1370
|
stateSecret: config.jwtSecret,
|
|
1248
1371
|
publicFrontendUrl: config.publicFrontendUrl,
|
|
1249
1372
|
tokenPrefix: config.mcpOAuthTokenPrefix,
|
|
1373
|
+
// An agent connection's first use tells its owner's open tabs the agent arrived.
|
|
1374
|
+
events: eventBus,
|
|
1250
1375
|
});
|
|
1251
1376
|
// RFC 9728 pointer carried on every MCP 401 challenge so OAuth-capable
|
|
1252
1377
|
// clients discover the AS. Single source of truth for the resource id.
|
|
@@ -1283,8 +1408,22 @@ export async function createCoreServices(
|
|
|
1283
1408
|
loadActiveGroups,
|
|
1284
1409
|
});
|
|
1285
1410
|
const writeAccess = ports.writeAccess ?? alwaysWritable;
|
|
1286
|
-
|
|
1411
|
+
// The branch every tool call runs on is resolved by the handler, before the
|
|
1412
|
+
// tool: the default read live (a rename in the settings is the next call's
|
|
1413
|
+
// default), the existence asked without cloning anything.
|
|
1414
|
+
const toolHandlerFactory = createToolHandlerFactory(resolveToolContext, writeAccess, {
|
|
1415
|
+
defaultBranch: () => kb.defaultBranch,
|
|
1416
|
+
isMissing: (branch) => workspaceService.isBranchMissing(branch),
|
|
1417
|
+
});
|
|
1287
1418
|
const toolAuthMiddleware = createToolAuthMiddleware(externalApiKeyService, internalTokenService, authService);
|
|
1419
|
+
const verifyToolToken = createTokenVerifier(externalApiKeyService, internalTokenService, authService);
|
|
1420
|
+
// Every credential kind this server issues — connection keys, internal
|
|
1421
|
+
// tokens and app sessions (bearer or cookie) — so a fetch carrying another
|
|
1422
|
+
// user's identity of ANY kind is refused the link.
|
|
1423
|
+
const agentDownloadFetcher: (req: Request) => Promise<string[]> = createDownloadFetcherIdentifier(
|
|
1424
|
+
{ verifyToolToken, verifySession: (token) => authService.verifyToken(token) },
|
|
1425
|
+
readAuthCookie,
|
|
1426
|
+
);
|
|
1288
1427
|
// Read-only manual endpoints accept the above PLUS a browser JWT, so a
|
|
1289
1428
|
// logged-in user can browse the catalog with their session. Execution routes
|
|
1290
1429
|
// keep `toolAuthMiddleware` (no JWT), so a session can read but not invoke.
|
|
@@ -1452,6 +1591,8 @@ export async function createCoreServices(
|
|
|
1452
1591
|
kbDirName,
|
|
1453
1592
|
spillStore,
|
|
1454
1593
|
agentUploadStore,
|
|
1594
|
+
agentDownloadStore,
|
|
1595
|
+
agentDownloadFetcher,
|
|
1455
1596
|
docExtractService,
|
|
1456
1597
|
accessControl,
|
|
1457
1598
|
creatorAccess,
|
|
@@ -1466,6 +1607,7 @@ export async function createCoreServices(
|
|
|
1466
1607
|
agentGuideSections: agentGuideSectionsReader,
|
|
1467
1608
|
pluginIndexService,
|
|
1468
1609
|
pluginProvisionService,
|
|
1610
|
+
starterPackService,
|
|
1469
1611
|
joinRequestsService,
|
|
1470
1612
|
pluginJoinRequestJobs,
|
|
1471
1613
|
pluginLinkIndex,
|
|
@@ -1476,6 +1618,7 @@ export async function createCoreServices(
|
|
|
1476
1618
|
githubFacade,
|
|
1477
1619
|
githubFacadeCredentials,
|
|
1478
1620
|
authService,
|
|
1621
|
+
accountHooks,
|
|
1479
1622
|
authMiddleware,
|
|
1480
1623
|
accountErasureService,
|
|
1481
1624
|
gitService,
|
|
@@ -1499,6 +1642,8 @@ export async function createCoreServices(
|
|
|
1499
1642
|
connectionProbeService,
|
|
1500
1643
|
externalApiKeyService,
|
|
1501
1644
|
internalTokenService,
|
|
1645
|
+
embedService,
|
|
1646
|
+
mcpAppService,
|
|
1502
1647
|
mcpService,
|
|
1503
1648
|
mcpAuthMiddleware,
|
|
1504
1649
|
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/, agent-guide/) + the migration runners.
|
|
51
|
-
export { agentGuideDir, 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,
|
|
@@ -280,6 +280,7 @@ describe('Admin write floor at the repository root', () => {
|
|
|
280
280
|
service(),
|
|
281
281
|
{ ...ws, getOrCreateForBranch: async () => ({ id: WS, kbDirName: KB }) } as unknown as WorkspaceService,
|
|
282
282
|
{ getUserById: async (id: string) => users[id as 'u-admin'] ?? null } as unknown as AuthService,
|
|
283
|
+
{ whileSwitchedOn: async (_email: string, write: () => Promise<void>) => write() },
|
|
283
284
|
{
|
|
284
285
|
getLock: async () => null,
|
|
285
286
|
acquireLock: async () => ({ acquired: true, lock: {} }),
|
|
@@ -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);
|