@agent-native/core 0.109.2 → 0.109.3

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.
Files changed (97) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +8 -0
  3. package/corpus/core/package.json +1 -1
  4. package/corpus/core/src/cli/create.ts +18 -12
  5. package/corpus/core/src/client/require-session.tsx +19 -3
  6. package/corpus/core/src/client/use-action.ts +145 -2
  7. package/corpus/core/src/client/use-session.ts +79 -48
  8. package/corpus/core/src/db/client.ts +13 -7
  9. package/corpus/core/src/db/create-get-db.ts +20 -13
  10. package/corpus/core/src/db/request-telemetry.ts +154 -0
  11. package/corpus/core/src/integrations/index.ts +1 -0
  12. package/corpus/core/src/integrations/plugin.ts +9 -3
  13. package/corpus/core/src/integrations/remote-push-delivery-job.ts +48 -0
  14. package/corpus/core/src/integrations/remote-push-delivery.ts +370 -0
  15. package/corpus/core/src/integrations/remote-push-store.ts +275 -26
  16. package/corpus/core/src/server/better-auth-instance.ts +11 -3
  17. package/corpus/core/src/server/core-routes-plugin.ts +36 -14
  18. package/corpus/core/src/server/framework-request-handler.ts +11 -1
  19. package/corpus/core/src/server/http-response-telemetry.ts +233 -31
  20. package/corpus/core/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +19 -0
  21. package/corpus/templates/clips/actions/finalize-recording.ts +3 -1
  22. package/corpus/templates/clips/actions/set-mobile-capture-state.ts +4 -1
  23. package/corpus/templates/clips/app/components/library/library-layout.tsx +1 -6
  24. package/corpus/templates/clips/changelog/2026-07-18-new-recording-is-now-emphasized-as-the-primary-action-in-the.md +6 -0
  25. package/corpus/templates/clips/changelog/2026-07-18-recordings-now-remain-safely-recoverable-until-the-stored-me.md +6 -0
  26. package/corpus/templates/tasks/AGENTS.md +3 -0
  27. package/corpus/templates/tasks/actions/render-task-list-inline.ts +202 -0
  28. package/corpus/templates/tasks/changelog/2026-07-18-task-lists-can-now-appear-as-interactive-widgets-inline-in-c.md +6 -0
  29. package/corpus/templates/tasks/docs/features/f8-chat.mdx +2 -0
  30. package/corpus/templates/tasks/server/plugins/agent-chat.ts +2 -0
  31. package/dist/cli/create.d.ts +10 -1
  32. package/dist/cli/create.d.ts.map +1 -1
  33. package/dist/cli/create.js +17 -13
  34. package/dist/cli/create.js.map +1 -1
  35. package/dist/client/require-session.d.ts.map +1 -1
  36. package/dist/client/require-session.js +6 -3
  37. package/dist/client/require-session.js.map +1 -1
  38. package/dist/client/use-action.d.ts.map +1 -1
  39. package/dist/client/use-action.js +117 -1
  40. package/dist/client/use-action.js.map +1 -1
  41. package/dist/client/use-session.d.ts.map +1 -1
  42. package/dist/client/use-session.js +72 -50
  43. package/dist/client/use-session.js.map +1 -1
  44. package/dist/collab/routes.d.ts +1 -1
  45. package/dist/collab/struct-routes.d.ts +1 -1
  46. package/dist/db/client.d.ts.map +1 -1
  47. package/dist/db/client.js +7 -1
  48. package/dist/db/client.js.map +1 -1
  49. package/dist/db/create-get-db.d.ts +3 -6
  50. package/dist/db/create-get-db.d.ts.map +1 -1
  51. package/dist/db/create-get-db.js +9 -2
  52. package/dist/db/create-get-db.js.map +1 -1
  53. package/dist/db/request-telemetry.d.ts +23 -0
  54. package/dist/db/request-telemetry.d.ts.map +1 -0
  55. package/dist/db/request-telemetry.js +95 -0
  56. package/dist/db/request-telemetry.js.map +1 -0
  57. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  58. package/dist/integrations/index.d.ts +1 -0
  59. package/dist/integrations/index.d.ts.map +1 -1
  60. package/dist/integrations/index.js +1 -0
  61. package/dist/integrations/index.js.map +1 -1
  62. package/dist/integrations/plugin.d.ts.map +1 -1
  63. package/dist/integrations/plugin.js +8 -3
  64. package/dist/integrations/plugin.js.map +1 -1
  65. package/dist/integrations/remote-push-delivery-job.d.ts +4 -0
  66. package/dist/integrations/remote-push-delivery-job.d.ts.map +1 -0
  67. package/dist/integrations/remote-push-delivery-job.js +44 -0
  68. package/dist/integrations/remote-push-delivery-job.js.map +1 -0
  69. package/dist/integrations/remote-push-delivery.d.ts +11 -0
  70. package/dist/integrations/remote-push-delivery.d.ts.map +1 -0
  71. package/dist/integrations/remote-push-delivery.js +265 -0
  72. package/dist/integrations/remote-push-delivery.js.map +1 -0
  73. package/dist/integrations/remote-push-store.d.ts +33 -0
  74. package/dist/integrations/remote-push-store.d.ts.map +1 -1
  75. package/dist/integrations/remote-push-store.js +195 -26
  76. package/dist/integrations/remote-push-store.js.map +1 -1
  77. package/dist/progress/routes.d.ts +1 -1
  78. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  79. package/dist/resources/handlers.d.ts +3 -3
  80. package/dist/secrets/routes.d.ts +9 -9
  81. package/dist/server/better-auth-instance.js +7 -3
  82. package/dist/server/better-auth-instance.js.map +1 -1
  83. package/dist/server/core-routes-plugin.d.ts +8 -0
  84. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  85. package/dist/server/core-routes-plugin.js +23 -8
  86. package/dist/server/core-routes-plugin.js.map +1 -1
  87. package/dist/server/framework-request-handler.d.ts.map +1 -1
  88. package/dist/server/framework-request-handler.js +9 -1
  89. package/dist/server/framework-request-handler.js.map +1 -1
  90. package/dist/server/http-response-telemetry.d.ts +3 -2
  91. package/dist/server/http-response-telemetry.d.ts.map +1 -1
  92. package/dist/server/http-response-telemetry.js +160 -27
  93. package/dist/server/http-response-telemetry.js.map +1 -1
  94. package/dist/server/transcribe-voice.d.ts +1 -1
  95. package/dist/templates/workspace-core/.agents/skills/tracking/SKILL.md +19 -0
  96. package/package.json +1 -1
  97. package/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +19 -0
