@agent-native/core 0.114.8 → 0.114.10
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 +21 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/agent/engine/ai-sdk-engine.ts +31 -3
- package/corpus/core/src/agent/engine/anthropic-engine.ts +20 -3
- package/corpus/core/src/agent/engine/builder-engine.ts +56 -9
- package/corpus/core/src/agent/engine/first-event-timeout.ts +64 -0
- package/corpus/core/src/client/AssistantChat.tsx +7 -3
- package/corpus/core/src/client/resources/ResourcesPanel.tsx +1 -1
- package/corpus/core/src/integrations/computer-supervision-store.ts +4 -4
- package/corpus/core/src/integrations/pending-tasks-store.ts +1 -1
- package/corpus/core/src/integrations/remote-commands-store.ts +5 -5
- package/corpus/core/src/integrations/remote-devices-store.ts +3 -3
- package/corpus/core/src/integrations/remote-push-store.ts +3 -3
- package/corpus/core/src/observability/traces.ts +38 -1
- package/corpus/core/src/server/action-routes.ts +23 -1
- package/corpus/core/src/server/http-response-telemetry.ts +6 -1
- package/corpus/core/src/templates/workspace-core/.agents/skills/observability/SKILL.md +1 -1
- package/corpus/core/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +1 -1
- package/corpus/templates/analytics/actions/account-deep-dive.ts +41 -6
- package/corpus/templates/analytics/changelog/2026-07-20-account-deep-dives-finish-with-partial-data-when-hubspot-lo.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-20-dashboard-email-reports-now-include-an-image-when-a-single-p.md +6 -0
- package/corpus/templates/analytics/server/lib/dashboard-report.ts +11 -3
- package/corpus/templates/calendar/actions/create-event.ts +5 -0
- package/corpus/templates/calendar/app/components/ThemeToggle.tsx +4 -1
- package/corpus/templates/calendar/app/components/calendar/EventDetailPanel.tsx +0 -1
- package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +309 -421
- package/corpus/templates/calendar/app/components/calendar/InlineEventPickers.tsx +349 -0
- package/corpus/templates/calendar/app/i18n-data.ts +110 -0
- package/corpus/templates/calendar/app/lib/event-form-utils.ts +6 -0
- package/corpus/templates/calendar/app/pages/CalendarView.tsx +3 -0
- package/corpus/templates/calendar/app/root.tsx +4 -2
- package/corpus/templates/calendar/changelog/2026-07-20-events-can-be-updated-inline-with-date-time-timezone-and-rep.md +6 -0
- package/corpus/templates/calendar/changelog/2026-07-20-public-booking-pages-no-longer-hydrate-with-a-theme-mismatch.md +6 -0
- package/corpus/templates/calendar/shared/api.ts +1 -0
- package/corpus/templates/clips/AGENTS.md +7 -0
- package/corpus/templates/clips/actions/create-recording.ts +51 -10
- package/corpus/templates/clips/actions/get-recording-player-data.ts +34 -5
- package/corpus/templates/clips/actions/lib/transcript-preview.ts +48 -0
- package/corpus/templates/clips/actions/list-recordings.ts +15 -4
- package/corpus/templates/clips/actions/regenerate-summary.ts +32 -0
- package/corpus/templates/clips/actions/search-recordings.ts +28 -6
- package/corpus/templates/clips/actions/view-screen.ts +54 -47
- package/corpus/templates/clips/app/components/library/library-grid.tsx +1 -5
- package/corpus/templates/clips/app/components/library/recording-card.tsx +29 -32
- package/corpus/templates/clips/app/components/meetings/quick-ask-sidebar.tsx +13 -0
- package/corpus/templates/clips/changelog/2026-07-20-agent-summaries-use-bounded-transcript-context.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-20-clip-summaries-now-finish-without-sending-a-long-transcript-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-20-clips-agents-only-discover-recordings-you-own-or-have-alread.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-20-hosted-recordings-no-longer-start-with-an-impossible-buffered-upload.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-20-meeting-recordings-now-offer-a-cleaner-transcript-view-with-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-20-shared-clips-can-be-shared-with-limited-access-and-cards-sho.md +6 -0
- package/corpus/templates/clips/desktop/src/hooks/useMeetingTranscription.ts +12 -8
- package/corpus/templates/clips/desktop/src/overlays/pill-logo.tsx +2 -15
- package/corpus/templates/clips/desktop/src/overlays/recording-pill.tsx +107 -340
- package/corpus/templates/clips/desktop/src/styles.css +27 -145
- package/corpus/templates/clips/desktop/src-tauri/src/recording_indicator.rs +6 -7
- package/corpus/templates/clips/server/lib/agent-recording-access.ts +73 -0
- package/corpus/templates/clips/server/plugins/agent-chat.ts +5 -2
- package/corpus/templates/plan/app/lib/plan-local-bridge.ts +18 -0
- package/corpus/templates/plan/app/pages/PlansPage.tsx +10 -11
- package/corpus/templates/plan/changelog/2026-07-20-bridged-local-plans-now-load-comments-from-the-local-workspace.md +6 -0
- package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.js +27 -4
- package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
- package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
- package/dist/agent/engine/anthropic-engine.js +19 -4
- package/dist/agent/engine/anthropic-engine.js.map +1 -1
- package/dist/agent/engine/builder-engine.d.ts.map +1 -1
- package/dist/agent/engine/builder-engine.js +40 -7
- package/dist/agent/engine/builder-engine.js.map +1 -1
- package/dist/agent/engine/first-event-timeout.d.ts +25 -0
- package/dist/agent/engine/first-event-timeout.d.ts.map +1 -0
- package/dist/agent/engine/first-event-timeout.js +49 -0
- package/dist/agent/engine/first-event-timeout.js.map +1 -0
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +7 -3
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/resources/ResourcesPanel.js +1 -1
- package/dist/client/resources/ResourcesPanel.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/file-upload/actions/upload-image.d.ts +1 -1
- package/dist/integrations/computer-supervision-store.js +4 -4
- package/dist/integrations/computer-supervision-store.js.map +1 -1
- package/dist/integrations/pending-tasks-store.js +1 -1
- package/dist/integrations/pending-tasks-store.js.map +1 -1
- package/dist/integrations/remote-commands-store.js +5 -5
- package/dist/integrations/remote-commands-store.js.map +1 -1
- package/dist/integrations/remote-devices-store.js +3 -3
- package/dist/integrations/remote-devices-store.js.map +1 -1
- package/dist/integrations/remote-push-store.js +3 -3
- package/dist/integrations/remote-push-store.js.map +1 -1
- package/dist/notifications/routes.d.ts +1 -1
- package/dist/observability/routes.d.ts +3 -3
- package/dist/observability/traces.d.ts.map +1 -1
- package/dist/observability/traces.js +23 -1
- package/dist/observability/traces.js.map +1 -1
- package/dist/progress/routes.d.ts +1 -1
- package/dist/resources/handlers.d.ts +1 -1
- package/dist/server/action-routes.d.ts.map +1 -1
- package/dist/server/action-routes.js +23 -1
- package/dist/server/action-routes.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/http-response-telemetry.d.ts +2 -0
- package/dist/server/http-response-telemetry.d.ts.map +1 -1
- package/dist/server/http-response-telemetry.js +5 -1
- package/dist/server/http-response-telemetry.js.map +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/templates/workspace-core/.agents/skills/observability/SKILL.md +1 -1
- package/dist/templates/workspace-core/.agents/skills/tracking/SKILL.md +1 -1
- package/package.json +2 -2
- package/src/agent/engine/ai-sdk-engine.ts +31 -3
- package/src/agent/engine/anthropic-engine.ts +20 -3
- package/src/agent/engine/builder-engine.ts +56 -9
- package/src/agent/engine/first-event-timeout.ts +64 -0
- package/src/client/AssistantChat.tsx +7 -3
- package/src/client/resources/ResourcesPanel.tsx +1 -1
- package/src/integrations/computer-supervision-store.ts +4 -4
- package/src/integrations/pending-tasks-store.ts +1 -1
- package/src/integrations/remote-commands-store.ts +5 -5
- package/src/integrations/remote-devices-store.ts +3 -3
- package/src/integrations/remote-push-store.ts +3 -3
- package/src/observability/traces.ts +38 -1
- package/src/server/action-routes.ts +23 -1
- package/src/server/http-response-telemetry.ts +6 -1
- package/src/templates/workspace-core/.agents/skills/observability/SKILL.md +1 -1
- package/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +1 -1
|
@@ -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>)[\n REQUEST_TELEMETRY_KEY\n ] as HttpRequestTelemetryState | undefined;\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,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\", 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"]}
|
|
@@ -32,7 +32,7 @@ await putSetting("observability-config", {
|
|
|
32
32
|
enabled: true,
|
|
33
33
|
capturePrompts: false,
|
|
34
34
|
captureToolArgs: true, // capture action input args
|
|
35
|
-
captureToolResults: false,
|
|
35
|
+
captureToolResults: false, // include failed tool error text on tracked $ai_generation tool call entries
|
|
36
36
|
evalSampleRate: 0.05, // 5% of runs get LLM-as-judge eval
|
|
37
37
|
inferredSentimentEnabled: false,
|
|
38
38
|
inferredSentimentSampleRate: 0,
|
|
@@ -160,7 +160,7 @@ Other framework-level baseline events:
|
|
|
160
160
|
- `signup` from Better Auth user creation, with `auth_provider`, `auth_user_id`, and first-touch referral attribution (`referral_source`, `referrer_user`, `referral_medium`, `referral_campaign`, `utm_*`, `first_touch_path`, `landing_referrer` — see "Referral / viral attribution" above)
|
|
161
161
|
- `builder connect clicked` and `builder connect popup blocked` from browser Connect Builder CTAs
|
|
162
162
|
- `builder connect started`, `builder connect succeeded`, `builder connect failed`, `builder disconnect succeeded`, and `builder disconnect failed` from the Builder connection routes, with LLM connection context when resolvable
|
|
163
|
-
- `$ai_generation` from instrumented agent loops, with PostHog AI Observability fields such as `$ai_trace_id`, `$ai_session_id`, `$ai_model`, `$ai_provider`, `$ai_input_tokens`, `$ai_output_tokens`, `$ai_latency`, `$ai_total_cost_usd`, and mirrored Agent Native query fields such as `run_id`, `thread_id`, `cost_cents_x100`, `duration_ms`, `tool_calls`, and `status`. A bounded `tools` array contains names, start offsets, durations, statuses, and coarse error classes only; interrupted tools and failed runs remain visible, and delegated runs include protocol/task/parent-run/parent-turn correlation. Prompt, tool argument, result, and output content is excluded.
|
|
163
|
+
- `$ai_generation` from instrumented agent loops, with PostHog AI Observability fields such as `$ai_trace_id`, `$ai_session_id`, `$ai_model`, `$ai_provider`, `$ai_input_tokens`, `$ai_output_tokens`, `$ai_latency`, `$ai_total_cost_usd`, and mirrored Agent Native query fields such as `run_id`, `thread_id`, `cost_cents_x100`, `duration_ms`, `tool_calls`, and `status`. A bounded `tools` array contains names, start offsets, durations, statuses, and coarse error classes only; interrupted tools and failed runs remain visible, and delegated runs include protocol/task/parent-run/parent-turn correlation. Prompt, tool argument, result, and output content is excluded unless `captureToolResults` is opted in (see the `observability` skill), in which case each failed tool call also carries a `error_message` string truncated to 500 characters and already scrubbed of bearer tokens, API keys, and key/value secret patterns.
|
|
164
164
|
|
|
165
165
|
For new lifecycle events, call `track()` server-side when the server is the source of truth, and `trackEvent()` client-side only for browser interactions.
|
|
166
166
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-native/core",
|
|
3
|
-
"version": "0.114.
|
|
3
|
+
"version": "0.114.10",
|
|
4
4
|
"description": "Framework for agent-native application development — where AI agents and UI share SQL state, actions, and context",
|
|
5
5
|
"homepage": "https://github.com/BuilderIO/agent-native#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -380,7 +380,7 @@
|
|
|
380
380
|
"y-protocols": "^1.0.7",
|
|
381
381
|
"yjs": "^13.6.31",
|
|
382
382
|
"zod": "^4.3.6",
|
|
383
|
-
"@agent-native/recap-cli": "0.4.
|
|
383
|
+
"@agent-native/recap-cli": "0.4.7",
|
|
384
384
|
"@agent-native/toolkit": "^0.8.2"
|
|
385
385
|
},
|
|
386
386
|
"devDependencies": {
|
|
@@ -23,6 +23,10 @@ import {
|
|
|
23
23
|
supportsClaudeAdaptiveThinking,
|
|
24
24
|
} from "../../shared/reasoning-effort.js";
|
|
25
25
|
import { AI_SDK_MODEL_CONFIG, type AISDKProvider } from "../model-config.js";
|
|
26
|
+
import {
|
|
27
|
+
createFirstEventAbortController,
|
|
28
|
+
FIRST_STREAM_EVENT_TIMEOUT_MS,
|
|
29
|
+
} from "./first-event-timeout.js";
|
|
26
30
|
import {
|
|
27
31
|
clampThinkingBudgetTokens,
|
|
28
32
|
resolveMaxOutputTokensForEngine,
|
|
@@ -379,6 +383,7 @@ class AISDKEngine implements AgentEngine {
|
|
|
379
383
|
}
|
|
380
384
|
|
|
381
385
|
let assistantContent: EngineContentPart[] = [];
|
|
386
|
+
const firstEventAbort = createFirstEventAbortController(opts.abortSignal);
|
|
382
387
|
|
|
383
388
|
try {
|
|
384
389
|
const result = streamText({
|
|
@@ -390,7 +395,7 @@ class AISDKEngine implements AgentEngine {
|
|
|
390
395
|
...(opts.temperature !== undefined
|
|
391
396
|
? { temperature: opts.temperature }
|
|
392
397
|
: {}),
|
|
393
|
-
abortSignal:
|
|
398
|
+
abortSignal: firstEventAbort.signal,
|
|
394
399
|
onStepFinish: (step: any) => {
|
|
395
400
|
assistantContent = aiSdkStepToAssistantContent(step);
|
|
396
401
|
},
|
|
@@ -402,8 +407,18 @@ class AISDKEngine implements AgentEngine {
|
|
|
402
407
|
// Buffer the terminal stop so assistant-content can be emitted just
|
|
403
408
|
// before it, regardless of where `finish` arrives in the stream.
|
|
404
409
|
let bufferedStop: EngineEvent | undefined;
|
|
410
|
+
let sawFirstEvent = false;
|
|
405
411
|
|
|
406
412
|
for await (const part of result.fullStream) {
|
|
413
|
+
// "start" is a synthetic lifecycle marker the AI SDK enqueues
|
|
414
|
+
// synchronously when the stream begins — before any provider bytes
|
|
415
|
+
// arrive — so it does not count as real progress. Every other part
|
|
416
|
+
// (including "start-step", only enqueued on the step's first real
|
|
417
|
+
// chunk) proves the provider is actually responding.
|
|
418
|
+
if (!sawFirstEvent && part?.type !== "start") {
|
|
419
|
+
sawFirstEvent = true;
|
|
420
|
+
firstEventAbort.markFirstEvent();
|
|
421
|
+
}
|
|
407
422
|
for (const event of aiSdkPartToEngineEvents(part)) {
|
|
408
423
|
if (event.type === "stop") {
|
|
409
424
|
bufferedStop = event;
|
|
@@ -413,6 +428,15 @@ class AISDKEngine implements AgentEngine {
|
|
|
413
428
|
}
|
|
414
429
|
}
|
|
415
430
|
|
|
431
|
+
// AI SDK surfaces an aborted stream as a graceful `{type: "abort"}`
|
|
432
|
+
// part rather than a thrown error, so a first-event timeout would
|
|
433
|
+
// otherwise fall through to the normal end_turn completion below.
|
|
434
|
+
if (!sawFirstEvent && firstEventAbort.didTimeout()) {
|
|
435
|
+
throw new Error(
|
|
436
|
+
`Model request produced no stream events within ${FIRST_STREAM_EVENT_TIMEOUT_MS / 1000}s; the connection appears wedged.`,
|
|
437
|
+
);
|
|
438
|
+
}
|
|
439
|
+
|
|
416
440
|
yield { type: "assistant-content", parts: assistantContent };
|
|
417
441
|
await clearProviderCredentialAuthFailure({
|
|
418
442
|
key: PROVIDER_ENV_VARS[this.provider][0],
|
|
@@ -420,6 +444,7 @@ class AISDKEngine implements AgentEngine {
|
|
|
420
444
|
});
|
|
421
445
|
yield bufferedStop ?? { type: "stop", reason: "end_turn" };
|
|
422
446
|
} catch (err: any) {
|
|
447
|
+
const timedOut = firstEventAbort.didTimeout();
|
|
423
448
|
// Surface structured fields from AI SDK's APICallError so
|
|
424
449
|
// isRetryableError can check statusCode/providerRetryable directly
|
|
425
450
|
// rather than keyword-matching the message string.
|
|
@@ -427,12 +452,13 @@ class AISDKEngine implements AgentEngine {
|
|
|
427
452
|
typeof err?.statusCode === "number" ? err.statusCode : undefined;
|
|
428
453
|
const errorMessage = err?.message ?? String(err);
|
|
429
454
|
const isConnectionError =
|
|
455
|
+
!timedOut &&
|
|
430
456
|
statusCode === undefined &&
|
|
431
457
|
String(errorMessage).trim().toLowerCase() === "connection error.";
|
|
432
458
|
const providerRetryable: boolean | undefined =
|
|
433
459
|
typeof err?.isRetryable === "boolean"
|
|
434
460
|
? err.isRetryable
|
|
435
|
-
: isConnectionError
|
|
461
|
+
: isConnectionError || timedOut
|
|
436
462
|
? true
|
|
437
463
|
: undefined;
|
|
438
464
|
if (statusCode === 401) {
|
|
@@ -455,12 +481,14 @@ class AISDKEngine implements AgentEngine {
|
|
|
455
481
|
// auto-resume too — matching the Builder gateway path.
|
|
456
482
|
...(statusCode !== undefined
|
|
457
483
|
? { errorCode: `http_${statusCode}`, statusCode }
|
|
458
|
-
: isConnectionError
|
|
484
|
+
: isConnectionError || timedOut
|
|
459
485
|
? { errorCode: "provider_network_error" }
|
|
460
486
|
: {}),
|
|
461
487
|
...(providerRetryable !== undefined ? { providerRetryable } : {}),
|
|
462
488
|
};
|
|
463
489
|
throw err;
|
|
490
|
+
} finally {
|
|
491
|
+
firstEventAbort.cleanup();
|
|
464
492
|
}
|
|
465
493
|
}
|
|
466
494
|
|
|
@@ -23,6 +23,10 @@ import {
|
|
|
23
23
|
LLM_MISSING_CREDENTIALS_ERROR_CODE,
|
|
24
24
|
LLM_MISSING_CREDENTIALS_MESSAGE,
|
|
25
25
|
} from "./credential-errors.js";
|
|
26
|
+
import {
|
|
27
|
+
createFirstEventAbortController,
|
|
28
|
+
FIRST_STREAM_EVENT_TIMEOUT_MS,
|
|
29
|
+
} from "./first-event-timeout.js";
|
|
26
30
|
import {
|
|
27
31
|
clampThinkingBudgetTokens,
|
|
28
32
|
resolveMaxOutputTokensForEngine,
|
|
@@ -186,8 +190,9 @@ class AnthropicEngine implements AgentEngine {
|
|
|
186
190
|
// Remove undefined tools to avoid Anthropic API validation errors
|
|
187
191
|
if (!requestParams.tools) delete requestParams.tools;
|
|
188
192
|
|
|
193
|
+
const firstEventAbort = createFirstEventAbortController(opts.abortSignal);
|
|
189
194
|
const apiStream = client.messages.stream(requestParams, {
|
|
190
|
-
signal:
|
|
195
|
+
signal: firstEventAbort.signal,
|
|
191
196
|
});
|
|
192
197
|
|
|
193
198
|
// Per-stream state lets the translator carry each tool-call's id/name from
|
|
@@ -198,6 +203,9 @@ class AnthropicEngine implements AgentEngine {
|
|
|
198
203
|
|
|
199
204
|
try {
|
|
200
205
|
for await (const chunk of apiStream) {
|
|
206
|
+
// The SDK's SSE parsing already drops `ping` keepalives before they
|
|
207
|
+
// reach this loop, so any chunk here is real provider progress.
|
|
208
|
+
firstEventAbort.markFirstEvent();
|
|
201
209
|
const events = anthropicChunkToEngineEvents(chunk, chunkState);
|
|
202
210
|
for (const event of events) {
|
|
203
211
|
yield event;
|
|
@@ -238,17 +246,24 @@ class AnthropicEngine implements AgentEngine {
|
|
|
238
246
|
: "end_turn",
|
|
239
247
|
};
|
|
240
248
|
} catch (err: any) {
|
|
249
|
+
const timedOut = firstEventAbort.didTimeout();
|
|
241
250
|
const statusCode: number | undefined =
|
|
242
251
|
typeof err?.status === "number"
|
|
243
252
|
? err.status
|
|
244
253
|
: typeof err?.statusCode === "number"
|
|
245
254
|
? err.statusCode
|
|
246
255
|
: undefined;
|
|
247
|
-
|
|
256
|
+
// A first-event abort surfaces from the SDK as a generic
|
|
257
|
+
// APIUserAbortError ("Request was aborted.") — replace it with a
|
|
258
|
+
// message that actually explains what happened.
|
|
259
|
+
const errorMessage = timedOut
|
|
260
|
+
? `Model request produced no stream events within ${FIRST_STREAM_EVENT_TIMEOUT_MS / 1000}s; the connection appears wedged.`
|
|
261
|
+
: (err?.message ?? String(err));
|
|
248
262
|
// Anthropic SDK APIConnectionError defaults to "Connection error." with
|
|
249
263
|
// no HTTP status. Tag it so in-run retries and run-level resume treat
|
|
250
264
|
// the failure as a transient network interruption.
|
|
251
265
|
const isConnectionError =
|
|
266
|
+
!timedOut &&
|
|
252
267
|
statusCode === undefined &&
|
|
253
268
|
String(errorMessage).trim().toLowerCase() === "connection error.";
|
|
254
269
|
if (statusCode === 401) {
|
|
@@ -274,7 +289,7 @@ class AnthropicEngine implements AgentEngine {
|
|
|
274
289
|
// continuation logic auto-resume a rate-limited turn.
|
|
275
290
|
...(statusCode !== undefined
|
|
276
291
|
? { errorCode: `http_${statusCode}`, statusCode }
|
|
277
|
-
: isConnectionError
|
|
292
|
+
: isConnectionError || timedOut
|
|
278
293
|
? {
|
|
279
294
|
errorCode: "provider_network_error",
|
|
280
295
|
providerRetryable: true,
|
|
@@ -282,6 +297,8 @@ class AnthropicEngine implements AgentEngine {
|
|
|
282
297
|
: {}),
|
|
283
298
|
};
|
|
284
299
|
throw err;
|
|
300
|
+
} finally {
|
|
301
|
+
firstEventAbort.cleanup();
|
|
285
302
|
}
|
|
286
303
|
}
|
|
287
304
|
}
|
|
@@ -31,6 +31,7 @@ import {
|
|
|
31
31
|
LLM_MISSING_CREDENTIALS_ERROR_CODE,
|
|
32
32
|
LLM_MISSING_CREDENTIALS_MESSAGE,
|
|
33
33
|
} from "./credential-errors.js";
|
|
34
|
+
import { FIRST_STREAM_EVENT_TIMEOUT_MS } from "./first-event-timeout.js";
|
|
34
35
|
import { resolveMaxOutputTokensForEngine } from "./output-tokens.js";
|
|
35
36
|
import {
|
|
36
37
|
engineMessagesToBuilderGatewayAnthropic,
|
|
@@ -272,12 +273,16 @@ class BuilderEngine implements AgentEngine {
|
|
|
272
273
|
phase: "request",
|
|
273
274
|
model: opts.model,
|
|
274
275
|
gatewayUrl,
|
|
275
|
-
timeoutMs:
|
|
276
|
+
timeoutMs: gatewayAbort.effectiveTimeoutMs(),
|
|
276
277
|
timedOut,
|
|
277
278
|
elapsedMs: Date.now() - tStart,
|
|
278
279
|
});
|
|
279
280
|
}
|
|
280
|
-
yield createBuilderGatewayTimeoutStop(
|
|
281
|
+
yield createBuilderGatewayTimeoutStop(
|
|
282
|
+
err,
|
|
283
|
+
timedOut,
|
|
284
|
+
gatewayAbort.effectiveTimeoutMs(),
|
|
285
|
+
);
|
|
281
286
|
return;
|
|
282
287
|
}
|
|
283
288
|
|
|
@@ -331,7 +336,8 @@ class BuilderEngine implements AgentEngine {
|
|
|
331
336
|
yield* parseJsonlStream(reader, opts.model, {
|
|
332
337
|
abortSignal: gatewayAbort.signal,
|
|
333
338
|
didGatewayTimeout: gatewayAbort.didTimeout,
|
|
334
|
-
|
|
339
|
+
getGatewayTimeoutMs: gatewayAbort.effectiveTimeoutMs,
|
|
340
|
+
onFirstEvent: gatewayAbort.markFirstEvent,
|
|
335
341
|
gatewayUrl,
|
|
336
342
|
requestStartedAt: tStart,
|
|
337
343
|
});
|
|
@@ -475,13 +481,12 @@ async function* parseJsonlStream(
|
|
|
475
481
|
captureContext: {
|
|
476
482
|
abortSignal?: AbortSignal;
|
|
477
483
|
didGatewayTimeout?: () => boolean;
|
|
478
|
-
|
|
484
|
+
getGatewayTimeoutMs?: () => number;
|
|
485
|
+
onFirstEvent?: () => void;
|
|
479
486
|
gatewayUrl?: URL;
|
|
480
487
|
requestStartedAt?: number;
|
|
481
488
|
} = {},
|
|
482
489
|
): AsyncIterable<EngineEvent> {
|
|
483
|
-
const gatewayTimeoutMs =
|
|
484
|
-
captureContext.gatewayTimeoutMs ?? DEFAULT_BUILDER_GATEWAY_TIMEOUT_MS;
|
|
485
490
|
const parts: EngineContentPart[] = [];
|
|
486
491
|
let pendingText = "";
|
|
487
492
|
let pendingThinking: { text: string; signature?: string } | null = null;
|
|
@@ -533,6 +538,12 @@ async function* parseJsonlStream(
|
|
|
533
538
|
return;
|
|
534
539
|
}
|
|
535
540
|
|
|
541
|
+
// Heartbeats are transport-level keepalives, not proof the model is
|
|
542
|
+
// producing output — every other parsed event counts as first progress.
|
|
543
|
+
if (event?.type !== "heartbeat") {
|
|
544
|
+
captureContext.onFirstEvent?.();
|
|
545
|
+
}
|
|
546
|
+
|
|
536
547
|
switch (event.type) {
|
|
537
548
|
case "text-delta": {
|
|
538
549
|
const text = event.text ?? "";
|
|
@@ -735,6 +746,9 @@ async function* parseJsonlStream(
|
|
|
735
746
|
};
|
|
736
747
|
} catch (err) {
|
|
737
748
|
const timedOut = captureContext.didGatewayTimeout?.() ?? false;
|
|
749
|
+
const gatewayTimeoutMs =
|
|
750
|
+
captureContext.getGatewayTimeoutMs?.() ??
|
|
751
|
+
DEFAULT_BUILDER_GATEWAY_TIMEOUT_MS;
|
|
738
752
|
if (timedOut || isBuilderGatewayNetworkError(err)) {
|
|
739
753
|
captureBuilderGatewayTransportError(err, {
|
|
740
754
|
phase: "stream",
|
|
@@ -880,16 +894,28 @@ function getBuilderGatewayTimeoutMs(): number {
|
|
|
880
894
|
return Math.min(parsed, maxMs);
|
|
881
895
|
}
|
|
882
896
|
|
|
897
|
+
/**
|
|
898
|
+
* Two-stage abort deadline: until the first real stream event arrives, the
|
|
899
|
+
* effective deadline is min(totalTimeoutMs, FIRST_STREAM_EVENT_TIMEOUT_MS) —
|
|
900
|
+
* a wedged gateway that never streams anything gets cut off in ~2 minutes
|
|
901
|
+
* instead of riding the full flat timeout. Once `markFirstEvent()` fires, the
|
|
902
|
+
* timer reschedules for whatever remains of the original total deadline, so
|
|
903
|
+
* a request that starts streaming still gets the full budget it always did.
|
|
904
|
+
*/
|
|
883
905
|
function createGatewayAbortSignal(
|
|
884
906
|
parentSignal: AbortSignal,
|
|
885
|
-
|
|
907
|
+
totalTimeoutMs: number,
|
|
886
908
|
): {
|
|
887
909
|
signal: AbortSignal;
|
|
888
910
|
didTimeout: () => boolean;
|
|
911
|
+
effectiveTimeoutMs: () => number;
|
|
912
|
+
markFirstEvent: () => void;
|
|
889
913
|
cleanup: () => void;
|
|
890
914
|
} {
|
|
891
915
|
const controller = new AbortController();
|
|
892
916
|
let timedOut = false;
|
|
917
|
+
let firstEventSeen = false;
|
|
918
|
+
const startedAt = Date.now();
|
|
893
919
|
|
|
894
920
|
const abortFromParent = () => {
|
|
895
921
|
if (!controller.signal.aborted) {
|
|
@@ -897,12 +923,18 @@ function createGatewayAbortSignal(
|
|
|
897
923
|
}
|
|
898
924
|
};
|
|
899
925
|
|
|
900
|
-
const
|
|
926
|
+
const fireTimeout = () => {
|
|
901
927
|
timedOut = true;
|
|
902
928
|
if (!controller.signal.aborted) {
|
|
903
929
|
controller.abort(new Error("Builder gateway request timed out"));
|
|
904
930
|
}
|
|
905
|
-
}
|
|
931
|
+
};
|
|
932
|
+
|
|
933
|
+
const firstEventDeadlineMs = Math.min(
|
|
934
|
+
totalTimeoutMs,
|
|
935
|
+
FIRST_STREAM_EVENT_TIMEOUT_MS,
|
|
936
|
+
);
|
|
937
|
+
let timeout = setTimeout(fireTimeout, firstEventDeadlineMs);
|
|
906
938
|
|
|
907
939
|
if (parentSignal.aborted) abortFromParent();
|
|
908
940
|
parentSignal.addEventListener("abort", abortFromParent, { once: true });
|
|
@@ -910,6 +942,21 @@ function createGatewayAbortSignal(
|
|
|
910
942
|
return {
|
|
911
943
|
signal: controller.signal,
|
|
912
944
|
didTimeout: () => timedOut,
|
|
945
|
+
effectiveTimeoutMs: () =>
|
|
946
|
+
firstEventSeen ? totalTimeoutMs : firstEventDeadlineMs,
|
|
947
|
+
markFirstEvent: () => {
|
|
948
|
+
if (firstEventSeen || timedOut) return;
|
|
949
|
+
firstEventSeen = true;
|
|
950
|
+
// The first-event window was already the binding constraint (total
|
|
951
|
+
// timeout <= it) — nothing to reschedule.
|
|
952
|
+
if (firstEventDeadlineMs >= totalTimeoutMs) return;
|
|
953
|
+
clearTimeout(timeout);
|
|
954
|
+
const remainingMs = Math.max(
|
|
955
|
+
0,
|
|
956
|
+
totalTimeoutMs - (Date.now() - startedAt),
|
|
957
|
+
);
|
|
958
|
+
timeout = setTimeout(fireTimeout, remainingMs);
|
|
959
|
+
},
|
|
913
960
|
cleanup: () => {
|
|
914
961
|
clearTimeout(timeout);
|
|
915
962
|
parentSignal.removeEventListener("abort", abortFromParent);
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared "first stream event" deadline for model-request engines.
|
|
3
|
+
*
|
|
4
|
+
* A request that connects successfully but then streams zero events means the
|
|
5
|
+
* transport or gateway is wedged, not slow — real models (including deep
|
|
6
|
+
* thinking ones) emit their first event within seconds. Bounding this window
|
|
7
|
+
* separately from any total-request deadline turns a silent multi-minute hang
|
|
8
|
+
* into a fast abort-and-retry.
|
|
9
|
+
*/
|
|
10
|
+
export const FIRST_STREAM_EVENT_TIMEOUT_MS = 120_000;
|
|
11
|
+
|
|
12
|
+
export interface FirstEventAbortController {
|
|
13
|
+
readonly signal: AbortSignal;
|
|
14
|
+
/** Idempotent. Call once the first real (non-keepalive) stream event arrives. */
|
|
15
|
+
markFirstEvent: () => void;
|
|
16
|
+
didTimeout: () => boolean;
|
|
17
|
+
cleanup: () => void;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Layer a first-event deadline on top of a caller's AbortSignal. Aborts if
|
|
22
|
+
* `markFirstEvent()` is not called within `FIRST_STREAM_EVENT_TIMEOUT_MS`.
|
|
23
|
+
* Has no opinion on a total-request deadline — callers that need one (e.g.
|
|
24
|
+
* builder-engine's flat gateway timeout) compose their own on top.
|
|
25
|
+
*/
|
|
26
|
+
export function createFirstEventAbortController(
|
|
27
|
+
parentSignal: AbortSignal,
|
|
28
|
+
): FirstEventAbortController {
|
|
29
|
+
const controller = new AbortController();
|
|
30
|
+
let timedOut = false;
|
|
31
|
+
let firstEventSeen = false;
|
|
32
|
+
|
|
33
|
+
const abortFromParent = () => {
|
|
34
|
+
if (!controller.signal.aborted) controller.abort(parentSignal.reason);
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
const timeout = setTimeout(() => {
|
|
38
|
+
timedOut = true;
|
|
39
|
+
if (!controller.signal.aborted) {
|
|
40
|
+
controller.abort(
|
|
41
|
+
new Error(
|
|
42
|
+
`Model request produced no stream events within ${FIRST_STREAM_EVENT_TIMEOUT_MS / 1000}s`,
|
|
43
|
+
),
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
}, FIRST_STREAM_EVENT_TIMEOUT_MS);
|
|
47
|
+
|
|
48
|
+
if (parentSignal.aborted) abortFromParent();
|
|
49
|
+
parentSignal.addEventListener("abort", abortFromParent, { once: true });
|
|
50
|
+
|
|
51
|
+
return {
|
|
52
|
+
signal: controller.signal,
|
|
53
|
+
markFirstEvent: () => {
|
|
54
|
+
if (firstEventSeen) return;
|
|
55
|
+
firstEventSeen = true;
|
|
56
|
+
clearTimeout(timeout);
|
|
57
|
+
},
|
|
58
|
+
didTimeout: () => timedOut,
|
|
59
|
+
cleanup: () => {
|
|
60
|
+
clearTimeout(timeout);
|
|
61
|
+
parentSignal.removeEventListener("abort", abortFromParent);
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|
|
@@ -3237,7 +3237,9 @@ const AssistantChatInner = forwardRef<
|
|
|
3237
3237
|
const reconnectErrorCode =
|
|
3238
3238
|
reconnectTerminalReason === "run_timeout"
|
|
3239
3239
|
? "run_timeout"
|
|
3240
|
-
: "
|
|
3240
|
+
: reconnectTerminalReason === "stream_ended"
|
|
3241
|
+
? "reconnect_stream_ended"
|
|
3242
|
+
: "reconnect_no_progress";
|
|
3241
3243
|
captureError(new Error(`agent-chat:${reconnectErrorCode}`), {
|
|
3242
3244
|
tags: {
|
|
3243
3245
|
context: "agent-native-chat",
|
|
@@ -3309,9 +3311,11 @@ const AssistantChatInner = forwardRef<
|
|
|
3309
3311
|
}
|
|
3310
3312
|
setRunErrorInfo({
|
|
3311
3313
|
message:
|
|
3312
|
-
|
|
3314
|
+
reconnectErrorCode === "run_timeout"
|
|
3313
3315
|
? "The previous background agent run reached its time limit before finishing. The partial work was preserved; continue or retry to pick up from here."
|
|
3314
|
-
:
|
|
3316
|
+
: reconnectErrorCode === "reconnect_stream_ended"
|
|
3317
|
+
? "The previous agent stream ended while the run was recovering. Continue or retry to reconnect to the run."
|
|
3318
|
+
: "The previous agent run stopped producing visible progress during recovery, so it was stopped before it could keep looping.",
|
|
3315
3319
|
errorCode: reconnectErrorCode,
|
|
3316
3320
|
recoverable: true,
|
|
3317
3321
|
runId,
|
|
@@ -613,7 +613,7 @@ The result should be a reusable agent profile, not a one-off task response.`,
|
|
|
613
613
|
icon: <IconBulb className="h-3.5 w-3.5" />,
|
|
614
614
|
label: "Create Skill",
|
|
615
615
|
desc: "Teach the agent a new ability",
|
|
616
|
-
action: openSkillFlyout,
|
|
616
|
+
action: () => openSkillFlyout(),
|
|
617
617
|
hoverAction: openSkillFlyout,
|
|
618
618
|
},
|
|
619
619
|
{
|
|
@@ -175,7 +175,7 @@ export async function decideComputerApproval(input: {
|
|
|
175
175
|
SET status = ?, decision_result_json = ?, decided_by = ?,
|
|
176
176
|
decided_at = ?, updated_at = ?
|
|
177
177
|
WHERE id = ? AND owner_email = ?
|
|
178
|
-
AND ((org_id IS NULL AND ? IS NULL) OR org_id = ?)
|
|
178
|
+
AND ((org_id IS NULL AND CAST(? AS TEXT) IS NULL) OR org_id = ?)
|
|
179
179
|
AND action_hash = ? AND status = 'pending' AND expires_at > ?`,
|
|
180
180
|
args: [
|
|
181
181
|
input.decision,
|
|
@@ -204,7 +204,7 @@ export async function getComputerApprovalForOwner(input: {
|
|
|
204
204
|
const { rows } = await getDbExec().execute({
|
|
205
205
|
sql: `SELECT * FROM integration_computer_approvals
|
|
206
206
|
WHERE id = ? AND owner_email = ?
|
|
207
|
-
AND ((org_id IS NULL AND ? IS NULL) OR org_id = ?)
|
|
207
|
+
AND ((org_id IS NULL AND CAST(? AS TEXT) IS NULL) OR org_id = ?)
|
|
208
208
|
LIMIT 1`,
|
|
209
209
|
args: [
|
|
210
210
|
input.id,
|
|
@@ -228,7 +228,7 @@ export async function listComputerApprovalsForOwner(input: {
|
|
|
228
228
|
await ensureComputerApprovalStore();
|
|
229
229
|
const clauses = [
|
|
230
230
|
"owner_email = ?",
|
|
231
|
-
"((org_id IS NULL AND ? IS NULL) OR org_id = ?)",
|
|
231
|
+
"((org_id IS NULL AND CAST(? AS TEXT) IS NULL) OR org_id = ?)",
|
|
232
232
|
];
|
|
233
233
|
const args: Array<string | number | null> = [
|
|
234
234
|
input.ownerEmail,
|
|
@@ -295,7 +295,7 @@ export async function authorizeComputerOperation(
|
|
|
295
295
|
const { rows } = await client.execute({
|
|
296
296
|
sql: `SELECT * FROM integration_computer_approvals
|
|
297
297
|
WHERE id = ? AND owner_email = ?
|
|
298
|
-
AND ((org_id IS NULL AND ? IS NULL) OR org_id = ?)
|
|
298
|
+
AND ((org_id IS NULL AND CAST(? AS TEXT) IS NULL) OR org_id = ?)
|
|
299
299
|
AND device_id = ? AND task_id = ? AND run_id = ?
|
|
300
300
|
LIMIT 1`,
|
|
301
301
|
args: [
|
|
@@ -316,7 +316,7 @@ export async function resolveIntegrationSourceContext(
|
|
|
316
316
|
FROM integration_pending_tasks
|
|
317
317
|
WHERE id = ?
|
|
318
318
|
AND owner_email = ?
|
|
319
|
-
AND (org_id = ? OR (org_id IS NULL AND ? IS NULL))
|
|
319
|
+
AND (org_id = ? OR (org_id IS NULL AND CAST(? AS TEXT) IS NULL))
|
|
320
320
|
AND platform = 'slack'
|
|
321
321
|
LIMIT 1`,
|
|
322
322
|
args: [id, ownerEmail, orgId, orgId],
|