@vellumai/assistant 0.12.1-staging.1 → 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/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/AGENTS.md
CHANGED
|
@@ -87,10 +87,6 @@ The module-level dependency-injection pattern (`registerFooDeps()`) used by some
|
|
|
87
87
|
|
|
88
88
|
Telemetry event types are defined by a platform-generated wire contract (`src/telemetry/telemetry-wire.generated.ts`) that `src/telemetry/types.ts` layers over, with pre-flush validation against it. Adding a new event type starts platform-side, not here. The mechanics, the drift guards, and the cross-repo ordering are documented next to the code they govern: see [`src/telemetry/AGENTS.md`](src/telemetry/AGENTS.md).
|
|
89
89
|
|
|
90
|
-
## Daemon i18n
|
|
91
|
-
|
|
92
|
-
User-facing copy the daemon generates as a hardcoded constant goes through `src/i18n/`. Persist the message key. Resolve with `t(key, locale)` at the HTTP/CLI/channel edge. Never persist a translated string, and never match stored display strings back to keys. See [`src/i18n/AGENTS.md`](src/i18n/AGENTS.md).
|
|
93
|
-
|
|
94
90
|
## Code comments
|
|
95
91
|
|
|
96
92
|
When writing or updating comments, **do not reference code that has been removed.** Comments should describe the current state of the codebase, not narrate its history. Avoid phrases like "no longer does X", "previously used Y", or "was removed in PR Z" — future readers should not need to understand past implementations to understand the current code.
|
package/ARCHITECTURE.md
CHANGED
|
@@ -609,11 +609,9 @@ Every phone call connects over Twilio Media Streams: the voice webhook emits `<C
|
|
|
609
609
|
|
|
610
610
|
Transcription mode is selected once per session in `media-stream-stt-session.ts`:
|
|
611
611
|
|
|
612
|
-
- **Streaming** (default): when `calls.voice.telephonyStreaming` is enabled and the `telephony` role resolves a streaming transcriber (`resolveStreamingTranscriber({ role: "telephony" })`), inbound audio is decoded (mu-law → PCM16, resampled 8 kHz → 16 kHz) and fed to the provider's realtime adapter. Replies trigger only on utterance-boundary finals (for Deepgram, `speech_final`/`UtteranceEnd`, never mid-sentence `is_final` segments), and barge-in fires from local energy VAD, never from transcriber partials.
|
|
612
|
+
- **Streaming** (default): when `calls.voice.telephonyStreaming` is enabled and the `telephony` role resolves a streaming transcriber (`resolveStreamingTranscriber({ role: "telephony" })`), inbound audio is decoded (mu-law → PCM16, resampled 8 kHz → 16 kHz) and fed to the provider's realtime adapter. Replies trigger only on utterance-boundary finals (for Deepgram, `speech_final`/`UtteranceEnd`, never mid-sentence `is_final` segments), and barge-in fires from local energy VAD, never from transcriber partials.
|
|
613
613
|
- **Batch fallback**: otherwise the session segments turns with the energy-based `MediaTurnDetector` and transcribes each completed turn via the same role's batch API. Both halves of a call read the `telephony` role, which is why a role names its consumer rather than a boundary.
|
|
614
614
|
|
|
615
|
-
Every phone turn runs the same two-leg triage as live voice through `startVoiceTurn` (`src/calls/voice-session-bridge.ts`): `call-controller.ts` opens on a toolless front-door leg (`routingLeg: "front-door"`, the `voiceFrontDoor` call site) and drives it through the shared `createFrontDoorLegCoordinator` (`src/calls/voice-leg-coordinator.ts`), which reads the stream through the verdict machine and sequences the hand-off (pause narration, abort the leg, resolve and speak the bridge, mark it as the floor holder, start the escalated leg pinned to the conversation's own model, re-arm narration); each driver supplies only a host for how text and the bridge are spoken, how a leg is started or aborted, and (live voice only) the speculative hold and commit. Phone has no partial transcripts, so the hold verdict is never taught and routing is escalate-only. The controller also passes the bridge's turn callbacks (tool activity is recorded as `tool_use_started` / `tool_use_completed` call events, persisted row ids ride the `assistant_spoke` event), `launchedAtMs` for dispatch timing, and a `voiceTelemetry` bag keyed by the call session with a `phone_inbound` / `phone_outbound` entry. Both drivers share the spoken progress narration cadence (`src/calls/voice-progress-cadence.ts`, tuned by `voice.frontModel.progress`): the cadence owns the tool-activity log, the triggers (an ops burst, a long operation completing, a full interval of audible silence with news, the `maxSilenceMs` heartbeat) and the generated or static phrase, while each driver supplies its own view of audible silence (live voice from its TTS queue and playback-tail estimate; the media-stream transport from `isPlaybackIdle()` and a running sum of sent frame durations) and how to speak a phrase.
|
|
616
|
-
|
|
617
615
|
A credential preflight (`resolveTelephonyCredentialReadiness()` in `src/calls/telephony-credential-preflight.ts`) gates every call: it requires a credentialed, telephony-capable STT provider **and** a media-stream-playable TTS provider (the configured one or a credentialed playable fallback). Inbound calls that fail the preflight receive `<Say>` setup-required copy plus `<Hangup/>` instead of a doomed stream; outbound placement fails before dialing via `preflightVoiceIngress()` with the same user-facing message.
|
|
618
616
|
|
|
619
617
|
Key modules:
|
|
@@ -731,9 +729,9 @@ The assistant-side live voice module is intentionally bounded under `src/live-vo
|
|
|
731
729
|
| `live-voice-archive.ts` | Audio artifact creation/linking for user utterance and assistant response message IDs |
|
|
732
730
|
| `live-voice-metrics.ts` | Per-session and per-turn latency snapshots emitted as `metrics` frames |
|
|
733
731
|
|
|
734
|
-
Live voice STT uses the same `resolveStreamingTranscriber()` path as conversation streaming
|
|
732
|
+
Live voice STT uses the same `resolveStreamingTranscriber()` path as conversation streaming. For V1 latency-sensitive behavior, the selected `services.stt.provider` must resolve to a `daemon-streaming` transcriber whose catalog entry has `conversationStreamingMode: "realtime-ws"` and usable credentials. Providers that only support batch or incremental-batch transcription remain valid for other voice surfaces, but do not satisfy live voice's streaming STT requirement.
|
|
735
733
|
|
|
736
|
-
Live voice TTS uses `streamLiveVoiceTtsAudio()` and the
|
|
734
|
+
Live voice TTS uses `streamLiveVoiceTtsAudio()` and the configured `services.tts.provider`. The selected provider must be registered, catalog-compatible, and expose `capabilities.supportsStreaming` plus `synthesizeStream()`. Providers whose catalog entry advertises `supportsStreaming` (currently all four catalog providers: ElevenLabs, Fish Audio, Deepgram, and xAI) satisfy this requirement; a buffered-only provider would remain available for buffered message playback or other supported surfaces, but live voice reports a TTS error instead of silently falling back to buffered playback.
|
|
737
735
|
|
|
738
736
|
The `voiceFrontDoor` prompt skips current-turn legacy and v3 memory retrieval, while prior frozen memory cards and static memory context remain available. The front-door rule escalates rather than guessing when required personal context is absent. The escalated leg runs the ordinary memory pipeline against the latest visible caller prompt before the quality model, with low selector effort. This keeps memory work off the front-door TTFT path without cross-leg speculative state.
|
|
739
737
|
|
|
@@ -1296,8 +1294,9 @@ graph TB
|
|
|
1296
1294
|
RM_DIR["rmSync skill directory"]
|
|
1297
1295
|
end
|
|
1298
1296
|
|
|
1299
|
-
subgraph "
|
|
1300
|
-
|
|
1297
|
+
subgraph "File Watcher"
|
|
1298
|
+
WATCHER["Skills directory watcher<br/>detects changes"]
|
|
1299
|
+
EVICT["Session eviction<br/>+ recreation"]
|
|
1301
1300
|
end
|
|
1302
1301
|
|
|
1303
1302
|
SNIPPET --> EVAL_TOOL
|
|
@@ -1310,12 +1309,14 @@ graph TB
|
|
|
1310
1309
|
SCAFFOLD --> MANAGED_STORE
|
|
1311
1310
|
MANAGED_STORE --> SKILL_DIR
|
|
1312
1311
|
|
|
1313
|
-
SKILL_DIR -->
|
|
1312
|
+
SKILL_DIR --> WATCHER
|
|
1313
|
+
WATCHER --> EVICT
|
|
1314
|
+
|
|
1314
1315
|
SKILL_DIR --> SKILL_LOAD
|
|
1315
1316
|
SKILL_LOAD --> SESSION
|
|
1316
1317
|
|
|
1317
1318
|
DELETE --> RM_DIR
|
|
1318
|
-
RM_DIR -->
|
|
1319
|
+
RM_DIR --> WATCHER
|
|
1319
1320
|
```
|
|
1320
1321
|
|
|
1321
1322
|
**Key design decisions:**
|
|
@@ -1323,7 +1324,7 @@ graph TB
|
|
|
1323
1324
|
- `evaluate_typescript_code` always forces `sandbox.enabled = true` regardless of global config.
|
|
1324
1325
|
- Snippet contract: must export `default` or `run` with signature `(input: unknown) => unknown | Promise<unknown>`.
|
|
1325
1326
|
- Managed-store writes are atomic (tmp file + rename) to prevent partial `SKILL.md` files.
|
|
1326
|
-
- After persist or delete,
|
|
1327
|
+
- After persist or delete, the file watcher triggers conversation eviction; the next turn runs in a fresh conversation. The model's system prompt instructs it to continue normally.
|
|
1327
1328
|
- macOS UI shows Inspect and Delete controls for managed skills only (source = "managed").
|
|
1328
1329
|
- `skill_load` resolves the recursive include graph (via `include-graph.ts`) before emitting output. Missing children are listed as suggested skills without child `<loaded_skill>` markers; cycles still produce `isError: true` with no marker. Valid includes produce an "Included Skills (immediate)" metadata section showing child ID, name, description, and path.
|
|
1329
1330
|
|
|
@@ -2191,7 +2192,7 @@ The `TtsUseCase` discriminator (`"phone-call"` or `"message-playback"`) lets pro
|
|
|
2191
2192
|
- **`native-twilio`** — the text-token path: spoken text is sent via `sendTextToken()`, which the media-stream transport re-synthesizes through daemon TTS. Collapsing this mode into `synthesized-play` is a documented deferred follow-up.
|
|
2192
2193
|
- **`synthesized-play`** — The assistant synthesises audio via the provider's HTTP API and streams it through the audio store / `sendPlayUrl()` path.
|
|
2193
2194
|
|
|
2194
|
-
**Phone call integration:** Phone calls run on the media-stream transport, where the daemon synthesises speech via the
|
|
2195
|
+
**Phone call integration:** Phone calls run on the media-stream transport, where the daemon synthesises speech via the configured TTS provider and transcodes it to mu-law 8 kHz frames (`media-stream-output.ts`). Each catalog entry declares `mediaStreamPlayback.outputFormat` (`pcm`, `wav`, or `none`); `resolveTelephonyTtsCapability()` (`src/calls/telephony-tts-capability.ts`) combines that field with credential availability into a playable / not-playable verdict, and the call TTS resolver falls back to a credentialed playable provider rather than producing silence.
|
|
2195
2196
|
|
|
2196
2197
|
**Adding a new TTS provider (catalog-first checklist):**
|
|
2197
2198
|
|
|
@@ -60,21 +60,14 @@ and restore the prior value afterwards, each guarding the restore so a turn that
|
|
|
60
60
|
started in between is not clobbered. They are supplying the acting actor for
|
|
61
61
|
their run, and are covered by this contract.
|
|
62
62
|
|
|
63
|
-
|
|
64
|
-
`
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
The consequence is that a cross-actor drain runs against history scoped for the
|
|
73
|
-
previous actor, because `ensureActorScopedHistory` reads the slot. That is a
|
|
74
|
-
real defect and it is LUM-3344's, which owns the fix: scope the transcript at
|
|
75
|
-
assembly time from the turn's actor, rather than mutating a shared transcript
|
|
76
|
-
and tracking who it was scoped for. Do not close it by making the drain stamp
|
|
77
|
-
the slot first.
|
|
63
|
+
A queued message commits to a run at its drain, not at its enqueue. The drains
|
|
64
|
+
(`drainSingleMessage` and `drainBatch` in `conversation-process.ts`) stamp the
|
|
65
|
+
queued sender the way `processMessage` stamps its committing actor, and re-scope
|
|
66
|
+
the resident history to them, so a turn drained behind another actor's turn
|
|
67
|
+
runs as its sender everywhere the resting actor is read, not only in the
|
|
68
|
+
per-turn snapshot. A steered drain skips the re-scope: its sender owned the
|
|
69
|
+
turn it cut off, and the resident history may carry the in-memory repair of the
|
|
70
|
+
abandoned `tool_use`.
|
|
78
71
|
|
|
79
72
|
`call-controller` keeps its own `trustContext` on its own object and never reads
|
|
80
73
|
the conversation's. It is outside this contract.
|
package/openapi.yaml
CHANGED
|
@@ -469,33 +469,6 @@ paths:
|
|
|
469
469
|
type: string
|
|
470
470
|
authErrorCode:
|
|
471
471
|
type: string
|
|
472
|
-
model:
|
|
473
|
-
type: string
|
|
474
|
-
availableModels:
|
|
475
|
-
type: array
|
|
476
|
-
items:
|
|
477
|
-
type: object
|
|
478
|
-
properties:
|
|
479
|
-
value:
|
|
480
|
-
type: string
|
|
481
|
-
label:
|
|
482
|
-
type: string
|
|
483
|
-
description:
|
|
484
|
-
type: string
|
|
485
|
-
group:
|
|
486
|
-
type: string
|
|
487
|
-
required:
|
|
488
|
-
- value
|
|
489
|
-
- label
|
|
490
|
-
additionalProperties: false
|
|
491
|
-
modelRevisionEpoch:
|
|
492
|
-
type: string
|
|
493
|
-
format: uuid
|
|
494
|
-
pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
|
|
495
|
-
modelRevision:
|
|
496
|
-
type: integer
|
|
497
|
-
minimum: 0
|
|
498
|
-
maximum: 9007199254740991
|
|
499
472
|
usedTokens:
|
|
500
473
|
type: number
|
|
501
474
|
contextSize:
|
|
@@ -575,9 +548,6 @@ paths:
|
|
|
575
548
|
cwd:
|
|
576
549
|
type: string
|
|
577
550
|
description: Working directory
|
|
578
|
-
model:
|
|
579
|
-
description: Optional model id or alias to request for the session.
|
|
580
|
-
type: string
|
|
581
551
|
required:
|
|
582
552
|
- agent
|
|
583
553
|
- task
|
|
@@ -596,25 +566,10 @@ paths:
|
|
|
596
566
|
type: string
|
|
597
567
|
agent:
|
|
598
568
|
type: string
|
|
599
|
-
requestedModel:
|
|
600
|
-
anyOf:
|
|
601
|
-
- type: string
|
|
602
|
-
- type: "null"
|
|
603
|
-
description: The model explicitly requested for this spawn, if any.
|
|
604
|
-
effectiveModel:
|
|
605
|
-
anyOf:
|
|
606
|
-
- type: string
|
|
607
|
-
- type: "null"
|
|
608
|
-
description: The top-level session model reported by the ACP adapter, if any.
|
|
609
|
-
modelWarning:
|
|
610
|
-
description: Why the requested model was not applied. The session is running on the agent's own model.
|
|
611
|
-
type: string
|
|
612
569
|
required:
|
|
613
570
|
- acpSessionId
|
|
614
571
|
- protocolSessionId
|
|
615
572
|
- agent
|
|
616
|
-
- requestedModel
|
|
617
|
-
- effectiveModel
|
|
618
573
|
additionalProperties: false
|
|
619
574
|
/v1/activation/dismiss:
|
|
620
575
|
post:
|
|
@@ -1625,93 +1580,6 @@ paths:
|
|
|
1625
1580
|
required:
|
|
1626
1581
|
- published
|
|
1627
1582
|
additionalProperties: false
|
|
1628
|
-
/v1/apps/{id}/refresh:
|
|
1629
|
-
post:
|
|
1630
|
-
operationId: apps_by_id_refresh_post
|
|
1631
|
-
summary: Compile an app
|
|
1632
|
-
description: Compile workspace or plugin app source into dist/ and refresh open surfaces.
|
|
1633
|
-
tags:
|
|
1634
|
-
- apps
|
|
1635
|
-
parameters:
|
|
1636
|
-
- name: id
|
|
1637
|
-
in: path
|
|
1638
|
-
required: true
|
|
1639
|
-
schema:
|
|
1640
|
-
type: string
|
|
1641
|
-
responses:
|
|
1642
|
-
"200":
|
|
1643
|
-
description: Successful response
|
|
1644
|
-
content:
|
|
1645
|
-
application/json:
|
|
1646
|
-
schema:
|
|
1647
|
-
type: object
|
|
1648
|
-
properties:
|
|
1649
|
-
ok:
|
|
1650
|
-
type: boolean
|
|
1651
|
-
const: true
|
|
1652
|
-
appId:
|
|
1653
|
-
type: string
|
|
1654
|
-
name:
|
|
1655
|
-
type: string
|
|
1656
|
-
compiled:
|
|
1657
|
-
type: boolean
|
|
1658
|
-
compile_duration_ms:
|
|
1659
|
-
type: number
|
|
1660
|
-
compile_errors:
|
|
1661
|
-
type: array
|
|
1662
|
-
items:
|
|
1663
|
-
type: object
|
|
1664
|
-
properties:
|
|
1665
|
-
text:
|
|
1666
|
-
type: string
|
|
1667
|
-
location:
|
|
1668
|
-
type: object
|
|
1669
|
-
properties:
|
|
1670
|
-
file:
|
|
1671
|
-
type: string
|
|
1672
|
-
line:
|
|
1673
|
-
type: number
|
|
1674
|
-
column:
|
|
1675
|
-
type: number
|
|
1676
|
-
required:
|
|
1677
|
-
- file
|
|
1678
|
-
- line
|
|
1679
|
-
- column
|
|
1680
|
-
additionalProperties: false
|
|
1681
|
-
required:
|
|
1682
|
-
- text
|
|
1683
|
-
additionalProperties: false
|
|
1684
|
-
compile_warnings:
|
|
1685
|
-
type: array
|
|
1686
|
-
items:
|
|
1687
|
-
type: object
|
|
1688
|
-
properties:
|
|
1689
|
-
text:
|
|
1690
|
-
type: string
|
|
1691
|
-
location:
|
|
1692
|
-
type: object
|
|
1693
|
-
properties:
|
|
1694
|
-
file:
|
|
1695
|
-
type: string
|
|
1696
|
-
line:
|
|
1697
|
-
type: number
|
|
1698
|
-
column:
|
|
1699
|
-
type: number
|
|
1700
|
-
required:
|
|
1701
|
-
- file
|
|
1702
|
-
- line
|
|
1703
|
-
- column
|
|
1704
|
-
additionalProperties: false
|
|
1705
|
-
required:
|
|
1706
|
-
- text
|
|
1707
|
-
additionalProperties: false
|
|
1708
|
-
required:
|
|
1709
|
-
- ok
|
|
1710
|
-
- appId
|
|
1711
|
-
- name
|
|
1712
|
-
- compiled
|
|
1713
|
-
- compile_duration_ms
|
|
1714
|
-
additionalProperties: false
|
|
1715
1583
|
/v1/apps/{id}/share-cloud:
|
|
1716
1584
|
post:
|
|
1717
1585
|
operationId: apps_by_id_sharecloud_post
|
|
@@ -5482,101 +5350,6 @@ paths:
|
|
|
5482
5350
|
responses:
|
|
5483
5351
|
"200":
|
|
5484
5352
|
description: Successful response
|
|
5485
|
-
/v1/channels/send:
|
|
5486
|
-
post:
|
|
5487
|
-
operationId: channels_send_post
|
|
5488
|
-
summary: Send text to a channel chat
|
|
5489
|
-
description: Deliver text to a chat on a channel through the channel's transport, recorded after the channel acknowledges it.
|
|
5490
|
-
tags:
|
|
5491
|
-
- channels
|
|
5492
|
-
requestBody:
|
|
5493
|
-
required: true
|
|
5494
|
-
content:
|
|
5495
|
-
application/json:
|
|
5496
|
-
schema:
|
|
5497
|
-
type: object
|
|
5498
|
-
properties:
|
|
5499
|
-
channel:
|
|
5500
|
-
type: string
|
|
5501
|
-
enum:
|
|
5502
|
-
- telegram
|
|
5503
|
-
- phone
|
|
5504
|
-
- vellum
|
|
5505
|
-
- whatsapp
|
|
5506
|
-
- slack
|
|
5507
|
-
- email
|
|
5508
|
-
- platform
|
|
5509
|
-
- a2a
|
|
5510
|
-
- discord
|
|
5511
|
-
- plugin
|
|
5512
|
-
description: Channel to send on
|
|
5513
|
-
target:
|
|
5514
|
-
type: object
|
|
5515
|
-
properties:
|
|
5516
|
-
kind:
|
|
5517
|
-
type: string
|
|
5518
|
-
const: chat
|
|
5519
|
-
chatId:
|
|
5520
|
-
type: string
|
|
5521
|
-
minLength: 1
|
|
5522
|
-
description: Chat id in the channel's own id space
|
|
5523
|
-
threadId:
|
|
5524
|
-
description: Thread within the chat, in the channel's own id space
|
|
5525
|
-
type: string
|
|
5526
|
-
minLength: 1
|
|
5527
|
-
required:
|
|
5528
|
-
- kind
|
|
5529
|
-
- chatId
|
|
5530
|
-
text:
|
|
5531
|
-
type: string
|
|
5532
|
-
minLength: 1
|
|
5533
|
-
description: Text to send
|
|
5534
|
-
renderRichly:
|
|
5535
|
-
description: Ask the channel for its rich rendering, where it has one
|
|
5536
|
-
type: boolean
|
|
5537
|
-
required:
|
|
5538
|
-
- channel
|
|
5539
|
-
- target
|
|
5540
|
-
- text
|
|
5541
|
-
responses:
|
|
5542
|
-
"200":
|
|
5543
|
-
description: Successful response
|
|
5544
|
-
content:
|
|
5545
|
-
application/json:
|
|
5546
|
-
schema:
|
|
5547
|
-
type: object
|
|
5548
|
-
properties:
|
|
5549
|
-
channel:
|
|
5550
|
-
type: string
|
|
5551
|
-
enum:
|
|
5552
|
-
- telegram
|
|
5553
|
-
- phone
|
|
5554
|
-
- vellum
|
|
5555
|
-
- whatsapp
|
|
5556
|
-
- slack
|
|
5557
|
-
- email
|
|
5558
|
-
- platform
|
|
5559
|
-
- a2a
|
|
5560
|
-
- discord
|
|
5561
|
-
- plugin
|
|
5562
|
-
chatId:
|
|
5563
|
-
type: string
|
|
5564
|
-
threadId:
|
|
5565
|
-
type: string
|
|
5566
|
-
messageIds:
|
|
5567
|
-
type: array
|
|
5568
|
-
items:
|
|
5569
|
-
type: string
|
|
5570
|
-
lastMessageId:
|
|
5571
|
-
type: string
|
|
5572
|
-
recordedIn:
|
|
5573
|
-
type: string
|
|
5574
|
-
required:
|
|
5575
|
-
- channel
|
|
5576
|
-
- chatId
|
|
5577
|
-
- messageIds
|
|
5578
|
-
- lastMessageId
|
|
5579
|
-
additionalProperties: false
|
|
5580
5353
|
/v1/clients:
|
|
5581
5354
|
get:
|
|
5582
5355
|
operationId: clients_get
|
|
@@ -11373,9 +11146,7 @@ paths:
|
|
|
11373
11146
|
post:
|
|
11374
11147
|
operationId: credentials_list_post
|
|
11375
11148
|
summary: List all credentials with metadata
|
|
11376
|
-
description:
|
|
11377
|
-
Return credentials from the live credential vault, with OAuth connection info and platform-managed
|
|
11378
|
-
credentials. Fails if the vault is unreachable.
|
|
11149
|
+
description: Return all stored credentials with metadata, OAuth connection info, and platform-managed credentials.
|
|
11379
11150
|
tags:
|
|
11380
11151
|
- credentials
|
|
11381
11152
|
requestBody:
|
|
@@ -11961,67 +11732,6 @@ paths:
|
|
|
11961
11732
|
required:
|
|
11962
11733
|
- defers
|
|
11963
11734
|
additionalProperties: false
|
|
11964
|
-
/v1/desktop/setup:
|
|
11965
|
-
get:
|
|
11966
|
-
operationId: desktop_setup_get
|
|
11967
|
-
summary: Get desktop setup status
|
|
11968
|
-
tags:
|
|
11969
|
-
- desktop
|
|
11970
|
-
responses:
|
|
11971
|
-
"200":
|
|
11972
|
-
description: Successful response
|
|
11973
|
-
content:
|
|
11974
|
-
application/json:
|
|
11975
|
-
schema:
|
|
11976
|
-
type: object
|
|
11977
|
-
properties:
|
|
11978
|
-
state:
|
|
11979
|
-
type: string
|
|
11980
|
-
enum:
|
|
11981
|
-
- required
|
|
11982
|
-
- installing
|
|
11983
|
-
- ready
|
|
11984
|
-
- failed
|
|
11985
|
-
- unsupported
|
|
11986
|
-
stage:
|
|
11987
|
-
type: string
|
|
11988
|
-
enum:
|
|
11989
|
-
- packages
|
|
11990
|
-
- chrome
|
|
11991
|
-
- checking
|
|
11992
|
-
required:
|
|
11993
|
-
- state
|
|
11994
|
-
additionalProperties: false
|
|
11995
|
-
post:
|
|
11996
|
-
operationId: desktop_setup_post
|
|
11997
|
-
summary: Install desktop components
|
|
11998
|
-
tags:
|
|
11999
|
-
- desktop
|
|
12000
|
-
responses:
|
|
12001
|
-
"200":
|
|
12002
|
-
description: Successful response
|
|
12003
|
-
content:
|
|
12004
|
-
application/json:
|
|
12005
|
-
schema:
|
|
12006
|
-
type: object
|
|
12007
|
-
properties:
|
|
12008
|
-
state:
|
|
12009
|
-
type: string
|
|
12010
|
-
enum:
|
|
12011
|
-
- required
|
|
12012
|
-
- installing
|
|
12013
|
-
- ready
|
|
12014
|
-
- failed
|
|
12015
|
-
- unsupported
|
|
12016
|
-
stage:
|
|
12017
|
-
type: string
|
|
12018
|
-
enum:
|
|
12019
|
-
- packages
|
|
12020
|
-
- chrome
|
|
12021
|
-
- checking
|
|
12022
|
-
required:
|
|
12023
|
-
- state
|
|
12024
|
-
additionalProperties: false
|
|
12025
11735
|
/v1/diagnostics/env-vars:
|
|
12026
11736
|
get:
|
|
12027
11737
|
operationId: diagnostics_envvars_get
|
package/package.json
CHANGED
|
@@ -26,7 +26,7 @@ afterAll(() => {
|
|
|
26
26
|
});
|
|
27
27
|
|
|
28
28
|
describe("always-loaded tool count", () => {
|
|
29
|
-
test("should be exactly
|
|
29
|
+
test("should be exactly 11 with recall occupying the existing slot", async () => {
|
|
30
30
|
await initializeTools();
|
|
31
31
|
const allDefs = getAllToolDefinitions();
|
|
32
32
|
|
|
@@ -44,31 +44,23 @@ describe("always-loaded tool count", () => {
|
|
|
44
44
|
);
|
|
45
45
|
const activeNames = activeTools.map((t) => t.name).sort();
|
|
46
46
|
|
|
47
|
-
//
|
|
48
|
-
//
|
|
49
|
-
//
|
|
50
|
-
//
|
|
51
|
-
//
|
|
52
|
-
//
|
|
53
|
-
//
|
|
54
|
-
//
|
|
47
|
+
// Host tools (host_bash, host_file_*) are excluded when no client is
|
|
48
|
+
// connected — without a human in the loop, the guardian auto-approve
|
|
49
|
+
// path would allow unchecked host command execution.
|
|
50
|
+
//
|
|
51
|
+
// `watch_retro_report` is here for the same reason the ui_surface tools are
|
|
52
|
+
// NOT: a watch retrospective runs clientless, so it can only report through
|
|
53
|
+
// a tool that survives this baseline. Its description and schema are kept
|
|
54
|
+
// deliberately terse because that is the cost of the slot.
|
|
55
55
|
const expectedNames = [
|
|
56
56
|
"bash",
|
|
57
57
|
"file_edit",
|
|
58
58
|
"file_read",
|
|
59
59
|
"file_write",
|
|
60
|
-
"host_bash",
|
|
61
|
-
"host_file_edit",
|
|
62
|
-
"host_file_read",
|
|
63
|
-
"host_file_transfer",
|
|
64
|
-
"host_file_write",
|
|
65
60
|
"recall",
|
|
66
61
|
"remember",
|
|
67
62
|
"skill_execute",
|
|
68
63
|
"skill_load",
|
|
69
|
-
"ui_dismiss",
|
|
70
|
-
"ui_show",
|
|
71
|
-
"ui_update",
|
|
72
64
|
"watch_retro_report",
|
|
73
65
|
"web_fetch",
|
|
74
66
|
"web_search",
|
|
@@ -76,6 +68,6 @@ describe("always-loaded tool count", () => {
|
|
|
76
68
|
|
|
77
69
|
expect(activeNames).toEqual(expectedNames);
|
|
78
70
|
expect(activeNames.filter((name) => name === "recall")).toHaveLength(1);
|
|
79
|
-
expect(activeTools.length).toBe(
|
|
71
|
+
expect(activeTools.length).toBe(11);
|
|
80
72
|
});
|
|
81
73
|
});
|
|
@@ -112,12 +112,6 @@ describe("compileApp", () => {
|
|
|
112
112
|
const html = await readFile(join(appDir, "dist", "index.html"), "utf-8");
|
|
113
113
|
expect(html).toContain('src="main.js"');
|
|
114
114
|
expect(html).toContain('type="module"');
|
|
115
|
-
|
|
116
|
-
const fingerprint = JSON.parse(
|
|
117
|
-
await readFile(join(appDir, "dist", ".source-fingerprint.json"), "utf-8"),
|
|
118
|
-
) as { algorithm: string; files: Record<string, string> };
|
|
119
|
-
expect(fingerprint.algorithm).toBe("sha256");
|
|
120
|
-
expect(fingerprint.files["src/main.tsx"]).toMatch(/^[0-9a-f]{64}$/);
|
|
121
115
|
});
|
|
122
116
|
|
|
123
117
|
test("compiles preact JSX correctly", async () => {
|
|
@@ -591,11 +591,8 @@ describe("forwardAppControlProxyTool", () => {
|
|
|
591
591
|
ctx,
|
|
592
592
|
);
|
|
593
593
|
expect(result.isError).toBe(true);
|
|
594
|
-
expect(result.content).toContain(
|
|
595
|
-
|
|
596
|
-
);
|
|
597
|
-
expect(result.content).toContain("https://www.vellum.ai/downloads");
|
|
598
|
-
expect(result.content).not.toContain("app_control_click");
|
|
594
|
+
expect(result.content).toContain("no proxy resolver available");
|
|
595
|
+
expect(result.content).toContain("app_control_click");
|
|
599
596
|
});
|
|
600
597
|
|
|
601
598
|
test("delegates to proxy resolver when available", async () => {
|
|
@@ -9,13 +9,15 @@ import { describe, expect, test } from "bun:test";
|
|
|
9
9
|
* This prevents regressions where new code bypasses the dirName-based path
|
|
10
10
|
* resolution and constructs UUID-based paths directly.
|
|
11
11
|
*
|
|
12
|
-
* Allowlist: only app-store.ts itself
|
|
12
|
+
* Allowlist: only app-store.ts itself, app-source-watcher.ts (uses getAppsDir
|
|
13
|
+
* for the fs.watch root, not for per-app paths), and workspace migrations
|
|
13
14
|
* (self-contained, don't import from app-store).
|
|
14
15
|
*/
|
|
15
16
|
|
|
16
17
|
/** Files that are permitted to import getAppsDir. */
|
|
17
18
|
const ALLOWLIST = new Set([
|
|
18
19
|
"assistant/src/apps/app-store.ts", // defines getAppsDir
|
|
20
|
+
"assistant/src/daemon/app-source-watcher.ts", // uses getAppsDir for recursive fs.watch root, not per-app paths
|
|
19
21
|
"assistant/src/tools/filesystem/write.ts", // uses getAppsDir as an exemption root for the artifact-HTML guard, not per-app paths
|
|
20
22
|
]);
|
|
21
23
|
|