@agent-native/core 0.131.7 → 0.132.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 +123 -0
- package/corpus/core/docs/content/durable-background-runs.mdx +15 -6
- package/corpus/core/docs/design/durable-agent-runs.md +15 -11
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/a2a/activity.ts +127 -10
- package/corpus/core/src/a2a/index.ts +3 -0
- package/corpus/core/src/agent/durable-background.ts +38 -28
- package/corpus/core/src/agent/harness/background.ts +12 -2
- package/corpus/core/src/agent/production-agent.ts +18 -15
- package/corpus/core/src/agent/run-store.ts +45 -3
- package/corpus/core/src/application-state/handlers.ts +45 -0
- package/corpus/core/src/application-state/index.ts +3 -0
- package/corpus/core/src/application-state/store.ts +38 -34
- package/corpus/core/src/audit/redact.ts +104 -18
- package/corpus/core/src/cli/create.ts +115 -16
- package/corpus/core/src/client/AgentPanel.tsx +2 -7
- package/corpus/core/src/client/AssistantChat.tsx +10 -2
- package/corpus/core/src/client/MultiTabAssistantChat.tsx +3 -0
- package/corpus/core/src/client/RunStuckBanner.tsx +29 -6
- package/corpus/core/src/client/agent-chat.ts +4 -9
- package/corpus/core/src/client/application-state.ts +115 -12
- package/corpus/core/src/client/dynamic-suggestions.ts +4 -12
- package/corpus/core/src/client/frame-protocol.ts +5 -1
- package/corpus/core/src/client/guided-questions.tsx +12 -23
- package/corpus/core/src/db/client.ts +148 -28
- package/corpus/core/src/db/create-get-db.ts +39 -6
- package/corpus/core/src/db/runtime-diagnostics.ts +41 -6
- package/corpus/core/src/deploy/build.ts +26 -33
- package/corpus/core/src/feature-flags/store.ts +10 -5
- package/corpus/core/src/integrations/a2a-continuations-store.ts +11 -0
- package/corpus/core/src/integrations/config-store.ts +13 -0
- package/corpus/core/src/integrations/google-docs-poller.ts +26 -2
- package/corpus/core/src/mcp-client/routes.ts +33 -2
- package/corpus/core/src/onboarding/plugin.ts +31 -25
- package/corpus/core/src/org/accept-pending.ts +2 -0
- package/corpus/core/src/org/auto-join-domain.ts +2 -0
- package/corpus/core/src/org/context.ts +35 -10
- package/corpus/core/src/org/handlers.ts +6 -0
- package/corpus/core/src/org/request-org-cache.ts +71 -0
- package/corpus/core/src/resources/store.ts +10 -9
- package/corpus/core/src/scripts/runner.ts +6 -3
- package/corpus/core/src/secrets/storage.ts +97 -5
- package/corpus/core/src/server/action-change.ts +33 -0
- package/corpus/core/src/server/action-routes.ts +11 -9
- package/corpus/core/src/server/agent-teams.ts +10 -2
- package/corpus/core/src/server/better-auth-instance.ts +39 -12
- package/corpus/core/src/server/core-routes-plugin.ts +19 -2
- package/corpus/core/src/server/credential-provider.ts +57 -14
- package/corpus/core/src/server/http-response-telemetry.ts +1 -0
- package/corpus/core/src/server/poll.ts +95 -57
- package/corpus/core/src/server/voice-providers-status.ts +19 -4
- package/corpus/core/src/workspace-files/tool.ts +18 -11
- package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +38 -0
- package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +1 -1
- package/corpus/templates/analytics/actions/ensure-native-v2-dashboards.ts +299 -0
- package/corpus/templates/analytics/actions/list-native-v2-dashboard-templates.ts +34 -0
- package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +82 -0
- package/corpus/templates/analytics/app/components/layout/NewDashboardDialog.tsx +2 -2
- package/corpus/templates/analytics/app/hooks/use-dashboard-chat-context.ts +40 -34
- package/corpus/templates/analytics/app/hooks/use-user-pref.ts +3 -3
- package/corpus/templates/analytics/app/i18n-data.ts +40 -0
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +18 -10
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +14 -0
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +1 -0
- package/corpus/templates/analytics/app/routes/chart.tsx +3 -0
- package/corpus/templates/analytics/changelog/2026-07-30-analytics-dashboards-now-expose-native-funnel-heatmap-callou.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-30-analytics-now-ships-reusable-native-v2-dashboard-manifests-w.md +6 -0
- package/corpus/templates/analytics/server/lib/dashboard-report-render.ts +81 -1
- package/corpus/templates/analytics/server/lib/native-v2-dashboards.ts +457 -0
- package/corpus/templates/analytics/server/lib/report-chart-svg.ts +73 -2
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +1 -1
- package/corpus/templates/analytics/shared/dashboard-funnel.ts +83 -0
- package/corpus/templates/clips/actions/generate-workflow.ts +6 -4
- package/corpus/templates/clips/actions/reconcile-workflow-generation.ts +257 -0
- package/corpus/templates/clips/app/hooks/use-auto-title.ts +166 -4
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +1 -1
- package/corpus/templates/clips/changelog/2026-07-27-stopped-agent-runs-no-longer-leave-generated-workflow-cards-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-30-workflow-generation-now-stops-retrying-after-repeated-failur.md +6 -0
- package/corpus/templates/clips/shared/workflow.ts +5 -0
- package/corpus/templates/content/changelog/2026-07-30-long-running-delegated-requests-now-continue-reliably.md +6 -0
- package/corpus/templates/content/netlify.toml +3 -0
- package/corpus/templates/content/server/plugins/agent-chat.ts +1 -0
- package/corpus/templates/slides/.agents/skills/create-deck/SKILL.md +2 -1
- package/corpus/templates/slides/actions/patch-deck.ts +25 -1
- package/corpus/templates/slides/app/components/deck/DeckCard.tsx +17 -4
- package/corpus/templates/slides/app/components/deck/SlideRenderer.tsx +9 -1
- package/corpus/templates/slides/app/components/layout/Layout.tsx +1 -1
- package/corpus/templates/slides/app/context/DeckContext.tsx +11 -3
- package/corpus/templates/slides/app/lib/sanitize-slide-html.ts +39 -11
- package/corpus/templates/slides/app/pages/Index.tsx +2 -2
- package/corpus/templates/slides/changelog/2026-07-30-slide-previews-keep-their-aspect-ratio-isolate-embedded-styl.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-30-slides-no-longer-lose-decks-while-organization-access-is-loa.md +6 -0
- package/corpus/toolkit/CHANGELOG.md +8 -0
- package/corpus/toolkit/package.json +1 -1
- package/corpus/toolkit/src/composer/runtime-adapters.tsx +16 -11
- package/dist/a2a/activity.d.ts +22 -4
- package/dist/a2a/activity.d.ts.map +1 -1
- package/dist/a2a/activity.js +97 -11
- package/dist/a2a/activity.js.map +1 -1
- package/dist/a2a/index.d.ts +1 -1
- package/dist/a2a/index.d.ts.map +1 -1
- package/dist/a2a/index.js +1 -1
- package/dist/a2a/index.js.map +1 -1
- package/dist/agent/durable-background.d.ts +13 -8
- package/dist/agent/durable-background.d.ts.map +1 -1
- package/dist/agent/durable-background.js +36 -28
- package/dist/agent/durable-background.js.map +1 -1
- package/dist/agent/harness/background.d.ts.map +1 -1
- package/dist/agent/harness/background.js +12 -2
- package/dist/agent/harness/background.js.map +1 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +18 -15
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/run-store.d.ts +2 -0
- package/dist/agent/run-store.d.ts.map +1 -1
- package/dist/agent/run-store.js +44 -3
- package/dist/agent/run-store.js.map +1 -1
- package/dist/application-state/handlers.d.ts +15 -0
- package/dist/application-state/handlers.d.ts.map +1 -1
- package/dist/application-state/handlers.js +42 -2
- package/dist/application-state/handlers.js.map +1 -1
- package/dist/application-state/index.d.ts +2 -2
- package/dist/application-state/index.d.ts.map +1 -1
- package/dist/application-state/index.js +2 -2
- package/dist/application-state/index.js.map +1 -1
- package/dist/application-state/store.d.ts +11 -0
- package/dist/application-state/store.d.ts.map +1 -1
- package/dist/application-state/store.js +37 -40
- package/dist/application-state/store.js.map +1 -1
- package/dist/audit/redact.d.ts +25 -2
- package/dist/audit/redact.d.ts.map +1 -1
- package/dist/audit/redact.js +85 -21
- package/dist/audit/redact.js.map +1 -1
- package/dist/cli/create.d.ts +8 -1
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +98 -16
- package/dist/cli/create.js.map +1 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +2 -7
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +10 -2
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +1 -1
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/RunStuckBanner.d.ts +11 -1
- package/dist/client/RunStuckBanner.d.ts.map +1 -1
- package/dist/client/RunStuckBanner.js +20 -7
- package/dist/client/RunStuckBanner.js.map +1 -1
- package/dist/client/agent-chat.d.ts.map +1 -1
- package/dist/client/agent-chat.js +4 -6
- package/dist/client/agent-chat.js.map +1 -1
- package/dist/client/application-state.d.ts +11 -0
- package/dist/client/application-state.d.ts.map +1 -1
- package/dist/client/application-state.js +87 -9
- package/dist/client/application-state.js.map +1 -1
- package/dist/client/dynamic-suggestions.d.ts.map +1 -1
- package/dist/client/dynamic-suggestions.js +4 -13
- package/dist/client/dynamic-suggestions.js.map +1 -1
- package/dist/client/frame-protocol.d.ts +1 -0
- package/dist/client/frame-protocol.d.ts.map +1 -1
- package/dist/client/frame-protocol.js.map +1 -1
- package/dist/client/guided-questions.d.ts.map +1 -1
- package/dist/client/guided-questions.js +6 -22
- package/dist/client/guided-questions.js.map +1 -1
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/db/client.d.ts +57 -10
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +122 -31
- package/dist/db/client.js.map +1 -1
- package/dist/db/create-get-db.d.ts.map +1 -1
- package/dist/db/create-get-db.js +31 -7
- package/dist/db/create-get-db.js.map +1 -1
- package/dist/db/runtime-diagnostics.d.ts +1 -0
- package/dist/db/runtime-diagnostics.d.ts.map +1 -1
- package/dist/db/runtime-diagnostics.js +31 -6
- package/dist/db/runtime-diagnostics.js.map +1 -1
- package/dist/deploy/build.d.ts +5 -20
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +18 -30
- package/dist/deploy/build.js.map +1 -1
- package/dist/feature-flags/store.d.ts.map +1 -1
- package/dist/feature-flags/store.js +10 -5
- package/dist/feature-flags/store.js.map +1 -1
- package/dist/integrations/a2a-continuations-store.d.ts.map +1 -1
- package/dist/integrations/a2a-continuations-store.js +12 -0
- package/dist/integrations/a2a-continuations-store.js.map +1 -1
- package/dist/integrations/config-store.d.ts +1 -0
- package/dist/integrations/config-store.d.ts.map +1 -1
- package/dist/integrations/config-store.js +11 -0
- package/dist/integrations/config-store.js.map +1 -1
- package/dist/integrations/google-docs-poller.d.ts.map +1 -1
- package/dist/integrations/google-docs-poller.js +19 -2
- package/dist/integrations/google-docs-poller.js.map +1 -1
- package/dist/mcp/screen-memory-stdio.d.ts +7 -7
- package/dist/mcp/screen-memory-stdio.d.ts.map +1 -1
- package/dist/mcp-client/routes.d.ts.map +1 -1
- package/dist/mcp-client/routes.js +30 -2
- package/dist/mcp-client/routes.js.map +1 -1
- package/dist/notifications/routes.d.ts +6 -6
- package/dist/onboarding/plugin.d.ts.map +1 -1
- package/dist/onboarding/plugin.js +12 -8
- package/dist/onboarding/plugin.js.map +1 -1
- package/dist/org/accept-pending.d.ts.map +1 -1
- package/dist/org/accept-pending.js +2 -0
- package/dist/org/accept-pending.js.map +1 -1
- package/dist/org/auto-join-domain.d.ts.map +1 -1
- package/dist/org/auto-join-domain.js +2 -0
- package/dist/org/auto-join-domain.js.map +1 -1
- package/dist/org/context.d.ts.map +1 -1
- package/dist/org/context.js +29 -9
- package/dist/org/context.js.map +1 -1
- package/dist/org/handlers.d.ts.map +1 -1
- package/dist/org/handlers.js +5 -0
- package/dist/org/handlers.js.map +1 -1
- package/dist/org/request-org-cache.d.ts +16 -0
- package/dist/org/request-org-cache.d.ts.map +1 -0
- package/dist/org/request-org-cache.js +62 -0
- package/dist/org/request-org-cache.js.map +1 -0
- package/dist/progress/routes.d.ts +1 -1
- package/dist/resources/handlers.d.ts +1 -1
- package/dist/resources/store.d.ts.map +1 -1
- package/dist/resources/store.js +11 -9
- package/dist/resources/store.js.map +1 -1
- package/dist/scripts/runner.d.ts.map +1 -1
- package/dist/scripts/runner.js +3 -3
- package/dist/scripts/runner.js.map +1 -1
- package/dist/secrets/storage.d.ts.map +1 -1
- package/dist/secrets/storage.js +82 -5
- package/dist/secrets/storage.js.map +1 -1
- package/dist/server/action-change.d.ts +20 -0
- package/dist/server/action-change.d.ts.map +1 -1
- package/dist/server/action-change.js +29 -0
- package/dist/server/action-change.js.map +1 -1
- package/dist/server/action-routes.d.ts.map +1 -1
- package/dist/server/action-routes.js +7 -8
- package/dist/server/action-routes.js.map +1 -1
- package/dist/server/agent-teams.d.ts.map +1 -1
- package/dist/server/agent-teams.js +10 -2
- package/dist/server/agent-teams.js.map +1 -1
- package/dist/server/better-auth-instance.d.ts.map +1 -1
- package/dist/server/better-auth-instance.js +31 -14
- package/dist/server/better-auth-instance.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts +1 -0
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +18 -4
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/credential-provider.d.ts +16 -0
- package/dist/server/credential-provider.d.ts.map +1 -1
- package/dist/server/credential-provider.js +49 -13
- package/dist/server/credential-provider.js.map +1 -1
- package/dist/server/http-response-telemetry.d.ts.map +1 -1
- package/dist/server/http-response-telemetry.js +1 -0
- package/dist/server/http-response-telemetry.js.map +1 -1
- package/dist/server/poll.d.ts +6 -0
- package/dist/server/poll.d.ts.map +1 -1
- package/dist/server/poll.js +84 -47
- package/dist/server/poll.js.map +1 -1
- package/dist/server/realtime-token.d.ts +1 -1
- package/dist/server/voice-providers-status.d.ts.map +1 -1
- package/dist/server/voice-providers-status.js +12 -3
- package/dist/server/voice-providers-status.js.map +1 -1
- package/dist/workspace-files/tool.d.ts.map +1 -1
- package/dist/workspace-files/tool.js +18 -11
- package/dist/workspace-files/tool.js.map +1 -1
- package/docs/content/durable-background-runs.mdx +15 -6
- package/docs/design/durable-agent-runs.md +15 -11
- package/package.json +3 -3
- package/src/a2a/activity.ts +127 -10
- package/src/a2a/index.ts +3 -0
- package/src/agent/durable-background.ts +38 -28
- package/src/agent/harness/background.ts +12 -2
- package/src/agent/production-agent.ts +18 -15
- package/src/agent/run-store.ts +45 -3
- package/src/application-state/handlers.ts +45 -0
- package/src/application-state/index.ts +3 -0
- package/src/application-state/store.ts +38 -34
- package/src/audit/redact.ts +104 -18
- package/src/cli/create.ts +115 -16
- package/src/client/AgentPanel.tsx +2 -7
- package/src/client/AssistantChat.tsx +10 -2
- package/src/client/MultiTabAssistantChat.tsx +3 -0
- package/src/client/RunStuckBanner.tsx +29 -6
- package/src/client/agent-chat.ts +4 -9
- package/src/client/application-state.ts +115 -12
- package/src/client/dynamic-suggestions.ts +4 -12
- package/src/client/frame-protocol.ts +5 -1
- package/src/client/guided-questions.tsx +12 -23
- package/src/db/client.ts +148 -28
- package/src/db/create-get-db.ts +39 -6
- package/src/db/runtime-diagnostics.ts +41 -6
- package/src/deploy/build.ts +26 -33
- package/src/feature-flags/store.ts +10 -5
- package/src/integrations/a2a-continuations-store.ts +11 -0
- package/src/integrations/config-store.ts +13 -0
- package/src/integrations/google-docs-poller.ts +26 -2
- package/src/mcp-client/routes.ts +33 -2
- package/src/onboarding/plugin.ts +31 -25
- package/src/org/accept-pending.ts +2 -0
- package/src/org/auto-join-domain.ts +2 -0
- package/src/org/context.ts +35 -10
- package/src/org/handlers.ts +6 -0
- package/src/org/request-org-cache.ts +71 -0
- package/src/resources/store.ts +10 -9
- package/src/scripts/runner.ts +6 -3
- package/src/secrets/storage.ts +97 -5
- package/src/server/action-change.ts +33 -0
- package/src/server/action-routes.ts +11 -9
- package/src/server/agent-teams.ts +10 -2
- package/src/server/better-auth-instance.ts +39 -12
- package/src/server/core-routes-plugin.ts +19 -2
- package/src/server/credential-provider.ts +57 -14
- package/src/server/http-response-telemetry.ts +1 -0
- package/src/server/poll.ts +95 -57
- package/src/server/voice-providers-status.ts +19 -4
- package/src/workspace-files/tool.ts +18 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-response-telemetry.js","sourceRoot":"","sources":["../../src/server/http-response-telemetry.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\n\nimport {\n getHeader,\n getMethod,\n getResponseStatus,\n setResponseHeader,\n setServerTiming,\n} from \"h3\";\nimport type { H3Event } from \"h3\";\n\nimport {\n claimStartupDatabaseTelemetry,\n createDatabaseRequestTelemetry,\n enterDatabaseRequestTelemetry,\n type DatabaseRequestTelemetry,\n} from \"../db/request-telemetry.js\";\nimport { getDatabaseRuntimeFingerprint } from \"../db/runtime-diagnostics.js\";\nimport { isMcpPublicPath } from \"../mcp/route-paths.js\";\nimport { track } from \"../tracking/index.js\";\nimport { getAppName } from \"./app-name.js\";\n\nconst TELEMETRY_EVENT_NAME = \"http.response\";\nconst REQUEST_ID_HEADER = \"x-agent-native-request-id\";\nconst TRACKING_INGEST_PATHS = new Set([\n \"/track\",\n \"/api/analytics/track\",\n \"/api/events/track\",\n \"/_agent-native/track\",\n]);\nconst PROCESS_STATE_KEY = Symbol.for(\n \"@agent-native/core/http-response-telemetry.process-state\",\n);\ntype ProcessTelemetryState = { requestSequence: number };\ntype GlobalWithProcessTelemetry = typeof globalThis & {\n [PROCESS_STATE_KEY]?: ProcessTelemetryState;\n};\nconst globalRef = globalThis as GlobalWithProcessTelemetry;\nconst processState =\n globalRef[PROCESS_STATE_KEY] ??\n (globalRef[PROCESS_STATE_KEY] = { requestSequence: 0 });\nconst REQUEST_TELEMETRY_KEY = Symbol.for(\n \"@agent-native/core/http-response-telemetry.request\",\n);\nconst installedApps = new WeakSet<object>();\n\ninterface HttpRequestTelemetryState {\n startedAt: number;\n requestId: string;\n processAgeAtStartMs: number;\n requestSequence: number;\n frameworkReadyWaitMs: number;\n db: DatabaseRequestTelemetry;\n startupDb?: DatabaseRequestTelemetry;\n}\n\nfunction envValue(key: string): string | undefined {\n const value = process.env[key]?.trim();\n return value || undefined;\n}\n\nfunction boolEnv(key: string): boolean {\n return [\"1\", \"true\", \"yes\", \"on\"].includes(\n (process.env[key] ?? \"\").trim().toLowerCase(),\n );\n}\n\nfunction sampleRate(): number {\n const raw = envValue(\"AGENT_NATIVE_HTTP_TELEMETRY_SAMPLE_RATE\");\n if (!raw) return 0.1;\n const parsed = Number.parseFloat(raw);\n if (!Number.isFinite(parsed)) return 0.1;\n return Math.max(0, Math.min(1, parsed));\n}\n\nfunction shouldDisableTelemetry(): boolean {\n return boolEnv(\"AGENT_NATIVE_HTTP_TELEMETRY_DISABLED\");\n}\n\nfunction requestPath(event: H3Event): string {\n const raw =\n event.url?.pathname ??\n String(event.node?.req?.url ?? event.path ?? \"/\").split(\"?\")[0] ??\n \"/\";\n return raw || \"/\";\n}\n\nfunction normalizeSegment(segment: string): string {\n if (!segment) return segment;\n if (/^[0-9]+$/.test(segment)) return \":id\";\n if (/^[0-9a-f]{8}-[0-9a-f-]{27}$/i.test(segment)) return \":id\";\n if (\n /^(run|turn|thread|design|screen|file|msg|key|tok)_[a-z0-9_-]+$/i.test(\n segment,\n )\n ) {\n return \":id\";\n }\n if (/^(run|turn)-[0-9]{10,}-[a-z0-9]+$/i.test(segment)) return \":id\";\n if (segment.length > 36 && /^[a-z0-9_-]+$/i.test(segment)) return \":id\";\n return segment;\n}\n\nexport function normalizeHttpTelemetryPath(pathname: string): string {\n const normalized = pathname.startsWith(\"/\") ? pathname : `/${pathname}`;\n return normalized\n .split(\"/\")\n .map((segment, index) => (index === 0 ? \"\" : normalizeSegment(segment)))\n .join(\"/\");\n}\n\nfunction statusClass(statusCode: number): string {\n if (!Number.isFinite(statusCode) || statusCode < 100) return \"unknown\";\n return `${Math.floor(statusCode / 100)}xx`;\n}\n\nfunction routeKind(pathname: string): string {\n if (\n isMcpPublicPath(pathname) ||\n pathname === \"/_agent-native\" ||\n pathname.startsWith(\"/_agent-native/\")\n ) {\n return \"framework\";\n }\n if (pathname === \"/api\" || pathname.startsWith(\"/api/\")) return \"api\";\n if (pathname.startsWith(\"/.well-known/\")) return \"well-known\";\n return \"app\";\n}\n\nfunction hostForEvent(event: H3Event): string | undefined {\n return (\n getHeader(event, \"x-forwarded-host\") ??\n getHeader(event, \"host\") ??\n undefined\n );\n}\n\nfunction organizationForHost(host: string | undefined): string | undefined {\n const configured =\n envValue(\"AGENT_NATIVE_ANALYTICS_ORG_NAME\") ??\n envValue(\"AGENT_NATIVE_ORG_NAME\");\n if (configured) return configured;\n const normalized = host?.split(\":\")[0]?.toLowerCase();\n return normalized?.endsWith(\".agent-native.com\") ||\n normalized === \"agent-native.com\"\n ? \"Builder.io\"\n : undefined;\n}\n\nfunction shouldTrack(\n pathname: string,\n statusCode: number,\n state: HttpRequestTelemetryState,\n): boolean {\n if (shouldDisableTelemetry()) return false;\n if (TRACKING_INGEST_PATHS.has(pathname)) return false;\n if (pathname.startsWith(\"/api/analytics/replay\")) return false;\n if (statusCode >= 500) return true;\n if (\n statusCode >= 400 &&\n statusCode < 500 &&\n /(?:^|\\/)_agent-native\\/actions(?:\\/|$)/.test(pathname)\n ) {\n return true;\n }\n if (state.requestSequence === 1) return true;\n if (state.startupDb) return true;\n if (Date.now() - state.startedAt >= 1_000) return true;\n if (state.db.errorCount > 0 || state.db.timeoutCount > 0) {\n return true;\n }\n const rate = sampleRate();\n if (rate <= 0) return false;\n if (rate >= 1) return true;\n return Math.random() < rate;\n}\n\nfunction responseStatusCode(event: H3Event, response?: Response): number {\n const raw =\n response?.status ??\n (event.node?.res as any)?.statusCode ??\n (event.node?.res as any)?.status ??\n getResponseStatus(event) ??\n 200;\n const parsed = Number(raw);\n return Number.isFinite(parsed) ? parsed : 200;\n}\n\nfunction runtimeProvider(): string {\n if (process.env.NETLIFY) return \"netlify\";\n if (process.env.VERCEL) return \"vercel\";\n if (process.env.AWS_LAMBDA_FUNCTION_NAME || process.env.LAMBDA_TASK_ROOT) {\n return \"aws-lambda\";\n }\n if (process.env.CF_PAGES) return \"cloudflare-pages\";\n return \"node\";\n}\n\nfunction emitTelemetry(\n event: H3Event,\n state: HttpRequestTelemetryState,\n response?: Response,\n): void {\n const statusCode = responseStatusCode(event, response);\n const pathname = requestPath(event);\n if (!shouldTrack(pathname, statusCode, state)) return;\n\n try {\n const host = hostForEvent(event);\n const db = getDatabaseRuntimeFingerprint();\n track(TELEMETRY_EVENT_NAME, {\n source: \"server\",\n app: getAppName(),\n template: envValue(\"AGENT_NATIVE_TEMPLATE\") ?? getAppName(),\n organization: organizationForHost(host),\n method: getMethod(event),\n path: normalizeHttpTelemetryPath(pathname),\n route_kind: routeKind(pathname),\n status_code: statusCode,\n status_class: statusClass(statusCode),\n duration_ms: Math.max(0, Date.now() - state.startedAt),\n request_id: state.requestId,\n measurement: \"nitro_request\",\n cold_start: state.requestSequence === 1,\n request_sequence: state.requestSequence,\n process_age_ms: state.processAgeAtStartMs,\n framework_ready_wait_ms: state.frameworkReadyWaitMs,\n runtime_provider: runtimeProvider(),\n function_name: envValue(\"AWS_LAMBDA_FUNCTION_NAME\"),\n function_memory_mb: envValue(\"AWS_LAMBDA_FUNCTION_MEMORY_SIZE\"),\n region: envValue(\"AWS_REGION\") ?? envValue(\"VERCEL_REGION\"),\n host,\n environment: envValue(\"NODE_ENV\"),\n deploy_context: envValue(\"CONTEXT\") ?? envValue(\"VERCEL_ENV\"),\n deploy_id: envValue(\"DEPLOY_ID\") ?? envValue(\"VERCEL_DEPLOYMENT_ID\"),\n commit_ref:\n envValue(\"COMMIT_REF\") ??\n envValue(\"NETLIFY_COMMIT_REF\") ??\n envValue(\"VERCEL_GIT_COMMIT_SHA\") ??\n envValue(\"GIT_COMMIT_SHA\"),\n db_source: db.source,\n db_dialect: db.dialect,\n db_url_hash: db.urlHash,\n db_neon_endpoint: db.neon?.endpointId,\n db_neon_pooled: db.neon?.pooled,\n db_operation_count: state.db.operationCount,\n db_query_count: state.db.queryCount,\n db_connect_count: state.db.connectCount,\n db_retry_count: state.db.retryCount,\n db_error_count: state.db.errorCount,\n db_timeout_count: state.db.timeoutCount,\n db_operation_total_ms: Math.round(state.db.operationTotalMs),\n db_operation_wall_ms: Math.round(state.db.operationWallMs),\n db_query_total_ms: Math.round(state.db.queryTotalMs),\n db_connect_total_ms: Math.round(state.db.connectTotalMs),\n db_slowest_operation_ms: Math.round(state.db.slowestOperationMs),\n startup_db_operation_count: state.startupDb?.operationCount,\n startup_db_query_count: state.startupDb?.queryCount,\n startup_db_connect_count: state.startupDb?.connectCount,\n startup_db_retry_count: state.startupDb?.retryCount,\n startup_db_error_count: state.startupDb?.errorCount,\n startup_db_timeout_count: state.startupDb?.timeoutCount,\n startup_db_operation_total_ms: state.startupDb\n ? Math.round(state.startupDb.operationTotalMs)\n : undefined,\n startup_db_operation_wall_ms: state.startupDb\n ? Math.round(state.startupDb.operationWallMs)\n : undefined,\n startup_db_query_total_ms: state.startupDb\n ? Math.round(state.startupDb.queryTotalMs)\n : undefined,\n startup_db_connect_total_ms: state.startupDb\n ? Math.round(state.startupDb.connectTotalMs)\n : undefined,\n startup_db_slowest_operation_ms: state.startupDb\n ? Math.round(state.startupDb.slowestOperationMs)\n : undefined,\n });\n } catch {\n // Response telemetry is best-effort. Never perturb request handling.\n }\n}\n\nfunction requestTelemetryState(\n event: H3Event,\n): HttpRequestTelemetryState | undefined {\n return (event.context as Record<PropertyKey, unknown> | undefined)?.[\n REQUEST_TELEMETRY_KEY\n ] as HttpRequestTelemetryState | undefined;\n}\n\n/** Return the durable request id while a request is still being handled. */\nexport function getHttpRequestTelemetryId(event: H3Event): string | undefined {\n return requestTelemetryState(event)?.requestId;\n}\n\nfunction appendServerTiming(\n response: Response,\n event: H3Event,\n name: string,\n durationMs: number,\n): void {\n const duration = Math.max(0, Math.round(durationMs));\n try {\n response.headers.append(\"server-timing\", `${name};dur=${duration}`);\n } catch {\n try {\n setServerTiming(event, name, { dur: duration });\n } catch {\n // Some adapters finalize headers eagerly. Tracking still runs.\n }\n }\n}\n\nexport function recordFrameworkReadyWait(\n event: H3Event,\n durationMs: number,\n): void {\n const state = requestTelemetryState(event);\n if (state) {\n state.frameworkReadyWaitMs += Math.max(0, durationMs);\n state.startupDb ??= claimStartupDatabaseTelemetry();\n }\n}\n\nexport function installHttpResponseTelemetryHooks(nitroApp: any): void {\n if (!nitroApp || installedApps.has(nitroApp)) return;\n const hooks = nitroApp.hooks;\n if (!hooks?.hook) return;\n installedApps.add(nitroApp);\n\n hooks.hook(\"request\", (event: H3Event) => {\n const state: HttpRequestTelemetryState = {\n startedAt: Date.now(),\n requestId: randomUUID(),\n processAgeAtStartMs: Math.max(0, Math.round(process.uptime() * 1_000)),\n requestSequence: ++processState.requestSequence,\n frameworkReadyWaitMs: 0,\n db: createDatabaseRequestTelemetry(),\n };\n (event.context as Record<PropertyKey, unknown>)[REQUEST_TELEMETRY_KEY] =\n state;\n enterDatabaseRequestTelemetry(state.db);\n });\n\n hooks.hook(\"response\", (response: Response, event: H3Event) => {\n const state = requestTelemetryState(event);\n if (!state) return;\n\n const durationMs = Math.max(0, Date.now() - state.startedAt);\n try {\n response.headers.set(REQUEST_ID_HEADER, state.requestId);\n } catch {\n try {\n setResponseHeader(event, REQUEST_ID_HEADER, state.requestId);\n } catch {\n // Some adapters finalize headers eagerly. Tracking still has the id.\n }\n }\n appendServerTiming(response, event, \"app\", durationMs);\n if (state.frameworkReadyWaitMs > 0) {\n appendServerTiming(\n response,\n event,\n \"startup\",\n state.frameworkReadyWaitMs,\n );\n }\n if (state.db.operationCount > 0) {\n appendServerTiming(response, event, \"db\", state.db.operationWallMs);\n appendServerTiming(\n response,\n event,\n \"db-connect\",\n state.db.connectTotalMs,\n );\n appendServerTiming(\n response,\n event,\n \"db-slowest\",\n state.db.slowestOperationMs,\n );\n }\n if (state.startupDb && state.startupDb.operationCount > 0) {\n appendServerTiming(\n response,\n event,\n \"startup-db\",\n state.startupDb.operationWallMs,\n );\n appendServerTiming(\n response,\n event,\n \"startup-db-connect\",\n state.startupDb.connectTotalMs,\n );\n }\n\n emitTelemetry(event, state, response);\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"http-response-telemetry.js","sourceRoot":"","sources":["../../src/server/http-response-telemetry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EACL,SAAS,EACT,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,GAChB,MAAM,IAAI,CAAC;AAGZ,OAAO,EACL,6BAA6B,EAC7B,8BAA8B,EAC9B,6BAA6B,GAE9B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,MAAM,oBAAoB,GAAG,eAAe,CAAC;AAC7C,MAAM,iBAAiB,GAAG,2BAA2B,CAAC;AACtD,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC;IACpC,QAAQ;IACR,sBAAsB;IACtB,mBAAmB;IACnB,sBAAsB;CACvB,CAAC,CAAC;AACH,MAAM,iBAAiB,GAAG,MAAM,CAAC,GAAG,CAClC,0DAA0D,CAC3D,CAAC;AAKF,MAAM,SAAS,GAAG,UAAwC,CAAC;AAC3D,MAAM,YAAY,GAChB,SAAS,CAAC,iBAAiB,CAAC;IAC5B,CAAC,SAAS,CAAC,iBAAiB,CAAC,GAAG,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC,CAAC;AAC1D,MAAM,qBAAqB,GAAG,MAAM,CAAC,GAAG,CACtC,oDAAoD,CACrD,CAAC;AACF,MAAM,aAAa,GAAG,IAAI,OAAO,EAAU,CAAC;AAY5C,SAAS,QAAQ,CAAC,GAAW;IAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC;IACvC,OAAO,KAAK,IAAI,SAAS,CAAC;AAC5B,CAAC;AAED,SAAS,OAAO,CAAC,GAAW;IAC1B,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,QAAQ,CACxC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAC9C,CAAC;AACJ,CAAC;AAED,SAAS,UAAU;IACjB,MAAM,GAAG,GAAG,QAAQ,CAAC,yCAAyC,CAAC,CAAC;IAChE,IAAI,CAAC,GAAG;QAAE,OAAO,GAAG,CAAC;IACrB,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,GAAG,CAAC;IACzC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,sBAAsB;IAC7B,OAAO,OAAO,CAAC,sCAAsC,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,MAAM,GAAG,GACP,KAAK,CAAC,GAAG,EAAE,QAAQ;QACnB,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,KAAK,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/D,GAAG,CAAC;IACN,OAAO,GAAG,IAAI,GAAG,CAAC;AACpB,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe;IACvC,IAAI,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC;IAC7B,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,IAAI,8BAA8B,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/D,IACE,iEAAiE,CAAC,IAAI,CACpE,OAAO,CACR,EACD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,oCAAoC,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IACrE,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IACxE,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,QAAgB;IACzD,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC;IACxE,OAAO,UAAU;SACd,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;SACvE,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,SAAS,WAAW,CAAC,UAAkB;IACrC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,GAAG;QAAE,OAAO,SAAS,CAAC;IACvE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC,IAAI,CAAC;AAC7C,CAAC;AAED,SAAS,SAAS,CAAC,QAAgB;IACjC,IACE,eAAe,CAAC,QAAQ,CAAC;QACzB,QAAQ,KAAK,gBAAgB;QAC7B,QAAQ,CAAC,UAAU,CAAC,iBAAiB,CAAC,EACtC,CAAC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IACtE,IAAI,QAAQ,CAAC,UAAU,CAAC,eAAe,CAAC;QAAE,OAAO,YAAY,CAAC;IAC9D,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,CACL,SAAS,CAAC,KAAK,EAAE,kBAAkB,CAAC;QACpC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC;QACxB,SAAS,CACV,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAwB;IACnD,MAAM,UAAU,GACd,QAAQ,CAAC,iCAAiC,CAAC;QAC3C,QAAQ,CAAC,uBAAuB,CAAC,CAAC;IACpC,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC;IAClC,MAAM,UAAU,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;IACtD,OAAO,UAAU,EAAE,QAAQ,CAAC,mBAAmB,CAAC;QAC9C,UAAU,KAAK,kBAAkB;QACjC,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,SAAS,WAAW,CAClB,QAAgB,EAChB,UAAkB,EAClB,KAAgC;IAEhC,IAAI,sBAAsB,EAAE;QAAE,OAAO,KAAK,CAAC;IAC3C,IAAI,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IACtD,IAAI,QAAQ,CAAC,UAAU,CAAC,uBAAuB,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/D,IAAI,UAAU,IAAI,GAAG;QAAE,OAAO,IAAI,CAAC;IACnC,IACE,UAAU,IAAI,GAAG;QACjB,UAAU,GAAG,GAAG;QAChB,wCAAwC,CAAC,IAAI,CAAC,QAAQ,CAAC,EACvD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,KAAK,CAAC,eAAe,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,IAAI,KAAK,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IACjC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK;QAAE,OAAO,IAAI,CAAC;IACvD,IAAI,KAAK,CAAC,EAAE,CAAC,UAAU,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;QACzD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAC1B,IAAI,IAAI,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5B,IAAI,IAAI,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3B,OAAO,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;AAC9B,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc,EAAE,QAAmB;IAC7D,MAAM,GAAG,GACP,QAAQ,EAAE,MAAM;QACf,KAAK,CAAC,IAAI,EAAE,GAAW,EAAE,UAAU;QACnC,KAAK,CAAC,IAAI,EAAE,GAAW,EAAE,MAAM;QAChC,iBAAiB,CAAC,KAAK,CAAC;QACxB,GAAG,CAAC;IACN,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;AAChD,CAAC;AAED,SAAS,eAAe;IACtB,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM;QAAE,OAAO,QAAQ,CAAC;IACxC,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACzE,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ;QAAE,OAAO,kBAAkB,CAAC;IACpD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CACpB,KAAc,EACd,KAAgC,EAChC,QAAmB;IAEnB,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC;QAAE,OAAO;IAEtD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,EAAE,GAAG,6BAA6B,EAAE,CAAC;QAC3C,KAAK,CAAC,oBAAoB,EAAE;YAC1B,MAAM,EAAE,QAAQ;YAChB,GAAG,EAAE,UAAU,EAAE;YACjB,QAAQ,EAAE,QAAQ,CAAC,uBAAuB,CAAC,IAAI,UAAU,EAAE;YAC3D,YAAY,EAAE,mBAAmB,CAAC,IAAI,CAAC;YACvC,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC;YACxB,IAAI,EAAE,0BAA0B,CAAC,QAAQ,CAAC;YAC1C,UAAU,EAAE,SAAS,CAAC,QAAQ,CAAC;YAC/B,WAAW,EAAE,UAAU;YACvB,YAAY,EAAE,WAAW,CAAC,UAAU,CAAC;YACrC,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC;YACtD,UAAU,EAAE,KAAK,CAAC,SAAS;YAC3B,WAAW,EAAE,eAAe;YAC5B,UAAU,EAAE,KAAK,CAAC,eAAe,KAAK,CAAC;YACvC,gBAAgB,EAAE,KAAK,CAAC,eAAe;YACvC,cAAc,EAAE,KAAK,CAAC,mBAAmB;YACzC,uBAAuB,EAAE,KAAK,CAAC,oBAAoB;YACnD,gBAAgB,EAAE,eAAe,EAAE;YACnC,aAAa,EAAE,QAAQ,CAAC,0BAA0B,CAAC;YACnD,kBAAkB,EAAE,QAAQ,CAAC,iCAAiC,CAAC;YAC/D,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,IAAI,QAAQ,CAAC,eAAe,CAAC;YAC3D,IAAI;YACJ,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;YACjC,cAAc,EAAE,QAAQ,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC,YAAY,CAAC;YAC7D,SAAS,EAAE,QAAQ,CAAC,WAAW,CAAC,IAAI,QAAQ,CAAC,sBAAsB,CAAC;YACpE,UAAU,EACR,QAAQ,CAAC,YAAY,CAAC;gBACtB,QAAQ,CAAC,oBAAoB,CAAC;gBAC9B,QAAQ,CAAC,uBAAuB,CAAC;gBACjC,QAAQ,CAAC,gBAAgB,CAAC;YAC5B,SAAS,EAAE,EAAE,CAAC,MAAM;YACpB,UAAU,EAAE,EAAE,CAAC,OAAO;YACtB,WAAW,EAAE,EAAE,CAAC,OAAO;YACvB,gBAAgB,EAAE,EAAE,CAAC,IAAI,EAAE,UAAU;YACrC,cAAc,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM;YAC/B,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc;YAC3C,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,UAAU;YACnC,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY;YACvC,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,UAAU;YACnC,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,UAAU;YACnC,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY;YACvC,qBAAqB,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAAC;YAC5D,oBAAoB,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,eAAe,CAAC;YAC1D,iBAAiB,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC;YACpD,mBAAmB,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,cAAc,CAAC;YACxD,uBAAuB,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAAC;YAChE,0BAA0B,EAAE,KAAK,CAAC,SAAS,EAAE,cAAc;YAC3D,sBAAsB,EAAE,KAAK,CAAC,SAAS,EAAE,UAAU;YACnD,wBAAwB,EAAE,KAAK,CAAC,SAAS,EAAE,YAAY;YACvD,sBAAsB,EAAE,KAAK,CAAC,SAAS,EAAE,UAAU;YACnD,sBAAsB,EAAE,KAAK,CAAC,SAAS,EAAE,UAAU;YACnD,wBAAwB,EAAE,KAAK,CAAC,SAAS,EAAE,YAAY;YACvD,6BAA6B,EAAE,KAAK,CAAC,SAAS;gBAC5C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,gBAAgB,CAAC;gBAC9C,CAAC,CAAC,SAAS;YACb,4BAA4B,EAAE,KAAK,CAAC,SAAS;gBAC3C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,eAAe,CAAC;gBAC7C,CAAC,CAAC,SAAS;YACb,yBAAyB,EAAE,KAAK,CAAC,SAAS;gBACxC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC;gBAC1C,CAAC,CAAC,SAAS;YACb,2BAA2B,EAAE,KAAK,CAAC,SAAS;gBAC1C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC;gBAC5C,CAAC,CAAC,SAAS;YACb,+BAA+B,EAAE,KAAK,CAAC,SAAS;gBAC9C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,kBAAkB,CAAC;gBAChD,CAAC,CAAC,SAAS;SACd,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,qEAAqE;IACvE,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAC5B,KAAc;IAEd,OAAQ,KAAK,CAAC,OAAoD,EAAE,CAClE,qBAAqB,CACmB,CAAC;AAC7C,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,yBAAyB,CAAC,KAAc;IACtD,OAAO,qBAAqB,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;AACjD,CAAC;AAED,SAAS,kBAAkB,CACzB,QAAkB,EAClB,KAAc,EACd,IAAY,EACZ,UAAkB;IAElB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;IACrD,IAAI,CAAC;QACH,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,GAAG,IAAI,QAAQ,QAAQ,EAAE,CAAC,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC;YACH,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,+DAA+D;QACjE,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,KAAc,EACd,UAAkB;IAElB,MAAM,KAAK,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,CAAC,oBAAoB,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QACtD,KAAK,CAAC,SAAS,KAAK,6BAA6B,EAAE,CAAC;IACtD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,QAAa;IAC7D,IAAI,CAAC,QAAQ,IAAI,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO;IACrD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;IAC7B,IAAI,CAAC,KAAK,EAAE,IAAI;QAAE,OAAO;IACzB,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAE5B,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,KAAc,EAAE,EAAE;QACvC,MAAM,KAAK,GAA8B;YACvC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,SAAS,EAAE,UAAU,EAAE;YACvB,mBAAmB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC;YACtE,eAAe,EAAE,EAAE,YAAY,CAAC,eAAe;YAC/C,oBAAoB,EAAE,CAAC;YACvB,EAAE,EAAE,8BAA8B,EAAE;SACrC,CAAC;QACD,KAAK,CAAC,OAAwC,CAAC,qBAAqB,CAAC;YACpE,KAAK,CAAC;QACR,6BAA6B,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,QAAkB,EAAE,KAAc,EAAE,EAAE;QAC5D,MAAM,KAAK,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7D,IAAI,CAAC;YACH,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC;gBACH,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;YAC/D,CAAC;YAAC,MAAM,CAAC;gBACP,qEAAqE;YACvE,CAAC;QACH,CAAC;QACD,kBAAkB,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;QACvD,IAAI,KAAK,CAAC,oBAAoB,GAAG,CAAC,EAAE,CAAC;YACnC,kBAAkB,CAChB,QAAQ,EACR,KAAK,EACL,SAAS,EACT,KAAK,CAAC,oBAAoB,CAC3B,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,EAAE,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;YAChC,kBAAkB,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC;YACvE,kBAAkB,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC;YACpE,kBAAkB,CAChB,QAAQ,EACR,KAAK,EACL,YAAY,EACZ,KAAK,CAAC,EAAE,CAAC,cAAc,CACxB,CAAC;YACF,kBAAkB,CAChB,QAAQ,EACR,KAAK,EACL,YAAY,EACZ,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAC5B,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;YAC1D,kBAAkB,CAChB,QAAQ,EACR,KAAK,EACL,YAAY,EACZ,KAAK,CAAC,SAAS,CAAC,eAAe,CAChC,CAAC;YACF,kBAAkB,CAChB,QAAQ,EACR,KAAK,EACL,oBAAoB,EACpB,KAAK,CAAC,SAAS,CAAC,cAAc,CAC/B,CAAC;QACJ,CAAC;QAED,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { randomUUID } from \"node:crypto\";\n\nimport {\n getHeader,\n getMethod,\n getResponseStatus,\n setResponseHeader,\n setServerTiming,\n} from \"h3\";\nimport type { H3Event } from \"h3\";\n\nimport {\n claimStartupDatabaseTelemetry,\n createDatabaseRequestTelemetry,\n enterDatabaseRequestTelemetry,\n type DatabaseRequestTelemetry,\n} from \"../db/request-telemetry.js\";\nimport { getDatabaseRuntimeFingerprint } from \"../db/runtime-diagnostics.js\";\nimport { isMcpPublicPath } from \"../mcp/route-paths.js\";\nimport { track } from \"../tracking/index.js\";\nimport { getAppName } from \"./app-name.js\";\n\nconst TELEMETRY_EVENT_NAME = \"http.response\";\nconst REQUEST_ID_HEADER = \"x-agent-native-request-id\";\nconst TRACKING_INGEST_PATHS = new Set([\n \"/track\",\n \"/api/analytics/track\",\n \"/api/events/track\",\n \"/_agent-native/track\",\n]);\nconst PROCESS_STATE_KEY = Symbol.for(\n \"@agent-native/core/http-response-telemetry.process-state\",\n);\ntype ProcessTelemetryState = { requestSequence: number };\ntype GlobalWithProcessTelemetry = typeof globalThis & {\n [PROCESS_STATE_KEY]?: ProcessTelemetryState;\n};\nconst globalRef = globalThis as GlobalWithProcessTelemetry;\nconst processState =\n globalRef[PROCESS_STATE_KEY] ??\n (globalRef[PROCESS_STATE_KEY] = { requestSequence: 0 });\nconst REQUEST_TELEMETRY_KEY = Symbol.for(\n \"@agent-native/core/http-response-telemetry.request\",\n);\nconst installedApps = new WeakSet<object>();\n\ninterface HttpRequestTelemetryState {\n startedAt: number;\n requestId: string;\n processAgeAtStartMs: number;\n requestSequence: number;\n frameworkReadyWaitMs: number;\n db: DatabaseRequestTelemetry;\n startupDb?: DatabaseRequestTelemetry;\n}\n\nfunction envValue(key: string): string | undefined {\n const value = process.env[key]?.trim();\n return value || undefined;\n}\n\nfunction boolEnv(key: string): boolean {\n return [\"1\", \"true\", \"yes\", \"on\"].includes(\n (process.env[key] ?? \"\").trim().toLowerCase(),\n );\n}\n\nfunction sampleRate(): number {\n const raw = envValue(\"AGENT_NATIVE_HTTP_TELEMETRY_SAMPLE_RATE\");\n if (!raw) return 0.1;\n const parsed = Number.parseFloat(raw);\n if (!Number.isFinite(parsed)) return 0.1;\n return Math.max(0, Math.min(1, parsed));\n}\n\nfunction shouldDisableTelemetry(): boolean {\n return boolEnv(\"AGENT_NATIVE_HTTP_TELEMETRY_DISABLED\");\n}\n\nfunction requestPath(event: H3Event): string {\n const raw =\n event.url?.pathname ??\n String(event.node?.req?.url ?? event.path ?? \"/\").split(\"?\")[0] ??\n \"/\";\n return raw || \"/\";\n}\n\nfunction normalizeSegment(segment: string): string {\n if (!segment) return segment;\n if (/^[0-9]+$/.test(segment)) return \":id\";\n if (/^[0-9a-f]{8}-[0-9a-f-]{27}$/i.test(segment)) return \":id\";\n if (\n /^(run|turn|thread|design|screen|file|msg|key|tok)_[a-z0-9_-]+$/i.test(\n segment,\n )\n ) {\n return \":id\";\n }\n if (/^(run|turn)-[0-9]{10,}-[a-z0-9]+$/i.test(segment)) return \":id\";\n if (segment.length > 36 && /^[a-z0-9_-]+$/i.test(segment)) return \":id\";\n return segment;\n}\n\nexport function normalizeHttpTelemetryPath(pathname: string): string {\n const normalized = pathname.startsWith(\"/\") ? pathname : `/${pathname}`;\n return normalized\n .split(\"/\")\n .map((segment, index) => (index === 0 ? \"\" : normalizeSegment(segment)))\n .join(\"/\");\n}\n\nfunction statusClass(statusCode: number): string {\n if (!Number.isFinite(statusCode) || statusCode < 100) return \"unknown\";\n return `${Math.floor(statusCode / 100)}xx`;\n}\n\nfunction routeKind(pathname: string): string {\n if (\n isMcpPublicPath(pathname) ||\n pathname === \"/_agent-native\" ||\n pathname.startsWith(\"/_agent-native/\")\n ) {\n return \"framework\";\n }\n if (pathname === \"/api\" || pathname.startsWith(\"/api/\")) return \"api\";\n if (pathname.startsWith(\"/.well-known/\")) return \"well-known\";\n return \"app\";\n}\n\nfunction hostForEvent(event: H3Event): string | undefined {\n return (\n getHeader(event, \"x-forwarded-host\") ??\n getHeader(event, \"host\") ??\n undefined\n );\n}\n\nfunction organizationForHost(host: string | undefined): string | undefined {\n const configured =\n envValue(\"AGENT_NATIVE_ANALYTICS_ORG_NAME\") ??\n envValue(\"AGENT_NATIVE_ORG_NAME\");\n if (configured) return configured;\n const normalized = host?.split(\":\")[0]?.toLowerCase();\n return normalized?.endsWith(\".agent-native.com\") ||\n normalized === \"agent-native.com\"\n ? \"Builder.io\"\n : undefined;\n}\n\nfunction shouldTrack(\n pathname: string,\n statusCode: number,\n state: HttpRequestTelemetryState,\n): boolean {\n if (shouldDisableTelemetry()) return false;\n if (TRACKING_INGEST_PATHS.has(pathname)) return false;\n if (pathname.startsWith(\"/api/analytics/replay\")) return false;\n if (statusCode >= 500) return true;\n if (\n statusCode >= 400 &&\n statusCode < 500 &&\n /(?:^|\\/)_agent-native\\/actions(?:\\/|$)/.test(pathname)\n ) {\n return true;\n }\n if (state.requestSequence === 1) return true;\n if (state.startupDb) return true;\n if (Date.now() - state.startedAt >= 1_000) return true;\n if (state.db.errorCount > 0 || state.db.timeoutCount > 0) {\n return true;\n }\n const rate = sampleRate();\n if (rate <= 0) return false;\n if (rate >= 1) return true;\n return Math.random() < rate;\n}\n\nfunction responseStatusCode(event: H3Event, response?: Response): number {\n const raw =\n response?.status ??\n (event.node?.res as any)?.statusCode ??\n (event.node?.res as any)?.status ??\n getResponseStatus(event) ??\n 200;\n const parsed = Number(raw);\n return Number.isFinite(parsed) ? parsed : 200;\n}\n\nfunction runtimeProvider(): string {\n if (process.env.NETLIFY) return \"netlify\";\n if (process.env.VERCEL) return \"vercel\";\n if (process.env.AWS_LAMBDA_FUNCTION_NAME || process.env.LAMBDA_TASK_ROOT) {\n return \"aws-lambda\";\n }\n if (process.env.CF_PAGES) return \"cloudflare-pages\";\n return \"node\";\n}\n\nfunction emitTelemetry(\n event: H3Event,\n state: HttpRequestTelemetryState,\n response?: Response,\n): void {\n const statusCode = responseStatusCode(event, response);\n const pathname = requestPath(event);\n if (!shouldTrack(pathname, statusCode, state)) return;\n\n try {\n const host = hostForEvent(event);\n const db = getDatabaseRuntimeFingerprint();\n track(TELEMETRY_EVENT_NAME, {\n source: \"server\",\n app: getAppName(),\n template: envValue(\"AGENT_NATIVE_TEMPLATE\") ?? getAppName(),\n organization: organizationForHost(host),\n method: getMethod(event),\n path: normalizeHttpTelemetryPath(pathname),\n route_kind: routeKind(pathname),\n status_code: statusCode,\n status_class: statusClass(statusCode),\n duration_ms: Math.max(0, Date.now() - state.startedAt),\n request_id: state.requestId,\n measurement: \"nitro_request\",\n cold_start: state.requestSequence === 1,\n request_sequence: state.requestSequence,\n process_age_ms: state.processAgeAtStartMs,\n framework_ready_wait_ms: state.frameworkReadyWaitMs,\n runtime_provider: runtimeProvider(),\n function_name: envValue(\"AWS_LAMBDA_FUNCTION_NAME\"),\n function_memory_mb: envValue(\"AWS_LAMBDA_FUNCTION_MEMORY_SIZE\"),\n region: envValue(\"AWS_REGION\") ?? envValue(\"VERCEL_REGION\"),\n host,\n environment: envValue(\"NODE_ENV\"),\n deploy_context: envValue(\"CONTEXT\") ?? envValue(\"VERCEL_ENV\"),\n deploy_id: envValue(\"DEPLOY_ID\") ?? envValue(\"VERCEL_DEPLOYMENT_ID\"),\n commit_ref:\n envValue(\"COMMIT_REF\") ??\n envValue(\"NETLIFY_COMMIT_REF\") ??\n envValue(\"VERCEL_GIT_COMMIT_SHA\") ??\n envValue(\"GIT_COMMIT_SHA\"),\n db_source: db.source,\n db_dialect: db.dialect,\n db_url_hash: db.urlHash,\n db_neon_endpoint: db.neon?.endpointId,\n db_neon_pooled: db.neon?.pooled,\n db_operation_count: state.db.operationCount,\n db_query_count: state.db.queryCount,\n db_connect_count: state.db.connectCount,\n db_retry_count: state.db.retryCount,\n db_error_count: state.db.errorCount,\n db_timeout_count: state.db.timeoutCount,\n db_operation_total_ms: Math.round(state.db.operationTotalMs),\n db_operation_wall_ms: Math.round(state.db.operationWallMs),\n db_query_total_ms: Math.round(state.db.queryTotalMs),\n db_connect_total_ms: Math.round(state.db.connectTotalMs),\n db_slowest_operation_ms: Math.round(state.db.slowestOperationMs),\n startup_db_operation_count: state.startupDb?.operationCount,\n startup_db_query_count: state.startupDb?.queryCount,\n startup_db_connect_count: state.startupDb?.connectCount,\n startup_db_retry_count: state.startupDb?.retryCount,\n startup_db_error_count: state.startupDb?.errorCount,\n startup_db_timeout_count: state.startupDb?.timeoutCount,\n startup_db_operation_total_ms: state.startupDb\n ? Math.round(state.startupDb.operationTotalMs)\n : undefined,\n startup_db_operation_wall_ms: state.startupDb\n ? Math.round(state.startupDb.operationWallMs)\n : undefined,\n startup_db_query_total_ms: state.startupDb\n ? Math.round(state.startupDb.queryTotalMs)\n : undefined,\n startup_db_connect_total_ms: state.startupDb\n ? Math.round(state.startupDb.connectTotalMs)\n : undefined,\n startup_db_slowest_operation_ms: state.startupDb\n ? Math.round(state.startupDb.slowestOperationMs)\n : undefined,\n });\n } catch {\n // Response telemetry is best-effort. Never perturb request handling.\n }\n}\n\nfunction requestTelemetryState(\n event: H3Event,\n): HttpRequestTelemetryState | undefined {\n return (event.context as Record<PropertyKey, unknown> | undefined)?.[\n REQUEST_TELEMETRY_KEY\n ] as HttpRequestTelemetryState | undefined;\n}\n\n/** Return the durable request id while a request is still being handled. */\nexport function getHttpRequestTelemetryId(event: H3Event): string | undefined {\n return requestTelemetryState(event)?.requestId;\n}\n\nfunction appendServerTiming(\n response: Response,\n event: H3Event,\n name: string,\n durationMs: number,\n): void {\n const duration = Math.max(0, Math.round(durationMs));\n try {\n response.headers.append(\"server-timing\", `${name};dur=${duration}`);\n } catch {\n try {\n setServerTiming(event, name, { dur: duration });\n } catch {\n // Some adapters finalize headers eagerly. Tracking still runs.\n }\n }\n}\n\nexport function recordFrameworkReadyWait(\n event: H3Event,\n durationMs: number,\n): void {\n const state = requestTelemetryState(event);\n if (state) {\n state.frameworkReadyWaitMs += Math.max(0, durationMs);\n state.startupDb ??= claimStartupDatabaseTelemetry();\n }\n}\n\nexport function installHttpResponseTelemetryHooks(nitroApp: any): void {\n if (!nitroApp || installedApps.has(nitroApp)) return;\n const hooks = nitroApp.hooks;\n if (!hooks?.hook) return;\n installedApps.add(nitroApp);\n\n hooks.hook(\"request\", (event: H3Event) => {\n const state: HttpRequestTelemetryState = {\n startedAt: Date.now(),\n requestId: randomUUID(),\n processAgeAtStartMs: Math.max(0, Math.round(process.uptime() * 1_000)),\n requestSequence: ++processState.requestSequence,\n frameworkReadyWaitMs: 0,\n db: createDatabaseRequestTelemetry(),\n };\n (event.context as Record<PropertyKey, unknown>)[REQUEST_TELEMETRY_KEY] =\n state;\n enterDatabaseRequestTelemetry(state.db);\n });\n\n hooks.hook(\"response\", (response: Response, event: H3Event) => {\n const state = requestTelemetryState(event);\n if (!state) return;\n\n const durationMs = Math.max(0, Date.now() - state.startedAt);\n try {\n response.headers.set(REQUEST_ID_HEADER, state.requestId);\n } catch {\n try {\n setResponseHeader(event, REQUEST_ID_HEADER, state.requestId);\n } catch {\n // Some adapters finalize headers eagerly. Tracking still has the id.\n }\n }\n appendServerTiming(response, event, \"app\", durationMs);\n if (state.frameworkReadyWaitMs > 0) {\n appendServerTiming(\n response,\n event,\n \"startup\",\n state.frameworkReadyWaitMs,\n );\n }\n if (state.db.operationCount > 0) {\n appendServerTiming(response, event, \"db-ops\", state.db.operationCount);\n appendServerTiming(response, event, \"db\", state.db.operationWallMs);\n appendServerTiming(\n response,\n event,\n \"db-connect\",\n state.db.connectTotalMs,\n );\n appendServerTiming(\n response,\n event,\n \"db-slowest\",\n state.db.slowestOperationMs,\n );\n }\n if (state.startupDb && state.startupDb.operationCount > 0) {\n appendServerTiming(\n response,\n event,\n \"startup-db\",\n state.startupDb.operationWallMs,\n );\n appendServerTiming(\n response,\n event,\n \"startup-db-connect\",\n state.startupDb.connectTotalMs,\n );\n }\n\n emitTelemetry(event, state, response);\n });\n}\n"]}
|
package/dist/server/poll.d.ts
CHANGED
|
@@ -153,6 +153,12 @@ export declare class AppSyncState {
|
|
|
153
153
|
private lastExtensionsUpdatedAt;
|
|
154
154
|
private lastExtensionMarkerTs;
|
|
155
155
|
private lastActionMarkerTs;
|
|
156
|
+
/**
|
|
157
|
+
* Set by the seed when a durable action marker predates this process, so the
|
|
158
|
+
* first `doCheckExternalDbChanges` reads the marker rows even though the
|
|
159
|
+
* MAX(updated_at) probe cannot distinguish that row from the seeded max.
|
|
160
|
+
*/
|
|
161
|
+
private replayActionMarkerOnce;
|
|
156
162
|
/**
|
|
157
163
|
* Tracks the latest updated_at seen on the `__screen_refresh__` key.
|
|
158
164
|
* `screenRefreshInitialized` guards against spurious emits on the first poll
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"poll.d.ts","sourceRoot":"","sources":["../../src/server/poll.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAU3C,OAAO,EAAE,KAAK,MAAM,EAAyB,MAAM,iBAAiB,CAAC;AAUrE,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;AAQD,eAAO,MAAM,mCAAmC,QAAS,CAAC;AAC1D,eAAO,MAAM,iBAAiB,gBAAgB,CAAC;AAiP/C,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG,CAC3B,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,KAClD,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;AAW7B,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;IACrB,+EAA+E;IAC/E,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;IAC3B,0EAA0E;IAC1E,aAAa,CAAC,EAAE,cAAc,CAAC;IAC/B;;;;;;;;;;;OAWG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC;;;;;;;;;;;;;;OAcG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;GAKG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgB;IACrC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IACjD,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAU;IAChD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAU;IAC7C;+EAC2E;IAC3E,OAAO,CAAC,WAAW,CAAoC;IACvD,wEAAwE;IACxE,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,mBAAmB,CAAS;IAKpC,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsB;IAClD,OAAO,CAAC,qBAAqB,CAA+B;IAC5D,OAAO,CAAC,gBAAgB,CAAK;IAE7B;;;;;OAKG;IACH,OAAO,CAAC,aAAa,CAAS;IAE9B,OAAO,CAAC,WAAW,CAAK;IAIxB,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,uBAAuB,CAA8B;IAC7D,OAAO,CAAC,qBAAqB,CAAK;IAClC,OAAO,CAAC,kBAAkB,CAAK;
|
|
1
|
+
{"version":3,"file":"poll.d.ts","sourceRoot":"","sources":["../../src/server/poll.ts"],"names":[],"mappings":"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"}
|
package/dist/server/poll.js
CHANGED
|
@@ -264,6 +264,12 @@ export class AppSyncState {
|
|
|
264
264
|
lastExtensionsUpdatedAt;
|
|
265
265
|
lastExtensionMarkerTs = 0;
|
|
266
266
|
lastActionMarkerTs = 0;
|
|
267
|
+
/**
|
|
268
|
+
* Set by the seed when a durable action marker predates this process, so the
|
|
269
|
+
* first `doCheckExternalDbChanges` reads the marker rows even though the
|
|
270
|
+
* MAX(updated_at) probe cannot distinguish that row from the seeded max.
|
|
271
|
+
*/
|
|
272
|
+
replayActionMarkerOnce = false;
|
|
267
273
|
/**
|
|
268
274
|
* Tracks the latest updated_at seen on the `__screen_refresh__` key.
|
|
269
275
|
* `screenRefreshInitialized` guards against spurious emits on the first poll
|
|
@@ -1017,6 +1023,7 @@ export class AppSyncState {
|
|
|
1017
1023
|
// performed by a separate action process. Do not baseline past an existing
|
|
1018
1024
|
// marker on cold start, or the first poll after the action will miss it.
|
|
1019
1025
|
this.lastActionMarkerTs = 0;
|
|
1026
|
+
this.replayActionMarkerOnce = actionMarkerTs > 0;
|
|
1020
1027
|
this.lastScreenRefreshTs = refreshTs;
|
|
1021
1028
|
this.lastScreenRefreshTsBySession.clear();
|
|
1022
1029
|
for (const row of refreshResult.rows) {
|
|
@@ -1073,20 +1080,45 @@ export class AppSyncState {
|
|
|
1073
1080
|
// concurrently to shave stacked latency; results are still processed in
|
|
1074
1081
|
// the original sequential order, and conditional follow-up queries stay
|
|
1075
1082
|
// sequential within their branch.
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1083
|
+
//
|
|
1084
|
+
// `lastAppStateTs` is maintained as MAX(updated_at) over the whole
|
|
1085
|
+
// `application_state` table (seeded in `seedVersionFromDb`, advanced by
|
|
1086
|
+
// the scan below over every key, not just the ones that emit events).
|
|
1087
|
+
// The application-state row scan and screen/extension marker reads only
|
|
1088
|
+
// report rows strictly newer than a watermark that is itself <=
|
|
1089
|
+
// `lastAppStateTs`, so an unadvanced MAX proves those reads are no-ops.
|
|
1090
|
+
// The action marker keeps its own max probe because its watermark must
|
|
1091
|
+
// remain independent under cross-process clock skew.
|
|
1092
|
+
const [appStateMaxTs, actionMarkerTs, settingsTs, extensionsMaxUpdatedAt,] = await Promise.all([
|
|
1093
|
+
readMaxUpdatedAt(db, "application_state"),
|
|
1081
1094
|
readActionMarkerMaxUpdatedAt(db),
|
|
1082
|
-
db.execute({
|
|
1083
|
-
sql: "SELECT session_id, updated_at, value FROM application_state WHERE key = ?",
|
|
1084
|
-
args: [SCREEN_REFRESH_KEY],
|
|
1085
|
-
}),
|
|
1086
|
-
readExtensionMarkerMaxUpdatedAt(db),
|
|
1087
1095
|
readMaxUpdatedAt(db, "settings"),
|
|
1088
1096
|
readMaxUpdatedAtRaw(db, "tools"),
|
|
1089
1097
|
]);
|
|
1098
|
+
// The seed deliberately rewinds `lastActionMarkerTs` to 0 so a marker
|
|
1099
|
+
// written before this process booted still reaches the first poll. That
|
|
1100
|
+
// replay is invisible to the MAX probe (the row is already counted in the
|
|
1101
|
+
// seeded max), so it gets one forced full read.
|
|
1102
|
+
const replayActionMarker = this.replayActionMarkerOnce;
|
|
1103
|
+
this.replayActionMarkerOnce = false;
|
|
1104
|
+
const appStateChanged = appStateMaxTs > this.lastAppStateTs || replayActionMarker;
|
|
1105
|
+
const [appResult, refreshResult, extensionMarkerTs] = appStateChanged
|
|
1106
|
+
? await Promise.all([
|
|
1107
|
+
db.execute({
|
|
1108
|
+
sql: "SELECT session_id, key, updated_at FROM application_state WHERE updated_at > ? ORDER BY updated_at ASC",
|
|
1109
|
+
args: [this.lastAppStateTs],
|
|
1110
|
+
}),
|
|
1111
|
+
db.execute({
|
|
1112
|
+
sql: "SELECT session_id, updated_at, value FROM application_state WHERE key = ?",
|
|
1113
|
+
args: [SCREEN_REFRESH_KEY],
|
|
1114
|
+
}),
|
|
1115
|
+
readExtensionMarkerMaxUpdatedAt(db),
|
|
1116
|
+
])
|
|
1117
|
+
: [
|
|
1118
|
+
{ rows: [] },
|
|
1119
|
+
null,
|
|
1120
|
+
this.lastExtensionMarkerTs,
|
|
1121
|
+
];
|
|
1090
1122
|
// Check application_state for external writes. Preserve the changed key so
|
|
1091
1123
|
// clients can invalidate one-shot command queries (`navigate`, `__set_url__`)
|
|
1092
1124
|
// only when those command rows actually change; noisy keys such as
|
|
@@ -1130,48 +1162,53 @@ export class AppSyncState {
|
|
|
1130
1162
|
// tool writes to application_state under a well-known key; when its
|
|
1131
1163
|
// updated_at bumps, emit a distinct event so the client invalidates
|
|
1132
1164
|
// all queries (not just the ones matching its default queryKey prefix).
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1165
|
+
// `refreshResult` is null exactly when the MAX probe proved no
|
|
1166
|
+
// application_state row moved, which is also exactly when this block
|
|
1167
|
+
// could not emit anything.
|
|
1168
|
+
if (refreshResult) {
|
|
1169
|
+
const refreshTs = refreshResult.rows.reduce((max, row) => Math.max(max, timestampValue(row.updated_at)), 0);
|
|
1170
|
+
if (!this.screenRefreshInitialized) {
|
|
1171
|
+
this.lastScreenRefreshTs = refreshTs;
|
|
1172
|
+
for (const row of refreshResult.rows) {
|
|
1173
|
+
if (typeof row.session_id === "string") {
|
|
1174
|
+
this.lastScreenRefreshTsBySession.set(row.session_id, timestampValue(row.updated_at));
|
|
1175
|
+
}
|
|
1139
1176
|
}
|
|
1177
|
+
this.screenRefreshInitialized = true;
|
|
1140
1178
|
}
|
|
1141
|
-
this.
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
if (rowTs <= (this.lastScreenRefreshTsBySession.get(owner) ?? 0)) {
|
|
1153
|
-
continue;
|
|
1154
|
-
}
|
|
1155
|
-
let scope;
|
|
1156
|
-
try {
|
|
1157
|
-
const raw = row.value;
|
|
1158
|
-
if (typeof raw === "string") {
|
|
1159
|
-
const parsed = JSON.parse(raw);
|
|
1160
|
-
if (typeof parsed?.scope === "string")
|
|
1161
|
-
scope = parsed.scope;
|
|
1179
|
+
else if (refreshTs > this.lastScreenRefreshTs) {
|
|
1180
|
+
// Emit a per-user event only for the session(s) whose row actually
|
|
1181
|
+
// advanced, scoped with `owner` so canSeeChangeForUser delivers it only
|
|
1182
|
+
// to that user — not every authenticated poller.
|
|
1183
|
+
for (const row of refreshResult.rows) {
|
|
1184
|
+
const owner = typeof row.session_id === "string" ? row.session_id : undefined;
|
|
1185
|
+
if (!owner)
|
|
1186
|
+
continue;
|
|
1187
|
+
const rowTs = timestampValue(row.updated_at);
|
|
1188
|
+
if (rowTs <= (this.lastScreenRefreshTsBySession.get(owner) ?? 0)) {
|
|
1189
|
+
continue;
|
|
1162
1190
|
}
|
|
1191
|
+
let scope;
|
|
1192
|
+
try {
|
|
1193
|
+
const raw = row.value;
|
|
1194
|
+
if (typeof raw === "string") {
|
|
1195
|
+
const parsed = JSON.parse(raw);
|
|
1196
|
+
if (typeof parsed?.scope === "string")
|
|
1197
|
+
scope = parsed.scope;
|
|
1198
|
+
}
|
|
1199
|
+
}
|
|
1200
|
+
catch { }
|
|
1201
|
+
this.recordChange({
|
|
1202
|
+
source: "screen-refresh",
|
|
1203
|
+
type: "change",
|
|
1204
|
+
key: SCREEN_REFRESH_KEY,
|
|
1205
|
+
owner,
|
|
1206
|
+
...(scope ? { scope } : {}),
|
|
1207
|
+
}, { dedupeKey: `screen-refresh|${rowTs}` });
|
|
1208
|
+
this.lastScreenRefreshTsBySession.set(owner, rowTs);
|
|
1163
1209
|
}
|
|
1164
|
-
|
|
1165
|
-
this.recordChange({
|
|
1166
|
-
source: "screen-refresh",
|
|
1167
|
-
type: "change",
|
|
1168
|
-
key: SCREEN_REFRESH_KEY,
|
|
1169
|
-
owner,
|
|
1170
|
-
...(scope ? { scope } : {}),
|
|
1171
|
-
}, { dedupeKey: `screen-refresh|${rowTs}` });
|
|
1172
|
-
this.lastScreenRefreshTsBySession.set(owner, rowTs);
|
|
1210
|
+
this.lastScreenRefreshTs = refreshTs;
|
|
1173
1211
|
}
|
|
1174
|
-
this.lastScreenRefreshTs = refreshTs;
|
|
1175
1212
|
}
|
|
1176
1213
|
// Extension mutations write a durable marker row so delete and hide/unhide
|
|
1177
1214
|
// operations are visible across serverless invocations. Translate those
|