@mycadet/assistant 0.12.7 → 0.12.8
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 +1 -1
- 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/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 +1 -1
- 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 +1 -1
- 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 +6815 -794
- 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} +60 -60
- 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-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 +27 -41
- 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 +9 -8
- 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 +2 -2
- package/src/__tests__/mcp-client-auth.test.ts +2 -2
- package/src/__tests__/mcp-tool-annotations-risk.test.ts +2 -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-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 +12 -12
- package/src/__tests__/skills-files-catalog-fallback.test.ts +9 -9
- 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-platform-login.ts → show-cloud-login.ts} +3 -5
- 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__/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/config.ts +1 -1
- 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__/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 +23 -21
- 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 +1 -12
- package/src/config/schemas/llm.ts +45 -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/sync-gated-profiles.ts +8 -8
- 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 +6 -18
- package/src/credential-health/credential-health-service.ts +61 -76
- 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 +21 -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/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 +26 -25
- 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} +83 -116
- package/src/runtime/routes/conversation-compaction-routes.ts +1 -1
- package/src/runtime/routes/conversation-query-routes.ts +82 -282
- 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 +29 -55
- 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 +6 -15
- 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/oom-priority.ts +1 -1
- package/src/util/platform.ts +5 -5
- 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 +4 -4
- 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/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
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The one place that answers "does this assistant have a
|
|
2
|
+
* The one place that answers "does this assistant have a cloud inbox?".
|
|
3
3
|
*
|
|
4
4
|
* Managed email registration lives on Cadet Cloud: the
|
|
5
5
|
* `/v1/assistants/:id/email-addresses/` API is the only writer and the only
|
|
6
6
|
* source of truth. Nothing about a registration lands in workspace config, so
|
|
7
|
-
* any reader that wants the inbox address has to ask the
|
|
7
|
+
* any reader that wants the inbox address has to ask the cloud. Every
|
|
8
8
|
* consumer of the listing (the email readiness probe, the email invite
|
|
9
9
|
* adapter, the channel-availability route, the email management routes, and
|
|
10
10
|
* verification email delivery) reads through this module so they cannot
|
|
@@ -18,19 +18,19 @@
|
|
|
18
18
|
|
|
19
19
|
import { z } from "zod";
|
|
20
20
|
|
|
21
|
-
import {
|
|
21
|
+
import { CadetCloudClient } from "../cloud/client.js";
|
|
22
22
|
|
|
23
23
|
export type RegisteredInboxState =
|
|
24
|
-
/** The
|
|
24
|
+
/** The cloud holds a registered inbox address for this assistant. */
|
|
25
25
|
| { status: "registered"; address: string }
|
|
26
|
-
/** The
|
|
26
|
+
/** The cloud answered: no inbox is registered. */
|
|
27
27
|
| { status: "none" }
|
|
28
28
|
/** No cloud credentials, so no managed inbox can exist. */
|
|
29
29
|
| { status: "no_platform" }
|
|
30
|
-
/** The
|
|
30
|
+
/** The cloud could not be asked; nothing is known either way. */
|
|
31
31
|
| { status: "unavailable"; detail: string };
|
|
32
32
|
|
|
33
|
-
/** One row of the
|
|
33
|
+
/** One row of the cloud's email-address listing. */
|
|
34
34
|
export interface RegisteredEmailAddress {
|
|
35
35
|
id: string;
|
|
36
36
|
address: string;
|
|
@@ -38,25 +38,25 @@ export interface RegisteredEmailAddress {
|
|
|
38
38
|
|
|
39
39
|
export type EmailAddressListResult =
|
|
40
40
|
| { ok: true; addresses: RegisteredEmailAddress[] }
|
|
41
|
-
/** The
|
|
41
|
+
/** The cloud could not be asked or answered unusably. */
|
|
42
42
|
| { ok: false; status?: number; detail: string };
|
|
43
43
|
|
|
44
44
|
/**
|
|
45
45
|
* Validated rather than cast: the response crosses a runtime boundary, and a
|
|
46
46
|
* shape drift should read as a failed listing (nothing established), not as a
|
|
47
|
-
* confidently wrong answer. Unknown keys are ignored, since the
|
|
47
|
+
* confidently wrong answer. Unknown keys are ignored, since the cloud adds
|
|
48
48
|
* fields over time.
|
|
49
49
|
*/
|
|
50
50
|
const EmailAddressListSchema = z.object({
|
|
51
51
|
count: z.number().optional(),
|
|
52
|
-
// Required: the
|
|
52
|
+
// Required: the cloud's paginated listing always carries `results`, so
|
|
53
53
|
// a 200 without it is shape drift and must read as a failed listing, never
|
|
54
54
|
// as "no inbox".
|
|
55
55
|
results: z.array(z.object({ id: z.string(), address: z.string() })),
|
|
56
56
|
});
|
|
57
57
|
|
|
58
58
|
/**
|
|
59
|
-
* Fetch the
|
|
59
|
+
* Fetch the cloud's email-address listing for the caller's own client.
|
|
60
60
|
*
|
|
61
61
|
* The seam every consumer of the listing shares: the readiness resolver
|
|
62
62
|
* below, the email register/unregister/status/send routes, and verification
|
|
@@ -65,12 +65,12 @@ const EmailAddressListSchema = z.object({
|
|
|
65
65
|
* missing cloud connection) keeps its own error semantics.
|
|
66
66
|
*/
|
|
67
67
|
export async function listEmailAddresses(
|
|
68
|
-
client:
|
|
68
|
+
client: CadetCloudClient,
|
|
69
69
|
): Promise<EmailAddressListResult> {
|
|
70
70
|
let response: Response;
|
|
71
71
|
try {
|
|
72
72
|
response = await client.fetch(
|
|
73
|
-
`/v1/assistants/${client.
|
|
73
|
+
`/v1/assistants/${client.cloudAssistantId}/email-addresses/`,
|
|
74
74
|
);
|
|
75
75
|
} catch (err) {
|
|
76
76
|
const detail = err instanceof Error ? err.message : String(err);
|
|
@@ -108,7 +108,7 @@ export async function listEmailAddresses(
|
|
|
108
108
|
/**
|
|
109
109
|
* Matches the readiness service's remote-check TTL: the cache exists so the
|
|
110
110
|
* invite-adapter enrichment on the readiness poll (every 15s per client) does
|
|
111
|
-
* not turn into a
|
|
111
|
+
* not turn into a cloud request per poll, and registration changes made
|
|
112
112
|
* through the daemon invalidate it explicitly.
|
|
113
113
|
*/
|
|
114
114
|
const CACHE_TTL_MS = 5 * 60 * 1000;
|
|
@@ -121,9 +121,9 @@ export function invalidateRegisteredInboxCache(): void {
|
|
|
121
121
|
}
|
|
122
122
|
|
|
123
123
|
/**
|
|
124
|
-
* Resolve the
|
|
124
|
+
* Resolve the cloud inbox state, serving a cached answer within
|
|
125
125
|
* {@link CACHE_TTL_MS} unless `fresh` demands a live read. `unavailable` is
|
|
126
|
-
* never cached: a
|
|
126
|
+
* never cached: a cloud blip should heal on the next call, not pin the
|
|
127
127
|
* unknown state for the TTL.
|
|
128
128
|
*/
|
|
129
129
|
export async function resolveRegisteredInbox(
|
|
@@ -142,17 +142,17 @@ export async function resolveRegisteredInbox(
|
|
|
142
142
|
}
|
|
143
143
|
|
|
144
144
|
async function fetchRegisteredInbox(): Promise<RegisteredInboxState> {
|
|
145
|
-
// Creation resolves the
|
|
145
|
+
// Creation resolves the cloud-proxy context and the credential store,
|
|
146
146
|
// either of which can reject; a backend blip there is "could not ask",
|
|
147
147
|
// not an error the caller should surface as a failed request.
|
|
148
|
-
let client:
|
|
148
|
+
let client: CadetCloudClient | null;
|
|
149
149
|
try {
|
|
150
|
-
client = await
|
|
150
|
+
client = await CadetCloudClient.create();
|
|
151
151
|
} catch (err) {
|
|
152
152
|
const detail = err instanceof Error ? err.message : String(err);
|
|
153
153
|
return { status: "unavailable", detail };
|
|
154
154
|
}
|
|
155
|
-
if (!client?.
|
|
155
|
+
if (!client?.cloudAssistantId) {
|
|
156
156
|
return { status: "no_platform" };
|
|
157
157
|
}
|
|
158
158
|
|
|
@@ -236,7 +236,7 @@ export class HeartbeatService {
|
|
|
236
236
|
return countCompletedRunsToday() >= config.maxDailyRuns;
|
|
237
237
|
}
|
|
238
238
|
|
|
239
|
-
async
|
|
239
|
+
async runCloudWakeIfDue(
|
|
240
240
|
options: ManagedWakeHeartbeatRunOptions = {},
|
|
241
241
|
): Promise<ManagedWakeHeartbeatRunResult> {
|
|
242
242
|
const now = options.now ?? Date.now();
|
package/src/hooks/hook-loader.ts
CHANGED
|
@@ -343,14 +343,14 @@ export async function runInitHook(
|
|
|
343
343
|
const SHUTDOWN_TIMEOUT_MS = 5_000;
|
|
344
344
|
|
|
345
345
|
/**
|
|
346
|
-
* Run one owner's `shutdown` — the targeted single-owner teardown for a
|
|
346
|
+
* Run one owner's `shutdown` — the targeted single-owner teardown for a cloud
|
|
347
347
|
* uninstall, disable, or reload (the whole-chain `runHook(HOOKS.SHUTDOWN)` at
|
|
348
348
|
* process exit runs *every* owner's; this runs exactly one). Resolves it through
|
|
349
349
|
* the same {@link resolveHook} the dispatch path uses — cache or disk, so it
|
|
350
350
|
* needs nothing pre-warmed and works in any process (a `shutdown` hook must not
|
|
351
351
|
* assume it shares a process with its `init`; see {@link ShutdownContext}) —
|
|
352
352
|
* then invokes it under the shared {@link withTimeout} so a hook that hangs
|
|
353
|
-
* can't block teardown (e.g. the `rmSync` a
|
|
353
|
+
* can't block teardown (e.g. the `rmSync` a cloud uninstall runs next). No-op
|
|
354
354
|
* when the owner defines no `shutdown`. Best-effort: a thrown, timed-out, or
|
|
355
355
|
* malformed shutdown is logged and swallowed.
|
|
356
356
|
*/
|
|
@@ -15,7 +15,7 @@ const resolveCallbackUrl = mock(
|
|
|
15
15
|
async () => "https://ingress.example/webhooks/oauth/callback",
|
|
16
16
|
);
|
|
17
17
|
|
|
18
|
-
mock.module("../
|
|
18
|
+
mock.module("../cloud-callback-registration.js", () => ({
|
|
19
19
|
resolveCallbackUrl,
|
|
20
20
|
}));
|
|
21
21
|
|
|
@@ -86,7 +86,7 @@ describe("resolveOauthCallbackUrl", () => {
|
|
|
86
86
|
expect(typeA).toEqual(typeB);
|
|
87
87
|
});
|
|
88
88
|
|
|
89
|
-
test("registers one route type so the
|
|
89
|
+
test("registers one route type so the cloud holds a single admin row", async () => {
|
|
90
90
|
await resolveOauthCallbackUrl();
|
|
91
91
|
const [, , type] = resolveCallbackUrl.mock.calls[0] as unknown[];
|
|
92
92
|
expect(type).toEqual("oauth");
|
|
@@ -21,8 +21,8 @@ import { probeTunnel } from "../tunnel-probe.js";
|
|
|
21
21
|
|
|
22
22
|
const BASE = "https://edge.example";
|
|
23
23
|
|
|
24
|
-
/** The
|
|
25
|
-
const
|
|
24
|
+
/** The remote value the nginx pairing edge stamps into every config it serves. */
|
|
25
|
+
const PAIRING_EDGE_REMOTE = "docker";
|
|
26
26
|
|
|
27
27
|
type Route = { status?: number; body?: string; reject?: unknown };
|
|
28
28
|
|
|
@@ -68,7 +68,7 @@ function stubFetch(routes: { healthz?: Route; config?: Route }): {
|
|
|
68
68
|
const route = isHealth
|
|
69
69
|
? (routes.healthz ?? { body: "ok" })
|
|
70
70
|
: (routes.config ?? {
|
|
71
|
-
body: JSON.stringify({
|
|
71
|
+
body: JSON.stringify({ remote: PAIRING_EDGE_REMOTE }),
|
|
72
72
|
});
|
|
73
73
|
if (route.reject !== undefined) {
|
|
74
74
|
throw route.reject;
|
|
@@ -85,7 +85,7 @@ function stubFetch(routes: { healthz?: Route; config?: Route }): {
|
|
|
85
85
|
function configBody(config: Record<string, unknown>): Route {
|
|
86
86
|
return {
|
|
87
87
|
status: 200,
|
|
88
|
-
body: JSON.stringify({
|
|
88
|
+
body: JSON.stringify({ remote: PAIRING_EDGE_REMOTE, ...config }),
|
|
89
89
|
};
|
|
90
90
|
}
|
|
91
91
|
|
|
@@ -226,10 +226,10 @@ describe("probeTunnel", () => {
|
|
|
226
226
|
config: {
|
|
227
227
|
status: 200,
|
|
228
228
|
body: JSON.stringify({
|
|
229
|
-
|
|
229
|
+
remote: PAIRING_EDGE_REMOTE,
|
|
230
230
|
apiBaseUrl: "/v1",
|
|
231
|
-
|
|
232
|
-
|
|
231
|
+
cloudDisabled: true,
|
|
232
|
+
disableCloud: true,
|
|
233
233
|
assistantName: "Ada",
|
|
234
234
|
assistantId: "asst_1",
|
|
235
235
|
hubUrl: "https://mycadet.ai",
|
|
@@ -437,7 +437,7 @@ describe("probeTunnel", () => {
|
|
|
437
437
|
},
|
|
438
438
|
},
|
|
439
439
|
json: async (): Promise<unknown> => ({
|
|
440
|
-
|
|
440
|
+
remote: PAIRING_EDGE_REMOTE,
|
|
441
441
|
assistantId: "asst_1",
|
|
442
442
|
}),
|
|
443
443
|
} as unknown as Response),
|
|
@@ -1,33 +1,30 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Platform callback route registration.
|
|
3
3
|
*
|
|
4
|
-
* Both
|
|
5
|
-
* register callback routes with the
|
|
4
|
+
* Both cloud-managed (IS_CLOUD=true) and self-hosted assistants can
|
|
5
|
+
* register callback routes with the cloud so inbound provider webhooks
|
|
6
6
|
* (Telegram, Twilio, email, OAuth) are forwarded correctly.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
8
|
+
* Cloud assistants pick up context from environment variables.
|
|
9
9
|
* Self-hosted assistants use stored credentials (from `assistant cloud
|
|
10
10
|
* connect` or the ensure-registration bootstrap).
|
|
11
11
|
*
|
|
12
|
-
* The
|
|
13
|
-
* POST {
|
|
12
|
+
* The cloud endpoint is:
|
|
13
|
+
* POST {CADET_CLOUD_URL}/v1/internal/gateway/callback-routes/register/
|
|
14
14
|
*
|
|
15
15
|
* It accepts { assistant_id, callback_path, type } and returns a stable
|
|
16
16
|
* callback_url that external services should use. Self-hosted assistants
|
|
17
17
|
* also send callback_base_url (configured or detected public ingress) so
|
|
18
|
-
* the
|
|
18
|
+
* the cloud can register a route that points at this instance.
|
|
19
19
|
*/
|
|
20
20
|
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
21
|
+
import { resolveCloudAssistantId } from "../config/cloud-identity.js";
|
|
22
|
+
import { getCloudBaseUrl } from "../config/env.js";
|
|
23
|
+
import { getIsCloud } from "../config/env-registry.js";
|
|
23
24
|
import { getConfig } from "../config/loader.js";
|
|
24
|
-
import { resolvePlatformAssistantId } from "../config/platform-identity.js";
|
|
25
25
|
import { ipcRegisterWebhookRoute } from "../ipc/gateway-client.js";
|
|
26
26
|
import { credentialKey } from "../security/credential-key.js";
|
|
27
|
-
import {
|
|
28
|
-
getSecureKeyAsync,
|
|
29
|
-
getSecureKeyResultAsync,
|
|
30
|
-
} from "../security/secure-keys.js";
|
|
27
|
+
import { getSecureKeyResultAsync } from "../security/secure-keys.js";
|
|
31
28
|
import { getLogger } from "../util/logger.js";
|
|
32
29
|
import { resolveClaimedPodWebhookUrl } from "./pod-webhook-claim.js";
|
|
33
30
|
import {
|
|
@@ -36,14 +33,14 @@ import {
|
|
|
36
33
|
} from "./public-ingress-urls.js";
|
|
37
34
|
import { isTunnelWebhooksEnabled } from "./tunnel-webhooks-gate.js";
|
|
38
35
|
|
|
39
|
-
const log = getLogger("
|
|
36
|
+
const log = getLogger("cloud-callback-registration");
|
|
40
37
|
|
|
41
|
-
export interface
|
|
38
|
+
export interface CloudCallbackRegistrationContext {
|
|
42
39
|
isPlatform: boolean;
|
|
43
|
-
|
|
40
|
+
cloudBaseUrl: string;
|
|
44
41
|
assistantId: string;
|
|
45
42
|
/**
|
|
46
|
-
* Whether a
|
|
43
|
+
* Whether a cloud assistant API key is available: `null` when the
|
|
47
44
|
* credential store could not be read, so its absence is not evidence that
|
|
48
45
|
* no key is stored. A client deciding whether to provision one must not
|
|
49
46
|
* read `null` as "missing".
|
|
@@ -53,20 +50,14 @@ export interface PlatformCallbackRegistrationContext {
|
|
|
53
50
|
enabled: boolean;
|
|
54
51
|
}
|
|
55
52
|
|
|
56
|
-
export async function
|
|
57
|
-
const platform =
|
|
58
|
-
const [
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
resolvePlatformAssistantId(),
|
|
63
|
-
]);
|
|
53
|
+
export async function resolveCloudCallbackRegistrationContext(): Promise<CloudCallbackRegistrationContext> {
|
|
54
|
+
const platform = getIsCloud();
|
|
55
|
+
const [storedAssistantApiKey, assistantId] = await Promise.all([
|
|
56
|
+
getSecureKeyResultAsync(credentialKey("cadet", "assistant_api_key")),
|
|
57
|
+
resolveCloudAssistantId(),
|
|
58
|
+
]);
|
|
64
59
|
|
|
65
|
-
const
|
|
66
|
-
const platformBaseUrl = (storedBaseUrl || getPlatformBaseUrl()).replace(
|
|
67
|
-
/\/+$/,
|
|
68
|
-
"",
|
|
69
|
-
);
|
|
60
|
+
const cloudBaseUrl = getCloudBaseUrl().replace(/\/+$/, "");
|
|
70
61
|
const envAssistantCredential = process.env.ASSISTANT_API_KEY?.trim();
|
|
71
62
|
const assistantCredential =
|
|
72
63
|
storedAssistantApiKey.value?.trim() || envAssistantCredential || undefined;
|
|
@@ -80,17 +71,15 @@ export async function resolvePlatformCallbackRegistrationContext(): Promise<Plat
|
|
|
80
71
|
|
|
81
72
|
return {
|
|
82
73
|
isPlatform: platform,
|
|
83
|
-
|
|
74
|
+
cloudBaseUrl,
|
|
84
75
|
assistantId,
|
|
85
76
|
hasAssistantApiKey,
|
|
86
77
|
authHeader,
|
|
87
78
|
// Enabled when we have enough context to register callback routes.
|
|
88
|
-
// Does NOT require
|
|
79
|
+
// Does NOT require IS_CLOUD — self-hosted assistants with stored
|
|
89
80
|
// credentials can also register routes.
|
|
90
81
|
enabled:
|
|
91
|
-
|
|
92
|
-
assistantId.length > 0 &&
|
|
93
|
-
authHeader !== null,
|
|
82
|
+
cloudBaseUrl.length > 0 && assistantId.length > 0 && authHeader !== null,
|
|
94
83
|
};
|
|
95
84
|
}
|
|
96
85
|
|
|
@@ -102,34 +91,34 @@ interface RegisterCallbackRouteResponse {
|
|
|
102
91
|
}
|
|
103
92
|
|
|
104
93
|
/**
|
|
105
|
-
* Register a callback route with the
|
|
94
|
+
* Register a callback route with the cloud's internal gateway endpoint.
|
|
106
95
|
*
|
|
107
96
|
* @param callbackPath - The path portion after the ingress base URL
|
|
108
97
|
* (e.g. "webhooks/twilio/voice"). Leading/trailing slashes are stripped
|
|
109
|
-
* by the
|
|
98
|
+
* by the cloud.
|
|
110
99
|
* @param type - The route type identifier (e.g. "twilio_voice",
|
|
111
100
|
* "twilio_status", "oauth", "telegram").
|
|
112
101
|
* @param sourceIdentifier - Optional human-readable source identifier
|
|
113
102
|
* (e.g. bot handle, phone number) for display in admin UI.
|
|
114
|
-
* @returns The
|
|
115
|
-
* @throws If the
|
|
103
|
+
* @returns The cloud-provided callback URL that external services should use.
|
|
104
|
+
* @throws If the cloud request fails.
|
|
116
105
|
*/
|
|
117
106
|
export async function registerCallbackRoute(
|
|
118
107
|
callbackPath: string,
|
|
119
108
|
type: string,
|
|
120
109
|
sourceIdentifier?: string,
|
|
121
110
|
): Promise<string> {
|
|
122
|
-
const context = await
|
|
111
|
+
const context = await resolveCloudCallbackRegistrationContext();
|
|
123
112
|
if (!context.enabled || !context.authHeader) {
|
|
124
113
|
throw new Error(
|
|
125
114
|
"Platform callbacks not available — missing platform registration context",
|
|
126
115
|
);
|
|
127
116
|
}
|
|
128
117
|
|
|
129
|
-
const
|
|
118
|
+
const cloudBaseUrl = context.cloudBaseUrl;
|
|
130
119
|
const assistantId = context.assistantId;
|
|
131
120
|
|
|
132
|
-
const url = `${
|
|
121
|
+
const url = `${cloudBaseUrl}/v1/internal/gateway/callback-routes/register/`;
|
|
133
122
|
|
|
134
123
|
const headers: Record<string, string> = {
|
|
135
124
|
"Content-Type": "application/json",
|
|
@@ -178,11 +167,11 @@ export async function registerCallbackRoute(
|
|
|
178
167
|
|
|
179
168
|
/**
|
|
180
169
|
* Self-hosted assistants must send the public ingress URL when registering
|
|
181
|
-
* with the
|
|
182
|
-
* bases and always uses the
|
|
170
|
+
* with the cloud. Cloud pods omit it: Django ignores client-provided
|
|
171
|
+
* bases and always uses the cloud callback URL.
|
|
183
172
|
*/
|
|
184
173
|
function resolveSelfHostedCallbackBaseUrl(): string | undefined {
|
|
185
|
-
if (
|
|
174
|
+
if (getIsCloud()) {
|
|
186
175
|
return undefined;
|
|
187
176
|
}
|
|
188
177
|
try {
|
|
@@ -217,14 +206,14 @@ export async function registerLocalWebhookRoute(
|
|
|
217
206
|
if (!result.ok) {
|
|
218
207
|
log.warn(
|
|
219
208
|
{ path, type, reason: result.reason },
|
|
220
|
-
"Gateway webhook route registration failed, falling back to the
|
|
209
|
+
"Gateway webhook route registration failed, falling back to the cloud",
|
|
221
210
|
);
|
|
222
211
|
return false;
|
|
223
212
|
}
|
|
224
213
|
if (result.disabled) {
|
|
225
214
|
log.info(
|
|
226
215
|
{ path, type },
|
|
227
|
-
"Gateway is not serving its own webhooks, falling back to the
|
|
216
|
+
"Gateway is not serving its own webhooks, falling back to the cloud",
|
|
228
217
|
);
|
|
229
218
|
return false;
|
|
230
219
|
}
|
|
@@ -234,14 +223,14 @@ export async function registerLocalWebhookRoute(
|
|
|
234
223
|
}
|
|
235
224
|
|
|
236
225
|
/**
|
|
237
|
-
* Resolve a callback URL, registering with the
|
|
226
|
+
* Resolve a callback URL, registering with the cloud when appropriate.
|
|
238
227
|
*
|
|
239
228
|
* Resolution order, matching `handleWebhooksRegister` in
|
|
240
229
|
* `runtime/routes/webhook-routes.ts` and `hasWebhookRoutingConfigured` in
|
|
241
230
|
* `config/webhook-routing.ts`:
|
|
242
231
|
*
|
|
243
|
-
* 1. **
|
|
244
|
-
* always register with the
|
|
232
|
+
* 1. **Cloud pods** (`IS_CLOUD`) with the `tunnel-webhooks` flag off
|
|
233
|
+
* always register with the cloud gateway. With the flag on, they try
|
|
245
234
|
* the direct supplier first — the gateway's Tunnel client publishes the
|
|
246
235
|
* tunnel URL into `ingress.publicBaseUrl` — and fall back to platform
|
|
247
236
|
* registration on any failure, including an explicit
|
|
@@ -254,21 +243,21 @@ export async function registerLocalWebhookRoute(
|
|
|
254
243
|
* 3. **Platform-connected assistants with no ingress** register with the
|
|
255
244
|
* platform gateway rather than surfacing the direct builder's error.
|
|
256
245
|
* Connectivity is decided by credentials (platform base URL + assistant
|
|
257
|
-
* ID + assistant API key), not by `
|
|
258
|
-
* on a
|
|
246
|
+
* ID + assistant API key), not by `IS_CLOUD`, which is only ever true
|
|
247
|
+
* on a cloud pod.
|
|
259
248
|
*
|
|
260
249
|
* Off a pod, an explicit `ingress.enabled: false` is a decision not to accept
|
|
261
250
|
* inbound webhooks at all, so `PublicIngressDisabledError` propagates instead
|
|
262
|
-
* of being routed around. Ingress precedes the
|
|
251
|
+
* of being routed around. Ingress precedes the cloud fallback because any
|
|
263
252
|
* logged-in local assistant holds cloud credentials for the LLM proxy:
|
|
264
253
|
* treating credential presence as "managed" would silently reroute an
|
|
265
|
-
* explicitly configured self-hosted callback through the
|
|
254
|
+
* explicitly configured self-hosted callback through the cloud.
|
|
266
255
|
*
|
|
267
256
|
* The `directUrl` parameter is a **lazy supplier** (a function returning a
|
|
268
257
|
* string) rather than an eagerly-evaluated string. This is critical because
|
|
269
258
|
* the direct URL builders (e.g. `getTwilioVoiceWebhookUrl`) call
|
|
270
259
|
* `getPublicBaseUrl()` which throws when no public ingress URL is configured.
|
|
271
|
-
* On a
|
|
260
|
+
* On a cloud pod the direct URL is never needed, and deferring evaluation
|
|
272
261
|
* avoids the throw.
|
|
273
262
|
*
|
|
274
263
|
* @param directUrl - Lazy supplier for the direct callback URL.
|
|
@@ -285,7 +274,7 @@ export async function resolveCallbackUrl(
|
|
|
285
274
|
queryParams?: Record<string, string>,
|
|
286
275
|
sourceIdentifier?: string,
|
|
287
276
|
): Promise<string> {
|
|
288
|
-
if (
|
|
277
|
+
if (getIsCloud()) {
|
|
289
278
|
if (isTunnelWebhooksEnabled()) {
|
|
290
279
|
const claimed = await resolveClaimedPodWebhookUrl(directUrl, () =>
|
|
291
280
|
registerLocalWebhookRoute(callbackPath, type, sourceIdentifier),
|
|
@@ -310,10 +299,10 @@ export async function resolveCallbackUrl(
|
|
|
310
299
|
return ingressUrl;
|
|
311
300
|
}
|
|
312
301
|
|
|
313
|
-
// No ingress configured. Fall back to the
|
|
314
|
-
// assistant is connected to the
|
|
302
|
+
// No ingress configured. Fall back to the cloud gateway when this
|
|
303
|
+
// assistant is connected to the cloud. Cloud pods always are, so
|
|
315
304
|
// they skip the context probe and register directly.
|
|
316
|
-
const context = await
|
|
305
|
+
const context = await resolveCloudCallbackRegistrationContext();
|
|
317
306
|
if (!context.enabled) {
|
|
318
307
|
throw ingressError;
|
|
319
308
|
}
|
|
@@ -330,7 +319,7 @@ export async function resolveCallbackUrl(
|
|
|
330
319
|
} catch (err) {
|
|
331
320
|
// Registration is only attempted once the local ingress has been ruled
|
|
332
321
|
// out, so there is nothing left to fall back to. Surface a clear error so
|
|
333
|
-
// callers (and the user) understand this is a
|
|
322
|
+
// callers (and the user) understand this is a cloud-side issue, not a
|
|
334
323
|
// tunnel problem.
|
|
335
324
|
const detail = err instanceof Error ? err.message : String(err);
|
|
336
325
|
throw new Error(
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* caller needs a listener of its own.
|
|
10
10
|
*
|
|
11
11
|
* Which base URL is correct depends on how the assistant is reachable: a
|
|
12
|
-
* platform pod and a
|
|
12
|
+
* platform pod and a cloud-connected assistant are served through a
|
|
13
13
|
* managed callback route, a self-hosted deployment through its configured
|
|
14
14
|
* public ingress. `resolveCallbackUrl` owns that decision, and this is the
|
|
15
15
|
* OAuth-shaped entry point to it, mirroring `plugin-api/webhook-url.ts`
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
19
|
import { loadConfig } from "../config/loader.js";
|
|
20
|
-
import { resolveCallbackUrl } from "./
|
|
20
|
+
import { resolveCallbackUrl } from "./cloud-callback-registration.js";
|
|
21
21
|
import {
|
|
22
22
|
getMcpOAuthClientMetadataUrl,
|
|
23
23
|
getOAuthCallbackUrl,
|
|
@@ -33,9 +33,9 @@ import {
|
|
|
33
33
|
export const OAUTH_CALLBACK_PATH = "webhooks/oauth/callback";
|
|
34
34
|
|
|
35
35
|
/**
|
|
36
|
-
* Registration type recorded with the
|
|
36
|
+
* Registration type recorded with the cloud.
|
|
37
37
|
*
|
|
38
|
-
* The
|
|
38
|
+
* The cloud keys a callback route by `(path, type)`, and there is one
|
|
39
39
|
* OAuth route, so one type describes it. Registering the same path under
|
|
40
40
|
* several types would produce duplicate admin rows pointing at the same
|
|
41
41
|
* URL.
|
|
@@ -51,7 +51,7 @@ const OAUTH_REGISTRATION_TYPE = "oauth";
|
|
|
51
51
|
* across attempts, which is what an exact-match `redirect_uri` check needs.
|
|
52
52
|
*
|
|
53
53
|
* @throws when no public ingress is configured and the assistant is not
|
|
54
|
-
* connected to the
|
|
54
|
+
* connected to the cloud. There is no URL that would work in that
|
|
55
55
|
* case, and returning a plausible one produces an authorization request
|
|
56
56
|
* whose callback silently never arrives.
|
|
57
57
|
*/
|
|
@@ -69,7 +69,7 @@ export async function resolveOauthCallbackUrl(): Promise<string> {
|
|
|
69
69
|
*
|
|
70
70
|
* A URL-based client id must be HTTPS, and its document must publish the exact
|
|
71
71
|
* redirect URI used by the authorization request. The gateway document is
|
|
72
|
-
* derived from public ingress, so a
|
|
72
|
+
* derived from public ingress, so a cloud-relayed callback cannot use it.
|
|
73
73
|
* Returning undefined preserves Dynamic Client Registration as the SDK's
|
|
74
74
|
* fallback in either case.
|
|
75
75
|
*/
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The
|
|
2
|
+
* The cloud-pod tier of webhook URL resolution, shared by the two seams that
|
|
3
3
|
* resolve callback URLs: `resolveCallbackUrl` and the `webhooks_register` route
|
|
4
4
|
* handler.
|
|
5
5
|
*
|
|
6
6
|
* A pod's Tunnel only forwards subpaths the gateway has claimed, so the
|
|
7
7
|
* published ingress URL is handed out only once the claim succeeds. Anything
|
|
8
|
-
* else leaves the caller to register with the
|
|
8
|
+
* else leaves the caller to register with the cloud instead.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
/**
|
|
@@ -51,11 +51,11 @@ export interface IngressConfig {
|
|
|
51
51
|
* True when the user has explicitly switched public ingress off.
|
|
52
52
|
*
|
|
53
53
|
* An explicit opt-out is a decision not to accept inbound webhooks at all, so
|
|
54
|
-
* it must not be silently routed around via
|
|
55
|
-
* ingress config is merely "not set up yet" and is eligible for the
|
|
54
|
+
* it must not be silently routed around via cloud callbacks. An *absent*
|
|
55
|
+
* ingress config is merely "not set up yet" and is eligible for the cloud
|
|
56
56
|
* fallback, so only a literal `false` counts here.
|
|
57
57
|
*
|
|
58
|
-
* Every consumer that offers a
|
|
58
|
+
* Every consumer that offers a cloud-callback fallback has to consult this
|
|
59
59
|
* before falling back, which is why it lives here rather than in each caller.
|
|
60
60
|
*/
|
|
61
61
|
export function isPublicIngressDisabled(config: IngressConfig): boolean {
|
|
@@ -39,6 +39,7 @@ import {
|
|
|
39
39
|
normalizeHttpPublicBaseUrlWithoutTrailingSlash,
|
|
40
40
|
trimmedNonEmptyString,
|
|
41
41
|
} from "@mycadet/service-contracts/ingress";
|
|
42
|
+
import { z } from "zod";
|
|
42
43
|
|
|
43
44
|
import { isPlainObject } from "../util/object.js";
|
|
44
45
|
import { truncate } from "../util/truncate.js";
|
|
@@ -81,11 +82,17 @@ const UNREADABLE_CONFIG_DETAIL = "no assistant config served";
|
|
|
81
82
|
const UNMARKED_CONFIG_DETAIL = "not a pairing edge config";
|
|
82
83
|
|
|
83
84
|
/**
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
85
|
+
* The config a self-hosted edge serves (`remoteWebIngressConfig` in
|
|
86
|
+
* `cli/src/lib/nginx-ingress.ts`). The `remote` field is always stamped by
|
|
87
|
+
* that injector and never carries `"cloud"` — that spelling is the cloud's
|
|
88
|
+
* own serving, which is not an edge — so the field is the marker separating
|
|
89
|
+
* the edge from any other JSON a live URL serves.
|
|
87
90
|
*/
|
|
88
|
-
const
|
|
91
|
+
const ServedConfigSchema = z.object({
|
|
92
|
+
remote: z.string(),
|
|
93
|
+
assistantId: z.string().optional(),
|
|
94
|
+
assistantName: z.string().optional(),
|
|
95
|
+
});
|
|
89
96
|
|
|
90
97
|
export async function probeTunnel(args: {
|
|
91
98
|
publicBaseUrl: string;
|
|
@@ -241,18 +248,17 @@ async function readServedConfig(
|
|
|
241
248
|
let detail = UNREADABLE_CONFIG_DETAIL;
|
|
242
249
|
try {
|
|
243
250
|
const body: unknown = await response.json();
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
}
|
|
254
|
-
detail = UNMARKED_CONFIG_DETAIL;
|
|
251
|
+
const parsed = ServedConfigSchema.safeParse(body);
|
|
252
|
+
if (parsed.success && parsed.data.remote !== "cloud") {
|
|
253
|
+
return {
|
|
254
|
+
kind: "served",
|
|
255
|
+
config: {
|
|
256
|
+
assistantId: trimmedNonEmptyString(parsed.data.assistantId),
|
|
257
|
+
assistantName: trimmedNonEmptyString(parsed.data.assistantName),
|
|
258
|
+
},
|
|
259
|
+
};
|
|
255
260
|
}
|
|
261
|
+
detail = UNMARKED_CONFIG_DETAIL;
|
|
256
262
|
} catch {
|
|
257
263
|
/* an unparseable body is an edge answering with something else */
|
|
258
264
|
}
|
|
@@ -3,14 +3,14 @@ import { isAssistantFeatureFlagEnabled } from "../config/assistant-feature-flags
|
|
|
3
3
|
const TUNNEL_WEBHOOKS_FLAG_KEY = "tunnel-webhooks" as const;
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
|
-
* Whether
|
|
6
|
+
* Whether cloud pods resolve webhook callback URLs from the
|
|
7
7
|
* Tunnel-published ingress URL instead of registering platform callback
|
|
8
8
|
* routes.
|
|
9
9
|
*
|
|
10
|
-
* Gates the
|
|
10
|
+
* Gates the cloud-pod tier in all three webhook resolution sites
|
|
11
11
|
* (`resolveCallbackUrl`, `hasWebhookRoutingConfigured`,
|
|
12
12
|
* `handleWebhooksRegister`), which must agree tier for tier. Off means the
|
|
13
|
-
* pre-Tunnel behavior:
|
|
13
|
+
* pre-Tunnel behavior: cloud pods always register with the cloud
|
|
14
14
|
* gateway. On means ingress-first with platform registration as the
|
|
15
15
|
* fallback, so a pod whose tunnel has not published a URL yet keeps
|
|
16
16
|
* working either way.
|
|
@@ -108,7 +108,7 @@ describe("AssistantIpcServer DB migration readiness gate", () => {
|
|
|
108
108
|
setDbMigrationFailed(new Error("boom"));
|
|
109
109
|
expect(gate("admin_rollbackmigrations_post")).toBeNull();
|
|
110
110
|
expect(gate("migrations_import_post")).toBeNull();
|
|
111
|
-
// All restore transports are repair-capable: preflights, the
|
|
111
|
+
// All restore transports are repair-capable: preflights, the cloud
|
|
112
112
|
// platform's GCS path, and its job-status polling.
|
|
113
113
|
expect(gate("migrations_importpreflight_post")).toBeNull();
|
|
114
114
|
expect(gate("migrations_importfromgcs_post")).toBeNull();
|