@bevel-software/platform-core-backend 0.32.0 → 0.34.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 +24 -8
- package/agent-guide/html-views.md +277 -15
- package/agent-guide/tool-manuals.md +1 -1
- package/dist/core/catalog-revision.d.ts +12 -1
- package/dist/core/catalog-revision.d.ts.map +1 -1
- package/dist/core/catalog-revision.js +23 -3
- package/dist/core/catalog-revision.js.map +1 -1
- package/dist/core/core-ports.d.ts +41 -0
- package/dist/core/core-ports.d.ts.map +1 -1
- package/dist/core/core-ports.js.map +1 -1
- package/dist/core/create-core-server.d.ts.map +1 -1
- package/dist/core/create-core-server.js +42 -10
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +22 -6
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +58 -17
- package/dist/core/create-core-services.js.map +1 -1
- package/dist/core/lifecycle.d.ts +24 -0
- package/dist/core/lifecycle.d.ts.map +1 -1
- package/dist/core/lifecycle.js +16 -2
- 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 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/modules/access/access-control.interface.d.ts +17 -9
- package/dist/modules/access/access-control.interface.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.d.ts +13 -3
- package/dist/modules/access/access-control.service.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.js +165 -77
- 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 +28 -25
- package/dist/modules/access/access-mutation.service.d.ts.map +1 -1
- package/dist/modules/access/access-mutation.service.js +50 -53
- 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 +12 -11
- package/dist/modules/access/access-view.js.map +1 -1
- package/dist/modules/access/access.routes.d.ts +8 -7
- package/dist/modules/access/access.routes.d.ts.map +1 -1
- package/dist/modules/access/access.routes.js +38 -32
- 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 +6 -4
- package/dist/modules/access/groups-admin.routes.js.map +1 -1
- package/dist/modules/access/groups-admin.service.d.ts +45 -14
- package/dist/modules/access/groups-admin.service.d.ts.map +1 -1
- package/dist/modules/access/groups-admin.service.js +80 -39
- package/dist/modules/access/groups-admin.service.js.map +1 -1
- package/dist/modules/access/groups-edit.d.ts +1 -1
- package/dist/modules/access/groups-edit.d.ts.map +1 -1
- package/dist/modules/access/groups-edit.js +3 -3
- 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.d.ts +116 -24
- package/dist/modules/access/reference-scan.d.ts.map +1 -1
- package/dist/modules/access/reference-scan.js +305 -44
- package/dist/modules/access/reference-scan.js.map +1 -1
- package/dist/modules/access/roles-admin.service.d.ts +18 -9
- package/dist/modules/access/roles-admin.service.d.ts.map +1 -1
- package/dist/modules/access/roles-admin.service.js +32 -26
- 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/access-grammar.d.ts +35 -10
- package/dist/modules/access-model/access-grammar.d.ts.map +1 -1
- package/dist/modules/access-model/access-grammar.js +60 -20
- package/dist/modules/access-model/access-grammar.js.map +1 -1
- package/dist/modules/access-model/access-splice.d.ts +22 -18
- package/dist/modules/access-model/access-splice.d.ts.map +1 -1
- package/dist/modules/access-model/access-splice.js +20 -14
- package/dist/modules/access-model/access-splice.js.map +1 -1
- package/dist/modules/access-model/group-files.d.ts +1 -0
- package/dist/modules/access-model/group-files.d.ts.map +1 -1
- package/dist/modules/access-model/group-files.js +5 -1
- package/dist/modules/access-model/group-files.js.map +1 -1
- package/dist/modules/access-model/index.d.ts +20 -5
- package/dist/modules/access-model/index.d.ts.map +1 -1
- package/dist/modules/access-model/index.js +18 -5
- package/dist/modules/access-model/index.js.map +1 -1
- 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 +15 -7
- 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/compose.d.ts +3 -1
- package/dist/modules/agent-instructions/compose.d.ts.map +1 -1
- package/dist/modules/agent-instructions/compose.js +3 -1
- package/dist/modules/agent-instructions/compose.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/agent-instructions/shared-file-rules.d.ts +5 -1
- package/dist/modules/agent-instructions/shared-file-rules.d.ts.map +1 -1
- package/dist/modules/agent-instructions/shared-file-rules.js +16 -1
- package/dist/modules/agent-instructions/shared-file-rules.js.map +1 -1
- package/dist/modules/agent-scope/agent-scope.contract.d.ts +67 -0
- package/dist/modules/agent-scope/agent-scope.contract.d.ts.map +1 -0
- package/dist/modules/agent-scope/agent-scope.contract.js +27 -0
- package/dist/modules/agent-scope/agent-scope.contract.js.map +1 -0
- package/dist/modules/agent-scope/connection-scope.d.ts +111 -0
- package/dist/modules/agent-scope/connection-scope.d.ts.map +1 -0
- package/dist/modules/agent-scope/connection-scope.js +165 -0
- package/dist/modules/agent-scope/connection-scope.js.map +1 -0
- package/dist/modules/agent-scope/index.d.ts +3 -0
- package/dist/modules/agent-scope/index.d.ts.map +1 -0
- package/dist/modules/agent-scope/index.js +3 -0
- package/dist/modules/agent-scope/index.js.map +1 -0
- 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 +3 -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.contract.d.ts +6 -0
- package/dist/modules/audit/audit.contract.d.ts.map +1 -1
- package/dist/modules/audit/audit.contract.js.map +1 -1
- package/dist/modules/audit/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-admission.d.ts +12 -0
- package/dist/modules/auth/account-admission.d.ts.map +1 -1
- package/dist/modules/auth/account-admission.js +15 -0
- package/dist/modules/auth/account-admission.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-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.middleware.d.ts +27 -1
- package/dist/modules/auth/auth.middleware.d.ts.map +1 -1
- package/dist/modules/auth/auth.middleware.js +42 -4
- package/dist/modules/auth/auth.middleware.js.map +1 -1
- package/dist/modules/auth/auth.routes.d.ts +13 -9
- package/dist/modules/auth/auth.routes.d.ts.map +1 -1
- package/dist/modules/auth/auth.routes.js +35 -29
- package/dist/modules/auth/auth.routes.js.map +1 -1
- package/dist/modules/auth/auth.service.d.ts +56 -7
- package/dist/modules/auth/auth.service.d.ts.map +1 -1
- package/dist/modules/auth/auth.service.js +131 -37
- package/dist/modules/auth/auth.service.js.map +1 -1
- package/dist/modules/auth/index.d.ts +3 -1
- package/dist/modules/auth/index.d.ts.map +1 -1
- package/dist/modules/auth/index.js +1 -1
- package/dist/modules/auth/index.js.map +1 -1
- package/dist/modules/auth/oidc-auth-provider.d.ts.map +1 -1
- package/dist/modules/auth/oidc-auth-provider.js +3 -10
- 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 +175 -234
- package/dist/modules/database/core-schema.d.ts.map +1 -1
- package/dist/modules/database/core-schema.js +72 -35
- 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 +10 -3
- package/dist/modules/declared-variables/declared-variables.routes.d.ts.map +1 -1
- package/dist/modules/declared-variables/declared-variables.routes.js +13 -2
- package/dist/modules/declared-variables/declared-variables.routes.js.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 +8 -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 +12 -0
- package/dist/modules/kb-fs/index.d.ts.map +1 -1
- package/dist/modules/kb-fs/index.js +11 -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-fs/locking-filesystem.js +7 -1
- package/dist/modules/kb-fs/locking-filesystem.js.map +1 -1
- package/dist/modules/kb-fs/repo-path.d.ts +26 -6
- package/dist/modules/kb-fs/repo-path.d.ts.map +1 -1
- package/dist/modules/kb-fs/repo-path.js +22 -7
- package/dist/modules/kb-fs/repo-path.js.map +1 -1
- package/dist/modules/kb-fs/tmp-ref.d.ts +36 -0
- package/dist/modules/kb-fs/tmp-ref.d.ts.map +1 -0
- package/dist/modules/kb-fs/tmp-ref.js +76 -0
- package/dist/modules/kb-fs/tmp-ref.js.map +1 -0
- 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 +11 -5
- package/dist/modules/mcp/mcp-auth.middleware.d.ts.map +1 -1
- package/dist/modules/mcp/mcp-auth.middleware.js +18 -5
- package/dist/modules/mcp/mcp-auth.middleware.js.map +1 -1
- package/dist/modules/mcp/mcp.routes.d.ts +9 -5
- package/dist/modules/mcp/mcp.routes.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.routes.js +41 -6
- package/dist/modules/mcp/mcp.routes.js.map +1 -1
- package/dist/modules/mcp/mcp.service.d.ts +25 -4
- package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.service.js +84 -19
- package/dist/modules/mcp/mcp.service.js.map +1 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts +25 -2
- package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts.map +1 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js +46 -11
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js.map +1 -1
- package/dist/modules/mcp/oauth/oauth-consent.routes.d.ts +10 -1
- package/dist/modules/mcp/oauth/oauth-consent.routes.d.ts.map +1 -1
- package/dist/modules/mcp/oauth/oauth-consent.routes.js +35 -2
- 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 +2 -1
- 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 +21 -5
- 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 +7 -3
- package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.routes.js +35 -8
- 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 +13 -4
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.js +16 -4
- 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 +4 -3
- package/dist/modules/skills/index.d.ts.map +1 -1
- package/dist/modules/skills/index.js +0 -2
- package/dist/modules/skills/index.js.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.contract.d.ts +16 -0
- package/dist/modules/skills/skills.contract.d.ts.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.service.js +6 -1
- package/dist/modules/skills/skills.service.js.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 +27 -19
- 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.interface.d.ts +11 -0
- package/dist/modules/tool-auth/external-api-key.interface.d.ts.map +1 -1
- package/dist/modules/tool-auth/external-api-key.interface.js.map +1 -1
- package/dist/modules/tool-auth/external-api-key.service.d.ts +2 -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 +5 -2
- 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/internal-token.service.d.ts +9 -0
- package/dist/modules/tool-auth/internal-token.service.d.ts.map +1 -1
- package/dist/modules/tool-auth/internal-token.service.js +1 -0
- package/dist/modules/tool-auth/internal-token.service.js.map +1 -1
- package/dist/modules/tool-auth/tool-auth.middleware.d.ts +29 -5
- package/dist/modules/tool-auth/tool-auth.middleware.d.ts.map +1 -1
- package/dist/modules/tool-auth/tool-auth.middleware.js +33 -7
- 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 +12 -6
- package/dist/modules/tool-helpers/tool-context.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-context.js +5 -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 +17 -2
- package/dist/modules/tool-helpers/tool-handler.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-handler.js +21 -2
- package/dist/modules/tool-helpers/tool-handler.js.map +1 -1
- package/dist/modules/tool-helpers/tool.contract.d.ts +12 -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.d.ts +3 -2
- package/dist/modules/tool-helpers/validate-token.d.ts.map +1 -1
- package/dist/modules/tool-helpers/validate-token.js +2 -2
- package/dist/modules/tool-helpers/validate-token.js.map +1 -1
- package/dist/modules/tool-manuals/index.d.ts +8 -3
- package/dist/modules/tool-manuals/index.d.ts.map +1 -1
- package/dist/modules/tool-manuals/index.js +4 -2
- 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.contract.d.ts +19 -6
- package/dist/modules/tool-manuals/tool-manuals.contract.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.d.ts +12 -6
- package/dist/modules/tool-manuals/tool-manuals.routes.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.js +43 -6
- package/dist/modules/tool-manuals/tool-manuals.routes.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts +16 -9
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.js +23 -15
- package/dist/modules/tool-manuals/tool-manuals.service.js.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 +26 -12
- 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 +44 -2
- package/dist/modules/tool-registry/manual.routes.d.ts.map +1 -1
- package/dist/modules/tool-registry/manual.routes.js +38 -11
- 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 +15 -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 +5 -1
- package/dist/modules/workflow/agent-tools/change-request-summary.d.ts.map +1 -1
- package/dist/modules/workflow/agent-tools/change-request-summary.js +10 -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 +60 -77
- package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
- package/dist/modules/workflow/change-request-hooks.d.ts +1 -1
- 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 +4 -4
- package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/git.service.js +23 -41
- 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 +6 -7
- package/dist/modules/workflow/git/pull-request.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/pull-request.service.js +40 -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 +41 -50
- package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.service.js +221 -154
- 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/file-readers/doc-extract.service.d.ts +82 -14
- package/dist/modules/workspace/file-readers/doc-extract.service.d.ts.map +1 -1
- package/dist/modules/workspace/file-readers/doc-extract.service.js +109 -36
- 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 +24 -0
- package/dist/modules/workspace/index.d.ts.map +1 -1
- package/dist/modules/workspace/index.js +21 -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/nul-scan.d.ts +19 -0
- package/dist/modules/workspace/nul-scan.d.ts.map +1 -0
- package/dist/modules/workspace/nul-scan.js +55 -0
- package/dist/modules/workspace/nul-scan.js.map +1 -0
- package/dist/modules/workspace/pattern-matcher.contract.d.ts +111 -28
- package/dist/modules/workspace/pattern-matcher.contract.d.ts.map +1 -1
- package/dist/modules/workspace/pattern-matcher.contract.js +31 -14
- package/dist/modules/workspace/pattern-matcher.contract.js.map +1 -1
- package/dist/modules/workspace/ripgrep-search.d.ts +54 -0
- package/dist/modules/workspace/ripgrep-search.d.ts.map +1 -0
- package/dist/modules/workspace/ripgrep-search.js +657 -0
- package/dist/modules/workspace/ripgrep-search.js.map +1 -0
- package/dist/modules/workspace/ripgrep-version.d.ts +15 -0
- package/dist/modules/workspace/ripgrep-version.d.ts.map +1 -0
- package/dist/modules/workspace/ripgrep-version.js +31 -0
- package/dist/modules/workspace/ripgrep-version.js.map +1 -0
- 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/beside-checkout.d.ts +8 -5
- package/dist/modules/workspace/startup/beside-checkout.d.ts.map +1 -1
- package/dist/modules/workspace/startup/beside-checkout.js +14 -5
- package/dist/modules/workspace/startup/beside-checkout.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 +99 -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-tmp.d.ts +146 -0
- package/dist/modules/workspace/workspace-tmp.d.ts.map +1 -0
- package/dist/modules/workspace/workspace-tmp.js +435 -0
- package/dist/modules/workspace/workspace-tmp.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 +9 -32
- package/dist/modules/workspace/workspace.routes.js.map +1 -1
- package/dist/modules/workspace/workspace.service.d.ts +48 -7
- package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.service.js +89 -12
- 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 +502 -140
- 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/path-order.d.ts +28 -8
- package/dist/shared/path-order.d.ts.map +1 -1
- package/dist/shared/path-order.js +37 -8
- package/dist/shared/path-order.js.map +1 -1
- package/migrations/0020_change_request_body_is_the_description.sql +20 -0
- package/migrations/0021_data_migrations_ledger.sql +11 -0
- package/migrations/0022_session_version.sql +6 -0
- package/migrations/0023_agent_path.sql +3 -0
- package/migrations/meta/0020_snapshot.json +2321 -0
- package/migrations/meta/0021_snapshot.json +2353 -0
- package/migrations/meta/0022_snapshot.json +2360 -0
- package/migrations/meta/0023_snapshot.json +2378 -0
- package/migrations/meta/_journal.json +28 -0
- package/package.json +3 -3
- package/src/__tests__/pg-scratch.test.ts +69 -0
- package/src/__tests__/pg-scratch.ts +31 -0
- package/src/__tests__/slow-ripgrep.ts +65 -0
- package/src/core/__tests__/boot-without-ripgrep.test.ts +34 -0
- package/src/core/__tests__/catalog-revision.test.ts +89 -0
- package/src/core/__tests__/damaged-document.tools.test.ts +374 -0
- package/src/core/__tests__/gated-boot.test.ts +8 -1
- package/src/core/__tests__/lifecycle.test.ts +46 -13
- package/src/core/__tests__/public-config.test.ts +5 -0
- package/src/core/catalog-revision.ts +24 -2
- package/src/core/core-ports.ts +42 -0
- package/src/core/create-core-server.ts +45 -3
- package/src/core/create-core-services.ts +81 -17
- package/src/core/lifecycle.ts +36 -2
- package/src/core/public-config.ts +10 -0
- package/src/index.ts +1 -1
- package/src/modules/access/__tests__/access-control.admin-root-floor.test.ts +12 -0
- package/src/modules/access/__tests__/access-control.colliding-name-cases.test.ts +113 -0
- package/src/modules/access/__tests__/access-control.frontmatter-head.test.ts +117 -0
- package/src/modules/access/__tests__/access-control.group-named-admin.test.ts +122 -0
- package/src/modules/access/__tests__/access-control.preview-relocation.test.ts +50 -0
- package/src/modules/access/__tests__/access-declarations.test.ts +19 -0
- package/src/modules/access/__tests__/access-groups.test.ts +55 -22
- package/src/modules/access/__tests__/access-mutation.service.test.ts +85 -59
- package/src/modules/access/__tests__/access-requests.routes.test.ts +29 -15
- package/src/modules/access/__tests__/access-restrict-here.test.ts +7 -5
- package/src/modules/access/__tests__/access.routes.admins.test.ts +1 -0
- package/src/modules/access/__tests__/access.routes.batch.test.ts +2 -0
- package/src/modules/access/__tests__/access.routes.folder-governs.test.ts +2 -0
- package/src/modules/access/__tests__/access.routes.group-grant.test.ts +50 -14
- package/src/modules/access/__tests__/access.routes.overrides.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.proposal-branch.test.ts +1 -0
- package/src/modules/access/__tests__/access.routes.prospective.test.ts +2 -0
- package/src/modules/access/__tests__/access.routes.revoke.test.ts +18 -13
- package/src/modules/access/__tests__/access.routes.unknown-email.test.ts +2 -0
- package/src/modules/access/__tests__/grant-sources.test.ts +20 -15
- package/src/modules/access/__tests__/groups-admin.routes.test.ts +61 -0
- package/src/modules/access/__tests__/groups-admin.service.test.ts +211 -18
- package/src/modules/access/__tests__/reference-scan.test.ts +366 -14
- package/src/modules/access/__tests__/roles-admin.security.test.ts +1 -1
- package/src/modules/access/__tests__/roles-admin.service.test.ts +43 -22
- package/src/modules/access/__tests__/roles-capabilities.test.ts +6 -2
- package/src/modules/access/__tests__/roles.routes.test.ts +1 -1
- package/src/modules/access/access-control.interface.ts +17 -10
- package/src/modules/access/access-control.service.ts +161 -76
- package/src/modules/access/access-declarations.ts +1 -1
- package/src/modules/access/access-mutation.service.ts +58 -57
- 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 +13 -11
- package/src/modules/access/access.routes.ts +51 -43
- 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 +7 -5
- package/src/modules/access/groups-admin.service.ts +116 -47
- package/src/modules/access/groups-edit.ts +3 -3
- package/src/modules/access/index.ts +17 -0
- package/src/modules/access/reference-scan.ts +320 -47
- package/src/modules/access/roles-admin.service.ts +45 -31
- 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 +3 -3
- package/src/modules/access/user-access-removal.service.ts +3 -6
- package/src/modules/access-model/__tests__/access-grammar.test.ts +38 -1
- package/src/modules/access-model/__tests__/access-splice.test.ts +50 -8
- package/src/modules/access-model/access-grammar.ts +65 -20
- package/src/modules/access-model/access-splice.ts +31 -23
- package/src/modules/access-model/group-files.ts +5 -0
- package/src/modules/access-model/index.ts +21 -5
- 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 +36 -0
- package/src/modules/agent-guide/agent-guide.tools.ts +17 -8
- package/src/modules/agent-guide/agent-guide.ts +1 -1
- package/src/modules/agent-guide/index.ts +1 -1
- package/src/modules/agent-instructions/__tests__/shared-file-rules.test.ts +1 -0
- package/src/modules/agent-instructions/compose.ts +3 -1
- package/src/modules/agent-instructions/read-preamble.ts +1 -1
- package/src/modules/agent-instructions/shared-file-rules.ts +17 -1
- package/src/modules/agent-scope/__tests__/agent-surfaces.connect-as.test.ts +421 -0
- package/src/modules/agent-scope/__tests__/connection-scope.test.ts +46 -0
- package/src/modules/agent-scope/__tests__/in-memory-kb.ts +148 -0
- package/src/modules/agent-scope/agent-scope.contract.ts +83 -0
- package/src/modules/agent-scope/connection-scope.ts +199 -0
- package/src/modules/agent-scope/index.ts +15 -0
- package/src/modules/audit/agent-audit.service.ts +5 -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.contract.ts +6 -0
- package/src/modules/audit/audit.routes.ts +4 -4
- package/src/modules/auth/__tests__/auth.middleware.test.ts +30 -2
- package/src/modules/auth/__tests__/auth.routes.test.ts +71 -5
- package/src/modules/auth/__tests__/auth.service.test.ts +90 -9
- package/src/modules/auth/__tests__/password-change-sessions.pg.test.ts +269 -0
- package/src/modules/auth/account-admission.ts +19 -0
- package/src/modules/auth/account-erasure.service.ts +4 -9
- package/src/modules/auth/account-switch-lock.ts +2 -2
- package/src/modules/auth/account.routes.ts +3 -3
- package/src/modules/auth/auth.middleware.ts +45 -4
- package/src/modules/auth/auth.routes.ts +46 -29
- package/src/modules/auth/auth.service.ts +139 -38
- package/src/modules/auth/index.ts +5 -0
- package/src/modules/auth/oidc-auth-provider.ts +3 -10
- 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/__tests__/session-version-migration.pg.test.ts +133 -0
- package/src/modules/database/core-schema.ts +76 -36
- package/src/modules/database/index.ts +9 -0
- package/src/modules/database/migrate.ts +79 -3
- package/src/modules/declared-variables/__tests__/declared-variables.route.test.ts +44 -1
- package/src/modules/declared-variables/declared-variables.routes.ts +14 -3
- 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/__tests__/embed.tools.test.ts +12 -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 +11 -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/__tests__/locking-filesystem.test.ts +25 -0
- package/src/modules/kb-fs/__tests__/repo-path.test.ts +53 -8
- package/src/modules/kb-fs/index.ts +13 -0
- package/src/modules/kb-fs/locking-filesystem.ts +8 -2
- package/src/modules/kb-fs/repo-path.ts +33 -7
- package/src/modules/kb-fs/tmp-ref.ts +81 -0
- 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__/connect-as.pg.test.ts +137 -0
- package/src/modules/mcp/__tests__/mcp-auth.middleware.test.ts +29 -5
- package/src/modules/mcp/__tests__/mcp-routes-harness.ts +8 -0
- package/src/modules/mcp/__tests__/mcp.connect-as.test.ts +195 -0
- package/src/modules/mcp/__tests__/mcp.routes.connect-as.test.ts +192 -0
- package/src/modules/mcp/__tests__/oauth-consent.connect-as.test.ts +146 -0
- 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 +25 -9
- package/src/modules/mcp/mcp.routes.ts +42 -8
- package/src/modules/mcp/mcp.service.ts +136 -29
- package/src/modules/mcp/oauth/bevel-oauth-provider.ts +48 -10
- package/src/modules/mcp/oauth/oauth-consent.routes.ts +42 -2
- 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/__tests__/plugins.tools.test.ts +38 -2
- 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 +3 -1
- 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 +23 -6
- 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 +39 -8
- 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/__tests__/connect-pending.route.test.ts +113 -0
- 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 +27 -7
- 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/__tests__/skills.service.test.ts +34 -0
- package/src/modules/skills/allowed-tools-check.ts +2 -6
- package/src/modules/skills/index.ts +9 -2
- 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.contract.ts +17 -0
- package/src/modules/skills/skills.routes.ts +1 -1
- package/src/modules/skills/skills.service.ts +7 -3
- package/src/modules/skills/skills.tools.ts +49 -22
- package/src/modules/tool-auth/__tests__/external-api-key.service.test.ts +4 -0
- 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.interface.ts +11 -1
- package/src/modules/tool-auth/external-api-key.service.ts +7 -4
- package/src/modules/tool-auth/index.ts +14 -0
- package/src/modules/tool-auth/internal-token.service.ts +10 -0
- package/src/modules/tool-auth/tool-auth.middleware.ts +48 -6
- package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +2 -2
- package/src/modules/tool-helpers/__tests__/can-write.tools.test.ts +5 -3
- 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 +18 -10
- package/src/modules/tool-helpers/tool-def.ts +7 -3
- package/src/modules/tool-helpers/tool-handler.ts +36 -2
- package/src/modules/tool-helpers/tool.contract.ts +12 -2
- package/src/modules/tool-helpers/validate-token.ts +5 -4
- package/src/modules/tool-manuals/__tests__/tool-manuals.archive.route.test.ts +80 -4
- package/src/modules/tool-manuals/__tests__/tool-manuals.service.test.ts +42 -0
- package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +3 -3
- package/src/modules/tool-manuals/index.ts +12 -2
- 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.contract.ts +18 -6
- package/src/modules/tool-manuals/tool-manuals.routes.ts +45 -8
- package/src/modules/tool-manuals/tool-manuals.service.ts +34 -18
- package/src/modules/tool-manuals/tool-manuals.tools.ts +32 -17
- package/src/modules/tool-registry/__tests__/read-only-hints.test.ts +439 -0
- package/src/modules/tool-registry/__tests__/tool-description-length.test.ts +2 -2
- 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 +38 -11
- 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 +18 -0
- package/src/modules/update-check/update-check.routes.ts +2 -2
- 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.service.facade.test.ts +85 -22
- package/src/modules/workflow/__tests__/workflow.service.sync.test.ts +1 -1
- 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 +87 -60
- 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 +16 -2
- package/src/modules/workflow/agent-tools/workflow.tools.ts +63 -84
- package/src/modules/workflow/change-request-hooks.ts +1 -1
- 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__/git.service.list-branches.test.ts +130 -3
- package/src/modules/workflow/git/__tests__/pull-request.service.getPrDetail.test.ts +24 -9
- package/src/modules/workflow/git/git.service.ts +34 -56
- package/src/modules/workflow/git/node-git-runner.ts +1 -1
- package/src/modules/workflow/git/pull-request.service.ts +34 -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 +277 -191
- 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 +4 -3
- package/src/modules/workspace/__tests__/holds-nul.test.ts +66 -0
- package/src/modules/workspace/__tests__/rest-tool-arguments.test.ts +5 -4
- package/src/modules/workspace/__tests__/ripgrep-search.test.ts +570 -0
- package/src/modules/workspace/__tests__/ripgrep-version.test.ts +29 -0
- 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-tmp.tools.test.ts +928 -0
- package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +17 -37
- package/src/modules/workspace/__tests__/workspace.service.ensure-remotes-fetched.test.ts +30 -0
- package/src/modules/workspace/__tests__/workspace.service.read-filter.test.ts +20 -8
- package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +4 -3
- package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +24 -11
- package/src/modules/workspace/__tests__/workspace.tools.test.ts +423 -117
- 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/file-readers/README.md +9 -0
- package/src/modules/workspace/file-readers/__tests__/doc-extract.service.test.ts +175 -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 +144 -36
- 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 +37 -0
- package/src/modules/workspace/kb-repository.ts +3 -2
- package/src/modules/workspace/not-found.ts +1 -1
- package/src/modules/workspace/nul-scan.ts +50 -0
- package/src/modules/workspace/pattern-matcher.contract.ts +124 -33
- package/src/modules/workspace/ripgrep-search.ts +715 -0
- package/src/modules/workspace/ripgrep-version.ts +35 -0
- package/src/modules/workspace/routine-write-policy.ts +1 -1
- package/src/modules/workspace/startup/__tests__/beside-checkout.test.ts +11 -0
- package/src/modules/workspace/startup/beside-checkout.ts +13 -5
- 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 +192 -0
- package/src/modules/workspace/workspace-tmp.ts +457 -0
- package/src/modules/workspace/workspace.routes.ts +15 -39
- package/src/modules/workspace/workspace.service.ts +96 -22
- package/src/modules/workspace/workspace.tools.ts +550 -186
- 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/path-order.ts +37 -8
- package/starter-packs/engineering/Plugins/engineering-starter/access.md +1 -1
- package/starter-packs/general/Plugins/general-starter/access.md +1 -1
- package/starter-packs/operations/Plugins/operations-starter/access.md +1 -1
- package/starter-packs/sales/Plugins/sales-starter/access.md +1 -1
- package/starter-packs/support/Plugins/support-starter/access.md +1 -1
- package/dist/modules/workspace/bounded-matcher.d.ts +0 -79
- package/dist/modules/workspace/bounded-matcher.d.ts.map +0 -1
- package/dist/modules/workspace/bounded-matcher.js +0 -261
- package/dist/modules/workspace/bounded-matcher.js.map +0 -1
- package/src/modules/workflow/__tests__/format-affected-owners.test.ts +0 -85
- package/src/modules/workspace/__tests__/bounded-matcher.test.ts +0 -213
- package/src/modules/workspace/bounded-matcher.ts +0 -328
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import nodeFs from 'node:fs/promises';
|
|
2
|
-
import { join } from 'node:path';
|
|
2
|
+
import { isAbsolute, join, relative, sep } from 'node:path';
|
|
3
3
|
import AdmZip from 'adm-zip';
|
|
4
4
|
import type { Router, RequestHandler } from 'express';
|
|
5
5
|
import type { LocalFilesystem } from '@mastra/core/workspace';
|
|
6
|
-
import type { IToolRegistry, JsonSchema } from '../tool-registry/
|
|
7
|
-
import { hasHttpStatus, ToolError, type ToolContext, type ToolHandler } from '../tool-helpers/
|
|
8
|
-
import { BRANCH_INPUT, toolDef } from '../tool-helpers/tool-def.js';
|
|
6
|
+
import type { IToolRegistry, JsonSchema } from '../tool-registry/index.js';
|
|
7
|
+
import { hasHttpStatus, ToolError, type ToolContext, type ToolHandler, BRANCH_INPUT, toolDef, CAN_WRITE_CLAUSE, defaultBranchWriteVerdicts } from '../tool-helpers/index.js';
|
|
9
8
|
import {
|
|
10
9
|
notifyAgentRead,
|
|
11
10
|
assertAgentWriteAllowed,
|
|
@@ -13,9 +12,8 @@ import {
|
|
|
13
12
|
type AgentAccessGate,
|
|
14
13
|
} from './agent-access.gate.js';
|
|
15
14
|
import type { IRoutineWritePolicy } from './routine-write-policy.js';
|
|
16
|
-
import type { ToolHandlerFactory } from '../tool-helpers/
|
|
17
|
-
import {
|
|
18
|
-
import { requireInternalSource, requireExternalSource } from '../tool-auth/tool-auth.middleware.js';
|
|
15
|
+
import type { ToolHandlerFactory } from '../tool-helpers/index.js';
|
|
16
|
+
import { requireInternalSource, requireExternalSource } from '../tool-auth/index.js';
|
|
19
17
|
import { workspaceIdForBranch } from '../../shared/workspace-id.js';
|
|
20
18
|
import { GitInternalsError, WorkflowValidationError } from '../../shared/domain-errors.js';
|
|
21
19
|
// Leaf-level shared primitive (same exception `workspace.service.ts` already
|
|
@@ -24,25 +22,26 @@ import {
|
|
|
24
22
|
assertInsideRepo,
|
|
25
23
|
assertRepoRootNameFree,
|
|
26
24
|
assertRepoRootNameFreeArgs,
|
|
25
|
+
hasControlCharacter,
|
|
27
26
|
isInsideRepo,
|
|
27
|
+
isTmpRef,
|
|
28
28
|
normalizePathArgs,
|
|
29
29
|
normalizeWorkspacePath,
|
|
30
|
-
} from '../kb-fs/
|
|
31
|
-
import { GitGuardedFilesystem } from '../kb-fs/
|
|
30
|
+
} from '../kb-fs/index.js';
|
|
31
|
+
import { GitGuardedFilesystem, MoveLockedError, MoveRacedError, type LockingFilesystem } from '../kb-fs/index.js';
|
|
32
32
|
import { assertNoGitInternalsSegment, assertNotGitInternals, hasGitInternalsSegment } from '../../shared/git-internals.js';
|
|
33
|
-
import { isRolesYamlPath } from '../access-model/
|
|
33
|
+
import { isRolesYamlPath, toKbRelative, resolveReadableMap, AccessDeniedError } from '../access-model/index.js';
|
|
34
34
|
import type { ISessionSink } from './session-sink.js';
|
|
35
35
|
import { isAbsence, type ITreeWalker } from '../../shared/fs.contract.js';
|
|
36
|
-
import type { AccessDecisionSource, AccessTargetKind, IAccessControl } from '../access/
|
|
37
|
-
import { accessRoster, resolveAccessView } from '../access/
|
|
38
|
-
import { accessMdPathForFolder, fileCarriesAccessRules, governingFolderOf } from '../access/access-mutation.service.js';
|
|
39
|
-
import { toKbRelative, resolveReadableMap } from '../access-model/kb-read-filter.js';
|
|
36
|
+
import type { AccessDecisionSource, AccessTargetKind, IAccessControl } from '../access/index.js';
|
|
37
|
+
import { accessRoster, resolveAccessView, accessMdPathForFolder, fileCarriesAccessRules, governingFolderOf } from '../access/index.js';
|
|
40
38
|
import type { SpillStore } from './spill-store.js';
|
|
41
39
|
import type { DocExtractService } from './file-readers/doc-extract.service.js';
|
|
42
|
-
import { displayPath, type FileKind, type FileReaderRegistry, type ReadResult } from './file-readers/file-reader.js';
|
|
40
|
+
import { displayPath, type FileKind, type FileReader, type FileReaderRegistry, type ReadOrigin, type ReadResult } from './file-readers/file-reader.js';
|
|
43
41
|
import { fileTypeOf, needsContent } from './file-readers/content-mode.js';
|
|
44
42
|
import { createFileReaderRegistry } from './file-readers/file-reader.registry.js';
|
|
45
43
|
import { DocumentReader } from './file-readers/document-reader.js';
|
|
44
|
+
import { TextReader } from './file-readers/text-reader.js';
|
|
46
45
|
import { mcpImageResult } from '@bevel-software/platform-mcp-core';
|
|
47
46
|
import {
|
|
48
47
|
folderPlaceholderPath,
|
|
@@ -59,26 +58,32 @@ import {
|
|
|
59
58
|
type ExistingEntryKind,
|
|
60
59
|
} from '@bevel-software/platform-shared';
|
|
61
60
|
import type { KbContext } from '../../shared/kb-context.js';
|
|
62
|
-
import { AccessDeniedError } from '../access-model/access-errors.js';
|
|
63
61
|
import {
|
|
64
62
|
AGENT_GUIDE_FILE,
|
|
65
63
|
isAgentGuidePath,
|
|
66
64
|
isManagedGuide,
|
|
67
65
|
withPlatformGuideAppended,
|
|
68
66
|
type AgentGuideReader,
|
|
69
|
-
} from '../agent-guide/
|
|
67
|
+
} from '../agent-guide/index.js';
|
|
70
68
|
import { removeEmptyDirs } from './empty-dirs.js';
|
|
71
|
-
import {
|
|
69
|
+
import {
|
|
70
|
+
compareSearchPaths,
|
|
71
|
+
PATTERN_DIALECT,
|
|
72
|
+
type IPatternMatcher,
|
|
73
|
+
type IPatternSearch,
|
|
74
|
+
type TreeScope,
|
|
75
|
+
} from './pattern-matcher.contract.js';
|
|
76
|
+
import { holdsNul } from './nul-scan.js';
|
|
72
77
|
import { FIRST_RUN_SECTION_ID, firstRunNote, knowledgeFolderIsNew, type FirstRunStarterSource } from './first-run.js';
|
|
73
78
|
import { planMoveLinks } from './move-links.js';
|
|
74
|
-
import { MoveLockedError, MoveRacedError, type LockingFilesystem } from '../kb-fs/locking-filesystem.js';
|
|
75
79
|
import { rethrowAsWriteDenial } from './write-denial.js';
|
|
76
|
-
import type { IChangeReadGate } from '../access-model/
|
|
80
|
+
import type { IChangeReadGate } from '../access-model/index.js';
|
|
77
81
|
import { notFound, orDeclaredNotFound, orNotFound } from './not-found.js';
|
|
78
82
|
import { logger } from '../../shared/logging.js';
|
|
79
83
|
import { printable } from '../../shared/printable.js';
|
|
80
84
|
import { DestinationTakenError, inspectDestination } from '../../shared/rename-no-replace.js';
|
|
81
|
-
import { AgentUploadStore
|
|
85
|
+
import type { AgentUploadStore} from './agent-upload.store.js';
|
|
86
|
+
import { type ClaimedUpload } from './agent-upload.store.js';
|
|
82
87
|
import type { IAgentDownloadStore } from './agent-download.store.js';
|
|
83
88
|
import { buildDownload } from './agent-download.builder.js';
|
|
84
89
|
import { DOWNLOAD_MAX_FILES, ZIP_DOWNLOAD_MAX_BYTES } from './workspace.service.js';
|
|
@@ -104,6 +109,13 @@ interface AccessVerbs {
|
|
|
104
109
|
owner: boolean;
|
|
105
110
|
}
|
|
106
111
|
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* The caller's verdicts on a file you staged in the workspace's tmp folder: it
|
|
115
|
+
* may be read (and copied out), nothing else — the folder is read-only
|
|
116
|
+
* through the ref, and `request_file_download` does not take one.
|
|
117
|
+
*/
|
|
118
|
+
const TMP_ACCESS: AccessVerbs = { read: true, write: false, download: false, owner: false };
|
|
107
119
|
/** How many files `file_stat` counts under a folder before it stops and says so. */
|
|
108
120
|
const DESCENDANTS_CAP = 10_000;
|
|
109
121
|
|
|
@@ -159,18 +171,25 @@ async function filterReadableEntries(
|
|
|
159
171
|
fileWsPaths.push(dir ? `${dir}/${e.name}` : e.name);
|
|
160
172
|
}
|
|
161
173
|
if (fileWsPaths.length === 0) return entries;
|
|
174
|
+
const readable = await readableFiles(gate, fileWsPaths);
|
|
175
|
+
return entries.filter((e) => e.type === 'directory' || readable.has(dir ? `${dir}/${e.name}` : e.name));
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* The FILES among `wsPaths` the caller may read, judged in one batched ACL
|
|
180
|
+
* load by the FULL `canReadBatch` (per-node frontmatter honoured), via the
|
|
181
|
+
* shared `resolveReadableMap`. A path the verdict does not name is unreadable.
|
|
182
|
+
*/
|
|
183
|
+
async function readableFiles(gate: ReadGate, wsPaths: string[]): Promise<Set<string>> {
|
|
184
|
+
if (wsPaths.length === 0) return new Set();
|
|
162
185
|
const verdict = await resolveReadableMap(
|
|
163
186
|
(wid, email, rels) => gate.accessControl.canReadBatch(wid, email, rels),
|
|
164
187
|
gate.workspaceId,
|
|
165
188
|
gate.userEmail,
|
|
166
189
|
gate.kbDirName,
|
|
167
|
-
|
|
190
|
+
wsPaths,
|
|
168
191
|
);
|
|
169
|
-
return
|
|
170
|
-
if (e.type === 'directory') return true;
|
|
171
|
-
const wsPath = dir ? `${dir}/${e.name}` : e.name;
|
|
172
|
-
return verdict.get(wsPath) === true;
|
|
173
|
-
});
|
|
192
|
+
return new Set(wsPaths.filter((p) => verdict.get(p) === true));
|
|
174
193
|
}
|
|
175
194
|
|
|
176
195
|
/**
|
|
@@ -289,6 +308,32 @@ const RESERVED_ROOT_NAME_TARGETS: Readonly<Record<string, readonly string[]>> =
|
|
|
289
308
|
apply_file_upload: ['destination'],
|
|
290
309
|
};
|
|
291
310
|
|
|
311
|
+
/**
|
|
312
|
+
* The inputs that take a tmp ref (`__tmp__/<path>`, see `workspace-tmp.ts`)
|
|
313
|
+
* beside a repository path — the four reads of the one file it names. Every
|
|
314
|
+
* other tool, and every other input of these four (`copy_file`'s `dest`
|
|
315
|
+
* among them), refuses a ref before anything else runs — in
|
|
316
|
+
* `normalizePathArgs`, through the one admission gate (`kb-fs/tmp-ref.ts`):
|
|
317
|
+
* the folder is read-only through the ref, and `copy_file` to a repository
|
|
318
|
+
* path is how a file is kept.
|
|
319
|
+
*/
|
|
320
|
+
const TMP_REF_INPUTS: Readonly<Record<string, readonly string[]>> = {
|
|
321
|
+
read_file: ['path'],
|
|
322
|
+
file_stat: ['path'],
|
|
323
|
+
grep: ['path'],
|
|
324
|
+
copy_file: ['src'],
|
|
325
|
+
};
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* A path input that also takes a tmp ref (see `TMP_REF_INPUTS`): said on the
|
|
329
|
+
* input, because the descriptions of the tools that take one have no room
|
|
330
|
+
* left, and what the ref is is in the shared rules.
|
|
331
|
+
*/
|
|
332
|
+
const orTmpRef = (schema: JsonSchema): JsonSchema => ({
|
|
333
|
+
...schema,
|
|
334
|
+
description: `${schema.description ?? ''} Or a \`__tmp__/…\` ref to one file you staged in the workspace's tmp folder.`,
|
|
335
|
+
});
|
|
336
|
+
|
|
292
337
|
function asText(content: string | Buffer): string {
|
|
293
338
|
return typeof content === 'string' ? content : content.toString('utf8');
|
|
294
339
|
}
|
|
@@ -311,6 +356,8 @@ const UNCACHED_DOCS_PER_GREP = 20;
|
|
|
311
356
|
/** Per-grep-walk extraction state: the shared budget + how many documents it left unsearched. */
|
|
312
357
|
interface DocGrepState {
|
|
313
358
|
readers: FileReaderRegistry;
|
|
359
|
+
/** The workspace searched — where a document that fails to extract during the walk is reported. */
|
|
360
|
+
origin: ReadOrigin;
|
|
314
361
|
uncachedBudget: number;
|
|
315
362
|
skippedUncached: number;
|
|
316
363
|
}
|
|
@@ -642,66 +689,125 @@ function modeOf(a: Record<string, unknown>): WriteMode {
|
|
|
642
689
|
}
|
|
643
690
|
|
|
644
691
|
/**
|
|
645
|
-
* What
|
|
646
|
-
*
|
|
647
|
-
* NAMES that one file has nothing else to
|
|
648
|
-
* answer an empty match list, which reads as
|
|
649
|
-
* when the truth is "there was never any text
|
|
692
|
+
* What a file holds for `grep` to search. The walk ignores the difference
|
|
693
|
+
* between the last two (a file with nothing searchable is just a file with no
|
|
694
|
+
* matches), but a grep whose path NAMES that one file has nothing else to
|
|
695
|
+
* report: without it, it could only answer an empty match list, which reads as
|
|
696
|
+
* "your pattern is not in there" when the truth is "there was never any text
|
|
697
|
+
* to look at".
|
|
650
698
|
*/
|
|
651
|
-
type
|
|
652
|
-
/**
|
|
653
|
-
| '
|
|
654
|
-
/** No searchable text at all: an image, binary content, a corrupt document. */
|
|
655
|
-
| 'no-text'
|
|
699
|
+
type SearchableText =
|
|
700
|
+
/** Text to search. */
|
|
701
|
+
| { kind: 'text'; text: string }
|
|
702
|
+
/** No searchable text at all: an image, binary content, a corrupt document (remembered or fresh). */
|
|
703
|
+
| { kind: 'no-text' }
|
|
656
704
|
/** A cold document the per-call extraction budget could not afford (counted in `docs`). */
|
|
657
|
-
| 'budget-skipped';
|
|
705
|
+
| { kind: 'budget-skipped' };
|
|
706
|
+
|
|
707
|
+
/** One line of a grep answer: that path, the 1-based line number, the line cut to {@link GREP_LINE_CHARS}. */
|
|
708
|
+
interface GrepMatch {
|
|
709
|
+
path: string;
|
|
710
|
+
line: number;
|
|
711
|
+
text: string;
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
/** The longest stretch of a matching line a grep answer carries. */
|
|
715
|
+
const GREP_LINE_CHARS = 300;
|
|
716
|
+
|
|
717
|
+
/** {@link searchableText}'s `bytesOf` for a repository path: the workspace filesystem's own read. */
|
|
718
|
+
function fileBytes(fs: LocalFilesystem): (path: string) => Promise<Buffer> {
|
|
719
|
+
return async (path) => asBytes(await fs.readFile(path));
|
|
720
|
+
}
|
|
658
721
|
|
|
659
722
|
/**
|
|
660
|
-
*
|
|
661
|
-
*
|
|
662
|
-
*
|
|
663
|
-
*
|
|
664
|
-
*
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
723
|
+
* Files the text pass judges, then searches, at a time: first this many, then
|
|
724
|
+
* twice as many each time, up to {@link GREP_MAX_BATCH}. A verdict reads the
|
|
725
|
+
* file's own access rules, so a batch costs one read of each of its files.
|
|
726
|
+
* Its names also go to ripgrep on the command line, so a batch also ends
|
|
727
|
+
* once they reach {@link GREP_BATCH_CHARS}, well inside the system's limit.
|
|
728
|
+
*/
|
|
729
|
+
const GREP_FIRST_BATCH = 256;
|
|
730
|
+
const GREP_MAX_BATCH = 2_048;
|
|
731
|
+
const GREP_BATCH_CHARS = 256 * 1024;
|
|
732
|
+
|
|
733
|
+
/**
|
|
734
|
+
* The text ONE file holds for `grep`, read through its reader: the text
|
|
735
|
+
* content for a text reader (none on NUL bytes / invalid UTF-8 — binary is not
|
|
736
|
+
* searchable), the EXTRACTION for a document reader (marker line included, so
|
|
737
|
+
* the `[slide N]`/`[sheet: …]`/`[page N]` lines are themselves searchable and
|
|
738
|
+
* line numbers match what read_file returns), nothing for images.
|
|
669
739
|
*
|
|
670
740
|
* Throws whatever reading the file throws — the caller decides whether that is
|
|
671
|
-
* a file to skip (
|
|
741
|
+
* a file to skip (a tree search) or an error to surface (a single-file grep).
|
|
742
|
+
* `bytesOf` is where the file's bytes come from: the workspace filesystem for
|
|
743
|
+
* a repository path, the tmp resolver for a tmp ref.
|
|
672
744
|
*/
|
|
673
|
-
async function
|
|
674
|
-
|
|
745
|
+
async function searchableText(
|
|
746
|
+
bytesOf: (path: string) => Promise<Buffer>,
|
|
675
747
|
path: string,
|
|
676
|
-
matcher: IPatternSearch,
|
|
677
|
-
out: { path: string; line: number; text: string }[],
|
|
678
|
-
max: number,
|
|
679
748
|
docs: DocGrepState,
|
|
680
|
-
): Promise<
|
|
749
|
+
): Promise<SearchableText> {
|
|
681
750
|
const reader = docs.readers.readerFor(path);
|
|
682
|
-
const bytes =
|
|
683
|
-
let content
|
|
684
|
-
if (
|
|
685
|
-
//
|
|
686
|
-
//
|
|
687
|
-
//
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
751
|
+
const bytes = await bytesOf(path);
|
|
752
|
+
let content: string | null;
|
|
753
|
+
if (reader instanceof DocumentReader) {
|
|
754
|
+
// What the cache remembers is free — an extraction is searched, a failure
|
|
755
|
+
// (a damaged file, or one that overran its budget within the hour) is
|
|
756
|
+
// skipped without extracting it again. A cold document draws on the
|
|
757
|
+
// per-call budget (see UNCACHED_DOCS_PER_GREP) — beyond it the search
|
|
758
|
+
// skips the document and counts it.
|
|
759
|
+
let res = await reader.cachedRead(bytes, path);
|
|
760
|
+
if (res === undefined) {
|
|
761
|
+
if (docs.uncachedBudget <= 0) {
|
|
762
|
+
docs.skippedUncached++;
|
|
763
|
+
return { kind: 'budget-skipped' };
|
|
764
|
+
}
|
|
765
|
+
docs.uncachedBudget--;
|
|
766
|
+
res = await reader.read(bytes, path, docs.origin);
|
|
691
767
|
}
|
|
692
|
-
|
|
693
|
-
const res = await reader.read(bytes, path);
|
|
694
|
-
// A non-text outcome is a corrupt document — nothing searchable.
|
|
768
|
+
// A non-text outcome is a document that could not be read — nothing searchable.
|
|
695
769
|
content = res.kind === 'text' ? res.text : null;
|
|
770
|
+
} else {
|
|
771
|
+
content = reader.greppableText ? await reader.greppableText(bytes, path) : null;
|
|
696
772
|
}
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
773
|
+
return content === null ? { kind: 'no-text' } : { kind: 'text', text: content };
|
|
774
|
+
}
|
|
775
|
+
|
|
776
|
+
/**
|
|
777
|
+
* grep over the one text file `path`, by ripgrep from the folder holding it,
|
|
778
|
+
* its lines pushed onto `out`, when it is a regular file; `null`, with
|
|
779
|
+
* nothing searched, for anything else (a link, one that loops, a file gone
|
|
780
|
+
* since), which is read as read_file reads it instead. A file that answers no
|
|
781
|
+
* line has no text when ripgrep finds it binary: it holds a NUL, which
|
|
782
|
+
* {@link holdsNul} looks for in the very file that was judged.
|
|
783
|
+
*/
|
|
784
|
+
async function grepTextFile(
|
|
785
|
+
fs: LocalFilesystem,
|
|
786
|
+
path: string,
|
|
787
|
+
search: IPatternSearch,
|
|
788
|
+
max: number,
|
|
789
|
+
out: GrepMatch[],
|
|
790
|
+
): Promise<{ kind: 'searched' } | { kind: 'no-text' } | null> {
|
|
791
|
+
const slash = path.lastIndexOf('/');
|
|
792
|
+
const scope = await treeScope(fs, slash < 0 ? '' : path.slice(0, slash));
|
|
793
|
+
const name = path.slice(slash + 1);
|
|
794
|
+
const absolute = join(scope.cwd, scope.root, name);
|
|
795
|
+
const judged = await nodeFs.lstat(absolute).catch(() => null);
|
|
796
|
+
if (judged === null || !judged.isFile()) return null;
|
|
797
|
+
const from = out.length;
|
|
798
|
+
for await (const file of search.files(scope, { only: [name], maxLinesPerFile: max })) {
|
|
799
|
+
for (const l of file.lines) out.push({ path, line: l.line, text: l.text.slice(0, GREP_LINE_CHARS) });
|
|
703
800
|
}
|
|
704
|
-
return 'searched';
|
|
801
|
+
if (out.length > from) return { kind: 'searched' };
|
|
802
|
+
const binary = await orNotFound(path, () => holdsNul(absolute, judged, search), 'Nothing to search');
|
|
803
|
+
return binary ? { kind: 'no-text' } : { kind: 'searched' };
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
/** Append the lines `hits` names (0-based indices into `text`'s lines) to `out`, as matches in `path`. */
|
|
807
|
+
function pushMatches(out: GrepMatch[], path: string, text: string, hits: readonly number[]): void {
|
|
808
|
+
if (hits.length === 0) return;
|
|
809
|
+
const lines = text.split('\n');
|
|
810
|
+
for (const i of hits) out.push({ path, line: i + 1, text: lines[i]!.slice(0, GREP_LINE_CHARS) });
|
|
705
811
|
}
|
|
706
812
|
|
|
707
813
|
/**
|
|
@@ -738,56 +844,151 @@ async function searchRootKind(
|
|
|
738
844
|
}
|
|
739
845
|
}
|
|
740
846
|
|
|
741
|
-
/**
|
|
742
|
-
|
|
847
|
+
/**
|
|
848
|
+
* Where ripgrep searches the directory `root`: from the workspace's canonical
|
|
849
|
+
* directory, with the root's canonical path relative to it. The stat that
|
|
850
|
+
* called `root` a directory already refused one outside the workspace; this
|
|
851
|
+
* refuses it again where the search is started, so ripgrep, which follows the
|
|
852
|
+
* root it is given, is never started on anything outside.
|
|
853
|
+
*/
|
|
854
|
+
async function treeScope(fs: LocalFilesystem, root: string): Promise<TreeScope> {
|
|
855
|
+
const cwd = await nodeFs.realpath(fs.basePath);
|
|
856
|
+
const absolute = fs.resolveAbsolutePath(root);
|
|
857
|
+
const rel = absolute === undefined ? '..' : relative(cwd, await nodeFs.realpath(absolute));
|
|
858
|
+
if (rel === '..' || rel.startsWith(`..${sep}`) || isAbsolute(rel)) {
|
|
859
|
+
throw new ToolError(`"${displayPath(root)}" is outside the workspace.`, 403);
|
|
860
|
+
}
|
|
861
|
+
return { cwd, root: rel === '' ? '.' : rel.split(sep).join('/') };
|
|
862
|
+
}
|
|
863
|
+
|
|
864
|
+
/**
|
|
865
|
+
* grep over the directory `root`: the tree is listed, then searched in two
|
|
866
|
+
* passes, and no file is opened before it is admitted.
|
|
867
|
+
*
|
|
868
|
+
* The listing opens no file. Admission is the ONE step a file passes before
|
|
869
|
+
* either pass opens it: it is judged readable by the gate, and then — being a
|
|
870
|
+
* file the search will read, as `read_file` reads one — it is told to the
|
|
871
|
+
* read hook, which may refuse it, and with it the search. A file the caller
|
|
872
|
+
* may not read is never opened and never told of (there is no read to tell):
|
|
873
|
+
* what it holds can change neither the answer nor how long the search takes,
|
|
874
|
+
* and so not whether it ends within its budget. Judging and telling are both
|
|
875
|
+
* spent from that budget. A file that was not in the listing (it appeared
|
|
876
|
+
* since) is never admitted, so never searched.
|
|
877
|
+
*
|
|
878
|
+
* The text pass is ripgrep's own: every file whose reader greps its bytes as
|
|
879
|
+
* text (a TextReader) is searched by it, in path order, and read nowhere else.
|
|
880
|
+
* It admits a batch at a time, before ripgrep opens any of it, so the hook
|
|
881
|
+
* hears of each file of a batch whether or not a line of it is answered —
|
|
882
|
+
* and, past the line that fills the cap, of the rest of that batch, which the
|
|
883
|
+
* pass then never opens. Each file is answered as ripgrep finishes it, and
|
|
884
|
+
* the pass stops at the `max`-th line.
|
|
885
|
+
*
|
|
886
|
+
* The document pass reads the files every other reader owns through that
|
|
887
|
+
* reader, as `read_file` does — extractions under the per-call budget — and
|
|
888
|
+
* has their text matched by the same engine. A document that sorts after the
|
|
889
|
+
* text pass's last line cannot be among the first `max`, so it is not read.
|
|
890
|
+
*
|
|
891
|
+
* Answers what both found, unsorted: the caller merges, sorts and caps.
|
|
892
|
+
*/
|
|
893
|
+
async function grepTree(
|
|
743
894
|
fs: LocalFilesystem,
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
out: { path: string; line: number; text: string }[],
|
|
895
|
+
root: string,
|
|
896
|
+
search: IPatternSearch,
|
|
747
897
|
max: number,
|
|
748
|
-
depth: number,
|
|
749
898
|
gate: ReadGate,
|
|
750
899
|
notifyRead: (path: string) => Promise<void>,
|
|
751
900
|
docs: DocGrepState,
|
|
752
|
-
/** A file the
|
|
901
|
+
/** A file the search leaves to its caller: never answered, never counted against `max`. */
|
|
753
902
|
skip: (path: string) => boolean = () => false,
|
|
754
|
-
): Promise<
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
903
|
+
): Promise<GrepMatch[]> {
|
|
904
|
+
const scope = await treeScope(fs, root);
|
|
905
|
+
// A folder named with a trailing slash answers the paths it is spelled
|
|
906
|
+
// with everywhere else (`a/b.md`, never `a//b.md`), so the guide's own
|
|
907
|
+
// path and every verdict meet the one spelling.
|
|
908
|
+
const base = root.replace(/\/+$/, '');
|
|
909
|
+
const at = (p: string): string => (base === '' ? p : `${base}/${p}`);
|
|
910
|
+
// ripgrep already stays out of `.git`; the folder's every other spelling,
|
|
911
|
+
// and the folder placeholder, are left out as everywhere else.
|
|
912
|
+
const shown = (p: string): boolean => !hasGitInternalsSegment(p) && !isFolderPlaceholder(p) && !skip(p);
|
|
913
|
+
// Which reader owns an extension is the registry's answer, asked of a name
|
|
914
|
+
// carrying it; a TextReader greps the bytes themselves, which is ripgrep's
|
|
915
|
+
// pass. Extensions any other reader owns are left out of it.
|
|
916
|
+
const readerOf = (ext: string): FileReader => docs.readers.readerFor(`file${ext}`);
|
|
917
|
+
const notRaw = docs.readers.ownedExtensions().filter((ext) => !(readerOf(ext) instanceof TextReader));
|
|
918
|
+
const ownedBy = (p: string, exts: readonly string[]): boolean => {
|
|
919
|
+
const lower = p.toLowerCase();
|
|
920
|
+
return exts.some((ext) => lower.endsWith(ext));
|
|
921
|
+
};
|
|
922
|
+
const readerOwned = notRaw.filter((ext) => {
|
|
923
|
+
const reader = readerOf(ext);
|
|
924
|
+
return reader instanceof DocumentReader || reader.greppableText !== undefined;
|
|
925
|
+
});
|
|
926
|
+
const out: GrepMatch[] = [];
|
|
927
|
+
// Admission (see above): the gate's verdict on `paths`, then the hook told
|
|
928
|
+
// of each readable one in path order — a refusal ends the search here, as
|
|
929
|
+
// it ends a `read_file`, before anything is opened. Spent from the budget.
|
|
930
|
+
const admit = (paths: string[]): Promise<Set<string>> =>
|
|
931
|
+
search.charged(async () => {
|
|
932
|
+
const readable = await readableFiles(gate, paths);
|
|
933
|
+
for (const p of paths) {
|
|
934
|
+
if (readable.has(p)) await notifyRead(p);
|
|
935
|
+
}
|
|
936
|
+
return readable;
|
|
937
|
+
});
|
|
938
|
+
|
|
939
|
+
// Every file the walk covers, in path order. Only what is shown is ever
|
|
940
|
+
// admitted, so what is admitted is what may be answered. A name holding a
|
|
941
|
+
// control character is no file name to the platform — no tool reads or
|
|
942
|
+
// writes one — so it is not searched either.
|
|
943
|
+
const all = (await search.list(scope)).filter((p) => shown(at(p)) && !hasControlCharacter(p));
|
|
944
|
+
const raw = all.filter((p) => !ownedBy(p, notRaw));
|
|
945
|
+
// The text pass: a batch of files is admitted, then its admitted files, and
|
|
946
|
+
// only they, are searched. A batch is admitted before ripgrep opens any of
|
|
947
|
+
// it, and the pass stops at the `max`-th line, so the verdicts asked for are
|
|
948
|
+
// those of the files the answer reached — few for a common word — and the
|
|
949
|
+
// batches double so a rare one still walks the tree in a handful of runs.
|
|
950
|
+
let size = GREP_FIRST_BATCH;
|
|
951
|
+
for (let from = 0; from < raw.length && out.length < max; size = Math.min(size * 2, GREP_MAX_BATCH)) {
|
|
952
|
+
const batch: string[] = [];
|
|
953
|
+
for (let chars = 0; from < raw.length && batch.length < size && (batch.length === 0 || chars < GREP_BATCH_CHARS); from++) {
|
|
954
|
+
batch.push(raw[from]!);
|
|
955
|
+
chars += raw[from]!.length;
|
|
956
|
+
}
|
|
957
|
+
const readable = await admit(batch.map(at));
|
|
958
|
+
const only = batch.filter((p) => readable.has(at(p)));
|
|
959
|
+
for await (const file of search.files(scope, { only, maxLinesPerFile: max - out.length })) {
|
|
960
|
+
const p = at(file.path);
|
|
961
|
+
// Only what was admitted answers, whatever ripgrep printed.
|
|
962
|
+
if (!readable.has(p)) continue;
|
|
963
|
+
for (const l of file.lines.slice(0, max - out.length)) {
|
|
964
|
+
out.push({ path: p, line: l.line, text: l.text.slice(0, GREP_LINE_CHARS) });
|
|
965
|
+
}
|
|
966
|
+
// Enough: leaving the loop kills ripgrep at the file that filled the cap.
|
|
967
|
+
if (out.length >= max) break;
|
|
968
|
+
}
|
|
761
969
|
}
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
970
|
+
|
|
971
|
+
const last = out.length >= max ? out[out.length - 1]!.path : undefined;
|
|
972
|
+
const candidates = all
|
|
973
|
+
.filter((p) => ownedBy(p, readerOwned))
|
|
974
|
+
.map(at)
|
|
975
|
+
.filter((p) => last === undefined || compareSearchPaths(p, last) <= 0);
|
|
976
|
+
const readable = await admit(candidates);
|
|
977
|
+
const texts: { path: string; text: string }[] = [];
|
|
978
|
+
for (const p of candidates) {
|
|
979
|
+
if (!readable.has(p)) continue;
|
|
980
|
+
let found: SearchableText;
|
|
981
|
+
try {
|
|
982
|
+
found = await searchableText(fileBytes(fs), p, docs);
|
|
983
|
+
} catch {
|
|
984
|
+
// One document that cannot be read must not fail a search over the tree.
|
|
773
985
|
continue;
|
|
774
|
-
} else {
|
|
775
|
-
// Opening a file is a read of it, even when the walk started at a root
|
|
776
|
-
// the read hook was already told about — so every file the walk opens
|
|
777
|
-
// reaches the hook by name (closes the read-leak).
|
|
778
|
-
await notifyRead(p);
|
|
779
|
-
// A file the walk cannot read is silently skipped: one unreadable entry
|
|
780
|
-
// must not fail a search over the whole tree.
|
|
781
|
-
// A pattern too expensive to finish, or no worker free to run it, is not
|
|
782
|
-
// an unreadable file: either ends the whole search.
|
|
783
|
-
try {
|
|
784
|
-
await grepOneFile(fs, p, matcher, out, max, docs);
|
|
785
|
-
} catch (err) {
|
|
786
|
-
if (endsTheSearch(err)) throw err;
|
|
787
|
-
continue;
|
|
788
|
-
}
|
|
789
986
|
}
|
|
987
|
+
if (found.kind === 'text') texts.push({ path: p, text: found.text });
|
|
790
988
|
}
|
|
989
|
+
const hits = await search.matchingLines(texts.map((t) => t.text));
|
|
990
|
+
texts.forEach((t, i) => pushMatches(out, t.path, t.text, hits[i]!));
|
|
991
|
+
return out;
|
|
791
992
|
}
|
|
792
993
|
|
|
793
994
|
/** One `allowed-tools` entry a saved SKILL.md names that no visible tool matches. */
|
|
@@ -1107,7 +1308,9 @@ export function registerWorkspaceTools(
|
|
|
1107
1308
|
const assertToolPathsNotGitInternals = async (args: Record<string, unknown>, ctx: ToolContext): Promise<void> => {
|
|
1108
1309
|
const paths = toolPathArgs(args);
|
|
1109
1310
|
for (const p of paths) assertNoGitInternalsSegment(p);
|
|
1110
|
-
|
|
1311
|
+
// A spill ref belongs to no workspace, and a tmp ref to the folder beside
|
|
1312
|
+
// the checkout: neither is judged against the checkout's git folder.
|
|
1313
|
+
const onDisk = paths.filter((p) => !spillStore.isSpillRef(p) && !isTmpRef(p));
|
|
1111
1314
|
if (onDisk.length === 0) return;
|
|
1112
1315
|
const root = await gitCheckRootFor(args, ctx);
|
|
1113
1316
|
if (root === null) return;
|
|
@@ -1164,15 +1367,20 @@ export function registerWorkspaceTools(
|
|
|
1164
1367
|
* caller WILL have, never whether they may do it. The write verdicts that
|
|
1165
1368
|
* gate the move are `writeBlocked` and the lock gate, both of which read
|
|
1166
1369
|
* the tree as it is.
|
|
1370
|
+
*
|
|
1371
|
+
* `sourceContent` is the text of a source that is no repository path (a
|
|
1372
|
+
* tmp ref): it carries rules in exactly as a repository file would, so it
|
|
1373
|
+
* is previewed through the same relocation reading, never as "nothing
|
|
1374
|
+
* travels".
|
|
1167
1375
|
*/
|
|
1168
1376
|
const accessAfter = async (
|
|
1169
1377
|
branch: string,
|
|
1170
1378
|
ctx: ToolContext,
|
|
1171
1379
|
src: string,
|
|
1172
1380
|
dest: string,
|
|
1173
|
-
opts?: { sourceRemains?: boolean },
|
|
1381
|
+
opts?: { sourceRemains?: boolean; sourceContent?: string },
|
|
1174
1382
|
): Promise<AccessVerbs> => {
|
|
1175
|
-
const from = toKbRelative(src, kbDirName);
|
|
1383
|
+
const from = opts?.sourceContent !== undefined ? src : toKbRelative(src, kbDirName);
|
|
1176
1384
|
const to = toKbRelative(dest, kbDirName);
|
|
1177
1385
|
// Outside the repository there are no rules to carry, and none to land
|
|
1178
1386
|
// among — the same answer `accessAt` gives for such a path.
|
|
@@ -1186,6 +1394,18 @@ export function registerWorkspaceTools(
|
|
|
1186
1394
|
);
|
|
1187
1395
|
};
|
|
1188
1396
|
|
|
1397
|
+
/**
|
|
1398
|
+
* The text a tmp source carries into the repository, for the preview only:
|
|
1399
|
+
* read as a repository source is read there — a file that cannot be read
|
|
1400
|
+
* carries no rules — so the preview never answers before the write
|
|
1401
|
+
* verdict. Whether the file is there at all is `statTmpFile`'s to say.
|
|
1402
|
+
*/
|
|
1403
|
+
const tmpSourceText = (branch: string, ctx: ToolContext, ref: string): Promise<string> =>
|
|
1404
|
+
ctx.workspaceService
|
|
1405
|
+
.readTmpFile(workspaceIdForBranch(branch), ctx.user.id, ref)
|
|
1406
|
+
.then((bytes) => bytes.toString('utf-8'))
|
|
1407
|
+
.catch(() => '');
|
|
1408
|
+
|
|
1189
1409
|
/**
|
|
1190
1410
|
* What `copy_file`'s dry run answers: the same impact shape `move_file`
|
|
1191
1411
|
* previews, over a copy's own rules.
|
|
@@ -1213,10 +1433,16 @@ export function registerWorkspaceTools(
|
|
|
1213
1433
|
* them nothing they could not ask `file_stat` for.
|
|
1214
1434
|
*/
|
|
1215
1435
|
const copyImpact = async (branch: string, ctx: ToolContext, src: string, dest: string) => {
|
|
1216
|
-
const
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1436
|
+
const fromTmp = isTmpRef(src);
|
|
1437
|
+
// The write verdict FIRST, and alone: a staged file's bytes are read only
|
|
1438
|
+
// for a caller who may write the destination. A denied preview carries
|
|
1439
|
+
// no rules from the source ('' — what an unreadable source carries), so
|
|
1440
|
+
// its `access.after` is the destination's own rules for the caller.
|
|
1441
|
+
const blocked = await writeBlocked(branch, ctx, [dest]);
|
|
1442
|
+
const sourceContent = fromTmp ? (blocked.length > 0 ? '' : await tmpSourceText(branch, ctx, src)) : undefined;
|
|
1443
|
+
const [before, after] = await Promise.all([
|
|
1444
|
+
fromTmp ? TMP_ACCESS : accessAt(branch, ctx, src),
|
|
1445
|
+
accessAfter(branch, ctx, src, dest, { sourceRemains: true, sourceContent }),
|
|
1220
1446
|
]);
|
|
1221
1447
|
const access = { before, after };
|
|
1222
1448
|
const accessChanges = verbsDiffer(before, after);
|
|
@@ -1233,7 +1459,11 @@ export function registerWorkspaceTools(
|
|
|
1233
1459
|
};
|
|
1234
1460
|
}
|
|
1235
1461
|
const fs = await ctx.getFilesystem(branch);
|
|
1236
|
-
|
|
1462
|
+
// A tmp ref names one file by rule: resolving it is the whole look, and
|
|
1463
|
+
// a folder or nothing there is refused by the resolver itself.
|
|
1464
|
+
const kind = fromTmp
|
|
1465
|
+
? (await orNotFound(src, () => ctx.workspaceService.statTmpFile(workspaceIdForBranch(branch), ctx.user.id, src), 'Nothing to copy'), 'file' as const)
|
|
1466
|
+
: await kindOf(fs, src);
|
|
1237
1467
|
if (kind === null) throw notFound(src, 'Nothing to copy');
|
|
1238
1468
|
const srcFiles = kind === 'folder' ? (await filesUnder(fs, src)).files : [src];
|
|
1239
1469
|
const occupiedBy = await existingAt(await workspaceRoot(branch, ctx), dest);
|
|
@@ -1258,6 +1488,40 @@ export function registerWorkspaceTools(
|
|
|
1258
1488
|
};
|
|
1259
1489
|
};
|
|
1260
1490
|
|
|
1491
|
+
/**
|
|
1492
|
+
* `copy_file` out of the workspace's tmp folder: the bytes the ref names
|
|
1493
|
+
* (through the one tmp resolver), landed at `dest` by the ordinary write —
|
|
1494
|
+
* the lock, the pre-disk validation, the creator's read grant for a new
|
|
1495
|
+
* folder and the commit every write to the repository takes — and
|
|
1496
|
+
* exclusively, so a name taken since the handler's look is refused with
|
|
1497
|
+
* the same sentence rather than replaced. From then on the copy is a
|
|
1498
|
+
* repository file like any other; the staged file is left where it was.
|
|
1499
|
+
*
|
|
1500
|
+
* A missing source is the ordinary 404 naming the ref, asked only after
|
|
1501
|
+
* the write verdict (as for any copy); an absence met while landing is the
|
|
1502
|
+
* destination's.
|
|
1503
|
+
*/
|
|
1504
|
+
const copyFromTmp = async (fs: LocalFilesystem, branch: string, ctx: ToolContext, src: string, dest: string): Promise<void> => {
|
|
1505
|
+
const bytes = await orNotFound(
|
|
1506
|
+
src,
|
|
1507
|
+
() => ctx.workspaceService.readTmpFile(workspaceIdForBranch(branch), ctx.user.id, src),
|
|
1508
|
+
'Nothing to copy',
|
|
1509
|
+
);
|
|
1510
|
+
try {
|
|
1511
|
+
// Exclusive, under the destination's lock: a name taken since the look
|
|
1512
|
+
// is refused there as `DestinationTakenError` — releasing the lock
|
|
1513
|
+
// untouched, so the winner's queued file stays — and answered as a
|
|
1514
|
+
// repository copy's lost race is (`asEntryExists`).
|
|
1515
|
+
await asEntryExists(() => fs.writeFile(dest, bytes, { overwrite: false }));
|
|
1516
|
+
} catch (err) {
|
|
1517
|
+
if (err instanceof ToolError) throw err;
|
|
1518
|
+
const occupiedBy = await existingAt(await workspaceRoot(branch, ctx), dest);
|
|
1519
|
+
if (occupiedBy !== null) throw new ToolError(entryExistsMessage(occupiedBy, dest), 409);
|
|
1520
|
+
if (isAbsence(err)) throw notFound(dest, 'Nowhere to copy to');
|
|
1521
|
+
throw err;
|
|
1522
|
+
}
|
|
1523
|
+
};
|
|
1524
|
+
|
|
1261
1525
|
/**
|
|
1262
1526
|
* The paths among `paths` the caller may NOT write, judged exactly as the
|
|
1263
1527
|
* lock gate judges them (`WorkflowService.acquireLock`): on a protected
|
|
@@ -1673,15 +1937,21 @@ export function registerWorkspaceTools(
|
|
|
1673
1937
|
// spill ref; for any other, `__tool_chain_spill__/x` is an ordinary
|
|
1674
1938
|
// path, and exempting it there would be a workspace-relative path that
|
|
1675
1939
|
// never reached the repository — the whole bug, spelled with a prefix.
|
|
1940
|
+
//
|
|
1941
|
+
// The other is a tmp ref (`__tmp__/…`), left as written in exactly the
|
|
1942
|
+
// inputs `TMP_REF_INPUTS` names and refused in every other one first,
|
|
1943
|
+
// so no tool sees one it does not resolve itself.
|
|
1676
1944
|
toolHandler(
|
|
1677
1945
|
async (args, ctx) => {
|
|
1678
1946
|
// BEFORE the normaliser: see `assertToolPathsNotGitInternals`.
|
|
1679
1947
|
if (spec.fileTool !== false) await assertToolPathsNotGitInternals(args, ctx);
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1683
|
-
spec.name
|
|
1684
|
-
|
|
1948
|
+
// The normaliser admits a tmp ref in exactly the inputs
|
|
1949
|
+
// `TMP_REF_INPUTS` names and refuses it in every other one first.
|
|
1950
|
+
const normalized = normalizePathArgs(args, kbDirName, {
|
|
1951
|
+
tool: spec.name,
|
|
1952
|
+
tmpRefInputs: TMP_REF_INPUTS[spec.name],
|
|
1953
|
+
skip: spec.name === 'read_file' ? (v) => spillStore.isSpillRef(v) : undefined,
|
|
1954
|
+
});
|
|
1685
1955
|
// The checkout's own name is reserved at the repository root on this
|
|
1686
1956
|
// surface too. The routes meet that rule inside `WorkspaceService`;
|
|
1687
1957
|
// these tools write through the locking filesystem, which never
|
|
@@ -1849,6 +2119,63 @@ export function registerWorkspaceTools(
|
|
|
1849
2119
|
*/
|
|
1850
2120
|
const readForTool: ReadForTool = async (branch, p, ctx) => (await readServed(branch, p, ctx)).result;
|
|
1851
2121
|
|
|
2122
|
+
/**
|
|
2123
|
+
* What a tmp ref (see `workspace-tmp.ts`) reads as: the bytes of the one
|
|
2124
|
+
* file it names in the CALLER's own folder of the branch workspace's `tmp/`
|
|
2125
|
+
* — through `readTmpFile`, the resolver a distribution's tool reads it with
|
|
2126
|
+
* — put through the SAME reader a repository file of that name gets. No
|
|
2127
|
+
* access gate and no read hook: the folder is outside the repository, so
|
|
2128
|
+
* no rule governs it and no knowledge-base path is read; what keeps one
|
|
2129
|
+
* person's staged file from another is that the ref resolves inside the
|
|
2130
|
+
* caller's folder alone. A missing file — somebody else's included — is the
|
|
2131
|
+
* ordinary 404, naming the ref.
|
|
2132
|
+
*/
|
|
2133
|
+
const readTmp = async (branch: string, ref: string, ctx: ToolContext): Promise<ReadResult> => {
|
|
2134
|
+
const workspaceId = workspaceIdForBranch(branch);
|
|
2135
|
+
const bytes = await orNotFound(ref, () => ctx.workspaceService.readTmpFile(workspaceId, ctx.user.id, ref));
|
|
2136
|
+
return readers.readerFor(ref).read(bytes, ref, { workspaceId });
|
|
2137
|
+
};
|
|
2138
|
+
|
|
2139
|
+
/**
|
|
2140
|
+
* `file_stat` on a tmp ref: the shape a repository file's stat has, its
|
|
2141
|
+
* content fields decided by the same reader as {@link readTmp} reads with —
|
|
2142
|
+
* and nothing to DO with it but read and copy out. Not written, moved,
|
|
2143
|
+
* deleted or downloaded through these tools (`managed` is false: the
|
|
2144
|
+
* platform's own files are a repository notion), and so not text-editable
|
|
2145
|
+
* either, whatever its content.
|
|
2146
|
+
*/
|
|
2147
|
+
const statTmp = async (branch: string, ref: string, ctx: ToolContext): Promise<Record<string, unknown>> => {
|
|
2148
|
+
const workspaceId = workspaceIdForBranch(branch);
|
|
2149
|
+
const stat = await orNotFound(ref, () => ctx.workspaceService.statTmpFile(workspaceId, ctx.user.id, ref));
|
|
2150
|
+
const reader = readers.readerFor(ref);
|
|
2151
|
+
// One read of the file at most: the type decision and the remembered
|
|
2152
|
+
// extraction below both want the bytes, and a staged document can be large.
|
|
2153
|
+
let bytes: Buffer | undefined;
|
|
2154
|
+
const bytesOf = async () =>
|
|
2155
|
+
(bytes ??= await orNotFound(ref, () => ctx.workspaceService.readTmpFile(workspaceId, ctx.user.id, ref)));
|
|
2156
|
+
const type = fileTypeOf(reader, ref, needsContent(reader) ? await bytesOf() : undefined);
|
|
2157
|
+
const out = {
|
|
2158
|
+
...stat,
|
|
2159
|
+
path: ref,
|
|
2160
|
+
type: 'file',
|
|
2161
|
+
managed: false,
|
|
2162
|
+
movable: false,
|
|
2163
|
+
deletable: false,
|
|
2164
|
+
access: TMP_ACCESS,
|
|
2165
|
+
canWrite: false,
|
|
2166
|
+
...type,
|
|
2167
|
+
textEditable: false,
|
|
2168
|
+
};
|
|
2169
|
+
// A document whose extraction failed answers that failure's notice, as a
|
|
2170
|
+
// repository document does: from what the cache remembers, never by
|
|
2171
|
+
// extracting.
|
|
2172
|
+
if (reader instanceof DocumentReader) {
|
|
2173
|
+
const remembered = await reader.cachedRead(await bytesOf(), ref);
|
|
2174
|
+
if (remembered?.kind === 'refusal') return { ...out, unreadable: remembered.message };
|
|
2175
|
+
}
|
|
2176
|
+
return out;
|
|
2177
|
+
};
|
|
2178
|
+
|
|
1852
2179
|
/**
|
|
1853
2180
|
* {@link readForTool}, also saying, at the guide's name, whether a file of
|
|
1854
2181
|
* the knowledge base's own answered first on THIS branch (`guide`: `own`)
|
|
@@ -1878,7 +2205,7 @@ export function registerWorkspaceTools(
|
|
|
1878
2205
|
// the access gate and the read hook above — a document read is still a
|
|
1879
2206
|
// KB read. ONE registry dispatch picks the reader by extension.
|
|
1880
2207
|
const bytes = await orNotFound(p, async () => asBytes(await fs.readFile(p)));
|
|
1881
|
-
return { result: await readers.readerFor(p).read(bytes, p), guide: null };
|
|
2208
|
+
return { result: await readers.readerFor(p).read(bytes, p, { workspaceId: workspaceIdForBranch(branch) }), guide: null };
|
|
1882
2209
|
};
|
|
1883
2210
|
|
|
1884
2211
|
/**
|
|
@@ -1915,7 +2242,7 @@ export function registerWorkspaceTools(
|
|
|
1915
2242
|
type: 'object',
|
|
1916
2243
|
properties: {
|
|
1917
2244
|
branch: BRANCH_INPUT,
|
|
1918
|
-
path: str(`Path to read, under \`${kbDirName}/\` (e.g. \`${kbDirName}/KnowledgeBase/Foo.md\`), with or without a leading slash — a path without that prefix is placed under \`${kbDirName}/\` — or a \`__tool_chain_spill__/…\` ref from a truncated \`call_tool_chain
|
|
2245
|
+
path: str(`Path to read, under \`${kbDirName}/\` (e.g. \`${kbDirName}/KnowledgeBase/Foo.md\`), with or without a leading slash — a path without that prefix is placed under \`${kbDirName}/\` — or a \`__tool_chain_spill__/…\` ref from a truncated \`call_tool_chain\`, or a \`__tmp__/…\` ref to a file you staged in the workspace's tmp folder.`),
|
|
1919
2246
|
offset: int('Start character index (default 0).'),
|
|
1920
2247
|
limit: int('Max characters to return from `offset`.'),
|
|
1921
2248
|
sessionId: SESSION_ID_INPUT,
|
|
@@ -1952,7 +2279,11 @@ export function registerWorkspaceTools(
|
|
|
1952
2279
|
: content;
|
|
1953
2280
|
};
|
|
1954
2281
|
const branch = a.branch as string;
|
|
1955
|
-
|
|
2282
|
+
// A tmp ref is no repository path, so the `canWrite` below is false for
|
|
2283
|
+
// it by the same rule as for any path outside the repository.
|
|
2284
|
+
const { result, guide } = isTmpRef(p)
|
|
2285
|
+
? { result: await readTmp(branch, p, ctx), guide: null }
|
|
2286
|
+
: await readServed(branch, p, ctx);
|
|
1956
2287
|
// Judged after the read, so a path the caller may not read is refused
|
|
1957
2288
|
// before anything is said about writing it. At the guide's name this
|
|
1958
2289
|
// answers for the knowledge base's own file there, as `file_stat` does:
|
|
@@ -2166,7 +2497,7 @@ export function registerWorkspaceTools(
|
|
|
2166
2497
|
type: 'object',
|
|
2167
2498
|
properties: {
|
|
2168
2499
|
branch: BRANCH_INPUT,
|
|
2169
|
-
path: wsPath(kbDirName, 'Path'),
|
|
2500
|
+
path: orTmpRef(wsPath(kbDirName, 'Path')),
|
|
2170
2501
|
explainAccess: {
|
|
2171
2502
|
type: 'boolean',
|
|
2172
2503
|
description:
|
|
@@ -2228,6 +2559,7 @@ export function registerWorkspaceTools(
|
|
|
2228
2559
|
description: 'Files only: where `mime` came from. `fallback` means no type was detected.',
|
|
2229
2560
|
},
|
|
2230
2561
|
textEditable: { type: 'boolean', description: 'Files only: whether write_file/write_files/edit_file accept this file as it is now.' },
|
|
2562
|
+
unreadable: str('Documents only, and only when its text could not be extracted: the one-line notice read_file answers for it.'),
|
|
2231
2563
|
mimeNote: str('Present when `mimeSource` is `fallback`: says the MIME type is a fallback, not a detected type.'),
|
|
2232
2564
|
platformGuide: {
|
|
2233
2565
|
type: 'boolean',
|
|
@@ -2242,6 +2574,7 @@ export function registerWorkspaceTools(
|
|
|
2242
2574
|
handler: async (a, ctx: ToolContext) => {
|
|
2243
2575
|
const p = a.path as string;
|
|
2244
2576
|
const branch = a.branch as string;
|
|
2577
|
+
if (isTmpRef(p)) return statTmp(branch, p, ctx);
|
|
2245
2578
|
// The guide's name with no file of the knowledge base's own under it —
|
|
2246
2579
|
// or one the caller may not read, or a copy of the guide an earlier
|
|
2247
2580
|
// release wrote, none of which `read_file` serves: what a read answers
|
|
@@ -2382,7 +2715,16 @@ export function registerWorkspaceTools(
|
|
|
2382
2715
|
const bytes = needsContent(reader)
|
|
2383
2716
|
? await orNotFound(p, async () => asBytes(await fs.readFile(p)))
|
|
2384
2717
|
: undefined;
|
|
2385
|
-
|
|
2718
|
+
// A document whose extraction failed answers that failure's notice here
|
|
2719
|
+
// too, from what the cache remembers — never by extracting, so stat
|
|
2720
|
+
// stays as cheap as it was. The notice quotes the parser, so only a
|
|
2721
|
+
// caller who may read the file hears it.
|
|
2722
|
+
const type = fileTypeOf(reader, p, bytes);
|
|
2723
|
+
if (reader instanceof DocumentReader && verdicts.read) {
|
|
2724
|
+
const remembered = await reader.cachedRead(await orNotFound(p, async () => asBytes(await fs.readFile(p))), p);
|
|
2725
|
+
if (remembered?.kind === 'refusal') return { ...out, ...type, unreadable: remembered.message };
|
|
2726
|
+
}
|
|
2727
|
+
return { ...out, ...type };
|
|
2386
2728
|
},
|
|
2387
2729
|
});
|
|
2388
2730
|
|
|
@@ -2394,13 +2736,14 @@ export function registerWorkspaceTools(
|
|
|
2394
2736
|
name: 'grep',
|
|
2395
2737
|
gated: true,
|
|
2396
2738
|
description:
|
|
2397
|
-
|
|
2739
|
+
`Regex search across the workspace. ${PATTERN_DIALECT} Covers hidden and git-ignored files. ` +
|
|
2740
|
+
'Returns `{ matches: [{ path, line, text }] }`, capped, in path then line order. `path` may name a DIRECTORY (its subtree) or a single FILE; a path with nothing at it is an error. Searches INSIDE Office/OpenDocument, PDF and email files (.eml/.msg) via their extracted text — matches carry the extraction\'s line numbers, and the `[slide N]`/`[sheet: Name]`/`[page N]`/`[from]`/`[subject]` marker lines locate them; a bounded number of not-yet-extracted documents is extracted per call; the result notes the rest (re-run to cover them).',
|
|
2398
2741
|
inputs: {
|
|
2399
2742
|
type: 'object',
|
|
2400
2743
|
properties: {
|
|
2401
2744
|
branch: BRANCH_INPUT,
|
|
2402
|
-
pattern: str('
|
|
2403
|
-
path: str(`Subtree to search, or a single file to search on its own, with or without a leading slash — a path without the \`${kbDirName}/\` prefix is placed under \`${kbDirName}/\` (default: the whole repository, \`${kbDirName}/\`).`),
|
|
2745
|
+
pattern: str('Regular expression, RE2-style (ripgrep): no look-around, no backreferences.'),
|
|
2746
|
+
path: str(`Subtree to search, or a single file to search on its own, with or without a leading slash — a path without the \`${kbDirName}/\` prefix is placed under \`${kbDirName}/\` (default: the whole repository, \`${kbDirName}/\`) — or a \`__tmp__/…\` ref to one staged file.`),
|
|
2404
2747
|
ignore_case: { type: 'boolean', description: 'Case-insensitive match.' },
|
|
2405
2748
|
max_results: { type: 'integer', minimum: 1, maximum: 1000, description: 'Cap on matches (default 200).' },
|
|
2406
2749
|
sessionId: SESSION_ID_INPUT,
|
|
@@ -2427,9 +2770,14 @@ export function registerWorkspaceTools(
|
|
|
2427
2770
|
},
|
|
2428
2771
|
write: false,
|
|
2429
2772
|
handler: async (a, ctx: ToolContext) => {
|
|
2430
|
-
// The caller's pattern never
|
|
2431
|
-
//
|
|
2432
|
-
|
|
2773
|
+
// The caller's pattern runs in ripgrep, never on the request thread
|
|
2774
|
+
// (see IPatternMatcher); one the engine refuses is answered here,
|
|
2775
|
+
// before anything is searched. A caller that goes away takes the
|
|
2776
|
+
// search's runs with it.
|
|
2777
|
+
const search = await patterns.search(a.pattern as string, {
|
|
2778
|
+
ignoreCase: Boolean(a.ignore_case),
|
|
2779
|
+
signal: ctx.abortSignal,
|
|
2780
|
+
});
|
|
2433
2781
|
// No path means the whole REPOSITORY, not the workspace directory above
|
|
2434
2782
|
// it. The workspace root also holds whatever an older build left beside
|
|
2435
2783
|
// the checkout, and the read gate has no rules for a path outside the
|
|
@@ -2443,15 +2791,25 @@ export function registerWorkspaceTools(
|
|
|
2443
2791
|
const searchRoot = typeof a.path === 'string' && a.path.length > 0 ? a.path : kbDirName;
|
|
2444
2792
|
const fs = await ctx.getFilesystem(a.branch as string);
|
|
2445
2793
|
const gate = readGateFor(a.branch as string, ctx);
|
|
2446
|
-
const out:
|
|
2794
|
+
const out: GrepMatch[] = [];
|
|
2447
2795
|
const max = typeof a.max_results === 'number' ? Math.min(a.max_results, 1000) : 200;
|
|
2448
|
-
const docs: DocGrepState = {
|
|
2796
|
+
const docs: DocGrepState = {
|
|
2797
|
+
readers,
|
|
2798
|
+
origin: { workspaceId: workspaceIdForBranch(a.branch as string) },
|
|
2799
|
+
uncachedBudget: UNCACHED_DOCS_PER_GREP,
|
|
2800
|
+
skippedUncached: 0,
|
|
2801
|
+
};
|
|
2449
2802
|
// The empty root is the workspace itself — always a directory, and never
|
|
2450
2803
|
// worth a stat.
|
|
2451
2804
|
// A placeholder named on its own is searched as what it is to every
|
|
2452
2805
|
// other tool: nothing.
|
|
2453
|
-
|
|
2454
|
-
|
|
2806
|
+
// A tmp ref names one file by rule (see `workspace-tmp.ts`), so it is
|
|
2807
|
+
// searched as a single file — never walked, and outside the repository
|
|
2808
|
+
// there is no read gate or read hook for it, as for `read_file`.
|
|
2809
|
+
const tmp = isTmpRef(searchRoot);
|
|
2810
|
+
const kind = tmp
|
|
2811
|
+
? 'file'
|
|
2812
|
+
: searchRoot === ''
|
|
2455
2813
|
? 'directory'
|
|
2456
2814
|
: isFolderPlaceholder(searchRoot)
|
|
2457
2815
|
? 'missing'
|
|
@@ -2477,42 +2835,25 @@ export function registerWorkspaceTools(
|
|
|
2477
2835
|
// The guide's own path is not told here, because `guideAt` tells the
|
|
2478
2836
|
// hook of the organisation's file there exactly as `read_file` does
|
|
2479
2837
|
// (after the gate), and the platform's guide alone is nobody's file to
|
|
2480
|
-
// note. Each file the
|
|
2481
|
-
//
|
|
2482
|
-
|
|
2838
|
+
// note. Each file the search opens goes to the hook per file below,
|
|
2839
|
+
// before it is opened and whether or not a line of it is answered
|
|
2840
|
+
// (`grepTree`'s admission), so a hook sees every file a grep reads
|
|
2841
|
+
// rather than only its root, and may refuse one as it refuses a
|
|
2842
|
+
// read_file. A tmp ref is no repository content, so there is nothing
|
|
2843
|
+
// to tell.
|
|
2844
|
+
if (!tmp && !(coversGuide && kind !== 'directory')) {
|
|
2483
2845
|
await notifyAgentRead(agentAccessGate, ctx, a.branch as string, searchRoot);
|
|
2484
2846
|
}
|
|
2847
|
+
const notifyRead = (p: string): Promise<void> => notifyAgentRead(agentAccessGate, ctx, a.branch as string, p);
|
|
2485
2848
|
if (coversGuide) {
|
|
2486
2849
|
if (kind === 'directory') {
|
|
2487
|
-
await
|
|
2488
|
-
fs,
|
|
2489
|
-
searchRoot,
|
|
2490
|
-
matcher,
|
|
2491
|
-
out,
|
|
2492
|
-
max,
|
|
2493
|
-
0,
|
|
2494
|
-
gate,
|
|
2495
|
-
(p) => notifyAgentRead(agentAccessGate, ctx, a.branch as string, p),
|
|
2496
|
-
docs,
|
|
2497
|
-
(p) => p === guidePath,
|
|
2498
|
-
);
|
|
2499
|
-
}
|
|
2500
|
-
const lines = (await guideAt(a.branch as string, ctx, guidePath)).split('\n');
|
|
2501
|
-
for (const i of await matcher.matchingLines(lines, max - out.length)) {
|
|
2502
|
-
out.push({ path: guidePath, line: i + 1, text: lines[i]!.slice(0, 300) });
|
|
2850
|
+
out.push(...(await grepTree(fs, searchRoot, search, max, gate, notifyRead, docs, (p) => p === guidePath)));
|
|
2503
2851
|
}
|
|
2852
|
+
const guide = await guideAt(a.branch as string, ctx, guidePath);
|
|
2853
|
+
const [hits] = await search.matchingLines([guide]);
|
|
2854
|
+
pushMatches(out, guidePath, guide, hits!);
|
|
2504
2855
|
} else if (kind === 'directory') {
|
|
2505
|
-
await
|
|
2506
|
-
fs,
|
|
2507
|
-
searchRoot,
|
|
2508
|
-
matcher,
|
|
2509
|
-
out,
|
|
2510
|
-
max,
|
|
2511
|
-
0,
|
|
2512
|
-
gate,
|
|
2513
|
-
(p) => notifyAgentRead(agentAccessGate, ctx, a.branch as string, p),
|
|
2514
|
-
docs,
|
|
2515
|
-
);
|
|
2856
|
+
out.push(...(await grepTree(fs, searchRoot, search, max, gate, notifyRead, docs)));
|
|
2516
2857
|
} else {
|
|
2517
2858
|
// Not a directory: the permission verdict comes BEFORE every other
|
|
2518
2859
|
// one, and it is `read_file`'s own gate on the same path — so grep
|
|
@@ -2522,15 +2863,28 @@ export function registerWorkspaceTools(
|
|
|
2522
2863
|
// gets the 403, never the filesystem's complaint about it.
|
|
2523
2864
|
await assertCanRead(gate, searchRoot);
|
|
2524
2865
|
if (kind === 'missing') throw notFound(searchRoot, 'Nothing to search');
|
|
2525
|
-
// A named FILE is searched
|
|
2526
|
-
//
|
|
2527
|
-
//
|
|
2528
|
-
|
|
2529
|
-
|
|
2530
|
-
|
|
2531
|
-
|
|
2532
|
-
|
|
2533
|
-
|
|
2866
|
+
// A named text FILE is searched as a tree search searches it: by
|
|
2867
|
+
// ripgrep, from its folder, so it answers the same lines either way
|
|
2868
|
+
// (the valid UTF-8 lines of a file holding some that are not, and
|
|
2869
|
+
// nothing from one ripgrep finds binary). Any other file, and any
|
|
2870
|
+
// path that is not a regular file, is read through its reader,
|
|
2871
|
+
// exactly as read_file reads it, its text searched by the same
|
|
2872
|
+
// engine: a tree search would find nothing to walk and answer an
|
|
2873
|
+
// empty match list, which the caller cannot tell from "the pattern
|
|
2874
|
+
// is not in this file". A tmp ref is not in the checkout ripgrep
|
|
2875
|
+
// searches, so it is always read through its reader, its bytes from
|
|
2876
|
+
// the tmp resolver.
|
|
2877
|
+
const bytesOf = tmp
|
|
2878
|
+
? (ref: string) => ctx.workspaceService.readTmpFile(docs.origin.workspaceId, ctx.user.id, ref)
|
|
2879
|
+
: fileBytes(fs);
|
|
2880
|
+
const found =
|
|
2881
|
+
(!tmp && readers.readerFor(searchRoot) instanceof TextReader
|
|
2882
|
+
? await grepTextFile(fs, searchRoot, search, max, out)
|
|
2883
|
+
: null) ?? (await orNotFound(searchRoot, () => searchableText(bytesOf, searchRoot, docs), 'Nothing to search'));
|
|
2884
|
+
if (found.kind === 'text') {
|
|
2885
|
+
const [hits] = await search.matchingLines([found.text]);
|
|
2886
|
+
pushMatches(out, searchRoot, found.text, hits!);
|
|
2887
|
+
} else if (found.kind === 'no-text') {
|
|
2534
2888
|
fileNote =
|
|
2535
2889
|
`"${displayPath(searchRoot)}" has no searchable text — it is an image, binary content, or a document ` +
|
|
2536
2890
|
'whose text could not be extracted. There were no matches because there was nothing to search, not ' +
|
|
@@ -2544,8 +2898,11 @@ export function registerWorkspaceTools(
|
|
|
2544
2898
|
`extracted and this call's extraction budget (${UNCACHED_DOCS_PER_GREP}) ran out. Re-run the ` +
|
|
2545
2899
|
'same grep to extract and search the next batch.'
|
|
2546
2900
|
: undefined);
|
|
2901
|
+
// One order whatever found the lines, then the cap: the first
|
|
2902
|
+
// `max_results` by path, then line.
|
|
2903
|
+
out.sort((x, y) => compareSearchPaths(x.path, y.path) || x.line - y.line);
|
|
2547
2904
|
return {
|
|
2548
|
-
matches: out,
|
|
2905
|
+
matches: out.slice(0, max),
|
|
2549
2906
|
truncated: out.length >= max,
|
|
2550
2907
|
...(note !== undefined ? { note } : {}),
|
|
2551
2908
|
};
|
|
@@ -3383,14 +3740,14 @@ export function registerWorkspaceTools(
|
|
|
3383
3740
|
name: 'copy_file',
|
|
3384
3741
|
gated: true,
|
|
3385
3742
|
description:
|
|
3386
|
-
'Copy a workspace FILE to a new path. The destination must not exist — like a move, a copy never overwrites a file or a folder; to change what is in a file that already exists, write it. Committed + pushed as you. ' +
|
|
3743
|
+
'Copy a workspace FILE to a new path. The destination must not exist — like a move, a copy never overwrites a file or a folder; to change what is in a file that already exists, write it. Committed + pushed as you. `src` may be a `__tmp__/<path>` ref to a file you staged in the workspace\'s tmp folder: the copy is how such a file is kept, as a normal repository file. ' +
|
|
3387
3744
|
'Preflight first: `dryRun: true` changes nothing and answers `{ src, dest, kind, descendants, access: { before, after }, accessChanges, allowed, reason? }` — `access` is your own `{ read, write, download, owner }` at the source and at the destination AS IT WILL BE once the copy has landed, with every `access.md` inside a copied folder counted at its new place. ' +
|
|
3388
3745
|
'One exception to that shape: when the destination is one you may not write, the answer is the refusal alone — `allowed: false` with `reason`, and no `kind` and no `descendants`, because nothing about the source is read before that verdict.',
|
|
3389
3746
|
inputs: {
|
|
3390
3747
|
type: 'object',
|
|
3391
3748
|
properties: {
|
|
3392
3749
|
branch: BRANCH_INPUT,
|
|
3393
|
-
src: wsPath(kbDirName, 'Source path'),
|
|
3750
|
+
src: orTmpRef(wsPath(kbDirName, 'Source path')),
|
|
3394
3751
|
dest: wsPath(kbDirName, 'Destination path — must not exist yet'),
|
|
3395
3752
|
dryRun: { type: 'boolean', description: 'Answer with the impact and change nothing.' },
|
|
3396
3753
|
sessionId: SESSION_ID_INPUT,
|
|
@@ -3418,11 +3775,14 @@ export function registerWorkspaceTools(
|
|
|
3418
3775
|
proposable: true,
|
|
3419
3776
|
handler: async (a, ctx: ToolContext) => {
|
|
3420
3777
|
// A copy CARRIES the source content into the destination, so BOTH ends
|
|
3421
|
-
// go to the write hook. Ask about both before touching disk.
|
|
3422
|
-
|
|
3778
|
+
// go to the write hook. Ask about both before touching disk. A tmp ref
|
|
3779
|
+
// is not a knowledge-base path, so only the destination is one to ask
|
|
3780
|
+
// about when the copy is out of the workspace's tmp folder.
|
|
3781
|
+
const fromTmp = isTmpRef(a.src);
|
|
3782
|
+
if (!fromTmp) writePolicy.assertPathWritable(ctx.sessionId, a.src as string);
|
|
3423
3783
|
writePolicy.assertPathWritable(ctx.sessionId, a.dest as string);
|
|
3424
3784
|
const branch = a.branch as string;
|
|
3425
|
-
await assertAgentWriteAllowed(agentAccessGate, ctx, branch, a.src as string);
|
|
3785
|
+
if (!fromTmp) await assertAgentWriteAllowed(agentAccessGate, ctx, branch, a.src as string);
|
|
3426
3786
|
await assertAgentWriteAllowed(agentAccessGate, ctx, branch, a.dest as string);
|
|
3427
3787
|
const src = a.src as string;
|
|
3428
3788
|
const dest = a.dest as string;
|
|
@@ -3469,6 +3829,10 @@ export function registerWorkspaceTools(
|
|
|
3469
3829
|
// the server's own absolute path. Anything that is not absence travels
|
|
3470
3830
|
// on as it always did.
|
|
3471
3831
|
const fs = await ctx.getFilesystem(branch);
|
|
3832
|
+
if (fromTmp) {
|
|
3833
|
+
await copyFromTmp(fs, branch, ctx, src, dest);
|
|
3834
|
+
return { src, dest, copied: true };
|
|
3835
|
+
}
|
|
3472
3836
|
try {
|
|
3473
3837
|
await asEntryExists(() => fs.copyFile(src, dest));
|
|
3474
3838
|
} catch (err) {
|