@mycadet/assistant 0.12.7 → 0.12.9
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/README.md +1 -1
- package/docs/activation-funnel-telemetry.md +6 -6
- package/docs/cadet-doctor.md +7 -7
- package/docs/desktop-browser-cli.md +7 -7
- package/docs/skills.md +2 -2
- package/docs/voice-input-diagnostics.md +1 -1
- package/eslint-rules/__tests__/cli-no-daemon-internals.test.ts +2 -2
- package/node_modules/@mycadet/avatar-manifest/src/__tests__/notification-avatar.test.ts +1 -1
- package/node_modules/@mycadet/avatar-manifest/src/notification-avatar.ts +2 -2
- package/node_modules/@mycadet/ces-client/node_modules/@mycadet/service-contracts/package.json +2 -2
- package/node_modules/@mycadet/ces-client/node_modules/@mycadet/service-contracts/src/{platform-credential.ts → cloud-credential.ts} +9 -9
- package/node_modules/@mycadet/ces-client/node_modules/@mycadet/service-contracts/src/handles.ts +3 -3
- package/node_modules/@mycadet/ces-client/node_modules/@mycadet/service-contracts/src/index.ts +1 -1
- package/node_modules/@mycadet/ces-client/node_modules/@mycadet/service-contracts/src/ingress.ts +11 -5
- package/node_modules/@mycadet/ces-client/node_modules/@mycadet/service-contracts/src/remote-web-pairing.ts +1 -1
- package/node_modules/@mycadet/ces-client/node_modules/@mycadet/service-contracts/src/rpc.ts +14 -14
- package/node_modules/@mycadet/ces-client/node_modules/@mycadet/service-contracts/src/trust-rules.ts +5 -5
- package/node_modules/@mycadet/ces-client/package.json +1 -1
- package/node_modules/@mycadet/ces-client/src/__tests__/ces-client.test.ts +14 -14
- package/node_modules/@mycadet/ces-client/src/rpc-client.ts +1 -1
- package/node_modules/@mycadet/credential-storage/src/oauth-runtime.ts +1 -1
- package/node_modules/@mycadet/credential-storage/src/static-credentials.ts +1 -1
- package/node_modules/@mycadet/environments/src/seeds.ts +6 -6
- package/node_modules/@mycadet/environments/src/shell.test.ts +1 -1
- package/node_modules/@mycadet/environments/src/types.ts +6 -6
- package/node_modules/@mycadet/gateway-client/node_modules/@mycadet/service-contracts/package.json +2 -2
- package/node_modules/@mycadet/gateway-client/node_modules/@mycadet/service-contracts/src/{platform-credential.ts → cloud-credential.ts} +9 -9
- package/node_modules/@mycadet/gateway-client/node_modules/@mycadet/service-contracts/src/handles.ts +3 -3
- package/node_modules/@mycadet/gateway-client/node_modules/@mycadet/service-contracts/src/index.ts +1 -1
- package/node_modules/@mycadet/gateway-client/node_modules/@mycadet/service-contracts/src/ingress.ts +11 -5
- package/node_modules/@mycadet/gateway-client/node_modules/@mycadet/service-contracts/src/remote-web-pairing.ts +1 -1
- package/node_modules/@mycadet/gateway-client/node_modules/@mycadet/service-contracts/src/rpc.ts +14 -14
- package/node_modules/@mycadet/gateway-client/node_modules/@mycadet/service-contracts/src/trust-rules.ts +5 -5
- package/node_modules/@mycadet/gateway-client/src/binding-strength-contract.ts +5 -5
- package/node_modules/@mycadet/gateway-client/src/gateway-ipc-contracts.ts +1 -1
- package/node_modules/@mycadet/gateway-client/src/inbound-contract.ts +2 -2
- package/node_modules/@mycadet/gateway-client/src/outbound-contract.ts +1 -1
- package/node_modules/@mycadet/service-contracts/package.json +2 -2
- package/node_modules/@mycadet/service-contracts/src/{platform-credential.ts → cloud-credential.ts} +9 -9
- package/node_modules/@mycadet/service-contracts/src/handles.ts +3 -3
- package/node_modules/@mycadet/service-contracts/src/index.ts +1 -1
- package/node_modules/@mycadet/service-contracts/src/ingress.ts +11 -5
- package/node_modules/@mycadet/service-contracts/src/remote-web-pairing.ts +1 -1
- package/node_modules/@mycadet/service-contracts/src/rpc.ts +14 -14
- package/node_modules/@mycadet/service-contracts/src/trust-rules.ts +5 -5
- package/openapi.yaml +6804 -799
- package/package.json +2 -2
- package/scripts/build-test-fixtures.ts +1 -1
- package/scripts/probe-skill-retrieval.ts +1 -1
- package/scripts/sync-llm-catalog.ts +2 -2
- package/scripts/voice-ttft-spike.ts +2 -2
- package/src/__tests__/adaptive-thinking-repair.test.ts +4 -4
- package/src/__tests__/agent-loop-override-profile.test.ts +4 -4
- package/src/__tests__/agent-loop-subagent-billing-headers.test.ts +1 -1
- package/src/__tests__/anthropic-provider.test.ts +2 -2
- package/src/__tests__/available-skills.test.ts +11 -12
- package/src/__tests__/avatar-identity-sync.test.ts +1 -1
- package/src/__tests__/byok-default-profile-ensure.test.ts +7 -7
- package/src/__tests__/call-domain.test.ts +1 -1
- package/src/__tests__/call-site-routing-connection-auto-resolve.test.ts +2 -2
- package/src/__tests__/catalog-files.test.ts +10 -10
- package/src/__tests__/catalog-install-normalize.test.ts +3 -3
- package/src/__tests__/channel-availability-routes.test.ts +8 -8
- package/src/__tests__/channel-readiness-routes.test.ts +4 -4
- package/src/__tests__/channel-readiness-service.test.ts +14 -14
- package/src/__tests__/channel-readiness-telegram-remote.test.ts +1 -1
- package/src/__tests__/chat-reveal-guard-priming.test.ts +5 -6
- package/src/__tests__/checker.test.ts +6 -6
- package/src/__tests__/clawhub.test.ts +1 -1
- package/src/__tests__/{platform-callback-registration.test.ts → cloud-callback-registration.test.ts} +66 -90
- package/src/__tests__/{platform-client-verify-credential.test.ts → cloud-client-verify-credential.test.ts} +14 -14
- package/src/__tests__/{managed-credential-catalog-cli.test.ts → cloud-credential-catalog-cli.test.ts} +41 -41
- package/src/__tests__/{managed-fallback-dispatch.test.ts → cloud-fallback-dispatch.test.ts} +21 -16
- package/src/__tests__/{managed-profile-guard.test.ts → cloud-profile-guard.test.ts} +77 -75
- package/src/__tests__/{platform-proxy-context.test.ts → cloud-proxy-context.test.ts} +44 -44
- package/src/__tests__/{managed-speech-defaults.test.ts → cloud-speech-defaults.test.ts} +41 -41
- package/src/__tests__/{managed-store.test.ts → cloud-store.test.ts} +99 -99
- package/src/__tests__/compaction-events.test.ts +7 -5
- package/src/__tests__/config-loader-backfill.test.ts +65 -65
- package/src/__tests__/config-loader-cloud-defaults.test.ts +373 -0
- package/src/__tests__/config-loader-corrupt.test.ts +1 -1
- package/src/__tests__/config-loader-validation-reset-notice.test.ts +1 -1
- package/src/__tests__/config-schema.test.ts +3 -3
- package/src/__tests__/{config-set-platform-guard.test.ts → config-set-cloud-guard.test.ts} +6 -6
- package/src/__tests__/config-set-route.test.ts +12 -8
- package/src/__tests__/config-watcher-cleanup-throttle.test.ts +0 -8
- package/src/__tests__/config-watcher.test.ts +1 -1
- package/src/__tests__/contacts-write.test.ts +1 -1
- package/src/__tests__/conversation-agent-loop.test.ts +2 -2
- package/src/__tests__/conversation-app-control-instantiation.test.ts +18 -18
- package/src/__tests__/conversation-error.test.ts +45 -45
- package/src/__tests__/conversation-inference-profile-route.test.ts +4 -4
- package/src/__tests__/conversation-rendered-delegation-state.test.ts +4 -4
- package/src/__tests__/conversation-skill-tools.test.ts +7 -8
- package/src/__tests__/conversation-slash.test.ts +2 -2
- package/src/__tests__/conversation-speed-override.test.ts +8 -10
- package/src/__tests__/conversation-summarize-up-to.test.ts +4 -4
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +1 -1
- package/src/__tests__/conversation-wait-for-idle.test.ts +7 -5
- package/src/__tests__/credential-execution-api-key-propagation.test.ts +5 -5
- package/src/__tests__/{credential-execution-managed-contract.test.ts → credential-execution-cloud-contract.test.ts} +24 -24
- package/src/__tests__/credential-health-service.test.ts +28 -40
- package/src/__tests__/credential-routes.test.ts +85 -165
- package/src/__tests__/credential-security-invariants.test.ts +6 -7
- package/src/__tests__/custom-profile-ensure.test.ts +1 -1
- package/src/__tests__/date-context.test.ts +1 -1
- package/src/__tests__/default-profile-catalog-fallback.test.ts +15 -15
- package/src/__tests__/delete-managed-skill-tool.test.ts +8 -8
- package/src/__tests__/discord-callback-round-trip.test.ts +1 -1
- package/src/__tests__/disk-usage.test.ts +3 -3
- package/src/__tests__/email-invite-adapter.test.ts +5 -5
- package/src/__tests__/{embedding-managed-proxy-selection.test.ts → embedding-cloud-proxy-selection.test.ts} +44 -43
- package/src/__tests__/emit-signal-routing-intent.test.ts +13 -15
- package/src/__tests__/events-dev-bypass-actor.test.ts +2 -2
- package/src/__tests__/fallback-breaker.test.ts +7 -7
- package/src/__tests__/feature-flag-test-helpers.ts +106 -0
- package/src/__tests__/gateway-flag-listener.test.ts +1 -1
- package/src/__tests__/gemini-image-service.test.ts +2 -2
- package/src/__tests__/gemini-provider.test.ts +5 -5
- package/src/__tests__/get-skill-detail-audit.test.ts +134 -288
- package/src/__tests__/guardian-verification-voice-binding.test.ts +1 -1
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +5 -5
- package/src/__tests__/host-cu-routes-targeted.test.ts +8 -8
- package/src/__tests__/image-credentials.test.ts +13 -13
- package/src/__tests__/inbound-admitted-introduction-nudge.test.ts +14 -6
- package/src/__tests__/inbound-trust-verdict.test.ts +14 -6
- package/src/__tests__/inference-no-mode-boot-e2e.test.ts +11 -11
- package/src/__tests__/inference-profile-session-handler.test.ts +7 -7
- package/src/__tests__/inference-profile-session-ipc.test.ts +5 -5
- package/src/__tests__/inference-profile-validation-jev.test.ts +1 -1
- package/src/__tests__/init-feature-flag-overrides.test.ts +40 -24
- package/src/__tests__/input-repairs.test.ts +1 -1
- package/src/__tests__/install-skill-routing.test.ts +10 -8
- package/src/__tests__/integration-status.test.ts +5 -5
- package/src/__tests__/internal-telemetry-routes.test.ts +3 -3
- package/src/__tests__/invite-routes-http.test.ts +1 -1
- package/src/__tests__/llm-catalog-parity.test.ts +5 -7
- package/src/__tests__/llm-request-log-source-clickhouse.test.ts +2 -2
- package/src/__tests__/llm-resolver-override-or-default.test.ts +3 -3
- package/src/__tests__/llm-resolver.test.ts +1 -1
- package/src/__tests__/llm-schema-fallback-profile.test.ts +25 -19
- package/src/__tests__/llm-usage-store.test.ts +1 -1
- package/src/__tests__/managed-skill-lifecycle.test.ts +12 -12
- package/src/__tests__/mcp-abort-signal.test.ts +1 -2
- package/src/__tests__/mcp-client-auth.test.ts +1 -2
- package/src/__tests__/mcp-config-secret-boundary.test.ts +44 -40
- package/src/__tests__/mcp-tool-annotations-risk.test.ts +1 -2
- package/src/__tests__/media-generate-image.test.ts +30 -30
- package/src/__tests__/memory-config-file-parity.test.ts +6 -6
- package/src/__tests__/migration-export-to-gcs.test.ts +4 -4
- package/src/__tests__/migration-import-commit-http.test.ts +1 -1
- package/src/__tests__/mtime-cache.test.ts +2 -2
- package/src/__tests__/{notification-platform-adapter.test.ts → notification-cloud-adapter.test.ts} +39 -39
- package/src/__tests__/notification-deep-link.test.ts +40 -40
- package/src/__tests__/oauth-apps-routes.test.ts +3 -3
- package/src/__tests__/oauth-cli.test.ts +9 -9
- package/src/__tests__/oauth-commands-routes.test.ts +16 -16
- package/src/__tests__/oauth-connect-orchestrator.test.ts +2 -2
- package/src/__tests__/oauth-provider-serializer.test.ts +11 -11
- package/src/__tests__/oauth-providers-routes.test.ts +12 -12
- package/src/__tests__/oauth-store.test.ts +1 -1
- package/src/__tests__/oauth2-gateway-transport.test.ts +3 -3
- package/src/__tests__/onboarding-persona-write.test.ts +2 -2
- package/src/__tests__/openai-image-service.test.ts +2 -2
- package/src/__tests__/openai-responses-cutover-guard.test.ts +2 -2
- package/src/__tests__/openai-responses-provider.test.ts +1 -1
- package/src/__tests__/path-policy.test.ts +4 -4
- package/src/__tests__/personal-memory-auth-bypass.test.ts +1 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +18 -18
- package/src/__tests__/plugin-api-model-profiles.test.ts +1 -1
- package/src/__tests__/plugin-api-provider.test.ts +1 -1
- package/src/__tests__/plugin-api-store-credential.test.ts +4 -1
- package/src/__tests__/plugin-api-webhook-url.test.ts +4 -5
- package/src/__tests__/plugin-import-boundary-guard.test.ts +8 -39
- package/src/__tests__/plugin-import-boundary-reverse-guard.test.ts +2 -2
- package/src/__tests__/{provider-platform-proxy-integration.test.ts → provider-cloud-proxy-integration.test.ts} +70 -72
- package/src/__tests__/provider-commit-message-generator.test.ts +1 -1
- package/src/__tests__/provider-connections-backfill.test.ts +9 -9
- package/src/__tests__/provider-error-scenarios.test.ts +8 -8
- package/src/__tests__/provider-registry-ollama.test.ts +1 -1
- package/src/__tests__/provider-send-message-override-profile.test.ts +5 -5
- package/src/__tests__/registry.test.ts +3 -3
- package/src/__tests__/requests-mock.ts +972 -0
- package/src/__tests__/resolve-trust-class.test.ts +1 -1
- package/src/__tests__/resource-pressure-guard.test.ts +6 -6
- package/src/__tests__/resource-pressure-routes.test.ts +5 -5
- package/src/__tests__/retry-fallback-escalation.test.ts +5 -5
- package/src/__tests__/sanitize-config-for-transfer.test.ts +1 -1
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +97 -97
- package/src/__tests__/schedule-store.test.ts +1 -1
- package/src/__tests__/search-skills-unified.test.ts +9 -7
- package/src/__tests__/{secret-routes-platform-proxy.test.ts → secret-routes-cloud-proxy.test.ts} +48 -95
- package/src/__tests__/secret-routes-scrub.test.ts +2 -59
- package/src/__tests__/secure-keys.test.ts +1 -1
- package/src/__tests__/skill-load-plugin-scope.test.ts +2 -2
- package/src/__tests__/skill-load-tool.test.ts +1 -1
- package/src/__tests__/skill-projection-feature-flag.test.ts +0 -19
- package/src/__tests__/skill-projection.benchmark.test.ts +5 -7
- package/src/__tests__/skill-tool-factory.test.ts +1 -1
- package/src/__tests__/skills-file-content-endpoint.test.ts +222 -536
- package/src/__tests__/skills-files-catalog-fallback.test.ts +259 -577
- package/src/__tests__/skills.test.ts +1 -1
- package/src/__tests__/slim-skill-category.test.ts +11 -9
- package/src/__tests__/stt-stream-session.test.ts +3 -3
- package/src/__tests__/subagent-call-site-routing.test.ts +1 -1
- package/src/__tests__/subagent-disposal.test.ts +5 -5
- package/src/__tests__/subagent-fork-notifications.test.ts +4 -4
- package/src/__tests__/subagent-fork-spawn.test.ts +5 -5
- package/src/__tests__/subagent-manager-notify.test.ts +5 -5
- package/src/__tests__/subagent-tool-gate-mode.test.ts +2 -2
- package/src/__tests__/system-prompt.test.ts +1 -1
- package/src/__tests__/telegram-bot-username-resolution.test.ts +34 -52
- package/src/__tests__/telegram-config.test.ts +16 -16
- package/src/__tests__/telephony-tts-guard.test.ts +13 -13
- package/src/__tests__/test-preload.ts +17 -7
- package/src/__tests__/tool-audit.test.ts +1 -1
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +7 -5
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +1 -1
- package/src/__tests__/turn-events-store.test.ts +1 -1
- package/src/__tests__/twilio-routes.test.ts +2 -1
- package/src/__tests__/ui-choice-copy-surfaces.test.ts +1 -1
- package/src/__tests__/unified-turn-context-client-os.test.ts +1 -1
- package/src/__tests__/validate-input.test.ts +5 -5
- package/src/__tests__/verification-outbound-delivery.test.ts +1 -1
- package/src/__tests__/voice-config-update.test.ts +15 -15
- package/src/__tests__/voice-ingress-preflight.test.ts +4 -4
- package/src/__tests__/web-search.test.ts +340 -859
- package/src/__tests__/workspace-git-service.test.ts +1 -1
- package/src/__tests__/workspace-migration-082-backfill-managed-profile-labels.test.ts +12 -12
- package/src/__tests__/workspace-migration-087-memory-router-balanced-profile.test.ts +1 -1
- package/src/__tests__/workspace-migration-090-memory-router-cost-optimized-profile.test.ts +1 -1
- package/src/__tests__/workspace-migration-100-upgrade-quality-profile-to-fable-5.test.ts +1 -1
- package/src/__tests__/workspace-migration-103-upgrade-quality-profile-to-opus-4-8.test.ts +1 -1
- package/src/__tests__/workspace-migration-110-flip-balanced-profile-to-together.test.ts +1 -1
- package/src/__tests__/workspace-migration-113-swap-balanced-profile-to-glm-5p2.test.ts +1 -1
- package/src/__tests__/workspace-migration-114-swap-quality-profile-to-opus.test.ts +1 -1
- package/src/__tests__/workspace-migration-123-swap-quality-profile-to-fable.test.ts +1 -1
- package/src/__tests__/workspace-migration-125-repoint-managed-connections-to-cadet.test.ts +3 -3
- package/src/__tests__/workspace-migration-126-strip-managed-profile-bodies.test.ts +9 -9
- package/src/__tests__/workspace-migration-127-backfill-default-provider.test.ts +11 -11
- package/src/__tests__/workspace-migration-130-speech-mode-to-provider.test.ts +3 -3
- package/src/__tests__/workspace-migration-132-web-search-mode-to-provider.test.ts +6 -6
- package/src/__tests__/workspace-migration-133-collapse-provider-connections.test.ts +3 -3
- package/src/__tests__/workspace-migration-134-image-generation-mode-to-provider.test.ts +6 -6
- package/src/__tests__/workspace-migration-136-repair-stale-fireworks-kimi-model-id.test.ts +1 -1
- package/src/__tests__/workspace-migration-137-repair-retired-fireworks-minimax-model-id.test.ts +1 -1
- package/src/__tests__/workspace-migration-146-repair-retired-fireworks-deepseek-flash-model-id.test.ts +1 -1
- package/src/__tests__/workspace-migration-147-rename-colliding-backup-profile-names.test.ts +1 -1
- package/src/__tests__/workspace-migration-151-repair-renamed-fireworks-deepseek-pro-model-id.test.ts +1 -1
- package/src/__tests__/workspace-migration-152-repair-retired-fireworks-minimax-m2p7-model-id.test.ts +1 -1
- package/src/__tests__/workspace-migration-159-rename-colliding-jev-profile-name.test.ts +1 -1
- package/src/__tests__/workspace-migration-160-repair-retired-fireworks-model-ids.test.ts +1 -1
- package/src/__tests__/workspace-migration-161-repair-retired-fireworks-glm-5p2-model-id.test.ts +1 -1
- package/src/api/events/cloud-disconnected.ts +21 -0
- package/src/api/events/host-bash.ts +1 -1
- package/src/api/events/host-cu.ts +1 -1
- package/src/api/events/host-file.ts +1 -1
- package/src/api/events/notification-intent.ts +1 -1
- package/src/api/events/show-cloud-login.ts +18 -0
- package/src/api/index.ts +11 -11
- package/src/api/responses/home.ts +1 -1
- package/src/api/surfaces.ts +4 -4
- package/src/approvals/guardian-request-resolvers.ts +2 -2
- package/src/avatar/accent-backfill.ts +1 -1
- package/src/avatar/identity-avatar.ts +1 -1
- package/src/avatar/notification-avatar.test.ts +2 -2
- package/src/avatar/notification-avatar.ts +2 -2
- package/src/avatar/resvg-lazy.test.ts +1 -1
- package/src/avatar/resvg-lazy.ts +3 -3
- package/src/avatar/sync-avatar.test.ts +76 -76
- package/src/avatar/sync-avatar.ts +15 -15
- package/src/avatar/traits-png-sync.ts +1 -1
- package/src/background-wake/background-wake-routes.test.ts +39 -39
- package/src/background-wake/{platform-client.test.ts → cloud-client.test.ts} +11 -11
- package/src/background-wake/{platform-client.ts → cloud-client.ts} +14 -14
- package/src/background-wake/publisher.ts +4 -4
- package/src/background-wake/wake-intent-hooks.test.ts +3 -3
- package/src/calls/__tests__/call-controller.test.ts +2 -2
- package/src/calls/__tests__/voice-session-bridge.test.ts +1 -1
- package/src/calls/call-domain.ts +1 -1
- package/src/calls/resolve-call-tts-provider.ts +6 -6
- package/src/calls/telephony-credential-preflight.ts +3 -3
- package/src/calls/telephony-tts-capability.ts +5 -6
- package/src/calls/tts-call-strategy.ts +1 -1
- package/src/calls/voice-escalation-judge.ts +1 -1
- package/src/calls/voice-ingress-preflight.ts +4 -4
- package/src/cli/bundled-modules.ts +1 -1
- package/src/cli/commands/__tests__/apps.test.ts +18 -53
- package/src/cli/commands/__tests__/plugins.test.ts +13 -13
- package/src/cli/commands/__tests__/tts.test.ts +1 -1
- package/src/cli/commands/auth.help.ts +3 -3
- package/src/cli/commands/auth.ts +2 -4
- package/src/cli/commands/browser.help.ts +2 -2
- package/src/cli/commands/channels/index.help.ts +2 -2
- package/src/cli/commands/channels/index.ts +1 -1
- package/src/cli/commands/channels/send.ts +1 -1
- package/src/cli/commands/cloud/__tests__/callback-routes-list.test.ts +2 -2
- package/src/cli/commands/cloud/__tests__/connect.test.ts +1 -1
- package/src/cli/commands/cloud/__tests__/disconnect.test.ts +3 -4
- package/src/cli/commands/cloud/connect.ts +2 -2
- package/src/cli/commands/cloud/credits-format.ts +1 -1
- package/src/cli/commands/cloud/index.help.ts +35 -35
- package/src/cli/commands/cloud/index.ts +1 -1
- package/src/cli/commands/config.ts +2 -2
- package/src/cli/commands/credentials.ts +10 -12
- package/src/cli/commands/domain.ts +1 -1
- package/src/cli/commands/email.help.ts +1 -1
- package/src/cli/commands/email.ts +2 -2
- package/src/cli/commands/gateway.help.ts +1 -1
- package/src/cli/commands/gateway.ts +1 -1
- package/src/cli/commands/image-generation.help.ts +1 -1
- package/src/cli/commands/inference-providers.ts +1 -1
- package/src/cli/commands/inference.help.ts +2 -2
- package/src/cli/commands/memory/index.help.ts +1 -1
- package/src/cli/commands/oauth/connect.test.ts +2 -2
- package/src/cli/commands/oauth/connect.ts +1 -1
- package/src/cli/commands/oauth/index.help.ts +5 -5
- package/src/cli/commands/oauth/providers.ts +2 -2
- package/src/cli/commands/oauth/shared.ts +3 -3
- package/src/cli/commands/plugins.help.ts +2 -3
- package/src/cli/commands/plugins.ts +5 -5
- package/src/cli/commands/roadmap.help.ts +1 -1
- package/src/cli/commands/telemetry.help.ts +2 -2
- package/src/cli/commands/telemetry.ts +2 -2
- package/src/cli/commands/tts.help.ts +3 -3
- package/src/cli/commands/webhooks.help.ts +9 -9
- package/src/cli/commands/webhooks.ts +1 -1
- package/src/cli/lib/__tests__/inspect-plugin.test.ts +8 -8
- package/src/cli/lib/__tests__/{install-from-platform.test.ts → install-from-cloud.test.ts} +54 -54
- package/src/cli/lib/__tests__/plugin-catalog-cache.test.ts +18 -18
- package/src/cli/lib/__tests__/{plugin-catalog-platform.test.ts → plugin-catalog-cloud.test.ts} +2 -2
- package/src/cli/lib/__tests__/plugin-catalog-local.test.ts +1 -1
- package/src/cli/lib/__tests__/plugin-catalog-resolve.test.ts +9 -9
- package/src/cli/lib/__tests__/plugin-details.test.ts +10 -10
- package/src/cli/lib/__tests__/plugins-install-offline.test.ts +24 -24
- package/src/cli/lib/bundled-marketplace.json +1 -1
- package/src/cli/lib/inspect-plugin.ts +2 -2
- package/src/cli/lib/{install-from-platform.ts → install-from-cloud.ts} +29 -29
- package/src/cli/lib/install-from-github.ts +4 -4
- package/src/cli/lib/plugin-catalog-cache.ts +7 -7
- package/src/cli/lib/{plugin-catalog-platform.ts → plugin-catalog-cloud.ts} +6 -6
- package/src/cli/lib/plugin-catalog-local.ts +2 -2
- package/src/cli/lib/publish-plugin.ts +9 -10
- package/src/cli/lib/search-plugins.ts +2 -2
- package/src/{platform → cloud}/client.test.ts +85 -86
- package/src/{platform → cloud}/client.ts +38 -46
- package/src/{platform/platform-patch-queue.test.ts → cloud/cloud-patch-queue.test.ts} +6 -9
- package/src/{platform/platform-patch-queue.ts → cloud/cloud-patch-queue.ts} +11 -11
- package/src/{platform/managed-speech.test.ts → cloud/cloud-speech.test.ts} +19 -19
- package/src/{platform/managed-speech.ts → cloud/cloud-speech.ts} +41 -41
- package/src/{platform → cloud}/consent-cache.test.ts +5 -5
- package/src/{platform → cloud}/consent-cache.ts +8 -8
- package/src/cloud/feature-gate.ts +8 -0
- package/src/{platform → cloud}/sync-identity.test.ts +4 -4
- package/src/{platform → cloud}/sync-identity.ts +6 -6
- package/src/config/__tests__/{platform-identity.test.ts → cloud-identity.test.ts} +54 -56
- package/src/config/__tests__/{platform-rehydration.test.ts → cloud-rehydration.test.ts} +47 -80
- package/src/config/__tests__/default-profile-catalog.test.ts +12 -12
- package/src/config/__tests__/default-provider.test.ts +4 -4
- package/src/config/__tests__/deployment-context-defaults.test.ts +23 -23
- package/src/config/__tests__/{jev-managed-profile.test.ts → jev-cloud-profile.test.ts} +3 -5
- package/src/config/__tests__/loader-callsite-strip-fallback.test.ts +2 -2
- package/src/config/__tests__/loader-last-known-good.test.ts +6 -6
- package/src/config/__tests__/loader-sparse-array-cleanup.test.ts +2 -2
- package/src/config/__tests__/profile-materialization.test.ts +7 -7
- package/src/config/__tests__/seed-default-provider.test.ts +17 -17
- package/src/config/__tests__/substrate-twin-shadowing.test.ts +36 -26
- package/src/config/__tests__/sync-gated-profiles.test.ts +20 -20
- package/src/config/__tests__/webhook-routing.test.ts +51 -51
- package/src/config/bundled-skills/computer-use/TOOLS.json +12 -12
- package/src/config/bundled-skills/messaging/SKILL.md +8 -8
- package/src/config/bundled-skills/messaging/TOOLS.json +2 -2
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +1 -1
- package/src/config/bundled-skills/messaging/tools/shared.ts +1 -1
- package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +2 -2
- package/src/config/bundled-skills/settings/TOOLS.json +3 -3
- package/src/config/bundled-skills/settings/tools/shared.ts +1 -1
- package/src/config/bundled-skills/settings/tools/voice-config-update.ts +12 -12
- package/src/config/bundled-skills/skill-management/SKILL.md +3 -3
- package/src/config/bundled-skills/skill-management/TOOLS.json +8 -8
- package/src/config/bundled-skills/skill-management/tools/{delete-managed.ts → delete-cloud.ts} +2 -2
- package/src/config/bundled-skills/skill-management/tools/{scaffold-managed.ts → scaffold-cloud.ts} +2 -2
- package/src/config/call-site-defaults.ts +6 -6
- package/src/config/{platform-identity.ts → cloud-identity.ts} +39 -42
- package/src/config/cloud-rehydration.ts +35 -0
- package/src/config/{managed-speech-defaults.ts → cloud-speech-defaults.ts} +13 -13
- package/src/config/default-profile-catalog.ts +36 -38
- package/src/config/default-profile-names.ts +11 -11
- package/src/config/default-provider-resolution.ts +2 -2
- package/src/config/default-provider.ts +1 -1
- package/src/config/env-registry.ts +21 -26
- package/src/config/env.ts +33 -46
- package/src/config/feature-flag-registry.json +5 -5
- package/src/config/inference-profile-validation.ts +1 -1
- package/src/config/llm-resolver.ts +9 -10
- package/src/config/loader.ts +33 -17
- package/src/config/profile-materialization.ts +8 -8
- package/src/config/profile-text-generation.test.ts +1 -1
- package/src/config/sanitize-for-transfer.ts +1 -1
- package/src/config/schema.ts +6 -6
- package/src/config/schemas/__tests__/stt.test.ts +2 -2
- package/src/config/schemas/call-site-catalog.ts +1 -1
- package/src/config/schemas/channels.ts +8 -0
- package/src/config/schemas/{platform.ts → cloud.ts} +7 -6
- package/src/config/schemas/host-browser.ts +1 -0
- package/src/config/schemas/ingress.ts +29 -10
- package/src/config/schemas/llm.ts +36 -36
- package/src/config/schemas/memory-lifecycle.ts +11 -1
- package/src/config/schemas/services.ts +4 -4
- package/src/config/schemas/stt.ts +3 -3
- package/src/config/schemas/tts.ts +10 -5
- package/src/config/schemas/voice.ts +1 -1
- package/src/config/seed-inference-profiles.ts +19 -19
- package/src/config/skill-state.ts +2 -2
- package/src/config/skills.ts +4 -4
- package/src/config/substrate-twin-shadowing.ts +12 -17
- package/src/config/sync-gated-profiles.ts +8 -9
- package/src/config/webhook-routing.ts +19 -19
- package/src/contacts/contacts-write.ts +1 -1
- package/src/credential-execution/ces-runtime.ts +6 -6
- package/src/credential-execution/{managed-catalog.ts → cloud-catalog.ts} +24 -24
- package/src/credential-execution/prompted-credential.ts +2 -23
- package/src/credential-health/credential-health-service.ts +59 -70
- package/src/daemon/__tests__/can-spawn-subagents.test.ts +1 -1
- package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +4 -4
- package/src/daemon/config-watcher.ts +2 -2
- package/src/daemon/conversation-agent-loop.ts +9 -9
- package/src/daemon/conversation-error.ts +36 -36
- package/src/daemon/conversation-skill-tools.ts +7 -7
- package/src/daemon/conversation-surfaces.ts +1 -1
- package/src/daemon/conversation-tool-setup.ts +2 -2
- package/src/daemon/conversation-turn-finalize.ts +1 -1
- package/src/daemon/conversation-workspace.ts +1 -1
- package/src/daemon/conversation.ts +1 -1
- package/src/daemon/credential-transcript-scrub.ts +32 -35
- package/src/daemon/daemon-readiness.ts +1 -1
- package/src/daemon/event-loop-watchdog.ts +2 -2
- package/src/daemon/handlers/config-ingress.ts +9 -9
- package/src/daemon/handlers/config-telegram.ts +6 -6
- package/src/daemon/handlers/skills.ts +20 -20
- package/src/daemon/host-cu-proxy.ts +1 -1
- package/src/daemon/lifecycle.ts +19 -19
- package/src/daemon/parse-actual-tokens-from-error.ts +3 -3
- package/src/daemon/providers-setup.ts +6 -6
- package/src/daemon/resource-pressure-guard-lifecycle.ts +1 -1
- package/src/daemon/resource-pressure-guard.ts +6 -6
- package/src/daemon/shutdown-handlers.ts +1 -1
- package/src/daemon/sqlite-corruption-watchdog.ts +3 -3
- package/src/daemon/trust-context.ts +1 -1
- package/src/desktop/desktop-automation-lease.ts +1 -1
- package/src/desktop/desktop-browser-endpoint.ts +2 -4
- package/src/desktop/desktop-computer-use-routing.test.ts +6 -6
- package/src/desktop/desktop-stream-bridge.test.ts +4 -4
- package/src/desktop/desktop-stream-bridge.ts +1 -1
- package/src/desktop/{virtual-desktop-platform.test.ts → virtual-desktop-cloud.test.ts} +6 -6
- package/src/desktop/virtual-desktop-feature.ts +7 -7
- package/src/email/byo-email-credential.ts +1 -1
- package/src/email/registered-inbox.test.ts +16 -16
- package/src/email/registered-inbox.ts +20 -20
- package/src/heartbeat/heartbeat-service.ts +1 -1
- package/src/hooks/hook-loader.ts +2 -2
- package/src/inbound/__tests__/oauth-callback-url.test.ts +2 -2
- package/src/inbound/__tests__/tunnel-probe.test.ts +8 -8
- package/src/inbound/{platform-callback-registration.ts → cloud-callback-registration.ts} +49 -60
- package/src/inbound/oauth-callback-url.ts +6 -6
- package/src/inbound/pod-webhook-claim.ts +2 -2
- package/src/inbound/public-ingress-urls.ts +3 -3
- package/src/inbound/tunnel-probe.ts +21 -15
- package/src/inbound/tunnel-webhooks-gate.ts +3 -3
- package/src/ipc/__tests__/db-readiness-ipc-gate.test.ts +1 -1
- package/src/ipc/__tests__/email-ipc.test.ts +8 -8
- package/src/ipc/gateway-client.test.ts +55 -59
- package/src/ipc/gateway-flag-listener.ts +3 -3
- package/src/ipc/routes/db-proxy.ts +1 -1
- package/src/live-voice/__tests__/live-activity-reporter.test.ts +2 -2
- package/src/live-voice/__tests__/{live-voice-managed-speech-fallback.test.ts → live-voice-cloud-speech-fallback.test.ts} +15 -15
- package/src/live-voice/__tests__/live-voice-credential-preflight.test.ts +7 -7
- package/src/live-voice/__tests__/live-voice-stt.test.ts +1 -1
- package/src/live-voice/live-activity-reporter.ts +7 -7
- package/src/live-voice/live-voice-credential-preflight.ts +6 -6
- package/src/live-voice/live-voice-session.ts +3 -3
- package/src/live-voice/live-voice-tts.ts +1 -1
- package/src/mcp/__tests__/mcp-oauth-client-registration.test.ts +4 -4
- package/src/mcp/__tests__/mcp-oauth-provider.test.ts +1 -1
- package/src/mcp/mcp-oauth-provider.ts +2 -2
- package/src/media/gemini-image-service.ts +11 -13
- package/src/media/image-credentials.ts +9 -9
- package/src/media/openai-image-service.ts +1 -1
- package/src/media/types.ts +3 -3
- package/src/messaging/providers/channel-transport.ts +1 -1
- package/src/messaging/providers/discord/transport.ts +1 -1
- package/src/messaging/providers/gmail/adapter.ts +1 -1
- package/src/messaging/providers/gmail/client.ts +4 -4
- package/src/messaging/providers/outlook/adapter.ts +1 -1
- package/src/messaging/providers/slack/adapter.ts +1 -1
- package/src/messaging/providers/slack/transport.ts +1 -1
- package/src/messaging/providers/telegram-bot/transport.ts +1 -1
- package/src/monitoring/db-integrity-check.ts +1 -1
- package/src/monitoring/db-integrity-sample.ts +2 -2
- package/src/monitoring/mount-watch.ts +1 -1
- package/src/monitoring/oom-kill-reporter.ts +1 -1
- package/src/monitoring/worker.ts +5 -5
- package/src/notifications/README.md +2 -2
- package/src/notifications/__tests__/broadcaster.test.ts +9 -9
- package/src/notifications/__tests__/completion-policy.test.ts +1 -1
- package/src/notifications/__tests__/emit-signal-pipeline-failure.test.ts +4 -4
- package/src/notifications/activity-failed-dedupe.ts +1 -1
- package/src/notifications/adapters/{platform.ts → cloud.ts} +8 -8
- package/src/notifications/broadcaster.ts +10 -10
- package/src/notifications/decision-engine.ts +1 -1
- package/src/notifications/destination-resolver.ts +1 -1
- package/src/notifications/emit-signal.ts +6 -6
- package/src/notifications/types.ts +2 -2
- package/src/oauth/__tests__/identity-verifier.test.ts +1 -1
- package/src/oauth/__tests__/{seed-providers-managed.test.ts → seed-providers-cloud.test.ts} +13 -13
- package/src/oauth/byo-connection.test.ts +2 -2
- package/src/oauth/{platform-connection.test.ts → cloud-connection.test.ts} +41 -43
- package/src/oauth/{platform-connection.ts → cloud-connection.ts} +19 -19
- package/src/oauth/connection-resolver.test.ts +59 -61
- package/src/oauth/connection-resolver.ts +22 -22
- package/src/oauth/connection.ts +1 -1
- package/src/oauth/oauth-store.ts +8 -8
- package/src/oauth/provider-serializer.ts +4 -4
- package/src/oauth/revoke.ts +1 -1
- package/src/oauth/seed-providers.ts +32 -32
- package/src/permissions/approval-provenance.ts +1 -1
- package/src/permissions/checker.test.ts +18 -16
- package/src/permissions/checker.ts +3 -3
- package/src/persistence/compaction-log-store-clickhouse.ts +3 -3
- package/src/persistence/embeddings/embedding-backend.test.ts +16 -16
- package/src/persistence/embeddings/embedding-backend.ts +13 -13
- package/src/persistence/embeddings/embedding-gemini.test.ts +9 -12
- package/src/persistence/embeddings/embedding-gemini.ts +11 -11
- package/src/persistence/embeddings/embedding-runtime-manager.ts +2 -2
- package/src/persistence/jobs-store.ts +1 -1
- package/src/persistence/lifecycle-events-store.ts +1 -1
- 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/migrations/224-oauth-providers-managed-service-is-paid.ts +1 -1
- package/src/persistence/migrations/296-rewrite-balanced-economy-profile-pins.test.ts +1 -1
- package/src/persistence/migrations/296-rewrite-balanced-economy-profile-pins.ts +2 -2
- package/src/persistence/migrations/306-rewrite-frontier-profile-pins.test.ts +1 -1
- package/src/persistence/migrations/306-rewrite-frontier-profile-pins.ts +1 -1
- package/src/persistence/migrations/351-schedule-skill-script-handoff.ts +1 -1
- package/src/persistence/migrations/361-normalize-managed-connection-rows.test.ts +3 -3
- package/src/persistence/migrations/361-normalize-managed-connection-rows.ts +7 -7
- package/src/persistence/migrations/__tests__/319-remove-legacy-managed-connections.test.ts +2 -2
- package/src/persistence/schema/oauth.ts +1 -1
- package/src/plugin-api/index.ts +4 -4
- package/src/plugin-api/model-profiles.test.ts +1 -1
- package/src/plugin-api/model-profiles.ts +1 -1
- package/src/plugin-api/transcription-session.ts +1 -1
- package/src/plugin-api/vision-support.test.ts +1 -1
- package/src/plugin-api/webhook-url.ts +12 -12
- package/src/plugins/__tests__/source-fingerprint.test.ts +1 -1
- package/src/plugins/defaults/{platform-hosted → cloud-hosted}/__tests__/reengage.test.ts +5 -6
- package/src/plugins/defaults/cloud-hosted/package.json +14 -0
- package/src/plugins/defaults/{platform-hosted → cloud-hosted}/routes/reengage.ts +3 -3
- package/src/plugins/defaults/index.ts +6 -6
- package/src/plugins/defaults/main.ts +5 -5
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +5 -5
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-prompt.test.ts +1 -1
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-provider-path.test.ts +1 -1
- package/src/plugins/defaults/memory/__tests__/memory-tier-boundary-guard.test.ts +5 -0
- package/src/plugins/defaults/memory/config.ts +4 -4
- package/src/plugins/defaults/memory/memory-retrospective-constants.ts +2 -2
- package/src/plugins/defaults/memory/memory-retrospective-job.ts +7 -7
- package/src/plugins/defaults/memory/memory-retrospective-prompt.ts +5 -5
- package/src/plugins/defaults/memory/memory-retrospective-skill-card.ts +2 -2
- package/src/plugins/defaults/memory/src/__tests__/memory-v2-routes.test.ts +1 -1
- package/src/plugins/defaults/memory/src/__tests__/memory-worker-routes.test.ts +1 -1
- package/src/plugins/defaults/memory/substrate/__tests__/boot-maintenance.test.ts +20 -20
- package/src/plugins/defaults/memory/substrate/__tests__/cli-command-store.test.ts +1 -1
- package/src/plugins/defaults/memory/substrate/__tests__/skill-store.test.ts +3 -3
- package/src/plugins/defaults/memory/substrate/boot-maintenance.ts +17 -17
- package/src/plugins/defaults/memory/substrate/cli-command-store.ts +2 -2
- package/src/plugins/defaults/memory/substrate/prompts/consolidation.ts +1 -1
- package/src/plugins/defaults/memory/substrate/skill-store.ts +4 -4
- package/src/plugins/defaults/memory/v3/__tests__/maintain-job.test.ts +3 -3
- package/src/plugins/defaults/memory/v3/__tests__/pool-select.test.ts +2 -2
- package/src/plugins/defaults/memory/v3/maintain-job.ts +10 -10
- package/src/plugins/defaults/memory/v3/orchestrate.ts +3 -3
- package/src/plugins/defaults/memory/worker.ts +5 -5
- package/src/plugins/defaults/workspace/injectors.ts +2 -2
- package/src/plugins/mtime-cache.ts +1 -1
- package/src/plugins/source-versions.ts +1 -1
- package/src/plugins/types.ts +1 -1
- package/src/prompts/__tests__/system-prompt.test.ts +1 -1
- package/src/prompts/normalize-onboarding.ts +1 -1
- package/src/prompts/persona-resolver.ts +1 -1
- package/src/prompts/templates/system-sections.ts +3 -3
- package/src/providers/__tests__/cadet-connection-routing.test.ts +7 -7
- package/src/providers/__tests__/cadet-mismatch-routing.test.ts +12 -12
- package/src/providers/__tests__/connection-model-compat.test.ts +2 -2
- package/src/providers/__tests__/dispatch-connection-routing.test.ts +10 -10
- package/src/providers/__tests__/inference.test.ts +2 -2
- package/src/providers/__tests__/preflight-resolved-config.test.ts +16 -16
- package/src/providers/__tests__/retry-callsite.test.ts +1 -1
- package/src/providers/__tests__/satellite-connection-routing.test.ts +4 -4
- package/src/providers/__tests__/search-provider-catalog.test.ts +2 -2
- package/src/providers/__tests__/voice-error-copy.test.ts +3 -3
- package/src/providers/anthropic/client.ts +1 -1
- package/src/providers/cadet/client.ts +1 -1
- package/src/providers/cadet-model-routing.test.ts +19 -19
- package/src/providers/cadet-model-routing.ts +23 -23
- package/src/providers/call-site-routing.ts +10 -10
- package/src/providers/{platform-proxy → cloud-proxy}/constants.ts +11 -11
- package/src/providers/{platform-proxy → cloud-proxy}/context.ts +26 -26
- package/src/providers/connection-resolution.ts +43 -43
- package/src/providers/fallback-breaker.ts +2 -2
- package/src/providers/fetch-provider-catalog.ts +3 -3
- package/src/providers/gemini/client.ts +5 -5
- package/src/providers/inference/__tests__/adapter-factory-openai-compatible.test.ts +3 -3
- package/src/providers/inference/__tests__/base-url-route-validation.test.ts +8 -8
- package/src/providers/inference/__tests__/base-url-security.test.ts +4 -4
- package/src/providers/inference/adapter-factory.ts +35 -35
- package/src/providers/inference/auth.ts +10 -10
- package/src/providers/inference/backfill.ts +11 -11
- package/src/providers/inference/connection-availability.ts +24 -24
- package/src/providers/inference/connections.ts +18 -20
- package/src/providers/inference/profile-probe.ts +4 -4
- package/src/providers/inference/resolve-auth.ts +8 -8
- package/src/providers/jev/ask.test.ts +1 -1
- package/src/providers/jev/ask.ts +2 -2
- package/src/providers/model-catalog.ts +8 -9
- package/src/providers/openai/__tests__/api-error-normalization.test.ts +3 -3
- package/src/providers/openai/api-error-normalization.ts +2 -2
- package/src/providers/provider-availability.ts +4 -4
- package/src/providers/provider-env-vars.ts +1 -1
- package/src/providers/provider-secret-catalog.ts +1 -1
- package/src/providers/registry.ts +20 -20
- package/src/providers/retry.ts +26 -26
- package/src/providers/routing-identity.ts +10 -10
- package/src/providers/search-provider-catalog.ts +2 -2
- package/src/providers/speech-to-text/__tests__/{cadet-managed-realtime.test.ts → cadet-cloud-realtime.test.ts} +3 -3
- package/src/providers/speech-to-text/__tests__/{cadet-managed.test.ts → cadet-cloud.test.ts} +35 -35
- package/src/providers/speech-to-text/__tests__/deepgram-flux-realtime.test.ts +1 -1
- package/src/providers/speech-to-text/__tests__/resolve.test.ts +27 -27
- package/src/providers/speech-to-text/{cadet-managed-flux-realtime.ts → cadet-cloud-flux-realtime.ts} +6 -8
- package/src/providers/speech-to-text/{cadet-managed-realtime.ts → cadet-cloud-realtime.ts} +3 -3
- package/src/providers/speech-to-text/{cadet-managed.ts → cadet-cloud.ts} +18 -20
- package/src/providers/speech-to-text/cadet-speech-relay-connection.ts +7 -7
- package/src/providers/speech-to-text/deepgram-flux-frames.ts +3 -3
- package/src/providers/speech-to-text/deepgram-flux-realtime.ts +4 -4
- package/src/providers/speech-to-text/provider-catalog.ts +3 -3
- package/src/providers/speech-to-text/resolve.ts +26 -28
- package/src/providers/together/client.ts +1 -1
- package/src/providers/types.ts +4 -4
- package/src/providers/voice-error-copy.ts +1 -1
- package/src/runtime/__tests__/desktop-stream-upgrade.test.ts +10 -10
- package/src/runtime/agent-wake.ts +1 -1
- package/src/runtime/auth/__tests__/middleware.test.ts +1 -1
- package/src/runtime/auth/middleware.ts +1 -1
- package/src/runtime/auth/scopes.ts +1 -1
- package/src/runtime/capabilities.ts +1 -1
- package/src/runtime/channel-invite-transports/discord.ts +1 -1
- package/src/runtime/channel-invite-transports/email.ts +2 -2
- package/src/runtime/channel-readiness-service.ts +15 -13
- package/src/runtime/channel-reply-session.test.ts +1 -1
- package/src/runtime/channel-reply-session.ts +1 -1
- package/src/runtime/http-server.ts +4 -4
- package/src/runtime/introduction-policy.ts +4 -4
- package/src/runtime/migrations/__tests__/origin-mode.test.ts +14 -14
- package/src/runtime/migrations/__tests__/v1-test-helpers.ts +1 -1
- package/src/runtime/migrations/__tests__/vbundle-import-version-compat.test.ts +2 -2
- package/src/runtime/migrations/__tests__/vbundle-metadata-merge-integration.test.ts +3 -4
- package/src/runtime/migrations/__tests__/vbundle-metadata-merge.test.ts +6 -7
- package/src/runtime/migrations/__tests__/vbundle-validator-v1-schema.test.ts +1 -1
- package/src/runtime/migrations/migration-transport.ts +3 -3
- package/src/runtime/migrations/origin-mode.ts +6 -9
- package/src/runtime/migrations/vbundle-import-policy.ts +2 -2
- package/src/runtime/migrations/vbundle-importer.ts +4 -4
- package/src/runtime/migrations/vbundle-streaming-importer.ts +6 -6
- package/src/runtime/migrations/vbundle-validator.ts +1 -1
- package/src/runtime/routes/__tests__/{platform-credits-routes.test.ts → cloud-credits-routes.test.ts} +9 -9
- package/src/runtime/routes/__tests__/{platform-invoice-routes.test.ts → cloud-invoice-routes.test.ts} +13 -13
- package/src/runtime/routes/__tests__/connection-routes-vs-cli-parity.test.ts +1 -1
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +126 -82
- package/src/runtime/routes/__tests__/default-plugin-routes.test.ts +5 -5
- package/src/runtime/routes/__tests__/default-provider-routes.test.ts +10 -10
- package/src/runtime/routes/__tests__/inference-profiles-routes.test.ts +18 -18
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +18 -16
- package/src/runtime/routes/__tests__/inference-send-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/ingress-status-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/migration-cadet-metadata-reconcile.test.ts +5 -20
- package/src/runtime/routes/__tests__/migration-import-credential-filter.test.ts +19 -22
- package/src/runtime/routes/__tests__/oauth-proxy-routes.test.ts +27 -27
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +5 -5
- package/src/runtime/routes/__tests__/ps-routes.test.ts +5 -3
- package/src/runtime/routes/__tests__/roadmap-routes.test.ts +15 -15
- package/src/runtime/routes/__tests__/webhook-routes.test.ts +31 -31
- package/src/runtime/routes/app-management-routes.ts +1 -1
- package/src/runtime/routes/attachment-routes.ts +1 -1
- package/src/runtime/routes/auth-routes.ts +14 -14
- package/src/runtime/routes/avatar-routes.ts +0 -14
- package/src/runtime/routes/background-wake-routes.ts +4 -4
- package/src/runtime/routes/channel-availability-routes.ts +4 -4
- package/src/runtime/routes/client-routes.ts +5 -5
- package/src/runtime/routes/cloud-credentials.ts +45 -0
- package/src/runtime/routes/{platform-routes.ts → cloud-routes.ts} +86 -119
- package/src/runtime/routes/conversation-compaction-routes.ts +1 -1
- package/src/runtime/routes/conversation-query-routes.ts +345 -667
- package/src/runtime/routes/credential-routes.ts +28 -30
- package/src/runtime/routes/default-provider-routes.ts +1 -1
- package/src/runtime/routes/desktop-setup-routes.test.ts +5 -5
- package/src/runtime/routes/desktop-setup-routes.ts +1 -1
- package/src/runtime/routes/domain-routes.ts +15 -21
- package/src/runtime/routes/email-routes.ts +13 -13
- package/src/runtime/routes/errors.ts +1 -1
- package/src/runtime/routes/gateway-status-routes.ts +1 -1
- package/src/runtime/routes/identity-routes.ts +3 -3
- package/src/runtime/routes/inbound-message-handler.ts +1 -1
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +1 -1
- package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +1 -1
- package/src/runtime/routes/index.ts +1 -1
- package/src/runtime/routes/inference-profile-availability-guard.ts +5 -5
- package/src/runtime/routes/inference-profiles-routes.ts +11 -11
- package/src/runtime/routes/inference-provider-connection-routes.ts +24 -24
- package/src/runtime/routes/ingress-status-routes.ts +1 -1
- package/src/runtime/routes/integrations/a2a.ts +2 -2
- package/src/runtime/routes/integrations/twilio.ts +21 -35
- package/src/runtime/routes/internal-telemetry-routes.ts +2 -2
- package/src/runtime/routes/live-voice-routes.test.ts +4 -4
- package/src/runtime/routes/live-voice-routes.ts +6 -6
- package/src/runtime/routes/migration-routes.ts +34 -40
- package/src/runtime/routes/oauth-commands-routes.ts +31 -31
- package/src/runtime/routes/oauth-providers.ts +5 -5
- package/src/runtime/routes/oauth-proxy-passthrough.test.ts +1 -1
- package/src/runtime/routes/oauth-proxy-passthrough.ts +8 -8
- package/src/runtime/routes/oauth-proxy-routes.ts +15 -17
- package/src/runtime/routes/oauth-request-hints.test.ts +1 -1
- package/src/runtime/routes/oauth-request-hints.ts +1 -1
- package/src/runtime/routes/plugins-routes.ts +9 -9
- package/src/runtime/routes/profiler-routes.ts +1 -1
- package/src/runtime/routes/ps-routes.ts +4 -0
- package/src/runtime/routes/roadmap-routes.ts +18 -20
- package/src/runtime/routes/secret-routes.ts +20 -61
- package/src/runtime/routes/settings-routes.ts +18 -23
- package/src/runtime/routes/telemetry-routes.ts +4 -4
- package/src/runtime/routes/tts-routes.ts +4 -4
- package/src/runtime/routes/user-route-resolution.ts +1 -1
- package/src/runtime/routes/webhook-routes.ts +18 -18
- package/src/runtime/routes/workflow-routes.ts +5 -5
- package/src/runtime/sync/resource-sync-events.ts +2 -2
- package/src/runtime/verification-outbound-actions.ts +4 -4
- package/src/schedule/integration-status.ts +6 -6
- package/src/schedule/run-script.ts +1 -1
- package/src/schedule/schedule-timezone.ts +1 -1
- package/src/schedule/worker.ts +5 -5
- package/src/security/auth-fallback-events-store.ts +1 -1
- package/src/security/oauth2.ts +4 -4
- package/src/skills/available-skills.ts +4 -4
- package/src/skills/catalog-files.ts +8 -8
- package/src/skills/catalog-install.ts +12 -12
- package/src/skills/categories-cache.ts +3 -3
- package/src/skills/clawhub.ts +1 -1
- package/src/skills/{platform-compatibility.test.ts → cloud-compatibility.test.ts} +7 -7
- package/src/skills/{platform-compatibility.ts → cloud-compatibility.ts} +2 -4
- package/src/skills/{managed-store.ts → cloud-store.ts} +21 -23
- package/src/skills/inline-command-runner.ts +1 -1
- package/src/skills/install-meta.ts +1 -1
- package/src/skills/path-classifier.ts +4 -4
- package/src/skills/skill-history.ts +4 -4
- package/src/skills/skillssh-registry.ts +1 -1
- package/src/stt/__tests__/daemon-batch-transcriber.test.ts +1 -1
- package/src/stt/daemon-batch-transcriber.ts +7 -7
- package/src/stt/types.ts +3 -3
- package/src/subagent/manager.ts +15 -15
- package/src/subagent/types.ts +1 -1
- package/src/telegram/__tests__/webhook-health.test.ts +16 -16
- package/src/telegram/webhook-health.ts +10 -10
- package/src/telemetry/__tests__/config-setting-events-store.test.ts +1 -1
- package/src/telemetry/__tests__/outbox-test-harness.ts +2 -2
- package/src/telemetry/config-setting-events-store.ts +1 -1
- package/src/telemetry/config-setting-snapshot.ts +1 -1
- package/src/telemetry/memory-corpus-size.ts +1 -1
- package/src/telemetry/memory-tier-reporter.test.ts +2 -2
- package/src/telemetry/memory-tier-reporter.ts +3 -3
- package/src/telemetry/telemetry-event-sources.test.ts +2 -2
- package/src/telemetry/telemetry-event-sources.ts +9 -9
- package/src/telemetry/telemetry-events-outbox.ts +2 -2
- package/src/telemetry/telemetry-wire-validation.test.ts +1 -1
- package/src/telemetry/telemetry-wire-validation.ts +3 -3
- package/src/telemetry/telemetry-wire.generated.ts +1 -1
- package/src/telemetry/tool-audit.ts +1 -1
- package/src/telemetry/tool-executed-events-store.test.ts +1 -1
- package/src/telemetry/trace-collection-policy.ts +4 -4
- package/src/telemetry/turn-events-store.ts +1 -1
- package/src/telemetry/turn-outcome.ts +1 -1
- package/src/telemetry/turn-trace-store.ts +2 -2
- package/src/telemetry/types.test.ts +1 -1
- package/src/telemetry/types.ts +19 -19
- package/src/telemetry/usage-telemetry-reporter.test.ts +42 -42
- package/src/telemetry/usage-telemetry-reporter.ts +17 -17
- package/src/telemetry/watchdog-direct-emit.test.ts +9 -9
- package/src/telemetry/watchdog-direct-emit.ts +10 -10
- package/src/tools/__tests__/side-effect-abort-guard.test.ts +2 -2
- package/src/tools/browser/cdp-client/factory.ts +1 -1
- package/src/tools/computer-use/target.ts +2 -2
- package/src/tools/credentials/store.ts +2 -20
- package/src/tools/network/__tests__/{managed-search-proxy.test.ts → cloud-search-proxy.test.ts} +20 -20
- package/src/tools/network/__tests__/web-search.test.ts +14 -14
- package/src/tools/network/{managed-search-proxy.ts → cloud-search-proxy.ts} +13 -13
- package/src/tools/network/web-search.ts +9 -9
- package/src/tools/permission-checker.ts +2 -2
- package/src/tools/shared/input-misuse.ts +1 -1
- package/src/tools/shared/input-repairs.ts +4 -4
- package/src/tools/skills/{delete-managed.ts → delete-cloud.ts} +4 -4
- package/src/tools/skills/find-similar-skills.test.ts +7 -7
- package/src/tools/skills/find-similar-skills.ts +15 -15
- package/src/tools/skills/load.ts +6 -6
- package/src/tools/skills/{scaffold-managed.ts → scaffold-cloud.ts} +16 -16
- package/src/tools/skills/skill-script-runner.ts +2 -2
- package/src/tools/terminal/safe-env.ts +3 -3
- package/src/tools/tool-types.ts +2 -2
- package/src/tools/types.ts +2 -2
- package/src/tools/ui-surface/surface-shape-docs.ts +2 -2
- package/src/tools/workflows/manage-workflows.ts +1 -1
- package/src/tools/workspace-tools/loader.ts +1 -1
- package/src/tts/__tests__/cadet-provider.test.ts +5 -5
- package/src/tts/provider-catalog.ts +1 -1
- package/src/tts/providers/cadet-provider.ts +23 -23
- package/src/tts/providers/cadet-tts-socket.ts +2 -2
- package/src/tts/tts-config-resolver.ts +1 -1
- package/src/tts/tts-voice-field.ts +3 -3
- package/src/usage/subagent-attribution.ts +1 -1
- package/src/util/__tests__/process-table.test.ts +47 -0
- package/src/util/canonicalize-identity.ts +1 -1
- package/src/util/cgroup-cpu.ts +5 -5
- package/src/util/cgroup-memory.ts +2 -2
- package/src/util/container-cpu-sampler.ts +4 -4
- package/src/util/disk-usage.ts +4 -4
- package/src/util/errors.ts +3 -3
- package/src/util/layout.ts +479 -0
- package/src/util/oom-priority.ts +1 -1
- package/src/util/platform.ts +12 -468
- package/src/util/process-table.ts +39 -5
- package/src/util/provider-error-patterns.ts +2 -2
- package/src/watch/__tests__/watch-retro.test.ts +2 -2
- package/src/watch/watch-retro.ts +1 -1
- package/src/watcher/__tests__/telemetry.test.ts +2 -2
- package/src/watcher/telemetry.ts +1 -1
- package/src/windows-compiled-cli.ts +1 -1
- package/src/workspace/adaptive-thinking-repair.ts +4 -4
- package/src/workspace/byok-default-profile-ensure.ts +7 -7
- package/src/workspace/git-service.ts +2 -2
- package/src/workspace/migrations/006-services-config.ts +1 -1
- package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +1 -1
- package/src/workspace/migrations/052-seed-default-inference-profiles.ts +1 -1
- package/src/workspace/migrations/063-release-notes-dynamic-model-context.ts +1 -1
- package/src/workspace/migrations/066-seed-heartbeat-callsite-cost-default.ts +1 -1
- package/src/workspace/migrations/082-backfill-managed-profile-labels.ts +4 -4
- package/src/workspace/migrations/087-memory-router-balanced-profile.ts +3 -3
- package/src/workspace/migrations/090-memory-router-cost-optimized-profile.ts +4 -4
- package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +5 -5
- package/src/workspace/migrations/100-upgrade-quality-profile-to-fable-5.ts +4 -4
- package/src/workspace/migrations/101-upgrade-balanced-economy-to-minimax-m3.ts +4 -4
- package/src/workspace/migrations/103-upgrade-quality-profile-to-opus-4-8.ts +5 -5
- package/src/workspace/migrations/104-recheck-adaptive-thinking-model-implied-anthropic.ts +1 -1
- package/src/workspace/migrations/106-drop-collect-usage-data.ts +1 -1
- package/src/workspace/migrations/108-drop-balanced-economy-profile.ts +4 -4
- package/src/workspace/migrations/109-swap-quality-profile-to-glm-5p2.ts +11 -11
- package/src/workspace/migrations/110-flip-balanced-profile-to-together.ts +6 -6
- package/src/workspace/migrations/113-swap-balanced-profile-to-glm-5p2.ts +5 -5
- package/src/workspace/migrations/114-swap-quality-profile-to-opus.ts +4 -4
- package/src/workspace/migrations/115-drop-frontier-profile.ts +5 -5
- package/src/workspace/migrations/123-swap-quality-profile-to-fable.ts +5 -5
- package/src/workspace/migrations/125-repoint-managed-connections-to-cadet.ts +3 -3
- package/src/workspace/migrations/126-strip-managed-profile-bodies.ts +2 -2
- package/src/workspace/migrations/127-backfill-default-provider.ts +6 -6
- package/src/workspace/migrations/130-speech-mode-to-provider.ts +4 -4
- package/src/workspace/migrations/131-drop-web-fetch-mode.ts +1 -1
- package/src/workspace/migrations/132-web-search-mode-to-provider.ts +6 -6
- package/src/workspace/migrations/133-collapse-provider-connections.ts +3 -3
- package/src/workspace/migrations/134-image-generation-mode-to-provider.ts +4 -4
- package/src/workspace/migrations/136-repair-stale-fireworks-kimi-model-id.ts +2 -2
- package/src/workspace/migrations/137-repair-retired-fireworks-minimax-model-id.ts +2 -2
- package/src/workspace/migrations/139-clear-renamed-cost-profile-label.ts +2 -2
- package/src/workspace/migrations/141-stt-english-default-to-multilingual.ts +4 -4
- package/src/workspace/migrations/144-convert-stranded-subscription-openai-profiles.ts +1 -1
- package/src/workspace/migrations/145-collapse-profile-bindings-to-entries.ts +2 -2
- package/src/workspace/migrations/146-repair-retired-fireworks-deepseek-flash-model-id.ts +2 -2
- package/src/workspace/migrations/148-strip-unsupported-fallback-profiles.ts +2 -2
- package/src/workspace/migrations/150-stt-flux-provider-to-model-family.ts +1 -1
- package/src/workspace/migrations/151-repair-renamed-fireworks-deepseek-pro-model-id.ts +2 -2
- package/src/workspace/migrations/152-repair-retired-fireworks-minimax-m2p7-model-id.ts +2 -2
- package/src/workspace/migrations/159-rename-colliding-jev-profile-name.ts +2 -2
- package/src/workspace/migrations/160-repair-retired-fireworks-model-ids.ts +2 -2
- package/src/workspace/migrations/161-repair-retired-fireworks-glm-5p2-model-id.ts +2 -2
- package/src/workspace/migrations/__tests__/141-stt-english-default-to-multilingual.test.ts +1 -1
- package/src/workspace/migrations/__tests__/150-stt-flux-provider-to-model-family.test.ts +1 -1
- package/src/workspace/migrations/registry.ts +6 -6
- package/src/workspace/top-level-renderer.ts +1 -1
- package/src/workspace/turn-commit.ts +2 -2
- package/src/__tests__/config-loader-platform-defaults.test.ts +0 -606
- package/src/__tests__/mock-gateway-ipc.ts +0 -260
- package/src/api/events/platform-disconnected.ts +0 -21
- package/src/api/events/show-platform-login.ts +0 -20
- package/src/config/platform-rehydration.ts +0 -60
- package/src/platform/feature-gate.ts +0 -8
- package/src/plugins/defaults/platform-hosted/package.json +0 -14
- package/src/runtime/routes/platform-managed-credentials.ts +0 -50
- /package/src/__tests__/{gateway-client-managed-outbound.test.ts → gateway-client-cloud-outbound.test.ts} +0 -0
- /package/src/__tests__/{secure-keys-managed-failover.test.ts → secure-keys-cloud-failover.test.ts} +0 -0
|
@@ -24,7 +24,7 @@ import {
|
|
|
24
24
|
|
|
25
25
|
import { NOTIFICATION_AVATAR_SPEC_VERSION } from "@mycadet/avatar-manifest/notification-avatar";
|
|
26
26
|
|
|
27
|
-
import * as
|
|
27
|
+
import * as realCloudClient from "../cloud/client.js";
|
|
28
28
|
import type { AvatarState } from "./avatar-manifest.js";
|
|
29
29
|
import * as realAvatarManifest from "./avatar-manifest.js";
|
|
30
30
|
import * as realEnsureRaster from "./ensure-raster.js";
|
|
@@ -39,7 +39,7 @@ import * as realResvgLazy from "./resvg-lazy.js";
|
|
|
39
39
|
const REAL_AVATAR_MANIFEST = { ...realAvatarManifest };
|
|
40
40
|
const REAL_ENSURE_RASTER = { ...realEnsureRaster };
|
|
41
41
|
const REAL_RESVG_LAZY = { ...realResvgLazy };
|
|
42
|
-
const REAL_PLATFORM_CLIENT = { ...
|
|
42
|
+
const REAL_PLATFORM_CLIENT = { ...realCloudClient };
|
|
43
43
|
const realReadContainedAvatarRaster =
|
|
44
44
|
REAL_ENSURE_RASTER.readContainedAvatarRaster;
|
|
45
45
|
|
|
@@ -47,7 +47,7 @@ let mockState: AvatarState;
|
|
|
47
47
|
let mockRasterPath: string | null;
|
|
48
48
|
let mockClient: {
|
|
49
49
|
baseUrl: string;
|
|
50
|
-
|
|
50
|
+
cloudAssistantId: string;
|
|
51
51
|
fetch: (path: string, init: RequestInit) => Promise<Response>;
|
|
52
52
|
} | null;
|
|
53
53
|
/** Manifest states the accent backfill persisted during a test. */
|
|
@@ -59,8 +59,8 @@ let lastResvgSvg = "";
|
|
|
59
59
|
let rasterCalls = 0;
|
|
60
60
|
|
|
61
61
|
function installMocks(): void {
|
|
62
|
-
mock.module("../
|
|
63
|
-
|
|
62
|
+
mock.module("../cloud/client.js", () => ({
|
|
63
|
+
CadetCloudClient: { create: async () => mockClient },
|
|
64
64
|
}));
|
|
65
65
|
|
|
66
66
|
mock.module("./avatar-manifest.js", () => ({
|
|
@@ -110,7 +110,7 @@ function installMocks(): void {
|
|
|
110
110
|
}
|
|
111
111
|
|
|
112
112
|
function restoreRealModules(): void {
|
|
113
|
-
mock.module("../
|
|
113
|
+
mock.module("../cloud/client.js", () => REAL_PLATFORM_CLIENT);
|
|
114
114
|
mock.module("./avatar-manifest.js", () => REAL_AVATAR_MANIFEST);
|
|
115
115
|
mock.module("./ensure-raster.js", () => REAL_ENSURE_RASTER);
|
|
116
116
|
mock.module("./resvg-lazy.js", () => REAL_RESVG_LAZY);
|
|
@@ -121,7 +121,7 @@ installMocks();
|
|
|
121
121
|
import {
|
|
122
122
|
_resetSyncAvatarStateForTests,
|
|
123
123
|
AVATAR_SYNC_KEY_TTL_MS,
|
|
124
|
-
|
|
124
|
+
syncAvatarToCloud,
|
|
125
125
|
} from "./sync-avatar.js";
|
|
126
126
|
|
|
127
127
|
const PNG_MAGIC = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];
|
|
@@ -225,7 +225,7 @@ let respond: () => Response;
|
|
|
225
225
|
function makeClient(assistantId = "asst-1", baseUrl = "https://platform.a") {
|
|
226
226
|
return {
|
|
227
227
|
baseUrl,
|
|
228
|
-
|
|
228
|
+
cloudAssistantId: assistantId,
|
|
229
229
|
fetch: async (path: string, init: RequestInit) => {
|
|
230
230
|
patches.push({ path, body: JSON.parse(init.body as string) });
|
|
231
231
|
return respond();
|
|
@@ -239,7 +239,7 @@ async function settle(): Promise<void> {
|
|
|
239
239
|
}
|
|
240
240
|
}
|
|
241
241
|
|
|
242
|
-
describe("
|
|
242
|
+
describe("syncAvatarToCloud", () => {
|
|
243
243
|
beforeEach(() => {
|
|
244
244
|
rmSync(workspaceDir, { recursive: true, force: true });
|
|
245
245
|
rmSync(join(dir, "platform-sync"), { recursive: true, force: true });
|
|
@@ -258,9 +258,9 @@ describe("syncAvatarToPlatform", () => {
|
|
|
258
258
|
});
|
|
259
259
|
|
|
260
260
|
test("PATCHes the base64 raster once and dedups an unchanged etag", async () => {
|
|
261
|
-
|
|
261
|
+
syncAvatarToCloud();
|
|
262
262
|
await settle();
|
|
263
|
-
|
|
263
|
+
syncAvatarToCloud();
|
|
264
264
|
await settle();
|
|
265
265
|
|
|
266
266
|
expect(patches).toHaveLength(1);
|
|
@@ -271,11 +271,11 @@ describe("syncAvatarToPlatform", () => {
|
|
|
271
271
|
});
|
|
272
272
|
|
|
273
273
|
test("a changed etag re-sends", async () => {
|
|
274
|
-
|
|
274
|
+
syncAvatarToCloud();
|
|
275
275
|
await settle();
|
|
276
276
|
mockState = imageState("etag-b");
|
|
277
277
|
mockRasterPath = writeRaster("b.png", png("bb"));
|
|
278
|
-
|
|
278
|
+
syncAvatarToCloud();
|
|
279
279
|
await settle();
|
|
280
280
|
|
|
281
281
|
expect(patches.map((p) => p.body.avatar_base64)).toEqual([
|
|
@@ -285,10 +285,10 @@ describe("syncAvatarToPlatform", () => {
|
|
|
285
285
|
});
|
|
286
286
|
|
|
287
287
|
test("a raster overwritten in place re-sends without a manifest change", async () => {
|
|
288
|
-
|
|
288
|
+
syncAvatarToCloud();
|
|
289
289
|
await settle();
|
|
290
290
|
writeRaster("a.png", png("a-rewritten"));
|
|
291
|
-
|
|
291
|
+
syncAvatarToCloud();
|
|
292
292
|
await settle();
|
|
293
293
|
|
|
294
294
|
expect(patches.map((p) => p.body.avatar_base64)).toEqual([
|
|
@@ -298,12 +298,12 @@ describe("syncAvatarToPlatform", () => {
|
|
|
298
298
|
});
|
|
299
299
|
|
|
300
300
|
test("re-registering to another assistant id re-sends the same raster", async () => {
|
|
301
|
-
|
|
301
|
+
syncAvatarToCloud();
|
|
302
302
|
await settle();
|
|
303
303
|
mockClient = makeClient("asst-2");
|
|
304
|
-
|
|
304
|
+
syncAvatarToCloud();
|
|
305
305
|
await settle();
|
|
306
|
-
|
|
306
|
+
syncAvatarToCloud();
|
|
307
307
|
await settle();
|
|
308
308
|
|
|
309
309
|
expect(patches.map((p) => p.path)).toEqual([
|
|
@@ -314,11 +314,11 @@ describe("syncAvatarToPlatform", () => {
|
|
|
314
314
|
});
|
|
315
315
|
|
|
316
316
|
test("rapid changes collapse into one PATCH carrying the newest raster", async () => {
|
|
317
|
-
|
|
318
|
-
|
|
317
|
+
syncAvatarToCloud();
|
|
318
|
+
syncAvatarToCloud();
|
|
319
319
|
mockState = imageState("etag-c");
|
|
320
320
|
mockRasterPath = writeRaster("c.png", png("c"));
|
|
321
|
-
|
|
321
|
+
syncAvatarToCloud();
|
|
322
322
|
await settle();
|
|
323
323
|
|
|
324
324
|
expect(patches).toHaveLength(1);
|
|
@@ -327,11 +327,11 @@ describe("syncAvatarToPlatform", () => {
|
|
|
327
327
|
});
|
|
328
328
|
|
|
329
329
|
test("removing the avatar nulls both images", async () => {
|
|
330
|
-
|
|
330
|
+
syncAvatarToCloud();
|
|
331
331
|
await settle();
|
|
332
332
|
mockState = NONE;
|
|
333
333
|
mockRasterPath = null;
|
|
334
|
-
|
|
334
|
+
syncAvatarToCloud();
|
|
335
335
|
await settle();
|
|
336
336
|
|
|
337
337
|
expect(patches).toHaveLength(2);
|
|
@@ -350,7 +350,7 @@ describe("syncAvatarToPlatform", () => {
|
|
|
350
350
|
status: 400,
|
|
351
351
|
})
|
|
352
352
|
: new Response("{}", { status: 200 });
|
|
353
|
-
|
|
353
|
+
syncAvatarToCloud();
|
|
354
354
|
await settle();
|
|
355
355
|
|
|
356
356
|
expect(patches).toHaveLength(2);
|
|
@@ -364,7 +364,7 @@ describe("syncAvatarToPlatform", () => {
|
|
|
364
364
|
`|${REMOVAL_KEY}`,
|
|
365
365
|
);
|
|
366
366
|
|
|
367
|
-
|
|
367
|
+
syncAvatarToCloud();
|
|
368
368
|
await settle();
|
|
369
369
|
|
|
370
370
|
expect(patches).toHaveLength(2);
|
|
@@ -379,7 +379,7 @@ describe("syncAvatarToPlatform", () => {
|
|
|
379
379
|
JSON.stringify({ key: LEGACY_REMOVAL_KEY, syncedAt: Date.now() }),
|
|
380
380
|
);
|
|
381
381
|
|
|
382
|
-
|
|
382
|
+
syncAvatarToCloud();
|
|
383
383
|
await settle();
|
|
384
384
|
|
|
385
385
|
expect(patches).toHaveLength(1);
|
|
@@ -391,28 +391,28 @@ describe("syncAvatarToPlatform", () => {
|
|
|
391
391
|
`|${REMOVAL_KEY}`,
|
|
392
392
|
);
|
|
393
393
|
|
|
394
|
-
|
|
394
|
+
syncAvatarToCloud();
|
|
395
395
|
await settle();
|
|
396
396
|
|
|
397
397
|
expect(patches).toHaveLength(1);
|
|
398
398
|
});
|
|
399
399
|
|
|
400
400
|
test("an image avatar with a missing PNG is skipped, not cleared", async () => {
|
|
401
|
-
|
|
401
|
+
syncAvatarToCloud();
|
|
402
402
|
await settle();
|
|
403
403
|
mockRasterPath = null;
|
|
404
|
-
|
|
404
|
+
syncAvatarToCloud();
|
|
405
405
|
await settle();
|
|
406
406
|
|
|
407
407
|
expect(patches).toHaveLength(1);
|
|
408
408
|
});
|
|
409
409
|
|
|
410
410
|
test("a character whose re-render failed is skipped, not cleared", async () => {
|
|
411
|
-
|
|
411
|
+
syncAvatarToCloud();
|
|
412
412
|
await settle();
|
|
413
413
|
mockState = { ...characterState(), source: null };
|
|
414
414
|
mockRasterPath = null;
|
|
415
|
-
|
|
415
|
+
syncAvatarToCloud();
|
|
416
416
|
await settle();
|
|
417
417
|
|
|
418
418
|
expect(patches).toHaveLength(1);
|
|
@@ -423,7 +423,7 @@ describe("syncAvatarToPlatform", () => {
|
|
|
423
423
|
writeFileSync(outside, png("secret"));
|
|
424
424
|
mockRasterPath = join(avatarDir, "avatar-image.png");
|
|
425
425
|
symlinkSync(outside, mockRasterPath);
|
|
426
|
-
|
|
426
|
+
syncAvatarToCloud();
|
|
427
427
|
await settle();
|
|
428
428
|
|
|
429
429
|
expect(patches).toHaveLength(0);
|
|
@@ -434,7 +434,7 @@ describe("syncAvatarToPlatform", () => {
|
|
|
434
434
|
"avatar-image.png",
|
|
435
435
|
Buffer.from("AKIA-not-an-image-at-all"),
|
|
436
436
|
);
|
|
437
|
-
|
|
437
|
+
syncAvatarToCloud();
|
|
438
438
|
await settle();
|
|
439
439
|
|
|
440
440
|
expect(patches).toHaveLength(0);
|
|
@@ -444,7 +444,7 @@ describe("syncAvatarToPlatform", () => {
|
|
|
444
444
|
const outside = join(dir, "elsewhere.png");
|
|
445
445
|
writeFileSync(outside, png("elsewhere"));
|
|
446
446
|
mockRasterPath = outside;
|
|
447
|
-
|
|
447
|
+
syncAvatarToCloud();
|
|
448
448
|
await settle();
|
|
449
449
|
|
|
450
450
|
expect(patches).toHaveLength(0);
|
|
@@ -452,7 +452,7 @@ describe("syncAvatarToPlatform", () => {
|
|
|
452
452
|
|
|
453
453
|
test("skips oversized rasters when resvg is unavailable", async () => {
|
|
454
454
|
mockRasterPath = writeRaster("big.png", OVERSIZED);
|
|
455
|
-
|
|
455
|
+
syncAvatarToCloud();
|
|
456
456
|
await settle();
|
|
457
457
|
|
|
458
458
|
expect(patches).toHaveLength(0);
|
|
@@ -462,7 +462,7 @@ describe("syncAvatarToPlatform", () => {
|
|
|
462
462
|
mockResvgAvailable = true;
|
|
463
463
|
mockRenderedPng = Buffer.from("tiny");
|
|
464
464
|
mockRasterPath = writeRaster("big.png", OVERSIZED);
|
|
465
|
-
|
|
465
|
+
syncAvatarToCloud();
|
|
466
466
|
await settle();
|
|
467
467
|
|
|
468
468
|
expect(patches).toHaveLength(1);
|
|
@@ -475,7 +475,7 @@ describe("syncAvatarToPlatform", () => {
|
|
|
475
475
|
mockResvgAvailable = true;
|
|
476
476
|
mockRenderedPng = Buffer.from("tiny");
|
|
477
477
|
mockRasterPath = writeRaster("big.png", OVERSIZED_JPEG);
|
|
478
|
-
|
|
478
|
+
syncAvatarToCloud();
|
|
479
479
|
await settle();
|
|
480
480
|
|
|
481
481
|
expect(patches).toHaveLength(1);
|
|
@@ -490,7 +490,7 @@ describe("syncAvatarToPlatform", () => {
|
|
|
490
490
|
mockRenderedPng = Buffer.from("tiny");
|
|
491
491
|
lastResvgSvg = "";
|
|
492
492
|
mockRasterPath = writeRaster("big.png", OVERSIZED_WEBP);
|
|
493
|
-
|
|
493
|
+
syncAvatarToCloud();
|
|
494
494
|
await settle();
|
|
495
495
|
|
|
496
496
|
expect(patches).toHaveLength(0);
|
|
@@ -501,7 +501,7 @@ describe("syncAvatarToPlatform", () => {
|
|
|
501
501
|
mockResvgAvailable = true;
|
|
502
502
|
mockRenderedPng = OVERSIZED;
|
|
503
503
|
mockRasterPath = writeRaster("big.png", OVERSIZED);
|
|
504
|
-
|
|
504
|
+
syncAvatarToCloud();
|
|
505
505
|
await settle();
|
|
506
506
|
|
|
507
507
|
expect(patches).toHaveLength(0);
|
|
@@ -510,7 +510,7 @@ describe("syncAvatarToPlatform", () => {
|
|
|
510
510
|
test("PATCHes the notification avatar alongside the raster", async () => {
|
|
511
511
|
mockResvgAvailable = true;
|
|
512
512
|
mockRenderedPng = Buffer.from("disc-a");
|
|
513
|
-
|
|
513
|
+
syncAvatarToCloud();
|
|
514
514
|
await settle();
|
|
515
515
|
|
|
516
516
|
expect(patches).toHaveLength(1);
|
|
@@ -522,7 +522,7 @@ describe("syncAvatarToPlatform", () => {
|
|
|
522
522
|
});
|
|
523
523
|
|
|
524
524
|
test("omits the notification avatar when resvg is unavailable", async () => {
|
|
525
|
-
|
|
525
|
+
syncAvatarToCloud();
|
|
526
526
|
await settle();
|
|
527
527
|
|
|
528
528
|
expect(patches[0].body).toEqual({
|
|
@@ -531,7 +531,7 @@ describe("syncAvatarToPlatform", () => {
|
|
|
531
531
|
});
|
|
532
532
|
|
|
533
533
|
test("re-sends an unchanged raster once the rasterizer appears", async () => {
|
|
534
|
-
|
|
534
|
+
syncAvatarToCloud();
|
|
535
535
|
await settle();
|
|
536
536
|
expect(patches[0].body).toEqual({
|
|
537
537
|
avatar_base64: png("a").toString("base64"),
|
|
@@ -539,7 +539,7 @@ describe("syncAvatarToPlatform", () => {
|
|
|
539
539
|
|
|
540
540
|
mockResvgAvailable = true;
|
|
541
541
|
mockRenderedPng = Buffer.from("disc-a");
|
|
542
|
-
|
|
542
|
+
syncAvatarToCloud();
|
|
543
543
|
await settle();
|
|
544
544
|
|
|
545
545
|
expect(patches).toHaveLength(2);
|
|
@@ -552,14 +552,14 @@ describe("syncAvatarToPlatform", () => {
|
|
|
552
552
|
test("a changed accent re-sends an unchanged raster", async () => {
|
|
553
553
|
mockResvgAvailable = true;
|
|
554
554
|
mockRenderedPng = Buffer.from("disc-a");
|
|
555
|
-
|
|
555
|
+
syncAvatarToCloud();
|
|
556
556
|
await settle();
|
|
557
557
|
mockState = {
|
|
558
558
|
...imageState("etag-a"),
|
|
559
559
|
accent: { hex: "#E9642F", source: "custom" },
|
|
560
560
|
};
|
|
561
561
|
mockRenderedPng = Buffer.from("disc-b");
|
|
562
|
-
|
|
562
|
+
syncAvatarToCloud();
|
|
563
563
|
await settle();
|
|
564
564
|
|
|
565
565
|
expect(patches.map((p) => p.body.notification_avatar_base64)).toEqual([
|
|
@@ -574,7 +574,7 @@ describe("syncAvatarToPlatform", () => {
|
|
|
574
574
|
mockResvgAvailable = true;
|
|
575
575
|
mockRenderedPng = Buffer.from("disc-green");
|
|
576
576
|
mockState = characterState();
|
|
577
|
-
|
|
577
|
+
syncAvatarToCloud();
|
|
578
578
|
await settle();
|
|
579
579
|
|
|
580
580
|
expect(patches).toHaveLength(1);
|
|
@@ -590,7 +590,7 @@ describe("syncAvatarToPlatform", () => {
|
|
|
590
590
|
mockState = imageState("etag-legacy");
|
|
591
591
|
mockRasterPath = writeRaster("avatar-image.png", RED_PNG);
|
|
592
592
|
|
|
593
|
-
|
|
593
|
+
syncAvatarToCloud();
|
|
594
594
|
await settle();
|
|
595
595
|
|
|
596
596
|
expect(patches).toHaveLength(1);
|
|
@@ -608,7 +608,7 @@ describe("syncAvatarToPlatform", () => {
|
|
|
608
608
|
test("a render that failed after the key promised a disc re-uploads next sync", async () => {
|
|
609
609
|
mockResvgAvailable = true;
|
|
610
610
|
mockRenderThrows = true;
|
|
611
|
-
|
|
611
|
+
syncAvatarToCloud();
|
|
612
612
|
await settle();
|
|
613
613
|
|
|
614
614
|
expect(patches).toHaveLength(1);
|
|
@@ -623,7 +623,7 @@ describe("syncAvatarToPlatform", () => {
|
|
|
623
623
|
|
|
624
624
|
mockRenderThrows = false;
|
|
625
625
|
mockRenderedPng = Buffer.from("disc-a");
|
|
626
|
-
|
|
626
|
+
syncAvatarToCloud();
|
|
627
627
|
await settle();
|
|
628
628
|
|
|
629
629
|
expect(patches).toHaveLength(2);
|
|
@@ -642,7 +642,7 @@ describe("syncAvatarToPlatform", () => {
|
|
|
642
642
|
status: 400,
|
|
643
643
|
})
|
|
644
644
|
: new Response("{}", { status: 200 });
|
|
645
|
-
|
|
645
|
+
syncAvatarToCloud();
|
|
646
646
|
await settle();
|
|
647
647
|
|
|
648
648
|
expect(patches).toHaveLength(2);
|
|
@@ -652,14 +652,14 @@ describe("syncAvatarToPlatform", () => {
|
|
|
652
652
|
expect(patches[1].body).toEqual({
|
|
653
653
|
avatar_base64: png("a").toString("base64"),
|
|
654
654
|
});
|
|
655
|
-
// The disc key, not the disc-less one: the
|
|
655
|
+
// The disc key, not the disc-less one: the cloud judged this render, so
|
|
656
656
|
// a later enqueue must not redraw it and take the same 400.
|
|
657
657
|
expect(JSON.parse(readFileSync(syncStatePath, "utf-8")).key).toEndWith(
|
|
658
658
|
":disc",
|
|
659
659
|
);
|
|
660
660
|
|
|
661
661
|
lastResvgSvg = "";
|
|
662
|
-
|
|
662
|
+
syncAvatarToCloud();
|
|
663
663
|
await settle();
|
|
664
664
|
|
|
665
665
|
expect(patches).toHaveLength(2);
|
|
@@ -671,7 +671,7 @@ describe("syncAvatarToPlatform", () => {
|
|
|
671
671
|
mockRenderedPng = Buffer.from("disc-a");
|
|
672
672
|
respond = () =>
|
|
673
673
|
new Response('{"avatar_base64":["Too large"]}', { status: 400 });
|
|
674
|
-
|
|
674
|
+
syncAvatarToCloud();
|
|
675
675
|
await settle();
|
|
676
676
|
|
|
677
677
|
expect(patches).toHaveLength(1);
|
|
@@ -680,12 +680,12 @@ describe("syncAvatarToPlatform", () => {
|
|
|
680
680
|
|
|
681
681
|
test("does not render the notification avatar for a deduped payload", async () => {
|
|
682
682
|
mockResvgAvailable = true;
|
|
683
|
-
|
|
683
|
+
syncAvatarToCloud();
|
|
684
684
|
await settle();
|
|
685
685
|
expect(patches).toHaveLength(1);
|
|
686
686
|
|
|
687
687
|
lastResvgSvg = "";
|
|
688
|
-
|
|
688
|
+
syncAvatarToCloud();
|
|
689
689
|
await settle();
|
|
690
690
|
|
|
691
691
|
expect(patches).toHaveLength(1);
|
|
@@ -693,7 +693,7 @@ describe("syncAvatarToPlatform", () => {
|
|
|
693
693
|
});
|
|
694
694
|
|
|
695
695
|
test("a restart with the same raster and destination does not re-upload", async () => {
|
|
696
|
-
|
|
696
|
+
syncAvatarToCloud();
|
|
697
697
|
await settle();
|
|
698
698
|
expect(JSON.parse(readFileSync(syncStatePath, "utf-8"))).toEqual({
|
|
699
699
|
key: expect.stringMatching(/^https:\/\/platform\.a\|asst-1\|image:/),
|
|
@@ -704,7 +704,7 @@ describe("syncAvatarToPlatform", () => {
|
|
|
704
704
|
).toBe(false);
|
|
705
705
|
|
|
706
706
|
_resetSyncAvatarStateForTests();
|
|
707
|
-
|
|
707
|
+
syncAvatarToCloud();
|
|
708
708
|
await settle();
|
|
709
709
|
|
|
710
710
|
expect(patches).toHaveLength(1);
|
|
@@ -712,7 +712,7 @@ describe("syncAvatarToPlatform", () => {
|
|
|
712
712
|
|
|
713
713
|
test("an older rendering spec re-uploads the same avatar once", async () => {
|
|
714
714
|
mockResvgAvailable = true;
|
|
715
|
-
|
|
715
|
+
syncAvatarToCloud();
|
|
716
716
|
await settle();
|
|
717
717
|
const current = JSON.parse(readFileSync(syncStatePath, "utf-8"));
|
|
718
718
|
const previous = {
|
|
@@ -726,10 +726,10 @@ describe("syncAvatarToPlatform", () => {
|
|
|
726
726
|
writeFileSync(syncStatePath, JSON.stringify(previous));
|
|
727
727
|
|
|
728
728
|
_resetSyncAvatarStateForTests();
|
|
729
|
-
|
|
729
|
+
syncAvatarToCloud();
|
|
730
730
|
await settle();
|
|
731
731
|
_resetSyncAvatarStateForTests();
|
|
732
|
-
|
|
732
|
+
syncAvatarToCloud();
|
|
733
733
|
await settle();
|
|
734
734
|
|
|
735
735
|
expect(patches).toHaveLength(2);
|
|
@@ -740,17 +740,17 @@ describe("syncAvatarToPlatform", () => {
|
|
|
740
740
|
});
|
|
741
741
|
|
|
742
742
|
test("a restart re-uploads when the destination or raster changed", async () => {
|
|
743
|
-
|
|
743
|
+
syncAvatarToCloud();
|
|
744
744
|
await settle();
|
|
745
745
|
|
|
746
746
|
_resetSyncAvatarStateForTests();
|
|
747
747
|
mockClient = makeClient("asst-2");
|
|
748
|
-
|
|
748
|
+
syncAvatarToCloud();
|
|
749
749
|
await settle();
|
|
750
750
|
|
|
751
751
|
_resetSyncAvatarStateForTests();
|
|
752
752
|
writeRaster("a.png", png("a-rewritten"));
|
|
753
|
-
|
|
753
|
+
syncAvatarToCloud();
|
|
754
754
|
await settle();
|
|
755
755
|
|
|
756
756
|
expect(patches.map((p) => p.path)).toEqual([
|
|
@@ -764,17 +764,17 @@ describe("syncAvatarToPlatform", () => {
|
|
|
764
764
|
});
|
|
765
765
|
|
|
766
766
|
test("a persisted key older than the TTL re-uploads once and is refreshed", async () => {
|
|
767
|
-
|
|
767
|
+
syncAvatarToCloud();
|
|
768
768
|
await settle();
|
|
769
769
|
const stale = JSON.parse(readFileSync(syncStatePath, "utf-8"));
|
|
770
770
|
stale.syncedAt = Date.now() - AVATAR_SYNC_KEY_TTL_MS - 24 * 60 * 60 * 1000;
|
|
771
771
|
writeFileSync(syncStatePath, JSON.stringify(stale));
|
|
772
772
|
|
|
773
773
|
_resetSyncAvatarStateForTests();
|
|
774
|
-
|
|
774
|
+
syncAvatarToCloud();
|
|
775
775
|
await settle();
|
|
776
776
|
_resetSyncAvatarStateForTests();
|
|
777
|
-
|
|
777
|
+
syncAvatarToCloud();
|
|
778
778
|
await settle();
|
|
779
779
|
|
|
780
780
|
expect(patches).toHaveLength(2);
|
|
@@ -787,17 +787,17 @@ describe("syncAvatarToPlatform", () => {
|
|
|
787
787
|
const start = Date.now();
|
|
788
788
|
setSystemTime(new Date(start));
|
|
789
789
|
try {
|
|
790
|
-
|
|
790
|
+
syncAvatarToCloud();
|
|
791
791
|
await settle();
|
|
792
792
|
setSystemTime(new Date(start + AVATAR_SYNC_KEY_TTL_MS - 1));
|
|
793
|
-
|
|
793
|
+
syncAvatarToCloud();
|
|
794
794
|
await settle();
|
|
795
795
|
expect(patches).toHaveLength(1);
|
|
796
796
|
|
|
797
797
|
setSystemTime(new Date(start + AVATAR_SYNC_KEY_TTL_MS));
|
|
798
|
-
|
|
798
|
+
syncAvatarToCloud();
|
|
799
799
|
await settle();
|
|
800
|
-
|
|
800
|
+
syncAvatarToCloud();
|
|
801
801
|
await settle();
|
|
802
802
|
} finally {
|
|
803
803
|
setSystemTime();
|
|
@@ -828,7 +828,7 @@ describe("syncAvatarToPlatform", () => {
|
|
|
828
828
|
return realSetTimeout(fn, delay);
|
|
829
829
|
}) as typeof setTimeout);
|
|
830
830
|
try {
|
|
831
|
-
|
|
831
|
+
syncAvatarToCloud();
|
|
832
832
|
await settle();
|
|
833
833
|
expect(patches).toHaveLength(1);
|
|
834
834
|
expect(armed).toHaveLength(1);
|
|
@@ -848,7 +848,7 @@ describe("syncAvatarToPlatform", () => {
|
|
|
848
848
|
test("a corrupt persisted key re-uploads", async () => {
|
|
849
849
|
mkdirSync(dirname(syncStatePath), { recursive: true });
|
|
850
850
|
writeFileSync(syncStatePath, "{not json");
|
|
851
|
-
|
|
851
|
+
syncAvatarToCloud();
|
|
852
852
|
await settle();
|
|
853
853
|
|
|
854
854
|
expect(patches).toHaveLength(1);
|
|
@@ -856,18 +856,18 @@ describe("syncAvatarToPlatform", () => {
|
|
|
856
856
|
|
|
857
857
|
test("a failed PATCH leaves the persisted key untouched", async () => {
|
|
858
858
|
respond = () => new Response("nope", { status: 500 });
|
|
859
|
-
|
|
859
|
+
syncAvatarToCloud();
|
|
860
860
|
await settle();
|
|
861
861
|
|
|
862
862
|
expect(() => readFileSync(syncStatePath)).toThrow();
|
|
863
863
|
});
|
|
864
864
|
|
|
865
|
-
test("no-op without a
|
|
865
|
+
test("no-op without a cloud client or assistant id", async () => {
|
|
866
866
|
mockClient = null;
|
|
867
|
-
|
|
867
|
+
syncAvatarToCloud();
|
|
868
868
|
await settle();
|
|
869
869
|
mockClient = makeClient("");
|
|
870
|
-
|
|
870
|
+
syncAvatarToCloud();
|
|
871
871
|
await settle();
|
|
872
872
|
|
|
873
873
|
expect(patches).toHaveLength(0);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Sync the avatar raster to the
|
|
2
|
+
* Sync the avatar raster to the cloud Assistant record.
|
|
3
3
|
*
|
|
4
4
|
* Every avatar publish (routes and the fs watcher) and daemon startup enqueue
|
|
5
5
|
* a sync through the shared platform PATCH queue. The current avatar state is
|
|
@@ -16,9 +16,9 @@
|
|
|
16
16
|
* (API-key auth cannot read the record to verify it).
|
|
17
17
|
* `avatar_base64: null` is sent only when the avatar is actually removed; a
|
|
18
18
|
* non-none avatar whose raster is missing (image PNG gone, character
|
|
19
|
-
* re-render unavailable) is skipped so the
|
|
19
|
+
* re-render unavailable) is skipped so the cloud keeps the last synced
|
|
20
20
|
* copy. A removal nulls the notification field too, and falls back to nulling
|
|
21
|
-
* the display avatar alone, so a
|
|
21
|
+
* the display avatar alone, so a cloud that rejects the notification field
|
|
22
22
|
* cannot block clearing the avatar. Its key carries the spec version as the
|
|
23
23
|
* non-empty key does, so an installation still holding the key of a removal
|
|
24
24
|
* that predates the notification field re-sends once instead of deduping
|
|
@@ -34,13 +34,13 @@
|
|
|
34
34
|
* codec for the source) from latching for the key's whole lifetime: the key
|
|
35
35
|
* changes the moment the cause clears, so the disc goes up on the next sync.
|
|
36
36
|
* When the render is unavailable the key is omitted rather than nulled, so
|
|
37
|
-
* the
|
|
37
|
+
* the cloud keeps the copy it holds. The state is read through the accent
|
|
38
38
|
* backfill, so a manifest written before accents were persisted has its
|
|
39
39
|
* accent derived and stored before the key is built and the disc is drawn,
|
|
40
40
|
* rather than shipping the neutral fallback until something else repairs it.
|
|
41
41
|
* A render that fails inside the body, after the key promised a disc, hands
|
|
42
42
|
* the queue the disc-less key instead, so the next sync tries again rather
|
|
43
|
-
* than recording a disc that never went up. If the
|
|
43
|
+
* than recording a disc that never went up. If the cloud rejects the field
|
|
44
44
|
* outright with a 400, the queue re-sends the display avatar alone, and under
|
|
45
45
|
* the disc key: the 400 is a verdict on this render, so re-drawing it would
|
|
46
46
|
* only take the same 400 on every later enqueue. The key still moves when the
|
|
@@ -55,12 +55,12 @@ import { dirname, join } from "node:path";
|
|
|
55
55
|
import { NOTIFICATION_AVATAR_SPEC_VERSION } from "@mycadet/avatar-manifest/notification-avatar";
|
|
56
56
|
|
|
57
57
|
import {
|
|
58
|
-
|
|
58
|
+
type CloudPatchQueue,
|
|
59
|
+
createCloudPatchQueue,
|
|
59
60
|
type PatchBodyResult,
|
|
60
61
|
type PatchPayload,
|
|
61
|
-
type PlatformPatchQueue,
|
|
62
62
|
type SyncedKey,
|
|
63
|
-
} from "../
|
|
63
|
+
} from "../cloud/cloud-patch-queue.js";
|
|
64
64
|
import { detectMediaType } from "../tools/shared/filesystem/image-read.js";
|
|
65
65
|
import { getLogger } from "../util/logger.js";
|
|
66
66
|
import { getWorkspaceDir } from "../util/platform.js";
|
|
@@ -101,7 +101,7 @@ const UPLOADABLE_TYPES: ReadonlySet<string> = new Set([
|
|
|
101
101
|
const SYNC_STATE_SUBPATH = ["platform-sync", "avatar.json"];
|
|
102
102
|
export const AVATAR_SYNC_KEY_TTL_MS = 7 * 24 * 60 * 60 * 1000;
|
|
103
103
|
|
|
104
|
-
let queue:
|
|
104
|
+
let queue: CloudPatchQueue<void> | null = null;
|
|
105
105
|
|
|
106
106
|
/** Recreates the queue so the next sync re-seeds its dedup key from disk. */
|
|
107
107
|
export function _resetSyncAvatarStateForTests(): void {
|
|
@@ -110,12 +110,12 @@ export function _resetSyncAvatarStateForTests(): void {
|
|
|
110
110
|
}
|
|
111
111
|
|
|
112
112
|
/**
|
|
113
|
-
* Enqueue a best-effort push of the current avatar raster to the
|
|
114
|
-
* No-op when the
|
|
113
|
+
* Enqueue a best-effort push of the current avatar raster to the cloud.
|
|
114
|
+
* No-op when the cloud client cannot be created or no assistant id is
|
|
115
115
|
* configured, or when the raster's etag matches the last successful sync.
|
|
116
116
|
*/
|
|
117
|
-
export function
|
|
118
|
-
queue ??=
|
|
117
|
+
export function syncAvatarToCloud(): void {
|
|
118
|
+
queue ??= createCloudPatchQueue({
|
|
119
119
|
log,
|
|
120
120
|
label: "avatar",
|
|
121
121
|
buildPayload,
|
|
@@ -207,7 +207,7 @@ async function buildPayload(): Promise<PatchPayload | undefined> {
|
|
|
207
207
|
// draws again.
|
|
208
208
|
return { body: rasterOnly, key: keyFor(NONE_KEY) };
|
|
209
209
|
}
|
|
210
|
-
// A 400 is the
|
|
210
|
+
// A 400 is the cloud refusing this render rather than missing it,
|
|
211
211
|
// so the reduced send records the disc key: re-drawing would take the
|
|
212
212
|
// same 400 on every later enqueue.
|
|
213
213
|
return withNotificationFallback(
|
|
@@ -239,7 +239,7 @@ function sha256(bytes: Buffer): string {
|
|
|
239
239
|
/**
|
|
240
240
|
* Reads the raster through the fd-validated, avatar-dir-contained path and
|
|
241
241
|
* refuses anything that does not sniff as an image, so a symlinked or
|
|
242
|
-
* swapped `avatar-image.png` never ships host bytes to the
|
|
242
|
+
* swapped `avatar-image.png` never ships host bytes to the cloud.
|
|
243
243
|
*/
|
|
244
244
|
function readRaster(path: string): Buffer | undefined {
|
|
245
245
|
const bytes = readContainedAvatarRaster(path);
|
|
@@ -165,7 +165,7 @@ export function writeTraitsAndRenderAvatar(
|
|
|
165
165
|
message:
|
|
166
166
|
"Avatar PNG rendering is unavailable on this platform because the " +
|
|
167
167
|
"@resvg/resvg-js native binding failed to load. Reinstall dependencies " +
|
|
168
|
-
"to pull the
|
|
168
|
+
"to pull the cloud-specific optional package.",
|
|
169
169
|
};
|
|
170
170
|
}
|
|
171
171
|
|