@vellumai/assistant 0.12.2 → 0.12.3-staging.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +2 -0
- package/AGENTS.md +1 -1
- package/ARCHITECTURE.md +43 -29
- package/Dockerfile +63 -0
- package/docs/architecture/integrations.md +7 -0
- package/docs/architecture/memory.md +17 -2
- package/docs/architecture/security.md +10 -5
- package/docs/architecture/turn-actor.md +2 -0
- package/docs/credential-execution-service.md +1 -1
- package/docs/desktop-browser-cli.md +50 -5
- package/docs/live-voice-task-outcomes.md +100 -0
- package/docs/mode-sessions.md +183 -0
- package/docs/voice-input-diagnostics.md +58 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/package.json +2 -1
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +1 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/index.ts +1 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/integration-categories.ts +36 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/secret-detection.ts +4 -1
- package/node_modules/@vellumai/environments/src/shell.test.ts +21 -0
- package/node_modules/@vellumai/environments/src/shell.ts +24 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/package.json +2 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +1 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/index.ts +1 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/integration-categories.ts +36 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/secret-detection.ts +4 -1
- package/node_modules/@vellumai/gateway-client/src/gateway-ipc-contracts.ts +20 -0
- package/node_modules/@vellumai/gateway-client/src/inbound-contract.ts +8 -2
- package/node_modules/@vellumai/gateway-client/src/index.ts +4 -1
- package/node_modules/@vellumai/gateway-client/src/outbound-contract.ts +38 -7
- package/node_modules/@vellumai/gateway-client/src/trust-verdict-contract.ts +5 -6
- package/node_modules/@vellumai/service-contracts/package.json +2 -1
- package/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +1 -0
- package/node_modules/@vellumai/service-contracts/src/index.ts +1 -0
- package/node_modules/@vellumai/service-contracts/src/integration-categories.ts +36 -0
- package/node_modules/@vellumai/service-contracts/src/secret-detection.ts +4 -1
- package/node_modules/@vellumai/slack-text/src/index.ts +4 -8
- package/openapi.yaml +716 -16
- package/package.json +1 -1
- package/scripts/smoke-desktop-browser-cli.ts +11 -26
- package/scripts/smoke-desktop-window-theme.ts +2 -3
- package/scripts/sync-llm-catalog.ts +3 -0
- package/scripts/voice-ttft-spike.ts +2 -2
- package/src/__tests__/agent-loop-output-hooks.test.ts +150 -1
- package/src/__tests__/agent-loop-provider-error-recording.test.ts +87 -19
- package/src/__tests__/agent-loop.test.ts +259 -0
- package/src/__tests__/agent-wake-delegation-prompt.test.ts +64 -2
- package/src/__tests__/annotate-activity-metadata.test.ts +3 -1
- package/src/__tests__/annotate-risk-options.test.ts +2 -0
- package/src/__tests__/answered-question-persistence.test.ts +2 -0
- package/src/__tests__/anthropic-gateway-shared.test.ts +22 -0
- package/src/__tests__/anthropic-provider.test.ts +55 -0
- package/src/__tests__/approval-interception-trust-gates.test.ts +40 -0
- package/src/__tests__/approval-message-composer.test.ts +1 -118
- package/src/__tests__/approval-routes-http.test.ts +3 -0
- package/src/__tests__/assistant-event-hub-connection-history.test.ts +111 -0
- package/src/__tests__/assistant-event-hub-targeted.test.ts +50 -0
- package/src/__tests__/assistant-event-targeting.test.ts +186 -0
- package/src/__tests__/assistant-stream-state.test.ts +29 -9
- package/src/__tests__/attachments-store.test.ts +22 -3
- package/src/__tests__/browser-fill-credential.test.ts +11 -22
- package/src/__tests__/btw-routes.test.ts +4 -1
- package/src/__tests__/build-persisted-content.test.ts +1 -1
- package/src/__tests__/call-conversation-messages.test.ts +5 -0
- package/src/__tests__/call-recovery.test.ts +7 -2
- package/src/__tests__/call-routes-http.test.ts +12 -0
- package/src/__tests__/call-store.test.ts +7 -2
- package/src/__tests__/channel-approval.test.ts +9 -14
- package/src/__tests__/channel-reply-delivery.test.ts +56 -0
- package/src/__tests__/channel-retry-sweep.test.ts +9 -0
- package/src/__tests__/chat-credential-redaction.test.ts +23 -0
- package/src/__tests__/chat-reveal-guard-priming.test.ts +2 -0
- package/src/__tests__/checker.test.ts +11 -3
- package/src/__tests__/client-os-metadata-persistence.test.ts +35 -1
- package/src/__tests__/computer-use-screenshot-attachments.test.ts +411 -0
- package/src/__tests__/computer-use-screenshot-selection.test.ts +50 -0
- package/src/__tests__/computer-use-skill-manifest-regression.test.ts +0 -25
- package/src/__tests__/computer-use-tools.test.ts +1 -233
- package/src/__tests__/config-model-image-provider.test.ts +39 -0
- package/src/__tests__/config-schema.test.ts +16 -0
- package/src/__tests__/config-watcher.test.ts +24 -0
- package/src/__tests__/context-search-agent-runner.test.ts +260 -1
- package/src/__tests__/context-search-fanout.test.ts +1 -1
- package/src/__tests__/context-search-types.test.ts +7 -7
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +8 -2
- package/src/__tests__/conversation-agent-loop-fatal-cleanup.test.ts +2 -0
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +2 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +2 -0
- package/src/__tests__/conversation-agent-loop.test.ts +797 -16
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +53 -1
- package/src/__tests__/conversation-attachments.test.ts +106 -0
- package/src/__tests__/conversation-evictor.test.ts +62 -37
- package/src/__tests__/conversation-fork-crud.test.ts +191 -0
- package/src/__tests__/conversation-history-boundary-repair-failure.test.ts +174 -0
- package/src/__tests__/conversation-loop-db-lock-resilience.test.ts +2 -0
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +2 -0
- package/src/__tests__/conversation-rendered-delegation-state.test.ts +276 -0
- package/src/__tests__/conversation-retry-route.test.ts +22 -0
- package/src/__tests__/conversation-routes-disk-view.test.ts +2 -0
- package/src/__tests__/conversation-routes-enabled-plugins.test.ts +2 -0
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +10 -0
- package/src/__tests__/conversation-routes-hidden-queue.test.ts +2 -0
- package/src/__tests__/conversation-routes-slash-commands.test.ts +2 -0
- package/src/__tests__/conversation-runtime-assembly.test.ts +29 -0
- package/src/__tests__/conversation-surface-snapshots.test.ts +543 -0
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +151 -0
- package/src/__tests__/conversation-surfaces-point-at-budget.test.ts +63 -1
- package/src/__tests__/conversation-tool-setup-attribution.test.ts +23 -0
- package/src/__tests__/conversation-undo.test.ts +61 -0
- package/src/__tests__/credential-execution-client.test.ts +72 -55
- package/src/__tests__/credential-prompt-route.test.ts +35 -3
- package/src/__tests__/cu-unified-flow.test.ts +82 -1
- package/src/__tests__/db-conversation-tool-surface.test.ts +221 -0
- package/src/__tests__/db-mode-sessions-migration.test.ts +175 -0
- package/src/__tests__/deterministic-verification-control-plane.test.ts +2 -0
- package/src/__tests__/dm-backfill.test.ts +91 -1
- package/src/__tests__/document-create-route.test.ts +88 -0
- package/src/__tests__/document-sync-tags.test.ts +27 -0
- package/src/__tests__/emit-signal-routing-intent.test.ts +142 -2
- package/src/__tests__/events-tail-route.test.ts +58 -0
- package/src/__tests__/evict-conversations-for-reload.test.ts +57 -8
- package/src/__tests__/guardian-action-sweep.test.ts +16 -0
- package/src/__tests__/guardian-dispatch.test.ts +13 -0
- package/src/__tests__/headless-browser-interactions.test.ts +64 -20
- package/src/__tests__/heartbeat-service.test.ts +2 -59
- package/src/__tests__/helpers/mock-conversation.ts +21 -0
- package/src/__tests__/helpers/native-web-search-harness.ts +2 -0
- package/src/__tests__/helpers/verification-sessions-ipc-sim.ts +5 -0
- package/src/__tests__/history-repair.test.ts +53 -0
- package/src/__tests__/host-cu-proxy.test.ts +46 -2
- package/src/__tests__/http-user-message-parity.test.ts +2 -0
- package/src/__tests__/image-credentials.test.ts +49 -0
- package/src/__tests__/image-service-dispatcher.test.ts +45 -0
- package/src/__tests__/inference-profile-session-handler.test.ts +26 -0
- package/src/__tests__/interrupt-on-send.test.ts +57 -43
- package/src/__tests__/interrupt-turn-note.test.ts +5 -6
- package/src/__tests__/list-messages-tool-merge.test.ts +85 -1
- package/src/__tests__/llm-catalog-parity.test.ts +27 -4
- package/src/__tests__/media-generate-image.test.ts +49 -1
- package/src/__tests__/message-provenance-contact-id.test.ts +69 -0
- package/src/__tests__/migration-export-to-gcs.test.ts +142 -0
- package/src/__tests__/mode-session-history.test.ts +245 -0
- package/src/__tests__/mode-session-recovery.test.ts +222 -0
- package/src/__tests__/mode-session-wire.test.ts +141 -0
- package/src/__tests__/notification-guardian-path.test.ts +7 -0
- package/src/__tests__/notification-telegram-adapter.test.ts +2 -2
- package/src/__tests__/notification-vellum-adapter.test.ts +34 -0
- package/src/__tests__/oauth-apps-routes.test.ts +1 -0
- package/src/__tests__/oauth-commands-routes.test.ts +114 -101
- package/src/__tests__/oauth-connect-orchestrator.test.ts +2 -0
- package/src/__tests__/oauth-provider-serializer.test.ts +13 -0
- package/src/__tests__/oauth-providers-routes.test.ts +3 -0
- package/src/__tests__/outbound-slack-persistence.test.ts +2 -0
- package/src/__tests__/persist-media-references.test.ts +50 -0
- package/src/__tests__/persistence-secret-redaction.test.ts +2 -0
- package/src/__tests__/plugin-api-provider.test.ts +5 -0
- package/src/__tests__/plugin-api-resolve-credential.test.ts +97 -0
- package/src/__tests__/plugin-import-boundary-guard.test.ts +9 -1
- package/src/__tests__/process-message-display-content.test.ts +56 -0
- package/src/__tests__/reaction-persistence.test.ts +5 -0
- package/src/__tests__/request-secret-standalone-channel-gate.test.ts +25 -9
- package/src/__tests__/run-conversation-turn-persistence.test.ts +138 -1
- package/src/__tests__/runtime-events-sse-reconnect.test.ts +1 -1
- package/src/__tests__/schedule-routes.test.ts +20 -0
- package/src/__tests__/scheduler-result-notification.test.ts +23 -4
- package/src/__tests__/script-proxy-certs.test.ts +1 -1
- package/src/__tests__/scripted-turn-metadata-persistence.test.ts +73 -0
- package/src/__tests__/secret-ingress-http.test.ts +2 -0
- package/src/__tests__/secret-routes-platform-proxy.test.ts +86 -31
- package/src/__tests__/secret-routes-scrub.test.ts +22 -27
- package/src/__tests__/secret-scanner.test.ts +20 -0
- package/src/__tests__/secure-keys-managed-failover.test.ts +8 -0
- package/src/__tests__/secure-keys.test.ts +50 -4
- package/src/__tests__/send-endpoint-busy.test.ts +163 -1
- package/src/__tests__/server-history-render.test.ts +91 -1
- package/src/__tests__/server-tool-pairing.test.ts +107 -0
- package/src/__tests__/settings-routes.test.ts +50 -1
- package/src/__tests__/skill-script-runner-sandbox.test.ts +32 -0
- package/src/__tests__/skills.test.ts +5 -4
- package/src/__tests__/subagent-fork-notifications.test.ts +1 -2
- package/src/__tests__/subagent-manager-notify.test.ts +1 -2
- package/src/__tests__/subagent-notify-parent.test.ts +146 -39
- package/src/__tests__/subagent-notify-stale-rebuild.test.ts +2 -4
- package/src/__tests__/subagent-tool-gate-mode.test.ts +226 -0
- package/src/__tests__/surface-completion-in-flight-snapshot.test.ts +2 -0
- package/src/__tests__/terminal-tools.test.ts +8 -0
- package/src/__tests__/thread-backfill.test.ts +53 -0
- package/src/__tests__/tool-preview-lifecycle.test.ts +2 -0
- package/src/__tests__/tool-result-follow-up.test.ts +99 -0
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +66 -1
- package/src/__tests__/tool-start-timestamp.test.ts +2 -0
- package/src/__tests__/twilio-routes.test.ts +1 -0
- package/src/__tests__/unicode.test.ts +36 -0
- package/src/__tests__/web-search-backend-failure.test.ts +1 -1
- package/src/activation/progress-store.test.ts +12 -7
- package/src/agent/loop.ts +136 -53
- package/src/agent/tool-result-follow-up.ts +70 -0
- package/src/api/attachment-provenance.test.ts +68 -0
- package/src/api/computer-use-tool.test.ts +55 -0
- package/src/api/computer-use-tool.ts +27 -0
- package/src/api/events/assistant-outbound-attachment.ts +3 -0
- package/src/api/events/assistant-turn-start.ts +3 -0
- package/src/api/events/desktop-activity-changed.ts +10 -0
- package/src/api/events/generation-handoff.ts +2 -0
- package/src/api/events/message-complete.ts +2 -0
- package/src/api/events/notification-conversation-created.ts +14 -16
- package/src/api/events/notification-intent.ts +4 -2
- package/src/api/events/question-request.ts +1 -0
- package/src/api/events/tool-result.ts +85 -0
- package/src/api/events/tool-use-start.ts +3 -0
- package/src/api/events/user-message-echo.ts +3 -0
- package/src/api/index.ts +42 -6
- package/src/api/mode-session.test.ts +131 -0
- package/src/api/mode-session.ts +148 -0
- package/src/api/remember-tool.ts +15 -0
- package/src/api/responses/conversation-message.ts +9 -0
- package/src/approvals/AGENTS.md +4 -2
- package/src/approvals/approval-primitive.ts +5 -2
- package/src/approvals/scoped-approval-grants.ts +6 -2
- package/src/browser/__tests__/operations.test.ts +29 -0
- package/src/browser/operation-meta.ts +2 -1
- package/src/browser/operations.ts +29 -0
- package/src/browser/virtual-desktop-target.ts +2 -9
- package/src/bundler/bundle-signer.ts +1 -3
- package/src/calls/__tests__/barge-in-guard.test.ts +3 -0
- package/src/calls/__tests__/call-controller.test.ts +94 -0
- package/src/calls/__tests__/call-funnel-telemetry.test.ts +204 -0
- package/src/calls/__tests__/voice-control-protocol.test.ts +15 -0
- package/src/calls/__tests__/voice-escalation-judge.test.ts +209 -0
- package/src/calls/__tests__/voice-leg-coordinator.test.ts +168 -0
- package/src/{live-voice/__tests__/live-voice-metrics.test.ts → calls/__tests__/voice-metrics.test.ts} +32 -38
- package/src/calls/__tests__/voice-session-bridge.test.ts +576 -122
- package/src/calls/barge-in-guard.ts +5 -0
- package/src/calls/call-controller.ts +196 -1
- package/src/calls/call-domain.ts +4 -0
- package/src/calls/call-store.ts +87 -2
- package/src/calls/guardian-action-sweep.ts +22 -8
- package/src/calls/media-stream-audio-transcode.ts +1 -3
- package/src/calls/typesafe-noul.ts +156 -0
- package/src/calls/voice-control-protocol.ts +6 -0
- package/src/calls/voice-escalation-judge.ts +145 -0
- package/src/calls/voice-escalation-target.ts +10 -0
- package/src/calls/voice-leg-coordinator.ts +121 -3
- package/src/{live-voice/live-voice-metrics.ts → calls/voice-metrics.ts} +94 -87
- package/src/calls/voice-session-bridge.ts +256 -112
- package/src/calls/voice-triage-escalate.ts +7 -0
- package/src/cli/__tests__/roadmap-cli.test.ts +4 -41
- package/src/cli/commands/__tests__/cli-test-harness.ts +21 -3
- package/src/cli/commands/__tests__/notifications.test.ts +35 -10
- package/src/cli/commands/__tests__/plugins.test.ts +20 -1
- package/src/cli/commands/__tests__/schedules.test.ts +14 -0
- package/src/cli/commands/bash.help.ts +4 -3
- package/src/cli/commands/browser.help.ts +9 -6
- package/src/cli/commands/browser.ts +0 -1
- package/src/cli/commands/clients.help.ts +46 -0
- package/src/cli/commands/clients.ts +116 -0
- package/src/cli/commands/credentials.help.ts +9 -4
- package/src/cli/commands/notifications.help.ts +16 -2
- package/src/cli/commands/notifications.ts +30 -8
- package/src/cli/commands/oauth/index.help.ts +10 -0
- package/src/cli/commands/oauth/providers.ts +12 -0
- package/src/cli/commands/oauth/request.test.ts +179 -2
- package/src/cli/commands/oauth/request.ts +41 -10
- package/src/cli/commands/plugins.ts +12 -5
- package/src/cli/commands/roadmap.help.ts +18 -21
- package/src/cli/commands/roadmap.ts +4 -21
- package/src/cli/commands/schedules.ts +2 -0
- package/src/cli/lib/__tests__/inspect-plugin.test.ts +54 -0
- package/src/cli/lib/__tests__/install-from-github.test.ts +41 -0
- package/src/cli/lib/__tests__/list-installed-plugins.test.ts +5 -2
- package/src/cli/lib/__tests__/local-plugin-upgrade.test.ts +133 -51
- package/src/cli/lib/__tests__/plugin-catalog-cache.test.ts +8 -2
- package/src/cli/lib/bundled-marketplace.json +906 -1
- package/src/cli/lib/bundled-plugin-packages.json +783 -1
- package/src/cli/lib/inspect-plugin.ts +11 -4
- package/src/cli/lib/plugin-marketplace.ts +8 -0
- package/src/cli/lib/publish-plugin.ts +1 -2
- package/src/cli/lib/upgrade-plugin.ts +19 -11
- package/src/cli/output.ts +18 -4
- package/src/config/__tests__/default-provider.test.ts +6 -0
- package/src/config/__tests__/memory-retrospective-schema.test.ts +14 -1
- package/src/config/bundled-skills/computer-use/SKILL.md +1 -1
- package/src/config/bundled-skills/computer-use/TOOLS.json +89 -1
- package/src/config/bundled-skills/image-studio/SKILL.md +17 -2
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +7 -11
- package/src/config/bundled-skills/schedule/SKILL.md +6 -6
- package/src/config/bundled-skills/sequences/TOOLS.json +1 -5
- package/src/config/call-site-defaults.ts +9 -0
- package/src/config/feature-flag-registry.json +16 -0
- package/src/config/loader.ts +9 -17
- package/src/config/platform-identity.ts +8 -8
- package/src/config/profile-text-generation.test.ts +51 -0
- package/src/config/profile-text-generation.ts +51 -0
- package/src/config/schemas/__tests__/memory-v3.test.ts +12 -0
- package/src/config/schemas/__tests__/tools.test.ts +31 -0
- package/src/config/schemas/call-site-catalog.ts +14 -0
- package/src/config/schemas/channels.ts +0 -18
- package/src/config/schemas/llm.ts +9 -2
- package/src/config/schemas/mcp.ts +6 -1
- package/src/config/schemas/memory-retrospective.ts +11 -2
- package/src/config/schemas/memory-v3.ts +12 -0
- package/src/config/schemas/services.ts +15 -6
- package/src/config/schemas/tools.ts +10 -0
- package/src/config/session-groups-gate.ts +21 -0
- package/src/config/skills.ts +2 -6
- package/src/conversations/__tests__/message-consolidation.test.ts +149 -0
- package/src/conversations/message-consolidation.ts +102 -5
- package/src/credential-execution/ces-connect.test.ts +69 -0
- package/src/credential-execution/ces-connect.ts +115 -0
- package/src/credential-execution/ces-runtime.ts +55 -93
- package/src/credential-execution/executable-discovery.ts +34 -142
- package/src/credential-execution/process-manager.test.ts +20 -24
- package/src/credential-execution/process-manager.ts +24 -19
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +10 -1
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +43 -0
- package/src/daemon/__tests__/inference-profile-notification.test.ts +2 -0
- package/src/daemon/__tests__/turn-tail-deleted-conversation.test.ts +36 -0
- package/src/daemon/assistant-attachments.ts +20 -12
- package/src/daemon/browser-mode-session.test.ts +402 -0
- package/src/daemon/browser-mode-session.ts +186 -0
- package/src/daemon/chat-credential-redaction.ts +16 -1
- package/src/daemon/computer-use-mode-session.test.ts +210 -0
- package/src/daemon/computer-use-mode-session.ts +105 -0
- package/src/daemon/config-watcher.ts +10 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +132 -13
- package/src/daemon/conversation-agent-loop.ts +231 -25
- package/src/daemon/conversation-attachments.ts +93 -12
- package/src/daemon/conversation-evictor.ts +5 -24
- package/src/daemon/conversation-history.ts +10 -0
- package/src/daemon/conversation-interrupt-repair.ts +4 -43
- package/src/daemon/conversation-interrupt.ts +7 -11
- package/src/daemon/conversation-messaging.ts +58 -5
- package/src/daemon/conversation-mode-session.test.ts +1667 -0
- package/src/daemon/conversation-mode-session.ts +1008 -0
- package/src/daemon/conversation-process.ts +5 -0
- package/src/daemon/conversation-runtime-assembly.ts +10 -20
- package/src/daemon/conversation-skill-tools.ts +1 -0
- package/src/daemon/conversation-store.ts +4 -4
- package/src/daemon/conversation-surface-snapshots.ts +135 -0
- package/src/daemon/conversation-surfaces.ts +113 -5
- package/src/daemon/conversation-tool-setup.ts +79 -6
- package/src/daemon/conversation-turn-finalize.ts +26 -13
- package/src/daemon/conversation.ts +215 -58
- package/src/daemon/daemon-control.ts +3 -7
- package/src/daemon/handlers/config-model.ts +7 -5
- package/src/daemon/handlers/shared.ts +55 -16
- package/src/daemon/host-cu-proxy.ts +51 -22
- package/src/daemon/lifecycle.ts +30 -13
- package/src/daemon/mcp-reload-service.ts +1 -1
- package/src/daemon/message-protocol.ts +0 -1
- package/src/daemon/message-provenance.ts +28 -4
- package/src/daemon/message-types/shared.ts +1 -0
- package/src/daemon/mode-session-startup-recovery.ts +23 -0
- package/src/daemon/mode-session-tracking.ts +54 -0
- package/src/daemon/orphan-reaper.ts +4 -3
- package/src/daemon/persist-media-references.ts +20 -3
- package/src/daemon/process-message.ts +13 -4
- package/src/daemon/tool-setup-types.ts +6 -0
- package/src/daemon/virtual-desktop-context.ts +21 -0
- package/src/daemon/wake-conversation-ops.ts +50 -15
- package/src/desktop/__tests__/fake-desktop.ts +1 -0
- package/src/desktop/desktop-accessibility-script.ts +88 -0
- package/src/desktop/desktop-accessibility.test.ts +160 -0
- package/src/desktop/desktop-accessibility.ts +169 -0
- package/src/desktop/desktop-automation-lease.test.ts +302 -64
- package/src/desktop/desktop-automation-lease.ts +129 -54
- package/src/desktop/desktop-browser-endpoint.ts +4 -0
- package/src/desktop/desktop-computer-use-routing.test.ts +330 -0
- package/src/desktop/desktop-computer-use.test.ts +449 -0
- package/src/desktop/desktop-computer-use.ts +502 -0
- package/src/desktop/desktop-dependencies.ts +47 -293
- package/src/desktop/desktop-display.ts +2 -2
- package/src/desktop/desktop-help.ts +15 -0
- package/src/desktop/desktop-panel-config.test.ts +13 -3
- package/src/desktop/desktop-panel-config.ts +109 -15
- package/src/desktop/desktop-session-manager.test.ts +69 -21
- package/src/desktop/desktop-session-manager.ts +76 -22
- package/src/desktop/desktop-stream-bridge.test.ts +76 -132
- package/src/desktop/desktop-stream-bridge.ts +9 -11
- package/src/desktop/desktop-wallpaper-renderer.ts +132 -0
- package/src/desktop/desktop-wallpaper-worker.ts +17 -0
- package/src/desktop/desktop-wallpaper.test.ts +48 -7
- package/src/desktop/desktop-wallpaper.ts +34 -102
- package/src/desktop/desktop-window-theme.ts +5 -25
- package/src/desktop/virtual-desktop-feature.ts +53 -3
- package/src/desktop/virtual-desktop-platform.test.ts +5 -9
- package/src/documents/document-store.ts +23 -0
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +22 -26
- package/src/heartbeat/heartbeat-service.ts +5 -33
- package/src/ipc/__tests__/browser-ipc.test.ts +215 -6
- package/src/ipc/assistant-server.ts +2 -0
- package/src/ipc/routes/__tests__/channel-reply-ipc-routes.test.ts +111 -0
- package/src/ipc/routes/channel-reply-ipc-routes.ts +73 -0
- package/src/live-voice/__tests__/continuation-judge.test.ts +151 -0
- package/src/live-voice/__tests__/live-activity-reporter.test.ts +154 -15
- package/src/live-voice/__tests__/live-voice-flux-turn-end.test.ts +743 -31
- package/src/live-voice/__tests__/live-voice-look-follow-up.test.ts +191 -10
- package/src/live-voice/__tests__/live-voice-session-groups-gate.test.ts +87 -0
- package/src/live-voice/__tests__/live-voice-session-manager.test.ts +5 -1
- package/src/live-voice/__tests__/live-voice-sight-frame-echo.test.ts +41 -0
- package/src/live-voice/__tests__/live-voice-sight-frame.test.ts +1017 -9
- package/src/live-voice/__tests__/live-voice-triage-escalate.test.ts +224 -1
- package/src/live-voice/__tests__/live-voice-tts-session.test.ts +101 -0
- package/src/live-voice/__tests__/live-voice-tts.test.ts +44 -0
- package/src/live-voice/__tests__/live-voice-vad.test.ts +939 -75
- package/src/live-voice/__tests__/microphone-idle-gate.test.ts +87 -0
- package/src/live-voice/__tests__/session-controls.test.ts +23 -0
- package/src/live-voice/__tests__/task-outcomes.test.ts +117 -0
- package/src/live-voice/__tests__/voice-input-diagnostics.test.ts +117 -0
- package/src/live-voice/camera-mode-session.test.ts +265 -0
- package/src/live-voice/camera-mode-session.ts +277 -0
- package/src/live-voice/continuation-judge.ts +123 -0
- package/src/live-voice/live-activity-reporter.ts +115 -6
- package/src/live-voice/live-voice-manager.ts +36 -1
- package/src/live-voice/live-voice-photo.ts +88 -7
- package/src/live-voice/live-voice-session-manager.ts +15 -0
- package/src/live-voice/live-voice-session.ts +1443 -747
- package/src/live-voice/live-voice-tts.ts +22 -4
- package/src/live-voice/microphone-idle-gate.ts +56 -0
- package/src/live-voice/protocol.ts +171 -4
- package/src/live-voice/session-controls.ts +11 -3
- package/src/live-voice/task-outcomes.ts +131 -0
- package/src/live-voice/voice-input-diagnostics.ts +117 -0
- package/src/mcp/__tests__/manager-tool-caps.test.ts +156 -0
- package/src/mcp/__tests__/startup.test.ts +30 -7
- package/src/mcp/__tests__/tool-caps.test.ts +134 -0
- package/src/mcp/manager.ts +171 -101
- package/src/mcp/startup.ts +33 -13
- package/src/mcp/tool-caps.ts +184 -0
- package/src/media/__tests__/image-models.test.ts +58 -0
- package/src/media/image-credentials.ts +5 -0
- package/src/media/image-models.ts +52 -0
- package/src/media/image-service.ts +8 -0
- package/src/media/openrouter-image-service.test.ts +133 -0
- package/src/media/openrouter-image-service.ts +153 -0
- package/src/media/types.ts +1 -1
- package/src/messaging/provider-message-metadata.ts +3 -3
- package/src/messaging/providers/__tests__/transport-dispatch.test.ts +65 -11
- package/src/messaging/providers/discord/send.ts +4 -17
- package/src/messaging/providers/discord/transport.ts +2 -2
- package/src/messaging/providers/outlook/client.ts +16 -22
- package/src/messaging/providers/telegram-bot/send.test.ts +236 -1
- package/src/messaging/providers/telegram-bot/send.ts +10 -7
- package/src/messaging/providers/telegram-bot/transport.ts +3 -10
- package/src/messaging/providers/whatsapp/send.test.ts +169 -4
- package/src/monitoring/__tests__/control.test.ts +17 -5
- package/src/monitoring/control.ts +15 -5
- package/src/notifications/AGENTS.md +1 -1
- package/src/notifications/README.md +83 -99
- package/src/notifications/__tests__/broadcaster.test.ts +1 -1
- package/src/notifications/__tests__/channel-allowlist.test.ts +39 -0
- package/src/notifications/__tests__/copy-composer.test.ts +71 -1
- package/src/notifications/__tests__/decision-engine.test.ts +79 -2
- package/src/notifications/__tests__/deterministic-checks.test.ts +10 -10
- package/src/notifications/__tests__/home-feed-side-effect.test.ts +93 -4
- package/src/notifications/__tests__/notification-utils.test.ts +18 -0
- package/src/notifications/adapters/macos.ts +37 -46
- package/src/notifications/broadcaster.ts +5 -6
- package/src/notifications/channel-allowlist.ts +44 -0
- package/src/notifications/copy-composer.ts +11 -26
- package/src/notifications/decision-engine.ts +24 -14
- package/src/notifications/deterministic-checks.ts +1 -1
- package/src/notifications/emit-signal.ts +123 -37
- package/src/notifications/home-feed-side-effect.ts +9 -7
- package/src/notifications/notification-utils.ts +19 -0
- package/src/notifications/schedule-result-producer.ts +4 -6
- package/src/notifications/signal.ts +4 -19
- package/src/notifications/types.ts +15 -0
- package/src/oauth/AGENTS.md +2 -0
- package/src/oauth/__tests__/identity-verifier.test.ts +36 -1
- package/src/oauth/connection-resolver.ts +1 -2
- package/src/oauth/identity-verifier.ts +24 -0
- package/src/oauth/oauth-store.ts +12 -4
- package/src/oauth/provider-serializer.ts +8 -0
- package/src/oauth/seed-providers.ts +42 -0
- package/src/onboarding/onboarding-events-store.ts +99 -12
- package/src/permissions/confirmation-guardian-request.test.ts +16 -0
- package/src/permissions/confirmation-guardian-request.ts +2 -3
- package/src/permissions/question-prompter.test.ts +31 -0
- package/src/permissions/question-prompter.ts +2 -0
- package/src/persistence/__tests__/client-connection-events-store.test.ts +322 -0
- package/src/persistence/attachments-store.ts +84 -44
- package/src/persistence/client-connection-events-store.ts +377 -0
- package/src/persistence/conversation-crud.ts +166 -26
- package/src/persistence/conversation-mode-sessions.test.ts +424 -0
- package/src/persistence/conversation-mode-sessions.ts +460 -0
- package/src/persistence/conversation-plugin-facade.ts +30 -0
- package/src/persistence/conversation-queries.ts +6 -19
- package/src/persistence/conversation-tool-surface.ts +135 -0
- package/src/persistence/conversation-types.test.ts +32 -0
- package/src/persistence/conversation-types.ts +26 -4
- package/src/persistence/llm-usage-store.ts +3 -9
- package/src/persistence/message-metadata.ts +25 -0
- package/src/persistence/migrations/378-create-conversation-tool-surfaces.test.ts +78 -0
- package/src/persistence/migrations/378-create-conversation-tool-surfaces.ts +29 -0
- package/src/persistence/migrations/379-oauth-providers-response-ok-field.test.ts +92 -0
- package/src/persistence/migrations/379-oauth-providers-response-ok-field.ts +32 -0
- package/src/persistence/migrations/380-conversation-tool-surfaces-delegate-independent-tasks.test.ts +90 -0
- package/src/persistence/migrations/380-conversation-tool-surfaces-delegate-independent-tasks.ts +34 -0
- package/src/persistence/migrations/381-create-conversation-mode-sessions.ts +41 -0
- package/src/persistence/migrations/382-create-client-connection-events.ts +40 -0
- package/src/persistence/migrations/__tests__/382-create-client-connection-events.test.ts +56 -0
- package/src/persistence/schema/conversation-tool-surfaces.ts +32 -0
- package/src/persistence/schema/conversations.ts +67 -0
- package/src/persistence/schema/index.ts +1 -0
- package/src/persistence/schema/infrastructure.ts +29 -0
- package/src/persistence/schema/oauth.ts +1 -0
- package/src/persistence/steps.ts +41 -3
- package/src/plugin-api/__tests__/plugin-name-env.test.ts +249 -0
- package/src/plugin-api/conversation-turn.ts +31 -7
- package/src/plugin-api/effective-context-window.ts +33 -0
- package/src/plugin-api/index.ts +35 -6
- package/src/plugin-api/plugin-channel-turn-trust.test.ts +133 -0
- package/src/plugin-api/plugin-channel-turn-trust.ts +71 -0
- package/src/plugin-api/plugin-name-env.ts +125 -0
- package/src/plugin-api/resolve-credential.ts +79 -20
- package/src/plugin-api/vision-support.test.ts +22 -0
- package/src/plugin-api/vision-support.ts +17 -5
- package/src/plugins/__tests__/active-plugin-env.test.ts +136 -0
- package/src/plugins/active-plugin-env.ts +51 -0
- package/src/plugins/defaults/index.ts +24 -0
- package/src/plugins/defaults/memory/AGENTS.md +39 -5
- package/src/plugins/defaults/memory/__tests__/archive-removal-framing.test.ts +64 -0
- package/src/plugins/defaults/memory/__tests__/buffer-file.test.ts +365 -0
- package/src/plugins/defaults/memory/__tests__/buffer-format.test.ts +43 -0
- package/src/plugins/defaults/memory/__tests__/conversation-memory-purge.test.ts +1 -0
- package/src/plugins/defaults/memory/__tests__/db-memory-attach.test.ts +2 -0
- package/src/plugins/defaults/memory/__tests__/fixtures/buffer-appender.ts +17 -0
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +74 -0
- package/src/plugins/defaults/memory/__tests__/memory-run-evidence.test.ts +161 -0
- package/src/plugins/defaults/memory/__tests__/relocated-memory-test-rows.ts +10 -0
- package/src/plugins/defaults/memory/__tests__/worker-control.test.ts +19 -6
- package/src/plugins/defaults/memory/buffer-file.ts +354 -0
- package/src/plugins/defaults/memory/buffer-format.ts +40 -0
- package/src/plugins/defaults/memory/context-search/agent-protocol.ts +9 -12
- package/src/plugins/defaults/memory/context-search/agent-runner.ts +77 -22
- package/src/plugins/defaults/memory/context-search/format.ts +53 -8
- package/src/plugins/defaults/memory/context-search/limits.ts +10 -12
- package/src/plugins/defaults/memory/context-search/recall-input.ts +38 -0
- package/src/plugins/defaults/memory/context-search/search.ts +8 -14
- package/src/plugins/defaults/memory/context-search/sources/conversations.ts +1 -0
- package/src/plugins/defaults/memory/context-search/sources/memory-v2.ts +2 -1
- package/src/plugins/defaults/memory/context-search/sources/workspace.ts +2 -1
- package/src/plugins/defaults/memory/context-search/types.ts +1 -11
- package/src/plugins/defaults/memory/conversation-memory-purge.ts +4 -0
- package/src/plugins/defaults/memory/graph/__tests__/handle-remember-v2.test.ts +11 -4
- package/src/plugins/defaults/memory/graph/capability-seed.ts +1 -2
- package/src/plugins/defaults/memory/graph/tool-handlers.ts +13 -63
- package/src/plugins/defaults/memory/graph/tools.ts +35 -64
- package/src/plugins/defaults/memory/host-utils.ts +0 -10
- package/src/plugins/defaults/memory/injectors.ts +4 -3
- package/src/plugins/defaults/memory/memory-retrospective-job.ts +72 -183
- package/src/plugins/defaults/memory/memory-run-evidence.ts +213 -0
- package/src/plugins/defaults/memory/src/memory-eval-routes.ts +2 -3
- package/src/plugins/defaults/memory/src/memory-item-routes.test.ts +6 -1
- package/src/plugins/defaults/memory/src/memory-item-routes.ts +2 -1
- package/src/plugins/defaults/memory/substrate/__tests__/consolidation-job.test.ts +407 -99
- package/src/plugins/defaults/memory/substrate/__tests__/consolidation-prompt-flag-gating-guard.test.ts +10 -0
- package/src/plugins/defaults/memory/substrate/__tests__/prompts-consolidation.test.ts +107 -7
- package/src/plugins/defaults/memory/substrate/consolidation-job.ts +307 -86
- package/src/plugins/defaults/memory/substrate/consolidation-tool-surface.ts +34 -0
- package/src/plugins/defaults/memory/substrate/page-index.ts +2 -1
- package/src/plugins/defaults/memory/substrate/prompts/consolidation.ts +91 -51
- package/src/plugins/defaults/memory/substrate/sweep-job.ts +1 -1
- package/src/plugins/defaults/memory/tools.test.ts +124 -9
- package/src/plugins/defaults/memory/tools.ts +38 -11
- package/src/plugins/defaults/memory/v1/graph/consolidation.ts +2 -2
- package/src/plugins/defaults/memory/v1/graph/extraction.ts +2 -1
- package/src/plugins/defaults/memory/v1/graph/retriever.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/migration.test.ts +5 -0
- package/src/plugins/defaults/memory/v2/__tests__/reranker.test.ts +5 -2
- package/src/plugins/defaults/memory/v2/reranker.ts +2 -1
- package/src/plugins/defaults/memory/v3/__tests__/injection.test.ts +81 -1
- package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +87 -0
- package/src/plugins/defaults/memory/v3/__tests__/plugin-schema.test.ts +12 -0
- package/src/plugins/defaults/memory/v3/__tests__/pool-log-store.test.ts +332 -15
- package/src/plugins/defaults/memory/v3/__tests__/pool-select.test.ts +626 -27
- package/src/plugins/defaults/memory/v3/__tests__/shadow-plugin.test.ts +148 -28
- package/src/plugins/defaults/memory/v3/card.ts +2 -1
- package/src/plugins/defaults/memory/v3/injector.ts +212 -178
- package/src/plugins/defaults/memory/v3/orchestrate.ts +159 -32
- package/src/plugins/defaults/memory/v3/plugin-schema.ts +54 -4
- package/src/plugins/defaults/memory/v3/pool-log-store.ts +275 -37
- package/src/plugins/defaults/memory/v3/pool-select.test.ts +47 -5
- package/src/plugins/defaults/memory/v3/pool-select.ts +710 -59
- package/src/plugins/defaults/memory/v3/sections.ts +2 -1
- package/src/plugins/defaults/memory/v3/shadow-plugin.ts +41 -14
- package/src/plugins/defaults/memory/worker-control.ts +15 -5
- package/src/plugins/defaults/task-progress/__tests__/registration.test.ts +70 -0
- package/src/plugins/defaults/task-progress/__tests__/task-progress-context.test.ts +380 -0
- package/src/plugins/defaults/task-progress/hooks/post-compact.ts +19 -0
- package/src/plugins/defaults/task-progress/hooks/user-prompt-submit.ts +24 -0
- package/src/plugins/defaults/task-progress/package.json +14 -0
- package/src/plugins/defaults/task-progress/src/apply-task-progress-context.ts +93 -0
- package/src/plugins/defaults/task-progress/src/format-task-progress-context.ts +67 -0
- package/src/plugins/defaults/tool-error/hooks/post-tool-use.ts +4 -1
- package/src/plugins/defaults/tool-result-truncate/terminal.ts +1 -46
- package/src/prompts/__tests__/parallel-tasks-section.test.ts +25 -0
- package/src/prompts/delegation-gate.ts +57 -0
- package/src/prompts/system-prompt.ts +14 -32
- package/src/providers/__tests__/context-overflow-error.test.ts +10 -0
- package/src/providers/__tests__/search-provider-catalog.test.ts +18 -0
- package/src/providers/anthropic/client.ts +10 -1
- package/src/providers/anthropic-gateway-shared.ts +6 -0
- package/src/providers/fetch-provider-catalog.ts +11 -0
- package/src/providers/gemini/client.ts +25 -8
- package/src/providers/inference/adapter-factory.ts +6 -0
- package/src/providers/jev/client.test.ts +270 -0
- package/src/providers/jev/client.ts +534 -0
- package/src/providers/model-catalog.ts +59 -3
- package/src/providers/openai/__tests__/chat-completions-extra-body.test.ts +94 -1
- package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +106 -1
- package/src/providers/openai/__tests__/chat-template-flatten.test.ts +24 -0
- package/src/providers/openai/__tests__/google-thought-signature.test.ts +1 -2
- package/src/providers/openai/chat-completions-provider.ts +100 -29
- package/src/providers/openai/google-thought-signature.ts +0 -6
- package/src/providers/openai/responses-provider.ts +23 -1
- package/src/providers/ratelimit.ts +1 -3
- package/src/providers/search-provider-catalog.ts +24 -0
- package/src/providers/server-tool-pairing.ts +16 -7
- package/src/providers/speech-to-text/__tests__/deepgram-flux-frames.test.ts +24 -0
- package/src/providers/speech-to-text/__tests__/deepgram-flux-realtime.test.ts +7 -1
- package/src/providers/speech-to-text/__tests__/vellum-managed-realtime.test.ts +50 -1
- package/src/providers/speech-to-text/deepgram-flux-frames.ts +11 -0
- package/src/providers/speech-to-text/vellum-managed-flux-realtime.ts +13 -0
- package/src/providers/types.ts +5 -0
- package/src/routes/control.ts +7 -5
- package/src/runtime/AGENTS.md +6 -4
- package/src/runtime/__tests__/agent-wake.test.ts +94 -1
- package/src/runtime/actor-trust-resolver.ts +3 -3
- package/src/runtime/agent-wake.ts +32 -5
- package/src/runtime/approval-message-composer.ts +3 -69
- package/src/runtime/assistant-event-hub.ts +73 -75
- package/src/runtime/assistant-event-publish-options.ts +7 -0
- package/src/runtime/assistant-event-targeting.ts +79 -0
- package/src/runtime/assistant-stream-state.ts +13 -100
- package/src/runtime/background-job-runner.ts +5 -5
- package/src/runtime/channel-retry-sweep.ts +1 -0
- package/src/runtime/guardian-action-message-composer.ts +8 -161
- package/src/runtime/guardian-action-service.ts +2 -17
- package/src/runtime/guardian-reply-router.ts +29 -40
- package/src/runtime/http-server.ts +2 -2
- package/src/runtime/http-types.ts +6 -0
- package/src/runtime/message-composer-types.ts +3 -61
- package/src/runtime/migrations/__tests__/vbundle-import-parity.test.ts +67 -1
- package/src/runtime/migrations/__tests__/vbundle-import-policy.test.ts +89 -0
- package/src/runtime/migrations/vbundle-builder.ts +24 -1
- package/src/runtime/migrations/vbundle-import-analyzer.ts +13 -4
- package/src/runtime/migrations/vbundle-import-policy.ts +43 -11
- package/src/runtime/migrations/vbundle-importer.ts +4 -1
- package/src/runtime/migrations/vbundle-streaming-importer.ts +4 -1
- package/src/runtime/migrations/vbundle-validator.ts +1 -0
- package/src/runtime/pending-interactions-mode-session.test.ts +62 -0
- package/src/runtime/pending-interactions.ts +29 -0
- package/src/runtime/routes/__tests__/client-history-routes.test.ts +104 -0
- package/src/runtime/routes/__tests__/image-generation-routes.test.ts +97 -0
- package/src/runtime/routes/__tests__/inference-profiles-routes.test.ts +24 -2
- package/src/runtime/routes/__tests__/roadmap-routes.test.ts +29 -6
- package/src/runtime/routes/browser-context.ts +31 -11
- package/src/runtime/routes/browser-routes.ts +43 -4
- package/src/runtime/routes/btw-routes.ts +9 -4
- package/src/runtime/routes/channel-route-shared.ts +1 -9
- package/src/runtime/routes/client-routes.ts +108 -0
- package/src/runtime/routes/conversation-management-routes.ts +4 -1
- package/src/runtime/routes/conversation-routes.ts +125 -14
- package/src/runtime/routes/credential-prompt-routes.ts +4 -3
- package/src/runtime/routes/credential-routes.ts +1 -2
- package/src/runtime/routes/desktop-setup-routes.test.ts +9 -18
- package/src/runtime/routes/desktop-setup-routes.ts +8 -7
- package/src/runtime/routes/documents-routes.ts +51 -0
- package/src/runtime/routes/email-routes.ts +3 -7
- package/src/runtime/routes/events-routes.ts +75 -54
- package/src/runtime/routes/guardian-approval-interception.ts +24 -0
- package/src/runtime/routes/identity-routes.ts +1 -5
- package/src/runtime/routes/image-generation-routes.ts +8 -14
- package/src/runtime/routes/inbound-message-handler.ts +37 -41
- package/src/runtime/routes/inbound-stages/backfill-sender-provenance.test.ts +168 -0
- package/src/runtime/routes/inbound-stages/backfill-sender-provenance.ts +96 -0
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +39 -10
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +9 -9
- package/src/runtime/routes/inbound-stages/reaction-intercept.ts +2 -0
- package/src/runtime/routes/inference-profile-session-handler.ts +11 -1
- package/src/runtime/routes/inference-profiles-routes.ts +9 -0
- package/src/runtime/routes/llm-context-normalization.ts +1 -7
- package/src/runtime/routes/migration-routes.ts +73 -2
- package/src/runtime/routes/notification-routes.ts +10 -0
- package/src/runtime/routes/oauth-commands-routes.ts +57 -54
- package/src/runtime/routes/oauth-providers.ts +11 -0
- package/src/runtime/routes/oauth-request-hints.test.ts +246 -0
- package/src/runtime/routes/oauth-request-hints.ts +149 -0
- package/src/runtime/routes/plugins-routes.ts +6 -0
- package/src/runtime/routes/roadmap-routes.ts +47 -8
- package/src/runtime/routes/schedule-routes.ts +2 -0
- package/src/runtime/routes/secret-routes.ts +99 -119
- package/src/runtime/routes/settings-routes.ts +10 -4
- package/src/runtime/routes/watcher-routes.ts +1 -3
- package/src/runtime/trust-class.test.ts +7 -6
- package/src/runtime/trust-class.ts +9 -17
- package/src/schedule/__tests__/worker-control.test.ts +36 -5
- package/src/schedule/__tests__/worker-mcp-bootstrap.test.ts +107 -0
- package/src/schedule/__tests__/worker-mcp-readiness.test.ts +173 -0
- package/src/schedule/__tests__/worker-mcp-tools.test.ts +13 -47
- package/src/schedule/run-script.ts +2 -2
- package/src/schedule/scheduler.ts +47 -11
- package/src/schedule/tool-surface-readiness.ts +65 -0
- package/src/schedule/worker-control.ts +15 -5
- package/src/schedule/worker-mcp.ts +85 -0
- package/src/schedule/worker.ts +9 -31
- package/src/security/secure-keys.ts +74 -112
- package/src/skills/clawhub.ts +3 -8
- package/src/skills/managed-store.ts +1 -5
- package/src/stt/types.ts +4 -0
- package/src/subagent/notify.ts +54 -34
- package/src/subagent/parent-notification.ts +6 -0
- package/src/telemetry/__tests__/phone-call-funnel.test.ts +72 -0
- package/src/telemetry/phone-call-funnel.ts +144 -0
- package/src/tools/__tests__/tool-schema-root-combinator-guard.test.ts +81 -0
- package/src/tools/ask-question/ask-question-tool.test.ts +167 -5
- package/src/tools/ask-question/ask-question-tool.ts +120 -22
- package/src/tools/browser/browser-execution.ts +29 -60
- package/src/tools/browser/cdp-client/__tests__/cdp-dom-helpers.test.ts +561 -39
- package/src/tools/browser/cdp-client/cdp-dom-helpers.ts +435 -39
- package/src/tools/browser/cdp-client/cdp-inspect-client.ts +1 -8
- package/src/tools/client-os.ts +15 -0
- package/src/tools/computer-use/skill-proxy-bridge.ts +1 -1
- package/src/tools/computer-use/target.ts +42 -0
- package/src/tools/document/document-tool.ts +13 -18
- package/src/tools/execution-target.ts +14 -16
- package/src/tools/host-terminal/host-shell.ts +16 -7
- package/src/tools/network/__tests__/web-fetch-tinyfish.test.ts +250 -0
- package/src/tools/network/__tests__/web-search.test.ts +203 -0
- package/src/tools/network/web-fetch.ts +274 -7
- package/src/tools/network/web-search.ts +468 -6
- package/src/tools/permission-checker.ts +3 -3
- package/src/tools/policy-context.ts +3 -1
- package/src/tools/shared/filesystem/file-ops-service.ts +1 -31
- package/src/tools/shared/shell-output.test.ts +10 -0
- package/src/tools/shared/shell-output.ts +14 -2
- package/src/tools/skills/load.ts +2 -1
- package/src/tools/skills/sandbox-runner.ts +24 -4
- package/src/tools/skills/scaffold-managed.ts +2 -1
- package/src/tools/skills/skill-script-runner.ts +7 -0
- package/src/tools/skills/skill-tool-factory.ts +15 -1
- package/src/tools/terminal/__tests__/safe-env.test.ts +44 -4
- package/src/tools/terminal/__tests__/sanitized-bash.test.ts +0 -14
- package/src/tools/terminal/safe-env.ts +39 -24
- package/src/tools/terminal/sanitized-bash.ts +15 -2
- package/src/tools/terminal/shell-launch.test.ts +162 -0
- package/src/tools/terminal/shell.test.ts +29 -0
- package/src/tools/terminal/shell.ts +15 -7
- package/src/tools/tool-approval-handler.ts +5 -1
- package/src/tools/tool-types.ts +3 -3
- package/src/tools/types.ts +8 -2
- package/src/util/__tests__/worker-process-command.test.ts +5 -4
- package/src/util/abort-reasons.ts +18 -26
- package/src/util/browser-human-verification.ts +14 -0
- package/src/util/canonicalize-identity.test.ts +21 -0
- package/src/util/canonicalize-identity.ts +16 -0
- package/src/util/errors.ts +13 -3
- package/src/util/host-process.test.ts +17 -1
- package/src/util/host-process.ts +24 -0
- package/src/util/provider-error-patterns.ts +3 -0
- package/src/util/unicode.ts +29 -0
- package/src/util/worker-process.ts +77 -35
- package/src/workspace/migrations/157-add-desktop-files-launcher.ts +94 -0
- package/src/workspace/migrations/__tests__/156-extract-workspace-mcp-json.test.ts +4 -10
- package/src/workspace/migrations/__tests__/157-add-desktop-files-launcher.test.ts +113 -0
- package/src/workspace/migrations/registry.ts +2 -0
- package/src/__tests__/computer-use-window-schema.test.ts +0 -24
- package/src/api/events/heartbeat-alert.ts +0 -20
- package/src/daemon/message-types/web-activity.ts +0 -65
- package/src/desktop/desktop-dependencies.test.ts +0 -131
- package/src/tools/computer-use/definitions.ts +0 -607
|
@@ -2,10 +2,14 @@ import type { PermissionPrompter } from "../permissions/prompter.js";
|
|
|
2
2
|
import {
|
|
3
3
|
attachInlineAttachmentToMessage,
|
|
4
4
|
AttachmentUploadError,
|
|
5
|
+
getAttachmentsByIds,
|
|
5
6
|
getFilePathForAttachment,
|
|
7
|
+
linkAttachmentToMessage,
|
|
6
8
|
setAttachmentThumbnail,
|
|
7
9
|
} from "../persistence/attachments-store.js";
|
|
8
|
-
import
|
|
10
|
+
import { updateMessageMetadata } from "../persistence/conversation-crud.js";
|
|
11
|
+
import { COMPUTER_USE_SCREENSHOT_ATTACHMENT_IDS_KEY } from "../persistence/conversation-types.js";
|
|
12
|
+
import type { ContentBlock, ImageContent } from "../providers/types.js";
|
|
9
13
|
import { getLogger } from "../util/logger.js";
|
|
10
14
|
import {
|
|
11
15
|
type ApproveHostRead,
|
|
@@ -14,7 +18,9 @@ import {
|
|
|
14
18
|
contentBlocksToDrafts,
|
|
15
19
|
deduplicateDrafts,
|
|
16
20
|
type DirectiveRequest,
|
|
21
|
+
estimateBase64Bytes,
|
|
17
22
|
resolveDirectives,
|
|
23
|
+
toolImageFilename,
|
|
18
24
|
validateDrafts,
|
|
19
25
|
} from "./assistant-attachments.js";
|
|
20
26
|
import type { UserMessageAttachment } from "./message-protocol.js";
|
|
@@ -88,6 +94,19 @@ export interface AttachmentResolutionResult {
|
|
|
88
94
|
emittedAttachments: UserMessageAttachment[];
|
|
89
95
|
directiveWarnings: string[];
|
|
90
96
|
persistedFiles: PersistedAttachmentFile[];
|
|
97
|
+
/** Attachment ids successfully linked to the target assistant row. */
|
|
98
|
+
linkedAttachmentIds: string[];
|
|
99
|
+
computerUseScreenshotAttachmentIds: string[];
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export interface ComputerUseScreenshotCandidate {
|
|
103
|
+
toolName: string;
|
|
104
|
+
block: ImageContent;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
interface ResolvedAttachmentDraft extends AssistantAttachmentDraft {
|
|
108
|
+
existingAttachmentId?: string;
|
|
109
|
+
computerUseScreenshot?: boolean;
|
|
91
110
|
}
|
|
92
111
|
|
|
93
112
|
/**
|
|
@@ -102,10 +121,13 @@ export async function resolveAssistantAttachments(
|
|
|
102
121
|
approveHostRead: ApproveHostRead,
|
|
103
122
|
lastAssistantMessageId: string | undefined,
|
|
104
123
|
toolContentBlockToolNames?: ReadonlyMap<number, string>,
|
|
124
|
+
computerUseScreenshotCandidate?: ComputerUseScreenshotCandidate,
|
|
105
125
|
): Promise<AttachmentResolutionResult> {
|
|
106
|
-
let assistantAttachments:
|
|
126
|
+
let assistantAttachments: ResolvedAttachmentDraft[] = [];
|
|
107
127
|
const emittedAttachments: UserMessageAttachment[] = [];
|
|
108
128
|
const persistedFiles: PersistedAttachmentFile[] = [];
|
|
129
|
+
const linkedAttachmentIds: string[] = [];
|
|
130
|
+
const computerUseScreenshotAttachmentIds: string[] = [];
|
|
109
131
|
|
|
110
132
|
const recordPersistedFile = (draft: AssistantAttachmentDraft): void => {
|
|
111
133
|
if (draft.sourcePath) {
|
|
@@ -128,7 +150,8 @@ export async function resolveAssistantAttachments(
|
|
|
128
150
|
|
|
129
151
|
if (
|
|
130
152
|
accumulatedDirectives.length > 0 ||
|
|
131
|
-
accumulatedToolContentBlocks.length > 0
|
|
153
|
+
accumulatedToolContentBlocks.length > 0 ||
|
|
154
|
+
computerUseScreenshotCandidate !== undefined
|
|
132
155
|
) {
|
|
133
156
|
const directiveDrafts =
|
|
134
157
|
accumulatedDirectives.length > 0
|
|
@@ -159,10 +182,42 @@ export async function resolveAssistantAttachments(
|
|
|
159
182
|
"Directive resolution complete",
|
|
160
183
|
);
|
|
161
184
|
|
|
162
|
-
const toolDrafts = contentBlocksToDrafts(
|
|
185
|
+
const toolDrafts: ResolvedAttachmentDraft[] = contentBlocksToDrafts(
|
|
163
186
|
accumulatedToolContentBlocks,
|
|
164
187
|
toolContentBlockToolNames,
|
|
165
188
|
);
|
|
189
|
+
if (computerUseScreenshotCandidate) {
|
|
190
|
+
const { block, toolName } = computerUseScreenshotCandidate;
|
|
191
|
+
const filename =
|
|
192
|
+
block.source.filename ??
|
|
193
|
+
toolImageFilename(block.source.media_type, toolName);
|
|
194
|
+
if (block.source.type === "workspace_ref") {
|
|
195
|
+
const stored = getAttachmentsByIds([block.source.attachmentId], {
|
|
196
|
+
hydrateFileData: true,
|
|
197
|
+
})[0];
|
|
198
|
+
if (stored?.dataBase64) {
|
|
199
|
+
toolDrafts.push({
|
|
200
|
+
sourceType: "tool_block",
|
|
201
|
+
filename,
|
|
202
|
+
mimeType: stored.mimeType,
|
|
203
|
+
dataBase64: stored.dataBase64,
|
|
204
|
+
sizeBytes: stored.sizeBytes,
|
|
205
|
+
kind: "image",
|
|
206
|
+
existingAttachmentId: stored.id,
|
|
207
|
+
computerUseScreenshot: true,
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
} else {
|
|
211
|
+
toolDrafts.push({
|
|
212
|
+
sourceType: "tool_block",
|
|
213
|
+
filename,
|
|
214
|
+
mimeType: block.source.media_type,
|
|
215
|
+
dataBase64: block.source.data,
|
|
216
|
+
sizeBytes: estimateBase64Bytes(block.source.data),
|
|
217
|
+
kind: "image",
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
}
|
|
166
221
|
// Most recent tool outputs first so deduplication keeps the latest version.
|
|
167
222
|
toolDrafts.reverse();
|
|
168
223
|
const merged = deduplicateDrafts([
|
|
@@ -195,14 +250,27 @@ export async function resolveAssistantAttachments(
|
|
|
195
250
|
const draft = assistantAttachments[i];
|
|
196
251
|
let stored;
|
|
197
252
|
try {
|
|
198
|
-
stored =
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
253
|
+
stored = draft.existingAttachmentId
|
|
254
|
+
? getAttachmentsByIds([
|
|
255
|
+
linkAttachmentToMessage(
|
|
256
|
+
lastAssistantMessageId,
|
|
257
|
+
draft.existingAttachmentId,
|
|
258
|
+
i,
|
|
259
|
+
),
|
|
260
|
+
])[0]
|
|
261
|
+
: await attachInlineAttachmentToMessage(
|
|
262
|
+
lastAssistantMessageId,
|
|
263
|
+
i,
|
|
264
|
+
draft.filename,
|
|
265
|
+
draft.mimeType,
|
|
266
|
+
draft.dataBase64,
|
|
267
|
+
{ skipSizeLimit: true },
|
|
268
|
+
);
|
|
269
|
+
if (!stored) {
|
|
270
|
+
throw new Error(
|
|
271
|
+
`Attachment not found: ${draft.existingAttachmentId}`,
|
|
272
|
+
);
|
|
273
|
+
}
|
|
206
274
|
} catch (err) {
|
|
207
275
|
if (err instanceof AttachmentUploadError) {
|
|
208
276
|
log.warn(
|
|
@@ -241,6 +309,7 @@ export async function resolveAssistantAttachments(
|
|
|
241
309
|
}
|
|
242
310
|
|
|
243
311
|
recordPersistedFile(draft);
|
|
312
|
+
linkedAttachmentIds.push(stored.id);
|
|
244
313
|
emittedAttachments.push({
|
|
245
314
|
id: stored.id,
|
|
246
315
|
filename: draft.filename,
|
|
@@ -250,6 +319,16 @@ export async function resolveAssistantAttachments(
|
|
|
250
319
|
...(omitData ? { sizeBytes: draft.sizeBytes } : {}),
|
|
251
320
|
fileBacked: true,
|
|
252
321
|
...(thumbnailData ? { thumbnailData } : {}),
|
|
322
|
+
...(draft.computerUseScreenshot ? { computerUseScreenshot: true } : {}),
|
|
323
|
+
});
|
|
324
|
+
if (draft.computerUseScreenshot) {
|
|
325
|
+
computerUseScreenshotAttachmentIds.push(stored.id);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
if (computerUseScreenshotAttachmentIds.length > 0) {
|
|
329
|
+
updateMessageMetadata(lastAssistantMessageId, {
|
|
330
|
+
[COMPUTER_USE_SCREENSHOT_ATTACHMENT_IDS_KEY]:
|
|
331
|
+
computerUseScreenshotAttachmentIds,
|
|
253
332
|
});
|
|
254
333
|
}
|
|
255
334
|
} else if (assistantAttachments.length > 0) {
|
|
@@ -271,5 +350,7 @@ export async function resolveAssistantAttachments(
|
|
|
271
350
|
emittedAttachments,
|
|
272
351
|
directiveWarnings,
|
|
273
352
|
persistedFiles,
|
|
353
|
+
linkedAttachmentIds,
|
|
354
|
+
computerUseScreenshotAttachmentIds,
|
|
274
355
|
};
|
|
275
356
|
}
|
|
@@ -6,8 +6,7 @@ const log = getLogger("conversation-evictor");
|
|
|
6
6
|
|
|
7
7
|
/** Minimal interface a conversation must satisfy to be evictable. */
|
|
8
8
|
export interface EvictableConversation {
|
|
9
|
-
|
|
10
|
-
hasQueuedMessages(): boolean;
|
|
9
|
+
hasInFlightWork(): boolean;
|
|
11
10
|
dispose(): void;
|
|
12
11
|
}
|
|
13
12
|
|
|
@@ -29,7 +28,7 @@ export interface EvictionResult {
|
|
|
29
28
|
lruEvicted: number;
|
|
30
29
|
/** Conversations evicted due to memory pressure. */
|
|
31
30
|
memoryEvicted: number;
|
|
32
|
-
/** Conversations skipped because they
|
|
31
|
+
/** Conversations skipped because they retained in-flight work. */
|
|
33
32
|
skipped: number;
|
|
34
33
|
}
|
|
35
34
|
|
|
@@ -74,11 +73,6 @@ export class ConversationEvictor {
|
|
|
74
73
|
getSubagentManager().abortAllForParent(conversationId);
|
|
75
74
|
}
|
|
76
75
|
|
|
77
|
-
/** Protect conversations with in-flight subagents from eviction. */
|
|
78
|
-
shouldProtect(conversationId: string): boolean {
|
|
79
|
-
return getSubagentManager().hasActiveChildren(conversationId);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
76
|
/** Record an access for the given conversation (resets its idle clock). */
|
|
83
77
|
touch(conversationId: string): void {
|
|
84
78
|
this.lastAccess.set(conversationId, Date.now());
|
|
@@ -141,11 +135,7 @@ export class ConversationEvictor {
|
|
|
141
135
|
if (now - lastAccessTime < this.ttlMs) {
|
|
142
136
|
continue;
|
|
143
137
|
}
|
|
144
|
-
if (
|
|
145
|
-
conversation.isProcessing() ||
|
|
146
|
-
conversation.hasQueuedMessages() ||
|
|
147
|
-
this.shouldProtect(id)
|
|
148
|
-
) {
|
|
138
|
+
if (conversation.hasInFlightWork()) {
|
|
149
139
|
result.skipped++;
|
|
150
140
|
continue;
|
|
151
141
|
}
|
|
@@ -216,20 +206,11 @@ export class ConversationEvictor {
|
|
|
216
206
|
log.debug({ conversationId: id }, "Evicted idle conversation");
|
|
217
207
|
}
|
|
218
208
|
|
|
219
|
-
/**
|
|
220
|
-
* Return idle (non-processing) conversations sorted by last access time
|
|
221
|
-
* ascending (least recently used first).
|
|
222
|
-
*/
|
|
209
|
+
/** Return evictable conversations in least-recently-used order. */
|
|
223
210
|
private idleConversationsByLru(): Array<[string, EvictableConversation]> {
|
|
224
211
|
const idle: Array<[string, EvictableConversation, number]> = [];
|
|
225
212
|
for (const [id, conversation] of this.conversations) {
|
|
226
|
-
if (conversation.
|
|
227
|
-
continue;
|
|
228
|
-
}
|
|
229
|
-
if (conversation.hasQueuedMessages()) {
|
|
230
|
-
continue;
|
|
231
|
-
}
|
|
232
|
-
if (this.shouldProtect(id)) {
|
|
213
|
+
if (conversation.hasInFlightWork()) {
|
|
233
214
|
continue;
|
|
234
215
|
}
|
|
235
216
|
idle.push([id, conversation, this.lastAccess.get(id) ?? 0]);
|
|
@@ -16,6 +16,8 @@ import { relinkLlmRequestLogs } from "../persistence/llm-request-log-store.js";
|
|
|
16
16
|
import { getSummaryFromContextMessage } from "../plugins/defaults/compaction/window-manager.js";
|
|
17
17
|
import type { ContentBlock, Message } from "../providers/types.js";
|
|
18
18
|
import { getLogger } from "../util/logger.js";
|
|
19
|
+
import type { ConversationModeSessionCoordinator } from "./conversation-mode-session.js";
|
|
20
|
+
import { bestEffortModeSessionTracking } from "./mode-session-tracking.js";
|
|
19
21
|
import { startsNewTurn } from "./summarize-boundary.js";
|
|
20
22
|
|
|
21
23
|
const log = getLogger("conversation-history");
|
|
@@ -360,6 +362,10 @@ export function consolidateAssistantMessages(
|
|
|
360
362
|
export interface HistoryConversationContext {
|
|
361
363
|
readonly conversationId: string;
|
|
362
364
|
messages: Message[];
|
|
365
|
+
modeSessions: Pick<
|
|
366
|
+
ConversationModeSessionCoordinator,
|
|
367
|
+
"invalidateAllStructuralWaits"
|
|
368
|
+
>;
|
|
363
369
|
isProcessing(): boolean;
|
|
364
370
|
}
|
|
365
371
|
|
|
@@ -377,6 +383,10 @@ export function undo(conversation: HistoryConversationContext): number {
|
|
|
377
383
|
return 0;
|
|
378
384
|
}
|
|
379
385
|
|
|
386
|
+
bestEffortModeSessionTracking("conversation wait invalidation", () =>
|
|
387
|
+
conversation.modeSessions.invalidateAllStructuralWaits(),
|
|
388
|
+
);
|
|
389
|
+
|
|
380
390
|
const removed = conversation.messages.length - lastUserIdx;
|
|
381
391
|
conversation.messages = conversation.messages.slice(0, lastUserIdx);
|
|
382
392
|
|
|
@@ -15,37 +15,6 @@ import type { Conversation } from "./conversation.js";
|
|
|
15
15
|
|
|
16
16
|
const log = getLogger("conversation-interrupt-repair");
|
|
17
17
|
|
|
18
|
-
/**
|
|
19
|
-
* What the repair leaves behind, for the caller that has to decide whether the
|
|
20
|
-
* model was told its turn was cut off.
|
|
21
|
-
*/
|
|
22
|
-
export interface InterruptRepairResult {
|
|
23
|
-
/**
|
|
24
|
-
* True when the tail of the history carries a preempted `tool_result`,
|
|
25
|
-
* whether the agent loop's own abort handler wrote it or this repair did.
|
|
26
|
-
*
|
|
27
|
-
* That result is the model's notice that a message preempted it. False means
|
|
28
|
-
* the abort landed with no tool call in flight, so the notice has to ride on
|
|
29
|
-
* the interrupting user message instead.
|
|
30
|
-
*/
|
|
31
|
-
preemptedToolResultOnTail: boolean;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/** Whether the last message answers a tool call with the preemption text. */
|
|
35
|
-
function tailCarriesPreemptedToolResult(messages: Message[]): boolean {
|
|
36
|
-
const tail = messages.at(-1);
|
|
37
|
-
if (!tail || tail.role !== "user") {
|
|
38
|
-
return false;
|
|
39
|
-
}
|
|
40
|
-
return tail.content.some(
|
|
41
|
-
(block) =>
|
|
42
|
-
// Only a synthetic tool_result carries the preemption text; a
|
|
43
|
-
// server-side web_search_tool_result never does.
|
|
44
|
-
block.type === "tool_result" &&
|
|
45
|
-
block.content === PREEMPTED_TOOL_RESULT_TEXT,
|
|
46
|
-
);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
18
|
/**
|
|
50
19
|
* Give every abandoned `tool_use` block at the tail of the history a
|
|
51
20
|
* `tool_result`, so the next provider request is well formed.
|
|
@@ -78,22 +47,18 @@ function tailCarriesPreemptedToolResult(messages: Message[]): boolean {
|
|
|
78
47
|
export async function repairInterruptedToolUseBlocks(
|
|
79
48
|
conversation: Conversation,
|
|
80
49
|
options: { force?: boolean; requireDurable?: boolean } = {},
|
|
81
|
-
): Promise<
|
|
50
|
+
): Promise<void> {
|
|
82
51
|
const wasSteerArmed = conversation.pendingSteerRepair;
|
|
83
52
|
const wasArmed = conversation.pendingInterruptRepair;
|
|
84
53
|
if (!wasSteerArmed && !wasArmed && options.force !== true) {
|
|
85
|
-
return
|
|
86
|
-
preemptedToolResultOnTail: tailCarriesPreemptedToolResult(
|
|
87
|
-
conversation.messages,
|
|
88
|
-
),
|
|
89
|
-
};
|
|
54
|
+
return;
|
|
90
55
|
}
|
|
91
56
|
conversation.pendingSteerRepair = false;
|
|
92
57
|
conversation.pendingInterruptRepair = false;
|
|
93
58
|
|
|
94
59
|
const messages = conversation.messages;
|
|
95
60
|
if (messages.length === 0) {
|
|
96
|
-
return
|
|
61
|
+
return;
|
|
97
62
|
}
|
|
98
63
|
|
|
99
64
|
// Walk backwards from the tail to find the last assistant message with
|
|
@@ -127,10 +92,7 @@ export async function repairInterruptedToolUseBlocks(
|
|
|
127
92
|
if (pendingToolUseIds.length === 0) {
|
|
128
93
|
// Nothing dangling either because the turn made no tool call before the
|
|
129
94
|
// abort, or because the loop's abort handler already answered the batch.
|
|
130
|
-
|
|
131
|
-
return {
|
|
132
|
-
preemptedToolResultOnTail: tailCarriesPreemptedToolResult(messages),
|
|
133
|
-
};
|
|
95
|
+
return;
|
|
134
96
|
}
|
|
135
97
|
|
|
136
98
|
log.info(
|
|
@@ -181,5 +143,4 @@ export async function repairInterruptedToolUseBlocks(
|
|
|
181
143
|
"Failed to persist the synthetic tool_result repair row; the in-memory history carries the repair and the next turn runs on it",
|
|
182
144
|
);
|
|
183
145
|
}
|
|
184
|
-
return { preemptedToolResultOnTail: true };
|
|
185
146
|
}
|
|
@@ -316,13 +316,11 @@ export async function interruptRunningTurn(
|
|
|
316
316
|
}
|
|
317
317
|
|
|
318
318
|
let repaired = false;
|
|
319
|
-
let preemptedToolResultOnTail = false;
|
|
320
319
|
try {
|
|
321
|
-
|
|
320
|
+
await repairInterruptedToolUseBlocks(conversation, {
|
|
322
321
|
force: true,
|
|
323
322
|
requireDurable: true,
|
|
324
323
|
});
|
|
325
|
-
preemptedToolResultOnTail = repair.preemptedToolResultOnTail;
|
|
326
324
|
repaired = true;
|
|
327
325
|
} catch (err) {
|
|
328
326
|
// The repair row is not durable, so the caller must not write the
|
|
@@ -352,14 +350,12 @@ export async function interruptRunningTurn(
|
|
|
352
350
|
// busy conversation with nothing running and no path back to idle.
|
|
353
351
|
conversation.pendingInterruptActivityBridge = true;
|
|
354
352
|
|
|
355
|
-
//
|
|
356
|
-
//
|
|
357
|
-
//
|
|
358
|
-
//
|
|
359
|
-
//
|
|
360
|
-
|
|
361
|
-
conversation.pendingInterruptNote = true;
|
|
362
|
-
}
|
|
353
|
+
// Arm the note the interrupting user message carries. It is the one place
|
|
354
|
+
// the behavior after an interrupt is spelled out, so it rides on every
|
|
355
|
+
// handover, tool call stopped or not: a synthetic `tool_result` states only
|
|
356
|
+
// what happened to the one call it answers, and it lands ahead of the user's
|
|
357
|
+
// words rather than on them.
|
|
358
|
+
conversation.pendingInterruptNote = true;
|
|
363
359
|
|
|
364
360
|
return "released";
|
|
365
361
|
}
|
|
@@ -63,7 +63,10 @@ import {
|
|
|
63
63
|
syncMessageToDisk,
|
|
64
64
|
updateMetaFile,
|
|
65
65
|
} from "../persistence/conversation-disk-view.js";
|
|
66
|
-
import {
|
|
66
|
+
import {
|
|
67
|
+
isEchoSuppressedUserMessage,
|
|
68
|
+
SIGHT_FRAME_ATTACHMENT_IDS_KEY,
|
|
69
|
+
} from "../persistence/conversation-types.js";
|
|
67
70
|
import {
|
|
68
71
|
attachmentIdFragment,
|
|
69
72
|
type ContentBlock,
|
|
@@ -72,10 +75,13 @@ import {
|
|
|
72
75
|
import type { AuthContext } from "../runtime/auth/types.js";
|
|
73
76
|
import { INTERRUPTED_TURN_NOTE_TEXT } from "../util/abort-reasons.js";
|
|
74
77
|
import { getLogger } from "../util/logger.js";
|
|
78
|
+
import type { ConversationModeSessionCoordinator } from "./conversation-mode-session.js";
|
|
75
79
|
import type { MessageQueue } from "./conversation-queue-manager.js";
|
|
76
80
|
import type { SlackInboundMessageMetadata } from "./handlers/shared.js";
|
|
77
81
|
import type { UserMessageAttachment } from "./message-protocol.js";
|
|
82
|
+
import { actorAuthorProvenance } from "./message-provenance.js";
|
|
78
83
|
import type { ConversationTransportMetadata } from "./message-types/conversations.js";
|
|
84
|
+
import { bestEffortModeSessionTracking } from "./mode-session-tracking.js";
|
|
79
85
|
import {
|
|
80
86
|
assembleUserContentBlocks,
|
|
81
87
|
offloadLinkPlan,
|
|
@@ -230,6 +236,11 @@ export interface MessagingConversationContext {
|
|
|
230
236
|
releaseProcessing(owner: number): boolean;
|
|
231
237
|
abortController: AbortController | null;
|
|
232
238
|
currentRequestId?: string;
|
|
239
|
+
currentActiveSurfaceId?: string;
|
|
240
|
+
readonly modeSessions?: Pick<
|
|
241
|
+
ConversationModeSessionCoordinator,
|
|
242
|
+
"acceptTurn" | "trackPersistedRow"
|
|
243
|
+
>;
|
|
233
244
|
/** See {@link Conversation.currentTurnClientMessageId}. */
|
|
234
245
|
currentTurnClientMessageId?: string;
|
|
235
246
|
readonly queue: MessageQueue;
|
|
@@ -957,6 +968,13 @@ export interface PersistMessageOptions {
|
|
|
957
968
|
* persisting a message the current actor just sent.
|
|
958
969
|
*/
|
|
959
970
|
trustContext?: TrustContext;
|
|
971
|
+
/**
|
|
972
|
+
* The person whose own inbound message this row records, passed only by a
|
|
973
|
+
* caller relaying one (channel ingress and its retry replay). It names the
|
|
974
|
+
* row's author (`actorAuthorProvenance`). Machine-authored callers omit it,
|
|
975
|
+
* so their rows name no author whatever the conversation's trust is.
|
|
976
|
+
*/
|
|
977
|
+
author?: TrustContext;
|
|
960
978
|
/**
|
|
961
979
|
* Persist the row without indexing it (no memory segments, embeddings, or
|
|
962
980
|
* lexical-index entry). For machine-authored prompts that must not enter
|
|
@@ -1005,6 +1023,10 @@ export interface PersistMessageOptions {
|
|
|
1005
1023
|
* what a consumer that must not misattribute a turn to a surface needs.
|
|
1006
1024
|
*/
|
|
1007
1025
|
requestClientOs?: string;
|
|
1026
|
+
/** Existing structural surface whose accepted action created this turn. */
|
|
1027
|
+
activeSurfaceId?: string;
|
|
1028
|
+
/** Whether mode-session stamping publishes its own history invalidation. */
|
|
1029
|
+
publishModeSessionChanges?: boolean;
|
|
1008
1030
|
/**
|
|
1009
1031
|
* Which of `attachments`, by the id the caller holds, arrived as ambient
|
|
1010
1032
|
* camera frames rather than files the user picked. Stamps
|
|
@@ -1229,12 +1251,14 @@ export async function persistQueuedMessageBody(
|
|
|
1229
1251
|
channelInbound: rawChannelInbound,
|
|
1230
1252
|
scripted: rawScriptedFromMetadata,
|
|
1231
1253
|
clientOsFromRequest: _rawClientOsFromRequest,
|
|
1254
|
+
modeSession: _rawModeSession,
|
|
1232
1255
|
...metadataWithoutSlackInbound
|
|
1233
1256
|
} = (metadata ?? {}) as Record<string, unknown> & {
|
|
1234
1257
|
slackInbound?: SlackInboundMessageMetadata;
|
|
1235
1258
|
channelInbound?: ProviderMessageMetadata;
|
|
1236
1259
|
scripted?: unknown;
|
|
1237
1260
|
clientOsFromRequest?: unknown;
|
|
1261
|
+
modeSession?: unknown;
|
|
1238
1262
|
};
|
|
1239
1263
|
const slackMeta = buildSlackMetaForPersistence({
|
|
1240
1264
|
slackInbound: rawSlackInbound,
|
|
@@ -1307,6 +1331,13 @@ export async function persistQueuedMessageBody(
|
|
|
1307
1331
|
const mergedMetadata = {
|
|
1308
1332
|
...metadataWithoutSlackInbound,
|
|
1309
1333
|
...provenance,
|
|
1334
|
+
// A scripted row, or one the repo classes as machine-injected (hidden,
|
|
1335
|
+
// ACP or subagent notification, background event), is not a person's
|
|
1336
|
+
// own words, so even a relayed author is not named on one.
|
|
1337
|
+
...(resolvedScripted ||
|
|
1338
|
+
isEchoSuppressedUserMessage(metadataWithoutSlackInbound)
|
|
1339
|
+
? {}
|
|
1340
|
+
: actorAuthorProvenance(options.author)),
|
|
1310
1341
|
...(turnCtx
|
|
1311
1342
|
? {
|
|
1312
1343
|
userMessageChannel: turnCtx.userMessageChannel,
|
|
@@ -1440,6 +1471,26 @@ export async function persistQueuedMessageBody(
|
|
|
1440
1471
|
return { id: persistedUserMessage.id, deduplicated: true };
|
|
1441
1472
|
}
|
|
1442
1473
|
|
|
1474
|
+
const activeSurfaceId =
|
|
1475
|
+
options.activeSurfaceId ?? ctx.currentActiveSurfaceId;
|
|
1476
|
+
bestEffortModeSessionTracking("persist_user_message", () => {
|
|
1477
|
+
ctx.modeSessions?.acceptTurn(
|
|
1478
|
+
requestId,
|
|
1479
|
+
activeSurfaceId
|
|
1480
|
+
? { kind: "surface", responseId: activeSurfaceId }
|
|
1481
|
+
: undefined,
|
|
1482
|
+
);
|
|
1483
|
+
ctx.modeSessions?.trackPersistedRow(
|
|
1484
|
+
requestId,
|
|
1485
|
+
persistedUserMessage.id,
|
|
1486
|
+
persistedUserMessage.createdAt,
|
|
1487
|
+
{
|
|
1488
|
+
startsDisplayBoundary: false,
|
|
1489
|
+
publishMessagesChanged: options.publishModeSessionChanges ?? true,
|
|
1490
|
+
},
|
|
1491
|
+
);
|
|
1492
|
+
});
|
|
1493
|
+
|
|
1443
1494
|
if (turnCtx) {
|
|
1444
1495
|
setConversationOriginChannelIfUnset(
|
|
1445
1496
|
ctx.conversationId,
|
|
@@ -1560,10 +1611,12 @@ export async function persistQueuedMessageBody(
|
|
|
1560
1611
|
updateMessageMetadata(persistedUserMessage.id, { attachmentStoredPaths });
|
|
1561
1612
|
}
|
|
1562
1613
|
|
|
1563
|
-
//
|
|
1564
|
-
// the model
|
|
1565
|
-
//
|
|
1566
|
-
//
|
|
1614
|
+
// This is the first user row after a handover, so it carries the note that
|
|
1615
|
+
// tells the model what to do about the work the handover stopped. The note
|
|
1616
|
+
// goes on this row because that work sits directly above it in the history,
|
|
1617
|
+
// which is also why it is usually the interrupting message and never has to
|
|
1618
|
+
// be the one that armed the flag. Consumed here, once: a later message sits
|
|
1619
|
+
// under a completed turn, where the note would be stale. Stamped after the
|
|
1567
1620
|
// insert, like the stored paths above, so a persist that never lands
|
|
1568
1621
|
// leaves the flag armed for the send that replaces it.
|
|
1569
1622
|
const carriesInterruptNote = ctx.pendingInterruptNote === true;
|