@vellumai/assistant 0.12.1-staging.1 → 0.12.1
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/AGENTS.md +0 -4
- package/ARCHITECTURE.md +12 -11
- package/docs/architecture/turn-actor.md +8 -15
- package/openapi.yaml +1 -291
- package/package.json +1 -1
- package/src/__tests__/always-loaded-tools-guard.test.ts +10 -18
- package/src/__tests__/app-compiler.test.ts +0 -6
- package/src/__tests__/app-control-tool-schemas.test.ts +2 -5
- package/src/__tests__/app-dir-path-guard.test.ts +3 -1
- package/src/__tests__/app-source-watcher.test.ts +218 -0
- package/src/{calls/__tests__ → __tests__}/call-controller.test.ts +82 -503
- package/src/__tests__/computer-use-skill-proxy-bridge.test.ts +2 -5
- package/src/__tests__/computer-use-tools.test.ts +5 -17
- package/src/__tests__/config-schema-cmd.test.ts +2 -2
- package/src/__tests__/config-schema.test.ts +29 -28
- package/src/__tests__/config-watcher-skill-reseed.test.ts +359 -0
- package/src/__tests__/config-watcher.test.ts +8 -23
- package/src/__tests__/connection-model-compat.test.ts +2 -2
- package/src/__tests__/conversation-key-store-disk-view.test.ts +1 -1
- package/src/__tests__/conversation-pairing.test.ts +0 -26
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +10 -4
- package/src/__tests__/conversation-queue.test.ts +207 -48
- package/src/__tests__/conversation-retry-discard.test.ts +1 -54
- package/src/__tests__/conversation-skill-tools.test.ts +0 -27
- package/src/__tests__/conversation-surfaces-app-control.test.ts +3 -8
- package/src/__tests__/conversation-surfaces-task-progress.test.ts +0 -67
- package/src/__tests__/conversation-title-service.test.ts +10 -14
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +5 -3
- package/src/__tests__/conversation-tool-setup-attribution.test.ts +0 -51
- package/src/__tests__/credential-record-retire.test.ts +1 -171
- package/src/__tests__/credential-routes.test.ts +3 -212
- package/src/__tests__/credential-security-invariants.test.ts +1 -2
- package/src/__tests__/cu-unified-flow.test.ts +2 -8
- package/src/__tests__/drain-kick-guard.test.ts +2 -0
- package/src/__tests__/drain-requeue-on-contention.test.ts +6 -0
- package/src/__tests__/evict-conversations-for-reload.test.ts +1 -1
- package/src/__tests__/host-bash-proxy.test.ts +45 -26
- package/src/__tests__/host-browser-proxy.test.ts +17 -6
- package/src/__tests__/host-file-proxy-targeted.test.ts +0 -23
- package/src/__tests__/host-file-proxy.test.ts +23 -11
- package/src/__tests__/host-transfer-proxy-targeted.test.ts +9 -30
- package/src/__tests__/llm-catalog-parity.test.ts +0 -25
- package/src/__tests__/mcp-auth-routes.test.ts +9 -6
- package/src/__tests__/mcp-config-secret-boundary.test.ts +136 -78
- package/src/__tests__/mcp-health-check.test.ts +11 -8
- package/src/__tests__/mcp-list-plugin-servers.test.ts +10 -8
- package/src/{calls/__tests__ → __tests__}/media-stream-audio-transcode.test.ts +1 -1
- package/src/{calls/__tests__ → __tests__}/media-stream-output.test.ts +8 -37
- package/src/{calls/__tests__ → __tests__}/media-stream-parser.test.ts +1 -1
- package/src/{calls/__tests__ → __tests__}/media-stream-server-integration.test.ts +57 -150
- package/src/{calls/__tests__ → __tests__}/media-stream-stt-session.test.ts +5 -5
- package/src/{calls/__tests__ → __tests__}/media-turn-detector.test.ts +1 -1
- package/src/__tests__/messages-after-tiebreaker.test.ts +0 -91
- package/src/__tests__/messages-read-boundary-guard.test.ts +1 -1
- package/src/__tests__/messaging-send-tool.test.ts +548 -355
- package/src/__tests__/model-intents.test.ts +0 -3
- package/src/__tests__/outlook-messaging-provider.test.ts +6 -6
- package/src/__tests__/platform-client-verify-credential.test.ts +0 -2
- package/src/__tests__/plugin-import-boundary-guard.test.ts +0 -13
- package/src/__tests__/script-proxy-certs.test.ts +0 -35
- package/src/__tests__/skill-feature-flags-integration.test.ts +1 -1
- package/src/__tests__/skill-feature-flags.test.ts +2 -2
- package/src/__tests__/speaker-identification.test.ts +56 -0
- package/src/__tests__/subagent-tool-gate-mode.test.ts +3 -19
- package/src/__tests__/subagent-tools.test.ts +2 -3
- package/src/__tests__/telephony-tts-guard.test.ts +3 -38
- package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +0 -4
- package/src/{calls/__tests__/voice-session-bridge-turn-flow.test.ts → __tests__/voice-session-bridge.test.ts} +12 -20
- package/src/__tests__/watch-retro-tool-availability.test.ts +17 -8
- package/src/__tests__/workspace-git-service.test.ts +0 -26
- package/src/acp/__tests__/agent-process.test.ts +4 -258
- package/src/acp/__tests__/auth-required.test.ts +0 -96
- package/src/acp/__tests__/client-handler.test.ts +2 -90
- package/src/acp/__tests__/session-manager-persistence.test.ts +1 -5
- package/src/acp/__tests__/session-manager-resume.test.ts +6 -270
- package/src/acp/__tests__/session-manager-usage.test.ts +2 -4
- package/src/acp/__tests__/session-manager.test.ts +4 -895
- package/src/acp/agent-process.test.ts +1 -4
- package/src/acp/agent-process.ts +9 -94
- package/src/acp/auth-required.ts +1 -50
- package/src/acp/auto-install.test.ts +7 -9
- package/src/acp/client-handler.ts +3 -16
- package/src/acp/resolve-agent.test.ts +6 -220
- package/src/acp/resolve-agent.ts +23 -88
- package/src/acp/session-manager.test.ts +3 -196
- package/src/acp/session-manager.ts +18 -441
- package/src/acp/types.ts +5 -50
- package/src/api/events/app-files-changed.ts +3 -4
- package/src/api/index.ts +0 -6
- package/src/apps/app-store.ts +1 -1
- package/src/bundler/app-compiler.ts +0 -15
- package/src/calls/__tests__/voice-control-protocol.test.ts +25 -58
- package/src/calls/__tests__/voice-session-bridge.test.ts +1 -37
- package/src/calls/__tests__/voice-triage-escalate.test.ts +0 -105
- package/src/calls/call-constants.ts +4 -24
- package/src/calls/call-controller.ts +199 -499
- package/src/calls/call-transport.ts +0 -16
- package/src/calls/media-stream-output.ts +0 -32
- package/src/calls/media-stream-server.ts +30 -82
- package/src/calls/media-stream-stt-session.ts +0 -15
- package/src/calls/resolve-call-tts-provider.ts +2 -33
- package/src/calls/speaker-identification.ts +233 -0
- package/src/calls/tts-call-strategy.ts +5 -9
- package/src/calls/types.ts +0 -2
- package/src/calls/voice-control-protocol.ts +21 -53
- package/src/calls/voice-session-bridge.ts +46 -59
- package/src/calls/voice-triage-escalate.ts +56 -175
- package/src/cli/commands/apps.help.ts +13 -67
- package/src/cli/commands/apps.ts +0 -183
- package/src/cli/commands/channels/index.help.ts +2 -70
- package/src/cli/commands/channels/index.ts +3 -16
- package/src/cli/commands/credentials.help.ts +2 -6
- package/src/cli/commands/credentials.ts +2 -2
- package/src/cli/commands/mcp.help.ts +8 -8
- package/src/cli/commands/mcp.ts +1 -1
- package/src/cli/commands/roadmap.help.ts +1 -5
- package/src/cli/commands/roadmap.ts +1 -1
- package/src/cli/lib/bundled-marketplace.json +90 -103
- package/src/config/__tests__/default-profile-catalog.test.ts +0 -22
- package/src/config/__tests__/memory-retrospective-schema.test.ts +1 -15
- package/src/config/__tests__/platform-rehydration.test.ts +0 -93
- package/src/config/acp-defaults.test.ts +3 -13
- package/src/config/acp-defaults.ts +6 -23
- package/src/config/acp-schema.ts +2 -30
- package/src/config/bundled-skills/acp/SKILL.md +14 -22
- package/src/config/bundled-skills/acp/TOOLS.json +1 -5
- package/src/config/bundled-skills/app-builder/SKILL.md +9 -12
- package/src/config/bundled-skills/app-builder/references/CUSTOM_ROUTES.md +1 -1
- package/src/config/bundled-skills/messaging/TOOLS.json +3 -3
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +139 -67
- package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +1 -1
- package/src/config/bundled-skills/screen-annotation/SKILL.md +1 -8
- package/src/config/bundled-skills/screen-annotation/tools/screen-annotation.test.ts +1 -4
- package/src/config/bundled-skills/skill-management/TOOLS.json +2 -2
- package/src/config/default-profile-catalog.ts +1 -1
- package/src/config/env.ts +2 -2
- package/src/config/feature-flag-registry.json +12 -8
- package/src/config/memory-v3-gate.test.ts +0 -31
- package/src/config/memory-v3-gate.ts +16 -20
- package/src/config/platform-rehydration.ts +21 -75
- package/src/config/schema.ts +2 -2
- package/src/config/schemas/__tests__/live-voice.test.ts +158 -8
- package/src/config/schemas/calls.ts +28 -1
- package/src/config/schemas/live-voice.ts +173 -1
- package/src/config/schemas/mcp.ts +1 -1
- package/src/config/schemas/memory-retrospective.ts +0 -10
- package/src/config/schemas/skills.ts +14 -0
- package/src/credential-execution/process-manager.test.ts +19 -18
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +121 -66
- package/src/daemon/__tests__/plugin-mcp-reconcile.test.ts +1 -4
- package/src/daemon/app-source-watcher.ts +218 -0
- package/src/daemon/config-watcher.ts +194 -13
- package/src/daemon/conversation-process.ts +64 -35
- package/src/daemon/conversation-skill-tools.ts +31 -13
- package/src/daemon/conversation-store.ts +1 -1
- package/src/daemon/conversation-surfaces.ts +8 -10
- package/src/daemon/conversation-tool-setup.ts +43 -37
- package/src/daemon/conversation.ts +3 -0
- package/src/daemon/host-bash-proxy.ts +12 -8
- package/src/daemon/host-browser-proxy.ts +1 -15
- package/src/daemon/host-file-proxy.ts +10 -8
- package/src/daemon/host-transfer-proxy.ts +18 -14
- package/src/daemon/lifecycle.ts +5 -0
- package/src/daemon/mcp-reload-service.ts +5 -5
- package/src/daemon/message-types/sync.ts +0 -1
- package/src/daemon/providers-setup.ts +1 -1
- package/src/daemon/shutdown-handlers.ts +9 -1
- package/src/daemon/skill-memory-refresh.ts +0 -64
- package/src/daemon/tool-side-effects.ts +18 -7
- package/src/hooks/types.ts +0 -33
- package/src/inbound/platform-callback-registration.ts +5 -4
- package/src/live-voice/__tests__/live-voice-metrics.test.ts +3 -0
- package/src/live-voice/__tests__/live-voice-progress.test.ts +15 -15
- package/src/live-voice/__tests__/live-voice-vad.test.ts +2 -2
- package/src/{calls → live-voice}/__tests__/progress-narration.test.ts +4 -4
- package/src/{calls → live-voice}/__tests__/progress-phrases.test.ts +1 -1
- package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +69 -13
- package/src/live-voice/live-voice-session.ts +693 -213
- package/src/{calls → live-voice}/progress-narration.ts +2 -2
- package/src/live-voice/protocol.ts +2 -0
- package/src/mcp/__tests__/effective-config.test.ts +2 -2
- package/src/mcp/effective-config.ts +3 -3
- package/src/mcp/mcp-header-store.ts +45 -29
- package/src/mcp/startup.ts +4 -8
- package/src/messaging/provider.ts +3 -10
- package/src/messaging/providers/callback-routing.ts +0 -18
- package/src/messaging/providers/channel-transport.ts +0 -56
- package/src/messaging/providers/discord/transport.ts +0 -17
- package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +17 -6
- package/src/messaging/providers/slack/adapter.ts +44 -7
- package/src/messaging/providers/slack/transport.ts +0 -16
- package/src/messaging/providers/telegram-bot/adapter.ts +48 -1
- package/src/messaging/providers/telegram-bot/client.ts +26 -0
- package/src/messaging/providers/telegram-bot/transport.ts +0 -20
- package/src/messaging/providers/whatsapp/adapter.ts +48 -1
- package/src/messaging/providers/whatsapp/client.ts +29 -0
- package/src/messaging/providers/whatsapp/transport.ts +0 -18
- package/src/monitoring/__tests__/workspace-git-heartbeat.test.ts +0 -8
- package/src/notifications/__tests__/assistant-reply-producer.test.ts +0 -55
- package/src/notifications/__tests__/home-feed-side-effect.test.ts +3 -153
- package/src/notifications/assistant-reply-producer.ts +3 -8
- package/src/notifications/conversation-pairing.ts +16 -36
- package/src/notifications/delivered-post-record.ts +1 -11
- package/src/notifications/home-feed-side-effect.ts +7 -55
- package/src/outbound-proxy/certs.ts +5 -3
- package/src/permissions/checker.test.ts +6 -11
- package/src/persistence/compaction-log-store-clickhouse.ts +3 -3
- package/src/persistence/conversation-crud.ts +63 -71
- package/src/persistence/conversation-lineage.ts +4 -12
- package/src/persistence/conversation-title-service.ts +26 -9
- package/src/persistence/llm-request-log-sink-clickhouse.ts +3 -3
- package/src/persistence/llm-request-log-source-clickhouse.ts +3 -3
- package/src/persistence/message-reads.ts +0 -30
- package/src/persistence/migrations/157-invite-contact-id.ts +6 -18
- package/src/persistence/schema/memory-core.ts +0 -5
- package/src/platform/client.test.ts +0 -2
- package/src/platform/client.ts +10 -2
- package/src/plugin-api/constants.ts +0 -2
- package/src/plugin-api/index.ts +0 -1
- package/src/plugin-api/types.ts +0 -2
- package/src/plugins/defaults/index.ts +0 -2
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-accounting.test.ts +0 -46
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-enqueue.test.ts +5 -9
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +10 -20
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-state.test.ts +0 -219
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-sweep.test.ts +0 -31
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-trigger-check.test.ts +0 -63
- package/src/plugins/defaults/memory/__tests__/shutdown-hook.test.ts +0 -4
- package/src/plugins/defaults/memory/graph/capability-seed.ts +6 -4
- package/src/plugins/defaults/memory/hooks/init.ts +0 -10
- package/src/plugins/defaults/memory/hooks/shutdown.ts +0 -2
- package/src/plugins/defaults/memory/jobs-worker.ts +0 -13
- package/src/plugins/defaults/memory/memory-retrospective-accounting.ts +60 -34
- package/src/plugins/defaults/memory/memory-retrospective-enqueue.ts +5 -3
- package/src/plugins/defaults/memory/memory-retrospective-job.ts +3 -12
- package/src/plugins/defaults/memory/memory-retrospective-state.ts +71 -312
- package/src/plugins/defaults/memory/memory-retrospective-sweep.ts +1 -2
- package/src/plugins/defaults/memory/memory-retrospective-trigger-check.ts +3 -5
- package/src/plugins/defaults/memory/startup.ts +1 -6
- package/src/plugins/defaults/memory/substrate/__tests__/skill-content.test.ts +9 -7
- package/src/plugins/defaults/memory/substrate/skill-content.ts +2 -2
- package/src/plugins/defaults/memory/v3/__tests__/pool-select.test.ts +0 -89
- package/src/plugins/defaults/memory/worker.ts +0 -6
- package/src/plugins/mcp-servers.ts +75 -15
- package/src/providers/__tests__/connection-model-compat.test.ts +3 -3
- package/src/providers/gemini/client.ts +23 -9
- package/src/providers/model-catalog.ts +0 -34
- package/src/providers/model-intents.ts +5 -10
- package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +18 -146
- package/src/providers/openai/__tests__/tool-choice-mapping.test.ts +1 -83
- package/src/providers/openai/chat-completions-provider.ts +78 -192
- package/src/providers/openai/codex-models.ts +4 -0
- package/src/runtime/AGENTS.md +0 -2
- package/src/runtime/auth/same-actor.ts +3 -38
- package/src/runtime/http-server.ts +151 -160
- package/src/runtime/routes/__tests__/acp-routes.test.ts +4 -159
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +1 -108
- package/src/runtime/routes/__tests__/mcp-add-default-risk.test.ts +12 -16
- package/src/runtime/routes/acp-routes.test.ts +0 -15
- package/src/runtime/routes/acp-routes.ts +9 -72
- package/src/runtime/routes/app-management-routes.ts +0 -73
- package/src/runtime/routes/app-routes.ts +1 -1
- package/src/runtime/routes/conversation-list-routes.ts +3 -14
- package/src/runtime/routes/conversation-query-routes.ts +0 -40
- package/src/runtime/routes/credential-routes.ts +10 -19
- package/src/runtime/routes/diagnostics-routes.ts +3 -55
- package/src/runtime/routes/index.ts +0 -4
- package/src/runtime/routes/log-export-routes.ts +0 -2
- package/src/runtime/routes/mcp-auth-routes.ts +47 -39
- package/src/runtime/routes/migration-routes.ts +21 -8
- package/src/runtime/routes/platform-routes.ts +15 -18
- package/src/runtime/services/__tests__/conversation-serializer.test.ts +0 -28
- package/src/runtime/services/conversation-serializer.ts +3 -16
- package/src/runtime/sync/resource-sync-events.ts +1 -2
- package/src/schedule/worker.ts +1 -1
- package/src/security/ces-rpc-record-backend.ts +0 -7
- package/src/subagent/consult-context.ts +25 -12
- package/src/tools/acp/list-agents.test.ts +1 -3
- package/src/tools/acp/spawn.test.ts +11 -146
- package/src/tools/acp/spawn.ts +3 -21
- package/src/tools/acp/status.ts +3 -40
- package/src/tools/app-control/skill-proxy-bridge.ts +1 -2
- package/src/tools/capability-offer.test.ts +2 -22
- package/src/tools/capability-offer.ts +1 -16
- package/src/tools/computer-use/definitions.ts +2 -4
- package/src/tools/computer-use/skill-proxy-bridge.ts +1 -2
- package/src/tools/credentials/metadata-store.ts +0 -100
- package/src/tools/host-filesystem/edit.test.ts +1 -2
- package/src/tools/host-filesystem/edit.ts +2 -2
- package/src/tools/host-filesystem/read.test.ts +1 -2
- package/src/tools/host-filesystem/read.ts +2 -2
- package/src/tools/host-filesystem/transfer.test.ts +1 -2
- package/src/tools/host-filesystem/transfer.ts +2 -2
- package/src/tools/host-filesystem/write.test.ts +1 -2
- package/src/tools/host-filesystem/write.ts +2 -2
- package/src/tools/host-terminal/host-shell.test.ts +0 -16
- package/src/tools/host-terminal/host-shell.ts +20 -4
- package/src/tools/policy-context.ts +7 -6
- package/src/tools/subagent/spawn.ts +8 -5
- package/src/tools/watch/watch-retro-report.ts +8 -0
- package/src/util/__tests__/language-subtag.test.ts +1 -23
- package/src/util/fs-watcher-error.ts +36 -0
- package/src/util/language-subtag.ts +0 -16
- package/src/util/platform.ts +0 -8
- package/src/workspace/git-service.ts +54 -5
- package/src/workspace/migrations/registry.ts +0 -6
- package/scripts/smoke-desktop-window-theme.ts +0 -186
- package/src/__tests__/git-porcelain.test.ts +0 -47
- package/src/__tests__/helpers/set-workspace-mcp.ts +0 -11
- package/src/__tests__/message-deleted-hook-dispatch.test.ts +0 -119
- package/src/__tests__/resolve-app.test.ts +0 -135
- package/src/__tests__/source-fingerprint.test.ts +0 -184
- package/src/__tests__/workspace-migration-154-repair-retired-codex-gpt-5-4-model-ids.test.ts +0 -336
- package/src/acp/__tests__/helpers/acp-model-option.ts +0 -51
- package/src/acp/model-config.test.ts +0 -166
- package/src/acp/model-config.ts +0 -138
- package/src/api/events/acp-session-model-update.test.ts +0 -88
- package/src/api/events/acp-session-model-update.ts +0 -46
- package/src/apps/resolve-app.ts +0 -81
- package/src/apps/source-fingerprint.ts +0 -266
- package/src/calls/__tests__/barge-in-guard.test.ts +0 -81
- package/src/calls/__tests__/voice-leg-coordinator.test.ts +0 -229
- package/src/calls/__tests__/voice-progress-cadence.test.ts +0 -274
- package/src/calls/barge-in-guard.ts +0 -118
- package/src/calls/voice-leg-coordinator.ts +0 -189
- package/src/calls/voice-progress-cadence.ts +0 -423
- package/src/cli/commands/__tests__/apps.test.ts +0 -245
- package/src/cli/commands/__tests__/roadmap.help.test.ts +0 -19
- package/src/cli/commands/channels/__tests__/send.test.ts +0 -218
- package/src/cli/commands/channels/send.ts +0 -128
- package/src/config/__tests__/platform-identity.test.ts +0 -117
- package/src/config/acp-agent-write.ts +0 -43
- package/src/config/acp-schema.test.ts +0 -81
- package/src/config/platform-identity.ts +0 -144
- package/src/config/schemas/__tests__/voice.test.ts +0 -148
- package/src/config/schemas/voice.ts +0 -150
- package/src/daemon/__tests__/skill-memory-refresh-mtime.test.ts +0 -133
- package/src/daemon/app-change-notify.ts +0 -45
- package/src/desktop/__tests__/fake-desktop.ts +0 -119
- package/src/desktop/desktop-chrome-policy.test.ts +0 -71
- package/src/desktop/desktop-chrome-policy.ts +0 -42
- package/src/desktop/desktop-dependencies.test.ts +0 -102
- package/src/desktop/desktop-dependencies.ts +0 -306
- package/src/desktop/desktop-feature.test.ts +0 -18
- package/src/desktop/desktop-feature.ts +0 -19
- package/src/desktop/desktop-panel-config.test.ts +0 -135
- package/src/desktop/desktop-panel-config.ts +0 -149
- package/src/desktop/desktop-session-manager.test.ts +0 -627
- package/src/desktop/desktop-session-manager.ts +0 -814
- package/src/desktop/desktop-stream-bridge.test.ts +0 -395
- package/src/desktop/desktop-stream-bridge.ts +0 -214
- package/src/desktop/desktop-wallpaper.test.ts +0 -191
- package/src/desktop/desktop-wallpaper.ts +0 -113
- package/src/desktop/desktop-window-theme.ts +0 -170
- package/src/i18n/AGENTS.md +0 -22
- package/src/i18n/__tests__/i18n.test.ts +0 -108
- package/src/i18n/index.ts +0 -16
- package/src/i18n/locales.ts +0 -93
- package/src/i18n/messages.ts +0 -61
- package/src/i18n/title.ts +0 -25
- package/src/mcp/__tests__/workspace-mcp-config.test.ts +0 -135
- package/src/mcp/spec-schema.ts +0 -111
- package/src/mcp/workspace-mcp-config.ts +0 -188
- package/src/messaging/providers/__tests__/proactive-address.test.ts +0 -95
- package/src/persistence/conversation-title-placeholders.ts +0 -23
- package/src/persistence/message-cursor.ts +0 -78
- package/src/persistence/migrations/__tests__/157-invite-contact-id.test.ts +0 -149
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-cursor-backfill.test.ts +0 -118
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-cursor-preserve.test.ts +0 -83
- package/src/plugins/defaults/memory/hooks/message-deleted.ts +0 -21
- package/src/plugins/defaults/memory/memory-retrospective-cursor-backfill.ts +0 -126
- package/src/plugins/defaults/memory/memory-retrospective-cursor-preserve.ts +0 -79
- package/src/plugins/defaults/memory/memory-retrospective-cursor.ts +0 -28
- package/src/plugins/defaults/memory/skill-md-mtime-poll.ts +0 -9
- package/src/providers/gemini-thought-signature.test.ts +0 -63
- package/src/providers/gemini-thought-signature.ts +0 -44
- package/src/providers/openai/__tests__/chat-completions-provider-thought-signature.test.ts +0 -613
- package/src/providers/openai/__tests__/google-thought-signature.test.ts +0 -235
- package/src/providers/openai/google-thought-signature.ts +0 -320
- package/src/runtime/__tests__/channel-send.test.ts +0 -443
- package/src/runtime/__tests__/desktop-stream-upgrade.test.ts +0 -89
- package/src/runtime/__tests__/live-voice-upgrade.test.ts +0 -58
- package/src/runtime/__tests__/runtime-ws-test-utils.ts +0 -72
- package/src/runtime/__tests__/watch-stream-upgrade.test.ts +0 -59
- package/src/runtime/channel-send.ts +0 -316
- package/src/runtime/routes/__tests__/apps-refresh-route.test.ts +0 -205
- package/src/runtime/routes/__tests__/channel-send-routes.test.ts +0 -127
- package/src/runtime/routes/__tests__/dictation-cleanup-guard.test.ts +0 -107
- package/src/runtime/routes/channel-send-routes.ts +0 -85
- package/src/runtime/routes/desktop-setup-routes.test.ts +0 -74
- package/src/runtime/routes/desktop-setup-routes.ts +0 -35
- package/src/security/__tests__/ces-http-record-backend.test.ts +0 -137
- package/src/security/ces-http-record-backend.ts +0 -120
- package/src/skills/__tests__/workspace-skill-md-signature.test.ts +0 -60
- package/src/skills/workspace-skill-md-signature.ts +0 -50
- package/src/tools/acp/status.test.ts +0 -94
- package/src/util/ca-bundle.ts +0 -13
- package/src/workspace/git-porcelain.ts +0 -66
- package/src/workspace/migrations/154-repair-retired-codex-gpt-5-4-model-ids.ts +0 -258
- package/src/workspace/migrations/155-move-front-model-config-to-voice.ts +0 -78
- package/src/workspace/migrations/156-extract-workspace-mcp-json.ts +0 -214
- package/src/workspace/migrations/__tests__/155-move-front-model-config-to-voice.test.ts +0 -102
- package/src/workspace/migrations/__tests__/156-extract-workspace-mcp-json.test.ts +0 -199
- /package/src/{calls → live-voice}/progress-phrases.ts +0 -0
|
@@ -8,16 +8,9 @@
|
|
|
8
8
|
|
|
9
9
|
import { describe, expect, mock, test } from "bun:test";
|
|
10
10
|
|
|
11
|
-
import type {
|
|
12
|
-
AuthMethod,
|
|
13
|
-
InitializeResponse,
|
|
14
|
-
SessionConfigOption,
|
|
15
|
-
} from "@agentclientprotocol/sdk";
|
|
16
|
-
import * as acp from "@agentclientprotocol/sdk";
|
|
11
|
+
import type { AuthMethod, InitializeResponse } from "@agentclientprotocol/sdk";
|
|
17
12
|
|
|
18
13
|
import { AcpAgentProcess } from "../agent-process.js";
|
|
19
|
-
import { AcpConfigOptionRefusedError } from "../types.js";
|
|
20
|
-
import { modelOption } from "./helpers/acp-model-option.js";
|
|
21
14
|
|
|
22
15
|
function makeProcess(): AcpAgentProcess {
|
|
23
16
|
return new AcpAgentProcess(
|
|
@@ -167,139 +160,6 @@ describe("AcpAgentProcess loadSession/resumeSession", () => {
|
|
|
167
160
|
});
|
|
168
161
|
});
|
|
169
162
|
|
|
170
|
-
describe("AcpAgentProcess config options", () => {
|
|
171
|
-
/** Injects a connection whose session calls report `configOptions`. */
|
|
172
|
-
function stubSessionResponses(
|
|
173
|
-
proc: AcpAgentProcess,
|
|
174
|
-
configOptions: SessionConfigOption[] | null | undefined,
|
|
175
|
-
): void {
|
|
176
|
-
(proc as unknown as { connection: unknown }).connection = {
|
|
177
|
-
newSession: () =>
|
|
178
|
-
Promise.resolve({ sessionId: "session-1", configOptions }),
|
|
179
|
-
loadSession: () => Promise.resolve({ configOptions }),
|
|
180
|
-
resumeSession: () => Promise.resolve({ configOptions }),
|
|
181
|
-
};
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
test("createSession returns the reported options", async () => {
|
|
185
|
-
const proc = makeProcess();
|
|
186
|
-
const options = [modelOption("sonnet")];
|
|
187
|
-
stubSessionResponses(proc, options);
|
|
188
|
-
|
|
189
|
-
await expect(proc.createSession("/tmp/project")).resolves.toEqual({
|
|
190
|
-
sessionId: "session-1",
|
|
191
|
-
configOptions: options,
|
|
192
|
-
});
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
test("loadSession returns the reported options", async () => {
|
|
196
|
-
const proc = makeProcess();
|
|
197
|
-
const options = [modelOption("sonnet")];
|
|
198
|
-
stubSessionResponses(proc, options);
|
|
199
|
-
|
|
200
|
-
await expect(
|
|
201
|
-
proc.loadSession("session-1", "/tmp/project"),
|
|
202
|
-
).resolves.toEqual({ configOptions: options });
|
|
203
|
-
});
|
|
204
|
-
|
|
205
|
-
test("resumeSession returns the reported options", async () => {
|
|
206
|
-
const proc = makeProcess();
|
|
207
|
-
const options = [modelOption("opus")];
|
|
208
|
-
stubSessionResponses(proc, options);
|
|
209
|
-
|
|
210
|
-
await expect(
|
|
211
|
-
proc.resumeSession("session-1", "/tmp/project"),
|
|
212
|
-
).resolves.toEqual({ configOptions: options });
|
|
213
|
-
});
|
|
214
|
-
|
|
215
|
-
test("a null or absent configOptions normalizes to an empty array", async () => {
|
|
216
|
-
const created = makeProcess();
|
|
217
|
-
stubSessionResponses(created, null);
|
|
218
|
-
await expect(created.createSession("/tmp/project")).resolves.toEqual({
|
|
219
|
-
sessionId: "session-1",
|
|
220
|
-
configOptions: [],
|
|
221
|
-
});
|
|
222
|
-
|
|
223
|
-
const loaded = makeProcess();
|
|
224
|
-
stubSessionResponses(loaded, null);
|
|
225
|
-
await expect(
|
|
226
|
-
loaded.loadSession("session-1", "/tmp/project"),
|
|
227
|
-
).resolves.toEqual({ configOptions: [] });
|
|
228
|
-
|
|
229
|
-
const resumed = makeProcess();
|
|
230
|
-
stubSessionResponses(resumed, undefined);
|
|
231
|
-
await expect(
|
|
232
|
-
resumed.resumeSession("session-1", "/tmp/project"),
|
|
233
|
-
).resolves.toEqual({ configOptions: [] });
|
|
234
|
-
});
|
|
235
|
-
|
|
236
|
-
test("setConfigOption forwards the value and returns the refreshed set", async () => {
|
|
237
|
-
const proc = makeProcess();
|
|
238
|
-
const calls: unknown[] = [];
|
|
239
|
-
const refreshed = [modelOption("opus")];
|
|
240
|
-
(proc as unknown as { connection: unknown }).connection = {
|
|
241
|
-
setSessionConfigOption: (params: unknown) => {
|
|
242
|
-
calls.push(params);
|
|
243
|
-
return Promise.resolve({ configOptions: refreshed });
|
|
244
|
-
},
|
|
245
|
-
};
|
|
246
|
-
|
|
247
|
-
await expect(
|
|
248
|
-
proc.setConfigOption("session-1", "model", "opus"),
|
|
249
|
-
).resolves.toEqual(refreshed);
|
|
250
|
-
|
|
251
|
-
expect(calls).toEqual([
|
|
252
|
-
{ sessionId: "session-1", configId: "model", value: "opus" },
|
|
253
|
-
]);
|
|
254
|
-
});
|
|
255
|
-
|
|
256
|
-
test("setConfigOption sends the boolean request variant", async () => {
|
|
257
|
-
const proc = makeProcess();
|
|
258
|
-
const calls: unknown[] = [];
|
|
259
|
-
const refreshed = [modelOption("opus")];
|
|
260
|
-
(proc as unknown as { connection: unknown }).connection = {
|
|
261
|
-
setSessionConfigOption: (params: unknown) => {
|
|
262
|
-
calls.push(params);
|
|
263
|
-
return Promise.resolve({ configOptions: refreshed });
|
|
264
|
-
},
|
|
265
|
-
};
|
|
266
|
-
|
|
267
|
-
await proc.setConfigOption("session-1", "thinking", true);
|
|
268
|
-
|
|
269
|
-
expect(calls).toEqual([
|
|
270
|
-
{
|
|
271
|
-
sessionId: "session-1",
|
|
272
|
-
configId: "thinking",
|
|
273
|
-
type: "boolean",
|
|
274
|
-
value: true,
|
|
275
|
-
},
|
|
276
|
-
]);
|
|
277
|
-
});
|
|
278
|
-
|
|
279
|
-
test("setConfigOption omits the discriminator for string values", async () => {
|
|
280
|
-
const proc = makeProcess();
|
|
281
|
-
const calls: unknown[] = [];
|
|
282
|
-
(proc as unknown as { connection: unknown }).connection = {
|
|
283
|
-
setSessionConfigOption: (params: unknown) => {
|
|
284
|
-
calls.push(params);
|
|
285
|
-
return Promise.resolve({ configOptions: [modelOption("opus")] });
|
|
286
|
-
},
|
|
287
|
-
};
|
|
288
|
-
|
|
289
|
-
await proc.setConfigOption("session-1", "model", "opus");
|
|
290
|
-
|
|
291
|
-
expect(calls[0]).not.toHaveProperty("type");
|
|
292
|
-
});
|
|
293
|
-
|
|
294
|
-
test("setConfigOption throws when the process is not spawned", async () => {
|
|
295
|
-
const proc = makeProcess();
|
|
296
|
-
|
|
297
|
-
await expect(
|
|
298
|
-
proc.setConfigOption("session-1", "model", "opus"),
|
|
299
|
-
).rejects.toThrow('ACP agent "test-agent" is not spawned');
|
|
300
|
-
});
|
|
301
|
-
});
|
|
302
|
-
|
|
303
163
|
describe("AcpAgentProcess auth_required retry", () => {
|
|
304
164
|
// spawnedEnv is injected the way spawn() builds it ({ ...process.env,
|
|
305
165
|
// ...config.env }), so the advertised var names use a VELLUM_TEST_ prefix
|
|
@@ -336,19 +196,17 @@ describe("AcpAgentProcess auth_required retry", () => {
|
|
|
336
196
|
* initialize() so the advertised authMethods are captured.
|
|
337
197
|
*/
|
|
338
198
|
async function setupAuthProcess(options: {
|
|
339
|
-
command?: string;
|
|
340
199
|
env?: Record<string, string>;
|
|
341
200
|
authMethods?: AuthMethod[];
|
|
342
201
|
/** Rejections to throw from successive newSession calls before succeeding. */
|
|
343
202
|
newSessionRejections?: unknown[];
|
|
344
203
|
loadSessionRejections?: unknown[];
|
|
345
204
|
resumeSessionRejections?: unknown[];
|
|
346
|
-
setConfigOptionRejections?: unknown[];
|
|
347
205
|
promptRejections?: unknown[];
|
|
348
206
|
}) {
|
|
349
207
|
const proc = new AcpAgentProcess(
|
|
350
208
|
"codex",
|
|
351
|
-
{ command:
|
|
209
|
+
{ command: "echo", args: [], env: options.env },
|
|
352
210
|
() => {
|
|
353
211
|
throw new Error("client factory should not be called in this test");
|
|
354
212
|
},
|
|
@@ -376,10 +234,6 @@ describe("AcpAgentProcess auth_required retry", () => {
|
|
|
376
234
|
options.resumeSessionRejections ?? [],
|
|
377
235
|
{},
|
|
378
236
|
);
|
|
379
|
-
const setSessionConfigOption = failThenSucceed(
|
|
380
|
-
options.setConfigOptionRejections ?? [],
|
|
381
|
-
{ configOptions: [] },
|
|
382
|
-
);
|
|
383
237
|
const prompt = failThenSucceed(options.promptRejections ?? [], {
|
|
384
238
|
stopReason: "end_turn",
|
|
385
239
|
});
|
|
@@ -398,7 +252,6 @@ describe("AcpAgentProcess auth_required retry", () => {
|
|
|
398
252
|
newSession,
|
|
399
253
|
loadSession,
|
|
400
254
|
resumeSession,
|
|
401
|
-
setSessionConfigOption,
|
|
402
255
|
prompt,
|
|
403
256
|
authenticate,
|
|
404
257
|
};
|
|
@@ -411,112 +264,18 @@ describe("AcpAgentProcess auth_required retry", () => {
|
|
|
411
264
|
newSession,
|
|
412
265
|
loadSession,
|
|
413
266
|
resumeSession,
|
|
414
|
-
setSessionConfigOption,
|
|
415
267
|
prompt,
|
|
416
268
|
authenticate,
|
|
417
269
|
internals,
|
|
418
270
|
};
|
|
419
271
|
}
|
|
420
272
|
|
|
421
|
-
// An adapter that throws a plain Error reaches the client as a generic
|
|
422
|
-
// "Internal error" carrying the real sentence in `data.details`, which is
|
|
423
|
-
// the shape these fixtures reproduce.
|
|
424
|
-
test("setConfigOption surfaces the adapter's error answer as a refusal", async () => {
|
|
425
|
-
const { proc } = await setupAuthProcess({
|
|
426
|
-
setConfigOptionRejections: [
|
|
427
|
-
new acp.RequestError(-32603, "Internal error", {
|
|
428
|
-
details: "Invalid value for config option model: nope",
|
|
429
|
-
}),
|
|
430
|
-
],
|
|
431
|
-
});
|
|
432
|
-
|
|
433
|
-
const refusal = await proc
|
|
434
|
-
.setConfigOption("session-1", "model", "nope")
|
|
435
|
-
.catch((err: unknown) => err);
|
|
436
|
-
|
|
437
|
-
expect(refusal).toBeInstanceOf(AcpConfigOptionRefusedError);
|
|
438
|
-
// The adapter's sentence, not the message the SDK framed it in.
|
|
439
|
-
expect((refusal as Error).message).toBe(
|
|
440
|
-
"Invalid value for config option model: nope",
|
|
441
|
-
);
|
|
442
|
-
});
|
|
443
|
-
|
|
444
|
-
test("setConfigOption serializes a payload that names no reason", async () => {
|
|
445
|
-
const { proc } = await setupAuthProcess({
|
|
446
|
-
setConfigOptionRejections: [
|
|
447
|
-
new acp.RequestError(-32603, "Internal error", { code: 7 }),
|
|
448
|
-
],
|
|
449
|
-
});
|
|
450
|
-
|
|
451
|
-
await expect(
|
|
452
|
-
proc.setConfigOption("session-1", "model", "nope"),
|
|
453
|
-
).rejects.toThrow('{"code":7}');
|
|
454
|
-
});
|
|
455
|
-
|
|
456
|
-
test("setConfigOption falls back to the message when there is no payload", async () => {
|
|
457
|
-
const { proc } = await setupAuthProcess({
|
|
458
|
-
setConfigOptionRejections: [
|
|
459
|
-
new acp.RequestError(-32603, "Session not found"),
|
|
460
|
-
],
|
|
461
|
-
});
|
|
462
|
-
|
|
463
|
-
await expect(
|
|
464
|
-
proc.setConfigOption("session-1", "model", "nope"),
|
|
465
|
-
).rejects.toThrow("Session not found");
|
|
466
|
-
});
|
|
467
|
-
|
|
468
|
-
test.each(["claude-agent-acp", "/usr/local/bin/claude-agent-acp"])(
|
|
469
|
-
"setConfigOption leaves Claude's message-shaped auth failure untyped (%s)",
|
|
470
|
-
async (command) => {
|
|
471
|
-
const expired = new acp.RequestError(-32603, "Internal error", {
|
|
472
|
-
details: "Not logged in",
|
|
473
|
-
});
|
|
474
|
-
const { proc } = await setupAuthProcess({
|
|
475
|
-
command,
|
|
476
|
-
setConfigOptionRejections: [expired],
|
|
477
|
-
});
|
|
478
|
-
|
|
479
|
-
await expect(
|
|
480
|
-
proc.setConfigOption("session-1", "model", "opus"),
|
|
481
|
-
).rejects.toBe(expired);
|
|
482
|
-
},
|
|
483
|
-
);
|
|
484
|
-
|
|
485
|
-
test("setConfigOption reads Claude's login wording from another adapter as a refusal", async () => {
|
|
486
|
-
const { proc } = await setupAuthProcess({
|
|
487
|
-
command: "codex-acp",
|
|
488
|
-
setConfigOptionRejections: [
|
|
489
|
-
new acp.RequestError(-32603, "Internal error", {
|
|
490
|
-
details: "Not logged in",
|
|
491
|
-
}),
|
|
492
|
-
],
|
|
493
|
-
});
|
|
494
|
-
|
|
495
|
-
const refusal = await proc
|
|
496
|
-
.setConfigOption("session-1", "model", "gpt-5")
|
|
497
|
-
.catch((err: unknown) => err);
|
|
498
|
-
|
|
499
|
-
expect(refusal).toBeInstanceOf(AcpConfigOptionRefusedError);
|
|
500
|
-
expect((refusal as Error).message).toBe("Not logged in");
|
|
501
|
-
});
|
|
502
|
-
|
|
503
|
-
test("setConfigOption leaves a transport failure untyped", async () => {
|
|
504
|
-
const closed = new Error("ACP connection closed");
|
|
505
|
-
const { proc } = await setupAuthProcess({
|
|
506
|
-
setConfigOptionRejections: [closed],
|
|
507
|
-
});
|
|
508
|
-
|
|
509
|
-
await expect(
|
|
510
|
-
proc.setConfigOption("session-1", "model", "opus"),
|
|
511
|
-
).rejects.toBe(closed);
|
|
512
|
-
});
|
|
513
|
-
|
|
514
273
|
test("createSession does not authenticate when newSession succeeds", async () => {
|
|
515
274
|
const { proc, newSession, authenticate } = await setupAuthProcess({
|
|
516
275
|
env: { [OPENAI_VAR]: "sk-test" },
|
|
517
276
|
});
|
|
518
277
|
|
|
519
|
-
const
|
|
278
|
+
const sessionId = await proc.createSession("/tmp/project");
|
|
520
279
|
|
|
521
280
|
expect(sessionId).toBe("session-1");
|
|
522
281
|
expect(newSession).toHaveBeenCalledTimes(1);
|
|
@@ -529,7 +288,7 @@ describe("AcpAgentProcess auth_required retry", () => {
|
|
|
529
288
|
newSessionRejections: [authRequiredError],
|
|
530
289
|
});
|
|
531
290
|
|
|
532
|
-
const
|
|
291
|
+
const sessionId = await proc.createSession("/tmp/project");
|
|
533
292
|
|
|
534
293
|
expect(sessionId).toBe("session-1");
|
|
535
294
|
expect(authenticate).toHaveBeenCalledTimes(1);
|
|
@@ -628,19 +387,6 @@ describe("AcpAgentProcess auth_required retry", () => {
|
|
|
628
387
|
expect(resumeSession).toHaveBeenCalledTimes(2);
|
|
629
388
|
});
|
|
630
389
|
|
|
631
|
-
test("setConfigOption authenticates and retries on auth_required", async () => {
|
|
632
|
-
const { proc, setSessionConfigOption, authenticate } =
|
|
633
|
-
await setupAuthProcess({
|
|
634
|
-
env: { [OPENAI_VAR]: "sk-test" },
|
|
635
|
-
setConfigOptionRejections: [authRequiredError],
|
|
636
|
-
});
|
|
637
|
-
|
|
638
|
-
await proc.setConfigOption("session-1", "model", "opus");
|
|
639
|
-
|
|
640
|
-
expect(authenticate).toHaveBeenCalledWith({ methodId: "openai-api-key" });
|
|
641
|
-
expect(setSessionConfigOption).toHaveBeenCalledTimes(2);
|
|
642
|
-
});
|
|
643
|
-
|
|
644
390
|
test("prompt authenticates and retries on auth_required, returning the response", async () => {
|
|
645
391
|
const { proc, prompt, authenticate } = await setupAuthProcess({
|
|
646
392
|
env: { [OPENAI_VAR]: "sk-test" },
|
|
@@ -6,8 +6,6 @@
|
|
|
6
6
|
|
|
7
7
|
import { describe, expect, test } from "bun:test";
|
|
8
8
|
|
|
9
|
-
import { RequestError } from "@agentclientprotocol/sdk";
|
|
10
|
-
|
|
11
9
|
import { AcpAuthRequiredEventSchema } from "../../api/events/acp-auth-required.js";
|
|
12
10
|
import { AcpSessionErrorEventSchema } from "../../api/events/acp-session-error.js";
|
|
13
11
|
import {
|
|
@@ -17,7 +15,6 @@ import {
|
|
|
17
15
|
CLAUDE_ACP_COMMAND,
|
|
18
16
|
isAcpAuthRequired,
|
|
19
17
|
isClaudeAuthFailureMessage,
|
|
20
|
-
requestErrorReason,
|
|
21
18
|
} from "../auth-required.js";
|
|
22
19
|
|
|
23
20
|
describe("isAcpAuthRequired", () => {
|
|
@@ -92,99 +89,6 @@ describe("isClaudeAuthFailureMessage", () => {
|
|
|
92
89
|
});
|
|
93
90
|
});
|
|
94
91
|
|
|
95
|
-
describe("requestErrorReason", () => {
|
|
96
|
-
test("decodes the sentence the SDK moved into the payload", () => {
|
|
97
|
-
const rejection = new RequestError(-32603, "Internal error", {
|
|
98
|
-
details: "Failed to authenticate. Please run /login",
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
expect(requestErrorReason(rejection)).toBe(
|
|
102
|
-
"Failed to authenticate. Please run /login",
|
|
103
|
-
);
|
|
104
|
-
// The point of decoding: the generic message never matches.
|
|
105
|
-
expect(isClaudeAuthFailureMessage(rejection.message)).toBe(false);
|
|
106
|
-
expect(isClaudeAuthFailureMessage(requestErrorReason(rejection))).toBe(
|
|
107
|
-
true,
|
|
108
|
-
);
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
test("reads the message off a rejection that carries no payload", () => {
|
|
112
|
-
// Straight off the wire: a plain object, not an instance of any class we
|
|
113
|
-
// control, and with the auth text where the SDK leaves a framed one.
|
|
114
|
-
const rejection = {
|
|
115
|
-
code: -32603,
|
|
116
|
-
message: "Failed to authenticate. Please run /login",
|
|
117
|
-
};
|
|
118
|
-
|
|
119
|
-
expect(requestErrorReason(rejection)).toBe(
|
|
120
|
-
"Failed to authenticate. Please run /login",
|
|
121
|
-
);
|
|
122
|
-
expect(isClaudeAuthFailureMessage(requestErrorReason(rejection))).toBe(
|
|
123
|
-
true,
|
|
124
|
-
);
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
test("keeps the rejection's own message when the payload names no reason", () => {
|
|
128
|
-
expect(requestErrorReason(new RequestError(-32603, "boom", { c: 7 }))).toBe(
|
|
129
|
-
"boom",
|
|
130
|
-
);
|
|
131
|
-
expect(
|
|
132
|
-
requestErrorReason(
|
|
133
|
-
RequestError.methodNotFound("session/set_config_option"),
|
|
134
|
-
),
|
|
135
|
-
).toBe('"Method not found": session/set_config_option');
|
|
136
|
-
expect(requestErrorReason(new Error("Not logged in"))).toBe(
|
|
137
|
-
"Not logged in",
|
|
138
|
-
);
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
test("keeps a specific rejection message ahead of supplemental details", () => {
|
|
142
|
-
expect(
|
|
143
|
-
requestErrorReason(
|
|
144
|
-
new RequestError(-32603, "Model unavailable", {
|
|
145
|
-
details: "The selected deployment is temporarily unavailable",
|
|
146
|
-
}),
|
|
147
|
-
),
|
|
148
|
-
).toBe("Model unavailable");
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
test("serializes the payload behind a bare Internal error that names no reason", () => {
|
|
152
|
-
expect(
|
|
153
|
-
requestErrorReason(new RequestError(-32603, "Internal error", { c: 7 })),
|
|
154
|
-
).toBe('{"c":7}');
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
test("serializes the payload behind a generic Invalid params", () => {
|
|
158
|
-
// How the agent-side SDK answers a request its schema rejects.
|
|
159
|
-
expect(
|
|
160
|
-
requestErrorReason(
|
|
161
|
-
RequestError.invalidParams({ _errors: ["model: Invalid option"] }),
|
|
162
|
-
),
|
|
163
|
-
).toBe('{"_errors":["model: Invalid option"]}');
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
test("decodes claude-agent-acp's prompt-time 401 from its message", () => {
|
|
167
|
-
// RequestError.internalError({ errorKind }, cliText) as the adapter raises
|
|
168
|
-
// it: the CLI's text rides the message and the payload only names a kind.
|
|
169
|
-
const rejection = new RequestError(
|
|
170
|
-
-32603,
|
|
171
|
-
"Internal error: Failed to authenticate. API Error: 401 OAuth access token has expired.",
|
|
172
|
-
{ errorKind: "authentication_failed" },
|
|
173
|
-
);
|
|
174
|
-
|
|
175
|
-
expect(requestErrorReason(rejection)).toBe(rejection.message);
|
|
176
|
-
expect(isClaudeAuthFailureMessage(requestErrorReason(rejection))).toBe(
|
|
177
|
-
true,
|
|
178
|
-
);
|
|
179
|
-
});
|
|
180
|
-
|
|
181
|
-
test("stringifies a rejection that is not an object at all", () => {
|
|
182
|
-
expect(requestErrorReason("plain string")).toBe("plain string");
|
|
183
|
-
expect(requestErrorReason(-32603)).toBe("-32603");
|
|
184
|
-
expect(requestErrorReason(null)).toBe("null");
|
|
185
|
-
});
|
|
186
|
-
});
|
|
187
|
-
|
|
188
92
|
describe("AcpAuthRequiredError", () => {
|
|
189
93
|
test("is an Error that carries the agent id and its message", () => {
|
|
190
94
|
const err = new AcpAuthRequiredError("claude", "needs a reconnect");
|
|
@@ -1,13 +1,9 @@
|
|
|
1
1
|
import { describe, expect, test } from "bun:test";
|
|
2
2
|
|
|
3
|
-
import type {
|
|
4
|
-
SessionConfigOption,
|
|
5
|
-
SessionNotification,
|
|
6
|
-
} from "@agentclientprotocol/sdk";
|
|
3
|
+
import type { SessionNotification } from "@agentclientprotocol/sdk";
|
|
7
4
|
|
|
8
5
|
import type { AssistantEvent } from "../../api/index.js";
|
|
9
6
|
import { VellumAcpClientHandler } from "../client-handler.js";
|
|
10
|
-
import { modelOption } from "./helpers/acp-model-option.js";
|
|
11
7
|
|
|
12
8
|
const ACP_SESSION_ID = "acp-session-abc";
|
|
13
9
|
const PARENT_CONVERSATION_ID = "conv-xyz";
|
|
@@ -15,21 +11,16 @@ const PARENT_CONVERSATION_ID = "conv-xyz";
|
|
|
15
11
|
function makeHandler(): {
|
|
16
12
|
handler: VellumAcpClientHandler;
|
|
17
13
|
sent: AssistantEvent[];
|
|
18
|
-
configOptionUpdates: SessionConfigOption[][];
|
|
19
14
|
} {
|
|
20
15
|
const sent: AssistantEvent[] = [];
|
|
21
|
-
const configOptionUpdates: SessionConfigOption[][] = [];
|
|
22
16
|
const handler = new VellumAcpClientHandler(
|
|
23
17
|
ACP_SESSION_ID,
|
|
24
18
|
(msg) => {
|
|
25
19
|
sent.push(msg);
|
|
26
20
|
},
|
|
27
21
|
PARENT_CONVERSATION_ID,
|
|
28
|
-
(configOptions) => {
|
|
29
|
-
configOptionUpdates.push(configOptions);
|
|
30
|
-
},
|
|
31
22
|
);
|
|
32
|
-
return { handler, sent
|
|
23
|
+
return { handler, sent };
|
|
33
24
|
}
|
|
34
25
|
|
|
35
26
|
describe("VellumAcpClientHandler.sessionUpdate", () => {
|
|
@@ -791,82 +782,3 @@ describe("VellumAcpClientHandler seq + enriched fields", () => {
|
|
|
791
782
|
expect(msg.toolTitle).toContain("<redacted");
|
|
792
783
|
});
|
|
793
784
|
});
|
|
794
|
-
|
|
795
|
-
describe("VellumAcpClientHandler config_option_update", () => {
|
|
796
|
-
const MODEL_OPTION = modelOption("sonnet");
|
|
797
|
-
|
|
798
|
-
const THOUGHT_OPTION: SessionConfigOption = {
|
|
799
|
-
type: "boolean",
|
|
800
|
-
id: "thinking",
|
|
801
|
-
name: "Extended thinking",
|
|
802
|
-
currentValue: true,
|
|
803
|
-
};
|
|
804
|
-
|
|
805
|
-
function configOptionUpdate(
|
|
806
|
-
configOptions: SessionConfigOption[],
|
|
807
|
-
): SessionNotification {
|
|
808
|
-
return {
|
|
809
|
-
sessionId: ACP_SESSION_ID,
|
|
810
|
-
update: { sessionUpdate: "config_option_update", configOptions },
|
|
811
|
-
};
|
|
812
|
-
}
|
|
813
|
-
|
|
814
|
-
test("invokes the callback with the full option array", async () => {
|
|
815
|
-
const { handler, sent, configOptionUpdates } = makeHandler();
|
|
816
|
-
|
|
817
|
-
await handler.sessionUpdate(
|
|
818
|
-
configOptionUpdate([MODEL_OPTION, THOUGHT_OPTION]),
|
|
819
|
-
);
|
|
820
|
-
|
|
821
|
-
expect(configOptionUpdates).toEqual([[MODEL_OPTION, THOUGHT_OPTION]]);
|
|
822
|
-
expect(sent).toHaveLength(0);
|
|
823
|
-
});
|
|
824
|
-
|
|
825
|
-
test("callback fires during replay suppression", async () => {
|
|
826
|
-
const { handler, sent, configOptionUpdates } = makeHandler();
|
|
827
|
-
|
|
828
|
-
handler.beginReplaySuppression();
|
|
829
|
-
await handler.sessionUpdate(configOptionUpdate([MODEL_OPTION]));
|
|
830
|
-
|
|
831
|
-
expect(configOptionUpdates).toEqual([[MODEL_OPTION]]);
|
|
832
|
-
expect(sent).toHaveLength(0);
|
|
833
|
-
});
|
|
834
|
-
|
|
835
|
-
test("a handler without the callback tolerates the update", async () => {
|
|
836
|
-
const sent: AssistantEvent[] = [];
|
|
837
|
-
const handler = new VellumAcpClientHandler(
|
|
838
|
-
ACP_SESSION_ID,
|
|
839
|
-
(msg) => {
|
|
840
|
-
sent.push(msg);
|
|
841
|
-
},
|
|
842
|
-
PARENT_CONVERSATION_ID,
|
|
843
|
-
);
|
|
844
|
-
|
|
845
|
-
await handler.sessionUpdate(configOptionUpdate([MODEL_OPTION]));
|
|
846
|
-
|
|
847
|
-
expect(sent).toHaveLength(0);
|
|
848
|
-
});
|
|
849
|
-
|
|
850
|
-
test("the remaining unhandled update types stay unforwarded", async () => {
|
|
851
|
-
const { handler, sent, configOptionUpdates } = makeHandler();
|
|
852
|
-
|
|
853
|
-
await handler.sessionUpdate({
|
|
854
|
-
sessionId: ACP_SESSION_ID,
|
|
855
|
-
update: {
|
|
856
|
-
sessionUpdate: "available_commands_update",
|
|
857
|
-
availableCommands: [{ name: "create_plan", description: "Plan work" }],
|
|
858
|
-
},
|
|
859
|
-
});
|
|
860
|
-
await handler.sessionUpdate({
|
|
861
|
-
sessionId: ACP_SESSION_ID,
|
|
862
|
-
update: { sessionUpdate: "current_mode_update", currentModeId: "ask" },
|
|
863
|
-
});
|
|
864
|
-
await handler.sessionUpdate({
|
|
865
|
-
sessionId: ACP_SESSION_ID,
|
|
866
|
-
update: { sessionUpdate: "session_info_update", title: "Refactor" },
|
|
867
|
-
});
|
|
868
|
-
|
|
869
|
-
expect(sent).toHaveLength(0);
|
|
870
|
-
expect(configOptionUpdates).toHaveLength(0);
|
|
871
|
-
});
|
|
872
|
-
});
|
|
@@ -66,11 +66,7 @@ function buildSessionWithFakeProcess(opts: {
|
|
|
66
66
|
kill: () => {},
|
|
67
67
|
spawn: () => {},
|
|
68
68
|
initialize: () => Promise.resolve(),
|
|
69
|
-
createSession: () =>
|
|
70
|
-
Promise.resolve({
|
|
71
|
-
sessionId: opts.protocolSessionId,
|
|
72
|
-
configOptions: [],
|
|
73
|
-
}),
|
|
69
|
+
createSession: () => Promise.resolve(opts.protocolSessionId),
|
|
74
70
|
cancel: () => Promise.resolve(),
|
|
75
71
|
markStderr: () => 0,
|
|
76
72
|
stderrSince: () => "",
|