@vellumai/assistant 0.8.0 → 0.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +11 -0
- package/ARCHITECTURE.md +2 -7
- package/Dockerfile +80 -5
- package/README.md +2 -2
- package/bun.lock +11 -1
- package/docker-entrypoint.sh +21 -0
- package/docker-init-apt-root.sh +94 -0
- package/docker-kata-apt-env.sh +39 -0
- package/docs/plugins.md +88 -47
- package/docs/skills.md +9 -7
- package/eslint-rules/__tests__/cli-no-daemon-internals.test.ts +420 -0
- package/eslint-rules/cli-no-daemon-internals.js +283 -0
- package/eslint.config.mjs +12 -0
- package/examples/plugins/echo/README.md +27 -27
- package/examples/plugins/echo/package.json +3 -0
- package/examples/plugins/echo/register.ts +31 -31
- package/knip.json +2 -1
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +10 -1
- package/node_modules/@vellumai/slack-text/src/index.test.ts +114 -14
- package/node_modules/@vellumai/slack-text/src/index.ts +82 -18
- package/openapi.yaml +4462 -991
- package/package.json +5 -1
- package/scripts/generate-openapi.ts +135 -14
- package/scripts/sync-llm-catalog.ts +165 -0
- package/scripts/sync-web-search-catalog.ts +129 -0
- package/src/__tests__/actor-trust-resolver-address-fallback.test.ts +169 -0
- package/src/__tests__/agent-image-optimize.test.ts +11 -3
- package/src/__tests__/agent-loop-override-profile.test.ts +26 -1
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +131 -0
- package/src/__tests__/anthropic-provider.test.ts +137 -2
- package/src/__tests__/app-builder-tool-scripts.test.ts +9 -3
- package/src/__tests__/app-control-flow.test.ts +7 -0
- package/src/__tests__/app-executors.test.ts +220 -4
- package/src/__tests__/assistant-events-sse-shed.test.ts +232 -0
- package/src/__tests__/auto-analysis-end-to-end.test.ts +35 -0
- package/src/__tests__/avatar-identity-sync.test.ts +87 -0
- package/src/__tests__/background-workers-disk-pressure.test.ts +11 -22
- package/src/__tests__/btw-routes.test.ts +1 -0
- package/src/__tests__/bundled-asset.test.ts +6 -6
- package/src/__tests__/call-site-routing-provider.test.ts +172 -45
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +44 -3
- package/src/__tests__/channel-availability-routes.test.ts +206 -0
- package/src/__tests__/channel-delivery-store.test.ts +289 -1
- package/src/__tests__/channel-policy.test.ts +12 -0
- package/src/__tests__/checker.test.ts +89 -0
- package/src/__tests__/circuit-breaker-pipeline.test.ts +0 -1
- package/src/__tests__/clawhub.test.ts +75 -16
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +35 -7
- package/src/__tests__/compact-event-conversation-id-guard.test.ts +33 -5
- package/src/__tests__/compaction-strip-metadata-clear.test.ts +26 -1
- package/src/__tests__/compactor-tail-resolution.test.ts +41 -0
- package/src/__tests__/config-loader-backfill.test.ts +526 -102
- package/src/__tests__/config-loader-corrupt.test.ts +68 -0
- package/src/__tests__/config-loader-platform-defaults.test.ts +77 -23
- package/src/__tests__/config-schema-cmd.test.ts +63 -29
- package/src/__tests__/config-schema.test.ts +35 -3
- package/src/__tests__/config-set-platform-guard.test.ts +75 -152
- package/src/__tests__/config-set-route.test.ts +278 -0
- package/src/__tests__/config-sounds-sync.test.ts +97 -0
- package/src/__tests__/config-watcher-skill-reseed.test.ts +453 -0
- package/src/__tests__/config-watcher.test.ts +6 -0
- package/src/__tests__/contacts-tools.test.ts +51 -199
- package/src/__tests__/context-search-agent-protocol.test.ts +21 -2
- package/src/__tests__/context-search-agent-runner.test.ts +22 -138
- package/src/__tests__/context-search-conversations-source.test.ts +159 -18
- package/src/__tests__/context-search-fanout.test.ts +20 -157
- package/src/__tests__/context-search-memory-v2-source.test.ts +3 -4
- package/src/__tests__/context-search-types.test.ts +7 -2
- package/src/__tests__/context-search-workspace-source.test.ts +7 -0
- package/src/__tests__/context-token-estimator.test.ts +1 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +4 -1
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +1 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +93 -92
- package/src/__tests__/conversation-agent-loop.test.ts +2 -0
- package/src/__tests__/conversation-crud-inference-profile.test.ts +100 -0
- package/src/__tests__/conversation-error.test.ts +80 -3
- package/src/__tests__/conversation-fork-crud.test.ts +323 -1
- package/src/__tests__/conversation-inference-profile-route.test.ts +54 -18
- package/src/__tests__/conversation-init.benchmark.test.ts +1 -0
- package/src/__tests__/conversation-lifecycle.test.ts +297 -0
- package/src/__tests__/conversation-message-sync-tags.test.ts +97 -0
- package/src/__tests__/conversation-pairing.test.ts +54 -0
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +100 -1
- package/src/__tests__/conversation-process-callsite.test.ts +25 -2
- package/src/__tests__/conversation-provider-retry-repair.test.ts +5 -1
- package/src/__tests__/conversation-queue.test.ts +4 -1
- package/src/__tests__/conversation-runtime-assembly.test.ts +80 -13
- package/src/__tests__/conversation-slash-commands.test.ts +194 -2
- package/src/__tests__/conversation-slash-queue.test.ts +59 -1
- package/src/__tests__/conversation-slash-unknown.test.ts +4 -1
- package/src/__tests__/conversation-surfaces-app-control.test.ts +323 -3
- package/src/__tests__/conversation-surfaces-table-action.test.ts +360 -0
- package/src/__tests__/conversation-sync-tags.test.ts +235 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +5 -1
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +5 -1
- package/src/__tests__/credential-security-invariants.test.ts +8 -8
- package/src/__tests__/daemon-credential-client.test.ts +56 -1
- package/src/__tests__/db-activation-state-fk-cascade.test.ts +132 -0
- package/src/__tests__/db-conversation-inference-profile-migration.test.ts +37 -0
- package/src/__tests__/db-memory-graph-event-date-repair.test.ts +43 -20
- package/src/__tests__/db-proxy-transaction.test.ts +206 -0
- package/src/__tests__/db-slack-external-content-normalization.test.ts +301 -0
- package/src/__tests__/delete-managed-skill-tool.test.ts +55 -13
- package/src/__tests__/disk-pressure-tools.test.ts +1 -0
- package/src/__tests__/dm-backfill.test.ts +121 -10
- package/src/__tests__/document-tool-security.test.ts +258 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
- package/src/__tests__/edit-propagation.test.ts +33 -0
- package/src/__tests__/empty-response-pipeline.test.ts +0 -4
- package/src/__tests__/external-plugin-loader.test.ts +482 -0
- package/src/__tests__/filing-service.test.ts +163 -3
- package/src/__tests__/fixtures/mock-chrome-extension.ts +5 -0
- package/src/__tests__/gateway-only-guard.test.ts +0 -1
- package/src/__tests__/get-skill-detail-audit.test.ts +0 -4
- package/src/__tests__/graph-extraction-event-date.test.ts +34 -0
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +42 -69
- package/src/__tests__/heartbeat-disk-pressure.test.ts +21 -8
- package/src/__tests__/heartbeat-service.test.ts +50 -233
- package/src/__tests__/helpers/tar-fixtures.ts +39 -0
- package/src/__tests__/helpers/wait-for.ts +21 -0
- package/src/__tests__/history-repair-pipeline.test.ts +0 -3
- package/src/__tests__/history-repair.test.ts +162 -0
- package/src/__tests__/host-app-control-proxy.test.ts +365 -1
- package/src/__tests__/host-app-control-routes.test.ts +247 -1
- package/src/__tests__/host-browser-proxy.test.ts +416 -20
- package/src/__tests__/host-browser-routes.test.ts +325 -33
- package/src/__tests__/host-proxy-preactivation.test.ts +211 -0
- package/src/__tests__/image-credentials.test.ts +1 -1
- package/src/__tests__/inbound-slack-persistence.test.ts +2 -0
- package/src/__tests__/inference-no-mode-boot-e2e.test.ts +246 -0
- package/src/__tests__/inference-profile-reaper.test.ts +156 -0
- package/src/__tests__/inference-profile-session-handler.test.ts +410 -0
- package/src/__tests__/inference-profile-session-ipc.test.ts +248 -0
- package/src/__tests__/injector-chain.test.ts +10 -8
- package/src/__tests__/inline-skill-load-permissions.test.ts +6 -1
- package/src/__tests__/install-skill-routing.test.ts +157 -39
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +107 -3
- package/src/__tests__/list-messages-page-latest.test.ts +55 -0
- package/src/__tests__/llm-call-pipeline.test.ts +0 -3
- package/src/__tests__/llm-callsite-catalog.test.ts +20 -1
- package/src/__tests__/llm-catalog-parity.test.ts +190 -2
- package/src/__tests__/llm-request-log-source-clickhouse.test.ts +222 -0
- package/src/__tests__/llm-request-log-source-factory.test.ts +100 -0
- package/src/__tests__/llm-resolver.test.ts +46 -0
- package/src/__tests__/llm-usage-store.test.ts +114 -0
- package/src/__tests__/managed-profile-guard.test.ts +145 -14
- package/src/__tests__/managed-skill-lifecycle.test.ts +109 -18
- package/src/__tests__/managed-store.test.ts +84 -192
- package/src/__tests__/mcp-auth-routes.test.ts +1 -0
- package/src/__tests__/mcp-cli.test.ts +182 -220
- package/src/__tests__/mcp-health-check.test.ts +56 -27
- package/src/__tests__/media-generate-image.test.ts +1 -1
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +18 -11
- package/src/__tests__/memory-retrieval-pipeline.test.ts +0 -2
- package/src/__tests__/message-complete-display-id.test.ts +175 -0
- package/src/__tests__/messages-after-tiebreaker.test.ts +122 -0
- package/src/__tests__/notification-platform-adapter.test.ts +229 -0
- package/src/__tests__/oauth-cli.test.ts +38 -2009
- package/src/__tests__/oauth-commands-routes.test.ts +863 -0
- package/src/__tests__/oauth-connect-routes.test.ts +174 -11
- package/src/__tests__/oauth-provider-profiles.test.ts +9 -0
- package/src/__tests__/oauth-providers-routes.test.ts +14 -10
- package/src/__tests__/openai-provider.test.ts +24 -0
- package/src/__tests__/openai-responses-cutover-guard.test.ts +48 -19
- package/src/__tests__/openai-responses-provider.test.ts +17 -0
- package/src/__tests__/overflow-reduce-pipeline.test.ts +0 -2
- package/src/__tests__/persistence-pipeline.test.ts +0 -2
- package/src/__tests__/{managed-proxy-context.test.ts → platform-proxy-context.test.ts} +1 -1
- package/src/__tests__/platform.test.ts +2 -0
- package/src/__tests__/plugin-api-shim.test.ts +125 -0
- package/src/__tests__/plugin-bootstrap.test.ts +41 -38
- package/src/__tests__/plugin-external-api.test.ts +68 -0
- package/src/__tests__/plugin-registry.test.ts +0 -77
- package/src/__tests__/plugin-route-contribution.test.ts +31 -4
- package/src/__tests__/plugin-skill-contribution.test.ts +0 -2
- package/src/__tests__/plugin-tool-contribution.test.ts +47 -18
- package/src/__tests__/plugin-types.test.ts +15 -23
- package/src/__tests__/process-message-background-slack.test.ts +53 -0
- package/src/__tests__/process-message-display-content.test.ts +421 -0
- package/src/__tests__/profile-entry-status.test.ts +43 -0
- package/src/__tests__/provider-catalog-visibility.test.ts +142 -0
- package/src/__tests__/provider-error-scenarios.test.ts +111 -0
- package/src/__tests__/{provider-managed-proxy-integration.test.ts → provider-platform-proxy-integration.test.ts} +20 -12
- package/src/__tests__/provider-registry-ollama.test.ts +12 -4
- package/src/__tests__/provider-send-message-override-profile.test.ts +10 -4
- package/src/__tests__/relay-server.test.ts +118 -0
- package/src/__tests__/retry-thinking-tool-choice.test.ts +15 -0
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +65 -13
- package/src/__tests__/schedule-retry.test.ts +56 -4
- package/src/__tests__/schedule-routes.test.ts +151 -0
- package/src/__tests__/schedule-store.test.ts +94 -0
- package/src/__tests__/scheduler-disk-pressure.test.ts +0 -4
- package/src/__tests__/scheduler-recurrence.test.ts +87 -34
- package/src/__tests__/scheduler-reuse-conversation.test.ts +208 -5
- package/src/__tests__/scheduler-wake.test.ts +0 -63
- package/src/__tests__/schema-transforms.test.ts +20 -0
- package/src/__tests__/search-skills-unified.test.ts +0 -5
- package/src/__tests__/secret-allowlist.test.ts +1 -0
- package/src/__tests__/{secret-routes-managed-proxy.test.ts → secret-routes-platform-proxy.test.ts} +12 -4
- package/src/__tests__/server-history-render.test.ts +43 -0
- package/src/__tests__/shell-credential-ref.test.ts +95 -3
- package/src/__tests__/shell-tool-proxy-mode.test.ts +14 -0
- package/src/__tests__/skill-load-feature-flag.test.ts +1 -12
- package/src/__tests__/skill-load-tool.test.ts +29 -93
- package/src/__tests__/skill-memory.test.ts +23 -3
- package/src/__tests__/skills-file-content-endpoint.test.ts +9 -38
- package/src/__tests__/skills-files-catalog-fallback.test.ts +0 -3
- package/src/__tests__/skills-install-extract.test.ts +49 -38
- package/src/__tests__/skills-install-staging.test.ts +159 -0
- package/src/__tests__/skills-uninstall.test.ts +9 -41
- package/src/__tests__/skills.test.ts +51 -58
- package/src/__tests__/slack-channel-config.test.ts +9 -0
- package/src/__tests__/subagent-call-site-routing.test.ts +78 -16
- package/src/__tests__/subagent-tool-filtering.test.ts +50 -0
- package/src/__tests__/suggestion-routes.test.ts +3 -3
- package/src/__tests__/sync-message-contract.test.ts +63 -0
- package/src/__tests__/system-prompt.test.ts +737 -63
- package/src/__tests__/task-scheduler.test.ts +88 -23
- package/src/__tests__/terminal-tools.test.ts +28 -1
- package/src/__tests__/thread-backfill.test.ts +557 -27
- package/src/__tests__/title-generate-pipeline.test.ts +0 -13
- package/src/__tests__/token-estimate-pipeline.test.ts +0 -3
- package/src/__tests__/tool-error-pipeline.test.ts +0 -3
- package/src/__tests__/tool-execute-pipeline.test.ts +0 -5
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +1 -1
- package/src/__tests__/tool-executor.test.ts +16 -4
- package/src/__tests__/tool-result-truncate-pipeline.test.ts +0 -12
- package/src/__tests__/turn-events-store.test.ts +256 -0
- package/src/__tests__/twilio-routes.test.ts +4 -0
- package/src/__tests__/update-bulletin-job.test.ts +96 -193
- package/src/__tests__/usage-cli.test.ts +11 -73
- package/src/__tests__/user-plugin-loader.test.ts +143 -5
- package/src/__tests__/vercel-config.test.ts +168 -0
- package/src/__tests__/voice-session-bridge.test.ts +198 -0
- package/src/__tests__/web-search-catalog-parity.test.ts +108 -0
- package/src/__tests__/web-search.test.ts +303 -2
- package/src/__tests__/workspace-migration-039-drop-legacy-llm-keys.test.ts +1 -21
- package/src/__tests__/workspace-migration-057-repair-stale-gemini-model-ids.test.ts +170 -0
- package/src/__tests__/workspace-migration-069-seed-onboarding-threads.test.ts +53 -20
- package/src/__tests__/workspace-migration-072-seed-reply-suggestion-callsite.test.ts +241 -0
- package/src/__tests__/workspace-migration-073-repair-recall-callsite-empty-profile.test.ts +153 -0
- package/src/__tests__/workspace-migration-076-drop-services-inference-mode.test.ts +211 -0
- package/src/__tests__/workspace-migration-077-seed-memory-router-callsite.test.ts +174 -0
- package/src/__tests__/workspace-migration-079-home-feed-notification-only.test.ts +323 -0
- package/src/__tests__/workspace-migration-080-restrict-vercel-api-token-metadata.test.ts +299 -0
- package/src/__tests__/workspace-migration-081-backfill-bash-allowed-tools.test.ts +410 -0
- package/src/__tests__/workspace-migration-082-backfill-managed-profile-labels.test.ts +268 -0
- package/src/__tests__/workspace-migration-085-memory-v2-bm25-b-reembed-disabled-v2-pages.test.ts +220 -0
- package/src/__tests__/workspace-migration-086-revert-stale-gemini-mis-rewrites.test.ts +269 -0
- package/src/__tests__/workspace-migration-remove-legacy-skills-index.test.ts +309 -0
- package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +3 -3
- package/src/__tests__/workspace-migrations-runner.test.ts +111 -3
- package/src/__tests__/workspace-release-notes-feature-flag-guard.test.ts +115 -0
- package/src/acp/__tests__/helpers/which-stub.ts +4 -2
- package/src/acp/resolve-agent.test.ts +25 -0
- package/src/acp/resolve-agent.ts +13 -2
- package/src/acp/session-manager.ts +14 -0
- package/src/agent/image-optimize.ts +13 -5
- package/src/approvals/guardian-request-resolvers.ts +32 -87
- package/src/calls/relay-server.ts +35 -0
- package/src/calls/relay-setup-router.ts +36 -0
- package/src/calls/types.ts +1 -0
- package/src/calls/voice-session-bridge.ts +74 -36
- package/src/channels/config.ts +14 -1
- package/src/channels/types.ts +109 -0
- package/src/cli/AGENTS.md +164 -4
- package/src/cli/__tests__/notifications.test.ts +54 -0
- package/src/cli/__tests__/unknown-command.test.ts +24 -0
- package/src/cli/commands/__tests__/avatar.test.ts +540 -0
- package/src/cli/commands/__tests__/backup.test.ts +236 -776
- package/src/cli/commands/__tests__/cache.test.ts +1 -1
- package/src/cli/commands/__tests__/changelog.test.ts +578 -0
- package/src/cli/commands/__tests__/channel-verification-sessions.test.ts +503 -0
- package/src/cli/commands/__tests__/conversations-import.test.ts +515 -0
- package/src/cli/commands/__tests__/domain-register.test.ts +140 -167
- package/src/cli/commands/__tests__/domain-status.test.ts +137 -76
- package/src/cli/commands/__tests__/email-attachment.test.ts +314 -337
- package/src/cli/commands/__tests__/email-core.test.ts +579 -0
- package/src/cli/commands/__tests__/image-generation.test.ts +87 -824
- package/src/cli/commands/__tests__/inference-send.test.ts +30 -266
- package/src/cli/commands/__tests__/inference-session.test.ts +423 -0
- package/src/cli/commands/__tests__/memory-v2.test.ts +81 -110
- package/src/cli/commands/__tests__/schedules.test.ts +491 -0
- package/src/cli/commands/__tests__/skills.test.ts +563 -0
- package/src/cli/commands/__tests__/status.test.ts +249 -0
- package/src/cli/commands/__tests__/stt.test.ts +320 -0
- package/src/cli/commands/__tests__/tts-synthesize.test.ts +4 -603
- package/src/cli/commands/__tests__/tts.test.ts +321 -0
- package/src/cli/commands/__tests__/webhooks.test.ts +86 -511
- package/src/cli/commands/attachment.ts +8 -3
- package/src/cli/commands/audit.ts +95 -64
- package/src/cli/commands/auth.ts +61 -58
- package/src/cli/commands/avatar.ts +276 -390
- package/src/cli/commands/backup.ts +409 -505
- package/src/cli/commands/bash.ts +9 -5
- package/src/cli/commands/browser.ts +28 -9
- package/src/cli/commands/cache.ts +9 -4
- package/src/cli/commands/changelog.ts +478 -0
- package/src/cli/commands/channel-verification-sessions.ts +238 -317
- package/src/cli/commands/clients.ts +8 -3
- package/src/cli/commands/completions.ts +9 -9
- package/src/cli/commands/config.ts +102 -72
- package/src/cli/commands/contacts.ts +575 -696
- package/src/cli/commands/conversations-defer.ts +17 -69
- package/src/cli/commands/conversations-import.ts +90 -253
- package/src/cli/commands/conversations.ts +429 -434
- package/src/cli/commands/credential-execution.ts +9 -6
- package/src/cli/commands/credentials.ts +456 -736
- package/src/cli/commands/default-action.ts +10 -53
- package/src/cli/commands/domain.ts +128 -206
- package/src/cli/commands/email.ts +606 -794
- package/src/cli/commands/gateway.ts +8 -1
- package/src/cli/commands/image-generation.ts +157 -205
- package/src/cli/commands/inference-providers.ts +352 -0
- package/src/cli/commands/inference-session.ts +415 -0
- package/src/cli/commands/inference.ts +87 -65
- package/src/cli/commands/keys.ts +8 -3
- package/src/cli/commands/mcp.ts +103 -287
- package/src/cli/commands/memory-v2.ts +162 -516
- package/src/cli/commands/notifications.ts +342 -304
- package/src/cli/commands/oauth/apps.ts +292 -261
- package/src/cli/commands/oauth/connect.ts +176 -297
- package/src/cli/commands/oauth/disconnect.ts +16 -215
- package/src/cli/commands/oauth/index.ts +49 -45
- package/src/cli/commands/oauth/mode.ts +43 -199
- package/src/cli/commands/oauth/ping.ts +17 -125
- package/src/cli/commands/oauth/providers.ts +732 -921
- package/src/cli/commands/oauth/request.ts +60 -350
- package/src/cli/commands/oauth/shared.ts +11 -121
- package/src/cli/commands/oauth/status.ts +31 -121
- package/src/cli/commands/oauth/token.ts +13 -55
- package/src/cli/commands/pending.ts +19 -10
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +133 -183
- package/src/cli/commands/platform/__tests__/connect.test.ts +66 -181
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +71 -227
- package/src/cli/commands/platform/__tests__/status.test.ts +169 -287
- package/src/cli/commands/platform/connect.ts +16 -80
- package/src/cli/commands/platform/disconnect.ts +14 -112
- package/src/cli/commands/platform/index.ts +177 -246
- package/src/cli/commands/plugins.ts +185 -0
- package/src/cli/commands/routes.ts +153 -336
- package/src/cli/commands/schedules.ts +391 -0
- package/src/cli/commands/sequence.ts +316 -360
- package/src/cli/commands/skills.ts +449 -671
- package/src/cli/commands/status.ts +58 -37
- package/src/cli/commands/stt.ts +94 -262
- package/src/cli/commands/task.ts +14 -40
- package/src/cli/commands/telemetry.ts +40 -0
- package/src/cli/commands/trust.ts +8 -3
- package/src/cli/commands/tts.ts +162 -167
- package/src/cli/commands/ui.ts +35 -42
- package/src/cli/commands/usage.ts +188 -126
- package/src/cli/commands/watchers.ts +8 -3
- package/src/cli/commands/webhooks.ts +99 -193
- package/src/cli/lib/__tests__/cli-colors.test.ts +48 -0
- package/src/cli/lib/__tests__/confirm-prompt.test.ts +159 -0
- package/src/cli/lib/__tests__/install-from-github.test.ts +355 -0
- package/src/cli/lib/__tests__/list-installed-plugins.test.ts +154 -0
- package/src/cli/lib/__tests__/register-command.test.ts +85 -0
- package/src/cli/lib/__tests__/uninstall-plugin.test.ts +124 -0
- package/src/cli/lib/__tests__/unknown-command.test.ts +106 -0
- package/src/cli/lib/cli-colors.ts +12 -0
- package/src/cli/lib/confirm-prompt.ts +79 -0
- package/src/cli/lib/daemon-credential-client.ts +4 -5
- package/src/cli/lib/install-from-github.ts +304 -0
- package/src/cli/lib/list-installed-plugins.ts +137 -0
- package/src/cli/lib/nested-value.ts +44 -0
- package/src/cli/lib/open-browser.ts +36 -0
- package/src/cli/lib/register-command.ts +19 -0
- package/src/cli/lib/time-ago.ts +34 -0
- package/src/cli/lib/uninstall-plugin.ts +82 -0
- package/src/cli/lib/unknown-command.ts +111 -0
- package/src/cli/program.ts +40 -6
- package/src/cli/utils/__tests__/conversation-id.test.ts +66 -0
- package/src/cli/utils/__tests__/parse-duration.test.ts +49 -0
- package/src/cli/utils/conversation-id.ts +30 -0
- package/src/cli/utils/parse-duration.ts +41 -0
- package/src/config/acp-defaults.test.ts +5 -1
- package/src/config/acp-defaults.ts +11 -4
- package/src/config/bundled-skills/acp/TOOLS.json +2 -2
- package/src/config/bundled-skills/app-builder/SKILL.md +23 -21
- package/src/config/bundled-skills/app-builder/TOOLS.json +7 -0
- package/src/config/bundled-skills/app-control/TOOLS.json +32 -0
- package/src/config/bundled-skills/computer-use/TOOLS.json +15 -52
- package/src/config/bundled-skills/contacts/SKILL.md +12 -45
- package/src/config/bundled-skills/contacts/TOOLS.json +0 -57
- package/src/config/bundled-skills/document/SKILL.md +23 -3
- package/src/config/bundled-skills/document/TOOLS.json +53 -0
- package/src/config/bundled-skills/document/tools/document-delete.ts +12 -0
- package/src/config/bundled-skills/document/tools/document-list.ts +12 -0
- package/src/config/bundled-skills/document/tools/document-read.ts +12 -0
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +0 -12
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +0 -58
- package/src/config/bundled-skills/skill-management/SKILL.md +2 -2
- package/src/config/bundled-skills/skill-management/TOOLS.json +7 -7
- package/src/config/bundled-tool-registry.ts +6 -2
- package/src/config/feature-flag-registry.json +57 -1
- package/src/config/llm-resolver.ts +16 -1
- package/src/config/loader.ts +140 -52
- package/src/config/raw-config-utils.ts +2 -30
- package/src/config/schema.ts +8 -7
- package/src/config/schemas/__tests__/llm-request-logs.test.ts +36 -0
- package/src/config/schemas/__tests__/memory-v2.test.ts +49 -0
- package/src/config/schemas/call-site-catalog.ts +29 -7
- package/src/config/schemas/channels.ts +8 -0
- package/src/config/schemas/compaction.ts +28 -0
- package/src/config/schemas/heartbeat.ts +9 -0
- package/src/config/schemas/llm-request-logs.ts +81 -0
- package/src/config/schemas/llm.ts +55 -2
- package/src/config/schemas/memory-retrieval.ts +18 -0
- package/src/config/schemas/memory-retrospective.ts +48 -0
- package/src/config/schemas/memory-v2.ts +32 -1
- package/src/config/schemas/memory.ts +4 -0
- package/src/config/schemas/services.ts +15 -12
- package/src/config/schemas/tools.ts +14 -0
- package/src/config/seed-inference-profiles.ts +195 -134
- package/src/config/skills.ts +3 -96
- package/src/contacts/contact-store.ts +0 -61
- package/src/context/compactor.ts +1047 -0
- package/src/context/token-estimator.ts +2 -2
- package/src/context/window-manager.ts +197 -1334
- package/src/credential-execution/managed-catalog.ts +37 -0
- package/src/credential-health/credential-health-service.ts +280 -19
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +113 -0
- package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +138 -0
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +183 -4
- package/src/daemon/__tests__/daemon-skill-host.test.ts +10 -4
- package/src/daemon/approval-generators.ts +26 -30
- package/src/daemon/config-watcher.ts +94 -29
- package/src/daemon/conversation-agent-loop-handlers.ts +24 -0
- package/src/daemon/conversation-agent-loop.ts +293 -103
- package/src/daemon/conversation-error.ts +188 -33
- package/src/daemon/conversation-lifecycle.ts +80 -26
- package/src/daemon/conversation-messaging.ts +25 -6
- package/src/daemon/conversation-process.ts +85 -31
- package/src/daemon/conversation-runtime-assembly.ts +30 -6
- package/src/daemon/conversation-slash.ts +184 -25
- package/src/daemon/conversation-store.ts +24 -10
- package/src/daemon/conversation-surfaces.ts +76 -12
- package/src/daemon/conversation-tool-setup.ts +63 -21
- package/src/daemon/conversation.ts +81 -10
- package/src/daemon/external-plugins-bootstrap.ts +231 -185
- package/src/daemon/first-greeting.ts +22 -2
- package/src/daemon/guardian-action-generators.ts +7 -22
- package/src/daemon/handlers/config-model.ts +13 -130
- package/src/daemon/handlers/config-slack-channel.ts +25 -10
- package/src/daemon/handlers/config-vercel.ts +3 -1
- package/src/daemon/handlers/shared.ts +14 -5
- package/src/daemon/handlers/skills.ts +166 -84
- package/src/daemon/history-repair.ts +61 -7
- package/src/daemon/host-app-control-proxy.ts +129 -29
- package/src/daemon/host-bash-proxy.ts +85 -158
- package/src/daemon/host-browser-proxy.ts +96 -35
- package/src/daemon/host-proxy-base.ts +13 -1
- package/src/daemon/host-proxy-preactivation.ts +25 -1
- package/src/daemon/identity-helpers.ts +19 -0
- package/src/daemon/lifecycle.ts +79 -70
- package/src/daemon/meet-host-supervisor.ts +20 -19
- package/src/daemon/memory-v2-startup.ts +58 -2
- package/src/daemon/message-protocol.ts +7 -0
- package/src/daemon/message-types/bookmarks.ts +18 -0
- package/src/daemon/message-types/conversations.ts +37 -9
- package/src/daemon/message-types/messages.ts +70 -1
- package/src/daemon/message-types/subagents.ts +1 -0
- package/src/daemon/message-types/sync.ts +61 -0
- package/src/daemon/pkb-reminder-builder.test.ts +54 -13
- package/src/daemon/pkb-reminder-builder.ts +21 -7
- package/src/daemon/plugin-source-watcher.ts +146 -0
- package/src/daemon/process-message.ts +77 -26
- package/src/daemon/server.ts +34 -20
- package/src/daemon/shutdown-handlers.ts +0 -2
- package/src/daemon/skill-memory-refresh.ts +29 -0
- package/src/daemon/tool-setup-types.ts +9 -0
- package/src/daemon/tool-side-effects.ts +6 -4
- package/src/daemon/wake-target-adapter.ts +11 -0
- package/src/documents/document-store.ts +221 -3
- package/src/embedded/plugin-api.ts +40 -0
- package/src/export/transcript-formatter.ts +61 -2
- package/src/filing/filing-service.ts +79 -53
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +444 -0
- package/src/heartbeat/heartbeat-run-store.ts +3 -1
- package/src/heartbeat/heartbeat-service.ts +189 -127
- package/src/home/__tests__/feed-types.test.ts +99 -127
- package/src/home/__tests__/feed-writer.test.ts +77 -278
- package/src/home/__tests__/post-connect-feed.test.ts +9 -12
- package/src/home/feed-types.ts +41 -73
- package/src/home/feed-writer.ts +25 -156
- package/src/home/post-connect-feed.ts +2 -3
- package/src/index.ts +18 -1
- package/src/ipc/__tests__/cli-ipc.test.ts +2 -0
- package/src/ipc/__tests__/email-ipc.test.ts +506 -0
- package/src/ipc/__tests__/exit-helper.test.ts +104 -0
- package/src/ipc/__tests__/streaming-client.test.ts +237 -0
- package/src/ipc/__tests__/streaming-framing.test.ts +142 -0
- package/src/ipc/assistant-server.ts +55 -6
- package/src/ipc/cli-client.ts +370 -50
- package/src/ipc/routes/db-proxy-transaction.ts +151 -0
- package/src/ipc/skill-routes/__tests__/events-ipc.test.ts +60 -0
- package/src/ipc/skill-routes/events.ts +30 -3
- package/src/live-voice/__tests__/live-voice-session-manager.test.ts +46 -0
- package/src/live-voice/__tests__/live-voice-stt.test.ts +57 -0
- package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +1 -0
- package/src/live-voice/live-voice-session-manager.ts +11 -4
- package/src/live-voice/live-voice-session.ts +14 -6
- package/src/mcp/client.ts +20 -4
- package/src/media/image-credentials.ts +3 -3
- package/src/memory/__tests__/bookmark-crud.test.ts +264 -0
- package/src/memory/__tests__/bookmark-schema.test.ts +181 -0
- package/src/memory/__tests__/conversation-queries.test.ts +263 -0
- package/src/memory/__tests__/conversation-types.test.ts +36 -0
- package/src/memory/__tests__/find-most-recent-retrospective-for.test.ts +130 -0
- package/src/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +113 -0
- package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +177 -0
- package/src/memory/__tests__/memory-retrospective-job.test.ts +328 -0
- package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +318 -0
- package/src/memory/__tests__/memory-retrospective-trigger-check.test.ts +90 -0
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +69 -0
- package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +3 -0
- package/src/memory/__tests__/message-content.test.ts +35 -0
- package/src/memory/bookmark-crud.ts +211 -0
- package/src/memory/context-search/__tests__/agent-runner-redaction.test.ts +31 -9
- package/src/memory/context-search/agent-protocol.ts +5 -1
- package/src/memory/context-search/agent-runner.ts +60 -85
- package/src/memory/context-search/limits.ts +1 -4
- package/src/memory/context-search/search.ts +23 -113
- package/src/memory/context-search/sources/conversations.ts +80 -8
- package/src/memory/context-search/sources/memory-v2.ts +39 -14
- package/src/memory/context-search/sources/memory.ts +7 -0
- package/src/memory/context-search/sources/workspace.ts +17 -10
- package/src/memory/context-search/types.ts +1 -1
- package/src/memory/conversation-bootstrap.ts +11 -0
- package/src/memory/conversation-crud.ts +368 -22
- package/src/memory/conversation-queries.ts +116 -12
- package/src/memory/conversation-title-service.ts +1 -0
- package/src/memory/conversation-types.ts +16 -0
- package/src/memory/db-init.ts +20 -0
- package/src/memory/delivery-crud.ts +152 -5
- package/src/memory/embedding-backend.ts +6 -5
- package/src/memory/embedding-runtime-manager.ts +1 -2
- package/src/memory/external-conversation-store.ts +66 -5
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +66 -9
- package/src/memory/graph/__tests__/remember-description.test.ts +55 -0
- package/src/memory/graph/conversation-graph-memory.ts +92 -5
- package/src/memory/graph/extraction.ts +4 -0
- package/src/memory/graph/graph-memory-state-store.ts +16 -3
- package/src/memory/graph/tool-handlers.ts +17 -7
- package/src/memory/graph/tools.ts +45 -6
- package/src/memory/indexer.ts +51 -29
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +86 -15
- package/src/memory/jobs/embed-concept-page.ts +65 -20
- package/src/memory/jobs-store.ts +51 -1
- package/src/memory/jobs-worker.ts +57 -3
- package/src/memory/llm-request-log-source-clickhouse.ts +324 -0
- package/src/memory/llm-request-log-source-local.ts +26 -0
- package/src/memory/llm-request-log-source.ts +64 -0
- package/src/memory/llm-request-log-store.ts +1 -1
- package/src/memory/llm-usage-store.ts +125 -5
- package/src/memory/memory-retrospective-constants.ts +13 -0
- package/src/memory/memory-retrospective-enqueue.ts +114 -0
- package/src/memory/memory-retrospective-job.ts +351 -0
- package/src/memory/memory-retrospective-startup-cleanup.ts +175 -0
- package/src/memory/memory-retrospective-state.ts +162 -0
- package/src/memory/memory-retrospective-trigger-check.ts +91 -0
- package/src/memory/memory-v2-activation-log-store.ts +49 -5
- package/src/memory/memory-v2-concept-frequency.ts +4 -0
- package/src/memory/message-content.ts +38 -1
- package/src/memory/migrations/109-external-conversation-bindings.ts +15 -4
- package/src/memory/migrations/227-add-conversation-inference-profile.ts +6 -1
- package/src/memory/migrations/228-rename-inference-profile-snake-case.ts +20 -7
- package/src/memory/migrations/229-delete-private-conversations.test.ts +107 -1
- package/src/memory/migrations/229-delete-private-conversations.ts +19 -0
- package/src/memory/migrations/231-repair-memory-graph-event-dates.ts +16 -2
- package/src/memory/migrations/240-conversation-inference-profile-session.ts +25 -0
- package/src/memory/migrations/241-activation-state-fk-cascade.ts +50 -0
- package/src/memory/migrations/242-message-bookmarks.ts +38 -0
- package/src/memory/migrations/243-provider-connections.ts +68 -0
- package/src/memory/migrations/244-provider-connection-status-label.ts +23 -0
- package/src/memory/migrations/245-memory-retrospective-state.ts +36 -0
- package/src/memory/migrations/246-backfill-provider-connection-label.ts +81 -0
- package/src/memory/migrations/247-external-conversation-binding-thread-id.ts +78 -0
- package/src/memory/migrations/248-create-onboarding-events.ts +21 -0
- package/src/memory/migrations/249-normalize-slack-external-content.ts +240 -0
- package/src/memory/migrations/__tests__/244-provider-connection-status-label.test.ts +84 -0
- package/src/memory/migrations/__tests__/245-memory-retrospective-state.test.ts +125 -0
- package/src/memory/migrations/__tests__/246-backfill-provider-connection-label.test.ts +192 -0
- package/src/memory/migrations/index.ts +13 -0
- package/src/memory/migrations/registry.ts +8 -0
- package/src/memory/onboarding-events-store.ts +106 -0
- package/src/memory/published-pages-store.ts +16 -0
- package/src/memory/schema/bookmarks.ts +36 -0
- package/src/memory/schema/calls.ts +1 -0
- package/src/memory/schema/conversations.ts +2 -0
- package/src/memory/schema/index.ts +2 -0
- package/src/memory/schema/inference.ts +27 -0
- package/src/memory/schema/infrastructure.ts +12 -0
- package/src/memory/schema/memory-core.ts +9 -0
- package/src/memory/search/semantic.ts +1 -4
- package/src/memory/turn-events-store.ts +127 -2
- package/src/memory/v2/__tests__/__snapshots__/prompts-router.test.ts.snap +27 -0
- package/src/memory/v2/__tests__/activation-store.test.ts +5 -5
- package/src/memory/v2/__tests__/activation.test.ts +11 -12
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +38 -21
- package/src/memory/v2/__tests__/consolidation-job.test.ts +123 -135
- package/src/memory/v2/__tests__/edge-index.test.ts +1 -1
- package/src/memory/v2/__tests__/frontmatter-sweep.test.ts +111 -0
- package/src/memory/v2/__tests__/injection.test.ts +726 -18
- package/src/memory/v2/__tests__/migration.test.ts +94 -3
- package/src/memory/v2/__tests__/page-index.test.ts +360 -0
- package/src/memory/v2/__tests__/page-store.test.ts +14 -1
- package/src/memory/v2/__tests__/prompts-router.test.ts +309 -0
- package/src/memory/v2/__tests__/qdrant.test.ts +138 -3
- package/src/memory/v2/__tests__/reranker.test.ts +4 -4
- package/src/memory/v2/__tests__/router.test.ts +531 -0
- package/src/memory/v2/__tests__/sim.test.ts +45 -1
- package/src/memory/v2/__tests__/skill-store.test.ts +445 -11
- package/src/memory/v2/__tests__/static-context.test.ts +7 -22
- package/src/memory/v2/__tests__/sweep-job.test.ts +95 -0
- package/src/memory/v2/activation-store.ts +34 -5
- package/src/memory/v2/activation.ts +40 -27
- package/src/memory/v2/backfill-jobs.ts +17 -84
- package/src/memory/v2/consolidation-job.ts +85 -78
- package/src/memory/v2/frontmatter-sweep.ts +91 -0
- package/src/memory/v2/injection.ts +466 -109
- package/src/memory/v2/migration.ts +147 -20
- package/src/memory/v2/page-index.ts +221 -0
- package/src/memory/v2/page-store.ts +3 -0
- package/src/memory/v2/prompts/consolidation.ts +9 -7
- package/src/memory/v2/prompts/router.ts +195 -0
- package/src/memory/v2/prompts/sweep.ts +2 -2
- package/src/memory/v2/qdrant.ts +234 -93
- package/src/memory/v2/reranker.ts +14 -7
- package/src/memory/v2/router.ts +323 -0
- package/src/memory/v2/sim.ts +25 -12
- package/src/memory/v2/skill-store.ts +204 -30
- package/src/memory/v2/static-context.ts +16 -9
- package/src/memory/v2/sweep-job.ts +122 -96
- package/src/memory/v2/types.ts +10 -6
- package/src/memory/validation.ts +13 -0
- package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +45 -5
- package/src/messaging/providers/slack/__tests__/download.test.ts +231 -0
- package/src/messaging/providers/slack/adapter.ts +43 -5
- package/src/messaging/providers/slack/client.ts +27 -0
- package/src/messaging/providers/slack/deep-link.ts +65 -0
- package/src/messaging/providers/slack/download.ts +104 -0
- package/src/messaging/providers/slack/message-metadata.test.ts +32 -0
- package/src/messaging/providers/slack/message-metadata.ts +27 -0
- package/src/messaging/providers/slack/render-transcript.test.ts +134 -0
- package/src/messaging/providers/slack/render-transcript.ts +69 -5
- package/src/messaging/providers/slack/types.ts +20 -1
- package/src/notifications/__tests__/emit-signal-home-feed.test.ts +182 -0
- package/src/notifications/__tests__/home-feed-side-effect.test.ts +199 -0
- package/src/notifications/__tests__/signal-registry.test.ts +17 -0
- package/src/notifications/adapters/platform.ts +171 -0
- package/src/notifications/conversation-pairing.ts +4 -3
- package/src/notifications/copy-composer.ts +15 -0
- package/src/notifications/decision-engine.ts +2 -1
- package/src/notifications/destination-resolver.ts +21 -0
- package/src/notifications/emit-signal.ts +48 -2
- package/src/notifications/home-feed-side-effect.ts +165 -0
- package/src/notifications/signal.ts +8 -1
- package/src/oauth/connection-resolver.ts +8 -4
- package/src/oauth/platform-connection.ts +6 -2
- package/src/oauth/seed-providers.ts +10 -1
- package/src/permissions/checker.ts +14 -0
- package/src/permissions/ipc-risk-types.ts +3 -0
- package/src/permissions/question-prompter.test.ts +416 -0
- package/src/permissions/question-prompter.ts +294 -0
- package/src/platform/client.test.ts +1 -1
- package/src/platform/client.ts +1 -1
- package/src/plugin-api/constants.ts +26 -0
- package/src/plugin-api/index.ts +46 -0
- package/src/plugin-api/package.json +12 -0
- package/src/plugin-api/types.ts +144 -0
- package/src/plugins/defaults/circuit-breaker.ts +0 -5
- package/src/plugins/defaults/compaction.ts +0 -4
- package/src/plugins/defaults/empty-response.ts +0 -2
- package/src/plugins/defaults/history-repair.ts +0 -2
- package/src/plugins/defaults/injectors.ts +55 -6
- package/src/plugins/defaults/llm-call.ts +0 -2
- package/src/plugins/defaults/memory-retrieval.ts +0 -1
- package/src/plugins/defaults/overflow-reduce.ts +0 -1
- package/src/plugins/defaults/persistence.ts +0 -2
- package/src/plugins/defaults/title-generate.ts +0 -5
- package/src/plugins/defaults/token-estimate.ts +0 -2
- package/src/plugins/defaults/tool-error.ts +0 -7
- package/src/plugins/defaults/tool-execute.ts +0 -2
- package/src/plugins/defaults/tool-result-truncate.ts +0 -4
- package/src/plugins/ensure-plugin-api-shim.ts +96 -0
- package/src/plugins/external-api.ts +104 -0
- package/src/plugins/external-plugin-loader.ts +367 -0
- package/src/plugins/feature-gate.ts +22 -0
- package/src/plugins/pipeline.ts +37 -0
- package/src/plugins/registry.ts +48 -80
- package/src/plugins/types.ts +74 -53
- package/src/plugins/user-loader.ts +85 -43
- package/src/proactive-artifact/aux-message-injector.ts +11 -0
- package/src/proactive-artifact/job.test.ts +49 -9
- package/src/proactive-artifact/job.ts +4 -0
- package/src/proactive-artifact/trigger-state.test.ts +9 -0
- package/src/proactive-artifact/trigger-state.ts +4 -0
- package/src/prompts/__tests__/system-prompt.test.ts +117 -0
- package/src/prompts/__tests__/task-progress-hint-section.test.ts +99 -0
- package/src/prompts/normalize-onboarding.ts +27 -0
- package/src/prompts/sections.ts +302 -0
- package/src/prompts/system-prompt.ts +72 -154
- package/src/prompts/templates/BOOTSTRAP.md +17 -1
- package/src/prompts/templates/system-sections.ts +173 -0
- package/src/prompts/update-bulletin-job.ts +61 -73
- package/src/providers/__tests__/dispatch-connection-routing.test.ts +279 -0
- package/src/providers/__tests__/inference.test.ts +303 -0
- package/src/providers/__tests__/provider-env-vars.test.ts +6 -0
- package/src/providers/__tests__/provider-secret-catalog.test.ts +6 -0
- package/src/providers/__tests__/retry-callsite.test.ts +14 -32
- package/src/providers/__tests__/satellite-connection-routing.test.ts +510 -0
- package/src/providers/__tests__/search-provider-catalog.test.ts +80 -0
- package/src/providers/anthropic/client.ts +123 -54
- package/src/providers/call-site-routing.ts +94 -16
- package/src/providers/connection-resolution.ts +170 -0
- package/src/providers/inference/__tests__/connections-status-label.test.ts +250 -0
- package/src/providers/inference/adapter-factory.ts +210 -0
- package/src/providers/inference/auth.ts +112 -0
- package/src/providers/inference/backfill.ts +196 -0
- package/src/providers/inference/connections.ts +401 -0
- package/src/providers/inference/resolve-auth.ts +73 -0
- package/src/providers/model-catalog.ts +386 -6
- package/src/providers/openai/chat-completions-provider.ts +10 -2
- package/src/providers/openai/responses-provider.ts +4 -2
- package/src/providers/openrouter/client.ts +7 -0
- package/src/providers/{managed-proxy → platform-proxy}/constants.ts +4 -1
- package/src/providers/{managed-proxy → platform-proxy}/context.ts +3 -3
- package/src/providers/provider-availability.ts +17 -2
- package/src/providers/provider-catalog-visibility.ts +36 -0
- package/src/providers/provider-env-vars.ts +17 -7
- package/src/providers/provider-secret-catalog.ts +49 -30
- package/src/providers/provider-send-message.ts +41 -20
- package/src/providers/registry.ts +151 -159
- package/src/providers/retry.ts +65 -11
- package/src/providers/search-provider-catalog.ts +121 -0
- package/src/runtime/AGENTS.md +18 -5
- package/src/runtime/__tests__/agent-wake.test.ts +152 -0
- package/src/runtime/__tests__/background-job-runner.test.ts +357 -0
- package/src/runtime/__tests__/pre-first-message-gate.test.ts +82 -0
- package/src/runtime/actor-trust-resolver.ts +32 -10
- package/src/runtime/agent-wake.ts +64 -7
- package/src/runtime/assistant-event-hub.ts +3 -85
- package/src/runtime/auth/route-policy.ts +311 -9
- package/src/runtime/auth/same-actor.ts +2 -0
- package/src/runtime/background-job-runner.ts +339 -0
- package/src/runtime/btw-sidechain.ts +3 -0
- package/src/runtime/http-router.ts +36 -1
- package/src/runtime/http-server.ts +31 -5
- package/src/runtime/http-types.ts +21 -0
- package/src/runtime/middleware/__tests__/request-logger.test.ts +162 -0
- package/src/runtime/middleware/request-logger.ts +62 -1
- package/src/runtime/migrations/origin-mode.ts +1 -1
- package/src/runtime/pending-interactions.ts +1 -0
- package/src/runtime/pre-first-message-gate.ts +83 -0
- package/src/runtime/routes/__tests__/backup-routes.test.ts +8 -1
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +268 -0
- package/src/runtime/routes/__tests__/connection-routes-vs-cli-parity.test.ts +142 -0
- package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +319 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +280 -4
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +15 -136
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +736 -0
- package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +4 -4
- package/src/runtime/routes/__tests__/question-routes.test.ts +395 -0
- package/src/runtime/routes/__tests__/stt-routes.test.ts +5 -1
- package/src/runtime/routes/__tests__/surface-action-routes.test.ts +384 -0
- package/src/runtime/routes/__tests__/tts-routes.test.ts +70 -3
- package/src/runtime/routes/acp-routes-list.test.ts +143 -0
- package/src/runtime/routes/acp-routes.ts +12 -8
- package/src/runtime/routes/app-management-routes.ts +228 -3
- package/src/runtime/routes/approval-routes.ts +0 -18
- package/src/runtime/routes/audit-routes.ts +43 -0
- package/src/runtime/routes/auth-routes.ts +72 -0
- package/src/runtime/routes/avatar-routes.ts +273 -20
- package/src/runtime/routes/backup-routes.ts +406 -2
- package/src/runtime/routes/bookmark-routes.ts +156 -0
- package/src/runtime/routes/btw-routes.ts +5 -1
- package/src/runtime/routes/channel-availability-routes.ts +121 -0
- package/src/runtime/routes/channel-verification-routes.ts +2 -1
- package/src/runtime/routes/contact-routes.ts +0 -160
- package/src/runtime/routes/conversation-cli-routes.ts +233 -0
- package/src/runtime/routes/conversation-list-routes.ts +3 -20
- package/src/runtime/routes/conversation-management-routes.ts +47 -85
- package/src/runtime/routes/conversation-query-routes.ts +350 -97
- package/src/runtime/routes/conversation-routes.ts +121 -21
- package/src/runtime/routes/conversations-import-routes.ts +229 -0
- package/src/runtime/routes/credential-routes.ts +540 -0
- package/src/runtime/routes/debug-routes.ts +2 -2
- package/src/runtime/routes/document-pdf-renderer.ts +5 -1
- package/src/runtime/routes/documents-routes.ts +25 -86
- package/src/runtime/routes/domain-routes.ts +167 -0
- package/src/runtime/routes/email-routes.ts +603 -0
- package/src/runtime/routes/errors.ts +2 -2
- package/src/runtime/routes/events-routes.ts +192 -0
- package/src/runtime/routes/group-routes.ts +5 -0
- package/src/runtime/routes/home-feed-routes.ts +6 -78
- package/src/runtime/routes/host-app-control-routes.ts +44 -2
- package/src/runtime/routes/host-browser-routes.ts +103 -22
- package/src/runtime/routes/http-adapter.ts +2 -0
- package/src/runtime/routes/identity-routes.ts +5 -0
- package/src/runtime/routes/image-generation-routes.ts +99 -0
- package/src/runtime/routes/inbound-conversation.ts +28 -8
- package/src/runtime/routes/inbound-message-handler.ts +236 -41
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +248 -1
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +118 -7
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +17 -4
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.test.ts +156 -0
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +22 -4
- package/src/runtime/routes/index.ts +42 -0
- package/src/runtime/routes/inference-profile-session-handler.ts +285 -0
- package/src/runtime/routes/inference-profile-session-reaper.ts +84 -0
- package/src/runtime/routes/inference-profile-session-routes.ts +146 -0
- package/src/runtime/routes/inference-provider-connection-routes.ts +361 -0
- package/src/runtime/routes/inference-send-routes.ts +115 -0
- package/src/runtime/routes/integrations/slack/share.ts +4 -52
- package/src/runtime/routes/integrations/slack/token.ts +43 -0
- package/src/runtime/routes/integrations/twilio.ts +7 -13
- package/src/runtime/routes/mcp-auth-routes.ts +283 -9
- package/src/runtime/routes/memory-v2-routes.ts +13 -398
- package/src/runtime/routes/notification-routes.ts +3 -1
- package/src/runtime/routes/oauth-apps.ts +112 -7
- package/src/runtime/routes/oauth-commands-routes.ts +1097 -0
- package/src/runtime/routes/oauth-connect-routes.ts +67 -5
- package/src/runtime/routes/oauth-lifecycle-routes.ts +43 -0
- package/src/runtime/routes/oauth-providers.ts +298 -8
- package/src/runtime/routes/platform-routes.ts +336 -0
- package/src/runtime/routes/playground/inject-failures.ts +2 -1
- package/src/runtime/routes/playground/reset-circuit.ts +2 -1
- package/src/runtime/routes/playground/state.ts +2 -1
- package/src/runtime/routes/publish-routes.ts +221 -0
- package/src/runtime/routes/question-routes.ts +259 -0
- package/src/runtime/routes/rename-conversation-routes.ts +2 -33
- package/src/runtime/routes/schedule-routes.ts +79 -0
- package/src/runtime/routes/sequence-routes.ts +291 -0
- package/src/runtime/routes/settings-routes.ts +2 -10
- package/src/runtime/routes/skills-routes.ts +31 -1
- package/src/runtime/routes/stt-routes.ts +240 -3
- package/src/runtime/routes/subagents-routes.ts +57 -18
- package/src/runtime/routes/surface-action-routes.ts +43 -7
- package/src/runtime/routes/telemetry-routes.ts +27 -0
- package/src/runtime/routes/tts-routes.ts +93 -1
- package/src/runtime/routes/types.ts +32 -0
- package/src/runtime/routes/user-routes-cli.ts +243 -0
- package/src/runtime/routes/webhook-routes.ts +165 -0
- package/src/runtime/routes/workspace-routes.test.ts +43 -0
- package/src/runtime/routes/workspace-routes.ts +28 -0
- package/src/runtime/services/conversation-serializer.ts +39 -7
- package/src/runtime/sync/resource-sync-events.ts +117 -0
- package/src/runtime/sync/sync-publisher.test.ts +105 -0
- package/src/runtime/sync/sync-publisher.ts +21 -0
- package/src/schedule/schedule-store.ts +27 -2
- package/src/schedule/scheduler.ts +208 -123
- package/src/security/__tests__/provider-key-env-fallback.test.ts +12 -6
- package/src/security/__tests__/untrusted-content.test.ts +86 -0
- package/src/security/secret-patterns.ts +3 -0
- package/src/security/untrusted-content.ts +93 -8
- package/src/sequence/engine.ts +38 -40
- package/src/skills/catalog-files.ts +1 -1
- package/src/skills/catalog-install.ts +233 -116
- package/src/skills/clawhub.ts +70 -13
- package/src/skills/managed-store.ts +4 -119
- package/src/skills/skillssh-registry.ts +27 -48
- package/src/subagent/manager.ts +28 -15
- package/src/telemetry/types.ts +113 -1
- package/src/telemetry/usage-telemetry-reporter.test.ts +312 -5
- package/src/telemetry/usage-telemetry-reporter.ts +113 -7
- package/src/tools/apps/executors.ts +58 -7
- package/src/tools/ask-question/ask-question-tool.test.ts +509 -0
- package/src/tools/ask-question/ask-question-tool.ts +304 -0
- package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +206 -0
- package/src/tools/browser/browser-execution.ts +29 -14
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +174 -0
- package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +16 -13
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +24 -1
- package/src/tools/browser/cdp-client/factory.ts +66 -5
- package/src/tools/browser/runtime-check.ts +77 -0
- package/src/tools/computer-use/definitions.ts +3 -3
- package/src/tools/credentials/vault.ts +1 -1
- package/src/tools/document/document-tool.ts +124 -1
- package/src/tools/filesystem/edit.ts +1 -1
- package/src/tools/filesystem/list.ts +1 -1
- package/src/tools/filesystem/read.ts +1 -1
- package/src/tools/filesystem/write.ts +5 -2
- package/src/tools/host-filesystem/transfer.ts +1 -1
- package/src/tools/host-terminal/host-shell.ts +1 -1
- package/src/tools/memory/register.test.ts +3 -3
- package/src/tools/memory/register.ts +9 -1
- package/src/tools/network/__tests__/web-search.test.ts +156 -0
- package/src/tools/network/web-search.ts +280 -37
- package/src/tools/permission-checker.ts +14 -6
- package/src/tools/registry.ts +17 -7
- package/src/tools/schedule/create.ts +2 -2
- package/src/tools/schema-transforms.ts +7 -2
- package/src/tools/side-effects.ts +1 -0
- package/src/tools/skills/delete-managed.ts +4 -4
- package/src/tools/skills/execute.ts +1 -1
- package/src/tools/skills/scaffold-managed.ts +3 -2
- package/src/tools/subagent/notify-parent.ts +1 -1
- package/src/tools/subagent/spawn.ts +3 -3
- package/src/tools/system/request-permission.ts +2 -2
- package/src/tools/terminal/safe-env.ts +60 -1
- package/src/tools/terminal/shell.ts +44 -0
- package/src/tools/tool-manifest.ts +2 -0
- package/src/tools/types.ts +72 -21
- package/src/tools/ui-surface/definitions.ts +6 -5
- package/src/tts/__tests__/provider-adapters.test.ts +76 -2
- package/src/tts/providers/elevenlabs-provider.ts +75 -1
- package/src/types/onboarding-context.ts +2 -0
- package/src/usage/attribution.ts +3 -2
- package/src/util/errors.ts +17 -0
- package/src/util/platform.ts +10 -0
- package/src/util/pricing.ts +86 -160
- package/src/watcher/__tests__/engine.test.ts +323 -0
- package/src/watcher/constants.ts +7 -0
- package/src/watcher/engine.ts +94 -90
- package/src/workspace/migrations/046-seed-conversation-starters-callsite.ts +6 -9
- package/src/workspace/migrations/054-seed-recall-callsite.ts +10 -1
- package/src/workspace/migrations/057-repair-stale-gemini-model-ids.ts +94 -5
- package/src/workspace/migrations/069-seed-onboarding-threads.ts +8 -2
- package/src/workspace/migrations/072-seed-reply-suggestion-callsite.ts +117 -0
- package/src/workspace/migrations/073-repair-recall-callsite-empty-profile.ts +95 -0
- package/src/workspace/migrations/074-drop-deprecated-secret-detection-keys.ts +117 -0
- package/src/workspace/migrations/075-memory-v2-bm25-b-default-reembed.ts +61 -0
- package/src/workspace/migrations/076-drop-services-inference-mode.ts +62 -0
- package/src/workspace/migrations/077-seed-memory-router-callsite.ts +89 -0
- package/src/workspace/migrations/078-release-notes-tavily-web-search.ts +66 -0
- package/src/workspace/migrations/079-home-feed-notification-only.ts +197 -0
- package/src/workspace/migrations/080-restrict-vercel-api-token-metadata.ts +182 -0
- package/src/workspace/migrations/081-backfill-bash-allowed-tools-for-injection-credentials.ts +160 -0
- package/src/workspace/migrations/082-backfill-managed-profile-labels.ts +154 -0
- package/src/workspace/migrations/083-system-prompt-prefix-to-file.ts +191 -0
- package/src/workspace/migrations/084-remove-legacy-skills-index.ts +276 -0
- package/src/workspace/migrations/085-memory-v2-bm25-b-reembed-disabled-v2-pages.ts +137 -0
- package/src/workspace/migrations/086-revert-stale-gemini-mis-rewrites.ts +198 -0
- package/src/workspace/migrations/registry.ts +30 -0
- package/src/workspace/migrations/runner.ts +46 -5
- package/src/workspace/migrations/types.ts +17 -3
- package/src/workspace/provider-commit-message-generator.ts +3 -2
- package/examples/plugins/echo/bun.lock +0 -25
- package/src/__tests__/context-search-pkb-source.test.ts +0 -498
- package/src/__tests__/context-window-manager.test.ts +0 -2093
- package/src/__tests__/credentials-cli.test.ts +0 -1225
- package/src/__tests__/memory-admin-recall.test.ts +0 -213
- package/src/approvals/__tests__/guardian-feed-event.test.ts +0 -303
- package/src/cli/commands/__tests__/email-download.test.ts +0 -260
- package/src/cli/commands/__tests__/email-list.test.ts +0 -216
- package/src/cli/commands/__tests__/email-register.test.ts +0 -186
- package/src/cli/commands/__tests__/email-send.test.ts +0 -416
- package/src/cli/commands/__tests__/email-status.test.ts +0 -185
- package/src/cli/commands/__tests__/email-unregister.test.ts +0 -168
- package/src/cli/commands/__tests__/routes.test.ts +0 -562
- package/src/cli/commands/__tests__/stt-transcribe.test.ts +0 -454
- package/src/cli/commands/autonomy.ts +0 -365
- package/src/cli/commands/memory.ts +0 -424
- package/src/cli/commands/oauth/__tests__/connect.test.ts +0 -947
- package/src/cli/commands/oauth/__tests__/disconnect.test.ts +0 -686
- package/src/cli/commands/oauth/__tests__/mode.test.ts +0 -632
- package/src/cli/commands/oauth/__tests__/ping.test.ts +0 -631
- package/src/cli/commands/oauth/__tests__/providers-delete.test.ts +0 -573
- package/src/cli/commands/oauth/__tests__/providers-register.test.ts +0 -330
- package/src/cli/commands/oauth/__tests__/providers-update.test.ts +0 -521
- package/src/cli/commands/oauth/__tests__/status.test.ts +0 -551
- package/src/cli/commands/oauth/__tests__/token.test.ts +0 -420
- package/src/cli/lib/daemon-avatar-client.ts +0 -37
- package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +0 -87
- package/src/config/bundled-skills/messaging/tools/__tests__/messaging-feed-events.test.ts +0 -207
- package/src/context/__tests__/compact-prompt.test.ts +0 -63
- package/src/context/prompts/compact.md +0 -26
- package/src/daemon/__tests__/conversation-feed-event.test.ts +0 -304
- package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +0 -233
- package/src/home/__tests__/assistant-feed-authoring.test.ts +0 -156
- package/src/home/__tests__/emit-feed-event.test.ts +0 -169
- package/src/home/__tests__/feed-population-integration.test.ts +0 -312
- package/src/home/__tests__/feed-scheduler.test.ts +0 -222
- package/src/home/__tests__/phase5-exit-criteria.test.ts +0 -229
- package/src/home/__tests__/platform-gmail-digest.test.ts +0 -222
- package/src/home/__tests__/rollup-producer.test.ts +0 -507
- package/src/home/assistant-feed-authoring.ts +0 -135
- package/src/home/emit-feed-event.ts +0 -169
- package/src/home/feed-scheduler.ts +0 -281
- package/src/home/platform-gmail-digest.ts +0 -163
- package/src/home/rewrite-command-preview.ts +0 -66
- package/src/home/rewrite-feed-title.ts +0 -58
- package/src/home/rollup-producer.ts +0 -426
- package/src/memory/admin.ts +0 -326
- package/src/memory/context-search/sources/pkb.ts +0 -476
- package/src/memory/graph/compaction.ts +0 -299
- package/src/prompts/__tests__/build-cli-reference-section.test.ts +0 -37
- /package/src/cli/{commands → lib}/cache-fs.ts +0 -0
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ClickHouse-backed LLM request log read source.
|
|
3
|
+
*
|
|
4
|
+
* Reads from the ClickHouse mirror (populated out-of-band by the
|
|
5
|
+
* `mirror-llm-logs-to-clickhouse` cron). Scoped to the running
|
|
6
|
+
* assistant's own `assistant_id` — never cross-assistant. URL and
|
|
7
|
+
* password are resolved lazily from the credential store
|
|
8
|
+
* (`clickhouse:url`, `clickhouse:password`); database/table/user come
|
|
9
|
+
* from workspace config.
|
|
10
|
+
*
|
|
11
|
+
* Known limitation: the mirror is INSERT-only. A row inserted locally
|
|
12
|
+
* with `message_id = NULL` and backfilled later will appear in
|
|
13
|
+
* ClickHouse with `message_id = ''` forever. Reads via this source for
|
|
14
|
+
* the most-recent ~minute of activity therefore have lower fidelity
|
|
15
|
+
* than the local source. Acceptable for the "internal use while we
|
|
16
|
+
* finetune prompts" use case; revisit when mirror updates are added.
|
|
17
|
+
*/
|
|
18
|
+
import type { LlmRequestLogsClickHouseConfig } from "../config/schemas/llm-request-logs.js";
|
|
19
|
+
import { credentialKey } from "../security/credential-key.js";
|
|
20
|
+
import { getSecureKeyAsync } from "../security/secure-keys.js";
|
|
21
|
+
import { getLogger } from "../util/logger.js";
|
|
22
|
+
import {
|
|
23
|
+
getAssistantMessageIdsInTurn,
|
|
24
|
+
getMessageById,
|
|
25
|
+
messageMetadataSchema,
|
|
26
|
+
} from "./conversation-crud.js";
|
|
27
|
+
import type { LlmRequestLogSource } from "./llm-request-log-source.js";
|
|
28
|
+
import type { LogRow } from "./llm-request-log-store.js";
|
|
29
|
+
|
|
30
|
+
const log = getLogger("clickhouse-llm-request-log-source");
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Read a credential and normalize `undefined` → `null`. The credential
|
|
34
|
+
* resolver factories on this class are typed `() => Promise<string | null>`;
|
|
35
|
+
* `getSecureKeyAsync` returns `Promise<string | undefined>`. Keep the
|
|
36
|
+
* coercion in one place so TypeScript stays happy without per-call casts.
|
|
37
|
+
*/
|
|
38
|
+
async function readCredentialOrNull(
|
|
39
|
+
service: string,
|
|
40
|
+
field: string,
|
|
41
|
+
): Promise<string | null> {
|
|
42
|
+
const value = await getSecureKeyAsync(credentialKey(service, field));
|
|
43
|
+
return value ?? null;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Wire-format row returned by ClickHouse for our query columns. Note
|
|
48
|
+
* that `created_at` arrives as a string because Int64 is emitted as a
|
|
49
|
+
* quoted string under the default `output_format_json_quote_64bit_integers=1`
|
|
50
|
+
* setting; we coerce to `number` in `toLogRow`.
|
|
51
|
+
*/
|
|
52
|
+
interface ClickHouseRow {
|
|
53
|
+
id: string;
|
|
54
|
+
conversation_id: string;
|
|
55
|
+
message_id: string;
|
|
56
|
+
provider: string;
|
|
57
|
+
request_payload: string;
|
|
58
|
+
response_payload: string;
|
|
59
|
+
created_at: string;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** Injectable fetch override for tests. Defaults to globalThis.fetch. */
|
|
63
|
+
export type ClickHouseFetch = typeof fetch;
|
|
64
|
+
|
|
65
|
+
/** Minimal subset of the SQLite message row the fork-source fallback needs. */
|
|
66
|
+
export interface ClickHouseMessageRow {
|
|
67
|
+
metadata: string | null;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export interface ClickHouseLlmRequestLogSourceDeps {
|
|
71
|
+
/** Override the credential read for `clickhouse:url`. */
|
|
72
|
+
resolveUrl?: () => Promise<string | null>;
|
|
73
|
+
/** Override the credential read for `clickhouse:password`. */
|
|
74
|
+
resolvePassword?: () => Promise<string | null>;
|
|
75
|
+
/** Override the credential read for `vellum:platform_assistant_id`. */
|
|
76
|
+
resolveAssistantId?: () => Promise<string | null>;
|
|
77
|
+
/** Override the turn-id resolver (default: `getAssistantMessageIdsInTurn`). */
|
|
78
|
+
resolveTurnMessageIds?: (messageId: string) => string[];
|
|
79
|
+
/** Override the message lookup (default: `getMessageById`). */
|
|
80
|
+
resolveMessage?: (messageId: string) => ClickHouseMessageRow | null;
|
|
81
|
+
/** Override fetch for testing. */
|
|
82
|
+
fetchImpl?: ClickHouseFetch;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export class ClickHouseLlmRequestLogSource implements LlmRequestLogSource {
|
|
86
|
+
private cachedUrl: string | null = null;
|
|
87
|
+
private cachedPassword: string | null = null;
|
|
88
|
+
private cachedAssistantId: string | null = null;
|
|
89
|
+
|
|
90
|
+
private readonly resolveUrl: () => Promise<string | null>;
|
|
91
|
+
private readonly resolvePassword: () => Promise<string | null>;
|
|
92
|
+
private readonly resolveAssistantId: () => Promise<string | null>;
|
|
93
|
+
private readonly resolveTurnMessageIds: (messageId: string) => string[];
|
|
94
|
+
private readonly resolveMessage: (
|
|
95
|
+
messageId: string,
|
|
96
|
+
) => ClickHouseMessageRow | null;
|
|
97
|
+
private readonly fetchImpl: ClickHouseFetch;
|
|
98
|
+
|
|
99
|
+
constructor(
|
|
100
|
+
private readonly config: LlmRequestLogsClickHouseConfig,
|
|
101
|
+
deps: ClickHouseLlmRequestLogSourceDeps = {},
|
|
102
|
+
) {
|
|
103
|
+
this.resolveUrl =
|
|
104
|
+
deps.resolveUrl ?? (() => readCredentialOrNull("clickhouse", "url"));
|
|
105
|
+
this.resolvePassword =
|
|
106
|
+
deps.resolvePassword ??
|
|
107
|
+
(() => readCredentialOrNull("clickhouse", "password"));
|
|
108
|
+
this.resolveAssistantId =
|
|
109
|
+
deps.resolveAssistantId ??
|
|
110
|
+
(() => readCredentialOrNull("vellum", "platform_assistant_id"));
|
|
111
|
+
this.resolveTurnMessageIds =
|
|
112
|
+
deps.resolveTurnMessageIds ?? getAssistantMessageIdsInTurn;
|
|
113
|
+
this.resolveMessage = deps.resolveMessage ?? getMessageById;
|
|
114
|
+
this.fetchImpl = deps.fetchImpl ?? globalThis.fetch.bind(globalThis);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
async getRequestLogById(logId: string): Promise<LogRow | null> {
|
|
118
|
+
const aid = await this.assistantId();
|
|
119
|
+
const sql = `SELECT
|
|
120
|
+
id,
|
|
121
|
+
conversation_id,
|
|
122
|
+
message_id,
|
|
123
|
+
provider,
|
|
124
|
+
request_payload,
|
|
125
|
+
response_payload,
|
|
126
|
+
toUnixTimestamp64Milli(created_at) AS created_at
|
|
127
|
+
FROM ${this.tableRef()}
|
|
128
|
+
WHERE assistant_id = {assistant_id:String}
|
|
129
|
+
AND id = {log_id:String}
|
|
130
|
+
ORDER BY created_at DESC
|
|
131
|
+
LIMIT 1
|
|
132
|
+
FORMAT JSONEachRow`;
|
|
133
|
+
const rows = await this.exec(sql, { assistant_id: aid, log_id: logId });
|
|
134
|
+
return rows[0] ? this.toLogRow(rows[0]) : null;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
async getRequestLogsByMessageId(messageId: string): Promise<LogRow[]> {
|
|
138
|
+
const turnIds = this.resolveTurnMessageIds(messageId);
|
|
139
|
+
let rows = await this.selectByMessageIds(turnIds);
|
|
140
|
+
|
|
141
|
+
if (rows.length === 0) {
|
|
142
|
+
// Fork-source fallback. Mirror behavior of the local source: when no
|
|
143
|
+
// logs match the queried message's turn, see if it was forked from
|
|
144
|
+
// another and resolve that source's turn. The fork relationship lives
|
|
145
|
+
// in local SQLite (message.metadata.forkSourceMessageId), not CH.
|
|
146
|
+
const message = this.resolveMessage(messageId);
|
|
147
|
+
if (message?.metadata) {
|
|
148
|
+
try {
|
|
149
|
+
const parsed = messageMetadataSchema.safeParse(
|
|
150
|
+
JSON.parse(message.metadata),
|
|
151
|
+
);
|
|
152
|
+
const sourceMessageId =
|
|
153
|
+
parsed.success &&
|
|
154
|
+
typeof parsed.data.forkSourceMessageId === "string"
|
|
155
|
+
? parsed.data.forkSourceMessageId
|
|
156
|
+
: null;
|
|
157
|
+
if (sourceMessageId && sourceMessageId !== messageId) {
|
|
158
|
+
const sourceTurnIds = this.resolveTurnMessageIds(sourceMessageId);
|
|
159
|
+
rows = await this.selectByMessageIds(sourceTurnIds);
|
|
160
|
+
}
|
|
161
|
+
} catch {
|
|
162
|
+
// metadata not JSON / schema mismatch — no fork fallback, return []
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
return rows.sort(
|
|
168
|
+
(a, b) => a.createdAt - b.createdAt || a.id.localeCompare(b.id),
|
|
169
|
+
);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
private async selectByMessageIds(ids: string[]): Promise<LogRow[]> {
|
|
173
|
+
if (ids.length === 0) return [];
|
|
174
|
+
const aid = await this.assistantId();
|
|
175
|
+
// Bind each id as its own {id_N:String} placeholder. The IDs ultimately
|
|
176
|
+
// come from a caller-supplied path parameter — `getAssistantMessageIdsInTurn`
|
|
177
|
+
// passes the input straight through when the message lookup misses — so
|
|
178
|
+
// inline literal building (even with quote-doubling) is unsafe: ClickHouse
|
|
179
|
+
// honors `\'` as an escaped quote inside string literals, letting a
|
|
180
|
+
// backslash-suffixed id break out of the IN clause and bypass the
|
|
181
|
+
// `assistant_id` scope filter. Type-bound parameters carry value, not
|
|
182
|
+
// syntax, regardless of content.
|
|
183
|
+
const params: Record<string, string> = { assistant_id: aid };
|
|
184
|
+
const placeholders: string[] = [];
|
|
185
|
+
for (let i = 0; i < ids.length; i++) {
|
|
186
|
+
const key = `id_${i}`;
|
|
187
|
+
params[key] = ids[i]!;
|
|
188
|
+
placeholders.push(`{${key}:String}`);
|
|
189
|
+
}
|
|
190
|
+
const sql = `SELECT
|
|
191
|
+
id,
|
|
192
|
+
conversation_id,
|
|
193
|
+
message_id,
|
|
194
|
+
provider,
|
|
195
|
+
request_payload,
|
|
196
|
+
response_payload,
|
|
197
|
+
toUnixTimestamp64Milli(created_at) AS created_at
|
|
198
|
+
FROM ${this.tableRef()}
|
|
199
|
+
WHERE assistant_id = {assistant_id:String}
|
|
200
|
+
AND message_id IN (${placeholders.join(",")})
|
|
201
|
+
ORDER BY created_at ASC, id ASC
|
|
202
|
+
LIMIT 1 BY id
|
|
203
|
+
FORMAT JSONEachRow`;
|
|
204
|
+
const rows = await this.exec(sql, params);
|
|
205
|
+
return rows.map((r) => this.toLogRow(r));
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
private tableRef(): string {
|
|
209
|
+
// Database is set via the `database=` URL param in `exec`, so we only
|
|
210
|
+
// need to quote the table identifier here. Backtick-quote both to
|
|
211
|
+
// tolerate non-default names with special characters.
|
|
212
|
+
return `\`${this.config.table.replace(/`/g, "``")}\``;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
private async exec(
|
|
216
|
+
sql: string,
|
|
217
|
+
params: Record<string, string>,
|
|
218
|
+
): Promise<ClickHouseRow[]> {
|
|
219
|
+
const baseUrl = await this.url();
|
|
220
|
+
const password = await this.password();
|
|
221
|
+
|
|
222
|
+
let target: URL;
|
|
223
|
+
try {
|
|
224
|
+
target = new URL(baseUrl);
|
|
225
|
+
} catch (err) {
|
|
226
|
+
throw new Error(
|
|
227
|
+
`clickhouse:url is not a valid URL: ${err instanceof Error ? err.message : String(err)}`,
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
target.searchParams.set("database", this.config.database);
|
|
231
|
+
for (const [k, v] of Object.entries(params)) {
|
|
232
|
+
target.searchParams.set(`param_${k}`, v);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
const auth =
|
|
236
|
+
"Basic " +
|
|
237
|
+
Buffer.from(`${this.config.user}:${password}`, "utf8").toString("base64");
|
|
238
|
+
|
|
239
|
+
const res = await this.fetchImpl(target.toString(), {
|
|
240
|
+
method: "POST",
|
|
241
|
+
headers: { Authorization: auth, "Content-Type": "text/plain" },
|
|
242
|
+
body: sql,
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
if (!res.ok) {
|
|
246
|
+
const body = await res.text().catch(() => "");
|
|
247
|
+
log.error(
|
|
248
|
+
{ status: res.status, table: this.config.table, bodySnippet: body.slice(0, 200) },
|
|
249
|
+
"ClickHouse query failed",
|
|
250
|
+
);
|
|
251
|
+
throw new Error(
|
|
252
|
+
`ClickHouse query failed (HTTP ${res.status}): ${body.slice(0, 500)}`,
|
|
253
|
+
);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
const text = await res.text();
|
|
257
|
+
if (text.trim().length === 0) return [];
|
|
258
|
+
|
|
259
|
+
const rows: ClickHouseRow[] = [];
|
|
260
|
+
for (const line of text.split("\n")) {
|
|
261
|
+
const trimmed = line.trim();
|
|
262
|
+
if (trimmed.length === 0) continue;
|
|
263
|
+
try {
|
|
264
|
+
rows.push(JSON.parse(trimmed) as ClickHouseRow);
|
|
265
|
+
} catch (err) {
|
|
266
|
+
throw new Error(
|
|
267
|
+
`Failed to parse ClickHouse JSONEachRow line: ${err instanceof Error ? err.message : String(err)}`,
|
|
268
|
+
);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
return rows;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
private toLogRow(row: ClickHouseRow): LogRow {
|
|
275
|
+
return {
|
|
276
|
+
id: row.id,
|
|
277
|
+
conversationId: row.conversation_id,
|
|
278
|
+
// The mirror writes empty-string for missing message_id/provider
|
|
279
|
+
// because the CH table columns have `DEFAULT ''` (Nullable adds
|
|
280
|
+
// overhead). Map empty back to null to match the local LogRow shape.
|
|
281
|
+
messageId: row.message_id === "" ? null : row.message_id,
|
|
282
|
+
provider: row.provider === "" ? null : row.provider,
|
|
283
|
+
requestPayload: row.request_payload,
|
|
284
|
+
responsePayload: row.response_payload,
|
|
285
|
+
createdAt: Number(row.created_at),
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
private async assistantId(): Promise<string> {
|
|
290
|
+
if (this.cachedAssistantId) return this.cachedAssistantId;
|
|
291
|
+
const val = await this.resolveAssistantId();
|
|
292
|
+
if (!val) {
|
|
293
|
+
throw new Error(
|
|
294
|
+
"vellum:platform_assistant_id credential is required when readSource=clickhouse",
|
|
295
|
+
);
|
|
296
|
+
}
|
|
297
|
+
this.cachedAssistantId = val;
|
|
298
|
+
return val;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
private async url(): Promise<string> {
|
|
302
|
+
if (this.cachedUrl) return this.cachedUrl;
|
|
303
|
+
const val = await this.resolveUrl();
|
|
304
|
+
if (!val) {
|
|
305
|
+
throw new Error(
|
|
306
|
+
"clickhouse:url credential is required when readSource=clickhouse",
|
|
307
|
+
);
|
|
308
|
+
}
|
|
309
|
+
this.cachedUrl = val;
|
|
310
|
+
return val;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
private async password(): Promise<string> {
|
|
314
|
+
if (this.cachedPassword) return this.cachedPassword;
|
|
315
|
+
const val = await this.resolvePassword();
|
|
316
|
+
if (!val) {
|
|
317
|
+
throw new Error(
|
|
318
|
+
"clickhouse:password credential is required when readSource=clickhouse",
|
|
319
|
+
);
|
|
320
|
+
}
|
|
321
|
+
this.cachedPassword = val;
|
|
322
|
+
return val;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default LLM request log read source: thin async wrapper around the
|
|
3
|
+
* existing synchronous `llm-request-log-store.ts` functions.
|
|
4
|
+
*
|
|
5
|
+
* Keeps the local read path identical to its pre-pluggable behavior —
|
|
6
|
+
* including turn resolution, orphan/unlinked recovery, opportunistic
|
|
7
|
+
* backfill, and fork-source fallback. The wrapper exists only to satisfy
|
|
8
|
+
* the `LlmRequestLogSource` interface (which is `Promise`-returning so
|
|
9
|
+
* implementations with real I/O can fit).
|
|
10
|
+
*/
|
|
11
|
+
import type { LlmRequestLogSource } from "./llm-request-log-source.js";
|
|
12
|
+
import {
|
|
13
|
+
getRequestLogById,
|
|
14
|
+
getRequestLogsByMessageId,
|
|
15
|
+
type LogRow,
|
|
16
|
+
} from "./llm-request-log-store.js";
|
|
17
|
+
|
|
18
|
+
export class LocalLlmRequestLogSource implements LlmRequestLogSource {
|
|
19
|
+
async getRequestLogById(logId: string): Promise<LogRow | null> {
|
|
20
|
+
return getRequestLogById(logId);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
async getRequestLogsByMessageId(messageId: string): Promise<LogRow[]> {
|
|
24
|
+
return getRequestLogsByMessageId(messageId);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pluggable read source for LLM request logs.
|
|
3
|
+
*
|
|
4
|
+
* The Inspector view at `GET /v1/messages/:id/llm-context` (and the
|
|
5
|
+
* single-log payload route) historically read directly from the local
|
|
6
|
+
* SQLite `llm_request_logs` table via `llm-request-log-store.ts`. The
|
|
7
|
+
* source-of-truth remains local, but the *read path* is now configurable
|
|
8
|
+
* via `llmRequestLogs.readSource` in workspace config.
|
|
9
|
+
*
|
|
10
|
+
* - `local` (default): wraps the existing store functions verbatim.
|
|
11
|
+
* - `clickhouse`: queries the ClickHouse mirror (longer retention, but
|
|
12
|
+
* only sees rows the mirror cron has flushed). See
|
|
13
|
+
* `llm-request-log-source-clickhouse.ts`.
|
|
14
|
+
*
|
|
15
|
+
* Implementations are cheap to instantiate, so there's no module-level
|
|
16
|
+
* cache — each call resolves config fresh and constructs a new instance.
|
|
17
|
+
* Config edits take effect on the next request without an invalidation hook.
|
|
18
|
+
*/
|
|
19
|
+
import { getConfig } from "../config/loader.js";
|
|
20
|
+
import type { LogRow } from "./llm-request-log-store.js";
|
|
21
|
+
|
|
22
|
+
export interface LlmRequestLogSource {
|
|
23
|
+
/** Fetch a single log row by its primary key. Returns null if not found. */
|
|
24
|
+
getRequestLogById(logId: string): Promise<LogRow | null>;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Fetch every LLM request log associated with the given message,
|
|
28
|
+
* including all assistant messages in the same agent turn. Implementations
|
|
29
|
+
* MAY additionally apply orphan/unlinked/fork-source recovery — the
|
|
30
|
+
* local implementation does, the ClickHouse mirror does not (it is
|
|
31
|
+
* INSERT-only against the source-of-truth).
|
|
32
|
+
*/
|
|
33
|
+
getRequestLogsByMessageId(messageId: string): Promise<LogRow[]>;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Return the configured LLM request log source.
|
|
38
|
+
*
|
|
39
|
+
* The factory is async because both implementations are loaded via
|
|
40
|
+
* dynamic `import()` on first use. This is deliberate: it keeps the
|
|
41
|
+
* static module graph for `llm-request-log-source.ts` (and for
|
|
42
|
+
* everything that transitively imports it) free of
|
|
43
|
+
* `llm-request-log-store → conversation-crud → indexer → embedding-backend`,
|
|
44
|
+
* which would otherwise force test files that stub `embedding-backend.js`
|
|
45
|
+
* to also stub every export `indexer.ts` reaches for.
|
|
46
|
+
*
|
|
47
|
+
* Callers must `await` both the factory and the source methods.
|
|
48
|
+
*/
|
|
49
|
+
export async function getLlmRequestLogSource(): Promise<LlmRequestLogSource> {
|
|
50
|
+
const config = getConfig();
|
|
51
|
+
const cfg = config.llmRequestLogs ?? { readSource: "local" as const };
|
|
52
|
+
|
|
53
|
+
if (cfg.readSource === "clickhouse") {
|
|
54
|
+
const { ClickHouseLlmRequestLogSource } = await import(
|
|
55
|
+
"./llm-request-log-source-clickhouse.js"
|
|
56
|
+
);
|
|
57
|
+
return new ClickHouseLlmRequestLogSource(cfg.clickhouse);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const { LocalLlmRequestLogSource } = await import(
|
|
61
|
+
"./llm-request-log-source-local.js"
|
|
62
|
+
);
|
|
63
|
+
return new LocalLlmRequestLogSource();
|
|
64
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { and, asc, desc, eq, gt, or } from "drizzle-orm";
|
|
1
|
+
import { and, asc, desc, eq, gt, or, sql } from "drizzle-orm";
|
|
2
2
|
import { v4 as uuid } from "uuid";
|
|
3
3
|
|
|
4
4
|
import type {
|
|
@@ -8,7 +8,7 @@ import type {
|
|
|
8
8
|
} from "../usage/types.js";
|
|
9
9
|
import { getDb } from "./db-connection.js";
|
|
10
10
|
import { rawAll } from "./raw-query.js";
|
|
11
|
-
import { llmUsageEvents } from "./schema.js";
|
|
11
|
+
import { conversations, llmUsageEvents } from "./schema.js";
|
|
12
12
|
import {
|
|
13
13
|
bucketEventsByDay,
|
|
14
14
|
bucketEventsByHour,
|
|
@@ -123,15 +123,96 @@ export function listUsageEvents(options?: { limit?: number }): UsageEvent[] {
|
|
|
123
123
|
return rows.map(rowToUsageEvent);
|
|
124
124
|
}
|
|
125
125
|
|
|
126
|
+
/**
|
|
127
|
+
* Telemetry-flavoured `UsageEvent`: the persisted columns plus the two
|
|
128
|
+
* JOIN-computed conversation-level fields the reporter needs to emit
|
|
129
|
+
* for analytics (`avg turns per conversation`, `tokens on first turn`,
|
|
130
|
+
* foreground/background split on llm_usage rows themselves).
|
|
131
|
+
*
|
|
132
|
+
* Lives next to the query that produces it so the shape stays in lockstep
|
|
133
|
+
* with the SELECT; broader `UsageEvent` consumers stay untouched.
|
|
134
|
+
*/
|
|
135
|
+
export interface UnreportedUsageEvent extends UsageEvent {
|
|
136
|
+
/**
|
|
137
|
+
* Type of the parent conversation (`"standard"` / `"background"` /
|
|
138
|
+
* `"scheduled"`). Null when the LLM call has no `conversationId`
|
|
139
|
+
* (memory consolidation, background embedding work, etc.) and so no
|
|
140
|
+
* `conversations` row to join against.
|
|
141
|
+
*/
|
|
142
|
+
conversationType: string | null;
|
|
143
|
+
/**
|
|
144
|
+
* 1-indexed position of the user turn this LLM call belongs to within
|
|
145
|
+
* the parent conversation, counting only real user turns (tool-result
|
|
146
|
+
* rows persisted with role="user" are excluded — same filter as the
|
|
147
|
+
* turn-event eligibility predicate). Computed as the count of user
|
|
148
|
+
* messages with `created_at <= this LLM call's created_at` in the
|
|
149
|
+
* parent conversation. Null when there's no parent conversation, or
|
|
150
|
+
* when the LLM call fired before any user turn (rare — covers seed
|
|
151
|
+
* agent starts).
|
|
152
|
+
*/
|
|
153
|
+
turnIndex: number | null;
|
|
154
|
+
}
|
|
155
|
+
|
|
126
156
|
export function queryUnreportedUsageEvents(
|
|
127
157
|
afterCreatedAt: number,
|
|
128
158
|
afterId: string | undefined,
|
|
129
159
|
limit: number,
|
|
130
|
-
):
|
|
160
|
+
): UnreportedUsageEvent[] {
|
|
131
161
|
const db = getDb();
|
|
162
|
+
// JOIN to `conversations` to attach `conversationType`. LEFT JOIN
|
|
163
|
+
// because `llm_usage_events.conversationId` is nullable — calls that
|
|
164
|
+
// aren't tied to a conversation (memory consolidation, etc.) still
|
|
165
|
+
// need to flush through telemetry.
|
|
166
|
+
//
|
|
167
|
+
// `turnIndex` is a correlated subquery counting real user turns in
|
|
168
|
+
// the same conversation up to and including this LLM call's
|
|
169
|
+
// `created_at`. The filter mirrors `queryUnreportedTurnEvents` so the
|
|
170
|
+
// two indexes stay aligned: an LLM call fired during processing of
|
|
171
|
+
// turn N reports `turn_index = N`, matching what the turn event
|
|
172
|
+
// stream emitted for the triggering user message.
|
|
132
173
|
const rows = db
|
|
133
|
-
.select(
|
|
174
|
+
.select({
|
|
175
|
+
id: llmUsageEvents.id,
|
|
176
|
+
createdAt: llmUsageEvents.createdAt,
|
|
177
|
+
conversationId: llmUsageEvents.conversationId,
|
|
178
|
+
runId: llmUsageEvents.runId,
|
|
179
|
+
requestId: llmUsageEvents.requestId,
|
|
180
|
+
actor: llmUsageEvents.actor,
|
|
181
|
+
callSite: llmUsageEvents.callSite,
|
|
182
|
+
inferenceProfile: llmUsageEvents.inferenceProfile,
|
|
183
|
+
inferenceProfileSource: llmUsageEvents.inferenceProfileSource,
|
|
184
|
+
provider: llmUsageEvents.provider,
|
|
185
|
+
model: llmUsageEvents.model,
|
|
186
|
+
inputTokens: llmUsageEvents.inputTokens,
|
|
187
|
+
outputTokens: llmUsageEvents.outputTokens,
|
|
188
|
+
cacheCreationInputTokens: llmUsageEvents.cacheCreationInputTokens,
|
|
189
|
+
cacheReadInputTokens: llmUsageEvents.cacheReadInputTokens,
|
|
190
|
+
estimatedCostUsd: llmUsageEvents.estimatedCostUsd,
|
|
191
|
+
pricingStatus: llmUsageEvents.pricingStatus,
|
|
192
|
+
conversationType: conversations.conversationType,
|
|
193
|
+
// Null when conversationId is null (no parent conversation).
|
|
194
|
+
// Otherwise the count of eligible user turns up to and including
|
|
195
|
+
// this LLM call's createdAt. The COALESCE guard returns null
|
|
196
|
+
// (rather than 0) for the "no user turn yet" edge case so the
|
|
197
|
+
// analytics layer can distinguish "before-first-turn" LLM calls.
|
|
198
|
+
turnIndex: sql<number | null>`(
|
|
199
|
+
CASE WHEN ${llmUsageEvents.conversationId} IS NULL THEN NULL
|
|
200
|
+
ELSE (
|
|
201
|
+
SELECT COUNT(*) FROM messages AS m2
|
|
202
|
+
WHERE m2.conversation_id = ${llmUsageEvents.conversationId}
|
|
203
|
+
AND m2.role = 'user'
|
|
204
|
+
AND m2.content NOT LIKE '%"type":"tool\\_result"%' ESCAPE '\\'
|
|
205
|
+
AND m2.content NOT LIKE '%"type":"web\\_search\\_tool\\_result"%' ESCAPE '\\'
|
|
206
|
+
AND m2.created_at <= ${llmUsageEvents.createdAt}
|
|
207
|
+
)
|
|
208
|
+
END
|
|
209
|
+
)`.as("turn_index"),
|
|
210
|
+
})
|
|
134
211
|
.from(llmUsageEvents)
|
|
212
|
+
.leftJoin(
|
|
213
|
+
conversations,
|
|
214
|
+
eq(llmUsageEvents.conversationId, conversations.id),
|
|
215
|
+
)
|
|
135
216
|
.where(
|
|
136
217
|
afterId
|
|
137
218
|
? or(
|
|
@@ -146,7 +227,15 @@ export function queryUnreportedUsageEvents(
|
|
|
146
227
|
.orderBy(asc(llmUsageEvents.createdAt), asc(llmUsageEvents.id))
|
|
147
228
|
.limit(limit)
|
|
148
229
|
.all();
|
|
149
|
-
return rows.map(
|
|
230
|
+
return rows.map((row) => ({
|
|
231
|
+
...rowToUsageEvent(row),
|
|
232
|
+
conversationType: row.conversationType,
|
|
233
|
+
// SQLite returns COUNT(*) as 0 when no rows match; the CASE in the
|
|
234
|
+
// subquery already collapses the no-conversation case to NULL.
|
|
235
|
+
// Convert the integer column to `number | null` for the typed
|
|
236
|
+
// return value.
|
|
237
|
+
turnIndex: row.turnIndex === null ? null : Number(row.turnIndex),
|
|
238
|
+
}));
|
|
150
239
|
}
|
|
151
240
|
|
|
152
241
|
// ---------------------------------------------------------------------------
|
|
@@ -252,6 +341,37 @@ interface GroupRow {
|
|
|
252
341
|
event_count: number;
|
|
253
342
|
}
|
|
254
343
|
|
|
344
|
+
/**
|
|
345
|
+
* Return aggregate usage for a single conversation (e.g. a subagent).
|
|
346
|
+
*/
|
|
347
|
+
export function getConversationUsageTotals(conversationId: string): {
|
|
348
|
+
inputTokens: number;
|
|
349
|
+
outputTokens: number;
|
|
350
|
+
estimatedCost: number;
|
|
351
|
+
} {
|
|
352
|
+
const rows = rawAll<{
|
|
353
|
+
total_input: number;
|
|
354
|
+
total_output: number;
|
|
355
|
+
total_cost: number | null;
|
|
356
|
+
}>(
|
|
357
|
+
/*sql*/ `
|
|
358
|
+
SELECT
|
|
359
|
+
COALESCE(SUM(input_tokens + COALESCE(cache_creation_input_tokens, 0) + COALESCE(cache_read_input_tokens, 0)), 0) AS total_input,
|
|
360
|
+
COALESCE(SUM(output_tokens), 0) AS total_output,
|
|
361
|
+
COALESCE(SUM(estimated_cost_usd), 0) AS total_cost
|
|
362
|
+
FROM llm_usage_events
|
|
363
|
+
WHERE conversation_id = ?1
|
|
364
|
+
`,
|
|
365
|
+
conversationId,
|
|
366
|
+
);
|
|
367
|
+
const row = rows[0];
|
|
368
|
+
return {
|
|
369
|
+
inputTokens: row.total_input,
|
|
370
|
+
outputTokens: row.total_output,
|
|
371
|
+
estimatedCost: row.total_cost ?? 0,
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
|
|
255
375
|
/**
|
|
256
376
|
* Return aggregate totals for all usage events within the given time range.
|
|
257
377
|
*/
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sentinel value for the `source` column of memory-retrospective background
|
|
3
|
+
* conversations. Used both when creating them and when filtering them out of
|
|
4
|
+
* recursion / orphan-cleanup queries.
|
|
5
|
+
*/
|
|
6
|
+
export const MEMORY_RETROSPECTIVE_SOURCE = "memory-retrospective";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Dedicated `group_id` value for memory-retrospective background
|
|
10
|
+
* conversations. Placed under `system:background` alongside auto-analysis,
|
|
11
|
+
* heartbeat, and filing conversations.
|
|
12
|
+
*/
|
|
13
|
+
export const MEMORY_RETROSPECTIVE_GROUP_ID = "system:background";
|