@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
|
@@ -630,7 +630,7 @@ describe("handleMigrationImport — validation failures", () => {
|
|
|
630
630
|
//
|
|
631
631
|
// Pin: a bundle whose min_runtime_version exceeds APP_VERSION must surface as
|
|
632
632
|
// a 4xx user-actionable response (422 Unprocessable Entity), not a 500
|
|
633
|
-
// InternalError. Body mirrors the
|
|
633
|
+
// InternalError. Body mirrors the cloud's PR #5470 response shape so
|
|
634
634
|
// clients can render the same UX regardless of which gate (platform or
|
|
635
635
|
// runtime) rejected the bundle.
|
|
636
636
|
// ---------------------------------------------------------------------------
|
|
@@ -731,7 +731,7 @@ describe("plugin runtime activation", () => {
|
|
|
731
731
|
getAllToolDefinitions().some((t) => t.name === "teardown-tool"),
|
|
732
732
|
).toBe(true);
|
|
733
733
|
|
|
734
|
-
// This is the daemon uninstall route's teardown path: the
|
|
734
|
+
// This is the daemon uninstall route's teardown path: the cloud uninstall
|
|
735
735
|
// runs `shutdown` itself (while the files are present) and removes the
|
|
736
736
|
// directory, then reconciles. The reconcile here only mirrors the removal —
|
|
737
737
|
// it drops the plugin's tools/hooks but must NOT run `shutdown` a second
|
|
@@ -766,7 +766,7 @@ describe("plugin runtime activation", () => {
|
|
|
766
766
|
});
|
|
767
767
|
|
|
768
768
|
test("an out-of-band directory removal unregisters tools but runs no shutdown", async () => {
|
|
769
|
-
// A raw `rm` (bypassing the
|
|
769
|
+
// A raw `rm` (bypassing the cloud uninstall) is only noticed by the
|
|
770
770
|
// monitor after the files are gone, so there's no `shutdown` to resolve —
|
|
771
771
|
// the reconcile just evicts. A managed uninstall runs `shutdown` before
|
|
772
772
|
// removal (see uninstall-plugin.test.ts).
|
package/src/__tests__/{notification-platform-adapter.test.ts → notification-cloud-adapter.test.ts}
RENAMED
|
@@ -30,7 +30,7 @@ mock.module("../util/retry.js", () => ({
|
|
|
30
30
|
},
|
|
31
31
|
}));
|
|
32
32
|
|
|
33
|
-
// ──
|
|
33
|
+
// ── CadetCloudClient mock state ──────────────────────────────────────────
|
|
34
34
|
|
|
35
35
|
interface FetchCall {
|
|
36
36
|
path: string;
|
|
@@ -46,15 +46,15 @@ const fetchErrors: Error[] = [];
|
|
|
46
46
|
let clientAvailable = true;
|
|
47
47
|
let onClientCreation: () => Promise<void> = async () => {};
|
|
48
48
|
|
|
49
|
-
mock.module("../
|
|
50
|
-
|
|
49
|
+
mock.module("../cloud/client.js", () => ({
|
|
50
|
+
CadetCloudClient: {
|
|
51
51
|
create: async () => {
|
|
52
52
|
await onClientCreation();
|
|
53
53
|
if (!clientAvailable) {
|
|
54
54
|
return null;
|
|
55
55
|
}
|
|
56
56
|
return {
|
|
57
|
-
|
|
57
|
+
cloudAssistantId: "test-assistant-id",
|
|
58
58
|
fetch: async (path: string, init?: RequestInit) => {
|
|
59
59
|
const body = init?.body
|
|
60
60
|
? (JSON.parse(init.body as string) as Record<string, unknown>)
|
|
@@ -86,7 +86,7 @@ mock.module("../platform/client.js", () => ({
|
|
|
86
86
|
},
|
|
87
87
|
}));
|
|
88
88
|
|
|
89
|
-
import {
|
|
89
|
+
import { CloudPushAdapter } from "../notifications/adapters/cloud.js";
|
|
90
90
|
import type {
|
|
91
91
|
ChannelDeliveryPayload,
|
|
92
92
|
ChannelDestination,
|
|
@@ -120,7 +120,7 @@ function makeDestination(
|
|
|
120
120
|
|
|
121
121
|
// ── Tests ────────────────────────────────────────────────────────────────────
|
|
122
122
|
|
|
123
|
-
describe("
|
|
123
|
+
describe("CloudPushAdapter", () => {
|
|
124
124
|
beforeEach(() => {
|
|
125
125
|
saveRawConfig({});
|
|
126
126
|
fetchCalls.length = 0;
|
|
@@ -133,7 +133,7 @@ describe("PlatformPushAdapter", () => {
|
|
|
133
133
|
|
|
134
134
|
test("skips a disabled chat reply without sending a native push", async () => {
|
|
135
135
|
saveRawConfig({ notifications: { newMessageEnabled: false } });
|
|
136
|
-
const result = await new
|
|
136
|
+
const result = await new CloudPushAdapter().send(
|
|
137
137
|
makePayload({ sourceEventName: "chat.assistant_reply" }),
|
|
138
138
|
makeDestination(),
|
|
139
139
|
);
|
|
@@ -149,7 +149,7 @@ describe("PlatformPushAdapter", () => {
|
|
|
149
149
|
onClientCreation = async () => {
|
|
150
150
|
saveRawConfig({ notifications: { newMessageEnabled: false } });
|
|
151
151
|
};
|
|
152
|
-
const result = await new
|
|
152
|
+
const result = await new CloudPushAdapter().send(
|
|
153
153
|
makePayload({ sourceEventName: "chat.assistant_reply" }),
|
|
154
154
|
makeDestination(),
|
|
155
155
|
);
|
|
@@ -172,7 +172,7 @@ describe("PlatformPushAdapter", () => {
|
|
|
172
172
|
onRetrySleep = async () => {
|
|
173
173
|
saveRawConfig({ notifications: { newMessageEnabled: false } });
|
|
174
174
|
};
|
|
175
|
-
const result = await new
|
|
175
|
+
const result = await new CloudPushAdapter().send(
|
|
176
176
|
makePayload({ sourceEventName: "chat.assistant_reply" }),
|
|
177
177
|
makeDestination(),
|
|
178
178
|
);
|
|
@@ -196,7 +196,7 @@ describe("PlatformPushAdapter", () => {
|
|
|
196
196
|
"keeps %s native push enabled when ordinary reply alerts are off",
|
|
197
197
|
async (sourceEventName) => {
|
|
198
198
|
saveRawConfig({ notifications: { newMessageEnabled: false } });
|
|
199
|
-
const result = await new
|
|
199
|
+
const result = await new CloudPushAdapter().send(
|
|
200
200
|
makePayload({ sourceEventName }),
|
|
201
201
|
makeDestination(),
|
|
202
202
|
);
|
|
@@ -206,11 +206,11 @@ describe("PlatformPushAdapter", () => {
|
|
|
206
206
|
);
|
|
207
207
|
|
|
208
208
|
test("channel is 'platform'", () => {
|
|
209
|
-
expect(new
|
|
209
|
+
expect(new CloudPushAdapter().channel).toBe("platform");
|
|
210
210
|
});
|
|
211
211
|
|
|
212
212
|
test("POSTs to the correct dispatch endpoint with snake_case body", async () => {
|
|
213
|
-
const adapter = new
|
|
213
|
+
const adapter = new CloudPushAdapter();
|
|
214
214
|
const result = await adapter.send(makePayload(), makeDestination());
|
|
215
215
|
|
|
216
216
|
expect(result.success).toBe(true);
|
|
@@ -232,7 +232,7 @@ describe("PlatformPushAdapter", () => {
|
|
|
232
232
|
});
|
|
233
233
|
|
|
234
234
|
test("sets target_guardian_principal_id for guardian-sensitive events", async () => {
|
|
235
|
-
const adapter = new
|
|
235
|
+
const adapter = new CloudPushAdapter();
|
|
236
236
|
const payload = makePayload({ sourceEventName: "guardian.question" });
|
|
237
237
|
const destination = makeDestination({
|
|
238
238
|
metadata: { guardianPrincipalId: "principal-xyz" },
|
|
@@ -249,7 +249,7 @@ describe("PlatformPushAdapter", () => {
|
|
|
249
249
|
test.each(["chat.assistant_reply", "schedule.result", "activity.complete"])(
|
|
250
250
|
"%s targets the resolved completion recipient",
|
|
251
251
|
async (sourceEventName) => {
|
|
252
|
-
const adapter = new
|
|
252
|
+
const adapter = new CloudPushAdapter();
|
|
253
253
|
const result = await adapter.send(
|
|
254
254
|
makePayload({
|
|
255
255
|
sourceEventName,
|
|
@@ -275,7 +275,7 @@ describe("PlatformPushAdapter", () => {
|
|
|
275
275
|
test.each([undefined, " ", "other-principal"])(
|
|
276
276
|
"does not send typed completion preview with unavailable recipient %s",
|
|
277
277
|
async (guardianPrincipalId) => {
|
|
278
|
-
const adapter = new
|
|
278
|
+
const adapter = new CloudPushAdapter();
|
|
279
279
|
const result = await adapter.send(
|
|
280
280
|
makePayload({
|
|
281
281
|
sourceEventName: "activity.complete",
|
|
@@ -302,7 +302,7 @@ describe("PlatformPushAdapter", () => {
|
|
|
302
302
|
test.each(["chat.assistant_reply", "schedule.result"])(
|
|
303
303
|
"%s preserves owner-scoped push when recipient lookup is unavailable",
|
|
304
304
|
async (sourceEventName) => {
|
|
305
|
-
const result = await new
|
|
305
|
+
const result = await new CloudPushAdapter().send(
|
|
306
306
|
makePayload({ sourceEventName }),
|
|
307
307
|
makeDestination(),
|
|
308
308
|
);
|
|
@@ -325,7 +325,7 @@ describe("PlatformPushAdapter", () => {
|
|
|
325
325
|
])(
|
|
326
326
|
"malformed ownership %j never dispatches a mobile preview",
|
|
327
327
|
async (completion) => {
|
|
328
|
-
const result = await new
|
|
328
|
+
const result = await new CloudPushAdapter().send(
|
|
329
329
|
makePayload({
|
|
330
330
|
sourceEventName: "activity.complete",
|
|
331
331
|
urgency: "high",
|
|
@@ -344,7 +344,7 @@ describe("PlatformPushAdapter", () => {
|
|
|
344
344
|
);
|
|
345
345
|
|
|
346
346
|
test("omits target_guardian_principal_id for non-guardian events even with principalId in metadata", async () => {
|
|
347
|
-
const adapter = new
|
|
347
|
+
const adapter = new CloudPushAdapter();
|
|
348
348
|
const payload = makePayload({ sourceEventName: "schedule.notify" });
|
|
349
349
|
const destination = makeDestination({
|
|
350
350
|
metadata: { guardianPrincipalId: "principal-xyz" },
|
|
@@ -358,7 +358,7 @@ describe("PlatformPushAdapter", () => {
|
|
|
358
358
|
|
|
359
359
|
test("returns failure when platform client is unavailable", async () => {
|
|
360
360
|
clientAvailable = false;
|
|
361
|
-
const adapter = new
|
|
361
|
+
const adapter = new CloudPushAdapter();
|
|
362
362
|
const result = await adapter.send(makePayload(), makeDestination());
|
|
363
363
|
|
|
364
364
|
expect(result.success).toBe(false);
|
|
@@ -372,7 +372,7 @@ describe("PlatformPushAdapter", () => {
|
|
|
372
372
|
{ ok: false, status: 500, body: "internal error" },
|
|
373
373
|
{ ok: true, status: 200, body: "{}" },
|
|
374
374
|
);
|
|
375
|
-
const adapter = new
|
|
375
|
+
const adapter = new CloudPushAdapter();
|
|
376
376
|
const result = await adapter.send(makePayload(), makeDestination());
|
|
377
377
|
|
|
378
378
|
expect(result.success).toBe(true);
|
|
@@ -386,7 +386,7 @@ describe("PlatformPushAdapter", () => {
|
|
|
386
386
|
{ ok: false, status: 503, body: "unavailable" },
|
|
387
387
|
{ ok: false, status: 500, body: "still failing" },
|
|
388
388
|
);
|
|
389
|
-
const adapter = new
|
|
389
|
+
const adapter = new CloudPushAdapter();
|
|
390
390
|
const result = await adapter.send(makePayload(), makeDestination());
|
|
391
391
|
|
|
392
392
|
expect(result.success).toBe(false);
|
|
@@ -396,7 +396,7 @@ describe("PlatformPushAdapter", () => {
|
|
|
396
396
|
});
|
|
397
397
|
|
|
398
398
|
test("bounds every attempt with an abort signal", async () => {
|
|
399
|
-
const adapter = new
|
|
399
|
+
const adapter = new CloudPushAdapter();
|
|
400
400
|
const result = await adapter.send(makePayload(), makeDestination());
|
|
401
401
|
|
|
402
402
|
expect(result.success).toBe(true);
|
|
@@ -409,7 +409,7 @@ describe("PlatformPushAdapter", () => {
|
|
|
409
409
|
);
|
|
410
410
|
fetchResponses.push({ ok: true, status: 200, body: '{"tokens_sent": 1}' });
|
|
411
411
|
|
|
412
|
-
const adapter = new
|
|
412
|
+
const adapter = new CloudPushAdapter();
|
|
413
413
|
const result = await adapter.send(makePayload(), makeDestination());
|
|
414
414
|
|
|
415
415
|
expect(result.success).toBe(true);
|
|
@@ -419,7 +419,7 @@ describe("PlatformPushAdapter", () => {
|
|
|
419
419
|
|
|
420
420
|
test("does not retry on 4xx responses", async () => {
|
|
421
421
|
fetchResponses.push({ ok: false, status: 400, body: "bad request" });
|
|
422
|
-
const adapter = new
|
|
422
|
+
const adapter = new CloudPushAdapter();
|
|
423
423
|
const result = await adapter.send(makePayload(), makeDestination());
|
|
424
424
|
|
|
425
425
|
expect(result.success).toBe(false);
|
|
@@ -433,7 +433,7 @@ describe("PlatformPushAdapter", () => {
|
|
|
433
433
|
status: 200,
|
|
434
434
|
body: '{"tokens_sent":2,"accepted_platforms":[]}',
|
|
435
435
|
});
|
|
436
|
-
const adapter = new
|
|
436
|
+
const adapter = new CloudPushAdapter();
|
|
437
437
|
const result = await adapter.send(makePayload(), makeDestination());
|
|
438
438
|
|
|
439
439
|
expect(result.success).toBe(true);
|
|
@@ -457,7 +457,7 @@ describe("PlatformPushAdapter", () => {
|
|
|
457
457
|
},
|
|
458
458
|
);
|
|
459
459
|
|
|
460
|
-
const result = await new
|
|
460
|
+
const result = await new CloudPushAdapter().send(
|
|
461
461
|
makePayload(),
|
|
462
462
|
makeDestination(),
|
|
463
463
|
);
|
|
@@ -472,7 +472,7 @@ describe("PlatformPushAdapter", () => {
|
|
|
472
472
|
status: 202,
|
|
473
473
|
body: '{"skipped": "flag_off"}',
|
|
474
474
|
});
|
|
475
|
-
const adapter = new
|
|
475
|
+
const adapter = new CloudPushAdapter();
|
|
476
476
|
const result = await adapter.send(makePayload(), makeDestination());
|
|
477
477
|
|
|
478
478
|
expect(result.success).toBe(true);
|
|
@@ -485,7 +485,7 @@ describe("PlatformPushAdapter", () => {
|
|
|
485
485
|
status: 200,
|
|
486
486
|
body: '{"idempotent": true, "tokens_sent": 0}',
|
|
487
487
|
});
|
|
488
|
-
const adapter = new
|
|
488
|
+
const adapter = new CloudPushAdapter();
|
|
489
489
|
const result = await adapter.send(makePayload(), makeDestination());
|
|
490
490
|
|
|
491
491
|
expect(result.success).toBe(true);
|
|
@@ -494,7 +494,7 @@ describe("PlatformPushAdapter", () => {
|
|
|
494
494
|
|
|
495
495
|
test("reports remotePushAccepted: false when the success body is unparseable", async () => {
|
|
496
496
|
fetchResponses.push({ ok: true, status: 200, body: "not json" });
|
|
497
|
-
const adapter = new
|
|
497
|
+
const adapter = new CloudPushAdapter();
|
|
498
498
|
const result = await adapter.send(makePayload(), makeDestination());
|
|
499
499
|
|
|
500
500
|
expect(result.success).toBe(true);
|
|
@@ -503,16 +503,16 @@ describe("PlatformPushAdapter", () => {
|
|
|
503
503
|
|
|
504
504
|
test("leaves remotePushAccepted unset on non-2xx failure", async () => {
|
|
505
505
|
fetchResponses.push({ ok: false, status: 400, body: "bad request" });
|
|
506
|
-
const adapter = new
|
|
506
|
+
const adapter = new CloudPushAdapter();
|
|
507
507
|
const result = await adapter.send(makePayload(), makeDestination());
|
|
508
508
|
|
|
509
509
|
expect(result.success).toBe(false);
|
|
510
510
|
expect(result.remotePushAccepted).toBeUndefined();
|
|
511
511
|
});
|
|
512
512
|
|
|
513
|
-
test("leaves remotePushAccepted unset when the
|
|
513
|
+
test("leaves remotePushAccepted unset when the cloud client is unavailable", async () => {
|
|
514
514
|
clientAvailable = false;
|
|
515
|
-
const adapter = new
|
|
515
|
+
const adapter = new CloudPushAdapter();
|
|
516
516
|
const result = await adapter.send(makePayload(), makeDestination());
|
|
517
517
|
|
|
518
518
|
expect(result.success).toBe(false);
|
|
@@ -523,7 +523,7 @@ describe("PlatformPushAdapter", () => {
|
|
|
523
523
|
// dispatch body reads as literal punctuation. See `stripMarkdownForPreview`.
|
|
524
524
|
describe("markdown flattening", () => {
|
|
525
525
|
test("flattens markdown out of the dispatched title and body", async () => {
|
|
526
|
-
const adapter = new
|
|
526
|
+
const adapter = new CloudPushAdapter();
|
|
527
527
|
const payload = makePayload({
|
|
528
528
|
copy: {
|
|
529
529
|
title: "**Build** finished",
|
|
@@ -556,7 +556,7 @@ describe("PlatformPushAdapter", () => {
|
|
|
556
556
|
// Guardian question copy joins its question and instruction with a blank
|
|
557
557
|
// line, and iOS renders the break, so flattening must not collapse it.
|
|
558
558
|
test("preserves newlines in the dispatched body", async () => {
|
|
559
|
-
const adapter = new
|
|
559
|
+
const adapter = new CloudPushAdapter();
|
|
560
560
|
const payload = makePayload({
|
|
561
561
|
copy: {
|
|
562
562
|
title: "Question",
|
|
@@ -573,7 +573,7 @@ describe("PlatformPushAdapter", () => {
|
|
|
573
573
|
});
|
|
574
574
|
|
|
575
575
|
test("leaves plain prose untouched", async () => {
|
|
576
|
-
const adapter = new
|
|
576
|
+
const adapter = new CloudPushAdapter();
|
|
577
577
|
const result = await adapter.send(makePayload(), makeDestination());
|
|
578
578
|
|
|
579
579
|
expect(result.success).toBe(true);
|
|
@@ -588,7 +588,7 @@ describe("PlatformPushAdapter", () => {
|
|
|
588
588
|
// costs the whole notification.
|
|
589
589
|
describe("copy that flattens to nothing", () => {
|
|
590
590
|
test("names the media instead of dispatching blank fields", async () => {
|
|
591
|
-
const adapter = new
|
|
591
|
+
const adapter = new CloudPushAdapter();
|
|
592
592
|
const embed = "";
|
|
593
593
|
const payload = makePayload({ copy: { title: embed, body: embed } });
|
|
594
594
|
|
|
@@ -600,7 +600,7 @@ describe("PlatformPushAdapter", () => {
|
|
|
600
600
|
});
|
|
601
601
|
|
|
602
602
|
test("counts several embeds", async () => {
|
|
603
|
-
const adapter = new
|
|
603
|
+
const adapter = new CloudPushAdapter();
|
|
604
604
|
const embeds =
|
|
605
605
|
" ";
|
|
606
606
|
const payload = makePayload({ copy: { title: embeds, body: embeds } });
|
|
@@ -613,7 +613,7 @@ describe("PlatformPushAdapter", () => {
|
|
|
613
613
|
// Nothing nameable is left, so the original beats a blank field: ugly
|
|
614
614
|
// copy still delivers, an empty title is a 400.
|
|
615
615
|
test("keeps the original when there is no media to name", async () => {
|
|
616
|
-
const adapter = new
|
|
616
|
+
const adapter = new CloudPushAdapter();
|
|
617
617
|
const payload = makePayload({ copy: { title: "###", body: "###" } });
|
|
618
618
|
|
|
619
619
|
await adapter.send(payload, makeDestination());
|
|
@@ -624,7 +624,7 @@ describe("PlatformPushAdapter", () => {
|
|
|
624
624
|
});
|
|
625
625
|
|
|
626
626
|
test("omits optional fields when absent from payload", async () => {
|
|
627
|
-
const adapter = new
|
|
627
|
+
const adapter = new CloudPushAdapter();
|
|
628
628
|
const payload: ChannelDeliveryPayload = {
|
|
629
629
|
sourceEventName: "schedule.notify",
|
|
630
630
|
copy: { title: "Hi", body: "Hello" },
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Validates that the CadetAdapter broadcasts notification_intent with
|
|
5
5
|
* deepLinkMetadata, and that the broadcaster correctly passes deepLinkTarget
|
|
6
6
|
* from the decision through to the adapter payload — regardless of whether
|
|
7
|
-
* the conversation was newly created or reused. Also covers the
|
|
7
|
+
* the conversation was newly created or reused. Also covers the cloud
|
|
8
8
|
* (APNs) channel, whose deepLinkTarget must be enriched with the
|
|
9
9
|
* conversationId so remote-push taps can navigate.
|
|
10
10
|
*/
|
|
@@ -691,14 +691,14 @@ describe("notification deep-link metadata", () => {
|
|
|
691
691
|
|
|
692
692
|
// ── Platform (APNs) channel deep-link enrichment ──────────────────
|
|
693
693
|
//
|
|
694
|
-
// The
|
|
694
|
+
// The cloud adapter forwards deepLinkTarget verbatim as
|
|
695
695
|
// deep_link_metadata, so the broadcaster must enrich it with the
|
|
696
696
|
// conversationId the same way it does for cadet — otherwise remote-push
|
|
697
697
|
// taps have no routing key and cannot navigate.
|
|
698
698
|
|
|
699
699
|
test("broadcaster merges pairing conversationId and messageId into deepLinkTarget for platform", async () => {
|
|
700
|
-
const
|
|
701
|
-
const broadcaster = new NotificationBroadcaster([
|
|
700
|
+
const cloudAdapter = new MockAdapter("platform");
|
|
701
|
+
const broadcaster = new NotificationBroadcaster([cloudAdapter]);
|
|
702
702
|
|
|
703
703
|
nextPairingResult = {
|
|
704
704
|
conversationId: "conv-paired-platform",
|
|
@@ -718,16 +718,16 @@ describe("notification deep-link metadata", () => {
|
|
|
718
718
|
|
|
719
719
|
await broadcaster.broadcastDecision(signal, decision);
|
|
720
720
|
|
|
721
|
-
expect(
|
|
722
|
-
const deepLink =
|
|
721
|
+
expect(cloudAdapter.sent).toHaveLength(1);
|
|
722
|
+
const deepLink = cloudAdapter.sent[0].deepLinkTarget;
|
|
723
723
|
expect(deepLink).toBeDefined();
|
|
724
724
|
expect(deepLink!.conversationId).toBe("conv-paired-platform");
|
|
725
725
|
expect(deepLink!.messageId).toBe("msg-paired-platform");
|
|
726
726
|
});
|
|
727
727
|
|
|
728
728
|
test("platform deep link falls back to signal.sourceContextId when pairing returns no conversation", async () => {
|
|
729
|
-
const
|
|
730
|
-
const broadcaster = new NotificationBroadcaster([
|
|
729
|
+
const cloudAdapter = new MockAdapter("platform");
|
|
730
|
+
const broadcaster = new NotificationBroadcaster([cloudAdapter]);
|
|
731
731
|
|
|
732
732
|
// Production platform pairing: push_only strategy pairs no conversation.
|
|
733
733
|
nextPairingResult = {
|
|
@@ -751,15 +751,15 @@ describe("notification deep-link metadata", () => {
|
|
|
751
751
|
|
|
752
752
|
await broadcaster.broadcastDecision(signal, decision);
|
|
753
753
|
|
|
754
|
-
expect(
|
|
755
|
-
const deepLink =
|
|
754
|
+
expect(cloudAdapter.sent).toHaveLength(1);
|
|
755
|
+
const deepLink = cloudAdapter.sent[0].deepLinkTarget;
|
|
756
756
|
expect(deepLink).toBeDefined();
|
|
757
757
|
expect(deepLink!.conversationId).toBe(originConvId);
|
|
758
758
|
});
|
|
759
759
|
|
|
760
760
|
test("platform deep link omits conversationId when sourceContextId is a sentinel", async () => {
|
|
761
|
-
const
|
|
762
|
-
const broadcaster = new NotificationBroadcaster([
|
|
761
|
+
const cloudAdapter = new MockAdapter("platform");
|
|
762
|
+
const broadcaster = new NotificationBroadcaster([cloudAdapter]);
|
|
763
763
|
|
|
764
764
|
nextPairingResult = {
|
|
765
765
|
conversationId: null,
|
|
@@ -779,22 +779,22 @@ describe("notification deep-link metadata", () => {
|
|
|
779
779
|
|
|
780
780
|
await broadcaster.broadcastDecision(signal, decision);
|
|
781
781
|
|
|
782
|
-
expect(
|
|
782
|
+
expect(cloudAdapter.sent).toHaveLength(1);
|
|
783
783
|
expect(
|
|
784
|
-
|
|
784
|
+
cloudAdapter.sent[0].deepLinkTarget?.conversationId,
|
|
785
785
|
).toBeUndefined();
|
|
786
786
|
});
|
|
787
787
|
|
|
788
788
|
test("cadet and platform each receive deep-link enrichment in the same broadcast", async () => {
|
|
789
789
|
const cadetAdapter = new MockAdapter("cadet");
|
|
790
|
-
const
|
|
790
|
+
const cloudAdapter = new MockAdapter("platform");
|
|
791
791
|
const broadcaster = new NotificationBroadcaster([
|
|
792
792
|
cadetAdapter,
|
|
793
|
-
|
|
793
|
+
cloudAdapter,
|
|
794
794
|
]);
|
|
795
795
|
|
|
796
796
|
// Cadet is ordered first and consumes the queued pairing result;
|
|
797
|
-
// the
|
|
797
|
+
// the cloud pairing call then receives the mock's auto-generated
|
|
798
798
|
// conversation, so each channel is enriched from its own pairing.
|
|
799
799
|
nextPairingResult = {
|
|
800
800
|
conversationId: "conv-cadet-paired",
|
|
@@ -822,26 +822,26 @@ describe("notification deep-link metadata", () => {
|
|
|
822
822
|
);
|
|
823
823
|
|
|
824
824
|
// Platform enriched independently from its own pairing call.
|
|
825
|
-
expect(
|
|
825
|
+
expect(cloudAdapter.sent).toHaveLength(1);
|
|
826
826
|
const platformConvId =
|
|
827
|
-
|
|
827
|
+
cloudAdapter.sent[0].deepLinkTarget?.conversationId;
|
|
828
828
|
expect(String(platformConvId)).toStartWith("mock-conv-");
|
|
829
829
|
});
|
|
830
830
|
|
|
831
|
-
// ── Cadet pairing carried into the
|
|
831
|
+
// ── Cadet pairing carried into the cloud deep link ─────────────
|
|
832
832
|
//
|
|
833
|
-
// In production the
|
|
833
|
+
// In production the cloud channel is push_only: its own pairing
|
|
834
834
|
// returns null. When the cadet channel creates (or reuses) a
|
|
835
|
-
// conversation in the same broadcast, the
|
|
835
|
+
// conversation in the same broadcast, the cloud deep link must
|
|
836
836
|
// carry that conversation so remote-push taps land in the thread the
|
|
837
837
|
// notification is about (approval requests, guardian questions).
|
|
838
838
|
|
|
839
839
|
test("platform deep link carries the cadet-created conversation in a mixed broadcast", async () => {
|
|
840
840
|
const cadetAdapter = new MockAdapter("cadet");
|
|
841
|
-
const
|
|
841
|
+
const cloudAdapter = new MockAdapter("platform");
|
|
842
842
|
const broadcaster = new NotificationBroadcaster([
|
|
843
843
|
cadetAdapter,
|
|
844
|
-
|
|
844
|
+
cloudAdapter,
|
|
845
845
|
]);
|
|
846
846
|
|
|
847
847
|
pairingResultsByChannel = {
|
|
@@ -886,21 +886,21 @@ describe("notification deep-link metadata", () => {
|
|
|
886
886
|
);
|
|
887
887
|
|
|
888
888
|
// Platform carries the cadet-created conversation and seed message.
|
|
889
|
-
expect(
|
|
890
|
-
expect(
|
|
889
|
+
expect(cloudAdapter.sent).toHaveLength(1);
|
|
890
|
+
expect(cloudAdapter.sent[0].deepLinkTarget?.conversationId).toBe(
|
|
891
891
|
"conv-cadet-created",
|
|
892
892
|
);
|
|
893
|
-
expect(
|
|
893
|
+
expect(cloudAdapter.sent[0].deepLinkTarget?.messageId).toBe(
|
|
894
894
|
"msg-cadet-seed",
|
|
895
895
|
);
|
|
896
896
|
});
|
|
897
897
|
|
|
898
898
|
test("platform prefers the cadet pairing over the source-context fallback in a mixed broadcast", async () => {
|
|
899
899
|
const cadetAdapter = new MockAdapter("cadet");
|
|
900
|
-
const
|
|
900
|
+
const cloudAdapter = new MockAdapter("platform");
|
|
901
901
|
const broadcaster = new NotificationBroadcaster([
|
|
902
902
|
cadetAdapter,
|
|
903
|
-
|
|
903
|
+
cloudAdapter,
|
|
904
904
|
]);
|
|
905
905
|
|
|
906
906
|
pairingResultsByChannel = {
|
|
@@ -936,18 +936,18 @@ describe("notification deep-link metadata", () => {
|
|
|
936
936
|
|
|
937
937
|
await broadcaster.broadcastDecision(signal, decision);
|
|
938
938
|
|
|
939
|
-
expect(
|
|
940
|
-
expect(
|
|
939
|
+
expect(cloudAdapter.sent).toHaveLength(1);
|
|
940
|
+
expect(cloudAdapter.sent[0].deepLinkTarget?.conversationId).toBe(
|
|
941
941
|
"conv-approval-thread",
|
|
942
942
|
);
|
|
943
943
|
});
|
|
944
944
|
|
|
945
945
|
test("platform deep link carries the conversation from a duplicate cadet delivery on retry", async () => {
|
|
946
946
|
const cadetAdapter = new MockAdapter("cadet");
|
|
947
|
-
const
|
|
947
|
+
const cloudAdapter = new MockAdapter("platform");
|
|
948
948
|
const broadcaster = new NotificationBroadcaster([
|
|
949
949
|
cadetAdapter,
|
|
950
|
-
|
|
950
|
+
cloudAdapter,
|
|
951
951
|
]);
|
|
952
952
|
|
|
953
953
|
// Persisted-decision retry: the cadet delivery row already exists
|
|
@@ -992,21 +992,21 @@ describe("notification deep-link metadata", () => {
|
|
|
992
992
|
expect(cadetResult?.conversationId).toBe("conv-from-existing-row");
|
|
993
993
|
|
|
994
994
|
// Platform still delivers, carrying the existing row's conversation.
|
|
995
|
-
expect(
|
|
996
|
-
expect(
|
|
995
|
+
expect(cloudAdapter.sent).toHaveLength(1);
|
|
996
|
+
expect(cloudAdapter.sent[0].deepLinkTarget?.conversationId).toBe(
|
|
997
997
|
"conv-from-existing-row",
|
|
998
998
|
);
|
|
999
|
-
expect(
|
|
999
|
+
expect(cloudAdapter.sent[0].deepLinkTarget?.messageId).toBe(
|
|
1000
1000
|
"msg-from-existing-row",
|
|
1001
1001
|
);
|
|
1002
1002
|
});
|
|
1003
1003
|
|
|
1004
1004
|
test("platform falls back to sourceContextId in a mixed broadcast when cadet pairs no conversation", async () => {
|
|
1005
1005
|
const cadetAdapter = new MockAdapter("cadet");
|
|
1006
|
-
const
|
|
1006
|
+
const cloudAdapter = new MockAdapter("platform");
|
|
1007
1007
|
const broadcaster = new NotificationBroadcaster([
|
|
1008
1008
|
cadetAdapter,
|
|
1009
|
-
|
|
1009
|
+
cloudAdapter,
|
|
1010
1010
|
]);
|
|
1011
1011
|
|
|
1012
1012
|
// Passive cadet signal: pairing skips conversation creation.
|
|
@@ -1041,8 +1041,8 @@ describe("notification deep-link metadata", () => {
|
|
|
1041
1041
|
|
|
1042
1042
|
await broadcaster.broadcastDecision(signal, decision);
|
|
1043
1043
|
|
|
1044
|
-
expect(
|
|
1045
|
-
expect(
|
|
1044
|
+
expect(cloudAdapter.sent).toHaveLength(1);
|
|
1045
|
+
expect(cloudAdapter.sent[0].deepLinkTarget?.conversationId).toBe(
|
|
1046
1046
|
originConvId,
|
|
1047
1047
|
);
|
|
1048
1048
|
});
|
|
@@ -47,7 +47,7 @@ mock.module("../oauth/oauth-store.js", () => ({
|
|
|
47
47
|
logoUrl: null,
|
|
48
48
|
clientIdPlaceholder: null,
|
|
49
49
|
requiresClientSecret: 1,
|
|
50
|
-
|
|
50
|
+
cloudServiceConfigKey: "google-oauth",
|
|
51
51
|
authorizeUrl: "https://accounts.google.com/o/oauth2/v2/auth",
|
|
52
52
|
tokenExchangeUrl: "https://oauth2.googleapis.com/token",
|
|
53
53
|
refreshUrl: null,
|
|
@@ -168,7 +168,7 @@ describe("GET /v1/oauth/apps", () => {
|
|
|
168
168
|
dashboard_url: string | null;
|
|
169
169
|
client_id_placeholder: string | null;
|
|
170
170
|
requires_client_secret: boolean;
|
|
171
|
-
|
|
171
|
+
supports_cloud_mode: boolean;
|
|
172
172
|
} | null;
|
|
173
173
|
apps: unknown[];
|
|
174
174
|
};
|
|
@@ -179,7 +179,7 @@ describe("GET /v1/oauth/apps", () => {
|
|
|
179
179
|
expect(result.provider!.description).toBe("Google OAuth provider");
|
|
180
180
|
expect(result.provider!.requires_client_secret).toBe(true);
|
|
181
181
|
expect(typeof result.provider!.requires_client_secret).toBe("boolean");
|
|
182
|
-
expect(result.provider!.
|
|
182
|
+
expect(result.provider!.supports_cloud_mode).toBe(true);
|
|
183
183
|
});
|
|
184
184
|
|
|
185
185
|
test("returns null provider when provider does not exist", async () => {
|
|
@@ -24,14 +24,14 @@ import { describe, expect, mock, test } from "bun:test";
|
|
|
24
24
|
|
|
25
25
|
import { Command } from "commander";
|
|
26
26
|
|
|
27
|
-
let
|
|
27
|
+
let mockCloudClientCreate: () => Promise<Record<
|
|
28
28
|
string,
|
|
29
29
|
unknown
|
|
30
30
|
> | null> = async () => null;
|
|
31
31
|
|
|
32
|
-
mock.module("../
|
|
33
|
-
|
|
34
|
-
create: () =>
|
|
32
|
+
mock.module("../cloud/client.js", () => ({
|
|
33
|
+
CadetCloudClient: {
|
|
34
|
+
create: () => mockCloudClientCreate(),
|
|
35
35
|
},
|
|
36
36
|
}));
|
|
37
37
|
|
|
@@ -44,7 +44,7 @@ const { requirePlatformConnection } =
|
|
|
44
44
|
|
|
45
45
|
describe("requirePlatformConnection", () => {
|
|
46
46
|
test("returns false and writes error when not connected", async () => {
|
|
47
|
-
|
|
47
|
+
mockCloudClientCreate = async () => null;
|
|
48
48
|
const stdoutChunks: string[] = [];
|
|
49
49
|
const originalWrite = process.stdout.write.bind(process.stdout);
|
|
50
50
|
process.stdout.write = ((chunk: unknown) => {
|
|
@@ -72,8 +72,8 @@ describe("requirePlatformConnection", () => {
|
|
|
72
72
|
});
|
|
73
73
|
|
|
74
74
|
test("returns true when client can be created (even without assistant ID)", async () => {
|
|
75
|
-
|
|
76
|
-
|
|
75
|
+
mockCloudClientCreate = async () => ({
|
|
76
|
+
cloudAssistantId: "",
|
|
77
77
|
fetch: async () => new Response(),
|
|
78
78
|
});
|
|
79
79
|
process.exitCode = 0;
|
|
@@ -87,8 +87,8 @@ describe("requirePlatformConnection", () => {
|
|
|
87
87
|
});
|
|
88
88
|
|
|
89
89
|
test("returns true when client can be created with assistant ID", async () => {
|
|
90
|
-
|
|
91
|
-
|
|
90
|
+
mockCloudClientCreate = async () => ({
|
|
91
|
+
cloudAssistantId: "asst-456",
|
|
92
92
|
fetch: async () => new Response(),
|
|
93
93
|
});
|
|
94
94
|
process.exitCode = 0;
|