@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
|
@@ -1,11 +1,32 @@
|
|
|
1
1
|
import type { ChannelTarget } from "@capybara-hq/plugin-sdk";
|
|
2
|
-
import type {
|
|
2
|
+
import type { KernelSchemaDb } from "../db/kernel-schema.js";
|
|
3
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
4
|
+
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
5
|
+
import { XactLock } from "../infra/database/xact-lock.js";
|
|
3
6
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
+
* The lock of an org's anonymous guest account (one provider per transaction-scoped lock):
|
|
8
|
+
* serializes the first creation across replicas, so only one account is created. Joins the caller's
|
|
9
|
+
* transaction (`mandatory`), which holds it until it ends.
|
|
7
10
|
*/
|
|
8
|
-
export declare
|
|
11
|
+
export declare class AnonymousGuestLock {
|
|
12
|
+
private readonly xactLock;
|
|
13
|
+
readonly txHost: TransactionHost;
|
|
14
|
+
constructor(xactLock: XactLock, txHost: TransactionHost);
|
|
15
|
+
lock(orgId: string): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
/** 组织的匿名访客账号(渠道连接的未绑定策略 `anonymous`)。 */
|
|
18
|
+
export declare class AnonymousGuests {
|
|
19
|
+
private readonly db;
|
|
20
|
+
private readonly guestLock;
|
|
21
|
+
readonly txHost: TransactionHost;
|
|
22
|
+
constructor(db: KernelDb, guestLock: AnonymousGuestLock, txHost: TransactionHost);
|
|
23
|
+
/**
|
|
24
|
+
* 该组织唯一的匿名访客账号 id;首次使用时创建(`accounts.status = active`、没有任何登录方式、组织角色 guest)。
|
|
25
|
+
* 每次都确保成员关系存在(被移出后再次使用会补回 guest):运行的兜底扫描会中止「发起人已不是该组织成员」的运行。
|
|
26
|
+
* 跨副本并发首次创建由 {@link AnonymousGuestLock} 串行化,只建一个账号。
|
|
27
|
+
*/
|
|
28
|
+
ensure(orgId: string): Promise<string>;
|
|
29
|
+
}
|
|
9
30
|
/** 一条 IM 话题的定位:连接 + chat + 话题键 + 账号(匿名为 null)。 */
|
|
10
31
|
export interface ThreadKey {
|
|
11
32
|
connectionId: string;
|
|
@@ -19,11 +40,11 @@ export interface ThreadKey {
|
|
|
19
40
|
*/
|
|
20
41
|
export declare function threadKeyOf(target: ChannelTarget, senderExternalId: string, messageId: string): string;
|
|
21
42
|
/** 未归档的话题行对应的会话;没有返回 undefined。 */
|
|
22
|
-
export declare function findThread(db:
|
|
43
|
+
export declare function findThread(db: KernelSchemaDb, k: ThreadKey): Promise<string | undefined>;
|
|
23
44
|
/**
|
|
24
45
|
* 记下话题 → 会话;同一话题已有未归档的行(并发的另一条消息抢先建了)时不写,返回已有的会话 id。
|
|
25
46
|
* 返回实际生效的会话 id。
|
|
26
47
|
*/
|
|
27
|
-
export declare function insertThread(db:
|
|
48
|
+
export declare function insertThread(db: KernelSchemaDb, k: ThreadKey, conversationId: string): Promise<string>;
|
|
28
49
|
/** 私聊 `/new`:归档当前话题行(下一条消息新建对话)。返回是否归档了一行。 */
|
|
29
|
-
export declare function archiveThread(db:
|
|
50
|
+
export declare function archiveThread(db: KernelSchemaDb, k: ThreadKey): Promise<boolean>;
|
package/dist/channels/threads.js
CHANGED
|
@@ -1,19 +1,67 @@
|
|
|
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";
|
|
11
|
+
import { Inject, Injectable } from "@nestjs/common";
|
|
2
12
|
import { sql } from "kysely";
|
|
3
13
|
import { audit } from "../identity/audit.js";
|
|
14
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
15
|
+
import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
16
|
+
import { Transactional } from "../infra/database/transactional.decorator.js";
|
|
17
|
+
import { XactLock } from "../infra/database/xact-lock.js";
|
|
4
18
|
/** 匿名访客账号的显示名。 */
|
|
5
19
|
const ANONYMOUS_DISPLAY_NAME = "Anonymous guest";
|
|
6
20
|
/** 匿名访客成员关系的来源标记(通讯录同步只撤销 `directory:*`,不会碰它)。 */
|
|
7
21
|
const ANONYMOUS_MEMBERSHIP_SOURCE = "anonymous";
|
|
8
22
|
/**
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
23
|
+
* The lock of an org's anonymous guest account (one provider per transaction-scoped lock):
|
|
24
|
+
* serializes the first creation across replicas, so only one account is created. Joins the caller's
|
|
25
|
+
* transaction (`mandatory`), which holds it until it ends.
|
|
12
26
|
*/
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
27
|
+
let AnonymousGuestLock = class AnonymousGuestLock {
|
|
28
|
+
xactLock;
|
|
29
|
+
txHost;
|
|
30
|
+
constructor(xactLock, txHost) {
|
|
31
|
+
this.xactLock = xactLock;
|
|
32
|
+
this.txHost = txHost;
|
|
33
|
+
}
|
|
34
|
+
async lock(orgId) {
|
|
35
|
+
await this.xactLock.lock(`capybara.anonymous:${orgId}`);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
__decorate([
|
|
39
|
+
Transactional({ propagation: "mandatory" })
|
|
40
|
+
], AnonymousGuestLock.prototype, "lock", null);
|
|
41
|
+
AnonymousGuestLock = __decorate([
|
|
42
|
+
Injectable(),
|
|
43
|
+
__param(0, Inject(XactLock)),
|
|
44
|
+
__param(1, Inject(TransactionHost))
|
|
45
|
+
], AnonymousGuestLock);
|
|
46
|
+
export { AnonymousGuestLock };
|
|
47
|
+
/** 组织的匿名访客账号(渠道连接的未绑定策略 `anonymous`)。 */
|
|
48
|
+
let AnonymousGuests = class AnonymousGuests {
|
|
49
|
+
db;
|
|
50
|
+
guestLock;
|
|
51
|
+
txHost;
|
|
52
|
+
constructor(db, guestLock, txHost) {
|
|
53
|
+
this.db = db;
|
|
54
|
+
this.guestLock = guestLock;
|
|
55
|
+
this.txHost = txHost;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* 该组织唯一的匿名访客账号 id;首次使用时创建(`accounts.status = active`、没有任何登录方式、组织角色 guest)。
|
|
59
|
+
* 每次都确保成员关系存在(被移出后再次使用会补回 guest):运行的兜底扫描会中止「发起人已不是该组织成员」的运行。
|
|
60
|
+
* 跨副本并发首次创建由 {@link AnonymousGuestLock} 串行化,只建一个账号。
|
|
61
|
+
*/
|
|
62
|
+
async ensure(orgId) {
|
|
63
|
+
await this.guestLock.lock(orgId);
|
|
64
|
+
const existing = await this.db
|
|
17
65
|
.selectFrom("org_anonymous_accounts")
|
|
18
66
|
.select("account_id")
|
|
19
67
|
.where("org_id", "=", orgId)
|
|
@@ -21,22 +69,22 @@ export async function ensureAnonymousGuest(db, orgId) {
|
|
|
21
69
|
let accountId = existing?.account_id;
|
|
22
70
|
if (accountId === undefined) {
|
|
23
71
|
accountId = randomUUID();
|
|
24
|
-
await
|
|
72
|
+
await this.db
|
|
25
73
|
.insertInto("accounts")
|
|
26
74
|
.values({ id: accountId, display_name: ANONYMOUS_DISPLAY_NAME, email: null })
|
|
27
75
|
.execute();
|
|
28
|
-
await
|
|
76
|
+
await this.db
|
|
29
77
|
.insertInto("org_anonymous_accounts")
|
|
30
78
|
.values({ org_id: orgId, account_id: accountId })
|
|
31
79
|
.execute();
|
|
32
|
-
await audit(
|
|
80
|
+
await audit(this.db.db, {
|
|
33
81
|
orgId,
|
|
34
82
|
action: "account.created",
|
|
35
83
|
target: accountId,
|
|
36
84
|
detail: { anonymousGuest: true },
|
|
37
85
|
});
|
|
38
86
|
}
|
|
39
|
-
await
|
|
87
|
+
await this.db
|
|
40
88
|
.insertInto("memberships")
|
|
41
89
|
.values({
|
|
42
90
|
org_id: orgId,
|
|
@@ -47,8 +95,18 @@ export async function ensureAnonymousGuest(db, orgId) {
|
|
|
47
95
|
.onConflict((oc) => oc.columns(["org_id", "account_id"]).doNothing())
|
|
48
96
|
.execute();
|
|
49
97
|
return accountId;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
__decorate([
|
|
101
|
+
Transactional()
|
|
102
|
+
], AnonymousGuests.prototype, "ensure", null);
|
|
103
|
+
AnonymousGuests = __decorate([
|
|
104
|
+
Injectable(),
|
|
105
|
+
__param(0, Inject(KernelDb)),
|
|
106
|
+
__param(1, Inject(AnonymousGuestLock)),
|
|
107
|
+
__param(2, Inject(TransactionHost))
|
|
108
|
+
], AnonymousGuests);
|
|
109
|
+
export { AnonymousGuests };
|
|
52
110
|
/**
|
|
53
111
|
* 话题键:私聊 `dm:<externalId>`;群聊用平台话题 id,消息不在话题里(开启新话题)时用该消息 id——
|
|
54
112
|
* 机器人回复在以它为根的话题里,后续消息的 threadId 就是它,于是落到同一个对话。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ChannelWebhookRequest, ChannelWebhookResponse, Logger } from "@capybara-hq/plugin-sdk";
|
|
2
|
-
import
|
|
3
|
-
import
|
|
2
|
+
import { ChannelConnections } from "./connections.service.js";
|
|
3
|
+
import { ChannelInbound } from "./inbound.js";
|
|
4
4
|
/**
|
|
5
5
|
* Deadline of one webhook request: connection lookups, the plugin's `webhook.handle` and handing
|
|
6
6
|
* its events to `onEvent` (platform ack deadlines are a few seconds). Past it the kernel answers 503.
|
|
@@ -8,6 +8,15 @@ import type { ChannelInbound } from "./inbound.js";
|
|
|
8
8
|
export declare const WEBHOOK_HANDLE_TIMEOUT_MS = 10000;
|
|
9
9
|
/** How long a connection's decrypted runtime (plugin + config) is reused across requests. */
|
|
10
10
|
export declare const WEBHOOK_RUNTIME_CACHE_MS = 5000;
|
|
11
|
+
/** The timings of {@link ChannelWebhooks}. */
|
|
12
|
+
export interface ChannelWebhookTimings {
|
|
13
|
+
/** The deadline of one request (ms), default {@link WEBHOOK_HANDLE_TIMEOUT_MS}. */
|
|
14
|
+
handleTimeoutMs: number;
|
|
15
|
+
/** How long a connection's runtime is reused (ms; 0 disables the cache), default {@link WEBHOOK_RUNTIME_CACHE_MS}. */
|
|
16
|
+
runtimeCacheMs: number;
|
|
17
|
+
}
|
|
18
|
+
/** Optional provider: {@link ChannelWebhookTimings} that replace some defaults (tests). */
|
|
19
|
+
export declare const CHANNEL_WEBHOOK_TIMINGS: unique symbol;
|
|
11
20
|
/** Most connections whose runtime is cached in one process. */
|
|
12
21
|
export declare const WEBHOOK_RUNTIME_CACHE_MAX = 1000;
|
|
13
22
|
/**
|
|
@@ -15,17 +24,8 @@ export declare const WEBHOOK_RUNTIME_CACHE_MAX = 1000;
|
|
|
15
24
|
* be rendered or sniffed by a browser).
|
|
16
25
|
*/
|
|
17
26
|
export declare const WEBHOOK_SECURITY_HEADERS: Readonly<Record<string, string>>;
|
|
18
|
-
export interface ChannelWebhooksDeps {
|
|
19
|
-
connections: Pick<ChannelConnections, "row" | "runtime">;
|
|
20
|
-
inbound: Pick<ChannelInbound, "onEvent">;
|
|
21
|
-
log: Pick<Logger, "warn">;
|
|
22
|
-
/** Defaults to {@link WEBHOOK_HANDLE_TIMEOUT_MS}. */
|
|
23
|
-
handleTimeoutMs?: number;
|
|
24
|
-
/** Defaults to {@link WEBHOOK_RUNTIME_CACHE_MS}; 0 disables the cache. */
|
|
25
|
-
runtimeCacheMs?: number;
|
|
26
|
-
}
|
|
27
27
|
/**
|
|
28
|
-
* Channel webhook inbound (F8 / F9),
|
|
28
|
+
* Channel webhook inbound (F8 / F9), gateway role only. The gateway route
|
|
29
29
|
* `POST /channels/webhook/:connectionId` hands every request here; the kernel applies no auth, so
|
|
30
30
|
* everything a request can do goes through the plugin's `webhook.handle`, which verifies the
|
|
31
31
|
* signature, decrypts and checks timestamps:
|
|
@@ -57,11 +57,17 @@ export interface ChannelWebhooksDeps {
|
|
|
57
57
|
* counter keeps a fetch that started before `invalidateAll` from storing the old plugin instance.
|
|
58
58
|
*/
|
|
59
59
|
export declare class ChannelWebhooks {
|
|
60
|
-
private readonly
|
|
60
|
+
private readonly connections;
|
|
61
|
+
private readonly inbound;
|
|
62
|
+
private readonly log;
|
|
61
63
|
private readonly runtimes;
|
|
62
64
|
/** Bumped by {@link invalidateAll}: a fetch started before the bump is not stored. */
|
|
63
65
|
private generation;
|
|
64
|
-
|
|
66
|
+
/** The deadline of one request. */
|
|
67
|
+
private readonly handleTimeoutMs;
|
|
68
|
+
/** How long a connection's runtime is reused; 0 disables the cache. */
|
|
69
|
+
private readonly runtimeCacheMs;
|
|
70
|
+
constructor(connections: Pick<ChannelConnections, "row" | "runtime">, inbound: Pick<ChannelInbound, "onEvent">, log: Pick<Logger, "warn">, timings?: Partial<ChannelWebhookTimings>);
|
|
65
71
|
/** Drops the cached runtime of one connection (on `channel.changed`). */
|
|
66
72
|
invalidate(connectionId: string): void;
|
|
67
73
|
/** Drops every cached runtime (a plugin was replaced, revoked or reloaded). */
|
package/dist/channels/webhook.js
CHANGED
|
@@ -1,5 +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
|
+
};
|
|
10
|
+
import { Inject, Injectable, Optional } from "@nestjs/common";
|
|
1
11
|
import { ApiError, errorBody } from "../errors.js";
|
|
2
12
|
import { ExtensionUnloadedError } from "../extensions/inflight.js";
|
|
13
|
+
import { KERNEL_LOGGER } from "../infra/tokens.js";
|
|
14
|
+
import { ChannelConnections } from "./connections.service.js";
|
|
15
|
+
import { ChannelInbound } from "./inbound.js";
|
|
3
16
|
/**
|
|
4
17
|
* Deadline of one webhook request: connection lookups, the plugin's `webhook.handle` and handing
|
|
5
18
|
* its events to `onEvent` (platform ack deadlines are a few seconds). Past it the kernel answers 503.
|
|
@@ -7,6 +20,8 @@ import { ExtensionUnloadedError } from "../extensions/inflight.js";
|
|
|
7
20
|
export const WEBHOOK_HANDLE_TIMEOUT_MS = 10_000;
|
|
8
21
|
/** How long a connection's decrypted runtime (plugin + config) is reused across requests. */
|
|
9
22
|
export const WEBHOOK_RUNTIME_CACHE_MS = 5_000;
|
|
23
|
+
/** Optional provider: {@link ChannelWebhookTimings} that replace some defaults (tests). */
|
|
24
|
+
export const CHANNEL_WEBHOOK_TIMINGS = Symbol("CHANNEL_WEBHOOK_TIMINGS");
|
|
10
25
|
/** Most connections whose runtime is cached in one process. */
|
|
11
26
|
export const WEBHOOK_RUNTIME_CACHE_MAX = 1_000;
|
|
12
27
|
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
@@ -60,7 +75,7 @@ function raceAbort(p, signal) {
|
|
|
60
75
|
});
|
|
61
76
|
}
|
|
62
77
|
/**
|
|
63
|
-
* Channel webhook inbound (F8 / F9),
|
|
78
|
+
* Channel webhook inbound (F8 / F9), gateway role only. The gateway route
|
|
64
79
|
* `POST /channels/webhook/:connectionId` hands every request here; the kernel applies no auth, so
|
|
65
80
|
* everything a request can do goes through the plugin's `webhook.handle`, which verifies the
|
|
66
81
|
* signature, decrypts and checks timestamps:
|
|
@@ -91,13 +106,23 @@ function raceAbort(p, signal) {
|
|
|
91
106
|
* mode switch, deletion…) and {@link invalidateAll} when a plugin instance changes; a generation
|
|
92
107
|
* counter keeps a fetch that started before `invalidateAll` from storing the old plugin instance.
|
|
93
108
|
*/
|
|
94
|
-
|
|
95
|
-
|
|
109
|
+
let ChannelWebhooks = class ChannelWebhooks {
|
|
110
|
+
connections;
|
|
111
|
+
inbound;
|
|
112
|
+
log;
|
|
96
113
|
runtimes = new Map();
|
|
97
114
|
/** Bumped by {@link invalidateAll}: a fetch started before the bump is not stored. */
|
|
98
115
|
generation = 0;
|
|
99
|
-
|
|
100
|
-
|
|
116
|
+
/** The deadline of one request. */
|
|
117
|
+
handleTimeoutMs;
|
|
118
|
+
/** How long a connection's runtime is reused; 0 disables the cache. */
|
|
119
|
+
runtimeCacheMs;
|
|
120
|
+
constructor(connections, inbound, log, timings = {}) {
|
|
121
|
+
this.connections = connections;
|
|
122
|
+
this.inbound = inbound;
|
|
123
|
+
this.log = log;
|
|
124
|
+
this.handleTimeoutMs = timings.handleTimeoutMs ?? WEBHOOK_HANDLE_TIMEOUT_MS;
|
|
125
|
+
this.runtimeCacheMs = timings.runtimeCacheMs ?? WEBHOOK_RUNTIME_CACHE_MS;
|
|
101
126
|
}
|
|
102
127
|
/** Drops the cached runtime of one connection (on `channel.changed`). */
|
|
103
128
|
invalidate(connectionId) {
|
|
@@ -112,13 +137,13 @@ export class ChannelWebhooks {
|
|
|
112
137
|
return secure(await this.respond(connectionId, request, signal));
|
|
113
138
|
}
|
|
114
139
|
async runtime(connectionId, deadline) {
|
|
115
|
-
const ttl = this.
|
|
140
|
+
const ttl = this.runtimeCacheMs;
|
|
116
141
|
const now = Date.now();
|
|
117
142
|
const hit = this.runtimes.get(connectionId);
|
|
118
143
|
if (hit && hit.expiresAt > now)
|
|
119
144
|
return hit.value;
|
|
120
145
|
const generation = this.generation;
|
|
121
|
-
const value = await raceAbort(this.
|
|
146
|
+
const value = await raceAbort(this.connections.runtime(connectionId), deadline);
|
|
122
147
|
// A plugin instance changed while fetching: use the value once, keep no stale instance
|
|
123
148
|
if (ttl > 0 && generation === this.generation) {
|
|
124
149
|
this.runtimes.delete(connectionId);
|
|
@@ -137,22 +162,19 @@ export class ChannelWebhooks {
|
|
|
137
162
|
return notFound();
|
|
138
163
|
// One deadline for the whole request (DB lookups, handle, onEvent); also aborts when the
|
|
139
164
|
// platform hangs up
|
|
140
|
-
const deadline = AbortSignal.any([
|
|
141
|
-
signal,
|
|
142
|
-
AbortSignal.timeout(this.deps.handleTimeoutMs ?? WEBHOOK_HANDLE_TIMEOUT_MS),
|
|
143
|
-
]);
|
|
165
|
+
const deadline = AbortSignal.any([signal, AbortSignal.timeout(this.handleTimeoutMs)]);
|
|
144
166
|
try {
|
|
145
167
|
return await this.respondBefore(connectionId, request, deadline);
|
|
146
168
|
}
|
|
147
169
|
catch (err) {
|
|
148
170
|
if (!(err instanceof WebhookDeadline))
|
|
149
171
|
throw err;
|
|
150
|
-
this.
|
|
172
|
+
this.log.warn("channel webhook timed out; the platform will retry", { connectionId });
|
|
151
173
|
return retryLater();
|
|
152
174
|
}
|
|
153
175
|
}
|
|
154
176
|
async respondBefore(connectionId, request, deadline) {
|
|
155
|
-
const row = await raceAbort(this.
|
|
177
|
+
const row = await raceAbort(this.connections.row(connectionId), deadline);
|
|
156
178
|
if (row === undefined ||
|
|
157
179
|
row.inboundMode !== "webhook" ||
|
|
158
180
|
row.status !== "active" ||
|
|
@@ -171,7 +193,7 @@ export class ChannelWebhooks {
|
|
|
171
193
|
(err.code === "channel.not_found" || err.code === "extension.not_enabled")) {
|
|
172
194
|
return notFound();
|
|
173
195
|
}
|
|
174
|
-
this.
|
|
196
|
+
this.log.warn("channel webhook cannot load its connection", {
|
|
175
197
|
connectionId,
|
|
176
198
|
code: err instanceof ApiError ? err.code : undefined,
|
|
177
199
|
});
|
|
@@ -200,13 +222,13 @@ export class ChannelWebhooks {
|
|
|
200
222
|
}
|
|
201
223
|
catch (err) {
|
|
202
224
|
if (err instanceof WebhookDeadline) {
|
|
203
|
-
this.
|
|
225
|
+
this.log.warn("channel webhook handler timed out; the platform will retry", {
|
|
204
226
|
connectionId,
|
|
205
227
|
});
|
|
206
228
|
return retryLater();
|
|
207
229
|
}
|
|
208
230
|
// The kernel log redacts the connection's secrets (runtime() registered them)
|
|
209
|
-
this.
|
|
231
|
+
this.log.warn("channel webhook handler failed", { connectionId, err });
|
|
210
232
|
return jsonError(500, "internal", "Internal error");
|
|
211
233
|
}
|
|
212
234
|
finally {
|
|
@@ -223,10 +245,10 @@ export class ChannelWebhooks {
|
|
|
223
245
|
break;
|
|
224
246
|
for (const e of events) {
|
|
225
247
|
try {
|
|
226
|
-
await raceAbort(this.
|
|
248
|
+
await raceAbort(this.inbound.onEvent(connectionId, e), deadline);
|
|
227
249
|
}
|
|
228
250
|
catch (err) {
|
|
229
|
-
this.
|
|
251
|
+
this.log.warn("channel webhook event not accepted; the platform will retry", {
|
|
230
252
|
connectionId,
|
|
231
253
|
...(err instanceof WebhookDeadline ? { timedOut: true } : { err }),
|
|
232
254
|
});
|
|
@@ -236,10 +258,19 @@ export class ChannelWebhooks {
|
|
|
236
258
|
return sanitize(result.ack);
|
|
237
259
|
}
|
|
238
260
|
}
|
|
239
|
-
this.
|
|
261
|
+
this.log.warn("channel webhook handler returned an invalid result", { connectionId });
|
|
240
262
|
return jsonError(500, "internal", "Internal error");
|
|
241
263
|
}
|
|
242
|
-
}
|
|
264
|
+
};
|
|
265
|
+
ChannelWebhooks = __decorate([
|
|
266
|
+
Injectable(),
|
|
267
|
+
__param(0, Inject(ChannelConnections)),
|
|
268
|
+
__param(1, Inject(ChannelInbound)),
|
|
269
|
+
__param(2, Inject(KERNEL_LOGGER)),
|
|
270
|
+
__param(3, Optional()),
|
|
271
|
+
__param(3, Inject(CHANNEL_WEBHOOK_TIMINGS))
|
|
272
|
+
], ChannelWebhooks);
|
|
273
|
+
export { ChannelWebhooks };
|
|
243
274
|
/** Generic codes for the statuses a plugin may reject with (same as the HTTP error filter's). */
|
|
244
275
|
const REJECT_CODES = { 400: "validation_failed", 401: "auth.required", 403: "forbidden" };
|
|
245
276
|
function rejected(status) {
|
package/dist/config/load.d.ts
CHANGED
|
@@ -11,8 +11,9 @@ export declare function resolveConfig(raw: unknown, env: NodeJS.ProcessEnv): Ker
|
|
|
11
11
|
/** 选来源 → 深合并环境变量覆盖(优先级最高)→ 校验。 */
|
|
12
12
|
export declare function loadConfig(env: NodeJS.ProcessEnv): Promise<KernelConfig>;
|
|
13
13
|
/**
|
|
14
|
-
*
|
|
15
|
-
* {@link extensionConfigSources}
|
|
14
|
+
* Like {@link loadConfig}, and also where each extension deployment config field comes from (file
|
|
15
|
+
* / Nacos / environment, see {@link extensionConfigSources}): the `extensionConfigSources` option of
|
|
16
|
+
* `startKernelApp` / `createKernelApp`, by which the admin console marks these fields read-only (D8).
|
|
16
17
|
*/
|
|
17
18
|
export declare function loadConfigWithSources(env: NodeJS.ProcessEnv): Promise<{
|
|
18
19
|
config: KernelConfig;
|
package/dist/config/load.js
CHANGED
|
@@ -85,8 +85,9 @@ export async function loadConfig(env) {
|
|
|
85
85
|
return resolveConfig(await selectConfigSource(env).load(), env);
|
|
86
86
|
}
|
|
87
87
|
/**
|
|
88
|
-
*
|
|
89
|
-
* {@link extensionConfigSources}
|
|
88
|
+
* Like {@link loadConfig}, and also where each extension deployment config field comes from (file
|
|
89
|
+
* / Nacos / environment, see {@link extensionConfigSources}): the `extensionConfigSources` option of
|
|
90
|
+
* `startKernelApp` / `createKernelApp`, by which the admin console marks these fields read-only (D8).
|
|
90
91
|
*/
|
|
91
92
|
export async function loadConfigWithSources(env) {
|
|
92
93
|
const raw = await selectConfigSource(env).load();
|
|
@@ -101,7 +101,14 @@ export function createNacosSource(opts) {
|
|
|
101
101
|
return doFetch(withToken(fresh), init);
|
|
102
102
|
}
|
|
103
103
|
async function fetchText(signal) {
|
|
104
|
-
|
|
104
|
+
// `tenant` too: Nacos 2.3 authorizes a namespace-scoped user by `tenant` only, and treats a
|
|
105
|
+
// request without it as the public namespace (403 for a user granted just this namespace)
|
|
106
|
+
const qs = new URLSearchParams({
|
|
107
|
+
dataId: opts.dataId,
|
|
108
|
+
group,
|
|
109
|
+
namespaceId: opts.namespace,
|
|
110
|
+
tenant: opts.namespace,
|
|
111
|
+
});
|
|
105
112
|
const timeout = AbortSignal.timeout(timeoutMs);
|
|
106
113
|
const combined = signal ? AbortSignal.any([signal, timeout]) : timeout;
|
|
107
114
|
let res;
|
|
@@ -150,7 +157,9 @@ export function createNacosSource(opts) {
|
|
|
150
157
|
const body = new URLSearchParams({ "Listening-Configs": `${entry}\u0001` });
|
|
151
158
|
let res;
|
|
152
159
|
try {
|
|
153
|
-
|
|
160
|
+
// The namespace in the body is not what Nacos authorizes; `tenant` is (see fetchText)
|
|
161
|
+
const qs = new URLSearchParams({ tenant: opts.namespace });
|
|
162
|
+
res = await authedFetch(`${server}/nacos/v1/cs/configs/listener?${qs}`, {
|
|
154
163
|
method: "POST",
|
|
155
164
|
headers: {
|
|
156
165
|
"Long-Pulling-Timeout": String(LONG_POLL_MS),
|
package/dist/config/schema.d.ts
CHANGED
|
@@ -101,6 +101,7 @@ export declare const KernelConfigSchema: z.ZodObject<{
|
|
|
101
101
|
port: z.ZodDefault<z.ZodNumber>;
|
|
102
102
|
trustProxy: z.ZodDefault<z.ZodPreprocess<z.ZodUnion<readonly [z.ZodBoolean, z.ZodNumber, z.ZodArray<z.ZodString>]>, unknown>>;
|
|
103
103
|
replicaId: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
|
|
104
|
+
swagger: z.ZodDefault<z.ZodBoolean>;
|
|
104
105
|
publicUrl: z.ZodOptional<z.ZodURL>;
|
|
105
106
|
}, z.core.$strip>>;
|
|
106
107
|
roles: z.ZodDefault<z.ZodPreprocess<z.ZodArray<z.ZodEnum<{
|
package/dist/config/schema.js
CHANGED
|
@@ -207,9 +207,9 @@ export const KernelConfigSchema = z.object({
|
|
|
207
207
|
dir: z
|
|
208
208
|
.string()
|
|
209
209
|
.min(1)
|
|
210
|
-
.default("
|
|
210
|
+
.default(".capybara/plugins")
|
|
211
211
|
.meta(meta({
|
|
212
|
-
description: "Local directory where each replica unpacks installed extension packages (<dir>/<name>/<first 16 hex of sha256>/); safe to wipe, replicas re-download from the package store",
|
|
212
|
+
description: "Local directory where each replica unpacks installed extension packages (<dir>/<name>/<first 16 hex of sha256>/), relative to the working directory unless absolute (the image sets /var/lib/capybara/plugins); safe to wipe, replicas re-download from the package store",
|
|
213
213
|
})),
|
|
214
214
|
drainSeconds: z
|
|
215
215
|
.number()
|
|
@@ -336,7 +336,7 @@ export const KernelConfigSchema = z.object({
|
|
|
336
336
|
.min(1)
|
|
337
337
|
.default(360)
|
|
338
338
|
.meta(meta({
|
|
339
|
-
description: "Minutes between periodic refreshes of every enabled marketplace (one
|
|
339
|
+
description: "Minutes between periodic refreshes of every enabled marketplace (one run per period across all replicas)",
|
|
340
340
|
})),
|
|
341
341
|
maxIndexBytes: z
|
|
342
342
|
.number()
|
|
@@ -472,6 +472,12 @@ export const KernelConfigSchema = z.object({
|
|
|
472
472
|
.meta(meta({
|
|
473
473
|
description: "Optional replica identifier; when set, every HTTP response carries an x-capybara-replica header with this value (used by the dual-replica test harness and for debugging load balancers)",
|
|
474
474
|
})),
|
|
475
|
+
swagger: z
|
|
476
|
+
.boolean()
|
|
477
|
+
.default(false)
|
|
478
|
+
.meta(meta({
|
|
479
|
+
description: "Serve the OpenAPI document and swagger UI at /docs (JSON at /docs-json). The routes are not authenticated, so enable it in development and trials only",
|
|
480
|
+
})),
|
|
475
481
|
publicUrl: z
|
|
476
482
|
.url()
|
|
477
483
|
.optional()
|
|
@@ -479,7 +485,7 @@ export const KernelConfigSchema = z.object({
|
|
|
479
485
|
description: "Externally reachable origin of the web app (apps/web, which proxies /api to the kernel), not the kernel's own address; required for OAuth connectors: the redirect URI is <publicUrl>/api/v1/oauth/callback (served through the web /api proxy, which also carries the OAuth binding cookie) and the callback redirects to web pages under it, e.g. https://capybara.example.com",
|
|
480
486
|
})),
|
|
481
487
|
})
|
|
482
|
-
.default({ port: 8080, trustProxy: false }),
|
|
488
|
+
.default({ port: 8080, trustProxy: false, swagger: false }),
|
|
483
489
|
roles: z
|
|
484
490
|
.preprocess(
|
|
485
491
|
// Also accept a comma-separated string (CAPYBARA_ROLES=api,worker; env values that are not
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type ExpressionBuilder } from "kysely";
|
|
2
|
+
import type { KernelDatabase } from "../db/kernel-schema.js";
|
|
3
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
4
|
+
/**
|
|
5
|
+
* A sub-agent's conversation is reached through its parent (sub-agents spec §6.1, review m6, the
|
|
6
|
+
* same rule as its trajectory): the parent is a chat conversation of the same owner whose agent is
|
|
7
|
+
* not deleted and still visible to the viewer. Any other kind passes. The child's own `agent_id`
|
|
8
|
+
* (the dispatched agent for an org agent, §5.5) is checked on top by the callers.
|
|
9
|
+
*/
|
|
10
|
+
export declare const parentReachable: (viewerAccountId: string) => (eb: ExpressionBuilder<KernelDatabase, "conversations">) => import("kysely").ExpressionWrapper<KernelDatabase, "conversations", import("kysely").SqlBool>;
|
|
11
|
+
/**
|
|
12
|
+
* Whether a person may still see a conversation (one query, no agent view): what the event stream,
|
|
13
|
+
* attachment downloads, file and output reads and the extension UI check. `ConversationsService`
|
|
14
|
+
* delegates to it; it depends on the database only, so the attachments (which the skills and tools
|
|
15
|
+
* use) can check access without the conversations module.
|
|
16
|
+
*/
|
|
17
|
+
export declare class ConversationAccess {
|
|
18
|
+
private readonly db;
|
|
19
|
+
constructor(db: KernelDb);
|
|
20
|
+
/**
|
|
21
|
+
* 轻量的可见性判定(一条查询,不加载 agent 视图),供长连接(SSE)建立时与定期复核用:
|
|
22
|
+
* 会话属于该组织且归 viewer 所有、viewer 账号仍为 active、agent 未删除且对 viewer 仍可见
|
|
23
|
+
* (`visibleTo` 已含「组织未删除、viewer 仍是成员」)。
|
|
24
|
+
*/
|
|
25
|
+
isAccessible(orgId: string, conversationId: string, viewerAccountId: string): Promise<boolean>;
|
|
26
|
+
}
|
|
27
|
+
/** The one {@link ConversationAccess} (database only). */
|
|
28
|
+
export declare class ConversationAccessModule {
|
|
29
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
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, Module } from "@nestjs/common";
|
|
11
|
+
import { sql } from "kysely";
|
|
12
|
+
import { visibleTo } from "../agents/agent-lookup.js";
|
|
13
|
+
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
14
|
+
/**
|
|
15
|
+
* A sub-agent's conversation is reached through its parent (sub-agents spec §6.1, review m6, the
|
|
16
|
+
* same rule as its trajectory): the parent is a chat conversation of the same owner whose agent is
|
|
17
|
+
* not deleted and still visible to the viewer. Any other kind passes. The child's own `agent_id`
|
|
18
|
+
* (the dispatched agent for an org agent, §5.5) is checked on top by the callers.
|
|
19
|
+
*/
|
|
20
|
+
export const parentReachable = (viewerAccountId) => (eb) => eb.or([
|
|
21
|
+
eb("conversations.kind", "<>", "subagent"),
|
|
22
|
+
eb.exists(eb
|
|
23
|
+
.selectFrom("conversations as p")
|
|
24
|
+
.innerJoin("agents", "agents.id", "p.agent_id")
|
|
25
|
+
.select(sql `1`.as("one"))
|
|
26
|
+
.whereRef("p.id", "=", "conversations.parent_conversation_id")
|
|
27
|
+
.whereRef("p.org_id", "=", "conversations.org_id")
|
|
28
|
+
.where("p.account_id", "=", viewerAccountId)
|
|
29
|
+
.where("p.kind", "=", "chat")
|
|
30
|
+
.where("agents.deleted_at", "is", null)
|
|
31
|
+
.where(visibleTo(viewerAccountId))),
|
|
32
|
+
]);
|
|
33
|
+
/**
|
|
34
|
+
* Whether a person may still see a conversation (one query, no agent view): what the event stream,
|
|
35
|
+
* attachment downloads, file and output reads and the extension UI check. `ConversationsService`
|
|
36
|
+
* delegates to it; it depends on the database only, so the attachments (which the skills and tools
|
|
37
|
+
* use) can check access without the conversations module.
|
|
38
|
+
*/
|
|
39
|
+
let ConversationAccess = class ConversationAccess {
|
|
40
|
+
db;
|
|
41
|
+
constructor(db) {
|
|
42
|
+
this.db = db;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 轻量的可见性判定(一条查询,不加载 agent 视图),供长连接(SSE)建立时与定期复核用:
|
|
46
|
+
* 会话属于该组织且归 viewer 所有、viewer 账号仍为 active、agent 未删除且对 viewer 仍可见
|
|
47
|
+
* (`visibleTo` 已含「组织未删除、viewer 仍是成员」)。
|
|
48
|
+
*/
|
|
49
|
+
async isAccessible(orgId, conversationId, viewerAccountId) {
|
|
50
|
+
const row = await this.db
|
|
51
|
+
.selectFrom("conversations")
|
|
52
|
+
.select("conversations.id")
|
|
53
|
+
.where("conversations.id", "=", conversationId)
|
|
54
|
+
.where("conversations.org_id", "=", orgId)
|
|
55
|
+
.where("conversations.account_id", "=", viewerAccountId)
|
|
56
|
+
.where("conversations.kind", "in", ["chat", "subagent"])
|
|
57
|
+
.where(parentReachable(viewerAccountId))
|
|
58
|
+
.where((eb) => eb.and([
|
|
59
|
+
eb.exists(eb
|
|
60
|
+
.selectFrom("accounts")
|
|
61
|
+
.select(sql `1`.as("one"))
|
|
62
|
+
.where("accounts.id", "=", viewerAccountId)
|
|
63
|
+
.where("accounts.status", "=", "active")),
|
|
64
|
+
eb.exists(eb
|
|
65
|
+
.selectFrom("agents")
|
|
66
|
+
.select(sql `1`.as("one"))
|
|
67
|
+
.whereRef("agents.id", "=", "conversations.agent_id")
|
|
68
|
+
.where("agents.deleted_at", "is", null)
|
|
69
|
+
.where(visibleTo(viewerAccountId))),
|
|
70
|
+
]))
|
|
71
|
+
.executeTakeFirst();
|
|
72
|
+
return row !== undefined;
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
ConversationAccess = __decorate([
|
|
76
|
+
Injectable(),
|
|
77
|
+
__param(0, Inject(KernelDb))
|
|
78
|
+
], ConversationAccess);
|
|
79
|
+
export { ConversationAccess };
|
|
80
|
+
/** The one {@link ConversationAccess} (database only). */
|
|
81
|
+
let ConversationAccessModule = class ConversationAccessModule {
|
|
82
|
+
};
|
|
83
|
+
ConversationAccessModule = __decorate([
|
|
84
|
+
Module({ providers: [ConversationAccess], exports: [ConversationAccess] })
|
|
85
|
+
], ConversationAccessModule);
|
|
86
|
+
export { ConversationAccessModule };
|