@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
|
@@ -1,12 +1,30 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Minimal ANSI
|
|
3
|
-
* (https://no-color.org/) and skips coloring when
|
|
4
|
-
* piped/captured output stays clean.
|
|
2
|
+
* Minimal ANSI color wrappers for CLI output. Each helper respects `NO_COLOR`
|
|
3
|
+
* (https://no-color.org/) and skips coloring when the relevant stream is not
|
|
4
|
+
* a TTY so piped/captured output stays clean.
|
|
5
|
+
*
|
|
6
|
+
* `red` / `green` gate on stderr (error/success lines tend to land there in
|
|
7
|
+
* the existing commands), `dim` gates on stdout (used for muted body text).
|
|
5
8
|
*/
|
|
9
|
+
|
|
10
|
+
function colorsDisabled(): boolean {
|
|
11
|
+
return process.env.NO_COLOR !== undefined && process.env.NO_COLOR !== "";
|
|
12
|
+
}
|
|
13
|
+
|
|
6
14
|
export function red(text: string): string {
|
|
7
15
|
if (!process.stderr.isTTY) return text;
|
|
8
|
-
if (
|
|
9
|
-
return text;
|
|
10
|
-
}
|
|
16
|
+
if (colorsDisabled()) return text;
|
|
11
17
|
return `\x1b[31m${text}\x1b[0m`;
|
|
12
18
|
}
|
|
19
|
+
|
|
20
|
+
export function green(text: string): string {
|
|
21
|
+
if (!process.stderr.isTTY) return text;
|
|
22
|
+
if (colorsDisabled()) return text;
|
|
23
|
+
return `\x1b[32m${text}\x1b[0m`;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function dim(text: string): string {
|
|
27
|
+
if (!process.stdout.isTTY) return text;
|
|
28
|
+
if (colorsDisabled()) return text;
|
|
29
|
+
return `\x1b[2m${text}\x1b[0m`;
|
|
30
|
+
}
|
package/src/cli/program.ts
CHANGED
|
@@ -4,7 +4,6 @@ import { Command } from "commander";
|
|
|
4
4
|
|
|
5
5
|
import { initFeatureFlagOverrides } from "../config/assistant-feature-flags.js";
|
|
6
6
|
import { getConfigReadOnly } from "../config/loader.js";
|
|
7
|
-
import { isEmailEnabled } from "../email/feature-gate.js";
|
|
8
7
|
import { isExternalPluginsEnabled } from "../plugins/feature-gate.js";
|
|
9
8
|
import { getWorkspaceDir } from "../util/platform.js";
|
|
10
9
|
import { APP_VERSION } from "../version.js";
|
|
@@ -26,6 +25,7 @@ import { registerContactsCommand } from "./commands/contacts.js";
|
|
|
26
25
|
import { registerConversationsCommand } from "./commands/conversations.js";
|
|
27
26
|
import { registerCredentialExecutionCommand } from "./commands/credential-execution.js";
|
|
28
27
|
import { registerCredentialsCommand } from "./commands/credentials.js";
|
|
28
|
+
import { registerDbCommand } from "./commands/db/index.js";
|
|
29
29
|
import { registerDefaultAction } from "./commands/default-action.js";
|
|
30
30
|
import { registerDomainCommand } from "./commands/domain.js";
|
|
31
31
|
import { registerEmailCommand } from "./commands/email.js";
|
|
@@ -122,10 +122,9 @@ Examples:
|
|
|
122
122
|
registerConversationsCommand(program);
|
|
123
123
|
registerCredentialExecutionCommand(program);
|
|
124
124
|
registerCredentialsCommand(program);
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
}
|
|
125
|
+
registerDbCommand(program);
|
|
126
|
+
registerDomainCommand(program);
|
|
127
|
+
registerEmailCommand(program);
|
|
129
128
|
registerGatewayCommand(program);
|
|
130
129
|
registerImageGenerationCommand(program);
|
|
131
130
|
registerInferenceCommand(program);
|
|
@@ -31,7 +31,7 @@ function loadRegistry(): Record<string, unknown> {
|
|
|
31
31
|
return JSON.parse(raw);
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
const VALID_SCOPES = new Set(["assistant", "client"]);
|
|
34
|
+
const VALID_SCOPES = new Set(["assistant", "client", "both"]);
|
|
35
35
|
|
|
36
36
|
// ---------------------------------------------------------------------------
|
|
37
37
|
// Tests
|
|
@@ -169,7 +169,7 @@ describe("unified feature flag registry guard", () => {
|
|
|
169
169
|
const scope = flag.scope as string;
|
|
170
170
|
if (!VALID_SCOPES.has(scope)) {
|
|
171
171
|
violations.push(
|
|
172
|
-
`flag '${flag.id}' has invalid scope '${scope}' (expected 'assistant' or '
|
|
172
|
+
`flag '${flag.id}' has invalid scope '${scope}' (expected 'assistant', 'client', or 'both')`,
|
|
173
173
|
);
|
|
174
174
|
}
|
|
175
175
|
}
|
|
@@ -89,7 +89,7 @@ function loadDefaultsRegistry(): FeatureFlagDefaultsRegistry {
|
|
|
89
89
|
|
|
90
90
|
/**
|
|
91
91
|
* Parse the unified registry JSON into a flat key -> default map,
|
|
92
|
-
* filtering to assistant
|
|
92
|
+
* filtering to flags the backend consumes (`assistant`- and `both`-scope).
|
|
93
93
|
*/
|
|
94
94
|
function parseRegistryToDefaults(parsed: unknown): FeatureFlagDefaultsRegistry {
|
|
95
95
|
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) return {};
|
|
@@ -101,7 +101,7 @@ function parseRegistryToDefaults(parsed: unknown): FeatureFlagDefaultsRegistry {
|
|
|
101
101
|
for (const flag of registry.flags) {
|
|
102
102
|
if (!flag || typeof flag !== "object" || Array.isArray(flag)) continue;
|
|
103
103
|
const entry = flag as Record<string, unknown>;
|
|
104
|
-
if (entry.scope !== "assistant") continue;
|
|
104
|
+
if (entry.scope !== "assistant" && entry.scope !== "both") continue;
|
|
105
105
|
if (typeof entry.key !== "string") continue;
|
|
106
106
|
if (typeof entry.defaultEnabled !== "boolean") continue;
|
|
107
107
|
|
|
@@ -135,13 +135,24 @@ assistant config get llm.activeProfile
|
|
|
135
135
|
|
|
136
136
|
If the profile is already `quality-optimized`, skip the rest of this step and proceed to Step 1.
|
|
137
137
|
|
|
138
|
-
**If the active profile is `balanced`, `cost-optimized`, or any non-quality profile, you MUST ask the user for permission before switching. Do NOT open an inference session without explicit user confirmation.** Use `assistant ui confirm
|
|
138
|
+
**If the active profile is `balanced`, `cost-optimized`, or any non-quality profile, you MUST ask the user for permission before switching. Do NOT open an inference session without explicit user confirmation.** Use the `ui_show` tool to present an inline `confirmation` surface and wait for the action. Do not call the shell command `assistant ui confirm`; that CLI-mediated confirmation can block the build flow before the app work starts.
|
|
139
139
|
|
|
140
140
|
```
|
|
141
|
-
|
|
141
|
+
ui_show({
|
|
142
|
+
surface_type: "confirmation",
|
|
143
|
+
title: "Use quality model for this app?",
|
|
144
|
+
data: {
|
|
145
|
+
message: "The current model profile is `<profile>`. App building works best with `quality-optimized` because it makes better design decisions, writes cleaner components, and produces more visually polished results.",
|
|
146
|
+
detail: "Choose whether to switch for this build or keep the current profile and build now.",
|
|
147
|
+
confirmLabel: "Switch for this build",
|
|
148
|
+
cancelLabel: "Keep current profile"
|
|
149
|
+
},
|
|
150
|
+
display: "inline",
|
|
151
|
+
await_action: true
|
|
152
|
+
})
|
|
142
153
|
```
|
|
143
154
|
|
|
144
|
-
If `
|
|
155
|
+
If `ui_show` is unavailable or the current channel cannot render confirmation surfaces, ask the user directly in conversation as a fallback. Wait for the user's answer before proceeding.
|
|
145
156
|
|
|
146
157
|
**Only if the user confirms**, open an inference session:
|
|
147
158
|
|
|
@@ -195,15 +195,12 @@ async function sendToClaude(
|
|
|
195
195
|
const { signal, cleanup } = createTimeout(REDUCE_TIMEOUT_MS);
|
|
196
196
|
|
|
197
197
|
try {
|
|
198
|
-
const response = await provider.sendMessage(
|
|
199
|
-
[
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
signal,
|
|
205
|
-
},
|
|
206
|
-
);
|
|
198
|
+
const response = await provider.sendMessage([userMessage(userContent)], {
|
|
199
|
+
tools: [],
|
|
200
|
+
systemPrompt: effectiveSystemPrompt,
|
|
201
|
+
config: model ? { model } : {},
|
|
202
|
+
signal,
|
|
203
|
+
});
|
|
207
204
|
cleanup();
|
|
208
205
|
|
|
209
206
|
const answer = extractAllText(response);
|
|
@@ -238,8 +238,13 @@ export async function run(
|
|
|
238
238
|
binding.conversationId,
|
|
239
239
|
"assistant",
|
|
240
240
|
JSON.stringify([{ type: "text", text }]),
|
|
241
|
-
{
|
|
242
|
-
|
|
241
|
+
{
|
|
242
|
+
metadata: {
|
|
243
|
+
automated: true,
|
|
244
|
+
crossPostedFrom: context.conversationId,
|
|
245
|
+
},
|
|
246
|
+
skipIndexing: true,
|
|
247
|
+
},
|
|
243
248
|
);
|
|
244
249
|
syncMessageToDisk(
|
|
245
250
|
binding.conversationId,
|
|
@@ -94,7 +94,7 @@ The `mode` parameter controls what happens when a schedule fires:
|
|
|
94
94
|
|
|
95
95
|
- **execute** (default) - sends the schedule's message to a background assistant conversation for autonomous handling. The assistant processes the message as if the user sent it.
|
|
96
96
|
- **notify** - sends a notification to the user via the notification pipeline. No assistant processing occurs.
|
|
97
|
-
- **script** - runs the `script` field as a shell command directly. No LLM invoked, no conversation created. stdout/stderr are captured in the schedule run record. Exit code 0 = success, non-zero = error. Commands run in the workspace directory with a 60-second timeout.
|
|
97
|
+
- **script** - runs the `script` field as a shell command directly. No LLM invoked, no conversation created. stdout/stderr are captured in the schedule run record. Exit code 0 = success, non-zero = error. Commands run in the workspace directory with a 60-second timeout by default. Override the timeout per schedule with `timeout_ms` (range 1000–1800000 ms) when a script needs more or less time; pass `timeout_ms: null` on update to revert to the default. The guardian can also adjust this from the /assistant/settings/schedules page.
|
|
98
98
|
|
|
99
99
|
Use `notify` for simple reminders ("remind me to take medicine at 9am"), `execute` for tasks that need assistant action ("check my calendar at 8am and send me a digest"), and `script` for lightweight shell automations that don't need LLM involvement ("refresh a cache", "poll an API", "rotate logs").
|
|
100
100
|
|
|
@@ -71,6 +71,10 @@
|
|
|
71
71
|
"retry_backoff_ms": {
|
|
72
72
|
"type": "integer",
|
|
73
73
|
"description": "Base backoff delay in milliseconds between retries. Exponential backoff is applied. Defaults to 60000."
|
|
74
|
+
},
|
|
75
|
+
"timeout_ms": {
|
|
76
|
+
"type": "integer",
|
|
77
|
+
"description": "For script mode: maximum time in milliseconds the shell command may run before it is killed. Defaults to 60000 (60s). Allowed range: 1000 to 1800000."
|
|
74
78
|
}
|
|
75
79
|
},
|
|
76
80
|
"required": ["name"]
|
|
@@ -170,6 +174,10 @@
|
|
|
170
174
|
"retry_backoff_ms": {
|
|
171
175
|
"type": "integer",
|
|
172
176
|
"description": "Base backoff delay in milliseconds between retries. Exponential backoff is applied. Defaults to 60000."
|
|
177
|
+
},
|
|
178
|
+
"timeout_ms": {
|
|
179
|
+
"type": ["integer", "null"],
|
|
180
|
+
"description": "For script mode: maximum time in milliseconds the shell command may run before it is killed (default 60000, range 1000 to 1800000). Pass null to clear a custom timeout and revert to the default."
|
|
173
181
|
}
|
|
174
182
|
},
|
|
175
183
|
"required": ["job_id"]
|
|
@@ -26,6 +26,8 @@ export const CALL_SITE_DEFAULTS: Record<LLMCallSite, CallSiteDefaultConfig> = {
|
|
|
26
26
|
profile: "cost-optimized",
|
|
27
27
|
contextWindow: { maxInputTokens: 1000000 },
|
|
28
28
|
},
|
|
29
|
+
memoryV3RouteL1: { profile: "balanced", temperature: 0 },
|
|
30
|
+
memoryV3SelectL2: { profile: "balanced", temperature: 0 },
|
|
29
31
|
recall: {
|
|
30
32
|
profile: "balanced",
|
|
31
33
|
maxTokens: 4096,
|
|
@@ -47,13 +49,6 @@ export const CALL_SITE_DEFAULTS: Record<LLMCallSite, CallSiteDefaultConfig> = {
|
|
|
47
49
|
memoryV2Migration: { profile: "cost-optimized" },
|
|
48
50
|
memoryV2Sweep: { profile: "cost-optimized" },
|
|
49
51
|
memoryV2Consolidation: { profile: "balanced" },
|
|
50
|
-
// memory v3: cheap filter + descent, capable gate. All three are
|
|
51
|
-
// selection/classification calls, not generation — pin temperature to 0 so
|
|
52
|
-
// the same candidate set yields the same keep/descend/select decision instead
|
|
53
|
-
// of sampling-driven variance.
|
|
54
|
-
memoryV3Filter: { profile: "cost-optimized", temperature: 0 },
|
|
55
|
-
memoryV3Descent: { profile: "cost-optimized", temperature: 0 },
|
|
56
|
-
memoryV3Gate: { profile: "balanced", temperature: 0 },
|
|
57
52
|
conversationSummarization: { profile: "cost-optimized" },
|
|
58
53
|
conversationTitle: { profile: "cost-optimized" },
|
|
59
54
|
approvalCopy: { profile: "cost-optimized" },
|
|
@@ -49,14 +49,6 @@
|
|
|
49
49
|
"description": "Enable the A2A (Agent-to-Agent) channel for inter-assistant communication via the open A2A protocol",
|
|
50
50
|
"defaultEnabled": false
|
|
51
51
|
},
|
|
52
|
-
{
|
|
53
|
-
"id": "email-channel",
|
|
54
|
-
"scope": "assistant",
|
|
55
|
-
"key": "email-channel",
|
|
56
|
-
"label": "Email Channel",
|
|
57
|
-
"description": "Enable the entire email integration: email CLI commands, email channel, domain registration, sequences, email readiness probes, invite adapters, and the email-setup skill",
|
|
58
|
-
"defaultEnabled": false
|
|
59
|
-
},
|
|
60
52
|
{
|
|
61
53
|
"id": "settings-developer-nav",
|
|
62
54
|
"scope": "assistant",
|
|
@@ -371,7 +363,7 @@
|
|
|
371
363
|
},
|
|
372
364
|
{
|
|
373
365
|
"id": "home-page",
|
|
374
|
-
"scope": "
|
|
366
|
+
"scope": "both",
|
|
375
367
|
"key": "home-page",
|
|
376
368
|
"label": "Home Page",
|
|
377
369
|
"description": "Enable the Home page as the default landing view.",
|
|
@@ -440,6 +432,30 @@
|
|
|
440
432
|
"label": "Platform Features in Local Mode",
|
|
441
433
|
"description": "When enabled, the assistant can call the Vellum platform API from local mode. When disabled, all platform API clients in the daemon, gateway, CES, and web UI no-op with a debug log instead of making outbound requests.",
|
|
442
434
|
"defaultEnabled": true
|
|
435
|
+
},
|
|
436
|
+
{
|
|
437
|
+
"id": "memory-v3-shadow",
|
|
438
|
+
"scope": "assistant",
|
|
439
|
+
"key": "memory-v3-shadow",
|
|
440
|
+
"label": "Memory v3 Shadow",
|
|
441
|
+
"description": "When on, runs the new memory-v3 topic-tree retrieval alongside v2 in shadow mode: logs selections to memory_v3_selections, does not modify injected context. Off by default.",
|
|
442
|
+
"defaultEnabled": false
|
|
443
|
+
},
|
|
444
|
+
{
|
|
445
|
+
"id": "memory-v3-live",
|
|
446
|
+
"scope": "assistant",
|
|
447
|
+
"key": "memory-v3-live",
|
|
448
|
+
"label": "Memory v3 Live",
|
|
449
|
+
"description": "When on, memory-v3 topic-tree retrieval becomes the live injected memory source (suppressing v2 injection). Off by default; only enable after shadow telemetry validates the design.",
|
|
450
|
+
"defaultEnabled": false
|
|
451
|
+
},
|
|
452
|
+
{
|
|
453
|
+
"id": "self-intro-greeting",
|
|
454
|
+
"scope": "assistant",
|
|
455
|
+
"key": "self-intro-greeting",
|
|
456
|
+
"label": "Self-intro first message",
|
|
457
|
+
"description": "On the first conversation, send a natural self-introduction (e.g. \"Hi Vela, I'm alex. Nice to meet you.\") on the user's behalf and route it through real LLM inference, instead of serving the canned first greeting. Names come from the onboarding context; falls back to the canned greeting when no name is known. See assistant/src/daemon/first-greeting.ts (buildSelfIntroMessage).",
|
|
458
|
+
"defaultEnabled": false
|
|
443
459
|
}
|
|
444
460
|
]
|
|
445
461
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { describe, expect, test } from "bun:test";
|
|
2
2
|
|
|
3
3
|
import { MemoryConfigSchema } from "../memory.js";
|
|
4
|
-
import { MemoryV2ConfigSchema
|
|
4
|
+
import { MemoryV2ConfigSchema } from "../memory-v2.js";
|
|
5
5
|
|
|
6
6
|
describe("MemoryV2ConfigSchema", () => {
|
|
7
7
|
test("parses an empty object to documented defaults", () => {
|
|
@@ -212,231 +212,6 @@ describe("MemoryV2ConfigSchema", () => {
|
|
|
212
212
|
});
|
|
213
213
|
});
|
|
214
214
|
|
|
215
|
-
describe("MemoryV3ConfigSchema", () => {
|
|
216
|
-
test("parses an empty object to documented defaults", () => {
|
|
217
|
-
const parsed = MemoryV3ConfigSchema.parse({});
|
|
218
|
-
expect(parsed).toEqual({
|
|
219
|
-
enabled: false,
|
|
220
|
-
shadow: false,
|
|
221
|
-
passCap: 3,
|
|
222
|
-
breadthBudget: 6,
|
|
223
|
-
maxDepth: 6,
|
|
224
|
-
denseQuota: { activeDomain: 30, offDomain: 8 },
|
|
225
|
-
hotLimit: 50,
|
|
226
|
-
lanes: { hot: true, sparse: true, dense: true, tree: true, edges: true },
|
|
227
|
-
edges: { learnedAdjacencyThreshold: 0, maxPulls: 400 },
|
|
228
|
-
ks: [5, 10, 25, 50],
|
|
229
|
-
write: {
|
|
230
|
-
enabled: false,
|
|
231
|
-
consolidateIntervalMs: 3600000,
|
|
232
|
-
coactivation: false,
|
|
233
|
-
},
|
|
234
|
-
prompts: {
|
|
235
|
-
filter: { override: null, path: null },
|
|
236
|
-
descent: { override: null, path: null },
|
|
237
|
-
gate: { override: null, path: null },
|
|
238
|
-
},
|
|
239
|
-
gateCandidateSummaries: false,
|
|
240
|
-
});
|
|
241
|
-
});
|
|
242
|
-
|
|
243
|
-
test("parses undefined to the same defaults (top-level .default)", () => {
|
|
244
|
-
expect(MemoryV3ConfigSchema.parse(undefined)).toEqual(
|
|
245
|
-
MemoryV3ConfigSchema.parse({}),
|
|
246
|
-
);
|
|
247
|
-
});
|
|
248
|
-
|
|
249
|
-
test("defaults to disabled for backwards compatibility", () => {
|
|
250
|
-
expect(MemoryV3ConfigSchema.parse({}).enabled).toBe(false);
|
|
251
|
-
expect(MemoryV3ConfigSchema.parse({}).shadow).toBe(false);
|
|
252
|
-
});
|
|
253
|
-
|
|
254
|
-
test("accepts explicit scalar overrides", () => {
|
|
255
|
-
const parsed = MemoryV3ConfigSchema.parse({
|
|
256
|
-
enabled: true,
|
|
257
|
-
shadow: true,
|
|
258
|
-
passCap: 5,
|
|
259
|
-
breadthBudget: 10,
|
|
260
|
-
maxDepth: 8,
|
|
261
|
-
});
|
|
262
|
-
expect(parsed.enabled).toBe(true);
|
|
263
|
-
expect(parsed.shadow).toBe(true);
|
|
264
|
-
expect(parsed.passCap).toBe(5);
|
|
265
|
-
expect(parsed.breadthBudget).toBe(10);
|
|
266
|
-
expect(parsed.maxDepth).toBe(8);
|
|
267
|
-
});
|
|
268
|
-
|
|
269
|
-
test("accepts explicit denseQuota override", () => {
|
|
270
|
-
const parsed = MemoryV3ConfigSchema.parse({
|
|
271
|
-
denseQuota: { activeDomain: 50, offDomain: 12 },
|
|
272
|
-
});
|
|
273
|
-
expect(parsed.denseQuota).toEqual({ activeDomain: 50, offDomain: 12 });
|
|
274
|
-
});
|
|
275
|
-
|
|
276
|
-
test("accepts a partial denseQuota override and defaults the rest", () => {
|
|
277
|
-
// Overriding only one leaf must merge with defaults, not fail validation
|
|
278
|
-
// (which would discard the entire user config).
|
|
279
|
-
const onlyActive = MemoryV3ConfigSchema.parse({
|
|
280
|
-
denseQuota: { activeDomain: 50 },
|
|
281
|
-
});
|
|
282
|
-
expect(onlyActive.denseQuota).toEqual({ activeDomain: 50, offDomain: 8 });
|
|
283
|
-
|
|
284
|
-
const onlyOff = MemoryV3ConfigSchema.parse({
|
|
285
|
-
denseQuota: { offDomain: 12 },
|
|
286
|
-
});
|
|
287
|
-
expect(onlyOff.denseQuota).toEqual({ activeDomain: 30, offDomain: 12 });
|
|
288
|
-
});
|
|
289
|
-
|
|
290
|
-
test("accepts a partial lanes override and defaults the rest", () => {
|
|
291
|
-
const parsed = MemoryV3ConfigSchema.parse({ lanes: { dense: false } });
|
|
292
|
-
expect(parsed.lanes).toEqual({
|
|
293
|
-
hot: true,
|
|
294
|
-
sparse: true,
|
|
295
|
-
dense: false,
|
|
296
|
-
tree: true,
|
|
297
|
-
edges: true,
|
|
298
|
-
});
|
|
299
|
-
});
|
|
300
|
-
|
|
301
|
-
test("accepts an explicit ks override", () => {
|
|
302
|
-
const parsed = MemoryV3ConfigSchema.parse({ ks: [1, 3, 7] });
|
|
303
|
-
expect(parsed.ks).toEqual([1, 3, 7]);
|
|
304
|
-
});
|
|
305
|
-
|
|
306
|
-
test("rejects a non-boolean enabled", () => {
|
|
307
|
-
expect(() => MemoryV3ConfigSchema.parse({ enabled: "yes" })).toThrow();
|
|
308
|
-
});
|
|
309
|
-
|
|
310
|
-
test("rejects a non-integer passCap", () => {
|
|
311
|
-
expect(() => MemoryV3ConfigSchema.parse({ passCap: 2.5 })).toThrow();
|
|
312
|
-
});
|
|
313
|
-
|
|
314
|
-
test("rejects non-number ks entries", () => {
|
|
315
|
-
expect(() => MemoryV3ConfigSchema.parse({ ks: ["a"] })).toThrow();
|
|
316
|
-
});
|
|
317
|
-
|
|
318
|
-
test("parses the write subtree to safe off defaults when omitted", () => {
|
|
319
|
-
const parsed = MemoryV3ConfigSchema.parse({});
|
|
320
|
-
expect(parsed.write).toEqual({
|
|
321
|
-
enabled: false,
|
|
322
|
-
consolidateIntervalMs: 3600000,
|
|
323
|
-
coactivation: false,
|
|
324
|
-
});
|
|
325
|
-
});
|
|
326
|
-
|
|
327
|
-
test("accepts a partial write override and defaults the rest", () => {
|
|
328
|
-
const parsed = MemoryV3ConfigSchema.parse({ write: { enabled: true } });
|
|
329
|
-
expect(parsed.write).toEqual({
|
|
330
|
-
enabled: true,
|
|
331
|
-
consolidateIntervalMs: 3600000,
|
|
332
|
-
coactivation: false,
|
|
333
|
-
});
|
|
334
|
-
});
|
|
335
|
-
|
|
336
|
-
test("rejects a non-integer write.consolidateIntervalMs", () => {
|
|
337
|
-
expect(() =>
|
|
338
|
-
MemoryV3ConfigSchema.parse({ write: { consolidateIntervalMs: 1.5 } }),
|
|
339
|
-
).toThrow();
|
|
340
|
-
});
|
|
341
|
-
|
|
342
|
-
test("rejects a non-positive write.consolidateIntervalMs", () => {
|
|
343
|
-
// 0 or negative would make the scheduler's `now - lastRun >= interval`
|
|
344
|
-
// check always true, flooding the queue with consolidation jobs.
|
|
345
|
-
expect(() =>
|
|
346
|
-
MemoryV3ConfigSchema.parse({ write: { consolidateIntervalMs: 0 } }),
|
|
347
|
-
).toThrow();
|
|
348
|
-
expect(() =>
|
|
349
|
-
MemoryV3ConfigSchema.parse({ write: { consolidateIntervalMs: -1000 } }),
|
|
350
|
-
).toThrow();
|
|
351
|
-
});
|
|
352
|
-
|
|
353
|
-
test("accepts a positive write.consolidateIntervalMs override", () => {
|
|
354
|
-
const parsed = MemoryV3ConfigSchema.parse({
|
|
355
|
-
write: { consolidateIntervalMs: 1800000 },
|
|
356
|
-
});
|
|
357
|
-
expect(parsed.write.consolidateIntervalMs).toBe(1800000);
|
|
358
|
-
});
|
|
359
|
-
|
|
360
|
-
test("parses the prompts subtree to null overrides when omitted", () => {
|
|
361
|
-
const parsed = MemoryV3ConfigSchema.parse({});
|
|
362
|
-
expect(parsed.prompts).toEqual({
|
|
363
|
-
filter: { override: null, path: null },
|
|
364
|
-
descent: { override: null, path: null },
|
|
365
|
-
gate: { override: null, path: null },
|
|
366
|
-
});
|
|
367
|
-
});
|
|
368
|
-
|
|
369
|
-
test("accepts a partial prompts override and defaults the rest", () => {
|
|
370
|
-
const parsed = MemoryV3ConfigSchema.parse({
|
|
371
|
-
prompts: { filter: { override: "custom filter prompt" } },
|
|
372
|
-
});
|
|
373
|
-
expect(parsed.prompts.filter).toEqual({
|
|
374
|
-
override: "custom filter prompt",
|
|
375
|
-
path: null,
|
|
376
|
-
});
|
|
377
|
-
// Lanes not mentioned keep their null defaults.
|
|
378
|
-
expect(parsed.prompts.descent).toEqual({ override: null, path: null });
|
|
379
|
-
expect(parsed.prompts.gate).toEqual({ override: null, path: null });
|
|
380
|
-
});
|
|
381
|
-
|
|
382
|
-
test("accepts a file path override for a prompt lane", () => {
|
|
383
|
-
const parsed = MemoryV3ConfigSchema.parse({
|
|
384
|
-
prompts: { gate: { path: "~/prompts/v3-gate.md" } },
|
|
385
|
-
});
|
|
386
|
-
expect(parsed.prompts.gate).toEqual({
|
|
387
|
-
override: null,
|
|
388
|
-
path: "~/prompts/v3-gate.md",
|
|
389
|
-
});
|
|
390
|
-
});
|
|
391
|
-
|
|
392
|
-
test("rejects a non-string prompts override", () => {
|
|
393
|
-
expect(() =>
|
|
394
|
-
MemoryV3ConfigSchema.parse({ prompts: { filter: { override: 42 } } }),
|
|
395
|
-
).toThrow();
|
|
396
|
-
});
|
|
397
|
-
|
|
398
|
-
test("rejects a non-string prompts path", () => {
|
|
399
|
-
expect(() =>
|
|
400
|
-
MemoryV3ConfigSchema.parse({ prompts: { descent: { path: 7 } } }),
|
|
401
|
-
).toThrow();
|
|
402
|
-
});
|
|
403
|
-
});
|
|
404
|
-
|
|
405
|
-
describe("MemoryConfigSchema integration with v3 block", () => {
|
|
406
|
-
test("includes a v3 block defaulting to disabled when v3 is omitted", () => {
|
|
407
|
-
const parsed = MemoryConfigSchema.parse({});
|
|
408
|
-
expect(parsed.v3).toBeDefined();
|
|
409
|
-
expect(parsed.v3.enabled).toBe(false);
|
|
410
|
-
expect(parsed.v3.shadow).toBe(false);
|
|
411
|
-
expect(parsed.v3.passCap).toBe(3);
|
|
412
|
-
expect(parsed.v3.lanes.dense).toBe(true);
|
|
413
|
-
expect(parsed.v3.ks).toEqual([5, 10, 25, 50]);
|
|
414
|
-
expect(parsed.v3.write).toEqual({
|
|
415
|
-
enabled: false,
|
|
416
|
-
consolidateIntervalMs: 3600000,
|
|
417
|
-
coactivation: false,
|
|
418
|
-
});
|
|
419
|
-
});
|
|
420
|
-
|
|
421
|
-
test("leaves pre-existing configs (no v3 key) otherwise unchanged", () => {
|
|
422
|
-
// A config authored before v3 existed parses fine and its v2 block is
|
|
423
|
-
// untouched; the v3 block is purely additive.
|
|
424
|
-
const parsed = MemoryConfigSchema.parse({ v2: { top_k: 50 } });
|
|
425
|
-
expect(parsed.v2.top_k).toBe(50);
|
|
426
|
-
expect(parsed.v3.enabled).toBe(false);
|
|
427
|
-
});
|
|
428
|
-
|
|
429
|
-
test("propagates v3 overrides through MemoryConfigSchema", () => {
|
|
430
|
-
const parsed = MemoryConfigSchema.parse({
|
|
431
|
-
v3: { enabled: true, passCap: 4 },
|
|
432
|
-
});
|
|
433
|
-
expect(parsed.v3.enabled).toBe(true);
|
|
434
|
-
expect(parsed.v3.passCap).toBe(4);
|
|
435
|
-
// Non-overridden v3 fields keep their defaults.
|
|
436
|
-
expect(parsed.v3.maxDepth).toBe(6);
|
|
437
|
-
});
|
|
438
|
-
});
|
|
439
|
-
|
|
440
215
|
describe("MemoryConfigSchema integration with v2 block", () => {
|
|
441
216
|
test("parses an empty memory config and includes a v2 block with defaults", () => {
|
|
442
217
|
const parsed = MemoryConfigSchema.parse({});
|
|
@@ -121,25 +121,18 @@ const CATALOG_RECORD: CatalogRecord = {
|
|
|
121
121
|
"Selects which concept pages to inject for the next agent turn by routing over a cached page index.",
|
|
122
122
|
domain: "memory",
|
|
123
123
|
},
|
|
124
|
-
|
|
125
|
-
id: "
|
|
126
|
-
displayName: "Memory V3
|
|
124
|
+
memoryV3RouteL1: {
|
|
125
|
+
id: "memoryV3RouteL1",
|
|
126
|
+
displayName: "Memory V3 L1 Router",
|
|
127
127
|
description:
|
|
128
|
-
"
|
|
128
|
+
"Picks which leaves of the topic tree to open for the next agent turn by routing over a cache-warm static leaf block.",
|
|
129
129
|
domain: "memory",
|
|
130
130
|
},
|
|
131
|
-
|
|
132
|
-
id: "
|
|
133
|
-
displayName: "Memory V3
|
|
131
|
+
memoryV3SelectL2: {
|
|
132
|
+
id: "memoryV3SelectL2",
|
|
133
|
+
displayName: "Memory V3 L2 Selector",
|
|
134
134
|
description:
|
|
135
|
-
"
|
|
136
|
-
domain: "memory",
|
|
137
|
-
},
|
|
138
|
-
memoryV3Gate: {
|
|
139
|
-
id: "memoryV3Gate",
|
|
140
|
-
displayName: "Memory V3 Gate",
|
|
141
|
-
description:
|
|
142
|
-
"Final capable gate that decides which V3 candidates are injected for the next turn.",
|
|
135
|
+
"Selects which pages within an opened topic-tree leaf are relevant for the next agent turn, one bounded call per leaf over a cache-warm static page block.",
|
|
143
136
|
domain: "memory",
|
|
144
137
|
},
|
|
145
138
|
memoryV2Consolidation: {
|
|
@@ -49,9 +49,8 @@ export const LLMCallSiteEnum = z.enum([
|
|
|
49
49
|
"memoryV2Migration",
|
|
50
50
|
"memoryV2Sweep",
|
|
51
51
|
"memoryRouter",
|
|
52
|
-
"
|
|
53
|
-
"
|
|
54
|
-
"memoryV3Gate",
|
|
52
|
+
"memoryV3RouteL1",
|
|
53
|
+
"memoryV3SelectL2",
|
|
55
54
|
"memoryV2Consolidation",
|
|
56
55
|
"memoryRetrospective",
|
|
57
56
|
"recall",
|
|
@@ -165,6 +165,30 @@ export const MemoryCleanupConfigSchema = z
|
|
|
165
165
|
})
|
|
166
166
|
.describe("Automatic memory cleanup and garbage collection settings");
|
|
167
167
|
|
|
168
|
+
export const MemoryMaintenanceConfigSchema = z
|
|
169
|
+
.object({
|
|
170
|
+
intervalMs: z
|
|
171
|
+
.number({ error: "memory.maintenance.intervalMs must be a number" })
|
|
172
|
+
.int("memory.maintenance.intervalMs must be an integer")
|
|
173
|
+
.positive("memory.maintenance.intervalMs must be a positive integer")
|
|
174
|
+
.default(24 * 60 * 60 * 1000)
|
|
175
|
+
.describe(
|
|
176
|
+
"Minimum interval between database maintenance (VACUUM / PRAGMA optimize) runs, in milliseconds",
|
|
177
|
+
),
|
|
178
|
+
quietPeriodMs: z
|
|
179
|
+
.number({ error: "memory.maintenance.quietPeriodMs must be a number" })
|
|
180
|
+
.int("memory.maintenance.quietPeriodMs must be an integer")
|
|
181
|
+
.nonnegative("memory.maintenance.quietPeriodMs must be non-negative")
|
|
182
|
+
.default(3 * 60 * 60 * 1000)
|
|
183
|
+
.describe(
|
|
184
|
+
"Database maintenance is deferred unless at least this many milliseconds have elapsed since the last user message, so the VACUUM's exclusive lock never collides with an active user (0 disables the quiet-period gate)",
|
|
185
|
+
),
|
|
186
|
+
})
|
|
187
|
+
.describe("Database maintenance (VACUUM / PRAGMA optimize) scheduling");
|
|
188
|
+
|
|
168
189
|
export type MemoryJobsConfig = z.infer<typeof MemoryJobsConfigSchema>;
|
|
169
190
|
export type MemoryRetentionConfig = z.infer<typeof MemoryRetentionConfigSchema>;
|
|
170
191
|
export type MemoryCleanupConfig = z.infer<typeof MemoryCleanupConfigSchema>;
|
|
192
|
+
export type MemoryMaintenanceConfig = z.infer<
|
|
193
|
+
typeof MemoryMaintenanceConfigSchema
|
|
194
|
+
>;
|