@@ -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 { defineEventHandler, getHeader, getMethod } from \"h3\";\nimport type { EventHandler, H3Event } from \"h3\";\n\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 TRACKING_INGEST_PATHS = new Set([\n \"/track\",\n \"/api/analytics/track\",\n \"/api/events/track\",\n \"/_agent-native/track\",\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 1;\n const parsed = Number.parseFloat(raw);\n if (!Number.isFinite(parsed)) return 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(pathname: string, statusCode: number): 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 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): number {\n const raw =\n (event.node?.res as any)?.statusCode ??\n (event.node?.res as any)?.status ??\n (event as any).res?.status ??\n 200;\n const parsed = Number(raw);\n return Number.isFinite(parsed) ? parsed : 200;\n}\n\nfunction emitTelemetry(event: H3Event, startedAt: number): void {\n const statusCode = responseStatusCode(event);\n const pathname = requestPath(event);\n if (!shouldTrack(pathname, statusCode)) 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() - startedAt),\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 });\n } catch {\n // Response telemetry is best-effort. Never perturb request handling.\n }\n}\n\nexport function createHttpResponseTelemetryMiddleware(): EventHandler {\n return defineEventHandler((event) => {\n const startedAt = Date.now();\n const res = event.node?.res as\n | {\n once?: (event: \"finish\" | \"close\", cb: () => void) => void;\n on?: (event: \"finish\" | \"close\", cb: () => void) => void;\n }\n | undefined;\n let emitted = false;\n const emitOnce = () => {\n if (emitted) return;\n emitted = true;\n emitTelemetry(event, startedAt);\n };\n\n if (typeof res?.once === \"function\") {\n res.once(\"finish\", emitOnce);\n res.once(\"close\", emitOnce);\n } else if (typeof res?.on === \"function\") {\n res.on(\"finish\", emitOnce);\n res.on(\"close\", emitOnce);\n }\n });\n}\n"]}
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"]}
@@ -20,7 +20,7 @@ export declare function createTranscribeVoiceHandler(): import("h3").EventHandle
20
20
  error: string;
