@agent-native/core 0.120.4 → 0.121.0
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/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +14 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/client/use-db-sync.ts +23 -21
- package/corpus/core/src/deploy/build.ts +1 -0
- package/corpus/core/src/server/core-routes-plugin.ts +3 -0
- package/corpus/core/src/server/gateway-access-check.ts +67 -0
- package/corpus/core/src/server/poll.ts +295 -9
- package/corpus/core/src/server/short-lived-token.ts +122 -0
- package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +29 -4
- package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +365 -9
- package/corpus/templates/slides/app/components/editor/bullet-editing.ts +350 -0
- package/corpus/templates/slides/app/context/DeckContext.tsx +1 -3
- package/corpus/templates/slides/app/i18n/en-US.ts +2 -0
- package/corpus/templates/slides/app/pages/DeckEditor.tsx +5 -0
- package/corpus/templates/slides/changelog/2026-07-23-new-bullet-rows-created-with-enter-now-keep-the-list-item-s-.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-23-pressing-enter-in-generated-checkbox-shape-marker-lists-now-.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-24-typing-a-markdown-style-dash-space-at-the-start-of-a-text-bl.md +6 -0
- package/dist/client/use-db-sync.d.ts.map +1 -1
- package/dist/client/use-db-sync.js +27 -22
- package/dist/client/use-db-sync.js.map +1 -1
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +1 -0
- package/dist/deploy/build.js.map +1 -1
- package/dist/file-upload/actions/upload-image.d.ts +1 -1
- package/dist/notifications/routes.d.ts +1 -1
- package/dist/observability/routes.d.ts +3 -3
- package/dist/progress/routes.d.ts +1 -1
- package/dist/provider-api/actions/custom-provider-registration.d.ts +4 -4
- package/dist/provider-api/actions/provider-api.d.ts +6 -6
- package/dist/secrets/routes.d.ts +9 -9
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +3 -0
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/gateway-access-check.d.ts +12 -0
- package/dist/server/gateway-access-check.d.ts.map +1 -0
- package/dist/server/gateway-access-check.js +49 -0
- package/dist/server/gateway-access-check.js.map +1 -0
- package/dist/server/poll.d.ts +55 -1
- package/dist/server/poll.d.ts.map +1 -1
- package/dist/server/poll.js +254 -7
- package/dist/server/poll.js.map +1 -1
- package/dist/server/realtime-token.d.ts +1 -1
- package/dist/server/short-lived-token.d.ts +28 -0
- package/dist/server/short-lived-token.d.ts.map +1 -1
- package/dist/server/short-lived-token.js +78 -0
- package/dist/server/short-lived-token.js.map +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/package.json +1 -1
- package/src/client/use-db-sync.ts +23 -21
- package/src/deploy/build.ts +1 -0
- package/src/server/core-routes-plugin.ts +3 -0
- package/src/server/gateway-access-check.ts +67 -0
- package/src/server/poll.ts +295 -9
- package/src/server/short-lived-token.ts +122 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-db-sync.js","sourceRoot":"","sources":["../../src/client/use-db-sync.ts"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useRef, useState } from \"react\";\n\nimport { ensureDemoModeFetchInterceptor } from \"../demo/fetch-interceptor.js\";\nimport {\n parseHandshakeFrame,\n parseTokenFrame,\n REALTIME_PROTOCOL_VERSION,\n REALTIME_SSE_HANDSHAKE_EVENT,\n REALTIME_SSE_TOKEN_EVENT,\n} from \"../realtime-protocol.js\";\nimport { agentNativePath } from \"./api-path.js\";\nimport { getBrowserTabId } from \"./browser-tab-id.js\";\nimport {\n ensureEmbedAuthFetchInterceptor,\n isEmbedAuthActive,\n} from \"./embed-auth.js\";\nimport { bumpChangeVersion } from \"./use-change-version.js\";\n\ninterface Query {\n queryKey: readonly unknown[];\n}\n\ninterface QueryClient {\n invalidateQueries(\n opts?: {\n queryKey?: string[];\n predicate?: (query: Query) => boolean;\n },\n options?: { cancelRefetch?: boolean },\n ): unknown;\n isFetching?(filters?: {\n queryKey?: string[];\n predicate?: (query: Query) => boolean;\n }): number;\n}\n\nconst POLL_ABORT_MIN_MS = 10_000;\n// SSE delivers changes immediately in the normal path. The poll is a\n// cross-process/serverless safety net, so an idle tab should not bill the host\n// four times per minute forever. Focus and active agent work still poll now.\nconst SSE_FALLBACK_INTERVAL_MS = 60_000;\nconst IDLE_POLL_INTERVAL_MS = 60_000;\nconst HIDDEN_POLL_INTERVAL_MS = 10_000;\nconst POLL_AUTH_FAILURE_COOLDOWN_MS = 60_000;\n/**\n * Max cadence for SSE/poll-driven query invalidation in `useDbSync`. Events\n * that arrive within this window of the first one in a burst are merged into\n * a single `invalidateForEvents` call instead of one call per event — see the\n * `queueInvalidateBatch` comment at the call site.\n */\nconst INVALIDATE_COALESCE_MS = 250;\n\nclass HttpStatusError extends Error {\n status: number;\n\n constructor(status: number) {\n super(\"HTTP \" + status);\n this.status = status;\n }\n}\n\nexport type SyncEvent = {\n version?: number;\n source?: string;\n type?: string;\n key?: string;\n requestSource?: string;\n [k: string]: unknown;\n};\n\ntype PollResponse = {\n version: number;\n events: SyncEvent[];\n};\n\n/** Callback delivered to each transport subscriber for every batch of events. */\ntype EventSubscriber = (\n events: SyncEvent[],\n version: number | undefined,\n) => void;\n\nfunction getPollAbortMs(interval: number): number {\n return Math.max(POLL_ABORT_MIN_MS, interval * 4);\n}\n\nfunction isDocumentHidden(): boolean {\n return (\n typeof document !== \"undefined\" && document.visibilityState === \"hidden\"\n );\n}\n\nfunction resolveSseUrl(sseUrl: string | false | undefined): string | false {\n if (sseUrl === false) return false;\n if (isEmbedAuthActive()) return false;\n return agentNativePath(sseUrl ?? \"/_agent-native/events\");\n}\n\n// --- Hosted Realtime Gateway binding ----------------------------------------\n//\n// When the app is configured for the hosted gateway, the transport connects to\n// the gateway (cross-origin) instead of the Netlify app, carrying a short-lived\n// subscribe token minted from the app's own same-origin endpoint. All of this\n// is gated on a non-null binding — apps without hosted config keep the exact\n// local behavior below.\n\nconst REALTIME_GATEWAY_SSE_PATH = \"/stream\";\nconst REALTIME_GATEWAY_POLL_PATH = \"/poll\";\nconst REALTIME_TOKEN_MINT_PATH = \"/_agent-native/realtime-token\";\n/** Consecutive gateway failures before health-gating back to the local app. */\nconst HOSTED_UNHEALTHY_THRESHOLD = 3;\n\ninterface RealtimeGatewayBinding {\n /** Gateway SSE URL (token appended per connect). */\n sseUrl: string;\n /** Gateway poll URL (token appended per request). */\n pollUrl: string;\n /** Same-origin app endpoint that mints the subscribe token. */\n tokenMintUrl: string;\n}\n\nfunction getRealtimeConfig():\n | { transport?: string; gatewayBaseUrl?: string }\n | undefined {\n if (typeof window === \"undefined\") return undefined;\n return window.__AGENT_NATIVE_CONFIG__?.realtime;\n}\n\n/**\n * Resolve the hosted-gateway binding, or null to stay on the local app. Gated\n * on: SSE enabled (the gateway is push-first), not embed auth (needs the\n * same-origin session to mint), and `transport: \"hosted\"` with a base URL in\n * the impersonal SSR config.\n */\nfunction resolveGatewayBinding(\n localSseUrl: string | false,\n): RealtimeGatewayBinding | null {\n if (localSseUrl === false) return null;\n if (isEmbedAuthActive()) return null;\n const config = getRealtimeConfig();\n if (config?.transport !== \"hosted\") return null;\n const base = config.gatewayBaseUrl?.replace(/\\/+$/, \"\");\n if (!base) return null;\n return {\n sseUrl: `${base}${REALTIME_GATEWAY_SSE_PATH}`,\n pollUrl: `${base}${REALTIME_GATEWAY_POLL_PATH}`,\n tokenMintUrl: agentNativePath(REALTIME_TOKEN_MINT_PATH),\n };\n}\n\n/** ±20% jitter so gateway timeout/deploy-driven reconnects don't stampede. */\nfunction applyReconnectJitter(delay: number): number {\n const jitter = delay * 0.2 * (Math.random() * 2 - 1);\n return Math.max(0, Math.round(delay + jitter));\n}\n\nfunction normalizeEventPayload(payload: unknown): SyncEvent[] {\n if (!payload || typeof payload !== \"object\") return [];\n const record = payload as { type?: unknown; events?: unknown };\n if (record.type === \"batch\" && Array.isArray(record.events)) {\n return record.events.filter(\n (event): event is SyncEvent => !!event && typeof event === \"object\",\n );\n }\n if (Array.isArray(record.events)) {\n return record.events.filter(\n (event): event is SyncEvent => !!event && typeof event === \"object\",\n );\n }\n return [payload as SyncEvent];\n}\n\nfunction isAuthFailure(error: unknown): boolean {\n return (\n !!error &&\n typeof error === \"object\" &&\n \"status\" in error &&\n ((error as { status?: unknown }).status === 401 ||\n (error as { status?: unknown }).status === 403)\n );\n}\n\n/**\n * App-state keys that drive immediate UI navigation/interaction and must\n * never sit behind the invalidation coalesce window (see\n * `isInteractionCriticalSyncEvent`).\n */\nconst INTERACTION_CRITICAL_APP_STATE_KEYS = [\n \"navigate\",\n \"show-questions\",\n \"__set_url__\",\n];\n\n/**\n * True for sync events that drive immediate, agent-initiated UI navigation\n * or interaction rather than passive data invalidation — app-state writes in\n * general (they back `[\"app-state\"]` queries directly), and specifically the\n * `navigate` / `show-questions` / `__set_url__` app-state keys that\n * `invalidateForEvents` special-cases into their own query keys below.\n *\n * `useDbSync` batches ordinary invalidation-driving events (action/collab/db\n * change events) into one flush per `INVALIDATE_COALESCE_MS` so a chatty doc\n * doesn't refetch on every keystroke. That trade-off is wrong for these\n * events: agent-driven navigation, `set-url`, and guided-questions prompts\n * must land as close to instantly as possible, so any batch containing one\n * of these bypasses the coalesce window and flushes immediately instead.\n *\n * Exported as a small pure predicate so this classification is unit-testable\n * independent of the transport/timer plumbing around it.\n */\nexport function isInteractionCriticalSyncEvent(event: SyncEvent): boolean {\n return (\n event.source === \"app-state\" &&\n (event.key === \"*\" ||\n INTERACTION_CRITICAL_APP_STATE_KEYS.some(\n (key) =>\n event.key === key ||\n (typeof event.key === \"string\" && event.key.startsWith(`${key}:`)),\n ))\n );\n}\n\nasync function fetchPollJson<T>(\n pollUrl: string,\n since: number,\n interval: number,\n token?: string,\n): Promise<T> {\n const controller =\n typeof AbortController === \"undefined\" ? null : new AbortController();\n const timeout = controller\n ? setTimeout(() => controller.abort(), getPollAbortMs(interval))\n : null;\n\n // Local path stays exactly `?since=N`; the hosted gateway also carries the\n // subscribe token on the query string (a cross-origin fetch can't set the\n // Authorization header for the SSE sibling either, so both use the query).\n const url = token\n ? `${pollUrl}${pollUrl.includes(\"?\") ? \"&\" : \"?\"}since=${since}&token=${encodeURIComponent(token)}`\n : `${pollUrl}?since=${since}`;\n\n try {\n const res = await fetch(\n url,\n controller ? { signal: controller.signal } : undefined,\n );\n if (!res.ok) throw new HttpStatusError(res.status);\n // Await the json before the finally so a body-stream abort doesn't\n // produce a dangling promise that escapes as an unhandled rejection.\n return await res.json();\n } finally {\n if (timeout) clearTimeout(timeout);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Shared SSE + poll transport\n//\n// One SyncTransport per (pollUrl, sseUrl) pair is held in a module-level\n// registry. Both `useDbSync` and `useScreenRefreshKey` subscribe to it, so a\n// single browser tab opens exactly ONE SSE connection and ONE poll loop\n// regardless of how many hook instances are mounted.\n//\n// Lifecycle: the transport starts when the first subscriber joins and shuts\n// down when the last subscriber leaves. This makes it safe to SSR and to\n// mount/unmount hooks independently.\n// ---------------------------------------------------------------------------\n\ninterface TransportSubscription {\n onEvents: EventSubscriber;\n /**\n * Whether this subscriber wants the transport to pause when the tab is\n * hidden. The transport pauses only when ALL subscribers request it — any\n * subscriber with `pauseWhenHidden: false` keeps the connection alive.\n */\n pauseWhenHidden: boolean;\n /**\n * Requested poll interval in ms. The transport uses the minimum across all\n * subscribers so the most-frequent caller is satisfied.\n */\n interval: number;\n /** Requested poll interval while the tab has no active agent work. */\n idleInterval: number;\n /** Requested fallback interval while SSE is connected. */\n fallbackInterval: number;\n /**\n * Optional: notified when the shared SSE connection opens or closes (also\n * fired once with the current state when the subscriber joins). Lets\n * subscribers with their own fallback loops (e.g. the collab doc poll)\n * relax their cadence while the push path is healthy.\n */\n onSseStateChange?: (\n connected: boolean,\n capabilities?: readonly string[],\n ) => void;\n}\n\nclass SyncTransport {\n private subscribers = new Map<symbol, TransportSubscription>();\n private versionRef = 0;\n private timer: ReturnType<typeof setTimeout> | null = null;\n private stopped = false;\n private inFlight = false;\n private eventSource: EventSource | null = null;\n private sseConnected = false;\n private authFailureUntil = 0;\n private consecutiveFailures = 0;\n private activeChatIds = new Set<string>();\n // Hosted-gateway state. `mode` starts \"hosted\" when a binding is present and\n // flips to \"local\" on health-gate revert; `token` is the current subscribe\n // token (minted from the app, rotated over the stream), never part of any\n // registry key.\n private mode: \"hosted\" | \"local\";\n private token: string | null = null;\n private tokenMintInFlight: Promise<boolean> | null = null;\n private gatewayReconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private capabilities: string[] = [];\n\n constructor(\n private readonly pollUrl: string,\n private readonly sseUrl: string | false,\n private readonly gateway: RealtimeGatewayBinding | null = null,\n ) {\n this.mode = gateway ? \"hosted\" : \"local\";\n }\n\n /** Capabilities advertised by the gateway handshake (e.g. `no-awareness`). */\n getCapabilities(): readonly string[] {\n return this.capabilities;\n }\n\n private get activeSseUrl(): string | false {\n if (this.mode === \"hosted\" && this.gateway) {\n return this.token\n ? `${this.gateway.sseUrl}?token=${encodeURIComponent(this.token)}`\n : this.gateway.sseUrl;\n }\n return this.sseUrl;\n }\n\n private get activePollUrl(): string {\n return this.mode === \"hosted\" && this.gateway\n ? this.gateway.pollUrl\n : this.pollUrl;\n }\n\n /**\n * Mint a subscribe token from the app's same-origin endpoint.\n *\n * Only TERMINAL outcomes health-gate to local: 404 (gateway not provisioned)\n * and 401/403 (not authorized) — retrying those for this tab is pointless.\n * TRANSIENT failures (5xx/429 from a cold Netlify function, network errors)\n * keep the hosted intent and ride the jittered reconnect + unhealthy-threshold\n * path, so a deploy / scale-to-zero blip doesn't permanently abandon the\n * gateway for the tab.\n */\n private mintToken(): Promise<boolean> {\n if (!this.gateway || this.mode !== \"hosted\") return Promise.resolve(false);\n if (this.tokenMintInFlight) return this.tokenMintInFlight;\n const mintUrl = this.gateway.tokenMintUrl;\n this.tokenMintInFlight = (async () => {\n // Bound the mint like fetchPollJson bounds polls: a black-holed request\n // must resolve as a transient failure, not hang tokenMintInFlight forever\n // (poll() awaits this while holding inFlight, so a hung mint would stall\n // the whole transport with no timer pending).\n const controller =\n typeof AbortController === \"undefined\" ? null : new AbortController();\n const timeout = controller\n ? setTimeout(() => controller.abort(), POLL_ABORT_MIN_MS)\n : null;\n try {\n const res = await fetch(mintUrl, {\n credentials: \"same-origin\",\n ...(controller ? { signal: controller.signal } : {}),\n });\n if (res.ok) {\n const data = (await res.json()) as { token?: unknown };\n if (typeof data?.token === \"string\" && data.token) {\n this.token = data.token;\n // Deliberately NOT resetting consecutiveFailures here: minting\n // succeeds via the app origin even when the GATEWAY is down, so a\n // reset would let a mint-ok -> stream-fail loop run forever below\n // the unhealthy threshold. Only real gateway connectivity (stream\n // onopen / poll success) clears the count.\n return true;\n }\n // 2xx without a token is a terminal misconfiguration.\n this.revertToLocal();\n return false;\n }\n if (res.status === 404 || res.status === 401 || res.status === 403) {\n this.revertToLocal();\n return false;\n }\n this.onGatewayTransientFailure();\n return false;\n } catch {\n this.onGatewayTransientFailure();\n return false;\n } finally {\n if (timeout) clearTimeout(timeout);\n this.tokenMintInFlight = null;\n }\n })();\n return this.tokenMintInFlight;\n }\n\n /**\n * A transient gateway failure (mint 5xx/429, network). Keep hosted intent but\n * count toward the unhealthy threshold; revert to local only once it trips.\n */\n private onGatewayTransientFailure(): void {\n this.consecutiveFailures++;\n if (this.consecutiveFailures >= HOSTED_UNHEALTHY_THRESHOLD) {\n this.revertToLocal();\n }\n }\n\n /**\n * Health-gate back to the app's own /poll + /events with the cursor intact\n * (versionRef is untouched), so delivery stays poll-equivalent — never a\n * silent stall.\n */\n private revertToLocal(): void {\n if (this.mode === \"local\") return;\n this.mode = \"local\";\n this.token = null;\n // The local in-process SSE path sends no handshake, so hosted capabilities\n // (e.g. no-awareness) must not survive the fallback — stale caps would keep\n // collab on its fast presence cadence against the local stream. Subscribers\n // are re-notified via the close/connect cycle below.\n this.capabilities = [];\n if (this.gatewayReconnectTimer) {\n clearTimeout(this.gatewayReconnectTimer);\n this.gatewayReconnectTimer = null;\n }\n this.closeEvents();\n if (!this.stopped) {\n this.connectEvents();\n this.schedulePoll();\n }\n }\n\n private scheduleGatewayReconnect(): void {\n if (this.stopped || this.gatewayReconnectTimer) return;\n this.gatewayReconnectTimer = setTimeout(() => {\n this.gatewayReconnectTimer = null;\n if (!this.stopped && !this.eventSource) this.connectEvents();\n }, applyReconnectJitter(1000));\n }\n\n // -------------------------------------------------------------------------\n // Subscriber management\n // -------------------------------------------------------------------------\n\n add(id: symbol, sub: TransportSubscription): void {\n const wasEmpty = this.subscribers.size === 0;\n const wasActive = this.isActive;\n this.subscribers.set(id, sub);\n if (wasEmpty) {\n this.stopped = false;\n this.start();\n } else if (!wasActive && this.isActive) {\n // A collab surface (or other active subscriber) just joined. Catch up\n // immediately rather than waiting out an idle-cadence timer.\n this.pollNow();\n } else {\n this.reschedule();\n }\n sub.onSseStateChange?.(this.sseConnected, this.capabilities);\n }\n\n remove(id: symbol): void {\n this.subscribers.delete(id);\n if (this.subscribers.size === 0) {\n this.teardown();\n } else {\n // Recalculate poll interval in case the leaving subscriber was the\n // fastest caller; reschedule with the updated cadence.\n this.reschedule();\n }\n }\n\n // -------------------------------------------------------------------------\n // Derived settings (aggregate over active subscribers)\n // -------------------------------------------------------------------------\n\n private get effectivePauseWhenHidden(): boolean {\n // Pause only if every subscriber has opted in.\n for (const sub of this.subscribers.values()) {\n if (!sub.pauseWhenHidden) return false;\n }\n return true;\n }\n\n private get effectiveInterval(): number {\n let min = Infinity;\n for (const sub of this.subscribers.values()) {\n if (sub.interval < min) min = sub.interval;\n }\n return isFinite(min) ? min : 2000;\n }\n\n private get effectiveIdleInterval(): number {\n let min = Infinity;\n for (const sub of this.subscribers.values()) {\n if (sub.idleInterval < min) min = sub.idleInterval;\n }\n return isFinite(min) ? min : IDLE_POLL_INTERVAL_MS;\n }\n\n private get isActive(): boolean {\n return this.activeChatIds.size > 0;\n }\n\n private get effectiveFallbackInterval(): number {\n let min = Infinity;\n for (const sub of this.subscribers.values()) {\n if (sub.fallbackInterval < min) min = sub.fallbackInterval;\n }\n return isFinite(min) ? min : SSE_FALLBACK_INTERVAL_MS;\n }\n\n // -------------------------------------------------------------------------\n // Event fan-out\n // -------------------------------------------------------------------------\n\n private fan(events: SyncEvent[], version: number | undefined): void {\n for (const sub of this.subscribers.values()) {\n sub.onEvents(events, version);\n }\n }\n\n private setSseConnected(connected: boolean): void {\n if (this.sseConnected === connected) return;\n this.sseConnected = connected;\n this.notifySseState();\n }\n\n /**\n * Notify subscribers of the current SSE state AND the negotiated gateway\n * capabilities. Called on connect/disconnect and again once the handshake\n * arrives, so a consumer (e.g. collab) can decide — for instance — not to\n * relax its presence cadence on a `no-awareness` hosted stream.\n */\n private notifySseState(): void {\n for (const sub of this.subscribers.values()) {\n sub.onSseStateChange?.(this.sseConnected, this.capabilities);\n }\n }\n\n // -------------------------------------------------------------------------\n // SSE + poll loop (mirrors the original per-hook logic exactly)\n // -------------------------------------------------------------------------\n\n private authFailureDelayMs(): number {\n return Math.max(0, this.authFailureUntil - Date.now());\n }\n\n private schedulePoll(): void {\n if (this.stopped) return;\n if (this.effectivePauseWhenHidden && isDocumentHidden()) return;\n if (this.timer) clearTimeout(this.timer);\n const authDelay = this.authFailureDelayMs();\n if (authDelay > 0) {\n this.timer = setTimeout(() => {\n this.timer = null;\n void this.poll();\n }, authDelay);\n return;\n }\n const visibleBase = this.isActive\n ? this.effectiveInterval\n : this.sseConnected\n ? this.effectiveFallbackInterval\n : this.effectiveIdleInterval;\n const base = isDocumentHidden()\n ? Math.max(visibleBase, HIDDEN_POLL_INTERVAL_MS)\n : visibleBase;\n // Exponential backoff while polls keep failing (500s during a deploy,\n // DNS blips, a struggling DB). Auth failures have their own cooldown\n // above; this covers everything else so a down server isn't hammered at\n // full cadence. Resets on the first successful poll.\n const backoff =\n this.consecutiveFailures > 0\n ? Math.min(base * 2 ** Math.min(this.consecutiveFailures, 5), 300_000)\n : base;\n // Jitter only for gateway-capable transports so reconnect/poll retries\n // don't stampede a gateway deploy; apps with no gateway config keep the\n // exact deterministic cadence.\n const delay = this.gateway ? applyReconnectJitter(backoff) : backoff;\n this.timer = setTimeout(() => {\n this.timer = null;\n void this.poll();\n }, delay);\n }\n\n private reschedule(): void {\n // Only need to act if a timer is already pending; next natural tick will\n // pick up the new effective interval otherwise.\n if (this.timer !== null) {\n clearTimeout(this.timer);\n this.timer = null;\n this.schedulePoll();\n }\n }\n\n private closeEvents(): void {\n if (!this.eventSource) return;\n this.eventSource.close();\n this.eventSource = null;\n this.setSseConnected(false);\n }\n\n private connectEvents(): void {\n if (\n this.stopped ||\n this.eventSource ||\n typeof EventSource === \"undefined\" ||\n (this.effectivePauseWhenHidden && isDocumentHidden())\n ) {\n return;\n }\n\n // Hosted gateway needs a subscribe token before the stream can open.\n // EventSource can't set headers, so the token rides the connect query\n // string (see activeSseUrl). Mint first, then connect.\n if (this.mode === \"hosted\" && this.gateway && !this.token) {\n void this.mintToken().then((ok) => {\n if (this.stopped) return;\n if (ok && !this.eventSource) {\n this.connectEvents();\n } else if (!ok && this.mode === \"hosted\") {\n // Transient mint failure (terminal ones already reverted to local,\n // flipping mode). Without a retry timer nothing would ever reopen\n // SSE — connectEvents is only reachable from focus/visibility/run\n // events — leaving the tab poll-only at the idle cadence.\n this.scheduleGatewayReconnect();\n }\n });\n return;\n }\n\n const url = this.activeSseUrl;\n if (!url) return;\n\n const source = new EventSource(url);\n this.eventSource = source;\n source.onopen = () => {\n this.setSseConnected(true);\n if (this.mode === \"hosted\") {\n // A live gateway stream is the real health signal: clear failure\n // counts accumulated by mint/stream retries. Local mode keeps main's\n // semantics (only a successful poll resets the poll backoff).\n this.consecutiveFailures = 0;\n }\n this.schedulePoll();\n };\n source.onerror = () => {\n this.setSseConnected(false);\n // When the browser gives up permanently (HTTP error → readyState\n // CLOSED), it won't auto-reconnect. Drop the ref so a later\n // connectEvents() (on focus/visibility) can establish a fresh stream;\n // otherwise the non-null closed `eventSource` blocks reconnection and\n // we'd be stuck on polling-only forever.\n if (source.readyState === EventSource.CLOSED) {\n this.eventSource = null;\n if (this.mode === \"hosted\" && this.gateway) {\n // A closed gateway stream is most likely an expired token or a\n // request-timeout/deploy cycle. Re-mint and reconnect with jitter;\n // this is NOT the poll-401 cooldown path. Each closed stream counts\n // toward the unhealthy threshold so a hard-down gateway (or one\n // rejecting our tokens) health-gates to local instead of looping\n // mint+connect forever; a successful reconnect resets the count in\n // onopen above.\n this.token = null;\n this.onGatewayTransientFailure();\n if (this.mode === \"hosted\") this.scheduleGatewayReconnect();\n return;\n }\n }\n this.schedulePoll();\n };\n source.onmessage = (message) => {\n try {\n const payload = JSON.parse(message.data);\n const events = normalizeEventPayload(payload);\n const version =\n typeof payload?.version === \"number\" ? payload.version : undefined;\n this.applyVersion(events, version);\n this.fan(events, version);\n } catch {\n // Ignore malformed SSE frames; polling is the safety net.\n }\n };\n\n if (this.mode === \"hosted\" && this.gateway) {\n // Control frames ride NAMED SSE events so they never reach onmessage /\n // normalizeEventPayload as spurious data events.\n source.addEventListener(REALTIME_SSE_HANDSHAKE_EVENT, (e) => {\n const hs = parseHandshakeFrame((e as MessageEvent).data);\n if (!hs) return;\n if (hs.protocol !== REALTIME_PROTOCOL_VERSION) {\n // Surface an unexpected protocol rather than silently adopting its\n // capabilities; keep the conservative (no advertised capabilities)\n // stance so downstream (collab) does not relax on assumptions.\n console.warn(\n `[agent-native] unsupported realtime protocol ${hs.protocol} (expected ${REALTIME_PROTOCOL_VERSION})`,\n );\n return;\n }\n this.capabilities = hs.capabilities;\n // Re-notify subscribers now that capabilities are known — the initial\n // connected notification fired before the handshake arrived.\n this.notifySseState();\n });\n source.addEventListener(REALTIME_SSE_TOKEN_EVENT, (e) => {\n const frame = parseTokenFrame((e as MessageEvent).data);\n if (!frame?.token) return;\n this.token = frame.token;\n // EventSource can't change a live stream's URL, and its auto-reconnect\n // reuses the original (old-token) URL. Close and reconnect (jittered) so\n // the rotated token is actually used on the next connect.\n this.closeEvents();\n this.scheduleGatewayReconnect();\n });\n }\n }\n\n /**\n * Advance the transport's shared version cursor. Subscribers receive the\n * raw events and decide independently which ones are \"fresh\" relative to\n * their own cursor, but the transport-level cursor ensures the poll\n * `?since=` parameter always advances.\n */\n private applyVersion(events: SyncEvent[], version: number | undefined): void {\n let max = typeof version === \"number\" ? version : 0;\n for (const evt of events) {\n const v = typeof evt.version === \"number\" ? evt.version : 0;\n if (v > max) max = v;\n }\n if (max > this.versionRef) this.versionRef = max;\n }\n\n private async poll(): Promise<void> {\n if (this.stopped || this.inFlight) return;\n this.inFlight = true;\n try {\n if (this.mode === \"hosted\" && this.gateway && !this.token) {\n // No token yet — mint before polling the gateway. A failed mint has\n // already reverted us to local; a scheduled poll will pick it up.\n const ok = await this.mintToken();\n if (!ok || this.stopped) return;\n }\n const data = await fetchPollJson<PollResponse>(\n this.activePollUrl,\n this.versionRef,\n this.effectiveInterval,\n this.mode === \"hosted\" ? (this.token ?? undefined) : undefined,\n );\n if (this.stopped) return;\n this.consecutiveFailures = 0;\n const events = data.events ?? [];\n this.applyVersion(events, data.version);\n this.fan(events, data.version);\n } catch (err) {\n if (this.stopped) return;\n this.consecutiveFailures++;\n if (this.mode === \"hosted\" && this.gateway) {\n // Gateway auth failure → re-mint (expired/rotated token), WITHOUT\n // tripping the poll-401 cooldown. Persistent failures of any kind\n // health-gate back to the local app.\n if (isAuthFailure(err)) {\n this.token = null;\n void this.mintToken();\n }\n if (this.consecutiveFailures >= HOSTED_UNHEALTHY_THRESHOLD) {\n this.revertToLocal();\n }\n } else if (isAuthFailure(err)) {\n this.authFailureUntil = Date.now() + POLL_AUTH_FAILURE_COOLDOWN_MS;\n this.closeEvents();\n }\n // Network error — retried on the next (backed-off) interval.\n } finally {\n this.inFlight = false;\n this.schedulePoll();\n }\n }\n\n private pollNow(): void {\n if (this.effectivePauseWhenHidden && isDocumentHidden()) return;\n if (this.authFailureDelayMs() > 0) {\n this.schedulePoll();\n return;\n }\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n this.connectEvents();\n void this.poll();\n }\n\n private handleVisibilityChange = (): void => {\n if (document.visibilityState === \"visible\") {\n this.connectEvents();\n this.pollNow();\n } else if (this.effectivePauseWhenHidden) {\n this.closeEvents();\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n } else {\n // Keep push connected and the polling safety net alive in backgrounded\n // tabs, but relax an active chat's cadence so hidden work stays current\n // without polling as aggressively as the visible surface.\n this.reschedule();\n }\n };\n\n private handleFocus = (): void => {\n this.pollNow();\n };\n\n private handleChatRunning = (event: Event): void => {\n const detail = (\n event as CustomEvent<{\n isRunning?: unknown;\n running?: unknown;\n tabId?: unknown;\n }>\n ).detail;\n const running =\n typeof detail?.isRunning === \"boolean\"\n ? detail.isRunning\n : typeof detail?.running === \"boolean\"\n ? detail.running\n : null;\n if (running === null) return;\n\n const id =\n typeof detail?.tabId === \"string\" && detail.tabId\n ? detail.tabId\n : \"__default__\";\n const wasActive = this.isActive;\n if (running) this.activeChatIds.add(id);\n else this.activeChatIds.delete(id);\n if (wasActive === this.isActive) return;\n\n if (this.isActive) {\n // Run start is a high-signal indication that cross-process writes are\n // imminent. Catch up now, then stay on the active cadence.\n this.pollNow();\n } else {\n this.reschedule();\n }\n };\n\n private start(): void {\n // Universal browser-local demo-mode presentation redaction. Idempotent and\n // a no-op until the local preference is on. Lives here because every root\n // already mounts useDbSync, so this needs zero per-template wiring.\n ensureEmbedAuthFetchInterceptor();\n ensureDemoModeFetchInterceptor();\n\n if (!this.effectivePauseWhenHidden || !isDocumentHidden()) {\n this.connectEvents();\n void this.poll();\n }\n window.addEventListener(\"focus\", this.handleFocus);\n window.addEventListener(\"agentNative.chatRunning\", this.handleChatRunning);\n document.addEventListener(\"visibilitychange\", this.handleVisibilityChange);\n }\n\n private teardown(): void {\n this.stopped = true;\n this.closeEvents();\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n if (this.gatewayReconnectTimer) {\n clearTimeout(this.gatewayReconnectTimer);\n this.gatewayReconnectTimer = null;\n }\n window.removeEventListener(\"focus\", this.handleFocus);\n window.removeEventListener(\n \"agentNative.chatRunning\",\n this.handleChatRunning,\n );\n document.removeEventListener(\n \"visibilitychange\",\n this.handleVisibilityChange,\n );\n }\n}\n\n/**\n * Registry of active transports keyed by \"<pollUrl>\\0<sseUrl>\".\n * Module-level singleton: survives React render cycles, shared across all\n * hook instances in the same browser tab.\n */\nconst transportRegistry = new Map<string, SyncTransport>();\n\nfunction getOrCreateTransport(\n pollUrl: string,\n sseUrl: string | false,\n gateway: RealtimeGatewayBinding | null = null,\n): SyncTransport {\n // Key on the LOCAL urls only — a transport may flip hosted→local at runtime,\n // and the token must never fragment the registry, so neither is in the key.\n const key = `${pollUrl}\\0${String(sseUrl)}`;\n let transport = transportRegistry.get(key);\n if (!transport) {\n transport = new SyncTransport(pollUrl, sseUrl, gateway);\n transportRegistry.set(key, transport);\n }\n return transport;\n}\n\n/** Remove a transport from the registry once torn down (last subscriber left). */\nfunction releaseTransport(pollUrl: string, sseUrl: string | false): void {\n const key = `${pollUrl}\\0${String(sseUrl)}`;\n // Leave the entry in place: SSE/poll is already stopped inside the class;\n // the next subscriber will re-start it via `add()`. Clearing the map entry\n // prevents any dangling reference from the old SyncTransport instance.\n transportRegistry.delete(key);\n}\n\n// ---------------------------------------------------------------------------\n// Internal test helper — reset transport registry between tests.\n// ---------------------------------------------------------------------------\n/** @internal */\nexport function _resetSyncTransportRegistryForTests(): void {\n transportRegistry.clear();\n}\n\nexport interface SubscribeSyncEventsOptions {\n /** Receives every batch of change events (SSE push or poll). */\n onEvents: (events: SyncEvent[], version: number | undefined) => void;\n /** Notified when the shared SSE connection opens/closes (and once on join). */\n onSseStateChange?: (\n connected: boolean,\n capabilities?: readonly string[],\n ) => void;\n pollUrl?: string;\n sseUrl?: string | false;\n pauseWhenHidden?: boolean;\n /**\n * Poll cadence this subscriber requests from the SHARED poll loop. The\n * transport uses the minimum across subscribers, so the defaults here are\n * deliberately high: subscribing must not speed up the shared poll —\n * useDbSync (mounted by every template root) already sets the pace.\n */\n interval?: number;\n fallbackInterval?: number;\n}\n\n/**\n * Subscribe to the shared SSE + poll transport without the React Query\n * invalidation behavior of `useDbSync`. Use this instead of opening another\n * `EventSource` to `/_agent-native/events` — a browser tab should hold ONE\n * SSE connection no matter how many features listen to it (extra streams eat\n * the per-origin connection budget and starve data fetches, especially on\n * HTTP/1.1 dev servers).\n *\n * Returns an unsubscribe function. Safe to call only in browser contexts.\n */\nexport function subscribeSyncEvents(\n options: SubscribeSyncEventsOptions,\n): () => void {\n const pollUrl = agentNativePath(options.pollUrl ?? \"/_agent-native/poll\");\n const sseUrl = resolveSseUrl(options.sseUrl);\n const transport = getOrCreateTransport(\n pollUrl,\n sseUrl,\n resolveGatewayBinding(sseUrl),\n );\n const id = Symbol(\"subscribeSyncEvents\");\n transport.add(id, {\n onEvents: options.onEvents,\n onSseStateChange: options.onSseStateChange,\n pauseWhenHidden: options.pauseWhenHidden ?? false,\n interval: options.interval ?? 60_000,\n idleInterval: options.interval ?? 60_000,\n fallbackInterval: options.fallbackInterval ?? 60_000,\n });\n return () => {\n transport.remove(id);\n if (!transport[\"subscribers\"].size) {\n releaseTransport(pollUrl, sseUrl);\n }\n };\n}\n\n/**\n * Hook that listens to /_agent-native/events for DB change events and\n * invalidates react-query caches when changes are detected. Falls back to\n * /_agent-native/poll so cross-process/serverless writes still show up.\n *\n * Works in all deployment environments (serverless, edge, long-lived server).\n * SSE is the fast path; polling is the safety net.\n *\n * @param options.queryClient - The react-query QueryClient instance\n * @param options.queryKeys - **Deprecated and ignored.** The hook uses\n * framework-owned fixed prefixes plus per-source change counters instead of\n * caller-supplied key lists. Kept in the type signature for backward\n * compatibility — existing call sites that still pass this option keep\n * working but the value has no effect.\n * @param options.pollUrl - Poll endpoint URL. Default: \"/_agent-native/poll\"\n * @param options.sseUrl - SSE endpoint URL. Default: \"/_agent-native/events\".\n * Pass false to disable SSE and use polling only.\n * @param options.onEvent - Optional callback for each change event\n * @param options.interval - Poll interval in ms. Default: 2000\n * @param options.fallbackInterval - Poll interval while SSE is connected.\n * Default: 60000\n * @param options.pauseWhenHidden - Pause sync while the tab is hidden.\n * Default: false. Hidden tabs keep SSE connected and poll no faster than\n * every 10 seconds while active; idle polling remains at 60 seconds.\n * @param options.ignoreSource - Skip events whose `requestSource` matches this\n * value. Use a per-tab ID so the UI ignores its own writes while still\n * picking up changes from other tabs, agents, and scripts.\n * @param options.actionInvalidatePredicate - Optional filter for the broad\n * compatibility invalidate triggered by `action` events. Use this to keep\n * expensive active queries on explicit-refresh semantics while still letting\n * normal source-versioned queries react through `useChangeVersion`.\n * @param options.suppressActionInvalidationFor - Action names whose sync events\n * should not invalidate all action queries. Use only for high-volume\n * background actions that perform their own narrow client invalidation.\n */\nexport function useDbSync(\n options: {\n queryClient?: QueryClient;\n queryKeys?: string[];\n pollUrl?: string;\n sseUrl?: string | false;\n /** @deprecated Use pollUrl instead */\n eventsUrl?: string;\n onEvent?: (data: any) => void;\n interval?: number;\n fallbackInterval?: number;\n pauseWhenHidden?: boolean;\n ignoreSource?: string;\n actionInvalidatePredicate?: (query: Query) => boolean;\n suppressActionInvalidationFor?: string[];\n } = {},\n): void {\n const {\n queryClient,\n pollUrl = agentNativePath(options.eventsUrl ?? \"/_agent-native/poll\"),\n sseUrl = resolveSseUrl(options.sseUrl),\n interval = 2000,\n fallbackInterval = Math.max(\n options.fallbackInterval ?? SSE_FALLBACK_INTERVAL_MS,\n interval,\n ),\n pauseWhenHidden = false,\n } = options;\n const idleInterval =\n options.interval === undefined ? IDLE_POLL_INTERVAL_MS : interval;\n\n const onEventRef = useRef(options.onEvent);\n onEventRef.current = options.onEvent;\n\n const ignoreSourceRef = useRef(options.ignoreSource);\n ignoreSourceRef.current = options.ignoreSource;\n const actionInvalidatePredicateRef = useRef(\n options.actionInvalidatePredicate,\n );\n actionInvalidatePredicateRef.current = options.actionInvalidatePredicate;\n const suppressActionInvalidationForRef = useRef(\n options.suppressActionInvalidationFor,\n );\n suppressActionInvalidationForRef.current =\n options.suppressActionInvalidationFor;\n\n useEffect(() => {\n const id = Symbol(\"useDbSync\");\n // Per-subscriber version cursor: tracks which events have already been\n // processed by THIS subscriber so stale poll re-deliveries are ignored.\n let subscriberVersion = 0;\n\n // Coalesce bursts of SSE-driven invalidation into at most one flush per\n // INVALIDATE_COALESCE_MS. A chatty doc (many small agent edits, several\n // peers editing at once) can otherwise deliver a handful of `action`/\n // `collab` events within a few hundred ms, each independently calling\n // `queryClient.invalidateQueries` and firing `onEvent` — every one of\n // those touches whatever query subscribers are mounted (e.g. a\n // full-page editor) even though the end state only needs to be\n // refreshed once. Version bookkeeping stays synchronous (below) so\n // freshness filtering for the NEXT batch is unaffected by the delay.\n //\n // This coalesce window is wrong for interaction-critical events (agent\n // navigation, `set-url`, guided questions — see\n // `isInteractionCriticalSyncEvent`): those must reach the UI immediately,\n // not up to INVALIDATE_COALESCE_MS late. So a fresh batch containing one\n // of those flushes synchronously (queued + new events together,\n // canceling any pending timer) instead of joining the coalesce window.\n // Pure invalidation bursts with no interaction-critical members keep the\n // coalesced behavior.\n let pendingInvalidateEvents: SyncEvent[] = [];\n let invalidateTimer: ReturnType<typeof setTimeout> | null = null;\n\n function flushInvalidateBatch() {\n if (invalidateTimer) {\n clearTimeout(invalidateTimer);\n invalidateTimer = null;\n }\n if (pendingInvalidateEvents.length === 0) return;\n const batch = pendingInvalidateEvents;\n pendingInvalidateEvents = [];\n invalidateForEvents(batch);\n }\n\n function queueInvalidateBatch(events: SyncEvent[]) {\n pendingInvalidateEvents.push(...events);\n if (events.some(isInteractionCriticalSyncEvent)) {\n flushInvalidateBatch();\n return;\n }\n if (invalidateTimer) return;\n invalidateTimer = setTimeout(\n flushInvalidateBatch,\n INVALIDATE_COALESCE_MS,\n );\n }\n\n function hasAppStateEvent(events: SyncEvent[], key: string): boolean {\n return events.some(\n (event) =>\n event.source === \"app-state\" &&\n (event.key === key ||\n event.key === \"*\" ||\n (typeof event.key === \"string\" && event.key.startsWith(`${key}:`))),\n );\n }\n\n function invalidateForEvents(events: SyncEvent[]) {\n const ignore = ignoreSourceRef.current;\n const ownBrowserSource = getBrowserTabId();\n const relevant = events.filter(\n (event) =>\n !(\n event.source === \"action\" &&\n event.requestSource === ownBrowserSource\n ) &&\n (!ignore || event.requestSource !== ignore),\n );\n const suppressedActions = new Set(\n suppressActionInvalidationForRef.current ?? [],\n );\n const isSuppressedActionEvent = (evt: SyncEvent) =>\n evt.source === \"action\" &&\n typeof evt.key === \"string\" &&\n suppressedActions.has(evt.key);\n const nonAwareness = relevant.filter((e) => e.source !== \"awareness\");\n const suppressesWholeBatch =\n nonAwareness.length > 0 &&\n nonAwareness.every((evt) => evt.source === \"action\") &&\n nonAwareness.every(isSuppressedActionEvent);\n\n // Bump per-source change counters. Components that read these via\n // `useChangeVersion(source)` and fold the value into a React Query\n // queryKey get a targeted refetch — no whole-cache invalidate, no\n // request storm. See `use-change-version.ts` for the contract.\n for (const evt of relevant) {\n const src = typeof evt.source === \"string\" ? evt.source : \"\";\n const ver = typeof evt.version === \"number\" ? evt.version : 0;\n if (src && ver > 0) {\n bumpChangeVersion(src, ver);\n if (typeof evt.key === \"string\" && evt.key) {\n bumpChangeVersion(`${src}:${evt.key}`, ver);\n }\n }\n }\n\n // Awareness (cursor/presence) events never change action/extension/\n // app-state query results, but they arrive on every peer keystroke and\n // carry no version (so the freshness filter always passes them). Keep\n // them out of the invalidate block or an idle collaborative doc turns\n // every peer's cursor move into a framework-wide refetch storm; they\n // still reach onEvent below for callers that render presence.\n const invalidating = relevant.filter((e) => e.source !== \"awareness\");\n\n if (invalidating.length > 0 && queryClient) {\n // Sync events describe completed writes. If a matching read is already\n // in flight, let it finish instead of aborting and immediately\n // launching the same request again. Repeated action events otherwise\n // turn a slow endpoint into a cancel/restart loop that never settles.\n const invalidateWithoutCancel = (filters?: {\n queryKey?: string[];\n predicate?: (query: Query) => boolean;\n }) => {\n const needsTrailingRefresh =\n (queryClient.isFetching?.(filters) ?? 0) > 0;\n const completion = queryClient.invalidateQueries(filters, {\n cancelRefetch: false,\n });\n // TanStack Query deliberately leaves an in-flight fetch alone when\n // cancelRefetch is false. Queue one post-settlement invalidation so\n // a write that landed after that read began cannot be cleared as\n // fresh by the older response.\n if (needsTrailingRefresh && completion instanceof Promise) {\n void completion.then(\n () => queryClient.invalidateQueries(filters),\n () => {},\n );\n }\n };\n const hasActionEvent = invalidating.some(\n (evt) => evt.source === \"action\" && !isSuppressedActionEvent(evt),\n );\n if (hasActionEvent) {\n // Action-backed reads share the [\"action\"] prefix. Keep the default\n // refresh targeted to those queries; invalidating every active query\n // makes one agent write fan out across unrelated provider reads,\n // dashboards, and background status checks. Older apps that still\n // need broad compatibility can opt in with a predicate.\n const predicate = actionInvalidatePredicateRef.current;\n invalidateWithoutCancel(\n predicate ? { predicate } : { queryKey: [\"action\"] },\n );\n }\n\n // Framework-level invalidate: a small, fixed list of query-key\n // prefixes the framework's own hooks/components use (action results,\n // extension state, application-state, the agent's `set-url` channel,\n // etc.). Templates' own data queries do NOT live here — they react\n // through `useChangeVersion(source)` in their query keys instead, so\n // a single change event doesn't fan out into \"refetch everything\".\n // Suppressed-action-only batches skip this whole list (their\n // mutations perform their own narrow invalidation) — but events must\n // STILL reach the onEvent forwarding below, so guard, don't return.\n //\n // Invalidation is scoped by source. Data-query prefixes (action,\n // extension, tool) refetch only when the batch carries an event that\n // can actually change action/extension-backed data — action\n // mutations, settings, extension, collab, screen-refresh, etc.\n // `app-state` events (agent/UI navigation, selection, and the\n // set-url/questions command channel) drive their OWN keys below and\n // must NEVER fan out into \"refetch every action query\": an active\n // agent session mirrors navigation + selection into application_state\n // continuously, and the serverless poll path replays those writes\n // back to the originating tab (the DB-scan fallback cannot preserve\n // `requestSource`, so `ignoreSource` can't filter them). Fanning each\n // one into a full `[\"action\"]` refetch turned a normal session into a\n // client fetch storm that exhausted the DB connection pool — which in\n // turn starved run heartbeat writes and surfaced as `stale_run`.\n if (!suppressesWholeBatch) {\n const hasDataChangingEvent = invalidating.some(\n (evt) => evt.source !== \"app-state\",\n );\n if (hasDataChangingEvent) {\n const hasFrameworkPrefixEvent = invalidating.some((evt) =>\n [\"extensions\", \"extension\", \"tool\", \"tools\", \"slots\"].includes(\n evt.source ?? \"\",\n ),\n );\n // The action-specific invalidation above already refreshed\n // [\"action\"]. A mixed action + extension/tool batch still needs\n // the independent framework prefixes, while pure action batches\n // retain their narrow storm-resistant invalidation.\n if (!hasActionEvent) {\n invalidateWithoutCancel({ queryKey: [\"action\"] });\n }\n if (!hasActionEvent || hasFrameworkPrefixEvent) {\n invalidateWithoutCancel({ queryKey: [\"extension\"] });\n invalidateWithoutCancel({ queryKey: [\"extensions\"] });\n invalidateWithoutCancel({ queryKey: [\"extension-slots\"] });\n invalidateWithoutCancel({ queryKey: [\"slot-installs\"] });\n invalidateWithoutCancel({ queryKey: [\"slot-available\"] });\n invalidateWithoutCancel({ queryKey: [\"tool\"] });\n invalidateWithoutCancel({ queryKey: [\"tools\"] });\n }\n }\n if (invalidating.some((evt) => evt.source === \"app-state\")) {\n invalidateWithoutCancel({ queryKey: [\"app-state\"] });\n }\n if (hasAppStateEvent(invalidating, \"navigate\")) {\n invalidateWithoutCancel({ queryKey: [\"navigate-command\"] });\n }\n if (hasAppStateEvent(invalidating, \"show-questions\")) {\n invalidateWithoutCancel({ queryKey: [\"show-questions\"] });\n }\n if (hasAppStateEvent(invalidating, \"__set_url__\")) {\n invalidateWithoutCancel({ queryKey: [\"__set_url__\"] });\n }\n }\n }\n\n // Always forward all events to onEvent — templates can layer surgical\n // logic on top (e.g. ignore their own writes via requestSource, or\n // invalidate inactive queries for a specific source).\n for (const evt of events) {\n onEventRef.current?.(evt);\n }\n }\n\n function onEvents(events: SyncEvent[], version: number | undefined): void {\n const freshEvents = events.filter((event) => {\n const v = typeof event.version === \"number\" ? event.version : 0;\n return v === 0 || v > subscriberVersion;\n });\n\n if (freshEvents.length > 0) {\n queueInvalidateBatch(freshEvents);\n }\n\n const maxEventVersion = freshEvents.reduce(\n (max, event) =>\n Math.max(max, typeof event.version === \"number\" ? event.version : 0),\n 0,\n );\n subscriberVersion = Math.max(\n subscriberVersion,\n version ?? 0,\n maxEventVersion,\n );\n }\n\n const transport = getOrCreateTransport(\n pollUrl,\n sseUrl,\n resolveGatewayBinding(sseUrl),\n );\n transport.add(id, {\n onEvents,\n pauseWhenHidden,\n interval,\n idleInterval,\n fallbackInterval,\n });\n\n return () => {\n if (invalidateTimer) {\n clearTimeout(invalidateTimer);\n // Flush synchronously on unmount so a pending batch isn't silently\n // dropped (e.g. a route change right after an agent edit lands).\n flushInvalidateBatch();\n }\n transport.remove(id);\n // If the registry still holds this transport, and the transport is now\n // empty, evict it so the next mount gets a fresh instance rather than a\n // stopped-but-still-registered one (the registry entry being cleared by\n // releaseTransport is the signal to rebuild state).\n if (!transport[\"subscribers\"].size) {\n releaseTransport(pollUrl, sseUrl);\n }\n };\n }, [\n pollUrl,\n sseUrl,\n queryClient,\n interval,\n idleInterval,\n fallbackInterval,\n pauseWhenHidden,\n ]);\n}\n\n/** @deprecated Use useDbSync instead */\nexport const useFileWatcher = useDbSync;\n\n/**\n * Subscribe to `refresh-screen` events from the agent. Returns an integer\n * that increments every time the agent invokes the framework's `refresh-screen`\n * tool. Apply it as a React `key` on the main content wrapper (the part\n * OUTSIDE the agent chat sidebar) so that region remounts and re-fetches its\n * data while the chat, sidebar, and any other persistent chrome keep their\n * in-flight state.\n *\n * Usage in a template's root:\n *\n * const screenKey = useScreenRefreshKey();\n * return (\n * <AppLayout>\n * <div key={screenKey}>\n * <Outlet />\n * </div>\n * </AppLayout>\n * );\n */\nexport function useScreenRefreshKey(\n options: {\n pollUrl?: string;\n sseUrl?: string | false;\n interval?: number;\n fallbackInterval?: number;\n pauseWhenHidden?: boolean;\n } = {},\n): number {\n const {\n pollUrl = agentNativePath(options.pollUrl ?? \"/_agent-native/poll\"),\n sseUrl = resolveSseUrl(options.sseUrl),\n interval = 2000,\n fallbackInterval = Math.max(\n options.fallbackInterval ?? SSE_FALLBACK_INTERVAL_MS,\n interval,\n ),\n pauseWhenHidden = false,\n } = options;\n const idleInterval =\n options.interval === undefined ? IDLE_POLL_INTERVAL_MS : interval;\n const [key, setKey] = useState(0);\n\n useEffect(() => {\n const id = Symbol(\"useScreenRefreshKey\");\n // Per-subscriber version cursor (same freshness logic as useDbSync).\n let subscriberVersion = 0;\n\n function onEvents(events: SyncEvent[], version: number | undefined): void {\n const freshEvents = events.filter((event) => {\n const v = typeof event.version === \"number\" ? event.version : 0;\n return v === 0 || v > subscriberVersion;\n });\n if (freshEvents.some((e) => e.source === \"screen-refresh\")) {\n setKey((k) => k + 1);\n }\n const maxEventVersion = freshEvents.reduce(\n (max, event) =>\n Math.max(max, typeof event.version === \"number\" ? event.version : 0),\n 0,\n );\n subscriberVersion = Math.max(\n subscriberVersion,\n version ?? 0,\n maxEventVersion,\n );\n }\n\n const transport = getOrCreateTransport(\n pollUrl,\n sseUrl,\n resolveGatewayBinding(sseUrl),\n );\n transport.add(id, {\n onEvents,\n pauseWhenHidden,\n interval,\n idleInterval,\n fallbackInterval,\n });\n\n return () => {\n transport.remove(id);\n if (!transport[\"subscribers\"].size) {\n releaseTransport(pollUrl, sseUrl);\n }\n };\n }, [\n pollUrl,\n sseUrl,\n interval,\n idleInterval,\n fallbackInterval,\n pauseWhenHidden,\n ]);\n\n return key;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"use-db-sync.js","sourceRoot":"","sources":["../../src/client/use-db-sync.ts"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useRef, useState } from \"react\";\n\nimport { ensureDemoModeFetchInterceptor } from \"../demo/fetch-interceptor.js\";\nimport {\n parseHandshakeFrame,\n parseTokenFrame,\n REALTIME_PROTOCOL_VERSION,\n REALTIME_SSE_HANDSHAKE_EVENT,\n REALTIME_SSE_TOKEN_EVENT,\n} from \"../realtime-protocol.js\";\nimport { agentNativePath } from \"./api-path.js\";\nimport { getBrowserTabId } from \"./browser-tab-id.js\";\nimport {\n ensureEmbedAuthFetchInterceptor,\n isEmbedAuthActive,\n} from \"./embed-auth.js\";\nimport { bumpChangeVersion } from \"./use-change-version.js\";\n\ninterface Query {\n queryKey: readonly unknown[];\n}\n\ninterface QueryClient {\n invalidateQueries(\n opts?: {\n queryKey?: string[];\n predicate?: (query: Query) => boolean;\n },\n options?: { cancelRefetch?: boolean },\n ): unknown;\n isFetching?(filters?: {\n queryKey?: string[];\n predicate?: (query: Query) => boolean;\n }): number;\n}\n\nconst POLL_ABORT_MIN_MS = 10_000;\n// SSE delivers changes immediately in the normal path. The poll is a\n// cross-process/serverless safety net, so an idle tab should not bill the host\n// four times per minute forever. Focus and active agent work still poll now.\nconst SSE_FALLBACK_INTERVAL_MS = 60_000;\nconst IDLE_POLL_INTERVAL_MS = 60_000;\nconst HIDDEN_POLL_INTERVAL_MS = 10_000;\nconst POLL_AUTH_FAILURE_COOLDOWN_MS = 60_000;\n/**\n * Max cadence for SSE/poll-driven query invalidation in `useDbSync`. Events\n * that arrive within this window of the first one in a burst are merged into\n * a single `invalidateForEvents` call instead of one call per event — see the\n * `queueInvalidateBatch` comment at the call site.\n */\nconst INVALIDATE_COALESCE_MS = 250;\n\nclass HttpStatusError extends Error {\n status: number;\n\n constructor(status: number) {\n super(\"HTTP \" + status);\n this.status = status;\n }\n}\n\nexport type SyncEvent = {\n version?: number;\n source?: string;\n type?: string;\n key?: string;\n requestSource?: string;\n [k: string]: unknown;\n};\n\ntype PollResponse = {\n version: number;\n events: SyncEvent[];\n};\n\n/** Callback delivered to each transport subscriber for every batch of events. */\ntype EventSubscriber = (\n events: SyncEvent[],\n version: number | undefined,\n) => void;\n\nfunction getPollAbortMs(interval: number): number {\n return Math.max(POLL_ABORT_MIN_MS, interval * 4);\n}\n\nfunction isDocumentHidden(): boolean {\n return (\n typeof document !== \"undefined\" && document.visibilityState === \"hidden\"\n );\n}\n\nfunction resolveSseUrl(sseUrl: string | false | undefined): string | false {\n if (sseUrl === false) return false;\n if (isEmbedAuthActive()) return false;\n return agentNativePath(sseUrl ?? \"/_agent-native/events\");\n}\n\n// --- Hosted Realtime Gateway binding ----------------------------------------\n//\n// When the app is configured for the hosted gateway, the transport connects to\n// the gateway (cross-origin) instead of the Netlify app, carrying a short-lived\n// subscribe token minted from the app's own same-origin endpoint. All of this\n// is gated on a non-null binding — apps without hosted config keep the exact\n// local behavior below.\n\nconst REALTIME_GATEWAY_SSE_PATH = \"/stream\";\nconst REALTIME_GATEWAY_POLL_PATH = \"/poll\";\nconst REALTIME_TOKEN_MINT_PATH = \"/_agent-native/realtime-token\";\n/** Consecutive gateway failures before health-gating back to the local app. */\nconst HOSTED_UNHEALTHY_THRESHOLD = 3;\n\ninterface RealtimeGatewayBinding {\n /** Gateway SSE URL (token appended per connect). */\n sseUrl: string;\n /** Gateway poll URL (token appended per request). */\n pollUrl: string;\n /** Same-origin app endpoint that mints the subscribe token. */\n tokenMintUrl: string;\n}\n\nfunction getRealtimeConfig():\n | { transport?: string; gatewayBaseUrl?: string }\n | undefined {\n if (typeof window === \"undefined\") return undefined;\n return window.__AGENT_NATIVE_CONFIG__?.realtime;\n}\n\n/**\n * Resolve the hosted-gateway binding, or null to stay on the local app. Gated\n * on: SSE enabled (the gateway is push-first), not embed auth (needs the\n * same-origin session to mint), and `transport: \"hosted\"` with a base URL in\n * the impersonal SSR config.\n */\nfunction resolveGatewayBinding(\n localSseUrl: string | false,\n): RealtimeGatewayBinding | null {\n if (localSseUrl === false) return null;\n if (isEmbedAuthActive()) return null;\n const config = getRealtimeConfig();\n if (config?.transport !== \"hosted\") return null;\n const base = config.gatewayBaseUrl?.replace(/\\/+$/, \"\");\n if (!base) return null;\n return {\n sseUrl: `${base}${REALTIME_GATEWAY_SSE_PATH}`,\n pollUrl: `${base}${REALTIME_GATEWAY_POLL_PATH}`,\n tokenMintUrl: agentNativePath(REALTIME_TOKEN_MINT_PATH),\n };\n}\n\n/** ±20% jitter so gateway timeout/deploy-driven reconnects don't stampede. */\nfunction applyReconnectJitter(delay: number): number {\n const jitter = delay * 0.2 * (Math.random() * 2 - 1);\n return Math.max(0, Math.round(delay + jitter));\n}\n\nfunction normalizeEventPayload(payload: unknown): SyncEvent[] {\n if (!payload || typeof payload !== \"object\") return [];\n const record = payload as { type?: unknown; events?: unknown };\n if (record.type === \"batch\" && Array.isArray(record.events)) {\n return record.events.filter(\n (event): event is SyncEvent => !!event && typeof event === \"object\",\n );\n }\n if (Array.isArray(record.events)) {\n return record.events.filter(\n (event): event is SyncEvent => !!event && typeof event === \"object\",\n );\n }\n return [payload as SyncEvent];\n}\n\nfunction isAuthFailure(error: unknown): boolean {\n return (\n !!error &&\n typeof error === \"object\" &&\n \"status\" in error &&\n ((error as { status?: unknown }).status === 401 ||\n (error as { status?: unknown }).status === 403)\n );\n}\n\n/**\n * App-state keys that drive immediate UI navigation/interaction and must\n * never sit behind the invalidation coalesce window (see\n * `isInteractionCriticalSyncEvent`).\n */\nconst INTERACTION_CRITICAL_APP_STATE_KEYS = [\n \"navigate\",\n \"show-questions\",\n \"__set_url__\",\n];\n\n/**\n * True for sync events that drive immediate, agent-initiated UI navigation\n * or interaction rather than passive data invalidation — app-state writes in\n * general (they back `[\"app-state\"]` queries directly), and specifically the\n * `navigate` / `show-questions` / `__set_url__` app-state keys that\n * `invalidateForEvents` special-cases into their own query keys below.\n *\n * `useDbSync` batches ordinary invalidation-driving events (action/collab/db\n * change events) into one flush per `INVALIDATE_COALESCE_MS` so a chatty doc\n * doesn't refetch on every keystroke. That trade-off is wrong for these\n * events: agent-driven navigation, `set-url`, and guided-questions prompts\n * must land as close to instantly as possible, so any batch containing one\n * of these bypasses the coalesce window and flushes immediately instead.\n *\n * Exported as a small pure predicate so this classification is unit-testable\n * independent of the transport/timer plumbing around it.\n */\nexport function isInteractionCriticalSyncEvent(event: SyncEvent): boolean {\n return (\n event.source === \"app-state\" &&\n (event.key === \"*\" ||\n INTERACTION_CRITICAL_APP_STATE_KEYS.some(\n (key) =>\n event.key === key ||\n (typeof event.key === \"string\" && event.key.startsWith(`${key}:`)),\n ))\n );\n}\n\nasync function fetchPollJson<T>(\n pollUrl: string,\n since: number,\n interval: number,\n token?: string,\n): Promise<T> {\n const controller =\n typeof AbortController === \"undefined\" ? null : new AbortController();\n const timeout = controller\n ? setTimeout(() => controller.abort(), getPollAbortMs(interval))\n : null;\n\n // Local path stays exactly `?since=N`; the hosted gateway also carries the\n // subscribe token on the query string (a cross-origin fetch can't set the\n // Authorization header for the SSE sibling either, so both use the query).\n const url = token\n ? `${pollUrl}${pollUrl.includes(\"?\") ? \"&\" : \"?\"}since=${since}&token=${encodeURIComponent(token)}`\n : `${pollUrl}?since=${since}`;\n\n try {\n const res = await fetch(\n url,\n controller ? { signal: controller.signal } : undefined,\n );\n if (!res.ok) throw new HttpStatusError(res.status);\n // Await the json before the finally so a body-stream abort doesn't\n // produce a dangling promise that escapes as an unhandled rejection.\n return await res.json();\n } finally {\n if (timeout) clearTimeout(timeout);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Shared SSE + poll transport\n//\n// One SyncTransport per (pollUrl, sseUrl) pair is held in a module-level\n// registry. Both `useDbSync` and `useScreenRefreshKey` subscribe to it, so a\n// single browser tab opens exactly ONE SSE connection and ONE poll loop\n// regardless of how many hook instances are mounted.\n//\n// Lifecycle: the transport starts when the first subscriber joins and shuts\n// down when the last subscriber leaves. This makes it safe to SSR and to\n// mount/unmount hooks independently.\n// ---------------------------------------------------------------------------\n\ninterface TransportSubscription {\n onEvents: EventSubscriber;\n /**\n * Whether this subscriber wants the transport to pause when the tab is\n * hidden. The transport pauses only when ALL subscribers request it — any\n * subscriber with `pauseWhenHidden: false` keeps the connection alive.\n */\n pauseWhenHidden: boolean;\n /**\n * Requested poll interval in ms. The transport uses the minimum across all\n * subscribers so the most-frequent caller is satisfied.\n */\n interval: number;\n /** Requested poll interval while the tab has no active agent work. */\n idleInterval: number;\n /** Requested fallback interval while SSE is connected. */\n fallbackInterval: number;\n /**\n * Optional: notified when the shared SSE connection opens or closes (also\n * fired once with the current state when the subscriber joins). Lets\n * subscribers with their own fallback loops (e.g. the collab doc poll)\n * relax their cadence while the push path is healthy.\n */\n onSseStateChange?: (\n connected: boolean,\n capabilities?: readonly string[],\n ) => void;\n}\n\nclass SyncTransport {\n private subscribers = new Map<symbol, TransportSubscription>();\n private versionRef = 0;\n private timer: ReturnType<typeof setTimeout> | null = null;\n private stopped = false;\n private inFlight = false;\n private eventSource: EventSource | null = null;\n private sseConnected = false;\n private authFailureUntil = 0;\n private consecutiveFailures = 0;\n private activeChatIds = new Set<string>();\n // Hosted-gateway state. `mode` starts \"hosted\" when a binding is present and\n // flips to \"local\" on health-gate revert; `token` is the current subscribe\n // token (minted from the app, rotated over the stream), never part of any\n // registry key.\n private mode: \"hosted\" | \"local\";\n private token: string | null = null;\n private tokenMintInFlight: Promise<boolean> | null = null;\n private gatewayReconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private capabilities: string[] = [];\n\n constructor(\n private readonly pollUrl: string,\n private readonly sseUrl: string | false,\n private readonly gateway: RealtimeGatewayBinding | null = null,\n ) {\n this.mode = gateway ? \"hosted\" : \"local\";\n }\n\n /** Capabilities advertised by the gateway handshake (e.g. `no-awareness`). */\n getCapabilities(): readonly string[] {\n return this.capabilities;\n }\n\n private get activeSseUrl(): string | false {\n if (this.mode === \"hosted\" && this.gateway) {\n if (!this.token) return this.gateway.sseUrl;\n const base = `${this.gateway.sseUrl}?token=${encodeURIComponent(this.token)}`;\n // Cursor lets the gateway replay the reconnect gap on connect instead of\n // deferring it to the next poll; 0 on first connect means nothing to replay.\n return this.versionRef > 0 ? `${base}&since=${this.versionRef}` : base;\n }\n return this.sseUrl;\n }\n\n private get activePollUrl(): string {\n return this.mode === \"hosted\" && this.gateway\n ? this.gateway.pollUrl\n : this.pollUrl;\n }\n\n /**\n * Mint a subscribe token from the app's same-origin endpoint.\n *\n * Only TERMINAL outcomes health-gate to local: 404 (gateway not provisioned)\n * and 401/403 (not authorized) — retrying those for this tab is pointless.\n * TRANSIENT failures (5xx/429 from a cold Netlify function, network errors)\n * keep the hosted intent and ride the jittered reconnect + unhealthy-threshold\n * path, so a deploy / scale-to-zero blip doesn't permanently abandon the\n * gateway for the tab.\n */\n private mintToken(): Promise<boolean> {\n if (!this.gateway || this.mode !== \"hosted\") return Promise.resolve(false);\n if (this.tokenMintInFlight) return this.tokenMintInFlight;\n const mintUrl = this.gateway.tokenMintUrl;\n this.tokenMintInFlight = (async () => {\n // Bound the mint like fetchPollJson bounds polls: a black-holed request\n // must resolve as a transient failure, not hang tokenMintInFlight forever\n // (poll() awaits this while holding inFlight, so a hung mint would stall\n // the whole transport with no timer pending).\n const controller =\n typeof AbortController === \"undefined\" ? null : new AbortController();\n const timeout = controller\n ? setTimeout(() => controller.abort(), POLL_ABORT_MIN_MS)\n : null;\n try {\n const res = await fetch(mintUrl, {\n credentials: \"same-origin\",\n ...(controller ? { signal: controller.signal } : {}),\n });\n if (res.ok) {\n const data = (await res.json()) as { token?: unknown };\n if (typeof data?.token === \"string\" && data.token) {\n this.token = data.token;\n // Deliberately NOT resetting consecutiveFailures here: minting\n // succeeds via the app origin even when the GATEWAY is down, so a\n // reset would let a mint-ok -> stream-fail loop run forever below\n // the unhealthy threshold. Only real gateway connectivity (stream\n // onopen / poll success) clears the count.\n return true;\n }\n // 2xx without a token is a terminal misconfiguration.\n this.revertToLocal();\n return false;\n }\n if (res.status === 404 || res.status === 401 || res.status === 403) {\n this.revertToLocal();\n return false;\n }\n this.onGatewayTransientFailure();\n return false;\n } catch {\n this.onGatewayTransientFailure();\n return false;\n } finally {\n if (timeout) clearTimeout(timeout);\n this.tokenMintInFlight = null;\n }\n })();\n return this.tokenMintInFlight;\n }\n\n /**\n * A transient gateway failure (mint 5xx/429, network). Keep hosted intent but\n * count toward the unhealthy threshold; revert to local only once it trips.\n */\n private onGatewayTransientFailure(): void {\n this.consecutiveFailures++;\n if (this.consecutiveFailures >= HOSTED_UNHEALTHY_THRESHOLD) {\n this.revertToLocal();\n }\n }\n\n /**\n * Health-gate back to the app's own /poll + /events with the cursor intact\n * (versionRef is untouched), so delivery stays poll-equivalent — never a\n * silent stall.\n */\n private revertToLocal(): void {\n if (this.mode === \"local\") return;\n this.mode = \"local\";\n this.token = null;\n // The local in-process SSE path sends no handshake, so hosted capabilities\n // (e.g. no-awareness) must not survive the fallback — stale caps would keep\n // collab on its fast presence cadence against the local stream. Subscribers\n // are re-notified via the close/connect cycle below.\n this.capabilities = [];\n if (this.gatewayReconnectTimer) {\n clearTimeout(this.gatewayReconnectTimer);\n this.gatewayReconnectTimer = null;\n }\n this.closeEvents();\n if (!this.stopped) {\n this.connectEvents();\n this.schedulePoll();\n }\n }\n\n private scheduleGatewayReconnect(): void {\n if (this.stopped || this.gatewayReconnectTimer) return;\n this.gatewayReconnectTimer = setTimeout(() => {\n this.gatewayReconnectTimer = null;\n if (!this.stopped && !this.eventSource) this.connectEvents();\n }, applyReconnectJitter(1000));\n }\n\n // -------------------------------------------------------------------------\n // Subscriber management\n // -------------------------------------------------------------------------\n\n add(id: symbol, sub: TransportSubscription): void {\n const wasEmpty = this.subscribers.size === 0;\n const wasActive = this.isActive;\n this.subscribers.set(id, sub);\n if (wasEmpty) {\n this.stopped = false;\n this.start();\n } else if (!wasActive && this.isActive) {\n // A collab surface (or other active subscriber) just joined. Catch up\n // immediately rather than waiting out an idle-cadence timer.\n this.pollNow();\n } else {\n this.reschedule();\n }\n sub.onSseStateChange?.(this.sseConnected, this.capabilities);\n }\n\n remove(id: symbol): void {\n this.subscribers.delete(id);\n if (this.subscribers.size === 0) {\n this.teardown();\n } else {\n // Recalculate poll interval in case the leaving subscriber was the\n // fastest caller; reschedule with the updated cadence.\n this.reschedule();\n }\n }\n\n // -------------------------------------------------------------------------\n // Derived settings (aggregate over active subscribers)\n // -------------------------------------------------------------------------\n\n private get effectivePauseWhenHidden(): boolean {\n // Pause only if every subscriber has opted in.\n for (const sub of this.subscribers.values()) {\n if (!sub.pauseWhenHidden) return false;\n }\n return true;\n }\n\n private get effectiveInterval(): number {\n let min = Infinity;\n for (const sub of this.subscribers.values()) {\n if (sub.interval < min) min = sub.interval;\n }\n return isFinite(min) ? min : 2000;\n }\n\n private get effectiveIdleInterval(): number {\n let min = Infinity;\n for (const sub of this.subscribers.values()) {\n if (sub.idleInterval < min) min = sub.idleInterval;\n }\n return isFinite(min) ? min : IDLE_POLL_INTERVAL_MS;\n }\n\n private get isActive(): boolean {\n return this.activeChatIds.size > 0;\n }\n\n private get effectiveFallbackInterval(): number {\n let min = Infinity;\n for (const sub of this.subscribers.values()) {\n if (sub.fallbackInterval < min) min = sub.fallbackInterval;\n }\n return isFinite(min) ? min : SSE_FALLBACK_INTERVAL_MS;\n }\n\n // -------------------------------------------------------------------------\n // Event fan-out\n // -------------------------------------------------------------------------\n\n private fan(events: SyncEvent[], version: number | undefined): void {\n for (const sub of this.subscribers.values()) {\n sub.onEvents(events, version);\n }\n }\n\n private setSseConnected(connected: boolean): void {\n if (this.sseConnected === connected) return;\n this.sseConnected = connected;\n this.notifySseState();\n }\n\n /**\n * Notify subscribers of the current SSE state AND the negotiated gateway\n * capabilities. Called on connect/disconnect and again once the handshake\n * arrives, so a consumer (e.g. collab) can decide — for instance — not to\n * relax its presence cadence on a `no-awareness` hosted stream.\n */\n private notifySseState(): void {\n for (const sub of this.subscribers.values()) {\n sub.onSseStateChange?.(this.sseConnected, this.capabilities);\n }\n }\n\n // -------------------------------------------------------------------------\n // SSE + poll loop (mirrors the original per-hook logic exactly)\n // -------------------------------------------------------------------------\n\n private authFailureDelayMs(): number {\n return Math.max(0, this.authFailureUntil - Date.now());\n }\n\n private schedulePoll(): void {\n if (this.stopped) return;\n if (this.effectivePauseWhenHidden && isDocumentHidden()) return;\n if (this.timer) clearTimeout(this.timer);\n const authDelay = this.authFailureDelayMs();\n if (authDelay > 0) {\n this.timer = setTimeout(() => {\n this.timer = null;\n void this.poll();\n }, authDelay);\n return;\n }\n const visibleBase = this.isActive\n ? this.effectiveInterval\n : this.sseConnected\n ? this.effectiveFallbackInterval\n : this.effectiveIdleInterval;\n const base = isDocumentHidden()\n ? Math.max(visibleBase, HIDDEN_POLL_INTERVAL_MS)\n : visibleBase;\n // Exponential backoff while polls keep failing (500s during a deploy,\n // DNS blips, a struggling DB). Auth failures have their own cooldown\n // above; this covers everything else so a down server isn't hammered at\n // full cadence. Resets on the first successful poll.\n const backoff =\n this.consecutiveFailures > 0\n ? Math.min(base * 2 ** Math.min(this.consecutiveFailures, 5), 300_000)\n : base;\n // Jitter only for gateway-capable transports so reconnect/poll retries\n // don't stampede a gateway deploy; apps with no gateway config keep the\n // exact deterministic cadence.\n const delay = this.gateway ? applyReconnectJitter(backoff) : backoff;\n this.timer = setTimeout(() => {\n this.timer = null;\n void this.poll();\n }, delay);\n }\n\n private reschedule(): void {\n // Only need to act if a timer is already pending; next natural tick will\n // pick up the new effective interval otherwise.\n if (this.timer !== null) {\n clearTimeout(this.timer);\n this.timer = null;\n this.schedulePoll();\n }\n }\n\n private closeEvents(): void {\n if (!this.eventSource) return;\n this.eventSource.close();\n this.eventSource = null;\n this.setSseConnected(false);\n }\n\n private connectEvents(): void {\n if (\n this.stopped ||\n this.eventSource ||\n typeof EventSource === \"undefined\" ||\n (this.effectivePauseWhenHidden && isDocumentHidden())\n ) {\n return;\n }\n\n // Hosted gateway needs a subscribe token before the stream can open.\n // EventSource can't set headers, so the token rides the connect query\n // string (see activeSseUrl). Mint first, then connect.\n if (this.mode === \"hosted\" && this.gateway && !this.token) {\n void this.mintToken().then((ok) => {\n if (this.stopped) return;\n if (ok && !this.eventSource) {\n this.connectEvents();\n } else if (!ok && this.mode === \"hosted\") {\n // Transient mint failure (terminal ones already reverted to local,\n // flipping mode). Without a retry timer nothing would ever reopen\n // SSE — connectEvents is only reachable from focus/visibility/run\n // events — leaving the tab poll-only at the idle cadence.\n this.scheduleGatewayReconnect();\n }\n });\n return;\n }\n\n const url = this.activeSseUrl;\n if (!url) return;\n\n const source = new EventSource(url);\n this.eventSource = source;\n source.onopen = () => {\n this.setSseConnected(true);\n if (this.mode === \"hosted\") {\n // A live gateway stream is the real health signal: clear failure\n // counts accumulated by mint/stream retries. Local mode keeps main's\n // semantics (only a successful poll resets the poll backoff).\n this.consecutiveFailures = 0;\n }\n this.schedulePoll();\n };\n source.onerror = () => {\n // A replaced/closed source can still fire late; ignore it so it can't\n // flip the connected state or tear down the current stream.\n if (this.eventSource !== source) return;\n this.setSseConnected(false);\n if (this.mode === \"hosted\" && this.gateway) {\n // Browser auto-reconnect reuses the URL frozen at construction, so it\n // would replay from a stale `since`. Own the reconnect so the next\n // connect rebuilds activeSseUrl from the current versionRef. CLOSED also\n // refreshes the token (expired/rotated/deploy); CONNECTING keeps it. A\n // successful reconnect resets the count in onopen; a hard-down gateway\n // trips the threshold and health-gates to local.\n if (source.readyState === EventSource.CLOSED) this.token = null;\n this.closeEvents();\n this.onGatewayTransientFailure();\n if (this.mode === \"hosted\") this.scheduleGatewayReconnect();\n return;\n }\n // Local mode: native EventSource reconnect is fine. Drop a CLOSED ref so a\n // later connectEvents() (focus/visibility) can establish a fresh stream.\n if (source.readyState === EventSource.CLOSED) {\n this.eventSource = null;\n }\n this.schedulePoll();\n };\n source.onmessage = (message) => {\n try {\n const payload = JSON.parse(message.data);\n const events = normalizeEventPayload(payload);\n const version =\n typeof payload?.version === \"number\" ? payload.version : undefined;\n this.applyVersion(events, version);\n this.fan(events, version);\n } catch {\n // Ignore malformed SSE frames; polling is the safety net.\n }\n };\n\n if (this.mode === \"hosted\" && this.gateway) {\n // Control frames ride NAMED SSE events so they never reach onmessage /\n // normalizeEventPayload as spurious data events.\n source.addEventListener(REALTIME_SSE_HANDSHAKE_EVENT, (e) => {\n const hs = parseHandshakeFrame((e as MessageEvent).data);\n if (!hs) return;\n if (hs.protocol !== REALTIME_PROTOCOL_VERSION) {\n // Surface an unexpected protocol rather than silently adopting its\n // capabilities; keep the conservative (no advertised capabilities)\n // stance so downstream (collab) does not relax on assumptions.\n console.warn(\n `[agent-native] unsupported realtime protocol ${hs.protocol} (expected ${REALTIME_PROTOCOL_VERSION})`,\n );\n return;\n }\n this.capabilities = hs.capabilities;\n // Re-notify subscribers now that capabilities are known — the initial\n // connected notification fired before the handshake arrived.\n this.notifySseState();\n });\n source.addEventListener(REALTIME_SSE_TOKEN_EVENT, (e) => {\n const frame = parseTokenFrame((e as MessageEvent).data);\n if (!frame?.token) return;\n this.token = frame.token;\n // EventSource can't change a live stream's URL, and its auto-reconnect\n // reuses the original (old-token) URL. Close and reconnect (jittered) so\n // the rotated token is actually used on the next connect.\n this.closeEvents();\n this.scheduleGatewayReconnect();\n });\n }\n }\n\n /**\n * Advance the transport's shared version cursor. Subscribers receive the\n * raw events and decide independently which ones are \"fresh\" relative to\n * their own cursor, but the transport-level cursor ensures the poll\n * `?since=` parameter always advances.\n */\n private applyVersion(events: SyncEvent[], version: number | undefined): void {\n let max = typeof version === \"number\" ? version : 0;\n for (const evt of events) {\n const v = typeof evt.version === \"number\" ? evt.version : 0;\n if (v > max) max = v;\n }\n if (max > this.versionRef) this.versionRef = max;\n }\n\n private async poll(): Promise<void> {\n if (this.stopped || this.inFlight) return;\n this.inFlight = true;\n try {\n if (this.mode === \"hosted\" && this.gateway && !this.token) {\n // No token yet — mint before polling the gateway. A failed mint has\n // already reverted us to local; a scheduled poll will pick it up.\n const ok = await this.mintToken();\n if (!ok || this.stopped) return;\n }\n const data = await fetchPollJson<PollResponse>(\n this.activePollUrl,\n this.versionRef,\n this.effectiveInterval,\n this.mode === \"hosted\" ? (this.token ?? undefined) : undefined,\n );\n if (this.stopped) return;\n this.consecutiveFailures = 0;\n const events = data.events ?? [];\n this.applyVersion(events, data.version);\n this.fan(events, data.version);\n } catch (err) {\n if (this.stopped) return;\n this.consecutiveFailures++;\n if (this.mode === \"hosted\" && this.gateway) {\n // Gateway auth failure → re-mint (expired/rotated token), WITHOUT\n // tripping the poll-401 cooldown. Persistent failures of any kind\n // health-gate back to the local app.\n if (isAuthFailure(err)) {\n this.token = null;\n void this.mintToken();\n }\n if (this.consecutiveFailures >= HOSTED_UNHEALTHY_THRESHOLD) {\n this.revertToLocal();\n }\n } else if (isAuthFailure(err)) {\n this.authFailureUntil = Date.now() + POLL_AUTH_FAILURE_COOLDOWN_MS;\n this.closeEvents();\n }\n // Network error — retried on the next (backed-off) interval.\n } finally {\n this.inFlight = false;\n this.schedulePoll();\n }\n }\n\n private pollNow(): void {\n if (this.effectivePauseWhenHidden && isDocumentHidden()) return;\n if (this.authFailureDelayMs() > 0) {\n this.schedulePoll();\n return;\n }\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n this.connectEvents();\n void this.poll();\n }\n\n private handleVisibilityChange = (): void => {\n if (document.visibilityState === \"visible\") {\n this.connectEvents();\n this.pollNow();\n } else if (this.effectivePauseWhenHidden) {\n this.closeEvents();\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n } else {\n // Keep push connected and the polling safety net alive in backgrounded\n // tabs, but relax an active chat's cadence so hidden work stays current\n // without polling as aggressively as the visible surface.\n this.reschedule();\n }\n };\n\n private handleFocus = (): void => {\n this.pollNow();\n };\n\n private handleChatRunning = (event: Event): void => {\n const detail = (\n event as CustomEvent<{\n isRunning?: unknown;\n running?: unknown;\n tabId?: unknown;\n }>\n ).detail;\n const running =\n typeof detail?.isRunning === \"boolean\"\n ? detail.isRunning\n : typeof detail?.running === \"boolean\"\n ? detail.running\n : null;\n if (running === null) return;\n\n const id =\n typeof detail?.tabId === \"string\" && detail.tabId\n ? detail.tabId\n : \"__default__\";\n const wasActive = this.isActive;\n if (running) this.activeChatIds.add(id);\n else this.activeChatIds.delete(id);\n if (wasActive === this.isActive) return;\n\n if (this.isActive) {\n // Run start is a high-signal indication that cross-process writes are\n // imminent. Catch up now, then stay on the active cadence.\n this.pollNow();\n } else {\n this.reschedule();\n }\n };\n\n private start(): void {\n // Universal browser-local demo-mode presentation redaction. Idempotent and\n // a no-op until the local preference is on. Lives here because every root\n // already mounts useDbSync, so this needs zero per-template wiring.\n ensureEmbedAuthFetchInterceptor();\n ensureDemoModeFetchInterceptor();\n\n if (!this.effectivePauseWhenHidden || !isDocumentHidden()) {\n this.connectEvents();\n void this.poll();\n }\n window.addEventListener(\"focus\", this.handleFocus);\n window.addEventListener(\"agentNative.chatRunning\", this.handleChatRunning);\n document.addEventListener(\"visibilitychange\", this.handleVisibilityChange);\n }\n\n private teardown(): void {\n this.stopped = true;\n this.closeEvents();\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n if (this.gatewayReconnectTimer) {\n clearTimeout(this.gatewayReconnectTimer);\n this.gatewayReconnectTimer = null;\n }\n window.removeEventListener(\"focus\", this.handleFocus);\n window.removeEventListener(\n \"agentNative.chatRunning\",\n this.handleChatRunning,\n );\n document.removeEventListener(\n \"visibilitychange\",\n this.handleVisibilityChange,\n );\n }\n}\n\n/**\n * Registry of active transports keyed by \"<pollUrl>\\0<sseUrl>\".\n * Module-level singleton: survives React render cycles, shared across all\n * hook instances in the same browser tab.\n */\nconst transportRegistry = new Map<string, SyncTransport>();\n\nfunction getOrCreateTransport(\n pollUrl: string,\n sseUrl: string | false,\n gateway: RealtimeGatewayBinding | null = null,\n): SyncTransport {\n // Key on the LOCAL urls only — a transport may flip hosted→local at runtime,\n // and the token must never fragment the registry, so neither is in the key.\n const key = `${pollUrl}\\0${String(sseUrl)}`;\n let transport = transportRegistry.get(key);\n if (!transport) {\n transport = new SyncTransport(pollUrl, sseUrl, gateway);\n transportRegistry.set(key, transport);\n }\n return transport;\n}\n\n/** Remove a transport from the registry once torn down (last subscriber left). */\nfunction releaseTransport(pollUrl: string, sseUrl: string | false): void {\n const key = `${pollUrl}\\0${String(sseUrl)}`;\n // Leave the entry in place: SSE/poll is already stopped inside the class;\n // the next subscriber will re-start it via `add()`. Clearing the map entry\n // prevents any dangling reference from the old SyncTransport instance.\n transportRegistry.delete(key);\n}\n\n// ---------------------------------------------------------------------------\n// Internal test helper — reset transport registry between tests.\n// ---------------------------------------------------------------------------\n/** @internal */\nexport function _resetSyncTransportRegistryForTests(): void {\n transportRegistry.clear();\n}\n\nexport interface SubscribeSyncEventsOptions {\n /** Receives every batch of change events (SSE push or poll). */\n onEvents: (events: SyncEvent[], version: number | undefined) => void;\n /** Notified when the shared SSE connection opens/closes (and once on join). */\n onSseStateChange?: (\n connected: boolean,\n capabilities?: readonly string[],\n ) => void;\n pollUrl?: string;\n sseUrl?: string | false;\n pauseWhenHidden?: boolean;\n /**\n * Poll cadence this subscriber requests from the SHARED poll loop. The\n * transport uses the minimum across subscribers, so the defaults here are\n * deliberately high: subscribing must not speed up the shared poll —\n * useDbSync (mounted by every template root) already sets the pace.\n */\n interval?: number;\n fallbackInterval?: number;\n}\n\n/**\n * Subscribe to the shared SSE + poll transport without the React Query\n * invalidation behavior of `useDbSync`. Use this instead of opening another\n * `EventSource` to `/_agent-native/events` — a browser tab should hold ONE\n * SSE connection no matter how many features listen to it (extra streams eat\n * the per-origin connection budget and starve data fetches, especially on\n * HTTP/1.1 dev servers).\n *\n * Returns an unsubscribe function. Safe to call only in browser contexts.\n */\nexport function subscribeSyncEvents(\n options: SubscribeSyncEventsOptions,\n): () => void {\n const pollUrl = agentNativePath(options.pollUrl ?? \"/_agent-native/poll\");\n const sseUrl = resolveSseUrl(options.sseUrl);\n const transport = getOrCreateTransport(\n pollUrl,\n sseUrl,\n resolveGatewayBinding(sseUrl),\n );\n const id = Symbol(\"subscribeSyncEvents\");\n transport.add(id, {\n onEvents: options.onEvents,\n onSseStateChange: options.onSseStateChange,\n pauseWhenHidden: options.pauseWhenHidden ?? false,\n interval: options.interval ?? 60_000,\n idleInterval: options.interval ?? 60_000,\n fallbackInterval: options.fallbackInterval ?? 60_000,\n });\n return () => {\n transport.remove(id);\n if (!transport[\"subscribers\"].size) {\n releaseTransport(pollUrl, sseUrl);\n }\n };\n}\n\n/**\n * Hook that listens to /_agent-native/events for DB change events and\n * invalidates react-query caches when changes are detected. Falls back to\n * /_agent-native/poll so cross-process/serverless writes still show up.\n *\n * Works in all deployment environments (serverless, edge, long-lived server).\n * SSE is the fast path; polling is the safety net.\n *\n * @param options.queryClient - The react-query QueryClient instance\n * @param options.queryKeys - **Deprecated and ignored.** The hook uses\n * framework-owned fixed prefixes plus per-source change counters instead of\n * caller-supplied key lists. Kept in the type signature for backward\n * compatibility — existing call sites that still pass this option keep\n * working but the value has no effect.\n * @param options.pollUrl - Poll endpoint URL. Default: \"/_agent-native/poll\"\n * @param options.sseUrl - SSE endpoint URL. Default: \"/_agent-native/events\".\n * Pass false to disable SSE and use polling only.\n * @param options.onEvent - Optional callback for each change event\n * @param options.interval - Poll interval in ms. Default: 2000\n * @param options.fallbackInterval - Poll interval while SSE is connected.\n * Default: 60000\n * @param options.pauseWhenHidden - Pause sync while the tab is hidden.\n * Default: false. Hidden tabs keep SSE connected and poll no faster than\n * every 10 seconds while active; idle polling remains at 60 seconds.\n * @param options.ignoreSource - Skip events whose `requestSource` matches this\n * value. Use a per-tab ID so the UI ignores its own writes while still\n * picking up changes from other tabs, agents, and scripts.\n * @param options.actionInvalidatePredicate - Optional filter for the broad\n * compatibility invalidate triggered by `action` events. Use this to keep\n * expensive active queries on explicit-refresh semantics while still letting\n * normal source-versioned queries react through `useChangeVersion`.\n * @param options.suppressActionInvalidationFor - Action names whose sync events\n * should not invalidate all action queries. Use only for high-volume\n * background actions that perform their own narrow client invalidation.\n */\nexport function useDbSync(\n options: {\n queryClient?: QueryClient;\n queryKeys?: string[];\n pollUrl?: string;\n sseUrl?: string | false;\n /** @deprecated Use pollUrl instead */\n eventsUrl?: string;\n onEvent?: (data: any) => void;\n interval?: number;\n fallbackInterval?: number;\n pauseWhenHidden?: boolean;\n ignoreSource?: string;\n actionInvalidatePredicate?: (query: Query) => boolean;\n suppressActionInvalidationFor?: string[];\n } = {},\n): void {\n const {\n queryClient,\n pollUrl = agentNativePath(options.eventsUrl ?? \"/_agent-native/poll\"),\n sseUrl = resolveSseUrl(options.sseUrl),\n interval = 2000,\n fallbackInterval = Math.max(\n options.fallbackInterval ?? SSE_FALLBACK_INTERVAL_MS,\n interval,\n ),\n pauseWhenHidden = false,\n } = options;\n const idleInterval =\n options.interval === undefined ? IDLE_POLL_INTERVAL_MS : interval;\n\n const onEventRef = useRef(options.onEvent);\n onEventRef.current = options.onEvent;\n\n const ignoreSourceRef = useRef(options.ignoreSource);\n ignoreSourceRef.current = options.ignoreSource;\n const actionInvalidatePredicateRef = useRef(\n options.actionInvalidatePredicate,\n );\n actionInvalidatePredicateRef.current = options.actionInvalidatePredicate;\n const suppressActionInvalidationForRef = useRef(\n options.suppressActionInvalidationFor,\n );\n suppressActionInvalidationForRef.current =\n options.suppressActionInvalidationFor;\n\n useEffect(() => {\n const id = Symbol(\"useDbSync\");\n // Per-subscriber version cursor: tracks which events have already been\n // processed by THIS subscriber so stale poll re-deliveries are ignored.\n let subscriberVersion = 0;\n\n // Coalesce bursts of SSE-driven invalidation into at most one flush per\n // INVALIDATE_COALESCE_MS. A chatty doc (many small agent edits, several\n // peers editing at once) can otherwise deliver a handful of `action`/\n // `collab` events within a few hundred ms, each independently calling\n // `queryClient.invalidateQueries` and firing `onEvent` — every one of\n // those touches whatever query subscribers are mounted (e.g. a\n // full-page editor) even though the end state only needs to be\n // refreshed once. Version bookkeeping stays synchronous (below) so\n // freshness filtering for the NEXT batch is unaffected by the delay.\n //\n // This coalesce window is wrong for interaction-critical events (agent\n // navigation, `set-url`, guided questions — see\n // `isInteractionCriticalSyncEvent`): those must reach the UI immediately,\n // not up to INVALIDATE_COALESCE_MS late. So a fresh batch containing one\n // of those flushes synchronously (queued + new events together,\n // canceling any pending timer) instead of joining the coalesce window.\n // Pure invalidation bursts with no interaction-critical members keep the\n // coalesced behavior.\n let pendingInvalidateEvents: SyncEvent[] = [];\n let invalidateTimer: ReturnType<typeof setTimeout> | null = null;\n\n function flushInvalidateBatch() {\n if (invalidateTimer) {\n clearTimeout(invalidateTimer);\n invalidateTimer = null;\n }\n if (pendingInvalidateEvents.length === 0) return;\n const batch = pendingInvalidateEvents;\n pendingInvalidateEvents = [];\n invalidateForEvents(batch);\n }\n\n function queueInvalidateBatch(events: SyncEvent[]) {\n pendingInvalidateEvents.push(...events);\n if (events.some(isInteractionCriticalSyncEvent)) {\n flushInvalidateBatch();\n return;\n }\n if (invalidateTimer) return;\n invalidateTimer = setTimeout(\n flushInvalidateBatch,\n INVALIDATE_COALESCE_MS,\n );\n }\n\n function hasAppStateEvent(events: SyncEvent[], key: string): boolean {\n return events.some(\n (event) =>\n event.source === \"app-state\" &&\n (event.key === key ||\n event.key === \"*\" ||\n (typeof event.key === \"string\" && event.key.startsWith(`${key}:`))),\n );\n }\n\n function invalidateForEvents(events: SyncEvent[]) {\n const ignore = ignoreSourceRef.current;\n const ownBrowserSource = getBrowserTabId();\n const relevant = events.filter(\n (event) =>\n !(\n event.source === \"action\" &&\n event.requestSource === ownBrowserSource\n ) &&\n (!ignore || event.requestSource !== ignore),\n );\n const suppressedActions = new Set(\n suppressActionInvalidationForRef.current ?? [],\n );\n const isSuppressedActionEvent = (evt: SyncEvent) =>\n evt.source === \"action\" &&\n typeof evt.key === \"string\" &&\n suppressedActions.has(evt.key);\n const nonAwareness = relevant.filter((e) => e.source !== \"awareness\");\n const suppressesWholeBatch =\n nonAwareness.length > 0 &&\n nonAwareness.every((evt) => evt.source === \"action\") &&\n nonAwareness.every(isSuppressedActionEvent);\n\n // Bump per-source change counters. Components that read these via\n // `useChangeVersion(source)` and fold the value into a React Query\n // queryKey get a targeted refetch — no whole-cache invalidate, no\n // request storm. See `use-change-version.ts` for the contract.\n for (const evt of relevant) {\n const src = typeof evt.source === \"string\" ? evt.source : \"\";\n const ver = typeof evt.version === \"number\" ? evt.version : 0;\n if (src && ver > 0) {\n bumpChangeVersion(src, ver);\n if (typeof evt.key === \"string\" && evt.key) {\n bumpChangeVersion(`${src}:${evt.key}`, ver);\n }\n }\n }\n\n // Awareness (cursor/presence) events never change action/extension/\n // app-state query results, but they arrive on every peer keystroke and\n // carry no version (so the freshness filter always passes them). Keep\n // them out of the invalidate block or an idle collaborative doc turns\n // every peer's cursor move into a framework-wide refetch storm; they\n // still reach onEvent below for callers that render presence.\n const invalidating = relevant.filter((e) => e.source !== \"awareness\");\n\n if (invalidating.length > 0 && queryClient) {\n // Sync events describe completed writes. If a matching read is already\n // in flight, let it finish instead of aborting and immediately\n // launching the same request again. Repeated action events otherwise\n // turn a slow endpoint into a cancel/restart loop that never settles.\n const invalidateWithoutCancel = (filters?: {\n queryKey?: string[];\n predicate?: (query: Query) => boolean;\n }) => {\n const needsTrailingRefresh =\n (queryClient.isFetching?.(filters) ?? 0) > 0;\n const completion = queryClient.invalidateQueries(filters, {\n cancelRefetch: false,\n });\n // TanStack Query deliberately leaves an in-flight fetch alone when\n // cancelRefetch is false. Queue one post-settlement invalidation so\n // a write that landed after that read began cannot be cleared as\n // fresh by the older response.\n if (needsTrailingRefresh && completion instanceof Promise) {\n void completion.then(\n () => queryClient.invalidateQueries(filters),\n () => {},\n );\n }\n };\n const hasActionEvent = invalidating.some(\n (evt) => evt.source === \"action\" && !isSuppressedActionEvent(evt),\n );\n if (hasActionEvent) {\n // Action-backed reads share the [\"action\"] prefix. Keep the default\n // refresh targeted to those queries; invalidating every active query\n // makes one agent write fan out across unrelated provider reads,\n // dashboards, and background status checks. Older apps that still\n // need broad compatibility can opt in with a predicate.\n const predicate = actionInvalidatePredicateRef.current;\n invalidateWithoutCancel(\n predicate ? { predicate } : { queryKey: [\"action\"] },\n );\n }\n\n // Framework-level invalidate: a small, fixed list of query-key\n // prefixes the framework's own hooks/components use (action results,\n // extension state, application-state, the agent's `set-url` channel,\n // etc.). Templates' own data queries do NOT live here — they react\n // through `useChangeVersion(source)` in their query keys instead, so\n // a single change event doesn't fan out into \"refetch everything\".\n // Suppressed-action-only batches skip this whole list (their\n // mutations perform their own narrow invalidation) — but events must\n // STILL reach the onEvent forwarding below, so guard, don't return.\n //\n // Invalidation is scoped by source. Data-query prefixes (action,\n // extension, tool) refetch only when the batch carries an event that\n // can actually change action/extension-backed data — action\n // mutations, settings, extension, collab, screen-refresh, etc.\n // `app-state` events (agent/UI navigation, selection, and the\n // set-url/questions command channel) drive their OWN keys below and\n // must NEVER fan out into \"refetch every action query\": an active\n // agent session mirrors navigation + selection into application_state\n // continuously, and the serverless poll path replays those writes\n // back to the originating tab (the DB-scan fallback cannot preserve\n // `requestSource`, so `ignoreSource` can't filter them). Fanning each\n // one into a full `[\"action\"]` refetch turned a normal session into a\n // client fetch storm that exhausted the DB connection pool — which in\n // turn starved run heartbeat writes and surfaced as `stale_run`.\n if (!suppressesWholeBatch) {\n const hasDataChangingEvent = invalidating.some(\n (evt) => evt.source !== \"app-state\",\n );\n if (hasDataChangingEvent) {\n const hasFrameworkPrefixEvent = invalidating.some((evt) =>\n [\"extensions\", \"extension\", \"tool\", \"tools\", \"slots\"].includes(\n evt.source ?? \"\",\n ),\n );\n // The action-specific invalidation above already refreshed\n // [\"action\"]. A mixed action + extension/tool batch still needs\n // the independent framework prefixes, while pure action batches\n // retain their narrow storm-resistant invalidation.\n if (!hasActionEvent) {\n invalidateWithoutCancel({ queryKey: [\"action\"] });\n }\n if (!hasActionEvent || hasFrameworkPrefixEvent) {\n invalidateWithoutCancel({ queryKey: [\"extension\"] });\n invalidateWithoutCancel({ queryKey: [\"extensions\"] });\n invalidateWithoutCancel({ queryKey: [\"extension-slots\"] });\n invalidateWithoutCancel({ queryKey: [\"slot-installs\"] });\n invalidateWithoutCancel({ queryKey: [\"slot-available\"] });\n invalidateWithoutCancel({ queryKey: [\"tool\"] });\n invalidateWithoutCancel({ queryKey: [\"tools\"] });\n }\n }\n if (invalidating.some((evt) => evt.source === \"app-state\")) {\n invalidateWithoutCancel({ queryKey: [\"app-state\"] });\n }\n if (hasAppStateEvent(invalidating, \"navigate\")) {\n invalidateWithoutCancel({ queryKey: [\"navigate-command\"] });\n }\n if (hasAppStateEvent(invalidating, \"show-questions\")) {\n invalidateWithoutCancel({ queryKey: [\"show-questions\"] });\n }\n if (hasAppStateEvent(invalidating, \"__set_url__\")) {\n invalidateWithoutCancel({ queryKey: [\"__set_url__\"] });\n }\n }\n }\n\n // Always forward all events to onEvent — templates can layer surgical\n // logic on top (e.g. ignore their own writes via requestSource, or\n // invalidate inactive queries for a specific source).\n for (const evt of events) {\n onEventRef.current?.(evt);\n }\n }\n\n function onEvents(events: SyncEvent[], version: number | undefined): void {\n const freshEvents = events.filter((event) => {\n const v = typeof event.version === \"number\" ? event.version : 0;\n return v === 0 || v > subscriberVersion;\n });\n\n if (freshEvents.length > 0) {\n queueInvalidateBatch(freshEvents);\n }\n\n const maxEventVersion = freshEvents.reduce(\n (max, event) =>\n Math.max(max, typeof event.version === \"number\" ? event.version : 0),\n 0,\n );\n subscriberVersion = Math.max(\n subscriberVersion,\n version ?? 0,\n maxEventVersion,\n );\n }\n\n const transport = getOrCreateTransport(\n pollUrl,\n sseUrl,\n resolveGatewayBinding(sseUrl),\n );\n transport.add(id, {\n onEvents,\n pauseWhenHidden,\n interval,\n idleInterval,\n fallbackInterval,\n });\n\n return () => {\n if (invalidateTimer) {\n clearTimeout(invalidateTimer);\n // Flush synchronously on unmount so a pending batch isn't silently\n // dropped (e.g. a route change right after an agent edit lands).\n flushInvalidateBatch();\n }\n transport.remove(id);\n // If the registry still holds this transport, and the transport is now\n // empty, evict it so the next mount gets a fresh instance rather than a\n // stopped-but-still-registered one (the registry entry being cleared by\n // releaseTransport is the signal to rebuild state).\n if (!transport[\"subscribers\"].size) {\n releaseTransport(pollUrl, sseUrl);\n }\n };\n }, [\n pollUrl,\n sseUrl,\n queryClient,\n interval,\n idleInterval,\n fallbackInterval,\n pauseWhenHidden,\n ]);\n}\n\n/** @deprecated Use useDbSync instead */\nexport const useFileWatcher = useDbSync;\n\n/**\n * Subscribe to `refresh-screen` events from the agent. Returns an integer\n * that increments every time the agent invokes the framework's `refresh-screen`\n * tool. Apply it as a React `key` on the main content wrapper (the part\n * OUTSIDE the agent chat sidebar) so that region remounts and re-fetches its\n * data while the chat, sidebar, and any other persistent chrome keep their\n * in-flight state.\n *\n * Usage in a template's root:\n *\n * const screenKey = useScreenRefreshKey();\n * return (\n * <AppLayout>\n * <div key={screenKey}>\n * <Outlet />\n * </div>\n * </AppLayout>\n * );\n */\nexport function useScreenRefreshKey(\n options: {\n pollUrl?: string;\n sseUrl?: string | false;\n interval?: number;\n fallbackInterval?: number;\n pauseWhenHidden?: boolean;\n } = {},\n): number {\n const {\n pollUrl = agentNativePath(options.pollUrl ?? \"/_agent-native/poll\"),\n sseUrl = resolveSseUrl(options.sseUrl),\n interval = 2000,\n fallbackInterval = Math.max(\n options.fallbackInterval ?? SSE_FALLBACK_INTERVAL_MS,\n interval,\n ),\n pauseWhenHidden = false,\n } = options;\n const idleInterval =\n options.interval === undefined ? IDLE_POLL_INTERVAL_MS : interval;\n const [key, setKey] = useState(0);\n\n useEffect(() => {\n const id = Symbol(\"useScreenRefreshKey\");\n // Per-subscriber version cursor (same freshness logic as useDbSync).\n let subscriberVersion = 0;\n\n function onEvents(events: SyncEvent[], version: number | undefined): void {\n const freshEvents = events.filter((event) => {\n const v = typeof event.version === \"number\" ? event.version : 0;\n return v === 0 || v > subscriberVersion;\n });\n if (freshEvents.some((e) => e.source === \"screen-refresh\")) {\n setKey((k) => k + 1);\n }\n const maxEventVersion = freshEvents.reduce(\n (max, event) =>\n Math.max(max, typeof event.version === \"number\" ? event.version : 0),\n 0,\n );\n subscriberVersion = Math.max(\n subscriberVersion,\n version ?? 0,\n maxEventVersion,\n );\n }\n\n const transport = getOrCreateTransport(\n pollUrl,\n sseUrl,\n resolveGatewayBinding(sseUrl),\n );\n transport.add(id, {\n onEvents,\n pauseWhenHidden,\n interval,\n idleInterval,\n fallbackInterval,\n });\n\n return () => {\n transport.remove(id);\n if (!transport[\"subscribers\"].size) {\n releaseTransport(pollUrl, sseUrl);\n }\n };\n }, [\n pollUrl,\n sseUrl,\n interval,\n idleInterval,\n fallbackInterval,\n pauseWhenHidden,\n ]);\n\n return key;\n}\n"]}
|
|
@@ -62,11 +62,11 @@ export declare const postAwareness: import("h3").EventHandlerWithFetch<import("h
|
|
|
62
62
|
error: string;
|
|
63
63
|
states?: undefined;
|
|
64
64
|
} | {
|
|
65
|
+
error?: undefined;
|
|
65
66
|
states: {
|
|
66
67
|
clientId: number;
|
|
67
68
|
state: string;
|
|
68
69
|
}[];
|
|
69
|
-
error?: undefined;
|
|
70
70
|
}>>;
|
|
71
71
|
/**
|
|
72
72
|
* GET /_agent-native/collab/:docId/users
|
|
@@ -77,10 +77,10 @@ export declare const getActiveUsers: import("h3").EventHandlerWithFetch<import("
|
|
|
77
77
|
error: string;
|
|
78
78
|
users?: undefined;
|
|
79
79
|
} | {
|
|
80
|
+
error?: undefined;
|
|
80
81
|
users: {
|
|
81
82
|
clientId: number;
|
|
82
83
|
lastSeen: number;
|
|
83
84
|
}[];
|
|
84
|
-
error?: undefined;
|
|
85
85
|
}>>;
|
|
86
86
|
//# sourceMappingURL=awareness.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"awareness.d.ts","sourceRoot":"","sources":["../../src/collab/awareness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAgB3C,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAOD,eAAO,MAAM,sBAAsB,EAAG,kBAA2B,CAAC;AAElE,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,EAAE,kBAAkB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,MAAM,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAOD,wBAAgB,mBAAmB,IAAI,YAAY,CAElD;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,cAAc,GAAG,SAAS,GAChC,IAAI,CAON;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,EAClD,KAAK,CAAC,EAAE,cAAc,GACrB,IAAI,CAgBN;AAoBD,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,SAAS,GAAE,MAAmB,GAC7B,IAAI,CAON;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAE1E;AAiBD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAO1E;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,IAAI,CAOnE;AAkCD;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa
|
|
1
|
+
{"version":3,"file":"awareness.d.ts","sourceRoot":"","sources":["../../src/collab/awareness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAgB3C,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAOD,eAAO,MAAM,sBAAsB,EAAG,kBAA2B,CAAC;AAElE,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,EAAE,kBAAkB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,MAAM,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAOD,wBAAgB,mBAAmB,IAAI,YAAY,CAElD;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,cAAc,GAAG,SAAS,GAChC,IAAI,CAON;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,EAClD,KAAK,CAAC,EAAE,cAAc,GACrB,IAAI,CAgBN;AAoBD,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,SAAS,GAAE,MAAmB,GAC7B,IAAI,CAON;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAE1E;AAiBD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAO1E;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,IAAI,CAOnE;AAkCD;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa;;;;;;kBAwDa,MAAM;eAAS,MAAM;;GAoB1D,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,cAAc;;;;;;kBAYM,MAAM;kBAAY,MAAM;;GAMvD,CAAC"}
|
|
@@ -13,8 +13,8 @@
|
|
|
13
13
|
* Body: { json: any, fieldName?: string, type?: "map"|"array", requestSource?: string }
|
|
14
14
|
*/
|
|
15
15
|
export declare const postCollabJson: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
|
|
16
|
-
ok?: undefined;
|
|
17
16
|
error: string;
|
|
17
|
+
ok?: undefined;
|
|
18
18
|
} | {
|
|
19
19
|
error?: undefined;
|
|
20
20
|
ok: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/deploy/build.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/deploy/build.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;GAYG;AA6CH,OAAO,EAML,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,qBAAqB,CAAC;AAI7B,eAAO,MAAM,6BAA6B,UAiBzC,CAAC;AAEF,eAAO,MAAM,mCAAmC,UAiB/C,CAAC;AACF,eAAO,MAAM,8BAA8B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAyFjE,CAAC;AAEF,eAAO,MAAM,sCAAsC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAQzE,CAAC;AAEF,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAWvE;AAED,wBAAgB,0CAA0C,CACxD,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,GACjB,IAAI,CAgBN;AA6BD,eAAO,MAAM,2CAA2C,EAAE,MAAM,CAC9D,MAAM,EACN,MAAM,CAmSP,CAAC;AAEF,MAAM,WAAW,0BAA0B;IACzC,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,UAAU,wBAAwB;IAChC,KAAK,EAAE,6BAA6B,CAAC;IACrC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,6BAA6B,CAAC,CAAC;IACtD,GAAG,EAAE,MAAM,CAAC;CACb;AAED,UAAU,6BAA6B;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,UAAU,6BAA6B;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAwBD,wBAAgB,wCAAwC,CACtD,WAAW,EAAE,MAAM,EAAE,GACpB,MAAM,CAaR;AAgBD,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC,CAAC;AAgBvE,wBAAgB,yCAAyC,CACvD,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,MAAM,EACjB,WAAW,SAAK,GACf,IAAI,CAQN;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,eAAe,EAAE,EACzB,WAAW,EAAE,MAAM,EAAE,EACrB,kBAAkB,GAAE,MAAM,EAAO,EACjC,OAAO,GAAE,gBAAgB,EAAO,EAChC,aAAa,GAAE,oBAAoB,GAAG,IAAW,EACjD,mBAAmB,GAAE,MAAM,EAAO,EAClC,gBAAgB,SAAmC,EACnD,OAAO,GAAE,0BAA+B,GACvC,MAAM,CAmrBR;AA4FD,wBAAgB,8CAA8C,CAC5D,QAAQ,EAAE,wBAAwB,EAClC,QAAQ,SAAmC,GAC1C,MAAM,CAiCR;AAseD,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,CAE9C;AA+GD,wBAAgB,OAAO,CACrB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,iBAAiB,cAAoB,QAoCtC;AAiCD,KAAK,0BAA0B,GAAG,OAAO,GAAG,KAAK,CAAC;AAQlD,wBAAgB,qCAAqC,CACnD,YAAY,GAAE,MAAM,CAAC,QAA2B,EAChD,QAAQ,GAAE,MAAM,CAAC,YAA2B,EAC5C,UAAU,GAAE,0BAA0B,GAAG,IAAgD,GACxF,OAAO,CAOT;AAqED,wBAAgB,gCAAgC,CAC9C,gBAAgB,EAAE,MAAM,EAAE,GACzB,MAAM,GAAG,IAAI,CA8Bf;AAED,wBAAgB,0BAA0B,CACxC,gBAAgB,EAAE,MAAM,EAAE,GACzB,KAAK,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAqCpD;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gCAAgC,IAAI,OAAO,CAK1D;AAED,eAAO,MAAM,0CAA0C,gCACxB,CAAC;AAEhC,wBAAgB,yCAAyC,IAAI,OAAO,CAEnE;AAID;;;;;GAKG;AACH,wBAAgB,yCAAyC,CACvD,UAAU,EAAE,MAAM,GACjB,IAAI,CAkEN;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG;AACH,wBAAgB,2CAA2C,CACzD,UAAU,EAAE,MAAM,GACjB,IAAI,CAgKN;AAED,wBAAgB,oDAAoD,CAClE,UAAU,EAAE,MAAM,GACjB,IAAI,CAoEN;AA8DD;;;;;;GAMG;AACH,wBAAgB,mCAAmC,CACjD,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,MAAM,EAAE,CAyDV;AAED,wBAAgB,sCAAsC,CACpD,UAAU,EAAE,MAAM,GACjB,IAAI,CA8ON;AAED;;;;;GAKG;AACH,wBAAgB,mCAAmC,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAsC5E;AAuED;;;;;;GAMG;AACH,wBAAgB,yCAAyC,CACvD,WAAW,EAAE,MAAM,GAAG,SAAS,GAC9B,IAAI,CAqDN;AA6ID;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,gBAAgB,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,UAAU,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,GAAG,CAAC;IACX,KAAK,EAAE,eAAe,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,yBAAyB,GAC9B,OAAO,CAAC,IAAI,CAAC,CA+Bf;AAkBD;;;;GAIG;AACH,eAAO,MAAM,iCAAiC,YAAI,KAAK,CAAU,CAAC;AAElE;;;;GAIG;AACH,wBAAgB,2BAA2B,IAAI,MAAM,CAQpD;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,MAAM,GACnB,IAAI,GAAG,SAAS,MAAM,EAAE,CAS1B"}
|
package/dist/deploy/build.js
CHANGED
|
@@ -2005,6 +2005,7 @@ export const config = {
|
|
|
2005
2005
|
name: "agent-native server keep warm",
|
|
2006
2006
|
generator: "agent-native build",
|
|
2007
2007
|
schedule: "* * * * *",
|
|
2008
|
+
nodeBundler: "none",
|
|
2008
2009
|
};
|
|
2009
2010
|
`;
|
|
2010
2011
|
fs.writeFileSync(path.join(dest, `${NETLIFY_KEEP_WARM_FUNCTION_NAME}.mjs`), entry);
|