@vellumai/assistant 0.10.9 → 0.10.10-dev.202607162206.d08e98e
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 +1 -1
- package/Dockerfile +8 -0
- package/docs/activation-funnel-telemetry.md +13 -7
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/redacted-credential.test.ts +200 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/redacted-credential.ts +226 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/redacted-credential.test.ts +200 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/redacted-credential.ts +226 -0
- package/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/redacted-credential.test.ts +200 -0
- package/node_modules/@vellumai/service-contracts/src/redacted-credential.ts +226 -0
- package/openapi.yaml +530 -107
- package/package.json +1 -1
- package/scripts/generate-openapi.ts +8 -0
- package/src/__tests__/activation-early-marking.test.ts +6 -5
- package/src/__tests__/agent-loop-override-profile.test.ts +22 -25
- package/src/__tests__/agent-wake-override-profile.test.ts +21 -48
- package/src/__tests__/app-builder-tool-scripts.test.ts +0 -1
- package/src/__tests__/app-bundler.test.ts +4 -12
- package/src/__tests__/app-executors.test.ts +2 -49
- package/src/__tests__/app-routes-csp.test.ts +114 -146
- package/src/__tests__/auth-fallback-events-store.test.ts +8 -1
- package/src/__tests__/build-persisted-content.test.ts +96 -0
- package/src/__tests__/bundle-scanner.test.ts +27 -1
- package/src/__tests__/call-controller.test.ts +291 -0
- package/src/__tests__/call-site-routing-connection-auto-resolve.test.ts +165 -0
- package/src/__tests__/chat-credential-redaction.test.ts +1395 -0
- package/src/__tests__/chat-reveal-guard-priming.test.ts +791 -0
- package/src/__tests__/compaction.benchmark.test.ts +2 -1
- package/src/__tests__/compactor-image-manifest-trust.test.ts +50 -0
- package/src/__tests__/config-loader-backfill.test.ts +9 -4
- package/src/__tests__/config-schema-cmd.test.ts +10 -11
- package/src/__tests__/config-schema.test.ts +190 -257
- package/src/__tests__/conversation-agent-loop-fatal-cleanup.test.ts +208 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +5 -19
- package/src/__tests__/conversation-agent-loop.test.ts +22 -9
- package/src/__tests__/conversation-error.test.ts +31 -0
- package/src/__tests__/conversation-load-history-repair.test.ts +110 -0
- package/src/__tests__/conversation-process-callsite.test.ts +12 -19
- package/src/__tests__/conversation-routes-slash-commands.test.ts +7 -21
- package/src/__tests__/conversation-summarize-route.test.ts +36 -44
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +1 -0
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +7 -7
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +0 -1
- package/src/__tests__/conversation-tool-setup-attribution.test.ts +0 -1
- package/src/__tests__/conversation-usage.test.ts +4 -12
- package/src/__tests__/credential-routes.test.ts +250 -0
- package/src/__tests__/credential-security-invariants.test.ts +3 -0
- package/src/__tests__/db-migration-rollback.test.ts +22 -0
- package/src/__tests__/empty-response-hook.test.ts +186 -1
- package/src/__tests__/external-plugin-loader.test.ts +11 -5
- package/src/__tests__/heartbeat-service.test.ts +0 -28
- package/src/__tests__/host-shell-tool.test.ts +2 -0
- package/src/__tests__/inactive-tool-error-messages.test.ts +2 -2
- package/src/__tests__/inference-no-mode-boot-e2e.test.ts +52 -8
- package/src/__tests__/internal-telemetry-routes.test.ts +23 -4
- package/src/__tests__/invite-routes-http.test.ts +12 -16
- package/src/__tests__/list-all-apps.test.ts +0 -4
- package/src/__tests__/llm-context-resolution.test.ts +32 -56
- package/src/__tests__/llm-request-log-turn-query.test.ts +109 -0
- package/src/__tests__/llm-resolver-override-or-default.test.ts +3 -52
- package/src/__tests__/llm-resolver.test.ts +342 -602
- package/src/__tests__/llm-schema.test.ts +79 -37
- package/src/__tests__/max-tokens-continue-hook.test.ts +19 -0
- package/src/__tests__/media-stream-output.test.ts +259 -3
- package/src/__tests__/media-stream-server-integration.test.ts +22 -1
- package/src/__tests__/media-stream-stt-session.test.ts +47 -0
- package/src/__tests__/memory-jobs-worker-cleanup-cadence.test.ts +33 -0
- package/src/__tests__/memory-recall-log-store.test.ts +47 -13
- package/src/__tests__/mock-gateway-ipc.ts +46 -1
- package/src/__tests__/mtime-cache.test.ts +61 -0
- package/src/__tests__/navigate-settings-tab.test.ts +2 -0
- package/src/__tests__/normalize-onboarding.test.ts +33 -0
- package/src/__tests__/onboarding-persona-write.test.ts +26 -0
- package/src/__tests__/plugin-api-resolve-credential.test.ts +140 -0
- package/src/__tests__/plugin-app-serve-routes.test.ts +166 -14
- package/src/__tests__/plugin-import-boundary-reverse-guard.test.ts +2 -0
- package/src/__tests__/post-turn-tool-result-truncation.test.ts +38 -0
- package/src/__tests__/provider-commit-message-generator.test.ts +27 -20
- package/src/__tests__/provider-connections-backfill.test.ts +138 -0
- package/src/__tests__/provider-platform-proxy-integration.test.ts +10 -31
- package/src/__tests__/provider-registry-ollama.test.ts +8 -18
- package/src/__tests__/provider-send-message-override-profile.test.ts +23 -23
- package/src/__tests__/provider-usage-tracking.test.ts +9 -19
- package/src/__tests__/prune-old-conversations-job.test.ts +12 -0
- package/src/__tests__/published-app-updater.test.ts +22 -16
- package/src/__tests__/registry.test.ts +5 -16
- package/src/__tests__/retry-openrouter-only-normalization.test.ts +22 -23
- package/src/__tests__/retry-thinking-adaptive-only.test.ts +43 -48
- package/src/__tests__/retry-thinking-tool-choice.test.ts +57 -66
- package/src/__tests__/retry-verbosity-normalization.test.ts +24 -23
- package/src/__tests__/reveal-success-registry.test.ts +123 -0
- package/src/__tests__/run-conversation-turn-persistence.test.ts +130 -0
- package/src/__tests__/secret-fixtures.ts +9 -0
- package/src/__tests__/server-history-render.test.ts +28 -0
- package/src/__tests__/skills.test.ts +9 -4
- package/src/__tests__/slack-share-routes.test.ts +0 -1
- package/src/__tests__/stt-stream-session.test.ts +6 -5
- package/src/__tests__/subagent-call-site-routing.test.ts +69 -95
- package/src/__tests__/subagent-disposal.test.ts +2 -0
- package/src/__tests__/subagent-fork-notifications.test.ts +2 -0
- package/src/__tests__/subagent-fork-spawn.test.ts +2 -0
- package/src/__tests__/subagent-manager-notify.test.ts +2 -0
- package/src/__tests__/subagent-role-registry.test.ts +37 -0
- package/src/__tests__/subagent-spawn-and-await.test.ts +1 -0
- package/src/__tests__/subagent-terminal-message.test.ts +50 -0
- package/src/__tests__/subagent-tool-gate-mode.test.ts +78 -5
- package/src/__tests__/surface-completion-nudge-hook.test.ts +19 -0
- package/src/__tests__/telemetry-routes.test.ts +99 -19
- package/src/__tests__/tool-audit.test.ts +34 -4
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +1 -1
- package/src/__tests__/tool-profiler.test.ts +72 -1
- package/src/__tests__/tool-result-spool.test.ts +49 -4
- package/src/__tests__/tool-side-effects-slack-dm.test.ts +0 -1
- package/src/__tests__/ui-channel-variants.test.ts +108 -0
- package/src/__tests__/ui-shape-teaching.test.ts +255 -0
- package/src/__tests__/usage-attribution.test.ts +18 -41
- package/src/__tests__/user-plugin-loader.test.ts +4 -4
- package/src/__tests__/voice-config-update.test.ts +46 -0
- package/src/__tests__/voice-session-bridge.test.ts +216 -84
- package/src/__tests__/workspace-migration-131-drop-web-fetch-mode.test.ts +120 -0
- package/src/agent/loop.ts +4 -3
- package/src/api/events/open-conversation.test.ts +64 -0
- package/src/api/events/open-conversation.ts +33 -0
- package/src/api/index.ts +6 -0
- package/src/api/responses/conversation-message.ts +5 -0
- package/src/apps/app-store.ts +25 -35
- package/src/bundler/app-bundler.ts +34 -48
- package/src/bundler/app-compiler.ts +39 -4
- package/src/bundler/bundle-scanner.ts +13 -0
- package/src/bundler/manifest.ts +1 -1
- package/src/calls/__tests__/voice-session-bridge.test.ts +47 -0
- package/src/calls/call-constants.ts +5 -0
- package/src/calls/call-controller.ts +100 -32
- package/src/calls/call-transport.ts +9 -0
- package/src/calls/media-stream-output.ts +107 -4
- package/src/calls/media-stream-server.ts +29 -9
- package/src/calls/media-stream-stt-session.ts +7 -1
- package/src/calls/media-turn-detector.ts +11 -1
- package/src/calls/voice-session-bridge.ts +84 -63
- package/src/cli/commands/__tests__/inference-providers.test.ts +270 -33
- package/src/cli/commands/__tests__/notifications.test.ts +24 -3
- package/src/cli/commands/config.help.ts +6 -6
- package/src/cli/commands/credentials.help.ts +13 -0
- package/src/cli/commands/credentials.ts +6 -1
- package/src/cli/commands/email.help.ts +7 -0
- package/src/cli/commands/email.ts +35 -1
- package/src/cli/commands/inference-providers.ts +168 -107
- package/src/cli/commands/inference.help.ts +118 -46
- package/src/cli/commands/memory/index.help.ts +23 -0
- package/src/cli/commands/memory/nodes.ts +146 -0
- package/src/cli/commands/notifications.help.ts +10 -10
- package/src/cli/commands/oauth/connect-surface-guidance.test.ts +40 -0
- package/src/cli/commands/oauth/connect-surface-guidance.ts +54 -0
- package/src/cli/commands/oauth/connect.test.ts +126 -0
- package/src/cli/commands/oauth/connect.ts +29 -6
- package/src/cli/commands/oauth/index.help.ts +7 -1
- package/src/cli/commands/oauth/status.test.ts +69 -3
- package/src/cli/commands/oauth/status.ts +50 -12
- package/src/cli/commands/plugins.help.ts +13 -2
- package/src/cli/commands/plugins.ts +61 -7
- package/src/cli/commands/telemetry.help.ts +13 -0
- package/src/cli/commands/telemetry.ts +45 -5
- package/src/cli/lib/__tests__/plugin-catalog-local.test.ts +8 -2
- package/src/cli/lib/__tests__/upgrade-plugin.test.ts +213 -9
- package/src/cli/lib/bundled-marketplace.json +93 -36
- package/src/cli/lib/inspect-plugin.ts +5 -1
- package/src/cli/lib/install-from-github.ts +68 -4
- package/src/cli/lib/plugin-catalog-local.ts +6 -2
- package/src/cli/lib/plugin-fingerprint.ts +3 -3
- package/src/cli/lib/upgrade-plugin.ts +236 -35
- package/src/config/__tests__/default-profile-catalog.test.ts +8 -12
- package/src/config/__tests__/plugin-resident-skill-discovery.test.ts +137 -0
- package/src/config/__tests__/profile-materialization.test.ts +1 -88
- package/src/config/bundled-skills/AGENTS.md +3 -30
- package/src/config/bundled-skills/app-builder/SKILL.md +5 -3
- package/src/config/bundled-skills/app-builder/TOOLS.json +23 -0
- package/src/config/bundled-skills/app-builder/tools/app-open.ts +32 -0
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +1 -1
- package/src/config/bundled-skills/phone-calls/references/CONFIG.md +7 -7
- package/src/config/bundled-skills/schedule/SKILL.md +1 -1
- package/src/config/bundled-skills/schedule/TOOLS.json +1 -1
- package/src/config/bundled-skills/settings/TOOLS.json +3 -1
- package/src/config/bundled-skills/settings/tools/navigate-settings-tab.ts +2 -0
- package/src/config/bundled-skills/settings/tools/voice-config-update.ts +18 -10
- package/src/config/bundled-skills/subagent/SKILL.md +2 -0
- package/src/config/bundled-skills/subagent/TOOLS.json +1 -1
- package/src/config/call-site-defaults.ts +3 -3
- package/src/config/feature-flag-registry.json +24 -39
- package/src/config/llm-resolver.ts +88 -475
- package/src/config/profile-materialization.ts +11 -11
- package/src/config/schema.ts +93 -127
- package/src/config/schemas/__tests__/live-voice.test.ts +24 -6
- package/src/config/schemas/__tests__/stt.test.ts +31 -3
- package/src/config/schemas/live-voice.ts +10 -4
- package/src/config/schemas/llm.ts +52 -15
- package/src/config/schemas/memory-lifecycle.ts +1 -1
- package/src/config/schemas/memory-retrospective.ts +8 -0
- package/src/config/schemas/memory-v2.ts +2 -2
- package/src/config/schemas/memory-v3.ts +1 -1
- package/src/config/schemas/services.ts +6 -3
- package/src/config/schemas/stt.ts +38 -21
- package/src/config/schemas/tts.ts +13 -18
- package/src/config/skills.ts +31 -21
- package/src/context/compactor.ts +44 -7
- package/src/context/post-turn-tool-result-truncation.ts +4 -2
- package/src/context/tool-result-spool.ts +26 -5
- package/src/conversations/__tests__/message-consolidation.test.ts +48 -0
- package/src/conversations/message-consolidation.ts +22 -2
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +5 -12
- package/src/daemon/app-source-watcher.ts +17 -23
- package/src/daemon/chat-credential-redaction.ts +1365 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +627 -34
- package/src/daemon/conversation-agent-loop.ts +71 -31
- package/src/daemon/conversation-error.ts +36 -14
- package/src/daemon/conversation-process.ts +22 -0
- package/src/daemon/conversation-store.ts +35 -0
- package/src/daemon/conversation-surfaces.ts +25 -25
- package/src/daemon/conversation-tool-setup.ts +33 -7
- package/src/daemon/conversation.ts +55 -5
- package/src/daemon/handlers/shared.ts +33 -2
- package/src/daemon/lifecycle.ts +4 -4
- package/src/daemon/message-types/conversations.ts +6 -17
- package/src/daemon/providers-setup.ts +8 -0
- package/src/daemon/tool-setup-types.ts +7 -1
- package/src/daemon/wake-conversation-ops.ts +10 -1
- package/src/hooks/types.ts +9 -0
- package/src/ipc/__tests__/email-ipc.test.ts +90 -0
- package/src/ipc/gateway-client.test.ts +59 -0
- package/src/ipc/gateway-client.ts +70 -27
- package/src/live-voice/__tests__/live-voice-events.test.ts +14 -2
- package/src/live-voice/__tests__/live-voice-integration.test.ts +116 -2
- package/src/live-voice/__tests__/live-voice-vad.test.ts +804 -13
- package/src/live-voice/__tests__/protocol.test.ts +122 -0
- package/src/live-voice/live-voice-session.ts +443 -40
- package/src/live-voice/protocol.ts +143 -1
- package/src/monitoring/__tests__/plugin-source-watch.test.ts +3 -1
- package/src/monitoring/plugin-source-watch.ts +3 -62
- package/src/notifications/README.md +1 -1
- package/src/permissions/checker.ts +8 -4
- package/src/persistence/__tests__/db-init-migrations-ok.test.ts +26 -0
- package/src/persistence/conversation-crud.ts +104 -2
- package/src/persistence/db-init.ts +14 -3
- package/src/persistence/job-handlers/cleanup.ts +15 -7
- package/src/persistence/llm-request-log-store.ts +88 -52
- package/src/persistence/migrations/298-move-memory-jobs-to-memory-db.ts +7 -31
- package/src/persistence/migrations/305-drop-contact-acl-columns.ts +3 -2
- package/src/persistence/migrations/326-move-injection-events-to-memory-db.ts +8 -34
- package/src/persistence/migrations/336-move-memory-v2-activation-logs-to-memory-db.ts +90 -0
- package/src/persistence/migrations/337-move-memory-recall-logs-to-memory-db.ts +114 -0
- package/src/persistence/migrations/338-move-memory-v3-selections-to-memory-db.ts +84 -0
- package/src/persistence/migrations/339-move-activation-sessions-to-memory-db.ts +52 -0
- package/src/persistence/migrations/__tests__/run-migrations.test.ts +155 -0
- package/src/persistence/migrations/helpers/relocation.ts +44 -1
- package/src/persistence/migrations/run-migrations.ts +25 -1
- package/src/persistence/schema/infrastructure.ts +9 -0
- package/src/persistence/schema/memory-core.ts +3 -0
- package/src/persistence/schema/memory-injection.ts +2 -0
- package/src/persistence/steps.ts +36 -0
- package/src/platform/client.test.ts +1 -44
- package/src/platform/client.ts +10 -20
- package/src/platform/consent-cache.test.ts +89 -23
- package/src/platform/consent-cache.ts +71 -33
- package/src/plugin-api/constants.ts +12 -0
- package/src/plugin-api/conversation-turn.ts +37 -14
- package/src/plugin-api/index.ts +11 -1
- package/src/plugin-api/resolve-credential.ts +75 -0
- package/src/plugin-api/vision-support.test.ts +8 -19
- package/src/plugin-api/vision-support.ts +26 -17
- package/src/plugins/collect-source-versions.ts +77 -0
- package/src/plugins/defaults/compaction/compact.ts +6 -0
- package/src/plugins/defaults/compaction/window-manager.ts +9 -0
- package/src/plugins/defaults/empty-response/hooks/post-model-call.ts +18 -24
- package/src/plugins/defaults/empty-response/hooks/user-prompt-submit.ts +38 -0
- package/src/plugins/defaults/empty-response/refusal-quarantine.ts +99 -0
- package/src/plugins/defaults/image-fallback/__tests__/caption-cache-persistence.test.ts +7 -3
- package/src/plugins/defaults/index.ts +8 -1
- package/src/plugins/defaults/max-tokens-continue/hooks/post-model-call.ts +4 -1
- package/src/plugins/defaults/memory/__tests__/activation-session-store.test.ts +48 -6
- package/src/plugins/defaults/memory/__tests__/db-memory-attach.test.ts +28 -22
- package/src/plugins/defaults/memory/__tests__/memory-log-stores-degraded.test.ts +148 -0
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +80 -8
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-prompt.test.ts +202 -0
- package/src/plugins/defaults/memory/__tests__/memory-v2-activation-log-store.test.ts +64 -25
- package/src/plugins/defaults/memory/__tests__/memory-v2-concept-frequency.test.ts +24 -11
- package/src/plugins/defaults/memory/__tests__/prompt-override.test.ts +70 -6
- package/src/plugins/defaults/memory/__tests__/table-relocation.test.ts +278 -0
- package/src/plugins/defaults/memory/activation-session-store.ts +27 -20
- package/src/plugins/defaults/memory/context-search/sources/memory-v2.ts +2 -9
- package/src/plugins/defaults/memory/context-search/sources/workspace.ts +1 -8
- package/src/plugins/defaults/memory/graph/retriever.test.ts +6 -6
- package/src/plugins/defaults/memory/graph/store.ts +114 -0
- package/src/plugins/defaults/memory/graph/tool-handlers.ts +36 -1
- package/src/plugins/defaults/memory/graph/tools.ts +47 -13
- package/src/plugins/defaults/memory/graph-topology/build-memory-graph.ts +16 -35
- package/src/plugins/defaults/memory/jobs-worker.ts +10 -1
- package/src/plugins/defaults/memory/memory-db.ts +3 -2
- package/src/plugins/defaults/memory/memory-recall-log-store.ts +129 -66
- package/src/plugins/defaults/memory/memory-retrospective-constants.ts +8 -0
- package/src/plugins/defaults/memory/memory-retrospective-job.ts +11 -122
- package/src/plugins/defaults/memory/memory-retrospective-prompt.ts +216 -0
- package/src/plugins/defaults/memory/memory-v2-activation-log-store.ts +84 -46
- package/src/plugins/defaults/memory/memory-v2-concept-frequency.ts +42 -32
- package/src/plugins/defaults/memory/path-containment.ts +21 -0
- package/src/plugins/defaults/memory/prompt-override.ts +51 -13
- package/src/plugins/defaults/memory/tools.test.ts +34 -0
- package/src/plugins/defaults/memory/tools.ts +12 -2
- package/src/plugins/defaults/memory/v2/__tests__/harness-compare.test.ts +19 -15
- package/src/plugins/defaults/memory/v2/__tests__/harness-oracle.test.ts +24 -19
- package/src/plugins/defaults/memory/v2/__tests__/harness-replay-input.test.ts +19 -15
- package/src/plugins/defaults/memory/v2/__tests__/injection.test.ts +22 -2
- package/src/plugins/defaults/memory/v2/__tests__/prompts-consolidation.test.ts +5 -3
- package/src/plugins/defaults/memory/v2/harness/oracle.ts +59 -41
- package/src/plugins/defaults/memory/v2/harness/replay-input.ts +29 -25
- package/src/plugins/defaults/memory/v2/migration.ts +46 -16
- package/src/plugins/defaults/memory/v2/prompts/consolidation.ts +4 -0
- package/src/plugins/defaults/memory/v3/__tests__/carry-integration.test.ts +17 -15
- package/src/plugins/defaults/memory/v3/__tests__/gate.test.ts +24 -22
- package/src/plugins/defaults/memory/v3/__tests__/injection.test.ts +9 -5
- package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +277 -10
- package/src/plugins/defaults/memory/v3/__tests__/selection-log-store.test.ts +57 -5
- package/src/plugins/defaults/memory/v3/__tests__/shadow-integration.test.ts +9 -7
- package/src/plugins/defaults/memory/v3/__tests__/shadow-plugin.test.ts +38 -7
- package/src/plugins/defaults/memory/v3/hot-set.test.ts +36 -18
- package/src/plugins/defaults/memory/v3/hot-set.ts +12 -14
- package/src/plugins/defaults/memory/v3/learned-edges.test.ts +47 -27
- package/src/plugins/defaults/memory/v3/learned-edges.ts +12 -14
- package/src/plugins/defaults/memory/v3/orchestrate.ts +139 -22
- package/src/plugins/defaults/memory/v3/prune.test.ts +10 -3
- package/src/plugins/defaults/memory/v3/prune.ts +17 -11
- package/src/plugins/defaults/memory/v3/selection-log-store.ts +23 -11
- package/src/plugins/defaults/memory/v3/shadow-plugin.ts +70 -53
- package/src/plugins/defaults/surface-completion-nudge/hooks/post-model-call.ts +9 -6
- package/src/plugins/external-plugin-loader.ts +15 -15
- package/src/plugins/mtime-cache.ts +47 -0
- package/src/plugins/pipeline.ts +9 -1
- package/src/plugins/plugin-execution-context.ts +44 -0
- package/src/plugins/plugin-tree-walk.ts +31 -24
- package/src/plugins/source-fingerprint.ts +3 -4
- package/src/prompts/normalize-onboarding.ts +12 -0
- package/src/prompts/persona-resolver.ts +8 -0
- package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +1 -1
- package/src/providers/__tests__/dispatch-connection-routing.test.ts +6 -9
- package/src/providers/__tests__/registry-native-web-search.test.ts +4 -10
- package/src/providers/__tests__/retry-callsite.test.ts +235 -215
- package/src/providers/__tests__/satellite-connection-routing.test.ts +8 -16
- package/src/providers/atlascloud/client.ts +10 -49
- package/src/providers/baseten/client.ts +43 -0
- package/src/providers/call-site-routing.ts +26 -13
- package/src/providers/connection-resolution.ts +9 -11
- package/src/providers/fetch-provider-catalog.ts +4 -2
- package/src/providers/inference/__tests__/adapter-factory-openai-compatible.test.ts +29 -4
- package/src/providers/inference/__tests__/connection-availability-keyless.test.ts +78 -0
- package/src/providers/inference/adapter-factory.ts +27 -6
- package/src/providers/inference/auth.ts +29 -1
- package/src/providers/inference/backfill.ts +61 -10
- package/src/providers/inference/connection-availability.ts +3 -2
- package/src/providers/inference/resolve-auth.ts +9 -1
- package/src/providers/model-catalog.ts +37 -0
- package/src/providers/openai/__tests__/api-error-normalization.test.ts +24 -2
- package/src/providers/openai/api-key-validation.ts +70 -0
- package/src/providers/retry.ts +2 -0
- package/src/providers/types.ts +11 -4
- package/src/providers/vellum-model-routing.test.ts +26 -0
- package/src/providers/vellum-model-routing.ts +30 -0
- package/src/providers/voice-error-copy.ts +47 -0
- package/src/runtime/agent-wake.ts +40 -24
- package/src/runtime/for-chat-mint-registry.ts +118 -0
- package/src/runtime/reveal-nonce.ts +49 -0
- package/src/runtime/reveal-success-registry.ts +306 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +88 -3
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +161 -30
- package/src/runtime/routes/__tests__/migration-vellum-metadata-reconcile.test.ts +7 -0
- package/src/runtime/routes/__tests__/schedule-worker-routes.test.ts +15 -0
- package/src/runtime/routes/app-management-routes.ts +152 -45
- package/src/runtime/routes/app-routes.ts +16 -77
- package/src/runtime/routes/canned-message-complete.ts +16 -16
- package/src/runtime/routes/conversation-management-routes.ts +17 -14
- package/src/runtime/routes/conversation-query-routes.ts +54 -6
- package/src/runtime/routes/conversation-routes.ts +48 -2
- package/src/runtime/routes/credential-routes.ts +116 -3
- package/src/runtime/routes/email-routes.ts +17 -1
- package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +33 -5
- package/src/runtime/routes/inbound-stages/transcribe-audio.ts +6 -5
- package/src/runtime/routes/inference-provider-connection-routes.ts +77 -28
- package/src/runtime/routes/inference-send-routes.ts +1 -1
- package/src/runtime/routes/internal-telemetry-routes.ts +7 -6
- package/src/runtime/routes/plugins-routes.ts +37 -6
- package/src/runtime/routes/publish-routes.ts +15 -18
- package/src/runtime/routes/schedule-worker-routes.ts +9 -0
- package/src/runtime/routes/secret-routes.ts +10 -0
- package/src/runtime/routes/telemetry-routes.ts +149 -45
- package/src/schedule/__tests__/schedule-timezone.test.ts +101 -0
- package/src/schedule/__tests__/worker-watchdog.test.ts +209 -0
- package/src/schedule/schedule-store.ts +12 -1
- package/src/schedule/schedule-timezone.ts +63 -0
- package/src/schedule/scheduler.ts +100 -6
- package/src/schedule/worker-control.ts +19 -0
- package/src/security/auth-fallback-events-store.ts +7 -6
- package/src/security/secret-scanner.ts +26 -1
- package/src/services/published-app-updater.ts +6 -11
- package/src/stt/stt-stream-session.ts +36 -16
- package/src/subagent/manager.ts +34 -8
- package/src/telemetry/AGENTS.md +30 -1
- package/src/telemetry/__tests__/config-setting-snapshot.test.ts +18 -0
- package/src/telemetry/__tests__/outbox-test-harness.ts +5 -3
- package/src/telemetry/config-setting-snapshot.ts +44 -10
- package/src/telemetry/telemetry-event-sources.test.ts +124 -30
- package/src/telemetry/telemetry-event-sources.ts +137 -83
- package/src/telemetry/telemetry-events-outbox.test.ts +46 -1
- package/src/telemetry/telemetry-events-outbox.ts +60 -9
- package/src/telemetry/telemetry-wire-source.json +1 -1
- package/src/telemetry/telemetry-wire-validation.ts +39 -2
- package/src/telemetry/telemetry-wire.generated.ts +8 -0
- package/src/telemetry/tool-audit.ts +15 -9
- package/src/telemetry/tool-executed-events-store.test.ts +1 -1
- package/src/telemetry/turn-events-store.ts +20 -0
- package/src/telemetry/types.ts +45 -12
- package/src/telemetry/usage-telemetry-reporter.test.ts +294 -25
- package/src/telemetry/usage-telemetry-reporter.ts +117 -18
- package/src/telemetry/watchdog-direct-emit.test.ts +11 -3
- package/src/telemetry/watchdog-direct-emit.ts +11 -6
- package/src/tools/apps/executors.ts +11 -36
- package/src/tools/executor.ts +14 -1
- package/src/tools/host-terminal/host-shell.ts +6 -2
- package/src/tools/network/__tests__/web-fetch-firecrawl.test.ts +1 -1
- package/src/tools/network/__tests__/web-fetch-metadata.test.ts +25 -0
- package/src/tools/network/web-fetch.ts +6 -2
- package/src/tools/skills/sandbox-runner.ts +5 -2
- package/src/tools/subagent/spawn.ts +7 -11
- package/src/tools/terminal/shell.ts +5 -2
- package/src/tools/tool-manifest.ts +0 -2
- package/src/tools/tool-profiler.ts +37 -6
- package/src/tools/ui-surface/channel-variants.ts +101 -0
- package/src/tools/ui-surface/definitions.ts +23 -67
- package/src/tools/ui-surface/surface-shape-docs.ts +229 -0
- package/src/tts/__tests__/provider-adapters.test.ts +18 -0
- package/src/tts/provider-catalog.ts +2 -4
- package/src/tts/providers/deepgram-provider.ts +10 -1
- package/src/types/onboarding-context.ts +8 -0
- package/src/usage/attribution.ts +18 -112
- package/src/{config/bundled-skills/messaging/tools/gmail-mime-helpers.ts → util/mime-type.ts} +4 -1
- package/src/util/provider-error-patterns.ts +7 -1
- package/src/util/worker-process.ts +105 -0
- package/src/watcher/__tests__/telemetry.test.ts +17 -4
- package/src/watcher/telemetry.ts +5 -5
- package/src/workspace/migrations/131-drop-web-fetch-mode.ts +61 -0
- package/src/workspace/migrations/registry.ts +2 -0
- package/src/workspace/provider-commit-message-generator.ts +6 -4
- package/src/__tests__/app-open-proxy.test.ts +0 -67
- package/src/onboarding/onboarding-research-events-store.test.ts +0 -230
- package/src/onboarding/onboarding-research-events-store.ts +0 -104
- package/src/runtime/routes/assets/vellum-design-system.css +0 -2236
- package/src/tools/apps/definitions.ts +0 -73
- package/src/tools/apps/open-proxy.ts +0 -43
package/package.json
CHANGED
|
@@ -30,6 +30,14 @@ import type {
|
|
|
30
30
|
} from "zod-openapi";
|
|
31
31
|
import { createDocument } from "zod-openapi";
|
|
32
32
|
|
|
33
|
+
import { jsonValueSchema } from "../src/telemetry/telemetry-wire.generated.js";
|
|
34
|
+
|
|
35
|
+
// The recursive wire JSON-value schema (`claims`/`suggestions` item type) must
|
|
36
|
+
// be hoisted into a named component so it can `$ref` itself; without a
|
|
37
|
+
// registered id zod-openapi falls back to an anonymous `__schema0`. Name it
|
|
38
|
+
// explicitly so the spec + generated SDK read as `TelemetryJsonValue`.
|
|
39
|
+
z.globalRegistry.add(jsonValueSchema, { id: "TelemetryJsonValue" });
|
|
40
|
+
|
|
33
41
|
const ROOT = resolve(import.meta.dir, "..");
|
|
34
42
|
const ROUTES_DIR = join(ROOT, "src/runtime/routes");
|
|
35
43
|
const PLUGIN_DEFAULTS_DIR = join(ROOT, "src/plugins/defaults");
|
|
@@ -25,9 +25,8 @@ const { isActivationSession } =
|
|
|
25
25
|
await import("../plugins/defaults/memory/activation-session-store.js");
|
|
26
26
|
const { ACTIVATION_RAIL_BOOTSTRAP_TEMPLATE } =
|
|
27
27
|
await import("../telemetry/activation-funnel.js");
|
|
28
|
-
const {
|
|
28
|
+
const { getMemorySqlite } = await import("../persistence/db-connection.js");
|
|
29
29
|
const { initializeDb } = await import("../persistence/db-init.js");
|
|
30
|
-
const { activationSessions } = await import("../persistence/schema/index.js");
|
|
31
30
|
|
|
32
31
|
await initializeDb();
|
|
33
32
|
|
|
@@ -44,7 +43,7 @@ function seedGenericBootstrap(): void {
|
|
|
44
43
|
|
|
45
44
|
describe("applyBootstrapTemplate — early activation marking", () => {
|
|
46
45
|
beforeEach(() => {
|
|
47
|
-
|
|
46
|
+
getMemorySqlite()!.exec("DELETE FROM activation_sessions");
|
|
48
47
|
});
|
|
49
48
|
|
|
50
49
|
test("marks the conversation when the activation-rail template is applied", () => {
|
|
@@ -71,8 +70,10 @@ describe("applyBootstrapTemplate — early activation marking", () => {
|
|
|
71
70
|
applyBootstrapTemplate(ACTIVATION_RAIL_BOOTSTRAP_TEMPLATE);
|
|
72
71
|
|
|
73
72
|
// Nothing to assert by id; confirm the table stayed empty.
|
|
74
|
-
const
|
|
75
|
-
|
|
73
|
+
const { n } = getMemorySqlite()!
|
|
74
|
+
.query("SELECT COUNT(*) AS n FROM activation_sessions")
|
|
75
|
+
.get() as { n: number };
|
|
76
|
+
expect(n).toBe(0);
|
|
76
77
|
});
|
|
77
78
|
|
|
78
79
|
test("does not mark when BOOTSTRAP.md is customized to something else", () => {
|
|
@@ -13,20 +13,13 @@
|
|
|
13
13
|
* field is omitted from `providerConfig` rather than carrying `undefined`.
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
-
import {
|
|
17
|
-
|
|
18
|
-
import { setOverridesForTesting } from "./feature-flag-test-helpers.js";
|
|
19
|
-
import { setConfig } from "./helpers/set-config.js";
|
|
16
|
+
import { describe, expect, mock, test } from "bun:test";
|
|
20
17
|
|
|
21
18
|
// These suites exercise override-profile PLUMBING through legacy-shaped
|
|
22
19
|
// fixtures (llm.default-centric, no defaultProvider). Pinned to the
|
|
23
20
|
// flag-off cascade; override-or-default resolution semantics are pinned by
|
|
24
21
|
// llm-resolver-override-or-default.test.ts and the inference-profile loop
|
|
25
22
|
// suite.
|
|
26
|
-
beforeAll(() => {
|
|
27
|
-
setOverridesForTesting({ "override-or-default-resolution": false });
|
|
28
|
-
});
|
|
29
|
-
|
|
30
23
|
import { AgentLoop } from "../agent/loop.js";
|
|
31
24
|
import type {
|
|
32
25
|
Message,
|
|
@@ -35,6 +28,7 @@ import type {
|
|
|
35
28
|
SendMessageOptions,
|
|
36
29
|
ToolDefinition,
|
|
37
30
|
} from "../providers/types.js";
|
|
31
|
+
import { setConfig } from "./helpers/set-config.js";
|
|
38
32
|
|
|
39
33
|
const userMessage: Message = {
|
|
40
34
|
role: "user",
|
|
@@ -277,14 +271,20 @@ mock.module("../providers/registry.js", () => ({
|
|
|
277
271
|
resolveProviderFromConnection: async () => anthropicStub,
|
|
278
272
|
}));
|
|
279
273
|
|
|
274
|
+
import { VELLUM_MANAGED_CONNECTION_NAME } from "../providers/vellum-model-routing.js";
|
|
275
|
+
|
|
280
276
|
// Connection-aware resolver path: satisfy
|
|
281
277
|
// `tryResolveProviderForConnectionName` lookups so resolveDefaultProvider
|
|
282
|
-
// returns a usable provider for the
|
|
278
|
+
// returns a usable provider for any connection name the winning profile
|
|
279
|
+
// references. The managed connection must carry the provider the catalog
|
|
280
|
+
// `balanced` default declares (fireworks) or resolution rejects the row as a
|
|
281
|
+
// provider mismatch; other names behave as personal anthropic connections.
|
|
283
282
|
mock.module("../providers/inference/connections.js", () => ({
|
|
284
283
|
getConnection: (_db: unknown, name: string) => ({
|
|
285
284
|
id: 1,
|
|
286
285
|
name,
|
|
287
|
-
provider:
|
|
286
|
+
provider:
|
|
287
|
+
name === VELLUM_MANAGED_CONNECTION_NAME ? "fireworks" : "anthropic",
|
|
288
288
|
auth_strategy: "user_managed_credential",
|
|
289
289
|
credential_alias: null,
|
|
290
290
|
metadata_json: null,
|
|
@@ -295,21 +295,16 @@ mock.module("../providers/inference/connections.js", () => ({
|
|
|
295
295
|
|
|
296
296
|
/**
|
|
297
297
|
* Seed the workspace `llm` config block for real. `activeProfile` and
|
|
298
|
-
* `callSites` vary per test
|
|
298
|
+
* `callSites` vary per test.
|
|
299
299
|
*/
|
|
300
300
|
function seedLlmConfig(options?: {
|
|
301
301
|
activeProfile?: string;
|
|
302
302
|
callSites?: Record<string, unknown>;
|
|
303
303
|
}): void {
|
|
304
304
|
setConfig("llm", {
|
|
305
|
-
default: {
|
|
306
|
-
provider: "anthropic",
|
|
307
|
-
model: "claude-opus-4-7",
|
|
308
|
-
provider_connection: "anthropic-conn",
|
|
309
|
-
},
|
|
310
305
|
profiles: {
|
|
311
|
-
//
|
|
312
|
-
|
|
306
|
+
// Complete (provider + model) so the profile is a usable winner at
|
|
307
|
+
// every rung of the single-winner selection chain.
|
|
313
308
|
fast: {
|
|
314
309
|
source: "user",
|
|
315
310
|
provider: "anthropic",
|
|
@@ -457,7 +452,7 @@ describe("executeSubagentSpawn — nested inheritance via context.overrideProfil
|
|
|
457
452
|
}
|
|
458
453
|
});
|
|
459
454
|
|
|
460
|
-
test("
|
|
455
|
+
test("forwards the invoker's resolved default profile when neither context nor row carries an override", async () => {
|
|
461
456
|
const manager = getSubagentManager();
|
|
462
457
|
const originalSpawn = manager.spawn.bind(manager);
|
|
463
458
|
let capturedConfig: Record<string, unknown> | undefined;
|
|
@@ -479,10 +474,11 @@ describe("executeSubagentSpawn — nested inheritance via context.overrideProfil
|
|
|
479
474
|
);
|
|
480
475
|
|
|
481
476
|
expect(capturedConfig).toBeDefined();
|
|
482
|
-
//
|
|
483
|
-
//
|
|
484
|
-
//
|
|
485
|
-
|
|
477
|
+
// With no explicit override anywhere, the invoker-default tier forwards
|
|
478
|
+
// the invoking call site's resolved default profile — here `mainAgent`
|
|
479
|
+
// with no active profile or pin, which resolves the catalog `balanced`
|
|
480
|
+
// default — so the subagent matches its invoker's model selection.
|
|
481
|
+
expect(capturedConfig!.overrideProfile).toBe("balanced");
|
|
486
482
|
} finally {
|
|
487
483
|
manager.spawn = originalSpawn;
|
|
488
484
|
}
|
|
@@ -491,8 +487,9 @@ describe("executeSubagentSpawn — nested inheritance via context.overrideProfil
|
|
|
491
487
|
test("an explicit subagentSpawn call-site pin suppresses the invoker-default inheritance", async () => {
|
|
492
488
|
// With an active profile the invoker-default tier resolves ("fast"), so
|
|
493
489
|
// absent a pin it is forwarded as the inherited override; with an
|
|
494
|
-
// explicit llm.callSites.subagentSpawn profile the heuristic must yield
|
|
495
|
-
//
|
|
490
|
+
// explicit llm.callSites.subagentSpawn profile the heuristic must yield —
|
|
491
|
+
// a forwarded override would outrank the pin under single-winner
|
|
492
|
+
// resolution, overriding the user's explicit call-site choice.
|
|
496
493
|
const manager = getSubagentManager();
|
|
497
494
|
const originalSpawn = manager.spawn.bind(manager);
|
|
498
495
|
let capturedConfig: Record<string, unknown> | undefined;
|
|
@@ -26,26 +26,7 @@
|
|
|
26
26
|
* pinned-profile values.
|
|
27
27
|
*/
|
|
28
28
|
|
|
29
|
-
import {
|
|
30
|
-
afterEach,
|
|
31
|
-
beforeAll,
|
|
32
|
-
beforeEach,
|
|
33
|
-
describe,
|
|
34
|
-
expect,
|
|
35
|
-
mock,
|
|
36
|
-
test,
|
|
37
|
-
} from "bun:test";
|
|
38
|
-
|
|
39
|
-
import { setOverridesForTesting } from "./feature-flag-test-helpers.js";
|
|
40
|
-
|
|
41
|
-
// These suites exercise override-profile PLUMBING through legacy-shaped
|
|
42
|
-
// fixtures (llm.default-centric, no defaultProvider). Pinned to the
|
|
43
|
-
// flag-off cascade; override-or-default resolution semantics are pinned by
|
|
44
|
-
// llm-resolver-override-or-default.test.ts and the inference-profile loop
|
|
45
|
-
// suite.
|
|
46
|
-
beforeAll(() => {
|
|
47
|
-
setOverridesForTesting({ "override-or-default-resolution": false });
|
|
48
|
-
});
|
|
29
|
+
import { afterEach, beforeEach, describe, expect, mock, test } from "bun:test";
|
|
49
30
|
|
|
50
31
|
let mockOverrideProfile: string | undefined = undefined;
|
|
51
32
|
|
|
@@ -140,14 +121,12 @@ describe("wakeAgentForOpportunity — overrideProfile forwarding", () => {
|
|
|
140
121
|
test("forwards the conversation's pinned overrideProfile + mainAgent callSite to agentLoop.run", async () => {
|
|
141
122
|
mockOverrideProfile = "frontier";
|
|
142
123
|
setLlmConfig({
|
|
143
|
-
default: {
|
|
144
|
-
provider: "anthropic",
|
|
145
|
-
model: "claude-sonnet-4-6",
|
|
146
|
-
maxTokens: 64000,
|
|
147
|
-
contextWindow: { maxInputTokens: 200000 },
|
|
148
|
-
},
|
|
149
124
|
profiles: {
|
|
125
|
+
// Complete (provider + model) so the pinned profile is a usable
|
|
126
|
+
// winner; its context window is what the wake must resolve.
|
|
150
127
|
frontier: {
|
|
128
|
+
provider: "anthropic",
|
|
129
|
+
model: "claude-sonnet-4-6",
|
|
151
130
|
contextWindow: { maxInputTokens: 150000 },
|
|
152
131
|
},
|
|
153
132
|
},
|
|
@@ -184,23 +163,24 @@ describe("wakeAgentForOpportunity — overrideProfile forwarding", () => {
|
|
|
184
163
|
test("forceOverrideProfile replaces the pinned-profile lookup and forwards the force flag to agentLoop.run", async () => {
|
|
185
164
|
// The conversation's own pinned profile must be ignored — the caller's
|
|
186
165
|
// forced profile (e.g. a fork-based retrospective matching the source
|
|
187
|
-
// conversation) takes its place
|
|
188
|
-
//
|
|
166
|
+
// conversation) takes its place and, as the override rung of the
|
|
167
|
+
// single-winner chain, beats the call site's own pinned profile.
|
|
189
168
|
mockOverrideProfile = "pinned-ignored";
|
|
190
169
|
setLlmConfig({
|
|
191
|
-
default: {
|
|
192
|
-
provider: "anthropic",
|
|
193
|
-
model: "claude-sonnet-4-6",
|
|
194
|
-
maxTokens: 64000,
|
|
195
|
-
contextWindow: { maxInputTokens: 200000 },
|
|
196
|
-
},
|
|
197
170
|
profiles: {
|
|
198
171
|
forced: {
|
|
172
|
+
provider: "anthropic",
|
|
173
|
+
model: "claude-sonnet-4-6",
|
|
199
174
|
contextWindow: { maxInputTokens: 120000 },
|
|
200
175
|
},
|
|
176
|
+
"retrospective-pinned": {
|
|
177
|
+
provider: "anthropic",
|
|
178
|
+
model: "claude-sonnet-4-6",
|
|
179
|
+
contextWindow: { maxInputTokens: 180000 },
|
|
180
|
+
},
|
|
201
181
|
},
|
|
202
182
|
callSites: {
|
|
203
|
-
memoryRetrospective: {
|
|
183
|
+
memoryRetrospective: { profile: "retrospective-pinned" },
|
|
204
184
|
},
|
|
205
185
|
});
|
|
206
186
|
const { target, runArgs } = makeTarget();
|
|
@@ -221,8 +201,9 @@ describe("wakeAgentForOpportunity — overrideProfile forwarding", () => {
|
|
|
221
201
|
expect(runArgs[0]!.options?.overrideProfile).toBe("forced");
|
|
222
202
|
expect(runArgs[0]!.options?.forceOverrideProfile).toBe(true);
|
|
223
203
|
expect(runArgs[0]!.options?.callSite).toBe("memoryRetrospective");
|
|
224
|
-
// The effective context window resolves under the FORCED profile,
|
|
225
|
-
//
|
|
204
|
+
// The effective context window resolves under the FORCED profile, which
|
|
205
|
+
// wins selection over the call site's own pinned profile (the forced
|
|
206
|
+
// profile's 120k beats the call-site profile's 180k).
|
|
226
207
|
expect(runArgs[0]!.options?.resolveContextWindow?.().maxInputTokens).toBe(
|
|
227
208
|
120000,
|
|
228
209
|
);
|
|
@@ -231,13 +212,9 @@ describe("wakeAgentForOpportunity — overrideProfile forwarding", () => {
|
|
|
231
212
|
test("without forceOverrideProfile the wake never sets the force flag", async () => {
|
|
232
213
|
mockOverrideProfile = "frontier";
|
|
233
214
|
setLlmConfig({
|
|
234
|
-
|
|
235
|
-
provider: "anthropic",
|
|
236
|
-
model: "claude-sonnet-4-6",
|
|
237
|
-
maxTokens: 64000,
|
|
238
|
-
contextWindow: { maxInputTokens: 200000 },
|
|
215
|
+
profiles: {
|
|
216
|
+
frontier: { provider: "anthropic", model: "claude-sonnet-4-6" },
|
|
239
217
|
},
|
|
240
|
-
profiles: { frontier: {} },
|
|
241
218
|
callSites: { mainAgent: {} },
|
|
242
219
|
});
|
|
243
220
|
const { target, runArgs } = makeTarget();
|
|
@@ -317,13 +294,9 @@ describe("wakeAgentForOpportunity — resolver actually engages", () => {
|
|
|
317
294
|
// undefined (the original bug), the retry layer would skip the resolver
|
|
318
295
|
// entirely and the downstream provider would see only the wire defaults.
|
|
319
296
|
setLlmConfig({
|
|
320
|
-
default: {
|
|
321
|
-
provider: "anthropic",
|
|
322
|
-
model: "claude-sonnet-4-6",
|
|
323
|
-
maxTokens: 64000,
|
|
324
|
-
},
|
|
325
297
|
profiles: {
|
|
326
298
|
frontier: {
|
|
299
|
+
provider: "anthropic",
|
|
327
300
|
model: "claude-opus-4-7",
|
|
328
301
|
maxTokens: 32000,
|
|
329
302
|
},
|
|
@@ -21,7 +21,6 @@ mock.module("../apps/app-store.js", () => ({
|
|
|
21
21
|
getApp: (id: string) => mockApps.get(id) ?? null,
|
|
22
22
|
getAppsDir: () => testAppsDir,
|
|
23
23
|
getAppDirPath: (id: string) => join(testAppsDir, id),
|
|
24
|
-
isMultifileApp: (app: Record<string, unknown>) => app.formatVersion === 2,
|
|
25
24
|
}));
|
|
26
25
|
|
|
27
26
|
// Mock content-id to avoid pulling in crypto internals
|
|
@@ -323,19 +322,12 @@ render(<App />, document.getElementById('app')!);
|
|
|
323
322
|
expect(zip.file("main.css")).toBeNull();
|
|
324
323
|
});
|
|
325
324
|
|
|
326
|
-
test("
|
|
325
|
+
test("rejects legacy single-file apps with a missing-src error", async () => {
|
|
327
326
|
const appId = "legacy-single-file";
|
|
328
327
|
setupLegacyApp(appId);
|
|
329
328
|
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
const indexContent = await zip.file("index.html")!.async("string");
|
|
335
|
-
const manifestJson = await zip.file("manifest.json")!.async("string");
|
|
336
|
-
const manifest: AppManifest = JSON.parse(manifestJson);
|
|
337
|
-
|
|
338
|
-
expect(indexContent).toContain("<h1>Legacy</h1>");
|
|
339
|
-
expect(manifest.format_version).toBe(1);
|
|
329
|
+
await expect(packageApp(appId)).rejects.toThrow(
|
|
330
|
+
/missing src\/index\.html and src\/main\.tsx/,
|
|
331
|
+
);
|
|
340
332
|
});
|
|
341
333
|
});
|
|
@@ -39,18 +39,6 @@ import {
|
|
|
39
39
|
// Helpers
|
|
40
40
|
// ---------------------------------------------------------------------------
|
|
41
41
|
|
|
42
|
-
function makeLegacyApp(overrides?: Partial<AppDefinition>): AppDefinition {
|
|
43
|
-
return {
|
|
44
|
-
id: "legacy-app",
|
|
45
|
-
name: "Legacy App",
|
|
46
|
-
schemaJson: "{}",
|
|
47
|
-
htmlDefinition: "<html></html>",
|
|
48
|
-
createdAt: Date.now(),
|
|
49
|
-
updatedAt: Date.now(),
|
|
50
|
-
...overrides,
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
|
|
54
42
|
function makeMultifileApp(overrides?: Partial<AppDefinition>): AppDefinition {
|
|
55
43
|
return {
|
|
56
44
|
id: "multi-app",
|
|
@@ -150,9 +138,7 @@ describe("executeAppCreate", () => {
|
|
|
150
138
|
);
|
|
151
139
|
|
|
152
140
|
expect(result.isError).toBe(false);
|
|
153
|
-
//
|
|
154
|
-
expect(createdParams?.formatVersion).toBe(2);
|
|
155
|
-
// htmlDefinition should be empty for multifile apps
|
|
141
|
+
// htmlDefinition should be empty — the real source lives under src/
|
|
156
142
|
expect(createdParams?.htmlDefinition).toBe("");
|
|
157
143
|
// Scaffold files should be written
|
|
158
144
|
expect(files["src/index.html"]).toBeDefined();
|
|
@@ -455,20 +441,6 @@ describe("executeAppCreate", () => {
|
|
|
455
441
|
// ---------------------------------------------------------------------------
|
|
456
442
|
|
|
457
443
|
describe("executeAppRefresh", () => {
|
|
458
|
-
test("legacy app: bumps updatedAt without compiling", async () => {
|
|
459
|
-
const app = makeLegacyApp();
|
|
460
|
-
const store = mockStore(app);
|
|
461
|
-
const result = await executeAppRefresh({ app_id: app.id }, store);
|
|
462
|
-
|
|
463
|
-
expect(result.isError).toBe(false);
|
|
464
|
-
const parsed = JSON.parse(result.content);
|
|
465
|
-
expect(parsed.refreshed).toBe(true);
|
|
466
|
-
expect(parsed.appId).toBe(app.id);
|
|
467
|
-
// Legacy apps should not have compile-related fields
|
|
468
|
-
expect(parsed.compiled).toBeUndefined();
|
|
469
|
-
expect(parsed.compile_errors).toBeUndefined();
|
|
470
|
-
});
|
|
471
|
-
|
|
472
444
|
test("multifile app: compiles src/ and returns result", async () => {
|
|
473
445
|
const app = makeMultifileApp();
|
|
474
446
|
const store = mockStore(app);
|
|
@@ -483,7 +455,7 @@ describe("executeAppRefresh", () => {
|
|
|
483
455
|
});
|
|
484
456
|
|
|
485
457
|
test("returns error for unknown app", async () => {
|
|
486
|
-
const app =
|
|
458
|
+
const app = makeMultifileApp();
|
|
487
459
|
const store = mockStore(app);
|
|
488
460
|
const result = await executeAppRefresh({ app_id: "nonexistent" }, store);
|
|
489
461
|
|
|
@@ -541,25 +513,6 @@ describe("executeAppUpdate", () => {
|
|
|
541
513
|
expect(JSON.parse(result.content).compiled).toBe(true);
|
|
542
514
|
});
|
|
543
515
|
|
|
544
|
-
test("legacy app: updates without compiling", async () => {
|
|
545
|
-
const app = makeLegacyApp({ name: "Legacy" });
|
|
546
|
-
const store: AppStore = {
|
|
547
|
-
...mockStore(app),
|
|
548
|
-
updateApp: (_id, updates) => ({ ...app, ...updates }),
|
|
549
|
-
};
|
|
550
|
-
|
|
551
|
-
const result = await executeAppUpdate(
|
|
552
|
-
{ app_id: app.id, name: "Renamed" },
|
|
553
|
-
store,
|
|
554
|
-
);
|
|
555
|
-
|
|
556
|
-
expect(result.isError).toBe(false);
|
|
557
|
-
const parsed = JSON.parse(result.content);
|
|
558
|
-
expect(parsed.updated).toBe(true);
|
|
559
|
-
expect(parsed.name).toBe("Renamed");
|
|
560
|
-
expect(parsed.compiled).toBeUndefined();
|
|
561
|
-
});
|
|
562
|
-
|
|
563
516
|
test("returns error for unknown app", async () => {
|
|
564
517
|
const store = mockStore(makeMultifileApp());
|
|
565
518
|
const result = await executeAppUpdate({ app_id: "nope" }, store);
|