@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
|
@@ -13,7 +13,6 @@
|
|
|
13
13
|
* RPC lifecycle (resolve/reject/timer/detachAbort) is stored in
|
|
14
14
|
* pendingInteractions alongside routing metadata.
|
|
15
15
|
*/
|
|
16
|
-
|
|
17
16
|
import { v4 as uuid } from "uuid";
|
|
18
17
|
|
|
19
18
|
import { loadConfig } from "../config/loader.js";
|
|
@@ -30,6 +29,7 @@ import type { ToolExecutionResult } from "../tools/types.js";
|
|
|
30
29
|
import { AssistantError, ErrorCode } from "../util/errors.js";
|
|
31
30
|
import { getLogger } from "../util/logger.js";
|
|
32
31
|
import { resolveHostCuTarget } from "./host-cu-target.js";
|
|
32
|
+
import { bestEffortModeSessionTracking } from "./mode-session-tracking.js";
|
|
33
33
|
|
|
34
34
|
const log = getLogger("host-cu-proxy");
|
|
35
35
|
|
|
@@ -161,27 +161,14 @@ function isNoDiffKeyAction(action: ActionIdentity | undefined): boolean {
|
|
|
161
161
|
);
|
|
162
162
|
}
|
|
163
163
|
|
|
164
|
-
/**
|
|
165
|
-
* Canonical signature for loop detection. Key presses collapse equivalent
|
|
166
|
-
* spellings (`cmd+a`, `command+a`, `cmd + a`) of the same combo so a stuck
|
|
167
|
-
* session retrying it with alias/whitespace variants is still caught —
|
|
168
|
-
* important now that exempt keys no longer emit no-effect warnings. Only the
|
|
169
|
-
* `key` value is normalized; all other input fields (e.g. the routing
|
|
170
|
-
* `target_client_id`) are preserved, so the same combo sent to different
|
|
171
|
-
* desktop clients is not mistaken for a repeat.
|
|
172
|
-
*/
|
|
164
|
+
/** Normalize key aliases and ignore observation tokens when detecting repeats. */
|
|
173
165
|
function actionSignature(record: ActionRecord): string {
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
const normalizedInput = {
|
|
179
|
-
...record.input,
|
|
180
|
-
key: canonicalizeKeyCombo(record.input.key),
|
|
181
|
-
};
|
|
182
|
-
return `computer_use_key:${JSON.stringify(normalizedInput)}`;
|
|
166
|
+
const input = { ...record.input };
|
|
167
|
+
delete input.observation_id;
|
|
168
|
+
if (record.toolName === "computer_use_key" && typeof input.key === "string") {
|
|
169
|
+
input.key = canonicalizeKeyCombo(input.key);
|
|
183
170
|
}
|
|
184
|
-
return `${record.toolName}:${JSON.stringify(
|
|
171
|
+
return `${record.toolName}:${JSON.stringify(input)}`;
|
|
185
172
|
}
|
|
186
173
|
|
|
187
174
|
/**
|
|
@@ -223,6 +210,8 @@ function clientAdvertises(
|
|
|
223
210
|
// ---------------------------------------------------------------------------
|
|
224
211
|
|
|
225
212
|
export class HostCuProxy {
|
|
213
|
+
/** Stable identity for this conversation-owned proxy instance. */
|
|
214
|
+
private readonly _sourceId = uuid();
|
|
226
215
|
// CU state tracking (per-conversation)
|
|
227
216
|
private _stepCount = 0;
|
|
228
217
|
private _maxSteps: number;
|
|
@@ -294,6 +283,14 @@ export class HostCuProxy {
|
|
|
294
283
|
return this._actionHistory;
|
|
295
284
|
}
|
|
296
285
|
|
|
286
|
+
get sourceId(): string {
|
|
287
|
+
return this._sourceId;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
get resetGeneration(): number {
|
|
291
|
+
return this._resetGeneration;
|
|
292
|
+
}
|
|
293
|
+
|
|
297
294
|
// ---------------------------------------------------------------------------
|
|
298
295
|
// Availability
|
|
299
296
|
// ---------------------------------------------------------------------------
|
|
@@ -328,6 +325,7 @@ export class HostCuProxy {
|
|
|
328
325
|
signal?: AbortSignal,
|
|
329
326
|
targetClientId?: string,
|
|
330
327
|
sourceActorPrincipalId?: string,
|
|
328
|
+
onValidatedDispatch?: () => void,
|
|
331
329
|
): Promise<ToolExecutionResult> {
|
|
332
330
|
if (signal?.aborted) {
|
|
333
331
|
return Promise.resolve({
|
|
@@ -399,6 +397,9 @@ export class HostCuProxy {
|
|
|
399
397
|
isError: true,
|
|
400
398
|
});
|
|
401
399
|
}
|
|
400
|
+
bestEffortModeSessionTracking("computer admission", () =>
|
|
401
|
+
onValidatedDispatch?.(),
|
|
402
|
+
);
|
|
402
403
|
const scopedObservation = hasCaptureTarget(input);
|
|
403
404
|
if (scopedObservation) {
|
|
404
405
|
this._previousAXTree = undefined;
|
|
@@ -597,6 +598,30 @@ export class HostCuProxy {
|
|
|
597
598
|
return result;
|
|
598
599
|
}
|
|
599
600
|
|
|
601
|
+
/** Run a screenshot-only backend through the shared CU budget and formatter. */
|
|
602
|
+
async executeLocal(
|
|
603
|
+
toolName: string,
|
|
604
|
+
input: Record<string, unknown>,
|
|
605
|
+
execute: () => Promise<CuObservationResult>,
|
|
606
|
+
): Promise<ToolExecutionResult> {
|
|
607
|
+
if (this._stepCount >= this._maxSteps) {
|
|
608
|
+
return {
|
|
609
|
+
content: `Step limit (${this._maxSteps}) exceeded. Call computer_use_done to finish.`,
|
|
610
|
+
isError: true,
|
|
611
|
+
};
|
|
612
|
+
}
|
|
613
|
+
const reasoning =
|
|
614
|
+
typeof input.reasoning === "string" ? input.reasoning : undefined;
|
|
615
|
+
this.recordAction(toolName, input, reasoning);
|
|
616
|
+
this._previousAXTree = undefined;
|
|
617
|
+
this._consecutiveUnchangedSteps = 0;
|
|
618
|
+
const observation = await execute();
|
|
619
|
+
return this.formatObservation(observation, undefined, false, {
|
|
620
|
+
toolName,
|
|
621
|
+
input,
|
|
622
|
+
});
|
|
623
|
+
}
|
|
624
|
+
|
|
600
625
|
// ---------------------------------------------------------------------------
|
|
601
626
|
// CU state management
|
|
602
627
|
// ---------------------------------------------------------------------------
|
|
@@ -629,7 +654,8 @@ export class HostCuProxy {
|
|
|
629
654
|
* stopping and puts the pointer back where the user left it, instead of
|
|
630
655
|
* waiting out its idle fallback.
|
|
631
656
|
*/
|
|
632
|
-
endTask(conversationId: string):
|
|
657
|
+
endTask(conversationId: string): number {
|
|
658
|
+
const endedGeneration = this._resetGeneration;
|
|
633
659
|
for (const targetClientId of this._dispatchedTargets.values()) {
|
|
634
660
|
try {
|
|
635
661
|
broadcastMessage(
|
|
@@ -647,10 +673,12 @@ export class HostCuProxy {
|
|
|
647
673
|
}
|
|
648
674
|
}
|
|
649
675
|
this.reset();
|
|
676
|
+
return endedGeneration;
|
|
650
677
|
}
|
|
651
678
|
|
|
652
679
|
/** Reset all CU state. Called on terminal tools (computer_use_done, etc.). */
|
|
653
|
-
reset():
|
|
680
|
+
reset(): number {
|
|
681
|
+
const endedGeneration = this._resetGeneration;
|
|
654
682
|
this._dispatchedTargets.clear();
|
|
655
683
|
this._stepCount = 0;
|
|
656
684
|
this._previousAXTree = undefined;
|
|
@@ -658,6 +686,7 @@ export class HostCuProxy {
|
|
|
658
686
|
this._actionHistory = [];
|
|
659
687
|
this._observedTargets.clear();
|
|
660
688
|
this._resetGeneration++;
|
|
689
|
+
return endedGeneration;
|
|
661
690
|
}
|
|
662
691
|
|
|
663
692
|
/**
|
package/src/daemon/lifecycle.ts
CHANGED
|
@@ -77,7 +77,6 @@ import { writePid } from "./daemon-control.js";
|
|
|
77
77
|
import {
|
|
78
78
|
setDbMigrating,
|
|
79
79
|
setDbMigrationFailed,
|
|
80
|
-
setDbReady,
|
|
81
80
|
setStartupComplete,
|
|
82
81
|
} from "./daemon-readiness.js";
|
|
83
82
|
import { startDiskPressureGuardForLifecycle } from "./disk-pressure-guard-lifecycle.js";
|
|
@@ -91,6 +90,7 @@ import {
|
|
|
91
90
|
reconcileInterruptedConversations,
|
|
92
91
|
resumeInterruptedConversations,
|
|
93
92
|
} from "./interrupted-turn-reconciler.js";
|
|
93
|
+
import { recoverModeSessionsBeforeDbReady } from "./mode-session-startup-recovery.js";
|
|
94
94
|
import { startOrphanReaper } from "./orphan-reaper.js";
|
|
95
95
|
import { runProfilerSweep } from "./profiler-run-store.js";
|
|
96
96
|
import {
|
|
@@ -290,22 +290,39 @@ export async function runDaemon(): Promise<void> {
|
|
|
290
290
|
"stream seq floor from persisted anchors failed — continuing startup",
|
|
291
291
|
);
|
|
292
292
|
}
|
|
293
|
+
const migrationFailureDetails = {
|
|
294
|
+
failedMigrations: initResult.failedMigrations,
|
|
295
|
+
deferredMigrations: initResult.deferredMigrations,
|
|
296
|
+
validationError: initResult.validationError,
|
|
297
|
+
};
|
|
298
|
+
const modeSessionRecovery = migrationsOk
|
|
299
|
+
? recoverModeSessionsBeforeDbReady()
|
|
300
|
+
: null;
|
|
301
|
+
if (modeSessionRecovery?.ok && modeSessionRecovery.interruptedCount > 0) {
|
|
302
|
+
log.info(
|
|
303
|
+
{ interruptedModeSessions: modeSessionRecovery.interruptedCount },
|
|
304
|
+
"Recovered active mode sessions as interrupted",
|
|
305
|
+
);
|
|
306
|
+
}
|
|
307
|
+
if (modeSessionRecovery && !modeSessionRecovery.ok) {
|
|
308
|
+
log.error(
|
|
309
|
+
{ err: modeSessionRecovery.error },
|
|
310
|
+
"Mode session recovery failed; tracking is unavailable for this boot",
|
|
311
|
+
);
|
|
312
|
+
}
|
|
293
313
|
if (migrationsOk) {
|
|
294
|
-
setDbReady(true);
|
|
295
314
|
log.info("Daemon startup: DB initialized");
|
|
296
315
|
} else {
|
|
297
|
-
setDbMigrationFailed(undefined,
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
validationError: initResult.validationError,
|
|
301
|
-
});
|
|
316
|
+
setDbMigrationFailed(undefined, migrationFailureDetails);
|
|
317
|
+
}
|
|
318
|
+
if (!migrationsOk) {
|
|
302
319
|
log.error(
|
|
303
320
|
{
|
|
304
321
|
failedMigrations: initResult.failedMigrations,
|
|
305
322
|
deferredMigrations: initResult.deferredMigrations,
|
|
306
323
|
validationError: initResult.validationError,
|
|
307
324
|
},
|
|
308
|
-
"Daemon startup: DB
|
|
325
|
+
"Daemon startup: DB migrations failed; /readyz will remain unready",
|
|
309
326
|
);
|
|
310
327
|
}
|
|
311
328
|
// Migrations have settled (successfully or in the failed degraded mode),
|
|
@@ -673,11 +690,11 @@ export async function runDaemon(): Promise<void> {
|
|
|
673
690
|
// blocked.
|
|
674
691
|
startConsentRefresh();
|
|
675
692
|
|
|
676
|
-
//
|
|
677
|
-
//
|
|
678
|
-
//
|
|
679
|
-
//
|
|
680
|
-
//
|
|
693
|
+
// Open the assistant's CES RPC client (handshake + reconnect wiring).
|
|
694
|
+
// Blocks up to a 20s timeout so credential reads route through CES before
|
|
695
|
+
// provider init; non-fatal, falls back to the direct credential store on
|
|
696
|
+
// failure. CES serves a multi-connection bootstrap socket, so child
|
|
697
|
+
// processes can open the same `openCesRpcSession` path independently.
|
|
681
698
|
await startCes(config);
|
|
682
699
|
|
|
683
700
|
// Bring up the plugin layer: install the runtime bridge, register the
|
|
@@ -116,7 +116,7 @@ async function doReload(): Promise<McpReloadResult> {
|
|
|
116
116
|
const servers: McpReloadServerResult[] = [];
|
|
117
117
|
|
|
118
118
|
if (serverIds.length > 0) {
|
|
119
|
-
const serverToolInfos = await manager.start(mcpConfig);
|
|
119
|
+
const { servers: serverToolInfos } = await manager.start(mcpConfig);
|
|
120
120
|
for (const { serverId, serverConfig, tools } of serverToolInfos) {
|
|
121
121
|
const mcpTools = createMcpToolsFromServer(
|
|
122
122
|
tools,
|
|
@@ -18,7 +18,6 @@ export * from "./message-types/shared.js";
|
|
|
18
18
|
export * from "./message-types/skills.js";
|
|
19
19
|
export * from "./message-types/surfaces.js";
|
|
20
20
|
export * from "./message-types/sync.js";
|
|
21
|
-
export * from "./message-types/web-activity.js";
|
|
22
21
|
|
|
23
22
|
// Client-message domain aliases for the ClientMessage union.
|
|
24
23
|
import type { _ComputerUseClientMessages } from "./message-types/computer-use.js";
|
|
@@ -8,14 +8,19 @@
|
|
|
8
8
|
* actor filters the history down to rows whose provenance is itself
|
|
9
9
|
* non-guardian.
|
|
10
10
|
*
|
|
11
|
-
* This lives in its own low-dependency module (types plus the
|
|
12
|
-
* trust-class
|
|
11
|
+
* This lives in its own low-dependency module (types plus the gateway-client
|
|
12
|
+
* trust-class contract) so both the conversation lifecycle (history load) and the
|
|
13
13
|
* context compactor (image manifest) can apply the identical filter without
|
|
14
14
|
* creating an import cycle through `conversation-lifecycle` ↔
|
|
15
15
|
* `window-manager` ↔ `compactor`.
|
|
16
|
+
*
|
|
17
|
+
* It also owns the author field (`actorAuthorProvenance`), which says who
|
|
18
|
+
* wrote a row rather than whose turn wrote it.
|
|
16
19
|
*/
|
|
20
|
+
import { type TrustClass, TrustClassSchema } from "@vellumai/gateway-client";
|
|
21
|
+
|
|
17
22
|
import type { MessageRow } from "../persistence/conversation-crud.js";
|
|
18
|
-
import
|
|
23
|
+
import type { TrustContext } from "./trust-context-types.js";
|
|
19
24
|
|
|
20
25
|
export function parseProvenanceTrustClass(
|
|
21
26
|
metadata: string | null,
|
|
@@ -25,7 +30,7 @@ export function parseProvenanceTrustClass(
|
|
|
25
30
|
}
|
|
26
31
|
try {
|
|
27
32
|
const parsed = JSON.parse(metadata) as { provenanceTrustClass?: unknown };
|
|
28
|
-
const result =
|
|
33
|
+
const result = TrustClassSchema.safeParse(parsed?.provenanceTrustClass);
|
|
29
34
|
if (result.success) {
|
|
30
35
|
return result.data;
|
|
31
36
|
}
|
|
@@ -56,3 +61,22 @@ export function filterMessagesForUntrustedActor(
|
|
|
56
61
|
): MessageRow[] {
|
|
57
62
|
return messages.filter((m) => isRowVisibleToUntrustedActor(m.metadata));
|
|
58
63
|
}
|
|
64
|
+
|
|
65
|
+
/** The persisted author field: the contact who wrote the row. */
|
|
66
|
+
export interface ActorAuthorProvenance {
|
|
67
|
+
provenanceContactId?: string;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Author fields for a row the trust context's actor wrote themselves: their
|
|
72
|
+
* own message or reaction. `provenanceFromTrustContext` describes the turn and
|
|
73
|
+
* is also stamped on the assistant's replies, tool results, and notices, so
|
|
74
|
+
* those rows must never carry these.
|
|
75
|
+
*/
|
|
76
|
+
export function actorAuthorProvenance(
|
|
77
|
+
trustContext: TrustContext | undefined,
|
|
78
|
+
): ActorAuthorProvenance {
|
|
79
|
+
return trustContext?.requesterContactId
|
|
80
|
+
? { provenanceContactId: trustContext.requesterContactId }
|
|
81
|
+
: {};
|
|
82
|
+
}
|
|
@@ -39,6 +39,7 @@ export interface UserMessageAttachment {
|
|
|
39
39
|
data: string;
|
|
40
40
|
/** Origin of the attachment on the daemon side, when known. */
|
|
41
41
|
sourceType?: "sandbox_file" | "host_file" | "tool_block";
|
|
42
|
+
computerUseScreenshot?: boolean;
|
|
42
43
|
extractedText?: string;
|
|
43
44
|
/** Original file size in bytes. Present when data was omitted from history_response to reduce payload size. */
|
|
44
45
|
sizeBytes?: number;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { setModeSessionRecoveryHealthy } from "../config/session-groups-gate.js";
|
|
2
|
+
import { recoverActiveConversationModeSessions } from "../persistence/conversation-mode-sessions.js";
|
|
3
|
+
import { setDbReady } from "./daemon-readiness.js";
|
|
4
|
+
|
|
5
|
+
export type ModeSessionStartupRecoveryResult =
|
|
6
|
+
| { ok: true; interruptedCount: number }
|
|
7
|
+
| { ok: false; error: unknown };
|
|
8
|
+
|
|
9
|
+
/** Runs after migrations; auxiliary recovery failure disables tracking for this boot. */
|
|
10
|
+
export function recoverModeSessionsBeforeDbReady(
|
|
11
|
+
recover: () => number = recoverActiveConversationModeSessions,
|
|
12
|
+
): ModeSessionStartupRecoveryResult {
|
|
13
|
+
try {
|
|
14
|
+
const interruptedCount = recover();
|
|
15
|
+
setModeSessionRecoveryHealthy(true);
|
|
16
|
+
return { ok: true, interruptedCount };
|
|
17
|
+
} catch (error) {
|
|
18
|
+
setModeSessionRecoveryHealthy(false);
|
|
19
|
+
return { ok: false, error };
|
|
20
|
+
} finally {
|
|
21
|
+
setDbReady(true);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { ModeSession } from "../api/mode-session.js";
|
|
2
|
+
import { getLogger } from "../util/logger.js";
|
|
3
|
+
import type {
|
|
4
|
+
ConversationModeSessionCoordinator,
|
|
5
|
+
ModeSessionSourceHandle,
|
|
6
|
+
} from "./conversation-mode-session.js";
|
|
7
|
+
|
|
8
|
+
const log = getLogger("mode-session-tracking");
|
|
9
|
+
|
|
10
|
+
/** Optional bookkeeping must not interrupt accepted actions or content. */
|
|
11
|
+
export function bestEffortModeSessionTracking<T>(
|
|
12
|
+
operation: string,
|
|
13
|
+
track: () => T,
|
|
14
|
+
): T | undefined {
|
|
15
|
+
try {
|
|
16
|
+
return track();
|
|
17
|
+
} catch (err) {
|
|
18
|
+
log.warn({ err, operation }, "Mode-session tracking failed");
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** Retire a refused source while already accepted turn output keeps its owner. */
|
|
24
|
+
export function claimModeSessionTurn(
|
|
25
|
+
coordinator: Pick<
|
|
26
|
+
ConversationModeSessionCoordinator,
|
|
27
|
+
"claimTurn" | "retireSource"
|
|
28
|
+
>,
|
|
29
|
+
turnId: string,
|
|
30
|
+
handle: ModeSessionSourceHandle,
|
|
31
|
+
at: number,
|
|
32
|
+
): ModeSession | undefined {
|
|
33
|
+
let owner: ModeSession | undefined;
|
|
34
|
+
try {
|
|
35
|
+
owner = coordinator.claimTurn(turnId, handle, at);
|
|
36
|
+
} catch (err) {
|
|
37
|
+
bestEffortModeSessionTracking("failed admission cleanup", () =>
|
|
38
|
+
coordinator.retireSource(handle, {
|
|
39
|
+
status: "interrupted",
|
|
40
|
+
endReason: "tracking_failed",
|
|
41
|
+
}),
|
|
42
|
+
);
|
|
43
|
+
throw err;
|
|
44
|
+
}
|
|
45
|
+
if (!owner || owner.id !== handle.id) {
|
|
46
|
+
bestEffortModeSessionTracking("refused admission cleanup", () =>
|
|
47
|
+
coordinator.retireSource(handle, {
|
|
48
|
+
status: "interrupted",
|
|
49
|
+
endReason: "tracking_refused",
|
|
50
|
+
}),
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
return owner;
|
|
54
|
+
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Periodic reaper for orphaned subprocesses that reparent to the daemon.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* timeout/abort, group-kill with `process.kill(-pgid, SIGKILL)` (the bash
|
|
6
|
-
* host_bash tools, and the skill sandbox runner).
|
|
4
|
+
* POSIX tools run commands in their own process group (`detached: true`) and,
|
|
5
|
+
* on timeout/abort, group-kill with `process.kill(-pgid, SIGKILL)` (the bash
|
|
6
|
+
* and host_bash tools, and the skill sandbox runner). Windows piped shell
|
|
7
|
+
* children stay attached and are torn down with `taskkill /T`. The
|
|
7
8
|
* immediate child is reaped by Bun/libuv, but its descendants — e.g. git's
|
|
8
9
|
* transport helpers or a skill runner's `bun` process — were never spawned by
|
|
9
10
|
* the daemon, so when the group dies they reparent to PID 1. When the daemon
|
|
@@ -29,6 +29,7 @@ import type {
|
|
|
29
29
|
WorkspaceRefMediaSource,
|
|
30
30
|
} from "../providers/types.js";
|
|
31
31
|
import { getLogger } from "../util/logger.js";
|
|
32
|
+
import { toolImageFilename } from "./assistant-attachments.js";
|
|
32
33
|
|
|
33
34
|
const log = getLogger("persist-media-references");
|
|
34
35
|
|
|
@@ -62,6 +63,7 @@ async function referenceMediaBlock(
|
|
|
62
63
|
messageId: string,
|
|
63
64
|
block: ImageContent | FileContent,
|
|
64
65
|
position: number,
|
|
66
|
+
imageFilenameOverride?: string,
|
|
65
67
|
): Promise<ContentBlock | null> {
|
|
66
68
|
if (block.source.type !== "base64") {
|
|
67
69
|
return block;
|
|
@@ -69,7 +71,9 @@ async function referenceMediaBlock(
|
|
|
69
71
|
const { data, media_type } = block.source;
|
|
70
72
|
const filename =
|
|
71
73
|
block.source.filename ??
|
|
72
|
-
(block.type === "image"
|
|
74
|
+
(block.type === "image"
|
|
75
|
+
? (imageFilenameOverride ?? imageFilename(media_type))
|
|
76
|
+
: "attachment");
|
|
73
77
|
|
|
74
78
|
let stored: { id: string; sizeBytes: number };
|
|
75
79
|
try {
|
|
@@ -127,11 +131,15 @@ export async function referenceMediaBlocksForPersist(
|
|
|
127
131
|
conversationCreatedAt: number,
|
|
128
132
|
messageId: string,
|
|
129
133
|
blocks: ContentBlock[],
|
|
134
|
+
computerUseToolNames?: ReadonlyMap<string, string>,
|
|
130
135
|
): Promise<ContentBlock[]> {
|
|
131
136
|
// A single link position counter across all attachments in the message so
|
|
132
137
|
// their `message_attachments` rows keep content order.
|
|
133
138
|
let position = 0;
|
|
134
|
-
const convert = async (
|
|
139
|
+
const convert = async (
|
|
140
|
+
block: ContentBlock,
|
|
141
|
+
imageFilenameOverride?: string,
|
|
142
|
+
): Promise<ContentBlock> => {
|
|
135
143
|
if (block.type === "image" || block.type === "file") {
|
|
136
144
|
if (block.source.type !== "base64") {
|
|
137
145
|
return block;
|
|
@@ -143,13 +151,22 @@ export async function referenceMediaBlocksForPersist(
|
|
|
143
151
|
messageId,
|
|
144
152
|
block,
|
|
145
153
|
position++,
|
|
154
|
+
imageFilenameOverride,
|
|
146
155
|
)) ?? block
|
|
147
156
|
);
|
|
148
157
|
}
|
|
149
158
|
if (block.type === "tool_result" && block.contentBlocks?.length) {
|
|
150
159
|
const contentBlocks: ContentBlock[] = [];
|
|
160
|
+
const computerUseToolName = computerUseToolNames?.get(block.tool_use_id);
|
|
151
161
|
for (const cb of block.contentBlocks) {
|
|
152
|
-
contentBlocks.push(
|
|
162
|
+
contentBlocks.push(
|
|
163
|
+
await convert(
|
|
164
|
+
cb,
|
|
165
|
+
cb.type === "image" && computerUseToolName
|
|
166
|
+
? toolImageFilename(cb.source.media_type, computerUseToolName)
|
|
167
|
+
: undefined,
|
|
168
|
+
),
|
|
169
|
+
);
|
|
153
170
|
}
|
|
154
171
|
return { ...block, contentBlocks };
|
|
155
172
|
}
|
|
@@ -67,12 +67,19 @@ import {
|
|
|
67
67
|
preactivateHostProxySkills,
|
|
68
68
|
shouldAttachHostProxyForCapability,
|
|
69
69
|
} from "./host-proxy-preactivation.js";
|
|
70
|
+
import { actorAuthorProvenance } from "./message-provenance.js";
|
|
70
71
|
import type { SubagentToolGateMode } from "./tool-setup-types.js";
|
|
71
|
-
import { restingTrust } from "./trust-context-types.js";
|
|
72
|
+
import { restingTrust, type TrustContext } from "./trust-context-types.js";
|
|
72
73
|
|
|
73
74
|
const log = getLogger("process-message");
|
|
74
75
|
|
|
75
76
|
type ProcessMessageOptions = ConversationCreateOptions & {
|
|
77
|
+
/**
|
|
78
|
+
* The person whose own inbound message this turn persists, set only by
|
|
79
|
+
* channel ingress and its retry replay. Names the author on the persisted
|
|
80
|
+
* user row; see `PersistMessageOptions.author`.
|
|
81
|
+
*/
|
|
82
|
+
author?: TrustContext;
|
|
76
83
|
/** Per-turn observer for live agent-loop events. Does not replace SSE broadcast. */
|
|
77
84
|
onEvent?: (msg: AssistantEvent) => void;
|
|
78
85
|
/** IDs of user-uploaded attachments to resolve and include in the turn. */
|
|
@@ -539,7 +546,7 @@ export async function processMessage(
|
|
|
539
546
|
...(Object.keys(imageSourcePaths).length > 0 ? { imageSourcePaths } : {}),
|
|
540
547
|
};
|
|
541
548
|
const userMetaWithSlack = withChannelEnvelopes(
|
|
542
|
-
serverChannelMeta,
|
|
549
|
+
{ ...serverChannelMeta, ...actorAuthorProvenance(options?.author) },
|
|
543
550
|
slackMeta,
|
|
544
551
|
providerMeta,
|
|
545
552
|
);
|
|
@@ -638,7 +645,7 @@ export async function processMessage(
|
|
|
638
645
|
: {}),
|
|
639
646
|
};
|
|
640
647
|
const compactUserMeta = withChannelEnvelopes(
|
|
641
|
-
compactChannelMeta,
|
|
648
|
+
{ ...compactChannelMeta, ...actorAuthorProvenance(options?.author) },
|
|
642
649
|
slackMeta,
|
|
643
650
|
providerMeta,
|
|
644
651
|
);
|
|
@@ -698,7 +705,7 @@ export async function processMessage(
|
|
|
698
705
|
: {}),
|
|
699
706
|
};
|
|
700
707
|
const cleanUserMeta = withChannelEnvelopes(
|
|
701
|
-
cleanChannelMeta,
|
|
708
|
+
{ ...cleanChannelMeta, ...actorAuthorProvenance(options?.author) },
|
|
702
709
|
slackMeta,
|
|
703
710
|
providerMeta,
|
|
704
711
|
);
|
|
@@ -744,6 +751,7 @@ export async function processMessage(
|
|
|
744
751
|
requestId,
|
|
745
752
|
metadata: persistMetadata,
|
|
746
753
|
displayContent: options?.displayContent,
|
|
754
|
+
...(options?.author ? { author: options.author } : {}),
|
|
747
755
|
...(options?.skipUserMessageIndexing ? { skipIndexing: true } : {}),
|
|
748
756
|
...(ingressKey ? { clientMessageId: ingressKey } : {}),
|
|
749
757
|
},
|
|
@@ -825,6 +833,7 @@ export async function processMessageInBackground(
|
|
|
825
833
|
requestId,
|
|
826
834
|
metadata: persistMetadata,
|
|
827
835
|
displayContent: options?.displayContent,
|
|
836
|
+
...(options?.author ? { author: options.author } : {}),
|
|
828
837
|
...(ingressKey ? { clientMessageId: ingressKey } : {}),
|
|
829
838
|
},
|
|
830
839
|
);
|
|
@@ -59,6 +59,12 @@ export interface SubagentToolStats {
|
|
|
59
59
|
* parity for desktop/web sources; channel-routed sources resolve every tool
|
|
60
60
|
* gate identically under `hasNoClient: true` with or without them.)
|
|
61
61
|
*
|
|
62
|
+
* A wake that also carries its source's recorded wire array
|
|
63
|
+
* (`Conversation.wireToolReplay`, set by `scopeWakeAllowedTools`) sends that
|
|
64
|
+
* array verbatim, so the pin then shapes only the execution-side inventory
|
|
65
|
+
* (`allowedToolNames`); the pin alone carries wire parity for a source with
|
|
66
|
+
* no recorded surface.
|
|
67
|
+
*
|
|
62
68
|
* Tool-definition resolution ONLY. The executor callback and host-proxy
|
|
63
69
|
* attachment paths never read the pin, so it cannot make a host tool
|
|
64
70
|
* runnable: in execution gate mode every non-allowlisted call is rejected
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ToolContext } from "../tools/types.js";
|
|
2
|
+
import type { Conversation } from "./conversation.js";
|
|
3
|
+
import { resolveTurnClientOs } from "./conversation-client-surface.js";
|
|
4
|
+
import { FALLBACK_TURN_TRUST, resolveTrustClass } from "./trust-context.js";
|
|
5
|
+
import { turnActorPrincipalId } from "./turn-actor.js";
|
|
6
|
+
|
|
7
|
+
export function virtualDesktopContext(
|
|
8
|
+
ctx: Conversation,
|
|
9
|
+
signal?: AbortSignal,
|
|
10
|
+
): ToolContext {
|
|
11
|
+
return {
|
|
12
|
+
workingDir: ctx.workingDir,
|
|
13
|
+
conversationId: ctx.conversationId,
|
|
14
|
+
trustClass: resolveTrustClass(
|
|
15
|
+
ctx.getTurnOrRestingTrust?.() ?? FALLBACK_TURN_TRUST,
|
|
16
|
+
),
|
|
17
|
+
...resolveTurnClientOs(ctx),
|
|
18
|
+
sourceActorPrincipalId: turnActorPrincipalId(ctx),
|
|
19
|
+
signal,
|
|
20
|
+
};
|
|
21
|
+
}
|