@vellumai/assistant 0.12.2 → 0.12.3-dev.202609220419.f870d95
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 +70 -0
- package/README.md +12 -12
- package/docker/mousepad/90-vellum.gschema.override +4 -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 +721 -17
- 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 +7 -2
- 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 +16 -2
- 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-resurface-done.test.ts +289 -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__/gemini-provider.test.ts +31 -0
- 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__/provider-error-scenarios.test.ts +46 -0
- package/src/__tests__/provider-platform-proxy-integration.test.ts +45 -15
- package/src/__tests__/reaction-persistence.test.ts +5 -0
- package/src/__tests__/request-secret-standalone-channel-gate.test.ts +25 -9
- package/src/__tests__/retry-fallback-escalation.test.ts +22 -0
- package/src/__tests__/run-conversation-turn-persistence.test.ts +138 -1
- package/src/__tests__/runtime-attachment-metadata.test.ts +4 -2
- 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 +87 -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 +167 -3
- 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__/steer-on-enqueue-question.test.ts +265 -34
- 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/channel-verification-sessions.help.ts +12 -2
- 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 +24 -8
- 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/sidebar-done-gate.ts +27 -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 +38 -13
- package/src/daemon/conversation.ts +215 -58
- package/src/daemon/daemon-control.ts +3 -7
- package/src/daemon/handlers/__tests__/conversation-history-search.test.ts +61 -0
- package/src/daemon/handlers/config-channels.ts +3 -1
- package/src/daemon/handlers/config-model.ts +7 -5
- package/src/daemon/handlers/conversation-history.ts +11 -1
- package/src/daemon/handlers/conversations.ts +118 -10
- 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 +5 -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/__tests__/conversation-sync-ipc-routes.test.ts +49 -1
- package/src/ipc/routes/channel-reply-ipc-routes.ts +73 -0
- package/src/ipc/routes/conversation-sync-ipc-routes.ts +38 -2
- 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 +16 -4
- 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 +280 -29
- 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 +54 -22
- 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/embeddings/__tests__/embedding-local-lifecycle.test.ts +157 -32
- package/src/persistence/embeddings/embedding-backend-shutdown.test.ts +47 -0
- package/src/persistence/embeddings/embedding-backend.ts +23 -41
- package/src/persistence/embeddings/embedding-gemini.test.ts +17 -0
- package/src/persistence/embeddings/embedding-gemini.ts +3 -1
- package/src/persistence/embeddings/embedding-local.ts +72 -17
- package/src/persistence/embeddings/embedding-types.ts +0 -19
- 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-retrospective-skill-card.test.ts +2 -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-retrospective-skill-card.ts +5 -0
- 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 +41 -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/malformed-tool-call.ts +55 -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-malformed-tool-call.test.ts +105 -0
- 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 +130 -29
- package/src/providers/openai/google-thought-signature.ts +0 -6
- package/src/providers/openai/responses-provider.ts +23 -1
- package/src/providers/platform-proxy/constants.ts +5 -0
- package/src/providers/ratelimit.ts +1 -3
- package/src/providers/retry.ts +68 -36
- 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/providers/vellum-model-routing.test.ts +1 -0
- package/src/routes/control.ts +7 -5
- package/src/runtime/AGENTS.md +6 -4
- package/src/runtime/__tests__/agent-wake-archived-gate.test.ts +90 -0
- package/src/runtime/__tests__/agent-wake.test.ts +94 -1
- package/src/runtime/__tests__/question-resolution.test.ts +32 -0
- package/src/runtime/actor-trust-resolver.ts +3 -3
- package/src/runtime/agent-wake.ts +41 -7
- 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/auth/__tests__/middleware.test.ts +138 -0
- package/src/runtime/auth/middleware.ts +15 -11
- 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/middleware/auth.ts +7 -1
- 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 +37 -8
- package/src/runtime/question-resolution.ts +54 -8
- package/src/runtime/routes/__tests__/client-history-routes.test.ts +104 -0
- package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +146 -0
- package/src/runtime/routes/__tests__/global-search-routes.test.ts +74 -1
- 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-list-routes.ts +16 -14
- package/src/runtime/routes/conversation-management-routes.ts +4 -1
- package/src/runtime/routes/conversation-query-routes.ts +4 -0
- 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/global-search-routes.ts +22 -7
- 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/sync/documents-sidecar-publish.test.ts +50 -4
- package/src/runtime/sync/resource-sync-events.ts +11 -0
- package/src/runtime/sync/worker-daemon-notify.test.ts +30 -0
- package/src/runtime/sync/worker-daemon-notify.ts +44 -0
- package/src/runtime/trust-class.test.ts +7 -6
- package/src/runtime/trust-class.ts +9 -17
- package/src/runtime/verification-outbound-actions.ts +2 -2
- 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 +205 -5
- package/src/tools/ask-question/ask-question-tool.ts +131 -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-pipe.test.ts +100 -0
- package/src/util/worker-pipe.ts +44 -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
|
@@ -219,15 +219,15 @@ describe("roadmap writes", () => {
|
|
|
219
219
|
});
|
|
220
220
|
});
|
|
221
221
|
|
|
222
|
-
test("update
|
|
222
|
+
test("update forwards only the title and description it was given", async () => {
|
|
223
223
|
nextResult = ITEM;
|
|
224
224
|
|
|
225
225
|
await runAssistantCommandFull(
|
|
226
226
|
"roadmap",
|
|
227
227
|
"update",
|
|
228
228
|
"dark-mode",
|
|
229
|
-
"--
|
|
230
|
-
"
|
|
229
|
+
"--description",
|
|
230
|
+
"Follow the OS setting",
|
|
231
231
|
);
|
|
232
232
|
|
|
233
233
|
expect(calls[0]).toEqual({
|
|
@@ -236,49 +236,12 @@ describe("roadmap writes", () => {
|
|
|
236
236
|
pathParams: { slug: "dark-mode" },
|
|
237
237
|
body: {
|
|
238
238
|
title: undefined,
|
|
239
|
-
description:
|
|
240
|
-
status: "planned",
|
|
241
|
-
tags: undefined,
|
|
239
|
+
description: "Follow the OS setting",
|
|
242
240
|
},
|
|
243
241
|
},
|
|
244
242
|
});
|
|
245
243
|
});
|
|
246
244
|
|
|
247
|
-
test("--clear-tags sends the empty set that --tag cannot express", async () => {
|
|
248
|
-
nextResult = ITEM;
|
|
249
|
-
|
|
250
|
-
await runAssistantCommandFull(
|
|
251
|
-
"roadmap",
|
|
252
|
-
"update",
|
|
253
|
-
"dark-mode",
|
|
254
|
-
"--clear-tags",
|
|
255
|
-
);
|
|
256
|
-
|
|
257
|
-
expect((calls[0].params as { body: { tags: string[] } }).body.tags).toEqual(
|
|
258
|
-
[],
|
|
259
|
-
);
|
|
260
|
-
});
|
|
261
|
-
|
|
262
|
-
test("--clear-tags with --tag is refused rather than silently picking one", async () => {
|
|
263
|
-
nextResult = ITEM;
|
|
264
|
-
process.exitCode = 0;
|
|
265
|
-
|
|
266
|
-
// The complaint itself goes straight to stderr, which this harness does
|
|
267
|
-
// not capture; what matters is that no update was forwarded.
|
|
268
|
-
await runAssistantCommandFull(
|
|
269
|
-
"roadmap",
|
|
270
|
-
"update",
|
|
271
|
-
"dark-mode",
|
|
272
|
-
"--clear-tags",
|
|
273
|
-
"--tag",
|
|
274
|
-
"ui",
|
|
275
|
-
);
|
|
276
|
-
|
|
277
|
-
expect(calls).toHaveLength(0);
|
|
278
|
-
expect(process.exitCode).toBe(1);
|
|
279
|
-
process.exitCode = 0;
|
|
280
|
-
});
|
|
281
|
-
|
|
282
245
|
test("delete names the item it removed", async () => {
|
|
283
246
|
nextResult = { slug: "dark-mode", deleted: true };
|
|
284
247
|
|
|
@@ -6,7 +6,10 @@
|
|
|
6
6
|
* `process.stdout.write`, `process.stderr.write`, `console.log`, and
|
|
7
7
|
* `console.error` are captured for the duration of the run, so command output
|
|
8
8
|
* lands in the result regardless of which sink the command writes to;
|
|
9
|
-
* `process.exitCode` is reset afterwards.
|
|
9
|
+
* `process.exitCode` is reset afterwards. A write callback is honoured the
|
|
10
|
+
* way the real stream honours it, and `process.exit` records its code as the
|
|
11
|
+
* run's exit code instead of ending the test process, so a command that exits
|
|
12
|
+
* itself once its output has drained is observed rather than fatal.
|
|
10
13
|
* The caller passes its own (possibly mock-backed) registration function, so
|
|
11
14
|
* this helper imports nothing from `src/` beyond what any test file may
|
|
12
15
|
* import itself (see the test-machinery isolation rules in assistant/CLAUDE.md).
|
|
@@ -34,18 +37,32 @@ export async function runCliCommand(
|
|
|
34
37
|
const stderrChunks: string[] = [];
|
|
35
38
|
const events: string[] = [];
|
|
36
39
|
|
|
37
|
-
|
|
40
|
+
const originalExit = process.exit;
|
|
41
|
+
const invokeCallback = (rest: unknown[]): void => {
|
|
42
|
+
const callback = rest.find((arg) => typeof arg === "function");
|
|
43
|
+
if (callback) {
|
|
44
|
+
(callback as () => void)();
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
process.stdout.write = ((chunk: unknown, ...rest: unknown[]) => {
|
|
38
48
|
const text = typeof chunk === "string" ? chunk : String(chunk);
|
|
39
49
|
stdoutChunks.push(text);
|
|
40
50
|
events.push(text);
|
|
51
|
+
invokeCallback(rest);
|
|
41
52
|
return true;
|
|
42
53
|
}) as typeof process.stdout.write;
|
|
43
|
-
process.stderr.write = ((chunk: unknown) => {
|
|
54
|
+
process.stderr.write = ((chunk: unknown, ...rest: unknown[]) => {
|
|
44
55
|
const text = typeof chunk === "string" ? chunk : String(chunk);
|
|
45
56
|
stderrChunks.push(text);
|
|
46
57
|
events.push(text);
|
|
58
|
+
invokeCallback(rest);
|
|
47
59
|
return true;
|
|
48
60
|
}) as typeof process.stderr.write;
|
|
61
|
+
process.exit = ((code?: number) => {
|
|
62
|
+
if (code !== undefined) {
|
|
63
|
+
process.exitCode = code;
|
|
64
|
+
}
|
|
65
|
+
}) as typeof process.exit;
|
|
49
66
|
console.log = (...logArgs: unknown[]) => {
|
|
50
67
|
const text = logArgs.map(String).join(" ") + "\n";
|
|
51
68
|
stdoutChunks.push(text);
|
|
@@ -75,6 +92,7 @@ export async function runCliCommand(
|
|
|
75
92
|
} finally {
|
|
76
93
|
process.stdout.write = originalStdoutWrite;
|
|
77
94
|
process.stderr.write = originalStderrWrite;
|
|
95
|
+
process.exit = originalExit;
|
|
78
96
|
console.log = originalConsoleLog;
|
|
79
97
|
console.error = originalConsoleError;
|
|
80
98
|
}
|
|
@@ -175,7 +175,7 @@ describe("notifications send", () => {
|
|
|
175
175
|
"--source-channel",
|
|
176
176
|
"assistant_tool",
|
|
177
177
|
"--source-event-name",
|
|
178
|
-
"
|
|
178
|
+
"schedule.notify",
|
|
179
179
|
"--message",
|
|
180
180
|
"Hello",
|
|
181
181
|
]);
|
|
@@ -186,7 +186,7 @@ describe("notifications send", () => {
|
|
|
186
186
|
|
|
187
187
|
const body = lastSendBody();
|
|
188
188
|
expect(body.sourceChannel).toBe("assistant_tool");
|
|
189
|
-
expect(body.sourceEventName).toBe("
|
|
189
|
+
expect(body.sourceEventName).toBe("schedule.notify");
|
|
190
190
|
const payload = body.contextPayload as Record<string, unknown>;
|
|
191
191
|
expect(payload.requestedMessage).toBe("Hello");
|
|
192
192
|
});
|
|
@@ -221,7 +221,7 @@ describe("notifications send", () => {
|
|
|
221
221
|
"--source-channel",
|
|
222
222
|
"assistant_tool",
|
|
223
223
|
"--source-event-name",
|
|
224
|
-
"
|
|
224
|
+
"schedule.notify",
|
|
225
225
|
"--message",
|
|
226
226
|
"Hello",
|
|
227
227
|
"--preferred-channels",
|
|
@@ -235,7 +235,7 @@ describe("notifications send", () => {
|
|
|
235
235
|
expect(payload.preferredChannels).toEqual(["telegram", "slack"]);
|
|
236
236
|
});
|
|
237
237
|
|
|
238
|
-
test("send
|
|
238
|
+
test("send passes exclusive channel allowlist", async () => {
|
|
239
239
|
const { parsed, exitCode } = await runCommand([
|
|
240
240
|
"send",
|
|
241
241
|
"--source-channel",
|
|
@@ -243,6 +243,31 @@ describe("notifications send", () => {
|
|
|
243
243
|
"--source-event-name",
|
|
244
244
|
"user.send_notification",
|
|
245
245
|
"--message",
|
|
246
|
+
"Alarm",
|
|
247
|
+
"--channels",
|
|
248
|
+
"telegram",
|
|
249
|
+
"--urgent",
|
|
250
|
+
]);
|
|
251
|
+
|
|
252
|
+
expect(exitCode).toBe(0);
|
|
253
|
+
expect(parsed.ok).toBe(true);
|
|
254
|
+
expect(parsed.selectedChannels).toEqual([]);
|
|
255
|
+
expect(parsed.deliveryResults).toEqual([]);
|
|
256
|
+
expect(parsed.receiptClass).toBe("unknown");
|
|
257
|
+
|
|
258
|
+
const payload = lastSendBody().contextPayload as Record<string, unknown>;
|
|
259
|
+
expect(payload.channelAllowlist).toEqual(["telegram"]);
|
|
260
|
+
expect(payload.preferredChannels).toBeUndefined();
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
test("send rejects invalid urgency", async () => {
|
|
264
|
+
const { parsed, exitCode } = await runCommand([
|
|
265
|
+
"send",
|
|
266
|
+
"--source-channel",
|
|
267
|
+
"assistant_tool",
|
|
268
|
+
"--source-event-name",
|
|
269
|
+
"schedule.notify",
|
|
270
|
+
"--message",
|
|
246
271
|
"Hello",
|
|
247
272
|
"--urgency",
|
|
248
273
|
"invalid",
|
|
@@ -265,7 +290,7 @@ describe("notifications send", () => {
|
|
|
265
290
|
"--source-channel",
|
|
266
291
|
"water_reminder",
|
|
267
292
|
"--source-event-name",
|
|
268
|
-
"
|
|
293
|
+
"schedule.notify",
|
|
269
294
|
"--message",
|
|
270
295
|
"Hello",
|
|
271
296
|
]);
|
|
@@ -300,7 +325,7 @@ describe("notifications send", () => {
|
|
|
300
325
|
"--source-channel",
|
|
301
326
|
"assistant_tool",
|
|
302
327
|
"--source-event-name",
|
|
303
|
-
"
|
|
328
|
+
"schedule.notify",
|
|
304
329
|
"--message",
|
|
305
330
|
"Hi",
|
|
306
331
|
"--conversation-id",
|
|
@@ -320,7 +345,7 @@ describe("notifications send", () => {
|
|
|
320
345
|
"--source-channel",
|
|
321
346
|
"assistant_tool",
|
|
322
347
|
"--source-event-name",
|
|
323
|
-
"
|
|
348
|
+
"schedule.notify",
|
|
324
349
|
"--message",
|
|
325
350
|
"Hi",
|
|
326
351
|
]);
|
|
@@ -335,7 +360,7 @@ describe("notifications send", () => {
|
|
|
335
360
|
"--source-channel",
|
|
336
361
|
"assistant_tool",
|
|
337
362
|
"--source-event-name",
|
|
338
|
-
"
|
|
363
|
+
"schedule.notify",
|
|
339
364
|
"--message",
|
|
340
365
|
"Hi",
|
|
341
366
|
"--conversation-id",
|
|
@@ -359,7 +384,7 @@ describe("notifications send", () => {
|
|
|
359
384
|
"--source-channel",
|
|
360
385
|
"assistant_tool",
|
|
361
386
|
"--source-event-name",
|
|
362
|
-
"
|
|
387
|
+
"schedule.notify",
|
|
363
388
|
"--message",
|
|
364
389
|
"Hello",
|
|
365
390
|
]);
|
|
@@ -384,7 +409,7 @@ describe("notifications send", () => {
|
|
|
384
409
|
"--source-channel",
|
|
385
410
|
"assistant_tool",
|
|
386
411
|
"--source-event-name",
|
|
387
|
-
"
|
|
412
|
+
"schedule.notify",
|
|
388
413
|
"--message",
|
|
389
414
|
"Hello",
|
|
390
415
|
]);
|
|
@@ -65,6 +65,7 @@ let installPluginCalls: InstallPluginOptions[] = [];
|
|
|
65
65
|
let platformInstallCalls: Array<{ name: string; force?: boolean }> = [];
|
|
66
66
|
let upgradePluginCalls: UpgradePluginOptions[] = [];
|
|
67
67
|
let catalogMatches: PluginSearchMatch[] = [];
|
|
68
|
+
let catalogError: Error | null = null;
|
|
68
69
|
|
|
69
70
|
/**
|
|
70
71
|
* Queued daemon IPC responses. The default (empty queue) is a transport
|
|
@@ -162,7 +163,12 @@ mock.module("../../lib/install-from-platform.js", () => ({
|
|
|
162
163
|
}));
|
|
163
164
|
|
|
164
165
|
mock.module("../../lib/plugin-catalog-cache.js", () => ({
|
|
165
|
-
getPluginCatalog: async () =>
|
|
166
|
+
getPluginCatalog: async () => {
|
|
167
|
+
if (catalogError) {
|
|
168
|
+
throw catalogError;
|
|
169
|
+
}
|
|
170
|
+
return { ref: "main", matches: catalogMatches };
|
|
171
|
+
},
|
|
166
172
|
}));
|
|
167
173
|
|
|
168
174
|
mock.module("../../lib/inspect-plugin.js", () => ({
|
|
@@ -264,6 +270,7 @@ beforeEach(() => {
|
|
|
264
270
|
platformInstallCalls = [];
|
|
265
271
|
upgradePluginCalls = [];
|
|
266
272
|
catalogMatches = [];
|
|
273
|
+
catalogError = null;
|
|
267
274
|
ipcResults = [];
|
|
268
275
|
inspectResult = null;
|
|
269
276
|
installTarget = null;
|
|
@@ -466,6 +473,18 @@ describe("plugins install - declared-schedules consent", () => {
|
|
|
466
473
|
});
|
|
467
474
|
expect(r.exitCode).toBe(0);
|
|
468
475
|
});
|
|
476
|
+
|
|
477
|
+
test("falls back to the platform installer when catalog discovery fails", async () => {
|
|
478
|
+
catalogError = new Error("catalog unavailable");
|
|
479
|
+
|
|
480
|
+
const r = await runCommand(["plugins", "install", "example"]);
|
|
481
|
+
|
|
482
|
+
expect(installPluginCalls).toHaveLength(0);
|
|
483
|
+
expect(platformInstallCalls).toEqual([
|
|
484
|
+
{ name: "example", force: undefined },
|
|
485
|
+
]);
|
|
486
|
+
expect(r.exitCode).toBe(0);
|
|
487
|
+
});
|
|
469
488
|
});
|
|
470
489
|
|
|
471
490
|
describe("plugins upgrade - declared-schedules consent (local fallback)", () => {
|
|
@@ -380,6 +380,7 @@ describe("schedules get", () => {
|
|
|
380
380
|
mode: "execute",
|
|
381
381
|
status: "active",
|
|
382
382
|
routingIntent: "all_channels",
|
|
383
|
+
quiet: false,
|
|
383
384
|
reuseConversation: false,
|
|
384
385
|
wakeConversationId: null,
|
|
385
386
|
isOneShot: false,
|
|
@@ -436,9 +437,22 @@ describe("schedules get", () => {
|
|
|
436
437
|
expect(output).toContain("Every 30 minutes (UTC)");
|
|
437
438
|
expect(output).toContain("run heartbeat");
|
|
438
439
|
expect(output).toContain("all_channels");
|
|
440
|
+
expect(output).toMatch(/Quiet:\s+no/);
|
|
439
441
|
expect(output).toContain("conv-abc");
|
|
440
442
|
});
|
|
441
443
|
|
|
444
|
+
test("prints Quiet: yes when the schedule suppresses completion notifications", async () => {
|
|
445
|
+
mockIpcResult = {
|
|
446
|
+
ok: true,
|
|
447
|
+
result: { schedule: { ...scheduleFixture, quiet: true } },
|
|
448
|
+
};
|
|
449
|
+
|
|
450
|
+
const { exitCode } = await runCommand(["schedules", "get", "schedule-1"]);
|
|
451
|
+
|
|
452
|
+
expect(exitCode).toBe(0);
|
|
453
|
+
expect(logLines.join("\n")).toMatch(/Quiet:\s+yes/);
|
|
454
|
+
});
|
|
455
|
+
|
|
442
456
|
test("emits JSON result when --json is set", async () => {
|
|
443
457
|
mockIpcResult = { ok: true, result: { schedule: scheduleFixture } };
|
|
444
458
|
|
|
@@ -16,9 +16,10 @@ export const bashHelp: CliCommandHelp = {
|
|
|
16
16
|
],
|
|
17
17
|
helpText: `
|
|
18
18
|
Spawns the command with the same sanitized environment, working directory,
|
|
19
|
-
and platform shell the bash tool uses for tool-call subprocesses.
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
and platform shell the bash tool uses for tool-call subprocesses. CES
|
|
20
|
+
bootstrap and workspace paths are forwarded so children can reach CES over
|
|
21
|
+
IPC. CES HTTP credentials are also forwarded. The command does not go through
|
|
22
|
+
the assistant HTTP or IPC
|
|
22
23
|
API, and does not require a running assistant process.
|
|
23
24
|
|
|
24
25
|
Arguments:
|
|
@@ -17,6 +17,7 @@ import type {
|
|
|
17
17
|
BrowserOperationMeta,
|
|
18
18
|
OperationField,
|
|
19
19
|
} from "../../browser/types.js";
|
|
20
|
+
import { DESKTOP_HELP_GUIDANCE } from "../../util/browser-human-verification.js";
|
|
20
21
|
import type {
|
|
21
22
|
CliCommandHelp,
|
|
22
23
|
CliOptionHelp,
|
|
@@ -137,11 +138,10 @@ Existing sessions and explicit backend/client choices take priority.
|
|
|
137
138
|
not the user's Chrome. --desktop remains an alias for --virtual-desktop.
|
|
138
139
|
Use --virtual-desktop for Chrome in the Desktop panel.
|
|
139
140
|
Run navigate --url <url> directly to open a page.
|
|
140
|
-
The assistant-desktop feature flag and
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
the same installation and shows progress. No separate setup command is needed.
|
|
141
|
+
The assistant-desktop feature flag and a desktop-enabled assistant image are required.
|
|
142
|
+
Chrome and desktop components are included in the image. The first browser command
|
|
143
|
+
starts Chrome and completes the requested action without downloading or installing
|
|
144
|
+
anything. Missing components require an assistant image update.
|
|
145
145
|
Report other availability errors without switching to a personal computer.
|
|
146
146
|
The assistant manages Chrome startup. Do not launch a separate desktop stack,
|
|
147
147
|
install desktop packages, or drive webpages with shell-level xdotool.
|
|
@@ -158,7 +158,10 @@ or --use-active-tab. Download waiting is unavailable on this target.
|
|
|
158
158
|
Users can interact directly with the expanded desktop. If they ask you to pause,
|
|
159
159
|
stop and wait. Take a fresh snapshot before resuming. Closing the viewer does not
|
|
160
160
|
end automation. Run assistant browser --virtual-desktop detach when finished or
|
|
161
|
-
blocked
|
|
161
|
+
blocked. Chrome stays running.
|
|
162
|
+
For logins, use saved credentials first. Securely collect missing credentials
|
|
163
|
+
with assistant credentials prompt, then fill the login form yourself.
|
|
164
|
+
${DESKTOP_HELP_GUIDANCE}
|
|
162
165
|
Each subcommand maps to a browser operation and communicates
|
|
163
166
|
with the assistant process.
|
|
164
167
|
|
|
@@ -44,7 +44,11 @@ Examples:
|
|
|
44
44
|
description:
|
|
45
45
|
"Destination address for outbound verification (handle, phone number, user ID, or email address)",
|
|
46
46
|
},
|
|
47
|
-
{
|
|
47
|
+
{
|
|
48
|
+
flags: "--rebind",
|
|
49
|
+
description:
|
|
50
|
+
"Create a code although the channel already has a guardian (see below)",
|
|
51
|
+
},
|
|
48
52
|
{
|
|
49
53
|
flags: "--conversation-id <conversationId>",
|
|
50
54
|
description: "Conversation ID for inbound challenges",
|
|
@@ -74,7 +78,13 @@ Routes between three creation modes based on the provided options:
|
|
|
74
78
|
2. Outbound: --channel <ch> --destination <dest>
|
|
75
79
|
Sends a verification code to the given destination. Supports telegram
|
|
76
80
|
(handle or chat ID), phone (E.164 number), slack and discord (user ID),
|
|
77
|
-
and email.
|
|
81
|
+
and email.
|
|
82
|
+
|
|
83
|
+
--rebind creates a code although the channel already has a guardian. On
|
|
84
|
+
telegram, slack, discord and email, only the account already bound can redeem
|
|
85
|
+
that code, which is how the same guardian verifies again. A code never moves
|
|
86
|
+
the guardian to a different account there: run "revoke" first, then create
|
|
87
|
+
without --rebind. On phone, an outbound code replaces the bound number.
|
|
78
88
|
|
|
79
89
|
3. Inbound: --channel <ch> (no --destination)
|
|
80
90
|
Generates a challenge secret for the guardian to send back on the
|
|
@@ -58,6 +58,7 @@ Examples:
|
|
|
58
58
|
$ assistant clients list List all connected clients
|
|
59
59
|
$ assistant clients list --json Machine-readable JSON output
|
|
60
60
|
$ assistant clients list --capability host_bash Show only clients that can run host commands
|
|
61
|
+
$ assistant clients history Recent connection sessions and flaps
|
|
61
62
|
$ assistant clients disconnect <clientId> Force-disconnect a client`,
|
|
62
63
|
subcommands: [
|
|
63
64
|
{
|
|
@@ -87,6 +88,51 @@ Examples:
|
|
|
87
88
|
$ assistant clients list
|
|
88
89
|
$ assistant clients list --capability host_bash
|
|
89
90
|
$ assistant clients list --json | jq '.clients[0].capabilities'`,
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
name: "history",
|
|
94
|
+
description: "Show persisted client connection sessions",
|
|
95
|
+
options: [
|
|
96
|
+
{
|
|
97
|
+
flags: "--json",
|
|
98
|
+
description: "Machine-readable compact JSON output",
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
flags: "--client-id <id>",
|
|
102
|
+
description: "Restrict history to one client UUID",
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
flags: "--interface-id <id>",
|
|
106
|
+
description:
|
|
107
|
+
"Restrict history to one interface (e.g. chrome-extension)",
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
flags: "--since <when>",
|
|
111
|
+
description:
|
|
112
|
+
"ISO-8601 or epoch-ms lower bound. Sessions already open at this time are included.",
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
flags: "--limit <n>",
|
|
116
|
+
description: "Max coalesced sessions to return (1-500, default 50)",
|
|
117
|
+
},
|
|
118
|
+
],
|
|
119
|
+
helpText: `
|
|
120
|
+
Options:
|
|
121
|
+
--json Output as compact JSON instead of a table.
|
|
122
|
+
--client-id <id> Only show history for this client UUID.
|
|
123
|
+
--interface-id <id> Only show history for this interface.
|
|
124
|
+
--since <when> Lower bound as ISO-8601 or epoch milliseconds.
|
|
125
|
+
Sessions already open at this time are included.
|
|
126
|
+
--limit <n> Max sessions after flap coalescing. Default 50.
|
|
127
|
+
|
|
128
|
+
Reconnects shorter than 60 seconds are flaps on the same session, not
|
|
129
|
+
separate outages. History starts when this assistant version first
|
|
130
|
+
records connections. It does not backfill earlier uptime.
|
|
131
|
+
|
|
132
|
+
Examples:
|
|
133
|
+
$ assistant clients history
|
|
134
|
+
$ assistant clients history --interface-id chrome-extension
|
|
135
|
+
$ assistant clients history --client-id client-123 --since 2026-09-01 --json`,
|
|
90
136
|
},
|
|
91
137
|
{
|
|
92
138
|
name: "disconnect",
|
|
@@ -26,6 +26,23 @@ interface DisconnectClientResponse {
|
|
|
26
26
|
disconnected: number;
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
+
interface ClientHistorySessionJSON {
|
|
30
|
+
clientId: string;
|
|
31
|
+
interfaceId: string;
|
|
32
|
+
startedAt: string;
|
|
33
|
+
endedAt: string | null;
|
|
34
|
+
durationMs: number | null;
|
|
35
|
+
flapCount: number;
|
|
36
|
+
closeReason: string | null;
|
|
37
|
+
clientVersion: string | null;
|
|
38
|
+
sseWatchdog: boolean | null;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
interface ListClientHistoryResponse {
|
|
42
|
+
sessions: ClientHistorySessionJSON[];
|
|
43
|
+
events: unknown[];
|
|
44
|
+
}
|
|
45
|
+
|
|
29
46
|
export function registerClientsCommand(program: Command): void {
|
|
30
47
|
registerCommand(program, {
|
|
31
48
|
name: clientsHelp.name,
|
|
@@ -108,6 +125,85 @@ export function registerClientsCommand(program: Command): void {
|
|
|
108
125
|
},
|
|
109
126
|
);
|
|
110
127
|
|
|
128
|
+
subcommand(clients, "history").action(
|
|
129
|
+
async (
|
|
130
|
+
opts: {
|
|
131
|
+
json?: boolean;
|
|
132
|
+
clientId?: string;
|
|
133
|
+
interfaceId?: string;
|
|
134
|
+
since?: string;
|
|
135
|
+
limit?: string;
|
|
136
|
+
},
|
|
137
|
+
cmd: Command,
|
|
138
|
+
) => {
|
|
139
|
+
const result = await cliIpcCall<ListClientHistoryResponse>(
|
|
140
|
+
"list_client_history",
|
|
141
|
+
optsToQueryParams(opts),
|
|
142
|
+
);
|
|
143
|
+
|
|
144
|
+
if (!result.ok) {
|
|
145
|
+
log.error(result.error ?? "Failed to load client history");
|
|
146
|
+
process.exitCode = 1;
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
const response = result.result!;
|
|
151
|
+
if (opts.json) {
|
|
152
|
+
writeOutput(cmd, response);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
const sessions = response.sessions;
|
|
157
|
+
if (sessions.length === 0) {
|
|
158
|
+
log.info("No client connection history.");
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const header = [
|
|
163
|
+
"CLIENT ID",
|
|
164
|
+
"INTERFACE",
|
|
165
|
+
"STARTED",
|
|
166
|
+
"ENDED",
|
|
167
|
+
"DURATION",
|
|
168
|
+
"FLAPS",
|
|
169
|
+
"CLOSE",
|
|
170
|
+
"VERSION",
|
|
171
|
+
"WATCHDOG",
|
|
172
|
+
];
|
|
173
|
+
const rows: string[][] = sessions.map((session) => [
|
|
174
|
+
session.clientId,
|
|
175
|
+
session.interfaceId,
|
|
176
|
+
formatRelativeTime(session.startedAt),
|
|
177
|
+
session.endedAt ? formatRelativeTime(session.endedAt) : "connected",
|
|
178
|
+
formatDuration(session.durationMs),
|
|
179
|
+
String(session.flapCount),
|
|
180
|
+
session.closeReason ?? "-",
|
|
181
|
+
session.clientVersion ?? "-",
|
|
182
|
+
session.sseWatchdog == null
|
|
183
|
+
? "-"
|
|
184
|
+
: session.sseWatchdog
|
|
185
|
+
? "yes"
|
|
186
|
+
: "no",
|
|
187
|
+
]);
|
|
188
|
+
|
|
189
|
+
const colWidths = header.map((h: string, i: number) =>
|
|
190
|
+
Math.max(h.length, ...rows.map((r: string[]) => r[i].length)),
|
|
191
|
+
);
|
|
192
|
+
const pad = (s: string, w: number) => s.padEnd(w);
|
|
193
|
+
log.info(
|
|
194
|
+
header.map((h: string, i: number) => pad(h, colWidths[i])).join(" "),
|
|
195
|
+
);
|
|
196
|
+
log.info(colWidths.map((w: number) => "─".repeat(w)).join(" "));
|
|
197
|
+
for (const row of rows) {
|
|
198
|
+
log.info(
|
|
199
|
+
row
|
|
200
|
+
.map((c: string, i: number) => pad(c, colWidths[i]))
|
|
201
|
+
.join(" "),
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
},
|
|
205
|
+
);
|
|
206
|
+
|
|
111
207
|
subcommand(clients, "disconnect").action(
|
|
112
208
|
async (clientId: string, opts: { json?: boolean }, cmd: Command) => {
|
|
113
209
|
const result = await cliIpcCall<DisconnectClientResponse>(
|
|
@@ -155,3 +251,23 @@ function formatRelativeTime(iso: string): string {
|
|
|
155
251
|
const days = Math.floor(hr / 24);
|
|
156
252
|
return `${days}d ago`;
|
|
157
253
|
}
|
|
254
|
+
|
|
255
|
+
function formatDuration(ms: number | null): string {
|
|
256
|
+
if (ms == null || ms < 0) {
|
|
257
|
+
return "-";
|
|
258
|
+
}
|
|
259
|
+
const sec = Math.floor(ms / 1000);
|
|
260
|
+
if (sec < 60) {
|
|
261
|
+
return `${sec}s`;
|
|
262
|
+
}
|
|
263
|
+
const min = Math.floor(sec / 60);
|
|
264
|
+
if (min < 60) {
|
|
265
|
+
return `${min}m`;
|
|
266
|
+
}
|
|
267
|
+
const hr = Math.floor(min / 60);
|
|
268
|
+
if (hr < 24) {
|
|
269
|
+
return `${hr}h ${min % 60}m`;
|
|
270
|
+
}
|
|
271
|
+
const days = Math.floor(hr / 24);
|
|
272
|
+
return `${days}d ${hr % 24}h`;
|
|
273
|
+
}
|
|
@@ -74,9 +74,9 @@ path or connection details. Run this to diagnose credential lookup mismatches
|
|
|
74
74
|
for example, when the CLI and the daemon are reading from different stores.
|
|
75
75
|
|
|
76
76
|
Backend types:
|
|
77
|
-
encrypted-store Direct file read from keys.enc (standalone CLI, no
|
|
78
|
-
ces-rpc Delegates to the running CES process via
|
|
79
|
-
ces-http
|
|
77
|
+
encrypted-store Direct file read from keys.enc (standalone CLI, no assistant)
|
|
78
|
+
ces-rpc Delegates to the running CES process via socket RPC
|
|
79
|
+
ces-http Managed failover when the CES socket is unavailable
|
|
80
80
|
|
|
81
81
|
Also shows the CREDENTIAL_SECURITY_DIR, GATEWAY_SECURITY_DIR, and
|
|
82
82
|
VELLUM_WORKSPACE_DIR env vars so you can confirm which instance directory this
|
|
@@ -294,7 +294,12 @@ web, etc.). The user enters the secret through the UI — it never passes throug
|
|
|
294
294
|
the conversation or CLI output. On success the credential is stored in the
|
|
295
295
|
encrypted vault with the specified metadata.
|
|
296
296
|
|
|
297
|
-
Requires the assistant to be running
|
|
297
|
+
Requires the assistant to be running. The prompt renders in the conversation
|
|
298
|
+
this command runs from (the bash tool sets __CONVERSATION_ID). With no
|
|
299
|
+
conversation attached (a headless shell, Doctor's run_assistant_cli), no client
|
|
300
|
+
can show the card, so the command returns at once with a one-time collection
|
|
301
|
+
link (exit 75) to relay to the user, or an error when no link can be minted.
|
|
302
|
+
Never fall back to asking the user for the value in chat.
|
|
298
303
|
|
|
299
304
|
This command BLOCKS until the user answers the prompt, so it returns only once
|
|
300
305
|
the prompt has already closed. Tell the user what to paste BEFORE running it.
|
|
@@ -127,7 +127,12 @@ Examples:
|
|
|
127
127
|
{
|
|
128
128
|
flags: "--preferred-channels <channels>",
|
|
129
129
|
description:
|
|
130
|
-
"Comma-separated channel hints (e.g. vellum,telegram,slack)",
|
|
130
|
+
"Comma-separated channel hints (e.g. vellum,telegram,slack). Additive: vellum stays selected.",
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
flags: "--channels <channels>",
|
|
134
|
+
description:
|
|
135
|
+
"Exclusive channel allowlist (e.g. telegram). Replaces the default set. Urgent delivery does not add vellum or platform. Wins over --preferred-channels.",
|
|
131
136
|
},
|
|
132
137
|
{
|
|
133
138
|
flags: "--session-id <id>",
|
|
@@ -162,7 +167,15 @@ Behavioral notes:
|
|
|
162
167
|
is treated as critical and requires user action. Explicit --urgency /
|
|
163
168
|
--requires-action flags still win for back-compat.
|
|
164
169
|
- Without --urgent, --urgency defaults to low and --requires-action to false.
|
|
165
|
-
- --preferred-channels are hints
|
|
170
|
+
- --preferred-channels are additive hints; vellum stays in the selected set.
|
|
171
|
+
- --channels is an exclusive allowlist. Only those connected channels are
|
|
172
|
+
selected. Urgent delivery does not force vellum or platform, and Home
|
|
173
|
+
does not mirror unless vellum is in the list. When both flags are set,
|
|
174
|
+
--channels wins.
|
|
175
|
+
- --json includes selectedChannels, deliveryResults, and receiptClass.
|
|
176
|
+
receiptClass is the strongest delivery proof (provider_accepted,
|
|
177
|
+
gateway_accepted, client_os_posted, or unknown), not a promise the
|
|
178
|
+
user saw a banner.
|
|
166
179
|
- --dedupe-key suppresses duplicate signals with the same key.
|
|
167
180
|
- --conversation-id pins delivery to an existing vellum conversation
|
|
168
181
|
deterministically. Other channels (telegram, slack) continue to use
|
|
@@ -171,6 +184,7 @@ Behavioral notes:
|
|
|
171
184
|
Examples:
|
|
172
185
|
$ assistant notifications send --message "Task complete"
|
|
173
186
|
$ assistant notifications send --message "Pager: prod is down" --urgent
|
|
187
|
+
$ assistant notifications send --message "Alarm" --channels telegram --urgent
|
|
174
188
|
$ assistant notifications send --message "Build green" --conversation-id 649c4645-3a6f-4ded-a713-504f02ca806b`,
|
|
175
189
|
},
|
|
176
190
|
{
|