@capybara-hq/kernel 0.1.0-rc.1 → 0.1.0-rc.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/admin.controller.d.ts +17 -17
- package/dist/admin/admin.controller.js +43 -26
- package/dist/admin/admin.module.d.ts +3 -0
- package/dist/admin/admin.module.js +22 -0
- package/dist/admin/extensions.controller.d.ts +14 -14
- package/dist/admin/extensions.controller.js +30 -17
- package/dist/admin/setup-lock.d.ts +16 -0
- package/dist/admin/setup-lock.js +47 -0
- package/dist/admin/setup.controller.d.ts +8 -8
- package/dist/admin/setup.controller.js +27 -25
- package/dist/admin/setup.service.d.ts +19 -27
- package/dist/admin/setup.service.js +61 -61
- package/dist/agents/agent-lookup.d.ts +53 -0
- package/dist/agents/agent-lookup.js +187 -0
- package/dist/agents/agents.controller.d.ts +1 -1
- package/dist/agents/agents.controller.js +14 -8
- package/dist/agents/agents.module.d.ts +7 -0
- package/dist/agents/agents.module.js +41 -0
- package/dist/agents/agents.service.d.ts +39 -58
- package/dist/agents/agents.service.js +280 -335
- package/dist/agents/definition.d.ts +39 -8
- package/dist/agents/definition.js +201 -17
- package/dist/agents/models.controller.d.ts +1 -1
- package/dist/agents/models.controller.js +2 -2
- package/dist/agents/templates.controller.d.ts +1 -1
- package/dist/agents/templates.controller.js +2 -2
- package/dist/agents/templates.d.ts +6 -8
- package/dist/agents/templates.js +39 -8
- package/dist/app.d.ts +93 -0
- package/dist/app.js +150 -0
- package/dist/catalog/admin-catalog.controller.d.ts +3 -3
- package/dist/catalog/admin-catalog.controller.js +27 -13
- package/dist/catalog/catalog-content.d.ts +185 -0
- package/dist/catalog/catalog-content.js +326 -0
- package/dist/catalog/catalog-items.d.ts +186 -0
- package/dist/catalog/catalog-items.js +410 -0
- package/dist/catalog/catalog.module.d.ts +14 -0
- package/dist/catalog/catalog.module.js +71 -0
- package/dist/catalog/catalog.service.d.ts +34 -188
- package/dist/catalog/catalog.service.js +155 -489
- package/dist/catalog/claude/agents.js +13 -10
- package/dist/catalog/cli.d.ts +3 -2
- package/dist/catalog/cli.js +13 -31
- package/dist/catalog/job-ids.d.ts +15 -0
- package/dist/catalog/job-ids.js +15 -0
- package/dist/catalog/jobs.d.ts +27 -0
- package/dist/catalog/jobs.js +70 -0
- package/dist/catalog/locks.d.ts +24 -0
- package/dist/catalog/locks.js +63 -0
- package/dist/catalog/marketplaces.controller.d.ts +4 -4
- package/dist/catalog/marketplaces.controller.js +22 -11
- package/dist/catalog/marketplaces.service.d.ts +31 -14
- package/dist/catalog/marketplaces.service.js +330 -256
- package/dist/catalog/org-catalog.controller.d.ts +4 -3
- package/dist/catalog/org-catalog.controller.js +29 -14
- package/dist/catalog/org-catalog.service.d.ts +32 -198
- package/dist/catalog/org-catalog.service.js +159 -400
- package/dist/catalog/plugin-import.d.ts +73 -34
- package/dist/catalog/plugin-import.js +356 -217
- package/dist/catalog/plugin-install.d.ts +83 -41
- package/dist/catalog/plugin-install.js +421 -269
- package/dist/catalog/plugin-upgrade.d.ts +59 -4
- package/dist/catalog/plugin-upgrade.js +407 -282
- package/dist/catalog/requests.service.d.ts +27 -15
- package/dist/catalog/requests.service.js +201 -145
- package/dist/catalog/upgrade-targets.d.ts +4 -7
- package/dist/channels/actions.d.ts +6 -4
- package/dist/channels/actions.js +1 -1
- package/dist/channels/cards.d.ts +10 -4
- package/dist/channels/cards.js +16 -8
- package/dist/channels/channels.module.d.ts +40 -0
- package/dist/channels/channels.module.js +128 -0
- package/dist/channels/connections.controller.d.ts +1 -1
- package/dist/channels/connections.controller.js +11 -6
- package/dist/channels/connections.service.d.ts +43 -21
- package/dist/channels/connections.service.js +236 -131
- package/dist/channels/inbound.d.ts +34 -38
- package/dist/channels/inbound.js +107 -41
- package/dist/channels/job-ids.d.ts +10 -0
- package/dist/channels/job-ids.js +10 -0
- package/dist/channels/jobs.d.ts +85 -0
- package/dist/channels/jobs.js +157 -0
- package/dist/channels/outbound.d.ts +60 -82
- package/dist/channels/outbound.js +165 -194
- package/dist/channels/supervisor.d.ts +88 -46
- package/dist/channels/supervisor.js +230 -132
- package/dist/channels/threads.d.ts +29 -8
- package/dist/channels/threads.js +71 -13
- package/dist/channels/webhook.d.ts +20 -14
- package/dist/channels/webhook.js +51 -20
- package/dist/config/load.d.ts +3 -2
- package/dist/config/load.js +3 -2
- package/dist/config/nacos-source.js +11 -2
- package/dist/config/schema.d.ts +1 -0
- package/dist/config/schema.js +12 -6
- package/dist/conversations/access.d.ts +29 -0
- package/dist/conversations/access.js +86 -0
- package/dist/conversations/artifacts.d.ts +11 -11
- package/dist/conversations/artifacts.js +36 -10
- package/dist/conversations/attachments.controller.d.ts +1 -1
- package/dist/conversations/attachments.controller.js +8 -6
- package/dist/conversations/attachments.module.d.ts +7 -0
- package/dist/conversations/attachments.module.js +25 -0
- package/dist/conversations/attachments.service.d.ts +30 -22
- package/dist/conversations/attachments.service.js +119 -46
- package/dist/conversations/conversations.controller.d.ts +8 -7
- package/dist/conversations/conversations.controller.js +59 -29
- package/dist/conversations/conversations.module.d.ts +8 -0
- package/dist/conversations/conversations.module.js +69 -0
- package/dist/conversations/conversations.service.d.ts +40 -38
- package/dist/conversations/conversations.service.js +130 -140
- package/dist/conversations/event-log.d.ts +39 -18
- package/dist/conversations/event-log.js +93 -27
- package/dist/conversations/events.d.ts +23 -3
- package/dist/conversations/events.js +26 -14
- package/dist/conversations/files.d.ts +10 -10
- package/dist/conversations/files.js +37 -11
- package/dist/conversations/idem-keys.d.ts +5 -0
- package/dist/conversations/idem-keys.js +5 -0
- package/dist/conversations/job-ids.d.ts +6 -0
- package/dist/conversations/job-ids.js +6 -0
- package/dist/conversations/outputs-read.d.ts +11 -11
- package/dist/conversations/outputs-read.js +31 -7
- package/dist/conversations/queue.d.ts +48 -56
- package/dist/conversations/queue.js +13 -289
- package/dist/conversations/queue.service.d.ts +60 -0
- package/dist/conversations/queue.service.js +343 -0
- package/dist/conversations/sandbox-status.d.ts +13 -10
- package/dist/conversations/sandbox-status.js +36 -8
- package/dist/conversations/titles.d.ts +71 -24
- package/dist/conversations/titles.js +159 -63
- package/dist/ctx/bus.js +9 -3
- package/dist/ctx/create-ctx.d.ts +6 -0
- package/dist/ctx/create-ctx.js +7 -9
- package/dist/ctx/lock.d.ts +7 -3
- package/dist/ctx/lock.js +9 -20
- package/dist/ctx/secrets.d.ts +10 -2
- package/dist/ctx/secrets.js +7 -3
- package/dist/db/kernel-schema.d.ts +4 -4
- package/dist/db/pool.d.ts +5 -0
- package/dist/db/pool.js +1 -0
- package/dist/errors.d.ts +1 -0
- package/dist/errors.js +1 -0
- package/dist/evals/budget.d.ts +42 -21
- package/dist/evals/budget.js +114 -62
- package/dist/evals/evals.module.d.ts +31 -0
- package/dist/evals/evals.module.js +114 -0
- package/dist/evals/jobs.d.ts +20 -0
- package/dist/evals/jobs.js +45 -0
- package/dist/evals/recorded-tools.d.ts +27 -1
- package/dist/evals/recorded-tools.js +85 -10
- package/dist/evals/run-replay.d.ts +61 -8
- package/dist/evals/run-replay.js +159 -85
- package/dist/evals/runs.controller.d.ts +1 -1
- package/dist/evals/runs.controller.js +17 -8
- package/dist/evals/runs.service.d.ts +23 -45
- package/dist/evals/runs.service.js +245 -234
- package/dist/evals/sets.controller.d.ts +1 -1
- package/dist/evals/sets.controller.js +17 -8
- package/dist/evals/sets.service.d.ts +22 -6
- package/dist/evals/sets.service.js +248 -194
- package/dist/evals/snapshot.d.ts +2 -2
- package/dist/evals/step-replay.d.ts +2 -2
- package/dist/evals/step-replay.js +1 -1
- package/dist/evals/trajectory.controller.d.ts +1 -1
- package/dist/evals/trajectory.controller.js +11 -7
- package/dist/evals/trajectory.d.ts +2 -2
- package/dist/evals/trajectory.service.d.ts +5 -4
- package/dist/evals/trajectory.service.js +30 -7
- package/dist/evals/worker.d.ts +44 -27
- package/dist/evals/worker.js +220 -121
- package/dist/extensions/admin-ops.d.ts +61 -33
- package/dist/extensions/admin-ops.js +248 -154
- package/dist/extensions/admin-view.d.ts +38 -27
- package/dist/extensions/admin-view.js +126 -55
- package/dist/extensions/approvals.d.ts +12 -8
- package/dist/extensions/approvals.js +73 -46
- package/dist/extensions/blobs.d.ts +27 -10
- package/dist/extensions/blobs.js +111 -45
- package/dist/extensions/bootstrap.d.ts +58 -31
- package/dist/extensions/bootstrap.js +175 -121
- package/dist/extensions/cli.d.ts +20 -10
- package/dist/extensions/cli.js +41 -96
- package/dist/extensions/config-issues.d.ts +7 -0
- package/dist/extensions/config-issues.js +31 -0
- package/dist/extensions/deployment-config-store.d.ts +49 -0
- package/dist/extensions/deployment-config-store.js +133 -0
- package/dist/extensions/deployment-config.d.ts +58 -67
- package/dist/extensions/deployment-config.js +202 -230
- package/dist/extensions/enabled.d.ts +5 -5
- package/dist/extensions/extensions.module.d.ts +8 -0
- package/dist/extensions/extensions.module.js +77 -0
- package/dist/extensions/hooks.d.ts +3 -2
- package/dist/extensions/hooks.js +1 -1
- package/dist/extensions/host.d.ts +72 -68
- package/dist/extensions/host.js +191 -152
- package/dist/extensions/installs.d.ts +49 -16
- package/dist/extensions/installs.js +128 -32
- package/dist/extensions/job-ids.d.ts +6 -0
- package/dist/extensions/job-ids.js +6 -0
- package/dist/extensions/lifecycle-topics.d.ts +18 -0
- package/dist/extensions/lifecycle-topics.js +18 -0
- package/dist/extensions/lifecycle.d.ts +35 -47
- package/dist/extensions/lifecycle.js +103 -39
- package/dist/extensions/locks.d.ts +33 -0
- package/dist/extensions/locks.js +86 -0
- package/dist/extensions/migrate-lock.d.ts +3 -4
- package/dist/extensions/org-config.controller.d.ts +1 -1
- package/dist/extensions/org-config.controller.js +8 -5
- package/dist/extensions/org-config.d.ts +48 -46
- package/dist/extensions/org-config.js +284 -226
- package/dist/extensions/registry.d.ts +50 -2
- package/dist/extensions/registry.js +89 -4
- package/dist/extensions/sources.d.ts +12 -8
- package/dist/extensions/sources.js +34 -13
- package/dist/files/files.module.d.ts +3 -0
- package/dist/files/files.module.js +22 -0
- package/dist/files/previewers.controller.d.ts +7 -2
- package/dist/files/previewers.controller.js +17 -9
- package/dist/files/previewers.d.ts +13 -18
- package/dist/files/previewers.js +83 -36
- package/dist/http/adapter.d.ts +3 -0
- package/dist/http/adapter.js +25 -0
- package/dist/http/api.module.d.ts +3 -110
- package/dist/http/api.module.js +47 -355
- package/dist/http/app.d.ts +11 -15
- package/dist/http/app.js +17 -62
- package/dist/http/error-filter.module.d.ts +5 -0
- package/dist/http/error-filter.module.js +18 -0
- package/dist/http/error.filter.js +2 -2
- package/dist/identity/accounts.d.ts +82 -29
- package/dist/identity/accounts.js +294 -175
- package/dist/identity/api-tokens.d.ts +11 -7
- package/dist/identity/api-tokens.js +71 -44
- package/dist/identity/audit.d.ts +7 -4
- package/dist/identity/audit.js +5 -1
- package/dist/identity/auth.controller.d.ts +11 -10
- package/dist/identity/auth.controller.js +31 -25
- package/dist/identity/auth.guard.d.ts +3 -3
- package/dist/identity/auth.guard.js +6 -4
- package/dist/identity/binding.d.ts +9 -11
- package/dist/identity/binding.js +41 -13
- package/dist/identity/enterprise-admin.d.ts +18 -12
- package/dist/identity/enterprise-admin.js +67 -13
- package/dist/identity/external-identity-lock.d.ts +17 -0
- package/dist/identity/external-identity-lock.js +39 -0
- package/dist/identity/external.d.ts +19 -15
- package/dist/identity/external.js +163 -125
- package/dist/identity/identity.module.d.ts +6 -0
- package/dist/identity/identity.module.js +56 -0
- package/dist/identity/me.controller.d.ts +16 -15
- package/dist/identity/me.controller.js +37 -31
- package/dist/identity/sessions.d.ts +12 -10
- package/dist/identity/sessions.js +74 -42
- package/dist/identity/settings.d.ts +20 -14
- package/dist/identity/settings.js +86 -58
- package/dist/identity/sso.controller.d.ts +7 -7
- package/dist/identity/sso.controller.js +13 -9
- package/dist/identity/sso.d.ts +9 -12
- package/dist/identity/sso.js +54 -24
- package/dist/inbox/inbox.module.d.ts +3 -0
- package/dist/inbox/inbox.module.js +22 -0
- package/dist/inbox/inbox.service.d.ts +7 -9
- package/dist/inbox/inbox.service.js +32 -11
- package/dist/index.d.ts +16 -11
- package/dist/index.js +9 -6
- package/dist/infra/cache/cache.module.d.ts +3 -0
- package/dist/infra/cache/cache.module.js +16 -0
- package/dist/infra/cache/cache.service.d.ts +21 -0
- package/dist/infra/cache/cache.service.js +80 -0
- package/dist/infra/cache/cacheable.decorator.d.ts +32 -0
- package/dist/infra/cache/cacheable.decorator.js +83 -0
- package/dist/infra/cli/kernel-cli.module.d.ts +66 -0
- package/dist/infra/cli/kernel-cli.module.js +165 -0
- package/dist/infra/close-within.d.ts +15 -0
- package/dist/infra/close-within.js +36 -0
- package/dist/infra/config/config.module.d.ts +13 -0
- package/dist/infra/config/config.module.js +39 -0
- package/dist/infra/config/kernel-config.service.d.ts +25 -0
- package/dist/infra/config/kernel-config.service.js +126 -0
- package/dist/infra/database/after-commit.d.ts +6 -0
- package/dist/infra/database/after-commit.js +9 -0
- package/dist/infra/database/database.module.d.ts +25 -0
- package/dist/infra/database/database.module.js +90 -0
- package/dist/infra/database/kernel-db.d.ts +22 -0
- package/dist/infra/database/kernel-db.js +65 -0
- package/dist/infra/database/transaction-host.d.ts +50 -0
- package/dist/infra/database/transaction-host.js +125 -0
- package/dist/infra/database/transactional.decorator.d.ts +15 -0
- package/dist/infra/database/transactional.decorator.js +27 -0
- package/dist/infra/database/xact-lock.d.ts +17 -0
- package/dist/infra/database/xact-lock.js +43 -0
- package/dist/infra/events/kernel-events.d.ts +96 -0
- package/dist/infra/events/kernel-events.js +65 -0
- package/dist/infra/health/health.controller.d.ts +26 -0
- package/dist/infra/health/health.controller.js +104 -0
- package/dist/infra/health/health.module.d.ts +9 -0
- package/dist/infra/health/health.module.js +24 -0
- package/dist/infra/health/health.options.d.ts +10 -0
- package/dist/infra/health/health.options.js +15 -0
- package/dist/infra/health/shutdown-state.d.ts +6 -0
- package/dist/infra/health/shutdown-state.js +2 -0
- package/dist/infra/lifecycle/graceful-shutdown.module.d.ts +6 -0
- package/dist/infra/lifecycle/graceful-shutdown.module.js +23 -0
- package/dist/infra/lifecycle/graceful-shutdown.service.d.ts +70 -0
- package/dist/infra/lifecycle/graceful-shutdown.service.js +135 -0
- package/dist/infra/lifecycle/process-guards.d.ts +52 -0
- package/dist/infra/lifecycle/process-guards.js +86 -0
- package/dist/infra/lifecycle/shutdown-signals.d.ts +30 -0
- package/dist/infra/lifecycle/shutdown-signals.js +48 -0
- package/dist/infra/lock/key-template.d.ts +13 -0
- package/dist/infra/lock/key-template.js +46 -0
- package/dist/infra/lock/lock.module.d.ts +3 -0
- package/dist/infra/lock/lock.module.js +16 -0
- package/dist/infra/lock/lock.service.d.ts +120 -0
- package/dist/infra/lock/lock.service.js +343 -0
- package/dist/infra/lock/shared-lease.d.ts +44 -0
- package/dist/infra/lock/shared-lease.js +121 -0
- package/dist/infra/lock/with-lock.decorator.d.ts +28 -0
- package/dist/infra/lock/with-lock.decorator.js +49 -0
- package/dist/infra/logging/logging.module.d.ts +16 -0
- package/dist/infra/logging/logging.module.js +34 -0
- package/dist/infra/queue/configured-processor.d.ts +18 -0
- package/dist/infra/queue/configured-processor.js +23 -0
- package/dist/infra/queue/job-failure.d.ts +18 -0
- package/dist/infra/queue/job-failure.js +26 -0
- package/dist/infra/queue/queue-shutdown.d.ts +27 -0
- package/dist/infra/queue/queue-shutdown.js +81 -0
- package/dist/infra/queue/queue.module.d.ts +16 -0
- package/dist/infra/queue/queue.module.js +61 -0
- package/dist/infra/queue/redis-connection.d.ts +7 -0
- package/dist/infra/queue/redis-connection.js +18 -0
- package/dist/infra/queue/retired-schedulers.d.ts +7 -0
- package/dist/infra/queue/retired-schedulers.js +9 -0
- package/dist/infra/queue/run-job.d.ts +16 -0
- package/dist/infra/queue/run-job.js +19 -0
- package/dist/infra/redis/redis.module.d.ts +24 -0
- package/dist/infra/redis/redis.module.js +87 -0
- package/dist/infra/schedule/cron-tick.d.ts +12 -0
- package/dist/infra/schedule/cron-tick.js +25 -0
- package/dist/infra/schedule/locked-cron.decorator.d.ts +27 -0
- package/dist/infra/schedule/locked-cron.decorator.js +53 -0
- package/dist/infra/schedule/locked-interval.d.ts +69 -0
- package/dist/infra/schedule/locked-interval.js +190 -0
- package/dist/infra/schedule/locked-tick.d.ts +90 -0
- package/dist/infra/schedule/locked-tick.js +137 -0
- package/dist/infra/schedule/schedule.module.d.ts +8 -0
- package/dist/infra/schedule/schedule.module.js +27 -0
- package/dist/infra/schedule/scheduled-runs.d.ts +69 -0
- package/dist/infra/schedule/scheduled-runs.js +163 -0
- package/dist/infra/swagger/swagger.d.ts +16 -0
- package/dist/infra/swagger/swagger.js +31 -0
- package/dist/infra/throttler/credential-throttler.d.ts +35 -0
- package/dist/infra/throttler/credential-throttler.js +77 -0
- package/dist/infra/throttler/named-throttlers.d.ts +31 -0
- package/dist/infra/throttler/named-throttlers.js +119 -0
- package/dist/infra/throttler/redis-throttler-storage.d.ts +38 -0
- package/dist/infra/throttler/redis-throttler-storage.js +130 -0
- package/dist/infra/throttler/throttler.guard.d.ts +23 -0
- package/dist/infra/throttler/throttler.guard.js +68 -0
- package/dist/infra/throttler/throttler.module.d.ts +15 -0
- package/dist/infra/throttler/throttler.module.js +53 -0
- package/dist/infra/tokens.d.ts +15 -0
- package/dist/infra/tokens.js +15 -0
- package/dist/infra/validation/create-zod-dto.d.ts +23 -0
- package/dist/infra/validation/create-zod-dto.js +35 -0
- package/dist/infra/validation/parse-with-zod.d.ts +7 -0
- package/dist/infra/validation/parse-with-zod.js +12 -0
- package/dist/infra/validation/validation.module.d.ts +3 -0
- package/dist/infra/validation/validation.module.js +16 -0
- package/dist/infra/validation/zod-params.d.ts +7 -0
- package/dist/infra/validation/zod-params.js +42 -0
- package/dist/infra/validation/zod-validation.pipe.d.ts +11 -0
- package/dist/infra/validation/zod-validation.pipe.js +31 -0
- package/dist/kernel.d.ts +9 -244
- package/dist/kernel.js +8 -1305
- package/dist/kernel.module.d.ts +17 -0
- package/dist/kernel.module.js +136 -0
- package/dist/lifecycle/kernel-lifecycle.d.ts +140 -0
- package/dist/lifecycle/kernel-lifecycle.js +456 -0
- package/dist/lifecycle/tokens.d.ts +3 -0
- package/dist/lifecycle/tokens.js +3 -0
- package/dist/log-context.d.ts +2 -0
- package/dist/log-context.js +4 -0
- package/dist/models/models.module.d.ts +3 -0
- package/dist/models/models.module.js +24 -0
- package/dist/models/prices.d.ts +8 -2
- package/dist/models/prices.js +65 -37
- package/dist/models/purposes.controller.d.ts +1 -1
- package/dist/models/purposes.controller.js +5 -6
- package/dist/models/purposes.d.ts +35 -13
- package/dist/models/purposes.js +101 -51
- package/dist/orgs/directory-sync.controller.d.ts +1 -1
- package/dist/orgs/directory-sync.controller.js +2 -2
- package/dist/orgs/directory-sync.d.ts +61 -31
- package/dist/orgs/directory-sync.js +212 -125
- package/dist/orgs/invitations.controller.d.ts +8 -8
- package/dist/orgs/invitations.controller.js +27 -26
- package/dist/orgs/invitations.service.d.ts +12 -9
- package/dist/orgs/invitations.service.js +130 -92
- package/dist/orgs/job-ids.d.ts +8 -0
- package/dist/orgs/job-ids.js +8 -0
- package/dist/orgs/members.service.d.ts +19 -12
- package/dist/orgs/members.service.js +161 -117
- package/dist/orgs/offboarding.d.ts +54 -57
- package/dist/orgs/offboarding.js +161 -71
- package/dist/orgs/org-lock.d.ts +28 -19
- package/dist/orgs/org-lock.js +81 -35
- package/dist/orgs/org.guard.d.ts +1 -1
- package/dist/orgs/org.guard.js +2 -2
- package/dist/orgs/orgs.controller.d.ts +13 -13
- package/dist/orgs/orgs.controller.js +29 -17
- package/dist/orgs/orgs.module.d.ts +6 -0
- package/dist/orgs/orgs.module.js +68 -0
- package/dist/orgs/orgs.service.d.ts +30 -19
- package/dist/orgs/orgs.service.js +139 -86
- package/dist/orgs/settings.controller.d.ts +1 -1
- package/dist/orgs/settings.controller.js +8 -6
- package/dist/orgs/settings.service.d.ts +16 -10
- package/dist/orgs/settings.service.js +77 -48
- package/dist/overrides.d.ts +56 -0
- package/dist/overrides.js +30 -0
- package/dist/roles/gateway-role.d.ts +43 -0
- package/dist/roles/gateway-role.js +98 -0
- package/dist/roles/gateway.module.d.ts +8 -0
- package/dist/roles/gateway.module.js +28 -0
- package/dist/roles/worker-role.d.ts +63 -0
- package/dist/roles/worker-role.js +144 -0
- package/dist/roles/worker.module.d.ts +14 -0
- package/dist/roles/worker.module.js +90 -0
- package/dist/runtime/abort.js +19 -2
- package/dist/runtime/checkpointer.d.ts +8 -3
- package/dist/runtime/checkpointer.js +87 -55
- package/dist/runtime/context/build.d.ts +6 -6
- package/dist/runtime/context/build.js +18 -8
- package/dist/runtime/context/claude-tools.d.ts +2 -1
- package/dist/runtime/context/claude-tools.js +9 -10
- package/dist/runtime/context/legacy-text.d.ts +22 -0
- package/dist/runtime/context/legacy-text.js +37 -0
- package/dist/runtime/context/skills.d.ts +29 -11
- package/dist/runtime/context/skills.js +37 -30
- package/dist/runtime/conversation-lock.d.ts +20 -11
- package/dist/runtime/conversation-lock.js +62 -72
- package/dist/runtime/hook-calls.d.ts +3 -3
- package/dist/runtime/hook-calls.js +1 -6
- package/dist/runtime/job-ids.d.ts +10 -0
- package/dist/runtime/job-ids.js +10 -0
- package/dist/runtime/langgraph-loop.js +1 -1
- package/dist/runtime/loop.d.ts +8 -1
- package/dist/runtime/loop.js +14 -0
- package/dist/runtime/maintenance-queue.d.ts +10 -0
- package/dist/runtime/maintenance-queue.js +10 -0
- package/dist/runtime/maintenance.d.ts +45 -74
- package/dist/runtime/maintenance.js +139 -137
- package/dist/runtime/model-call.d.ts +7 -4
- package/dist/runtime/model-call.js +25 -58
- package/dist/runtime/providers.d.ts +17 -6
- package/dist/runtime/providers.js +66 -25
- package/dist/runtime/quota.d.ts +17 -3
- package/dist/runtime/quota.js +27 -2
- package/dist/runtime/retired-schedulers.d.ts +7 -0
- package/dist/runtime/retired-schedulers.js +31 -0
- package/dist/runtime/run-control.d.ts +33 -0
- package/dist/runtime/run-control.js +77 -0
- package/dist/runtime/run-finish.d.ts +27 -18
- package/dist/runtime/run-finish.js +98 -51
- package/dist/runtime/run-jobs.d.ts +48 -0
- package/dist/runtime/run-jobs.js +95 -0
- package/dist/runtime/run-processors.d.ts +60 -0
- package/dist/runtime/run-processors.js +185 -0
- package/dist/runtime/run-queue.d.ts +32 -57
- package/dist/runtime/run-queue.js +291 -295
- package/dist/runtime/run-steps.d.ts +39 -0
- package/dist/runtime/run-steps.js +96 -0
- package/dist/runtime/run-worker.d.ts +122 -76
- package/dist/runtime/run-worker.js +343 -229
- package/dist/runtime/runtime.module.d.ts +10 -0
- package/dist/runtime/runtime.module.js +112 -0
- package/dist/runtime/step-log.d.ts +40 -0
- package/dist/runtime/step-log.js +94 -0
- package/dist/runtime/stream.controller.d.ts +5 -8
- package/dist/runtime/stream.controller.js +14 -12
- package/dist/runtime/stream.d.ts +24 -6
- package/dist/runtime/stream.js +78 -7
- package/dist/runtime/subagents/child.d.ts +3 -44
- package/dist/runtime/subagents/child.js +0 -79
- package/dist/runtime/subagents/definition.d.ts +5 -10
- package/dist/runtime/subagents/definition.js +13 -14
- package/dist/runtime/subagents/dispatch.d.ts +89 -8
- package/dist/runtime/subagents/dispatch.js +137 -142
- package/dist/runtime/subagents/limits.d.ts +9 -4
- package/dist/runtime/subagents/limits.js +4 -2
- package/dist/runtime/subagents/org-agents.d.ts +4 -4
- package/dist/runtime/subagents/org-agents.js +3 -2
- package/dist/runtime/subagents/progress.d.ts +2 -2
- package/dist/runtime/subagents/roster.d.ts +4 -4
- package/dist/runtime/subagents/roster.js +2 -2
- package/dist/runtime/subagents/skill-fork.d.ts +8 -9
- package/dist/runtime/subagents/skill-fork.js +17 -6
- package/dist/runtime/subagents/subagents.service.d.ts +40 -0
- package/dist/runtime/subagents/subagents.service.js +101 -0
- package/dist/runtime/usage-report.d.ts +94 -52
- package/dist/runtime/usage-report.js +200 -100
- package/dist/runtime/waits.d.ts +127 -59
- package/dist/runtime/waits.js +433 -210
- package/dist/sandbox/job-ids.d.ts +10 -0
- package/dist/sandbox/job-ids.js +10 -0
- package/dist/sandbox/jobs.d.ts +41 -0
- package/dist/sandbox/jobs.js +113 -0
- package/dist/sandbox/leases.d.ts +39 -31
- package/dist/sandbox/leases.js +117 -257
- package/dist/sandbox/providers.d.ts +19 -0
- package/dist/sandbox/providers.js +38 -0
- package/dist/sandbox/sandbox.module.d.ts +8 -0
- package/dist/sandbox/sandbox.module.js +30 -0
- package/dist/sandbox/sandbox.service.d.ts +24 -29
- package/dist/sandbox/sandbox.service.js +106 -75
- package/dist/skills/catalog.d.ts +37 -24
- package/dist/skills/catalog.js +100 -57
- package/dist/skills/changes.controller.d.ts +4 -4
- package/dist/skills/changes.controller.js +15 -9
- package/dist/skills/changes.service.d.ts +30 -20
- package/dist/skills/changes.service.js +425 -367
- package/dist/skills/invocable.controller.d.ts +1 -1
- package/dist/skills/invocable.controller.js +8 -5
- package/dist/skills/invocation-keys.d.ts +1 -1
- package/dist/skills/invocation-keys.js +1 -1
- package/dist/skills/invoke.d.ts +17 -16
- package/dist/skills/invoke.js +53 -21
- package/dist/skills/skills.controller.d.ts +1 -1
- package/dist/skills/skills.controller.js +11 -6
- package/dist/skills/skills.module.d.ts +6 -0
- package/dist/skills/skills.module.js +30 -0
- package/dist/skills/skills.service.d.ts +47 -30
- package/dist/skills/skills.service.js +221 -158
- package/dist/storage/job-ids.d.ts +6 -0
- package/dist/storage/job-ids.js +6 -0
- package/dist/storage/purge.d.ts +22 -7
- package/dist/storage/purge.js +55 -3
- package/dist/storage/storage.module.d.ts +6 -0
- package/dist/storage/storage.module.js +23 -0
- package/dist/storage/storage.service.d.ts +18 -4
- package/dist/storage/storage.service.js +44 -3
- package/dist/tools/approvals.controller.d.ts +1 -1
- package/dist/tools/approvals.controller.js +12 -8
- package/dist/tools/approvals.service.d.ts +33 -25
- package/dist/tools/approvals.service.js +343 -259
- package/dist/tools/breaker.d.ts +2 -2
- package/dist/tools/breaker.js +21 -3
- package/dist/tools/builtin-names.d.ts +73 -0
- package/dist/tools/builtin-names.js +116 -0
- package/dist/tools/builtins/agent.d.ts +7 -7
- package/dist/tools/builtins/agent.js +7 -11
- package/dist/tools/builtins/ask-user.d.ts +3 -3
- package/dist/tools/builtins/ask-user.js +3 -3
- package/dist/tools/builtins/builtin-tools.d.ts +21 -0
- package/dist/tools/builtins/builtin-tools.js +80 -0
- package/dist/tools/builtins/read-tool-output.d.ts +3 -3
- package/dist/tools/builtins/read-tool-output.js +3 -3
- package/dist/tools/builtins/sandbox/bash.d.ts +5 -5
- package/dist/tools/builtins/sandbox/bash.js +33 -30
- package/dist/tools/builtins/sandbox/common.d.ts +5 -4
- package/dist/tools/builtins/sandbox/common.js +2 -2
- package/dist/tools/builtins/sandbox/deliver.d.ts +1 -1
- package/dist/tools/builtins/sandbox/deliver.js +13 -13
- package/dist/tools/builtins/sandbox/edit.d.ts +1 -1
- package/dist/tools/builtins/sandbox/edit.js +42 -31
- package/dist/tools/builtins/sandbox/file-state.d.ts +34 -0
- package/dist/tools/builtins/sandbox/file-state.js +34 -0
- package/dist/tools/builtins/sandbox/glob-match.d.ts +1 -1
- package/dist/tools/builtins/sandbox/glob-match.js +1 -1
- package/dist/tools/builtins/sandbox/glob.d.ts +1 -1
- package/dist/tools/builtins/sandbox/glob.js +6 -6
- package/dist/tools/builtins/sandbox/grep.d.ts +7 -4
- package/dist/tools/builtins/sandbox/grep.js +149 -32
- package/dist/tools/builtins/sandbox/index.d.ts +1 -1
- package/dist/tools/builtins/sandbox/index.js +1 -1
- package/dist/tools/builtins/sandbox/read.d.ts +2 -2
- package/dist/tools/builtins/sandbox/read.js +22 -15
- package/dist/tools/builtins/sandbox/write.d.ts +1 -1
- package/dist/tools/builtins/sandbox/write.js +38 -34
- package/dist/tools/builtins/skill-load.d.ts +6 -6
- package/dist/tools/builtins/skill-load.js +33 -17
- package/dist/tools/builtins/skill-write.d.ts +4 -4
- package/dist/tools/builtins/skill-write.js +10 -10
- package/dist/tools/builtins/tool-search.d.ts +13 -9
- package/dist/tools/builtins/tool-search.js +25 -14
- package/dist/tools/canonical-json.d.ts +6 -0
- package/dist/tools/canonical-json.js +16 -0
- package/dist/tools/connector-content.controller.d.ts +1 -1
- package/dist/tools/connector-content.controller.js +11 -6
- package/dist/tools/connector-content.d.ts +12 -15
- package/dist/tools/connector-content.js +53 -18
- package/dist/tools/connectors.controller.d.ts +1 -1
- package/dist/tools/connectors.controller.js +21 -10
- package/dist/tools/connectors.service.d.ts +31 -13
- package/dist/tools/connectors.service.js +438 -348
- package/dist/tools/credentials.d.ts +17 -20
- package/dist/tools/credentials.js +55 -34
- package/dist/tools/display-names.d.ts +9 -0
- package/dist/tools/display-names.js +24 -0
- package/dist/tools/drift.d.ts +29 -41
- package/dist/tools/drift.js +116 -84
- package/dist/tools/elicitation.js +1 -1
- package/dist/tools/info.d.ts +32 -13
- package/dist/tools/info.js +88 -39
- package/dist/tools/job-ids.d.ts +13 -0
- package/dist/tools/job-ids.js +15 -0
- package/dist/tools/jobs.d.ts +24 -0
- package/dist/tools/jobs.js +69 -0
- package/dist/tools/legacy-data.d.ts +34 -0
- package/dist/tools/legacy-data.js +76 -0
- package/dist/tools/legacy-keys.d.ts +51 -0
- package/dist/tools/legacy-keys.js +115 -0
- package/dist/tools/naming.d.ts +1 -5
- package/dist/tools/naming.js +1 -7
- package/dist/tools/oauth/flow-paths.d.ts +16 -0
- package/dist/tools/oauth/flow-paths.js +38 -0
- package/dist/tools/oauth/flow.d.ts +30 -30
- package/dist/tools/oauth/flow.js +109 -81
- package/dist/tools/oauth/oauth.controller.d.ts +3 -3
- package/dist/tools/oauth/oauth.controller.js +12 -9
- package/dist/tools/oauth/tokens.d.ts +11 -3
- package/dist/tools/oauth/tokens.js +15 -14
- package/dist/tools/outputs.d.ts +13 -4
- package/dist/tools/outputs.js +48 -4
- package/dist/tools/pipeline.d.ts +72 -50
- package/dist/tools/pipeline.js +239 -100
- package/dist/tools/policy.d.ts +3 -16
- package/dist/tools/policy.js +13 -19
- package/dist/tools/questions.controller.d.ts +2 -2
- package/dist/tools/questions.controller.js +9 -6
- package/dist/tools/questions.service.d.ts +26 -25
- package/dist/tools/questions.service.js +201 -142
- package/dist/tools/registry.d.ts +43 -38
- package/dist/tools/registry.js +100 -72
- package/dist/tools/resources.d.ts +1 -1
- package/dist/tools/resources.js +1 -1
- package/dist/tools/specs.d.ts +5 -4
- package/dist/tools/specs.js +3 -1
- package/dist/tools/tools.module.d.ts +10 -0
- package/dist/tools/tools.module.js +91 -0
- package/dist/ui/call-extension.d.ts +16 -0
- package/dist/ui/call-extension.js +38 -0
- package/dist/ui/embed-token.d.ts +9 -5
- package/dist/ui/embed-token.js +34 -6
- package/dist/ui/ui-stream.d.ts +22 -17
- package/dist/ui/ui-stream.js +72 -12
- package/dist/ui/ui.module.d.ts +7 -0
- package/dist/ui/ui.module.js +28 -0
- package/dist/ui/views.controller.d.ts +14 -12
- package/dist/ui/views.controller.js +32 -25
- package/dist/ui/views.d.ts +9 -57
- package/dist/ui/views.js +43 -45
- package/package.json +10 -3
- package/src/migrations/0063_tool_keys_claude_code.sql +220 -0
- package/dist/http/health.controller.d.ts +0 -26
- package/dist/http/health.controller.js +0 -79
- package/dist/http/tokens.d.ts +0 -131
- package/dist/http/tokens.js +0 -131
- package/dist/http/zod.pipe.d.ts +0 -8
- package/dist/http/zod.pipe.js +0 -14
- package/dist/identity/rate-limit.d.ts +0 -55
- package/dist/identity/rate-limit.js +0 -121
- package/dist/sandbox/lifecycle.d.ts +0 -21
- package/dist/sandbox/lifecycle.js +0 -68
- package/dist/tools/builtins/sandbox/names.d.ts +0 -7
- package/dist/tools/builtins/sandbox/names.js +0 -20
- /package/dist/http/{gateway.module.d.ts → gateway-routes.d.ts} +0 -0
- /package/dist/http/{gateway.module.js → gateway-routes.js} +0 -0
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { ToolOutputs } from "../tools/outputs.js";
|
|
2
|
+
import { ConversationAccess } from "./access.js";
|
|
1
3
|
/** 一次最多返回的字符数(也是默认值):大存档按字符分页取。 */
|
|
2
4
|
export declare const OUTPUT_PAGE_MAX_CHARS = 200000;
|
|
3
5
|
export interface OutputPage {
|
|
@@ -10,23 +12,21 @@ export interface OutputPage {
|
|
|
10
12
|
/** 下一页的 offset;已到末尾为 null。 */
|
|
11
13
|
next: number | null;
|
|
12
14
|
}
|
|
13
|
-
export interface ConversationOutputsDeps {
|
|
14
|
-
/** 会话可见性(与会话 SSE 流同一判定:`ConversationsService.isAccessible`)。 */
|
|
15
|
-
isAccessible(orgId: string, conversationId: string, viewerAccountId: string): Promise<boolean>;
|
|
16
|
-
/** 读本会话未过期的存档(`ToolOutputs.load`):不存在 / 过期 / 属于别的会话 → null。 */
|
|
17
|
-
load(scope: {
|
|
18
|
-
orgId: string;
|
|
19
|
-
conversationId: string;
|
|
20
|
-
}, id: string): Promise<string | null>;
|
|
21
|
-
}
|
|
22
15
|
/**
|
|
23
16
|
* 网页读工具输出存档(运行标签看全文):先按会话流的规则判定会话可见(不可见 → `conversation.not_found`),
|
|
24
17
|
* 再只在这个会话的存档里找(别的会话 / 过期 → `conversation.output_not_found`)。
|
|
25
18
|
* 按字符分页(单行可能就很长,按行分页不能保证页大小);id 不是 UUID 时直接 404,不打到数据库。
|
|
26
19
|
*/
|
|
27
20
|
export declare class ConversationOutputs {
|
|
28
|
-
|
|
29
|
-
|
|
21
|
+
/** 会话可见性(与会话 SSE 流同一判定)。 */
|
|
22
|
+
private readonly access;
|
|
23
|
+
/** 读本会话未过期的存档:不存在 / 过期 / 属于别的会话 → null。 */
|
|
24
|
+
private readonly outputs;
|
|
25
|
+
constructor(
|
|
26
|
+
/** 会话可见性(与会话 SSE 流同一判定)。 */
|
|
27
|
+
access: Pick<ConversationAccess, "isAccessible">,
|
|
28
|
+
/** 读本会话未过期的存档:不存在 / 过期 / 属于别的会话 → null。 */
|
|
29
|
+
outputs: Pick<ToolOutputs, "load">);
|
|
30
30
|
read(orgId: string, conversationId: string, viewerAccountId: string, outputId: string, page: {
|
|
31
31
|
offset: number;
|
|
32
32
|
limit: number;
|
|
@@ -1,5 +1,17 @@
|
|
|
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";
|
|
1
11
|
import { ApiError } from "../errors.js";
|
|
12
|
+
import { ToolOutputs } from "../tools/outputs.js";
|
|
2
13
|
import { UUID_RE } from "../ui/registry.js";
|
|
14
|
+
import { ConversationAccess } from "./access.js";
|
|
3
15
|
/** 一次最多返回的字符数(也是默认值):大存档按字符分页取。 */
|
|
4
16
|
export const OUTPUT_PAGE_MAX_CHARS = 200_000;
|
|
5
17
|
const conversationNotFound = () => new ApiError("conversation.not_found", "Conversation not found");
|
|
@@ -9,19 +21,25 @@ const outputNotFound = () => new ApiError("conversation.output_not_found", "Outp
|
|
|
9
21
|
* 再只在这个会话的存档里找(别的会话 / 过期 → `conversation.output_not_found`)。
|
|
10
22
|
* 按字符分页(单行可能就很长,按行分页不能保证页大小);id 不是 UUID 时直接 404,不打到数据库。
|
|
11
23
|
*/
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
24
|
+
let ConversationOutputs = class ConversationOutputs {
|
|
25
|
+
access;
|
|
26
|
+
outputs;
|
|
27
|
+
constructor(
|
|
28
|
+
/** 会话可见性(与会话 SSE 流同一判定)。 */
|
|
29
|
+
access,
|
|
30
|
+
/** 读本会话未过期的存档:不存在 / 过期 / 属于别的会话 → null。 */
|
|
31
|
+
outputs) {
|
|
32
|
+
this.access = access;
|
|
33
|
+
this.outputs = outputs;
|
|
16
34
|
}
|
|
17
35
|
async read(orgId, conversationId, viewerAccountId, outputId, page) {
|
|
18
36
|
if (!UUID_RE.test(conversationId))
|
|
19
37
|
throw conversationNotFound();
|
|
20
|
-
if (!(await this.
|
|
38
|
+
if (!(await this.access.isAccessible(orgId, conversationId, viewerAccountId)))
|
|
21
39
|
throw conversationNotFound();
|
|
22
40
|
if (!UUID_RE.test(outputId))
|
|
23
41
|
throw outputNotFound();
|
|
24
|
-
const content = await this.
|
|
42
|
+
const content = await this.outputs.load({ orgId, conversationId }, outputId);
|
|
25
43
|
if (content === null)
|
|
26
44
|
throw outputNotFound();
|
|
27
45
|
const offset = Math.min(page.offset, content.length);
|
|
@@ -34,4 +52,10 @@ export class ConversationOutputs {
|
|
|
34
52
|
next: end < content.length ? end : null,
|
|
35
53
|
};
|
|
36
54
|
}
|
|
37
|
-
}
|
|
55
|
+
};
|
|
56
|
+
ConversationOutputs = __decorate([
|
|
57
|
+
Injectable(),
|
|
58
|
+
__param(0, Inject(ConversationAccess)),
|
|
59
|
+
__param(1, Inject(ToolOutputs))
|
|
60
|
+
], ConversationOutputs);
|
|
61
|
+
export { ConversationOutputs };
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { type Transaction } from "kysely";
|
|
2
1
|
import { type ModelRef } from "../agents/definition.js";
|
|
3
|
-
import type {
|
|
4
|
-
import {
|
|
2
|
+
import type { KernelSchemaDb } from "../db/kernel-schema.js";
|
|
3
|
+
import { ApiError } from "../errors.js";
|
|
4
|
+
import { type InvocationRecord, type RenderedInvocation } from "../skills/invoke.js";
|
|
5
|
+
import type { AttachmentRef } from "./conversations.service.js";
|
|
5
6
|
import { type AppendEvent, type EventLog } from "./event-log.js";
|
|
6
|
-
import type { ConversationEvent } from "./events.js";
|
|
7
|
+
import type { ConversationEvent, LogContentBlock } from "./events.js";
|
|
7
8
|
/**
|
|
8
9
|
* Queued messages (UI refresh B, spec §5.7): messages a person queued while a run was going. They
|
|
9
10
|
* are conversation state in PG, not events: the model has not seen them, so they enter the log only
|
|
@@ -18,7 +19,16 @@ export declare const QUEUE_MAX_ITEMS = 20;
|
|
|
18
19
|
* the conversation, or the head item's skill can no longer be invoked (phase D Task 9).
|
|
19
20
|
*/
|
|
20
21
|
export type QueuePauseReason = "run_ended" | "author_cannot_send" | "skill_not_invocable";
|
|
21
|
-
|
|
22
|
+
/**
|
|
23
|
+
* A queued skill invocation (phase D Task 9), stored in `conversation_queue.skill`: the name the
|
|
24
|
+
* person invoked (`<plugin>:<name>` or bare) and the `user_message.skill` record rendered with it.
|
|
25
|
+
*/
|
|
26
|
+
export interface QueuedSkill {
|
|
27
|
+
invokedAs: string;
|
|
28
|
+
record: InvocationRecord;
|
|
29
|
+
}
|
|
30
|
+
/** The caller's transaction handle (the module helpers below run inside it). */
|
|
31
|
+
type KernelTrx = KernelSchemaDb;
|
|
22
32
|
/** A queued message as the API returns it. */
|
|
23
33
|
export interface QueueItem {
|
|
24
34
|
id: string;
|
|
@@ -68,7 +78,7 @@ export interface QueueInput {
|
|
|
68
78
|
name: string;
|
|
69
79
|
};
|
|
70
80
|
}
|
|
71
|
-
interface QueueRow {
|
|
81
|
+
export interface QueueRow {
|
|
72
82
|
id: string;
|
|
73
83
|
conversation_id: string;
|
|
74
84
|
account_id: string;
|
|
@@ -83,6 +93,25 @@ interface QueueRow {
|
|
|
83
93
|
skill: unknown;
|
|
84
94
|
created_at: Date;
|
|
85
95
|
}
|
|
96
|
+
export declare const COLUMNS: readonly ["id", "conversation_id", "account_id", "position", "text", "content", "attachments", "files", "client_message_id", "model", "effort", "skill", "created_at"];
|
|
97
|
+
/**
|
|
98
|
+
* Queued text as the event log will store it: NUL becomes U+FFFD (PG rejects NUL in text and
|
|
99
|
+
* jsonb), the mapping `payloadJson` applies to a direct send (final review m1).
|
|
100
|
+
*/
|
|
101
|
+
export declare const noNul: (text: string) => string;
|
|
102
|
+
export declare const itemNotFound: () => ApiError;
|
|
103
|
+
export declare function toItem(r: QueueRow): QueueItem;
|
|
104
|
+
/**
|
|
105
|
+
* The text rule of `POST …/messages`: text is required unless the message invokes a skill (its
|
|
106
|
+
* rendered text is `content[0]`) or carries files and no `@` resources (`content[0]` must be the
|
|
107
|
+
* text when resources follow it).
|
|
108
|
+
*/
|
|
109
|
+
export declare function checkText(text: string, files: number, attachments: number, skill: boolean): void;
|
|
110
|
+
/** The stored form of a rendered invocation and its first content block. */
|
|
111
|
+
export declare function storedSkill(invokedAs: string, invoked: RenderedInvocation): {
|
|
112
|
+
skill: string;
|
|
113
|
+
first: LogContentBlock;
|
|
114
|
+
};
|
|
86
115
|
/** The `user_message` a queued item becomes, as `postUserMessage` would have written it. */
|
|
87
116
|
export declare function queuedUserMessage(r: QueueRow): AppendEvent;
|
|
88
117
|
/**
|
|
@@ -93,12 +122,23 @@ export declare function queuedUserMessage(r: QueueRow): AppendEvent;
|
|
|
93
122
|
* (`model_switched { reason: "unavailable" }` before `run_started`) handles it, as it does for a
|
|
94
123
|
* direct switch whose model disappears. Returns the `user_message` and whether it switched.
|
|
95
124
|
*/
|
|
96
|
-
export declare function appendQueuedIn(t: KernelTrx, eventLog: Pick<EventLog, "
|
|
125
|
+
export declare function appendQueuedIn(t: KernelTrx, eventLog: Pick<EventLog, "appendIn">, conversationId: string, r: QueueRow): Promise<{
|
|
97
126
|
event: ConversationEvent;
|
|
98
127
|
switched: boolean;
|
|
99
128
|
}>;
|
|
129
|
+
/**
|
|
130
|
+
* Why a queued item's skill can no longer be invoked, or null (also null for a plain message).
|
|
131
|
+
* Checked at dispatch, inside `t` (phase D Task 9): the rendered text was frozen when queued, but
|
|
132
|
+
* the skill must still be one of the agent's skills a person can invoke.
|
|
133
|
+
*/
|
|
134
|
+
export declare function queuedSkillBlocked(t: KernelTrx, conversationId: string, r: Pick<QueueRow, "skill">): Promise<import("../skills/invoke.js").NotInvocableReason | null>;
|
|
100
135
|
/** Pauses the queue with `reason` (inside `t`, holding the conversation row lock). */
|
|
101
136
|
export declare function pauseQueueWith(t: KernelTrx, conversationId: string, reason: QueuePauseReason): Promise<void>;
|
|
137
|
+
/** Whether a user_message with this client id is already in the log (inside `t`). */
|
|
138
|
+
export declare function alreadySent(t: KernelTrx, conversationId: string, clientMessageId: string): Promise<boolean>;
|
|
139
|
+
/** Clears the pause once the queue is empty (inside `t`, holding the conversation row lock). */
|
|
140
|
+
export declare function unpauseIfEmpty(t: KernelTrx, conversationId: string): Promise<void>;
|
|
141
|
+
export declare const queueFull: () => ApiError;
|
|
102
142
|
/**
|
|
103
143
|
* Sends the queue's head item as a `user_message` inside `t` (the caller holds the conversation
|
|
104
144
|
* row lock and has checked the conversation is idle and not paused); returns the event, or null
|
|
@@ -107,7 +147,7 @@ export declare function pauseQueueWith(t: KernelTrx, conversationId: string, rea
|
|
|
107
147
|
* stays queued and the queue pauses (`skill_not_invocable`): `{ paused }`. The caller notifies
|
|
108
148
|
* after commit.
|
|
109
149
|
*/
|
|
110
|
-
export declare function dispatchQueuedIn(t: KernelTrx, eventLog: Pick<EventLog, "
|
|
150
|
+
export declare function dispatchQueuedIn(t: KernelTrx, eventLog: Pick<EventLog, "appendIn">, conversationId: string): Promise<{
|
|
111
151
|
event: ConversationEvent;
|
|
112
152
|
switched: boolean;
|
|
113
153
|
} | {
|
|
@@ -118,52 +158,4 @@ export declare function dispatchQueuedIn(t: KernelTrx, eventLog: Pick<EventLog,
|
|
|
118
158
|
* (inside the terminal transaction, see `finishRunIn`).
|
|
119
159
|
*/
|
|
120
160
|
export declare function pauseQueueIn(t: KernelTrx, conversationId: string): Promise<void>;
|
|
121
|
-
export interface ConversationQueueDeps {
|
|
122
|
-
db: KernelDb;
|
|
123
|
-
eventLog: Pick<EventLog, "append" | "notify" | "publishChanged" | "findByIdem">;
|
|
124
|
-
conversations: Pick<ConversationsService, "get" | "writable" | "resolveExtra" | "bindIn" | "checkFilesSupported" | "checkPick" | "prepareQueuedSkill">;
|
|
125
|
-
runs?: Pick<RunControl, "ensureRun">;
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* The queue API (owner only, as the conversation): list, add, edit the text, delete, send now and
|
|
129
|
-
* resume. Every change publishes `changed: queue`.
|
|
130
|
-
*/
|
|
131
|
-
export declare class ConversationQueue {
|
|
132
|
-
private readonly d;
|
|
133
|
-
constructor(d: ConversationQueueDeps);
|
|
134
|
-
list(orgId: string, conversationId: string, accountId: string): Promise<{
|
|
135
|
-
items: QueueItem[];
|
|
136
|
-
paused: boolean;
|
|
137
|
-
pauseReason?: QueuePauseReason;
|
|
138
|
-
}>;
|
|
139
|
-
/**
|
|
140
|
-
* Queues a message. `@` resources are read now with the caller's credentials and stored with the
|
|
141
|
-
* item, and uploaded files are bound to the conversation now, so sending later needs nobody's
|
|
142
|
-
* credentials. The same `clientMessageId` again returns the queued item (`created: false`), or,
|
|
143
|
-
* when it was already sent, the sent `user_message` with `item: null`. Then `ensureRun`: on an
|
|
144
|
-
* idle conversation the item goes out at once.
|
|
145
|
-
*/
|
|
146
|
-
add(orgId: string, conversationId: string, accountId: string, input: QueueInput): Promise<{
|
|
147
|
-
item: QueueItem | null;
|
|
148
|
-
event?: ConversationEvent;
|
|
149
|
-
created: boolean;
|
|
150
|
-
}>;
|
|
151
|
-
/**
|
|
152
|
-
* Changes a queued item's text (its resources and files stay as queued). A skill invocation's
|
|
153
|
-
* text is its arguments: the skill is rendered again with them now (phase D Task 9).
|
|
154
|
-
*/
|
|
155
|
-
edit(orgId: string, conversationId: string, accountId: string, itemId: string, text: string): Promise<QueueItem>;
|
|
156
|
-
remove(orgId: string, conversationId: string, accountId: string, itemId: string): Promise<void>;
|
|
157
|
-
/**
|
|
158
|
-
* Sends a queued item now: it leaves the queue and is posted as a user message in the same
|
|
159
|
-
* transaction (an interjection when a run is active; the items before it keep their place).
|
|
160
|
-
* Racing the dispatcher, exactly one of them takes the item; the loser sees it gone (404).
|
|
161
|
-
*/
|
|
162
|
-
sendNow(orgId: string, conversationId: string, accountId: string, itemId: string): Promise<ConversationEvent>;
|
|
163
|
-
/** "Continue sending": clears the pause and lets `ensureRun` send the head item. */
|
|
164
|
-
resume(orgId: string, conversationId: string, accountId: string): Promise<void>;
|
|
165
|
-
/** A queued item or a sent message for this client id (outside any transaction). */
|
|
166
|
-
private prior;
|
|
167
|
-
private lockConversation;
|
|
168
|
-
}
|
|
169
161
|
export {};
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import { randomUUID } from "node:crypto";
|
|
2
1
|
import { sql } from "kysely";
|
|
3
2
|
import { normalizeStoredDefinition } from "../agents/definition.js";
|
|
4
3
|
import { ApiError } from "../errors.js";
|
|
5
|
-
import {
|
|
6
|
-
import { userMessageIdemKey, } from "./conversations.service.js";
|
|
4
|
+
import { recordedSkillBlocked, } from "../skills/invoke.js";
|
|
7
5
|
import { payloadJson } from "./event-log.js";
|
|
6
|
+
import { userMessageIdemKey } from "./idem-keys.js";
|
|
8
7
|
import { planSelection, readSelection } from "./selection.js";
|
|
9
8
|
/**
|
|
10
9
|
* Queued messages (UI refresh B, spec §5.7): messages a person queued while a run was going. They
|
|
@@ -15,7 +14,7 @@ import { planSelection, readSelection } from "./selection.js";
|
|
|
15
14
|
*/
|
|
16
15
|
/** The most messages a conversation can hold in its queue. */
|
|
17
16
|
export const QUEUE_MAX_ITEMS = 20;
|
|
18
|
-
const COLUMNS = [
|
|
17
|
+
export const COLUMNS = [
|
|
19
18
|
"id",
|
|
20
19
|
"conversation_id",
|
|
21
20
|
"account_id",
|
|
@@ -34,9 +33,9 @@ const COLUMNS = [
|
|
|
34
33
|
* Queued text as the event log will store it: NUL becomes U+FFFD (PG rejects NUL in text and
|
|
35
34
|
* jsonb), the mapping `payloadJson` applies to a direct send (final review m1).
|
|
36
35
|
*/
|
|
37
|
-
const noNul = (text) => text.replaceAll("\0", "\uFFFD");
|
|
38
|
-
const itemNotFound = () => new ApiError("conversation.queue_item_not_found", "Queued message not found");
|
|
39
|
-
function toItem(r) {
|
|
36
|
+
export const noNul = (text) => text.replaceAll("\0", "\uFFFD");
|
|
37
|
+
export const itemNotFound = () => new ApiError("conversation.queue_item_not_found", "Queued message not found");
|
|
38
|
+
export function toItem(r) {
|
|
40
39
|
const skill = r.skill;
|
|
41
40
|
return {
|
|
42
41
|
id: r.id,
|
|
@@ -62,7 +61,7 @@ function toItem(r) {
|
|
|
62
61
|
* rendered text is `content[0]`) or carries files and no `@` resources (`content[0]` must be the
|
|
63
62
|
* text when resources follow it).
|
|
64
63
|
*/
|
|
65
|
-
function checkText(text, files, attachments, skill) {
|
|
64
|
+
export function checkText(text, files, attachments, skill) {
|
|
66
65
|
if (text.length > 0 || skill || (files > 0 && attachments === 0))
|
|
67
66
|
return;
|
|
68
67
|
throw new ApiError("validation_failed", "Request validation failed", [
|
|
@@ -73,7 +72,7 @@ function checkText(text, files, attachments, skill) {
|
|
|
73
72
|
]);
|
|
74
73
|
}
|
|
75
74
|
/** The stored form of a rendered invocation and its first content block. */
|
|
76
|
-
function storedSkill(invokedAs, invoked) {
|
|
75
|
+
export function storedSkill(invokedAs, invoked) {
|
|
77
76
|
const skill = { invokedAs, record: invoked.skill };
|
|
78
77
|
return { skill: payloadJson(skill), first: { type: "text", text: invoked.text } };
|
|
79
78
|
}
|
|
@@ -122,7 +121,7 @@ export async function appendQueuedIn(t, eventLog, conversationId, r) {
|
|
|
122
121
|
});
|
|
123
122
|
}
|
|
124
123
|
events.push(queuedUserMessage(r));
|
|
125
|
-
const written = await eventLog.
|
|
124
|
+
const written = await eventLog.appendIn(conversationId, events);
|
|
126
125
|
if (next !== null) {
|
|
127
126
|
await t
|
|
128
127
|
.updateTable("conversations")
|
|
@@ -156,7 +155,7 @@ async function currentAgent(t, conversationId) {
|
|
|
156
155
|
* Checked at dispatch, inside `t` (phase D Task 9): the rendered text was frozen when queued, but
|
|
157
156
|
* the skill must still be one of the agent's skills a person can invoke.
|
|
158
157
|
*/
|
|
159
|
-
async function queuedSkillBlocked(t, conversationId, r) {
|
|
158
|
+
export async function queuedSkillBlocked(t, conversationId, r) {
|
|
160
159
|
const skill = r.skill;
|
|
161
160
|
if (skill === null)
|
|
162
161
|
return null;
|
|
@@ -178,7 +177,7 @@ export async function pauseQueueWith(t, conversationId, reason) {
|
|
|
178
177
|
.execute();
|
|
179
178
|
}
|
|
180
179
|
/** Whether a user_message with this client id is already in the log (inside `t`). */
|
|
181
|
-
async function alreadySent(t, conversationId, clientMessageId) {
|
|
180
|
+
export async function alreadySent(t, conversationId, clientMessageId) {
|
|
182
181
|
const row = await t
|
|
183
182
|
.selectFrom("conversation_events")
|
|
184
183
|
.select("seq")
|
|
@@ -188,7 +187,7 @@ async function alreadySent(t, conversationId, clientMessageId) {
|
|
|
188
187
|
return row !== undefined;
|
|
189
188
|
}
|
|
190
189
|
/** Clears the pause once the queue is empty (inside `t`, holding the conversation row lock). */
|
|
191
|
-
async function unpauseIfEmpty(t, conversationId) {
|
|
190
|
+
export async function unpauseIfEmpty(t, conversationId) {
|
|
192
191
|
await t
|
|
193
192
|
.updateTable("conversations")
|
|
194
193
|
.set({ queue_paused: false, queue_pause_reason: null })
|
|
@@ -200,7 +199,7 @@ async function unpauseIfEmpty(t, conversationId) {
|
|
|
200
199
|
.where("conversation_queue.conversation_id", "=", conversationId))))
|
|
201
200
|
.execute();
|
|
202
201
|
}
|
|
203
|
-
const queueFull = () => new ApiError("conversation.queue_full", `A conversation can hold at most ${QUEUE_MAX_ITEMS} queued messages`);
|
|
202
|
+
export const queueFull = () => new ApiError("conversation.queue_full", `A conversation can hold at most ${QUEUE_MAX_ITEMS} queued messages`);
|
|
204
203
|
/**
|
|
205
204
|
* Sends the queue's head item as a `user_message` inside `t` (the caller holds the conversation
|
|
206
205
|
* row lock and has checked the conversation is idle and not paused); returns the event, or null
|
|
@@ -250,278 +249,3 @@ export async function pauseQueueIn(t, conversationId) {
|
|
|
250
249
|
.where("conversation_queue.conversation_id", "=", conversationId)))
|
|
251
250
|
.execute();
|
|
252
251
|
}
|
|
253
|
-
/**
|
|
254
|
-
* The queue API (owner only, as the conversation): list, add, edit the text, delete, send now and
|
|
255
|
-
* resume. Every change publishes `changed: queue`.
|
|
256
|
-
*/
|
|
257
|
-
export class ConversationQueue {
|
|
258
|
-
d;
|
|
259
|
-
constructor(d) {
|
|
260
|
-
this.d = d;
|
|
261
|
-
}
|
|
262
|
-
async list(orgId, conversationId, accountId) {
|
|
263
|
-
await this.d.conversations.get(orgId, conversationId, accountId);
|
|
264
|
-
return this.d.db
|
|
265
|
-
.transaction()
|
|
266
|
-
.setIsolationLevel("repeatable read")
|
|
267
|
-
.execute(async (t) => {
|
|
268
|
-
const conv = await t
|
|
269
|
-
.selectFrom("conversations")
|
|
270
|
-
.select(["queue_paused", "queue_pause_reason"])
|
|
271
|
-
.where("id", "=", conversationId)
|
|
272
|
-
.executeTakeFirstOrThrow();
|
|
273
|
-
const rows = await t
|
|
274
|
-
.selectFrom("conversation_queue")
|
|
275
|
-
.select(COLUMNS)
|
|
276
|
-
.where("conversation_id", "=", conversationId)
|
|
277
|
-
.orderBy("position")
|
|
278
|
-
.execute();
|
|
279
|
-
const reason = conv.queue_paused ? conv.queue_pause_reason : null;
|
|
280
|
-
return {
|
|
281
|
-
items: rows.map(toItem),
|
|
282
|
-
paused: conv.queue_paused,
|
|
283
|
-
...(reason !== null && { pauseReason: reason }),
|
|
284
|
-
};
|
|
285
|
-
});
|
|
286
|
-
}
|
|
287
|
-
/**
|
|
288
|
-
* Queues a message. `@` resources are read now with the caller's credentials and stored with the
|
|
289
|
-
* item, and uploaded files are bound to the conversation now, so sending later needs nobody's
|
|
290
|
-
* credentials. The same `clientMessageId` again returns the queued item (`created: false`), or,
|
|
291
|
-
* when it was already sent, the sent `user_message` with `item: null`. Then `ensureRun`: on an
|
|
292
|
-
* idle conversation the item goes out at once.
|
|
293
|
-
*/
|
|
294
|
-
async add(orgId, conversationId, accountId, input) {
|
|
295
|
-
const conv = await this.d.conversations.writable(orgId, conversationId, accountId);
|
|
296
|
-
this.d.conversations.checkFilesSupported(input);
|
|
297
|
-
const files = input.files ?? [];
|
|
298
|
-
checkText(input.text, files.length, input.attachments?.length ?? 0, input.skill !== undefined);
|
|
299
|
-
const prior = await this.prior(conversationId, input.clientMessageId);
|
|
300
|
-
if (prior)
|
|
301
|
-
return prior;
|
|
302
|
-
// a cheap unlocked check first, so a full queue never reads `@` resources (slow, remote,
|
|
303
|
-
// credentialed); the locked check below stays authoritative
|
|
304
|
-
const { n: queued } = await this.d.db
|
|
305
|
-
.selectFrom("conversation_queue")
|
|
306
|
-
.select((eb) => eb.fn.countAll().as("n"))
|
|
307
|
-
.where("conversation_id", "=", conversationId)
|
|
308
|
-
.executeTakeFirstOrThrow();
|
|
309
|
-
if (Number(queued) >= QUEUE_MAX_ITEMS)
|
|
310
|
-
throw queueFull();
|
|
311
|
-
await this.d.conversations.checkPick(orgId, conv, accountId, input);
|
|
312
|
-
// a skill invocation is rendered now, like the `@` resources (spec §4.5)
|
|
313
|
-
const invoked = await this.d.conversations.prepareQueuedSkill(orgId, conv, accountId, input);
|
|
314
|
-
const extra = await this.d.conversations.resolveExtra(orgId, accountId, input);
|
|
315
|
-
const skill = invoked === undefined || input.skill === undefined
|
|
316
|
-
? undefined
|
|
317
|
-
: storedSkill(input.skill.name, invoked);
|
|
318
|
-
const out = await this.d.db.transaction().execute(async (t) => {
|
|
319
|
-
await t
|
|
320
|
-
.selectFrom("conversations")
|
|
321
|
-
.select("id")
|
|
322
|
-
.where("id", "=", conversationId)
|
|
323
|
-
.forUpdate()
|
|
324
|
-
.executeTakeFirstOrThrow();
|
|
325
|
-
const existing = await t
|
|
326
|
-
.selectFrom("conversation_queue")
|
|
327
|
-
.select(COLUMNS)
|
|
328
|
-
.where("conversation_id", "=", conversationId)
|
|
329
|
-
.where("client_message_id", "=", input.clientMessageId)
|
|
330
|
-
.executeTakeFirst();
|
|
331
|
-
if (existing)
|
|
332
|
-
return { row: existing, created: false };
|
|
333
|
-
if (await alreadySent(t, conversationId, input.clientMessageId))
|
|
334
|
-
return null;
|
|
335
|
-
const { n, last } = await t
|
|
336
|
-
.selectFrom("conversation_queue")
|
|
337
|
-
.select((eb) => [
|
|
338
|
-
eb.fn.countAll().as("n"),
|
|
339
|
-
eb.fn.max("position").as("last"),
|
|
340
|
-
])
|
|
341
|
-
.where("conversation_id", "=", conversationId)
|
|
342
|
-
.executeTakeFirstOrThrow();
|
|
343
|
-
if (Number(n) >= QUEUE_MAX_ITEMS)
|
|
344
|
-
throw queueFull();
|
|
345
|
-
const blocks = await this.d.conversations.bindIn(t, orgId, conversationId, accountId, files);
|
|
346
|
-
const fileMeta = blocks.flatMap((b) => (b.type === "image" || b.type === "document") && b.source.kind === "ref"
|
|
347
|
-
? [{ attachmentId: b.source.attachmentId, name: b.name ?? "", mediaType: b.mediaType }]
|
|
348
|
-
: []);
|
|
349
|
-
const row = await t
|
|
350
|
-
.insertInto("conversation_queue")
|
|
351
|
-
.values({
|
|
352
|
-
id: randomUUID(),
|
|
353
|
-
conversation_id: conversationId,
|
|
354
|
-
account_id: accountId,
|
|
355
|
-
position: last === null ? 1 : Number(last) + 1,
|
|
356
|
-
text: noNul(input.text),
|
|
357
|
-
content: payloadJson([
|
|
358
|
-
...(skill === undefined ? [] : [skill.first]),
|
|
359
|
-
...extra.blocks,
|
|
360
|
-
...blocks,
|
|
361
|
-
]),
|
|
362
|
-
attachments: payloadJson(extra.attachments),
|
|
363
|
-
files: JSON.stringify(fileMeta),
|
|
364
|
-
client_message_id: input.clientMessageId,
|
|
365
|
-
model: input.model === undefined ? null : JSON.stringify(input.model),
|
|
366
|
-
effort: input.effort ?? null,
|
|
367
|
-
skill: skill?.skill ?? null,
|
|
368
|
-
})
|
|
369
|
-
.returning(COLUMNS)
|
|
370
|
-
.executeTakeFirstOrThrow();
|
|
371
|
-
return { row, created: true };
|
|
372
|
-
});
|
|
373
|
-
if (out === null) {
|
|
374
|
-
return ((await this.prior(conversationId, input.clientMessageId)) ?? { item: null, created: false });
|
|
375
|
-
}
|
|
376
|
-
if (out.created) {
|
|
377
|
-
await this.d.eventLog.publishChanged(conversationId, "queue");
|
|
378
|
-
await this.d.runs?.ensureRun(conversationId);
|
|
379
|
-
}
|
|
380
|
-
return { item: toItem(out.row), created: out.created };
|
|
381
|
-
}
|
|
382
|
-
/**
|
|
383
|
-
* Changes a queued item's text (its resources and files stay as queued). A skill invocation's
|
|
384
|
-
* text is its arguments: the skill is rendered again with them now (phase D Task 9).
|
|
385
|
-
*/
|
|
386
|
-
async edit(orgId, conversationId, accountId, itemId, text) {
|
|
387
|
-
const conv = await this.d.conversations.writable(orgId, conversationId, accountId);
|
|
388
|
-
const before = await this.d.db
|
|
389
|
-
.selectFrom("conversation_queue")
|
|
390
|
-
.select("skill")
|
|
391
|
-
.where("id", "=", itemId)
|
|
392
|
-
.where("conversation_id", "=", conversationId)
|
|
393
|
-
.executeTakeFirst();
|
|
394
|
-
if (!before)
|
|
395
|
-
throw itemNotFound();
|
|
396
|
-
const was = before.skill;
|
|
397
|
-
const invoked = was === null
|
|
398
|
-
? undefined
|
|
399
|
-
: await this.d.conversations.prepareQueuedSkill(orgId, conv, accountId, {
|
|
400
|
-
skill: { name: was.invokedAs },
|
|
401
|
-
text,
|
|
402
|
-
});
|
|
403
|
-
const row = await this.d.db.transaction().execute(async (t) => {
|
|
404
|
-
const cur = await t
|
|
405
|
-
.selectFrom("conversation_queue")
|
|
406
|
-
.select(["attachments", "files", "content", "skill"])
|
|
407
|
-
.where("id", "=", itemId)
|
|
408
|
-
.where("conversation_id", "=", conversationId)
|
|
409
|
-
.forUpdate()
|
|
410
|
-
.executeTakeFirst();
|
|
411
|
-
if (!cur)
|
|
412
|
-
throw itemNotFound();
|
|
413
|
-
const skill = cur.skill;
|
|
414
|
-
checkText(text, cur.files.length, cur.attachments.length, skill !== null);
|
|
415
|
-
// an invocation's first block is its rendered text: replace it and the record
|
|
416
|
-
const stored = skill === null || invoked === undefined ? undefined : storedSkill(skill.invokedAs, invoked);
|
|
417
|
-
return t
|
|
418
|
-
.updateTable("conversation_queue")
|
|
419
|
-
.set({
|
|
420
|
-
text: noNul(text),
|
|
421
|
-
updated_at: sql `now()`,
|
|
422
|
-
...(stored !== undefined && {
|
|
423
|
-
skill: stored.skill,
|
|
424
|
-
content: payloadJson([stored.first, ...cur.content.slice(1)]),
|
|
425
|
-
}),
|
|
426
|
-
})
|
|
427
|
-
.where("id", "=", itemId)
|
|
428
|
-
.returning(COLUMNS)
|
|
429
|
-
.executeTakeFirstOrThrow();
|
|
430
|
-
});
|
|
431
|
-
await this.d.eventLog.publishChanged(conversationId, "queue");
|
|
432
|
-
return toItem(row);
|
|
433
|
-
}
|
|
434
|
-
async remove(orgId, conversationId, accountId, itemId) {
|
|
435
|
-
await this.d.conversations.writable(orgId, conversationId, accountId);
|
|
436
|
-
await this.d.db.transaction().execute(async (t) => {
|
|
437
|
-
await this.lockConversation(t, conversationId);
|
|
438
|
-
const gone = await t
|
|
439
|
-
.deleteFrom("conversation_queue")
|
|
440
|
-
.where("id", "=", itemId)
|
|
441
|
-
.where("conversation_id", "=", conversationId)
|
|
442
|
-
.returning("id")
|
|
443
|
-
.executeTakeFirst();
|
|
444
|
-
if (!gone)
|
|
445
|
-
throw itemNotFound();
|
|
446
|
-
await unpauseIfEmpty(t, conversationId);
|
|
447
|
-
});
|
|
448
|
-
await this.d.eventLog.publishChanged(conversationId, "queue");
|
|
449
|
-
}
|
|
450
|
-
/**
|
|
451
|
-
* Sends a queued item now: it leaves the queue and is posted as a user message in the same
|
|
452
|
-
* transaction (an interjection when a run is active; the items before it keep their place).
|
|
453
|
-
* Racing the dispatcher, exactly one of them takes the item; the loser sees it gone (404).
|
|
454
|
-
*/
|
|
455
|
-
async sendNow(orgId, conversationId, accountId, itemId) {
|
|
456
|
-
await this.d.conversations.writable(orgId, conversationId, accountId);
|
|
457
|
-
const { event, fresh, switched } = await this.d.db.transaction().execute(async (t) => {
|
|
458
|
-
await this.lockConversation(t, conversationId);
|
|
459
|
-
const head = await t
|
|
460
|
-
.selectFrom("conversation_queue")
|
|
461
|
-
.select(["skill", "client_message_id"])
|
|
462
|
-
.where("id", "=", itemId)
|
|
463
|
-
.where("conversation_id", "=", conversationId)
|
|
464
|
-
.executeTakeFirst();
|
|
465
|
-
if (!head)
|
|
466
|
-
throw itemNotFound();
|
|
467
|
-
// the skill is checked again, as at dispatch; a refused item stays queued
|
|
468
|
-
if (!(await alreadySent(t, conversationId, head.client_message_id))) {
|
|
469
|
-
const blocked = await queuedSkillBlocked(t, conversationId, head);
|
|
470
|
-
if (blocked !== null) {
|
|
471
|
-
throw notInvocable(blocked, head.skill.invokedAs);
|
|
472
|
-
}
|
|
473
|
-
}
|
|
474
|
-
const row = await t
|
|
475
|
-
.deleteFrom("conversation_queue")
|
|
476
|
-
.where("id", "=", itemId)
|
|
477
|
-
.where("conversation_id", "=", conversationId)
|
|
478
|
-
.returning(COLUMNS)
|
|
479
|
-
.executeTakeFirst();
|
|
480
|
-
if (!row)
|
|
481
|
-
throw itemNotFound();
|
|
482
|
-
const sent = await alreadySent(t, conversationId, row.client_message_id);
|
|
483
|
-
const out = await appendQueuedIn(t, this.d.eventLog, conversationId, row);
|
|
484
|
-
await unpauseIfEmpty(t, conversationId);
|
|
485
|
-
return { ...out, fresh: !sent };
|
|
486
|
-
});
|
|
487
|
-
if (fresh)
|
|
488
|
-
await this.d.eventLog.notify(conversationId, event.seq);
|
|
489
|
-
if (switched)
|
|
490
|
-
await this.d.eventLog.publishChanged(conversationId, "selection");
|
|
491
|
-
await this.d.eventLog.publishChanged(conversationId, "queue");
|
|
492
|
-
await this.d.runs?.ensureRun(conversationId);
|
|
493
|
-
return event;
|
|
494
|
-
}
|
|
495
|
-
/** "Continue sending": clears the pause and lets `ensureRun` send the head item. */
|
|
496
|
-
async resume(orgId, conversationId, accountId) {
|
|
497
|
-
await this.d.conversations.writable(orgId, conversationId, accountId);
|
|
498
|
-
await this.d.db
|
|
499
|
-
.updateTable("conversations")
|
|
500
|
-
.set({ queue_paused: false, queue_pause_reason: null })
|
|
501
|
-
.where("id", "=", conversationId)
|
|
502
|
-
.execute();
|
|
503
|
-
await this.d.eventLog.publishChanged(conversationId, "queue");
|
|
504
|
-
await this.d.runs?.ensureRun(conversationId);
|
|
505
|
-
}
|
|
506
|
-
/** A queued item or a sent message for this client id (outside any transaction). */
|
|
507
|
-
async prior(conversationId, clientMessageId) {
|
|
508
|
-
const row = await this.d.db
|
|
509
|
-
.selectFrom("conversation_queue")
|
|
510
|
-
.select(COLUMNS)
|
|
511
|
-
.where("conversation_id", "=", conversationId)
|
|
512
|
-
.where("client_message_id", "=", clientMessageId)
|
|
513
|
-
.executeTakeFirst();
|
|
514
|
-
if (row)
|
|
515
|
-
return { item: toItem(row), created: false };
|
|
516
|
-
const event = await this.d.eventLog.findByIdem(conversationId, userMessageIdemKey(clientMessageId));
|
|
517
|
-
return event ? { item: null, event, created: false } : null;
|
|
518
|
-
}
|
|
519
|
-
async lockConversation(t, conversationId) {
|
|
520
|
-
await t
|
|
521
|
-
.selectFrom("conversations")
|
|
522
|
-
.select("id")
|
|
523
|
-
.where("id", "=", conversationId)
|
|
524
|
-
.forUpdate()
|
|
525
|
-
.executeTakeFirstOrThrow();
|
|
526
|
-
}
|
|
527
|
-
}
|