@bevel-software/platform-core-backend 0.22.0 → 0.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/core-ports.d.ts +11 -1
- package/dist/core/core-ports.d.ts.map +1 -1
- package/dist/core/core-ports.js.map +1 -1
- package/dist/core/create-core-server.d.ts +3 -3
- package/dist/core/create-core-server.d.ts.map +1 -1
- package/dist/core/create-core-server.js +46 -13
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +12 -2
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +137 -24
- package/dist/core/create-core-services.js.map +1 -1
- package/dist/core/lifecycle.d.ts +46 -1
- package/dist/core/lifecycle.d.ts.map +1 -1
- package/dist/core/lifecycle.js +99 -13
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/core-config.d.ts +16 -12
- package/dist/core-config.d.ts.map +1 -1
- package/dist/core-config.js +28 -13
- package/dist/core-config.js.map +1 -1
- package/dist/index.d.ts +6 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -3
- package/dist/index.js.map +1 -1
- package/dist/modules/access/access-control.interface.d.ts +42 -12
- package/dist/modules/access/access-control.interface.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.d.ts +67 -10
- package/dist/modules/access/access-control.service.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.js +214 -35
- package/dist/modules/access/access-control.service.js.map +1 -1
- package/dist/modules/access/access.routes.d.ts.map +1 -1
- package/dist/modules/access/access.routes.js +17 -16
- package/dist/modules/access/access.routes.js.map +1 -1
- package/dist/modules/access/directory-sync-bot.d.ts.map +1 -1
- package/dist/modules/access/directory-sync-bot.js +7 -3
- package/dist/modules/access/directory-sync-bot.js.map +1 -1
- package/dist/modules/agent-instructions/agent-instructions.routes.d.ts +8 -1
- package/dist/modules/agent-instructions/agent-instructions.routes.d.ts.map +1 -1
- package/dist/modules/agent-instructions/agent-instructions.routes.js +8 -2
- package/dist/modules/agent-instructions/agent-instructions.routes.js.map +1 -1
- package/dist/modules/agent-instructions/compose.d.ts +38 -6
- package/dist/modules/agent-instructions/compose.d.ts.map +1 -1
- package/dist/modules/agent-instructions/compose.js +39 -6
- package/dist/modules/agent-instructions/compose.js.map +1 -1
- package/dist/modules/agent-instructions/index.d.ts +2 -1
- package/dist/modules/agent-instructions/index.d.ts.map +1 -1
- package/dist/modules/agent-instructions/index.js +2 -1
- package/dist/modules/agent-instructions/index.js.map +1 -1
- package/dist/modules/agent-instructions/shared-file-rules.d.ts +115 -0
- package/dist/modules/agent-instructions/shared-file-rules.d.ts.map +1 -0
- package/dist/modules/agent-instructions/shared-file-rules.js +272 -0
- package/dist/modules/agent-instructions/shared-file-rules.js.map +1 -0
- package/dist/modules/audit/agent-audit.service.d.ts.map +1 -1
- package/dist/modules/audit/agent-audit.service.js +4 -2
- package/dist/modules/audit/agent-audit.service.js.map +1 -1
- package/dist/modules/auth/account-admission.d.ts +58 -7
- package/dist/modules/auth/account-admission.d.ts.map +1 -1
- package/dist/modules/auth/account-admission.js +44 -1
- package/dist/modules/auth/account-admission.js.map +1 -1
- package/dist/modules/auth/account-erasure.service.d.ts.map +1 -1
- package/dist/modules/auth/account-erasure.service.js +57 -16
- package/dist/modules/auth/account-erasure.service.js.map +1 -1
- package/dist/modules/auth/account.routes.d.ts +1 -1
- package/dist/modules/auth/account.routes.d.ts.map +1 -1
- package/dist/modules/auth/account.routes.js +61 -5
- package/dist/modules/auth/account.routes.js.map +1 -1
- package/dist/modules/auth/auth.middleware.d.ts +1 -1
- package/dist/modules/auth/auth.middleware.d.ts.map +1 -1
- package/dist/modules/auth/auth.middleware.js +18 -7
- package/dist/modules/auth/auth.middleware.js.map +1 -1
- package/dist/modules/auth/auth.routes.d.ts.map +1 -1
- package/dist/modules/auth/auth.routes.js +8 -0
- package/dist/modules/auth/auth.routes.js.map +1 -1
- package/dist/modules/auth/auth.service.d.ts +70 -2
- package/dist/modules/auth/auth.service.d.ts.map +1 -1
- package/dist/modules/auth/auth.service.js +197 -18
- package/dist/modules/auth/auth.service.js.map +1 -1
- package/dist/modules/auth/oidc-auth-provider.d.ts.map +1 -1
- package/dist/modules/auth/oidc-auth-provider.js +7 -2
- package/dist/modules/auth/oidc-auth-provider.js.map +1 -1
- package/dist/modules/code-mode/code-mode.tool.d.ts +20 -2
- package/dist/modules/code-mode/code-mode.tool.d.ts.map +1 -1
- package/dist/modules/code-mode/code-mode.tool.js +66 -35
- package/dist/modules/code-mode/code-mode.tool.js.map +1 -1
- package/dist/modules/database/connection.d.ts +16 -0
- package/dist/modules/database/connection.d.ts.map +1 -1
- package/dist/modules/database/connection.js +117 -0
- package/dist/modules/database/connection.js.map +1 -1
- package/dist/modules/database/core-schema.d.ts +337 -120
- package/dist/modules/database/core-schema.d.ts.map +1 -1
- package/dist/modules/database/core-schema.js +116 -58
- package/dist/modules/database/core-schema.js.map +1 -1
- package/dist/modules/database/migrate.d.ts +8 -0
- package/dist/modules/database/migrate.d.ts.map +1 -1
- package/dist/modules/database/migrate.js +271 -1
- package/dist/modules/database/migrate.js.map +1 -1
- package/dist/modules/kb-fs/branch-name.d.ts.map +1 -1
- package/dist/modules/kb-fs/branch-name.js +12 -2
- package/dist/modules/kb-fs/branch-name.js.map +1 -1
- package/dist/modules/kb-fs/repo-path.d.ts +11 -16
- package/dist/modules/kb-fs/repo-path.d.ts.map +1 -1
- package/dist/modules/kb-fs/repo-path.js +79 -0
- package/dist/modules/kb-fs/repo-path.js.map +1 -1
- package/dist/modules/kb-sync/kb-sync.routes.d.ts +2 -2
- package/dist/modules/kb-sync/kb-sync.routes.d.ts.map +1 -1
- package/dist/modules/kb-sync/kb-sync.routes.js +14 -3
- package/dist/modules/kb-sync/kb-sync.routes.js.map +1 -1
- package/dist/modules/kb-sync/sync-auth.d.ts +3 -1
- package/dist/modules/kb-sync/sync-auth.d.ts.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/mcp/mcp-auth.middleware.d.ts.map +1 -1
- package/dist/modules/mcp/mcp-auth.middleware.js +21 -6
- package/dist/modules/mcp/mcp-auth.middleware.js.map +1 -1
- package/dist/modules/mcp/mcp.service.d.ts +8 -0
- package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.service.js +38 -8
- package/dist/modules/mcp/mcp.service.js.map +1 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts.map +1 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js +3 -2
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js.map +1 -1
- package/dist/modules/plugins/join-request-records.store.d.ts.map +1 -1
- package/dist/modules/plugins/join-request-records.store.js +7 -4
- package/dist/modules/plugins/join-request-records.store.js.map +1 -1
- package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
- package/dist/modules/settings/deployment-settings.service.js +8 -3
- package/dist/modules/settings/deployment-settings.service.js.map +1 -1
- package/dist/modules/settings/setup.routes.d.ts +52 -1
- package/dist/modules/settings/setup.routes.d.ts.map +1 -1
- package/dist/modules/settings/setup.routes.js +207 -19
- package/dist/modules/settings/setup.routes.js.map +1 -1
- package/dist/modules/skills/skills.contract.d.ts +90 -18
- package/dist/modules/skills/skills.contract.d.ts.map +1 -1
- package/dist/modules/skills/skills.contract.js +4 -1
- package/dist/modules/skills/skills.contract.js.map +1 -1
- package/dist/modules/skills/skills.service.d.ts +98 -9
- package/dist/modules/skills/skills.service.d.ts.map +1 -1
- package/dist/modules/skills/skills.service.js +239 -37
- package/dist/modules/skills/skills.service.js.map +1 -1
- package/dist/modules/skills/skills.tools.d.ts +7 -0
- package/dist/modules/skills/skills.tools.d.ts.map +1 -1
- package/dist/modules/skills/skills.tools.js +71 -7
- package/dist/modules/skills/skills.tools.js.map +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 +12 -4
- package/dist/modules/tool-auth/external-api-key.service.js.map +1 -1
- package/dist/modules/tool-auth/internal-token.service.d.ts +3 -3
- package/dist/modules/tool-auth/tool-auth.middleware.d.ts +16 -7
- package/dist/modules/tool-auth/tool-auth.middleware.d.ts.map +1 -1
- package/dist/modules/tool-auth/tool-auth.middleware.js +34 -12
- package/dist/modules/tool-auth/tool-auth.middleware.js.map +1 -1
- package/dist/modules/tool-helpers/tool-handler.d.ts +2 -1
- package/dist/modules/tool-helpers/tool-handler.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-handler.js +25 -4
- package/dist/modules/tool-helpers/tool-handler.js.map +1 -1
- package/dist/modules/tool-helpers/tool.contract.d.ts +3 -2
- package/dist/modules/tool-helpers/tool.contract.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool.contract.js.map +1 -1
- package/dist/modules/tool-helpers/validate-token.js +1 -1
- package/dist/modules/tool-helpers/validate-token.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.js +42 -31
- package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
- package/dist/modules/tool-registry/description-length.d.ts +80 -0
- package/dist/modules/tool-registry/description-length.d.ts.map +1 -0
- package/dist/modules/tool-registry/description-length.js +108 -0
- package/dist/modules/tool-registry/description-length.js.map +1 -0
- package/dist/modules/workflow/agent-tools/change-request-summary.d.ts +98 -0
- package/dist/modules/workflow/agent-tools/change-request-summary.d.ts.map +1 -0
- package/dist/modules/workflow/agent-tools/change-request-summary.js +81 -0
- package/dist/modules/workflow/agent-tools/change-request-summary.js.map +1 -0
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.js +75 -35
- package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
- package/dist/modules/workflow/file-lock.service.d.ts +24 -0
- package/dist/modules/workflow/file-lock.service.d.ts.map +1 -1
- package/dist/modules/workflow/file-lock.service.js +30 -0
- package/dist/modules/workflow/file-lock.service.js.map +1 -1
- package/dist/modules/workflow/git/git.service.d.ts +94 -0
- package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/git.service.js +193 -3
- package/dist/modules/workflow/git/git.service.js.map +1 -1
- package/dist/modules/workflow/pending-commits.service.d.ts +38 -0
- package/dist/modules/workflow/pending-commits.service.d.ts.map +1 -1
- package/dist/modules/workflow/pending-commits.service.js +60 -1
- package/dist/modules/workflow/pending-commits.service.js.map +1 -1
- package/dist/modules/workflow/recovery-bot.d.ts.map +1 -1
- package/dist/modules/workflow/recovery-bot.js +7 -3
- package/dist/modules/workflow/recovery-bot.js.map +1 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.js +12 -3
- package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +1 -1
- package/dist/modules/workflow/workflow-hooks.d.ts +54 -32
- package/dist/modules/workflow/workflow-hooks.d.ts.map +1 -1
- package/dist/modules/workflow/workflow-hooks.js +16 -1
- package/dist/modules/workflow/workflow-hooks.js.map +1 -1
- package/dist/modules/workflow/workflow.service.d.ts +60 -6
- package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.service.js +115 -5
- package/dist/modules/workflow/workflow.service.js.map +1 -1
- package/dist/modules/workspace/agent-access.gate.d.ts +94 -0
- package/dist/modules/workspace/agent-access.gate.d.ts.map +1 -0
- package/dist/modules/workspace/agent-access.gate.js +123 -0
- package/dist/modules/workspace/agent-access.gate.js.map +1 -0
- package/dist/modules/workspace/agent-upload.routes.d.ts +77 -0
- package/dist/modules/workspace/agent-upload.routes.d.ts.map +1 -0
- package/dist/modules/workspace/agent-upload.routes.js +210 -0
- package/dist/modules/workspace/agent-upload.routes.js.map +1 -0
- package/dist/modules/workspace/agent-upload.store.d.ts +284 -0
- package/dist/modules/workspace/agent-upload.store.d.ts.map +1 -0
- package/dist/modules/workspace/agent-upload.store.js +553 -0
- package/dist/modules/workspace/agent-upload.store.js.map +1 -0
- package/dist/modules/workspace/routine-write-policy.d.ts +5 -6
- package/dist/modules/workspace/routine-write-policy.d.ts.map +1 -1
- package/dist/modules/workspace/routine-write-policy.js +5 -6
- package/dist/modules/workspace/routine-write-policy.js.map +1 -1
- package/dist/modules/workspace/session-sink.d.ts +5 -5
- package/dist/modules/workspace/set-aside-clone.d.ts +46 -0
- package/dist/modules/workspace/set-aside-clone.d.ts.map +1 -0
- package/dist/modules/workspace/set-aside-clone.js +92 -0
- package/dist/modules/workspace/set-aside-clone.js.map +1 -0
- package/dist/modules/workspace/startup/kb-startup-runner.d.ts +59 -9
- package/dist/modules/workspace/startup/kb-startup-runner.d.ts.map +1 -1
- package/dist/modules/workspace/startup/kb-startup-runner.js +65 -24
- package/dist/modules/workspace/startup/kb-startup-runner.js.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.js +3 -3
- package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.d.ts +40 -0
- package/dist/modules/workspace/startup/steps/template-source.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.js +46 -4
- package/dist/modules/workspace/startup/steps/template-source.js.map +1 -1
- package/dist/modules/workspace/upload-limits.d.ts +13 -0
- package/dist/modules/workspace/upload-limits.d.ts.map +1 -0
- package/dist/modules/workspace/upload-limits.js +13 -0
- package/dist/modules/workspace/upload-limits.js.map +1 -0
- package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.routes.js +93 -4
- package/dist/modules/workspace/workspace.routes.js.map +1 -1
- package/dist/modules/workspace/workspace.service.d.ts +128 -5
- package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.service.js +316 -58
- package/dist/modules/workspace/workspace.service.js.map +1 -1
- package/dist/modules/workspace/workspace.tools.d.ts +13 -11
- package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.tools.js +791 -198
- package/dist/modules/workspace/workspace.tools.js.map +1 -1
- package/dist/modules/workspace/write-denial.d.ts +0 -6
- package/dist/modules/workspace/write-denial.d.ts.map +1 -1
- package/dist/modules/workspace/write-denial.js +0 -6
- package/dist/modules/workspace/write-denial.js.map +1 -1
- package/dist/modules/workspace/zip-entry-rules.d.ts +114 -0
- package/dist/modules/workspace/zip-entry-rules.d.ts.map +1 -0
- package/dist/modules/workspace/zip-entry-rules.js +154 -0
- package/dist/modules/workspace/zip-entry-rules.js.map +1 -0
- package/dist/modules/write-access/write-access.d.ts +60 -0
- package/dist/modules/write-access/write-access.d.ts.map +1 -0
- package/dist/modules/write-access/write-access.js +129 -0
- package/dist/modules/write-access/write-access.js.map +1 -0
- package/dist/shared/column-crypto.d.ts +194 -0
- package/dist/shared/column-crypto.d.ts.map +1 -0
- package/dist/shared/column-crypto.js +144 -0
- package/dist/shared/column-crypto.js.map +1 -0
- package/dist/shared/domain-errors.d.ts +25 -0
- package/dist/shared/domain-errors.d.ts.map +1 -1
- package/dist/shared/domain-errors.js +28 -0
- package/dist/shared/domain-errors.js.map +1 -1
- package/dist/shared/git.contract.d.ts +20 -0
- package/dist/shared/git.contract.d.ts.map +1 -1
- package/dist/shared/git.contract.js +26 -0
- package/dist/shared/git.contract.js.map +1 -1
- package/dist/shared/token-crypto.d.ts.map +1 -1
- package/dist/shared/token-crypto.js +25 -1
- package/dist/shared/token-crypto.js.map +1 -1
- package/dist/tenancy/static-tenant-source.d.ts +0 -1
- package/dist/tenancy/static-tenant-source.d.ts.map +1 -1
- package/dist/tenancy/static-tenant-source.js +1 -2
- package/dist/tenancy/static-tenant-source.js.map +1 -1
- package/dist/tenancy/tenant-secrets.d.ts +5 -1
- package/dist/tenancy/tenant-secrets.d.ts.map +1 -1
- package/dist/tenancy/tenant-secrets.js +4 -0
- package/dist/tenancy/tenant-secrets.js.map +1 -1
- package/kb-template/AGENTS.md +2 -0
- package/migrations/0014_change_request_closed_reason.sql +1 -0
- package/migrations/0015_account_deactivation.sql +3 -0
- package/migrations/0016_pii_encryption.sql +20 -0
- package/migrations/meta/0014_snapshot.json +2265 -0
- package/migrations/meta/0015_snapshot.json +2271 -0
- package/migrations/meta/0016_snapshot.json +2327 -0
- package/migrations/meta/_journal.json +21 -0
- package/package.json +3 -3
- package/src/__tests__/kb-layout-config.test.ts +0 -2
- package/src/__tests__/retired-settings.test.ts +96 -0
- package/src/core/__tests__/gated-boot.test.ts +132 -0
- package/src/core/__tests__/lifecycle.test.ts +241 -5
- package/src/core/__tests__/set-aside-root-is-one-place.test.ts +63 -0
- package/src/core/core-ports.ts +11 -1
- package/src/core/create-core-server.ts +52 -16
- package/src/core/create-core-services.ts +156 -24
- package/src/core/lifecycle.ts +117 -13
- package/src/core-config.ts +31 -14
- package/src/index.ts +30 -1
- package/src/modules/access/__tests__/access-control.preview-relocation.test.ts +385 -0
- package/src/modules/access/__tests__/access-control.prospective.test.ts +94 -18
- package/src/modules/access/__tests__/access.routes.prospective.test.ts +6 -7
- package/src/modules/access/__tests__/users-db-double.ts +21 -12
- package/src/modules/access/access-control.interface.ts +43 -12
- package/src/modules/access/access-control.service.ts +234 -36
- package/src/modules/access/access.routes.ts +17 -16
- package/src/modules/access/directory-sync-bot.ts +7 -3
- package/src/modules/agent-instructions/__tests__/agent-instructions.route.test.ts +11 -5
- package/src/modules/agent-instructions/__tests__/compose.test.ts +19 -10
- package/src/modules/agent-instructions/__tests__/shared-file-rules.test.ts +238 -0
- package/src/modules/agent-instructions/agent-instructions.routes.ts +12 -2
- package/src/modules/agent-instructions/compose.ts +50 -7
- package/src/modules/agent-instructions/index.ts +12 -0
- package/src/modules/agent-instructions/shared-file-rules.ts +314 -0
- package/src/modules/audit/agent-audit.service.ts +4 -2
- package/src/modules/auth/__tests__/account-deactivation.test.ts +253 -0
- package/src/modules/auth/__tests__/account-erasure.approval-gate.test.ts +6 -2
- package/src/modules/auth/__tests__/account.routes.test.ts +87 -6
- package/src/modules/auth/__tests__/auth.middleware.test.ts +45 -22
- package/src/modules/auth/__tests__/auth.service.test.ts +4 -2
- package/src/modules/auth/account-admission.ts +78 -9
- package/src/modules/auth/account-erasure.service.ts +69 -18
- package/src/modules/auth/account.routes.ts +63 -7
- package/src/modules/auth/auth.middleware.ts +19 -8
- package/src/modules/auth/auth.routes.ts +8 -0
- package/src/modules/auth/auth.service.ts +206 -23
- package/src/modules/auth/oidc-auth-provider.ts +7 -2
- package/src/modules/code-mode/__tests__/chain-runtime.e2e.test.ts +335 -0
- package/src/modules/code-mode/__tests__/code-mode.tool.test.ts +46 -2
- package/src/modules/code-mode/code-mode.tool.ts +80 -34
- package/src/modules/database/__tests__/connection.test.ts +12 -0
- package/src/modules/database/__tests__/pii-backfill.pg.test.ts +561 -0
- package/src/modules/database/connection.ts +117 -0
- package/src/modules/database/core-schema.ts +116 -58
- package/src/modules/database/migrate.ts +353 -1
- package/src/modules/kb-fs/__tests__/branch-name.test.ts +10 -0
- package/src/modules/kb-fs/__tests__/repo-path.test.ts +123 -0
- package/src/modules/kb-fs/branch-name.ts +14 -1
- package/src/modules/kb-fs/repo-path.ts +85 -0
- package/src/modules/kb-sync/__tests__/kb-sync.routes.test.ts +26 -1
- package/src/modules/kb-sync/kb-sync.routes.ts +14 -4
- package/src/modules/kb-sync/sync-auth.ts +2 -2
- package/src/modules/mcp/__tests__/mcp-auth.middleware.test.ts +60 -3
- package/src/modules/mcp/__tests__/mcp.e2e.test.ts +4 -3
- package/src/modules/mcp/__tests__/mcp.service.test.ts +115 -13
- package/src/modules/mcp/mcp-auth.middleware.ts +20 -6
- package/src/modules/mcp/mcp.service.ts +46 -7
- package/src/modules/mcp/oauth/bevel-oauth-provider.ts +3 -1
- package/src/modules/plugins/__tests__/plugins.tools.test.ts +2 -1
- package/src/modules/plugins/join-request-records.store.ts +7 -4
- package/src/modules/settings/__tests__/deployment-settings.service.test.ts +16 -0
- package/src/modules/settings/__tests__/setup.routes.git-mode.test.ts +91 -58
- package/src/modules/settings/__tests__/setup.routes.github-app.test.ts +25 -8
- package/src/modules/settings/__tests__/setup.routes.managed-phase.test.ts +14 -11
- package/src/modules/settings/__tests__/setup.routes.repository-change.test.ts +390 -0
- package/src/modules/settings/__tests__/setup.routes.test.ts +3 -0
- package/src/modules/settings/deployment-settings.service.ts +8 -3
- package/src/modules/settings/setup.routes.ts +263 -19
- package/src/modules/skills/__tests__/allowed-tools-warn.tools.test.ts +2 -1
- package/src/modules/skills/__tests__/branch-skills.tools.test.ts +218 -0
- package/src/modules/skills/__tests__/skills.service.test.ts +229 -5
- package/src/modules/skills/skills.contract.ts +91 -18
- package/src/modules/skills/skills.service.ts +278 -41
- package/src/modules/skills/skills.tools.ts +80 -8
- package/src/modules/tool-auth/__tests__/manual-auth.middleware.test.ts +14 -1
- package/src/modules/tool-auth/external-api-key.service.ts +12 -4
- package/src/modules/tool-auth/internal-token.service.ts +3 -3
- package/src/modules/tool-auth/tool-auth.middleware.ts +34 -11
- package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +5 -3
- package/src/modules/tool-helpers/__tests__/phase4-tools.test.ts +3 -3
- package/src/modules/tool-helpers/__tests__/validate-token.test.ts +11 -1
- package/src/modules/tool-helpers/tool-handler.ts +24 -4
- package/src/modules/tool-helpers/tool.contract.ts +3 -2
- package/src/modules/tool-helpers/validate-token.ts +1 -1
- package/src/modules/tool-manuals/tool-manuals.tools.ts +44 -31
- package/src/modules/tool-registry/__tests__/tool-description-length.test.ts +378 -0
- package/src/modules/tool-registry/description-length.ts +111 -0
- package/src/modules/workflow/__tests__/pending-commits.repository-replaced.test.ts +111 -0
- package/src/modules/workflow/__tests__/workflow.routes.history-read-gate.test.ts +25 -0
- package/src/modules/workflow/__tests__/workflow.service.repository-replaced.test.ts +249 -0
- package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +264 -6
- package/src/modules/workflow/agent-tools/change-request-summary.ts +182 -0
- package/src/modules/workflow/agent-tools/workflow.tools.ts +86 -35
- package/src/modules/workflow/file-lock.service.ts +31 -0
- package/src/modules/workflow/git/__tests__/git.service.fileBytesAtCommit.test.ts +260 -0
- package/src/modules/workflow/git/__tests__/git.service.prFetchFailure.test.ts +170 -0
- package/src/modules/workflow/git/git.service.ts +215 -1
- package/src/modules/workflow/pending-commits.service.ts +64 -2
- package/src/modules/workflow/recovery-bot.ts +7 -3
- package/src/modules/workflow/review-workflow/__tests__/carry-approvals-forward.test.ts +4 -0
- package/src/modules/workflow/review-workflow/__tests__/erase-approver.test.ts +25 -3
- package/src/modules/workflow/review-workflow/review-workflow.service.ts +12 -3
- package/src/modules/workflow/workflow-hooks.ts +64 -26
- package/src/modules/workflow/workflow.service.ts +125 -5
- package/src/modules/workspace/__tests__/agent-access.gate.test.ts +208 -0
- package/src/modules/workspace/__tests__/agent-uploads.test.ts +1604 -0
- package/src/modules/workspace/__tests__/escape-sequences.routes.test.ts +394 -0
- 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__/set-aside-clone.test.ts +52 -0
- package/src/modules/workspace/__tests__/workspace.routes.at-ref.test.ts +305 -0
- package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +2 -0
- package/src/modules/workspace/__tests__/workspace.service.any-workspace-credentials.test.ts +156 -0
- package/src/modules/workspace/__tests__/workspace.service.forget-clone-races.test.ts +147 -0
- package/src/modules/workspace/__tests__/workspace.service.replaced-repository.test.ts +402 -0
- package/src/modules/workspace/__tests__/workspace.service.test.ts +77 -9
- package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +41 -39
- package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +2 -3
- package/src/modules/workspace/__tests__/workspace.tools.test.ts +766 -56
- package/src/modules/workspace/agent-access.gate.ts +164 -0
- package/src/modules/workspace/agent-upload.routes.ts +214 -0
- package/src/modules/workspace/agent-upload.store.ts +668 -0
- package/src/modules/workspace/routine-write-policy.ts +5 -6
- package/src/modules/workspace/session-sink.ts +5 -5
- package/src/modules/workspace/set-aside-clone.ts +96 -0
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.test.ts +86 -0
- package/src/modules/workspace/startup/kb-startup-runner.ts +115 -34
- package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +9 -9
- package/src/modules/workspace/startup/steps/seed-tree.ts +3 -6
- package/src/modules/workspace/startup/steps/template-source.ts +53 -5
- package/src/modules/workspace/upload-limits.ts +12 -0
- package/src/modules/workspace/workspace.routes.ts +96 -5
- package/src/modules/workspace/workspace.service.ts +319 -61
- package/src/modules/workspace/workspace.tools.ts +894 -214
- package/src/modules/workspace/write-denial.ts +0 -8
- package/src/modules/workspace/zip-entry-rules.ts +173 -0
- package/src/modules/write-access/__tests__/write-access.test.ts +248 -0
- package/src/modules/write-access/write-access.ts +153 -0
- package/src/shared/__tests__/column-crypto.test.ts +217 -0
- package/src/shared/column-crypto.ts +218 -0
- package/src/shared/domain-errors.ts +31 -0
- package/src/shared/git.contract.ts +27 -0
- package/src/shared/token-crypto.ts +28 -1
- package/src/tenancy/__tests__/static-tenant-source.test.ts +4 -1
- package/src/tenancy/static-tenant-source.ts +1 -3
- package/src/tenancy/tenant-secrets.ts +5 -1
- package/dist/modules/workflow/session-ontology.policy.d.ts +0 -52
- package/dist/modules/workflow/session-ontology.policy.d.ts.map +0 -1
- package/dist/modules/workflow/session-ontology.policy.js +0 -62
- package/dist/modules/workflow/session-ontology.policy.js.map +0 -1
- package/dist/modules/workflow/session-ontology.service.d.ts +0 -105
- package/dist/modules/workflow/session-ontology.service.d.ts.map +0 -1
- package/dist/modules/workflow/session-ontology.service.js +0 -147
- package/dist/modules/workflow/session-ontology.service.js.map +0 -1
- package/dist/modules/workspace/session-ontology.gate.d.ts +0 -114
- package/dist/modules/workspace/session-ontology.gate.d.ts.map +0 -1
- package/dist/modules/workspace/session-ontology.gate.js +0 -161
- package/dist/modules/workspace/session-ontology.gate.js.map +0 -1
- package/dist/shared/kb-layout.d.ts +0 -39
- package/dist/shared/kb-layout.d.ts.map +0 -1
- package/dist/shared/kb-layout.js +0 -103
- package/dist/shared/kb-layout.js.map +0 -1
- package/dist/shared/kb-layout.test.d.ts +0 -2
- package/dist/shared/kb-layout.test.d.ts.map +0 -1
- package/dist/shared/kb-layout.test.js +0 -75
- package/dist/shared/kb-layout.test.js.map +0 -1
- package/src/modules/workflow/__tests__/session-ontology.policy.test.ts +0 -62
- package/src/modules/workflow/__tests__/session-ontology.service.test.ts +0 -201
- package/src/modules/workflow/session-ontology.policy.ts +0 -70
- package/src/modules/workflow/session-ontology.service.ts +0 -183
- package/src/modules/workspace/__tests__/session-ontology.gate.test.ts +0 -239
- package/src/modules/workspace/session-ontology.gate.ts +0 -191
- package/src/shared/kb-layout.test.ts +0 -98
- package/src/shared/kb-layout.ts +0 -102
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-manuals.tools.js","sourceRoot":"","sources":["../../../src/modules/tool-manuals/tool-manuals.tools.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAGtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAgBnE;;;;;;;;;;GAUG;AACH,MAAM,UAAU,wBAAwB,CACtC,QAAuB,EACvB,MAAc,EACd,QAAwB,EACxB,WAA+B,EAC/B,iBAAqC,EACrC,IAKC;IAED,QAAQ,CAAC,oBAAoB,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,sBAAsB,CAAC,iBAAiB,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;IACjG,QAAQ,CAAC,oBAAoB,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,sBAAsB,CAAC,iBAAiB,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;IAEjG,MAAM,CAAC,IAAI,CACT,+BAA+B,EAC/B,QAAQ,EACR,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,GAAgB,EAAE,EAAE,CAAC,CAAC;QAC9C,KAAK,EAAE,MAAM,iBAAiB,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;KAC7D,CAAC,CAAC,CACJ,CAAC;IAEF,mEAAmE;IACnE,yEAAyE;IACzE,mEAAmE;IACnE,6EAA6E;IAC7E,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,kBAAkB,EAAE,CAAC;IACrD,MAAM,MAAM,GAAG,CAAC,UAAkB,EAAE,OAAe,EAAE,EAAE,CAAC,iBAAiB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAE/F,MAAM,YAAY,GAAG,OAAO,CAAC;QAC3B,IAAI,EAAE,iBAAiB;QACvB,
|
|
1
|
+
{"version":3,"file":"tool-manuals.tools.js","sourceRoot":"","sources":["../../../src/modules/tool-manuals/tool-manuals.tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How long a tool description may be, and how to measure one.
|
|
3
|
+
*
|
|
4
|
+
* Clients cut a long description, and they cut it from the END — which is
|
|
5
|
+
* where the text specific to the tool sits, after whatever shared preamble it
|
|
6
|
+
* carried. Agents reported `file_stat`, `read_file`, `write_file` and
|
|
7
|
+
* `write_files` arriving ending in "[truncated]". The rules those descriptions
|
|
8
|
+
* shared now live in one place (see `agent-instructions/shared-file-rules.ts`)
|
|
9
|
+
* and each description ends with one sentence pointing there, which is what
|
|
10
|
+
* makes the cap below reachable rather than aspirational.
|
|
11
|
+
*/
|
|
12
|
+
import type { UtcpTool } from './tool.contract.js';
|
|
13
|
+
/**
|
|
14
|
+
* The ceiling on what a client is handed for one tool, enforced by
|
|
15
|
+
* `__tests__/tool-description-length.test.ts`.
|
|
16
|
+
*
|
|
17
|
+
* DERIVED, not published: the clients that cut descriptions do not say where.
|
|
18
|
+
* Two cuts were observed, and they are different problems. claude.ai cuts
|
|
19
|
+
* around 500 characters — NOT what this cap answers, and not something a cap
|
|
20
|
+
* could answer: no useful description of `move_file` fits in 500. What answers
|
|
21
|
+
* that one is the ORDER of the text, which is why the deployment's purpose line
|
|
22
|
+
* is prepended rather than appended (see `prefixToolDescription`) and why every
|
|
23
|
+
* description now leads with what the tool does and ends with the pointer: a
|
|
24
|
+
* cut at 500 then takes the pointer and leaves the tool. The other cut is the
|
|
25
|
+
* four-figure one agents reported on `file_stat`, `read_file`, `write_file` and
|
|
26
|
+
* `write_files`, and 1,200 sits below it with room to spare.
|
|
27
|
+
*
|
|
28
|
+
* So the cap is a ceiling on growth rather than a guarantee of survival, and it
|
|
29
|
+
* is a number the reviewer may move: the point of pinning it is that moving it
|
|
30
|
+
* is a decision someone takes, rather than a paragraph someone appends.
|
|
31
|
+
*/
|
|
32
|
+
export declare const TOOL_DESCRIPTION_CAP = 1200;
|
|
33
|
+
/**
|
|
34
|
+
* The OTHER cut — the ~500 characters claude.ai allows — as a number the tests
|
|
35
|
+
* can hold something to.
|
|
36
|
+
*
|
|
37
|
+
* It is deliberately not the value of {@link TOOL_DESCRIPTION_CAP}, and the
|
|
38
|
+
* difference is the whole point: lowering the cap to 500 would not make these
|
|
39
|
+
* descriptions survive that client, it would only move the loss from the client
|
|
40
|
+
* to the source, because no useful description of `move_file` or `file_stat`
|
|
41
|
+
* fits in 500 characters and shortening them to fit means dropping facts an
|
|
42
|
+
* agent needs.
|
|
43
|
+
*
|
|
44
|
+
* What survives a cut here is decided by ORDER instead, and order is testable:
|
|
45
|
+
* the purpose prefix goes first, the tool's own opening sentence next, the
|
|
46
|
+
* pointer to the shared rules last. So a cut at 500 takes the pointer — which
|
|
47
|
+
* costs the agent the name of a file the handshake instructions and the guide
|
|
48
|
+
* both state anyway — and leaves the sentence saying what the tool does.
|
|
49
|
+
* {@link firstSentenceEnd} measures where that sentence ends, and the suite
|
|
50
|
+
* pins it under this number for every tool, so the claim above is a check
|
|
51
|
+
* rather than a comment.
|
|
52
|
+
*/
|
|
53
|
+
export declare const CLIENT_SHORT_CUT = 500;
|
|
54
|
+
/**
|
|
55
|
+
* Where the tool's OWN opening sentence ends in the text a client is handed:
|
|
56
|
+
* the purpose prefix counted at its cap, as in {@link clientVisibleLength}, and
|
|
57
|
+
* the pointer not counted at all, since it is the part a short cut is meant to
|
|
58
|
+
* take.
|
|
59
|
+
*
|
|
60
|
+
* A description with no sentence-ending punctuation counts whole — the honest
|
|
61
|
+
* answer for text that never finishes a sentence.
|
|
62
|
+
*/
|
|
63
|
+
export declare function firstSentenceEnd(tool: Pick<UtcpTool, 'name' | 'description'>): number;
|
|
64
|
+
/**
|
|
65
|
+
* The length of the description as a CLIENT receives it — which for the four
|
|
66
|
+
* knowledge-base tools includes the deployment's purpose prefix, since the MCP
|
|
67
|
+
* surface prepends it (`prefixToolDescription`) and the client cuts the result.
|
|
68
|
+
* Measured at the prefix's CAP rather than at whatever the current admin wrote:
|
|
69
|
+
* the cap is what an admin may grow their text to without being told, so a
|
|
70
|
+
* description that only fits beside a short prefix does not really fit.
|
|
71
|
+
*
|
|
72
|
+
* The pointer sentence is measured the same way, for the same reason. It ends
|
|
73
|
+
* every file tool's description and its length moves with a DEPLOYMENT SETTING
|
|
74
|
+
* — the guide's file name — so a description measured beside the nine
|
|
75
|
+
* characters of `AGENTS.md` would pass here and arrive cut on a deployment
|
|
76
|
+
* that renamed its guide. Whatever pointer a description actually carries is
|
|
77
|
+
* discounted and charged at {@link SHARED_RULES_POINTER_MAX} instead.
|
|
78
|
+
*/
|
|
79
|
+
export declare function clientVisibleLength(tool: Pick<UtcpTool, 'name' | 'description'>): number;
|
|
80
|
+
//# sourceMappingURL=description-length.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"description-length.d.ts","sourceRoot":"","sources":["../../../src/modules/tool-registry/description-length.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,oBAAoB,OAAQ,CAAC;AAE1C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAAC,GAAG,MAAM,CAQrF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAAC,GAAG,MAAM,CAgBxF"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How long a tool description may be, and how to measure one.
|
|
3
|
+
*
|
|
4
|
+
* Clients cut a long description, and they cut it from the END — which is
|
|
5
|
+
* where the text specific to the tool sits, after whatever shared preamble it
|
|
6
|
+
* carried. Agents reported `file_stat`, `read_file`, `write_file` and
|
|
7
|
+
* `write_files` arriving ending in "[truncated]". The rules those descriptions
|
|
8
|
+
* shared now live in one place (see `agent-instructions/shared-file-rules.ts`)
|
|
9
|
+
* and each description ends with one sentence pointing there, which is what
|
|
10
|
+
* makes the cap below reachable rather than aspirational.
|
|
11
|
+
*/
|
|
12
|
+
import { TOOL_PREFIX_CAP } from '@bevel-software/platform-shared';
|
|
13
|
+
import { PREFIXED_TOOLS } from '../agent-instructions/compose.js';
|
|
14
|
+
import { SHARED_RULES_POINTER_MAX, sharedRulesPointer } from '../agent-instructions/shared-file-rules.js';
|
|
15
|
+
/**
|
|
16
|
+
* The ceiling on what a client is handed for one tool, enforced by
|
|
17
|
+
* `__tests__/tool-description-length.test.ts`.
|
|
18
|
+
*
|
|
19
|
+
* DERIVED, not published: the clients that cut descriptions do not say where.
|
|
20
|
+
* Two cuts were observed, and they are different problems. claude.ai cuts
|
|
21
|
+
* around 500 characters — NOT what this cap answers, and not something a cap
|
|
22
|
+
* could answer: no useful description of `move_file` fits in 500. What answers
|
|
23
|
+
* that one is the ORDER of the text, which is why the deployment's purpose line
|
|
24
|
+
* is prepended rather than appended (see `prefixToolDescription`) and why every
|
|
25
|
+
* description now leads with what the tool does and ends with the pointer: a
|
|
26
|
+
* cut at 500 then takes the pointer and leaves the tool. The other cut is the
|
|
27
|
+
* four-figure one agents reported on `file_stat`, `read_file`, `write_file` and
|
|
28
|
+
* `write_files`, and 1,200 sits below it with room to spare.
|
|
29
|
+
*
|
|
30
|
+
* So the cap is a ceiling on growth rather than a guarantee of survival, and it
|
|
31
|
+
* is a number the reviewer may move: the point of pinning it is that moving it
|
|
32
|
+
* is a decision someone takes, rather than a paragraph someone appends.
|
|
33
|
+
*/
|
|
34
|
+
export const TOOL_DESCRIPTION_CAP = 1_200;
|
|
35
|
+
/**
|
|
36
|
+
* The OTHER cut — the ~500 characters claude.ai allows — as a number the tests
|
|
37
|
+
* can hold something to.
|
|
38
|
+
*
|
|
39
|
+
* It is deliberately not the value of {@link TOOL_DESCRIPTION_CAP}, and the
|
|
40
|
+
* difference is the whole point: lowering the cap to 500 would not make these
|
|
41
|
+
* descriptions survive that client, it would only move the loss from the client
|
|
42
|
+
* to the source, because no useful description of `move_file` or `file_stat`
|
|
43
|
+
* fits in 500 characters and shortening them to fit means dropping facts an
|
|
44
|
+
* agent needs.
|
|
45
|
+
*
|
|
46
|
+
* What survives a cut here is decided by ORDER instead, and order is testable:
|
|
47
|
+
* the purpose prefix goes first, the tool's own opening sentence next, the
|
|
48
|
+
* pointer to the shared rules last. So a cut at 500 takes the pointer — which
|
|
49
|
+
* costs the agent the name of a file the handshake instructions and the guide
|
|
50
|
+
* both state anyway — and leaves the sentence saying what the tool does.
|
|
51
|
+
* {@link firstSentenceEnd} measures where that sentence ends, and the suite
|
|
52
|
+
* pins it under this number for every tool, so the claim above is a check
|
|
53
|
+
* rather than a comment.
|
|
54
|
+
*/
|
|
55
|
+
export const CLIENT_SHORT_CUT = 500;
|
|
56
|
+
/**
|
|
57
|
+
* Where the tool's OWN opening sentence ends in the text a client is handed:
|
|
58
|
+
* the purpose prefix counted at its cap, as in {@link clientVisibleLength}, and
|
|
59
|
+
* the pointer not counted at all, since it is the part a short cut is meant to
|
|
60
|
+
* take.
|
|
61
|
+
*
|
|
62
|
+
* A description with no sentence-ending punctuation counts whole — the honest
|
|
63
|
+
* answer for text that never finishes a sentence.
|
|
64
|
+
*/
|
|
65
|
+
export function firstSentenceEnd(tool) {
|
|
66
|
+
const prefix = PREFIXED_TOOLS.has(tool.name) ? TOOL_PREFIX_CAP + 2 : 0;
|
|
67
|
+
const description = tool.description ?? '';
|
|
68
|
+
if (description === '')
|
|
69
|
+
return prefix;
|
|
70
|
+
const pointer = sharedRulesPointer();
|
|
71
|
+
const own = description.endsWith(pointer) ? description.slice(0, -pointer.length) : description;
|
|
72
|
+
const firstSentence = own.match(/^[\s\S]*?[.!?](?=\s|$)/)?.[0] ?? own;
|
|
73
|
+
return prefix + firstSentence.length;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* The length of the description as a CLIENT receives it — which for the four
|
|
77
|
+
* knowledge-base tools includes the deployment's purpose prefix, since the MCP
|
|
78
|
+
* surface prepends it (`prefixToolDescription`) and the client cuts the result.
|
|
79
|
+
* Measured at the prefix's CAP rather than at whatever the current admin wrote:
|
|
80
|
+
* the cap is what an admin may grow their text to without being told, so a
|
|
81
|
+
* description that only fits beside a short prefix does not really fit.
|
|
82
|
+
*
|
|
83
|
+
* The pointer sentence is measured the same way, for the same reason. It ends
|
|
84
|
+
* every file tool's description and its length moves with a DEPLOYMENT SETTING
|
|
85
|
+
* — the guide's file name — so a description measured beside the nine
|
|
86
|
+
* characters of `AGENTS.md` would pass here and arrive cut on a deployment
|
|
87
|
+
* that renamed its guide. Whatever pointer a description actually carries is
|
|
88
|
+
* discounted and charged at {@link SHARED_RULES_POINTER_MAX} instead.
|
|
89
|
+
*/
|
|
90
|
+
export function clientVisibleLength(tool) {
|
|
91
|
+
const own = tool.description?.length ?? 0;
|
|
92
|
+
// A prefixed tool with no description of its own is still handed the prefix,
|
|
93
|
+
// and nothing else — `prefixToolDescription` sends the prefix alone, with no
|
|
94
|
+
// blank line after it. Measuring that as zero would under-report the only
|
|
95
|
+
// text the client got.
|
|
96
|
+
if (own === 0)
|
|
97
|
+
return PREFIXED_TOOLS.has(tool.name) ? TOOL_PREFIX_CAP : 0;
|
|
98
|
+
// The pointer at its worst case rather than at this layout's: swap the one
|
|
99
|
+
// it carries for the longest it could be. A description that does not end
|
|
100
|
+
// with it (`start_session`, the proxied tools) is charged nothing.
|
|
101
|
+
const pointer = sharedRulesPointer();
|
|
102
|
+
const atWorstPointer = tool.description.endsWith(pointer)
|
|
103
|
+
? own - pointer.length + SHARED_RULES_POINTER_MAX
|
|
104
|
+
: own;
|
|
105
|
+
// `+ 2` for the blank line `prefixToolDescription` puts between the two.
|
|
106
|
+
return PREFIXED_TOOLS.has(tool.name) ? atWorstPointer + TOOL_PREFIX_CAP + 2 : atWorstPointer;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=description-length.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"description-length.js","sourceRoot":"","sources":["../../../src/modules/tool-registry/description-length.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAG1G;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC;AAE1C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAEpC;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAA4C;IAC3E,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;IAC3C,IAAI,WAAW,KAAK,EAAE;QAAE,OAAO,MAAM,CAAC;IACtC,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;IACrC,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;IAChG,MAAM,aAAa,GAAG,GAAG,CAAC,KAAK,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;IACtE,OAAO,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC;AACvC,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAA4C;IAC9E,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC,CAAC;IAC1C,6EAA6E;IAC7E,6EAA6E;IAC7E,0EAA0E;IAC1E,uBAAuB;IACvB,IAAI,GAAG,KAAK,CAAC;QAAE,OAAO,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,2EAA2E;IAC3E,0EAA0E;IAC1E,mEAAmE;IACnE,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;IACrC,MAAM,cAAc,GAAG,IAAI,CAAC,WAAY,CAAC,QAAQ,CAAC,OAAO,CAAC;QACxD,CAAC,CAAC,GAAG,GAAG,OAAO,CAAC,MAAM,GAAG,wBAAwB;QACjD,CAAC,CAAC,GAAG,CAAC;IACR,yEAAyE;IACzE,OAAO,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,GAAG,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;AAC/F,CAAC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import type { ChangeRequestDetail, ChangeRequestState } from '@bevel-software/platform-shared';
|
|
2
|
+
/**
|
|
3
|
+
* What `open_change_request` answers, and why it is not the detail the app's
|
|
4
|
+
* dialog reads.
|
|
5
|
+
*
|
|
6
|
+
* The dialog renders every file's diff, so its detail carries every patch. An
|
|
7
|
+
* agent that opens a change request needs none of that: it needs the link to
|
|
8
|
+
* hand the user, and enough of the request to confirm it carries the files it
|
|
9
|
+
* meant to propose and to say what the request is now waiting on. Handing it
|
|
10
|
+
* the dialog's detail cost ~445,000 characters for 27 files of 15 KB — past
|
|
11
|
+
* every tool-result limit, so the one field the agent actually needed (the
|
|
12
|
+
* link) could not be read at all.
|
|
13
|
+
*
|
|
14
|
+
* So this is a purpose-made answer: the link first, the request's identity,
|
|
15
|
+
* who must approve each path, what blocks the merge verbatim from the detail,
|
|
16
|
+
* and the changed paths with their kind of change — no patch, no file content.
|
|
17
|
+
* An agent that wants more asks for it by name through `include`.
|
|
18
|
+
*/
|
|
19
|
+
/** What `include` accepts. */
|
|
20
|
+
export type ChangeRequestInclude = 'patches' | 'all-paths';
|
|
21
|
+
/** The two `include` values, for the tool's input schema and its validation. */
|
|
22
|
+
export declare const CHANGE_REQUEST_INCLUDES: readonly ChangeRequestInclude[];
|
|
23
|
+
/** How many paths the answer lists before it cuts; `all-paths` lifts the cut. */
|
|
24
|
+
export declare const CHANGE_REQUEST_PATH_LIMIT = 25;
|
|
25
|
+
/**
|
|
26
|
+
* The kind of change to one path, in the four words the answer speaks. Git's
|
|
27
|
+
* own statuses are finer (`modified` vs `changed`, `renamed` vs `copied`) in
|
|
28
|
+
* ways nothing downstream acts on.
|
|
29
|
+
*/
|
|
30
|
+
export type ChangeKind = 'added' | 'changed' | 'deleted' | 'moved';
|
|
31
|
+
/** One changed path. `previousPath` is where a `moved` one came from. */
|
|
32
|
+
export interface ChangeRequestSummaryFile {
|
|
33
|
+
path: string;
|
|
34
|
+
change: ChangeKind;
|
|
35
|
+
previousPath?: string;
|
|
36
|
+
/** Unified diff. Only with `include: ["patches"]`, and absent for a binary or oversized file. */
|
|
37
|
+
patch?: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Who must approve one path, at the same per-path granularity the detail
|
|
41
|
+
* carries (the access tree resolves a role per file or per folder; this says
|
|
42
|
+
* what it resolved to for this file).
|
|
43
|
+
*
|
|
44
|
+
* The detail's own entry is the dialog's: it also carries each approver's
|
|
45
|
+
* email, the viewer's own eligibility, and every approval's timestamp and
|
|
46
|
+
* staleness. Repeated over 25 files that is ~4,500 characters an agent cannot
|
|
47
|
+
* act on — it may not approve anything — and it is what would push the
|
|
48
|
+
* 27-file answer back over the limit this ticket exists to get under. So the
|
|
49
|
+
* answer keeps what "who must approve" means and nothing else.
|
|
50
|
+
*/
|
|
51
|
+
export interface ChangeRequestApprovers {
|
|
52
|
+
path: string;
|
|
53
|
+
/** Roles that confer approval here. `everyone` means any signed-in approver. */
|
|
54
|
+
roles: string[];
|
|
55
|
+
/** Approvers named directly, by display name. */
|
|
56
|
+
users: string[];
|
|
57
|
+
/** True once an eligible approver has approved at the request's current head. */
|
|
58
|
+
approved: boolean;
|
|
59
|
+
/** False when the merge gate does not bind this path — then nobody has to approve it. */
|
|
60
|
+
inMergeGate: boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Present when the access tree could not be resolved for this path — which
|
|
63
|
+
* includes a detail that carries no verdict at all. Then empty
|
|
64
|
+
* `roles`/`users` means "not known", NOT "nobody has to approve".
|
|
65
|
+
*/
|
|
66
|
+
approversUnknown?: true;
|
|
67
|
+
}
|
|
68
|
+
export interface ChangeRequestSummary {
|
|
69
|
+
/** First field on purpose: it is the one an agent must hand the user. */
|
|
70
|
+
url: string;
|
|
71
|
+
urlNote?: string;
|
|
72
|
+
number: number;
|
|
73
|
+
title: string;
|
|
74
|
+
state: ChangeRequestState;
|
|
75
|
+
sourceBranch: string;
|
|
76
|
+
targetBranch: string;
|
|
77
|
+
/** Who must approve, one entry per listed path. */
|
|
78
|
+
approvals: ChangeRequestApprovers[];
|
|
79
|
+
/** What blocks the merge — verbatim from the detail. Empty when nothing does. */
|
|
80
|
+
mergeBlockedReasons: string[];
|
|
81
|
+
/** The changed paths, cut to {@link CHANGE_REQUEST_PATH_LIMIT} unless `all-paths` was asked for. */
|
|
82
|
+
files: ChangeRequestSummaryFile[];
|
|
83
|
+
/** How many files the request changes in total, cut or not. */
|
|
84
|
+
totalFiles: number;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Shape the tool's answer out of the detail the service already returns. Pure:
|
|
88
|
+
* the service and the app's routes are untouched, and the detail they serve is
|
|
89
|
+
* exactly what it was.
|
|
90
|
+
*
|
|
91
|
+
* `approvals` is narrowed to the paths the answer lists, because the detail's
|
|
92
|
+
* contract is one entry per listed file. Nothing about the merge gate is lost
|
|
93
|
+
* by that: `mergeBlockedReasons` names every missing approval, cut or not.
|
|
94
|
+
*/
|
|
95
|
+
export declare function summarizeChangeRequest(detail: ChangeRequestDetail, include?: readonly ChangeRequestInclude[]): ChangeRequestSummary;
|
|
96
|
+
/** The `include` values off a tool call's arguments; anything else is ignored. */
|
|
97
|
+
export declare function parseInclude(raw: unknown): ChangeRequestInclude[];
|
|
98
|
+
//# sourceMappingURL=change-request-summary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"change-request-summary.d.ts","sourceRoot":"","sources":["../../../../src/modules/workflow/agent-tools/change-request-summary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,kBAAkB,EAInB,MAAM,iCAAiC,CAAC;AAEzC;;;;;;;;;;;;;;;;GAgBG;AAEH,8BAA8B;AAC9B,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,WAAW,CAAC;AAE3D,gFAAgF;AAChF,eAAO,MAAM,uBAAuB,EAAE,SAAS,oBAAoB,EAA6B,CAAC;AAEjG,iFAAiF;AACjF,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAE5C;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAEnE,yEAAyE;AACzE,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iGAAiG;IACjG,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,gFAAgF;IAChF,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,iDAAiD;IACjD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,iFAAiF;IACjF,QAAQ,EAAE,OAAO,CAAC;IAClB,yFAAyF;IACzF,WAAW,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,yEAAyE;IACzE,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,kBAAkB,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,SAAS,EAAE,sBAAsB,EAAE,CAAC;IACpC,iFAAiF;IACjF,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,oGAAoG;IACpG,KAAK,EAAE,wBAAwB,EAAE,CAAC;IAClC,+DAA+D;IAC/D,UAAU,EAAE,MAAM,CAAC;CACpB;AA+CD;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,mBAAmB,EAC3B,OAAO,GAAE,SAAS,oBAAoB,EAAO,GAC5C,oBAAoB,CAkBtB;AAED,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,oBAAoB,EAAE,CAGjE"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/** The two `include` values, for the tool's input schema and its validation. */
|
|
2
|
+
export const CHANGE_REQUEST_INCLUDES = ['patches', 'all-paths'];
|
|
3
|
+
/** How many paths the answer lists before it cuts; `all-paths` lifts the cut. */
|
|
4
|
+
export const CHANGE_REQUEST_PATH_LIMIT = 25;
|
|
5
|
+
/**
|
|
6
|
+
* A copy and a rename both carry `previousPath`, and the one thing a reader
|
|
7
|
+
* does with either is look at where the text came from — so both read `moved`.
|
|
8
|
+
* `unchanged` is a file the request lists without changing (git reports it on
|
|
9
|
+
* a mode-only change); `changed` is the honest word for it among these four.
|
|
10
|
+
*/
|
|
11
|
+
function changeKindOf(status) {
|
|
12
|
+
switch (status) {
|
|
13
|
+
case 'added':
|
|
14
|
+
return 'added';
|
|
15
|
+
case 'removed':
|
|
16
|
+
return 'deleted';
|
|
17
|
+
case 'renamed':
|
|
18
|
+
case 'copied':
|
|
19
|
+
return 'moved';
|
|
20
|
+
default:
|
|
21
|
+
return 'changed';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function approversOf(approval) {
|
|
25
|
+
const eligible = approval.eligibleApprovers ?? { roles: [], users: [] };
|
|
26
|
+
return {
|
|
27
|
+
path: approval.path,
|
|
28
|
+
roles: eligible.roles ?? [],
|
|
29
|
+
users: (eligible.users ?? []).map((u) => u.name),
|
|
30
|
+
approved: approval.isApproved,
|
|
31
|
+
inMergeGate: approval.inMergeGate,
|
|
32
|
+
// Anything but an explicit `true` is unresolved — a detail built before
|
|
33
|
+
// the flag existed carries no flag at all, and reading that as "resolved"
|
|
34
|
+
// would turn an empty approver set into "nobody must approve". Same
|
|
35
|
+
// fail-closed reading as `computeViewerCanUpdate`.
|
|
36
|
+
...(approval.eligibilityResolved !== true ? { approversUnknown: true } : {}),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function summaryFileOf(file, withPatch) {
|
|
40
|
+
return {
|
|
41
|
+
path: file.path,
|
|
42
|
+
change: changeKindOf(file.status),
|
|
43
|
+
...(file.previousPath ? { previousPath: file.previousPath } : {}),
|
|
44
|
+
...(withPatch && file.patch ? { patch: file.patch } : {}),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Shape the tool's answer out of the detail the service already returns. Pure:
|
|
49
|
+
* the service and the app's routes are untouched, and the detail they serve is
|
|
50
|
+
* exactly what it was.
|
|
51
|
+
*
|
|
52
|
+
* `approvals` is narrowed to the paths the answer lists, because the detail's
|
|
53
|
+
* contract is one entry per listed file. Nothing about the merge gate is lost
|
|
54
|
+
* by that: `mergeBlockedReasons` names every missing approval, cut or not.
|
|
55
|
+
*/
|
|
56
|
+
export function summarizeChangeRequest(detail, include = []) {
|
|
57
|
+
const all = detail.files ?? [];
|
|
58
|
+
const withPatch = include.includes('patches');
|
|
59
|
+
const listed = include.includes('all-paths') ? all : all.slice(0, CHANGE_REQUEST_PATH_LIMIT);
|
|
60
|
+
const listedPaths = new Set(listed.map((f) => f.path));
|
|
61
|
+
return {
|
|
62
|
+
url: detail.url,
|
|
63
|
+
...(detail.urlNote ? { urlNote: detail.urlNote } : {}),
|
|
64
|
+
number: detail.number,
|
|
65
|
+
title: detail.title,
|
|
66
|
+
state: detail.state,
|
|
67
|
+
sourceBranch: detail.branch,
|
|
68
|
+
targetBranch: detail.base,
|
|
69
|
+
approvals: (detail.approvals ?? []).filter((a) => listedPaths.has(a.path)).map(approversOf),
|
|
70
|
+
mergeBlockedReasons: detail.mergeBlockedReasons ?? [],
|
|
71
|
+
files: listed.map((f) => summaryFileOf(f, withPatch)),
|
|
72
|
+
totalFiles: all.length,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/** The `include` values off a tool call's arguments; anything else is ignored. */
|
|
76
|
+
export function parseInclude(raw) {
|
|
77
|
+
if (!Array.isArray(raw))
|
|
78
|
+
return [];
|
|
79
|
+
return CHANGE_REQUEST_INCLUDES.filter((v) => raw.includes(v));
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=change-request-summary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"change-request-summary.js","sourceRoot":"","sources":["../../../../src/modules/workflow/agent-tools/change-request-summary.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow.tools.d.ts","sourceRoot":"","sources":["../../../../src/modules/workflow/agent-tools/workflow.tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,sCAAsC,CAAC;AAGtF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAE7E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"workflow.tools.d.ts","sourceRoot":"","sources":["../../../../src/modules/workflow/agent-tools/workflow.tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,sCAAsC,CAAC;AAGtF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAE7E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAuJ/D;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,cAAc,EACxB,WAAW,EAAE,kBAAkB;AAC/B,2GAA2G;AAC3G,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,WAAW,GAAG,eAAe,GAAG,oBAAoB,GAAG,mBAAmB,CAAC,GAC9F,IAAI,CA2dN"}
|
|
@@ -5,6 +5,7 @@ import { assertBranchProvided } from '../../../shared/domain-errors.js';
|
|
|
5
5
|
import { workspaceIdForBranch } from '../../../shared/workspace-id.js';
|
|
6
6
|
import { assertInsideRepo, normalizePathArgs } from '../../kb-fs/repo-path.js';
|
|
7
7
|
import { RETIRED_TOOL_MESSAGES } from '@bevel-software/platform-mcp-core';
|
|
8
|
+
import { CHANGE_REQUEST_INCLUDES, CHANGE_REQUEST_PATH_LIMIT, parseInclude, summarizeChangeRequest, } from './change-request-summary.js';
|
|
8
9
|
/** `knowledge-base/KnowledgeBase/x.md` → `KnowledgeBase/x.md`; anything else unchanged. */
|
|
9
10
|
function stripKbDir(path, kbDirName) {
|
|
10
11
|
return path.startsWith(`${kbDirName}/`) ? path.slice(kbDirName.length + 1) : path;
|
|
@@ -37,20 +38,30 @@ const commitSchema = {
|
|
|
37
38
|
},
|
|
38
39
|
required: ['authorName', 'authorEmail', 'sha', 'subject', 'committedAt'],
|
|
39
40
|
};
|
|
40
|
-
const
|
|
41
|
+
const changeRequestSummaryFileSchema = {
|
|
41
42
|
type: 'object',
|
|
42
43
|
properties: {
|
|
43
44
|
path: { type: 'string' },
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
45
|
+
change: { type: 'string', description: '`added` | `changed` | `deleted` | `moved`.' },
|
|
46
|
+
previousPath: { type: 'string', description: 'Where a `moved` file came from.' },
|
|
47
|
+
patch: {
|
|
48
|
+
type: 'string',
|
|
49
|
+
description: 'Unified diff. Only with `include: ["patches"]`, and absent for a binary or oversized file.',
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
required: ['path', 'change'],
|
|
53
|
+
};
|
|
54
|
+
const changeRequestApproversSchema = {
|
|
55
|
+
type: 'object',
|
|
56
|
+
properties: {
|
|
57
|
+
path: { type: 'string' },
|
|
58
|
+
roles: { type: 'array', items: { type: 'string' }, description: 'Roles that confer approval here; `everyone` means any signed-in approver.' },
|
|
59
|
+
users: { type: 'array', items: { type: 'string' }, description: 'Approvers named directly, by display name.' },
|
|
60
|
+
approved: { type: 'boolean', description: 'True once an eligible approver has approved at the current head.' },
|
|
61
|
+
inMergeGate: { type: 'boolean', description: 'False when the merge gate does not bind this path — then nobody has to approve it.' },
|
|
62
|
+
approversUnknown: { type: 'boolean', description: 'Present when the access tree could not be resolved: empty `roles`/`users` means unknown, not nobody.' },
|
|
52
63
|
},
|
|
53
|
-
required: ['path', '
|
|
64
|
+
required: ['path', 'roles', 'users', 'approved', 'inMergeGate'],
|
|
54
65
|
};
|
|
55
66
|
const commentSchema = {
|
|
56
67
|
type: 'object',
|
|
@@ -83,24 +94,43 @@ const changeRequestLinkSchema = {
|
|
|
83
94
|
function linkOf(cr) {
|
|
84
95
|
return { number: cr.number, url: cr.url, ...(cr.urlNote ? { urlNote: cr.urlNote } : {}) };
|
|
85
96
|
}
|
|
86
|
-
|
|
97
|
+
/**
|
|
98
|
+
* What `open_change_request` answers: a summary, `url` first, with no patch and
|
|
99
|
+
* no file content. The app's dialog reads the full detail from its own route;
|
|
100
|
+
* handing that to an agent cost ~445,000 characters for 27 files of 15 KB and
|
|
101
|
+
* overflowed every tool-result limit. Built by `summarizeChangeRequest`.
|
|
102
|
+
*
|
|
103
|
+
* Property order is the answer's field order, and `url` leads it: the link is
|
|
104
|
+
* the one field the agent must hand the user, so it must survive any truncation.
|
|
105
|
+
*/
|
|
106
|
+
const changeRequestSummarySchema = {
|
|
87
107
|
type: 'object',
|
|
88
|
-
description: 'Full change-request detail (aliased from the underlying pull request).',
|
|
89
108
|
properties: {
|
|
90
|
-
number: { type: 'integer' },
|
|
91
109
|
url: changeRequestUrlSchema,
|
|
92
110
|
urlNote: changeRequestUrlNoteSchema,
|
|
111
|
+
number: { type: 'integer' },
|
|
93
112
|
title: { type: 'string' },
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
113
|
+
state: { type: 'string', description: '`open` | `merged` | `closed`.' },
|
|
114
|
+
sourceBranch: { type: 'string', description: 'The draft branch carrying the changes.' },
|
|
115
|
+
targetBranch: { type: 'string', description: 'The branch the changes apply to.' },
|
|
116
|
+
approvals: {
|
|
117
|
+
type: 'array',
|
|
118
|
+
items: changeRequestApproversSchema,
|
|
119
|
+
description: 'Who must approve, one entry per listed file. A file nobody can approve (`inMergeGate: false`) blocks nothing.',
|
|
120
|
+
},
|
|
121
|
+
mergeBlockedReasons: {
|
|
122
|
+
type: 'array',
|
|
123
|
+
items: { type: 'string' },
|
|
124
|
+
description: 'What blocks the merge — every missing approval, whether its file is listed or cut. Empty when nothing blocks.',
|
|
125
|
+
},
|
|
126
|
+
files: {
|
|
127
|
+
type: 'array',
|
|
128
|
+
items: changeRequestSummaryFileSchema,
|
|
129
|
+
description: `The changed paths with their kind of change, cut to ${CHANGE_REQUEST_PATH_LIMIT}; \`include: ["all-paths"]\` lists them all.`,
|
|
130
|
+
},
|
|
131
|
+
totalFiles: { type: 'integer', description: 'How many files the request changes in total, cut or not.' },
|
|
101
132
|
},
|
|
102
|
-
required: ['
|
|
103
|
-
additionalProperties: true,
|
|
133
|
+
required: ['url', 'number', 'title', 'state', 'sourceBranch', 'targetBranch', 'approvals', 'mergeBlockedReasons', 'files', 'totalFiles'],
|
|
104
134
|
};
|
|
105
135
|
/**
|
|
106
136
|
* Workflow domain tools, registered into the central catalog and hosted on the
|
|
@@ -336,6 +366,12 @@ kb) {
|
|
|
336
366
|
description: 'Open a change request from a draft branch into a target branch. Auto-merges the latest target ' +
|
|
337
367
|
'into the source first, pushes, then creates the CR. On conflicts returns a ' +
|
|
338
368
|
'`change-request-conflicts` error with affected paths. The author marker is injected server-side. ' +
|
|
369
|
+
'Answers a SUMMARY, not the request\'s content: `url` first (hand it to the user), then `number`, ' +
|
|
370
|
+
'`title`, `state`, `sourceBranch`, `targetBranch`, `approvals` (who must approve each file), ' +
|
|
371
|
+
'`mergeBlockedReasons` (what blocks the merge), and `files` — the changed paths with their kind of ' +
|
|
372
|
+
`change (\`added\` / \`changed\` / \`deleted\` / \`moved\`), cut to ${CHANGE_REQUEST_PATH_LIMIT} of \`totalFiles\`. ` +
|
|
373
|
+
'No patches and no file content: ask for the diffs with `include: ["patches"]` and for every path ' +
|
|
374
|
+
'with `include: ["all-paths"]`. ' +
|
|
339
375
|
'An agent proposes; a person reviews and merges the request in the app — hand the user its `url`.',
|
|
340
376
|
inputs: {
|
|
341
377
|
type: 'object',
|
|
@@ -344,28 +380,32 @@ kb) {
|
|
|
344
380
|
targetBranch: { type: 'string', minLength: 1, description: `The branch to apply to (e.g. '${kb.defaultBranch}').` },
|
|
345
381
|
title: { type: 'string', minLength: 1, maxLength: 256, description: 'Short imperative title (≤256 chars).' },
|
|
346
382
|
description: { type: 'string', description: 'Optional markdown body shown verbatim to reviewers.' },
|
|
383
|
+
include: {
|
|
384
|
+
type: 'array',
|
|
385
|
+
items: { type: 'string', enum: [...CHANGE_REQUEST_INCLUDES] },
|
|
386
|
+
description: 'Add to the default answer, which carries neither: `patches` gives each listed file its unified diff, ' +
|
|
387
|
+
`\`all-paths\` lists every changed path instead of the first ${CHANGE_REQUEST_PATH_LIMIT}. Both may be given. ` +
|
|
388
|
+
'Patches of a large request run to hundreds of thousands of characters — ask for them only when you will read them.',
|
|
389
|
+
},
|
|
347
390
|
},
|
|
348
391
|
required: ['sourceBranch', 'targetBranch', 'title'],
|
|
349
392
|
additionalProperties: false,
|
|
350
393
|
},
|
|
351
|
-
outputs:
|
|
352
|
-
type: 'object',
|
|
353
|
-
properties: { changeRequest: changeRequestDetailSchema },
|
|
354
|
-
required: ['changeRequest'],
|
|
355
|
-
},
|
|
394
|
+
outputs: changeRequestSummarySchema,
|
|
356
395
|
write: true,
|
|
357
396
|
// The workspace this acts on is the SOURCE draft's — `sourceBranch` already
|
|
358
397
|
// names it, so skip the auto-injected (and here redundant) `branch` input
|
|
359
398
|
// rather than asking the model for both and reading the wrong one.
|
|
360
399
|
skipBranch: true,
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
400
|
+
// The service still returns the full detail — the app's routes serve the
|
|
401
|
+
// same call and must keep getting it. The shaping happens here, in the
|
|
402
|
+
// answer, so nothing below the tool changes.
|
|
403
|
+
handler: async (args, ctx) => summarizeChangeRequest(await ctx.workflowService.openChangeRequest(workspaceIdForBranch(args.sourceBranch), ctx.user, {
|
|
404
|
+
sourceBranch: args.sourceBranch,
|
|
405
|
+
targetBranch: args.targetBranch,
|
|
406
|
+
title: args.title,
|
|
407
|
+
description: typeof args.description === 'string' ? args.description : undefined,
|
|
408
|
+
}), parseInclude(args.include)),
|
|
369
409
|
});
|
|
370
410
|
mount({
|
|
371
411
|
name: 'post_change_request_comment',
|