@capybara-hq/kernel 0.1.0-rc.1 → 0.1.0-rc.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/admin.controller.d.ts +17 -17
- package/dist/admin/admin.controller.js +43 -26
- package/dist/admin/admin.module.d.ts +3 -0
- package/dist/admin/admin.module.js +22 -0
- package/dist/admin/extensions.controller.d.ts +14 -14
- package/dist/admin/extensions.controller.js +30 -17
- package/dist/admin/setup-lock.d.ts +16 -0
- package/dist/admin/setup-lock.js +47 -0
- package/dist/admin/setup.controller.d.ts +8 -8
- package/dist/admin/setup.controller.js +27 -25
- package/dist/admin/setup.service.d.ts +19 -27
- package/dist/admin/setup.service.js +61 -61
- package/dist/agents/agent-lookup.d.ts +53 -0
- package/dist/agents/agent-lookup.js +187 -0
- package/dist/agents/agents.controller.d.ts +1 -1
- package/dist/agents/agents.controller.js +14 -8
- package/dist/agents/agents.module.d.ts +7 -0
- package/dist/agents/agents.module.js +41 -0
- package/dist/agents/agents.service.d.ts +39 -58
- package/dist/agents/agents.service.js +280 -335
- package/dist/agents/definition.d.ts +39 -8
- package/dist/agents/definition.js +201 -17
- package/dist/agents/models.controller.d.ts +1 -1
- package/dist/agents/models.controller.js +2 -2
- package/dist/agents/templates.controller.d.ts +1 -1
- package/dist/agents/templates.controller.js +2 -2
- package/dist/agents/templates.d.ts +6 -8
- package/dist/agents/templates.js +39 -8
- package/dist/app.d.ts +93 -0
- package/dist/app.js +150 -0
- package/dist/catalog/admin-catalog.controller.d.ts +3 -3
- package/dist/catalog/admin-catalog.controller.js +27 -13
- package/dist/catalog/catalog-content.d.ts +185 -0
- package/dist/catalog/catalog-content.js +326 -0
- package/dist/catalog/catalog-items.d.ts +186 -0
- package/dist/catalog/catalog-items.js +410 -0
- package/dist/catalog/catalog.module.d.ts +14 -0
- package/dist/catalog/catalog.module.js +71 -0
- package/dist/catalog/catalog.service.d.ts +34 -188
- package/dist/catalog/catalog.service.js +155 -489
- package/dist/catalog/claude/agents.js +13 -10
- package/dist/catalog/cli.d.ts +3 -2
- package/dist/catalog/cli.js +13 -31
- package/dist/catalog/job-ids.d.ts +15 -0
- package/dist/catalog/job-ids.js +15 -0
- package/dist/catalog/jobs.d.ts +27 -0
- package/dist/catalog/jobs.js +70 -0
- package/dist/catalog/locks.d.ts +24 -0
- package/dist/catalog/locks.js +63 -0
- package/dist/catalog/marketplaces.controller.d.ts +4 -4
- package/dist/catalog/marketplaces.controller.js +22 -11
- package/dist/catalog/marketplaces.service.d.ts +31 -14
- package/dist/catalog/marketplaces.service.js +330 -256
- package/dist/catalog/org-catalog.controller.d.ts +4 -3
- package/dist/catalog/org-catalog.controller.js +29 -14
- package/dist/catalog/org-catalog.service.d.ts +32 -198
- package/dist/catalog/org-catalog.service.js +159 -400
- package/dist/catalog/plugin-import.d.ts +73 -34
- package/dist/catalog/plugin-import.js +356 -217
- package/dist/catalog/plugin-install.d.ts +83 -41
- package/dist/catalog/plugin-install.js +421 -269
- package/dist/catalog/plugin-upgrade.d.ts +59 -4
- package/dist/catalog/plugin-upgrade.js +407 -282
- package/dist/catalog/requests.service.d.ts +27 -15
- package/dist/catalog/requests.service.js +201 -145
- package/dist/catalog/upgrade-targets.d.ts +4 -7
- package/dist/channels/actions.d.ts +6 -4
- package/dist/channels/actions.js +1 -1
- package/dist/channels/cards.d.ts +10 -4
- package/dist/channels/cards.js +16 -8
- package/dist/channels/channels.module.d.ts +40 -0
- package/dist/channels/channels.module.js +128 -0
- package/dist/channels/connections.controller.d.ts +1 -1
- package/dist/channels/connections.controller.js +11 -6
- package/dist/channels/connections.service.d.ts +43 -21
- package/dist/channels/connections.service.js +236 -131
- package/dist/channels/inbound.d.ts +34 -38
- package/dist/channels/inbound.js +107 -41
- package/dist/channels/job-ids.d.ts +10 -0
- package/dist/channels/job-ids.js +10 -0
- package/dist/channels/jobs.d.ts +85 -0
- package/dist/channels/jobs.js +157 -0
- package/dist/channels/outbound.d.ts +60 -82
- package/dist/channels/outbound.js +165 -194
- package/dist/channels/supervisor.d.ts +88 -46
- package/dist/channels/supervisor.js +230 -132
- package/dist/channels/threads.d.ts +29 -8
- package/dist/channels/threads.js +71 -13
- package/dist/channels/webhook.d.ts +20 -14
- package/dist/channels/webhook.js +51 -20
- package/dist/config/load.d.ts +3 -2
- package/dist/config/load.js +3 -2
- package/dist/config/nacos-source.js +11 -2
- package/dist/config/schema.d.ts +1 -0
- package/dist/config/schema.js +12 -6
- package/dist/conversations/access.d.ts +29 -0
- package/dist/conversations/access.js +86 -0
- package/dist/conversations/artifacts.d.ts +11 -11
- package/dist/conversations/artifacts.js +36 -10
- package/dist/conversations/attachments.controller.d.ts +1 -1
- package/dist/conversations/attachments.controller.js +8 -6
- package/dist/conversations/attachments.module.d.ts +7 -0
- package/dist/conversations/attachments.module.js +25 -0
- package/dist/conversations/attachments.service.d.ts +30 -22
- package/dist/conversations/attachments.service.js +119 -46
- package/dist/conversations/conversations.controller.d.ts +8 -7
- package/dist/conversations/conversations.controller.js +59 -29
- package/dist/conversations/conversations.module.d.ts +8 -0
- package/dist/conversations/conversations.module.js +69 -0
- package/dist/conversations/conversations.service.d.ts +40 -38
- package/dist/conversations/conversations.service.js +130 -140
- package/dist/conversations/event-log.d.ts +39 -18
- package/dist/conversations/event-log.js +93 -27
- package/dist/conversations/events.d.ts +23 -3
- package/dist/conversations/events.js +26 -14
- package/dist/conversations/files.d.ts +10 -10
- package/dist/conversations/files.js +37 -11
- package/dist/conversations/idem-keys.d.ts +5 -0
- package/dist/conversations/idem-keys.js +5 -0
- package/dist/conversations/job-ids.d.ts +6 -0
- package/dist/conversations/job-ids.js +6 -0
- package/dist/conversations/outputs-read.d.ts +11 -11
- package/dist/conversations/outputs-read.js +31 -7
- package/dist/conversations/queue.d.ts +48 -56
- package/dist/conversations/queue.js +13 -289
- package/dist/conversations/queue.service.d.ts +60 -0
- package/dist/conversations/queue.service.js +343 -0
- package/dist/conversations/sandbox-status.d.ts +13 -10
- package/dist/conversations/sandbox-status.js +36 -8
- package/dist/conversations/titles.d.ts +71 -24
- package/dist/conversations/titles.js +159 -63
- package/dist/ctx/bus.js +9 -3
- package/dist/ctx/create-ctx.d.ts +6 -0
- package/dist/ctx/create-ctx.js +7 -9
- package/dist/ctx/lock.d.ts +7 -3
- package/dist/ctx/lock.js +9 -20
- package/dist/ctx/secrets.d.ts +10 -2
- package/dist/ctx/secrets.js +7 -3
- package/dist/db/kernel-schema.d.ts +4 -4
- package/dist/db/pool.d.ts +5 -0
- package/dist/db/pool.js +1 -0
- package/dist/errors.d.ts +1 -0
- package/dist/errors.js +1 -0
- package/dist/evals/budget.d.ts +42 -21
- package/dist/evals/budget.js +114 -62
- package/dist/evals/evals.module.d.ts +31 -0
- package/dist/evals/evals.module.js +114 -0
- package/dist/evals/jobs.d.ts +20 -0
- package/dist/evals/jobs.js +45 -0
- package/dist/evals/recorded-tools.d.ts +27 -1
- package/dist/evals/recorded-tools.js +85 -10
- package/dist/evals/run-replay.d.ts +61 -8
- package/dist/evals/run-replay.js +159 -85
- package/dist/evals/runs.controller.d.ts +1 -1
- package/dist/evals/runs.controller.js +17 -8
- package/dist/evals/runs.service.d.ts +23 -45
- package/dist/evals/runs.service.js +245 -234
- package/dist/evals/sets.controller.d.ts +1 -1
- package/dist/evals/sets.controller.js +17 -8
- package/dist/evals/sets.service.d.ts +22 -6
- package/dist/evals/sets.service.js +248 -194
- package/dist/evals/snapshot.d.ts +2 -2
- package/dist/evals/step-replay.d.ts +2 -2
- package/dist/evals/step-replay.js +1 -1
- package/dist/evals/trajectory.controller.d.ts +1 -1
- package/dist/evals/trajectory.controller.js +11 -7
- package/dist/evals/trajectory.d.ts +2 -2
- package/dist/evals/trajectory.service.d.ts +5 -4
- package/dist/evals/trajectory.service.js +30 -7
- package/dist/evals/worker.d.ts +44 -27
- package/dist/evals/worker.js +220 -121
- package/dist/extensions/admin-ops.d.ts +61 -33
- package/dist/extensions/admin-ops.js +248 -154
- package/dist/extensions/admin-view.d.ts +38 -27
- package/dist/extensions/admin-view.js +126 -55
- package/dist/extensions/approvals.d.ts +12 -8
- package/dist/extensions/approvals.js +73 -46
- package/dist/extensions/blobs.d.ts +27 -10
- package/dist/extensions/blobs.js +111 -45
- package/dist/extensions/bootstrap.d.ts +58 -31
- package/dist/extensions/bootstrap.js +175 -121
- package/dist/extensions/cli.d.ts +20 -10
- package/dist/extensions/cli.js +41 -96
- package/dist/extensions/config-issues.d.ts +7 -0
- package/dist/extensions/config-issues.js +31 -0
- package/dist/extensions/deployment-config-store.d.ts +49 -0
- package/dist/extensions/deployment-config-store.js +133 -0
- package/dist/extensions/deployment-config.d.ts +58 -67
- package/dist/extensions/deployment-config.js +202 -230
- package/dist/extensions/enabled.d.ts +5 -5
- package/dist/extensions/extensions.module.d.ts +8 -0
- package/dist/extensions/extensions.module.js +77 -0
- package/dist/extensions/hooks.d.ts +3 -2
- package/dist/extensions/hooks.js +1 -1
- package/dist/extensions/host.d.ts +72 -68
- package/dist/extensions/host.js +191 -152
- package/dist/extensions/installs.d.ts +49 -16
- package/dist/extensions/installs.js +128 -32
- package/dist/extensions/job-ids.d.ts +6 -0
- package/dist/extensions/job-ids.js +6 -0
- package/dist/extensions/lifecycle-topics.d.ts +18 -0
- package/dist/extensions/lifecycle-topics.js +18 -0
- package/dist/extensions/lifecycle.d.ts +35 -47
- package/dist/extensions/lifecycle.js +103 -39
- package/dist/extensions/locks.d.ts +33 -0
- package/dist/extensions/locks.js +86 -0
- package/dist/extensions/migrate-lock.d.ts +3 -4
- package/dist/extensions/org-config.controller.d.ts +1 -1
- package/dist/extensions/org-config.controller.js +8 -5
- package/dist/extensions/org-config.d.ts +48 -46
- package/dist/extensions/org-config.js +284 -226
- package/dist/extensions/registry.d.ts +50 -2
- package/dist/extensions/registry.js +89 -4
- package/dist/extensions/sources.d.ts +12 -8
- package/dist/extensions/sources.js +34 -13
- package/dist/files/files.module.d.ts +3 -0
- package/dist/files/files.module.js +22 -0
- package/dist/files/previewers.controller.d.ts +7 -2
- package/dist/files/previewers.controller.js +17 -9
- package/dist/files/previewers.d.ts +13 -18
- package/dist/files/previewers.js +83 -36
- package/dist/http/adapter.d.ts +3 -0
- package/dist/http/adapter.js +25 -0
- package/dist/http/api.module.d.ts +3 -110
- package/dist/http/api.module.js +47 -355
- package/dist/http/app.d.ts +11 -15
- package/dist/http/app.js +17 -62
- package/dist/http/error-filter.module.d.ts +5 -0
- package/dist/http/error-filter.module.js +18 -0
- package/dist/http/error.filter.js +2 -2
- package/dist/identity/accounts.d.ts +82 -29
- package/dist/identity/accounts.js +294 -175
- package/dist/identity/api-tokens.d.ts +11 -7
- package/dist/identity/api-tokens.js +71 -44
- package/dist/identity/audit.d.ts +7 -4
- package/dist/identity/audit.js +5 -1
- package/dist/identity/auth.controller.d.ts +11 -10
- package/dist/identity/auth.controller.js +31 -25
- package/dist/identity/auth.guard.d.ts +3 -3
- package/dist/identity/auth.guard.js +6 -4
- package/dist/identity/binding.d.ts +9 -11
- package/dist/identity/binding.js +41 -13
- package/dist/identity/enterprise-admin.d.ts +18 -12
- package/dist/identity/enterprise-admin.js +67 -13
- package/dist/identity/external-identity-lock.d.ts +17 -0
- package/dist/identity/external-identity-lock.js +39 -0
- package/dist/identity/external.d.ts +19 -15
- package/dist/identity/external.js +163 -125
- package/dist/identity/identity.module.d.ts +6 -0
- package/dist/identity/identity.module.js +56 -0
- package/dist/identity/me.controller.d.ts +16 -15
- package/dist/identity/me.controller.js +37 -31
- package/dist/identity/sessions.d.ts +12 -10
- package/dist/identity/sessions.js +74 -42
- package/dist/identity/settings.d.ts +20 -14
- package/dist/identity/settings.js +86 -58
- package/dist/identity/sso.controller.d.ts +7 -7
- package/dist/identity/sso.controller.js +13 -9
- package/dist/identity/sso.d.ts +9 -12
- package/dist/identity/sso.js +54 -24
- package/dist/inbox/inbox.module.d.ts +3 -0
- package/dist/inbox/inbox.module.js +22 -0
- package/dist/inbox/inbox.service.d.ts +7 -9
- package/dist/inbox/inbox.service.js +32 -11
- package/dist/index.d.ts +16 -11
- package/dist/index.js +9 -6
- package/dist/infra/cache/cache.module.d.ts +3 -0
- package/dist/infra/cache/cache.module.js +16 -0
- package/dist/infra/cache/cache.service.d.ts +21 -0
- package/dist/infra/cache/cache.service.js +80 -0
- package/dist/infra/cache/cacheable.decorator.d.ts +32 -0
- package/dist/infra/cache/cacheable.decorator.js +83 -0
- package/dist/infra/cli/kernel-cli.module.d.ts +66 -0
- package/dist/infra/cli/kernel-cli.module.js +165 -0
- package/dist/infra/close-within.d.ts +15 -0
- package/dist/infra/close-within.js +36 -0
- package/dist/infra/config/config.module.d.ts +13 -0
- package/dist/infra/config/config.module.js +39 -0
- package/dist/infra/config/kernel-config.service.d.ts +25 -0
- package/dist/infra/config/kernel-config.service.js +126 -0
- package/dist/infra/database/after-commit.d.ts +6 -0
- package/dist/infra/database/after-commit.js +9 -0
- package/dist/infra/database/database.module.d.ts +25 -0
- package/dist/infra/database/database.module.js +90 -0
- package/dist/infra/database/kernel-db.d.ts +22 -0
- package/dist/infra/database/kernel-db.js +65 -0
- package/dist/infra/database/transaction-host.d.ts +50 -0
- package/dist/infra/database/transaction-host.js +125 -0
- package/dist/infra/database/transactional.decorator.d.ts +15 -0
- package/dist/infra/database/transactional.decorator.js +27 -0
- package/dist/infra/database/xact-lock.d.ts +17 -0
- package/dist/infra/database/xact-lock.js +43 -0
- package/dist/infra/events/kernel-events.d.ts +96 -0
- package/dist/infra/events/kernel-events.js +65 -0
- package/dist/infra/health/health.controller.d.ts +26 -0
- package/dist/infra/health/health.controller.js +104 -0
- package/dist/infra/health/health.module.d.ts +9 -0
- package/dist/infra/health/health.module.js +24 -0
- package/dist/infra/health/health.options.d.ts +10 -0
- package/dist/infra/health/health.options.js +15 -0
- package/dist/infra/health/shutdown-state.d.ts +6 -0
- package/dist/infra/health/shutdown-state.js +2 -0
- package/dist/infra/lifecycle/graceful-shutdown.module.d.ts +6 -0
- package/dist/infra/lifecycle/graceful-shutdown.module.js +23 -0
- package/dist/infra/lifecycle/graceful-shutdown.service.d.ts +70 -0
- package/dist/infra/lifecycle/graceful-shutdown.service.js +135 -0
- package/dist/infra/lifecycle/process-guards.d.ts +52 -0
- package/dist/infra/lifecycle/process-guards.js +86 -0
- package/dist/infra/lifecycle/shutdown-signals.d.ts +30 -0
- package/dist/infra/lifecycle/shutdown-signals.js +48 -0
- package/dist/infra/lock/key-template.d.ts +13 -0
- package/dist/infra/lock/key-template.js +46 -0
- package/dist/infra/lock/lock.module.d.ts +3 -0
- package/dist/infra/lock/lock.module.js +16 -0
- package/dist/infra/lock/lock.service.d.ts +120 -0
- package/dist/infra/lock/lock.service.js +343 -0
- package/dist/infra/lock/shared-lease.d.ts +44 -0
- package/dist/infra/lock/shared-lease.js +121 -0
- package/dist/infra/lock/with-lock.decorator.d.ts +28 -0
- package/dist/infra/lock/with-lock.decorator.js +49 -0
- package/dist/infra/logging/logging.module.d.ts +16 -0
- package/dist/infra/logging/logging.module.js +34 -0
- package/dist/infra/queue/configured-processor.d.ts +18 -0
- package/dist/infra/queue/configured-processor.js +23 -0
- package/dist/infra/queue/job-failure.d.ts +18 -0
- package/dist/infra/queue/job-failure.js +26 -0
- package/dist/infra/queue/queue-shutdown.d.ts +27 -0
- package/dist/infra/queue/queue-shutdown.js +81 -0
- package/dist/infra/queue/queue.module.d.ts +16 -0
- package/dist/infra/queue/queue.module.js +61 -0
- package/dist/infra/queue/redis-connection.d.ts +7 -0
- package/dist/infra/queue/redis-connection.js +18 -0
- package/dist/infra/queue/retired-schedulers.d.ts +7 -0
- package/dist/infra/queue/retired-schedulers.js +9 -0
- package/dist/infra/queue/run-job.d.ts +16 -0
- package/dist/infra/queue/run-job.js +19 -0
- package/dist/infra/redis/redis.module.d.ts +24 -0
- package/dist/infra/redis/redis.module.js +87 -0
- package/dist/infra/schedule/cron-tick.d.ts +12 -0
- package/dist/infra/schedule/cron-tick.js +25 -0
- package/dist/infra/schedule/locked-cron.decorator.d.ts +27 -0
- package/dist/infra/schedule/locked-cron.decorator.js +53 -0
- package/dist/infra/schedule/locked-interval.d.ts +69 -0
- package/dist/infra/schedule/locked-interval.js +190 -0
- package/dist/infra/schedule/locked-tick.d.ts +90 -0
- package/dist/infra/schedule/locked-tick.js +137 -0
- package/dist/infra/schedule/schedule.module.d.ts +8 -0
- package/dist/infra/schedule/schedule.module.js +27 -0
- package/dist/infra/schedule/scheduled-runs.d.ts +69 -0
- package/dist/infra/schedule/scheduled-runs.js +163 -0
- package/dist/infra/swagger/swagger.d.ts +16 -0
- package/dist/infra/swagger/swagger.js +31 -0
- package/dist/infra/throttler/credential-throttler.d.ts +35 -0
- package/dist/infra/throttler/credential-throttler.js +77 -0
- package/dist/infra/throttler/named-throttlers.d.ts +31 -0
- package/dist/infra/throttler/named-throttlers.js +119 -0
- package/dist/infra/throttler/redis-throttler-storage.d.ts +38 -0
- package/dist/infra/throttler/redis-throttler-storage.js +130 -0
- package/dist/infra/throttler/throttler.guard.d.ts +23 -0
- package/dist/infra/throttler/throttler.guard.js +68 -0
- package/dist/infra/throttler/throttler.module.d.ts +15 -0
- package/dist/infra/throttler/throttler.module.js +53 -0
- package/dist/infra/tokens.d.ts +15 -0
- package/dist/infra/tokens.js +15 -0
- package/dist/infra/validation/create-zod-dto.d.ts +23 -0
- package/dist/infra/validation/create-zod-dto.js +35 -0
- package/dist/infra/validation/parse-with-zod.d.ts +7 -0
- package/dist/infra/validation/parse-with-zod.js +12 -0
- package/dist/infra/validation/validation.module.d.ts +3 -0
- package/dist/infra/validation/validation.module.js +16 -0
- package/dist/infra/validation/zod-params.d.ts +7 -0
- package/dist/infra/validation/zod-params.js +42 -0
- package/dist/infra/validation/zod-validation.pipe.d.ts +11 -0
- package/dist/infra/validation/zod-validation.pipe.js +31 -0
- package/dist/kernel.d.ts +9 -244
- package/dist/kernel.js +8 -1305
- package/dist/kernel.module.d.ts +17 -0
- package/dist/kernel.module.js +136 -0
- package/dist/lifecycle/kernel-lifecycle.d.ts +140 -0
- package/dist/lifecycle/kernel-lifecycle.js +456 -0
- package/dist/lifecycle/tokens.d.ts +3 -0
- package/dist/lifecycle/tokens.js +3 -0
- package/dist/log-context.d.ts +2 -0
- package/dist/log-context.js +4 -0
- package/dist/models/models.module.d.ts +3 -0
- package/dist/models/models.module.js +24 -0
- package/dist/models/prices.d.ts +8 -2
- package/dist/models/prices.js +65 -37
- package/dist/models/purposes.controller.d.ts +1 -1
- package/dist/models/purposes.controller.js +5 -6
- package/dist/models/purposes.d.ts +35 -13
- package/dist/models/purposes.js +101 -51
- package/dist/orgs/directory-sync.controller.d.ts +1 -1
- package/dist/orgs/directory-sync.controller.js +2 -2
- package/dist/orgs/directory-sync.d.ts +61 -31
- package/dist/orgs/directory-sync.js +212 -125
- package/dist/orgs/invitations.controller.d.ts +8 -8
- package/dist/orgs/invitations.controller.js +27 -26
- package/dist/orgs/invitations.service.d.ts +12 -9
- package/dist/orgs/invitations.service.js +130 -92
- package/dist/orgs/job-ids.d.ts +8 -0
- package/dist/orgs/job-ids.js +8 -0
- package/dist/orgs/members.service.d.ts +19 -12
- package/dist/orgs/members.service.js +161 -117
- package/dist/orgs/offboarding.d.ts +54 -57
- package/dist/orgs/offboarding.js +161 -71
- package/dist/orgs/org-lock.d.ts +28 -19
- package/dist/orgs/org-lock.js +81 -35
- package/dist/orgs/org.guard.d.ts +1 -1
- package/dist/orgs/org.guard.js +2 -2
- package/dist/orgs/orgs.controller.d.ts +13 -13
- package/dist/orgs/orgs.controller.js +29 -17
- package/dist/orgs/orgs.module.d.ts +6 -0
- package/dist/orgs/orgs.module.js +68 -0
- package/dist/orgs/orgs.service.d.ts +30 -19
- package/dist/orgs/orgs.service.js +139 -86
- package/dist/orgs/settings.controller.d.ts +1 -1
- package/dist/orgs/settings.controller.js +8 -6
- package/dist/orgs/settings.service.d.ts +16 -10
- package/dist/orgs/settings.service.js +77 -48
- package/dist/overrides.d.ts +56 -0
- package/dist/overrides.js +30 -0
- package/dist/roles/gateway-role.d.ts +43 -0
- package/dist/roles/gateway-role.js +98 -0
- package/dist/roles/gateway.module.d.ts +8 -0
- package/dist/roles/gateway.module.js +28 -0
- package/dist/roles/worker-role.d.ts +63 -0
- package/dist/roles/worker-role.js +144 -0
- package/dist/roles/worker.module.d.ts +14 -0
- package/dist/roles/worker.module.js +90 -0
- package/dist/runtime/abort.js +19 -2
- package/dist/runtime/checkpointer.d.ts +8 -3
- package/dist/runtime/checkpointer.js +87 -55
- package/dist/runtime/context/build.d.ts +6 -6
- package/dist/runtime/context/build.js +18 -8
- package/dist/runtime/context/claude-tools.d.ts +2 -1
- package/dist/runtime/context/claude-tools.js +9 -10
- package/dist/runtime/context/legacy-text.d.ts +22 -0
- package/dist/runtime/context/legacy-text.js +37 -0
- package/dist/runtime/context/skills.d.ts +29 -11
- package/dist/runtime/context/skills.js +37 -30
- package/dist/runtime/conversation-lock.d.ts +20 -11
- package/dist/runtime/conversation-lock.js +62 -72
- package/dist/runtime/hook-calls.d.ts +3 -3
- package/dist/runtime/hook-calls.js +1 -6
- package/dist/runtime/job-ids.d.ts +10 -0
- package/dist/runtime/job-ids.js +10 -0
- package/dist/runtime/langgraph-loop.js +1 -1
- package/dist/runtime/loop.d.ts +8 -1
- package/dist/runtime/loop.js +14 -0
- package/dist/runtime/maintenance-queue.d.ts +10 -0
- package/dist/runtime/maintenance-queue.js +10 -0
- package/dist/runtime/maintenance.d.ts +45 -74
- package/dist/runtime/maintenance.js +139 -137
- package/dist/runtime/model-call.d.ts +7 -4
- package/dist/runtime/model-call.js +25 -58
- package/dist/runtime/providers.d.ts +17 -6
- package/dist/runtime/providers.js +66 -25
- package/dist/runtime/quota.d.ts +17 -3
- package/dist/runtime/quota.js +27 -2
- package/dist/runtime/retired-schedulers.d.ts +7 -0
- package/dist/runtime/retired-schedulers.js +31 -0
- package/dist/runtime/run-control.d.ts +33 -0
- package/dist/runtime/run-control.js +77 -0
- package/dist/runtime/run-finish.d.ts +27 -18
- package/dist/runtime/run-finish.js +98 -51
- package/dist/runtime/run-jobs.d.ts +48 -0
- package/dist/runtime/run-jobs.js +95 -0
- package/dist/runtime/run-processors.d.ts +60 -0
- package/dist/runtime/run-processors.js +185 -0
- package/dist/runtime/run-queue.d.ts +32 -57
- package/dist/runtime/run-queue.js +291 -295
- package/dist/runtime/run-steps.d.ts +39 -0
- package/dist/runtime/run-steps.js +96 -0
- package/dist/runtime/run-worker.d.ts +122 -76
- package/dist/runtime/run-worker.js +343 -229
- package/dist/runtime/runtime.module.d.ts +10 -0
- package/dist/runtime/runtime.module.js +112 -0
- package/dist/runtime/step-log.d.ts +40 -0
- package/dist/runtime/step-log.js +94 -0
- package/dist/runtime/stream.controller.d.ts +5 -8
- package/dist/runtime/stream.controller.js +14 -12
- package/dist/runtime/stream.d.ts +24 -6
- package/dist/runtime/stream.js +78 -7
- package/dist/runtime/subagents/child.d.ts +3 -44
- package/dist/runtime/subagents/child.js +0 -79
- package/dist/runtime/subagents/definition.d.ts +5 -10
- package/dist/runtime/subagents/definition.js +13 -14
- package/dist/runtime/subagents/dispatch.d.ts +89 -8
- package/dist/runtime/subagents/dispatch.js +137 -142
- package/dist/runtime/subagents/limits.d.ts +9 -4
- package/dist/runtime/subagents/limits.js +4 -2
- package/dist/runtime/subagents/org-agents.d.ts +4 -4
- package/dist/runtime/subagents/org-agents.js +3 -2
- package/dist/runtime/subagents/progress.d.ts +2 -2
- package/dist/runtime/subagents/roster.d.ts +4 -4
- package/dist/runtime/subagents/roster.js +2 -2
- package/dist/runtime/subagents/skill-fork.d.ts +8 -9
- package/dist/runtime/subagents/skill-fork.js +17 -6
- package/dist/runtime/subagents/subagents.service.d.ts +40 -0
- package/dist/runtime/subagents/subagents.service.js +101 -0
- package/dist/runtime/usage-report.d.ts +94 -52
- package/dist/runtime/usage-report.js +200 -100
- package/dist/runtime/waits.d.ts +127 -59
- package/dist/runtime/waits.js +433 -210
- package/dist/sandbox/job-ids.d.ts +10 -0
- package/dist/sandbox/job-ids.js +10 -0
- package/dist/sandbox/jobs.d.ts +41 -0
- package/dist/sandbox/jobs.js +113 -0
- package/dist/sandbox/leases.d.ts +39 -31
- package/dist/sandbox/leases.js +117 -257
- package/dist/sandbox/providers.d.ts +19 -0
- package/dist/sandbox/providers.js +38 -0
- package/dist/sandbox/sandbox.module.d.ts +8 -0
- package/dist/sandbox/sandbox.module.js +30 -0
- package/dist/sandbox/sandbox.service.d.ts +24 -29
- package/dist/sandbox/sandbox.service.js +106 -75
- package/dist/skills/catalog.d.ts +37 -24
- package/dist/skills/catalog.js +100 -57
- package/dist/skills/changes.controller.d.ts +4 -4
- package/dist/skills/changes.controller.js +15 -9
- package/dist/skills/changes.service.d.ts +30 -20
- package/dist/skills/changes.service.js +425 -367
- package/dist/skills/invocable.controller.d.ts +1 -1
- package/dist/skills/invocable.controller.js +8 -5
- package/dist/skills/invocation-keys.d.ts +1 -1
- package/dist/skills/invocation-keys.js +1 -1
- package/dist/skills/invoke.d.ts +17 -16
- package/dist/skills/invoke.js +53 -21
- package/dist/skills/skills.controller.d.ts +1 -1
- package/dist/skills/skills.controller.js +11 -6
- package/dist/skills/skills.module.d.ts +6 -0
- package/dist/skills/skills.module.js +30 -0
- package/dist/skills/skills.service.d.ts +47 -30
- package/dist/skills/skills.service.js +221 -158
- package/dist/storage/job-ids.d.ts +6 -0
- package/dist/storage/job-ids.js +6 -0
- package/dist/storage/purge.d.ts +22 -7
- package/dist/storage/purge.js +55 -3
- package/dist/storage/storage.module.d.ts +6 -0
- package/dist/storage/storage.module.js +23 -0
- package/dist/storage/storage.service.d.ts +18 -4
- package/dist/storage/storage.service.js +44 -3
- package/dist/tools/approvals.controller.d.ts +1 -1
- package/dist/tools/approvals.controller.js +12 -8
- package/dist/tools/approvals.service.d.ts +33 -25
- package/dist/tools/approvals.service.js +343 -259
- package/dist/tools/breaker.d.ts +2 -2
- package/dist/tools/breaker.js +21 -3
- package/dist/tools/builtin-names.d.ts +73 -0
- package/dist/tools/builtin-names.js +116 -0
- package/dist/tools/builtins/agent.d.ts +7 -7
- package/dist/tools/builtins/agent.js +7 -11
- package/dist/tools/builtins/ask-user.d.ts +3 -3
- package/dist/tools/builtins/ask-user.js +3 -3
- package/dist/tools/builtins/builtin-tools.d.ts +21 -0
- package/dist/tools/builtins/builtin-tools.js +80 -0
- package/dist/tools/builtins/read-tool-output.d.ts +3 -3
- package/dist/tools/builtins/read-tool-output.js +3 -3
- package/dist/tools/builtins/sandbox/bash.d.ts +5 -5
- package/dist/tools/builtins/sandbox/bash.js +33 -30
- package/dist/tools/builtins/sandbox/common.d.ts +5 -4
- package/dist/tools/builtins/sandbox/common.js +2 -2
- package/dist/tools/builtins/sandbox/deliver.d.ts +1 -1
- package/dist/tools/builtins/sandbox/deliver.js +13 -13
- package/dist/tools/builtins/sandbox/edit.d.ts +1 -1
- package/dist/tools/builtins/sandbox/edit.js +42 -31
- package/dist/tools/builtins/sandbox/file-state.d.ts +34 -0
- package/dist/tools/builtins/sandbox/file-state.js +34 -0
- package/dist/tools/builtins/sandbox/glob-match.d.ts +1 -1
- package/dist/tools/builtins/sandbox/glob-match.js +1 -1
- package/dist/tools/builtins/sandbox/glob.d.ts +1 -1
- package/dist/tools/builtins/sandbox/glob.js +6 -6
- package/dist/tools/builtins/sandbox/grep.d.ts +7 -4
- package/dist/tools/builtins/sandbox/grep.js +149 -32
- package/dist/tools/builtins/sandbox/index.d.ts +1 -1
- package/dist/tools/builtins/sandbox/index.js +1 -1
- package/dist/tools/builtins/sandbox/read.d.ts +2 -2
- package/dist/tools/builtins/sandbox/read.js +22 -15
- package/dist/tools/builtins/sandbox/write.d.ts +1 -1
- package/dist/tools/builtins/sandbox/write.js +38 -34
- package/dist/tools/builtins/skill-load.d.ts +6 -6
- package/dist/tools/builtins/skill-load.js +33 -17
- package/dist/tools/builtins/skill-write.d.ts +4 -4
- package/dist/tools/builtins/skill-write.js +10 -10
- package/dist/tools/builtins/tool-search.d.ts +13 -9
- package/dist/tools/builtins/tool-search.js +25 -14
- package/dist/tools/canonical-json.d.ts +6 -0
- package/dist/tools/canonical-json.js +16 -0
- package/dist/tools/connector-content.controller.d.ts +1 -1
- package/dist/tools/connector-content.controller.js +11 -6
- package/dist/tools/connector-content.d.ts +12 -15
- package/dist/tools/connector-content.js +53 -18
- package/dist/tools/connectors.controller.d.ts +1 -1
- package/dist/tools/connectors.controller.js +21 -10
- package/dist/tools/connectors.service.d.ts +31 -13
- package/dist/tools/connectors.service.js +438 -348
- package/dist/tools/credentials.d.ts +17 -20
- package/dist/tools/credentials.js +55 -34
- package/dist/tools/display-names.d.ts +9 -0
- package/dist/tools/display-names.js +24 -0
- package/dist/tools/drift.d.ts +29 -41
- package/dist/tools/drift.js +116 -84
- package/dist/tools/elicitation.js +1 -1
- package/dist/tools/info.d.ts +32 -13
- package/dist/tools/info.js +88 -39
- package/dist/tools/job-ids.d.ts +13 -0
- package/dist/tools/job-ids.js +15 -0
- package/dist/tools/jobs.d.ts +24 -0
- package/dist/tools/jobs.js +69 -0
- package/dist/tools/legacy-data.d.ts +34 -0
- package/dist/tools/legacy-data.js +76 -0
- package/dist/tools/legacy-keys.d.ts +51 -0
- package/dist/tools/legacy-keys.js +115 -0
- package/dist/tools/naming.d.ts +1 -5
- package/dist/tools/naming.js +1 -7
- package/dist/tools/oauth/flow-paths.d.ts +16 -0
- package/dist/tools/oauth/flow-paths.js +38 -0
- package/dist/tools/oauth/flow.d.ts +30 -30
- package/dist/tools/oauth/flow.js +109 -81
- package/dist/tools/oauth/oauth.controller.d.ts +3 -3
- package/dist/tools/oauth/oauth.controller.js +12 -9
- package/dist/tools/oauth/tokens.d.ts +11 -3
- package/dist/tools/oauth/tokens.js +15 -14
- package/dist/tools/outputs.d.ts +13 -4
- package/dist/tools/outputs.js +48 -4
- package/dist/tools/pipeline.d.ts +72 -50
- package/dist/tools/pipeline.js +239 -100
- package/dist/tools/policy.d.ts +3 -16
- package/dist/tools/policy.js +13 -19
- package/dist/tools/questions.controller.d.ts +2 -2
- package/dist/tools/questions.controller.js +9 -6
- package/dist/tools/questions.service.d.ts +26 -25
- package/dist/tools/questions.service.js +201 -142
- package/dist/tools/registry.d.ts +43 -38
- package/dist/tools/registry.js +100 -72
- package/dist/tools/resources.d.ts +1 -1
- package/dist/tools/resources.js +1 -1
- package/dist/tools/specs.d.ts +5 -4
- package/dist/tools/specs.js +3 -1
- package/dist/tools/tools.module.d.ts +10 -0
- package/dist/tools/tools.module.js +91 -0
- package/dist/ui/call-extension.d.ts +16 -0
- package/dist/ui/call-extension.js +38 -0
- package/dist/ui/embed-token.d.ts +9 -5
- package/dist/ui/embed-token.js +34 -6
- package/dist/ui/ui-stream.d.ts +22 -17
- package/dist/ui/ui-stream.js +72 -12
- package/dist/ui/ui.module.d.ts +7 -0
- package/dist/ui/ui.module.js +28 -0
- package/dist/ui/views.controller.d.ts +14 -12
- package/dist/ui/views.controller.js +32 -25
- package/dist/ui/views.d.ts +9 -57
- package/dist/ui/views.js +43 -45
- package/package.json +10 -3
- package/src/migrations/0063_tool_keys_claude_code.sql +220 -0
- package/dist/http/health.controller.d.ts +0 -26
- package/dist/http/health.controller.js +0 -79
- package/dist/http/tokens.d.ts +0 -131
- package/dist/http/tokens.js +0 -131
- package/dist/http/zod.pipe.d.ts +0 -8
- package/dist/http/zod.pipe.js +0 -14
- package/dist/identity/rate-limit.d.ts +0 -55
- package/dist/identity/rate-limit.js +0 -121
- package/dist/sandbox/lifecycle.d.ts +0 -21
- package/dist/sandbox/lifecycle.js +0 -68
- package/dist/tools/builtins/sandbox/names.d.ts +0 -7
- package/dist/tools/builtins/sandbox/names.js +0 -20
- /package/dist/http/{gateway.module.d.ts → gateway-routes.d.ts} +0 -0
- /package/dist/http/{gateway.module.js → gateway-routes.js} +0 -0
|
@@ -1,15 +1,14 @@
|
|
|
1
|
-
import { ToolError } from "@capybara-hq/plugin-sdk";
|
|
2
1
|
import { clip, display, inSandbox, runBudgetNote, runTimeLeftMs, sandboxBaseTimeoutMs, unavailableWhenNoSandbox, withNotices, } from "./common.js";
|
|
3
|
-
/**
|
|
2
|
+
/** The command timeout in seconds when `timeout` is not given, at most `sandbox.limits.maxCommandSeconds`. */
|
|
4
3
|
export const BASH_DEFAULT_TIMEOUT_SECONDS = 120;
|
|
5
4
|
/** The longest `description` (the shell row shows it instead of the command). */
|
|
6
5
|
export const BASH_DESCRIPTION_MAX_CHARS = 120;
|
|
7
|
-
/** bash 结果超过这么多字符即转存(走现有输出存档,模型用
|
|
6
|
+
/** bash 结果超过这么多字符即转存(走现有输出存档,模型用 ReadToolOutput 分页读)。 */
|
|
8
7
|
export const BASH_SPILL_CHARS = 30_000;
|
|
9
8
|
/** 一次命令最多收集的输出字节(stdout + stderr);超出的丢弃并在结果里说明。 */
|
|
10
9
|
const MAX_OUTPUT_BYTES = 4 * 1024 * 1024;
|
|
11
10
|
const SPEC = {
|
|
12
|
-
name: "
|
|
11
|
+
name: "Bash",
|
|
13
12
|
// Display only (the tool row; not in the fingerprint, never sent to the model).
|
|
14
13
|
keyArgs: ["command"],
|
|
15
14
|
description: "Run a shell command (bash) in this conversation's sandbox, an isolated Linux machine. " +
|
|
@@ -20,10 +19,10 @@ const SPEC = {
|
|
|
20
19
|
"Files the user attached to the conversation are under /workspace/attachments, " +
|
|
21
20
|
"and skill files under /skills (read-only). Each call runs in a fresh shell (no state such as " +
|
|
22
21
|
"cd or environment variables carries over). The result has stdout, stderr and the exit code; " +
|
|
23
|
-
"long output is saved and can be paged with
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
22
|
+
"long output is saved and can be paged with ReadToolOutput. A command that runs longer than " +
|
|
23
|
+
"timeout milliseconds is stopped. Prefer Read, Write, Edit, Glob and " +
|
|
24
|
+
"Grep for reading, writing and searching files. To give a file to the user, use " +
|
|
25
|
+
"Deliver. Other sub-agents of this conversation may run commands in this sandbox at " +
|
|
27
26
|
"the same time. Always pass description: a few words saying what the command is for; the " +
|
|
28
27
|
"user sees it instead of the command.",
|
|
29
28
|
inputSchema: {
|
|
@@ -40,21 +39,21 @@ const SPEC = {
|
|
|
40
39
|
maxLength: BASH_DESCRIPTION_MAX_CHARS,
|
|
41
40
|
description: 'What this command does, in a few words (e.g. "Generate the final PDF"). Shown to the user.',
|
|
42
41
|
},
|
|
43
|
-
|
|
42
|
+
timeout: {
|
|
44
43
|
type: "integer",
|
|
45
44
|
minimum: 1,
|
|
46
|
-
description: `
|
|
45
|
+
description: `Milliseconds before the command is stopped. Default ${BASH_DEFAULT_TIMEOUT_SECONDS * 1000}; the deployment sets a maximum (7200000 by default); a larger value is lowered to it.`,
|
|
47
46
|
},
|
|
48
47
|
},
|
|
49
48
|
required: ["command", "description"],
|
|
50
49
|
additionalProperties: false,
|
|
51
50
|
},
|
|
52
51
|
};
|
|
53
|
-
/**
|
|
54
|
-
const
|
|
52
|
+
/** This command's timeout in milliseconds: the given value or the default, at most the maximum. */
|
|
53
|
+
const msFor = (input, maxSeconds) => Math.min(input.timeout ?? BASH_DEFAULT_TIMEOUT_SECONDS * 1000, maxSeconds * 1000);
|
|
55
54
|
/**
|
|
56
55
|
* 命令结果 → 给模型的文本。`budgetClamped`:运行的时限把超时收紧到了 `seconds`(Ruling M20),超时说明改为
|
|
57
|
-
* 指向 `runtime.maxRunSeconds`,而不是让模型加大
|
|
56
|
+
* 指向 `runtime.maxRunSeconds`,而不是让模型加大 timeout。
|
|
58
57
|
*/
|
|
59
58
|
export function formatExec(r, seconds, budgetClamped = false) {
|
|
60
59
|
const parts = [];
|
|
@@ -68,7 +67,7 @@ export function formatExec(r, seconds, budgetClamped = false) {
|
|
|
68
67
|
parts.push(`[timedOut: the command did not finish within ${seconds}s and was stopped. ${runBudgetNote(seconds)} The sandbox is still usable; split the work into shorter steps that save progress to files under /workspace, or run long jobs in the background and check on them in a later run.]`);
|
|
69
68
|
}
|
|
70
69
|
else if (r.timedOut) {
|
|
71
|
-
parts.push(`[timedOut: the command did not finish within ${seconds}s and was stopped. The sandbox is still usable; pass a larger
|
|
70
|
+
parts.push(`[timedOut: the command did not finish within ${seconds}s and was stopped. The sandbox is still usable; pass a larger timeout in milliseconds (up to the deployment maximum), or split the work into shorter steps that save progress to files under /workspace.]`);
|
|
72
71
|
}
|
|
73
72
|
else if (r.exitCode === null) {
|
|
74
73
|
parts.push("[The command was stopped before it finished; its effects may be partial. Check the sandbox state before retrying.]");
|
|
@@ -80,7 +79,7 @@ export function formatExec(r, seconds, budgetClamped = false) {
|
|
|
80
79
|
}
|
|
81
80
|
return parts.join("\n");
|
|
82
81
|
}
|
|
83
|
-
/** 内置工具 `
|
|
82
|
+
/** 内置工具 `Bash`:在本对话的沙箱里执行命令。 */
|
|
84
83
|
export function sandboxBashTool(deps) {
|
|
85
84
|
return {
|
|
86
85
|
spec: SPEC,
|
|
@@ -89,35 +88,39 @@ export function sandboxBashTool(deps) {
|
|
|
89
88
|
unavailable: unavailableWhenNoSandbox(deps),
|
|
90
89
|
// 命令自己的超时先到(提供方停掉命令、返回 timedOut),管线的时限再留出等锁与创建 / 恢复的余量
|
|
91
90
|
timeoutMs: (input) => {
|
|
92
|
-
const cfg = deps.config();
|
|
91
|
+
const cfg = deps.config.get();
|
|
93
92
|
const max = cfg.sandbox.limits.maxCommandSeconds;
|
|
94
|
-
return
|
|
93
|
+
return msFor(input, max) + sandboxBaseTimeoutMs(cfg);
|
|
95
94
|
},
|
|
96
95
|
async run(input, ctx) {
|
|
97
96
|
const { command, description } = input;
|
|
98
|
-
const max = deps.config().sandbox.limits.maxCommandSeconds;
|
|
99
|
-
const
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
let seconds = asked;
|
|
97
|
+
const max = deps.config.get().sandbox.limits.maxCommandSeconds;
|
|
98
|
+
const requested = input.timeout;
|
|
99
|
+
const maxMs = max * 1000;
|
|
100
|
+
const askedMs = msFor(input, max);
|
|
101
|
+
// The run's deadline makes the command time out itself first (Ruling M20): counted after the
|
|
102
|
+
// sandbox is obtained, so the time spent waiting for the lock and resuming is deducted
|
|
103
|
+
let ms = askedMs;
|
|
106
104
|
const { value: r, notices } = await inSandbox(deps, ctx, ({ h, p, signal }) => {
|
|
107
|
-
const left = Math.floor(runTimeLeftMs(ctx.runDeadline) / 1000);
|
|
108
|
-
|
|
105
|
+
const left = Math.floor(runTimeLeftMs(ctx.runDeadline) / 1000) * 1000;
|
|
106
|
+
ms = Math.max(1000, Math.min(askedMs, left));
|
|
109
107
|
return p.exec(h, {
|
|
110
108
|
command,
|
|
111
109
|
cwd: "/workspace",
|
|
112
|
-
timeoutMs:
|
|
110
|
+
timeoutMs: ms,
|
|
113
111
|
maxOutputBytes: MAX_OUTPUT_BYTES,
|
|
114
112
|
signal,
|
|
115
113
|
});
|
|
116
114
|
});
|
|
117
|
-
const
|
|
115
|
+
const seconds = ms / 1000;
|
|
116
|
+
const clamped = ms < askedMs;
|
|
118
117
|
const shown = clip(command, 120);
|
|
118
|
+
const lowered = requested !== undefined && requested > maxMs
|
|
119
|
+
? `\n[timeout ${requested} ms is over the deployment maximum; it was lowered to ${maxMs} ms.]`
|
|
120
|
+
: "";
|
|
121
|
+
const text = formatExec(r, seconds, clamped) + lowered;
|
|
119
122
|
return {
|
|
120
|
-
content: [{ type: "text", text: withNotices(notices,
|
|
123
|
+
content: [{ type: "text", text: withNotices(notices, text) }],
|
|
121
124
|
isError: r.timedOut || r.exitCode === null,
|
|
122
125
|
// display only: a non-zero exit shows as failed on the row, `isError` stays as it was
|
|
123
126
|
view: {
|
|
@@ -2,6 +2,7 @@ import { type SandboxHandle, type SandboxProvider } from "@capybara-hq/plugin-sd
|
|
|
2
2
|
import type { KernelConfig } from "../../../config/schema.js";
|
|
3
3
|
import type { AttachmentsService } from "../../../conversations/attachments.service.js";
|
|
4
4
|
import type { EventLog } from "../../../conversations/event-log.js";
|
|
5
|
+
import type { KernelConfigService } from "../../../infra/config/kernel-config.service.js";
|
|
5
6
|
import { type SandboxService } from "../../../sandbox/sandbox.service.js";
|
|
6
7
|
import type { StorageService } from "../../../storage/storage.service.js";
|
|
7
8
|
import type { BuiltinCallContext } from "../../registry.js";
|
|
@@ -11,9 +12,9 @@ export interface SandboxToolDeps {
|
|
|
11
12
|
sandbox: Pick<SandboxService, "available" | "withSandbox"> & Partial<Pick<SandboxService, "pathLease">>;
|
|
12
13
|
attachments: Pick<AttachmentsService, "listForConversation" | "openForConversation">;
|
|
13
14
|
storage: Pick<StorageService, "kernel" | "available">;
|
|
14
|
-
/** `publishChanged`: `
|
|
15
|
-
eventLog: Pick<EventLog, "append"> & Partial<Pick<EventLog, "publishChanged">>;
|
|
16
|
-
config:
|
|
15
|
+
/** `publishChanged`: `Deliver` announces `changed: files` (UI refresh B). */
|
|
16
|
+
eventLog: Pick<EventLog, "append" | "latestFileState"> & Partial<Pick<EventLog, "publishChanged">>;
|
|
17
|
+
config: Pick<KernelConfigService, "get">;
|
|
17
18
|
}
|
|
18
19
|
/** 回调拿到的沙箱:句柄、提供方与「调用 signal + 锁丢失」合并后的 signal(每个提供方调用都传它)。 */
|
|
19
20
|
export interface SandboxSession {
|
|
@@ -79,7 +80,7 @@ export declare function clip(s: string, max: number): string;
|
|
|
79
80
|
export declare function withNotices(notices: readonly string[], text: string): string;
|
|
80
81
|
/** 校验沙箱内路径(`validateSandboxPath`);不合法抛给模型可执行的错误。 */
|
|
81
82
|
export declare function checkPath(path: string, field?: string): string;
|
|
82
|
-
/**
|
|
83
|
+
/** A writing tool's `file_path`: `/skills` is the read-only copy of the skill files. */
|
|
83
84
|
export declare function checkWritable(path: string): string;
|
|
84
85
|
/** POSIX shell 单引号转义。 */
|
|
85
86
|
export declare function shellQuote(s: string): string;
|
|
@@ -78,9 +78,9 @@ export function checkPath(path, field = "path") {
|
|
|
78
78
|
}
|
|
79
79
|
return path.length > 1 && path.endsWith("/") ? path.slice(0, -1) : path;
|
|
80
80
|
}
|
|
81
|
-
/**
|
|
81
|
+
/** A writing tool's `file_path`: `/skills` is the read-only copy of the skill files. */
|
|
82
82
|
export function checkWritable(path) {
|
|
83
|
-
const p = checkPath(path);
|
|
83
|
+
const p = checkPath(path, "file_path");
|
|
84
84
|
if (p === "/skills" || p.startsWith("/skills/")) {
|
|
85
85
|
throw new ToolError(`Path ${clip(p, 200)} is read-only (/skills holds skill files); pass a path under /workspace or /tmp instead.`);
|
|
86
86
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { BuiltinTool } from "../../registry.js";
|
|
2
2
|
import { type SandboxToolDeps } from "./common.js";
|
|
3
3
|
export declare function contentTypeFor(name: string): string;
|
|
4
|
-
/** 内置工具 `
|
|
4
|
+
/** 内置工具 `Deliver`:把沙箱里的文件存进对象存储,写 `artifact_created`,用户可下载。 */
|
|
5
5
|
export declare function sandboxDeliverTool(deps: SandboxToolDeps): BuiltinTool;
|
|
@@ -4,18 +4,18 @@ import { isValidArtifactName } from "../../../conversations/events.js";
|
|
|
4
4
|
import { ApiError } from "../../../errors.js";
|
|
5
5
|
import { checkPath, clip, display, inSandbox, sandboxBaseTimeoutMs, unavailableWhenNoSandbox, withNotices, } from "./common.js";
|
|
6
6
|
const SPEC = {
|
|
7
|
-
name: "
|
|
7
|
+
name: "Deliver",
|
|
8
8
|
// Display only (the tool row; not in the fingerprint, never sent to the model).
|
|
9
|
-
keyArgs: ["
|
|
9
|
+
keyArgs: ["file_path"],
|
|
10
10
|
description: "Deliver a file from this conversation's sandbox to the user as a downloadable artifact. Use " +
|
|
11
11
|
"it when the user should receive a file you produced (a report, chart, spreadsheet, archive " +
|
|
12
12
|
"and so on); files that stay in the sandbox are not visible to the user. Delivers one file " +
|
|
13
|
-
"per call; archive a directory first (e.g.
|
|
13
|
+
"per call; archive a directory first (e.g. tar -czf with Bash). The file size is " +
|
|
14
14
|
"limited (100 MB by default). Do not use it for intermediate files the user does not need.",
|
|
15
15
|
inputSchema: {
|
|
16
16
|
type: "object",
|
|
17
17
|
properties: {
|
|
18
|
-
|
|
18
|
+
file_path: {
|
|
19
19
|
type: "string",
|
|
20
20
|
minLength: 1,
|
|
21
21
|
description: 'Absolute path of the file in the sandbox, e.g. "/workspace/out/report.pdf".',
|
|
@@ -24,10 +24,10 @@ const SPEC = {
|
|
|
24
24
|
type: "string",
|
|
25
25
|
minLength: 1,
|
|
26
26
|
maxLength: MEDIA_NAME_MAX_CHARS,
|
|
27
|
-
description: 'File name shown to the user, e.g. "Q3 report.pdf". Default: the file name in
|
|
27
|
+
description: 'File name shown to the user, e.g. "Q3 report.pdf". Default: the file name in file_path.',
|
|
28
28
|
},
|
|
29
29
|
},
|
|
30
|
-
required: ["
|
|
30
|
+
required: ["file_path"],
|
|
31
31
|
additionalProperties: false,
|
|
32
32
|
},
|
|
33
33
|
};
|
|
@@ -71,9 +71,9 @@ export function contentTypeFor(name) {
|
|
|
71
71
|
const ext = dot > 0 ? name.slice(dot + 1).toLowerCase() : "";
|
|
72
72
|
return CONTENT_TYPES[ext] ?? "application/octet-stream";
|
|
73
73
|
}
|
|
74
|
-
const notFound = (path) => `File not found: ${clip(path, 200)}. Check the path with
|
|
75
|
-
const isDirectory = (path) => `${clip(path, 200)} is a directory; deliver one file, e.g. archive the directory first with
|
|
76
|
-
const tooLarge = (path, size, max) => `File ${clip(path, 200)} is ${size} bytes, over the delivery limit of ${max} bytes; compress or split it with
|
|
74
|
+
const notFound = (path) => `File not found: ${clip(path, 200)}. Check the path with Glob.`;
|
|
75
|
+
const isDirectory = (path) => `${clip(path, 200)} is a directory; deliver one file, e.g. archive the directory first with Bash (tar -czf) and retry.`;
|
|
76
|
+
const tooLarge = (path, size, max) => `File ${clip(path, 200)} is ${size} bytes, over the delivery limit of ${max} bytes; compress or split it with Bash and retry.`;
|
|
77
77
|
const BAD_NAME = "name must not contain control characters, / or \\; pass a plain file name such as report.pdf.";
|
|
78
78
|
/** 默认产物名:路径的文件名部分,过长时保留末尾(扩展名)截到 255 个 UTF-16 单元以内。 */
|
|
79
79
|
function defaultName(path) {
|
|
@@ -90,26 +90,26 @@ function defaultName(path) {
|
|
|
90
90
|
const NO_STORAGE = "File storage is not configured in this deployment, so files cannot be delivered; ask an administrator, or provide the result in your reply instead.";
|
|
91
91
|
/** 「工具不可用」提醒里的原因(内核在后面补句号)。 */
|
|
92
92
|
const NO_STORAGE_REASON = NO_STORAGE.slice(0, -1);
|
|
93
|
-
/** 内置工具 `
|
|
93
|
+
/** 内置工具 `Deliver`:把沙箱里的文件存进对象存储,写 `artifact_created`,用户可下载。 */
|
|
94
94
|
export function sandboxDeliverTool(deps) {
|
|
95
95
|
return {
|
|
96
96
|
spec: SPEC,
|
|
97
97
|
defaultPolicy: "allow",
|
|
98
98
|
// 没有沙箱或没有对象存储都交付不了(先报沙箱的原因)
|
|
99
99
|
unavailable: () => unavailableWhenNoSandbox(deps)() ?? (deps.storage.available ? null : NO_STORAGE_REASON),
|
|
100
|
-
timeoutMs: () => 2 * sandboxBaseTimeoutMs(deps.config()),
|
|
100
|
+
timeoutMs: () => 2 * sandboxBaseTimeoutMs(deps.config.get()),
|
|
101
101
|
async run(input, ctx) {
|
|
102
102
|
// 存储在调用前就核对:不为一个交付不了的文件去 stat / 读沙箱
|
|
103
103
|
if (!deps.storage.available)
|
|
104
104
|
throw new ToolError(NO_STORAGE);
|
|
105
|
-
const path = checkPath(input.
|
|
105
|
+
const path = checkPath(input.file_path, "file_path");
|
|
106
106
|
const given = input.name?.trim();
|
|
107
107
|
// 与 artifact_created 的 schema 同一规则,在上传前检查(不合法的名字不会在写事件时才失败)
|
|
108
108
|
if (given !== undefined && (!isValidArtifactName(given) || /[/\\]/.test(given))) {
|
|
109
109
|
throw new ToolError(BAD_NAME);
|
|
110
110
|
}
|
|
111
111
|
const name = given ?? defaultName(path);
|
|
112
|
-
const max = deps.config().sandbox.deliverMaxBytes;
|
|
112
|
+
const max = deps.config.get().sandbox.deliverMaxBytes;
|
|
113
113
|
const { value: data, notices } = await inSandbox(deps, ctx, async ({ h, p, signal }) => {
|
|
114
114
|
const st = await p.stat(h, path, signal);
|
|
115
115
|
if (st === null)
|
|
@@ -1,40 +1,42 @@
|
|
|
1
1
|
import { ToolError } from "@capybara-hq/plugin-sdk";
|
|
2
2
|
import { lineDiff, viewPath } from "../../view.js";
|
|
3
3
|
import { checkWritable, clip, display, inSandbox, looksBinary, sandboxBaseTimeoutMs, unavailableWhenNoSandbox, withNotices, withPathLease, } from "./common.js";
|
|
4
|
-
|
|
4
|
+
import { assertReadAndUnchanged, fileStateOf, normalizeSandboxPath, recordedFile, } from "./file-state.js";
|
|
5
|
+
import { READ_MAX_BYTES } from "./read.js";
|
|
6
|
+
/** 可编辑的最大文件(字节):更大的用 Bash 处理。 */
|
|
5
7
|
const EDIT_MAX_BYTES = 10 * 1024 * 1024;
|
|
6
8
|
const SPEC = {
|
|
7
|
-
name: "
|
|
9
|
+
name: "Edit",
|
|
8
10
|
// Display only (the tool row; not in the fingerprint, never sent to the model).
|
|
9
|
-
keyArgs: ["
|
|
10
|
-
description: "Edit a text file in this conversation's sandbox by replacing exact text.
|
|
11
|
-
"the file exactly (including whitespace and indentation) and, unless
|
|
12
|
-
"exactly once; include enough surrounding lines to make it unique. Read the file
|
|
13
|
-
"
|
|
11
|
+
keyArgs: ["file_path"],
|
|
12
|
+
description: "Edit a text file in this conversation's sandbox by replacing exact text. old_string must match " +
|
|
13
|
+
"the file exactly (including whitespace and indentation) and, unless replace_all is true, occur " +
|
|
14
|
+
"exactly once; include enough surrounding lines to make it unique. Read the file first; " +
|
|
15
|
+
"editing a file you have not read, or one changed since you read it, fails. Use Write to create a file or replace all of it.",
|
|
14
16
|
inputSchema: {
|
|
15
17
|
type: "object",
|
|
16
18
|
properties: {
|
|
17
|
-
|
|
19
|
+
file_path: {
|
|
18
20
|
type: "string",
|
|
19
21
|
minLength: 1,
|
|
20
22
|
description: 'Absolute path of the file, e.g. "/workspace/src/app.py".',
|
|
21
23
|
},
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
old_string: { type: "string", minLength: 1, description: "The exact text to replace." },
|
|
25
|
+
new_string: { type: "string", description: "The replacement text." },
|
|
26
|
+
replace_all: {
|
|
25
27
|
type: "boolean",
|
|
26
|
-
description: "Replace every occurrence of
|
|
28
|
+
description: "Replace every occurrence of old_string instead of exactly one. Default false.",
|
|
27
29
|
},
|
|
28
30
|
},
|
|
29
|
-
required: ["
|
|
31
|
+
required: ["file_path", "old_string", "new_string"],
|
|
30
32
|
additionalProperties: false,
|
|
31
33
|
},
|
|
32
34
|
};
|
|
33
|
-
const notFound = (path) => `File not found: ${clip(path, 200)}. Check the path with
|
|
34
|
-
const notText = (path) => `${clip(path, 200)} is a directory, a binary file or larger than ${EDIT_MAX_BYTES} bytes; use
|
|
35
|
-
const SAME_TEXT = "
|
|
36
|
-
const noMatch = (path) => `
|
|
37
|
-
const ambiguous = (n) => `
|
|
35
|
+
const notFound = (path) => `File not found: ${clip(path, 200)}. Check the path with Glob, or use Write to create it.`;
|
|
36
|
+
const notText = (path) => `${clip(path, 200)} is a directory, a binary file or larger than ${EDIT_MAX_BYTES} bytes; use Bash to change it.`;
|
|
37
|
+
const SAME_TEXT = "old_string and new_string are the same; pass the text you want to change and its replacement.";
|
|
38
|
+
const noMatch = (path) => `old_string was not found in ${clip(path, 200)}; call Read and pass the exact text, including whitespace.`;
|
|
39
|
+
const ambiguous = (n) => `old_string occurs ${n} times; pass more surrounding text to make it unique, or pass replace_all: true.`;
|
|
38
40
|
/** 出现次数(不重叠)。 */
|
|
39
41
|
function occurrences(text, sub) {
|
|
40
42
|
let n = 0;
|
|
@@ -42,17 +44,17 @@ function occurrences(text, sub) {
|
|
|
42
44
|
n++;
|
|
43
45
|
return n;
|
|
44
46
|
}
|
|
45
|
-
/** 内置工具 `
|
|
47
|
+
/** 内置工具 `Edit`:按精确文本替换。 */
|
|
46
48
|
export function sandboxEditTool(deps) {
|
|
47
49
|
return {
|
|
48
50
|
spec: SPEC,
|
|
49
51
|
defaultPolicy: "allow",
|
|
50
52
|
unavailable: unavailableWhenNoSandbox(deps),
|
|
51
|
-
timeoutMs: () => sandboxBaseTimeoutMs(deps.config()),
|
|
53
|
+
timeoutMs: () => sandboxBaseTimeoutMs(deps.config.get()),
|
|
52
54
|
async run(input, ctx) {
|
|
53
|
-
const {
|
|
54
|
-
const path = checkWritable(input.
|
|
55
|
-
if (
|
|
55
|
+
const { old_string, new_string, replace_all = false } = input;
|
|
56
|
+
const path = checkWritable(input.file_path);
|
|
57
|
+
if (old_string === new_string)
|
|
56
58
|
throw new ToolError(SAME_TEXT);
|
|
57
59
|
const { value: edit, notices } = await inSandbox(deps, ctx, ({ h, p, signal }) =>
|
|
58
60
|
// read, replace, write: one holder at a time per file
|
|
@@ -67,18 +69,26 @@ export function sandboxEditTool(deps) {
|
|
|
67
69
|
throw new ToolError(notFound(path));
|
|
68
70
|
if (got.truncated || looksBinary(got.data))
|
|
69
71
|
throw new ToolError(notText(path));
|
|
72
|
+
await assertReadAndUnchanged(deps, ctx.conversationId, path, fileStateOf(got.data, st.size));
|
|
70
73
|
const text = new TextDecoder().decode(got.data);
|
|
71
|
-
const count = occurrences(text,
|
|
74
|
+
const count = occurrences(text, old_string);
|
|
72
75
|
if (count === 0)
|
|
73
76
|
throw new ToolError(noMatch(path));
|
|
74
|
-
if (count > 1 && !
|
|
77
|
+
if (count > 1 && !replace_all)
|
|
75
78
|
throw new ToolError(ambiguous(count));
|
|
76
|
-
// 用函数形式替换:
|
|
77
|
-
const next =
|
|
78
|
-
? text.split(
|
|
79
|
-
: text.replace(
|
|
80
|
-
|
|
81
|
-
|
|
79
|
+
// 用函数形式替换:new_string 里的 `$&` 等不被当成替换模式
|
|
80
|
+
const next = replace_all
|
|
81
|
+
? text.split(old_string).join(new_string)
|
|
82
|
+
: text.replace(old_string, () => new_string);
|
|
83
|
+
const nextBytes = new TextEncoder().encode(next);
|
|
84
|
+
await p.writeFile(h, path, nextBytes, signal);
|
|
85
|
+
return {
|
|
86
|
+
n: replace_all ? count : 1,
|
|
87
|
+
before: text,
|
|
88
|
+
after: next,
|
|
89
|
+
// over the bytes the next Write / Edit reads back (Read's limit), as Read records it
|
|
90
|
+
file: recordedFile(normalizeSandboxPath(path), nextBytes.subarray(0, READ_MAX_BYTES), nextBytes.byteLength),
|
|
91
|
+
};
|
|
82
92
|
}));
|
|
83
93
|
const { n } = edit;
|
|
84
94
|
const text = `Edited ${path}: replaced ${n} occurrence${n === 1 ? "" : "s"}.`;
|
|
@@ -91,6 +101,7 @@ export function sandboxEditTool(deps) {
|
|
|
91
101
|
path: viewPath(path),
|
|
92
102
|
created: false,
|
|
93
103
|
...lineDiff(edit.before, edit.after),
|
|
104
|
+
file: edit.file,
|
|
94
105
|
},
|
|
95
106
|
};
|
|
96
107
|
},
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { EventLog } from "../../../conversations/event-log.js";
|
|
2
|
+
/**
|
|
3
|
+
* Read before `Write` / `Edit` (tool naming spec §4.5). The state of a file as a `Read`, `Write` or
|
|
4
|
+
* `Edit` saw or left it is recorded in the display-only `tool_result.view.file`; before writing,
|
|
5
|
+
* the tools compare the latest recorded state of the path in this conversation's log with the
|
|
6
|
+
* content they read anyway. Nothing lives in process memory, so every replica decides the same.
|
|
7
|
+
*/
|
|
8
|
+
export interface FileState {
|
|
9
|
+
/** The file's full size in bytes. */
|
|
10
|
+
size: number;
|
|
11
|
+
/** sha256 (hex) of the bytes handled: the first bytes only for a file over `Read`'s byte limit. */
|
|
12
|
+
sha256: string;
|
|
13
|
+
}
|
|
14
|
+
/** What the tools put into `view.file`: the state plus the full normalized path (never cut). */
|
|
15
|
+
export interface RecordedFile extends FileState {
|
|
16
|
+
path: string;
|
|
17
|
+
}
|
|
18
|
+
export declare const NOT_READ_TEXT = "File has not been read yet. Read it first before writing to it.";
|
|
19
|
+
export declare const MODIFIED_TEXT = "File has been modified since it was read, either by the user or by another command. Read it again before writing to it.";
|
|
20
|
+
/** The state of `bytes`, the bytes handled of a file whose full size is `fullSize`. */
|
|
21
|
+
export declare function fileStateOf(bytes: Uint8Array, fullSize: number): FileState;
|
|
22
|
+
/** The `view.file` value for a file at `path` (already normalized). */
|
|
23
|
+
export declare function recordedFile(path: string, bytes: Uint8Array, fullSize: number): RecordedFile;
|
|
24
|
+
/** POSIX-normalized absolute path (`/workspace/./a.txt` and `/workspace/a.txt` are one file). */
|
|
25
|
+
export declare function normalizeSandboxPath(path: string): string;
|
|
26
|
+
/** The latest recorded state of `path` in the conversation's log; null when it was never recorded. */
|
|
27
|
+
export declare function lastFileState(log: Pick<EventLog, "latestFileState">, conversationId: string, path: string): Promise<FileState | null>;
|
|
28
|
+
/**
|
|
29
|
+
* Throws the model-visible error unless the conversation read (or wrote) the file and it is
|
|
30
|
+
* unchanged: `current` is the state of the content the caller just read.
|
|
31
|
+
*/
|
|
32
|
+
export declare function assertReadAndUnchanged(deps: {
|
|
33
|
+
eventLog: Pick<EventLog, "latestFileState">;
|
|
34
|
+
}, conversationId: string, path: string, current: FileState): Promise<void>;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { posix } from "node:path";
|
|
3
|
+
import { ToolError } from "@capybara-hq/plugin-sdk";
|
|
4
|
+
export const NOT_READ_TEXT = "File has not been read yet. Read it first before writing to it.";
|
|
5
|
+
export const MODIFIED_TEXT = "File has been modified since it was read, either by the user or by another command. Read it again before writing to it.";
|
|
6
|
+
/** The state of `bytes`, the bytes handled of a file whose full size is `fullSize`. */
|
|
7
|
+
export function fileStateOf(bytes, fullSize) {
|
|
8
|
+
return { size: fullSize, sha256: createHash("sha256").update(bytes).digest("hex") };
|
|
9
|
+
}
|
|
10
|
+
/** The `view.file` value for a file at `path` (already normalized). */
|
|
11
|
+
export function recordedFile(path, bytes, fullSize) {
|
|
12
|
+
return { path, ...fileStateOf(bytes, fullSize) };
|
|
13
|
+
}
|
|
14
|
+
/** POSIX-normalized absolute path (`/workspace/./a.txt` and `/workspace/a.txt` are one file). */
|
|
15
|
+
export function normalizeSandboxPath(path) {
|
|
16
|
+
const n = posix.normalize(path);
|
|
17
|
+
return n.length > 1 && n.endsWith("/") ? n.slice(0, -1) : n;
|
|
18
|
+
}
|
|
19
|
+
/** The latest recorded state of `path` in the conversation's log; null when it was never recorded. */
|
|
20
|
+
export async function lastFileState(log, conversationId, path) {
|
|
21
|
+
return log.latestFileState(conversationId, normalizeSandboxPath(path));
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Throws the model-visible error unless the conversation read (or wrote) the file and it is
|
|
25
|
+
* unchanged: `current` is the state of the content the caller just read.
|
|
26
|
+
*/
|
|
27
|
+
export async function assertReadAndUnchanged(deps, conversationId, path, current) {
|
|
28
|
+
const seen = await lastFileState(deps.eventLog, conversationId, path);
|
|
29
|
+
if (seen === null)
|
|
30
|
+
throw new ToolError(NOT_READ_TEXT);
|
|
31
|
+
if (seen.size !== current.size || seen.sha256 !== current.sha256) {
|
|
32
|
+
throw new ToolError(MODIFIED_TEXT);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* 线性时间的 glob 匹配(
|
|
2
|
+
* 线性时间的 glob 匹配(Glob 用;模式由模型给出,不能编译成会回溯爆炸的正则)。
|
|
3
3
|
*
|
|
4
4
|
* 语法:路径按 `/` 分段;整段 `**` 跨任意层目录(含零层);段内 `*` 匹配任意个字符(不跨 `/`),`?` 一个字符,
|
|
5
5
|
* `[abc]` / `[a-z]` / `[!x]`(或 `[^x]`)字符类,`{a,b}` 二选一(可嵌套,展开后最多 {@link MAX_ALTERNATIVES} 个);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* 线性时间的 glob 匹配(
|
|
2
|
+
* 线性时间的 glob 匹配(Glob 用;模式由模型给出,不能编译成会回溯爆炸的正则)。
|
|
3
3
|
*
|
|
4
4
|
* 语法:路径按 `/` 分段;整段 `**` 跨任意层目录(含零层);段内 `*` 匹配任意个字符(不跨 `/`),`?` 一个字符,
|
|
5
5
|
* `[abc]` / `[a-z]` / `[!x]`(或 `[^x]`)字符类,`{a,b}` 二选一(可嵌套,展开后最多 {@link MAX_ALTERNATIVES} 个);
|
|
@@ -6,14 +6,14 @@ const MAX_RESULTS = 1000;
|
|
|
6
6
|
/** `find` 输出的上限(字节)。 */
|
|
7
7
|
const MAX_FIND_BYTES = 8 * 1024 * 1024;
|
|
8
8
|
const SPEC = {
|
|
9
|
-
name: "
|
|
9
|
+
name: "Glob",
|
|
10
10
|
// Display only (the tool row; not in the fingerprint, never sent to the model).
|
|
11
11
|
keyArgs: ["pattern"],
|
|
12
12
|
description: "Find files by name pattern in this conversation's sandbox. Use it to list files and to " +
|
|
13
13
|
'locate files by name, e.g. pattern "**/*.py" for all Python files. The pattern is matched ' +
|
|
14
14
|
"against paths relative to path (default /workspace): * matches within one directory, ** " +
|
|
15
15
|
"matches across directories, ? matches one character, {a,b} matches either. Returns absolute " +
|
|
16
|
-
"paths sorted by name, up to 1000. To search file contents, use
|
|
16
|
+
"paths sorted by name, up to 1000. To search file contents, use Grep.",
|
|
17
17
|
inputSchema: {
|
|
18
18
|
type: "object",
|
|
19
19
|
properties: {
|
|
@@ -36,13 +36,13 @@ const SPEC = {
|
|
|
36
36
|
const ABSOLUTE_PATTERN = 'The pattern must be relative to path; pass the directory in path and a relative pattern such as "**/*.py".';
|
|
37
37
|
const notDirectory = (path) => `${clip(path, 200)} is not a directory; pass an existing directory in path (default /workspace).`;
|
|
38
38
|
const FIND_FAILED = "Listing files did not finish in time; pass a narrower path or pattern and retry.";
|
|
39
|
-
/** 内置工具 `
|
|
39
|
+
/** 内置工具 `Glob`:按文件名模式找文件(只读)。 */
|
|
40
40
|
export function sandboxGlobTool(deps) {
|
|
41
41
|
return {
|
|
42
42
|
spec: SPEC,
|
|
43
43
|
defaultPolicy: "allow",
|
|
44
44
|
unavailable: unavailableWhenNoSandbox(deps),
|
|
45
|
-
timeoutMs: () => sandboxBaseTimeoutMs(deps.config()),
|
|
45
|
+
timeoutMs: () => sandboxBaseTimeoutMs(deps.config.get()),
|
|
46
46
|
async run(input, ctx) {
|
|
47
47
|
const startedAt = Date.now();
|
|
48
48
|
const { pattern } = input;
|
|
@@ -65,7 +65,7 @@ export function sandboxGlobTool(deps) {
|
|
|
65
65
|
const r = await p.exec(h, {
|
|
66
66
|
command: "find . -type f -print0",
|
|
67
67
|
cwd: dir,
|
|
68
|
-
timeoutMs: searchTimeoutMs(deps.config(), startedAt, Date.now(), ctx.runDeadline),
|
|
68
|
+
timeoutMs: searchTimeoutMs(deps.config.get(), startedAt, Date.now(), ctx.runDeadline),
|
|
69
69
|
maxOutputBytes: MAX_FIND_BYTES,
|
|
70
70
|
signal,
|
|
71
71
|
});
|
|
@@ -84,7 +84,7 @@ export function sandboxGlobTool(deps) {
|
|
|
84
84
|
.map((rel) => `${base}/${rel}`)
|
|
85
85
|
.filter((abs) => abs !== SYNC_MARKER)
|
|
86
86
|
.sort()
|
|
87
|
-
// 文件名里的换行显示为 `\n`(与
|
|
87
|
+
// 文件名里的换行显示为 `\n`(与 Grep 一致),一行一个文件
|
|
88
88
|
.map((abs) => abs.replace(/\n/g, "\\n")));
|
|
89
89
|
});
|
|
90
90
|
const shown = files.slice(0, MAX_RESULTS);
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import type { BuiltinTool } from "../../registry.js";
|
|
2
2
|
import { type SandboxToolDeps } from "./common.js";
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Parses the output of `grep -H --null` (with `-n` when `numbered`): each entry is
|
|
5
|
+
* `<file name>\0<line number>:<line>\n` (the file name may contain newlines, the line does not).
|
|
6
|
+
* Returns `<absolute path>:<line number>:<line>`; context lines (`<line number>-<line>`, only with
|
|
7
|
+
* `-A/-B/-C`) become `<absolute path>-<line number>-<line>`, and the `--` group separator is kept.
|
|
8
|
+
* A newline in a file name shows as `\n`. An incomplete last entry (truncated output) is dropped.
|
|
6
9
|
*/
|
|
7
|
-
export declare function parseGrepNull(stdout: string, base: string): string[];
|
|
8
|
-
/** 内置工具 `
|
|
10
|
+
export declare function parseGrepNull(stdout: string, base: string, numbered?: boolean): string[];
|
|
11
|
+
/** 内置工具 `Grep`:按正则搜文件内容(只读)。 */
|
|
9
12
|
export declare function sandboxGrepTool(deps: SandboxToolDeps): BuiltinTool;
|