@capybara-hq/kernel 0.1.0-rc.1 → 0.1.0-rc.2
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 +179 -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 +261 -329
- package/dist/agents/definition.d.ts +8 -0
- package/dist/agents/definition.js +8 -0
- 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 +20 -4
- 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 +323 -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/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 +30 -13
- 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 +2 -2
- 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 +10 -4
- package/dist/conversations/access.d.ts +29 -0
- package/dist/conversations/access.js +86 -0
- package/dist/conversations/artifacts.d.ts +10 -10
- package/dist/conversations/artifacts.js +35 -9
- 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 +28 -18
- package/dist/conversations/event-log.js +74 -27
- 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 +2 -2
- 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/run-replay.d.ts +56 -8
- package/dist/evals/run-replay.js +140 -80
- 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.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 +85 -57
- 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 +451 -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 +14 -8
- package/dist/orgs/settings.service.js +75 -46
- 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/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 +7 -0
- 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 +24 -57
- 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 +26 -17
- 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 +121 -75
- package/dist/runtime/run-worker.js +340 -226
- 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 +4 -4
- package/dist/runtime/subagents/definition.js +2 -2
- package/dist/runtime/subagents/dispatch.d.ts +87 -6
- package/dist/runtime/subagents/dispatch.js +135 -140
- 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 +1 -1
- package/dist/runtime/subagents/progress.d.ts +2 -2
- package/dist/runtime/subagents/roster.d.ts +3 -3
- package/dist/runtime/subagents/roster.js +1 -1
- package/dist/runtime/subagents/skill-fork.d.ts +6 -7
- package/dist/runtime/subagents/skill-fork.js +16 -5
- 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 +125 -57
- package/dist/runtime/waits.js +431 -208
- 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 +33 -20
- package/dist/skills/catalog.js +96 -53
- package/dist/skills/changes.controller.d.ts +4 -4
- package/dist/skills/changes.controller.js +15 -9
- package/dist/skills/changes.service.d.ts +28 -18
- package/dist/skills/changes.service.js +421 -364
- package/dist/skills/invocable.controller.d.ts +1 -1
- package/dist/skills/invocable.controller.js +8 -5
- package/dist/skills/invoke.d.ts +16 -15
- package/dist/skills/invoke.js +48 -17
- 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 +27 -25
- package/dist/tools/approvals.service.js +324 -258
- package/dist/tools/breaker.d.ts +2 -2
- package/dist/tools/breaker.js +21 -3
- package/dist/tools/builtins/ask-user.d.ts +2 -2
- package/dist/tools/builtins/ask-user.js +1 -1
- 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 +2 -2
- package/dist/tools/builtins/read-tool-output.js +1 -1
- package/dist/tools/builtins/sandbox/bash.js +2 -2
- package/dist/tools/builtins/sandbox/common.d.ts +2 -1
- package/dist/tools/builtins/sandbox/deliver.js +2 -2
- package/dist/tools/builtins/sandbox/edit.js +1 -1
- package/dist/tools/builtins/sandbox/glob.js +2 -2
- package/dist/tools/builtins/sandbox/grep.js +2 -2
- package/dist/tools/builtins/sandbox/read.js +1 -1
- package/dist/tools/builtins/sandbox/write.js +1 -1
- package/dist/tools/builtins/skill-load.d.ts +3 -3
- package/dist/tools/builtins/skill-load.js +1 -1
- 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 +434 -344
- package/dist/tools/credentials.d.ts +17 -20
- package/dist/tools/credentials.js +55 -34
- package/dist/tools/drift.d.ts +29 -41
- package/dist/tools/drift.js +111 -79
- package/dist/tools/info.d.ts +12 -9
- package/dist/tools/info.js +33 -7
- 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/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 +47 -3
- package/dist/tools/pipeline.d.ts +62 -46
- package/dist/tools/pipeline.js +145 -64
- package/dist/tools/policy.d.ts +2 -2
- package/dist/tools/questions.controller.d.ts +1 -1
- package/dist/tools/questions.controller.js +8 -5
- package/dist/tools/questions.service.d.ts +25 -24
- package/dist/tools/questions.service.js +201 -142
- package/dist/tools/registry.d.ts +30 -20
- package/dist/tools/registry.js +73 -37
- 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 +9 -2
- 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/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/drift.js
CHANGED
|
@@ -1,12 +1,29 @@
|
|
|
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 { TOOL_TITLE_MAX, ToolError, validateToolPresentation, } from "@capybara-hq/plugin-sdk";
|
|
11
|
+
import { getQueueToken } from "@nestjs/bullmq";
|
|
12
|
+
import { Inject, Injectable } from "@nestjs/common";
|
|
2
13
|
import { sql } from "kysely";
|
|
3
14
|
import { ApiError } from "../errors.js";
|
|
4
15
|
import { audit } from "../identity/audit.js";
|
|
16
|
+
import { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
17
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
18
|
+
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
19
|
+
import { Transactional } from "../infra/database/transactional.decorator.js";
|
|
20
|
+
import { KERNEL_LOGGER } from "../infra/tokens.js";
|
|
21
|
+
import { MAINTENANCE_QUEUE_NAME } from "../runtime/maintenance-queue.js";
|
|
5
22
|
import { HIDDEN_FORMAT_RE } from "../text.js";
|
|
6
|
-
import { CredentialMissing, isOAuth } from "./credentials.js";
|
|
23
|
+
import { CredentialMissing, Credentials, isOAuth } from "./credentials.js";
|
|
7
24
|
import { toolKey, toolKeyIssue } from "./naming.js";
|
|
8
25
|
import { redactDeep, redactorFor } from "./redact.js";
|
|
9
|
-
import { canonicalJson, policyFromAnnotations, specHash } from "./registry.js";
|
|
26
|
+
import { canonicalJson, policyFromAnnotations, specHash, ToolRegistry } from "./registry.js";
|
|
10
27
|
import { resourceToolSpecs } from "./resources.js";
|
|
11
28
|
import { recordToolSpecs } from "./specs.js";
|
|
12
29
|
/**
|
|
@@ -20,15 +37,12 @@ import { recordToolSpecs } from "./specs.js";
|
|
|
20
37
|
* 连接器从未拍过快照(`tools_synced_at` 为空且没有工具行,即 OAuth 授权码连接器安装时不 listTools,A16)时,
|
|
21
38
|
* 首个快照按安装处理(直接启用)。
|
|
22
39
|
*
|
|
23
|
-
*
|
|
40
|
+
* 触发:周期扫描(`drift-scan`,每 `tools.driftIntervalHours` 一次的 `@LockedInterval`,见 jobs.ts)、连接器在会话中报告工具清单变了(MCP
|
|
24
41
|
* `notifications/tools/list_changed`)、管理员手动刷新(`ConnectorsService.refresh`,走同一套比对)。
|
|
25
42
|
* 授权(`tool_grants` / `conversation_tool_grants`)按 spec_hash 比对(D8),复核通过采用新指纹后旧授权自然失效。
|
|
26
43
|
*/
|
|
27
|
-
|
|
28
|
-
export
|
|
29
|
-
export const DRIFT_SCHEDULER_ID = "drift-scan-interval";
|
|
30
|
-
/** 单个连接器的漂移检查任务名。 */
|
|
31
|
-
export const DRIFT_CONNECTOR_JOB = "drift-connector";
|
|
44
|
+
import { DRIFT_CONNECTOR_JOB } from "./job-ids.js";
|
|
45
|
+
export { DRIFT_CONNECTOR_JOB, DRIFT_SCAN_JOB, DRIFT_SCHEDULER_ID } from "./job-ids.js";
|
|
32
46
|
/**
|
|
33
47
|
* list_changed 触发的检查:jobId 按连接器与分钟桶去重(同一分钟内多次通知只检查一次;connectorId 为 UUID,不含 `:`)。
|
|
34
48
|
*/
|
|
@@ -167,30 +181,28 @@ export function toolIssue(slug, spec) {
|
|
|
167
181
|
}
|
|
168
182
|
/** 任务保留时长:完成的 jobId 留一段时间,同一桶内的重复投递被 BullMQ 按 jobId 去重。 */
|
|
169
183
|
const KEEP_FAILED = { age: 86_400 };
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
await this.check(orgId, connectorId, trigger);
|
|
189
|
-
});
|
|
190
|
-
}
|
|
184
|
+
let ToolDrift = class ToolDrift {
|
|
185
|
+
db;
|
|
186
|
+
registry;
|
|
187
|
+
credentials;
|
|
188
|
+
config;
|
|
189
|
+
log;
|
|
190
|
+
queue;
|
|
191
|
+
txHost;
|
|
192
|
+
constructor(db, registry, credentials, config, log,
|
|
193
|
+
/** The maintenance queue's producer (`drift-connector` jobs). */
|
|
194
|
+
queue, txHost) {
|
|
195
|
+
this.db = db;
|
|
196
|
+
this.registry = registry;
|
|
197
|
+
this.credentials = credentials;
|
|
198
|
+
this.config = config;
|
|
199
|
+
this.log = log;
|
|
200
|
+
this.queue = queue;
|
|
201
|
+
this.txHost = txHost;
|
|
191
202
|
}
|
|
203
|
+
/** The scan period (`tools.driftIntervalHours`). */
|
|
192
204
|
intervalMs() {
|
|
193
|
-
return this.
|
|
205
|
+
return this.config.get().tools.driftIntervalHours * 3_600_000;
|
|
194
206
|
}
|
|
195
207
|
/**
|
|
196
208
|
* 打开一次会话拉工具清单,无论成败都关闭会话;会话带 `listResources` 即视为支持 resources。
|
|
@@ -200,11 +212,11 @@ export class ToolDrift {
|
|
|
200
212
|
async listTools(connector, endpoint, auth, logCtx,
|
|
201
213
|
/** 收到 401:OAuth 连接器在刷新锁内刷新(参数为最后一次注入的鉴权)。 */
|
|
202
214
|
onUnauthorized = async () => { }) {
|
|
203
|
-
const c = this.
|
|
215
|
+
const c = this.registry.findConnector(connector);
|
|
204
216
|
if (!c) {
|
|
205
217
|
throw new ApiError("connector.connect_failed", `The connector ${connector} is not installed`);
|
|
206
218
|
}
|
|
207
|
-
const signal = AbortSignal.timeout(this.
|
|
219
|
+
const signal = AbortSignal.timeout(this.config.get().tools.timeoutMs);
|
|
208
220
|
const injected = [];
|
|
209
221
|
const tracked = async () => {
|
|
210
222
|
const inj = await auth();
|
|
@@ -230,20 +242,21 @@ export class ToolDrift {
|
|
|
230
242
|
if (e instanceof CredentialMissing)
|
|
231
243
|
throw e;
|
|
232
244
|
// 日志经 logger 打码(凭据值已在构造注入时登记)
|
|
233
|
-
this.
|
|
245
|
+
this.log.warn("connector listTools failed", { ...logCtx, connector, err: e });
|
|
234
246
|
throw new ApiError("connector.connect_failed", connectFailedMessage(e, redactorFor(injected)));
|
|
235
247
|
}
|
|
236
248
|
finally {
|
|
237
249
|
await session?.close().catch((e) => {
|
|
238
|
-
this.
|
|
250
|
+
this.log.warn("connector session close failed", { ...logCtx, connector, err: e });
|
|
239
251
|
});
|
|
240
252
|
}
|
|
241
253
|
}
|
|
242
254
|
/**
|
|
243
|
-
*
|
|
255
|
+
* 把新快照与当前工具行比对并写入(调用方已在事务内锁住连接器行:`mandatory`);返回按名排序的变化。
|
|
244
256
|
* 规则见文件头。待复核的新定义也写进 `tool_specs`(内容寻址,只增不改)。
|
|
245
257
|
*/
|
|
246
|
-
async apply(
|
|
258
|
+
async apply(app, rows) {
|
|
259
|
+
const t = this.db.db;
|
|
247
260
|
const current = await t
|
|
248
261
|
.selectFrom("connector_tools")
|
|
249
262
|
.select([
|
|
@@ -341,7 +354,7 @@ export class ToolDrift {
|
|
|
341
354
|
.where("name", "=", r.name)
|
|
342
355
|
.execute();
|
|
343
356
|
// No audit row (the model sees nothing new), but leave a trace for operators.
|
|
344
|
-
this.
|
|
357
|
+
this.log.info("connector tool display updated", {
|
|
345
358
|
event: "connector.tool_display_updated",
|
|
346
359
|
connectorId: app.id,
|
|
347
360
|
tool: r.name,
|
|
@@ -393,8 +406,8 @@ export class ToolDrift {
|
|
|
393
406
|
* 连不上 / 都失败 → 跳过(不改快照,下个周期或下次通知再查)。
|
|
394
407
|
*/
|
|
395
408
|
async check(orgId, connectorId, trigger) {
|
|
396
|
-
const
|
|
397
|
-
const app = (await db
|
|
409
|
+
const log = this.log;
|
|
410
|
+
const app = (await this.db
|
|
398
411
|
.selectFrom("connectors")
|
|
399
412
|
.select([
|
|
400
413
|
"id",
|
|
@@ -415,7 +428,7 @@ export class ToolDrift {
|
|
|
415
428
|
return { status: "skipped", reason: "not_found" };
|
|
416
429
|
if (app.status !== "active")
|
|
417
430
|
return { status: "skipped", reason: "inactive" };
|
|
418
|
-
if (!this.
|
|
431
|
+
if (!this.registry.findConnector(app.connector)) {
|
|
419
432
|
log.warn("tool drift check skipped: connector not installed", {
|
|
420
433
|
orgId,
|
|
421
434
|
connectorId,
|
|
@@ -427,7 +440,7 @@ export class ToolDrift {
|
|
|
427
440
|
const personal = auth.type !== "none" && !isOAuth(auth) && auth.ownership === "personal";
|
|
428
441
|
const personalOAuth = auth.type === "oauth_code";
|
|
429
442
|
const accounts = personal || personalOAuth
|
|
430
|
-
? await this.
|
|
443
|
+
? await this.credentials.personalHolders(orgId, connectorId, PERSONAL_CANDIDATES)
|
|
431
444
|
: [app.created_by];
|
|
432
445
|
if (accounts.length === 0) {
|
|
433
446
|
log.info("tool drift check skipped: no member credential", { orgId, connectorId });
|
|
@@ -437,7 +450,7 @@ export class ToolDrift {
|
|
|
437
450
|
let reason = "no_credential";
|
|
438
451
|
for (const accountId of accounts) {
|
|
439
452
|
try {
|
|
440
|
-
listed = await this.listTools(app.connector, app.endpoint, () => this.
|
|
453
|
+
listed = await this.listTools(app.connector, app.endpoint, () => this.credentials.injection(orgId, connectorId, auth, accountId), { orgId, connectorId, trigger }, (last) => this.credentials.onUnauthorized(orgId, connectorId, auth, accountId, last));
|
|
441
454
|
break;
|
|
442
455
|
}
|
|
443
456
|
catch (e) {
|
|
@@ -455,53 +468,57 @@ export class ToolDrift {
|
|
|
455
468
|
return { status: "skipped", reason };
|
|
456
469
|
}
|
|
457
470
|
const { rows } = snapshot(app.slug, listed.specs, listed.resources);
|
|
458
|
-
const changes = await
|
|
459
|
-
const locked = await t
|
|
460
|
-
.selectFrom("connectors")
|
|
461
|
-
.select(["id", "tools_synced_at"])
|
|
462
|
-
.where("id", "=", connectorId)
|
|
463
|
-
.where("deleted_at", "is", null)
|
|
464
|
-
.where("status", "=", "active")
|
|
465
|
-
.forUpdate()
|
|
466
|
-
.executeTakeFirst();
|
|
467
|
-
if (!locked)
|
|
468
|
-
return null;
|
|
469
|
-
const c = await this.apply(t, locked, rows);
|
|
470
|
-
if (c.added.length + c.changed.length + c.removed.length > 0) {
|
|
471
|
-
await audit(t, {
|
|
472
|
-
orgId,
|
|
473
|
-
action: "connector.tools_drifted",
|
|
474
|
-
target: connectorId,
|
|
475
|
-
detail: {
|
|
476
|
-
added: c.added.length,
|
|
477
|
-
changed: c.changed.length,
|
|
478
|
-
removed: c.removed.length,
|
|
479
|
-
trigger,
|
|
480
|
-
},
|
|
481
|
-
});
|
|
482
|
-
}
|
|
483
|
-
return c;
|
|
484
|
-
});
|
|
471
|
+
const changes = await this.applyChecked(orgId, connectorId, trigger, rows);
|
|
485
472
|
if (!changes)
|
|
486
473
|
return { status: "skipped", reason: "inactive" };
|
|
487
474
|
return { status: "checked", changes };
|
|
488
475
|
}
|
|
476
|
+
/** The locked compare-and-write of {@link check}, audited when something changed. */
|
|
477
|
+
async applyChecked(orgId, connectorId, trigger, rows) {
|
|
478
|
+
const t = this.db.db;
|
|
479
|
+
const locked = await t
|
|
480
|
+
.selectFrom("connectors")
|
|
481
|
+
.select(["id", "tools_synced_at"])
|
|
482
|
+
.where("id", "=", connectorId)
|
|
483
|
+
.where("deleted_at", "is", null)
|
|
484
|
+
.where("status", "=", "active")
|
|
485
|
+
.forUpdate()
|
|
486
|
+
.executeTakeFirst();
|
|
487
|
+
if (!locked)
|
|
488
|
+
return null;
|
|
489
|
+
const c = await this.apply(locked, rows);
|
|
490
|
+
if (c.added.length + c.changed.length + c.removed.length > 0) {
|
|
491
|
+
await audit(t, {
|
|
492
|
+
orgId,
|
|
493
|
+
action: "connector.tools_drifted",
|
|
494
|
+
target: connectorId,
|
|
495
|
+
detail: {
|
|
496
|
+
added: c.added.length,
|
|
497
|
+
changed: c.changed.length,
|
|
498
|
+
removed: c.removed.length,
|
|
499
|
+
trigger,
|
|
500
|
+
},
|
|
501
|
+
});
|
|
502
|
+
}
|
|
503
|
+
return c;
|
|
504
|
+
}
|
|
489
505
|
/**
|
|
490
506
|
* 连接器在会话中报告工具清单变了:投递一次该连接器的检查(jobId 按分钟桶去重)。投递失败只记日志。
|
|
491
507
|
*/
|
|
492
508
|
async onToolsChanged(orgId, connectorId) {
|
|
493
|
-
|
|
494
|
-
if (!m || connectorId.includes(":"))
|
|
509
|
+
if (connectorId.includes(":"))
|
|
495
510
|
return;
|
|
496
511
|
try {
|
|
497
|
-
await
|
|
512
|
+
await this.queue.add(DRIFT_CONNECTOR_JOB, { orgId, connectorId, trigger: "list_changed" }, {
|
|
498
513
|
jobId: listChangedJobId(connectorId),
|
|
514
|
+
// a check runs once: a failure waits for the next trigger (the queue default retries)
|
|
515
|
+
attempts: 1,
|
|
499
516
|
removeOnComplete: { age: 3_600 },
|
|
500
517
|
removeOnFail: KEEP_FAILED,
|
|
501
518
|
});
|
|
502
519
|
}
|
|
503
520
|
catch (err) {
|
|
504
|
-
this.
|
|
521
|
+
this.log.warn("cannot enqueue tool drift check", { orgId, connectorId, err });
|
|
505
522
|
}
|
|
506
523
|
}
|
|
507
524
|
/**
|
|
@@ -509,12 +526,9 @@ export class ToolDrift {
|
|
|
509
526
|
* jobId 按周期桶去重——即使扫描在多个副本上重复执行,每个连接器每周期也只检查一次。返回投递数。
|
|
510
527
|
*/
|
|
511
528
|
async scan() {
|
|
512
|
-
const m = this.d.maintenance;
|
|
513
|
-
if (!m)
|
|
514
|
-
return 0;
|
|
515
529
|
const interval = this.intervalMs();
|
|
516
530
|
const bucket = Math.floor(Date.now() / interval);
|
|
517
|
-
const apps = await this.
|
|
531
|
+
const apps = await this.db
|
|
518
532
|
.selectFrom("connectors")
|
|
519
533
|
.select(["id", "org_id"])
|
|
520
534
|
.where("deleted_at", "is", null)
|
|
@@ -528,12 +542,30 @@ export class ToolDrift {
|
|
|
528
542
|
for (const a of apps) {
|
|
529
543
|
if (a.id.includes(":"))
|
|
530
544
|
continue;
|
|
531
|
-
await
|
|
545
|
+
await this.queue.add(DRIFT_CONNECTOR_JOB, { orgId: a.org_id, connectorId: a.id, trigger: "schedule" }, {
|
|
532
546
|
jobId: driftScanJobId(a.id, bucket),
|
|
547
|
+
attempts: 1,
|
|
533
548
|
removeOnComplete: { age: Math.ceil(interval / 1000) },
|
|
534
549
|
removeOnFail: KEEP_FAILED,
|
|
535
550
|
});
|
|
536
551
|
}
|
|
537
552
|
return apps.length;
|
|
538
553
|
}
|
|
539
|
-
}
|
|
554
|
+
};
|
|
555
|
+
__decorate([
|
|
556
|
+
Transactional({ propagation: "mandatory" })
|
|
557
|
+
], ToolDrift.prototype, "apply", null);
|
|
558
|
+
__decorate([
|
|
559
|
+
Transactional()
|
|
560
|
+
], ToolDrift.prototype, "applyChecked", null);
|
|
561
|
+
ToolDrift = __decorate([
|
|
562
|
+
Injectable(),
|
|
563
|
+
__param(0, Inject(KernelDb)),
|
|
564
|
+
__param(1, Inject(ToolRegistry)),
|
|
565
|
+
__param(2, Inject(Credentials)),
|
|
566
|
+
__param(3, Inject(KernelConfigService)),
|
|
567
|
+
__param(4, Inject(KERNEL_LOGGER)),
|
|
568
|
+
__param(5, Inject(getQueueToken(MAINTENANCE_QUEUE_NAME))),
|
|
569
|
+
__param(6, Inject(TransactionHost))
|
|
570
|
+
], ToolDrift);
|
|
571
|
+
export { ToolDrift };
|
package/dist/tools/info.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
import type {
|
|
1
|
+
import { ConversationAccess } from "../conversations/access.js";
|
|
2
|
+
import type { KernelSchemaDb } from "../db/kernel-schema.js";
|
|
3
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
4
|
+
import { ToolRegistry } from "./registry.js";
|
|
3
5
|
/**
|
|
4
6
|
* Tool presentation metadata for the conversation page (UI refresh B, design spec §6.16.9): the
|
|
5
7
|
* kind picks the row verb and the group counts, the title and key arguments the row's wording.
|
|
@@ -35,7 +37,7 @@ export declare const BUILTIN_TOOL_KINDS: Readonly<Record<string, ToolKind>>;
|
|
|
35
37
|
export declare const TOOL_INFO_MAX_KEYS = 100;
|
|
36
38
|
export declare const TOOL_INFO_KEY_MAX = 200;
|
|
37
39
|
export interface ToolInfoDeps {
|
|
38
|
-
db:
|
|
40
|
+
db: KernelSchemaDb;
|
|
39
41
|
registry: Pick<ToolRegistry, "builtinSpecs" | "extensionToolSpecs">;
|
|
40
42
|
}
|
|
41
43
|
/**
|
|
@@ -55,13 +57,14 @@ export interface ToolInfoDeps {
|
|
|
55
57
|
* here it only changes the label.
|
|
56
58
|
*/
|
|
57
59
|
export declare function toolInfo(deps: ToolInfoDeps, orgId: string, keys: readonly string[]): Promise<ToolInfo[]>;
|
|
58
|
-
export interface ConversationToolInfoDeps extends ToolInfoDeps {
|
|
59
|
-
/** Conversation visibility (the same rule as the events API: `ConversationsService.isAccessible`). */
|
|
60
|
-
isAccessible(orgId: string, conversationId: string, viewerAccountId: string): Promise<boolean>;
|
|
61
|
-
}
|
|
62
60
|
/** `GET /conversations/:id/tools`: {@link toolInfo} for a conversation the viewer can read. */
|
|
63
61
|
export declare class ConversationToolInfo {
|
|
64
|
-
private readonly
|
|
65
|
-
|
|
62
|
+
private readonly db;
|
|
63
|
+
private readonly registry;
|
|
64
|
+
/** Conversation visibility (the same rule as the events API). */
|
|
65
|
+
private readonly access;
|
|
66
|
+
constructor(db: KernelDb, registry: Pick<ToolRegistry, "builtinSpecs" | "extensionToolSpecs">,
|
|
67
|
+
/** Conversation visibility (the same rule as the events API). */
|
|
68
|
+
access: Pick<ConversationAccess, "isAccessible">);
|
|
66
69
|
get(orgId: string, conversationId: string, viewerAccountId: string, keys: readonly string[]): Promise<ToolInfo[]>;
|
|
67
70
|
}
|
package/dist/tools/info.js
CHANGED
|
@@ -1,6 +1,19 @@
|
|
|
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
|
+
};
|
|
10
|
+
import { Inject, Injectable } from "@nestjs/common";
|
|
11
|
+
import { ConversationAccess } from "../conversations/access.js";
|
|
1
12
|
import { ApiError } from "../errors.js";
|
|
13
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
2
14
|
import { UUID_RE } from "../ui/registry.js";
|
|
3
15
|
import { KEY_SEPARATOR, toolKey } from "./naming.js";
|
|
16
|
+
import { ToolRegistry } from "./registry.js";
|
|
4
17
|
/** Kinds of the kernel builtin tools; a builtin missing here is a plain `tool`. */
|
|
5
18
|
export const BUILTIN_TOOL_KINDS = {
|
|
6
19
|
sandbox_bash: "command",
|
|
@@ -98,16 +111,29 @@ export async function toolInfo(deps, orgId, keys) {
|
|
|
98
111
|
});
|
|
99
112
|
}
|
|
100
113
|
/** `GET /conversations/:id/tools`: {@link toolInfo} for a conversation the viewer can read. */
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
114
|
+
let ConversationToolInfo = class ConversationToolInfo {
|
|
115
|
+
db;
|
|
116
|
+
registry;
|
|
117
|
+
access;
|
|
118
|
+
constructor(db, registry,
|
|
119
|
+
/** Conversation visibility (the same rule as the events API). */
|
|
120
|
+
access) {
|
|
121
|
+
this.db = db;
|
|
122
|
+
this.registry = registry;
|
|
123
|
+
this.access = access;
|
|
105
124
|
}
|
|
106
125
|
async get(orgId, conversationId, viewerAccountId, keys) {
|
|
107
126
|
if (!UUID_RE.test(conversationId) ||
|
|
108
|
-
!(await this.
|
|
127
|
+
!(await this.access.isAccessible(orgId, conversationId, viewerAccountId))) {
|
|
109
128
|
throw new ApiError("conversation.not_found", "Conversation not found");
|
|
110
129
|
}
|
|
111
|
-
return toolInfo(this.
|
|
130
|
+
return toolInfo({ db: this.db.db, registry: this.registry }, orgId, keys);
|
|
112
131
|
}
|
|
113
|
-
}
|
|
132
|
+
};
|
|
133
|
+
ConversationToolInfo = __decorate([
|
|
134
|
+
Injectable(),
|
|
135
|
+
__param(0, Inject(KernelDb)),
|
|
136
|
+
__param(1, Inject(ToolRegistry)),
|
|
137
|
+
__param(2, Inject(ConversationAccess))
|
|
138
|
+
], ConversationToolInfo);
|
|
139
|
+
export { ConversationToolInfo };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** The periodic drift scan (`@LockedInterval`, tools/jobs.ts). */
|
|
2
|
+
export declare const DRIFT_SCAN_JOB = "drift-scan";
|
|
3
|
+
/** The BullMQ repeatable scheduler the scan had before it became `@LockedInterval` (retired). */
|
|
4
|
+
export declare const DRIFT_SCHEDULER_ID = "drift-scan-interval";
|
|
5
|
+
/**
|
|
6
|
+
* 单个连接器的漂移检查任务名(维护队列上的一次性任务:生产方是 `ToolDrift`,消费方是
|
|
7
|
+
* `MaintenanceProcessor`)。
|
|
8
|
+
*/
|
|
9
|
+
export declare const DRIFT_CONNECTOR_JOB = "drift-connector";
|
|
10
|
+
/** The hourly cleanup of expired tool output archives (`@LockedCron`, tools/jobs.ts). */
|
|
11
|
+
export declare const OUTPUT_CLEANUP_JOB = "output-cleanup";
|
|
12
|
+
/** The BullMQ repeatable scheduler the cleanup had before it became `@LockedCron` (retired). */
|
|
13
|
+
export declare const OUTPUT_CLEANUP_SCHEDULER_ID = "output-cleanup-hourly";
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// The tools' job names and the retired scheduler ids: a leaf module (no service imports), read by
|
|
2
|
+
// the maintenance queue's retirement list.
|
|
3
|
+
/** The periodic drift scan (`@LockedInterval`, tools/jobs.ts). */
|
|
4
|
+
export const DRIFT_SCAN_JOB = "drift-scan";
|
|
5
|
+
/** The BullMQ repeatable scheduler the scan had before it became `@LockedInterval` (retired). */
|
|
6
|
+
export const DRIFT_SCHEDULER_ID = "drift-scan-interval";
|
|
7
|
+
/**
|
|
8
|
+
* 单个连接器的漂移检查任务名(维护队列上的一次性任务:生产方是 `ToolDrift`,消费方是
|
|
9
|
+
* `MaintenanceProcessor`)。
|
|
10
|
+
*/
|
|
11
|
+
export const DRIFT_CONNECTOR_JOB = "drift-connector";
|
|
12
|
+
/** The hourly cleanup of expired tool output archives (`@LockedCron`, tools/jobs.ts). */
|
|
13
|
+
export const OUTPUT_CLEANUP_JOB = "output-cleanup";
|
|
14
|
+
/** The BullMQ repeatable scheduler the cleanup had before it became `@LockedCron` (retired). */
|
|
15
|
+
export const OUTPUT_CLEANUP_SCHEDULER_ID = "output-cleanup-hourly";
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
2
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
3
|
+
import { LockService } from "../infra/lock/lock.service.js";
|
|
4
|
+
import type { KernelLogger } from "../log.js";
|
|
5
|
+
import { ToolDrift } from "./drift.js";
|
|
6
|
+
/**
|
|
7
|
+
* The tools' periodic jobs, each run once per tick across replicas: the tool drift scan
|
|
8
|
+
* (`drift-scan`, every `tools.driftIntervalHours` and once right after the start, as the old
|
|
9
|
+
* repeatable scheduler's first run: `@LockedInterval` with `runOnStart`; a repeated scan in the
|
|
10
|
+
* same period enqueues nothing new, its job ids are per period) and the hourly cleanup of expired
|
|
11
|
+
* tool output archives (`output-cleanup`: `@LockedCron`).
|
|
12
|
+
*/
|
|
13
|
+
export declare class ToolJobs {
|
|
14
|
+
private readonly drift;
|
|
15
|
+
private readonly db;
|
|
16
|
+
readonly config: KernelConfigService;
|
|
17
|
+
readonly lockService: LockService;
|
|
18
|
+
readonly log: KernelLogger;
|
|
19
|
+
constructor(drift: Pick<ToolDrift, "scan">, db: KernelDb, config: KernelConfigService, lockService: LockService, log: KernelLogger);
|
|
20
|
+
/** Enqueues a drift check of every active connector not checked in this period. */
|
|
21
|
+
scanDrift(): Promise<void>;
|
|
22
|
+
/** Deletes expired tool output archives (in batches, no long transaction). */
|
|
23
|
+
cleanupOutputs(): Promise<void>;
|
|
24
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
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
|
+
};
|
|
10
|
+
import { Inject, Injectable } from "@nestjs/common";
|
|
11
|
+
import { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
12
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
13
|
+
import { LockService } from "../infra/lock/lock.service.js";
|
|
14
|
+
import { LockedCron } from "../infra/schedule/locked-cron.decorator.js";
|
|
15
|
+
import { LockedInterval } from "../infra/schedule/locked-interval.js";
|
|
16
|
+
import { KERNEL_LOGGER } from "../infra/tokens.js";
|
|
17
|
+
import { ToolDrift } from "./drift.js";
|
|
18
|
+
import { DRIFT_SCAN_JOB, OUTPUT_CLEANUP_JOB } from "./job-ids.js";
|
|
19
|
+
import { deleteExpiredOutputs } from "./outputs.js";
|
|
20
|
+
/**
|
|
21
|
+
* The tools' periodic jobs, each run once per tick across replicas: the tool drift scan
|
|
22
|
+
* (`drift-scan`, every `tools.driftIntervalHours` and once right after the start, as the old
|
|
23
|
+
* repeatable scheduler's first run: `@LockedInterval` with `runOnStart`; a repeated scan in the
|
|
24
|
+
* same period enqueues nothing new, its job ids are per period) and the hourly cleanup of expired
|
|
25
|
+
* tool output archives (`output-cleanup`: `@LockedCron`).
|
|
26
|
+
*/
|
|
27
|
+
let ToolJobs = class ToolJobs {
|
|
28
|
+
drift;
|
|
29
|
+
db;
|
|
30
|
+
config;
|
|
31
|
+
lockService;
|
|
32
|
+
log;
|
|
33
|
+
constructor(drift, db, config, lockService, log) {
|
|
34
|
+
this.drift = drift;
|
|
35
|
+
this.db = db;
|
|
36
|
+
this.config = config;
|
|
37
|
+
this.lockService = lockService;
|
|
38
|
+
this.log = log;
|
|
39
|
+
}
|
|
40
|
+
/** Enqueues a drift check of every active connector not checked in this period. */
|
|
41
|
+
async scanDrift() {
|
|
42
|
+
const n = await this.drift.scan();
|
|
43
|
+
if (n > 0)
|
|
44
|
+
this.log.info("tool drift checks enqueued", { count: n });
|
|
45
|
+
}
|
|
46
|
+
/** Deletes expired tool output archives (in batches, no long transaction). */
|
|
47
|
+
async cleanupOutputs() {
|
|
48
|
+
const n = await deleteExpiredOutputs(this.db.db);
|
|
49
|
+
if (n > 0)
|
|
50
|
+
this.log.info("expired tool outputs deleted", { count: n });
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
__decorate([
|
|
54
|
+
LockedInterval(DRIFT_SCAN_JOB, (c) => c.tools.driftIntervalHours * 3_600_000, {
|
|
55
|
+
runOnStart: true,
|
|
56
|
+
})
|
|
57
|
+
], ToolJobs.prototype, "scanDrift", null);
|
|
58
|
+
__decorate([
|
|
59
|
+
LockedCron("0 * * * *", { name: OUTPUT_CLEANUP_JOB })
|
|
60
|
+
], ToolJobs.prototype, "cleanupOutputs", null);
|
|
61
|
+
ToolJobs = __decorate([
|
|
62
|
+
Injectable(),
|
|
63
|
+
__param(0, Inject(ToolDrift)),
|
|
64
|
+
__param(1, Inject(KernelDb)),
|
|
65
|
+
__param(2, Inject(KernelConfigService)),
|
|
66
|
+
__param(3, Inject(LockService)),
|
|
67
|
+
__param(4, Inject(KERNEL_LOGGER))
|
|
68
|
+
], ToolJobs);
|
|
69
|
+
export { ToolJobs };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ApiError } from "../../errors.js";
|
|
2
|
+
/** 授权回调的路径(`http.publicUrl` + 它 = 注册给授权服务器的 redirect_uri)。 */
|
|
3
|
+
export declare const OAUTH_CALLBACK_PATH = "/api/v1/oauth/callback";
|
|
4
|
+
/** state 的有效期(秒)。 */
|
|
5
|
+
export declare const OAUTH_STATE_TTL_SECONDS = 600;
|
|
6
|
+
/** 浏览器绑定 Cookie:回调必须来自发起连接的同一个浏览器。 */
|
|
7
|
+
export declare const OAUTH_BINDING_COOKIE = "cap_oauth";
|
|
8
|
+
/** 回调失败、或连接时没给回跳页面时回到的网页(next-intl 会补语言前缀)。 */
|
|
9
|
+
export declare const DEFAULT_RETURN_PATH = "/settings/connections";
|
|
10
|
+
/** OAuth 连接器需要 `http.publicUrl`(回调地址);未配置 → 这条校验错误。 */
|
|
11
|
+
export declare const publicUrlRequired: () => ApiError;
|
|
12
|
+
export declare function callbackUrl(publicUrl: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* 回跳页面只接受站内相对路径(防开放重定向):以单个 `/` 开头,不含 `\` 与控制字符,解析后仍在同一个源。
|
|
15
|
+
*/
|
|
16
|
+
export declare function isSafeReturnPath(p: string): boolean;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { ApiError } from "../../errors.js";
|
|
2
|
+
// The OAuth connect flow's paths and URL rules: a leaf module (no service imports), so the
|
|
3
|
+
// connectors service can use them without an import cycle through the flow.
|
|
4
|
+
/** 授权回调的路径(`http.publicUrl` + 它 = 注册给授权服务器的 redirect_uri)。 */
|
|
5
|
+
export const OAUTH_CALLBACK_PATH = "/api/v1/oauth/callback";
|
|
6
|
+
/** state 的有效期(秒)。 */
|
|
7
|
+
export const OAUTH_STATE_TTL_SECONDS = 600;
|
|
8
|
+
/** 浏览器绑定 Cookie:回调必须来自发起连接的同一个浏览器。 */
|
|
9
|
+
export const OAUTH_BINDING_COOKIE = "cap_oauth";
|
|
10
|
+
/** 回调失败、或连接时没给回跳页面时回到的网页(next-intl 会补语言前缀)。 */
|
|
11
|
+
export const DEFAULT_RETURN_PATH = "/settings/connections";
|
|
12
|
+
/** OAuth 连接器需要 `http.publicUrl`(回调地址);未配置 → 这条校验错误。 */
|
|
13
|
+
export const publicUrlRequired = () => new ApiError("validation_failed", "Request validation failed", [
|
|
14
|
+
{
|
|
15
|
+
path: "auth",
|
|
16
|
+
message: "OAuth connectors require http.publicUrl to be configured (it is used to build the OAuth callback URL)",
|
|
17
|
+
},
|
|
18
|
+
]);
|
|
19
|
+
export function callbackUrl(publicUrl) {
|
|
20
|
+
return `${publicUrl.replace(/\/+$/, "")}${OAUTH_CALLBACK_PATH}`;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 回跳页面只接受站内相对路径(防开放重定向):以单个 `/` 开头,不含 `\` 与控制字符,解析后仍在同一个源。
|
|
24
|
+
*/
|
|
25
|
+
export function isSafeReturnPath(p) {
|
|
26
|
+
if (p.length > 500 || !p.startsWith("/") || p.startsWith("//"))
|
|
27
|
+
return false;
|
|
28
|
+
// biome-ignore lint/suspicious/noControlCharactersInRegex: 正是要拒绝控制字符
|
|
29
|
+
if (/[\\\u0000-\u001f\u007f]/.test(p))
|
|
30
|
+
return false;
|
|
31
|
+
const base = "https://return.invalid";
|
|
32
|
+
try {
|
|
33
|
+
return new URL(p, base).origin === base;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
}
|