@vellumai/assistant 0.8.4 → 0.8.5
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/ARCHITECTURE.md +2 -2
- package/docs/browser-use-architecture-phase2.md +1 -1
- package/knip.json +2 -1
- package/openapi.yaml +809 -11
- package/package.json +1 -1
- package/src/__tests__/anthropic-provider.test.ts +34 -37
- package/src/__tests__/assistant-event-hub-self-exclusion.test.ts +293 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +3 -3
- package/src/__tests__/audit-log-rotation.test.ts +70 -16
- package/src/__tests__/background-workers-disk-pressure.test.ts +3 -3
- package/src/__tests__/btw-routes.test.ts +2 -3
- package/src/__tests__/call-controller.test.ts +0 -1
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +1 -1
- package/src/__tests__/channel-guardian.test.ts +3 -3
- package/src/__tests__/checker.test.ts +6 -15
- package/src/__tests__/compaction-events.test.ts +1 -0
- package/src/__tests__/compactor-call-site-logging.test.ts +214 -0
- package/src/__tests__/computer-use-skill-manifest-regression.test.ts +5 -11
- package/src/__tests__/computer-use-tools.test.ts +2 -4
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +1 -1
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +1 -1
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +197 -2
- package/src/__tests__/conversation-agent-loop.test.ts +163 -122
- package/src/__tests__/conversation-app-control-instantiation.test.ts +2 -5
- package/src/__tests__/conversation-clear-safety.test.ts +25 -25
- package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +1 -1
- package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
- package/src/__tests__/conversation-error.test.ts +31 -0
- package/src/__tests__/conversation-fork-crud.test.ts +178 -15
- package/src/__tests__/conversation-lifecycle.test.ts +52 -11
- package/src/__tests__/{conversation-load-cleaned-at.test.ts → conversation-load-history-stripped.test.ts} +13 -13
- package/src/__tests__/conversation-provider-retry-repair.test.ts +1 -0
- package/src/__tests__/conversation-routes-disk-view.test.ts +109 -0
- package/src/__tests__/conversation-routes-slash-commands.test.ts +35 -0
- package/src/__tests__/conversation-skill-tools.test.ts +2 -5
- package/src/__tests__/conversation-store.test.ts +1 -1
- package/src/__tests__/conversation-sync-tags.test.ts +99 -32
- package/src/__tests__/conversation-workspace-cache-state.test.ts +1 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +1 -1
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +1 -1
- package/src/__tests__/credential-execution-feature-gates.test.ts +9 -7
- package/src/__tests__/credential-execution-tools.test.ts +6 -6
- package/src/__tests__/credential-security-invariants.test.ts +1 -0
- package/src/__tests__/credential-vault-unit.test.ts +2 -2
- package/src/__tests__/dynamic-page-surface.test.ts +2 -2
- package/src/__tests__/email-html-renderer.test.ts +12 -0
- package/src/__tests__/gateway-flag-listener.test.ts +237 -0
- package/src/__tests__/gemini-provider.test.ts +78 -0
- package/src/__tests__/guardian-dispatch.test.ts +0 -1
- package/src/__tests__/guardian-outbound-http.test.ts +7 -5
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +1 -1
- package/src/__tests__/heartbeat-disk-pressure.test.ts +4 -0
- package/src/__tests__/heartbeat-service.test.ts +4 -0
- package/src/__tests__/host-shell-tool.test.ts +1 -1
- package/src/__tests__/init-feature-flag-overrides.test.ts +5 -6
- package/src/__tests__/list-messages-tool-merge.test.ts +70 -11
- package/src/__tests__/llm-request-log-call-site.test.ts +136 -0
- package/src/__tests__/llm-request-log-source-clickhouse.test.ts +26 -0
- package/src/__tests__/llm-resolver.test.ts +77 -9
- package/src/__tests__/llm-usage-store.test.ts +66 -0
- package/src/__tests__/logger.test.ts +89 -0
- package/src/__tests__/mcp-abort-signal.test.ts +2 -2
- package/src/__tests__/media-generate-image.test.ts +31 -0
- package/src/__tests__/memory-v2-static-injector.test.ts +7 -7
- package/src/__tests__/model-intents.test.ts +2 -4
- package/src/__tests__/notification-guardian-path.test.ts +0 -1
- package/src/__tests__/onboarding-template-contract.test.ts +1 -1
- package/src/__tests__/openai-provider.test.ts +46 -0
- package/src/__tests__/openai-responses-provider.test.ts +114 -12
- package/src/__tests__/pending-interactions-resolved-event.test.ts +0 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +2 -2
- package/src/__tests__/platform.test.ts +2 -2
- package/src/__tests__/plugin-api-tool-definition.test.ts +92 -0
- package/src/__tests__/plugin-bootstrap.test.ts +2 -2
- package/src/__tests__/plugin-tool-contribution.test.ts +13 -6
- package/src/__tests__/plugin-types.test.ts +3 -2
- package/src/__tests__/prechat-onboarding-contract.test.ts +131 -98
- package/src/__tests__/pricing.test.ts +12 -0
- package/src/__tests__/prune-jobs-changes-parser.test.ts +61 -0
- package/src/__tests__/registry.test.ts +2 -8
- package/src/__tests__/require-fresh-approval.test.ts +2 -2
- package/src/__tests__/runtime-events-sse-bilingual.test.ts +154 -0
- package/src/__tests__/shell-tool-proxy-mode.test.ts +1 -1
- package/src/__tests__/skill-feature-flags.test.ts +2 -2
- package/src/__tests__/skill-projection-feature-flag.test.ts +4 -7
- package/src/__tests__/skill-projection.benchmark.test.ts +2 -6
- package/src/__tests__/skill-tool-factory.test.ts +1 -1
- package/src/__tests__/subagent-notify-parent.test.ts +1 -1
- package/src/__tests__/suggestion-routes.test.ts +1 -0
- package/src/__tests__/sync-message-contract.test.ts +59 -0
- package/src/__tests__/system-prompt.test.ts +145 -131
- package/src/__tests__/terminal-tools.test.ts +1 -1
- package/src/__tests__/tool-approval-handler.test.ts +1 -5
- package/src/__tests__/tool-execute-pipeline.test.ts +2 -2
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +2 -5
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +15 -5
- package/src/__tests__/tool-executor.test.ts +9 -62
- package/src/__tests__/tool-grant-request-escalation.test.ts +1 -6
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +1 -6
- package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
- package/src/__tests__/ui-file-upload-surface.test.ts +2 -2
- package/src/__tests__/usage-routes.test.ts +3 -0
- package/src/__tests__/verification-control-plane-policy.test.ts +2 -2
- package/src/__tests__/workspace-git-service.test.ts +6 -5
- package/src/__tests__/workspace-migration-089-move-memory-tree-out-of-v3.test.ts +86 -0
- package/src/acp/__tests__/prepare-agent-env.test.ts +146 -0
- package/src/acp/prepare-agent-env.ts +78 -0
- package/src/acp/session-manager.ts +1 -1
- package/src/agent/loop.ts +8 -0
- package/src/api/README.md +5 -0
- package/src/api/index.ts +4 -0
- package/src/api/package.json +10 -0
- package/src/background-wake/background-wake-routes.test.ts +233 -0
- package/src/background-wake/runtime-registry.ts +24 -0
- package/src/cli/commands/__tests__/browser.test.ts +23 -5
- package/src/cli/commands/__tests__/domain-register.test.ts +110 -0
- package/src/cli/commands/__tests__/domain-status.test.ts +33 -33
- package/src/cli/commands/__tests__/inference-send.test.ts +108 -5
- package/src/cli/commands/__tests__/memory-v2-compare-render.test.ts +98 -0
- package/src/cli/commands/__tests__/memory-v2.test.ts +1 -0
- package/src/cli/commands/__tests__/memory-v3-render.test.ts +340 -0
- package/src/cli/commands/browser.ts +247 -0
- package/src/cli/commands/domain.ts +91 -41
- package/src/cli/commands/inference.ts +93 -40
- package/src/cli/commands/memory-v2-compare-render.ts +115 -0
- package/src/cli/commands/memory-v2.ts +176 -1
- package/src/cli/commands/memory-v3-render.ts +344 -0
- package/src/cli/commands/memory-v3.ts +316 -0
- package/src/cli/program.ts +2 -0
- package/src/config/assistant-feature-flags.ts +21 -9
- package/src/config/bundled-skills/document-editor/SKILL.md +11 -2
- package/src/config/bundled-skills/document-editor/TOOLS.json +18 -0
- package/src/config/bundled-skills/document-editor/tools/document-open.ts +12 -0
- package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +2 -2
- package/src/config/bundled-skills/media-processing/tools/ingest-media.ts +13 -8
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +10 -3
- package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +16 -14
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +7 -2
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +7 -2
- package/src/config/bundled-tool-registry.ts +2 -0
- package/src/config/call-site-defaults.ts +7 -6
- package/src/config/feature-flag-registry.json +16 -0
- package/src/config/schemas/__tests__/memory-v2.test.ts +213 -1
- package/src/config/schemas/call-site-catalog.ts +21 -7
- package/src/config/schemas/llm.ts +12 -1
- package/src/config/schemas/memory-v2.ts +246 -0
- package/src/config/schemas/memory.ts +2 -1
- package/src/context/compactor.ts +52 -0
- package/src/conversations/__tests__/message-consolidation.test.ts +350 -0
- package/src/conversations/message-consolidation.ts +404 -0
- package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +1 -1
- package/src/daemon/__tests__/meet-manifest-loader.test.ts +1 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +2 -13
- package/src/daemon/conversation-agent-loop.ts +126 -76
- package/src/daemon/conversation-error.ts +31 -1
- package/src/daemon/conversation-lifecycle.ts +27 -22
- package/src/daemon/conversation-runtime-assembly.ts +10 -9
- package/src/daemon/conversation-tool-setup.ts +63 -3
- package/src/daemon/conversation-usage.ts +2 -0
- package/src/daemon/conversation.ts +14 -29
- package/src/daemon/disk-pressure-guard.ts +14 -2
- package/src/daemon/handlers/config-model.test.ts +1 -0
- package/src/daemon/handlers/conversations.ts +11 -3
- package/src/daemon/host-browser-proxy.ts +5 -5
- package/src/daemon/host-cu-proxy.ts +4 -4
- package/src/daemon/host-file-proxy.ts +4 -4
- package/src/daemon/host-proxy-base.ts +4 -4
- package/src/daemon/host-transfer-proxy.ts +10 -10
- package/src/daemon/lifecycle.ts +23 -20
- package/src/daemon/meet-manifest-loader.ts +1 -7
- package/src/daemon/message-types/conversations.ts +6 -9
- package/src/daemon/message-types/home.ts +1 -13
- package/src/daemon/message-types/messages.ts +6 -14
- package/src/daemon/message-types/sync.ts +14 -0
- package/src/daemon/shutdown-handlers.ts +24 -5
- package/src/daemon/switch-inference-profile-tool.ts +52 -0
- package/src/daemon/tool-setup-types.ts +13 -0
- package/src/events/relationship-state-updated.ts +25 -0
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +1 -1
- package/src/home/home-greeting.ts +0 -9
- package/src/home/suggested-prompts.ts +0 -9
- package/src/ipc/gateway-flag-listener.ts +123 -0
- package/src/ipc/skill-routes/registries.ts +8 -12
- package/src/memory/__tests__/db-async-query.test.ts +165 -0
- package/src/memory/__tests__/db-maintenance.test.ts +115 -0
- package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +241 -0
- package/src/memory/__tests__/jobs-store-job-classes.test.ts +28 -1
- package/src/memory/__tests__/memory-retrospective-job.test.ts +7 -0
- package/src/memory/auto-analysis-enqueue.ts +5 -1
- package/src/memory/conversation-crud.ts +71 -70
- package/src/memory/conversation-starters-cadence.ts +3 -1
- package/src/memory/conversation-title-service.ts +19 -3
- package/src/memory/db-async-query.ts +214 -0
- package/src/memory/db-init.ts +10 -0
- package/src/memory/db-maintenance.ts +30 -21
- package/src/memory/graph/bootstrap.ts +8 -1
- package/src/memory/graph/capability-seed.ts +7 -3
- package/src/memory/graph/conversation-graph-memory.ts +100 -17
- package/src/memory/graph/extraction.ts +1 -5
- package/src/memory/graph/graph-search.ts +7 -1
- package/src/memory/indexer.ts +28 -18
- package/src/memory/job-handlers/cleanup.ts +76 -18
- package/src/memory/job-handlers/conversation-starters.ts +1 -4
- package/src/memory/jobs/embed-pkb-file.ts +6 -1
- package/src/memory/jobs-store.ts +14 -0
- package/src/memory/jobs-worker.ts +55 -22
- package/src/memory/llm-request-log-source-clickhouse.ts +42 -2
- package/src/memory/llm-request-log-source-local.ts +7 -0
- package/src/memory/llm-request-log-source.ts +9 -2
- package/src/memory/llm-request-log-store.ts +43 -1
- package/src/memory/llm-usage-store.ts +24 -0
- package/src/memory/memory-retrospective-enqueue.ts +8 -1
- package/src/memory/memory-retrospective-job.ts +5 -0
- package/src/memory/memory-v2-activation-log-store.ts +15 -6
- package/src/memory/migrations/260-rename-cleaned-at.ts +44 -0
- package/src/memory/migrations/261-llm-usage-add-raw-usage.ts +36 -0
- package/src/memory/migrations/262-memory-v3-coactivation.ts +57 -0
- package/src/memory/migrations/263-memory-v3-auto-edges.ts +50 -0
- package/src/memory/migrations/264-llm-request-log-call-site.ts +29 -0
- package/src/memory/migrations/index.ts +17 -0
- package/src/memory/migrations/registry.ts +33 -0
- package/src/memory/schema/conversations.ts +1 -1
- package/src/memory/schema/infrastructure.ts +21 -0
- package/src/memory/tool-usage-store.ts +36 -8
- package/src/memory/v2/__tests__/consolidation-job.test.ts +1 -0
- package/src/memory/v2/__tests__/harness-compare.test.ts +186 -0
- package/src/memory/v2/__tests__/harness-metrics.test.ts +74 -0
- package/src/memory/v2/__tests__/harness-oracle.test.ts +257 -0
- package/src/memory/v2/__tests__/harness-replay-input.test.ts +225 -0
- package/src/memory/v2/__tests__/harness-runner.test.ts +109 -0
- package/src/memory/v2/__tests__/injection.test.ts +127 -98
- package/src/memory/v2/__tests__/qdrant.test.ts +36 -0
- package/src/memory/v2/__tests__/router.test.ts +171 -3
- package/src/memory/v2/harness/compare.ts +57 -0
- package/src/memory/v2/harness/metrics.ts +124 -0
- package/src/memory/v2/harness/oracle.ts +145 -0
- package/src/memory/v2/harness/replay-input.ts +224 -0
- package/src/memory/v2/harness/retriever.ts +74 -0
- package/src/memory/v2/harness/router-retriever.ts +43 -0
- package/src/memory/v2/harness/runner.ts +106 -0
- package/src/memory/v2/harness/trace.ts +58 -0
- package/src/memory/v2/injection.ts +21 -15
- package/src/memory/v2/prompts/router.ts +26 -1
- package/src/memory/v2/qdrant.ts +14 -2
- package/src/memory/v2/router.ts +171 -18
- package/src/memory/v3/__tests__/coactivation-store.test.ts +422 -0
- package/src/memory/v3/__tests__/consolidation-job.test.ts +468 -0
- package/src/memory/v3/__tests__/edge-learning-job.test.ts +324 -0
- package/src/memory/v3/__tests__/edges.test.ts +563 -0
- package/src/memory/v3/__tests__/filter.test.ts +512 -0
- package/src/memory/v3/__tests__/gate.test.ts +574 -0
- package/src/memory/v3/__tests__/index-composition.test.ts +233 -0
- package/src/memory/v3/__tests__/loop.test.ts +530 -0
- package/src/memory/v3/__tests__/retriever.test.ts +226 -0
- package/src/memory/v3/__tests__/scouts.test.ts +440 -0
- package/src/memory/v3/__tests__/shadow-middleware.test.ts +312 -0
- package/src/memory/v3/__tests__/system-prompts.test.ts +154 -0
- package/src/memory/v3/__tests__/traversal.test.ts +469 -0
- package/src/memory/v3/__tests__/tree-index.test.ts +280 -0
- package/src/memory/v3/__tests__/tree-store.test.ts +529 -0
- package/src/memory/v3/__tests__/tree-walk.test.ts +707 -0
- package/src/memory/v3/__tests__/validate.test.ts +245 -0
- package/src/memory/v3/auto-edges.ts +223 -0
- package/src/memory/v3/coactivation-store.ts +124 -0
- package/src/memory/v3/consolidation-job.ts +323 -0
- package/src/memory/v3/edge-learning-job.ts +160 -0
- package/src/memory/v3/edges.ts +249 -0
- package/src/memory/v3/filter.ts +281 -0
- package/src/memory/v3/gate.ts +334 -0
- package/src/memory/v3/index-composition.ts +113 -0
- package/src/memory/v3/llm-capture.ts +46 -0
- package/src/memory/v3/loop.ts +382 -0
- package/src/memory/v3/maintenance.ts +144 -0
- package/src/memory/v3/prompt-context.ts +33 -0
- package/src/memory/v3/prompts/consolidation.ts +458 -0
- package/src/memory/v3/prompts/system-prompts.ts +196 -0
- package/src/memory/v3/retriever.ts +33 -0
- package/src/memory/v3/scouts.ts +420 -0
- package/src/memory/v3/shadow-middleware.ts +305 -0
- package/src/memory/v3/traversal.ts +206 -0
- package/src/memory/v3/tree-index.ts +237 -0
- package/src/memory/v3/tree-store.ts +394 -0
- package/src/memory/v3/tree-walk.ts +351 -0
- package/src/memory/v3/types.ts +65 -0
- package/src/memory/v3/validate.ts +300 -0
- package/src/notifications/adapters/macos.ts +18 -1
- package/src/notifications/adapters/platform.ts +1 -1
- package/src/notifications/decision-engine.ts +1 -4
- package/src/notifications/emit-signal.ts +29 -49
- package/src/permissions/prompter.ts +3 -3
- package/src/permissions/question-prompter.ts +5 -2
- package/src/permissions/secret-prompter.ts +2 -2
- package/src/plugin-api/index.ts +4 -0
- package/src/plugin-api/types.ts +7 -33
- package/src/plugins/defaults/index.ts +6 -0
- package/src/plugins/defaults/injectors.ts +18 -11
- package/src/plugins/external-plugin-loader.ts +5 -68
- package/src/plugins/types.ts +11 -16
- package/src/proactive-artifact/aux-message-injector.ts +17 -4
- package/src/prompts/__tests__/task-progress-hint-section.test.ts +3 -9
- package/src/prompts/persona-resolver.ts +36 -21
- package/src/prompts/sections.ts +39 -7
- package/src/prompts/system-prompt.ts +50 -185
- package/src/prompts/templates/BOOTSTRAP.md +2 -2
- package/src/prompts/templates/system-sections.ts +230 -8
- package/src/providers/__tests__/connection-model-compat.test.ts +234 -0
- package/src/providers/__tests__/retry-callsite.test.ts +85 -5
- package/src/providers/anthropic/client.ts +32 -66
- package/src/providers/call-site-routing.ts +14 -2
- package/src/providers/connection-model-compat.ts +38 -0
- package/src/providers/connection-resolution.ts +16 -2
- package/src/providers/gemini/client.ts +49 -6
- package/src/providers/inference/adapter-factory.ts +3 -0
- package/src/providers/minimax/client.ts +106 -0
- package/src/providers/model-catalog.ts +43 -0
- package/src/providers/model-intents.ts +1 -1
- package/src/providers/openai/chat-completions-provider.ts +6 -3
- package/src/providers/openai/codex-models.ts +18 -0
- package/src/providers/openai/responses-provider.ts +78 -21
- package/src/providers/provider-send-message.ts +7 -1
- package/src/providers/retry.ts +34 -3
- package/src/providers/thinking-config.ts +26 -1
- package/src/providers/usage-tracking.ts +2 -0
- package/src/runtime/AGENTS.md +2 -2
- package/src/runtime/agent-wake.ts +1 -0
- package/src/runtime/assistant-event-hub.ts +76 -6
- package/src/runtime/auth/route-policy.ts +36 -0
- package/src/runtime/btw-sidechain.ts +0 -6
- package/src/runtime/http-types.ts +0 -2
- package/src/runtime/migrations/vbundle-builder.ts +10 -3
- package/src/runtime/pending-interactions.ts +0 -1
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +106 -0
- package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +25 -6
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +512 -0
- package/src/runtime/routes/acp-routes.test.ts +255 -6
- package/src/runtime/routes/acp-routes.ts +8 -1
- package/src/runtime/routes/avatar-routes.ts +10 -10
- package/src/runtime/routes/background-wake-routes.ts +188 -0
- package/src/runtime/routes/browser-tabs-routes.ts +200 -0
- package/src/runtime/routes/btw-routes.ts +0 -6
- package/src/runtime/routes/conversation-cli-routes.ts +1 -1
- package/src/runtime/routes/conversation-list-routes.ts +12 -4
- package/src/runtime/routes/conversation-management-routes.ts +77 -20
- package/src/runtime/routes/conversation-query-routes.ts +142 -36
- package/src/runtime/routes/conversation-routes.ts +252 -410
- package/src/runtime/routes/conversation-starter-routes.ts +6 -3
- package/src/runtime/routes/disk-pressure-routes.ts +1 -1
- package/src/runtime/routes/domain-routes.ts +60 -10
- package/src/runtime/routes/email-routes.ts +5 -2
- package/src/runtime/routes/events-routes.ts +54 -10
- package/src/runtime/routes/group-routes.ts +24 -8
- package/src/runtime/routes/host-browser-routes.ts +10 -2
- package/src/runtime/routes/host-cu-routes.ts +2 -2
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +96 -3
- package/src/runtime/routes/index.ts +8 -0
- package/src/runtime/routes/inference-profile-session-handler.ts +22 -12
- package/src/runtime/routes/inference-profile-session-routes.ts +7 -1
- package/src/runtime/routes/llm-call-sites-routes.ts +32 -5
- package/src/runtime/routes/memory-item-routes.ts +8 -3
- package/src/runtime/routes/memory-v2-routes.ts +215 -5
- package/src/runtime/routes/memory-v3-routes.ts +316 -0
- package/src/runtime/routes/migration-routes.ts +21 -24
- package/src/runtime/routes/plugins-routes.ts +337 -0
- package/src/runtime/routes/rename-conversation-routes.ts +6 -2
- package/src/runtime/routes/secret-routes.ts +25 -5
- package/src/runtime/routes/settings-routes.ts +12 -11
- package/src/runtime/routes/slack-channel-routes.ts +5 -4
- package/src/runtime/routes/workspace-routes.ts +25 -10
- package/src/runtime/sync/resource-sync-events.ts +106 -38
- package/src/runtime/sync/sync-publisher.test.ts +49 -0
- package/src/runtime/sync/sync-publisher.ts +2 -1
- package/src/runtime/verification-outbound-actions.ts +73 -1
- package/src/telemetry/types.ts +12 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +48 -0
- package/src/telemetry/usage-telemetry-reporter.ts +1 -0
- package/src/tools/acp/spawn.test.ts +119 -0
- package/src/tools/acp/spawn.ts +15 -2
- package/src/tools/apps/definitions.ts +2 -8
- package/src/tools/ask-question/ask-question-tool.test.ts +3 -3
- package/src/tools/ask-question/ask-question-tool.ts +38 -45
- package/src/tools/browser/__tests__/pinned-tabs.test.ts +70 -0
- package/src/tools/browser/browser-execution.ts +16 -3
- package/src/tools/browser/cdp-client/__tests__/browser-tabs-factory.test.ts +402 -0
- package/src/tools/browser/cdp-client/__tests__/types.test.ts +3 -0
- package/src/tools/browser/cdp-client/cdp-inspect-client.ts +12 -0
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +27 -1
- package/src/tools/browser/cdp-client/factory.ts +100 -17
- package/src/tools/browser/cdp-client/local-cdp-client.ts +12 -0
- package/src/tools/browser/cdp-client/types.ts +65 -0
- package/src/tools/browser/pinned-tabs.ts +96 -40
- package/src/tools/computer-use/definitions.ts +22 -78
- package/src/tools/credential-execution/make-authenticated-request.ts +3 -9
- package/src/tools/credential-execution/manage-secure-command-tool.ts +3 -9
- package/src/tools/credential-execution/run-authenticated-command.ts +3 -9
- package/src/tools/credentials/vault.ts +3 -9
- package/src/tools/document/document-tool.ts +59 -0
- package/src/tools/execution-target.ts +21 -23
- package/src/tools/executor.ts +6 -1
- package/src/tools/filesystem/edit.ts +3 -9
- package/src/tools/filesystem/list.ts +3 -9
- package/src/tools/filesystem/read.ts +3 -9
- package/src/tools/filesystem/write.ts +3 -9
- package/src/tools/host-filesystem/edit.ts +3 -9
- package/src/tools/host-filesystem/read.ts +3 -9
- package/src/tools/host-filesystem/transfer.ts +3 -9
- package/src/tools/host-filesystem/write.ts +3 -9
- package/src/tools/host-terminal/host-shell.ts +3 -9
- package/src/tools/mcp/mcp-tool-factory.ts +1 -8
- package/src/tools/memory/register.test.ts +1 -1
- package/src/tools/memory/register.ts +4 -9
- package/src/tools/network/web-fetch.ts +3 -9
- package/src/tools/network/web-search.ts +25 -32
- package/src/tools/registry.ts +7 -23
- package/src/tools/schema-transforms.ts +1 -1
- package/src/tools/skills/execute.ts +3 -9
- package/src/tools/skills/load.ts +3 -9
- package/src/tools/skills/skill-tool-factory.ts +1 -8
- package/src/tools/subagent/notify-parent.ts +3 -9
- package/src/tools/system/request-permission.ts +3 -9
- package/src/tools/terminal/shell.ts +3 -9
- package/src/tools/tool-defaults.ts +94 -0
- package/src/tools/types.ts +27 -98
- package/src/tools/ui-surface/definitions.ts +6 -22
- package/src/usage/pricing.ts +23 -0
- package/src/usage/types.ts +12 -0
- package/src/util/logger.ts +16 -7
- package/src/util/platform.ts +7 -2
- package/src/util/sqlite3-runtime.ts +65 -0
- package/src/workspace/migrations/086-revert-stale-gemini-mis-rewrites.ts +1 -0
- package/src/workspace/migrations/089-move-memory-tree-out-of-v3.ts +86 -0
- package/src/workspace/migrations/registry.ts +2 -0
- package/src/__tests__/compaction-strip-metadata-clear.test.ts +0 -206
- package/src/__tests__/message-complete-display-id.test.ts +0 -175
- package/src/daemon/query-complexity-router.ts +0 -75
- package/src/prompts/cache-boundary.ts +0 -8
|
@@ -53,14 +53,13 @@ import {
|
|
|
53
53
|
getConversation,
|
|
54
54
|
getConversationOriginChannel,
|
|
55
55
|
getConversationOverrideProfileFromRow,
|
|
56
|
-
|
|
56
|
+
setConversationHistoryStrippedAt,
|
|
57
57
|
} from "../memory/conversation-crud.js";
|
|
58
58
|
import { ConversationGraphMemory } from "../memory/graph/conversation-graph-memory.js";
|
|
59
59
|
import { shouldExposePersonalMemory } from "../memory/v2/static-context.js";
|
|
60
60
|
import { PermissionPrompter } from "../permissions/prompter.js";
|
|
61
61
|
import { SecretPrompter } from "../permissions/secret-prompter.js";
|
|
62
62
|
import type { UserDecision } from "../permissions/types.js";
|
|
63
|
-
import { resolvePersonaContext } from "../prompts/persona-resolver.js";
|
|
64
63
|
import { buildSystemPrompt } from "../prompts/system-prompt.js";
|
|
65
64
|
import type { Message } from "../providers/types.js";
|
|
66
65
|
import type { Provider } from "../providers/types.js";
|
|
@@ -492,19 +491,12 @@ export class Conversation {
|
|
|
492
491
|
const resolved: ResolvedSystemPrompt = {
|
|
493
492
|
systemPrompt: this.hasSystemPromptOverride
|
|
494
493
|
? systemPrompt
|
|
495
|
-
: (
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
)
|
|
500
|
-
|
|
501
|
-
hasNoClient: this.hasNoClient,
|
|
502
|
-
userPersona: persona.userPersona,
|
|
503
|
-
channelPersona: persona.channelPersona,
|
|
504
|
-
userSlug: persona.userSlug,
|
|
505
|
-
onboardingContext: this.getOnboardingContext(),
|
|
506
|
-
});
|
|
507
|
-
})(),
|
|
494
|
+
: buildSystemPrompt({
|
|
495
|
+
hasNoClient: this.hasNoClient,
|
|
496
|
+
trustContext: this.currentTurnTrustContext,
|
|
497
|
+
channelCapabilities: this.currentTurnChannelCapabilities,
|
|
498
|
+
onboardingContext: this.getOnboardingContext(),
|
|
499
|
+
}),
|
|
508
500
|
};
|
|
509
501
|
if (configuredMaxTokens !== undefined) {
|
|
510
502
|
resolved.maxTokens = configuredMaxTokens;
|
|
@@ -583,19 +575,12 @@ export class Conversation {
|
|
|
583
575
|
|
|
584
576
|
const systemPrompt = this.hasSystemPromptOverride
|
|
585
577
|
? this.systemPrompt
|
|
586
|
-
: (
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
)
|
|
591
|
-
|
|
592
|
-
hasNoClient: this.hasNoClient,
|
|
593
|
-
userPersona: persona.userPersona,
|
|
594
|
-
channelPersona: persona.channelPersona,
|
|
595
|
-
userSlug: persona.userSlug,
|
|
596
|
-
onboardingContext: this.getOnboardingContext(),
|
|
597
|
-
});
|
|
598
|
-
})();
|
|
578
|
+
: buildSystemPrompt({
|
|
579
|
+
hasNoClient: this.hasNoClient,
|
|
580
|
+
trustContext: this.currentTurnTrustContext,
|
|
581
|
+
channelCapabilities: this.currentTurnChannelCapabilities,
|
|
582
|
+
onboardingContext: this.getOnboardingContext(),
|
|
583
|
+
});
|
|
599
584
|
const tools = buildToolDefinitions();
|
|
600
585
|
const provider = this.provider;
|
|
601
586
|
|
|
@@ -1155,7 +1140,7 @@ export class Conversation {
|
|
|
1155
1140
|
this.messages = stripped;
|
|
1156
1141
|
await this.graphMemory.onCompacted(0);
|
|
1157
1142
|
this.pendingPostCompactReinject = true;
|
|
1158
|
-
|
|
1143
|
+
setConversationHistoryStrippedAt(this.conversationId, Date.now());
|
|
1159
1144
|
const estimatedInputTokens = this.contextWindowManager.estimateInputTokens(
|
|
1160
1145
|
this.messages,
|
|
1161
1146
|
);
|
|
@@ -6,6 +6,7 @@ import { cancelBackgroundTools } from "../tools/background-tool-registry.js";
|
|
|
6
6
|
import { getDiskUsageInfo } from "../util/disk-usage.js";
|
|
7
7
|
import { getLogger } from "../util/logger.js";
|
|
8
8
|
|
|
9
|
+
export const DISK_PRESSURE_WARNING_THRESHOLD_PERCENT = 80;
|
|
9
10
|
export const DISK_PRESSURE_THRESHOLD_PERCENT = 95;
|
|
10
11
|
export const DISK_PRESSURE_CHECK_INTERVAL_MS = 60_000;
|
|
11
12
|
export const DISK_PRESSURE_OVERRIDE_CONFIRMATION = "I understand the risks";
|
|
@@ -15,7 +16,7 @@ export const DISK_PRESSURE_BLOCKED_CAPABILITIES = [
|
|
|
15
16
|
"remote-ingress",
|
|
16
17
|
] as const;
|
|
17
18
|
|
|
18
|
-
export type DiskPressureState = "disabled" | "ok" | "critical" | "unknown";
|
|
19
|
+
export type DiskPressureState = "disabled" | "ok" | "warning" | "critical" | "unknown";
|
|
19
20
|
|
|
20
21
|
export type DiskPressureBlockedCapability =
|
|
21
22
|
(typeof DISK_PRESSURE_BLOCKED_CAPABILITIES)[number];
|
|
@@ -229,9 +230,10 @@ export function evaluateDiskPressureNow(): DiskPressureStatus {
|
|
|
229
230
|
(usageInfo.usedMb / usageInfo.totalMb) * 100,
|
|
230
231
|
);
|
|
231
232
|
const isCritical = usagePercent >= DISK_PRESSURE_THRESHOLD_PERCENT;
|
|
233
|
+
const isWarning = !isCritical && usagePercent >= DISK_PRESSURE_WARNING_THRESHOLD_PERCENT;
|
|
232
234
|
const lastCheckedAt = new Date().toISOString();
|
|
233
235
|
|
|
234
|
-
if (!isCritical) {
|
|
236
|
+
if (!isCritical && !isWarning) {
|
|
235
237
|
return replaceStatus({
|
|
236
238
|
...OPEN_STATUS,
|
|
237
239
|
usagePercent,
|
|
@@ -240,6 +242,16 @@ export function evaluateDiskPressureNow(): DiskPressureStatus {
|
|
|
240
242
|
});
|
|
241
243
|
}
|
|
242
244
|
|
|
245
|
+
if (isWarning) {
|
|
246
|
+
return replaceStatus({
|
|
247
|
+
...OPEN_STATUS,
|
|
248
|
+
state: "warning",
|
|
249
|
+
usagePercent,
|
|
250
|
+
path: usageInfo.path,
|
|
251
|
+
lastCheckedAt,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
|
|
243
255
|
if (!state.status.locked) {
|
|
244
256
|
cancelTerminalBackgroundToolsForLock();
|
|
245
257
|
}
|
|
@@ -36,7 +36,15 @@ export function handleConfirmationResponse(msg: ConfirmationResponse): void {
|
|
|
36
36
|
undefined,
|
|
37
37
|
{ source: "button" },
|
|
38
38
|
);
|
|
39
|
-
|
|
39
|
+
// Idempotent cleanup: the prompter's `resolveConfirmation` already
|
|
40
|
+
// resolved the interaction with the correct approved/rejected state
|
|
41
|
+
// before we reach here, so the entry is typically gone. This call is
|
|
42
|
+
// a safety net for paths where the prompter no-ops; map decision to
|
|
43
|
+
// state to keep the emitted event accurate when it does fire.
|
|
44
|
+
pendingInteractions.resolve(
|
|
45
|
+
msg.requestId,
|
|
46
|
+
decision === "allow" ? "approved" : "rejected",
|
|
47
|
+
);
|
|
40
48
|
return;
|
|
41
49
|
}
|
|
42
50
|
}
|
|
@@ -49,13 +57,13 @@ export function handleConfirmationResponse(msg: ConfirmationResponse): void {
|
|
|
49
57
|
/**
|
|
50
58
|
* Clear all conversations and DB conversations. Returns the number of conversations cleared.
|
|
51
59
|
*/
|
|
52
|
-
export function clearAllConversations(): number {
|
|
60
|
+
export async function clearAllConversations(): Promise<number> {
|
|
53
61
|
const cleared = clearAllActiveConversations();
|
|
54
62
|
// Also clear DB conversations. When a new local connection triggers
|
|
55
63
|
// sendInitialConversation, it auto-creates a conversation if none exist.
|
|
56
64
|
// Without this DB clear, that auto-created row survives, contradicting
|
|
57
65
|
// the "clear all conversations" intent.
|
|
58
|
-
clearAll();
|
|
66
|
+
await clearAll();
|
|
59
67
|
return cleared;
|
|
60
68
|
}
|
|
61
69
|
|
|
@@ -185,7 +185,7 @@ export class HostBrowserProxy {
|
|
|
185
185
|
let detachAbort: () => void = () => {};
|
|
186
186
|
|
|
187
187
|
const timer = setTimeout(() => {
|
|
188
|
-
pendingInteractions.resolve(requestId);
|
|
188
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
189
189
|
log.warn(
|
|
190
190
|
{ requestId, cdpMethod: input.cdpMethod },
|
|
191
191
|
"Host browser proxy request timed out",
|
|
@@ -200,7 +200,7 @@ export class HostBrowserProxy {
|
|
|
200
200
|
if (signal) {
|
|
201
201
|
const onAbort = () => {
|
|
202
202
|
if (pendingInteractions.get(requestId)) {
|
|
203
|
-
pendingInteractions.resolve(requestId);
|
|
203
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
204
204
|
try {
|
|
205
205
|
broadcastMessage({
|
|
206
206
|
type: "host_browser_cancel",
|
|
@@ -229,7 +229,7 @@ export class HostBrowserProxy {
|
|
|
229
229
|
|
|
230
230
|
try {
|
|
231
231
|
if (!preferredClient) {
|
|
232
|
-
pendingInteractions.resolve(requestId);
|
|
232
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
233
233
|
reject(
|
|
234
234
|
new Error(
|
|
235
235
|
"host_browser send failed: no active extension connection",
|
|
@@ -244,7 +244,7 @@ export class HostBrowserProxy {
|
|
|
244
244
|
{ targetClientId: preferredClient.clientId },
|
|
245
245
|
);
|
|
246
246
|
} catch (err) {
|
|
247
|
-
pendingInteractions.resolve(requestId);
|
|
247
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
248
248
|
log.warn(
|
|
249
249
|
{ requestId, cdpMethod: input.cdpMethod, err },
|
|
250
250
|
"Host browser proxy send failed",
|
|
@@ -256,7 +256,7 @@ export class HostBrowserProxy {
|
|
|
256
256
|
|
|
257
257
|
dispose(): void {
|
|
258
258
|
for (const entry of pendingInteractions.getByKind("host_browser")) {
|
|
259
|
-
pendingInteractions.resolve(entry.requestId);
|
|
259
|
+
pendingInteractions.resolve(entry.requestId, "cancelled");
|
|
260
260
|
try {
|
|
261
261
|
broadcastMessage({
|
|
262
262
|
type: "host_browser_cancel",
|
|
@@ -195,7 +195,7 @@ export class HostCuProxy {
|
|
|
195
195
|
|
|
196
196
|
const timer = setTimeout(() => {
|
|
197
197
|
this._ownedRequests.delete(requestId);
|
|
198
|
-
pendingInteractions.resolve(requestId);
|
|
198
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
199
199
|
log.warn({ requestId, toolName }, "Host CU proxy request timed out");
|
|
200
200
|
resolve({
|
|
201
201
|
content: "Host CU proxy timed out waiting for client response",
|
|
@@ -207,7 +207,7 @@ export class HostCuProxy {
|
|
|
207
207
|
const onAbort = () => {
|
|
208
208
|
if (pendingInteractions.get(requestId)) {
|
|
209
209
|
this._ownedRequests.delete(requestId);
|
|
210
|
-
pendingInteractions.resolve(requestId);
|
|
210
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
211
211
|
try {
|
|
212
212
|
broadcastMessage(
|
|
213
213
|
{
|
|
@@ -263,7 +263,7 @@ export class HostCuProxy {
|
|
|
263
263
|
);
|
|
264
264
|
} catch (err) {
|
|
265
265
|
this._ownedRequests.delete(requestId);
|
|
266
|
-
pendingInteractions.resolve(requestId);
|
|
266
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
267
267
|
log.warn({ requestId, toolName, err }, "Host CU proxy send failed");
|
|
268
268
|
reject(err instanceof Error ? err : new Error(String(err)));
|
|
269
269
|
}
|
|
@@ -447,7 +447,7 @@ export class HostCuProxy {
|
|
|
447
447
|
|
|
448
448
|
dispose(): void {
|
|
449
449
|
for (const requestId of this._ownedRequests) {
|
|
450
|
-
const entry = pendingInteractions.resolve(requestId);
|
|
450
|
+
const entry = pendingInteractions.resolve(requestId, "cancelled");
|
|
451
451
|
if (!entry) continue;
|
|
452
452
|
try {
|
|
453
453
|
broadcastMessage(
|
|
@@ -136,7 +136,7 @@ export class HostFileProxy {
|
|
|
136
136
|
let detachAbort: () => void = () => {};
|
|
137
137
|
|
|
138
138
|
const timer = setTimeout(() => {
|
|
139
|
-
pendingInteractions.resolve(requestId);
|
|
139
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
140
140
|
log.warn(
|
|
141
141
|
{ requestId, operation: input.operation },
|
|
142
142
|
"Host file proxy request timed out",
|
|
@@ -152,7 +152,7 @@ export class HostFileProxy {
|
|
|
152
152
|
if (signal) {
|
|
153
153
|
const onAbort = () => {
|
|
154
154
|
if (pendingInteractions.get(requestId)) {
|
|
155
|
-
pendingInteractions.resolve(requestId);
|
|
155
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
156
156
|
try {
|
|
157
157
|
broadcastMessage(
|
|
158
158
|
{
|
|
@@ -210,7 +210,7 @@ export class HostFileProxy {
|
|
|
210
210
|
{ targetClientId: resolvedTargetClientId },
|
|
211
211
|
);
|
|
212
212
|
} catch (err) {
|
|
213
|
-
pendingInteractions.resolve(requestId);
|
|
213
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
214
214
|
log.warn(
|
|
215
215
|
{ requestId, operation: input.operation, err },
|
|
216
216
|
"Host file proxy send failed",
|
|
@@ -252,7 +252,7 @@ export class HostFileProxy {
|
|
|
252
252
|
|
|
253
253
|
dispose(): void {
|
|
254
254
|
for (const entry of pendingInteractions.getByKind("host_file")) {
|
|
255
|
-
pendingInteractions.resolve(entry.requestId);
|
|
255
|
+
pendingInteractions.resolve(entry.requestId, "cancelled");
|
|
256
256
|
try {
|
|
257
257
|
broadcastMessage(
|
|
258
258
|
{
|
|
@@ -154,7 +154,7 @@ export abstract class HostProxyBase<TRequest, TResultPayload> {
|
|
|
154
154
|
const timer = setTimeout(() => {
|
|
155
155
|
this.pending.delete(requestId);
|
|
156
156
|
detachAbort();
|
|
157
|
-
pendingInteractions.resolve(requestId);
|
|
157
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
158
158
|
log.warn(
|
|
159
159
|
{ requestId, toolName, kind: this.resultPendingKind },
|
|
160
160
|
"Host proxy request timed out",
|
|
@@ -168,7 +168,7 @@ export abstract class HostProxyBase<TRequest, TResultPayload> {
|
|
|
168
168
|
clearTimeout(timer);
|
|
169
169
|
this.pending.delete(requestId);
|
|
170
170
|
detachAbort();
|
|
171
|
-
pendingInteractions.resolve(requestId);
|
|
171
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
172
172
|
try {
|
|
173
173
|
broadcastDynamic(
|
|
174
174
|
{
|
|
@@ -239,7 +239,7 @@ export abstract class HostProxyBase<TRequest, TResultPayload> {
|
|
|
239
239
|
clearTimeout(timer);
|
|
240
240
|
this.pending.delete(requestId);
|
|
241
241
|
detachAbort();
|
|
242
|
-
pendingInteractions.resolve(requestId);
|
|
242
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
243
243
|
log.warn(
|
|
244
244
|
{ requestId, toolName, kind: this.resultPendingKind, err },
|
|
245
245
|
"Host proxy send failed",
|
|
@@ -285,7 +285,7 @@ export abstract class HostProxyBase<TRequest, TResultPayload> {
|
|
|
285
285
|
for (const [requestId, entry] of this.pending) {
|
|
286
286
|
clearTimeout(entry.timer);
|
|
287
287
|
entry.detachAbort();
|
|
288
|
-
pendingInteractions.resolve(requestId);
|
|
288
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
289
289
|
try {
|
|
290
290
|
broadcastDynamic(
|
|
291
291
|
{
|
|
@@ -205,7 +205,7 @@ export class HostTransferProxy {
|
|
|
205
205
|
|
|
206
206
|
const timer = setTimeout(() => {
|
|
207
207
|
this.transfers.delete(transferId);
|
|
208
|
-
pendingInteractions.resolve(requestId);
|
|
208
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
209
209
|
log.warn(
|
|
210
210
|
{ requestId, transferId, direction: "to_host" },
|
|
211
211
|
"Host transfer proxy request timed out",
|
|
@@ -222,7 +222,7 @@ export class HostTransferProxy {
|
|
|
222
222
|
const onAbort = () => {
|
|
223
223
|
if (pendingInteractions.get(requestId)) {
|
|
224
224
|
this.transfers.delete(transferId);
|
|
225
|
-
pendingInteractions.resolve(requestId);
|
|
225
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
226
226
|
try {
|
|
227
227
|
broadcastMessage(
|
|
228
228
|
{
|
|
@@ -301,7 +301,7 @@ export class HostTransferProxy {
|
|
|
301
301
|
);
|
|
302
302
|
} catch (err) {
|
|
303
303
|
this.transfers.delete(transferId);
|
|
304
|
-
pendingInteractions.resolve(requestId);
|
|
304
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
305
305
|
log.warn(
|
|
306
306
|
{ requestId, transferId, err },
|
|
307
307
|
"Host transfer proxy send failed",
|
|
@@ -396,7 +396,7 @@ export class HostTransferProxy {
|
|
|
396
396
|
|
|
397
397
|
const timer = setTimeout(() => {
|
|
398
398
|
this.transfers.delete(transferId);
|
|
399
|
-
pendingInteractions.resolve(requestId);
|
|
399
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
400
400
|
log.warn(
|
|
401
401
|
{ requestId, transferId, direction: "to_sandbox" },
|
|
402
402
|
"Host transfer proxy request timed out",
|
|
@@ -413,7 +413,7 @@ export class HostTransferProxy {
|
|
|
413
413
|
const onAbort = () => {
|
|
414
414
|
if (pendingInteractions.get(requestId)) {
|
|
415
415
|
this.transfers.delete(transferId);
|
|
416
|
-
pendingInteractions.resolve(requestId);
|
|
416
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
417
417
|
try {
|
|
418
418
|
broadcastMessage(
|
|
419
419
|
{
|
|
@@ -487,7 +487,7 @@ export class HostTransferProxy {
|
|
|
487
487
|
);
|
|
488
488
|
} catch (err) {
|
|
489
489
|
this.transfers.delete(transferId);
|
|
490
|
-
pendingInteractions.resolve(requestId);
|
|
490
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
491
491
|
log.warn(
|
|
492
492
|
{ requestId, transferId, err },
|
|
493
493
|
"Host transfer proxy send failed",
|
|
@@ -622,14 +622,14 @@ export class HostTransferProxy {
|
|
|
622
622
|
|
|
623
623
|
if (entry.overwrite !== true && existsSync(entry.filePath)) {
|
|
624
624
|
const errorMsg = `Destination file already exists: ${entry.filePath}. Set overwrite to true to replace it.`;
|
|
625
|
-
const interaction = pendingInteractions.resolve(requestId);
|
|
625
|
+
const interaction = pendingInteractions.resolve(requestId, "answered");
|
|
626
626
|
this.transfers.delete(transferId);
|
|
627
627
|
interaction?.rpcResolve?.({ content: errorMsg, isError: true });
|
|
628
628
|
return { accepted: false, error: errorMsg };
|
|
629
629
|
}
|
|
630
630
|
|
|
631
631
|
const cleanup = () => {
|
|
632
|
-
pendingInteractions.resolve(requestId);
|
|
632
|
+
pendingInteractions.resolve(requestId, "answered");
|
|
633
633
|
this.transfers.delete(transferId);
|
|
634
634
|
};
|
|
635
635
|
|
|
@@ -662,7 +662,7 @@ export class HostTransferProxy {
|
|
|
662
662
|
if (!interaction) return;
|
|
663
663
|
const transferId = interaction.metadata?.transferId as string | undefined;
|
|
664
664
|
if (transferId) this.transfers.delete(transferId);
|
|
665
|
-
pendingInteractions.resolve(requestId);
|
|
665
|
+
pendingInteractions.resolve(requestId, "cancelled");
|
|
666
666
|
try {
|
|
667
667
|
broadcastMessage(
|
|
668
668
|
{
|
|
@@ -718,7 +718,7 @@ export class HostTransferProxy {
|
|
|
718
718
|
for (const entry of pendingInteractions.getByKind("host_transfer")) {
|
|
719
719
|
const transferId = entry.metadata?.transferId as string | undefined;
|
|
720
720
|
if (transferId) this.transfers.delete(transferId);
|
|
721
|
-
pendingInteractions.resolve(entry.requestId);
|
|
721
|
+
pendingInteractions.resolve(entry.requestId, "cancelled");
|
|
722
722
|
try {
|
|
723
723
|
broadcastMessage(
|
|
724
724
|
{
|
package/src/daemon/lifecycle.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { join } from "node:path";
|
|
|
2
2
|
|
|
3
3
|
import { config as dotenvConfig } from "dotenv";
|
|
4
4
|
|
|
5
|
+
import { registerBackgroundWakeRuntime } from "../background-wake/runtime-registry.js";
|
|
5
6
|
import { setPointerMessageProcessor } from "../calls/call-pointer-messages.js";
|
|
6
7
|
import { reconcileCallsOnStartup } from "../calls/call-recovery.js";
|
|
7
8
|
import { setRelayBroadcast } from "../calls/relay-server.js";
|
|
@@ -35,6 +36,10 @@ import { HeartbeatService } from "../heartbeat/heartbeat-service.js";
|
|
|
35
36
|
import { startHomeContentRefresh } from "../home/home-content-refresh.js";
|
|
36
37
|
import { backfillRelationshipStateIfMissing } from "../home/relationship-state-writer.js";
|
|
37
38
|
import { closeSentry, initSentry, setSentryDeviceId } from "../instrument.js";
|
|
39
|
+
import {
|
|
40
|
+
startGatewayFlagListener,
|
|
41
|
+
stopGatewayFlagListener,
|
|
42
|
+
} from "../ipc/gateway-flag-listener.js";
|
|
38
43
|
import { getMcpServerManager } from "../mcp/manager.js";
|
|
39
44
|
import {
|
|
40
45
|
getAttachmentsByIds,
|
|
@@ -45,16 +50,13 @@ import { deleteMessageById, getMessages } from "../memory/conversation-crud.js";
|
|
|
45
50
|
import { getDb } from "../memory/db-connection.js";
|
|
46
51
|
import { initializeDb } from "../memory/db-init.js";
|
|
47
52
|
import { selectEmbeddingBackend } from "../memory/embedding-backend.js";
|
|
48
|
-
import { enqueueMemoryJob } from "../memory/jobs-store.js";
|
|
53
|
+
import { enqueueMemoryJob, isMemoryEnabled } from "../memory/jobs-store.js";
|
|
49
54
|
import { startMemoryJobsWorker } from "../memory/jobs-worker.js";
|
|
50
55
|
import { initQdrantClient, resolveQdrantUrl } from "../memory/qdrant-client.js";
|
|
51
56
|
import { QdrantManager } from "../memory/qdrant-manager.js";
|
|
52
57
|
import { rotateToolInvocations } from "../memory/tool-usage-store.js";
|
|
53
58
|
import { sweepConceptPageFrontmatter } from "../memory/v2/frontmatter-sweep.js";
|
|
54
|
-
import {
|
|
55
|
-
emitNotificationSignal,
|
|
56
|
-
registerBroadcastFn,
|
|
57
|
-
} from "../notifications/emit-signal.js";
|
|
59
|
+
import { emitNotificationSignal } from "../notifications/emit-signal.js";
|
|
58
60
|
import { backfillManualTokenConnections } from "../oauth/manual-token-connection.js";
|
|
59
61
|
import { seedOAuthProviders } from "../oauth/seed-providers.js";
|
|
60
62
|
import { installPluginRuntime } from "../plugins/external-api.js";
|
|
@@ -358,6 +360,8 @@ export async function runDaemon(): Promise<void> {
|
|
|
358
360
|
log.warn({ err }, "Background feature flag init failed"),
|
|
359
361
|
);
|
|
360
362
|
|
|
363
|
+
startGatewayFlagListener();
|
|
364
|
+
|
|
361
365
|
log.info("Daemon startup: initializing DB");
|
|
362
366
|
ensurePromptFiles();
|
|
363
367
|
|
|
@@ -539,11 +543,12 @@ export async function runDaemon(): Promise<void> {
|
|
|
539
543
|
}
|
|
540
544
|
} // end if (dbReady)
|
|
541
545
|
|
|
542
|
-
// Populate the managed-connection cache so
|
|
543
|
-
//
|
|
544
|
-
// system
|
|
545
|
-
//
|
|
546
|
-
//
|
|
546
|
+
// Populate the managed-connection cache so the `14-connected-services`
|
|
547
|
+
// bundled section (rendered by `renderConnectedServices()` in
|
|
548
|
+
// system-sections.ts) can include platform-managed OAuth connections
|
|
549
|
+
// (e.g. Twitter) in the system prompt from the first turn. This is
|
|
550
|
+
// an HTTP-only call with no DB dependency, so it runs regardless of
|
|
551
|
+
// dbReady. A periodic refresh keeps the cache current when users
|
|
547
552
|
// connect/disconnect managed providers while the assistant is running.
|
|
548
553
|
void refreshManagedConnectionCache().catch((err) =>
|
|
549
554
|
log.warn(
|
|
@@ -836,7 +841,7 @@ export async function runDaemon(): Promise<void> {
|
|
|
836
841
|
// If a destructive migration occurred, enqueue a rebuild_index job
|
|
837
842
|
// to re-embed all memory items from the SQLite cache.
|
|
838
843
|
const { migrated } = await qdrantClient.ensureCollection();
|
|
839
|
-
if (migrated) {
|
|
844
|
+
if (migrated && isMemoryEnabled()) {
|
|
840
845
|
enqueueMemoryJob("rebuild_index", {});
|
|
841
846
|
log.info(
|
|
842
847
|
"Qdrant collection was migrated — enqueued rebuild_index job",
|
|
@@ -934,10 +939,6 @@ export async function runDaemon(): Promise<void> {
|
|
|
934
939
|
registerWatcherProviders();
|
|
935
940
|
registerMessagingProviders();
|
|
936
941
|
|
|
937
|
-
// Register the broadcast function for the notification signal pipeline's
|
|
938
|
-
// macOS adapter so it can deliver notification_intent messages to clients.
|
|
939
|
-
registerBroadcastFn((msg) => broadcastMessage(msg));
|
|
940
|
-
|
|
941
942
|
try {
|
|
942
943
|
recoverStaleSchedules();
|
|
943
944
|
} catch (err) {
|
|
@@ -1270,11 +1271,11 @@ export async function runDaemon(): Promise<void> {
|
|
|
1270
1271
|
})();
|
|
1271
1272
|
|
|
1272
1273
|
if (config.auditLog.retentionDays > 0) {
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1274
|
+
void rotateToolInvocations(config.auditLog.retentionDays).catch(
|
|
1275
|
+
(err) => {
|
|
1276
|
+
log.warn({ err }, "Audit log rotation failed");
|
|
1277
|
+
},
|
|
1278
|
+
);
|
|
1278
1279
|
}
|
|
1279
1280
|
|
|
1280
1281
|
const workspaceHeartbeat = new WorkspaceHeartbeatService();
|
|
@@ -1291,6 +1292,7 @@ export async function runDaemon(): Promise<void> {
|
|
|
1291
1292
|
}),
|
|
1292
1293
|
});
|
|
1293
1294
|
heartbeat.start();
|
|
1295
|
+
registerBackgroundWakeRuntime({ scheduler, heartbeat });
|
|
1294
1296
|
log.info(
|
|
1295
1297
|
{
|
|
1296
1298
|
enabled: heartbeatConfig.enabled,
|
|
@@ -1347,6 +1349,7 @@ export async function runDaemon(): Promise<void> {
|
|
|
1347
1349
|
mcpManager,
|
|
1348
1350
|
telemetryReporter,
|
|
1349
1351
|
cleanupPidFile: () => {
|
|
1352
|
+
stopGatewayFlagListener();
|
|
1350
1353
|
stopDiskPressureGuardForLifecycle();
|
|
1351
1354
|
cleanupPidFile();
|
|
1352
1355
|
},
|
|
@@ -44,7 +44,6 @@ import type {
|
|
|
44
44
|
ExecutionTarget,
|
|
45
45
|
Tool,
|
|
46
46
|
ToolContext,
|
|
47
|
-
ToolDefinition,
|
|
48
47
|
} from "../tools/types.js";
|
|
49
48
|
import { RiskLevel } from "../tools/types.js";
|
|
50
49
|
import { getLogger } from "../util/logger.js";
|
|
@@ -132,15 +131,11 @@ function buildProxyTool(
|
|
|
132
131
|
supervisor: MeetHostSupervisor,
|
|
133
132
|
manifestHash: string,
|
|
134
133
|
): Tool {
|
|
135
|
-
const definition: ToolDefinition = {
|
|
136
|
-
name: entry.name,
|
|
137
|
-
description: entry.description,
|
|
138
|
-
input_schema: (entry.input_schema as object) ?? {},
|
|
139
|
-
};
|
|
140
134
|
const risk = coerceRiskLevel(entry.risk, entry.name);
|
|
141
135
|
return {
|
|
142
136
|
name: entry.name,
|
|
143
137
|
description: entry.description,
|
|
138
|
+
input_schema: (entry.input_schema as object) ?? {},
|
|
144
139
|
category: entry.category,
|
|
145
140
|
defaultRiskLevel: risk,
|
|
146
141
|
executionMode: "proxy",
|
|
@@ -149,7 +144,6 @@ function buildProxyTool(
|
|
|
149
144
|
ownerSkillId: MEET_SKILL_ID,
|
|
150
145
|
ownerSkillBundled: true,
|
|
151
146
|
ownerSkillVersionHash: manifestHash,
|
|
152
|
-
getDefinition: () => definition,
|
|
153
147
|
execute: async (input, context) => {
|
|
154
148
|
// `dispatchTool` ensures the meet-host child is up + connected
|
|
155
149
|
// before sending the frame, so callers don't need a separate
|
|
@@ -321,14 +321,12 @@ export interface GenerationHandoff {
|
|
|
321
321
|
queuedCount: number;
|
|
322
322
|
attachments?: UserMessageAttachment[];
|
|
323
323
|
attachmentWarnings?: string[];
|
|
324
|
-
/** Database ID of the final persisted assistant row, if any. */
|
|
325
|
-
messageId?: string;
|
|
326
324
|
/**
|
|
327
|
-
* Database ID
|
|
328
|
-
*
|
|
329
|
-
*
|
|
325
|
+
* Database ID of the completed assistant turn — the id that survives
|
|
326
|
+
* query-time merging when a turn persists multiple assistant rows. Matches
|
|
327
|
+
* the row the messages route returns.
|
|
330
328
|
*/
|
|
331
|
-
|
|
329
|
+
messageId?: string;
|
|
332
330
|
}
|
|
333
331
|
|
|
334
332
|
export interface ModelInfo {
|
|
@@ -404,10 +402,8 @@ export interface HistoryResponse {
|
|
|
404
402
|
type: "history_response";
|
|
405
403
|
conversationId: string;
|
|
406
404
|
messages: Array<{
|
|
407
|
-
/** Database ID used by clients for the rendered message
|
|
405
|
+
/** Database ID used by clients for the rendered message. */
|
|
408
406
|
id?: string;
|
|
409
|
-
/** Concrete persisted row ID for row-scoped actions such as TTS/fork. */
|
|
410
|
-
daemonMessageId?: string;
|
|
411
407
|
role: string;
|
|
412
408
|
text: string;
|
|
413
409
|
timestamp: number;
|
|
@@ -556,6 +552,7 @@ export type ConversationErrorCode =
|
|
|
556
552
|
| "PROVIDER_INVALID_KEY"
|
|
557
553
|
| "MANAGED_KEY_INVALID"
|
|
558
554
|
| "CONTEXT_TOO_LARGE"
|
|
555
|
+
| "BUDGET_YIELD_UNRECOVERED"
|
|
559
556
|
| "CONVERSATION_ABORTED"
|
|
560
557
|
| "CONVERSATION_PROCESSING_FAILED"
|
|
561
558
|
| "DISK_SPACE_CRITICAL"
|
|
@@ -7,19 +7,7 @@
|
|
|
7
7
|
* just enough metadata to invalidate a cache and trigger a refetch.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
* Broadcast after the daemon successfully writes a fresh
|
|
12
|
-
* `relationship-state.json` snapshot to disk. Subscribers should
|
|
13
|
-
* refetch `GET /v1/home/state` to read the new state.
|
|
14
|
-
*
|
|
15
|
-
* Only emitted on the success branch of the writer — if the
|
|
16
|
-
* underlying `writeFileSync` throws, this event is NOT published.
|
|
17
|
-
*/
|
|
18
|
-
export interface RelationshipStateUpdated {
|
|
19
|
-
type: "relationship_state_updated";
|
|
20
|
-
/** ISO-8601 timestamp of the newly-written state's `updatedAt` field. */
|
|
21
|
-
updatedAt: string;
|
|
22
|
-
}
|
|
10
|
+
import type { RelationshipStateUpdated } from "../../events/relationship-state-updated.js";
|
|
23
11
|
|
|
24
12
|
/**
|
|
25
13
|
* Broadcast after the daemon successfully writes a fresh home activity
|
|
@@ -304,14 +304,12 @@ export interface MessageComplete {
|
|
|
304
304
|
conversationId?: string;
|
|
305
305
|
attachments?: UserMessageAttachment[];
|
|
306
306
|
attachmentWarnings?: string[];
|
|
307
|
-
/** Database ID of the final persisted assistant row, if any. */
|
|
308
|
-
messageId?: string;
|
|
309
307
|
/**
|
|
310
|
-
* Database ID
|
|
311
|
-
*
|
|
312
|
-
*
|
|
308
|
+
* Database ID of the completed assistant turn — the id that survives
|
|
309
|
+
* query-time merging when a turn persists multiple assistant rows. Matches
|
|
310
|
+
* the row the messages route returns.
|
|
313
311
|
*/
|
|
314
|
-
|
|
312
|
+
messageId?: string;
|
|
315
313
|
/**
|
|
316
314
|
* Distinguishes a real main-turn completion from auxiliary events such as
|
|
317
315
|
* call transcripts, call summaries, and watch notifier outputs. Clients
|
|
@@ -426,17 +424,11 @@ export type InteractionResolutionState =
|
|
|
426
424
|
export interface InteractionResolved {
|
|
427
425
|
type: "interaction_resolved";
|
|
428
426
|
requestId: string;
|
|
429
|
-
/**
|
|
430
|
-
|
|
431
|
-
* id and the web client's conversation key coincide today (see
|
|
432
|
-
* `conversation-key-store.ts`); the field is named after the client-facing
|
|
433
|
-
* concept.
|
|
434
|
-
*/
|
|
435
|
-
conversationKey: string;
|
|
427
|
+
/** Conversation id the interaction belongs to. */
|
|
428
|
+
conversationId: string;
|
|
436
429
|
state: InteractionResolutionState;
|
|
437
430
|
/** Kind of the resolved interaction (e.g. "confirmation", "secret", "host_bash"). */
|
|
438
431
|
kind: string;
|
|
439
|
-
conversationId?: string;
|
|
440
432
|
}
|
|
441
433
|
|
|
442
434
|
/**
|