21
21
  text?: undefined;
22
22
  } | {
23
- text: string;
24
23
  error?: undefined;
24
+ text: string;
25
25
  }>>;
26
26
  //# sourceMappingURL=transcribe-voice.d.ts.map
@@ -138,6 +138,25 @@ Attribution parsing is fully defensive and never blocks signup — a missing/mal
138
138
  Other framework-level baseline events:
139
139
 
140
140
  - `session status` from `useSession()`, with `signed_in`
141
+ - `action.response` from the browser action transport, with action name,
142
+ browser-perceived duration and TTFB, response status/outcome, response size
143
+ when known, and parsed `Server-Timing` phases for framework readiness and
144
+ database work. Its `request_id` joins the exact browser and server events.
145
+ This separates server time from CDN/network/body overhead.
146
+ - `http.response` from Nitro request/response hooks, with normalized path,
147
+ status, request duration, first-request-in-isolate cold marker, process age,
148
+ framework readiness wait, deploy/runtime fingerprint, database
149
+ connection/query counts and timings, retries, timeouts, and failures. It also
150
+ emits `Server-Timing` for `app`, `startup`, `db`, `db-connect`, and
151
+ `db-slowest` plus an `X-Agent-Native-Request-Id` correlation header where
152
+ applicable. Query text and parameters are never captured.
153
+ Database activity that begins during the first two minutes of process/plugin
154
+ initialization is reported separately as `startup_db_*` on the first
155
+ framework request that passes the readiness gate.
156
+ Slow, cold-isolate, server failures, and 4xx action routes are always
157
+ retained; fast successful requests default to 10% sampling. Override with
158
+ `AGENT_NATIVE_HTTP_TELEMETRY_SAMPLE_RATE` on the server and
159
+ `VITE_AGENT_NATIVE_ACTION_TELEMETRY_SAMPLE_RATE` in the browser.
141
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)
142
161
  - `builder connect clicked` and `builder connect popup blocked` from browser Connect Builder CTAs
143
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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/core",
3
- "version": "0.109.2",
3
+ "version": "0.109.3",
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": {
@@ -138,6 +138,25 @@ Attribution parsing is fully defensive and never blocks signup — a missing/mal
138
138
  Other framework-level baseline events:
139
139
 
140
140
  - `session status` from `useSession()`, with `signed_in`
141
+ - `action.response` from the browser action transport, with action name,
142
+ browser-perceived duration and TTFB, response status/outcome, response size
143
+ when known, and parsed `Server-Timing` phases for framework readiness and
144
+ database work. Its `request_id` joins the exact browser and server events.
145
+ This separates server time from CDN/network/body overhead.
146
+ - `http.response` from Nitro request/response hooks, with normalized path,
147
+ status, request duration, first-request-in-isolate cold marker, process age,
148
+ framework readiness wait, deploy/runtime fingerprint, database
149
+ connection/query counts and timings, retries, timeouts, and failures. It also
150
+ emits `Server-Timing` for `app`, `startup`, `db`, `db-connect`, and
151
+ `db-slowest` plus an `X-Agent-Native-Request-Id` correlation header where
152
+ applicable. Query text and parameters are never captured.
153
+ Database activity that begins during the first two minutes of process/plugin
154
+ initialization is reported separately as `startup_db_*` on the first
155
+ framework request that passes the readiness gate.
156
+ Slow, cold-isolate, server failures, and 4xx action routes are always
157
+ retained; fast successful requests default to 10% sampling. Override with
158
+ `AGENT_NATIVE_HTTP_TELEMETRY_SAMPLE_RATE` on the server and
159
+ `VITE_AGENT_NATIVE_ACTION_TELEMETRY_SAMPLE_RATE` in the browser.
141
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)
142
161
  - `builder connect clicked` and `builder connect popup blocked` from browser Connect Builder CTAs
143
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