@vellumai/assistant 0.8.6 → 0.8.7
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 +4 -4
- package/Dockerfile +1 -0
- package/bun.lock +11 -2
- package/docker-entrypoint.sh +8 -6
- package/docs/plugins.md +63 -28
- package/examples/plugins/echo/register.ts +4 -7
- package/knip.json +1 -0
- package/node_modules/@vellumai/environments/bun.lock +24 -0
- package/node_modules/@vellumai/environments/package.json +18 -0
- package/node_modules/@vellumai/environments/src/__tests__/package-boundary.test.ts +95 -0
- package/node_modules/@vellumai/environments/src/index.ts +11 -0
- package/node_modules/@vellumai/environments/src/seeds.ts +73 -0
- package/node_modules/@vellumai/environments/src/types.ts +70 -0
- package/node_modules/@vellumai/environments/tsconfig.json +20 -0
- package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +11 -0
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +3 -4
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +6 -2
- package/openapi.yaml +3735 -353
- package/package.json +7 -3
- package/scripts/generate-openapi.ts +20 -13
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +42 -80
- package/src/__tests__/agent-loop-exit-reason.test.ts +240 -39
- package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +141 -0
- package/src/__tests__/agent-loop-override-profile.test.ts +19 -32
- package/src/__tests__/agent-loop-provider-error-recording.test.ts +6 -4
- package/src/__tests__/agent-loop-thinking.test.ts +17 -12
- package/src/__tests__/agent-loop.test.ts +207 -341
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +4 -2
- package/src/__tests__/agent-wake-override-profile.test.ts +22 -40
- package/src/__tests__/anthropic-provider.test.ts +201 -55
- package/src/__tests__/app-builder-skill-instructions.test.ts +22 -0
- package/src/__tests__/app-control-flow.test.ts +5 -0
- package/src/__tests__/approval-cascade.test.ts +4 -11
- package/src/__tests__/approval-routes-http.test.ts +4 -2
- package/src/__tests__/assistant-event.test.ts +15 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +2 -2
- package/src/__tests__/avatar-e2e.test.ts +7 -37
- package/src/__tests__/avatar-generator.test.ts +12 -42
- package/src/__tests__/avatar-identity-sync.test.ts +28 -3
- package/src/__tests__/background-shell-bash.test.ts +3 -7
- package/src/__tests__/btw-routes.test.ts +7 -12
- package/src/__tests__/call-pointer-messages.test.ts +5 -3
- package/src/__tests__/call-site-routing-provider.test.ts +22 -40
- package/src/__tests__/catalog-files.test.ts +1 -0
- package/src/__tests__/channel-approval-routes.test.ts +48 -20
- package/src/__tests__/channel-approvals.test.ts +3 -1
- package/src/__tests__/channel-invite-transport.test.ts +1 -5
- package/src/__tests__/channel-readiness-routes.test.ts +0 -4
- package/src/__tests__/channel-readiness-slack-remote.test.ts +2 -7
- package/src/__tests__/channel-retry-sweep.test.ts +71 -79
- package/src/__tests__/circuit-breaker-pipeline.test.ts +3 -3
- package/src/__tests__/clawhub-files.test.ts +1 -0
- package/src/__tests__/compaction-events.test.ts +5 -17
- package/src/__tests__/compaction-pipeline.test.ts +1 -1
- package/src/__tests__/compaction-timeout-recovery.test.ts +37 -48
- package/src/__tests__/compaction-trail-store.test.ts +1 -79
- package/src/__tests__/compactor-image-manifest-trust.test.ts +112 -0
- package/src/__tests__/computer-use-tools.test.ts +2 -2
- package/src/__tests__/config-watcher.test.ts +28 -0
- package/src/__tests__/context-search-agent-runner.test.ts +6 -3
- package/src/__tests__/context-token-estimator.test.ts +34 -0
- package/src/__tests__/context-window-manager-compact-retry.test.ts +291 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +14 -7
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +3 -2
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +12 -27
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +430 -90
- package/src/__tests__/conversation-agent-loop.test.ts +581 -62
- package/src/__tests__/conversation-analysis-routes.test.ts +1 -3
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +1 -1
- package/src/__tests__/conversation-clear-safety.test.ts +20 -10
- package/src/__tests__/conversation-confirmation-signals.test.ts +15 -45
- package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
- package/src/__tests__/conversation-disk-view.test.ts +10 -17
- package/src/__tests__/conversation-fork-crud.test.ts +86 -172
- package/src/__tests__/conversation-fork-route.test.ts +16 -14
- package/src/__tests__/conversation-init.benchmark.test.ts +6 -6
- package/src/__tests__/conversation-lifecycle.test.ts +3 -2
- package/src/__tests__/conversation-load-history-repair.test.ts +3 -2
- package/src/__tests__/conversation-load-history-stripped.test.ts +1 -1
- package/src/__tests__/conversation-message-sync-tags.test.ts +3 -4
- package/src/__tests__/conversation-pairing.test.ts +34 -4
- package/src/__tests__/conversation-pre-run-repair.test.ts +1 -1
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +4 -0
- package/src/__tests__/conversation-process-callsite.test.ts +27 -30
- package/src/__tests__/conversation-provider-retry-repair.test.ts +53 -44
- package/src/__tests__/conversation-queue.test.ts +270 -164
- package/src/__tests__/conversation-routes-disk-view.test.ts +3 -2
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +2 -2
- package/src/__tests__/conversation-routes-slash-commands.test.ts +2 -2
- package/src/__tests__/conversation-runtime-assembly.test.ts +20 -22
- package/src/__tests__/conversation-runtime-workspace.test.ts +19 -1
- package/src/__tests__/conversation-slash-queue.test.ts +37 -31
- package/src/__tests__/conversation-slash-unknown.test.ts +13 -15
- package/src/__tests__/conversation-speed-override.test.ts +8 -22
- package/src/__tests__/conversation-stream-state.test.ts +484 -0
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +6 -15
- package/src/__tests__/conversation-surfaces-app-control.test.ts +32 -4
- package/src/__tests__/conversation-surfaces-state-update.test.ts +5 -2
- package/src/__tests__/conversation-surfaces-table-action.test.ts +6 -15
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +23 -11
- package/src/__tests__/conversation-unread-route.test.ts +14 -2
- package/src/__tests__/conversation-usage.test.ts +0 -2
- package/src/__tests__/conversation-wipe.test.ts +1 -1
- package/src/__tests__/conversation-workspace-cache-state.test.ts +3 -1
- package/src/__tests__/conversation-workspace-injection.test.ts +48 -22
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +27 -7
- package/src/__tests__/credential-execution-tools.test.ts +1 -2
- package/src/__tests__/credential-security-invariants.test.ts +0 -1
- package/src/__tests__/cross-provider-web-search.test.ts +6 -2
- package/src/__tests__/cu-unified-flow.test.ts +26 -1
- package/src/__tests__/db-schedule-syntax-migration.test.ts +11 -0
- package/src/__tests__/disk-pressure-guard.test.ts +66 -0
- package/src/__tests__/disk-pressure-routes.test.ts +9 -2
- package/src/__tests__/dm-persistence.test.ts +7 -2
- package/src/__tests__/dynamic-page-surface.test.ts +68 -0
- package/src/__tests__/edit-propagation.test.ts +1 -2
- package/src/__tests__/empty-response-pipeline.test.ts +127 -5
- package/src/__tests__/filing-service.test.ts +2 -2
- package/src/__tests__/first-greeting.test.ts +55 -14
- package/src/__tests__/gemini-inline-media.test.ts +78 -0
- package/src/__tests__/gemini-provider.test.ts +351 -28
- package/src/__tests__/guardian-routing-state.test.ts +60 -71
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +9 -7
- package/src/__tests__/heartbeat-disk-pressure.test.ts +1 -0
- package/src/__tests__/heartbeat-service.test.ts +2 -1
- package/src/__tests__/history-repair-hook.test.ts +161 -0
- package/src/__tests__/history-repair-observability.test.ts +1 -1
- package/src/__tests__/history-repair.test.ts +2 -1
- package/src/__tests__/host-app-control-proxy.test.ts +2 -0
- package/src/__tests__/host-cu-proxy.test.ts +2 -0
- package/src/__tests__/host-file-edit-tool.test.ts +4 -2
- package/src/__tests__/host-file-proxy.test.ts +31 -0
- package/src/__tests__/host-file-read-tool.test.ts +4 -2
- package/src/__tests__/host-file-write-tool.test.ts +9 -3
- package/src/__tests__/host-proxy-preactivation.test.ts +53 -14
- package/src/__tests__/host-shell-tool.test.ts +9 -4
- package/src/__tests__/http-user-message-parity.test.ts +2 -2
- package/src/__tests__/identity-intro-cache.test.ts +35 -14
- package/src/__tests__/inbound-slack-persistence.test.ts +7 -2
- package/src/__tests__/injector-background-turn.test.ts +1 -1
- package/src/__tests__/injector-chain.test.ts +1 -1
- package/src/__tests__/injector-disk-pressure.test.ts +1 -1
- package/src/__tests__/injector-document-comments.test.ts +1 -1
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +1 -1
- package/src/__tests__/injector-v3-suppression.test.ts +220 -0
- package/src/__tests__/list-messages-attachments.test.ts +7 -8
- package/src/__tests__/list-messages-hidden-metadata.test.ts +17 -15
- package/src/__tests__/list-messages-page-latest.test.ts +0 -1
- package/src/__tests__/list-messages-tool-merge.test.ts +36 -6
- package/src/__tests__/llm-call-pipeline.test.ts +21 -15
- package/src/__tests__/llm-request-log-turn-query.test.ts +42 -86
- package/src/__tests__/llm-resolver.test.ts +23 -47
- package/src/__tests__/llm-usage-store.test.ts +45 -0
- package/src/__tests__/log-export-routes.test.ts +59 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +1 -8
- package/src/__tests__/mcp-auth-routes.test.ts +15 -10
- package/src/__tests__/mcp-health-check.test.ts +18 -13
- package/src/__tests__/memory-retrieval-pipeline.test.ts +1 -1
- package/src/__tests__/memory-v2-static-injector.test.ts +1 -1
- package/src/__tests__/messaging-send-tool.test.ts +8 -4
- package/src/__tests__/migration-export-http.test.ts +12 -12
- package/src/__tests__/migration-import-commit-http.test.ts +8 -8
- package/src/__tests__/migration-import-preflight-http.test.ts +7 -7
- package/src/__tests__/migration-validate-http.test.ts +3 -3
- package/src/__tests__/native-web-search.test.ts +14 -20
- package/src/__tests__/notification-decision-identity.test.ts +9 -18
- package/src/__tests__/notification-decision-recipient-context.test.ts +3 -6
- package/src/__tests__/oauth-commands-routes.test.ts +1 -1
- package/src/__tests__/onboarding-template-contract.test.ts +10 -0
- package/src/__tests__/openai-provider.test.ts +66 -70
- package/src/__tests__/openai-responses-provider.test.ts +21 -77
- package/src/__tests__/outbound-slack-persistence.test.ts +2 -1
- package/src/__tests__/overflow-reduce-pipeline.test.ts +2 -4
- package/src/__tests__/parallel-tool.benchmark.test.ts +24 -36
- package/src/__tests__/persistence-pipeline.test.ts +15 -26
- package/src/__tests__/persistence-secret-redaction.test.ts +2 -1
- package/src/__tests__/pipeline-runner.test.ts +2 -3
- package/src/__tests__/plugin-bootstrap.test.ts +51 -25
- package/src/__tests__/plugin-route-contribution.test.ts +6 -16
- package/src/__tests__/plugin-skill-contribution.test.ts +7 -17
- package/src/__tests__/plugin-tool-contribution.test.ts +10 -26
- package/src/__tests__/plugin-types.test.ts +7 -14
- package/src/__tests__/prechat-onboarding-contract.test.ts +23 -0
- package/src/__tests__/process-message-background-slack.test.ts +17 -16
- package/src/__tests__/process-message-display-content.test.ts +30 -42
- package/src/__tests__/provider-commit-message-generator.test.ts +19 -14
- package/src/__tests__/provider-error-scenarios.test.ts +7 -6
- package/src/__tests__/provider-platform-proxy-integration.test.ts +3 -8
- package/src/__tests__/provider-send-message-override-profile.test.ts +9 -25
- package/src/__tests__/provider-streaming.benchmark.test.ts +12 -22
- package/src/__tests__/provider-usage-tracking.test.ts +0 -6
- package/src/__tests__/ratelimit.test.ts +9 -4
- package/src/__tests__/relay-server.test.ts +20 -13
- package/src/__tests__/retry-openrouter-only-normalization.test.ts +5 -8
- package/src/__tests__/retry-thinking-tool-choice.test.ts +10 -13
- package/src/__tests__/retry-verbosity-normalization.test.ts +5 -8
- package/src/__tests__/runtime-events-sse-reconnect.test.ts +353 -0
- package/src/__tests__/schedule-routes.test.ts +80 -10
- package/src/__tests__/schedule-store.test.ts +67 -0
- package/src/__tests__/schedule-tools.test.ts +125 -0
- package/src/__tests__/secret-ingress-http.test.ts +2 -2
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +11 -7
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +11 -9
- package/src/__tests__/secret-response-routing.test.ts +13 -11
- package/src/__tests__/send-endpoint-busy.test.ts +2 -1
- package/src/__tests__/shell-observability.test.ts +249 -0
- package/src/__tests__/skill-feature-flags-integration.test.ts +11 -11
- package/src/__tests__/skill-feature-flags.test.ts +6 -6
- package/src/__tests__/skill-load-feature-flag.test.ts +10 -10
- package/src/__tests__/skills-files-catalog-fallback.test.ts +10 -0
- package/src/__tests__/skillssh-files.test.ts +1 -0
- package/src/__tests__/starter-task-flow.test.ts +6 -6
- package/src/__tests__/strip-memory-injections.test.ts +102 -14
- package/src/__tests__/subagent-call-site-routing.test.ts +2 -2
- package/src/__tests__/suggestion-routes.test.ts +3 -3
- package/src/__tests__/sync-message-contract.test.ts +19 -16
- package/src/__tests__/system-prompt.test.ts +54 -0
- package/src/__tests__/terminal-tools.test.ts +3 -24
- package/src/__tests__/thread-backfill.test.ts +4 -9
- package/src/__tests__/title-generate-pipeline.test.ts +1 -1
- package/src/__tests__/token-estimate-pipeline.test.ts +2 -4
- package/src/__tests__/tool-error-pipeline.test.ts +2 -2
- package/src/__tests__/tool-execute-pipeline.test.ts +1 -1
- package/src/__tests__/tool-preview-lifecycle.test.ts +13 -11
- package/src/__tests__/tool-result-truncate-pipeline.test.ts +9 -12
- package/src/__tests__/tool-result-truncation.test.ts +3 -1
- package/src/__tests__/tools-audio-read.test.ts +113 -0
- package/src/__tests__/turn-boundary-resolution.test.ts +44 -84
- package/src/__tests__/turn-events-store.test.ts +11 -7
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +8 -6
- package/src/__tests__/voice-session-bridge.test.ts +13 -7
- package/src/acp/__tests__/prepare-agent-env.test.ts +143 -31
- package/src/acp/prepare-agent-env.ts +52 -11
- package/src/agent/compaction-circuit.ts +140 -0
- package/src/agent/loop.ts +409 -85
- package/src/api/README.md +19 -17
- package/src/api/constants/tool-execution.ts +21 -0
- package/src/api/events/assistant-activity-state.ts +75 -0
- package/src/api/events/assistant-outbound-attachment.ts +25 -27
- package/src/api/events/assistant-text-delta.ts +6 -8
- package/src/api/events/assistant-turn-start.ts +5 -7
- package/src/api/events/avatar-updated.ts +24 -0
- package/src/api/events/compaction-circuit-closed.ts +26 -0
- package/src/api/events/compaction-circuit-open.ts +28 -0
- package/src/api/events/confirmation-request.ts +114 -0
- package/src/api/events/contact-request.ts +33 -0
- package/src/api/events/conversation-error.ts +77 -0
- package/src/api/events/conversation-list-invalidated.ts +38 -0
- package/src/api/events/conversation-title-updated.ts +24 -0
- package/src/api/events/disk-pressure-status-changed.ts +61 -0
- package/src/api/events/document-comment-created.ts +24 -28
- package/src/api/events/document-comment-deleted.ts +6 -8
- package/src/api/events/document-comment-reopened.ts +6 -8
- package/src/api/events/document-comment-resolved.ts +8 -10
- package/src/api/events/document-editor-update.ts +27 -0
- package/src/api/events/error.ts +32 -0
- package/src/api/events/generation-cancelled.ts +4 -6
- package/src/api/events/generation-handoff.ts +13 -15
- package/src/api/events/home-feed-updated.ts +26 -0
- package/src/api/events/identity-changed.ts +32 -0
- package/src/api/events/interaction-resolved.ts +50 -0
- package/src/api/events/message-complete.ts +10 -12
- package/src/api/events/message-dequeued.ts +21 -0
- package/src/api/events/message-queued-deleted.ts +23 -0
- package/src/api/events/message-queued.ts +22 -0
- package/src/api/events/message-request-complete.ts +29 -0
- package/src/api/events/navigate-settings.ts +20 -0
- package/src/api/events/notification-intent.ts +33 -0
- package/src/api/events/open-url.ts +6 -8
- package/src/api/events/question-request.ts +67 -0
- package/src/api/events/relationship-state-updated.ts +4 -6
- package/src/api/events/secret-request.ts +42 -0
- package/src/api/events/subagent-event.ts +79 -0
- package/src/api/events/subagent-spawned.ts +40 -0
- package/src/api/events/subagent-status-changed.ts +65 -0
- package/src/api/events/sync-changed.ts +29 -0
- package/src/api/events/tool-result.ts +129 -0
- package/src/api/events/tool-use-start.ts +8 -10
- package/src/api/events/turn-profile-auto-routed.ts +28 -0
- package/src/api/events/ui-surface-complete.ts +30 -0
- package/src/api/events/ui-surface-dismiss.ts +22 -0
- package/src/api/events/ui-surface-show.ts +67 -0
- package/src/api/events/ui-surface-update.ts +26 -0
- package/src/api/events/usage-update.ts +34 -0
- package/src/api/events/user-message-echo.ts +35 -0
- package/src/api/index.ts +354 -0
- package/src/api/requests/dictation.ts +45 -0
- package/src/api/responses/disk-pressure-status.ts +26 -0
- package/src/api/responses/home.ts +217 -0
- package/src/api/responses/llm-context-response.ts +2 -0
- package/src/api/responses/memory-v3-selection-log.ts +50 -0
- package/src/api/responses/subagent-detail.ts +48 -0
- package/src/approvals/guardian-decision-primitive.ts +7 -15
- package/src/approvals/guardian-request-resolvers.ts +6 -9
- package/src/avatar/__tests__/avatar-manifest.test.ts +236 -0
- package/src/avatar/__tests__/avatar-store.test.ts +193 -0
- package/src/avatar/avatar-manifest.ts +195 -0
- package/src/avatar/avatar-store.ts +113 -0
- package/src/avatar/traits-png-sync.ts +8 -2
- package/src/background-wake/next-wake.test.ts +31 -1
- package/src/background-wake/next-wake.ts +4 -1
- package/src/calls/call-conversation-messages.ts +6 -4
- package/src/calls/guardian-action-sweep.ts +6 -4
- package/src/calls/relay-server.ts +12 -8
- package/src/calls/voice-session-bridge.ts +13 -27
- package/src/cli/commands/__tests__/memory-v3.test.ts +245 -0
- package/src/cli/commands/avatar.ts +17 -11
- package/src/cli/commands/conversations.ts +15 -1
- package/src/cli/commands/db/__tests__/repair.test.ts +540 -0
- package/src/cli/commands/db/__tests__/status.test.ts +253 -0
- package/src/cli/commands/db/format.ts +48 -0
- package/src/cli/commands/db/index.ts +29 -0
- package/src/cli/commands/db/repair-step-conversation-backfill.ts +345 -0
- package/src/cli/commands/db/repair-step-integrity.ts +146 -0
- package/src/cli/commands/db/repair-steps.ts +164 -0
- package/src/cli/commands/db/repair.ts +141 -0
- package/src/cli/commands/db/status.ts +366 -0
- package/src/cli/commands/memory-v3.ts +159 -445
- package/src/cli/lib/cli-colors.ts +24 -6
- package/src/cli/program.ts +4 -5
- package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
- package/src/config/assistant-feature-flags.ts +2 -2
- package/src/config/bundled-skills/app-builder/SKILL.md +14 -3
- package/src/config/bundled-skills/media-processing/services/reduce.ts +6 -9
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +7 -2
- package/src/config/bundled-skills/schedule/SKILL.md +1 -1
- package/src/config/bundled-skills/schedule/TOOLS.json +8 -0
- package/src/config/call-site-defaults.ts +2 -7
- package/src/config/feature-flag-registry.json +25 -9
- package/src/config/schemas/__tests__/memory-v2.test.ts +1 -226
- package/src/config/schemas/call-site-catalog.ts +8 -15
- package/src/config/schemas/llm.ts +2 -3
- package/src/config/schemas/memory-lifecycle.ts +24 -0
- package/src/config/schemas/memory-v2.ts +0 -253
- package/src/config/schemas/memory-v3.ts +39 -0
- package/src/config/schemas/memory.ts +6 -1
- package/src/config/schemas/timeouts.ts +3 -1
- package/src/context/compactor.ts +54 -31
- package/src/context/token-estimator.ts +19 -0
- package/src/context/tool-result-truncation.ts +1 -43
- package/src/context/window-manager.ts +138 -20
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +2 -2
- package/src/daemon/__tests__/web-search-status-text.test.ts +10 -6
- package/src/daemon/approval-generators.ts +4 -4
- package/src/daemon/config-watcher.ts +7 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +225 -88
- package/src/daemon/conversation-agent-loop.ts +284 -584
- package/src/daemon/conversation-error.ts +7 -7
- package/src/daemon/conversation-history.ts +22 -6
- package/src/daemon/conversation-launch.ts +4 -8
- package/src/daemon/conversation-lifecycle.ts +10 -38
- package/src/daemon/conversation-messaging.ts +1 -3
- package/src/daemon/conversation-notifiers.ts +7 -5
- package/src/daemon/conversation-process.ts +100 -79
- package/src/daemon/conversation-runtime-assembly.ts +47 -21
- package/src/daemon/conversation-store.ts +6 -5
- package/src/daemon/conversation-surfaces.ts +55 -69
- package/src/daemon/conversation-tool-setup.ts +3 -0
- package/src/daemon/conversation.ts +91 -126
- package/src/daemon/daemon-skill-host.ts +2 -6
- package/src/daemon/disk-pressure-guard.ts +35 -29
- package/src/daemon/external-plugins-bootstrap.ts +46 -24
- package/src/daemon/first-greeting.ts +26 -4
- package/src/daemon/guardian-action-generators.ts +2 -2
- package/src/daemon/handlers/conversations.ts +6 -22
- package/src/daemon/handlers/shared.ts +4 -0
- package/src/daemon/handlers/skills.ts +15 -14
- package/src/daemon/host-app-control-proxy.ts +54 -1
- package/src/daemon/host-cu-proxy.ts +46 -22
- package/src/daemon/host-file-proxy.ts +25 -1
- package/src/daemon/host-proxy-preactivation.ts +25 -6
- package/src/daemon/lifecycle.ts +28 -55
- package/src/daemon/message-protocol.ts +2 -3
- package/src/daemon/message-provenance.ts +49 -0
- package/src/daemon/message-types/contacts.ts +3 -20
- package/src/daemon/message-types/conversations.ts +13 -111
- package/src/daemon/message-types/documents.ts +3 -9
- package/src/daemon/message-types/home.ts +4 -17
- package/src/daemon/message-types/integrations.ts +2 -6
- package/src/daemon/message-types/messages.ts +28 -343
- package/src/daemon/message-types/notifications.ts +2 -32
- package/src/daemon/message-types/settings.ts +3 -8
- package/src/daemon/message-types/skills.ts +2 -0
- package/src/daemon/message-types/surfaces.ts +2 -0
- package/src/daemon/message-types/sync.ts +12 -25
- package/src/daemon/message-types/workspace.ts +3 -11
- package/src/daemon/process-message.ts +49 -46
- package/src/daemon/server.ts +12 -0
- package/src/daemon/tool-side-effects.ts +10 -7
- package/src/daemon/trust-context.ts +13 -0
- package/src/daemon/wake-target-adapter.ts +11 -1
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +3 -1
- package/src/heartbeat/heartbeat-run-store.ts +31 -0
- package/src/heartbeat/heartbeat-service.ts +16 -0
- package/src/home/feature-gate.ts +22 -0
- package/src/home/feed-types.ts +36 -221
- package/src/ipc/__tests__/email-ipc.test.ts +0 -9
- package/src/ipc/routes/__tests__/route-adapter.test.ts +244 -0
- package/src/ipc/routes/route-adapter.ts +45 -6
- package/src/ipc/skill-routes/__tests__/memory.test.ts +18 -9
- package/src/ipc/skill-routes/__tests__/providers.test.ts +10 -10
- package/src/ipc/skill-routes/__tests__/registries.test.ts +28 -18
- package/src/ipc/skill-routes/memory.ts +26 -13
- package/src/ipc/skill-routes/providers.ts +5 -6
- package/src/ipc/skill-routes/registries.ts +13 -61
- package/src/live-voice/__tests__/live-voice-archive.test.ts +24 -11
- package/src/memory/__tests__/conversation-queries.test.ts +192 -8
- package/src/memory/__tests__/db-maintenance.test.ts +128 -0
- package/src/memory/__tests__/jobs-store-job-classes.test.ts +5 -4
- package/src/memory/__tests__/memory-retrospective-job.test.ts +10 -6
- package/src/memory/__tests__/memory-v3-selections-migration.test.ts +103 -0
- package/src/memory/context-search/agent-runner.ts +2 -4
- package/src/memory/conversation-crud.ts +39 -8
- package/src/memory/conversation-queries.ts +78 -22
- package/src/memory/db-init.ts +8 -0
- package/src/memory/db-maintenance.ts +18 -2
- package/src/memory/graph/consolidation.ts +8 -11
- package/src/memory/graph/conversation-graph-memory.ts +41 -8
- package/src/memory/graph/extraction.ts +6 -9
- package/src/memory/graph/narrative.ts +2 -2
- package/src/memory/graph/pattern-scan.ts +2 -2
- package/src/memory/graph/retriever.ts +20 -26
- package/src/memory/graph/tools.ts +4 -4
- package/src/memory/job-handlers/conversation-starters.ts +32 -32
- package/src/memory/job-handlers/summarization.ts +1 -2
- package/src/memory/jobs-store.ts +3 -1
- package/src/memory/jobs-worker.ts +51 -39
- package/src/memory/llm-request-log-source-clickhouse.ts +5 -31
- package/src/memory/llm-request-log-source-local.ts +0 -11
- package/src/memory/llm-request-log-source.ts +9 -25
- package/src/memory/llm-request-log-store.ts +0 -41
- package/src/memory/llm-usage-store.ts +10 -0
- package/src/memory/memory-marker.ts +17 -0
- package/src/memory/memory-retrospective-job.ts +6 -2
- package/src/memory/memory-v2-activation-log-store.ts +1 -83
- package/src/memory/migrations/267-llm-usage-events-add-assistant-version.ts +46 -0
- package/src/memory/migrations/268-add-memory-v3-selections.ts +28 -0
- package/src/memory/migrations/269-schedule-script-timeout.ts +11 -0
- package/src/memory/migrations/270-messages-role-created-at-index.ts +18 -0
- package/src/memory/migrations/__tests__/267-llm-usage-events-add-assistant-version.test.ts +117 -0
- package/src/memory/migrations/index.ts +4 -0
- package/src/memory/schema/infrastructure.ts +11 -0
- package/src/memory/v2/__tests__/consolidation-job.test.ts +124 -0
- package/src/memory/v2/__tests__/migration.test.ts +11 -3
- package/src/memory/v2/__tests__/page-index.test.ts +37 -1
- package/src/memory/v2/__tests__/router.test.ts +14 -4
- package/src/memory/v2/__tests__/sweep-job.test.ts +6 -5
- package/src/memory/v2/backfill-jobs.ts +6 -0
- package/src/memory/v2/consolidation-job.ts +89 -9
- package/src/memory/v2/migration.ts +5 -3
- package/src/memory/v2/page-index.ts +11 -0
- package/src/memory/v2/router.ts +8 -11
- package/src/memory/v2/sweep-job.ts +8 -11
- package/src/memory/v2/types.ts +1 -0
- package/src/memory/v3/__tests__/assign.test.ts +242 -0
- package/src/memory/v3/__tests__/capabilities.test.ts +118 -0
- package/src/memory/v3/__tests__/core.test.ts +39 -0
- package/src/memory/v3/__tests__/fixtures/eval-turns.json +36 -0
- package/src/memory/v3/__tests__/fixtures/live-turns.json +37 -0
- package/src/memory/v3/__tests__/health.test.ts +203 -0
- package/src/memory/v3/__tests__/live-integration.test.ts +330 -0
- package/src/memory/v3/__tests__/maintain-job.test.ts +288 -0
- package/src/memory/v3/__tests__/needle.test.ts +107 -0
- package/src/memory/v3/__tests__/orchestrate.test.ts +400 -0
- package/src/memory/v3/__tests__/reconcile.test.ts +274 -0
- package/src/memory/v3/__tests__/render-injection.test.ts +61 -0
- package/src/memory/v3/__tests__/router.test.ts +260 -0
- package/src/memory/v3/__tests__/selection-log-store.test.ts +179 -0
- package/src/memory/v3/__tests__/selector.test.ts +404 -0
- package/src/memory/v3/__tests__/shadow-plugin.test.ts +414 -0
- package/src/memory/v3/__tests__/snapshot.test.ts +168 -0
- package/src/memory/v3/__tests__/tree.test.ts +192 -0
- package/src/memory/v3/__tests__/types.test.ts +54 -0
- package/src/memory/v3/__tests__/working-set-eviction.test.ts +106 -0
- package/src/memory/v3/__tests__/working-set-skeleton.test.ts +44 -0
- package/src/memory/v3/assign.ts +268 -0
- package/src/memory/v3/capabilities.ts +124 -0
- package/src/memory/v3/core.ts +26 -0
- package/src/memory/v3/data/README.md +84 -0
- package/src/memory/v3/data/assignments.json +5 -0
- package/src/memory/v3/data/core.json +1 -0
- package/src/memory/v3/data/leaves/domain-a/topic-x.md +9 -0
- package/src/memory/v3/data/leaves/domain-a/topic-y.md +9 -0
- package/src/memory/v3/data/leaves/domain-b/topic-z.md +9 -0
- package/src/memory/v3/health.ts +0 -0
- package/src/memory/v3/maintain-job.ts +314 -0
- package/src/memory/v3/needle.ts +115 -0
- package/src/memory/v3/orchestrate.ts +114 -0
- package/src/memory/v3/page-content.ts +34 -0
- package/src/memory/v3/provider-blocks.ts +16 -0
- package/src/memory/v3/reconcile.ts +523 -0
- package/src/memory/v3/render-injection.ts +32 -0
- package/src/memory/v3/router.ts +184 -0
- package/src/memory/v3/selection-log-store.ts +84 -0
- package/src/memory/v3/selector.ts +211 -0
- package/src/memory/v3/shadow-plugin.ts +379 -0
- package/src/memory/v3/snapshot.ts +209 -0
- package/src/memory/v3/tree.ts +174 -0
- package/src/memory/v3/types.ts +46 -60
- package/src/memory/v3/working-set.ts +88 -0
- package/src/messaging/providers/slack/render-transcript.test.ts +1 -1
- package/src/messaging/providers/slack/render-transcript.ts +2 -2
- package/src/messaging/style-analyzer.ts +8 -11
- package/src/notifications/conversation-pairing.ts +8 -6
- package/src/notifications/decision-engine.ts +10 -13
- package/src/notifications/preference-extractor.ts +11 -14
- package/src/permissions/prompter.ts +42 -36
- package/src/permissions/question-prompter.test.ts +35 -26
- package/src/permissions/question-prompter.ts +6 -10
- package/src/plugin-api/index.ts +2 -0
- package/src/plugin-api/types.ts +25 -3
- package/src/plugins/defaults/circuit-breaker/middlewares/circuitBreaker.ts +93 -0
- package/src/plugins/defaults/circuit-breaker/package.json +15 -0
- package/src/plugins/defaults/circuit-breaker/register.ts +39 -0
- package/src/plugins/defaults/compaction/middlewares/compaction.ts +25 -0
- package/src/plugins/defaults/compaction/package.json +15 -0
- package/src/plugins/defaults/compaction/register.ts +35 -0
- package/src/plugins/defaults/compaction/terminal.ts +73 -0
- package/src/plugins/defaults/empty-response/middlewares/emptyResponse.ts +22 -0
- package/src/plugins/defaults/empty-response/package.json +15 -0
- package/src/plugins/defaults/empty-response/register.ts +28 -0
- package/src/plugins/defaults/empty-response/terminal.ts +106 -0
- package/src/plugins/defaults/history-repair/hooks/user-prompt-submit.ts +35 -0
- package/src/plugins/defaults/history-repair/package.json +15 -0
- package/src/plugins/defaults/history-repair/register.ts +24 -0
- package/src/{daemon/history-repair.ts → plugins/defaults/history-repair/terminal.ts} +48 -35
- package/src/plugins/defaults/index.ts +29 -40
- package/src/plugins/defaults/injectors/package.json +15 -0
- package/src/plugins/defaults/{injectors.ts → injectors/register.ts} +14 -38
- package/src/plugins/defaults/llm-call/middlewares/llmCall.ts +17 -0
- package/src/plugins/defaults/llm-call/package.json +15 -0
- package/src/plugins/defaults/{llm-call.ts → llm-call/register.ts} +6 -38
- package/src/plugins/defaults/memory-retrieval/middlewares/memoryRetrieval.ts +17 -0
- package/src/plugins/defaults/memory-retrieval/package.json +15 -0
- package/src/plugins/defaults/{memory-retrieval.ts → memory-retrieval/register.ts} +10 -48
- package/src/plugins/defaults/{overflow-reduce.ts → overflow-reduce/middlewares/overflowReduce.ts} +18 -77
- package/src/plugins/defaults/overflow-reduce/package.json +15 -0
- package/src/plugins/defaults/overflow-reduce/register.ts +42 -0
- package/src/plugins/defaults/persistence/middlewares/persistence.ts +19 -0
- package/src/plugins/defaults/persistence/package.json +15 -0
- package/src/plugins/defaults/persistence/register.ts +38 -0
- package/src/plugins/defaults/persistence/terminal.ts +83 -0
- package/src/plugins/defaults/title-generate/package.json +15 -0
- package/src/plugins/defaults/title-generate/register.ts +35 -0
- package/src/plugins/defaults/title-generate/terminal.ts +31 -0
- package/src/plugins/defaults/token-estimate/middlewares/tokenEstimate.ts +23 -0
- package/src/plugins/defaults/token-estimate/package.json +15 -0
- package/src/plugins/defaults/token-estimate/register.ts +34 -0
- package/src/plugins/defaults/token-estimate/terminal.ts +40 -0
- package/src/plugins/defaults/tool-error/middlewares/toolError.ts +21 -0
- package/src/plugins/defaults/tool-error/package.json +15 -0
- package/src/plugins/defaults/tool-error/register.ts +35 -0
- package/src/plugins/defaults/tool-error/terminal.ts +47 -0
- package/src/plugins/defaults/tool-execute/middlewares/toolExecute.ts +23 -0
- package/src/plugins/defaults/tool-execute/package.json +15 -0
- package/src/plugins/defaults/{tool-execute.ts → tool-execute/register.ts} +8 -46
- package/src/plugins/defaults/tool-result-truncate/middlewares/toolResultTruncate.ts +23 -0
- package/src/plugins/defaults/tool-result-truncate/package.json +15 -0
- package/src/plugins/defaults/tool-result-truncate/register.ts +35 -0
- package/src/plugins/defaults/tool-result-truncate/terminal.ts +113 -0
- package/src/plugins/defaults/tool-result-truncate/types.ts +22 -0
- package/src/plugins/external-plugin-loader.ts +2 -2
- package/src/plugins/pipeline.ts +0 -12
- package/src/plugins/types.ts +51 -90
- package/src/plugins/user-loader.ts +4 -3
- package/src/proactive-artifact/aux-message-injector.ts +0 -1
- package/src/proactive-artifact/job.test.ts +20 -8
- package/src/proactive-artifact/job.ts +3 -1
- package/src/prompts/sections.ts +20 -7
- package/src/prompts/templates/BOOTSTRAP-CONTENT-AUTOMATION.md +2 -2
- package/src/prompts/templates/BOOTSTRAP.md +5 -1
- package/src/prompts/templates/system-sections.ts +6 -0
- package/src/providers/__tests__/retry-callsite.test.ts +25 -25
- package/src/providers/__tests__/satellite-connection-routing.test.ts +7 -21
- package/src/providers/anthropic/client.ts +24 -5
- package/src/providers/call-site-routing.ts +1 -9
- package/src/providers/gemini/client.ts +152 -34
- package/src/providers/gemini/inline-media.ts +74 -0
- package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +0 -2
- package/src/providers/openai/chat-completions-provider.ts +1 -4
- package/src/providers/openai/responses-provider.ts +1 -4
- package/src/providers/openrouter/client.ts +1 -6
- package/src/providers/provider-send-message.ts +6 -6
- package/src/providers/ratelimit.ts +1 -9
- package/src/providers/retry.ts +0 -5
- package/src/providers/types.ts +11 -2
- package/src/providers/usage-tracking.ts +1 -9
- package/src/runtime/__tests__/agent-wake.test.ts +131 -26
- package/src/runtime/__tests__/background-job-runner.test.ts +1 -3
- package/src/runtime/agent-wake.ts +93 -18
- package/src/runtime/assistant-event-hub.ts +2 -2
- package/src/runtime/auth/__tests__/guard-tests.test.ts +75 -109
- package/src/runtime/auth/__tests__/route-policy.test.ts +153 -170
- package/src/runtime/auth/route-policy.ts +42 -1079
- package/src/runtime/background-job-runner.ts +1 -4
- package/src/runtime/btw-sidechain.ts +3 -1
- package/src/runtime/channel-approvals.ts +3 -14
- package/src/runtime/channel-invite-transport.ts +5 -6
- package/src/runtime/channel-readiness-service.ts +2 -5
- package/src/runtime/channel-retry-sweep.ts +12 -16
- package/src/runtime/conversation-stream-state.ts +294 -0
- package/src/runtime/http-router.ts +19 -22
- package/src/runtime/http-types.ts +12 -6
- package/src/runtime/invite-instruction-generator.ts +3 -3
- package/src/runtime/pending-interactions.ts +2 -2
- package/src/runtime/routes/__tests__/avatar-state-routes.test.ts +565 -0
- package/src/runtime/routes/__tests__/content-source-routes.test.ts +4 -4
- package/src/runtime/routes/__tests__/conversation-compaction-routes.test.ts +62 -32
- package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +237 -0
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +13 -22
- package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +7 -2
- package/src/runtime/routes/__tests__/sanity-routes.test.ts +6 -6
- package/src/runtime/routes/__tests__/stt-routes.test.ts +3 -3
- package/src/runtime/routes/__tests__/suggest-trust-rule-routes.test.ts +5 -2
- package/src/runtime/routes/__tests__/tts-routes.test.ts +3 -3
- package/src/runtime/routes/acp-routes.test.ts +97 -75
- package/src/runtime/routes/acp-routes.ts +29 -6
- package/src/runtime/routes/app-management-routes.ts +97 -24
- package/src/runtime/routes/app-routes.ts +25 -5
- package/src/runtime/routes/approval-routes.ts +16 -4
- package/src/runtime/routes/attachment-routes.ts +25 -1
- package/src/runtime/routes/audio-routes.ts +1 -0
- package/src/runtime/routes/audit-routes.ts +5 -0
- package/src/runtime/routes/auth-routes.ts +5 -0
- package/src/runtime/routes/avatar-routes.ts +238 -59
- package/src/runtime/routes/background-tool-routes.ts +9 -0
- package/src/runtime/routes/background-wake-routes.ts +13 -3
- package/src/runtime/routes/backup-routes.ts +45 -0
- package/src/runtime/routes/bookmark-routes.ts +13 -0
- package/src/runtime/routes/brain-graph-routes.ts +9 -0
- package/src/runtime/routes/browser-routes.ts +5 -0
- package/src/runtime/routes/browser-tabs-routes.ts +5 -0
- package/src/runtime/routes/btw-routes.ts +5 -1
- package/src/runtime/routes/cache-routes.ts +13 -0
- package/src/runtime/routes/call-routes.ts +21 -10
- package/src/runtime/routes/channel-availability-routes.ts +5 -1
- package/src/runtime/routes/channel-readiness-routes.ts +37 -4
- package/src/runtime/routes/channel-route-definitions.ts +21 -0
- package/src/runtime/routes/channel-verification-routes.ts +21 -0
- package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +9 -2
- package/src/runtime/routes/client-routes.ts +9 -0
- package/src/runtime/routes/consolidation-routes.ts +13 -5
- package/src/runtime/routes/contact-prompt-routes.ts +9 -0
- package/src/runtime/routes/contact-routes.ts +90 -23
- package/src/runtime/routes/content-source-routes.ts +5 -1
- package/src/runtime/routes/conversation-analysis-routes.ts +5 -1
- package/src/runtime/routes/conversation-attention-routes.ts +5 -0
- package/src/runtime/routes/conversation-cli-routes.ts +54 -7
- package/src/runtime/routes/conversation-compaction-routes.ts +54 -25
- package/src/runtime/routes/conversation-list-routes.ts +81 -12
- package/src/runtime/routes/conversation-management-routes.ts +57 -14
- package/src/runtime/routes/conversation-query-routes.ts +88 -41
- package/src/runtime/routes/conversation-routes.ts +74 -19
- package/src/runtime/routes/conversation-starter-routes.ts +22 -13
- package/src/runtime/routes/conversations-import-routes.ts +6 -1
- package/src/runtime/routes/credential-prompt-routes.ts +5 -0
- package/src/runtime/routes/credential-routes.ts +25 -6
- package/src/runtime/routes/debug-bash-routes.ts +5 -0
- package/src/runtime/routes/debug-routes.ts +11 -2
- package/src/runtime/routes/defer-routes.ts +13 -0
- package/src/runtime/routes/diagnostics-routes.ts +37 -46
- package/src/runtime/routes/disk-pressure-routes.ts +17 -31
- package/src/runtime/routes/document-comments-routes.ts +46 -27
- package/src/runtime/routes/documents-routes.ts +21 -10
- package/src/runtime/routes/domain-routes.ts +61 -28
- package/src/runtime/routes/email-routes.ts +33 -0
- package/src/runtime/routes/events-routes.ts +114 -9
- package/src/runtime/routes/filing-routes.ts +9 -4
- package/src/runtime/routes/gateway-log-routes.ts +5 -0
- package/src/runtime/routes/global-search-routes.ts +53 -50
- package/src/runtime/routes/group-routes.ts +21 -5
- package/src/runtime/routes/guardian-action-routes.ts +9 -0
- package/src/runtime/routes/guardian-approval-interception.ts +0 -31
- package/src/runtime/routes/heartbeat-routes.ts +25 -9
- package/src/runtime/routes/home-feed-routes.ts +23 -19
- package/src/runtime/routes/home-state-routes.ts +8 -40
- package/src/runtime/routes/host-app-control-routes.ts +5 -0
- package/src/runtime/routes/host-bash-routes.ts +5 -0
- package/src/runtime/routes/host-browser-routes.ts +13 -0
- package/src/runtime/routes/host-cu-routes.ts +5 -0
- package/src/runtime/routes/host-file-routes.ts +26 -6
- package/src/runtime/routes/host-transfer-routes.ts +13 -2
- package/src/runtime/routes/http-adapter.ts +1 -2
- package/src/runtime/routes/identity-intro-cache.ts +17 -6
- package/src/runtime/routes/identity-routes.ts +12 -2
- package/src/runtime/routes/image-generation-routes.ts +5 -0
- package/src/runtime/routes/inbound-message-handler.ts +15 -11
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +0 -12
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +15 -19
- package/src/runtime/routes/inference-profile-session-routes.ts +13 -3
- package/src/runtime/routes/inference-provider-connection-routes.ts +21 -5
- package/src/runtime/routes/inference-send-routes.ts +11 -11
- package/src/runtime/routes/integrations/a2a.ts +30 -7
- package/src/runtime/routes/integrations/slack/channel.ts +19 -3
- package/src/runtime/routes/integrations/slack/share.ts +9 -2
- package/src/runtime/routes/integrations/telegram.ts +28 -9
- package/src/runtime/routes/integrations/twilio.ts +35 -7
- package/src/runtime/routes/integrations/vercel.ts +3 -3
- package/src/runtime/routes/internal-oauth-routes.ts +5 -0
- package/src/runtime/routes/internal-twilio-routes.ts +13 -0
- package/src/runtime/routes/llm-call-sites-routes.ts +39 -4
- package/src/runtime/routes/log-export-routes.ts +28 -10
- package/src/runtime/routes/mcp-auth-routes.ts +25 -0
- package/src/runtime/routes/memory-item-routes.ts +21 -10
- package/src/runtime/routes/memory-v2-routes.ts +90 -36
- package/src/runtime/routes/memory-v3-routes.ts +273 -407
- package/src/runtime/routes/migration-rollback-routes.ts +5 -1
- package/src/runtime/routes/migration-routes.ts +29 -0
- package/src/runtime/routes/notification-routes.ts +17 -1
- package/src/runtime/routes/oauth-apps.ts +33 -11
- package/src/runtime/routes/oauth-commands-routes.ts +37 -14
- package/src/runtime/routes/oauth-connect-routes.ts +9 -0
- package/src/runtime/routes/oauth-lifecycle-routes.ts +5 -1
- package/src/runtime/routes/oauth-providers.ts +35 -10
- package/src/runtime/routes/platform-routes.ts +21 -0
- package/src/runtime/routes/playground/__tests__/force-compact.test.ts +3 -2
- package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +37 -16
- package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +7 -3
- package/src/runtime/routes/playground/__tests__/state.test.ts +10 -3
- package/src/runtime/routes/playground/force-compact.ts +1 -1
- package/src/runtime/routes/playground/helpers.ts +0 -1
- package/src/runtime/routes/playground/inject-failures.ts +13 -8
- package/src/runtime/routes/playground/reset-circuit.ts +14 -9
- package/src/runtime/routes/playground/seed-conversation.ts +1 -1
- package/src/runtime/routes/playground/seeded-conversations.ts +3 -3
- package/src/runtime/routes/playground/state.ts +4 -3
- package/src/runtime/routes/plugins-routes.ts +22 -19
- package/src/runtime/routes/profiler-routes.ts +17 -4
- package/src/runtime/routes/ps-routes.ts +5 -0
- package/src/runtime/routes/publish-routes.ts +13 -3
- package/src/runtime/routes/question-routes.ts +5 -0
- package/src/runtime/routes/recording-routes.ts +25 -12
- package/src/runtime/routes/rename-conversation-routes.ts +5 -0
- package/src/runtime/routes/sanity-routes.ts +9 -2
- package/src/runtime/routes/schedule-routes.ts +137 -47
- package/src/runtime/routes/secret-routes.ts +17 -4
- package/src/runtime/routes/sequence-routes.ts +33 -0
- package/src/runtime/routes/settings-routes.ts +65 -19
- package/src/runtime/routes/skills-routes.ts +133 -69
- package/src/runtime/routes/slack-channel-routes.ts +5 -0
- package/src/runtime/routes/stt-routes.ts +13 -6
- package/src/runtime/routes/subagents-routes.ts +24 -18
- package/src/runtime/routes/suggest-trust-rule-routes.ts +7 -2
- package/src/runtime/routes/surface-action-routes.ts +9 -0
- package/src/runtime/routes/surface-content-routes.ts +10 -2
- package/src/runtime/routes/task-routes.ts +37 -0
- package/src/runtime/routes/telemetry-routes.ts +9 -0
- package/src/runtime/routes/trace-event-routes.ts +42 -1
- package/src/runtime/routes/trust-rules-routes.ts +5 -0
- package/src/runtime/routes/tts-routes.ts +13 -6
- package/src/runtime/routes/types.ts +17 -8
- package/src/runtime/routes/ui-request-routes.ts +5 -0
- package/src/runtime/routes/upgrade-broadcast-routes.ts +5 -0
- package/src/runtime/routes/usage-routes.ts +71 -3
- package/src/runtime/routes/user-routes-cli.ts +9 -0
- package/src/runtime/routes/user-routes.ts +5 -1
- package/src/runtime/routes/wake-conversation-routes.ts +5 -0
- package/src/runtime/routes/watcher-routes.ts +21 -0
- package/src/runtime/routes/webhook-routes.ts +9 -0
- package/src/runtime/routes/wipe-conversation-routes.ts +5 -0
- package/src/runtime/routes/work-items-routes.ts +47 -19
- package/src/runtime/routes/workspace-commit-routes.ts +5 -0
- package/src/runtime/routes/workspace-routes.test.ts +42 -0
- package/src/runtime/routes/workspace-routes.ts +120 -9
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +2 -4
- package/src/runtime/services/analyze-conversation.ts +3 -6
- package/src/runtime/services/conversation-serializer.ts +24 -2
- package/src/runtime/sync/resource-sync-events.ts +16 -2
- package/src/runtime/sync/sync-publisher.ts +2 -2
- package/src/schedule/run-script.ts +28 -3
- package/src/schedule/schedule-store.ts +8 -0
- package/src/schedule/scheduler.ts +3 -1
- package/src/signals/user-message.ts +5 -8
- package/src/skills/catalog-files.ts +4 -1
- package/src/skills/clawhub-files.ts +2 -0
- package/src/skills/skillssh-files.ts +2 -0
- package/src/subagent/manager.ts +3 -6
- package/src/telemetry/types.ts +26 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +138 -1
- package/src/telemetry/usage-telemetry-reporter.ts +31 -0
- package/src/tools/acp/spawn.test.ts +88 -38
- package/src/tools/apps/definitions.ts +8 -4
- package/src/tools/ask-question/ask-question-tool.test.ts +120 -105
- package/src/tools/ask-question/ask-question-tool.ts +85 -90
- package/src/tools/computer-use/definitions.ts +28 -24
- package/src/tools/credential-execution/make-authenticated-request.ts +56 -51
- package/src/tools/credential-execution/manage-secure-command-tool.ts +2 -2
- package/src/tools/credential-execution/run-authenticated-command.ts +82 -77
- package/src/tools/credentials/vault.ts +112 -111
- package/src/tools/execution-target.ts +1 -1
- package/src/tools/execution-timeout.ts +3 -4
- package/src/tools/filesystem/edit.ts +45 -42
- package/src/tools/filesystem/list.ts +33 -30
- package/src/tools/filesystem/read.ts +54 -35
- package/src/tools/filesystem/write.ts +34 -31
- package/src/tools/host-filesystem/edit.ts +44 -42
- package/src/tools/host-filesystem/read.ts +49 -35
- package/src/tools/host-filesystem/transfer.ts +121 -108
- package/src/tools/host-filesystem/write.ts +33 -31
- package/src/tools/host-terminal/host-shell.ts +50 -48
- package/src/tools/memory/register.ts +23 -24
- package/src/tools/network/web-fetch.ts +49 -46
- package/src/tools/network/web-search.ts +16 -13
- package/src/tools/registry.ts +39 -16
- package/src/tools/schedule/create.ts +11 -0
- package/src/tools/schedule/update.ts +16 -0
- package/src/tools/shared/filesystem/audio-read.ts +122 -0
- package/src/tools/shared/filesystem/image-read.ts +1 -1
- package/src/tools/skills/execute.ts +34 -31
- package/src/tools/skills/load.ts +29 -23
- package/src/tools/subagent/notify-parent.ts +35 -32
- package/src/tools/system/avatar-generator.ts +13 -22
- package/src/tools/system/request-permission.ts +30 -27
- package/src/tools/terminal/shell.ts +190 -61
- package/src/tools/tool-defaults.ts +20 -9
- package/src/tools/tool-manifest.ts +4 -4
- package/src/tools/types.ts +74 -23
- package/src/tools/ui-surface/definitions.ts +69 -9
- package/src/usage/types.ts +10 -0
- package/src/util/errors.ts +2 -2
- package/src/util/map-limit.ts +27 -0
- package/src/util/platform.ts +15 -12
- package/src/work-items/work-item-runner.ts +7 -2
- package/src/workspace/migrations/028-recover-conversations-from-disk-view.ts +7 -20
- package/src/workspace/migrations/092-backfill-v3-leaves.ts +169 -0
- package/src/workspace/migrations/093-backfill-leaf-ids.ts +144 -0
- package/src/workspace/migrations/094-seed-avatar-manifest.ts +155 -0
- package/src/workspace/migrations/__tests__/094-seed-avatar-manifest.test.ts +136 -0
- package/src/workspace/migrations/__tests__/backfill-leaf-ids.test.ts +175 -0
- package/src/workspace/migrations/__tests__/backfill-v3-leaves.test.ts +124 -0
- package/src/workspace/migrations/registry.ts +6 -0
- package/src/workspace/provider-commit-message-generator.ts +15 -17
- package/tsconfig.json +4 -1
- package/src/__tests__/history-repair-pipeline.test.ts +0 -396
- package/src/cli/commands/__tests__/memory-v3-render.test.ts +0 -340
- package/src/cli/commands/memory-v3-render.ts +0 -491
- package/src/daemon/message-types/disk-pressure.ts +0 -9
- package/src/email/feature-gate.ts +0 -23
- package/src/memory/v3/__tests__/coactivation-store.test.ts +0 -422
- package/src/memory/v3/__tests__/consolidation-job.test.ts +0 -466
- package/src/memory/v3/__tests__/coretrieval-seed.test.ts +0 -270
- package/src/memory/v3/__tests__/edge-learning-job.test.ts +0 -324
- package/src/memory/v3/__tests__/edges.test.ts +0 -706
- package/src/memory/v3/__tests__/filter.test.ts +0 -560
- package/src/memory/v3/__tests__/gate.test.ts +0 -637
- package/src/memory/v3/__tests__/index-composition.test.ts +0 -291
- package/src/memory/v3/__tests__/loop.test.ts +0 -775
- package/src/memory/v3/__tests__/retriever.test.ts +0 -226
- package/src/memory/v3/__tests__/scouts.test.ts +0 -489
- package/src/memory/v3/__tests__/shadow-diff.test.ts +0 -225
- package/src/memory/v3/__tests__/shadow-middleware.test.ts +0 -398
- package/src/memory/v3/__tests__/system-prompts.test.ts +0 -154
- package/src/memory/v3/__tests__/traversal.test.ts +0 -508
- package/src/memory/v3/__tests__/tree-index.test.ts +0 -280
- package/src/memory/v3/__tests__/tree-store.test.ts +0 -529
- package/src/memory/v3/__tests__/tree-walk.test.ts +0 -784
- package/src/memory/v3/__tests__/validate.test.ts +0 -277
- package/src/memory/v3/auto-edges.ts +0 -223
- package/src/memory/v3/coactivation-store.ts +0 -124
- package/src/memory/v3/consolidation-job.ts +0 -323
- package/src/memory/v3/coretrieval-seed.ts +0 -240
- package/src/memory/v3/edge-learning-job.ts +0 -160
- package/src/memory/v3/edges.ts +0 -286
- package/src/memory/v3/filter.ts +0 -286
- package/src/memory/v3/gate.ts +0 -349
- package/src/memory/v3/index-composition.ts +0 -126
- package/src/memory/v3/llm-capture.ts +0 -46
- package/src/memory/v3/loop.ts +0 -430
- package/src/memory/v3/maintenance.ts +0 -144
- package/src/memory/v3/prompt-context.ts +0 -33
- package/src/memory/v3/prompts/consolidation.ts +0 -458
- package/src/memory/v3/prompts/system-prompts.ts +0 -196
- package/src/memory/v3/retriever.ts +0 -33
- package/src/memory/v3/scouts.ts +0 -431
- package/src/memory/v3/shadow-diff.ts +0 -287
- package/src/memory/v3/shadow-middleware.ts +0 -347
- package/src/memory/v3/traversal.ts +0 -211
- package/src/memory/v3/tree-index.ts +0 -237
- package/src/memory/v3/tree-store.ts +0 -394
- package/src/memory/v3/tree-walk.ts +0 -356
- package/src/memory/v3/validate.ts +0 -323
- package/src/plugins/defaults/circuit-breaker.ts +0 -141
- package/src/plugins/defaults/compaction.ts +0 -141
- package/src/plugins/defaults/empty-response.ts +0 -124
- package/src/plugins/defaults/history-repair.ts +0 -83
- package/src/plugins/defaults/persistence.ts +0 -146
- package/src/plugins/defaults/title-generate.ts +0 -90
- package/src/plugins/defaults/token-estimate.ts +0 -101
- package/src/plugins/defaults/tool-error.ts +0 -119
- package/src/plugins/defaults/tool-result-truncate.ts +0 -84
- package/src/runtime/routes/__tests__/memory-v3-simulate-params.test.ts +0 -35
|
@@ -44,31 +44,17 @@ export interface LlmRequestLogSource {
|
|
|
44
44
|
* whose `createdAt` falls in the **open window**
|
|
45
45
|
* `(afterCreatedAt, beforeCreatedAt)`, ordered chronologically.
|
|
46
46
|
*
|
|
47
|
-
* Drives the Inspector's Compaction tab. The route handler
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
* `getPreviousNonCompactionCallCreatedAt` in `llm-request-log-store.ts`
|
|
53
|
-
* for the full bound semantics.
|
|
47
|
+
* Drives the Inspector's Compaction tab. The route handler computes
|
|
48
|
+
* the window from the turn the selected call belongs to via
|
|
49
|
+
* `getTurnTimeBounds` in `memory/conversation-crud.ts`; this source
|
|
50
|
+
* method is bound-agnostic. See `getCompactionLogsBetween` in
|
|
51
|
+
* `llm-request-log-store.ts` for the SQL.
|
|
54
52
|
*/
|
|
55
53
|
getCompactionLogsBetween(
|
|
56
54
|
conversationId: string,
|
|
57
55
|
afterCreatedAt: number | null,
|
|
58
56
|
beforeCreatedAt: number,
|
|
59
57
|
): Promise<LogRow[]>;
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Find the `createdAt` of the most recent non-`compactionAgent` LLM
|
|
63
|
-
* call in the conversation strictly before `beforeCreatedAt`, or
|
|
64
|
-
* `null` when no such call exists. Pairs with
|
|
65
|
-
* `getCompactionLogsBetween` to bound the compaction trail to the
|
|
66
|
-
* window between the prior real call and the selected call.
|
|
67
|
-
*/
|
|
68
|
-
getPreviousNonCompactionCallCreatedAt(
|
|
69
|
-
conversationId: string,
|
|
70
|
-
beforeCreatedAt: number,
|
|
71
|
-
): Promise<number | null>;
|
|
72
58
|
}
|
|
73
59
|
|
|
74
60
|
/**
|
|
@@ -89,14 +75,12 @@ export async function getLlmRequestLogSource(): Promise<LlmRequestLogSource> {
|
|
|
89
75
|
const cfg = config.llmRequestLogs ?? { readSource: "local" as const };
|
|
90
76
|
|
|
91
77
|
if (cfg.readSource === "clickhouse") {
|
|
92
|
-
const { ClickHouseLlmRequestLogSource } =
|
|
93
|
-
"./llm-request-log-source-clickhouse.js"
|
|
94
|
-
);
|
|
78
|
+
const { ClickHouseLlmRequestLogSource } =
|
|
79
|
+
await import("./llm-request-log-source-clickhouse.js");
|
|
95
80
|
return new ClickHouseLlmRequestLogSource(cfg.clickhouse);
|
|
96
81
|
}
|
|
97
82
|
|
|
98
|
-
const { LocalLlmRequestLogSource } =
|
|
99
|
-
"./llm-request-log-source-local.js"
|
|
100
|
-
);
|
|
83
|
+
const { LocalLlmRequestLogSource } =
|
|
84
|
+
await import("./llm-request-log-source-local.js");
|
|
101
85
|
return new LocalLlmRequestLogSource();
|
|
102
86
|
}
|
|
@@ -9,8 +9,6 @@ import {
|
|
|
9
9
|
isNull,
|
|
10
10
|
lt,
|
|
11
11
|
lte,
|
|
12
|
-
ne,
|
|
13
|
-
or,
|
|
14
12
|
sql,
|
|
15
13
|
} from "drizzle-orm";
|
|
16
14
|
import { v4 as uuid } from "uuid";
|
|
@@ -456,45 +454,6 @@ export function getCompactionLogsBetween(
|
|
|
456
454
|
.all();
|
|
457
455
|
}
|
|
458
456
|
|
|
459
|
-
/**
|
|
460
|
-
* Find the `createdAt` of the most recent non-`compactionAgent` LLM
|
|
461
|
-
* call in the conversation strictly before `beforeCreatedAt`, or `null`
|
|
462
|
-
* when no such call exists (i.e. the cutoff is the first real call).
|
|
463
|
-
*
|
|
464
|
-
* Pairs with `getCompactionLogsBetween` to bound the compaction trail
|
|
465
|
-
* to the window between the prior real call and the selected call.
|
|
466
|
-
*
|
|
467
|
-
* "Non-compactionAgent" means `callSite IS NULL OR callSite !=
|
|
468
|
-
* 'compactionAgent'`. NULL rows are pre-migration-264 (no backfill) and
|
|
469
|
-
* are treated as real agent calls — they were `mainAgent` in practice.
|
|
470
|
-
* The OR-with-IS NULL is required because SQL's three-valued logic
|
|
471
|
-
* makes `callSite != 'compactionAgent'` return UNKNOWN (not TRUE) for
|
|
472
|
-
* NULL rows, which would otherwise filter them out.
|
|
473
|
-
*/
|
|
474
|
-
export function getPreviousNonCompactionCallCreatedAt(
|
|
475
|
-
conversationId: string,
|
|
476
|
-
beforeCreatedAt: number,
|
|
477
|
-
): number | null {
|
|
478
|
-
const db = getDb();
|
|
479
|
-
const row = db
|
|
480
|
-
.select({ createdAt: llmRequestLogs.createdAt })
|
|
481
|
-
.from(llmRequestLogs)
|
|
482
|
-
.where(
|
|
483
|
-
and(
|
|
484
|
-
eq(llmRequestLogs.conversationId, conversationId),
|
|
485
|
-
lt(llmRequestLogs.createdAt, beforeCreatedAt),
|
|
486
|
-
or(
|
|
487
|
-
isNull(llmRequestLogs.callSite),
|
|
488
|
-
ne(llmRequestLogs.callSite, "compactionAgent"),
|
|
489
|
-
),
|
|
490
|
-
),
|
|
491
|
-
)
|
|
492
|
-
.orderBy(desc(llmRequestLogs.createdAt), desc(llmRequestLogs.id))
|
|
493
|
-
.limit(1)
|
|
494
|
-
.get();
|
|
495
|
-
return row?.createdAt ?? null;
|
|
496
|
-
}
|
|
497
|
-
|
|
498
457
|
export function getRequestLogById(logId: string): LogRow | null {
|
|
499
458
|
const db = getDb();
|
|
500
459
|
return (
|
|
@@ -6,6 +6,7 @@ import type {
|
|
|
6
6
|
UsageEvent,
|
|
7
7
|
UsageEventInput,
|
|
8
8
|
} from "../usage/types.js";
|
|
9
|
+
import { APP_VERSION } from "../version.js";
|
|
9
10
|
import { getDb } from "./db-connection.js";
|
|
10
11
|
import { rawAll } from "./raw-query.js";
|
|
11
12
|
import { conversations, llmUsageEvents } from "./schema.js";
|
|
@@ -39,6 +40,7 @@ export function recordUsageEvent(
|
|
|
39
40
|
inferenceProfileSource: input.inferenceProfileSource ?? null,
|
|
40
41
|
estimatedCostUsd: pricing.estimatedCostUsd,
|
|
41
42
|
pricingStatus: pricing.pricingStatus,
|
|
43
|
+
assistantVersion: APP_VERSION,
|
|
42
44
|
};
|
|
43
45
|
db.insert(llmUsageEvents)
|
|
44
46
|
.values({
|
|
@@ -62,6 +64,11 @@ export function recordUsageEvent(
|
|
|
62
64
|
pricingStatus: event.pricingStatus,
|
|
63
65
|
llmCallCount: event.llmCallCount ?? 1,
|
|
64
66
|
metadataJson: null,
|
|
67
|
+
// Capture the assistant's version at RECORD time so a batch flush
|
|
68
|
+
// days later doesn't mis-attribute this row to whatever version
|
|
69
|
+
// the assistant happens to be running on at upload time. See
|
|
70
|
+
// migration 267 + `TelemetryEventBase.assistant_version` (wire).
|
|
71
|
+
assistantVersion: event.assistantVersion,
|
|
65
72
|
})
|
|
66
73
|
.run();
|
|
67
74
|
return event;
|
|
@@ -91,6 +98,7 @@ function rowToUsageEvent(row: {
|
|
|
91
98
|
rawUsage: string | null;
|
|
92
99
|
estimatedCostUsd: number | null;
|
|
93
100
|
pricingStatus: string;
|
|
101
|
+
assistantVersion: string | null;
|
|
94
102
|
}): UsageEvent {
|
|
95
103
|
return {
|
|
96
104
|
id: row.id,
|
|
@@ -112,6 +120,7 @@ function rowToUsageEvent(row: {
|
|
|
112
120
|
rawUsage: parseRawUsage(row.rawUsage),
|
|
113
121
|
estimatedCostUsd: row.estimatedCostUsd,
|
|
114
122
|
pricingStatus: row.pricingStatus as "priced" | "unpriced",
|
|
123
|
+
assistantVersion: row.assistantVersion,
|
|
115
124
|
};
|
|
116
125
|
}
|
|
117
126
|
|
|
@@ -213,6 +222,7 @@ export function queryUnreportedUsageEvents(
|
|
|
213
222
|
rawUsage: llmUsageEvents.rawUsage,
|
|
214
223
|
estimatedCostUsd: llmUsageEvents.estimatedCostUsd,
|
|
215
224
|
pricingStatus: llmUsageEvents.pricingStatus,
|
|
225
|
+
assistantVersion: llmUsageEvents.assistantVersion,
|
|
216
226
|
conversationType: conversations.conversationType,
|
|
217
227
|
// Null when conversationId is null (no parent conversation).
|
|
218
228
|
// Otherwise the count of eligible user turns up to and including
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The shared `<memory>…</memory>` injection marker.
|
|
3
|
+
*
|
|
4
|
+
* Both the v2 graph-memory producers (`conversation-graph-memory.ts`) and the
|
|
5
|
+
* v3 live renderer (`v3/render-injection.ts`) emit memory blocks with this
|
|
6
|
+
* exact wrapper, and the strip/recognition machinery in
|
|
7
|
+
* `conversation-graph-memory.ts` (`countMemoryPrefixBlocks`) matches the same
|
|
8
|
+
* `"<memory>\n"` / `"\n</memory>"` delimiters. Keeping the producer wrapper in
|
|
9
|
+
* one leaf module guarantees the byte-for-byte marker contract across v2 and
|
|
10
|
+
* v3 — a change here updates every producer at once.
|
|
11
|
+
*
|
|
12
|
+
* This is a tiny dependency-free leaf so the pure v3 renderer can import it
|
|
13
|
+
* without pulling in the heavyweight graph-memory module.
|
|
14
|
+
*/
|
|
15
|
+
export function wrapMemoryBlock(text: string): string {
|
|
16
|
+
return `<memory>\n${text}\n</memory>`;
|
|
17
|
+
}
|
|
@@ -208,6 +208,7 @@ async function runLegacyRetrospective(
|
|
|
208
208
|
source: MEMORY_RETROSPECTIVE_SOURCE,
|
|
209
209
|
trustContext: INTERNAL_GUARDIAN_TRUST_CONTEXT,
|
|
210
210
|
callSite: "memoryRetrospective",
|
|
211
|
+
allowedTools: ["remember"],
|
|
211
212
|
// The background conversation's title already reads "Memory
|
|
212
213
|
// Retrospective", and `hint` is the full retrospective prompt — surfacing
|
|
213
214
|
// it verbatim as a "Conversation Woke" card body is noisy internal
|
|
@@ -382,8 +383,10 @@ async function runForkBasedRetrospective(
|
|
|
382
383
|
forkId,
|
|
383
384
|
"user",
|
|
384
385
|
JSON.stringify([{ type: "text", text: instruction }]),
|
|
385
|
-
{
|
|
386
|
-
|
|
386
|
+
{
|
|
387
|
+
metadata: { kind: MEMORY_RETROSPECTIVE_INSTRUCTION_KIND, hidden: true },
|
|
388
|
+
skipIndexing: true,
|
|
389
|
+
},
|
|
387
390
|
);
|
|
388
391
|
} catch (err) {
|
|
389
392
|
log.error(
|
|
@@ -407,6 +410,7 @@ async function runForkBasedRetrospective(
|
|
|
407
410
|
source: MEMORY_RETROSPECTIVE_SOURCE,
|
|
408
411
|
trustContext: INTERNAL_GUARDIAN_TRUST_CONTEXT,
|
|
409
412
|
callSite: "memoryRetrospective",
|
|
413
|
+
allowedTools: ["remember"],
|
|
410
414
|
hintRole: "user",
|
|
411
415
|
skipHintInjection: true,
|
|
412
416
|
suppressAutoCompaction: true,
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { and, desc, eq,
|
|
1
|
+
import { and, desc, eq, inArray, isNull, ne } from "drizzle-orm";
|
|
2
2
|
import { v4 as uuid } from "uuid";
|
|
3
3
|
|
|
4
4
|
import { getDb } from "./db-connection.js";
|
|
5
5
|
import { memoryV2ActivationLogs } from "./schema.js";
|
|
6
|
-
import type { ShadowDiffLogRow } from "./v3/shadow-diff.js";
|
|
7
6
|
|
|
8
7
|
export interface MemoryV2ConceptRowRecord {
|
|
9
8
|
slug: string;
|
|
@@ -215,84 +214,3 @@ export function getMemoryV2ActivationLogByMessageIds(
|
|
|
215
214
|
config: JSON.parse(row.configJson) as MemoryV2ConfigSnapshot,
|
|
216
215
|
};
|
|
217
216
|
}
|
|
218
|
-
|
|
219
|
-
function parseConcepts(conceptsJson: string): MemoryV2ConceptRowRecord[] {
|
|
220
|
-
try {
|
|
221
|
-
const parsed = JSON.parse(conceptsJson);
|
|
222
|
-
return Array.isArray(parsed) ? (parsed as MemoryV2ConceptRowRecord[]) : [];
|
|
223
|
-
} catch {
|
|
224
|
-
return [];
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
/**
|
|
229
|
-
* Read the activation-log rows the v3 shadow-diff needs: every `v3_shadow` row
|
|
230
|
-
* (optionally newer than `sinceMs`), plus the `router` rows that could pair
|
|
231
|
-
* with them. The router read is bounded to the shadow rows' conversations and
|
|
232
|
-
* their time span (padded by `paddingMs`) so a shadow-diff over a few turns
|
|
233
|
-
* never scans the entire multi-GB log table. Returns `{ shadow, router }` for
|
|
234
|
-
* {@link computeShadowDiff} to pair and diff.
|
|
235
|
-
*/
|
|
236
|
-
export function readActivationLogsForShadowDiff(opts: {
|
|
237
|
-
sinceMs: number | null;
|
|
238
|
-
paddingMs: number;
|
|
239
|
-
}): { shadow: ShadowDiffLogRow[]; router: ShadowDiffLogRow[] } {
|
|
240
|
-
const db = getDb();
|
|
241
|
-
|
|
242
|
-
const shadow = db
|
|
243
|
-
.select({
|
|
244
|
-
conversationId: memoryV2ActivationLogs.conversationId,
|
|
245
|
-
createdAt: memoryV2ActivationLogs.createdAt,
|
|
246
|
-
conceptsJson: memoryV2ActivationLogs.conceptsJson,
|
|
247
|
-
})
|
|
248
|
-
.from(memoryV2ActivationLogs)
|
|
249
|
-
.where(
|
|
250
|
-
opts.sinceMs !== null
|
|
251
|
-
? and(
|
|
252
|
-
eq(memoryV2ActivationLogs.mode, "v3_shadow"),
|
|
253
|
-
gte(memoryV2ActivationLogs.createdAt, opts.sinceMs),
|
|
254
|
-
)
|
|
255
|
-
: eq(memoryV2ActivationLogs.mode, "v3_shadow"),
|
|
256
|
-
)
|
|
257
|
-
.orderBy(memoryV2ActivationLogs.createdAt)
|
|
258
|
-
.all()
|
|
259
|
-
.map((row) => ({
|
|
260
|
-
conversationId: row.conversationId,
|
|
261
|
-
createdAt: row.createdAt,
|
|
262
|
-
concepts: parseConcepts(row.conceptsJson),
|
|
263
|
-
}));
|
|
264
|
-
|
|
265
|
-
if (shadow.length === 0) return { shadow: [], router: [] };
|
|
266
|
-
|
|
267
|
-
const convIds = [...new Set(shadow.map((s) => s.conversationId))];
|
|
268
|
-
let tMin = Number.POSITIVE_INFINITY;
|
|
269
|
-
let tMax = Number.NEGATIVE_INFINITY;
|
|
270
|
-
for (const s of shadow) {
|
|
271
|
-
if (s.createdAt < tMin) tMin = s.createdAt;
|
|
272
|
-
if (s.createdAt > tMax) tMax = s.createdAt;
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
const router = db
|
|
276
|
-
.select({
|
|
277
|
-
conversationId: memoryV2ActivationLogs.conversationId,
|
|
278
|
-
createdAt: memoryV2ActivationLogs.createdAt,
|
|
279
|
-
conceptsJson: memoryV2ActivationLogs.conceptsJson,
|
|
280
|
-
})
|
|
281
|
-
.from(memoryV2ActivationLogs)
|
|
282
|
-
.where(
|
|
283
|
-
and(
|
|
284
|
-
eq(memoryV2ActivationLogs.mode, "router"),
|
|
285
|
-
inArray(memoryV2ActivationLogs.conversationId, convIds),
|
|
286
|
-
gte(memoryV2ActivationLogs.createdAt, tMin - opts.paddingMs),
|
|
287
|
-
lte(memoryV2ActivationLogs.createdAt, tMax + opts.paddingMs),
|
|
288
|
-
),
|
|
289
|
-
)
|
|
290
|
-
.all()
|
|
291
|
-
.map((row) => ({
|
|
292
|
-
conversationId: row.conversationId,
|
|
293
|
-
createdAt: row.createdAt,
|
|
294
|
-
concepts: parseConcepts(row.conceptsJson),
|
|
295
|
-
}));
|
|
296
|
-
|
|
297
|
-
return { shadow, router };
|
|
298
|
-
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { type DrizzleDb, getSqliteFrom } from "../db-connection.js";
|
|
2
|
+
|
|
3
|
+
const COLUMN = "assistant_version";
|
|
4
|
+
const TABLE = "llm_usage_events";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Add a nullable `assistant_version TEXT` column to `llm_usage_events`.
|
|
8
|
+
*
|
|
9
|
+
* Stamps the version of the assistant binary at the moment the event was
|
|
10
|
+
* RECORDED, not when the batch was uploaded. The previous shape sent the
|
|
11
|
+
* version only on the upload envelope, which silently mis-attributes
|
|
12
|
+
* delayed flushes: an assistant that buffered events for days (offline
|
|
13
|
+
* laptop, network outage, ingest clog — see May 2026 incident) and
|
|
14
|
+
* finally flushed under its current version stamps that current version
|
|
15
|
+
* onto every backlogged event, breaking the version filter on
|
|
16
|
+
* `/admin/inference`.
|
|
17
|
+
*
|
|
18
|
+
* `NULL` for rows persisted before this migration ran. The reporter
|
|
19
|
+
* falls back to the running binary's `APP_VERSION` when the per-event
|
|
20
|
+
* column is null, so legacy rows still produce a concrete version on
|
|
21
|
+
* the wire.
|
|
22
|
+
*
|
|
23
|
+
* Scope: only `llm_usage_events` for now. `lifecycle_events` (#18112)
|
|
24
|
+
* and `onboarding_events` (#30733) share the same record-time-attribution
|
|
25
|
+
* issue and will get the column in a follow-up. Turn events derive from
|
|
26
|
+
* the `messages` table and are also out of scope — see follow-up that
|
|
27
|
+
* adds the column to `messages`.
|
|
28
|
+
*
|
|
29
|
+
* Idempotent — re-running is a no-op once the column exists. Pure DDL
|
|
30
|
+
* with a PRAGMA guard, no registry entry needed (matches the 252 / 261
|
|
31
|
+
* / 264 / 265 pattern).
|
|
32
|
+
*/
|
|
33
|
+
export function migrateLlmUsageEventsAddAssistantVersion(
|
|
34
|
+
database: DrizzleDb,
|
|
35
|
+
): void {
|
|
36
|
+
const raw = getSqliteFrom(database);
|
|
37
|
+
|
|
38
|
+
const columns = raw.query(`PRAGMA table_info(${TABLE})`).all() as Array<{
|
|
39
|
+
name: string;
|
|
40
|
+
}>;
|
|
41
|
+
const columnNames = new Set(columns.map((c) => c.name));
|
|
42
|
+
|
|
43
|
+
if (!columnNames.has(COLUMN)) {
|
|
44
|
+
raw.exec(`ALTER TABLE ${TABLE} ADD COLUMN ${COLUMN} TEXT`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type DrizzleDb, getSqliteFrom } from "../db-connection.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Adds `memory_v3_selections` for memory-v3 working-set persistence:
|
|
5
|
+
* one row per (conversation, turn, page-slug) the v3 retriever selected,
|
|
6
|
+
* tagged with the lane (`source`) that produced it. `pinned` marks slugs
|
|
7
|
+
* carried forward across turns rather than re-selected cold.
|
|
8
|
+
*
|
|
9
|
+
* Idempotent — re-running is a no-op once the table and index exist.
|
|
10
|
+
*/
|
|
11
|
+
export function migrateAddMemoryV3Selections(database: DrizzleDb): void {
|
|
12
|
+
const raw = getSqliteFrom(database);
|
|
13
|
+
raw.exec(/*sql*/ `
|
|
14
|
+
CREATE TABLE IF NOT EXISTS memory_v3_selections (
|
|
15
|
+
conversation_id TEXT NOT NULL,
|
|
16
|
+
turn INTEGER NOT NULL,
|
|
17
|
+
slug TEXT NOT NULL,
|
|
18
|
+
source TEXT NOT NULL,
|
|
19
|
+
pinned INTEGER NOT NULL DEFAULT 0,
|
|
20
|
+
created_at INTEGER NOT NULL,
|
|
21
|
+
PRIMARY KEY (conversation_id, turn, slug)
|
|
22
|
+
)
|
|
23
|
+
`);
|
|
24
|
+
raw.exec(/*sql*/ `
|
|
25
|
+
CREATE INDEX IF NOT EXISTS idx_memory_v3_selections_conv
|
|
26
|
+
ON memory_v3_selections (conversation_id, turn DESC)
|
|
27
|
+
`);
|
|
28
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { DrizzleDb } from "../db-connection.js";
|
|
2
|
+
import { getSqliteFrom } from "../db-connection.js";
|
|
3
|
+
|
|
4
|
+
export function migrateScheduleScriptTimeout(database: DrizzleDb): void {
|
|
5
|
+
const raw = getSqliteFrom(database);
|
|
6
|
+
try {
|
|
7
|
+
raw.exec(`ALTER TABLE cron_jobs ADD COLUMN timeout_ms INTEGER`);
|
|
8
|
+
} catch {
|
|
9
|
+
/* Column already exists */
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { DrizzleDb } from "../db-connection.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Indexes `messages(role, created_at)` so the most recent message of a given
|
|
5
|
+
* role can be found with an indexed seek instead of a table scan.
|
|
6
|
+
*
|
|
7
|
+
* The database-maintenance quiet-period gate looks up the newest user-message
|
|
8
|
+
* timestamp on every idle worker tick; without this index that lookup scans
|
|
9
|
+
* the (potentially multi-GB) messages table on the daemon's synchronous
|
|
10
|
+
* connection.
|
|
11
|
+
*
|
|
12
|
+
* Idempotent — `CREATE INDEX IF NOT EXISTS` is a no-op once the index exists.
|
|
13
|
+
*/
|
|
14
|
+
export function migrateMessagesRoleCreatedAtIndex(database: DrizzleDb): void {
|
|
15
|
+
database.run(
|
|
16
|
+
/*sql*/ `CREATE INDEX IF NOT EXISTS idx_messages_role_created_at ON messages(role, created_at)`,
|
|
17
|
+
);
|
|
18
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { Database } from "bun:sqlite";
|
|
2
|
+
import { describe, expect, test } from "bun:test";
|
|
3
|
+
|
|
4
|
+
import { drizzle } from "drizzle-orm/bun-sqlite";
|
|
5
|
+
|
|
6
|
+
import { getSqliteFrom } from "../../db-connection.js";
|
|
7
|
+
import * as schema from "../../schema.js";
|
|
8
|
+
import { migrateLlmUsageEventsAddAssistantVersion } from "../267-llm-usage-events-add-assistant-version.js";
|
|
9
|
+
|
|
10
|
+
interface ColumnRow {
|
|
11
|
+
name: string;
|
|
12
|
+
type: string;
|
|
13
|
+
notnull: number;
|
|
14
|
+
dflt_value: string | null;
|
|
15
|
+
pk: number;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function createTestDb() {
|
|
19
|
+
const sqlite = new Database(":memory:");
|
|
20
|
+
sqlite.exec("PRAGMA journal_mode=WAL");
|
|
21
|
+
sqlite.exec("PRAGMA foreign_keys = ON");
|
|
22
|
+
return drizzle(sqlite, { schema });
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Inline minimal CREATE TABLE for just `llm_usage_events`. We deliberately
|
|
27
|
+
* don't call migration 101 — it also sets up FTS triggers + other tables
|
|
28
|
+
* that aren't relevant here and pull in more surface area than we need to
|
|
29
|
+
* validate this migration.
|
|
30
|
+
*
|
|
31
|
+
* Schema mirrors the post-251 (llm_usage_events incl. inference profile)
|
|
32
|
+
* state on purpose so the test reflects what the migration runs against
|
|
33
|
+
* in prod.
|
|
34
|
+
*/
|
|
35
|
+
function bootstrap(db: ReturnType<typeof createTestDb>): void {
|
|
36
|
+
db.run(/*sql*/ `
|
|
37
|
+
CREATE TABLE llm_usage_events (
|
|
38
|
+
id TEXT PRIMARY KEY,
|
|
39
|
+
created_at INTEGER NOT NULL,
|
|
40
|
+
provider TEXT NOT NULL,
|
|
41
|
+
model TEXT NOT NULL,
|
|
42
|
+
input_tokens INTEGER NOT NULL,
|
|
43
|
+
output_tokens INTEGER NOT NULL
|
|
44
|
+
)
|
|
45
|
+
`);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
describe("migration 267 — llm_usage_events add assistant_version", () => {
|
|
49
|
+
test("adds nullable assistant_version TEXT to llm_usage_events", () => {
|
|
50
|
+
const db = createTestDb();
|
|
51
|
+
const raw = getSqliteFrom(db);
|
|
52
|
+
bootstrap(db);
|
|
53
|
+
|
|
54
|
+
const before = raw
|
|
55
|
+
.query(`PRAGMA table_info(llm_usage_events)`)
|
|
56
|
+
.all() as ColumnRow[];
|
|
57
|
+
expect(before.map((c) => c.name)).not.toContain("assistant_version");
|
|
58
|
+
|
|
59
|
+
migrateLlmUsageEventsAddAssistantVersion(db);
|
|
60
|
+
|
|
61
|
+
const after = raw
|
|
62
|
+
.query(`PRAGMA table_info(llm_usage_events)`)
|
|
63
|
+
.all() as ColumnRow[];
|
|
64
|
+
const col = after.find((c) => c.name === "assistant_version");
|
|
65
|
+
expect(col).toBeDefined();
|
|
66
|
+
expect(col!.type).toBe("TEXT");
|
|
67
|
+
// Nullable, no default — pre-migration rows stay NULL.
|
|
68
|
+
expect(col!.notnull).toBe(0);
|
|
69
|
+
expect(col!.dflt_value).toBeNull();
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
test("is idempotent — running twice does not throw", () => {
|
|
73
|
+
const db = createTestDb();
|
|
74
|
+
bootstrap(db);
|
|
75
|
+
migrateLlmUsageEventsAddAssistantVersion(db);
|
|
76
|
+
expect(() => migrateLlmUsageEventsAddAssistantVersion(db)).not.toThrow();
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
test("pre-migration rows survive with assistant_version = NULL", () => {
|
|
80
|
+
const db = createTestDb();
|
|
81
|
+
const raw = getSqliteFrom(db);
|
|
82
|
+
bootstrap(db);
|
|
83
|
+
|
|
84
|
+
raw.run(`
|
|
85
|
+
INSERT INTO llm_usage_events
|
|
86
|
+
(id, created_at, provider, model, input_tokens, output_tokens)
|
|
87
|
+
VALUES
|
|
88
|
+
('u1', 1, 'anthropic', 'claude-sonnet-4', 10, 20)
|
|
89
|
+
`);
|
|
90
|
+
|
|
91
|
+
migrateLlmUsageEventsAddAssistantVersion(db);
|
|
92
|
+
|
|
93
|
+
const usage = raw
|
|
94
|
+
.query(`SELECT id, assistant_version FROM llm_usage_events`)
|
|
95
|
+
.all() as Array<{ id: string; assistant_version: string | null }>;
|
|
96
|
+
expect(usage).toEqual([{ id: "u1", assistant_version: null }]);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
test("post-migration rows can be inserted with assistant_version", () => {
|
|
100
|
+
const db = createTestDb();
|
|
101
|
+
const raw = getSqliteFrom(db);
|
|
102
|
+
bootstrap(db);
|
|
103
|
+
migrateLlmUsageEventsAddAssistantVersion(db);
|
|
104
|
+
|
|
105
|
+
raw.run(`
|
|
106
|
+
INSERT INTO llm_usage_events
|
|
107
|
+
(id, created_at, provider, model, input_tokens, output_tokens,
|
|
108
|
+
assistant_version)
|
|
109
|
+
VALUES
|
|
110
|
+
('u2', 4, 'anthropic', 'claude-sonnet-4', 10, 20, '0.8.4')
|
|
111
|
+
`);
|
|
112
|
+
const row = raw
|
|
113
|
+
.query(`SELECT assistant_version FROM llm_usage_events WHERE id = 'u2'`)
|
|
114
|
+
.get() as { assistant_version: string };
|
|
115
|
+
expect(row.assistant_version).toBe("0.8.4");
|
|
116
|
+
});
|
|
117
|
+
});
|
|
@@ -253,6 +253,10 @@ export {
|
|
|
253
253
|
export { migrateLlmRequestLogCallSite } from "./264-llm-request-log-call-site.js";
|
|
254
254
|
export { migrateDropProviderConnectionStatus } from "./265-drop-provider-connection-status.js";
|
|
255
255
|
export { migrateMessagesClientMessageId } from "./266-messages-client-message-id.js";
|
|
256
|
+
export { migrateLlmUsageEventsAddAssistantVersion } from "./267-llm-usage-events-add-assistant-version.js";
|
|
257
|
+
export { migrateAddMemoryV3Selections } from "./268-add-memory-v3-selections.js";
|
|
258
|
+
export { migrateScheduleScriptTimeout } from "./269-schedule-script-timeout.js";
|
|
259
|
+
export { migrateMessagesRoleCreatedAtIndex } from "./270-messages-role-created-at-index.js";
|
|
256
260
|
export {
|
|
257
261
|
MIGRATION_REGISTRY,
|
|
258
262
|
type MigrationRegistryEntry,
|
|
@@ -21,6 +21,7 @@ export const cronJobs = sqliteTable("cron_jobs", {
|
|
|
21
21
|
retryCount: integer("retry_count").notNull().default(0),
|
|
22
22
|
maxRetries: integer("max_retries").notNull().default(3),
|
|
23
23
|
retryBackoffMs: integer("retry_backoff_ms").notNull().default(60000),
|
|
24
|
+
timeoutMs: integer("timeout_ms"), // script-mode execution timeout override (ms); null = use default
|
|
24
25
|
createdBy: text("created_by").notNull(), // 'agent' | 'user'
|
|
25
26
|
mode: text("mode").notNull().default("execute"), // 'notify' | 'execute'
|
|
26
27
|
routingIntent: text("routing_intent").notNull().default("all_channels"), // 'single_channel' | 'multi_channel' | 'all_channels'
|
|
@@ -242,6 +243,16 @@ export const llmUsageEvents = sqliteTable(
|
|
|
242
243
|
pricingStatus: text("pricing_status").notNull(),
|
|
243
244
|
llmCallCount: integer("llm_call_count"),
|
|
244
245
|
metadataJson: text("metadata_json"),
|
|
246
|
+
/**
|
|
247
|
+
* Version of the assistant binary at the moment THIS event was
|
|
248
|
+
* recorded (not when the batch was uploaded). Telemetry uploads
|
|
249
|
+
* batch events together and may flush days after the event fired
|
|
250
|
+
* (offline laptop, network outage, ingest clog — see May 2026
|
|
251
|
+
* incident). Stamping at record time keeps the version filter on
|
|
252
|
+
* `/admin/inference` truthful for delayed batches. Null for rows
|
|
253
|
+
* persisted before migration 267 ran.
|
|
254
|
+
*/
|
|
255
|
+
assistantVersion: text("assistant_version"),
|
|
245
256
|
},
|
|
246
257
|
(table) => [
|
|
247
258
|
index("idx_llm_usage_events_conversation_id").on(table.conversationId),
|