@vellumai/assistant 0.12.1-dev.202609141913.5e16607 → 0.12.1-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/AGENTS.md +0 -4
- package/ARCHITECTURE.md +12 -11
- package/docs/architecture/turn-actor.md +8 -15
- package/docs/guardian-request-flow.md +0 -16
- package/openapi.yaml +49 -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 +2 -4
- package/src/__tests__/cu-unified-flow.test.ts +2 -8
- package/src/__tests__/document-sync-tags.test.ts +0 -25
- 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__/notification-vellum-adapter.test.ts +2 -85
- package/src/__tests__/outlook-messaging-provider.test.ts +6 -6
- package/src/__tests__/platform-callback-registration.test.ts +16 -8
- 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/events/notification-intent.ts +0 -2
- 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/bash.help.ts +13 -8
- package/src/cli/commands/bash.ts +25 -7
- 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 +9 -99
- 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/SKILL.md +3 -3
- 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/schedule/SKILL.md +4 -3
- 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 -24
- package/src/config/loader.ts +0 -1
- 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 +27 -11
- 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/services.ts +0 -8
- 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/orphan-reaper.ts +1 -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/home/__tests__/feed-writer.test.ts +0 -22
- package/src/home/feed-writer.ts +2 -11
- 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__/guardian-feed-projection.test.ts +2 -158
- package/src/notifications/__tests__/home-feed-side-effect.test.ts +3 -153
- package/src/notifications/__tests__/schedule-result-producer.test.ts +3 -99
- package/src/notifications/adapters/macos.ts +0 -3
- 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/guardian-feed-projection.ts +5 -125
- package/src/notifications/home-feed-side-effect.ts +7 -55
- package/src/notifications/schedule-result-producer.ts +22 -66
- package/src/oauth/__tests__/seed-providers-managed.test.ts +0 -54
- package/src/oauth/byo-connection.test.ts +0 -45
- package/src/oauth/byo-connection.ts +6 -36
- package/src/oauth/connection-resolver.test.ts +0 -73
- package/src/oauth/connection-resolver.ts +2 -95
- package/src/oauth/seed-providers.ts +0 -165
- 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 +2 -4
- 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/inference/auth.ts +3 -2
- package/src/providers/inference/connection-availability.ts +8 -27
- package/src/providers/inference/resolve-auth.ts +4 -22
- 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__/default-provider-routes.test.ts +2 -2
- 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/debug-bash-routes.ts +173 -0
- package/src/runtime/routes/diagnostics-routes.ts +3 -55
- package/src/runtime/routes/index.ts +2 -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 +20 -6
- 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__/service-account-token.test.ts +0 -247
- 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__/bash.test.ts +0 -53
- 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 -255
- 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 -201
- 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/inference/service-account-token.ts +0 -248
- 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/tools/terminal/__tests__/sanitized-bash.test.ts +0 -57
- package/src/tools/terminal/sanitized-bash.ts +0 -105
- 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
|
@@ -51,12 +51,7 @@ mock.module("../../../persistence/embeddings/embedding-backend.js", () => ({
|
|
|
51
51
|
}));
|
|
52
52
|
|
|
53
53
|
import { BACKUP_PROFILE_KEYS } from "../../../config/default-profile-names.js";
|
|
54
|
-
import {
|
|
55
|
-
getConfig,
|
|
56
|
-
loadConfig,
|
|
57
|
-
loadRawConfig,
|
|
58
|
-
} from "../../../config/loader.js";
|
|
59
|
-
import { AssistantConfigSchema } from "../../../config/schema.js";
|
|
54
|
+
import { getConfig, loadRawConfig } from "../../../config/loader.js";
|
|
60
55
|
import { LLMConfigBase } from "../../../config/schemas/llm.js";
|
|
61
56
|
import type { ConversationCreateType } from "../../../persistence/conversation-types.js";
|
|
62
57
|
import {
|
|
@@ -1945,105 +1940,3 @@ describe("ingress URL writes through the generic config routes", () => {
|
|
|
1945
1940
|
expect(ingress.lastTunnel).toEqual(LAST_TUNNEL);
|
|
1946
1941
|
});
|
|
1947
1942
|
});
|
|
1948
|
-
|
|
1949
|
-
describe("config writes to a per-agent acp entry", () => {
|
|
1950
|
-
const patchRoute = ROUTES.find((r) => r.operationId === "config_patch")!;
|
|
1951
|
-
const setRoute = ROUTES.find((r) => r.operationId === "config_set")!;
|
|
1952
|
-
|
|
1953
|
-
beforeEach(() => {
|
|
1954
|
-
rawConfigFixture = {
|
|
1955
|
-
acp: {
|
|
1956
|
-
agents: {
|
|
1957
|
-
claude: { command: "claude-agent-acp", args: [], model: "opus" },
|
|
1958
|
-
},
|
|
1959
|
-
},
|
|
1960
|
-
};
|
|
1961
|
-
seedRawConfig();
|
|
1962
|
-
});
|
|
1963
|
-
|
|
1964
|
-
function agentEntry(
|
|
1965
|
-
raw: Record<string, unknown>,
|
|
1966
|
-
id = "claude",
|
|
1967
|
-
): Record<string, unknown> {
|
|
1968
|
-
const acp = raw.acp as Record<string, unknown>;
|
|
1969
|
-
const agents = acp.agents as Record<string, Record<string, unknown>>;
|
|
1970
|
-
return agents[id]!;
|
|
1971
|
-
}
|
|
1972
|
-
|
|
1973
|
-
test("a nulled per-agent model is dropped on both write paths", async () => {
|
|
1974
|
-
await patchRoute.handler({
|
|
1975
|
-
body: { acp: { agents: { claude: { model: null } } } },
|
|
1976
|
-
});
|
|
1977
|
-
|
|
1978
|
-
const patched = agentEntry(loadRawConfig());
|
|
1979
|
-
expect("model" in patched).toBe(false);
|
|
1980
|
-
expect(patched.command).toBe("claude-agent-acp");
|
|
1981
|
-
expect(AssistantConfigSchema.safeParse(loadRawConfig()).success).toBe(true);
|
|
1982
|
-
|
|
1983
|
-
seedRawConfig();
|
|
1984
|
-
await setRoute.handler({
|
|
1985
|
-
body: { path: "acp.agents.claude.model", value: null },
|
|
1986
|
-
});
|
|
1987
|
-
|
|
1988
|
-
expect("model" in agentEntry(loadRawConfig())).toBe(false);
|
|
1989
|
-
expect(AssistantConfigSchema.safeParse(loadRawConfig()).success).toBe(true);
|
|
1990
|
-
expect(loadConfig().acp.agents.claude?.model).toBeUndefined();
|
|
1991
|
-
});
|
|
1992
|
-
|
|
1993
|
-
test("a nulled per-agent command is dropped on both write paths", async () => {
|
|
1994
|
-
await setRoute.handler({
|
|
1995
|
-
body: { path: "acp.agents.claude.command", value: null },
|
|
1996
|
-
});
|
|
1997
|
-
|
|
1998
|
-
expect("command" in agentEntry(loadRawConfig())).toBe(false);
|
|
1999
|
-
expect(AssistantConfigSchema.safeParse(loadRawConfig()).success).toBe(true);
|
|
2000
|
-
expect(loadConfig().acp.agents.claude?.command).toBeUndefined();
|
|
2001
|
-
|
|
2002
|
-
seedRawConfig();
|
|
2003
|
-
await patchRoute.handler({
|
|
2004
|
-
body: { acp: { agents: { claude: { command: null } } } },
|
|
2005
|
-
});
|
|
2006
|
-
|
|
2007
|
-
const patched = agentEntry(loadRawConfig());
|
|
2008
|
-
expect("command" in patched).toBe(false);
|
|
2009
|
-
expect(patched.model).toBe("opus");
|
|
2010
|
-
expect(AssistantConfigSchema.safeParse(loadRawConfig()).success).toBe(true);
|
|
2011
|
-
expect(loadConfig().acp.agents.claude?.command).toBeUndefined();
|
|
2012
|
-
});
|
|
2013
|
-
|
|
2014
|
-
test("a nulled command on an id with no bundled profile is dropped too", async () => {
|
|
2015
|
-
rawConfigFixture = {
|
|
2016
|
-
acp: { agents: { mine: { command: "my-acp", args: [] } } },
|
|
2017
|
-
};
|
|
2018
|
-
seedRawConfig();
|
|
2019
|
-
|
|
2020
|
-
await setRoute.handler({
|
|
2021
|
-
body: { path: "acp.agents.mine.command", value: null },
|
|
2022
|
-
});
|
|
2023
|
-
|
|
2024
|
-
expect("command" in agentEntry(loadRawConfig(), "mine")).toBe(false);
|
|
2025
|
-
const result = AssistantConfigSchema.safeParse(loadRawConfig());
|
|
2026
|
-
expect(result.success).toBe(false);
|
|
2027
|
-
if (result.success) {
|
|
2028
|
-
return;
|
|
2029
|
-
}
|
|
2030
|
-
expect(result.error.issues.map((issue) => issue.path)).toEqual([
|
|
2031
|
-
["acp", "agents", "mine", "command"],
|
|
2032
|
-
]);
|
|
2033
|
-
expect(result.error.issues[0]?.message).toContain("acp.agents.mine");
|
|
2034
|
-
});
|
|
2035
|
-
|
|
2036
|
-
test("a model set on a bare bundled entry survives the next load", async () => {
|
|
2037
|
-
rawConfigFixture = {};
|
|
2038
|
-
seedRawConfig();
|
|
2039
|
-
|
|
2040
|
-
await setRoute.handler({
|
|
2041
|
-
body: { path: "acp.agents.claude.model", value: "sonnet" },
|
|
2042
|
-
});
|
|
2043
|
-
|
|
2044
|
-
const entry = agentEntry(loadRawConfig());
|
|
2045
|
-
expect("command" in entry).toBe(false);
|
|
2046
|
-
expect(AssistantConfigSchema.safeParse(loadRawConfig()).success).toBe(true);
|
|
2047
|
-
expect(loadConfig().acp.agents.claude?.model).toBe("sonnet");
|
|
2048
|
-
});
|
|
2049
|
-
});
|
|
@@ -377,7 +377,7 @@ describe("GET config/llm/default-provider", () => {
|
|
|
377
377
|
expect(availability(result).message).toContain("Vellum-managed");
|
|
378
378
|
});
|
|
379
379
|
|
|
380
|
-
test("service_account connection with
|
|
380
|
+
test("service_account connection → unsupported_auth even with a stored credential", async () => {
|
|
381
381
|
seedConnection({
|
|
382
382
|
name: "gemini-personal",
|
|
383
383
|
provider: "gemini",
|
|
@@ -390,7 +390,7 @@ describe("GET config/llm/default-provider", () => {
|
|
|
390
390
|
setConfig("llm", { defaultProvider: { provider: "gemini" } });
|
|
391
391
|
|
|
392
392
|
const result = await get();
|
|
393
|
-
expect(availability(result).status).toBe("
|
|
393
|
+
expect(availability(result).status).toBe("unsupported_auth");
|
|
394
394
|
expect(availability(result).message).toContain("service-account");
|
|
395
395
|
});
|
|
396
396
|
|
|
@@ -1,24 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `internal_mcp_add` writes only the transport
|
|
3
|
-
*
|
|
4
|
-
* persisted.
|
|
2
|
+
* `internal_mcp_add` writes only the transport. Policy fields (enabled,
|
|
3
|
+
* risk, tool caps, allow/block lists) are not persisted.
|
|
5
4
|
*/
|
|
6
5
|
|
|
7
6
|
import { beforeEach, describe, expect, mock, test } from "bun:test";
|
|
8
7
|
|
|
9
|
-
let
|
|
10
|
-
|
|
11
|
-
let saved:
|
|
12
|
-
| { servers: Record<string, { transport: Record<string, unknown> }> }
|
|
13
|
-
| undefined;
|
|
8
|
+
let raw: Record<string, unknown> = {};
|
|
9
|
+
let saved: Record<string, unknown> | undefined;
|
|
14
10
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
11
|
+
const actualLoader = await import("../../../config/loader.js");
|
|
12
|
+
mock.module("../../../config/loader.js", () => ({
|
|
13
|
+
...actualLoader,
|
|
14
|
+
loadRawConfig: () => raw,
|
|
15
|
+
saveRawConfig: (next: Record<string, unknown>) => {
|
|
20
16
|
saved = next;
|
|
21
|
-
stored = next;
|
|
22
17
|
},
|
|
23
18
|
}));
|
|
24
19
|
|
|
@@ -31,12 +26,13 @@ const { ROUTES } = await import("../mcp-auth-routes.js");
|
|
|
31
26
|
const addRoute = ROUTES.find((r) => r.operationId === "internal_mcp_add")!;
|
|
32
27
|
|
|
33
28
|
function addedEntry(): Record<string, unknown> {
|
|
34
|
-
|
|
29
|
+
const mcp = saved?.mcp as { servers: Record<string, unknown> };
|
|
30
|
+
return mcp.servers["srv"] as Record<string, unknown>;
|
|
35
31
|
}
|
|
36
32
|
|
|
37
33
|
describe("internal_mcp_add persisted shape", () => {
|
|
38
34
|
beforeEach(() => {
|
|
39
|
-
|
|
35
|
+
raw = {};
|
|
40
36
|
saved = undefined;
|
|
41
37
|
});
|
|
42
38
|
|
|
@@ -262,21 +262,6 @@ describe("POST /v1/acp/spawn", () => {
|
|
|
262
262
|
// Guard runs before the approval gate — no prompt is surfaced.
|
|
263
263
|
expect(confirmationRequests).toHaveLength(0);
|
|
264
264
|
});
|
|
265
|
-
|
|
266
|
-
test("rejects a non-string model before the approval gate", async () => {
|
|
267
|
-
const handler = getSpawnHandler();
|
|
268
|
-
await expect(
|
|
269
|
-
handler({
|
|
270
|
-
body: {
|
|
271
|
-
agent: "claude",
|
|
272
|
-
task: "do a thing",
|
|
273
|
-
conversationId: "conv-1",
|
|
274
|
-
model: 42,
|
|
275
|
-
},
|
|
276
|
-
}),
|
|
277
|
-
).rejects.toThrow("model must be a string when provided");
|
|
278
|
-
expect(confirmationRequests).toHaveLength(0);
|
|
279
|
-
});
|
|
280
265
|
});
|
|
281
266
|
|
|
282
267
|
// ---------------------------------------------------------------------------
|
|
@@ -24,11 +24,8 @@ import {
|
|
|
24
24
|
AcpResumeError,
|
|
25
25
|
AcpSessionNotFoundError,
|
|
26
26
|
} from "../../acp/session-manager.js";
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
29
|
-
AcpSessionModelUpdateEventSchema,
|
|
30
|
-
type AssistantEvent,
|
|
31
|
-
} from "../../api/index.js";
|
|
27
|
+
import type { AcpSessionState } from "../../acp/types.js";
|
|
28
|
+
import type { AssistantEvent } from "../../api/index.js";
|
|
32
29
|
import { getConfig } from "../../config/loader.js";
|
|
33
30
|
import { createGuardianRequestForConfirmation } from "../../permissions/confirmation-guardian-request.js";
|
|
34
31
|
import type { UserDecision } from "../../permissions/types.js";
|
|
@@ -56,10 +53,6 @@ const log = getLogger("acp-routes");
|
|
|
56
53
|
const DEFAULT_SESSION_LIMIT = 50;
|
|
57
54
|
const MAX_SESSION_LIMIT = 500;
|
|
58
55
|
|
|
59
|
-
/** The option shape the `acp_session_model_update` event already publishes. */
|
|
60
|
-
const acpModelOptionsSchema =
|
|
61
|
-
AcpSessionModelUpdateEventSchema.shape.availableModels;
|
|
62
|
-
|
|
63
56
|
const sessionEntrySchema = z.object({
|
|
64
57
|
id: z.string(),
|
|
65
58
|
agentId: z.string(),
|
|
@@ -75,15 +68,6 @@ const sessionEntrySchema = z.object({
|
|
|
75
68
|
/** Credential failure that ended the run, when one did. Drives the inline
|
|
76
69
|
* Connect card on reopen; cleared when a replacement token is stored. */
|
|
77
70
|
authErrorCode: z.string().optional(),
|
|
78
|
-
/** Model a live session is running on. Absent for history rows, which have
|
|
79
|
-
* no live process to ask. */
|
|
80
|
-
model: z.string().optional(),
|
|
81
|
-
/** Models a live session could run on. Absent for history rows. */
|
|
82
|
-
availableModels: acpModelOptionsSchema.optional(),
|
|
83
|
-
/** Scopes live model revisions to one assistant process. */
|
|
84
|
-
modelRevisionEpoch: z.string().uuid().optional(),
|
|
85
|
-
/** Orders live model state within `modelRevisionEpoch`. */
|
|
86
|
-
modelRevision: z.number().int().nonnegative().optional(),
|
|
87
71
|
usedTokens: z.number().optional(),
|
|
88
72
|
contextSize: z.number().optional(),
|
|
89
73
|
costAmount: z.number().optional(),
|
|
@@ -230,26 +214,17 @@ async function spawnSession({ body, abortSignal }: RouteHandlerArgs) {
|
|
|
230
214
|
const task = body?.task as string | undefined;
|
|
231
215
|
const conversationId = body?.conversationId as string | undefined;
|
|
232
216
|
const cwd = (body?.cwd as string | undefined) ?? process.cwd();
|
|
233
|
-
const model = body?.model ?? undefined;
|
|
234
217
|
|
|
235
218
|
if (!agent || !task || !conversationId) {
|
|
236
219
|
throw new BadRequestError("agent, task, and conversationId are required");
|
|
237
220
|
}
|
|
238
|
-
if (model !== undefined && typeof model !== "string") {
|
|
239
|
-
throw new BadRequestError("model must be a string when provided");
|
|
240
|
-
}
|
|
241
221
|
|
|
242
222
|
// High-risk approval gate. Block BEFORE any side effects — resolution can
|
|
243
223
|
// trigger a `bun` global install (auto-install.ts) and `manager.spawn`
|
|
244
224
|
// launches the host subprocess — so an unapproved request mutates nothing.
|
|
245
225
|
const decision = await awaitRouteApproval({
|
|
246
226
|
toolName: "acp_spawn",
|
|
247
|
-
input: {
|
|
248
|
-
agent,
|
|
249
|
-
task,
|
|
250
|
-
cwd,
|
|
251
|
-
...(model !== undefined ? { model } : {}),
|
|
252
|
-
},
|
|
227
|
+
input: { agent, task, cwd },
|
|
253
228
|
conversationId,
|
|
254
229
|
signal: abortSignal,
|
|
255
230
|
});
|
|
@@ -287,33 +262,17 @@ async function spawnSession({ body, abortSignal }: RouteHandlerArgs) {
|
|
|
287
262
|
);
|
|
288
263
|
|
|
289
264
|
const manager = getAcpSessionManager();
|
|
290
|
-
const {
|
|
291
|
-
acpSessionId,
|
|
292
|
-
protocolSessionId,
|
|
293
|
-
requestedModel,
|
|
294
|
-
effectiveModel,
|
|
295
|
-
modelWarning,
|
|
296
|
-
} = await manager.spawn(
|
|
265
|
+
const { acpSessionId, protocolSessionId } = await manager.spawn(
|
|
297
266
|
agent,
|
|
298
267
|
agentConfig,
|
|
299
268
|
task,
|
|
300
269
|
cwd,
|
|
301
270
|
conversationId,
|
|
302
271
|
broadcastMessage,
|
|
303
|
-
{ model },
|
|
304
272
|
);
|
|
305
273
|
|
|
306
274
|
log.info({ acpSessionId, protocolSessionId, agent }, "ACP spawn succeeded");
|
|
307
|
-
|
|
308
|
-
// the agent's own model.
|
|
309
|
-
return {
|
|
310
|
-
acpSessionId,
|
|
311
|
-
protocolSessionId,
|
|
312
|
-
agent,
|
|
313
|
-
requestedModel: requestedModel ?? null,
|
|
314
|
-
effectiveModel: effectiveModel ?? null,
|
|
315
|
-
...(modelWarning ? { modelWarning } : {}),
|
|
316
|
-
};
|
|
275
|
+
return { acpSessionId, protocolSessionId, agent };
|
|
317
276
|
}
|
|
318
277
|
|
|
319
278
|
async function steerSession({ pathParams, body }: RouteHandlerArgs) {
|
|
@@ -629,7 +588,10 @@ function deleteSession({ pathParams }: RouteHandlerArgs) {
|
|
|
629
588
|
|
|
630
589
|
try {
|
|
631
590
|
const state = manager.getStatus(id);
|
|
632
|
-
if (
|
|
591
|
+
if (
|
|
592
|
+
!Array.isArray(state) &&
|
|
593
|
+
(state.status === "running" || state.status === "initializing")
|
|
594
|
+
) {
|
|
633
595
|
throw new ConflictError(
|
|
634
596
|
`ACP session "${id}" is still ${state.status}. Cancel or close it before deleting.`,
|
|
635
597
|
);
|
|
@@ -678,32 +640,11 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
678
640
|
task: z.string().describe("Task description"),
|
|
679
641
|
conversationId: z.string(),
|
|
680
642
|
cwd: z.string().describe("Working directory").optional(),
|
|
681
|
-
model: z
|
|
682
|
-
.string()
|
|
683
|
-
.optional()
|
|
684
|
-
.describe("Optional model id or alias to request for the session."),
|
|
685
643
|
}),
|
|
686
644
|
responseBody: z.object({
|
|
687
645
|
acpSessionId: z.string(),
|
|
688
646
|
protocolSessionId: z.string(),
|
|
689
647
|
agent: z.string(),
|
|
690
|
-
requestedModel: z
|
|
691
|
-
.string()
|
|
692
|
-
.nullable()
|
|
693
|
-
.describe("The model explicitly requested for this spawn, if any."),
|
|
694
|
-
effectiveModel: z
|
|
695
|
-
.string()
|
|
696
|
-
.nullable()
|
|
697
|
-
.describe(
|
|
698
|
-
"The top-level session model reported by the ACP adapter, if any.",
|
|
699
|
-
),
|
|
700
|
-
modelWarning: z
|
|
701
|
-
.string()
|
|
702
|
-
.optional()
|
|
703
|
-
.describe(
|
|
704
|
-
"Why the requested model was not applied. The session is running " +
|
|
705
|
-
"on the agent's own model.",
|
|
706
|
-
),
|
|
707
648
|
}),
|
|
708
649
|
},
|
|
709
650
|
{
|
|
@@ -911,10 +852,6 @@ function listMergedSessions(opts: { limit: number; conversationId?: string }): {
|
|
|
911
852
|
parentToolUseId: s.parentToolUseId,
|
|
912
853
|
authErrorCode: s.authErrorCode,
|
|
913
854
|
authErrorCredential: s.authErrorCredential,
|
|
914
|
-
model: s.model,
|
|
915
|
-
availableModels: s.availableModels,
|
|
916
|
-
modelRevisionEpoch: s.modelRevisionEpoch,
|
|
917
|
-
modelRevision: s.modelRevision,
|
|
918
855
|
usedTokens: s.latestUsage?.usedTokens,
|
|
919
856
|
contextSize: s.latestUsage?.contextSize,
|
|
920
857
|
costAmount: s.latestUsage?.costAmount,
|
|
@@ -51,7 +51,6 @@ import { compileApp, runCompile } from "../../bundler/app-compiler.js";
|
|
|
51
51
|
import { scanBundle } from "../../bundler/bundle-scanner.js";
|
|
52
52
|
import type { SignatureJson } from "../../bundler/bundle-signer.js";
|
|
53
53
|
import { verifyBundleSignature } from "../../bundler/signature-verifier.js";
|
|
54
|
-
import { notifyAppSurfacesChanged } from "../../daemon/app-change-notify.js";
|
|
55
54
|
import { compareSemver } from "../../daemon/handlers/shared.js";
|
|
56
55
|
import { computeContentId } from "../../util/content-id.js";
|
|
57
56
|
import { getLogger } from "../../util/logger.js";
|
|
@@ -129,17 +128,6 @@ const appListItemSchema = z.object({
|
|
|
129
128
|
|
|
130
129
|
type AppListItem = z.infer<typeof appListItemSchema>;
|
|
131
130
|
|
|
132
|
-
const compileDiagnosticSchema = z.object({
|
|
133
|
-
text: z.string(),
|
|
134
|
-
location: z
|
|
135
|
-
.object({
|
|
136
|
-
file: z.string(),
|
|
137
|
-
line: z.number(),
|
|
138
|
-
column: z.number(),
|
|
139
|
-
})
|
|
140
|
-
.optional(),
|
|
141
|
-
});
|
|
142
|
-
|
|
143
131
|
/**
|
|
144
132
|
* The pin route's body. `RouteDefinition.requestBody` is a codegen signal and
|
|
145
133
|
* does not validate, so the handler parses against this too; declaring it once
|
|
@@ -908,44 +896,6 @@ async function handleOpenApp({ pathParams }: RouteHandlerArgs) {
|
|
|
908
896
|
return { ...result, html };
|
|
909
897
|
}
|
|
910
898
|
|
|
911
|
-
/**
|
|
912
|
-
* Compile an app's source into dist/ and refresh open surfaces.
|
|
913
|
-
* Runs in the assistant process so open surfaces, client broadcasts, and
|
|
914
|
-
* published-app redeploy see the new build. Workspace and plugin apps both
|
|
915
|
-
* compile in place so local plugin edits can be rebuilt without waiting for
|
|
916
|
-
* the plugin source watcher.
|
|
917
|
-
*/
|
|
918
|
-
async function handleRefreshApp({ pathParams }: RouteHandlerArgs) {
|
|
919
|
-
const appId = pathParams?.id;
|
|
920
|
-
if (!appId) {
|
|
921
|
-
throw new BadRequestError("App id is required.");
|
|
922
|
-
}
|
|
923
|
-
|
|
924
|
-
const source = resolveAppSource(appId);
|
|
925
|
-
if (!source) {
|
|
926
|
-
throw new NotFoundError(
|
|
927
|
-
`App "${appId}" not found. Run 'assistant apps list' to see available apps.`,
|
|
928
|
-
);
|
|
929
|
-
}
|
|
930
|
-
|
|
931
|
-
const compileResult = await compileApp(source.sourceDir);
|
|
932
|
-
notifyAppSurfacesChanged(source.id, { fileChange: true });
|
|
933
|
-
|
|
934
|
-
return {
|
|
935
|
-
ok: true as const,
|
|
936
|
-
appId: source.id,
|
|
937
|
-
name: source.name,
|
|
938
|
-
compiled: compileResult.ok,
|
|
939
|
-
compile_duration_ms: compileResult.durationMs,
|
|
940
|
-
...(compileResult.ok
|
|
941
|
-
? {}
|
|
942
|
-
: {
|
|
943
|
-
compile_errors: compileResult.errors,
|
|
944
|
-
compile_warnings: compileResult.warnings,
|
|
945
|
-
}),
|
|
946
|
-
};
|
|
947
|
-
}
|
|
948
|
-
|
|
949
899
|
/**
|
|
950
900
|
* Reject a mutation targeting a plugin-bundled app. Plugin apps are owned by
|
|
951
901
|
* their plugin and are read-only over this surface — their source is not
|
|
@@ -1303,29 +1253,6 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
1303
1253
|
origin: z.string(),
|
|
1304
1254
|
}),
|
|
1305
1255
|
},
|
|
1306
|
-
{
|
|
1307
|
-
operationId: "apps_refresh",
|
|
1308
|
-
endpoint: "apps/:id/refresh",
|
|
1309
|
-
method: "POST",
|
|
1310
|
-
policy: {
|
|
1311
|
-
requiredScopes: ["settings.write"],
|
|
1312
|
-
allowedPrincipalTypes: ACTOR_PRINCIPALS,
|
|
1313
|
-
},
|
|
1314
|
-
handler: handleRefreshApp,
|
|
1315
|
-
summary: "Compile an app",
|
|
1316
|
-
description:
|
|
1317
|
-
"Compile workspace or plugin app source into dist/ and refresh open surfaces.",
|
|
1318
|
-
tags: ["apps"],
|
|
1319
|
-
responseBody: z.object({
|
|
1320
|
-
ok: z.literal(true),
|
|
1321
|
-
appId: z.string(),
|
|
1322
|
-
name: z.string(),
|
|
1323
|
-
compiled: z.boolean(),
|
|
1324
|
-
compile_duration_ms: z.number(),
|
|
1325
|
-
compile_errors: z.array(compileDiagnosticSchema).optional(),
|
|
1326
|
-
compile_warnings: z.array(compileDiagnosticSchema).optional(),
|
|
1327
|
-
}),
|
|
1328
|
-
},
|
|
1329
1256
|
{
|
|
1330
1257
|
operationId: "apps_delete",
|
|
1331
1258
|
endpoint: "apps/:id/delete",
|
|
@@ -92,7 +92,7 @@ function serveCompiledApp(
|
|
|
92
92
|
);
|
|
93
93
|
const body = isLegacySingleFileDir(appDir)
|
|
94
94
|
? UNSUPPORTED_LEGACY_APP_HTML
|
|
95
|
-
: `<p>App has not been compiled yet.
|
|
95
|
+
: `<p>App has not been compiled yet. Edit a source file to trigger a build.</p>`;
|
|
96
96
|
return (
|
|
97
97
|
`<!DOCTYPE html><html><head><title>${escapedName}</title></head>` +
|
|
98
98
|
`<body>${body}</body></html>`
|
|
@@ -14,7 +14,6 @@ import { z } from "zod";
|
|
|
14
14
|
|
|
15
15
|
import { CHANNEL_IDS } from "../../channels/types.js";
|
|
16
16
|
import { isAssistantInitiatedThreadsEnabled } from "../../config/assistant-initiated-threads-gate.js";
|
|
17
|
-
import { localeFromAcceptLanguage } from "../../i18n/index.js";
|
|
18
17
|
import { channelBindingSchema } from "../../messaging/channel-binding-schema.js";
|
|
19
18
|
import {
|
|
20
19
|
type Confidence,
|
|
@@ -245,10 +244,7 @@ function parseEnumQueryParam<const T extends readonly string[]>(
|
|
|
245
244
|
);
|
|
246
245
|
}
|
|
247
246
|
|
|
248
|
-
function handleListConversations({
|
|
249
|
-
queryParams = {},
|
|
250
|
-
headers,
|
|
251
|
-
}: RouteHandlerArgs) {
|
|
247
|
+
function handleListConversations({ queryParams = {} }: RouteHandlerArgs) {
|
|
252
248
|
const limit = Number(queryParams.limit ?? 50);
|
|
253
249
|
const offset = Number(queryParams.offset ?? 0);
|
|
254
250
|
// "background" is the back-compat umbrella (background + scheduled); newer
|
|
@@ -369,7 +365,6 @@ function handleListConversations({
|
|
|
369
365
|
// Checks in-memory flag first (hot path), falls back to the
|
|
370
366
|
// persisted `processing_started_at` column for cold conversations.
|
|
371
367
|
isProcessing: isConversationProcessing(conversation.id),
|
|
372
|
-
locale: localeFromAcceptLanguage(headers?.["accept-language"]),
|
|
373
368
|
}),
|
|
374
369
|
),
|
|
375
370
|
nextOffset,
|
|
@@ -584,14 +579,8 @@ function handleMarkUnread({ body = {}, headers }: RouteHandlerArgs) {
|
|
|
584
579
|
}
|
|
585
580
|
}
|
|
586
581
|
|
|
587
|
-
function handleGetConversation({
|
|
588
|
-
|
|
589
|
-
headers,
|
|
590
|
-
}: RouteHandlerArgs) {
|
|
591
|
-
const detail = buildConversationDetailResponse(
|
|
592
|
-
pathParams.id!,
|
|
593
|
-
localeFromAcceptLanguage(headers?.["accept-language"]),
|
|
594
|
-
);
|
|
582
|
+
function handleGetConversation({ pathParams = {} }: RouteHandlerArgs) {
|
|
583
|
+
const detail = buildConversationDetailResponse(pathParams.id!);
|
|
595
584
|
if (!detail) {
|
|
596
585
|
throw new NotFoundError(`Conversation ${pathParams.id} not found`);
|
|
597
586
|
}
|
|
@@ -29,7 +29,6 @@ import {
|
|
|
29
29
|
LatencyBreakdownSchema,
|
|
30
30
|
LLMRequestLogEntrySchema,
|
|
31
31
|
} from "../../api/responses/llm-request-log-entry.js";
|
|
32
|
-
import { scrubNulledAcpAgentLeaves } from "../../config/acp-agent-write.js";
|
|
33
32
|
import {
|
|
34
33
|
catalogEntryFor,
|
|
35
34
|
type InputModalities,
|
|
@@ -93,7 +92,6 @@ import {
|
|
|
93
92
|
log,
|
|
94
93
|
} from "../../daemon/handlers/shared.js";
|
|
95
94
|
import { rescheduleHeartbeatIfTimezoneChanged } from "../../heartbeat/heartbeat-service.js";
|
|
96
|
-
import { overlayWorkspaceMcpForConfigRead } from "../../mcp/workspace-mcp-config.js";
|
|
97
95
|
import {
|
|
98
96
|
getAssistantMessageIdsInTurn,
|
|
99
97
|
getConversation,
|
|
@@ -689,38 +687,6 @@ function rejectMcpTransportHeaderWrite(patch: unknown): void {
|
|
|
689
687
|
);
|
|
690
688
|
}
|
|
691
689
|
|
|
692
|
-
const MCP_CONFIG_WRITE_MESSAGE =
|
|
693
|
-
"MCP servers are stored in mcp.json. Use assistant mcp add or assistant mcp remove.";
|
|
694
|
-
|
|
695
|
-
function stripMcpFromConfigWrite(patch: Record<string, unknown>): void {
|
|
696
|
-
if (Object.hasOwn(patch, "mcp")) {
|
|
697
|
-
delete patch.mcp;
|
|
698
|
-
}
|
|
699
|
-
}
|
|
700
|
-
|
|
701
|
-
function rejectMcpConfigSetPath(path: string, value: unknown): void {
|
|
702
|
-
if (path !== "mcp" && !path.startsWith("mcp.")) {
|
|
703
|
-
return;
|
|
704
|
-
}
|
|
705
|
-
const relative =
|
|
706
|
-
path === "mcp" ? value : nestPath(path.slice("mcp.".length), value);
|
|
707
|
-
if (patchContainsMcpTransportHeaders({ mcp: relative })) {
|
|
708
|
-
throw new BadRequestError(
|
|
709
|
-
"MCP authentication headers must be managed through MCP server add/update APIs, not generic config writes.",
|
|
710
|
-
);
|
|
711
|
-
}
|
|
712
|
-
throw new BadRequestError(MCP_CONFIG_WRITE_MESSAGE);
|
|
713
|
-
}
|
|
714
|
-
|
|
715
|
-
function nestPath(path: string, value: unknown): unknown {
|
|
716
|
-
const segments = path.split(".");
|
|
717
|
-
let current: unknown = value;
|
|
718
|
-
for (let i = segments.length - 1; i >= 0; i--) {
|
|
719
|
-
current = { [segments[i]!]: current };
|
|
720
|
-
}
|
|
721
|
-
return current;
|
|
722
|
-
}
|
|
723
|
-
|
|
724
690
|
const WireProfileEntry = ProfileEntry.extend({
|
|
725
691
|
supportsVision: z.boolean().optional(),
|
|
726
692
|
invariant: z.boolean().optional(),
|
|
@@ -927,7 +893,6 @@ const ConfigPatchRequestSchema = z
|
|
|
927
893
|
function handleGetConfig() {
|
|
928
894
|
try {
|
|
929
895
|
const config = applyContextDefaultsToRawConfig(loadRawConfig());
|
|
930
|
-
overlayWorkspaceMcpForConfigRead(config);
|
|
931
896
|
sanitizeMcpTransportHeadersForSettingsRead(config);
|
|
932
897
|
overlayEffectiveProfilesForWire(config);
|
|
933
898
|
enrichProfilesForWire(config);
|
|
@@ -1629,7 +1594,6 @@ async function handlePatchConfig({ body }: RouteHandlerArgs) {
|
|
|
1629
1594
|
normalizeManagedProfileWrites(body);
|
|
1630
1595
|
rejectManagedProfileDeletion(body as Record<string, unknown>);
|
|
1631
1596
|
rejectMcpTransportHeaderWrite(body);
|
|
1632
|
-
stripMcpFromConfigWrite(body as Record<string, unknown>);
|
|
1633
1597
|
|
|
1634
1598
|
const raw = loadRawConfig();
|
|
1635
1599
|
const patch = body as Record<string, unknown>;
|
|
@@ -1639,13 +1603,11 @@ async function handlePatchConfig({ body }: RouteHandlerArgs) {
|
|
|
1639
1603
|
}
|
|
1640
1604
|
deepMergeOverwrite(raw, patch);
|
|
1641
1605
|
scrubRemovedServiceModes(raw);
|
|
1642
|
-
scrubNulledAcpAgentLeaves(raw);
|
|
1643
1606
|
seedSttProviderForSparseBlock(raw);
|
|
1644
1607
|
|
|
1645
1608
|
await commitConfigWrite(raw, "patch");
|
|
1646
1609
|
|
|
1647
1610
|
const merged = applyContextDefaultsToRawConfig(loadRawConfig());
|
|
1648
|
-
overlayWorkspaceMcpForConfigRead(merged);
|
|
1649
1611
|
sanitizeMcpTransportHeadersForSettingsRead(merged);
|
|
1650
1612
|
overlayEffectiveProfilesForWire(merged);
|
|
1651
1613
|
enrichProfilesForWire(merged);
|
|
@@ -1708,7 +1670,6 @@ async function handleSetConfig({ body }: RouteHandlerArgs) {
|
|
|
1708
1670
|
stripWireOnlyProfileKeys(patchShape);
|
|
1709
1671
|
normalizeManagedProfileWrites(patchShape);
|
|
1710
1672
|
rejectManagedProfileDeletion(patchShape);
|
|
1711
|
-
rejectMcpConfigSetPath(path, value);
|
|
1712
1673
|
rejectMcpTransportHeaderWrite(patchShape);
|
|
1713
1674
|
|
|
1714
1675
|
const raw = loadRawConfig();
|
|
@@ -1747,7 +1708,6 @@ async function handleSetConfig({ body }: RouteHandlerArgs) {
|
|
|
1747
1708
|
written.source = "managed";
|
|
1748
1709
|
}
|
|
1749
1710
|
}
|
|
1750
|
-
scrubNulledAcpAgentLeaves(raw);
|
|
1751
1711
|
// A SET can create `services.stt` with a leaf like `language` and no
|
|
1752
1712
|
// `provider`, which SttServiceSchema requires whenever the block exists;
|
|
1753
1713
|
// the same seeding that guards PATCH keeps this write's persisted block
|