@capybara-hq/kernel 0.1.0-rc.4 → 0.1.0-rc.6
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/bootstrap.json +61 -5
- package/dist/admin/admin.controller.d.ts +51 -14
- package/dist/admin/admin.controller.js +60 -19
- package/dist/admin/extensions.controller.d.ts +16 -2
- package/dist/admin/extensions.controller.js +26 -6
- package/dist/admin/setup-lock.d.ts +1 -1
- package/dist/admin/setup-lock.js +1 -1
- package/dist/admin/setup.controller.d.ts +1 -1
- package/dist/admin/setup.controller.js +1 -1
- package/dist/admin/setup.service.d.ts +4 -4
- package/dist/admin/setup.service.js +8 -8
- package/dist/agents/agent-lookup.d.ts +16 -0
- package/dist/agents/agent-lookup.js +11 -0
- package/dist/agents/agents.controller.d.ts +76 -1
- package/dist/agents/agents.controller.js +90 -11
- package/dist/agents/agents.module.d.ts +4 -1
- package/dist/agents/agents.module.js +32 -6
- package/dist/agents/agents.service.d.ts +54 -23
- package/dist/agents/agents.service.js +180 -76
- package/dist/agents/definition.d.ts +49 -0
- package/dist/agents/definition.js +45 -0
- package/dist/agents/from-template.d.ts +106 -0
- package/dist/agents/from-template.js +649 -0
- package/dist/agents/from-template.service.d.ts +60 -0
- package/dist/agents/from-template.service.js +161 -0
- package/dist/agents/models.controller.d.ts +34 -5
- package/dist/agents/models.controller.js +50 -6
- package/dist/agents/org-templates.d.ts +176 -0
- package/dist/agents/org-templates.js +827 -0
- package/dist/agents/pending-connector-requests.d.ts +77 -0
- package/dist/agents/pending-connector-requests.js +215 -0
- package/dist/agents/pending-connectors.controller.d.ts +39 -0
- package/dist/agents/pending-connectors.controller.js +91 -0
- package/dist/agents/pending-connectors.service.d.ts +62 -0
- package/dist/agents/pending-connectors.service.js +282 -0
- package/dist/agents/readiness.controller.d.ts +5 -5
- package/dist/agents/readiness.controller.js +6 -6
- package/dist/agents/templates.controller.d.ts +86 -5
- package/dist/agents/templates.controller.js +171 -7
- package/dist/agents/templates.d.ts +127 -23
- package/dist/agents/templates.js +475 -52
- package/dist/background/background.module.js +8 -1
- package/dist/background/finish.d.ts +3 -2
- package/dist/background/launch-lock.d.ts +4 -3
- package/dist/background/launch-lock.js +4 -3
- package/dist/background/poll.job.d.ts +9 -6
- package/dist/background/poll.job.js +30 -22
- package/dist/background/session.d.ts +13 -2
- package/dist/background/session.js +13 -0
- package/dist/background/stop.d.ts +12 -6
- package/dist/background/stop.js +57 -39
- package/dist/background/store.d.ts +18 -6
- package/dist/background/store.js +12 -6
- package/dist/background/tasks.service.d.ts +15 -5
- package/dist/background/tasks.service.js +42 -17
- package/dist/background/wake-rules.d.ts +27 -18
- package/dist/background/wake-rules.js +52 -22
- package/dist/background/wake.d.ts +13 -11
- package/dist/background/wake.js +20 -14
- package/dist/catalog/admin-catalog.controller.d.ts +129 -30
- package/dist/catalog/admin-catalog.controller.js +213 -42
- package/dist/catalog/catalog-content.d.ts +58 -32
- package/dist/catalog/catalog-content.js +34 -8
- package/dist/catalog/catalog-import.module.d.ts +7 -0
- package/dist/catalog/catalog-import.module.js +60 -0
- package/dist/catalog/catalog-items.d.ts +111 -7
- package/dist/catalog/catalog-items.js +279 -13
- package/dist/catalog/catalog-scope.service.d.ts +260 -0
- package/dist/catalog/catalog-scope.service.js +1116 -0
- package/dist/catalog/catalog.module.d.ts +7 -9
- package/dist/catalog/catalog.module.js +41 -31
- package/dist/catalog/catalog.service.d.ts +101 -29
- package/dist/catalog/catalog.service.js +104 -106
- package/dist/catalog/cli.d.ts +11 -1
- package/dist/catalog/cli.js +26 -1
- package/dist/catalog/component-promotion.d.ts +96 -0
- package/dist/catalog/component-promotion.js +395 -0
- package/dist/catalog/component-scope.controller.d.ts +152 -0
- package/dist/catalog/component-scope.controller.js +287 -0
- package/dist/catalog/component-scope.service.d.ts +303 -0
- package/dist/catalog/component-scope.service.js +936 -0
- package/dist/catalog/component-state.d.ts +174 -0
- package/dist/catalog/component-state.js +437 -0
- package/dist/catalog/job-ids.d.ts +30 -0
- package/dist/catalog/job-ids.js +25 -0
- package/dist/catalog/marketplace-fetch.d.ts +1 -1
- package/dist/catalog/marketplaces.controller.d.ts +22 -5
- package/dist/catalog/marketplaces.controller.js +56 -7
- package/dist/catalog/marketplaces.service.d.ts +54 -14
- package/dist/catalog/marketplaces.service.js +71 -22
- package/dist/catalog/org-catalog.controller.d.ts +125 -34
- package/dist/catalog/org-catalog.controller.js +181 -65
- package/dist/catalog/org-catalog.service.d.ts +65 -33
- package/dist/catalog/org-catalog.service.js +324 -157
- package/dist/catalog/org-extension-switch.d.ts +41 -0
- package/dist/catalog/org-extension-switch.js +115 -0
- package/dist/catalog/org-extension.controller.d.ts +119 -0
- package/dist/catalog/org-extension.controller.js +266 -0
- package/dist/catalog/org-plugin-uploads.controller.d.ts +98 -0
- package/dist/catalog/org-plugin-uploads.controller.js +213 -0
- package/dist/catalog/org-plugin-uploads.d.ts +63 -0
- package/dist/catalog/org-plugin-uploads.js +116 -0
- package/dist/catalog/owned-items.d.ts +184 -0
- package/dist/catalog/owned-items.js +789 -0
- package/dist/catalog/owned-plugin-cleanup.d.ts +56 -0
- package/dist/catalog/owned-plugin-cleanup.js +194 -0
- package/dist/catalog/ownership.d.ts +172 -0
- package/dist/catalog/ownership.js +326 -0
- package/dist/catalog/platform-components.d.ts +221 -0
- package/dist/catalog/platform-components.js +761 -0
- package/dist/catalog/platform-migration.d.ts +115 -0
- package/dist/catalog/platform-migration.js +582 -0
- package/dist/catalog/plugin-import.d.ts +178 -34
- package/dist/catalog/plugin-import.js +622 -82
- package/dist/catalog/plugin-install.d.ts +185 -41
- package/dist/catalog/plugin-install.js +758 -126
- package/dist/catalog/plugin-upgrade.d.ts +260 -225
- package/dist/catalog/plugin-upgrade.js +1147 -1136
- package/dist/catalog/request-rules.d.ts +65 -0
- package/dist/catalog/request-rules.js +217 -0
- package/dist/catalog/requests.service.d.ts +193 -118
- package/dist/catalog/requests.service.js +526 -343
- package/dist/catalog/reserved-names.d.ts +8 -0
- package/dist/catalog/reserved-names.js +42 -0
- package/dist/catalog/scope-orgs.d.ts +21 -0
- package/dist/catalog/scope-orgs.js +67 -0
- package/dist/catalog/scope-state.d.ts +35 -0
- package/dist/catalog/scope-state.js +87 -0
- package/dist/catalog/scope-sync-workers.d.ts +7 -0
- package/dist/catalog/scope-sync-workers.js +29 -0
- package/dist/catalog/scope-sync.d.ts +176 -0
- package/dist/catalog/scope-sync.js +576 -0
- package/dist/catalog/scope.d.ts +42 -0
- package/dist/catalog/scope.js +42 -0
- package/dist/catalog/unshare.d.ts +22 -0
- package/dist/catalog/unshare.js +118 -0
- package/dist/channels/actions.js +1 -0
- package/dist/channels/cards.js +20 -2
- package/dist/channels/channels.module.js +2 -0
- package/dist/channels/inbound.d.ts +9 -1
- package/dist/channels/inbound.js +67 -5
- package/dist/channels/phrases.d.ts +35 -0
- package/dist/channels/phrases.js +29 -0
- package/dist/config/docs.js +3 -1
- package/dist/config/schema.d.ts +10 -2
- package/dist/config/schema.js +70 -22
- package/dist/conversations/access.d.ts +6 -4
- package/dist/conversations/access.js +27 -5
- package/dist/conversations/agent-tree.d.ts +46 -0
- package/dist/conversations/agent-tree.js +92 -0
- package/dist/conversations/conversations.controller.d.ts +43 -18
- package/dist/conversations/conversations.controller.js +79 -38
- package/dist/conversations/conversations.module.d.ts +1 -1
- package/dist/conversations/conversations.module.js +7 -7
- package/dist/conversations/conversations.service.d.ts +73 -15
- package/dist/conversations/conversations.service.js +115 -35
- package/dist/conversations/environment-status.d.ts +24 -0
- package/dist/conversations/environment-status.js +71 -0
- package/dist/conversations/event-log.d.ts +20 -5
- package/dist/conversations/event-log.js +60 -0
- package/dist/conversations/events.d.ts +84 -2
- package/dist/conversations/events.js +91 -17
- package/dist/conversations/queue.service.d.ts +1 -1
- package/dist/conversations/queue.service.js +5 -0
- package/dist/conversations/titles.d.ts +5 -3
- package/dist/conversations/titles.js +21 -8
- package/dist/conversations/tree.d.ts +17 -0
- package/dist/conversations/tree.js +42 -0
- package/dist/ctx/create-ctx.d.ts +20 -1
- package/dist/ctx/create-ctx.js +38 -7
- package/dist/db/kernel-schema.d.ts +386 -18
- package/dist/environments/access.d.ts +41 -0
- package/dist/environments/access.js +77 -0
- package/dist/environments/conversation-environments.d.ts +61 -0
- package/dist/environments/conversation-environments.js +170 -0
- package/dist/environments/dto.d.ts +25 -0
- package/dist/environments/dto.js +12 -0
- package/dist/environments/environments.controller.d.ts +33 -0
- package/dist/environments/environments.controller.js +110 -0
- package/dist/environments/environments.module.d.ts +8 -0
- package/dist/environments/environments.module.js +27 -0
- package/dist/environments/environments.service.d.ts +153 -0
- package/dist/environments/environments.service.js +541 -0
- package/dist/environments/legacy-cleanup.job.d.ts +34 -0
- package/dist/environments/legacy-cleanup.job.js +141 -0
- package/dist/errors.d.ts +85 -2
- package/dist/errors.js +85 -2
- package/dist/evals/reconstruct.d.ts +18 -9
- package/dist/evals/reconstruct.js +26 -7
- package/dist/evals/run-replay.d.ts +4 -2
- package/dist/evals/run-replay.js +20 -6
- package/dist/evals/runs.service.d.ts +2 -1
- package/dist/evals/runs.service.js +13 -12
- package/dist/evals/step-replay.d.ts +4 -6
- package/dist/evals/step-replay.js +4 -3
- package/dist/evals/trajectory.service.d.ts +8 -3
- package/dist/evals/trajectory.service.js +26 -14
- package/dist/evals/worker.d.ts +5 -5
- package/dist/evals/worker.js +9 -3
- package/dist/extensions/admin-ops.d.ts +36 -10
- package/dist/extensions/admin-ops.js +65 -42
- package/dist/extensions/admin-view.d.ts +37 -10
- package/dist/extensions/admin-view.js +103 -20
- package/dist/extensions/bootstrap.d.ts +17 -4
- package/dist/extensions/bootstrap.js +70 -9
- package/dist/extensions/cli.d.ts +12 -0
- package/dist/extensions/cli.js +11 -2
- package/dist/extensions/config-hash.d.ts +10 -0
- package/dist/extensions/config-hash.js +38 -0
- package/dist/extensions/deployment-config.d.ts +28 -5
- package/dist/extensions/deployment-config.js +48 -7
- package/dist/extensions/effective-config.d.ts +127 -0
- package/dist/extensions/effective-config.js +368 -0
- package/dist/extensions/extensions.module.js +11 -11
- package/dist/extensions/hooks.d.ts +37 -4
- package/dist/extensions/hooks.js +82 -16
- package/dist/extensions/host.d.ts +24 -10
- package/dist/extensions/host.js +49 -54
- package/dist/extensions/installs.d.ts +20 -8
- package/dist/extensions/installs.js +37 -15
- package/dist/extensions/org-config.d.ts +75 -6
- package/dist/extensions/org-config.js +184 -32
- package/dist/extensions/org-levels.d.ts +37 -0
- package/dist/extensions/org-levels.js +71 -0
- package/dist/extensions/org-overrides.d.ts +151 -0
- package/dist/extensions/org-overrides.js +524 -0
- package/dist/extensions/permission-view.d.ts +16 -4
- package/dist/extensions/permission-view.js +4 -4
- package/dist/extensions/plugin-items.d.ts +21 -0
- package/dist/extensions/plugin-items.js +42 -0
- package/dist/extensions/point-defaults.d.ts +12 -5
- package/dist/extensions/point-defaults.js +37 -9
- package/dist/extensions/resolve.d.ts +5 -1
- package/dist/extensions/resolve.js +15 -2
- package/dist/extensions/state.module.d.ts +9 -0
- package/dist/extensions/state.module.js +38 -0
- package/dist/files/previewers.d.ts +8 -1
- package/dist/files/previewers.js +35 -6
- package/dist/http/api.module.js +25 -3
- package/dist/http/app.d.ts +11 -2
- package/dist/http/app.js +31 -5
- package/dist/http/plugin-dispatch.d.ts +4 -1
- package/dist/http/plugin-dispatch.js +14 -2
- package/dist/identity/accounts.d.ts +29 -29
- package/dist/identity/accounts.js +47 -47
- package/dist/identity/audit.d.ts +2 -1
- package/dist/identity/auth.guard.d.ts +13 -5
- package/dist/identity/auth.guard.js +26 -9
- package/dist/identity/identity.module.d.ts +1 -1
- package/dist/identity/identity.module.js +4 -4
- package/dist/identity/me.controller.js +1 -1
- package/dist/identity/principal.d.ts +3 -3
- package/dist/identity/principal.js +3 -3
- package/dist/identity/settings.d.ts +22 -11
- package/dist/identity/settings.js +53 -18
- package/dist/identity/{enterprise-admin.d.ts → super-admin.d.ts} +5 -5
- package/dist/identity/{enterprise-admin.js → super-admin.js} +24 -24
- package/dist/inbox/inbox.module.d.ts +4 -1
- package/dist/inbox/inbox.module.js +7 -3
- package/dist/inbox/inbox.service.d.ts +62 -3
- package/dist/inbox/inbox.service.js +74 -4
- package/dist/inbox/org-notices.d.ts +63 -0
- package/dist/inbox/org-notices.js +91 -0
- package/dist/inbox/platform-inbox.controller.d.ts +23 -0
- package/dist/inbox/platform-inbox.controller.js +58 -0
- package/dist/inbox/platform-inbox.service.d.ts +151 -0
- package/dist/inbox/platform-inbox.service.js +263 -0
- package/dist/inbox/platform-notices.d.ts +19 -0
- package/dist/inbox/platform-notices.js +9 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/infra/cli/kernel-cli.module.js +9 -1
- package/dist/infra/config/kernel-config.service.js +24 -1
- package/dist/infra/database/xact-lock.d.ts +1 -1
- package/dist/infra/database/xact-lock.js +1 -1
- package/dist/infra/events/kernel-events.d.ts +19 -2
- package/dist/infra/queue/add-job-once.d.ts +14 -0
- package/dist/infra/queue/add-job-once.js +16 -0
- package/dist/kernel.module.js +6 -0
- package/dist/lifecycle/kernel-lifecycle.d.ts +1 -1
- package/dist/lifecycle/kernel-lifecycle.js +4 -4
- package/dist/models/embeddings.d.ts +82 -0
- package/dist/models/embeddings.js +326 -0
- package/dist/models/enablement.controller.d.ts +40 -0
- package/dist/models/enablement.controller.js +74 -0
- package/dist/models/enablement.d.ts +99 -0
- package/dist/models/enablement.js +263 -0
- package/dist/models/models.module.d.ts +5 -1
- package/dist/models/models.module.js +16 -4
- package/dist/models/prices.d.ts +5 -5
- package/dist/models/prices.js +4 -4
- package/dist/models/purposes.controller.d.ts +6 -4
- package/dist/models/purposes.controller.js +13 -7
- package/dist/models/purposes.d.ts +37 -12
- package/dist/models/purposes.js +63 -17
- package/dist/orgs/directory-sync.d.ts +14 -5
- package/dist/orgs/directory-sync.js +41 -17
- package/dist/orgs/offboarding.d.ts +9 -7
- package/dist/orgs/offboarding.js +28 -17
- package/dist/orgs/org-lock.d.ts +5 -0
- package/dist/orgs/org-lock.js +13 -0
- package/dist/orgs/org.guard.d.ts +10 -0
- package/dist/orgs/org.guard.js +43 -32
- package/dist/orgs/orgs.module.js +3 -0
- package/dist/orgs/orgs.service.d.ts +20 -7
- package/dist/orgs/orgs.service.js +32 -12
- package/dist/orgs/roles.d.ts +1 -1
- package/dist/orgs/roles.js +5 -1
- package/dist/orgs/settings.controller.d.ts +1 -1
- package/dist/orgs/settings.service.d.ts +15 -3
- package/dist/orgs/settings.service.js +6 -2
- package/dist/overrides.d.ts +3 -0
- package/dist/overrides.js +2 -0
- package/dist/platform/actor.d.ts +48 -0
- package/dist/platform/actor.js +100 -0
- package/dist/platform/agent-docs.d.ts +18 -0
- package/dist/platform/agent-docs.js +59 -0
- package/dist/platform/availability.d.ts +14 -0
- package/dist/platform/availability.js +43 -0
- package/dist/platform/errors.d.ts +11 -0
- package/dist/platform/errors.js +26 -0
- package/dist/platform/exclusions.d.ts +12 -0
- package/dist/platform/exclusions.js +1405 -0
- package/dist/platform/method.d.ts +6 -0
- package/dist/platform/method.js +15 -0
- package/dist/platform/operation.d.ts +92 -0
- package/dist/platform/operation.js +35 -0
- package/dist/platform/ops/agent-templates.ops.d.ts +14 -0
- package/dist/platform/ops/agent-templates.ops.js +92 -0
- package/dist/platform/ops/agents.ops.d.ts +19 -0
- package/dist/platform/ops/agents.ops.js +294 -0
- package/dist/platform/ops/connectors.ops.d.ts +15 -0
- package/dist/platform/ops/connectors.ops.js +126 -0
- package/dist/platform/ops/errors.d.ts +11 -0
- package/dist/platform/ops/errors.js +22 -0
- package/dist/platform/ops/extensions.ops.d.ts +19 -0
- package/dist/platform/ops/extensions.ops.js +116 -0
- package/dist/platform/ops/marketplaces.ops.d.ts +16 -0
- package/dist/platform/ops/marketplaces.ops.js +157 -0
- package/dist/platform/ops/paging.d.ts +14 -0
- package/dist/platform/ops/paging.js +20 -0
- package/dist/platform/ops/platform.ops.d.ts +23 -0
- package/dist/platform/ops/platform.ops.js +158 -0
- package/dist/platform/ops/plugins.ops.d.ts +33 -0
- package/dist/platform/ops/plugins.ops.js +377 -0
- package/dist/platform/ops/requests.ops.d.ts +14 -0
- package/dist/platform/ops/requests.ops.js +153 -0
- package/dist/platform/ops/role.d.ts +4 -0
- package/dist/platform/ops/role.js +10 -0
- package/dist/platform/ops/skills.ops.d.ts +13 -0
- package/dist/platform/ops/skills.ops.js +98 -0
- package/dist/platform/ops/summary.d.ts +10 -0
- package/dist/platform/ops/summary.js +18 -0
- package/dist/platform/platform-ops.module.d.ts +7 -0
- package/dist/platform/platform-ops.module.js +55 -0
- package/dist/platform/platform.module.d.ts +8 -0
- package/dist/platform/platform.module.js +25 -0
- package/dist/platform/redact-orgs.d.ts +7 -0
- package/dist/platform/redact-orgs.js +52 -0
- package/dist/platform/registry.d.ts +30 -0
- package/dist/platform/registry.js +111 -0
- package/dist/roles/worker-role.d.ts +6 -4
- package/dist/roles/worker-role.js +14 -7
- package/dist/roles/worker.module.d.ts +1 -1
- package/dist/roles/worker.module.js +9 -1
- package/dist/runtime/context/build.d.ts +6 -4
- package/dist/runtime/context/build.js +26 -7
- package/dist/runtime/context/claude-tools.d.ts +2 -1
- package/dist/runtime/context/claude-tools.js +5 -4
- package/dist/runtime/context/compaction.js +9 -0
- package/dist/runtime/context/reminders.d.ts +2 -0
- package/dist/runtime/context/reminders.js +2 -0
- package/dist/runtime/context/skills.js +9 -2
- package/dist/runtime/context/tool-changes.d.ts +27 -0
- package/dist/runtime/context/tool-changes.js +60 -0
- package/dist/runtime/hook-calls.d.ts +8 -1
- package/dist/runtime/hook-calls.js +40 -7
- package/dist/runtime/langgraph-loop.d.ts +3 -1
- package/dist/runtime/langgraph-loop.js +35 -17
- package/dist/runtime/loop.d.ts +32 -4
- package/dist/runtime/maintenance.d.ts +7 -4
- package/dist/runtime/maintenance.js +23 -8
- package/dist/runtime/model-call.d.ts +38 -11
- package/dist/runtime/model-call.js +97 -24
- package/dist/runtime/providers.d.ts +146 -32
- package/dist/runtime/providers.js +321 -67
- package/dist/runtime/run-control.d.ts +11 -1
- package/dist/runtime/run-control.js +12 -0
- package/dist/runtime/run-drafts.d.ts +85 -0
- package/dist/runtime/run-drafts.js +230 -0
- package/dist/runtime/run-jobs.d.ts +3 -5
- package/dist/runtime/run-jobs.js +3 -7
- package/dist/runtime/run-queue.d.ts +37 -3
- package/dist/runtime/run-queue.js +188 -11
- package/dist/runtime/run-worker.d.ts +12 -6
- package/dist/runtime/run-worker.js +58 -35
- package/dist/runtime/runtime.module.js +3 -0
- package/dist/runtime/step-log.d.ts +9 -4
- package/dist/runtime/step-log.js +8 -5
- package/dist/runtime/stream.controller.d.ts +23 -1
- package/dist/runtime/stream.controller.js +60 -3
- package/dist/runtime/stream.d.ts +4 -1
- package/dist/runtime/stream.js +27 -3
- package/dist/runtime/subagents/child.d.ts +55 -7
- package/dist/runtime/subagents/child.js +105 -7
- package/dist/runtime/subagents/definition.d.ts +12 -3
- package/dist/runtime/subagents/definition.js +46 -32
- package/dist/runtime/subagents/deliveries.d.ts +71 -0
- package/dist/runtime/subagents/deliveries.js +228 -0
- package/dist/runtime/subagents/dispatch.d.ts +115 -26
- package/dist/runtime/subagents/dispatch.js +212 -141
- package/dist/runtime/subagents/limits.d.ts +24 -5
- package/dist/runtime/subagents/limits.js +40 -6
- package/dist/runtime/subagents/messages.d.ts +95 -0
- package/dist/runtime/subagents/messages.js +328 -0
- package/dist/runtime/subagents/preamble.d.ts +4 -4
- package/dist/runtime/subagents/preamble.js +9 -7
- package/dist/runtime/subagents/progress.d.ts +8 -6
- package/dist/runtime/subagents/progress.js +11 -6
- package/dist/runtime/subagents/render.d.ts +30 -0
- package/dist/runtime/subagents/render.js +53 -0
- package/dist/runtime/subagents/roster.d.ts +24 -7
- package/dist/runtime/subagents/roster.js +47 -11
- package/dist/runtime/subagents/skill-fork.d.ts +3 -2
- package/dist/runtime/subagents/skill-fork.js +8 -4
- package/dist/runtime/subagents/status.d.ts +14 -0
- package/dist/runtime/subagents/status.js +23 -0
- package/dist/runtime/subagents/subagents.service.d.ts +7 -4
- package/dist/runtime/subagents/subagents.service.js +11 -6
- package/dist/runtime/usage-report-jobs.d.ts +88 -0
- package/dist/runtime/usage-report-jobs.js +158 -0
- package/dist/runtime/usage-report.d.ts +33 -38
- package/dist/runtime/usage-report.js +169 -96
- package/dist/runtime/waits.d.ts +140 -37
- package/dist/runtime/waits.js +394 -106
- package/dist/sandbox/jobs.d.ts +40 -13
- package/dist/sandbox/jobs.js +57 -20
- package/dist/sandbox/leases.d.ts +37 -54
- package/dist/sandbox/leases.js +71 -115
- package/dist/sandbox/providers.d.ts +2 -2
- package/dist/sandbox/providers.js +1 -1
- package/dist/sandbox/sandbox.module.d.ts +3 -2
- package/dist/sandbox/sandbox.module.js +4 -3
- package/dist/sandbox/sandbox.service.d.ts +229 -134
- package/dist/sandbox/sandbox.service.js +630 -409
- package/dist/skills/catalog.d.ts +3 -2
- package/dist/skills/catalog.js +21 -43
- package/dist/skills/changes.controller.d.ts +7 -0
- package/dist/skills/changes.controller.js +19 -1
- package/dist/skills/invoke.js +8 -3
- package/dist/skills/package.d.ts +20 -1
- package/dist/skills/package.js +28 -1
- package/dist/skills/skills.controller.d.ts +39 -4
- package/dist/skills/skills.controller.js +88 -10
- package/dist/skills/skills.module.js +10 -1
- package/dist/skills/skills.service.d.ts +106 -26
- package/dist/skills/skills.service.js +421 -75
- package/dist/skills/usable.d.ts +81 -0
- package/dist/skills/usable.js +379 -0
- package/dist/tools/approvals.service.d.ts +20 -2
- package/dist/tools/approvals.service.js +23 -4
- package/dist/tools/builtin-names.d.ts +21 -5
- package/dist/tools/builtin-names.js +30 -5
- package/dist/tools/builtins/agent.d.ts +23 -21
- package/dist/tools/builtins/agent.js +62 -55
- package/dist/tools/builtins/builtin-tools.d.ts +6 -2
- package/dist/tools/builtins/builtin-tools.js +37 -12
- package/dist/tools/builtins/handback.d.ts +28 -0
- package/dist/tools/builtins/handback.js +53 -0
- package/dist/tools/builtins/platform.d.ts +34 -0
- package/dist/tools/builtins/platform.js +362 -0
- package/dist/tools/builtins/sandbox/bash.js +13 -3
- package/dist/tools/builtins/sandbox/common.d.ts +43 -24
- package/dist/tools/builtins/sandbox/common.js +80 -45
- package/dist/tools/builtins/sandbox/edit.js +2 -2
- package/dist/tools/builtins/sandbox/glob.js +2 -2
- package/dist/tools/builtins/sandbox/grep.js +2 -4
- 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.js +1 -1
- package/dist/tools/builtins/sandbox/task-output.d.ts +14 -3
- package/dist/tools/builtins/sandbox/task-output.js +30 -5
- package/dist/tools/builtins/sandbox/task-stop.js +2 -1
- package/dist/tools/builtins/sandbox/write.js +2 -2
- package/dist/tools/builtins/send-message.d.ts +56 -0
- package/dist/tools/builtins/send-message.js +100 -0
- package/dist/tools/builtins/skill-load.d.ts +22 -14
- package/dist/tools/builtins/skill-load.js +86 -57
- package/dist/tools/builtins/skill-write.js +1 -1
- package/dist/tools/builtins/web/extract.js +5 -1
- package/dist/tools/builtins/web/fetch.js +1 -0
- package/dist/tools/builtins/web/search.js +1 -0
- package/dist/tools/connectors.controller.d.ts +10 -0
- package/dist/tools/connectors.controller.js +12 -0
- package/dist/tools/connectors.service.d.ts +46 -5
- package/dist/tools/connectors.service.js +94 -15
- package/dist/tools/extension-tools.controller.d.ts +14 -0
- package/dist/tools/extension-tools.controller.js +37 -0
- package/dist/tools/info.d.ts +42 -1
- package/dist/tools/info.js +64 -1
- package/dist/tools/org-tool-switches.d.ts +74 -0
- package/dist/tools/org-tool-switches.js +184 -0
- package/dist/tools/pipeline.d.ts +46 -40
- package/dist/tools/pipeline.js +193 -364
- package/dist/tools/policy.d.ts +1 -1
- package/dist/tools/policy.js +36 -16
- package/dist/tools/registry.d.ts +98 -5
- package/dist/tools/registry.js +87 -9
- package/dist/tools/tools.module.js +12 -2
- package/dist/ui/views.d.ts +2 -1
- package/dist/ui/views.js +17 -3
- package/package.json +3 -3
- package/src/migrations/0074_subagent_tree.sql +50 -0
- package/src/migrations/0075_plugin_scope.sql +61 -0
- package/src/migrations/0076_skills_created_by_nullable.sql +6 -0
- package/src/migrations/0077_scope_requests.sql +52 -0
- package/src/migrations/0078_scope_grant_switches.sql +18 -0
- package/src/migrations/0079_scope_live_install_switches.sql +19 -0
- package/src/migrations/0080_rename_enterprise_admin.sql +18 -0
- package/src/migrations/0081_platform_components.sql +129 -0
- package/src/migrations/0082_platform_migration.sql +33 -0
- package/src/migrations/0083_plugin_scope_sync_failures.sql +15 -0
- package/src/migrations/0084_org_owned_items.sql +85 -0
- package/src/migrations/0085_agent_templates_phase4.sql +45 -0
- package/src/migrations/0086_org_layering.sql +30 -0
- package/src/migrations/0087_approval_summary.sql +6 -0
- package/src/migrations/0088_environments.sql +80 -0
- package/src/migrations/0089_model_kinds_usage.sql +38 -0
- package/dist/catalog/upgrade-targets.d.ts +0 -56
- package/dist/catalog/upgrade-targets.js +0 -90
- package/dist/conversations/sandbox-status.d.ts +0 -24
- package/dist/conversations/sandbox-status.js +0 -52
- package/dist/extensions/org-config.controller.d.ts +0 -32
- package/dist/extensions/org-config.controller.js +0 -70
|
@@ -6,34 +6,8 @@ import { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
|
6
6
|
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
7
7
|
import { LockService } from "../infra/lock/lock.service.js";
|
|
8
8
|
import type { KernelLogger } from "../log.js";
|
|
9
|
-
|
|
10
|
-
export
|
|
11
|
-
/** One job per `usage` event (no `:`: conversation ids are UUIDs, seq is a number). */
|
|
12
|
-
export declare const usageReportJobId: (conversationId: string, seq: number) => string;
|
|
13
|
-
/** Job data: ids only (the payload is read from the event log when the job runs). */
|
|
14
|
-
export interface UsageReportJob {
|
|
15
|
-
conversationId: string;
|
|
16
|
-
seq: number;
|
|
17
|
-
/** Plugins not yet succeeded; absent = every subscriber (decided on the first attempt). */
|
|
18
|
-
pending?: string[];
|
|
19
|
-
/**
|
|
20
|
-
* Targets dropped so far (plugin → why), accumulated across attempts (m-2): when the job would
|
|
21
|
-
* otherwise complete it fails naming them, and `pending` is then exactly these plugins, so a
|
|
22
|
-
* manual retry reaches only them (m-1). A later delivery to one of them removes it.
|
|
23
|
-
*/
|
|
24
|
-
dropped?: Record<string, string>;
|
|
25
|
-
}
|
|
26
|
-
/** First attempt plus 5 retries (F11). */
|
|
27
|
-
export declare const USAGE_REPORT_ATTEMPTS = 6;
|
|
28
|
-
/** Retry backoff: 2 s, doubling (2, 4, 8, 16, 32 s). */
|
|
29
|
-
export declare const USAGE_REPORT_BACKOFF_MS = 2000;
|
|
30
|
-
/** The delivery retry policy of {@link UsageReporter}: attempts and the first exponential backoff. */
|
|
31
|
-
export interface UsageReportRetry {
|
|
32
|
-
attempts: number;
|
|
33
|
-
backoffMs: number;
|
|
34
|
-
}
|
|
35
|
-
/** Optional provider: the {@link UsageReportRetry} instead of the defaults above (tests). */
|
|
36
|
-
export declare const USAGE_REPORT_RETRY: unique symbol;
|
|
9
|
+
import { type UsageReportJob, type UsageReportRetry } from "./usage-report-jobs.js";
|
|
10
|
+
export { ModelUsageJobs, modelUsageJobId, queryUsageSubscribers, USAGE_REPORT_ATTEMPTS, USAGE_REPORT_BACKOFF_MS, USAGE_REPORT_QUEUE, USAGE_REPORT_RETRY, type UsageReportJob, UsageReportJobsModule, type UsageReportRetry, usageReportJobId, } from "./usage-report-jobs.js";
|
|
37
11
|
/** The sweeper's cron job name (no `:`; every minute, once across replicas). */
|
|
38
12
|
export declare const USAGE_SWEEP_JOB = "usage-report-sweep";
|
|
39
13
|
/** The maintenance scheduler the sweep ran on before it became a `@LockedCron` (retired). */
|
|
@@ -46,13 +20,6 @@ export declare const USAGE_SWEEP_LAG_MS = 30000;
|
|
|
46
20
|
* (`hooks.usageReportKeepHours` ≥ 1 h), so re-enqueued events dedupe on the kept job.
|
|
47
21
|
*/
|
|
48
22
|
export declare const USAGE_SWEEP_OVERLAP_MS: number;
|
|
49
|
-
/**
|
|
50
|
-
* Plugins that subscribe to `usage.report` according to deployment state: an approved permission
|
|
51
|
-
* snapshot that declares the `usage.report` hook, for a plugin the deployment still knows: an enabled
|
|
52
|
-
* install, or a config-declared plugin with a replica status row that is not `unloaded`. With `orgId`, only plugins
|
|
53
|
-
* the organization enabled (org config rows and required bootstrap plugins).
|
|
54
|
-
*/
|
|
55
|
-
export declare function queryUsageSubscribers(db: KernelSchemaDb, orgId?: string): Promise<Set<string>>;
|
|
56
23
|
/**
|
|
57
24
|
* Of `plugins`, those that are **definitely** unservable right now (I-2, N-3): live replicas report
|
|
58
25
|
* them (a `extension_replica_status` row with a heartbeat newer than `staleSeconds`), no live row is
|
|
@@ -91,11 +58,18 @@ export declare function narrowPending(stored: readonly string[] | undefined, fai
|
|
|
91
58
|
* most 100 000. Each call runs through the instance's `inflight.run`, limited by `hooks.timeoutMs`;
|
|
92
59
|
* when this replica stops, in-flight calls are aborted and the job goes back to the queue without
|
|
93
60
|
* using up an attempt.
|
|
94
|
-
* Handlers must be idempotent by `eventId` (`<conversationId>/<seq
|
|
95
|
-
* log (never model-visible). Compaction calls log usage too (`purpose: "compaction"`) and are reported,
|
|
61
|
+
* Handlers must be idempotent by `eventId` (`<conversationId>/<seq>`, or a `model_usage` row id).
|
|
62
|
+
* Nothing is written to the event log (never model-visible). Compaction calls log usage too (`purpose: "compaction"`) and are reported,
|
|
96
63
|
* as are conversation title calls (`purpose: "title"`, no run: `runId` is "") and `WebFetch`
|
|
97
64
|
* extraction calls (`purpose: "web_fetch"`).
|
|
98
65
|
* Single-step eval replays and judge requests log no usage: not reported (M7).
|
|
66
|
+
* - **Model usage outside conversations** (spec B §5.4): each `ctx.models.embed` call writes a
|
|
67
|
+
* `model_usage` row; on its `model_usage.recorded` event `ModelUsageJobs` (`usage-report-jobs.ts`)
|
|
68
|
+
* enqueues job `usage-model-<rowId>` (only while some plugin subscribes); the payload
|
|
69
|
+
* (`purpose: "embedding"`, `eventId` = the row id, the calling `extension`, no conversation fields)
|
|
70
|
+
* is read from the row when the job runs, and the row's `reported_at` is set once nothing is left
|
|
71
|
+
* to deliver; a job that gives up after its last attempt sets `report_failed_at`. The sweep
|
|
72
|
+
* re-enqueues recent rows that are neither (see {@link sweep}).
|
|
99
73
|
*/
|
|
100
74
|
export declare class UsageReporter {
|
|
101
75
|
private readonly kdb;
|
|
@@ -151,11 +125,21 @@ export declare class UsageReporter {
|
|
|
151
125
|
/**
|
|
152
126
|
* One sweep (R13): re-enqueues the `usage` events created in `[watermark - overlap, now - lag]` in
|
|
153
127
|
* pages, then advances the watermark to `now - lag`. With no subscriber it only advances. The first
|
|
154
|
-
* sweep starts at `now - lag - overlap`.
|
|
128
|
+
* sweep starts at `now - lag - overlap`. Also re-enqueues the `model_usage` rows of the same
|
|
129
|
+
* window that are neither reported nor given up (spec B §5.4),
|
|
130
|
+
* or, with no subscriber, marks those rows reported (nobody to deliver to). Returns the number of
|
|
131
|
+
* events and rows offered to the queue.
|
|
155
132
|
*/
|
|
156
133
|
sweep(opts?: {
|
|
157
134
|
now?: number;
|
|
158
135
|
}): Promise<number>;
|
|
136
|
+
/**
|
|
137
|
+
* The `model_usage` half of {@link sweep}: rows neither reported nor given up that occurred in
|
|
138
|
+
* the same window as the events (`[watermark - overlap, to]`), oldest first. Bounded like the
|
|
139
|
+
* event sweep, so a row whose job failed for good is never offered again, even after its failed
|
|
140
|
+
* job left Redis (no repeated backlog, no second delivery to plugins already served).
|
|
141
|
+
*/
|
|
142
|
+
private sweepModelUsage;
|
|
159
143
|
/**
|
|
160
144
|
* Starts consuming (worker role only): `worker` is the `@Processor` worker of
|
|
161
145
|
* {@link USAGE_REPORT_QUEUE} (built with the run queue's job lock and stalled detection).
|
|
@@ -170,6 +154,17 @@ export declare class UsageReporter {
|
|
|
170
154
|
* closes. The queue itself closes with the application.
|
|
171
155
|
*/
|
|
172
156
|
stop(): Promise<void>;
|
|
157
|
+
/** The payload of a job: a `usage` event's or a `model_usage` row's; null when it is gone. */
|
|
158
|
+
private payloadOfJob;
|
|
159
|
+
/**
|
|
160
|
+
* The payload of one `model_usage` row (spec B §5.4): purpose `embedding`, the calling extension,
|
|
161
|
+
* no conversation fields; `eventId` is the row id. Null when the row no longer exists.
|
|
162
|
+
*/
|
|
163
|
+
private payloadOfUsage;
|
|
164
|
+
/** A `model_usage` job is done (delivered, or nothing left to deliver to): marks the row. */
|
|
165
|
+
private markReported;
|
|
166
|
+
/** A `model_usage` job gave up after its last attempt: the sweep never offers the row again. */
|
|
167
|
+
private markFailed;
|
|
173
168
|
/** The payload of one usage event, read from the log; null when the event no longer exists. */
|
|
174
169
|
private payloadOf;
|
|
175
170
|
/**
|
|
@@ -9,40 +9,22 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
9
9
|
};
|
|
10
10
|
import { getQueueToken } from "@nestjs/bullmq";
|
|
11
11
|
import { Inject, Injectable, Module, Optional } from "@nestjs/common";
|
|
12
|
-
import { DelayedError, Job, UnrecoverableError
|
|
12
|
+
import { DelayedError, Job, UnrecoverableError } from "bullmq";
|
|
13
13
|
import { sql } from "kysely";
|
|
14
|
-
import { enabledExtensionsQuery } from "../extensions/enabled.js";
|
|
15
14
|
import { ExtensionsModule } from "../extensions/extensions.module.js";
|
|
16
|
-
import { deepFreeze, errMsg } from "../extensions/hooks.js";
|
|
15
|
+
import { deepFreeze, errMsg, HookNeedsConfigError, } from "../extensions/hooks.js";
|
|
17
16
|
import { ExtensionHost } from "../extensions/host.js";
|
|
18
17
|
import { STALE_RECONCILE_PERIODS } from "../extensions/lifecycle-topics.js";
|
|
19
18
|
import { KernelConfigService } from "../infra/config/kernel-config.service.js";
|
|
20
19
|
import { KernelDb } from "../infra/database/kernel-db.js";
|
|
21
20
|
import { LockService } from "../infra/lock/lock.service.js";
|
|
22
|
-
import { QueueModule } from "../infra/queue/queue.module.js";
|
|
23
21
|
import { LockedCron } from "../infra/schedule/locked-cron.decorator.js";
|
|
24
22
|
import { KERNEL_LOGGER } from "../infra/tokens.js";
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
export const usageReportJobId = (conversationId, seq) => `usage-${conversationId}-${seq}`;
|
|
29
|
-
/** First attempt plus 5 retries (F11). */
|
|
30
|
-
export const USAGE_REPORT_ATTEMPTS = 6;
|
|
31
|
-
/** Retry backoff: 2 s, doubling (2, 4, 8, 16, 32 s). */
|
|
32
|
-
export const USAGE_REPORT_BACKOFF_MS = 2000;
|
|
33
|
-
/** Optional provider: the {@link UsageReportRetry} instead of the defaults above (tests). */
|
|
34
|
-
export const USAGE_REPORT_RETRY = Symbol("USAGE_REPORT_RETRY");
|
|
35
|
-
/** Failed jobs (given up) are kept for inspection, at most {@link KEEP_FAILED_MAX} of them. */
|
|
36
|
-
const KEEP_FAILED_S = 7 * 86_400;
|
|
37
|
-
/** Upper bound on kept failed jobs (I-2): a long outage of a billing endpoint cannot grow Redis. */
|
|
38
|
-
const KEEP_FAILED_MAX = 100_000;
|
|
23
|
+
import { deliveryRowOfChildRun } from "./subagents/child.js";
|
|
24
|
+
import { modelUsageJobId, queryUsageSubscribers, USAGE_REPORT_ATTEMPTS, USAGE_REPORT_BACKOFF_MS, USAGE_REPORT_JOB, USAGE_REPORT_QUEUE, USAGE_REPORT_RETRY, UsageReportJobsModule, usageReportJobId, usageReportJobOpts, } from "./usage-report-jobs.js";
|
|
25
|
+
export { ModelUsageJobs, modelUsageJobId, queryUsageSubscribers, USAGE_REPORT_ATTEMPTS, USAGE_REPORT_BACKOFF_MS, USAGE_REPORT_QUEUE, USAGE_REPORT_RETRY, UsageReportJobsModule, usageReportJobId, } from "./usage-report-jobs.js";
|
|
39
26
|
/** Warnings about a plugin that cannot take deliveries are logged at most once per this window. */
|
|
40
27
|
const WARN_WINDOW_MS = 60_000;
|
|
41
|
-
/**
|
|
42
|
-
* Upper bound on kept finished jobs (Redis memory). At the default retention it only bites above
|
|
43
|
-
* ~1.1 usage events per second sustained for a day; dedupe needs the jobs only for the sweeper overlap.
|
|
44
|
-
*/
|
|
45
|
-
const KEEP_COMPLETED_MAX = 100_000;
|
|
46
28
|
/** The sweeper's cron job name (no `:`; every minute, once across replicas). */
|
|
47
29
|
export const USAGE_SWEEP_JOB = "usage-report-sweep";
|
|
48
30
|
/** The maintenance scheduler the sweep ran on before it became a `@LockedCron` (retired). */
|
|
@@ -56,38 +38,6 @@ export const USAGE_SWEEP_LAG_MS = 30_000;
|
|
|
56
38
|
*/
|
|
57
39
|
export const USAGE_SWEEP_OVERLAP_MS = 10 * 60_000;
|
|
58
40
|
const SWEEP_PAGE = 500;
|
|
59
|
-
const JOB = "usage-report";
|
|
60
|
-
/**
|
|
61
|
-
* Plugins that subscribe to `usage.report` according to deployment state: an approved permission
|
|
62
|
-
* snapshot that declares the `usage.report` hook, for a plugin the deployment still knows: an enabled
|
|
63
|
-
* install, or a config-declared plugin with a replica status row that is not `unloaded`. With `orgId`, only plugins
|
|
64
|
-
* the organization enabled (org config rows and required bootstrap plugins).
|
|
65
|
-
*/
|
|
66
|
-
export async function queryUsageSubscribers(db, orgId) {
|
|
67
|
-
let q = db
|
|
68
|
-
.selectFrom("extension_permission_snapshots as s")
|
|
69
|
-
.select("s.plugin")
|
|
70
|
-
.where(sql `s.permissions -> 'permissions' -> 'hooks' ? 'usage.report'`)
|
|
71
|
-
.where((eb) => eb.or([
|
|
72
|
-
eb.exists(eb
|
|
73
|
-
.selectFrom("extension_installs as i")
|
|
74
|
-
.select(sql `1`.as("one"))
|
|
75
|
-
.whereRef("i.name", "=", "s.plugin")
|
|
76
|
-
.where("i.desired_state", "=", "enabled")),
|
|
77
|
-
// config-declared plugins still declared (and not unloaded) on some replica; installs are
|
|
78
|
-
// covered by desired_state above (their replica rows linger as `unloaded` when disabled)
|
|
79
|
-
eb.exists(eb
|
|
80
|
-
.selectFrom("extension_replica_status as r")
|
|
81
|
-
.select(sql `1`.as("one"))
|
|
82
|
-
.whereRef("r.plugin", "=", "s.plugin")
|
|
83
|
-
.where("r.source", "=", "config")
|
|
84
|
-
.where("r.state", "<>", "unloaded")),
|
|
85
|
-
]));
|
|
86
|
-
if (orgId !== undefined) {
|
|
87
|
-
q = q.where("s.plugin", "in", enabledExtensionsQuery(db, orgId));
|
|
88
|
-
}
|
|
89
|
-
return new Set((await q.execute()).map((r) => r.plugin));
|
|
90
|
-
}
|
|
91
41
|
/**
|
|
92
42
|
* Of `plugins`, those that are **definitely** unservable right now (I-2, N-3): live replicas report
|
|
93
43
|
* them (a `extension_replica_status` row with a heartbeat newer than `staleSeconds`), no live row is
|
|
@@ -127,6 +77,10 @@ class Undeliverable extends Error {
|
|
|
127
77
|
this.name = "Undeliverable";
|
|
128
78
|
}
|
|
129
79
|
}
|
|
80
|
+
/** A job's identity: its `usage` event or its `model_usage` row. */
|
|
81
|
+
const keyOf = (d) => d.usageId !== undefined
|
|
82
|
+
? { usageId: d.usageId }
|
|
83
|
+
: { conversationId: d.conversationId, seq: d.seq };
|
|
130
84
|
/**
|
|
131
85
|
* The next `pending` set (m-2 fence): plugins that failed now, narrowed to what the stored job data
|
|
132
86
|
* still lists. A plugin another (stalled-over) execution already delivered never comes back.
|
|
@@ -158,11 +112,18 @@ export function narrowPending(stored, failed) {
|
|
|
158
112
|
* most 100 000. Each call runs through the instance's `inflight.run`, limited by `hooks.timeoutMs`;
|
|
159
113
|
* when this replica stops, in-flight calls are aborted and the job goes back to the queue without
|
|
160
114
|
* using up an attempt.
|
|
161
|
-
* Handlers must be idempotent by `eventId` (`<conversationId>/<seq
|
|
162
|
-
* log (never model-visible). Compaction calls log usage too (`purpose: "compaction"`) and are reported,
|
|
115
|
+
* Handlers must be idempotent by `eventId` (`<conversationId>/<seq>`, or a `model_usage` row id).
|
|
116
|
+
* Nothing is written to the event log (never model-visible). Compaction calls log usage too (`purpose: "compaction"`) and are reported,
|
|
163
117
|
* as are conversation title calls (`purpose: "title"`, no run: `runId` is "") and `WebFetch`
|
|
164
118
|
* extraction calls (`purpose: "web_fetch"`).
|
|
165
119
|
* Single-step eval replays and judge requests log no usage: not reported (M7).
|
|
120
|
+
* - **Model usage outside conversations** (spec B §5.4): each `ctx.models.embed` call writes a
|
|
121
|
+
* `model_usage` row; on its `model_usage.recorded` event `ModelUsageJobs` (`usage-report-jobs.ts`)
|
|
122
|
+
* enqueues job `usage-model-<rowId>` (only while some plugin subscribes); the payload
|
|
123
|
+
* (`purpose: "embedding"`, `eventId` = the row id, the calling `extension`, no conversation fields)
|
|
124
|
+
* is read from the row when the job runs, and the row's `reported_at` is set once nothing is left
|
|
125
|
+
* to deliver; a job that gives up after its last attempt sets `report_failed_at`. The sweep
|
|
126
|
+
* re-enqueues recent rows that are neither (see {@link sweep}).
|
|
166
127
|
*/
|
|
167
128
|
let UsageReporter = class UsageReporter {
|
|
168
129
|
kdb;
|
|
@@ -225,17 +186,8 @@ let UsageReporter = class UsageReporter {
|
|
|
225
186
|
subscribers(orgId) {
|
|
226
187
|
return queryUsageSubscribers(this.db, orgId);
|
|
227
188
|
}
|
|
228
|
-
jobOpts(
|
|
229
|
-
return
|
|
230
|
-
jobId: usageReportJobId(conversationId, seq),
|
|
231
|
-
attempts: this.retry.attempts,
|
|
232
|
-
backoff: { type: "exponential", delay: this.retry.backoffMs },
|
|
233
|
-
removeOnComplete: {
|
|
234
|
-
age: this.config.get().hooks.usageReportKeepHours * 3600,
|
|
235
|
-
count: KEEP_COMPLETED_MAX,
|
|
236
|
-
},
|
|
237
|
-
removeOnFail: { age: KEEP_FAILED_S, count: KEEP_FAILED_MAX },
|
|
238
|
-
};
|
|
189
|
+
jobOpts(jobId) {
|
|
190
|
+
return usageReportJobOpts(jobId, this.retry, this.config.get().hooks.usageReportKeepHours);
|
|
239
191
|
}
|
|
240
192
|
/**
|
|
241
193
|
* Enqueues the delivery of one `usage` event. Returns without a job when no plugin subscribes.
|
|
@@ -251,7 +203,7 @@ let UsageReporter = class UsageReporter {
|
|
|
251
203
|
try {
|
|
252
204
|
if ((await this.subscribers()).size === 0)
|
|
253
205
|
return;
|
|
254
|
-
await this.queue.add(
|
|
206
|
+
await this.queue.add(USAGE_REPORT_JOB, { conversationId, seq }, this.jobOpts(usageReportJobId(conversationId, seq)));
|
|
255
207
|
}
|
|
256
208
|
catch (err) {
|
|
257
209
|
this.log.warn("cannot enqueue usage report", { conversationId, seq, err });
|
|
@@ -260,7 +212,10 @@ let UsageReporter = class UsageReporter {
|
|
|
260
212
|
/**
|
|
261
213
|
* One sweep (R13): re-enqueues the `usage` events created in `[watermark - overlap, now - lag]` in
|
|
262
214
|
* pages, then advances the watermark to `now - lag`. With no subscriber it only advances. The first
|
|
263
|
-
* sweep starts at `now - lag - overlap`.
|
|
215
|
+
* sweep starts at `now - lag - overlap`. Also re-enqueues the `model_usage` rows of the same
|
|
216
|
+
* window that are neither reported nor given up (spec B §5.4),
|
|
217
|
+
* or, with no subscriber, marks those rows reported (nobody to deliver to). Returns the number of
|
|
218
|
+
* events and rows offered to the queue.
|
|
264
219
|
*/
|
|
265
220
|
async sweep(opts = {}) {
|
|
266
221
|
// bounds and keyset as full-precision timestamp text (microseconds), computed with the DB clock
|
|
@@ -277,7 +232,8 @@ let UsageReporter = class UsageReporter {
|
|
|
277
232
|
.executeTakeFirst();
|
|
278
233
|
const watermark = row?.watermark ?? to;
|
|
279
234
|
let offered = 0;
|
|
280
|
-
|
|
235
|
+
const subscribed = (await this.subscribers()).size > 0;
|
|
236
|
+
if (subscribed) {
|
|
281
237
|
let after;
|
|
282
238
|
for (;;) {
|
|
283
239
|
let q = this.db
|
|
@@ -297,9 +253,9 @@ let UsageReporter = class UsageReporter {
|
|
|
297
253
|
.execute();
|
|
298
254
|
if (page.length > 0) {
|
|
299
255
|
await this.queue.addBulk(page.map((r) => ({
|
|
300
|
-
name:
|
|
256
|
+
name: USAGE_REPORT_JOB,
|
|
301
257
|
data: { conversationId: r.conversation_id, seq: Number(r.seq) },
|
|
302
|
-
opts: this.jobOpts(r.conversation_id, Number(r.seq)),
|
|
258
|
+
opts: this.jobOpts(usageReportJobId(r.conversation_id, Number(r.seq))),
|
|
303
259
|
})));
|
|
304
260
|
offered += page.length;
|
|
305
261
|
}
|
|
@@ -309,6 +265,7 @@ let UsageReporter = class UsageReporter {
|
|
|
309
265
|
after = { at: last.at, conv: last.conversation_id, seq: String(last.seq) };
|
|
310
266
|
}
|
|
311
267
|
}
|
|
268
|
+
offered += await this.sweepModelUsage(watermark, to, subscribed);
|
|
312
269
|
await this.db
|
|
313
270
|
.insertInto("usage_report_sweep")
|
|
314
271
|
.values({ id: 1, watermark: sql `${to}::timestamptz` })
|
|
@@ -319,6 +276,51 @@ let UsageReporter = class UsageReporter {
|
|
|
319
276
|
.execute();
|
|
320
277
|
return offered;
|
|
321
278
|
}
|
|
279
|
+
/**
|
|
280
|
+
* The `model_usage` half of {@link sweep}: rows neither reported nor given up that occurred in
|
|
281
|
+
* the same window as the events (`[watermark - overlap, to]`), oldest first. Bounded like the
|
|
282
|
+
* event sweep, so a row whose job failed for good is never offered again, even after its failed
|
|
283
|
+
* job left Redis (no repeated backlog, no second delivery to plugins already served).
|
|
284
|
+
*/
|
|
285
|
+
async sweepModelUsage(watermark, to, subscribed) {
|
|
286
|
+
if (!subscribed) {
|
|
287
|
+
await this.db
|
|
288
|
+
.updateTable("model_usage")
|
|
289
|
+
.set({ reported_at: sql `now()` })
|
|
290
|
+
.where("reported_at", "is", null)
|
|
291
|
+
.where(sql `occurred_at <= ${to}::timestamptz`)
|
|
292
|
+
.execute();
|
|
293
|
+
return 0;
|
|
294
|
+
}
|
|
295
|
+
let offered = 0;
|
|
296
|
+
let after;
|
|
297
|
+
for (;;) {
|
|
298
|
+
let q = this.db
|
|
299
|
+
.selectFrom("model_usage")
|
|
300
|
+
.select(["id", sql `occurred_at::text`.as("at")])
|
|
301
|
+
.where("reported_at", "is", null)
|
|
302
|
+
.where("report_failed_at", "is", null)
|
|
303
|
+
.where(sql `occurred_at >= ${watermark}::timestamptz - make_interval(secs => ${USAGE_SWEEP_OVERLAP_MS / 1000})`)
|
|
304
|
+
.where(sql `occurred_at <= ${to}::timestamptz`);
|
|
305
|
+
if (after) {
|
|
306
|
+
q = q.where(sql `(occurred_at, id) > (${after.at}::timestamptz, ${after.id}::uuid)`);
|
|
307
|
+
}
|
|
308
|
+
const page = await q.orderBy("occurred_at").orderBy("id").limit(SWEEP_PAGE).execute();
|
|
309
|
+
if (page.length > 0) {
|
|
310
|
+
await this.queue.addBulk(page.map((r) => ({
|
|
311
|
+
name: USAGE_REPORT_JOB,
|
|
312
|
+
data: { usageId: r.id },
|
|
313
|
+
opts: this.jobOpts(modelUsageJobId(r.id)),
|
|
314
|
+
})));
|
|
315
|
+
offered += page.length;
|
|
316
|
+
}
|
|
317
|
+
const last = page.at(-1);
|
|
318
|
+
if (!last || page.length < SWEEP_PAGE)
|
|
319
|
+
break;
|
|
320
|
+
after = { at: last.at, id: last.id };
|
|
321
|
+
}
|
|
322
|
+
return offered;
|
|
323
|
+
}
|
|
322
324
|
/**
|
|
323
325
|
* Starts consuming (worker role only): `worker` is the `@Processor` worker of
|
|
324
326
|
* {@link USAGE_REPORT_QUEUE} (built with the run queue's job lock and stalled detection).
|
|
@@ -343,14 +345,17 @@ let UsageReporter = class UsageReporter {
|
|
|
343
345
|
const final = j.attemptsMade >= (j.opts.attempts ?? 1);
|
|
344
346
|
const fields = {
|
|
345
347
|
jobId: j.id,
|
|
346
|
-
|
|
347
|
-
|
|
348
|
+
...(j.data.usageId !== undefined
|
|
349
|
+
? { usageId: j.data.usageId }
|
|
350
|
+
: { conversationId: j.data.conversationId, seq: j.data.seq }),
|
|
348
351
|
pending: j.data.pending,
|
|
349
352
|
attempt: j.attemptsMade,
|
|
350
353
|
error: err.message,
|
|
351
354
|
};
|
|
352
|
-
if (final)
|
|
355
|
+
if (final) {
|
|
353
356
|
this.log.error("usage report given up after retries", fields);
|
|
357
|
+
void this.markFailed(j.data);
|
|
358
|
+
}
|
|
354
359
|
else
|
|
355
360
|
this.log.warn("usage report attempt failed; retrying", fields);
|
|
356
361
|
}
|
|
@@ -365,14 +370,73 @@ let UsageReporter = class UsageReporter {
|
|
|
365
370
|
this.worker = undefined;
|
|
366
371
|
await w?.close().catch(() => { });
|
|
367
372
|
}
|
|
373
|
+
/** The payload of a job: a `usage` event's or a `model_usage` row's; null when it is gone. */
|
|
374
|
+
payloadOfJob(data) {
|
|
375
|
+
return data.usageId !== undefined
|
|
376
|
+
? this.payloadOfUsage(data.usageId)
|
|
377
|
+
: this.payloadOf(data.conversationId, data.seq);
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* The payload of one `model_usage` row (spec B §5.4): purpose `embedding`, the calling extension,
|
|
381
|
+
* no conversation fields; `eventId` is the row id. Null when the row no longer exists.
|
|
382
|
+
*/
|
|
383
|
+
async payloadOfUsage(id) {
|
|
384
|
+
const row = await this.db
|
|
385
|
+
.selectFrom("model_usage")
|
|
386
|
+
.select(["id", "org_id", "extension", "provider", "model", "input_tokens", "occurred_at"])
|
|
387
|
+
.where("id", "=", id)
|
|
388
|
+
.executeTakeFirst();
|
|
389
|
+
if (!row)
|
|
390
|
+
return null;
|
|
391
|
+
return {
|
|
392
|
+
eventId: row.id,
|
|
393
|
+
purpose: "embedding",
|
|
394
|
+
orgId: row.org_id,
|
|
395
|
+
extension: row.extension,
|
|
396
|
+
provider: row.provider,
|
|
397
|
+
model: row.model,
|
|
398
|
+
usage: {
|
|
399
|
+
inputTokens: row.input_tokens,
|
|
400
|
+
outputTokens: 0,
|
|
401
|
+
cacheReadTokens: 0,
|
|
402
|
+
cacheWriteTokens: 0,
|
|
403
|
+
},
|
|
404
|
+
occurredAt: new Date(row.occurred_at).toISOString(),
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
/** A `model_usage` job is done (delivered, or nothing left to deliver to): marks the row. */
|
|
408
|
+
async markReported(data) {
|
|
409
|
+
if (data.usageId === undefined)
|
|
410
|
+
return;
|
|
411
|
+
await this.db
|
|
412
|
+
.updateTable("model_usage")
|
|
413
|
+
.set({ reported_at: sql `now()` })
|
|
414
|
+
.where("id", "=", data.usageId)
|
|
415
|
+
.where("reported_at", "is", null)
|
|
416
|
+
.execute();
|
|
417
|
+
}
|
|
418
|
+
/** A `model_usage` job gave up after its last attempt: the sweep never offers the row again. */
|
|
419
|
+
async markFailed(data) {
|
|
420
|
+
if (data.usageId === undefined)
|
|
421
|
+
return;
|
|
422
|
+
try {
|
|
423
|
+
await this.db
|
|
424
|
+
.updateTable("model_usage")
|
|
425
|
+
.set({ report_failed_at: sql `now()` })
|
|
426
|
+
.where("id", "=", data.usageId)
|
|
427
|
+
.where("reported_at", "is", null)
|
|
428
|
+
.execute();
|
|
429
|
+
}
|
|
430
|
+
catch (err) {
|
|
431
|
+
this.log.warn("cannot mark a model usage report as given up", { usageId: data.usageId, err });
|
|
432
|
+
}
|
|
433
|
+
}
|
|
368
434
|
/** The payload of one usage event, read from the log; null when the event no longer exists. */
|
|
369
435
|
async payloadOf(conversationId, seq) {
|
|
370
436
|
const row = await this.db
|
|
371
437
|
.selectFrom("conversation_events as e")
|
|
372
438
|
.innerJoin("conversations as c", "c.id", "e.conversation_id")
|
|
373
439
|
.leftJoin("runs as r", "r.id", "e.run_id")
|
|
374
|
-
// a sub-agent's run: its dispatch says where it was dispatched from (spec §11)
|
|
375
|
-
.leftJoin("subagent_dispatches as sd", "sd.child_run_id", "e.run_id")
|
|
376
440
|
.select([
|
|
377
441
|
"e.payload",
|
|
378
442
|
"e.run_id",
|
|
@@ -383,9 +447,6 @@ let UsageReporter = class UsageReporter {
|
|
|
383
447
|
"c.account_id",
|
|
384
448
|
"c.kind",
|
|
385
449
|
"r.trigger_account_id",
|
|
386
|
-
"sd.parent_conversation_id",
|
|
387
|
-
"sd.parent_run_id",
|
|
388
|
-
"sd.parent_call_id",
|
|
389
450
|
])
|
|
390
451
|
.where("e.conversation_id", "=", conversationId)
|
|
391
452
|
.where("e.seq", "=", String(seq))
|
|
@@ -393,6 +454,11 @@ let UsageReporter = class UsageReporter {
|
|
|
393
454
|
if (row?.type !== "usage")
|
|
394
455
|
return null;
|
|
395
456
|
const p = row.payload;
|
|
457
|
+
// a sub-agent's run: where it was dispatched from (spec §11), its own dispatch, else (a wake
|
|
458
|
+
// run nobody dispatched, agent map spec §5.3) its conversation's latest one
|
|
459
|
+
const parent = row.kind === "subagent" && row.run_id !== null
|
|
460
|
+
? await deliveryRowOfChildRun(this.db, row.run_id)
|
|
461
|
+
: null;
|
|
396
462
|
return {
|
|
397
463
|
eventId: `${conversationId}/${seq}`,
|
|
398
464
|
purpose: p.purpose ?? "step",
|
|
@@ -403,13 +469,11 @@ let UsageReporter = class UsageReporter {
|
|
|
403
469
|
// a sub-agent's calls report "chat" (spec §11: the SDK union is not widened)
|
|
404
470
|
conversationKind: row.kind === "eval" ? "eval" : "chat",
|
|
405
471
|
runId: row.run_id ?? "",
|
|
406
|
-
...(
|
|
407
|
-
row.parent_run_id !== null &&
|
|
408
|
-
row.parent_call_id !== null && {
|
|
472
|
+
...(parent !== null && {
|
|
409
473
|
parent: {
|
|
410
|
-
conversationId:
|
|
411
|
-
runId:
|
|
412
|
-
callId:
|
|
474
|
+
conversationId: parent.parentConversationId,
|
|
475
|
+
runId: parent.parentRunId,
|
|
476
|
+
callId: parent.parentCallId,
|
|
413
477
|
},
|
|
414
478
|
}),
|
|
415
479
|
provider: p.provider,
|
|
@@ -436,8 +500,7 @@ let UsageReporter = class UsageReporter {
|
|
|
436
500
|
const allowed = stored === undefined ? undefined : [...stored, ...Object.keys(storedDropped)];
|
|
437
501
|
const keep = [...dropped].filter(([p]) => allowed === undefined || allowed.includes(p));
|
|
438
502
|
const out = {
|
|
439
|
-
|
|
440
|
-
seq: j.data.seq,
|
|
503
|
+
...keyOf(j.data),
|
|
441
504
|
pending: narrowPending(allowed, next),
|
|
442
505
|
...(keep.length > 0 && { dropped: Object.fromEntries(keep) }),
|
|
443
506
|
};
|
|
@@ -446,22 +509,24 @@ let UsageReporter = class UsageReporter {
|
|
|
446
509
|
}
|
|
447
510
|
/** One delivery job (the `@Processor` of {@link USAGE_REPORT_QUEUE} calls it). */
|
|
448
511
|
async process(j, token) {
|
|
449
|
-
const
|
|
450
|
-
|
|
512
|
+
const payload = await this.payloadOfJob(j.data);
|
|
513
|
+
// conversation (or org) deleted meanwhile: nothing to report
|
|
451
514
|
if (payload === null)
|
|
452
|
-
return;
|
|
515
|
+
return;
|
|
453
516
|
const subscribers = await this.subscribers(payload.orgId);
|
|
454
517
|
if (j.data.pending === undefined) {
|
|
455
518
|
// first attempt: the targets come from deployment state, recorded so later attempts (on any
|
|
456
519
|
// replica) deliver exactly the plugins that have not succeeded yet
|
|
457
520
|
const targets = [...subscribers];
|
|
458
|
-
await j.updateData({
|
|
521
|
+
await j.updateData({ ...keyOf(j.data), pending: targets });
|
|
459
522
|
j.data.pending = targets;
|
|
460
523
|
}
|
|
461
524
|
// plugins the organization disabled meanwhile are dropped (not a failure)
|
|
462
525
|
const targets = (j.data.pending ?? []).filter((p) => subscribers.has(p));
|
|
463
|
-
if (targets.length === 0)
|
|
526
|
+
if (targets.length === 0) {
|
|
527
|
+
await this.markReported(j.data);
|
|
464
528
|
return;
|
|
529
|
+
}
|
|
465
530
|
const byPlugin = new Map();
|
|
466
531
|
for (const h of this.hooks.handlers("usage.report")) {
|
|
467
532
|
byPlugin.set(h.plugin, [...(byPlugin.get(h.plugin) ?? []), h.handler]);
|
|
@@ -493,6 +558,12 @@ let UsageReporter = class UsageReporter {
|
|
|
493
558
|
notHere.push(plugin);
|
|
494
559
|
return;
|
|
495
560
|
}
|
|
561
|
+
// layering spec A §6: the extension's effective config is not valid in this organization, so
|
|
562
|
+
// it is not called there (an observe hook skipped); dropped, not retried
|
|
563
|
+
if (r.reason instanceof HookNeedsConfigError) {
|
|
564
|
+
dropped.set(plugin, "needs configuration in this organization");
|
|
565
|
+
return;
|
|
566
|
+
}
|
|
496
567
|
failed.push(plugin);
|
|
497
568
|
if (!this.stopping.signal.aborted) {
|
|
498
569
|
this.log.warn("usage.report delivery to a plugin failed", {
|
|
@@ -534,6 +605,8 @@ let UsageReporter = class UsageReporter {
|
|
|
534
605
|
// m-1: pending = the dropped plugins only, so a manual retry reaches them and never the
|
|
535
606
|
// plugins already served
|
|
536
607
|
await this.writePending(j, [...allDropped.keys()], allDropped);
|
|
608
|
+
// delivered to every target still servable (a definite drop is final too): the row is done
|
|
609
|
+
await this.markReported(j.data);
|
|
537
610
|
const traced = new Map([...allDropped].filter(([p]) => j.data.dropped?.[p] !== undefined));
|
|
538
611
|
if (traced.size === 0)
|
|
539
612
|
return;
|
|
@@ -644,9 +717,9 @@ let UsageReportModule = class UsageReportModule {
|
|
|
644
717
|
};
|
|
645
718
|
UsageReportModule = __decorate([
|
|
646
719
|
Module({
|
|
647
|
-
imports: [ExtensionsModule,
|
|
720
|
+
imports: [ExtensionsModule, UsageReportJobsModule],
|
|
648
721
|
providers: [UsageReporter],
|
|
649
|
-
exports: [UsageReporter],
|
|
722
|
+
exports: [UsageReporter, UsageReportJobsModule],
|
|
650
723
|
})
|
|
651
724
|
], UsageReportModule);
|
|
652
725
|
export { UsageReportModule };
|