@bevel-software/platform-core-backend 0.31.0 → 0.33.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 +5 -0
- package/agent-guide/html-views.md +46 -10
- package/dist/core/create-core-server.d.ts.map +1 -1
- package/dist/core/create-core-server.js +29 -4
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +14 -2
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +34 -7
- package/dist/core/create-core-services.js.map +1 -1
- package/dist/core/lifecycle.d.ts +8 -0
- package/dist/core/lifecycle.d.ts.map +1 -1
- package/dist/core/lifecycle.js +4 -0
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/core/public-config.d.ts +10 -0
- package/dist/core/public-config.d.ts.map +1 -1
- package/dist/core/public-config.js +10 -0
- package/dist/core/public-config.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/modules/access/access-control.service.d.ts +3 -3
- package/dist/modules/access/access-control.service.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.js +4 -5
- package/dist/modules/access/access-control.service.js.map +1 -1
- package/dist/modules/access/access-declarations.d.ts +1 -1
- package/dist/modules/access/access-declarations.d.ts.map +1 -1
- package/dist/modules/access/access-declarations.js +1 -1
- package/dist/modules/access/access-declarations.js.map +1 -1
- package/dist/modules/access/access-mutation.service.d.ts +8 -3
- package/dist/modules/access/access-mutation.service.d.ts.map +1 -1
- package/dist/modules/access/access-mutation.service.js +3 -3
- package/dist/modules/access/access-mutation.service.js.map +1 -1
- package/dist/modules/access/access-requests.contract.d.ts +1 -1
- package/dist/modules/access/access-requests.contract.d.ts.map +1 -1
- package/dist/modules/access/access-requests.routes.d.ts +3 -3
- package/dist/modules/access/access-requests.routes.d.ts.map +1 -1
- package/dist/modules/access/access-requests.routes.js +7 -7
- package/dist/modules/access/access-requests.routes.js.map +1 -1
- package/dist/modules/access/access-requests.service.d.ts +21 -20
- package/dist/modules/access/access-requests.service.d.ts.map +1 -1
- package/dist/modules/access/access-requests.service.js +22 -68
- package/dist/modules/access/access-requests.service.js.map +1 -1
- package/dist/modules/access/access-view.d.ts +1 -1
- package/dist/modules/access/access-view.d.ts.map +1 -1
- package/dist/modules/access/access-view.js +1 -1
- package/dist/modules/access/access-view.js.map +1 -1
- package/dist/modules/access/access.routes.d.ts +5 -7
- package/dist/modules/access/access.routes.d.ts.map +1 -1
- package/dist/modules/access/access.routes.js +4 -4
- package/dist/modules/access/access.routes.js.map +1 -1
- package/dist/modules/access/admin-locked-commit.d.ts +2 -2
- package/dist/modules/access/admin-locked-commit.d.ts.map +1 -1
- package/dist/modules/access/admin-locked-commit.js +1 -1
- package/dist/modules/access/admin-locked-commit.js.map +1 -1
- package/dist/modules/access/capability-registry.js +1 -1
- package/dist/modules/access/capability-registry.js.map +1 -1
- package/dist/modules/access/change-read-gate.d.ts +2 -2
- package/dist/modules/access/change-read-gate.d.ts.map +1 -1
- package/dist/modules/access/change-read-gate.js +1 -3
- package/dist/modules/access/change-read-gate.js.map +1 -1
- package/dist/modules/access/creator-access.d.ts +2 -2
- package/dist/modules/access/creator-access.d.ts.map +1 -1
- package/dist/modules/access/creator-access.js +2 -4
- package/dist/modules/access/creator-access.js.map +1 -1
- package/dist/modules/access/directory-sync-bot.d.ts +1 -1
- package/dist/modules/access/directory-sync-bot.d.ts.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/groups-admin.routes.d.ts +2 -2
- package/dist/modules/access/groups-admin.routes.d.ts.map +1 -1
- package/dist/modules/access/groups-admin.routes.js +2 -2
- package/dist/modules/access/groups-admin.routes.js.map +1 -1
- package/dist/modules/access/groups-admin.service.d.ts +1 -1
- package/dist/modules/access/groups-admin.service.d.ts.map +1 -1
- package/dist/modules/access/groups-admin.service.js +2 -3
- package/dist/modules/access/groups-admin.service.js.map +1 -1
- package/dist/modules/access/groups-edit.js +2 -2
- package/dist/modules/access/groups-edit.js.map +1 -1
- package/dist/modules/access/index.d.ts +17 -0
- package/dist/modules/access/index.d.ts.map +1 -0
- package/dist/modules/access/index.js +6 -0
- package/dist/modules/access/index.js.map +1 -0
- package/dist/modules/access/reference-scan.js +1 -1
- package/dist/modules/access/reference-scan.js.map +1 -1
- package/dist/modules/access/roles-admin.service.d.ts +1 -1
- package/dist/modules/access/roles-admin.service.d.ts.map +1 -1
- package/dist/modules/access/roles-admin.service.js +2 -5
- package/dist/modules/access/roles-admin.service.js.map +1 -1
- package/dist/modules/access/roles-edit.js +1 -1
- package/dist/modules/access/roles-edit.js.map +1 -1
- package/dist/modules/access/synced-groups-committer.d.ts +2 -2
- package/dist/modules/access/synced-groups-committer.d.ts.map +1 -1
- package/dist/modules/access/synced-groups-committer.js +2 -2
- package/dist/modules/access/synced-groups-committer.js.map +1 -1
- package/dist/modules/access/synced-groups-writer.js +2 -2
- package/dist/modules/access/synced-groups-writer.js.map +1 -1
- package/dist/modules/access/user-access-removal.service.d.ts +1 -1
- package/dist/modules/access/user-access-removal.service.d.ts.map +1 -1
- package/dist/modules/access/user-access-removal.service.js +2 -5
- package/dist/modules/access/user-access-removal.service.js.map +1 -1
- package/dist/modules/access-model/index.d.ts +29 -0
- package/dist/modules/access-model/index.d.ts.map +1 -0
- package/dist/modules/access-model/index.js +26 -0
- package/dist/modules/access-model/index.js.map +1 -0
- package/dist/modules/access-model/roles-yaml-guard.d.ts +1 -1
- package/dist/modules/access-model/roles-yaml-guard.d.ts.map +1 -1
- package/dist/modules/admin/admin-access.routes.d.ts +1 -1
- package/dist/modules/admin/admin-access.routes.d.ts.map +1 -1
- package/dist/modules/admin/admin-access.routes.js +1 -1
- package/dist/modules/admin/admin-access.routes.js.map +1 -1
- package/dist/modules/admin/admin-access.service.d.ts +2 -2
- package/dist/modules/admin/admin-access.service.d.ts.map +1 -1
- package/dist/modules/admin/index.d.ts +8 -0
- package/dist/modules/admin/index.d.ts.map +1 -0
- package/dist/modules/admin/index.js +2 -0
- package/dist/modules/admin/index.js.map +1 -0
- package/dist/modules/agent-guide/agent-guide.js +1 -1
- package/dist/modules/agent-guide/agent-guide.js.map +1 -1
- package/dist/modules/agent-guide/agent-guide.tools.d.ts +3 -3
- package/dist/modules/agent-guide/agent-guide.tools.d.ts.map +1 -1
- package/dist/modules/agent-guide/agent-guide.tools.js +2 -4
- package/dist/modules/agent-guide/agent-guide.tools.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/read-preamble.d.ts +1 -1
- package/dist/modules/agent-instructions/read-preamble.d.ts.map +1 -1
- package/dist/modules/audit/agent-audit.service.d.ts +2 -2
- package/dist/modules/audit/agent-audit.service.d.ts.map +1 -1
- package/dist/modules/audit/agent-audit.service.js +1 -1
- package/dist/modules/audit/agent-audit.service.js.map +1 -1
- package/dist/modules/audit/agent-connection.routes.d.ts +1 -1
- package/dist/modules/audit/agent-connection.routes.d.ts.map +1 -1
- package/dist/modules/audit/agent-connection.routes.js +1 -1
- package/dist/modules/audit/agent-connection.routes.js.map +1 -1
- package/dist/modules/audit/agent-rest-audit.middleware.d.ts +1 -1
- package/dist/modules/audit/agent-rest-audit.middleware.d.ts.map +1 -1
- package/dist/modules/audit/agent-rest-audit.middleware.js +1 -1
- package/dist/modules/audit/agent-rest-audit.middleware.js.map +1 -1
- package/dist/modules/audit/audit.routes.d.ts +3 -3
- package/dist/modules/audit/audit.routes.d.ts.map +1 -1
- package/dist/modules/audit/audit.routes.js +2 -2
- package/dist/modules/audit/audit.routes.js.map +1 -1
- package/dist/modules/auth/account-erasure.service.d.ts +3 -3
- package/dist/modules/auth/account-erasure.service.d.ts.map +1 -1
- package/dist/modules/auth/account-erasure.service.js +1 -5
- package/dist/modules/auth/account-erasure.service.js.map +1 -1
- package/dist/modules/auth/account-hooks.d.ts +4 -6
- package/dist/modules/auth/account-hooks.d.ts.map +1 -1
- package/dist/modules/auth/account-hooks.js +7 -17
- package/dist/modules/auth/account-hooks.js.map +1 -1
- package/dist/modules/auth/account-switch-lock.d.ts +1 -1
- package/dist/modules/auth/account-switch-lock.d.ts.map +1 -1
- package/dist/modules/auth/account-switch-lock.js +1 -1
- package/dist/modules/auth/account-switch-lock.js.map +1 -1
- package/dist/modules/auth/account.routes.d.ts +2 -2
- package/dist/modules/auth/account.routes.d.ts.map +1 -1
- package/dist/modules/auth/account.routes.js +1 -1
- package/dist/modules/auth/account.routes.js.map +1 -1
- package/dist/modules/auth/auth.service.d.ts +10 -9
- package/dist/modules/auth/auth.service.d.ts.map +1 -1
- package/dist/modules/auth/auth.service.js +22 -21
- package/dist/modules/auth/auth.service.js.map +1 -1
- package/dist/modules/auth/index.d.ts +2 -0
- package/dist/modules/auth/index.d.ts.map +1 -1
- package/dist/modules/auth/oidc-auth-provider.js +1 -1
- package/dist/modules/auth/oidc-auth-provider.js.map +1 -1
- package/dist/modules/code-mode/code-mode.tool.d.ts +1 -1
- package/dist/modules/code-mode/code-mode.tool.d.ts.map +1 -1
- package/dist/modules/connection-probe/connection-probe.service.d.ts +2 -2
- package/dist/modules/connection-probe/connection-probe.service.d.ts.map +1 -1
- package/dist/modules/connection-probe/connection-probe.service.js +1 -4
- package/dist/modules/connection-probe/connection-probe.service.js.map +1 -1
- package/dist/modules/database/core-schema.d.ts +128 -235
- package/dist/modules/database/core-schema.d.ts.map +1 -1
- package/dist/modules/database/core-schema.js +55 -36
- package/dist/modules/database/core-schema.js.map +1 -1
- package/dist/modules/database/index.d.ts +10 -0
- package/dist/modules/database/index.d.ts.map +1 -0
- package/dist/modules/database/index.js +4 -0
- package/dist/modules/database/index.js.map +1 -0
- package/dist/modules/database/migrate.d.ts.map +1 -1
- package/dist/modules/database/migrate.js +78 -3
- package/dist/modules/database/migrate.js.map +1 -1
- package/dist/modules/declared-variables/declared-variables.routes.d.ts +2 -2
- package/dist/modules/declared-variables/declared-variables.routes.d.ts.map +1 -1
- package/dist/modules/diff/diff.routes.d.ts +3 -3
- package/dist/modules/diff/diff.routes.d.ts.map +1 -1
- package/dist/modules/diff/diff.routes.js +3 -3
- package/dist/modules/diff/diff.routes.js.map +1 -1
- package/dist/modules/diff/diff.service.d.ts +2 -2
- package/dist/modules/diff/diff.service.d.ts.map +1 -1
- package/dist/modules/diff/index.d.ts +7 -0
- package/dist/modules/diff/index.d.ts.map +1 -0
- package/dist/modules/diff/index.js +2 -0
- package/dist/modules/diff/index.js.map +1 -0
- package/dist/modules/embed/account-link.service.d.ts +1 -1
- package/dist/modules/embed/account-link.service.d.ts.map +1 -1
- package/dist/modules/embed/account-link.service.js +1 -1
- package/dist/modules/embed/account-link.service.js.map +1 -1
- package/dist/modules/embed/embed.routes.d.ts +1 -1
- package/dist/modules/embed/embed.routes.d.ts.map +1 -1
- package/dist/modules/embed/embed.routes.js +2 -2
- package/dist/modules/embed/embed.routes.js.map +1 -1
- package/dist/modules/embed/embed.service.d.ts +1 -1
- package/dist/modules/embed/embed.service.d.ts.map +1 -1
- package/dist/modules/embed/embed.tools.d.ts +4 -4
- package/dist/modules/embed/embed.tools.d.ts.map +1 -1
- package/dist/modules/embed/embed.tools.js +3 -5
- package/dist/modules/embed/embed.tools.js.map +1 -1
- package/dist/modules/github-app/github-app.connection.d.ts +1 -1
- package/dist/modules/github-app/github-app.connection.d.ts.map +1 -1
- package/dist/modules/github-app/github-app.routes.d.ts +3 -3
- package/dist/modules/github-app/github-app.routes.d.ts.map +1 -1
- package/dist/modules/github-app/github-app.routes.js +1 -1
- package/dist/modules/github-app/github-app.routes.js.map +1 -1
- package/dist/modules/kb-fs/index.d.ts +10 -0
- package/dist/modules/kb-fs/index.d.ts.map +1 -1
- package/dist/modules/kb-fs/index.js +10 -0
- package/dist/modules/kb-fs/index.js.map +1 -1
- package/dist/modules/kb-fs/locking-filesystem.d.ts +1 -1
- package/dist/modules/kb-fs/locking-filesystem.d.ts.map +1 -1
- package/dist/modules/kb-sync/kb-sync.routes.d.ts +1 -1
- package/dist/modules/kb-sync/kb-sync.routes.d.ts.map +1 -1
- package/dist/modules/kb-sync/kb-sync.routes.js +2 -2
- package/dist/modules/kb-sync/kb-sync.routes.js.map +1 -1
- package/dist/modules/kb-sync/kb-sync.service.js +1 -1
- package/dist/modules/kb-sync/kb-sync.service.js.map +1 -1
- package/dist/modules/kb-sync/sync-auth.js +1 -1
- package/dist/modules/kb-sync/sync-auth.js.map +1 -1
- package/dist/modules/kb-sync/sync-payload.js +1 -1
- package/dist/modules/kb-sync/sync-payload.js.map +1 -1
- package/dist/modules/marketplace/git-http.routes.d.ts +1 -1
- package/dist/modules/marketplace/git-http.routes.d.ts.map +1 -1
- package/dist/modules/marketplace/git-http.routes.js +1 -1
- package/dist/modules/marketplace/git-http.routes.js.map +1 -1
- package/dist/modules/marketplace/github-facade/github-facade-admin.routes.d.ts +1 -1
- package/dist/modules/marketplace/github-facade/github-facade-admin.routes.d.ts.map +1 -1
- package/dist/modules/marketplace/github-facade/github-facade-admin.routes.js +1 -1
- package/dist/modules/marketplace/github-facade/github-facade-admin.routes.js.map +1 -1
- package/dist/modules/marketplace/github-facade/github-facade-codes.store.d.ts +1 -1
- package/dist/modules/marketplace/github-facade/github-facade-codes.store.d.ts.map +1 -1
- package/dist/modules/marketplace/github-facade/github-facade-codes.store.js +1 -1
- package/dist/modules/marketplace/github-facade/github-facade-codes.store.js.map +1 -1
- package/dist/modules/marketplace/github-facade/github-facade-credentials.service.d.ts +1 -1
- package/dist/modules/marketplace/github-facade/github-facade-credentials.service.d.ts.map +1 -1
- package/dist/modules/marketplace/github-facade/github-facade-credentials.service.js +1 -1
- package/dist/modules/marketplace/github-facade/github-facade-credentials.service.js.map +1 -1
- package/dist/modules/marketplace/github-facade/github-facade.routes.d.ts +2 -2
- package/dist/modules/marketplace/github-facade/github-facade.routes.d.ts.map +1 -1
- package/dist/modules/marketplace/github-facade/github-facade.routes.js +2 -2
- package/dist/modules/marketplace/github-facade/github-facade.routes.js.map +1 -1
- package/dist/modules/marketplace/github-facade/github-facade.service.d.ts +2 -2
- package/dist/modules/marketplace/github-facade/github-facade.service.d.ts.map +1 -1
- package/dist/modules/marketplace/github-facade/github-facade.service.js +1 -1
- package/dist/modules/marketplace/github-facade/github-facade.service.js.map +1 -1
- package/dist/modules/marketplace/marketplace-repo.service.d.ts +1 -1
- package/dist/modules/marketplace/marketplace-repo.service.d.ts.map +1 -1
- package/dist/modules/marketplace/marketplace-repo.service.js +1 -1
- package/dist/modules/mcp/index.d.ts +8 -0
- package/dist/modules/mcp/index.d.ts.map +1 -0
- package/dist/modules/mcp/index.js +7 -0
- package/dist/modules/mcp/index.js.map +1 -0
- package/dist/modules/mcp/mcp-auth.middleware.d.ts +4 -5
- package/dist/modules/mcp/mcp-auth.middleware.d.ts.map +1 -1
- package/dist/modules/mcp/mcp-auth.middleware.js +4 -4
- package/dist/modules/mcp/mcp-auth.middleware.js.map +1 -1
- package/dist/modules/mcp/mcp.routes.d.ts +2 -4
- package/dist/modules/mcp/mcp.routes.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.routes.js +2 -2
- package/dist/modules/mcp/mcp.routes.js.map +1 -1
- package/dist/modules/mcp/mcp.service.d.ts +14 -4
- package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.service.js +17 -7
- package/dist/modules/mcp/mcp.service.js.map +1 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts +29 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts.map +1 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js +167 -40
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js.map +1 -1
- package/dist/modules/mcp/oauth/oauth-consent.routes.d.ts +1 -1
- package/dist/modules/mcp/oauth/oauth-consent.routes.d.ts.map +1 -1
- package/dist/modules/mcp/oauth/oauth-consent.routes.js +1 -1
- package/dist/modules/mcp/oauth/oauth-consent.routes.js.map +1 -1
- package/dist/modules/onboarding/onboarding.routes.d.ts +1 -1
- package/dist/modules/onboarding/onboarding.routes.d.ts.map +1 -1
- package/dist/modules/onboarding/onboarding.routes.js +1 -1
- package/dist/modules/onboarding/onboarding.routes.js.map +1 -1
- package/dist/modules/onboarding/starter-pack.service.d.ts +4 -5
- package/dist/modules/onboarding/starter-pack.service.d.ts.map +1 -1
- package/dist/modules/onboarding/starter-pack.service.js +2 -2
- package/dist/modules/onboarding/starter-pack.service.js.map +1 -1
- package/dist/modules/plugins/compile/compile-marketplace.d.ts +1 -1
- package/dist/modules/plugins/compile/compile-marketplace.d.ts.map +1 -1
- package/dist/modules/plugins/compile/compile-marketplace.js +1 -1
- package/dist/modules/plugins/compile/compile-marketplace.js.map +1 -1
- package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts +3 -3
- package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts.map +1 -1
- package/dist/modules/plugins/discovery/bundle-dialect/registry.d.ts +1 -1
- package/dist/modules/plugins/discovery/bundle-dialect/registry.d.ts.map +1 -1
- package/dist/modules/plugins/discovery/bundle-dialect/registry.js +1 -1
- package/dist/modules/plugins/discovery/bundle-dialect/registry.js.map +1 -1
- package/dist/modules/plugins/index.d.ts +1 -0
- package/dist/modules/plugins/index.d.ts.map +1 -1
- package/dist/modules/plugins/index.js +2 -0
- package/dist/modules/plugins/index.js.map +1 -1
- package/dist/modules/plugins/join-proposals.d.ts +2 -2
- package/dist/modules/plugins/join-proposals.d.ts.map +1 -1
- package/dist/modules/plugins/join-proposals.js +1 -1
- package/dist/modules/plugins/join-proposals.js.map +1 -1
- package/dist/modules/plugins/join-request-jobs.service.d.ts +1 -1
- package/dist/modules/plugins/join-request-jobs.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-request-jobs.service.js +2 -2
- package/dist/modules/plugins/join-request-jobs.service.js.map +1 -1
- package/dist/modules/plugins/join-request-records.store.d.ts +1 -1
- package/dist/modules/plugins/join-request-records.store.d.ts.map +1 -1
- package/dist/modules/plugins/join-request-records.store.js +1 -1
- package/dist/modules/plugins/join-request-records.store.js.map +1 -1
- package/dist/modules/plugins/join-requests.service.d.ts +3 -3
- package/dist/modules/plugins/join-requests.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-requests.service.js +1 -1
- package/dist/modules/plugins/join-requests.service.js.map +1 -1
- package/dist/modules/plugins/plugin-links.d.ts +3 -3
- package/dist/modules/plugins/plugin-links.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-links.js +1 -1
- package/dist/modules/plugins/plugin-links.js.map +1 -1
- package/dist/modules/plugins/plugin-links.service.d.ts +8 -5
- package/dist/modules/plugins/plugin-links.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-links.service.js +8 -6
- package/dist/modules/plugins/plugin-links.service.js.map +1 -1
- package/dist/modules/plugins/plugin-provision.service.d.ts +2 -2
- package/dist/modules/plugins/plugin-provision.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-provision.service.js +2 -3
- package/dist/modules/plugins/plugin-provision.service.js.map +1 -1
- package/dist/modules/plugins/plugin-rename.service.d.ts +2 -2
- package/dist/modules/plugins/plugin-rename.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-rename.service.js +1 -1
- package/dist/modules/plugins/plugin-rename.service.js.map +1 -1
- package/dist/modules/plugins/plugins.contract.d.ts +1 -1
- package/dist/modules/plugins/plugins.contract.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.routes.d.ts +2 -2
- package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.routes.js +3 -3
- package/dist/modules/plugins/plugins.routes.js.map +1 -1
- package/dist/modules/plugins/plugins.service.d.ts +4 -4
- package/dist/modules/plugins/plugins.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.service.js +1 -1
- package/dist/modules/plugins/plugins.service.js.map +1 -1
- package/dist/modules/plugins/plugins.tools.d.ts +1 -1
- package/dist/modules/plugins/plugins.tools.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.tools.js +3 -3
- package/dist/modules/plugins/plugins.tools.js.map +1 -1
- package/dist/modules/plugins/teams.routes.d.ts +3 -3
- package/dist/modules/plugins/teams.routes.d.ts.map +1 -1
- package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts +1 -1
- package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts.map +1 -1
- package/dist/modules/secrets-vault/db-secrets-vault.service.js +1 -1
- package/dist/modules/secrets-vault/db-secrets-vault.service.js.map +1 -1
- package/dist/modules/secrets-vault/index.d.ts +1 -0
- package/dist/modules/secrets-vault/index.d.ts.map +1 -1
- package/dist/modules/secrets-vault/index.js +2 -0
- package/dist/modules/secrets-vault/index.js.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts +4 -4
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.js +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -1
- package/dist/modules/settings/connection-check.js +1 -1
- package/dist/modules/settings/connection-check.js.map +1 -1
- package/dist/modules/settings/deployment-settings.service.d.ts +7 -1
- package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
- package/dist/modules/settings/deployment-settings.service.js +45 -3
- package/dist/modules/settings/deployment-settings.service.js.map +1 -1
- package/dist/modules/settings/git-root-folders.js +1 -1
- package/dist/modules/settings/git-root-folders.js.map +1 -1
- package/dist/modules/settings/index.d.ts +13 -0
- package/dist/modules/settings/index.d.ts.map +1 -0
- package/dist/modules/settings/index.js +3 -0
- package/dist/modules/settings/index.js.map +1 -0
- package/dist/modules/settings/setup.routes.d.ts +3 -3
- package/dist/modules/settings/setup.routes.d.ts.map +1 -1
- package/dist/modules/settings/setup.routes.js +2 -2
- package/dist/modules/settings/setup.routes.js.map +1 -1
- package/dist/modules/skills/allowed-tools-check.d.ts +2 -2
- package/dist/modules/skills/allowed-tools-check.d.ts.map +1 -1
- package/dist/modules/skills/allowed-tools-check.js +1 -1
- package/dist/modules/skills/allowed-tools-check.js.map +1 -1
- package/dist/modules/skills/index.d.ts +1 -0
- package/dist/modules/skills/index.d.ts.map +1 -1
- package/dist/modules/skills/pending-skills.service.d.ts +3 -3
- package/dist/modules/skills/pending-skills.service.d.ts.map +1 -1
- package/dist/modules/skills/pending-skills.service.js.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.d.ts +5 -5
- package/dist/modules/skills/skill-access-requests.routes.d.ts.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.js +6 -13
- package/dist/modules/skills/skill-access-requests.routes.js.map +1 -1
- package/dist/modules/skills/skills.routes.d.ts +1 -1
- package/dist/modules/skills/skills.routes.d.ts.map +1 -1
- package/dist/modules/skills/skills.routes.js +1 -1
- package/dist/modules/skills/skills.routes.js.map +1 -1
- package/dist/modules/skills/skills.service.d.ts +2 -2
- package/dist/modules/skills/skills.service.d.ts.map +1 -1
- package/dist/modules/skills/skills.tools.d.ts +3 -3
- package/dist/modules/skills/skills.tools.d.ts.map +1 -1
- package/dist/modules/skills/skills.tools.js +3 -7
- package/dist/modules/skills/skills.tools.js.map +1 -1
- package/dist/modules/tool-auth/connection-key-rejection.js +1 -1
- package/dist/modules/tool-auth/connection-key-rejection.js.map +1 -1
- package/dist/modules/tool-auth/connection-keys-admin.routes.d.ts +2 -2
- package/dist/modules/tool-auth/connection-keys-admin.routes.d.ts.map +1 -1
- package/dist/modules/tool-auth/connection-keys-admin.routes.js +1 -1
- package/dist/modules/tool-auth/connection-keys-admin.routes.js.map +1 -1
- package/dist/modules/tool-auth/external-api-key.service.d.ts +1 -1
- package/dist/modules/tool-auth/external-api-key.service.d.ts.map +1 -1
- package/dist/modules/tool-auth/external-api-key.service.js +1 -1
- package/dist/modules/tool-auth/external-api-key.service.js.map +1 -1
- package/dist/modules/tool-auth/index.d.ts +15 -0
- package/dist/modules/tool-auth/index.d.ts.map +1 -0
- package/dist/modules/tool-auth/index.js +11 -0
- package/dist/modules/tool-auth/index.js.map +1 -0
- package/dist/modules/tool-auth/tool-auth.middleware.d.ts +2 -2
- package/dist/modules/tool-auth/tool-auth.middleware.d.ts.map +1 -1
- package/dist/modules/tool-auth/tool-auth.middleware.js +1 -1
- package/dist/modules/tool-auth/tool-auth.middleware.js.map +1 -1
- package/dist/modules/tool-helpers/default-branch-write.d.ts +1 -1
- package/dist/modules/tool-helpers/default-branch-write.d.ts.map +1 -1
- package/dist/modules/tool-helpers/index.d.ts +4 -1
- package/dist/modules/tool-helpers/index.d.ts.map +1 -1
- package/dist/modules/tool-helpers/index.js +3 -0
- package/dist/modules/tool-helpers/index.js.map +1 -1
- package/dist/modules/tool-helpers/route-argument-check.js +1 -1
- package/dist/modules/tool-helpers/route-argument-check.js.map +1 -1
- package/dist/modules/tool-helpers/route-tool-schemas.d.ts +1 -1
- package/dist/modules/tool-helpers/route-tool-schemas.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-context.d.ts +5 -6
- package/dist/modules/tool-helpers/tool-context.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-context.js +2 -3
- package/dist/modules/tool-helpers/tool-context.js.map +1 -1
- package/dist/modules/tool-helpers/tool-def.d.ts +4 -2
- package/dist/modules/tool-helpers/tool-def.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-def.js +3 -1
- package/dist/modules/tool-helpers/tool-def.js.map +1 -1
- package/dist/modules/tool-helpers/tool-handler.d.ts +2 -2
- package/dist/modules/tool-helpers/tool-handler.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-handler.js +2 -2
- package/dist/modules/tool-helpers/tool-handler.js.map +1 -1
- package/dist/modules/tool-helpers/tool.contract.d.ts +2 -2
- package/dist/modules/tool-helpers/tool.contract.d.ts.map +1 -1
- package/dist/modules/tool-helpers/validate-token.d.ts +1 -2
- package/dist/modules/tool-helpers/validate-token.d.ts.map +1 -1
- package/dist/modules/tool-helpers/validate-token.js +1 -1
- package/dist/modules/tool-helpers/validate-token.js.map +1 -1
- package/dist/modules/tool-manuals/index.d.ts +5 -0
- package/dist/modules/tool-manuals/index.d.ts.map +1 -1
- package/dist/modules/tool-manuals/index.js +4 -0
- package/dist/modules/tool-manuals/index.js.map +1 -1
- package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts +2 -2
- package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/pending-tools.service.d.ts +2 -2
- package/dist/modules/tool-manuals/pending-tools.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-delete.service.d.ts +5 -6
- package/dist/modules/tool-manuals/tool-delete.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-delete.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.d.ts +5 -5
- package/dist/modules/tool-manuals/tool-manuals.routes.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.js +2 -2
- package/dist/modules/tool-manuals/tool-manuals.routes.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts +3 -3
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +3 -3
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.js +1 -2
- package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
- package/dist/modules/tool-registry/description-length.js +2 -2
- package/dist/modules/tool-registry/description-length.js.map +1 -1
- package/dist/modules/tool-registry/index.d.ts +8 -0
- package/dist/modules/tool-registry/index.d.ts.map +1 -0
- package/dist/modules/tool-registry/index.js +8 -0
- package/dist/modules/tool-registry/index.js.map +1 -0
- package/dist/modules/tool-registry/manual.routes.d.ts +37 -2
- package/dist/modules/tool-registry/manual.routes.d.ts.map +1 -1
- package/dist/modules/tool-registry/manual.routes.js +14 -7
- package/dist/modules/tool-registry/manual.routes.js.map +1 -1
- package/dist/modules/tool-registry/read-only-hints.contract.d.ts +52 -0
- package/dist/modules/tool-registry/read-only-hints.contract.d.ts.map +1 -0
- package/dist/modules/tool-registry/read-only-hints.contract.js +2 -0
- package/dist/modules/tool-registry/read-only-hints.contract.js.map +1 -0
- package/dist/modules/tool-registry/read-only-hints.d.ts +89 -0
- package/dist/modules/tool-registry/read-only-hints.d.ts.map +1 -0
- package/dist/modules/tool-registry/read-only-hints.js +212 -0
- package/dist/modules/tool-registry/read-only-hints.js.map +1 -0
- package/dist/modules/tool-registry/tool.contract.d.ts +8 -0
- package/dist/modules/tool-registry/tool.contract.d.ts.map +1 -1
- package/dist/modules/tool-registry/tool.contract.js +10 -1
- package/dist/modules/tool-registry/tool.contract.js.map +1 -1
- package/dist/modules/update-check/update-check.routes.d.ts +2 -2
- package/dist/modules/update-check/update-check.routes.d.ts.map +1 -1
- package/dist/modules/update-check/update-check.routes.js +1 -1
- package/dist/modules/update-check/update-check.routes.js.map +1 -1
- package/dist/modules/workflow/agent-tools/change-request-read-shape.d.ts +9 -104
- package/dist/modules/workflow/agent-tools/change-request-read-shape.d.ts.map +1 -1
- package/dist/modules/workflow/agent-tools/change-request-read-shape.js +8 -118
- package/dist/modules/workflow/agent-tools/change-request-read-shape.js.map +1 -1
- package/dist/modules/workflow/agent-tools/change-request-read.tools.d.ts +16 -17
- 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 +19 -86
- package/dist/modules/workflow/agent-tools/change-request-read.tools.js.map +1 -1
- package/dist/modules/workflow/agent-tools/change-request-summary.d.ts +15 -2
- package/dist/modules/workflow/agent-tools/change-request-summary.d.ts.map +1 -1
- package/dist/modules/workflow/agent-tools/change-request-summary.js +12 -1
- package/dist/modules/workflow/agent-tools/change-request-summary.js.map +1 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts +7 -5
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.js +51 -68
- package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
- package/dist/modules/workflow/change-request-hooks.d.ts +78 -0
- package/dist/modules/workflow/change-request-hooks.d.ts.map +1 -0
- package/dist/modules/workflow/change-request-hooks.js +15 -0
- package/dist/modules/workflow/change-request-hooks.js.map +1 -0
- package/dist/modules/workflow/event-bus.d.ts.map +1 -1
- package/dist/modules/workflow/event-bus.js +3 -1
- package/dist/modules/workflow/event-bus.js.map +1 -1
- package/dist/modules/workflow/events-delivery.d.ts +120 -0
- package/dist/modules/workflow/events-delivery.d.ts.map +1 -0
- package/dist/modules/workflow/events-delivery.js +202 -0
- package/dist/modules/workflow/events-delivery.js.map +1 -0
- package/dist/modules/workflow/events.routes.d.ts +16 -7
- package/dist/modules/workflow/events.routes.d.ts.map +1 -1
- package/dist/modules/workflow/events.routes.js +23 -4
- package/dist/modules/workflow/events.routes.js.map +1 -1
- package/dist/modules/workflow/file-lock.service.d.ts +1 -1
- package/dist/modules/workflow/file-lock.service.d.ts.map +1 -1
- package/dist/modules/workflow/file-lock.service.js +1 -1
- package/dist/modules/workflow/file-lock.service.js.map +1 -1
- package/dist/modules/workflow/git/git.service.d.ts +2 -2
- package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/git.service.js +3 -6
- package/dist/modules/workflow/git/git.service.js.map +1 -1
- package/dist/modules/workflow/git/node-git-runner.js +1 -1
- package/dist/modules/workflow/git/node-git-runner.js.map +1 -1
- package/dist/modules/workflow/git/pull-request.service.d.ts +16 -7
- package/dist/modules/workflow/git/pull-request.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/pull-request.service.js +49 -33
- package/dist/modules/workflow/git/pull-request.service.js.map +1 -1
- package/dist/modules/workflow/index.d.ts +14 -2
- package/dist/modules/workflow/index.d.ts.map +1 -1
- package/dist/modules/workflow/index.js +11 -2
- package/dist/modules/workflow/index.js.map +1 -1
- package/dist/modules/workflow/pending-commits.service.d.ts +1 -1
- package/dist/modules/workflow/pending-commits.service.d.ts.map +1 -1
- package/dist/modules/workflow/pending-commits.service.js +1 -1
- package/dist/modules/workflow/pending-commits.service.js.map +1 -1
- package/dist/modules/workflow/read-on-branch.d.ts +1 -1
- package/dist/modules/workflow/read-on-branch.d.ts.map +1 -1
- package/dist/modules/workflow/recovery-bot.d.ts +1 -1
- package/dist/modules/workflow/recovery-bot.d.ts.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/approval-lock.d.ts +1 -1
- package/dist/modules/workflow/review-workflow/approval-lock.d.ts.map +1 -1
- package/dist/modules/workflow/review-workflow/review-workflow.interface.d.ts +4 -20
- package/dist/modules/workflow/review-workflow/review-workflow.interface.d.ts.map +1 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts +4 -8
- package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.js +3 -138
- package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +1 -1
- package/dist/modules/workflow/workflow.routes.d.ts +5 -5
- package/dist/modules/workflow/workflow.routes.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.routes.js +42 -94
- package/dist/modules/workflow/workflow.routes.js.map +1 -1
- package/dist/modules/workflow/workflow.service.d.ts +112 -62
- package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.service.js +367 -172
- package/dist/modules/workflow/workflow.service.js.map +1 -1
- package/dist/modules/workspace/agent-access.gate.d.ts +3 -3
- package/dist/modules/workspace/agent-access.gate.d.ts.map +1 -1
- package/dist/modules/workspace/agent-download.builder.d.ts +1 -1
- package/dist/modules/workspace/agent-download.builder.d.ts.map +1 -1
- package/dist/modules/workspace/agent-download.builder.js +1 -1
- package/dist/modules/workspace/agent-download.builder.js.map +1 -1
- package/dist/modules/workspace/agent-upload.routes.d.ts.map +1 -1
- package/dist/modules/workspace/agent-upload.routes.js +19 -0
- package/dist/modules/workspace/agent-upload.routes.js.map +1 -1
- package/dist/modules/workspace/agent-upload.store.d.ts +11 -0
- package/dist/modules/workspace/agent-upload.store.d.ts.map +1 -1
- package/dist/modules/workspace/agent-upload.store.js +18 -0
- package/dist/modules/workspace/agent-upload.store.js.map +1 -1
- package/dist/modules/workspace/bounded-matcher.d.ts +5 -11
- package/dist/modules/workspace/bounded-matcher.d.ts.map +1 -1
- package/dist/modules/workspace/bounded-matcher.js +26 -87
- package/dist/modules/workspace/bounded-matcher.js.map +1 -1
- package/dist/modules/workspace/file-readers/doc-extract.service.d.ts +54 -10
- package/dist/modules/workspace/file-readers/doc-extract.service.d.ts.map +1 -1
- package/dist/modules/workspace/file-readers/doc-extract.service.js +69 -17
- package/dist/modules/workspace/file-readers/doc-extract.service.js.map +1 -1
- package/dist/modules/workspace/file-readers/doc-extract.types.d.ts +9 -2
- package/dist/modules/workspace/file-readers/doc-extract.types.d.ts.map +1 -1
- package/dist/modules/workspace/file-readers/doc-extract.types.js.map +1 -1
- package/dist/modules/workspace/file-readers/document-extractor.contract.d.ts +41 -0
- package/dist/modules/workspace/file-readers/document-extractor.contract.d.ts.map +1 -0
- package/dist/modules/workspace/file-readers/document-extractor.contract.js +5 -0
- package/dist/modules/workspace/file-readers/document-extractor.contract.js.map +1 -0
- package/dist/modules/workspace/file-readers/document-extractors.d.ts +9 -0
- package/dist/modules/workspace/file-readers/document-extractors.d.ts.map +1 -0
- package/dist/modules/workspace/file-readers/document-extractors.js +26 -0
- package/dist/modules/workspace/file-readers/document-extractors.js.map +1 -0
- package/dist/modules/workspace/file-readers/document-formats.d.ts +12 -0
- package/dist/modules/workspace/file-readers/document-formats.d.ts.map +1 -0
- package/dist/modules/workspace/file-readers/document-formats.js +11 -0
- package/dist/modules/workspace/file-readers/document-formats.js.map +1 -0
- package/dist/modules/workspace/file-readers/document-reader.d.ts +21 -17
- package/dist/modules/workspace/file-readers/document-reader.d.ts.map +1 -1
- package/dist/modules/workspace/file-readers/document-reader.js +38 -34
- package/dist/modules/workspace/file-readers/document-reader.js.map +1 -1
- package/dist/modules/workspace/file-readers/extract-in-worker.d.ts +60 -0
- package/dist/modules/workspace/file-readers/extract-in-worker.d.ts.map +1 -0
- package/dist/modules/workspace/file-readers/extract-in-worker.js +140 -0
- package/dist/modules/workspace/file-readers/extract-in-worker.js.map +1 -0
- package/dist/modules/workspace/file-readers/extract-pdf.d.ts +2 -0
- package/dist/modules/workspace/file-readers/extract-pdf.d.ts.map +1 -1
- package/dist/modules/workspace/file-readers/extract-pdf.js +20 -3
- package/dist/modules/workspace/file-readers/extract-pdf.js.map +1 -1
- package/dist/modules/workspace/file-readers/extract.worker.d.ts +2 -0
- package/dist/modules/workspace/file-readers/extract.worker.d.ts.map +1 -0
- package/dist/modules/workspace/file-readers/extract.worker.js +5 -0
- package/dist/modules/workspace/file-readers/extract.worker.js.map +1 -0
- package/dist/modules/workspace/file-readers/extraction-cache.d.ts +21 -5
- package/dist/modules/workspace/file-readers/extraction-cache.d.ts.map +1 -1
- package/dist/modules/workspace/file-readers/extraction-cache.js +24 -10
- package/dist/modules/workspace/file-readers/extraction-cache.js.map +1 -1
- package/dist/modules/workspace/file-readers/extraction-worker.d.ts +42 -0
- package/dist/modules/workspace/file-readers/extraction-worker.d.ts.map +1 -0
- package/dist/modules/workspace/file-readers/extraction-worker.js +69 -0
- package/dist/modules/workspace/file-readers/extraction-worker.js.map +1 -0
- package/dist/modules/workspace/file-readers/file-reader.d.ts +13 -4
- package/dist/modules/workspace/file-readers/file-reader.d.ts.map +1 -1
- package/dist/modules/workspace/file-readers/file-reader.js.map +1 -1
- package/dist/modules/workspace/file-readers/file-reader.registry.d.ts +3 -2
- package/dist/modules/workspace/file-readers/file-reader.registry.d.ts.map +1 -1
- package/dist/modules/workspace/file-readers/file-reader.registry.js +6 -20
- package/dist/modules/workspace/file-readers/file-reader.registry.js.map +1 -1
- package/dist/modules/workspace/first-run.js +1 -1
- package/dist/modules/workspace/first-run.js.map +1 -1
- package/dist/modules/workspace/git-internals.middleware.d.ts +1 -1
- package/dist/modules/workspace/git-internals.middleware.d.ts.map +1 -1
- package/dist/modules/workspace/git-internals.middleware.js +1 -1
- package/dist/modules/workspace/git-internals.middleware.js.map +1 -1
- package/dist/modules/workspace/index.d.ts +16 -0
- package/dist/modules/workspace/index.d.ts.map +1 -1
- package/dist/modules/workspace/index.js +13 -0
- package/dist/modules/workspace/index.js.map +1 -1
- package/dist/modules/workspace/kb-repository.d.ts.map +1 -1
- package/dist/modules/workspace/kb-repository.js +1 -1
- package/dist/modules/workspace/kb-repository.js.map +1 -1
- package/dist/modules/workspace/not-found.d.ts +1 -1
- package/dist/modules/workspace/not-found.d.ts.map +1 -1
- package/dist/modules/workspace/not-found.js +1 -1
- package/dist/modules/workspace/not-found.js.map +1 -1
- package/dist/modules/workspace/pattern-matcher.contract.d.ts +1 -1
- package/dist/modules/workspace/pattern-matcher.contract.d.ts.map +1 -1
- package/dist/modules/workspace/pattern-matcher.contract.js +1 -1
- package/dist/modules/workspace/pattern-matcher.contract.js.map +1 -1
- package/dist/modules/workspace/routine-write-policy.js +1 -1
- package/dist/modules/workspace/routine-write-policy.js.map +1 -1
- package/dist/modules/workspace/startup/kb-git.js +1 -1
- package/dist/modules/workspace/startup/kb-git.js.map +1 -1
- package/dist/modules/workspace/startup/kb-startup-runner.d.ts.map +1 -1
- package/dist/modules/workspace/startup/kb-startup-runner.js +1 -2
- package/dist/modules/workspace/startup/kb-startup-runner.js.map +1 -1
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js +2 -2
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/personal-spaces.step.js +2 -2
- package/dist/modules/workspace/startup/steps/personal-spaces.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/plugin-layout.js +1 -1
- package/dist/modules/workspace/startup/steps/plugin-layout.js.map +1 -1
- package/dist/modules/workspace/startup/steps/roles-yaml.step.js +1 -1
- package/dist/modules/workspace/startup/steps/roles-yaml.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.js +2 -2
- package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.js +2 -2
- package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.js +2 -2
- package/dist/modules/workspace/startup/steps/template-source.js.map +1 -1
- package/dist/modules/workspace/worker-pool.d.ts +100 -0
- package/dist/modules/workspace/worker-pool.d.ts.map +1 -0
- package/dist/modules/workspace/worker-pool.js +156 -0
- package/dist/modules/workspace/worker-pool.js.map +1 -0
- package/dist/modules/workspace/workspace.routes.d.ts +7 -8
- package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.routes.js +4 -6
- package/dist/modules/workspace/workspace.routes.js.map +1 -1
- package/dist/modules/workspace/workspace.service.d.ts +1 -1
- package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.service.js +3 -6
- package/dist/modules/workspace/workspace.service.js.map +1 -1
- package/dist/modules/workspace/workspace.tools.d.ts +7 -7
- package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.tools.js +45 -27
- package/dist/modules/workspace/workspace.tools.js.map +1 -1
- package/dist/modules/workspace/write-denial.d.ts +4 -4
- package/dist/modules/workspace/write-denial.d.ts.map +1 -1
- package/dist/modules/workspace/write-denial.js +2 -3
- package/dist/modules/workspace/write-denial.js.map +1 -1
- package/dist/modules/write-access/index.d.ts +8 -0
- package/dist/modules/write-access/index.d.ts.map +1 -0
- package/dist/modules/write-access/index.js +7 -0
- package/dist/modules/write-access/index.js.map +1 -0
- package/dist/shared/listener-seam.d.ts +34 -0
- package/dist/shared/listener-seam.d.ts.map +1 -0
- package/dist/shared/listener-seam.js +42 -0
- package/dist/shared/listener-seam.js.map +1 -0
- package/migrations/0019_oauth_token_rotated_at.sql +7 -0
- package/migrations/0020_change_request_body_is_the_description.sql +20 -0
- package/migrations/0021_data_migrations_ledger.sql +11 -0
- package/migrations/meta/0019_snapshot.json +2435 -0
- package/migrations/meta/0020_snapshot.json +2321 -0
- package/migrations/meta/0021_snapshot.json +2353 -0
- package/migrations/meta/_journal.json +21 -0
- package/package.json +3 -3
- package/src/core/__tests__/damaged-document.tools.test.ts +374 -0
- package/src/core/__tests__/public-config.test.ts +5 -0
- package/src/core/create-core-server.ts +32 -3
- package/src/core/create-core-services.ts +49 -5
- package/src/core/lifecycle.ts +10 -0
- package/src/core/public-config.ts +10 -0
- package/src/index.ts +7 -0
- package/src/modules/access/__tests__/access-requests.routes.test.ts +29 -15
- package/src/modules/access/access-control.service.ts +5 -6
- package/src/modules/access/access-declarations.ts +1 -1
- package/src/modules/access/access-mutation.service.ts +10 -4
- package/src/modules/access/access-requests.contract.ts +1 -1
- package/src/modules/access/access-requests.routes.ts +10 -15
- package/src/modules/access/access-requests.service.ts +29 -71
- package/src/modules/access/access-view.ts +1 -1
- package/src/modules/access/access.routes.ts +9 -11
- package/src/modules/access/admin-locked-commit.ts +3 -2
- package/src/modules/access/capability-registry.ts +1 -1
- package/src/modules/access/change-read-gate.ts +3 -5
- package/src/modules/access/creator-access.ts +3 -5
- package/src/modules/access/directory-sync-bot.ts +2 -2
- package/src/modules/access/groups-admin.routes.ts +3 -3
- package/src/modules/access/groups-admin.service.ts +3 -4
- package/src/modules/access/groups-edit.ts +2 -2
- package/src/modules/access/index.ts +17 -0
- package/src/modules/access/reference-scan.ts +1 -1
- package/src/modules/access/roles-admin.service.ts +3 -6
- package/src/modules/access/roles-edit.ts +1 -1
- package/src/modules/access/synced-groups-committer.ts +4 -4
- package/src/modules/access/synced-groups-writer.ts +2 -2
- package/src/modules/access/user-access-removal.service.ts +3 -6
- package/src/modules/access-model/index.ts +29 -0
- package/src/modules/access-model/roles-yaml-guard.ts +1 -1
- package/src/modules/admin/admin-access.routes.ts +1 -1
- package/src/modules/admin/admin-access.service.ts +2 -2
- package/src/modules/admin/index.ts +7 -0
- package/src/modules/agent-guide/__tests__/agent-guide.test.ts +5 -0
- package/src/modules/agent-guide/agent-guide.tools.ts +4 -6
- package/src/modules/agent-guide/agent-guide.ts +1 -1
- package/src/modules/agent-guide/index.ts +1 -1
- package/src/modules/agent-instructions/read-preamble.ts +1 -1
- package/src/modules/audit/agent-audit.service.ts +3 -3
- package/src/modules/audit/agent-connection.routes.ts +1 -1
- package/src/modules/audit/agent-rest-audit.middleware.ts +1 -1
- package/src/modules/audit/audit.routes.ts +4 -4
- package/src/modules/auth/__tests__/account-deactivation.test.ts +38 -2
- package/src/modules/auth/account-erasure.service.ts +4 -9
- package/src/modules/auth/account-hooks.ts +13 -21
- package/src/modules/auth/account-switch-lock.ts +2 -2
- package/src/modules/auth/account.routes.ts +3 -3
- package/src/modules/auth/auth.service.ts +23 -22
- package/src/modules/auth/index.ts +3 -0
- package/src/modules/auth/oidc-auth-provider.ts +1 -1
- package/src/modules/code-mode/code-mode.tool.ts +1 -1
- package/src/modules/connection-probe/connection-probe.service.ts +3 -6
- package/src/modules/database/__tests__/legacy-change-request-body.test.ts +118 -0
- package/src/modules/database/__tests__/legacy-request-bodies.pg.test.ts +258 -0
- package/src/modules/database/__tests__/pii-backfill.pg.test.ts +15 -18
- package/src/modules/database/core-schema.ts +59 -37
- package/src/modules/database/index.ts +9 -0
- package/src/modules/database/migrate.ts +79 -3
- package/src/modules/declared-variables/declared-variables.routes.ts +2 -2
- package/src/modules/diff/diff.routes.ts +5 -5
- package/src/modules/diff/diff.service.ts +2 -2
- package/src/modules/diff/index.ts +6 -0
- package/src/modules/embed/account-link.service.ts +2 -2
- package/src/modules/embed/embed.routes.ts +2 -2
- package/src/modules/embed/embed.service.ts +1 -1
- package/src/modules/embed/embed.tools.ts +6 -9
- package/src/modules/github-app/github-app.connection.ts +1 -1
- package/src/modules/github-app/github-app.routes.ts +3 -3
- package/src/modules/kb-fs/index.ts +11 -0
- package/src/modules/kb-fs/locking-filesystem.ts +1 -1
- package/src/modules/kb-sync/kb-sync.routes.ts +3 -3
- package/src/modules/kb-sync/kb-sync.service.ts +1 -1
- package/src/modules/kb-sync/sync-auth.ts +1 -1
- package/src/modules/kb-sync/sync-payload.ts +1 -1
- package/src/modules/marketplace/git-http.routes.ts +1 -1
- package/src/modules/marketplace/github-facade/github-facade-admin.routes.ts +1 -1
- package/src/modules/marketplace/github-facade/github-facade-codes.store.ts +2 -2
- package/src/modules/marketplace/github-facade/github-facade-credentials.service.ts +2 -2
- package/src/modules/marketplace/github-facade/github-facade.routes.ts +2 -2
- package/src/modules/marketplace/github-facade/github-facade.service.ts +2 -2
- package/src/modules/marketplace/marketplace-repo.service.ts +2 -2
- package/src/modules/mcp/__tests__/bevel-oauth-provider.pg.test.ts +279 -0
- package/src/modules/mcp/__tests__/bevel-oauth-provider.test.ts +190 -15
- package/src/modules/mcp/__tests__/read-only-hint.e2e.test.ts +213 -0
- package/src/modules/mcp/index.ts +7 -0
- package/src/modules/mcp/mcp-auth.middleware.ts +6 -7
- package/src/modules/mcp/mcp.routes.ts +3 -5
- package/src/modules/mcp/mcp.service.ts +30 -13
- package/src/modules/mcp/oauth/bevel-oauth-provider.ts +216 -50
- package/src/modules/mcp/oauth/oauth-consent.routes.ts +1 -1
- package/src/modules/onboarding/onboarding.routes.ts +1 -1
- package/src/modules/onboarding/starter-pack.service.ts +5 -6
- package/src/modules/plugins/__tests__/bundle-dialect.e2e.test.ts +2 -1
- package/src/modules/plugins/__tests__/plugin-links.service.test.ts +2 -1
- package/src/modules/plugins/compile/compile-marketplace.ts +2 -2
- package/src/modules/plugins/compile/marketplace-compiler.service.ts +3 -3
- package/src/modules/plugins/discovery/bundle-dialect/registry.ts +1 -1
- package/src/modules/plugins/index.ts +2 -0
- package/src/modules/plugins/join-proposals.ts +2 -2
- package/src/modules/plugins/join-request-jobs.service.ts +3 -3
- package/src/modules/plugins/join-request-records.store.ts +2 -2
- package/src/modules/plugins/join-requests.service.ts +4 -4
- package/src/modules/plugins/plugin-links.service.ts +10 -11
- package/src/modules/plugins/plugin-links.ts +4 -4
- package/src/modules/plugins/plugin-provision.service.ts +4 -5
- package/src/modules/plugins/plugin-rename.service.ts +3 -3
- package/src/modules/plugins/plugins.contract.ts +1 -1
- package/src/modules/plugins/plugins.routes.ts +4 -4
- package/src/modules/plugins/plugins.service.ts +5 -5
- package/src/modules/plugins/plugins.tools.ts +4 -4
- package/src/modules/plugins/teams.routes.ts +3 -3
- package/src/modules/secrets-vault/db-secrets-vault.service.ts +2 -2
- package/src/modules/secrets-vault/index.ts +2 -0
- package/src/modules/secrets-vault/secrets-vault.routes.ts +4 -4
- package/src/modules/settings/__tests__/deployment-settings.service.test.ts +88 -1
- package/src/modules/settings/connection-check.ts +1 -1
- package/src/modules/settings/deployment-settings.service.ts +44 -4
- package/src/modules/settings/git-root-folders.ts +1 -1
- package/src/modules/settings/index.ts +12 -0
- package/src/modules/settings/setup.routes.ts +5 -4
- package/src/modules/skills/__tests__/allowed-tools-warn.tools.test.ts +2 -2
- package/src/modules/skills/__tests__/skill-access-requests.routes.test.ts +6 -3
- package/src/modules/skills/allowed-tools-check.ts +2 -6
- package/src/modules/skills/index.ts +2 -0
- package/src/modules/skills/pending-skills.service.ts +3 -4
- package/src/modules/skills/skill-access-requests.routes.ts +10 -17
- package/src/modules/skills/skills.routes.ts +1 -1
- package/src/modules/skills/skills.service.ts +2 -2
- package/src/modules/skills/skills.tools.ts +5 -9
- package/src/modules/tool-auth/connection-key-rejection.ts +1 -1
- package/src/modules/tool-auth/connection-keys-admin.routes.ts +2 -2
- package/src/modules/tool-auth/external-api-key.service.ts +2 -2
- package/src/modules/tool-auth/index.ts +14 -0
- package/src/modules/tool-auth/tool-auth.middleware.ts +3 -3
- package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +2 -2
- package/src/modules/tool-helpers/__tests__/can-write.tools.test.ts +2 -2
- package/src/modules/tool-helpers/__tests__/phase4-tools.test.ts +2 -2
- package/src/modules/tool-helpers/default-branch-write.ts +1 -1
- package/src/modules/tool-helpers/index.ts +5 -1
- package/src/modules/tool-helpers/route-argument-check.ts +1 -1
- package/src/modules/tool-helpers/route-tool-schemas.ts +1 -1
- package/src/modules/tool-helpers/tool-context.ts +8 -10
- package/src/modules/tool-helpers/tool-def.ts +7 -3
- package/src/modules/tool-helpers/tool-handler.ts +2 -2
- package/src/modules/tool-helpers/tool.contract.ts +2 -2
- package/src/modules/tool-helpers/validate-token.ts +2 -3
- package/src/modules/tool-manuals/index.ts +6 -0
- package/src/modules/tool-manuals/mcp-server-edit.service.ts +2 -2
- package/src/modules/tool-manuals/pending-tools.service.ts +2 -2
- package/src/modules/tool-manuals/tool-delete.service.ts +5 -6
- package/src/modules/tool-manuals/tool-manuals.routes.ts +5 -5
- package/src/modules/tool-manuals/tool-manuals.service.ts +3 -3
- package/src/modules/tool-manuals/tool-manuals.tools.ts +4 -6
- package/src/modules/tool-registry/__tests__/read-only-hints.test.ts +439 -0
- package/src/modules/tool-registry/__tests__/tool-registry.test.ts +9 -2
- package/src/modules/tool-registry/description-length.ts +2 -2
- package/src/modules/tool-registry/index.ts +22 -0
- package/src/modules/tool-registry/manual.routes.ts +14 -8
- package/src/modules/tool-registry/read-only-hints.contract.ts +54 -0
- package/src/modules/tool-registry/read-only-hints.ts +225 -0
- package/src/modules/tool-registry/tool.contract.ts +11 -0
- package/src/modules/update-check/update-check.routes.ts +2 -2
- package/src/modules/workflow/__tests__/change-request-hooks.test.ts +62 -0
- package/src/modules/workflow/__tests__/event-bus.test.ts +14 -2
- package/src/modules/workflow/__tests__/events-delivery.test.ts +778 -0
- package/src/modules/workflow/__tests__/workflow.routes.open-change-request.test.ts +79 -0
- package/src/modules/workflow/__tests__/workflow.service.delete-branch.test.ts +9 -1
- package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +342 -22
- package/src/modules/workflow/__tests__/workflow.service.update-change-request.pg.test.ts +120 -0
- package/src/modules/workflow/__tests__/workflow.service.update-change-request.test.ts +346 -0
- package/src/modules/workflow/agent-tools/__tests__/change-request-read-shape.test.ts +32 -209
- package/src/modules/workflow/agent-tools/__tests__/change-request-read.tools.test.ts +16 -245
- package/src/modules/workflow/agent-tools/__tests__/update-change-request.parity.test.ts +306 -0
- package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +43 -57
- package/src/modules/workflow/agent-tools/change-request-read-shape.ts +18 -153
- package/src/modules/workflow/agent-tools/change-request-read.tools.ts +24 -96
- package/src/modules/workflow/agent-tools/change-request-summary.ts +26 -3
- package/src/modules/workflow/agent-tools/workflow.tools.ts +55 -75
- package/src/modules/workflow/change-request-hooks.ts +96 -0
- package/src/modules/workflow/event-bus.ts +3 -1
- package/src/modules/workflow/events-delivery.ts +278 -0
- package/src/modules/workflow/events.routes.ts +30 -9
- package/src/modules/workflow/file-lock.service.ts +2 -2
- package/src/modules/workflow/git/__tests__/pull-request.service.getPrDetail.test.ts +24 -9
- package/src/modules/workflow/git/git.service.ts +5 -8
- package/src/modules/workflow/git/node-git-runner.ts +1 -1
- package/src/modules/workflow/git/pull-request.service.ts +44 -29
- package/src/modules/workflow/index.ts +15 -2
- package/src/modules/workflow/pending-commits.service.ts +2 -2
- package/src/modules/workflow/read-on-branch.ts +1 -1
- package/src/modules/workflow/recovery-bot.ts +2 -2
- package/src/modules/workflow/review-workflow/approval-lock.ts +1 -1
- package/src/modules/workflow/review-workflow/review-workflow.interface.ts +3 -35
- package/src/modules/workflow/review-workflow/review-workflow.service.ts +6 -165
- package/src/modules/workflow/workflow.routes.ts +46 -100
- package/src/modules/workflow/workflow.service.ts +444 -215
- package/src/modules/workspace/__tests__/agent-downloads.test.ts +2 -1
- package/src/modules/workspace/__tests__/agent-uploads.test.ts +87 -1
- package/src/modules/workspace/__tests__/escape-sequences.routes.test.ts +2 -1
- package/src/modules/workspace/__tests__/file-stat-access.test.ts +2 -1
- package/src/modules/workspace/__tests__/git-internals.security.test.ts +2 -1
- package/src/modules/workspace/__tests__/rest-tool-arguments.test.ts +2 -1
- package/src/modules/workspace/__tests__/worker-pool.test.ts +118 -0
- package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +3 -2
- package/src/modules/workspace/__tests__/workspace.service.ensure-remotes-fetched.test.ts +30 -0
- package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.tools.test.ts +30 -4
- package/src/modules/workspace/agent-access.gate.ts +3 -3
- package/src/modules/workspace/agent-download.builder.ts +1 -1
- package/src/modules/workspace/agent-upload.routes.ts +19 -0
- package/src/modules/workspace/agent-upload.store.ts +18 -0
- package/src/modules/workspace/bounded-matcher.ts +32 -89
- package/src/modules/workspace/file-readers/README.md +9 -0
- package/src/modules/workspace/file-readers/__tests__/doc-extract.service.test.ts +165 -0
- package/src/modules/workspace/file-readers/__tests__/doc-extract.test.ts +21 -16
- package/src/modules/workspace/file-readers/__tests__/extract-in-worker.test.ts +229 -0
- package/src/modules/workspace/file-readers/__tests__/file-reader.registry.test.ts +2 -1
- package/src/modules/workspace/file-readers/__tests__/fixtures/damaged-pdf.ts +34 -0
- package/src/modules/workspace/file-readers/__tests__/fixtures/misbehaving-extract.worker.ts +57 -0
- package/src/modules/workspace/file-readers/__tests__/fixtures/pdf-in-trouble.worker.ts +20 -0
- package/src/modules/workspace/file-readers/__tests__/fixtures/unloadable-extract.worker.ts +2 -0
- package/src/modules/workspace/file-readers/doc-extract.service.ts +95 -20
- package/src/modules/workspace/file-readers/doc-extract.types.ts +13 -3
- package/src/modules/workspace/file-readers/document-extractor.contract.ts +42 -0
- package/src/modules/workspace/file-readers/document-extractors.ts +28 -0
- package/src/modules/workspace/file-readers/document-formats.ts +13 -0
- package/src/modules/workspace/file-readers/document-reader.ts +40 -36
- package/src/modules/workspace/file-readers/extract-in-worker.ts +183 -0
- package/src/modules/workspace/file-readers/extract-pdf.ts +23 -4
- package/src/modules/workspace/file-readers/extract.worker.ts +5 -0
- package/src/modules/workspace/file-readers/extraction-cache.ts +33 -12
- package/src/modules/workspace/file-readers/extraction-worker.ts +86 -0
- package/src/modules/workspace/file-readers/file-reader.registry.ts +6 -20
- package/src/modules/workspace/file-readers/file-reader.ts +14 -4
- package/src/modules/workspace/first-run.ts +1 -1
- package/src/modules/workspace/git-internals.middleware.ts +1 -1
- package/src/modules/workspace/index.ts +17 -0
- package/src/modules/workspace/kb-repository.ts +3 -2
- package/src/modules/workspace/not-found.ts +1 -1
- package/src/modules/workspace/pattern-matcher.contract.ts +1 -1
- package/src/modules/workspace/routine-write-policy.ts +1 -1
- package/src/modules/workspace/startup/kb-git.ts +1 -1
- package/src/modules/workspace/startup/kb-startup-runner.ts +1 -2
- package/src/modules/workspace/startup/steps/groups-to-plugins.step.ts +3 -3
- package/src/modules/workspace/startup/steps/personal-spaces.step.ts +2 -2
- package/src/modules/workspace/startup/steps/plugin-layout.ts +1 -1
- package/src/modules/workspace/startup/steps/roles-yaml.step.ts +1 -1
- package/src/modules/workspace/startup/steps/seed-tree.ts +2 -2
- package/src/modules/workspace/startup/steps/template-files.step.ts +2 -2
- package/src/modules/workspace/startup/steps/template-source.ts +2 -2
- package/src/modules/workspace/worker-pool.ts +193 -0
- package/src/modules/workspace/workspace.routes.ts +9 -12
- package/src/modules/workspace/workspace.service.ts +4 -7
- package/src/modules/workspace/workspace.tools.ts +53 -34
- package/src/modules/workspace/write-denial.ts +4 -5
- package/src/modules/write-access/index.ts +7 -0
- package/src/shared/__tests__/module-boundaries.lint.test.ts +301 -0
- package/src/shared/listener-seam.ts +52 -0
- package/src/modules/workflow/__tests__/format-affected-owners.test.ts +0 -85
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { Server } from 'node:http';
|
|
2
|
+
import type { AddressInfo } from 'node:net';
|
|
3
|
+
import express from 'express';
|
|
4
|
+
import { describe, it, expect, afterEach, vi } from 'vitest';
|
|
5
|
+
import type { AuthUser, IWorkflowService } from '@bevel-software/platform-shared';
|
|
6
|
+
import type { IAccessControl } from '../../access/access-control.interface.js';
|
|
7
|
+
import type { AuthService } from '../../auth/auth.service.js';
|
|
8
|
+
import type { WorkspaceService } from '../../workspace/workspace.service.js';
|
|
9
|
+
import { WorkflowEventBus } from '../event-bus.js';
|
|
10
|
+
import { createWorkflowRoutes } from '../workflow.routes.js';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* `POST /api/workflow/change-requests` answers the opened request as the
|
|
14
|
+
* service hands it over, `notified` included: the channels the deployment's
|
|
15
|
+
* change-request listeners said reached the approvers, so the dialog can say
|
|
16
|
+
* "the reviewers were emailed" — or hand over the link when nobody was.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
const ALICE: AuthUser = { id: '11111111-1111-4111-8111-111111111111', email: 'alice@example.com', name: 'Alice' };
|
|
20
|
+
|
|
21
|
+
async function serve(workflow: Partial<IWorkflowService>): Promise<{ server: Server; baseUrl: string }> {
|
|
22
|
+
const authService = { getUserById: vi.fn(async () => ALICE) } as unknown as AuthService;
|
|
23
|
+
const workspaceService = {
|
|
24
|
+
getOrCreateForBranch: vi.fn(async (branch: string) => ({ id: encodeURIComponent(branch) })),
|
|
25
|
+
} as unknown as WorkspaceService;
|
|
26
|
+
const app = express();
|
|
27
|
+
app.use(express.json());
|
|
28
|
+
app.use('/api', (req, _res, next) => {
|
|
29
|
+
(req as unknown as { userId: string }).userId = ALICE.id;
|
|
30
|
+
next();
|
|
31
|
+
});
|
|
32
|
+
app.use(
|
|
33
|
+
'/api',
|
|
34
|
+
createWorkflowRoutes(
|
|
35
|
+
workflow as IWorkflowService,
|
|
36
|
+
workspaceService,
|
|
37
|
+
authService,
|
|
38
|
+
new WorkflowEventBus(),
|
|
39
|
+
{} as unknown as IAccessControl,
|
|
40
|
+
'knowledge-base',
|
|
41
|
+
),
|
|
42
|
+
);
|
|
43
|
+
const server = await new Promise<Server>((resolve) => {
|
|
44
|
+
const s = app.listen(0, () => resolve(s));
|
|
45
|
+
});
|
|
46
|
+
return { server, baseUrl: `http://127.0.0.1:${(server.address() as AddressInfo).port}` };
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
describe('POST /workflow/change-requests answers who was notified', () => {
|
|
50
|
+
let server: Server | undefined;
|
|
51
|
+
afterEach(async () => {
|
|
52
|
+
if (server) await new Promise<void>((resolve, reject) => server!.close((e) => (e ? reject(e) : resolve())));
|
|
53
|
+
server = undefined;
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it.each([
|
|
57
|
+
['the channels that reached the approvers', ['email']],
|
|
58
|
+
['nobody, truthfully', []],
|
|
59
|
+
])('carries `notified`: %s', async (_what, notified) => {
|
|
60
|
+
const openChangeRequest = vi.fn(async () => ({ number: 12, branch: 'alice/deal', base: 'main', notified }) as never);
|
|
61
|
+
let baseUrl: string;
|
|
62
|
+
({ server, baseUrl } = await serve({ openChangeRequest }));
|
|
63
|
+
|
|
64
|
+
const res = await fetch(`${baseUrl}/api/workflow/change-requests`, {
|
|
65
|
+
method: 'POST',
|
|
66
|
+
headers: { 'content-type': 'application/json' },
|
|
67
|
+
body: JSON.stringify({ sourceBranch: 'alice/deal', targetBranch: 'main', title: 'Deal' }),
|
|
68
|
+
});
|
|
69
|
+
expect(res.status).toBe(200);
|
|
70
|
+
expect(await res.json()).toEqual({ number: 12, branch: 'alice/deal', base: 'main', notified });
|
|
71
|
+
// The open runs in the SOURCE branch's workspace, by the caller.
|
|
72
|
+
expect(openChangeRequest).toHaveBeenCalledTimes(1);
|
|
73
|
+
expect(openChangeRequest).toHaveBeenCalledWith(
|
|
74
|
+
encodeURIComponent('alice/deal'),
|
|
75
|
+
ALICE,
|
|
76
|
+
{ sourceBranch: 'alice/deal', targetBranch: 'main', title: 'Deal', description: undefined },
|
|
77
|
+
);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
@@ -115,6 +115,7 @@ interface Harness {
|
|
|
115
115
|
deleted: string[];
|
|
116
116
|
/** What the service announced to connected tabs. */
|
|
117
117
|
emitted: { kind: string; number?: number }[];
|
|
118
|
+
changeRequestHooks: { onChangeRequestOpened: ReturnType<typeof vi.fn>; runChangeRequestOpened: ReturnType<typeof vi.fn> };
|
|
118
119
|
hasAnyActive: MockInstance<FileLockService['hasAnyActive']>;
|
|
119
120
|
}
|
|
120
121
|
|
|
@@ -142,6 +143,7 @@ function harness(opts: {
|
|
|
142
143
|
}): Harness {
|
|
143
144
|
const deleted: string[] = [];
|
|
144
145
|
const emitted: { kind: string; number?: number }[] = [];
|
|
146
|
+
const changeRequestHooks = { onChangeRequestOpened: vi.fn(), runChangeRequestOpened: vi.fn(async () => []) };
|
|
145
147
|
const rows = opts.rows ?? [];
|
|
146
148
|
const branches = { ...(opts.branches ?? {}) };
|
|
147
149
|
const git = {
|
|
@@ -212,8 +214,11 @@ function harness(opts: {
|
|
|
212
214
|
testKbContext(),
|
|
213
215
|
openChangeGate(),
|
|
214
216
|
{ emit: (e: { kind: string; number?: number }) => void emitted.push(e) } as unknown as WorkflowEventBus,
|
|
217
|
+
undefined,
|
|
218
|
+
undefined,
|
|
219
|
+
changeRequestHooks,
|
|
215
220
|
);
|
|
216
|
-
return { svc, git, fetch, deleted, emitted, hasAnyActive };
|
|
221
|
+
return { svc, git, fetch, deleted, emitted, hasAnyActive, changeRequestHooks };
|
|
217
222
|
}
|
|
218
223
|
|
|
219
224
|
const merged = (number: number, source: string, sha: string | null): CrRow => ({
|
|
@@ -557,6 +562,9 @@ describe('a change request that proposes nothing never blocks a deletion', () =>
|
|
|
557
562
|
expect.objectContaining({ number: 21, source: 'ali/sync', target: DEFAULT }),
|
|
558
563
|
expect.objectContaining({ number: 22, source: 'ali/feature', target: 'ali/sync' }),
|
|
559
564
|
]);
|
|
565
|
+
// A reopened request was opened once already: the deployment's
|
|
566
|
+
// change-request-opened listeners are not told again.
|
|
567
|
+
expect(h.changeRequestHooks.runChangeRequestOpened).not.toHaveBeenCalled();
|
|
560
568
|
// The app's path, the same.
|
|
561
569
|
reopens.length = 0;
|
|
562
570
|
await expect(h.svc.deleteBranch(workspaceIdForBranch(DEFAULT), 'ali/sync', ADMIN)).rejects.toThrow(/stale info/);
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
import { describe, it, expect, vi } from 'vitest';
|
|
1
|
+
import { afterAll, beforeAll, describe, it, expect, vi } from 'vitest';
|
|
2
|
+
import { execFileSync } from 'node:child_process';
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import os from 'node:os';
|
|
5
|
+
import path from 'node:path';
|
|
2
6
|
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
3
7
|
import type {
|
|
4
8
|
AuthUser,
|
|
5
9
|
ChangeInput,
|
|
6
|
-
PostChangeRequestCommentInput,
|
|
7
10
|
} from '@bevel-software/platform-shared';
|
|
8
11
|
import type { GitService } from '../git/git.service.js';
|
|
9
12
|
import type { PullRequestService } from '../git/pull-request.service.js';
|
|
@@ -15,10 +18,13 @@ import { PendingCommitsService, type PendingCommit } from '../pending-commits.se
|
|
|
15
18
|
import { PendingCommitsWorker } from '../pending-commits.worker.js';
|
|
16
19
|
import { HttpCommunicationProtocol } from '@utcp/http';
|
|
17
20
|
import { WorkflowService } from '../workflow.service.js';
|
|
21
|
+
import type { ChangeRequestOpenedEvent, IChangeRequestHooks } from '../change-request-hooks.js';
|
|
18
22
|
import {
|
|
23
|
+
ChangeRequestConflictsError,
|
|
19
24
|
PullRebaseConflictError,
|
|
20
25
|
PushNeedsAgentResolutionError,
|
|
21
26
|
WorkflowDomainError,
|
|
27
|
+
WorkflowValidationError,
|
|
22
28
|
} from '../../../shared/domain-errors.js';
|
|
23
29
|
import type { WorkflowEventBus } from '../event-bus.js';
|
|
24
30
|
import { DEFAULT_BRANCH } from '@bevel-software/platform-shared';
|
|
@@ -225,15 +231,13 @@ function makePrs(): PullRequestService {
|
|
|
225
231
|
getPrDetail: vi.fn(),
|
|
226
232
|
invalidateDetailCache: vi.fn(),
|
|
227
233
|
setDetailEnricher: vi.fn(),
|
|
234
|
+
// No public address configured: the in-app path, with its note.
|
|
235
|
+
linkFor: vi.fn((number: number) => ({ url: `/change-requests/${number}`, urlNote: 'Set PUBLIC_FRONTEND_URL to get absolute links.' })),
|
|
228
236
|
} as unknown as PullRequestService;
|
|
229
237
|
}
|
|
230
238
|
|
|
231
239
|
function makeReviewWorkflow(): IReviewWorkflowService {
|
|
232
240
|
return {
|
|
233
|
-
listComments: vi.fn(),
|
|
234
|
-
postComment: vi.fn(),
|
|
235
|
-
editComment: vi.fn(),
|
|
236
|
-
deleteComment: vi.fn(),
|
|
237
241
|
getApprovalStates: vi.fn(),
|
|
238
242
|
approveFile: vi.fn(),
|
|
239
243
|
unapproveFile: vi.fn(),
|
|
@@ -563,21 +567,6 @@ describe('WorkflowService — change request delegation + cache invalidation', (
|
|
|
563
567
|
expect(prs.listOpenPrs).toHaveBeenCalledWith({ fresh: true });
|
|
564
568
|
});
|
|
565
569
|
|
|
566
|
-
it('postComment delegates AND invalidates the PR detail cache', async () => {
|
|
567
|
-
const prs = makePrs();
|
|
568
|
-
const reviewWorkflow = makeReviewWorkflow();
|
|
569
|
-
const comment = { id: 'c1' };
|
|
570
|
-
const input: PostChangeRequestCommentInput = { body: 'hi' };
|
|
571
|
-
(reviewWorkflow.postComment as ReturnType<typeof vi.fn>).mockResolvedValue(comment);
|
|
572
|
-
|
|
573
|
-
const svc = new WorkflowService(makeDb(), makeGit(), prs, reviewWorkflow, makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
|
|
574
|
-
const user = makeUser();
|
|
575
|
-
await expect(svc.postComment(42, user, input, 'sha1')).resolves.toBe(comment);
|
|
576
|
-
expect(reviewWorkflow.postComment).toHaveBeenCalledWith(42, user, input, 'sha1');
|
|
577
|
-
expect(prs.invalidateDetailCache).toHaveBeenCalledWith(42);
|
|
578
|
-
expect(prs.invalidateDetailCache).toHaveBeenCalledTimes(1);
|
|
579
|
-
});
|
|
580
|
-
|
|
581
570
|
it('approveFile invalidates the PR detail cache exactly once', async () => {
|
|
582
571
|
const prs = makePrs();
|
|
583
572
|
const reviewWorkflow = makeReviewWorkflow();
|
|
@@ -593,14 +582,65 @@ describe('WorkflowService — change request delegation + cache invalidation', (
|
|
|
593
582
|
const prs = makePrs();
|
|
594
583
|
const reviewWorkflow = makeReviewWorkflow();
|
|
595
584
|
(reviewWorkflow.cancelPr as ReturnType<typeof vi.fn>).mockResolvedValue({ prNumber: 9, cancelledAt: 't' });
|
|
585
|
+
// A caller holding no grant: not the author, not an admin, no files to own.
|
|
586
|
+
const access = makeAccessControl();
|
|
587
|
+
(access.canWriteAtRef as ReturnType<typeof vi.fn>).mockResolvedValue(false);
|
|
596
588
|
|
|
597
|
-
const svc = new WorkflowService(makeDb(), makeGit(), prs, reviewWorkflow, makeWorkspaceService(),
|
|
589
|
+
const svc = new WorkflowService(makeDb(), makeGit(), prs, reviewWorkflow, makeWorkspaceService(), access, makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
|
|
598
590
|
const user = makeUser();
|
|
599
591
|
await svc.rejectChangeRequest(9, user, 'open', null, 'main', 'w1');
|
|
592
|
+
// Passed through unchanged: `cancelPr` is the one that refuses it.
|
|
600
593
|
expect(reviewWorkflow.cancelPr).toHaveBeenCalledWith(9, user, 'open', null, 'main', 'w1');
|
|
601
594
|
expect(prs.invalidateDetailCache).toHaveBeenCalledWith(9);
|
|
602
595
|
});
|
|
603
596
|
|
|
597
|
+
// Reject and the title/description edit share ONE rule for who may decide a
|
|
598
|
+
// request (`changeRequestDecisionGrant`); these pin reject's side of it.
|
|
599
|
+
it('rejectChangeRequest lets the holder of write on every changed file close it as the author would', async () => {
|
|
600
|
+
const prs = makePrs();
|
|
601
|
+
(prs.getPrDetail as ReturnType<typeof vi.fn>).mockResolvedValue({ files: [{ path: 'a.md' }, { path: 'b.md' }] });
|
|
602
|
+
const reviewWorkflow = makeReviewWorkflow();
|
|
603
|
+
(reviewWorkflow.cancelPr as ReturnType<typeof vi.fn>).mockResolvedValue({ prNumber: 9, cancelledAt: 't' });
|
|
604
|
+
const access = makeAccessControl();
|
|
605
|
+
(access.canWriteAtRef as ReturnType<typeof vi.fn>).mockResolvedValue(false);
|
|
606
|
+
(access.canWriteBatchAtRef as ReturnType<typeof vi.fn>).mockResolvedValue(
|
|
607
|
+
new Map([['a.md', true], ['b.md', true]]),
|
|
608
|
+
);
|
|
609
|
+
const workspaceService = makeWorkspaceService();
|
|
610
|
+
|
|
611
|
+
const svc = new WorkflowService(makeDb(), makeGit(), prs, reviewWorkflow, workspaceService, access, makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
|
|
612
|
+
const user = makeUser();
|
|
613
|
+
await svc.rejectChangeRequest(9, user, 'open', 'someone-else', 'main', 'w1');
|
|
614
|
+
expect(workspaceService.ensureRemotesFetched).toHaveBeenCalledWith('w1', { strict: true, force: true });
|
|
615
|
+
expect(access.canWriteBatchAtRef).toHaveBeenCalledWith('w1', 'origin/main', user.email, ['a.md', 'b.md']);
|
|
616
|
+
expect(reviewWorkflow.cancelPr).toHaveBeenCalledWith(9, user, 'open', hashEmail(user.email), 'main', 'w1');
|
|
617
|
+
});
|
|
618
|
+
|
|
619
|
+
it('rejectChangeRequest refuses with a worded 409 when origin cannot be fetched, never against a stale tree', async () => {
|
|
620
|
+
const reviewWorkflow = makeReviewWorkflow();
|
|
621
|
+
const workspaceService = makeWorkspaceService();
|
|
622
|
+
(workspaceService.ensureRemotesFetched as ReturnType<typeof vi.fn>).mockRejectedValue(new Error('offline'));
|
|
623
|
+
const access = makeAccessControl();
|
|
624
|
+
|
|
625
|
+
const svc = new WorkflowService(makeDb(), makeGit(), makePrs(), reviewWorkflow, workspaceService, access, makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
|
|
626
|
+
await expect(svc.rejectChangeRequest(9, makeUser(), 'open', 'someone-else', 'main', 'w1')).rejects.toMatchObject({
|
|
627
|
+
status: 409,
|
|
628
|
+
message: expect.stringContaining('origin was unreachable'),
|
|
629
|
+
});
|
|
630
|
+
expect(access.canWriteAtRef).not.toHaveBeenCalled();
|
|
631
|
+
expect(reviewWorkflow.cancelPr).not.toHaveBeenCalled();
|
|
632
|
+
});
|
|
633
|
+
|
|
634
|
+
it("rejectChangeRequest reads no grant for a request that is no longer open — cancelPr answers it", async () => {
|
|
635
|
+
const reviewWorkflow = makeReviewWorkflow();
|
|
636
|
+
(reviewWorkflow.cancelPr as ReturnType<typeof vi.fn>).mockRejectedValue(new Error('already-applied'));
|
|
637
|
+
const workspaceService = makeWorkspaceService();
|
|
638
|
+
|
|
639
|
+
const svc = new WorkflowService(makeDb(), makeGit(), makePrs(), reviewWorkflow, workspaceService, makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
|
|
640
|
+
await expect(svc.rejectChangeRequest(9, makeUser(), 'merged', null, 'main', 'w1')).rejects.toThrow('already-applied');
|
|
641
|
+
expect(workspaceService.ensureRemotesFetched).not.toHaveBeenCalled();
|
|
642
|
+
});
|
|
643
|
+
|
|
604
644
|
it('mergeChangeRequest wraps the underlying merge result in a "merged" outcome', async () => {
|
|
605
645
|
const prs = makePrs();
|
|
606
646
|
const reviewWorkflow = makeReviewWorkflow();
|
|
@@ -1597,6 +1637,35 @@ describe('WorkflowService.openChangeRequest — when the repository host refuses
|
|
|
1597
1637
|
return { svc, git, prs, values, emit };
|
|
1598
1638
|
}
|
|
1599
1639
|
|
|
1640
|
+
it('stores the description as the whole body, and an access request\'s level and note on their own columns', async () => {
|
|
1641
|
+
const h = makeOpenHarness(vi.fn().mockResolvedValue(undefined));
|
|
1642
|
+
await h.svc.openChangeRequest('ali%2Fx', makeUser(), { ...INPUT, description: ' Why this. ' });
|
|
1643
|
+
expect(h.values).toHaveBeenLastCalledWith(
|
|
1644
|
+
expect.objectContaining({ body: 'Why this.', accessRequestLevel: null, accessRequestNote: null }),
|
|
1645
|
+
);
|
|
1646
|
+
// Nothing of Hexis's own is appended: the stored body is exactly the description.
|
|
1647
|
+
expect((h.values.mock.calls[0] as [Record<string, unknown>])[0].body).not.toContain('Affected owners');
|
|
1648
|
+
|
|
1649
|
+
await h.svc.openChangeRequest('ali%2Fx', makeUser(), {
|
|
1650
|
+
...INPUT,
|
|
1651
|
+
description: 'Rita asked for **Owner** on Research.',
|
|
1652
|
+
accessRequest: { level: 'owner', note: ' I maintain these pages now ' },
|
|
1653
|
+
});
|
|
1654
|
+
expect(h.values).toHaveBeenLastCalledWith(
|
|
1655
|
+
expect.objectContaining({
|
|
1656
|
+
body: 'Rita asked for **Owner** on Research.',
|
|
1657
|
+
accessRequestLevel: 'owner',
|
|
1658
|
+
accessRequestNote: 'I maintain these pages now',
|
|
1659
|
+
}),
|
|
1660
|
+
);
|
|
1661
|
+
|
|
1662
|
+
// A level with a blank note stores no note.
|
|
1663
|
+
await h.svc.openChangeRequest('ali%2Fx', makeUser(), { ...INPUT, accessRequest: { level: 'write', note: ' ' } });
|
|
1664
|
+
expect(h.values).toHaveBeenLastCalledWith(
|
|
1665
|
+
expect.objectContaining({ body: '', accessRequestLevel: 'write', accessRequestNote: null }),
|
|
1666
|
+
);
|
|
1667
|
+
});
|
|
1668
|
+
|
|
1600
1669
|
it('creates the request, then answers 409 with the saved-locally sentence and raises the banner', async () => {
|
|
1601
1670
|
const refused = new Error(
|
|
1602
1671
|
'git push failed: remote: Internal Server Error\n ! [remote rejected] ali/x -> ali/x (Internal Server Error)',
|
|
@@ -1640,6 +1709,257 @@ describe('WorkflowService.openChangeRequest — when the repository host refuses
|
|
|
1640
1709
|
});
|
|
1641
1710
|
});
|
|
1642
1711
|
|
|
1712
|
+
/**
|
|
1713
|
+
* Opening a request tells the deployment's change-request listeners — once,
|
|
1714
|
+
* here, whether a person or an agent opened it — and answers `notified`: the
|
|
1715
|
+
* channels the listeners said reached the approvers. The approvers are the
|
|
1716
|
+
* people the `## Affected owners` block lists, resolved to accounts and
|
|
1717
|
+
* handed over once each; who could not be is counted.
|
|
1718
|
+
*/
|
|
1719
|
+
describe('WorkflowService.openChangeRequest — tells the change-request listeners', () => {
|
|
1720
|
+
const INPUT = { sourceBranch: 'ali/x', targetBranch: 'main', title: ' Tidy the glossary ' };
|
|
1721
|
+
const PATHS = ['KnowledgeBase/Sales/Deal.md', 'KnowledgeBase/Legal/Terms.md'];
|
|
1722
|
+
const ACCOUNTS: Record<string, { id: string; email: string; name: string }> = {
|
|
1723
|
+
'dana@acme.test': { id: 'u-dana', email: 'dana@acme.test', name: 'Dana' },
|
|
1724
|
+
'lena@acme.test': { id: 'u-lena', email: 'Lena@acme.test', name: 'Lena' },
|
|
1725
|
+
};
|
|
1726
|
+
|
|
1727
|
+
function eligibility(
|
|
1728
|
+
perPath: Record<string, { roles?: string[]; emails: string[] }>,
|
|
1729
|
+
): Map<string, { roles: string[]; users: { name: string; email: string }[]; emails: Set<string> }> {
|
|
1730
|
+
const out = new Map<string, { roles: string[]; users: { name: string; email: string }[]; emails: Set<string> }>();
|
|
1731
|
+
for (const [p, { roles = [], emails }] of Object.entries(perPath)) {
|
|
1732
|
+
out.set(p, { roles, users: emails.map((email) => ({ name: '', email })), emails: new Set(emails) });
|
|
1733
|
+
}
|
|
1734
|
+
return out;
|
|
1735
|
+
}
|
|
1736
|
+
|
|
1737
|
+
// A real repository, so the changed paths come from the `git diff` the
|
|
1738
|
+
// service runs in production and not from a replaced helper: `main` is the
|
|
1739
|
+
// base and the ref `origin/main` the diff is taken against; `ali/x` adds
|
|
1740
|
+
// PATHS. The checkout sits under the knowledge-base folder name the test
|
|
1741
|
+
// context gives, where the service looks for it.
|
|
1742
|
+
let workspace: string;
|
|
1743
|
+
beforeAll(() => {
|
|
1744
|
+
workspace = fs.mkdtempSync(path.join(os.tmpdir(), 'hexis-open-tells-'));
|
|
1745
|
+
const repo = path.join(workspace, testKbContext().kbDirName);
|
|
1746
|
+
fs.mkdirSync(repo);
|
|
1747
|
+
const git = (...args: string[]) =>
|
|
1748
|
+
execFileSync('git', ['-c', 'user.name=t', '-c', 'user.email=t@t.test', '-c', 'commit.gpgsign=false', ...args], { cwd: repo, stdio: 'pipe' });
|
|
1749
|
+
git('init', '-q', '-b', 'main');
|
|
1750
|
+
git('commit', '-q', '--allow-empty', '-m', 'base');
|
|
1751
|
+
git('update-ref', 'refs/remotes/origin/main', 'HEAD');
|
|
1752
|
+
git('checkout', '-q', '-b', 'ali/x');
|
|
1753
|
+
for (const p of PATHS) {
|
|
1754
|
+
fs.mkdirSync(path.dirname(path.join(repo, p)), { recursive: true });
|
|
1755
|
+
fs.writeFileSync(path.join(repo, p), `# ${p}\n`);
|
|
1756
|
+
}
|
|
1757
|
+
git('add', '-A');
|
|
1758
|
+
git('commit', '-q', '-m', 'the change');
|
|
1759
|
+
});
|
|
1760
|
+
afterAll(() => {
|
|
1761
|
+
fs.rmSync(workspace, { recursive: true, force: true });
|
|
1762
|
+
});
|
|
1763
|
+
|
|
1764
|
+
function makeNotifyHarness(opts: {
|
|
1765
|
+
eligible?: ReturnType<typeof eligibility> | null;
|
|
1766
|
+
push?: ReturnType<typeof vi.fn>;
|
|
1767
|
+
merge?: ReturnType<typeof vi.fn>;
|
|
1768
|
+
detail?: ReturnType<typeof vi.fn>;
|
|
1769
|
+
accounts?: { findActiveAccountsByEmail: ReturnType<typeof vi.fn> } | undefined;
|
|
1770
|
+
link?: { url: string; urlNote?: string };
|
|
1771
|
+
} = {}) {
|
|
1772
|
+
const git = Object.assign(makeGit(), {
|
|
1773
|
+
mergeFromOrigin: opts.merge ?? vi.fn().mockResolvedValue({ kind: 'clean', alreadyUpToDate: false }),
|
|
1774
|
+
push: opts.push ?? vi.fn().mockResolvedValue(undefined),
|
|
1775
|
+
pull: vi.fn().mockResolvedValue({ treeChanged: false }),
|
|
1776
|
+
}) as unknown as GitService;
|
|
1777
|
+
const prs = makePrs();
|
|
1778
|
+
(prs.listOpenPrs as ReturnType<typeof vi.fn>).mockResolvedValue([]);
|
|
1779
|
+
if (opts.detail) prs.getPrDetail = opts.detail as unknown as PullRequestService['getPrDetail'];
|
|
1780
|
+
else (prs.getPrDetail as ReturnType<typeof vi.fn>).mockResolvedValue({ number: 12, branch: 'ali/x', base: 'main' });
|
|
1781
|
+
if (opts.link) (prs.linkFor as ReturnType<typeof vi.fn>).mockReturnValue(opts.link);
|
|
1782
|
+
const workspaces = makeWorkspaceService();
|
|
1783
|
+
(workspaces.getWorkspacePath as ReturnType<typeof vi.fn>).mockResolvedValue(workspace);
|
|
1784
|
+
const access = makeAccessControl();
|
|
1785
|
+
(access.eligibleWritersForPathsAtRef as ReturnType<typeof vi.fn>).mockResolvedValue(opts.eligible ?? null);
|
|
1786
|
+
const values = vi.fn(() => ({ returning: vi.fn(async () => [{ number: 12 }]) }));
|
|
1787
|
+
const db = { insert: vi.fn(() => ({ values })) } as unknown as Database;
|
|
1788
|
+
const run = vi.fn<(event: ChangeRequestOpenedEvent) => Promise<string[]>>(async () => ['email']);
|
|
1789
|
+
const hooks: IChangeRequestHooks = { onChangeRequestOpened: vi.fn(), runChangeRequestOpened: run };
|
|
1790
|
+
const accounts =
|
|
1791
|
+
'accounts' in opts
|
|
1792
|
+
? opts.accounts
|
|
1793
|
+
: {
|
|
1794
|
+
findActiveAccountsByEmail: vi.fn(async (emails: readonly string[]) => {
|
|
1795
|
+
const found = new Map<string, { id: string; email: string; name: string }>();
|
|
1796
|
+
for (const email of emails) {
|
|
1797
|
+
const account = ACCOUNTS[email];
|
|
1798
|
+
if (account) found.set(email, account);
|
|
1799
|
+
}
|
|
1800
|
+
return found;
|
|
1801
|
+
}),
|
|
1802
|
+
};
|
|
1803
|
+
const svc = new WorkflowService(
|
|
1804
|
+
db, git, prs, makeReviewWorkflow(), workspaces, access,
|
|
1805
|
+
makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate(),
|
|
1806
|
+
{ emit: vi.fn() } as unknown as WorkflowEventBus, undefined, undefined, hooks, accounts,
|
|
1807
|
+
);
|
|
1808
|
+
return { svc, run, prs, access, accounts, values };
|
|
1809
|
+
}
|
|
1810
|
+
|
|
1811
|
+
it('fires once, after the row exists, with the request, who opened it and the approvers as accounts — once each', async () => {
|
|
1812
|
+
const h = makeNotifyHarness({
|
|
1813
|
+
eligible: eligibility({
|
|
1814
|
+
[PATHS[0]]: { roles: ['Sales'], emails: ['dana@acme.test', 'lena@acme.test'] },
|
|
1815
|
+
// Lena again, by another spelling: one person.
|
|
1816
|
+
[PATHS[1]]: { roles: ['Legal'], emails: ['LENA@acme.test'] },
|
|
1817
|
+
}),
|
|
1818
|
+
});
|
|
1819
|
+
const user = makeUser({ id: 'u-ali', email: 'ali@acme.test', name: 'Ali' });
|
|
1820
|
+
const answer = await h.svc.openChangeRequest('ali%2Fx', user, INPUT);
|
|
1821
|
+
|
|
1822
|
+
expect(h.run).toHaveBeenCalledTimes(1);
|
|
1823
|
+
const [event] = h.run.mock.calls[0]!;
|
|
1824
|
+
expect(event).toEqual({
|
|
1825
|
+
number: 12,
|
|
1826
|
+
title: 'Tidy the glossary',
|
|
1827
|
+
sourceBranch: 'ali/x',
|
|
1828
|
+
targetBranch: 'main',
|
|
1829
|
+
openedBy: { id: 'u-ali', email: 'ali@acme.test', name: 'Ali' },
|
|
1830
|
+
approvers: [
|
|
1831
|
+
{ id: 'u-dana', email: 'dana@acme.test', name: 'Dana' },
|
|
1832
|
+
{ id: 'u-lena', email: 'Lena@acme.test', name: 'Lena' },
|
|
1833
|
+
],
|
|
1834
|
+
unresolvedApprovers: 0,
|
|
1835
|
+
pushPending: false,
|
|
1836
|
+
});
|
|
1837
|
+
// No public address: no `url` at all, not a relative one.
|
|
1838
|
+
expect(event).not.toHaveProperty('url');
|
|
1839
|
+
// The accounts were read once, for the distinct canonical addresses.
|
|
1840
|
+
expect(h.accounts!.findActiveAccountsByEmail).toHaveBeenCalledTimes(1);
|
|
1841
|
+
expect(h.accounts!.findActiveAccountsByEmail.mock.calls[0]![0]).toEqual(['dana@acme.test', 'lena@acme.test']);
|
|
1842
|
+
// The eligibility was asked for the paths the request changes — the
|
|
1843
|
+
// `git diff` against the target's published ref, as in production.
|
|
1844
|
+
const eligibleFor = h.access.eligibleWritersForPathsAtRef as ReturnType<typeof vi.fn>;
|
|
1845
|
+
expect(eligibleFor).toHaveBeenCalledTimes(1);
|
|
1846
|
+
expect(eligibleFor.mock.calls[0]!.slice(-1)[0]).toEqual([...PATHS].sort()); // as `git diff --name-only` orders them
|
|
1847
|
+
// The row landed before anyone was told, and the answer says who was.
|
|
1848
|
+
expect(h.values).toHaveBeenCalledTimes(1);
|
|
1849
|
+
expect(h.values.mock.invocationCallOrder[0]).toBeLessThan(h.run.mock.invocationCallOrder[0]!);
|
|
1850
|
+
// The approvers the listeners hear of are never written into the request:
|
|
1851
|
+
// with no description, the stored body is empty.
|
|
1852
|
+
expect((h.values.mock.calls[0] as unknown as [Record<string, unknown>])[0].body).toBe('');
|
|
1853
|
+
expect(answer).toMatchObject({ number: 12, notified: ['email'] });
|
|
1854
|
+
});
|
|
1855
|
+
|
|
1856
|
+
it('counts a person without an account and the built-in `everyone` as unresolved, and hands neither over', async () => {
|
|
1857
|
+
const h = makeNotifyHarness({
|
|
1858
|
+
eligible: eligibility({
|
|
1859
|
+
[PATHS[0]]: { roles: ['everyone'], emails: ['dana@acme.test', 'nobody@acme.test'] },
|
|
1860
|
+
[PATHS[1]]: { roles: ['everyone', 'Legal'], emails: ['dana@acme.test'] },
|
|
1861
|
+
}),
|
|
1862
|
+
});
|
|
1863
|
+
await h.svc.openChangeRequest('ali%2Fx', makeUser(), INPUT);
|
|
1864
|
+
const [event] = h.run.mock.calls[0]!;
|
|
1865
|
+
expect(event.approvers).toEqual([{ id: 'u-dana', email: 'dana@acme.test', name: 'Dana' }]);
|
|
1866
|
+
// `nobody@` once, `everyone` once however many paths grant it.
|
|
1867
|
+
expect(event.unresolvedApprovers).toBe(2);
|
|
1868
|
+
});
|
|
1869
|
+
|
|
1870
|
+
it('hands over the public address when one is configured', async () => {
|
|
1871
|
+
const h = makeNotifyHarness({ link: { url: 'https://kb.acme.test/change-requests/12' } });
|
|
1872
|
+
await h.svc.openChangeRequest('ali%2Fx', makeUser(), INPUT);
|
|
1873
|
+
expect(h.run.mock.calls[0]![0]).toMatchObject({ url: 'https://kb.acme.test/change-requests/12', approvers: [], unresolvedApprovers: 0 });
|
|
1874
|
+
});
|
|
1875
|
+
|
|
1876
|
+
it('with no accounts to ask, or a read of them that fails, every approver is unresolved and the open goes on', async () => {
|
|
1877
|
+
const eligible = eligibility({ [PATHS[0]]: { emails: ['dana@acme.test', 'lena@acme.test'] } });
|
|
1878
|
+
const without = makeNotifyHarness({ eligible, accounts: undefined });
|
|
1879
|
+
await without.svc.openChangeRequest('ali%2Fx', makeUser(), INPUT);
|
|
1880
|
+
expect(without.run.mock.calls[0]![0]).toMatchObject({ approvers: [], unresolvedApprovers: 2 });
|
|
1881
|
+
|
|
1882
|
+
const warn = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
1883
|
+
try {
|
|
1884
|
+
const failing = makeNotifyHarness({
|
|
1885
|
+
eligible,
|
|
1886
|
+
accounts: { findActiveAccountsByEmail: vi.fn().mockRejectedValue(new Error('db down')) },
|
|
1887
|
+
});
|
|
1888
|
+
await expect(failing.svc.openChangeRequest('ali%2Fx', makeUser(), INPUT)).resolves.toMatchObject({ notified: ['email'] });
|
|
1889
|
+
expect(failing.run.mock.calls[0]![0]).toMatchObject({ approvers: [], unresolvedApprovers: 2 });
|
|
1890
|
+
} finally {
|
|
1891
|
+
warn.mockRestore();
|
|
1892
|
+
}
|
|
1893
|
+
});
|
|
1894
|
+
|
|
1895
|
+
it('answers `notified: []` truthfully when the listeners reached nobody', async () => {
|
|
1896
|
+
const h = makeNotifyHarness();
|
|
1897
|
+
h.run.mockResolvedValue([]);
|
|
1898
|
+
await expect(h.svc.openChangeRequest('ali%2Fx', makeUser(), INPUT)).resolves.toMatchObject({ number: 12, notified: [] });
|
|
1899
|
+
});
|
|
1900
|
+
|
|
1901
|
+
it('tells the listeners even when the host refused the push, and says so: the request exists, its commits are still to land', async () => {
|
|
1902
|
+
const h = makeNotifyHarness({
|
|
1903
|
+
push: vi.fn().mockRejectedValue(new Error('git push failed: remote: Internal Server Error\n ! [remote rejected] ali/x -> ali/x (Internal Server Error)')),
|
|
1904
|
+
});
|
|
1905
|
+
const err = await h.svc.openChangeRequest('ali%2Fx', makeUser(), INPUT).catch((e: unknown) => e);
|
|
1906
|
+
expect(err).toBeInstanceOf(PushNeedsAgentResolutionError);
|
|
1907
|
+
expect(h.run).toHaveBeenCalledTimes(1);
|
|
1908
|
+
expect(h.run.mock.calls[0]![0]).toMatchObject({ number: 12, sourceBranch: 'ali/x', targetBranch: 'main', pushPending: true });
|
|
1909
|
+
});
|
|
1910
|
+
|
|
1911
|
+
it('tells the listeners once the branches\' lifecycle locks are released: a slow mailer holds up the answer, not a delete or a merge', async () => {
|
|
1912
|
+
const h = makeNotifyHarness();
|
|
1913
|
+
let release!: () => void;
|
|
1914
|
+
const gate = new Promise<void>((resolve) => { release = resolve; });
|
|
1915
|
+
h.run.mockImplementation(async () => { await gate; return ['email']; });
|
|
1916
|
+
const opening = h.svc.openChangeRequest('ali%2Fx', makeUser(), INPUT);
|
|
1917
|
+
await vi.waitFor(() => { expect(h.run).toHaveBeenCalledTimes(1); });
|
|
1918
|
+
// `createBranch` takes the branch's lifecycle lock — the one `deleteBranch`
|
|
1919
|
+
// and `mergeBranch` take too — so it completing while the listener still
|
|
1920
|
+
// waits shows the lock was released before the listeners were told.
|
|
1921
|
+
const free = await Promise.race([
|
|
1922
|
+
h.svc.createBranch('ali%2Fx', 'ali/x').then(() => 'free'),
|
|
1923
|
+
new Promise<string>((resolve) => setTimeout(() => resolve('held'), 300)),
|
|
1924
|
+
]);
|
|
1925
|
+
expect(free).toBe('free');
|
|
1926
|
+
release();
|
|
1927
|
+
await expect(opening).resolves.toMatchObject({ number: 12, notified: ['email'] });
|
|
1928
|
+
});
|
|
1929
|
+
|
|
1930
|
+
it('tells the listeners when the detail cannot be read back: the request exists, a retry would be a duplicate', async () => {
|
|
1931
|
+
const failing = makeNotifyHarness({ detail: vi.fn().mockRejectedValue(new Error('detail store down')) });
|
|
1932
|
+
await expect(failing.svc.openChangeRequest('ali%2Fx', makeUser(), INPUT)).rejects.toThrow('detail store down');
|
|
1933
|
+
expect(failing.run).toHaveBeenCalledTimes(1);
|
|
1934
|
+
expect(failing.run.mock.calls[0]![0]).toMatchObject({ number: 12, pushPending: false });
|
|
1935
|
+
|
|
1936
|
+
const missing = makeNotifyHarness({ detail: vi.fn().mockResolvedValue(null) });
|
|
1937
|
+
await expect(missing.svc.openChangeRequest('ali%2Fx', makeUser(), INPUT)).rejects.toBeInstanceOf(WorkflowValidationError);
|
|
1938
|
+
expect(missing.run).toHaveBeenCalledTimes(1);
|
|
1939
|
+
});
|
|
1940
|
+
|
|
1941
|
+
it('a refused open tells nobody: a validation failure, a conflicting auto-merge', async () => {
|
|
1942
|
+
const invalid = makeNotifyHarness();
|
|
1943
|
+
await expect(invalid.svc.openChangeRequest('ali%2Fx', makeUser(), { ...INPUT, title: ' ' })).rejects.toBeInstanceOf(WorkflowValidationError);
|
|
1944
|
+
expect(invalid.run).not.toHaveBeenCalled();
|
|
1945
|
+
expect(invalid.values).not.toHaveBeenCalled();
|
|
1946
|
+
|
|
1947
|
+
const conflicting = makeNotifyHarness({
|
|
1948
|
+
merge: vi.fn().mockResolvedValue({ kind: 'conflicts', paths: ['KnowledgeBase/Sales/Deal.md'] }),
|
|
1949
|
+
});
|
|
1950
|
+
await expect(conflicting.svc.openChangeRequest('ali%2Fx', makeUser(), INPUT)).rejects.toBeInstanceOf(ChangeRequestConflictsError);
|
|
1951
|
+
expect(conflicting.run).not.toHaveBeenCalled();
|
|
1952
|
+
expect(conflicting.values).not.toHaveBeenCalled();
|
|
1953
|
+
});
|
|
1954
|
+
|
|
1955
|
+
it('a refused open (a duplicate, say) tells nobody', async () => {
|
|
1956
|
+
const h = makeNotifyHarness();
|
|
1957
|
+
(h.prs.listOpenPrs as ReturnType<typeof vi.fn>).mockResolvedValue([{ number: 3, branch: 'ali/x', base: 'main' }]);
|
|
1958
|
+
await expect(h.svc.openChangeRequest('ali%2Fx', makeUser(), INPUT)).rejects.toThrow();
|
|
1959
|
+
expect(h.run).not.toHaveBeenCalled();
|
|
1960
|
+
});
|
|
1961
|
+
});
|
|
1962
|
+
|
|
1643
1963
|
/**
|
|
1644
1964
|
* Writes are committed asynchronously: a write tool answers once the bytes are
|
|
1645
1965
|
* on disk, and the pending-commits worker commits and pushes them seconds
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { afterAll, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { randomBytes } from 'node:crypto';
|
|
3
|
+
import { eq } from 'drizzle-orm';
|
|
4
|
+
import type { AuthUser } from '@bevel-software/platform-shared';
|
|
5
|
+
import { closeDb, createDb, type Database } from '../../database/connection.js';
|
|
6
|
+
import { runCoreMigrations } from '../../database/migrate.js';
|
|
7
|
+
import { changeRequests } from '../../database/core-schema.js';
|
|
8
|
+
import { coreMigrationsDir } from '../../../assets.js';
|
|
9
|
+
import { PG_ADMIN_URL, PG_TEST_TIMEOUT, dropScratchDatabases, scratchDatabaseUrl } from '../../../__tests__/pg-scratch.js';
|
|
10
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
11
|
+
import { openChangeGate } from '../../../__tests__/open-change-gate.js';
|
|
12
|
+
import { hashEmail } from '../../../shared/email-identity.js';
|
|
13
|
+
import type { IAccessControl } from '../../access/access-control.interface.js';
|
|
14
|
+
import type { WorkspaceService } from '../../workspace/workspace.service.js';
|
|
15
|
+
import type { GitService } from '../git/git.service.js';
|
|
16
|
+
import type { PullRequestService } from '../git/pull-request.service.js';
|
|
17
|
+
import type { IReviewWorkflowService } from '../review-workflow/review-workflow.interface.js';
|
|
18
|
+
import type { FileLockService } from '../file-lock.service.js';
|
|
19
|
+
import type { PendingCommitsService } from '../pending-commits.service.js';
|
|
20
|
+
import { WorkflowService } from '../workflow.service.js';
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* An edit against a real Postgres with column encryption ON. `title` and
|
|
24
|
+
* `body` are sealed with a fresh IV on every write, so no stub of the driver
|
|
25
|
+
* shows what a guard comparing the stored body would do: never match, and
|
|
26
|
+
* refuse every permitted edit with 409. Here the row is real and encrypted.
|
|
27
|
+
*/
|
|
28
|
+
const KEY = randomBytes(32).toString('base64');
|
|
29
|
+
const AUTHOR = 'alice@example.com';
|
|
30
|
+
const alice: AuthUser = { id: 'u-alice', email: AUTHOR, name: 'Alice' };
|
|
31
|
+
const open: Database[] = [];
|
|
32
|
+
|
|
33
|
+
async function seeded(): Promise<{ svc: WorkflowService; db: Database; number: number }> {
|
|
34
|
+
const db = createDb(await scratchDatabaseUrl('hexis_cr_edit'), { piiKey: KEY });
|
|
35
|
+
open.push(db);
|
|
36
|
+
await runCoreMigrations(db, coreMigrationsDir());
|
|
37
|
+
const [row] = await db
|
|
38
|
+
.insert(changeRequests)
|
|
39
|
+
.values({
|
|
40
|
+
sourceBranch: 'alice/draft',
|
|
41
|
+
targetBranch: 'main',
|
|
42
|
+
title: 'Old title',
|
|
43
|
+
body: 'Old reason.',
|
|
44
|
+
authorEmail: AUTHOR,
|
|
45
|
+
authorEmailBidx: AUTHOR,
|
|
46
|
+
authorName: 'Alice',
|
|
47
|
+
})
|
|
48
|
+
.returning({ number: changeRequests.number });
|
|
49
|
+
const number = row.number!;
|
|
50
|
+
const readRow = async () =>
|
|
51
|
+
(await db.select().from(changeRequests).where(eq(changeRequests.number, number)))[0];
|
|
52
|
+
const prs = {
|
|
53
|
+
getPr: vi.fn(async () => {
|
|
54
|
+
const r = await readRow();
|
|
55
|
+
return { number, title: r.title, base: 'main', branch: 'alice/draft', state: r.state, authorId: hashEmail(AUTHOR) };
|
|
56
|
+
}),
|
|
57
|
+
invalidateDetailCache: vi.fn(),
|
|
58
|
+
} as unknown as PullRequestService;
|
|
59
|
+
const svc = new WorkflowService(
|
|
60
|
+
db,
|
|
61
|
+
{} as GitService,
|
|
62
|
+
prs,
|
|
63
|
+
{} as IReviewWorkflowService,
|
|
64
|
+
{} as WorkspaceService,
|
|
65
|
+
{} as IAccessControl,
|
|
66
|
+
{} as FileLockService,
|
|
67
|
+
{} as PendingCommitsService,
|
|
68
|
+
testKbContext(),
|
|
69
|
+
openChangeGate(),
|
|
70
|
+
);
|
|
71
|
+
return { svc, db, number };
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
describe.skipIf(!PG_ADMIN_URL)('WorkflowService.updateChangeRequest on a real, encrypted Postgres', () => {
|
|
75
|
+
afterAll(async () => {
|
|
76
|
+
for (const db of open) await closeDb(db);
|
|
77
|
+
await dropScratchDatabases();
|
|
78
|
+
}, PG_TEST_TIMEOUT);
|
|
79
|
+
|
|
80
|
+
it(
|
|
81
|
+
'lets the author change the title and description, and reads the new text back',
|
|
82
|
+
async () => {
|
|
83
|
+
const { svc, db, number } = await seeded();
|
|
84
|
+
await svc.updateChangeRequest(number, alice, { title: 'New title', description: 'New reason.' });
|
|
85
|
+
const [row] = await db.select().from(changeRequests).where(eq(changeRequests.number, number));
|
|
86
|
+
expect(row.title).toBe('New title');
|
|
87
|
+
expect(row.body).toBe('New reason.');
|
|
88
|
+
},
|
|
89
|
+
PG_TEST_TIMEOUT,
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
it(
|
|
93
|
+
'lands two appends racing each other, neither lost',
|
|
94
|
+
async () => {
|
|
95
|
+
const { svc, db, number } = await seeded();
|
|
96
|
+
await Promise.all([
|
|
97
|
+
svc.updateChangeRequest(number, alice, { appendDescription: 'Note one.' }),
|
|
98
|
+
svc.updateChangeRequest(number, alice, { appendDescription: 'Note two.' }),
|
|
99
|
+
]);
|
|
100
|
+
const [row] = await db.select().from(changeRequests).where(eq(changeRequests.number, number));
|
|
101
|
+
expect(row.body).toMatch(/^Old reason\.\n\nNote (one|two)\.\n\nNote (one|two)\.$/);
|
|
102
|
+
expect(row.body).toContain('Note one.');
|
|
103
|
+
expect(row.body).toContain('Note two.');
|
|
104
|
+
},
|
|
105
|
+
PG_TEST_TIMEOUT,
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
it(
|
|
109
|
+
'refuses a closed request with the worded 409',
|
|
110
|
+
async () => {
|
|
111
|
+
const { svc, db, number } = await seeded();
|
|
112
|
+
await db.update(changeRequests).set({ state: 'closed' }).where(eq(changeRequests.number, number));
|
|
113
|
+
await expect(svc.updateChangeRequest(number, alice, { title: 'Nope' })).rejects.toMatchObject({
|
|
114
|
+
status: 409,
|
|
115
|
+
message: expect.stringContaining('closed'),
|
|
116
|
+
});
|
|
117
|
+
},
|
|
118
|
+
PG_TEST_TIMEOUT,
|
|
119
|
+
);
|
|
120
|
+
});
|