@vellumai/assistant 0.11.6 → 0.11.7-staging.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +31 -19
- package/Dockerfile +1 -0
- package/docs/architecture/security.md +3 -3
- package/docs/flux-turn-detection-spike.md +8 -7
- package/docs/runbook-trusted-contacts.md +14 -0
- package/docs/stt-provider-onboarding.md +8 -4
- package/knip.json +1 -0
- package/node_modules/@vellumai/avatar-manifest/package.json +18 -0
- package/node_modules/@vellumai/avatar-manifest/src/__tests__/manifest.test.ts +173 -0
- package/node_modules/@vellumai/avatar-manifest/src/__tests__/read.test.ts +114 -0
- package/node_modules/@vellumai/avatar-manifest/src/index.ts +29 -0
- package/node_modules/@vellumai/avatar-manifest/src/layout.ts +18 -0
- package/node_modules/@vellumai/avatar-manifest/src/manifest.ts +156 -0
- package/node_modules/@vellumai/avatar-manifest/src/read.ts +109 -0
- package/node_modules/@vellumai/avatar-manifest/tsconfig.json +20 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/ingress.test.ts +37 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/remote-web-pairing.test.ts +389 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/ingress.ts +22 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/remote-web-pairing.ts +508 -18
- package/node_modules/@vellumai/environments/package.json +2 -1
- package/node_modules/@vellumai/environments/src/shell.test.ts +56 -0
- package/node_modules/@vellumai/environments/src/shell.ts +65 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/ingress.test.ts +37 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/remote-web-pairing.test.ts +389 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/ingress.ts +22 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/remote-web-pairing.ts +508 -18
- package/node_modules/@vellumai/gateway-client/src/__tests__/contact-read-contracts.test.ts +32 -0
- package/node_modules/@vellumai/gateway-client/src/__tests__/gateway-client.test.ts +1 -0
- package/node_modules/@vellumai/gateway-client/src/__tests__/inbound-event-kind.test.ts +82 -0
- package/node_modules/@vellumai/gateway-client/src/__tests__/plugin-admission-denied-contract.test.ts +56 -0
- package/node_modules/@vellumai/gateway-client/src/__tests__/trust-verdict-contract.test.ts +18 -0
- package/node_modules/@vellumai/gateway-client/src/admission-policy-contract.ts +5 -11
- package/node_modules/@vellumai/gateway-client/src/channel-permission-contract.ts +3 -1
- package/node_modules/@vellumai/gateway-client/src/gateway-ipc-contracts.ts +9 -0
- package/node_modules/@vellumai/gateway-client/src/inbound-contract.ts +4 -0
- package/node_modules/@vellumai/gateway-client/src/inbound-event-kind.ts +75 -0
- package/node_modules/@vellumai/gateway-client/src/index.ts +17 -0
- package/node_modules/@vellumai/gateway-client/src/outbound-contract.ts +8 -0
- package/node_modules/@vellumai/gateway-client/src/plugin-admission-denied-contract.ts +47 -0
- package/node_modules/@vellumai/gateway-client/src/trust-verdict-contract.ts +11 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/ingress.test.ts +37 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/remote-web-pairing.test.ts +389 -0
- package/node_modules/@vellumai/service-contracts/src/ingress.ts +22 -0
- package/node_modules/@vellumai/service-contracts/src/remote-web-pairing.ts +508 -18
- package/openapi.yaml +419 -55
- package/package.json +4 -1
- package/src/__tests__/approval-card-edit-inbound-handoff.test.ts +199 -0
- package/src/__tests__/approval-card-edit.test.ts +153 -0
- package/src/__tests__/attachments-store-heic-normalize.test.ts +1 -1
- package/src/__tests__/available-skills.test.ts +54 -0
- package/src/__tests__/avatar-identity-sync.test.ts +5 -1
- package/src/__tests__/catalog-install-normalize.test.ts +9 -1
- package/src/__tests__/channel-policy.test.ts +1 -3
- package/src/__tests__/channel-readiness-discord.test.ts +9 -70
- package/src/__tests__/compactor-call-site-logging.test.ts +61 -0
- package/src/__tests__/config-loader-backfill.test.ts +69 -0
- package/src/__tests__/config-schema.test.ts +2 -3
- package/src/__tests__/conversation-agent-loop.test.ts +238 -0
- package/src/__tests__/conversation-attachments.test.ts +0 -1
- package/src/__tests__/conversation-error.test.ts +44 -0
- package/src/__tests__/conversation-evictor.test.ts +19 -0
- package/src/__tests__/conversation-fork-referential.test.ts +73 -63
- package/src/__tests__/conversation-fork-retrospective.test.ts +99 -74
- package/src/__tests__/conversation-runtime-assembly.test.ts +23 -0
- package/src/__tests__/conversation-slash.test.ts +9 -0
- package/src/__tests__/conversation-title-service.test.ts +97 -0
- package/src/__tests__/conversation-tool-setup-attribution.test.ts +16 -0
- package/src/__tests__/credential-broker-server-use.test.ts +0 -218
- package/src/__tests__/credential-broker.test.ts +43 -420
- package/src/__tests__/credential-routes.test.ts +17 -1
- package/src/__tests__/credential-security-invariants.test.ts +8 -9
- package/src/__tests__/default-profile-catalog-fallback.test.ts +289 -0
- package/src/__tests__/discord-callback-round-trip.test.ts +93 -0
- package/src/__tests__/discord-channel-config.test.ts +237 -0
- package/src/__tests__/evict-conversations-for-reload.test.ts +51 -1
- package/src/__tests__/fallback-breaker.test.ts +1335 -0
- package/src/__tests__/gateway-threshold-reader-mock.ts +6 -0
- package/src/__tests__/guardian-card-withdrawal.test.ts +30 -0
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +0 -2
- package/src/__tests__/image-conversion.test.ts +38 -4
- package/src/__tests__/install-skill-routing.test.ts +25 -0
- package/src/__tests__/llm-resolver.test.ts +74 -0
- package/src/__tests__/llm-schema-fallback-profile.test.ts +359 -0
- package/src/__tests__/managed-fallback-dispatch.test.ts +430 -0
- package/src/__tests__/managed-profile-guard.test.ts +28 -0
- package/src/__tests__/managed-speech-defaults.test.ts +196 -1
- package/src/__tests__/mcp-cli.test.ts +23 -1
- package/src/__tests__/mcp-tool-annotations-risk.test.ts +43 -34
- package/src/__tests__/media-stream-stt-session.test.ts +2 -0
- package/src/__tests__/notification-decision-fallback.test.ts +106 -0
- package/src/__tests__/notification-discord-adapter.test.ts +162 -0
- package/src/__tests__/persist-unsendable-image-downscale.test.ts +6 -8
- package/src/__tests__/persist-unsendable-image.test.ts +3 -3
- package/src/__tests__/platform.test.ts +19 -1
- package/src/__tests__/plugin-import-boundary-guard.test.ts +5 -1
- package/src/__tests__/provider-usage-tracking.test.ts +56 -0
- package/src/__tests__/require-fresh-approval.test.ts +5 -2
- package/src/__tests__/retry-fallback-escalation.test.ts +1093 -0
- package/src/__tests__/schedule-retry.test.ts +183 -4
- package/src/__tests__/scheduler-reuse-conversation.test.ts +6 -6
- package/src/__tests__/secret-routes-platform-proxy.test.ts +55 -0
- package/src/__tests__/skill-load-tool.test.ts +34 -0
- package/src/__tests__/skill-tool-factory.test.ts +6 -1
- package/src/__tests__/skill-tool-manifest.test.ts +20 -0
- package/src/__tests__/skills.test.ts +25 -0
- package/src/__tests__/subagent-manager-notify.test.ts +38 -0
- package/src/__tests__/terminal-tools.test.ts +2 -0
- package/src/__tests__/tool-approval-handler.test.ts +146 -2
- package/src/__tests__/tool-approval-seed-content-blocks.test.ts +108 -2
- package/src/__tests__/tool-audit.test.ts +111 -40
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +228 -18
- package/src/__tests__/ui-shape-teaching.test.ts +1 -1
- package/src/__tests__/verification-control-plane-policy.test.ts +6 -2
- package/src/__tests__/voice-config-update.test.ts +43 -0
- package/src/__tests__/workspace-migration-147-rename-colliding-backup-profile-names.test.ts +480 -0
- package/src/__tests__/workspace-migration-148-strip-unsupported-fallback-profiles.test.ts +167 -0
- package/src/__tests__/workspace-migration-149-repoint-backup-profile-selections.test.ts +144 -0
- package/src/agent/loop.ts +31 -2
- package/src/approvals/guardian-card-withdrawal.ts +22 -0
- package/src/avatar/__tests__/ensure-raster.test.ts +291 -0
- package/src/avatar/avatar-manifest.ts +48 -100
- package/src/avatar/avatar-store.ts +7 -7
- package/src/avatar/ensure-raster.ts +146 -0
- package/src/avatar/resvg-lazy.test.ts +0 -1
- package/src/avatar/traits-png-sync.ts +9 -10
- package/src/background-wake/wake-intent-hooks.test.ts +0 -1
- package/src/backup/__tests__/paths.test.ts +6 -2
- package/src/backup/paths.ts +6 -4
- package/src/bundler/app-compiler.ts +2 -2
- package/src/bundler/compiler-tools.test.ts +36 -0
- package/src/bundler/compiler-tools.ts +54 -18
- package/src/calls/__tests__/telephony-synthesis-language.test.ts +81 -0
- package/src/calls/__tests__/voice-session-bridge.test.ts +20 -0
- package/src/calls/media-stream-stt-session.ts +2 -1
- package/src/calls/telephony-synthesis-language.ts +13 -5
- package/src/calls/voice-session-bridge.ts +6 -4
- package/src/channels/config.ts +23 -12
- package/src/cli/AGENTS.md +3 -1
- package/src/cli/commands/backup.help.ts +10 -13
- package/src/cli/commands/contacts.help.ts +16 -4
- package/src/cli/commands/contacts.ts +5 -1
- package/src/cli/commands/credentials.help.ts +1 -1
- package/src/cli/commands/inference-providers.ts +18 -53
- package/src/cli/commands/mcp.help.ts +6 -5
- package/src/cli/commands/mcp.ts +1 -1
- package/src/cli/commands/memory/memory-retrospective.ts +1 -0
- package/src/cli/commands/stt.help.ts +2 -2
- package/src/config/__tests__/backup-schema.test.ts +1 -1
- package/src/config/__tests__/default-profile-catalog.test.ts +83 -2
- package/src/config/__tests__/loader-sparse-array-cleanup.test.ts +1 -1
- package/src/config/__tests__/memory-retrospective-schema.test.ts +12 -15
- package/src/config/bundled-skills/computer-use/SKILL.md +6 -6
- package/src/config/bundled-skills/computer-use/TOOLS.json +9 -6
- package/src/config/bundled-skills/media-processing/services/audio-transcribe.ts +3 -1
- package/src/config/bundled-skills/media-processing/services/preprocess.ts +1 -1
- package/src/config/bundled-skills/phone-calls/SKILL.md +1 -1
- package/src/config/bundled-skills/phone-calls/references/CONFIG.md +16 -15
- package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +2 -1
- package/src/config/bundled-skills/settings/TOOLS.json +11 -5
- package/src/config/bundled-skills/settings/tools/open-system-settings.test.ts +85 -0
- package/src/config/bundled-skills/settings/tools/open-system-settings.ts +33 -8
- package/src/config/bundled-skills/settings/tools/voice-config-update.ts +54 -3
- package/src/config/bundled-skills/transcribe/tools/transcribe-media.ts +1 -1
- package/src/config/default-profile-catalog.ts +195 -10
- package/src/config/default-profile-names.ts +41 -0
- package/src/config/feature-flag-registry.json +18 -2
- package/src/config/inference-profile-validation.ts +11 -2
- package/src/config/llm-resolver.ts +25 -0
- package/src/config/loader.ts +3 -0
- package/src/config/managed-speech-defaults.ts +160 -10
- package/src/config/schema.ts +2 -0
- package/src/config/schemas/__tests__/live-voice.test.ts +7 -6
- package/src/config/schemas/__tests__/stt.test.ts +94 -0
- package/src/config/schemas/backup.ts +1 -1
- package/src/config/schemas/channels.ts +32 -0
- package/src/config/schemas/live-voice.ts +13 -4
- package/src/config/schemas/llm.ts +259 -11
- package/src/config/schemas/mcp.ts +10 -2
- package/src/config/schemas/memory-retrospective.ts +1 -19
- package/src/config/schemas/services.ts +24 -0
- package/src/config/schemas/stt.ts +128 -5
- package/src/config/seed-inference-profiles.ts +32 -3
- package/src/config/skill-state.ts +5 -0
- package/src/config/skills.ts +21 -0
- package/src/contacts/notify-contacts-changed.ts +5 -2
- package/src/context/compactor.ts +74 -1
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +138 -1
- package/src/daemon/config-watcher.ts +2 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +27 -0
- package/src/daemon/conversation-agent-loop.ts +86 -10
- package/src/daemon/conversation-error.ts +25 -0
- package/src/daemon/conversation-evictor.ts +2 -4
- package/src/daemon/conversation-runtime-assembly.ts +19 -7
- package/src/daemon/conversation-skill-tools.ts +5 -1
- package/src/daemon/conversation-slash.ts +2 -2
- package/src/daemon/conversation-store.ts +8 -1
- package/src/daemon/conversation-tool-setup.ts +37 -0
- package/src/daemon/conversation.ts +0 -4
- package/src/daemon/handlers/channel-config-result.ts +30 -0
- package/src/daemon/handlers/config-discord-channel.ts +301 -0
- package/src/daemon/handlers/config-ingress.ts +9 -0
- package/src/daemon/handlers/config-slack-channel.ts +13 -15
- package/src/daemon/handlers/config-telegram.ts +2 -5
- package/src/daemon/handlers/conversations.ts +0 -2
- package/src/daemon/handlers/skills.ts +25 -7
- package/src/daemon/lifecycle.ts +3 -1
- package/src/daemon/message-types/messages.ts +0 -2
- package/src/daemon/tool-setup-types.ts +5 -3
- package/src/daemon/trust-context-types.test.ts +33 -0
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +0 -1
- package/src/live-voice/__tests__/live-voice-flux-turn-end.test.ts +58 -4
- package/src/live-voice/__tests__/live-voice-managed-speech-fallback.test.ts +8 -3
- package/src/live-voice/__tests__/live-voice-session-manager.test.ts +73 -11
- package/src/live-voice/__tests__/live-voice-session-preflight.test.ts +148 -2
- package/src/live-voice/__tests__/live-voice-stt.test.ts +3 -0
- package/src/live-voice/__tests__/live-voice-text-turn.test.ts +391 -0
- package/src/live-voice/__tests__/protocol.test.ts +224 -0
- package/src/live-voice/live-voice-credential-preflight.ts +5 -1
- package/src/live-voice/live-voice-session-manager.ts +39 -2
- package/src/live-voice/live-voice-session.ts +213 -8
- package/src/live-voice/protocol.ts +187 -1
- package/src/messaging/providers/discord/api.ts +2 -1
- package/src/messaging/providers/discord/withdraw.ts +62 -0
- package/src/monitoring/__tests__/file-descriptors.test.ts +32 -0
- package/src/monitoring/__tests__/process-memory.test.ts +34 -1
- package/src/monitoring/db-integrity-sample.ts +1 -0
- package/src/monitoring/file-descriptors.ts +39 -6
- package/src/monitoring/process-memory.ts +37 -5
- package/src/monitoring/resource-sampler.ts +25 -8
- package/src/notifications/__tests__/activity-failed-dedupe.test.ts +161 -0
- package/src/notifications/__tests__/background-failure-signal.test.ts +107 -0
- package/src/notifications/__tests__/connected-channels.test.ts +12 -0
- package/src/notifications/__tests__/copy-composer.test.ts +83 -0
- package/src/notifications/__tests__/destination-resolver.test.ts +38 -0
- package/src/notifications/activity-failed-dedupe.ts +95 -0
- package/src/notifications/adapters/discord.ts +132 -0
- package/src/notifications/adapters/shared.ts +16 -0
- package/src/notifications/adapters/slack.ts +6 -1
- package/src/notifications/adapters/telegram.ts +5 -8
- package/src/notifications/approval-card-data.ts +94 -1
- package/src/notifications/background-failure-signal.ts +116 -0
- package/src/notifications/broadcaster.ts +3 -9
- package/src/notifications/copy-composer.ts +41 -8
- package/src/notifications/decision-engine.ts +55 -0
- package/src/notifications/destination-resolver.ts +45 -5
- package/src/notifications/emit-signal.ts +19 -5
- package/src/notifications/guardian-question-mode.ts +57 -0
- package/src/notifications/types.ts +2 -8
- package/src/oauth/__tests__/seed-providers-managed.test.ts +18 -0
- package/src/oauth/seed-providers.ts +261 -0
- package/src/permissions/checker.test.ts +21 -0
- package/src/permissions/checker.ts +6 -0
- package/src/permissions/gateway-threshold-reader.test.ts +184 -0
- package/src/permissions/gateway-threshold-reader.ts +144 -10
- package/src/permissions/prompter.ts +0 -6
- package/src/permissions/types.ts +5 -4
- package/src/persistence/__tests__/bulk-write-gate.test.ts +0 -38
- package/src/persistence/bulk-write-gate.ts +9 -10
- package/src/persistence/conversation-crud.ts +85 -133
- package/src/persistence/conversation-title-service.ts +43 -29
- package/src/persistence/embeddings/embedding-local.ts +14 -85
- package/src/persistence/embeddings/embedding-runtime-manager.ts +1 -0
- package/src/persistence/lifecycle-events-store.test.ts +50 -0
- package/src/persistence/lifecycle-events-store.ts +75 -5
- package/src/platform/platform-patch-queue.test.ts +368 -0
- package/src/platform/platform-patch-queue.ts +190 -0
- package/src/platform/sync-avatar.test.ts +527 -0
- package/src/platform/sync-avatar.ts +209 -0
- package/src/platform/sync-identity.test.ts +75 -0
- package/src/platform/sync-identity.ts +17 -110
- package/src/plugin-api/model-profiles.test.ts +2 -2
- package/src/plugin-api/model-profiles.ts +7 -7
- package/src/plugin-api/transcription-session.ts +1 -1
- package/src/plugins/defaults/compaction/window-manager.ts +4 -0
- package/src/plugins/defaults/image-recovery/recover.ts +2 -2
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +133 -34
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-prompt.test.ts +21 -31
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-provider-path.test.ts +13 -9
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-wake-chain.test.ts +31 -4
- package/src/plugins/defaults/memory/memory-retrospective-constants.ts +0 -11
- package/src/plugins/defaults/memory/memory-retrospective-fork-boundary.ts +27 -13
- package/src/plugins/defaults/memory/memory-retrospective-job.ts +183 -113
- package/src/plugins/defaults/memory/memory-retrospective-prompt.ts +13 -13
- package/src/plugins/defaults/memory/src/memory-v2-routes.ts +2 -2
- package/src/plugins/defaults/memory/substrate/__tests__/consolidation-job.test.ts +1 -1
- package/src/plugins/defaults/memory/substrate/consolidation-job.ts +4 -2
- package/src/plugins/defaults/memory/substrate/sweep-job.ts +9 -42
- package/src/plugins/defaults/memory/v2/rerank-local.ts +1 -0
- package/src/plugins/defaults/memory/worker.ts +7 -0
- package/src/providers/__tests__/retry-callsite.test.ts +55 -0
- package/src/providers/connection-resolution.ts +2 -17
- package/src/providers/fallback-breaker.ts +389 -0
- package/src/providers/inference/__tests__/adapter-factory-opencode.test.ts +92 -0
- package/src/providers/inference/__tests__/base-url-route-validation.test.ts +16 -0
- package/src/providers/inference/__tests__/base-url-security.test.ts +12 -0
- package/src/providers/inference/adapter-factory.ts +231 -3
- package/src/providers/inference/auth.ts +1 -0
- package/src/providers/inference/chatgpt-subscription-auth.ts +70 -0
- package/src/providers/inference/chatgpt-subscription-credentials.ts +84 -0
- package/src/providers/inference/resolve-auth.ts +1 -1
- package/src/providers/media-resolve.ts +2 -3
- package/src/providers/model-catalog.ts +75 -0
- package/src/providers/openai/__tests__/api-error-normalization.test.ts +22 -0
- package/src/providers/openai/__tests__/chat-template-flatten.test.ts +198 -0
- package/src/providers/openai/api-error-normalization.ts +13 -0
- package/src/providers/openai/chat-completions-provider.ts +84 -0
- package/src/providers/opencode/client.test.ts +150 -0
- package/src/providers/opencode/client.ts +61 -0
- package/src/providers/provider-resolvability.ts +20 -0
- package/src/providers/retry.ts +956 -68
- package/src/providers/speech-to-text/__tests__/deepgram-flux-frames.test.ts +42 -0
- package/src/providers/speech-to-text/__tests__/deepgram-flux-realtime.test.ts +136 -0
- package/src/providers/speech-to-text/__tests__/provider-catalog.test.ts +120 -0
- package/src/providers/speech-to-text/__tests__/resolve.test.ts +316 -12
- package/src/providers/speech-to-text/deepgram-flux-frames.ts +83 -3
- package/src/providers/speech-to-text/deepgram-flux-realtime.ts +132 -4
- package/src/providers/speech-to-text/provider-catalog.ts +191 -3
- package/src/providers/speech-to-text/resolve.ts +132 -24
- package/src/providers/speech-to-text/vellum-managed-flux-realtime.ts +296 -0
- package/src/providers/types.ts +39 -0
- package/src/providers/usage-tracking.ts +12 -1
- package/src/runtime/AGENTS.md +1 -2
- package/src/runtime/__tests__/agent-wake.test.ts +105 -3
- package/src/runtime/__tests__/background-job-runner.test.ts +89 -3
- package/src/runtime/agent-wake.ts +44 -5
- package/src/runtime/background-job-runner.ts +68 -50
- package/src/runtime/channel-readiness-service.ts +0 -39
- package/src/runtime/http-server.ts +12 -4
- package/src/runtime/routes/__tests__/avatar-state-routes.test.ts +18 -18
- package/src/runtime/routes/__tests__/backup-routes.test.ts +9 -5
- package/src/runtime/routes/__tests__/chatgpt-subscription-auth-routes.test.ts +372 -0
- package/src/runtime/routes/__tests__/contact-routes.test.ts +7 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +96 -0
- package/src/runtime/routes/__tests__/inference-profiles-routes.test.ts +37 -0
- package/src/runtime/routes/__tests__/ingress-status-routes.test.ts +2 -1
- package/src/runtime/routes/__tests__/mcp-add-default-risk.test.ts +87 -0
- package/src/runtime/routes/acp-claude-auth-routes.ts +25 -54
- package/src/runtime/routes/approval-routes.ts +0 -12
- package/src/runtime/routes/avatar-routes.ts +17 -30
- package/src/runtime/routes/backup-routes.ts +2 -2
- package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +296 -113
- package/src/runtime/routes/contact-prompt-routes.ts +65 -6
- package/src/runtime/routes/contact-routes.ts +20 -15
- package/src/runtime/routes/conversation-query-routes.ts +98 -10
- package/src/runtime/routes/conversation-routes.ts +2 -2
- package/src/runtime/routes/credential-routes.ts +2 -1
- package/src/runtime/routes/guardian-approval-interception.ts +12 -9
- package/src/runtime/routes/inbound-message-handler.ts +21 -9
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +18 -13
- package/src/runtime/routes/inbound-stages/admission-policy.ts +2 -2
- package/src/runtime/routes/inbound-stages/reaction-intercept.ts +9 -8
- package/src/runtime/routes/inbound-stages/transcribe-audio.ts +1 -1
- package/src/runtime/routes/index.ts +2 -0
- package/src/runtime/routes/inference-profile-session-handler.ts +2 -2
- package/src/runtime/routes/inference-profiles-routes.ts +12 -7
- package/src/runtime/routes/inference-provider-connection-routes.ts +2 -2
- package/src/runtime/routes/inference-send-routes.ts +2 -2
- package/src/runtime/routes/ingress-status-routes.ts +2 -2
- package/src/runtime/routes/integrations/discord.ts +119 -0
- package/src/runtime/routes/llm-call-sites-routes.ts +2 -2
- package/src/runtime/routes/mcp-auth-routes.ts +12 -6
- package/src/runtime/routes/oauth-pending-flows.ts +136 -0
- package/src/runtime/routes/secret-routes.ts +7 -0
- package/src/runtime/routes/stt-routes.ts +38 -6
- package/src/runtime/routes/wake-conversation-routes.ts +8 -1
- package/src/runtime/routes/watch-routes.ts +9 -5
- package/src/runtime/sync/resource-sync-events.ts +2 -0
- package/src/runtime/trust-verdict-consumer.ts +3 -3
- package/src/schedule/__tests__/worker-feature-flags.test.ts +58 -0
- package/src/schedule/retry-policy.ts +8 -8
- package/src/schedule/run-script.ts +14 -23
- package/src/schedule/schedule-recovery.ts +0 -1
- package/src/schedule/scheduler.ts +89 -51
- package/src/schedule/worker.ts +57 -0
- package/src/security/__tests__/openai-device-auth.test.ts +355 -0
- package/src/security/oauth2.ts +7 -0
- package/src/security/openai-device-auth.ts +364 -0
- package/src/skills/available-skills.ts +10 -1
- package/src/skills/catalog-install.ts +19 -1
- package/src/skills/inline-command-runner.ts +6 -2
- package/src/skills/platform-compatibility.test.ts +49 -0
- package/src/skills/platform-compatibility.ts +65 -0
- package/src/skills/tool-manifest.ts +20 -0
- package/src/stt/__tests__/roles.test.ts +152 -0
- package/src/stt/daemon-batch-transcriber.ts +4 -1
- package/src/stt/roles.ts +180 -0
- package/src/stt/stt-stream-session.ts +3 -2
- package/src/stt/types.ts +33 -3
- package/src/subagent/manager.ts +12 -0
- package/src/telemetry/__tests__/live-voice-funnel.test.ts +34 -0
- package/src/telemetry/live-voice-funnel.ts +12 -2
- package/src/telemetry/telemetry-wire.generated.ts +6 -0
- package/src/telemetry/tool-audit.ts +83 -30
- package/src/telemetry/tool-executed-events-store.test.ts +0 -1
- package/src/telemetry/turn-outcome.ts +75 -4
- package/src/tools/client-os.ts +115 -0
- package/src/tools/computer-use/definitions.ts +11 -7
- package/src/tools/computer-use/skill-proxy-bridge.ts +2 -2
- package/src/tools/credentials/broker-types.ts +0 -71
- package/src/tools/credentials/broker.ts +6 -201
- package/src/tools/executor.ts +2 -8
- package/src/tools/host-shell.test.ts +75 -0
- package/src/tools/host-shell.ts +24 -0
- package/src/tools/host-terminal/host-shell.ts +15 -44
- package/src/tools/mcp/mcp-tool-factory.ts +44 -9
- package/src/tools/permission-checker.ts +73 -21
- package/src/tools/policy-context.ts +1 -0
- package/src/tools/shared/filesystem/image-read.ts +1 -1
- package/src/tools/skills/find-similar-skills.ts +10 -2
- package/src/tools/skills/load.ts +41 -6
- package/src/tools/skills/sandbox-runner.ts +8 -16
- package/src/tools/skills/skill-tool-factory.ts +1 -0
- package/src/tools/terminal/__tests__/safe-env.test.ts +64 -1
- package/src/tools/terminal/safe-env.ts +39 -9
- package/src/tools/terminal/shell.ts +12 -31
- package/src/tools/tool-approval-handler.ts +64 -10
- package/src/tools/tool-types.ts +10 -0
- package/src/tools/types.ts +19 -3
- package/src/tools/ui-surface/surface-shape-docs.ts +4 -3
- package/src/tools/workflows/manage-workflows.ts +2 -2
- package/src/tools/workflows/run-workflow.test.ts +2 -1
- package/src/util/__tests__/file-use.test.ts +61 -0
- package/src/util/__tests__/process-table.test.ts +66 -0
- package/src/util/__tests__/process-tree.test.ts +46 -0
- package/src/util/errors.ts +1 -0
- package/src/util/file-use.ts +91 -0
- package/src/util/host-process.test.ts +17 -0
- package/src/util/host-process.ts +75 -0
- package/src/util/image-conversion.ts +39 -7
- package/src/util/platform.ts +32 -13
- package/src/util/process-table.ts +249 -0
- package/src/util/process-tree.ts +85 -129
- package/src/util/provider-error-patterns.ts +20 -0
- package/src/util/spawn.ts +9 -2
- package/src/workspace/git-service.ts +4 -14
- package/src/workspace/migrations/147-rename-colliding-backup-profile-names.ts +360 -0
- package/src/workspace/migrations/148-strip-unsupported-fallback-profiles.ts +117 -0
- package/src/workspace/migrations/149-repoint-backup-profile-selections.ts +204 -0
- package/src/workspace/migrations/150-stt-flux-provider-to-model-family.ts +139 -0
- package/src/workspace/migrations/__tests__/150-stt-flux-provider-to-model-family.test.ts +160 -0
- package/src/workspace/migrations/registry.ts +8 -0
- package/src/__tests__/permission-types.test.ts +0 -17
- package/src/channels/gateway-discord-admission.ts +0 -32
- package/src/persistence/fork-message-copy.ts +0 -239
- package/src/plugins/defaults/memory/__tests__/fork-message-copy.test.ts +0 -221
- package/src/security/__tests__/oauth2-device-code.test.ts +0 -431
- package/src/security/oauth2-device-code.ts +0 -312
|
@@ -46,6 +46,8 @@ import {
|
|
|
46
46
|
import { getLogger } from "../../util/logger.js";
|
|
47
47
|
import { ACTOR_PRINCIPALS } from "../auth/route-policy.js";
|
|
48
48
|
import { BadRequestError, NotFoundError } from "./errors.js";
|
|
49
|
+
import type { PendingFlowStatus } from "./oauth-pending-flows.js";
|
|
50
|
+
import { createPendingFlowRegistry } from "./oauth-pending-flows.js";
|
|
49
51
|
import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
|
|
50
52
|
|
|
51
53
|
const log = getLogger("acp-claude-auth");
|
|
@@ -58,53 +60,24 @@ const CLAUDE_LOOPBACK_CALLBACK_PATH = "/callback";
|
|
|
58
60
|
// Pending-flow tracking (shared by the loopback + manual/cloud branches)
|
|
59
61
|
// ---------------------------------------------------------------------------
|
|
60
62
|
|
|
61
|
-
type FlowStatus = "pending" | "connected" | "error";
|
|
62
|
-
|
|
63
|
-
interface PendingFlow {
|
|
64
|
-
status: FlowStatus;
|
|
65
|
-
error?: string;
|
|
66
|
-
createdAt: number;
|
|
67
|
-
/**
|
|
68
|
-
* Cloud/manual path only: the PKCE verifier + redirect the pasted code is
|
|
69
|
-
* exchanged with. Absent on loopback flows (the daemon exchanges those
|
|
70
|
-
* itself), which also keeps loopback entries from being exchangeable via the
|
|
71
|
-
* manual `exchange` route.
|
|
72
|
-
*/
|
|
73
|
-
codeVerifier?: string;
|
|
74
|
-
redirectUri?: string;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
63
|
interface StartResponse {
|
|
78
64
|
mode: "loopback" | "manual";
|
|
79
65
|
authorize_url: string;
|
|
80
66
|
state: string;
|
|
81
67
|
}
|
|
82
68
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
pendingFlows.delete(state);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
69
|
+
/**
|
|
70
|
+
* The extra state a manual/cloud flow carries: the PKCE verifier + redirect the
|
|
71
|
+
* pasted code is exchanged with. Absent on loopback flows (the daemon exchanges
|
|
72
|
+
* those itself), which also keeps loopback entries from being exchangeable via
|
|
73
|
+
* the manual `exchange` route.
|
|
74
|
+
*/
|
|
75
|
+
interface ClaudeFlowState {
|
|
76
|
+
codeVerifier?: string;
|
|
77
|
+
redirectUri?: string;
|
|
95
78
|
}
|
|
96
79
|
|
|
97
|
-
|
|
98
|
-
function markFlow(state: string, status: FlowStatus, error?: string): void {
|
|
99
|
-
const flow = pendingFlows.get(state);
|
|
100
|
-
if (!flow) {
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
flow.status = status;
|
|
104
|
-
if (error !== undefined) {
|
|
105
|
-
flow.error = error;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
80
|
+
const pendingFlows = createPendingFlowRegistry<ClaudeFlowState>();
|
|
108
81
|
|
|
109
82
|
// ---------------------------------------------------------------------------
|
|
110
83
|
// Handlers
|
|
@@ -125,7 +98,7 @@ function markFlow(state: string, status: FlowStatus, error?: string): void {
|
|
|
125
98
|
* asked to serve them.
|
|
126
99
|
*/
|
|
127
100
|
async function handleStartAuth(args: RouteHandlerArgs): Promise<StartResponse> {
|
|
128
|
-
|
|
101
|
+
pendingFlows.cleanupExpired();
|
|
129
102
|
|
|
130
103
|
const preferManual = Boolean(
|
|
131
104
|
(args.body as { preferManual?: boolean } | undefined)?.preferManual,
|
|
@@ -146,7 +119,7 @@ async function handleStartLocalAuth(): Promise<StartResponse> {
|
|
|
146
119
|
loopbackCallbackPath: CLAUDE_LOOPBACK_CALLBACK_PATH,
|
|
147
120
|
});
|
|
148
121
|
|
|
149
|
-
pendingFlows.
|
|
122
|
+
pendingFlows.start(flow.state, {});
|
|
150
123
|
|
|
151
124
|
// The capture + token exchange happen inside `completion`; persist the token
|
|
152
125
|
// when it resolves and flip the flow status so the web client's status poll
|
|
@@ -154,12 +127,12 @@ async function handleStartLocalAuth(): Promise<StartResponse> {
|
|
|
154
127
|
void flow.completion
|
|
155
128
|
.then(async (result) => {
|
|
156
129
|
await storeAcpClaudeToken(result.tokens.accessToken);
|
|
157
|
-
|
|
130
|
+
pendingFlows.mark(flow.state, "connected");
|
|
158
131
|
log.info("ACP Claude local OAuth flow connected");
|
|
159
132
|
})
|
|
160
133
|
.catch((err) => {
|
|
161
134
|
const message = err instanceof Error ? err.message : String(err);
|
|
162
|
-
|
|
135
|
+
pendingFlows.mark(flow.state, "error", { error: message });
|
|
163
136
|
log.error({ err: message }, "ACP Claude local OAuth flow failed");
|
|
164
137
|
});
|
|
165
138
|
|
|
@@ -180,9 +153,7 @@ function handleStartManualAuth(): StartResponse {
|
|
|
180
153
|
const codeChallenge = generateCodeChallenge(codeVerifier);
|
|
181
154
|
const state = generateState();
|
|
182
155
|
|
|
183
|
-
pendingFlows.
|
|
184
|
-
status: "pending",
|
|
185
|
-
createdAt: Date.now(),
|
|
156
|
+
pendingFlows.start(state, {
|
|
186
157
|
codeVerifier,
|
|
187
158
|
redirectUri: CLAUDE_MANUAL_REDIRECT_URI,
|
|
188
159
|
});
|
|
@@ -228,7 +199,7 @@ async function handleExchange(args: RouteHandlerArgs): Promise<{ ok: true }> {
|
|
|
228
199
|
);
|
|
229
200
|
}
|
|
230
201
|
|
|
231
|
-
if (
|
|
202
|
+
if (pendingFlows.isExpired(pending)) {
|
|
232
203
|
pendingFlows.delete(state);
|
|
233
204
|
throw new BadRequestError(
|
|
234
205
|
"Connect Claude flow expired. Restart the Connect Claude flow.",
|
|
@@ -248,7 +219,7 @@ async function handleExchange(args: RouteHandlerArgs): Promise<{ ok: true }> {
|
|
|
248
219
|
await storeAcpClaudeToken(result.tokens.accessToken);
|
|
249
220
|
} catch (err) {
|
|
250
221
|
const message = err instanceof Error ? err.message : String(err);
|
|
251
|
-
|
|
222
|
+
pendingFlows.mark(state, "error", { error: message });
|
|
252
223
|
log.error({ err: message }, "ACP Claude manual OAuth flow failed");
|
|
253
224
|
throw new BadRequestError(
|
|
254
225
|
`Failed to exchange Claude authorization code: ${message}`,
|
|
@@ -271,21 +242,21 @@ async function handleAuthConnected(): Promise<{ connected: boolean }> {
|
|
|
271
242
|
}
|
|
272
243
|
|
|
273
244
|
function handleAuthStatus({ pathParams }: RouteHandlerArgs): {
|
|
274
|
-
status:
|
|
245
|
+
status: PendingFlowStatus;
|
|
275
246
|
error?: string;
|
|
276
247
|
} {
|
|
277
248
|
const { state } = pathParams as { state: string };
|
|
278
|
-
const
|
|
249
|
+
const report = pendingFlows.readStatus(state);
|
|
279
250
|
|
|
280
|
-
if (!
|
|
251
|
+
if (!report) {
|
|
281
252
|
throw new NotFoundError(
|
|
282
253
|
"No active Claude auth flow for the given state. Restart the connect flow.",
|
|
283
254
|
);
|
|
284
255
|
}
|
|
285
256
|
|
|
286
|
-
return
|
|
287
|
-
? { status:
|
|
288
|
-
: { status:
|
|
257
|
+
return report.error !== undefined
|
|
258
|
+
? { status: report.status, error: report.error }
|
|
259
|
+
: { status: report.status };
|
|
289
260
|
}
|
|
290
261
|
|
|
291
262
|
// ---------------------------------------------------------------------------
|
|
@@ -46,8 +46,6 @@ function canonicalizeConfirmDecision(params: {
|
|
|
46
46
|
function handleConfirm({ body }: RouteHandlerArgs) {
|
|
47
47
|
const requestId = body?.requestId as string | undefined;
|
|
48
48
|
const decision = body?.decision as string | undefined;
|
|
49
|
-
const selectedPattern = body?.selectedPattern as string | undefined;
|
|
50
|
-
const selectedScope = body?.selectedScope as string | undefined;
|
|
51
49
|
|
|
52
50
|
if (!requestId || typeof requestId !== "string") {
|
|
53
51
|
throw new BadRequestError("requestId is required");
|
|
@@ -107,8 +105,6 @@ function handleConfirm({ body }: RouteHandlerArgs) {
|
|
|
107
105
|
requestId,
|
|
108
106
|
effectiveDecision as UserDecision,
|
|
109
107
|
{
|
|
110
|
-
selectedPattern,
|
|
111
|
-
selectedScope,
|
|
112
108
|
emissionContext: { source: "button" },
|
|
113
109
|
},
|
|
114
110
|
);
|
|
@@ -342,14 +338,6 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
342
338
|
requestBody: z.object({
|
|
343
339
|
requestId: z.string().describe("Pending interaction request ID"),
|
|
344
340
|
decision: z.string().describe("One of: allow, deny"),
|
|
345
|
-
selectedPattern: z
|
|
346
|
-
.string()
|
|
347
|
-
.describe("Allowlist pattern for persistent decisions")
|
|
348
|
-
.optional(),
|
|
349
|
-
selectedScope: z
|
|
350
|
-
.string()
|
|
351
|
-
.describe("Scope for persistent decisions")
|
|
352
|
-
.optional(),
|
|
353
341
|
}),
|
|
354
342
|
responseBody: z.object({
|
|
355
343
|
accepted: z.boolean(),
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { existsSync, readFileSync } from "node:fs";
|
|
2
2
|
import { join, resolve } from "node:path";
|
|
3
3
|
|
|
4
|
+
import { AVATAR_TRAITS_FILENAME } from "@vellumai/avatar-manifest";
|
|
4
5
|
import { z } from "zod";
|
|
5
6
|
|
|
6
7
|
import { renderCharacterAscii } from "../../avatar/ascii-renderer.js";
|
|
@@ -16,23 +17,19 @@ import {
|
|
|
16
17
|
setImage,
|
|
17
18
|
} from "../../avatar/avatar-store.js";
|
|
18
19
|
import { getCharacterComponents } from "../../avatar/character-components.js";
|
|
19
|
-
import { updateIdentityAvatarSection } from "../../avatar/identity-avatar.js";
|
|
20
20
|
import {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
} from "../../avatar/
|
|
21
|
+
ensureAvatarRaster,
|
|
22
|
+
ensureAvatarRasterPath,
|
|
23
|
+
} from "../../avatar/ensure-raster.js";
|
|
24
|
+
import { updateIdentityAvatarSection } from "../../avatar/identity-avatar.js";
|
|
25
|
+
import type { CharacterTraits } from "../../avatar/traits-png-sync.js";
|
|
25
26
|
import { setPlatformBaseUrl } from "../../config/env.js";
|
|
26
27
|
import { credentialKey } from "../../security/credential-key.js";
|
|
27
28
|
import { getSecureKeyAsync } from "../../security/secure-keys.js";
|
|
28
29
|
import { detectMediaType } from "../../tools/shared/filesystem/image-read.js";
|
|
29
30
|
import { generateAvatarImage } from "../../tools/system/avatar-generator.js";
|
|
30
31
|
import { getLogger } from "../../util/logger.js";
|
|
31
|
-
import {
|
|
32
|
-
getAvatarDir,
|
|
33
|
-
getAvatarImagePath,
|
|
34
|
-
getWorkspaceDir,
|
|
35
|
-
} from "../../util/platform.js";
|
|
32
|
+
import { getAvatarDir, getWorkspaceDir } from "../../util/platform.js";
|
|
36
33
|
import { ACTOR_PRINCIPALS, LOCAL_PRINCIPALS } from "../auth/route-policy.js";
|
|
37
34
|
import { publishAvatarChanged } from "../sync/resource-sync-events.js";
|
|
38
35
|
import {
|
|
@@ -259,7 +256,7 @@ function handleRemoveAvatar({ headers }: RouteHandlerArgs) {
|
|
|
259
256
|
return { ok: true, hadAvatar };
|
|
260
257
|
}
|
|
261
258
|
|
|
262
|
-
function handleGetAvatar({ queryParams, body }: RouteHandlerArgs) {
|
|
259
|
+
async function handleGetAvatar({ queryParams, body }: RouteHandlerArgs) {
|
|
263
260
|
const format = (queryParams?.format ??
|
|
264
261
|
(body as Record<string, unknown>)?.format ??
|
|
265
262
|
"path") as string;
|
|
@@ -281,27 +278,17 @@ function handleGetAvatar({ queryParams, body }: RouteHandlerArgs) {
|
|
|
281
278
|
return { exists: false };
|
|
282
279
|
}
|
|
283
280
|
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
if (state.kind === "character" && !existsSync(avatarPath) && state.traits) {
|
|
290
|
-
try {
|
|
291
|
-
writeTraitsAndRenderAvatar(state.traits);
|
|
292
|
-
} catch {
|
|
293
|
-
// Best-effort
|
|
294
|
-
}
|
|
281
|
+
// A character whose PNG is missing is regenerated on read. Path mode never
|
|
282
|
+
// loads the raster bytes.
|
|
283
|
+
if (format === "path") {
|
|
284
|
+
const path = await ensureAvatarRasterPath(state);
|
|
285
|
+
return path ? { exists: true, path } : { exists: false };
|
|
295
286
|
}
|
|
296
|
-
|
|
297
|
-
if (!
|
|
287
|
+
const raster = await ensureAvatarRaster(state);
|
|
288
|
+
if (!raster) {
|
|
298
289
|
return { exists: false };
|
|
299
290
|
}
|
|
300
|
-
|
|
301
|
-
if (format === "path") {
|
|
302
|
-
return { exists: true, path: avatarPath };
|
|
303
|
-
}
|
|
304
|
-
return { exists: true, base64: readFileSync(avatarPath).toString("base64") };
|
|
291
|
+
return { exists: true, base64: raster.toString("base64") };
|
|
305
292
|
}
|
|
306
293
|
|
|
307
294
|
function handleCharacterAscii({ queryParams, body }: RouteHandlerArgs) {
|
|
@@ -322,7 +309,7 @@ function handleCharacterAscii({ queryParams, body }: RouteHandlerArgs) {
|
|
|
322
309
|
);
|
|
323
310
|
}
|
|
324
311
|
|
|
325
|
-
const traitsPath = join(getAvatarDir(),
|
|
312
|
+
const traitsPath = join(getAvatarDir(), AVATAR_TRAITS_FILENAME);
|
|
326
313
|
if (!existsSync(traitsPath)) {
|
|
327
314
|
throw new BadRequestError(
|
|
328
315
|
"No native character set. Use 'assistant avatar character update' first.",
|
|
@@ -632,7 +632,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
632
632
|
handler: handleBackupDestinationsList,
|
|
633
633
|
summary: "List configured offsite backup destinations",
|
|
634
634
|
description:
|
|
635
|
-
"Returns the current offsite destinations array,
|
|
635
|
+
"Returns the current offsite destinations array. When no explicit array is configured, macOS materializes its encrypted iCloud Drive default while Windows and Linux return no implicit destination.",
|
|
636
636
|
tags: ["backups"],
|
|
637
637
|
responseBody: z.object({
|
|
638
638
|
destinations: z.array(
|
|
@@ -654,7 +654,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
654
654
|
handler: handleBackupDestinationsAdd,
|
|
655
655
|
summary: "Add an offsite backup destination",
|
|
656
656
|
description:
|
|
657
|
-
"Appends a new destination. Materializes the
|
|
657
|
+
"Appends a new destination. Materializes the platform default first if destinations is currently null. Errors if the path already exists.",
|
|
658
658
|
tags: ["backups"],
|
|
659
659
|
requestBody: z.object({
|
|
660
660
|
path: z
|