@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
package/src/acp/resolve-agent.ts
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Shared resolver for ACP agent ids → agent config + binary preflight.
|
|
3
3
|
*
|
|
4
|
-
* `resolveAcpAgent(id)`
|
|
5
|
-
* bundled `DEFAULT_ACP_AGENT_PROFILES` so common agents like
|
|
6
|
-
* `codex` Just Work with no per-user config required
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
4
|
+
* `resolveAcpAgent(id)` merges user-provided `config.acp.agents[id]` (wins on
|
|
5
|
+
* overlap) with the bundled `DEFAULT_ACP_AGENT_PROFILES` so common agents like
|
|
6
|
+
* `claude` and `codex` Just Work with no per-user config required. Natural
|
|
7
|
+
* names ("claude code", "OpenAI Codex") resolve via `AGENT_ID_ALIASES` when the
|
|
8
|
+
* raw id misses both maps. The result is a discriminated union covering every
|
|
9
|
+
* reason a spawn might fail before we even start the agent process: unknown
|
|
10
|
+
* agent id, or binary missing from PATH. Callers (acp_spawn, acp_list_agents,
|
|
11
|
+
* and the `/v1/acp/spawn` HTTP route) get a single source of truth and
|
|
12
|
+
* matching actionable hints.
|
|
13
13
|
*
|
|
14
14
|
* The resolver NEVER fetches or runs packages in the (untrusted) task cwd.
|
|
15
15
|
* When the adapter binary is missing, resolution simply fails with
|
|
@@ -25,16 +25,12 @@
|
|
|
25
25
|
* `available` / `setupHint` derived from the same binary resolution.
|
|
26
26
|
*/
|
|
27
27
|
|
|
28
|
-
import { basename } from "node:path";
|
|
29
|
-
|
|
30
28
|
import {
|
|
31
|
-
type AcpAgentProfile,
|
|
32
29
|
DEFAULT_ACP_AGENT_PROFILES,
|
|
33
30
|
DEFAULT_AGENT_NPM_PACKAGES,
|
|
34
31
|
} from "../config/acp-defaults.js";
|
|
35
|
-
import type { AcpAgentConfig
|
|
32
|
+
import type { AcpAgentConfig } from "../config/acp-schema.js";
|
|
36
33
|
import { getConfig } from "../config/loader.js";
|
|
37
|
-
import type { AcpAgentConfig } from "./types.js";
|
|
38
34
|
|
|
39
35
|
/**
|
|
40
36
|
* Whether this agent's entry came from user config (wins over default) or
|
|
@@ -138,19 +134,6 @@ const AGENT_ID_ALIASES: Record<string, string> = {
|
|
|
138
134
|
openaicodex: "codex",
|
|
139
135
|
};
|
|
140
136
|
|
|
141
|
-
/**
|
|
142
|
-
* Ids that read back as inherited `Object.prototype` members instead of
|
|
143
|
-
* configured agents. `directLookup` and `mergedAgentIds` refuse them so an id
|
|
144
|
-
* from a tool call or an HTTP body can resolve to nothing but a real entry:
|
|
145
|
-
* resolving one would report a configured agent that does not exist, and a
|
|
146
|
-
* spawn would then start a process for a config nobody wrote.
|
|
147
|
-
*/
|
|
148
|
-
const PROTOTYPE_SENSITIVE_AGENT_IDS: ReadonlySet<string> = new Set([
|
|
149
|
-
"__proto__",
|
|
150
|
-
"constructor",
|
|
151
|
-
"prototype",
|
|
152
|
-
]);
|
|
153
|
-
|
|
154
137
|
/**
|
|
155
138
|
* Normalize a raw agent id for alias matching: lowercase and strip spaces,
|
|
156
139
|
* underscores, and hyphens so "Claude Code", "claude-code", and
|
|
@@ -183,92 +166,45 @@ export function lookupAcpAgentConfig(id: string): AcpAgentConfig | undefined {
|
|
|
183
166
|
}
|
|
184
167
|
|
|
185
168
|
function lookupAgent(
|
|
186
|
-
userAgents: Record<string,
|
|
169
|
+
userAgents: Record<string, AcpAgentConfig>,
|
|
187
170
|
id: string,
|
|
188
|
-
): { agent: AcpAgentConfig; source: AcpAgentSource
|
|
171
|
+
): { agent: AcpAgentConfig; source: AcpAgentSource } | undefined {
|
|
189
172
|
const direct = directLookup(userAgents, id);
|
|
190
173
|
if (direct) {
|
|
191
|
-
return
|
|
174
|
+
return direct;
|
|
192
175
|
}
|
|
193
|
-
const
|
|
194
|
-
|
|
195
|
-
?
|
|
176
|
+
const canonicalId = AGENT_ID_ALIASES[normalizeAgentId(id)];
|
|
177
|
+
return canonicalId !== undefined
|
|
178
|
+
? directLookup(userAgents, canonicalId)
|
|
196
179
|
: undefined;
|
|
197
|
-
if (canonicalId === undefined) {
|
|
198
|
-
return undefined;
|
|
199
|
-
}
|
|
200
|
-
const aliased = directLookup(userAgents, canonicalId);
|
|
201
|
-
return aliased ? { ...aliased, id: canonicalId } : undefined;
|
|
202
180
|
}
|
|
203
181
|
|
|
204
182
|
function directLookup(
|
|
205
|
-
userAgents: Record<string,
|
|
183
|
+
userAgents: Record<string, AcpAgentConfig>,
|
|
206
184
|
id: string,
|
|
207
185
|
): { agent: AcpAgentConfig; source: AcpAgentSource } | undefined {
|
|
208
|
-
|
|
209
|
-
return undefined;
|
|
210
|
-
}
|
|
211
|
-
const userAgent = Object.hasOwn(userAgents, id) ? userAgents[id] : undefined;
|
|
212
|
-
const defaultAgent = Object.hasOwn(DEFAULT_ACP_AGENT_PROFILES, id)
|
|
213
|
-
? DEFAULT_ACP_AGENT_PROFILES[id]
|
|
214
|
-
: undefined;
|
|
186
|
+
const userAgent = userAgents[id];
|
|
215
187
|
if (userAgent) {
|
|
216
|
-
|
|
217
|
-
return agent ? { agent, source: "config" } : undefined;
|
|
188
|
+
return { agent: userAgent, source: "config" };
|
|
218
189
|
}
|
|
190
|
+
const defaultAgent = DEFAULT_ACP_AGENT_PROFILES[id];
|
|
219
191
|
if (defaultAgent) {
|
|
220
192
|
return { agent: defaultAgent, source: "default" };
|
|
221
193
|
}
|
|
222
194
|
return undefined;
|
|
223
195
|
}
|
|
224
196
|
|
|
225
|
-
/**
|
|
226
|
-
* Fill a user config entry from the bundled profile for the same id. An entry
|
|
227
|
-
* that runs the profile's adapter (it omits `command`, or names the same
|
|
228
|
-
* binary, by full path or not) inherits the leaves it leaves out: `command`
|
|
229
|
-
* itself, the description, and the `model` a session starts on. `args` is the
|
|
230
|
-
* exception, because the schema defaults it to `[]`: a parsed entry always
|
|
231
|
-
* carries its own, so the profile's never reaches it. An entry that points
|
|
232
|
-
* the id at a different adapter stands alone, like any user-only entry,
|
|
233
|
-
* so a config that reuses the `claude` id for something else never carries
|
|
234
|
-
* Claude's description or has Claude's `opus` sent to it. Zod omits absent
|
|
235
|
-
* optional keys, so an omission never spreads as an undefined override.
|
|
236
|
-
*
|
|
237
|
-
* `undefined` only for an entry with neither a command nor a profile to take
|
|
238
|
-
* one from, a shape the config schema rejects before it gets here.
|
|
239
|
-
*/
|
|
240
|
-
function mergeWithProfile(
|
|
241
|
-
userAgent: ConfiguredAcpAgent,
|
|
242
|
-
profile: AcpAgentProfile | undefined,
|
|
243
|
-
): AcpAgentConfig | undefined {
|
|
244
|
-
const command = userAgent.command;
|
|
245
|
-
if (!profile) {
|
|
246
|
-
return command === undefined ? undefined : { ...userAgent, command };
|
|
247
|
-
}
|
|
248
|
-
// A full path to the bundled binary is still the bundled adapter; the
|
|
249
|
-
// basename is the adapter's identity everywhere else in this module.
|
|
250
|
-
if (
|
|
251
|
-
command !== undefined &&
|
|
252
|
-
basename(command) !== basename(profile.command)
|
|
253
|
-
) {
|
|
254
|
-
return { ...userAgent, command };
|
|
255
|
-
}
|
|
256
|
-
return { ...profile, ...userAgent, command: command ?? profile.command };
|
|
257
|
-
}
|
|
258
|
-
|
|
259
197
|
/**
|
|
260
198
|
* Defaults first (declaration order), then user-only ids. Deduplicated so a
|
|
261
199
|
* user config that overrides a default doesn't list the id twice.
|
|
262
200
|
*/
|
|
263
|
-
function mergedAgentIds(
|
|
264
|
-
userAgents: Record<string, ConfiguredAcpAgent>,
|
|
265
|
-
): string[] {
|
|
201
|
+
function mergedAgentIds(userAgents: Record<string, AcpAgentConfig>): string[] {
|
|
266
202
|
return Array.from(
|
|
267
203
|
new Set([
|
|
268
204
|
...Object.keys(DEFAULT_ACP_AGENT_PROFILES),
|
|
269
205
|
...Object.keys(userAgents),
|
|
270
206
|
]),
|
|
271
|
-
)
|
|
207
|
+
);
|
|
272
208
|
}
|
|
273
209
|
|
|
274
210
|
/**
|
|
@@ -320,8 +256,7 @@ export function listAcpAgents(): {
|
|
|
320
256
|
const config = getConfig();
|
|
321
257
|
const userAgents = config.acp.agents;
|
|
322
258
|
const agents: AcpAgentEntry[] = mergedAgentIds(userAgents).map((id) => {
|
|
323
|
-
// Non-null: ids come from `mergedAgentIds
|
|
324
|
-
// command-less entry only for a bundled id, so the lookup always resolves.
|
|
259
|
+
// Non-null: ids come from `mergedAgentIds` so the lookup always resolves.
|
|
325
260
|
const { agent, source } = lookupAgent(userAgents, id)!;
|
|
326
261
|
// Same binary preflight as `resolveAcpAgent`: available iff the command
|
|
327
262
|
// is on PATH. A missing binary is auto-installed at spawn time, but the
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { afterEach, describe, expect, mock, test } from "bun:test";
|
|
2
2
|
|
|
3
|
-
import { RequestError } from "@agentclientprotocol/sdk";
|
|
4
|
-
|
|
5
3
|
import type { Conversation } from "../daemon/conversation.js";
|
|
6
4
|
import {
|
|
7
5
|
deleteConversation,
|
|
@@ -41,7 +39,6 @@ mock.module("./prepare-agent-env.js", () => ({
|
|
|
41
39
|
}));
|
|
42
40
|
|
|
43
41
|
import { createAbortReason } from "../util/abort-reasons.js";
|
|
44
|
-
import { modelOption } from "./__tests__/helpers/acp-model-option.js";
|
|
45
42
|
import { VellumAcpClientHandler } from "./client-handler.js";
|
|
46
43
|
import { AcpSessionManager } from "./session-manager.js";
|
|
47
44
|
|
|
@@ -93,10 +90,10 @@ function mockConversation(opts?: { enqueueQueued?: boolean }) {
|
|
|
93
90
|
}
|
|
94
91
|
|
|
95
92
|
/** Fake AcpAgentProcess covering only the calls firePromptInBackground makes. */
|
|
96
|
-
function fakeProcess(prompt: () => Promise<unknown
|
|
93
|
+
function fakeProcess(prompt: () => Promise<unknown>) {
|
|
97
94
|
return {
|
|
98
95
|
markStderr: () => 0,
|
|
99
|
-
stderrSince: () =>
|
|
96
|
+
stderrSince: () => "",
|
|
100
97
|
prompt,
|
|
101
98
|
kill: mock(() => {}),
|
|
102
99
|
};
|
|
@@ -368,8 +365,6 @@ describe("AcpSessionManager auth-required recovery surface", () => {
|
|
|
368
365
|
parentToolUseId?: string;
|
|
369
366
|
cancelled?: boolean;
|
|
370
367
|
credentialDigest?: string;
|
|
371
|
-
failure?: () => Promise<never>;
|
|
372
|
-
stderr?: string;
|
|
373
368
|
}) {
|
|
374
369
|
const manager = new AcpSessionManager(1);
|
|
375
370
|
const parentId = `parent-${opts.id}`;
|
|
@@ -381,7 +376,7 @@ describe("AcpSessionManager auth-required recovery surface", () => {
|
|
|
381
376
|
manager,
|
|
382
377
|
opts.id,
|
|
383
378
|
parentId,
|
|
384
|
-
fakeProcess(
|
|
379
|
+
fakeProcess(authFailure),
|
|
385
380
|
);
|
|
386
381
|
entry.command = opts.command;
|
|
387
382
|
(entry as { parentToolUseId?: string }).parentToolUseId =
|
|
@@ -517,62 +512,6 @@ describe("AcpSessionManager auth-required recovery surface", () => {
|
|
|
517
512
|
expect(r.persistedContent).toBeUndefined();
|
|
518
513
|
});
|
|
519
514
|
|
|
520
|
-
test("claude's prompt-time 401 raises the surface when stderr names another failure", async () => {
|
|
521
|
-
// claude-agent-acp raises it as RequestError.internalError({ errorKind },
|
|
522
|
-
// cliText), and stderr supplies the failure message, so the auth text
|
|
523
|
-
// survives only on the rejection's own message.
|
|
524
|
-
refusedDigests.length = 0;
|
|
525
|
-
const digest = claudeTokenDigest("sk-ant-oat-prompt-401");
|
|
526
|
-
const r = await driveAuthFailure({
|
|
527
|
-
id: "sess-auth-prompt-401",
|
|
528
|
-
command: "claude-agent-acp",
|
|
529
|
-
parentToolUseId: "tool-anchor-prompt-401",
|
|
530
|
-
credentialDigest: digest,
|
|
531
|
-
failure: () =>
|
|
532
|
-
Promise.reject(
|
|
533
|
-
new RequestError(
|
|
534
|
-
-32603,
|
|
535
|
-
"Internal error: Failed to authenticate. API Error: 401 OAuth access token has expired.",
|
|
536
|
-
{ errorKind: "authentication_failed" },
|
|
537
|
-
),
|
|
538
|
-
),
|
|
539
|
-
stderr: '{"error":{"message":"Something else happened"}}',
|
|
540
|
-
});
|
|
541
|
-
|
|
542
|
-
expect(r.authEvent).toMatchObject({
|
|
543
|
-
acpSessionId: "sess-auth-prompt-401",
|
|
544
|
-
authCode: "acp_claude_auth_required",
|
|
545
|
-
parentToolUseId: "tool-anchor-prompt-401",
|
|
546
|
-
});
|
|
547
|
-
expect(hasAcpConnectCardRaised(r.parentId)).toBe(true);
|
|
548
|
-
expect(refusedDigests).toContain(digest);
|
|
549
|
-
});
|
|
550
|
-
|
|
551
|
-
test("the rejection's own message is checked when its payload names a different reason", async () => {
|
|
552
|
-
refusedDigests.length = 0;
|
|
553
|
-
const digest = claudeTokenDigest("sk-ant-oat-own-message");
|
|
554
|
-
const r = await driveAuthFailure({
|
|
555
|
-
id: "sess-auth-own-message",
|
|
556
|
-
command: "claude-agent-acp",
|
|
557
|
-
parentToolUseId: "tool-anchor-own-message",
|
|
558
|
-
credentialDigest: digest,
|
|
559
|
-
failure: () =>
|
|
560
|
-
Promise.reject(
|
|
561
|
-
new RequestError(
|
|
562
|
-
-32603,
|
|
563
|
-
"Internal error: Failed to authenticate. API Error: 401",
|
|
564
|
-
{ details: "Request failed" },
|
|
565
|
-
),
|
|
566
|
-
),
|
|
567
|
-
stderr: '{"error":{"message":"Something else happened"}}',
|
|
568
|
-
});
|
|
569
|
-
|
|
570
|
-
expect(r.authEvent).toMatchObject({
|
|
571
|
-
authCode: "acp_claude_auth_required",
|
|
572
|
-
});
|
|
573
|
-
expect(refusedDigests).toContain(digest);
|
|
574
|
-
});
|
|
575
|
-
|
|
576
515
|
test("a non-claude adapter never raises the surface, even on an auth-shaped failure", async () => {
|
|
577
516
|
const r = await driveAuthFailure({
|
|
578
517
|
id: "sess-auth-codex",
|
|
@@ -777,136 +716,4 @@ describe("AcpSessionManager.spawn: a stopped turn leaves no agent running", () =
|
|
|
777
716
|
expect(proc.kill).toHaveBeenCalled();
|
|
778
717
|
expect(internals.sessions.size).toBe(0);
|
|
779
718
|
});
|
|
780
|
-
|
|
781
|
-
/**
|
|
782
|
-
* The model pin is an await of its own, and it sits after the setup
|
|
783
|
-
* recheck. A stop landing inside it gets the same treatment: no spawned
|
|
784
|
-
* event, no model event, no prompt, and no session left behind.
|
|
785
|
-
*/
|
|
786
|
-
test("a cancel during the model pin tears the process down and fires nothing", async () => {
|
|
787
|
-
const manager = new AcpSessionManager(1);
|
|
788
|
-
const controller = new AbortController();
|
|
789
|
-
const prompt = mock(() => Promise.resolve({}));
|
|
790
|
-
const setConfigOption = mock(async () => {
|
|
791
|
-
// The user stops the turn while the pin's round trip is open.
|
|
792
|
-
controller.abort(REASON);
|
|
793
|
-
return [modelOption("opus")];
|
|
794
|
-
});
|
|
795
|
-
const proc = {
|
|
796
|
-
...fakeProcess(prompt),
|
|
797
|
-
spawn: () => {},
|
|
798
|
-
initialize: async () => {},
|
|
799
|
-
createSession: async () => ({
|
|
800
|
-
sessionId: "proto-1",
|
|
801
|
-
configOptions: [modelOption("sonnet")],
|
|
802
|
-
}),
|
|
803
|
-
setConfigOption,
|
|
804
|
-
};
|
|
805
|
-
let injected: ReturnType<typeof injectSession> | undefined;
|
|
806
|
-
const internals = manager as unknown as {
|
|
807
|
-
registerSession: (opts: {
|
|
808
|
-
acpSessionId: string;
|
|
809
|
-
parentConversationId: string;
|
|
810
|
-
}) => unknown;
|
|
811
|
-
sessions: Map<string, unknown>;
|
|
812
|
-
};
|
|
813
|
-
internals.registerSession = (opts) => {
|
|
814
|
-
injected = injectSession(
|
|
815
|
-
manager,
|
|
816
|
-
opts.acpSessionId,
|
|
817
|
-
opts.parentConversationId,
|
|
818
|
-
proc as unknown as ReturnType<typeof fakeProcess>,
|
|
819
|
-
);
|
|
820
|
-
return injected;
|
|
821
|
-
};
|
|
822
|
-
|
|
823
|
-
await expect(
|
|
824
|
-
manager.spawn(
|
|
825
|
-
"claude",
|
|
826
|
-
{ command: "noop", args: [] } as never,
|
|
827
|
-
"do the task",
|
|
828
|
-
"/tmp",
|
|
829
|
-
"conv-1",
|
|
830
|
-
() => {},
|
|
831
|
-
{ model: "opus" },
|
|
832
|
-
{ signal: controller.signal },
|
|
833
|
-
),
|
|
834
|
-
).rejects.toThrow();
|
|
835
|
-
|
|
836
|
-
expect(setConfigOption).toHaveBeenCalled();
|
|
837
|
-
expect(injected?.sendToVellum).not.toHaveBeenCalled();
|
|
838
|
-
expect(prompt).not.toHaveBeenCalled();
|
|
839
|
-
expect(proc.kill).toHaveBeenCalled();
|
|
840
|
-
expect(internals.sessions.size).toBe(0);
|
|
841
|
-
});
|
|
842
|
-
|
|
843
|
-
/**
|
|
844
|
-
* A cancel that persists a resumable row frees the id, so a resume can
|
|
845
|
-
* register a fresh entry under it before the stopped spawn's pin settles.
|
|
846
|
-
* The teardown owes that spawn its own process, and owes the replacement
|
|
847
|
-
* its map slot.
|
|
848
|
-
*/
|
|
849
|
-
test("a cancel during the model pin leaves a replacement session for the same id alone", async () => {
|
|
850
|
-
const manager = new AcpSessionManager(2);
|
|
851
|
-
const controller = new AbortController();
|
|
852
|
-
const prompt = mock(() => Promise.resolve({}));
|
|
853
|
-
let replacement: ReturnType<typeof injectSession> | undefined;
|
|
854
|
-
let spawnedId: string | undefined;
|
|
855
|
-
const setConfigOption = mock(async () => {
|
|
856
|
-
// The turn is stopped and the id is resumed by another request while
|
|
857
|
-
// the pin's round trip is still open.
|
|
858
|
-
controller.abort(REASON);
|
|
859
|
-
replacement = injectSession(
|
|
860
|
-
manager,
|
|
861
|
-
spawnedId!,
|
|
862
|
-
"conv-2",
|
|
863
|
-
fakeProcess(mock(() => Promise.resolve({}))),
|
|
864
|
-
);
|
|
865
|
-
return [modelOption("opus")];
|
|
866
|
-
});
|
|
867
|
-
const proc = {
|
|
868
|
-
...fakeProcess(prompt),
|
|
869
|
-
spawn: () => {},
|
|
870
|
-
initialize: async () => {},
|
|
871
|
-
createSession: async () => ({
|
|
872
|
-
sessionId: "proto-1",
|
|
873
|
-
configOptions: [modelOption("sonnet")],
|
|
874
|
-
}),
|
|
875
|
-
setConfigOption,
|
|
876
|
-
};
|
|
877
|
-
const internals = manager as unknown as {
|
|
878
|
-
registerSession: (opts: {
|
|
879
|
-
acpSessionId: string;
|
|
880
|
-
parentConversationId: string;
|
|
881
|
-
}) => unknown;
|
|
882
|
-
sessions: Map<string, unknown>;
|
|
883
|
-
};
|
|
884
|
-
internals.registerSession = (opts) => {
|
|
885
|
-
spawnedId = opts.acpSessionId;
|
|
886
|
-
return injectSession(
|
|
887
|
-
manager,
|
|
888
|
-
opts.acpSessionId,
|
|
889
|
-
opts.parentConversationId,
|
|
890
|
-
proc as unknown as ReturnType<typeof fakeProcess>,
|
|
891
|
-
);
|
|
892
|
-
};
|
|
893
|
-
|
|
894
|
-
await expect(
|
|
895
|
-
manager.spawn(
|
|
896
|
-
"claude",
|
|
897
|
-
{ command: "noop", args: [] } as never,
|
|
898
|
-
"do the task",
|
|
899
|
-
"/tmp",
|
|
900
|
-
"conv-1",
|
|
901
|
-
() => {},
|
|
902
|
-
{ model: "opus" },
|
|
903
|
-
{ signal: controller.signal },
|
|
904
|
-
),
|
|
905
|
-
).rejects.toThrow();
|
|
906
|
-
|
|
907
|
-
expect(prompt).not.toHaveBeenCalled();
|
|
908
|
-
expect(proc.kill).toHaveBeenCalled();
|
|
909
|
-
expect(replacement?.process.kill).not.toHaveBeenCalled();
|
|
910
|
-
expect(internals.sessions.get(spawnedId!)).toBe(replacement);
|
|
911
|
-
});
|
|
912
719
|
});
|