@vellumai/assistant 0.12.3-staging.1 → 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/ARCHITECTURE.md +43 -29
- package/Dockerfile +63 -0
- package/docs/architecture/security.md +10 -5
- package/docs/architecture/turn-actor.md +2 -0
- package/docs/desktop-browser-cli.md +45 -4
- 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/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/gateway-client/node_modules/@vellumai/service-contracts/package.json +2 -1
- 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/src/gateway-ipc-contracts.ts +20 -0
- 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/index.ts +1 -0
- package/node_modules/@vellumai/service-contracts/src/integration-categories.ts +36 -0
- package/node_modules/@vellumai/slack-text/src/index.ts +4 -8
- package/openapi.yaml +665 -14
- package/package.json +1 -1
- package/scripts/smoke-desktop-browser-cli.ts +10 -26
- package/scripts/smoke-desktop-window-theme.ts +2 -3
- 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__/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__/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__/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-retry-sweep.test.ts +9 -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-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.test.ts +546 -16
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +53 -1
- package/src/__tests__/conversation-evictor.test.ts +62 -37
- 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-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 +6 -6
- package/src/__tests__/credential-prompt-route.test.ts +35 -3
- package/src/__tests__/cu-unified-flow.test.ts +82 -1
- 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 +25 -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__/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 +1 -1
- package/src/__tests__/interrupt-on-send.test.ts +57 -43
- package/src/__tests__/interrupt-turn-note.test.ts +5 -6
- package/src/__tests__/llm-catalog-parity.test.ts +2 -2
- 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-provider-serializer.test.ts +12 -0
- package/src/__tests__/oauth-providers-routes.test.ts +1 -0
- package/src/__tests__/outbound-slack-persistence.test.ts +2 -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 -0
- 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__/runtime-events-sse-reconnect.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__/secure-keys.test.ts +43 -1
- package/src/__tests__/send-endpoint-busy.test.ts +163 -1
- package/src/__tests__/server-history-render.test.ts +91 -1
- package/src/__tests__/settings-routes.test.ts +50 -1
- package/src/__tests__/skill-script-runner-sandbox.test.ts +32 -0
- 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__/surface-completion-in-flight-snapshot.test.ts +2 -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-metadata-plumbing.test.ts +3 -1
- package/src/__tests__/tool-start-timestamp.test.ts +2 -0
- package/src/__tests__/twilio-routes.test.ts +1 -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 +99 -41
- package/src/api/events/assistant-turn-start.ts +3 -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/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 +31 -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 +6 -0
- package/src/approvals/AGENTS.md +4 -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 -8
- 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__/notifications.test.ts +35 -10
- package/src/cli/commands/browser.help.ts +4 -5
- 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 +6 -1
- package/src/cli/commands/notifications.help.ts +16 -2
- package/src/cli/commands/notifications.ts +30 -8
- package/src/cli/commands/roadmap.help.ts +18 -21
- package/src/cli/commands/roadmap.ts +4 -21
- package/src/cli/lib/__tests__/list-installed-plugins.test.ts +5 -2
- package/src/cli/lib/bundled-marketplace.json +84 -34
- package/src/cli/lib/plugin-marketplace.ts +8 -0
- package/src/cli/lib/publish-plugin.ts +1 -2
- package/src/config/__tests__/default-provider.test.ts +3 -1
- 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/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/profile-text-generation.test.ts +2 -2
- 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 +3 -1
- package/src/config/schemas/mcp.ts +2 -1
- package/src/config/schemas/memory-retrospective.ts +11 -2
- 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 +1 -11
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +10 -1
- package/src/daemon/__tests__/inference-profile-notification.test.ts +2 -0
- package/src/daemon/browser-mode-session.test.ts +402 -0
- package/src/daemon/browser-mode-session.ts +186 -0
- 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 +58 -10
- package/src/daemon/conversation-agent-loop.ts +219 -25
- 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 +8 -3
- package/src/daemon/conversation.ts +143 -41
- 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/message-protocol.ts +0 -1
- package/src/daemon/message-provenance.ts +28 -4
- package/src/daemon/mode-session-startup-recovery.ts +23 -0
- package/src/daemon/mode-session-tracking.ts +54 -0
- package/src/daemon/process-message.ts +13 -4
- package/src/daemon/virtual-desktop-context.ts +21 -0
- 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 +76 -68
- package/src/desktop/desktop-automation-lease.ts +41 -50
- 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-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 +11 -122
- package/src/desktop/desktop-stream-bridge.ts +6 -8
- package/src/desktop/desktop-window-theme.ts +5 -25
- package/src/desktop/virtual-desktop-feature.ts +52 -2
- 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 +63 -18
- package/src/mcp/__tests__/tool-caps.test.ts +28 -1
- package/src/mcp/manager.ts +3 -0
- package/src/mcp/tool-caps.ts +12 -4
- 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/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 +1 -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 +0 -23
- 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/signal.ts +4 -19
- package/src/notifications/types.ts +15 -0
- package/src/oauth/connection-resolver.ts +1 -2
- package/src/oauth/oauth-store.ts +1 -3
- package/src/oauth/provider-serializer.ts +7 -0
- package/src/oauth/seed-providers.ts +30 -0
- package/src/onboarding/onboarding-events-store.ts +99 -12
- package/src/persistence/__tests__/client-connection-events-store.test.ts +322 -0
- package/src/persistence/client-connection-events-store.ts +377 -0
- package/src/persistence/conversation-crud.ts +55 -6
- package/src/persistence/conversation-mode-sessions.test.ts +424 -0
- package/src/persistence/conversation-mode-sessions.ts +460 -0
- package/src/persistence/conversation-queries.ts +6 -19
- package/src/persistence/llm-usage-store.ts +3 -9
- package/src/persistence/message-metadata.ts +25 -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/conversations.ts +67 -0
- package/src/persistence/schema/infrastructure.ts +29 -0
- package/src/persistence/steps.ts +17 -0
- package/src/plugin-api/__tests__/plugin-name-env.test.ts +249 -0
- package/src/plugin-api/effective-context-window.ts +33 -0
- package/src/plugin-api/index.ts +24 -5
- 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/__tests__/archive-removal-framing.test.ts +64 -0
- package/src/plugins/defaults/memory/__tests__/worker-control.test.ts +19 -6
- package/src/plugins/defaults/memory/context-search/agent-protocol.ts +9 -12
- package/src/plugins/defaults/memory/context-search/agent-runner.ts +78 -22
- package/src/plugins/defaults/memory/context-search/format.ts +51 -7
- 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/types.ts +1 -11
- package/src/plugins/defaults/memory/graph/__tests__/handle-remember-v2.test.ts +11 -4
- package/src/plugins/defaults/memory/graph/tool-handlers.ts +12 -21
- package/src/plugins/defaults/memory/graph/tools.ts +35 -64
- package/src/plugins/defaults/memory/src/memory-eval-routes.ts +2 -3
- package/src/plugins/defaults/memory/src/memory-item-routes.test.ts +5 -0
- package/src/plugins/defaults/memory/src/memory-item-routes.ts +2 -1
- package/src/plugins/defaults/memory/substrate/prompts/consolidation.ts +2 -2
- package/src/plugins/defaults/memory/tools.test.ts +124 -9
- package/src/plugins/defaults/memory/tools.ts +38 -11
- package/src/plugins/defaults/memory/v3/__tests__/pool-log-store.test.ts +165 -27
- package/src/plugins/defaults/memory/v3/__tests__/pool-select.test.ts +626 -27
- package/src/plugins/defaults/memory/v3/__tests__/shadow-plugin.test.ts +46 -27
- package/src/plugins/defaults/memory/v3/orchestrate.ts +78 -38
- package/src/plugins/defaults/memory/v3/pool-log-store.ts +65 -79
- package/src/plugins/defaults/memory/v3/pool-select.test.ts +14 -5
- package/src/plugins/defaults/memory/v3/pool-select.ts +683 -44
- 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/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 +1 -1
- package/src/providers/jev/client.test.ts +10 -0
- package/src/providers/jev/client.ts +20 -4
- package/src/providers/model-catalog.ts +4 -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/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 +4 -2
- package/src/runtime/actor-trust-resolver.ts +3 -3
- package/src/runtime/agent-wake.ts +1 -1
- 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-reply-router.ts +28 -32
- 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/vbundle-builder.ts +24 -1
- package/src/runtime/migrations/vbundle-import-analyzer.ts +13 -4
- package/src/runtime/migrations/vbundle-import-policy.ts +10 -0
- 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 +1 -1
- 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/client-routes.ts +108 -0
- package/src/runtime/routes/conversation-management-routes.ts +4 -1
- package/src/runtime/routes/conversation-routes.ts +113 -27
- 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 +4 -6
- 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/identity-routes.ts +1 -5
- package/src/runtime/routes/image-generation-routes.ts +8 -14
- package/src/runtime/routes/inbound-message-handler.ts +35 -38
- 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 +38 -9
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +2 -5
- package/src/runtime/routes/inbound-stages/reaction-intercept.ts +2 -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-providers.ts +7 -0
- package/src/runtime/routes/plugins-routes.ts +6 -0
- package/src/runtime/routes/roadmap-routes.ts +47 -8
- package/src/runtime/routes/secret-routes.ts +1 -1
- 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/worker-control.ts +15 -5
- package/src/security/secure-keys.ts +53 -103
- 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.ts +6 -4
- package/src/tools/browser/browser-execution.ts +22 -59
- 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 +4 -1
- 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/skills/load.ts +2 -1
- package/src/tools/skills/sandbox-runner.ts +11 -2
- 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 +11 -0
- package/src/tools/terminal/safe-env.ts +4 -0
- package/src/tools/terminal/shell.ts +2 -0
- 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/canonicalize-identity.test.ts +21 -0
- package/src/util/canonicalize-identity.ts +16 -0
- package/src/util/errors.ts +13 -3
- package/src/util/provider-error-patterns.ts +3 -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
|
|
|
@@ -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
|
]);
|
|
@@ -138,11 +138,10 @@ Existing sessions and explicit backend/client choices take priority.
|
|
|
138
138
|
not the user's Chrome. --desktop remains an alias for --virtual-desktop.
|
|
139
139
|
Use --virtual-desktop for Chrome in the Desktop panel.
|
|
140
140
|
Run navigate --url <url> directly to open a page.
|
|
141
|
-
The assistant-desktop feature flag and
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
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.
|
|
146
145
|
Report other availability errors without switching to a personal computer.
|
|
147
146
|
The assistant manages Chrome startup. Do not launch a separate desktop stack,
|
|
148
147
|
install desktop packages, or drive webpages with shell-level xdotool.
|
|
@@ -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
|
+
}
|
|
@@ -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
|
{
|
|
@@ -32,6 +32,16 @@ interface ListHomeFeedPayload {
|
|
|
32
32
|
updatedAt: string;
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
+
function parseCommaSeparatedList(raw: string): string[] | undefined {
|
|
36
|
+
const items = raw
|
|
37
|
+
.split(",")
|
|
38
|
+
.map((item) => item.trim())
|
|
39
|
+
.filter((item) => {
|
|
40
|
+
return item.length > 0;
|
|
41
|
+
});
|
|
42
|
+
return items.length > 0 ? items : undefined;
|
|
43
|
+
}
|
|
44
|
+
|
|
35
45
|
function parseBoundedInt(
|
|
36
46
|
raw: string | undefined,
|
|
37
47
|
label: string,
|
|
@@ -142,6 +152,7 @@ export function registerNotificationsCommand(program: Command): void {
|
|
|
142
152
|
visibleInSourceNow: boolean;
|
|
143
153
|
deadlineAt?: string;
|
|
144
154
|
preferredChannels?: string;
|
|
155
|
+
channels?: string;
|
|
145
156
|
sessionId?: string;
|
|
146
157
|
dedupeKey?: string;
|
|
147
158
|
deepLinkMetadata?: string;
|
|
@@ -220,14 +231,12 @@ export function registerNotificationsCommand(program: Command): void {
|
|
|
220
231
|
deadlineAt = parsed;
|
|
221
232
|
}
|
|
222
233
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
.filter((ch) => ch.length > 0);
|
|
230
|
-
}
|
|
234
|
+
const preferredChannels = opts.preferredChannels
|
|
235
|
+
? parseCommaSeparatedList(opts.preferredChannels)
|
|
236
|
+
: undefined;
|
|
237
|
+
const channelAllowlist = opts.channels
|
|
238
|
+
? parseCommaSeparatedList(opts.channels)
|
|
239
|
+
: undefined;
|
|
231
240
|
|
|
232
241
|
// Parse --deep-link-metadata
|
|
233
242
|
let deepLinkMetadata: Record<string, unknown> | undefined;
|
|
@@ -283,6 +292,9 @@ export function registerNotificationsCommand(program: Command): void {
|
|
|
283
292
|
dispatched: boolean;
|
|
284
293
|
deduplicated: boolean;
|
|
285
294
|
reason: string;
|
|
295
|
+
selectedChannels?: string[];
|
|
296
|
+
deliveryResults?: unknown[];
|
|
297
|
+
receiptClass?: string;
|
|
286
298
|
}>("emit_notification_signal", {
|
|
287
299
|
body: {
|
|
288
300
|
sourceChannel,
|
|
@@ -300,6 +312,7 @@ export function registerNotificationsCommand(program: Command): void {
|
|
|
300
312
|
requestedBySource: sourceChannel,
|
|
301
313
|
...(opts.title ? { requestedTitle: opts.title } : {}),
|
|
302
314
|
...(preferredChannels?.length ? { preferredChannels } : {}),
|
|
315
|
+
...(channelAllowlist?.length ? { channelAllowlist } : {}),
|
|
303
316
|
...(deepLinkMetadata ? { deepLinkMetadata } : {}),
|
|
304
317
|
},
|
|
305
318
|
...(opts.dedupeKey ? { dedupeKey: opts.dedupeKey } : {}),
|
|
@@ -326,6 +339,9 @@ export function registerNotificationsCommand(program: Command): void {
|
|
|
326
339
|
signalId: signal.signalId,
|
|
327
340
|
dispatched: signal.dispatched,
|
|
328
341
|
reason: signal.reason,
|
|
342
|
+
selectedChannels: signal.selectedChannels ?? [],
|
|
343
|
+
deliveryResults: signal.deliveryResults ?? [],
|
|
344
|
+
receiptClass: signal.receiptClass ?? "unknown",
|
|
329
345
|
});
|
|
330
346
|
|
|
331
347
|
if (!shouldOutputJson(cmd)) {
|
|
@@ -335,6 +351,12 @@ export function registerNotificationsCommand(program: Command): void {
|
|
|
335
351
|
if (signal.reason) {
|
|
336
352
|
log.info(` Reason: ${signal.reason}`);
|
|
337
353
|
}
|
|
354
|
+
if (signal.selectedChannels && signal.selectedChannels.length > 0) {
|
|
355
|
+
log.info(` Channels: ${signal.selectedChannels.join(", ")}`);
|
|
356
|
+
}
|
|
357
|
+
if (signal.receiptClass) {
|
|
358
|
+
log.info(` Receipt: ${signal.receiptClass}`);
|
|
359
|
+
}
|
|
338
360
|
}
|
|
339
361
|
} catch (err) {
|
|
340
362
|
const message = err instanceof Error ? err.message : String(err);
|
|
@@ -25,7 +25,7 @@ no verb to post one.
|
|
|
25
25
|
Examples:
|
|
26
26
|
$ assistant roadmap list --sort upvotes --limit 10
|
|
27
27
|
$ assistant roadmap get scheduled-messages
|
|
28
|
-
$ assistant roadmap create --title "Add dark mode" --tag
|
|
28
|
+
$ assistant roadmap create --title "Add dark mode" --tag area-interface
|
|
29
29
|
$ assistant roadmap upvote scheduled-messages`,
|
|
30
30
|
subcommands: [
|
|
31
31
|
{
|
|
@@ -79,10 +79,13 @@ Examples:
|
|
|
79
79
|
options: [
|
|
80
80
|
{
|
|
81
81
|
flags: "--title <title>",
|
|
82
|
-
description: "Item title (required)",
|
|
82
|
+
description: "Item title, 1 to 200 characters (required)",
|
|
83
83
|
required: true,
|
|
84
84
|
},
|
|
85
|
-
{
|
|
85
|
+
{
|
|
86
|
+
flags: "--description <desc>",
|
|
87
|
+
description: "Item description, up to 5000 characters",
|
|
88
|
+
},
|
|
86
89
|
{
|
|
87
90
|
flags: "--tag <slug>",
|
|
88
91
|
description:
|
|
@@ -97,41 +100,35 @@ accepted, since status is assigned by Vellum.
|
|
|
97
100
|
Examples:
|
|
98
101
|
$ assistant roadmap create --title "Add dark mode"
|
|
99
102
|
$ assistant roadmap create --title "Recurring reminders" \\
|
|
100
|
-
--description "Repeat a scheduled message weekly" --tag
|
|
103
|
+
--description "Repeat a scheduled message weekly" --tag area-assistant`,
|
|
101
104
|
},
|
|
102
105
|
{
|
|
103
106
|
name: "update",
|
|
104
107
|
args: "<slug>",
|
|
105
|
-
description:
|
|
108
|
+
description:
|
|
109
|
+
"Edit the title or description of an item the assistant filed",
|
|
106
110
|
options: [
|
|
107
|
-
{ flags: "--title <title>", description: "New title" },
|
|
108
|
-
{ flags: "--description <desc>", description: "New description" },
|
|
109
111
|
{
|
|
110
|
-
flags: "--
|
|
111
|
-
description: "New
|
|
112
|
-
},
|
|
113
|
-
{
|
|
114
|
-
flags: "--tag <slug>",
|
|
115
|
-
description: "Replacement tag slug, repeatable",
|
|
112
|
+
flags: "--title <title>",
|
|
113
|
+
description: "New title, 1 to 200 characters",
|
|
116
114
|
},
|
|
117
115
|
{
|
|
118
|
-
flags: "--
|
|
119
|
-
description: "
|
|
116
|
+
flags: "--description <desc>",
|
|
117
|
+
description: "New description, up to 5000 characters",
|
|
120
118
|
},
|
|
121
119
|
],
|
|
122
120
|
helpText: `
|
|
123
121
|
Arguments:
|
|
124
122
|
<slug> Item slug, as printed in the URL by 'assistant roadmap list'
|
|
125
123
|
|
|
126
|
-
At least one
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
124
|
+
At least one of --title or --description is required. Only items this
|
|
125
|
+
assistant filed can be edited, and only while their status is still open.
|
|
126
|
+
Status and tags are set by Vellum staff, so an item's tags are chosen once,
|
|
127
|
+
on 'roadmap create'.
|
|
130
128
|
|
|
131
129
|
Examples:
|
|
132
130
|
$ assistant roadmap update dark-mode --description "Follow the OS setting"
|
|
133
|
-
$ assistant roadmap update dark-mode --
|
|
134
|
-
$ assistant roadmap update dark-mode --clear-tags`,
|
|
131
|
+
$ assistant roadmap update dark-mode --title "Dark mode that follows the OS"`,
|
|
135
132
|
},
|
|
136
133
|
{
|
|
137
134
|
name: "delete",
|