@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
package/dist/tools/oauth/flow.js
CHANGED
|
@@ -1,49 +1,33 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
8
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
9
|
+
};
|
|
1
10
|
import { createHash, randomBytes } from "node:crypto";
|
|
11
|
+
import { Inject, Injectable } from "@nestjs/common";
|
|
2
12
|
import { ApiError } from "../../errors.js";
|
|
3
13
|
import { audit } from "../../identity/audit.js";
|
|
4
|
-
import {
|
|
14
|
+
import { KernelConfigService } from "../../infra/config/kernel-config.service.js";
|
|
15
|
+
import { KernelDb } from "../../infra/database/kernel-db.js";
|
|
16
|
+
import { TransactionHost } from "../../infra/database/transaction-host.js";
|
|
17
|
+
import { Transactional } from "../../infra/database/transactional.decorator.js";
|
|
18
|
+
import { KERNEL_LOGGER, REDIS } from "../../infra/tokens.js";
|
|
19
|
+
import { OrgLock } from "../../orgs/org-lock.js";
|
|
20
|
+
import { ConnectorsService } from "../connectors.service.js";
|
|
21
|
+
import { Credentials } from "../credentials.js";
|
|
5
22
|
import { oauthHttpOptions } from "./discovery.js";
|
|
23
|
+
import { callbackUrl, DEFAULT_RETURN_PATH, OAUTH_STATE_TTL_SECONDS, publicUrlRequired, } from "./flow-paths.js";
|
|
6
24
|
import { tokenRequest } from "./tokens.js";
|
|
7
|
-
|
|
8
|
-
export const OAUTH_CALLBACK_PATH = "/api/v1/oauth/callback";
|
|
9
|
-
/** state 的有效期(秒)。 */
|
|
10
|
-
export const OAUTH_STATE_TTL_SECONDS = 600;
|
|
11
|
-
/** 浏览器绑定 Cookie:回调必须来自发起连接的同一个浏览器。 */
|
|
12
|
-
export const OAUTH_BINDING_COOKIE = "cap_oauth";
|
|
13
|
-
/** 回调失败、或连接时没给回跳页面时回到的网页(next-intl 会补语言前缀)。 */
|
|
14
|
-
export const DEFAULT_RETURN_PATH = "/settings/connections";
|
|
25
|
+
export { callbackUrl, DEFAULT_RETURN_PATH, isSafeReturnPath, OAUTH_BINDING_COOKIE, OAUTH_CALLBACK_PATH, OAUTH_STATE_TTL_SECONDS, publicUrlRequired, } from "./flow-paths.js";
|
|
15
26
|
const stateKey = (state) => `capk:oauth-state:${state}`;
|
|
16
27
|
const STATE_RE = /^[A-Za-z0-9_-]{43}$/;
|
|
17
28
|
const BINDING_RE = /^[A-Za-z0-9_-]{43}$/;
|
|
18
29
|
const b64url = (n = 32) => randomBytes(n).toString("base64url");
|
|
19
30
|
const sha256 = (s) => createHash("sha256").update(s).digest("base64url");
|
|
20
|
-
/** OAuth 连接器需要 `http.publicUrl`(回调地址);未配置 → 这条校验错误。 */
|
|
21
|
-
export const publicUrlRequired = () => new ApiError("validation_failed", "Request validation failed", [
|
|
22
|
-
{
|
|
23
|
-
path: "auth",
|
|
24
|
-
message: "OAuth connectors require http.publicUrl to be configured (it is used to build the OAuth callback URL)",
|
|
25
|
-
},
|
|
26
|
-
]);
|
|
27
|
-
export function callbackUrl(publicUrl) {
|
|
28
|
-
return `${publicUrl.replace(/\/+$/, "")}${OAUTH_CALLBACK_PATH}`;
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* 回跳页面只接受站内相对路径(防开放重定向):以单个 `/` 开头,不含 `\` 与控制字符,解析后仍在同一个源。
|
|
32
|
-
*/
|
|
33
|
-
export function isSafeReturnPath(p) {
|
|
34
|
-
if (p.length > 500 || !p.startsWith("/") || p.startsWith("//"))
|
|
35
|
-
return false;
|
|
36
|
-
// biome-ignore lint/suspicious/noControlCharactersInRegex: 正是要拒绝控制字符
|
|
37
|
-
if (/[\\\u0000-\u001f\u007f]/.test(p))
|
|
38
|
-
return false;
|
|
39
|
-
const base = "https://return.invalid";
|
|
40
|
-
try {
|
|
41
|
-
return new URL(p, base).origin === base;
|
|
42
|
-
}
|
|
43
|
-
catch {
|
|
44
|
-
return false;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
31
|
/** 一个有效的浏览器绑定值(复用请求里已有的,否则新生成)。 */
|
|
48
32
|
export function browserBinding(existing) {
|
|
49
33
|
return existing !== undefined && BINDING_RE.test(existing) ? existing : b64url();
|
|
@@ -54,13 +38,37 @@ export const FIRST_CONNECT_REFRESH_WAIT_MS = 15_000;
|
|
|
54
38
|
* 授权码 + PKCE(S256)连接流程。state 是 32 字节随机串,存 Redis `capk:oauth-state:<state>` 10 分钟、单次有效
|
|
55
39
|
* (GETDEL),内含组织、连接器、发起人、PKCE verifier、redirect_uri、回跳页面与浏览器绑定值的哈希。
|
|
56
40
|
*/
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
41
|
+
let OAuthFlow = class OAuthFlow {
|
|
42
|
+
db;
|
|
43
|
+
orgLock;
|
|
44
|
+
redis;
|
|
45
|
+
credentials;
|
|
46
|
+
config;
|
|
47
|
+
log;
|
|
48
|
+
connectors;
|
|
49
|
+
txHost;
|
|
50
|
+
constructor(db,
|
|
51
|
+
/** The org row lock (orgs/org-lock.ts): joins the caller's transaction. */
|
|
52
|
+
orgLock, redis, credentials, config, log,
|
|
53
|
+
/** A member's first connection without a tool snapshot refreshes the tools (A16). */
|
|
54
|
+
connectors, txHost) {
|
|
55
|
+
this.db = db;
|
|
56
|
+
this.orgLock = orgLock;
|
|
57
|
+
this.redis = redis;
|
|
58
|
+
this.credentials = credentials;
|
|
59
|
+
this.config = config;
|
|
60
|
+
this.log = log;
|
|
61
|
+
this.connectors = connectors;
|
|
62
|
+
this.txHost = txHost;
|
|
63
|
+
}
|
|
64
|
+
/** 某成员首次成功连接、而连接器还没有工具快照时(A16:用该成员的 token 刷新工具清单)。 */
|
|
65
|
+
async onFirstConnect(orgId, connectorId, accountId) {
|
|
66
|
+
await this.connectors.refresh(orgId, connectorId, accountId, undefined, {
|
|
67
|
+
trigger: "first_connect",
|
|
68
|
+
});
|
|
61
69
|
}
|
|
62
70
|
async app(orgId, connectorId) {
|
|
63
|
-
return this.
|
|
71
|
+
return this.db
|
|
64
72
|
.selectFrom("connectors")
|
|
65
73
|
.select(["id", "auth", "status"])
|
|
66
74
|
.where("id", "=", connectorId)
|
|
@@ -70,7 +78,7 @@ export class OAuthFlow {
|
|
|
70
78
|
}
|
|
71
79
|
/** 生成授权 URL。`binding` 为本浏览器的绑定值(由 controller 写入 Cookie)。 */
|
|
72
80
|
async start(orgId, connectorId, accountId, returnTo, binding) {
|
|
73
|
-
const publicUrl = this.
|
|
81
|
+
const publicUrl = this.config.get().http.publicUrl;
|
|
74
82
|
if (!publicUrl)
|
|
75
83
|
throw publicUrlRequired();
|
|
76
84
|
const app = await this.app(orgId, connectorId);
|
|
@@ -89,7 +97,7 @@ export class OAuthFlow {
|
|
|
89
97
|
{ path: "status", message: "The connector is disabled; ask an administrator to enable it" },
|
|
90
98
|
]);
|
|
91
99
|
}
|
|
92
|
-
const client = await this.
|
|
100
|
+
const client = await this.credentials.oauthClient(orgId, connectorId);
|
|
93
101
|
if (!client?.authorizationEndpoint) {
|
|
94
102
|
throw new ApiError("connector.connect_failed", "The connector has no registered OAuth client; ask an administrator to reinstall it");
|
|
95
103
|
}
|
|
@@ -106,7 +114,7 @@ export class OAuthFlow {
|
|
|
106
114
|
binding: sha256(binding),
|
|
107
115
|
...(client.issuer !== undefined && { issuer: client.issuer }),
|
|
108
116
|
};
|
|
109
|
-
await this.
|
|
117
|
+
await this.redis.set(stateKey(state), JSON.stringify(rec), "EX", OAUTH_STATE_TTL_SECONDS);
|
|
110
118
|
const url = new URL(client.authorizationEndpoint);
|
|
111
119
|
url.searchParams.set("response_type", "code");
|
|
112
120
|
url.searchParams.set("client_id", client.clientId);
|
|
@@ -122,7 +130,7 @@ export class OAuthFlow {
|
|
|
122
130
|
}
|
|
123
131
|
/** 回跳地址:`http.publicUrl` + 站内路径 + 结果参数(未配置 publicUrl 时为相对地址)。 */
|
|
124
132
|
redirect(path, param) {
|
|
125
|
-
const base = (this.
|
|
133
|
+
const base = (this.config.get().http.publicUrl ?? "").replace(/\/+$/, "");
|
|
126
134
|
const u = new URL(path, "https://return.invalid");
|
|
127
135
|
u.searchParams.set(param[0], param[1]);
|
|
128
136
|
return `${base}${u.pathname}${u.search}${u.hash}`;
|
|
@@ -139,7 +147,7 @@ export class OAuthFlow {
|
|
|
139
147
|
const state = query.state;
|
|
140
148
|
if (state === undefined || !STATE_RE.test(state))
|
|
141
149
|
return this.fail("state_invalid");
|
|
142
|
-
const raw = await this.
|
|
150
|
+
const raw = await this.redis.getdel(stateKey(state));
|
|
143
151
|
if (raw === null)
|
|
144
152
|
return this.fail("state_invalid");
|
|
145
153
|
const rec = JSON.parse(raw);
|
|
@@ -158,7 +166,7 @@ export class OAuthFlow {
|
|
|
158
166
|
return this.fail("provider_error", back);
|
|
159
167
|
const { orgId, connectorId, accountId } = rec;
|
|
160
168
|
const app = await this.app(orgId, connectorId);
|
|
161
|
-
const client = app ? await this.
|
|
169
|
+
const client = app ? await this.credentials.oauthClient(orgId, connectorId) : null;
|
|
162
170
|
if (!app || !client || app.auth.type !== "oauth_code") {
|
|
163
171
|
return this.fail("connector_unavailable", back);
|
|
164
172
|
}
|
|
@@ -170,41 +178,15 @@ export class OAuthFlow {
|
|
|
170
178
|
redirect_uri: rec.redirectUri,
|
|
171
179
|
code_verifier: rec.verifier,
|
|
172
180
|
resource: client.resource,
|
|
173
|
-
}, oauthHttpOptions(this.
|
|
181
|
+
}, oauthHttpOptions(this.config.get()));
|
|
174
182
|
}
|
|
175
183
|
catch (e) {
|
|
176
|
-
this.
|
|
184
|
+
this.log.warn("oauth code exchange failed", { orgId, connectorId, err: e });
|
|
177
185
|
return this.fail("token_exchange_failed", back);
|
|
178
186
|
}
|
|
179
187
|
let first;
|
|
180
188
|
try {
|
|
181
|
-
first = await this.
|
|
182
|
-
await lockOrgAndAuthorize(t, orgId, accountId, "connectors.use");
|
|
183
|
-
const still = await t
|
|
184
|
-
.selectFrom("connectors")
|
|
185
|
-
.select("id")
|
|
186
|
-
.where("id", "=", connectorId)
|
|
187
|
-
.where("deleted_at", "is", null)
|
|
188
|
-
.forUpdate()
|
|
189
|
-
.executeTakeFirst();
|
|
190
|
-
if (!still)
|
|
191
|
-
throw new ApiError("connector.not_found", "Connector not found");
|
|
192
|
-
await this.deps.credentials.setOAuthTokens(orgId, connectorId, { kind: "user", accountId }, tokens, t);
|
|
193
|
-
await audit(t, {
|
|
194
|
-
actorAccountId: accountId,
|
|
195
|
-
orgId,
|
|
196
|
-
action: "connector.credential.set",
|
|
197
|
-
target: connectorId,
|
|
198
|
-
detail: { type: "oauth_code", ownership: "personal" },
|
|
199
|
-
});
|
|
200
|
-
const tool = await t
|
|
201
|
-
.selectFrom("connector_tools")
|
|
202
|
-
.select("name")
|
|
203
|
-
.where("connector_id", "=", connectorId)
|
|
204
|
-
.limit(1)
|
|
205
|
-
.executeTakeFirst();
|
|
206
|
-
return tool === undefined;
|
|
207
|
-
});
|
|
189
|
+
first = await this.storeTokens(orgId, connectorId, accountId, tokens);
|
|
208
190
|
}
|
|
209
191
|
catch (e) {
|
|
210
192
|
if (e instanceof ApiError)
|
|
@@ -214,10 +196,8 @@ export class OAuthFlow {
|
|
|
214
196
|
if (first) {
|
|
215
197
|
// 首次连接(A16):刷新失败不影响连接本身,凭据已存好;管理员之后可手动刷新
|
|
216
198
|
// 最多等 FIRST_CONNECT_REFRESH_WAIT_MS 再回跳(本请求自己的计时器,结束即清除);超时的刷新在后台继续
|
|
217
|
-
const refresh = this.
|
|
218
|
-
.
|
|
219
|
-
.catch((err) => {
|
|
220
|
-
this.deps.log.warn("oauth first-connect tool refresh failed", {
|
|
199
|
+
const refresh = this.onFirstConnect(orgId, connectorId, accountId).catch((err) => {
|
|
200
|
+
this.log.warn("oauth first-connect tool refresh failed", {
|
|
221
201
|
orgId,
|
|
222
202
|
connectorId,
|
|
223
203
|
err,
|
|
@@ -234,4 +214,52 @@ export class OAuthFlow {
|
|
|
234
214
|
}
|
|
235
215
|
return this.redirect(back, ["connected", connectorId]);
|
|
236
216
|
}
|
|
237
|
-
|
|
217
|
+
/**
|
|
218
|
+
* In the org row lock: re-checks that the member may still use connectors and the connector
|
|
219
|
+
* exists, stores the member's tokens with the audit row; true when the connector has no tool
|
|
220
|
+
* snapshot yet (the first connection).
|
|
221
|
+
*/
|
|
222
|
+
async storeTokens(orgId, connectorId, accountId, tokens) {
|
|
223
|
+
const t = this.db.db;
|
|
224
|
+
await this.orgLock.lockAndAuthorize(orgId, accountId, "connectors.use");
|
|
225
|
+
const still = await t
|
|
226
|
+
.selectFrom("connectors")
|
|
227
|
+
.select("id")
|
|
228
|
+
.where("id", "=", connectorId)
|
|
229
|
+
.where("deleted_at", "is", null)
|
|
230
|
+
.forUpdate()
|
|
231
|
+
.executeTakeFirst();
|
|
232
|
+
if (!still)
|
|
233
|
+
throw new ApiError("connector.not_found", "Connector not found");
|
|
234
|
+
await this.credentials.setOAuthTokens(orgId, connectorId, { kind: "user", accountId }, tokens);
|
|
235
|
+
await audit(t, {
|
|
236
|
+
actorAccountId: accountId,
|
|
237
|
+
orgId,
|
|
238
|
+
action: "connector.credential.set",
|
|
239
|
+
target: connectorId,
|
|
240
|
+
detail: { type: "oauth_code", ownership: "personal" },
|
|
241
|
+
});
|
|
242
|
+
const tool = await t
|
|
243
|
+
.selectFrom("connector_tools")
|
|
244
|
+
.select("name")
|
|
245
|
+
.where("connector_id", "=", connectorId)
|
|
246
|
+
.limit(1)
|
|
247
|
+
.executeTakeFirst();
|
|
248
|
+
return tool === undefined;
|
|
249
|
+
}
|
|
250
|
+
};
|
|
251
|
+
__decorate([
|
|
252
|
+
Transactional()
|
|
253
|
+
], OAuthFlow.prototype, "storeTokens", null);
|
|
254
|
+
OAuthFlow = __decorate([
|
|
255
|
+
Injectable(),
|
|
256
|
+
__param(0, Inject(KernelDb)),
|
|
257
|
+
__param(1, Inject(OrgLock)),
|
|
258
|
+
__param(2, Inject(REDIS)),
|
|
259
|
+
__param(3, Inject(Credentials)),
|
|
260
|
+
__param(4, Inject(KernelConfigService)),
|
|
261
|
+
__param(5, Inject(KERNEL_LOGGER)),
|
|
262
|
+
__param(6, Inject(ConnectorsService)),
|
|
263
|
+
__param(7, Inject(TransactionHost))
|
|
264
|
+
], OAuthFlow);
|
|
265
|
+
export { OAuthFlow };
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { FastifyReply, FastifyRequest } from "fastify";
|
|
2
2
|
import { z } from "zod";
|
|
3
|
-
import type { KernelConfig } from "../../config/schema.js";
|
|
4
3
|
import { type Principal } from "../../identity/principal.js";
|
|
4
|
+
import { KernelConfigService } from "../../infra/config/kernel-config.service.js";
|
|
5
5
|
import { type OrgContext } from "../../orgs/org.guard.js";
|
|
6
|
-
import {
|
|
6
|
+
import { OAuthFlow } from "./flow.js";
|
|
7
7
|
declare const ConnectBody: z.ZodObject<{
|
|
8
8
|
returnTo: z.ZodOptional<z.ZodString>;
|
|
9
9
|
}, z.core.$strict>;
|
|
@@ -14,7 +14,7 @@ declare const ConnectBody: z.ZodObject<{
|
|
|
14
14
|
export declare class OAuthConnectController {
|
|
15
15
|
private readonly flow;
|
|
16
16
|
private readonly config;
|
|
17
|
-
constructor(flow: OAuthFlow, config:
|
|
17
|
+
constructor(flow: OAuthFlow, config: KernelConfigService);
|
|
18
18
|
connect(principal: Principal, org: OrgContext, connectorId: string, body: z.infer<typeof ConnectBody>, req: FastifyRequest, reply: FastifyReply): Promise<{
|
|
19
19
|
authorizationUrl: string;
|
|
20
20
|
}>;
|
|
@@ -7,13 +7,14 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
7
7
|
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
8
8
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
9
9
|
};
|
|
10
|
-
import {
|
|
10
|
+
import { Controller, Get, HttpCode, Inject, Param, Post, Query, Req, Res } from "@nestjs/common";
|
|
11
11
|
import { z } from "zod";
|
|
12
|
-
import { KERNEL_CONFIG, OAUTH_FLOW } from "../../http/tokens.js";
|
|
13
|
-
import { ZodPipe } from "../../http/zod.pipe.js";
|
|
14
12
|
import { CurrentPrincipal, Public, requireUser } from "../../identity/principal.js";
|
|
13
|
+
import { KernelConfigService } from "../../infra/config/kernel-config.service.js";
|
|
14
|
+
import { createZodDto } from "../../infra/validation/create-zod-dto.js";
|
|
15
|
+
import { ZBody } from "../../infra/validation/zod-params.js";
|
|
15
16
|
import { CurrentOrg, OrgAction } from "../../orgs/org.guard.js";
|
|
16
|
-
import { browserBinding, isSafeReturnPath, OAUTH_BINDING_COOKIE, OAUTH_CALLBACK_PATH, OAUTH_STATE_TTL_SECONDS, } from "./flow.js";
|
|
17
|
+
import { browserBinding, isSafeReturnPath, OAUTH_BINDING_COOKIE, OAUTH_CALLBACK_PATH, OAUTH_STATE_TTL_SECONDS, OAuthFlow, } from "./flow.js";
|
|
17
18
|
const ConnectBody = z
|
|
18
19
|
.object({
|
|
19
20
|
returnTo: z
|
|
@@ -23,6 +24,8 @@ const ConnectBody = z
|
|
|
23
24
|
.optional(),
|
|
24
25
|
})
|
|
25
26
|
.strict();
|
|
27
|
+
class OAuthConnectBody extends createZodDto(ConnectBody, "OAuthConnectBody") {
|
|
28
|
+
}
|
|
26
29
|
/** 查询参数只取单值字符串(重复参数 / 数组按缺失处理)。 */
|
|
27
30
|
const one = (v) => typeof v === "string" && v.length <= 4096 ? v : undefined;
|
|
28
31
|
/**
|
|
@@ -44,7 +47,7 @@ let OAuthConnectController = class OAuthConnectController {
|
|
|
44
47
|
path: OAUTH_CALLBACK_PATH,
|
|
45
48
|
httpOnly: true,
|
|
46
49
|
sameSite: "lax",
|
|
47
|
-
secure: this.config().auth.cookieSecure,
|
|
50
|
+
secure: this.config.get().auth.cookieSecure,
|
|
48
51
|
maxAge: OAUTH_STATE_TTL_SECONDS,
|
|
49
52
|
});
|
|
50
53
|
return out;
|
|
@@ -57,14 +60,14 @@ __decorate([
|
|
|
57
60
|
__param(0, CurrentPrincipal()),
|
|
58
61
|
__param(1, CurrentOrg()),
|
|
59
62
|
__param(2, Param("connectorId")),
|
|
60
|
-
__param(3,
|
|
63
|
+
__param(3, ZBody(OAuthConnectBody)),
|
|
61
64
|
__param(4, Req()),
|
|
62
65
|
__param(5, Res({ passthrough: true }))
|
|
63
66
|
], OAuthConnectController.prototype, "connect", null);
|
|
64
67
|
OAuthConnectController = __decorate([
|
|
65
68
|
Controller("api/v1/orgs/:orgId/connectors"),
|
|
66
|
-
__param(0, Inject(
|
|
67
|
-
__param(1, Inject(
|
|
69
|
+
__param(0, Inject(OAuthFlow)),
|
|
70
|
+
__param(1, Inject(KernelConfigService))
|
|
68
71
|
], OAuthConnectController);
|
|
69
72
|
export { OAuthConnectController };
|
|
70
73
|
/**
|
|
@@ -90,6 +93,6 @@ __decorate([
|
|
|
90
93
|
], OAuthCallbackController.prototype, "callback", null);
|
|
91
94
|
OAuthCallbackController = __decorate([
|
|
92
95
|
Controller("api/v1/oauth"),
|
|
93
|
-
__param(0, Inject(
|
|
96
|
+
__param(0, Inject(OAuthFlow))
|
|
94
97
|
], OAuthCallbackController);
|
|
95
98
|
export { OAuthCallbackController };
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Logger } from "@capybara-hq/plugin-sdk";
|
|
2
2
|
import { ToolError } from "@capybara-hq/plugin-sdk";
|
|
3
3
|
import type { Redis } from "ioredis";
|
|
4
|
+
import type { LockService } from "../../infra/lock/lock.service.js";
|
|
4
5
|
import { type OAuthHttpOptions } from "./discovery.js";
|
|
5
6
|
export type TokenAuthMethod = "client_secret_basic" | "client_secret_post" | "none";
|
|
6
7
|
/**
|
|
@@ -83,17 +84,24 @@ export type TokenAuth = {
|
|
|
83
84
|
*
|
|
84
85
|
* - 调用前:未过期(距过期 > 60 秒或未告知过期时间)直接用;否则刷新(授权码流用 refresh token,客户端凭据流重新取)。
|
|
85
86
|
* - 收到 401:`forceRefresh(stale)`——只要库里的 token 仍是收到 401 的那个就刷新。
|
|
86
|
-
* - 刷新一律在 Redis 锁 `capk:oauth-refresh:<orgId>:<connectorId>:<owner>`
|
|
87
|
-
* 只删除自己持有的锁);拿不到锁的轮询等锁消失后重读凭据,库里已是别的 token 就直接用(不并发刷新——授权服务器
|
|
87
|
+
* - 刷新一律在 Redis 锁 `capk:oauth-refresh:<orgId>:<connectorId>:<owner>` 内进行(`LockService.lease`,值为
|
|
88
|
+
* 本次随机 id,`releaseIf` 只删除自己持有的锁);拿不到锁的轮询等锁消失后重读凭据,库里已是别的 token 就直接用(不并发刷新——授权服务器
|
|
88
89
|
* 轮换 refresh token 时,并发刷新的第二个必然失败)。
|
|
89
90
|
* - 令牌端点明确拒绝 → 删除该凭据并抛 OAuthReconnectRequired(需要重新连接);暂时不可用 → OAuthUnavailable,凭据保留。
|
|
90
91
|
*/
|
|
91
92
|
export declare class OAuthTokens {
|
|
92
93
|
private readonly store;
|
|
94
|
+
/** The lease primitives of `LockService` (the key is used as is: no `lock:` prefix). */
|
|
95
|
+
private readonly locks;
|
|
96
|
+
/** Polls whether another holder still has the lock. */
|
|
93
97
|
private readonly redis;
|
|
94
98
|
private readonly http;
|
|
95
99
|
private readonly log;
|
|
96
|
-
constructor(store: OAuthStore,
|
|
100
|
+
constructor(store: OAuthStore,
|
|
101
|
+
/** The lease primitives of `LockService` (the key is used as is: no `lock:` prefix). */
|
|
102
|
+
locks: Pick<LockService, "lease" | "releaseIf" | "renew">,
|
|
103
|
+
/** Polls whether another holder still has the lock. */
|
|
104
|
+
redis: Pick<Redis, "exists">, http: () => OAuthHttpOptions, log: Logger);
|
|
97
105
|
accessToken(orgId: string, connectorId: string, auth: TokenAuth, owner: OAuthOwner): Promise<string>;
|
|
98
106
|
/** 收到 401 后调用:`stale` 为收到 401 的那个 access token。 */
|
|
99
107
|
forceRefresh(orgId: string, connectorId: string, auth: TokenAuth, owner: OAuthOwner, stale: string | undefined): Promise<void>;
|
|
@@ -102,30 +102,30 @@ export async function tokenRequest(client, params, http) {
|
|
|
102
102
|
...(typeof scope === "string" && { scope }),
|
|
103
103
|
};
|
|
104
104
|
}
|
|
105
|
-
const RELEASE = `
|
|
106
|
-
if redis.call('GET', KEYS[1]) == ARGV[1] then
|
|
107
|
-
return redis.call('DEL', KEYS[1])
|
|
108
|
-
end
|
|
109
|
-
return 0
|
|
110
|
-
`;
|
|
111
105
|
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
112
106
|
/**
|
|
113
107
|
* access token 的获取与刷新。
|
|
114
108
|
*
|
|
115
109
|
* - 调用前:未过期(距过期 > 60 秒或未告知过期时间)直接用;否则刷新(授权码流用 refresh token,客户端凭据流重新取)。
|
|
116
110
|
* - 收到 401:`forceRefresh(stale)`——只要库里的 token 仍是收到 401 的那个就刷新。
|
|
117
|
-
* - 刷新一律在 Redis 锁 `capk:oauth-refresh:<orgId>:<connectorId>:<owner>`
|
|
118
|
-
* 只删除自己持有的锁);拿不到锁的轮询等锁消失后重读凭据,库里已是别的 token 就直接用(不并发刷新——授权服务器
|
|
111
|
+
* - 刷新一律在 Redis 锁 `capk:oauth-refresh:<orgId>:<connectorId>:<owner>` 内进行(`LockService.lease`,值为
|
|
112
|
+
* 本次随机 id,`releaseIf` 只删除自己持有的锁);拿不到锁的轮询等锁消失后重读凭据,库里已是别的 token 就直接用(不并发刷新——授权服务器
|
|
119
113
|
* 轮换 refresh token 时,并发刷新的第二个必然失败)。
|
|
120
114
|
* - 令牌端点明确拒绝 → 删除该凭据并抛 OAuthReconnectRequired(需要重新连接);暂时不可用 → OAuthUnavailable,凭据保留。
|
|
121
115
|
*/
|
|
122
116
|
export class OAuthTokens {
|
|
123
117
|
store;
|
|
118
|
+
locks;
|
|
124
119
|
redis;
|
|
125
120
|
http;
|
|
126
121
|
log;
|
|
127
|
-
constructor(store,
|
|
122
|
+
constructor(store,
|
|
123
|
+
/** The lease primitives of `LockService` (the key is used as is: no `lock:` prefix). */
|
|
124
|
+
locks,
|
|
125
|
+
/** Polls whether another holder still has the lock. */
|
|
126
|
+
redis, http, log) {
|
|
128
127
|
this.store = store;
|
|
128
|
+
this.locks = locks;
|
|
129
129
|
this.redis = redis;
|
|
130
130
|
this.http = http;
|
|
131
131
|
this.log = log;
|
|
@@ -165,7 +165,7 @@ export class OAuthTokens {
|
|
|
165
165
|
const replaced = (rec) => rec !== null && rec.access_token !== stale ? rec.access_token : undefined;
|
|
166
166
|
for (;;) {
|
|
167
167
|
const id = randomUUID();
|
|
168
|
-
if (
|
|
168
|
+
if (await this.locks.lease(key, id, ttlMs)) {
|
|
169
169
|
try {
|
|
170
170
|
const rec = await this.store.readTokens(orgId, connectorId, owner);
|
|
171
171
|
const done = replaced(rec);
|
|
@@ -173,10 +173,10 @@ export class OAuthTokens {
|
|
|
173
173
|
return done;
|
|
174
174
|
if (rec === null && auth.type === "oauth_code")
|
|
175
175
|
throw new OAuthReconnectRequired(owner);
|
|
176
|
-
return await this.obtain(orgId, connectorId, auth, owner, rec, key, id);
|
|
176
|
+
return await this.obtain(orgId, connectorId, auth, owner, rec, key, id, ttlMs);
|
|
177
177
|
}
|
|
178
178
|
finally {
|
|
179
|
-
await this.
|
|
179
|
+
await this.locks.releaseIf(key, id).catch((err) => {
|
|
180
180
|
this.log.warn("oauth refresh lock release failed", { connectorId, err });
|
|
181
181
|
});
|
|
182
182
|
}
|
|
@@ -198,7 +198,7 @@ export class OAuthTokens {
|
|
|
198
198
|
* 锁内:向令牌端点要新 token 并写回。作废前做围栏检查:锁仍归自己、库里的 token 仍是这次用掉的那组——
|
|
199
199
|
* 锁过期后另一个刷新者若已写入新 token,就直接用它而不是删掉它。
|
|
200
200
|
*/
|
|
201
|
-
async obtain(orgId, connectorId, auth, owner, rec, lockKey, lockId) {
|
|
201
|
+
async obtain(orgId, connectorId, auth, owner, rec, lockKey, lockId, lockTtlMs) {
|
|
202
202
|
const client = await this.store.readClient(orgId, connectorId);
|
|
203
203
|
if (!client)
|
|
204
204
|
throw new OAuthReconnectRequired({ kind: "org" });
|
|
@@ -210,7 +210,8 @@ export class OAuthTokens {
|
|
|
210
210
|
current.refresh_token === rec.refresh_token;
|
|
211
211
|
if (current !== null && !unchanged)
|
|
212
212
|
return current.access_token;
|
|
213
|
-
|
|
213
|
+
// still ours (renewing a held lease is harmless right before the delete)
|
|
214
|
+
if (current !== null && !(await this.locks.renew(lockKey, lockId, lockTtlMs))) {
|
|
214
215
|
// 锁已不归自己(过期):不删,交给持锁者;这次按暂时不可用处理
|
|
215
216
|
throw new OAuthUnavailable();
|
|
216
217
|
}
|
package/dist/tools/outputs.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import
|
|
1
|
+
import type { KernelSchemaDb } from "../db/kernel-schema.js";
|
|
2
|
+
import { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
3
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
3
4
|
/** 文本行数(按 `\n` 切分;空串算 1 行,与按行分页读取一致)。 */
|
|
4
5
|
export declare function countLines(s: string): number;
|
|
5
6
|
export interface SavedOutput {
|
|
@@ -14,12 +15,13 @@ export interface OutputScope {
|
|
|
14
15
|
}
|
|
15
16
|
/**
|
|
16
17
|
* 输出存档(spec 5.4):超大工具结果的全文存进 `capybara.tool_outputs`,保留 `tools.outputRetentionDays` 天。
|
|
17
|
-
*
|
|
18
|
+
* 只能在产生它的会话里读取(同组织别的会话也不行:会话之间可见范围不同),过期即视为不存在(清理由
|
|
19
|
+
* `output-cleanup` 每小时一次,见 {@link deleteExpiredOutputs})。
|
|
18
20
|
*/
|
|
19
21
|
export declare class ToolOutputs {
|
|
20
22
|
private readonly db;
|
|
21
23
|
private readonly config;
|
|
22
|
-
constructor(db: KernelDb, config:
|
|
24
|
+
constructor(db: KernelDb, config: Pick<KernelConfigService, "get">);
|
|
23
25
|
save(a: {
|
|
24
26
|
orgId: string;
|
|
25
27
|
conversationId: string;
|
|
@@ -29,6 +31,13 @@ export declare class ToolOutputs {
|
|
|
29
31
|
/** 读本会话未过期的存档全文;不存在 / 过期 / 属于别的会话或组织 → null。 */
|
|
30
32
|
load(scope: OutputScope, id: string): Promise<string | null>;
|
|
31
33
|
}
|
|
34
|
+
/** Rows deleted per statement by {@link deleteExpiredOutputs}. */
|
|
35
|
+
export declare const OUTPUT_CLEANUP_BATCH = 1000;
|
|
36
|
+
/**
|
|
37
|
+
* 删除已过期(`expires_at < now()`)的输出存档,每批 `batch` 行,直到删完;返回删除的总行数。
|
|
38
|
+
* 每批一条独立语句(不开长事务);多个 worker 同时清理时 `SKIP LOCKED` 互不等待。
|
|
39
|
+
*/
|
|
40
|
+
export declare function deleteExpiredOutputs(db: KernelSchemaDb, batch?: number): Promise<number>;
|
|
32
41
|
/** 存档不存在 / 过期 / 不属于本会话(模型可见,英文;不区分几种情况,不泄露别处的存档是否存在)。 */
|
|
33
42
|
export declare const outputNotFoundText: (id: string) => string;
|
|
34
43
|
/**
|
package/dist/tools/outputs.js
CHANGED
|
@@ -1,6 +1,18 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
8
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
9
|
+
};
|
|
1
10
|
import { randomUUID } from "node:crypto";
|
|
2
11
|
import { ToolError } from "@capybara-hq/plugin-sdk";
|
|
12
|
+
import { Inject, Injectable } from "@nestjs/common";
|
|
3
13
|
import { sql } from "kysely";
|
|
14
|
+
import { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
15
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
4
16
|
/** 文本行数(按 `\n` 切分;空串算 1 行,与按行分页读取一致)。 */
|
|
5
17
|
export function countLines(s) {
|
|
6
18
|
let n = 1;
|
|
@@ -10,9 +22,10 @@ export function countLines(s) {
|
|
|
10
22
|
}
|
|
11
23
|
/**
|
|
12
24
|
* 输出存档(spec 5.4):超大工具结果的全文存进 `capybara.tool_outputs`,保留 `tools.outputRetentionDays` 天。
|
|
13
|
-
*
|
|
25
|
+
* 只能在产生它的会话里读取(同组织别的会话也不行:会话之间可见范围不同),过期即视为不存在(清理由
|
|
26
|
+
* `output-cleanup` 每小时一次,见 {@link deleteExpiredOutputs})。
|
|
14
27
|
*/
|
|
15
|
-
|
|
28
|
+
let ToolOutputs = class ToolOutputs {
|
|
16
29
|
db;
|
|
17
30
|
config;
|
|
18
31
|
constructor(db, config) {
|
|
@@ -23,7 +36,7 @@ export class ToolOutputs {
|
|
|
23
36
|
const id = randomUUID();
|
|
24
37
|
const sizeChars = a.content.length;
|
|
25
38
|
const lineCount = countLines(a.content);
|
|
26
|
-
const days = this.config().tools.outputRetentionDays;
|
|
39
|
+
const days = this.config.get().tools.outputRetentionDays;
|
|
27
40
|
await this.db
|
|
28
41
|
.insertInto("tool_outputs")
|
|
29
42
|
.values({
|
|
@@ -51,6 +64,37 @@ export class ToolOutputs {
|
|
|
51
64
|
.executeTakeFirst();
|
|
52
65
|
return row?.content ?? null;
|
|
53
66
|
}
|
|
67
|
+
};
|
|
68
|
+
ToolOutputs = __decorate([
|
|
69
|
+
Injectable(),
|
|
70
|
+
__param(0, Inject(KernelDb)),
|
|
71
|
+
__param(1, Inject(KernelConfigService))
|
|
72
|
+
], ToolOutputs);
|
|
73
|
+
export { ToolOutputs };
|
|
74
|
+
/** Rows deleted per statement by {@link deleteExpiredOutputs}. */
|
|
75
|
+
export const OUTPUT_CLEANUP_BATCH = 1000;
|
|
76
|
+
/**
|
|
77
|
+
* 删除已过期(`expires_at < now()`)的输出存档,每批 `batch` 行,直到删完;返回删除的总行数。
|
|
78
|
+
* 每批一条独立语句(不开长事务);多个 worker 同时清理时 `SKIP LOCKED` 互不等待。
|
|
79
|
+
*/
|
|
80
|
+
export async function deleteExpiredOutputs(db, batch = OUTPUT_CLEANUP_BATCH) {
|
|
81
|
+
let total = 0;
|
|
82
|
+
for (;;) {
|
|
83
|
+
const r = await db
|
|
84
|
+
.deleteFrom("tool_outputs")
|
|
85
|
+
.where("id", "in", db
|
|
86
|
+
.selectFrom("tool_outputs")
|
|
87
|
+
.select("id")
|
|
88
|
+
.where("expires_at", "<", sql `now()`)
|
|
89
|
+
.limit(batch)
|
|
90
|
+
.forUpdate()
|
|
91
|
+
.skipLocked())
|
|
92
|
+
.executeTakeFirst();
|
|
93
|
+
const n = Number(r.numDeletedRows);
|
|
94
|
+
total += n;
|
|
95
|
+
if (n < batch)
|
|
96
|
+
return total;
|
|
97
|
+
}
|
|
54
98
|
}
|
|
55
99
|
/** 存档不存在 / 过期 / 不属于本会话(模型可见,英文;不区分几种情况,不泄露别处的存档是否存在)。 */
|
|
56
100
|
export const outputNotFoundText = (id) => `Output ${id} not found or expired. Run the tool that produced it again to get a new output id.`;
|
|
@@ -150,7 +194,7 @@ export async function spillIfLarge(text, opts, save) {
|
|
|
150
194
|
return {
|
|
151
195
|
content: `${text.slice(0, opts.previewChars)}\n…\n` +
|
|
152
196
|
`[Output truncated: ${saved.sizeChars} chars, ${saved.lineCount} lines. Full output id: ${id}. ` +
|
|
153
|
-
`Use
|
|
197
|
+
`Use ReadToolOutput to page through it, or pass {"$output":"${id}"} as a tool argument.]`,
|
|
154
198
|
outputId: id,
|
|
155
199
|
};
|
|
156
200
|
}
|