@agent-native/core 0.109.1 → 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.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +15 -0
- package/corpus/core/docs/content/integrations.mdx +87 -253
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/cli/create.ts +18 -12
- package/corpus/core/src/client/blocks/library/diagram.config.ts +10 -1
- package/corpus/core/src/client/blocks/library/diagram.tsx +9 -4
- package/corpus/core/src/client/require-session.tsx +19 -3
- package/corpus/core/src/client/use-action.ts +145 -2
- package/corpus/core/src/client/use-session.ts +79 -48
- package/corpus/core/src/db/client.ts +13 -7
- package/corpus/core/src/db/create-get-db.ts +20 -13
- package/corpus/core/src/db/request-telemetry.ts +154 -0
- package/corpus/core/src/deploy/build.ts +63 -3
- package/corpus/core/src/integrations/index.ts +1 -0
- package/corpus/core/src/integrations/plugin.ts +9 -3
- package/corpus/core/src/integrations/remote-push-delivery-job.ts +48 -0
- package/corpus/core/src/integrations/remote-push-delivery.ts +370 -0
- package/corpus/core/src/integrations/remote-push-store.ts +275 -26
- package/corpus/core/src/server/better-auth-instance.ts +11 -3
- package/corpus/core/src/server/core-routes-plugin.ts +36 -14
- package/corpus/core/src/server/framework-request-handler.ts +11 -1
- package/corpus/core/src/server/http-response-telemetry.ts +233 -31
- package/corpus/core/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +19 -0
- package/corpus/templates/clips/.agents/skills/dictate/SKILL.md +28 -5
- package/corpus/templates/clips/.agents/skills/meetings/SKILL.md +7 -0
- package/corpus/templates/clips/.agents/skills/recording/SKILL.md +23 -0
- package/corpus/templates/clips/AGENTS.md +10 -0
- package/corpus/templates/clips/actions/create-dictation.ts +29 -4
- package/corpus/templates/clips/actions/finalize-recording.ts +1 -1
- package/corpus/templates/clips/actions/get-recording-player-data.ts +16 -6
- package/corpus/templates/clips/actions/set-mobile-capture-state.ts +40 -0
- package/corpus/templates/clips/actions/update-dictation.ts +9 -1
- package/corpus/templates/clips/app/components/library/library-layout.tsx +1 -6
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +13 -2
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +13 -2
- package/corpus/templates/clips/changelog/2026-07-17-capture-dictation-background-meeting-audio-and-camera-videos.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-17-delayed-upload-verification-keeps-local-backups-retryable.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-18-new-recording-is-now-emphasized-as-the-primary-action-in-the.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-18-recordings-now-remain-safely-recoverable-until-the-stored-me.md +6 -0
- package/corpus/templates/clips/desktop/src/app.tsx +17 -0
- package/corpus/templates/clips/desktop/src/lib/processing-backup-recovery.ts +19 -0
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +60 -35
- package/corpus/templates/clips/desktop/src/lib/upload-verification.ts +12 -0
- package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +1 -0
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +14 -0
- package/corpus/templates/clips/server/db/schema.ts +9 -1
- package/corpus/templates/clips/server/lib/builder-media-compression.ts +59 -7
- package/corpus/templates/clips/server/lib/media-verification-state.ts +17 -0
- package/corpus/templates/clips/server/routes/api/public-recording.get.ts +7 -0
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/reset-chunks.post.ts +22 -1
- package/corpus/templates/plan/changelog/2026-07-17-diagrams-can-opt-into-a-polished-clean-rendering-mode-withou.md +6 -0
- package/corpus/templates/plan/shared/plan-content.ts +3 -0
- package/corpus/templates/tasks/AGENTS.md +3 -0
- package/corpus/templates/tasks/actions/render-task-list-inline.ts +202 -0
- package/corpus/templates/tasks/changelog/2026-07-18-task-lists-can-now-appear-as-interactive-widgets-inline-in-c.md +6 -0
- package/corpus/templates/tasks/docs/features/f8-chat.mdx +2 -0
- package/corpus/templates/tasks/server/plugins/agent-chat.ts +2 -0
- package/dist/cli/create.d.ts +10 -1
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +17 -13
- package/dist/cli/create.js.map +1 -1
- package/dist/client/blocks/library/diagram.config.d.ts +2 -0
- package/dist/client/blocks/library/diagram.config.d.ts.map +1 -1
- package/dist/client/blocks/library/diagram.config.js +8 -1
- package/dist/client/blocks/library/diagram.config.js.map +1 -1
- package/dist/client/blocks/library/diagram.d.ts.map +1 -1
- package/dist/client/blocks/library/diagram.js +9 -4
- package/dist/client/blocks/library/diagram.js.map +1 -1
- package/dist/client/require-session.d.ts.map +1 -1
- package/dist/client/require-session.js +6 -3
- package/dist/client/require-session.js.map +1 -1
- package/dist/client/use-action.d.ts.map +1 -1
- package/dist/client/use-action.js +117 -1
- package/dist/client/use-action.js.map +1 -1
- package/dist/client/use-session.d.ts.map +1 -1
- package/dist/client/use-session.js +72 -50
- package/dist/client/use-session.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +7 -1
- package/dist/db/client.js.map +1 -1
- package/dist/db/create-get-db.d.ts +3 -6
- package/dist/db/create-get-db.d.ts.map +1 -1
- package/dist/db/create-get-db.js +9 -2
- package/dist/db/create-get-db.js.map +1 -1
- package/dist/db/request-telemetry.d.ts +23 -0
- package/dist/db/request-telemetry.d.ts.map +1 -0
- package/dist/db/request-telemetry.js +95 -0
- package/dist/db/request-telemetry.js.map +1 -0
- package/dist/deploy/build.d.ts +3 -0
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +45 -1
- package/dist/deploy/build.js.map +1 -1
- package/dist/file-upload/actions/upload-image.d.ts +1 -1
- package/dist/integrations/index.d.ts +1 -0
- package/dist/integrations/index.d.ts.map +1 -1
- package/dist/integrations/index.js +1 -0
- package/dist/integrations/index.js.map +1 -1
- package/dist/integrations/plugin.d.ts.map +1 -1
- package/dist/integrations/plugin.js +8 -3
- package/dist/integrations/plugin.js.map +1 -1
- package/dist/integrations/remote-push-delivery-job.d.ts +4 -0
- package/dist/integrations/remote-push-delivery-job.d.ts.map +1 -0
- package/dist/integrations/remote-push-delivery-job.js +44 -0
- package/dist/integrations/remote-push-delivery-job.js.map +1 -0
- package/dist/integrations/remote-push-delivery.d.ts +11 -0
- package/dist/integrations/remote-push-delivery.d.ts.map +1 -0
- package/dist/integrations/remote-push-delivery.js +265 -0
- package/dist/integrations/remote-push-delivery.js.map +1 -0
- package/dist/integrations/remote-push-store.d.ts +33 -0
- package/dist/integrations/remote-push-store.d.ts.map +1 -1
- package/dist/integrations/remote-push-store.js +195 -26
- package/dist/integrations/remote-push-store.js.map +1 -1
- package/dist/observability/routes.d.ts +5 -5
- package/dist/provider-api/corpus-jobs.d.ts +2 -2
- package/dist/resources/handlers.d.ts +1 -1
- package/dist/server/better-auth-instance.js +7 -3
- package/dist/server/better-auth-instance.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts +8 -0
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +23 -8
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/framework-request-handler.d.ts.map +1 -1
- package/dist/server/framework-request-handler.js +9 -1
- package/dist/server/framework-request-handler.js.map +1 -1
- package/dist/server/http-response-telemetry.d.ts +3 -2
- package/dist/server/http-response-telemetry.d.ts.map +1 -1
- package/dist/server/http-response-telemetry.js +160 -27
- 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/tracking/SKILL.md +19 -0
- package/docs/content/integrations.mdx +87 -253
- package/package.json +1 -1
- 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"]}
|
|
@@ -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
|
|
@@ -35,263 +35,213 @@ or administrator policy can prevent a generic one-click connection.
|
|
|
35
35
|
|
|
36
36
|
## The integration wall {#integration-wall}
|
|
37
37
|
|
|
38
|
-
These
|
|
39
|
-
without a third-party logo CDN.
|
|
40
|
-
|
|
38
|
+
These self-hosted provider marks keep the directory fast and deployable
|
|
39
|
+
without a third-party logo CDN. Connection details and status categories remain
|
|
40
|
+
in the directory table below.
|
|
41
41
|
|
|
42
|
-
<Diagram id="doc-block-integrations-wall" title="Remote MCP integrations" summary="A self-hosted logo wall of the 25 remote MCP presets currently shipped in the Agent-Native framework." frame="hide">
|
|
42
|
+
<Diagram id="doc-block-integrations-wall" title="Remote MCP integrations" summary="A self-hosted logo wall of the 25 remote MCP presets currently shipped in the Agent-Native framework." frame="hide" renderMode="design">
|
|
43
43
|
|
|
44
44
|
```html
|
|
45
45
|
<div class="integration-wall">
|
|
46
46
|
<div class="integration-card">
|
|
47
47
|
<div class="integration-head">
|
|
48
|
-
<span class="integration-mark
|
|
48
|
+
<span class="integration-mark"
|
|
49
|
+
><img src="/integration-logos/context7.svg" alt=""
|
|
50
|
+
/></span>
|
|
49
51
|
<div><strong>Context7</strong><small>Docs & reference</small></div>
|
|
50
52
|
</div>
|
|
51
|
-
<div class="integration-tags">
|
|
52
|
-
<span class="integration-tag direct">No auth</span
|
|
53
|
-
><span class="integration-tag ready">Verified</span>
|
|
54
|
-
</div>
|
|
55
53
|
</div>
|
|
56
54
|
<div class="integration-card">
|
|
57
55
|
<div class="integration-head">
|
|
58
|
-
<span class="integration-mark
|
|
56
|
+
<span class="integration-mark"
|
|
57
|
+
><img src="/integration-logos/sentry.svg" alt=""
|
|
58
|
+
/></span>
|
|
59
59
|
<div><strong>Sentry</strong><small>Errors & debugging</small></div>
|
|
60
60
|
</div>
|
|
61
|
-
<div class="integration-tags">
|
|
62
|
-
<span class="integration-tag token">Header / token</span
|
|
63
|
-
><span class="integration-tag ready">Ready</span>
|
|
64
|
-
</div>
|
|
65
61
|
</div>
|
|
66
62
|
<div class="integration-card">
|
|
67
63
|
<div class="integration-head">
|
|
68
|
-
<span class="integration-mark
|
|
64
|
+
<span class="integration-mark"
|
|
65
|
+
><img src="/integration-logos/notion.svg" alt=""
|
|
66
|
+
/></span>
|
|
69
67
|
<div><strong>Notion</strong><small>Knowledge & docs</small></div>
|
|
70
68
|
</div>
|
|
71
|
-
<div class="integration-tags">
|
|
72
|
-
<span class="integration-tag oauth">OAuth</span
|
|
73
|
-
><span class="integration-tag ready">Ready</span>
|
|
74
|
-
</div>
|
|
75
69
|
</div>
|
|
76
70
|
<div class="integration-card">
|
|
77
71
|
<div class="integration-head">
|
|
78
|
-
<span class="integration-mark
|
|
72
|
+
<span class="integration-mark"
|
|
73
|
+
><img src="/integration-logos/semgrep.svg" alt=""
|
|
74
|
+
/></span>
|
|
79
75
|
<div><strong>Semgrep</strong><small>Security scanning</small></div>
|
|
80
76
|
</div>
|
|
81
|
-
<div class="integration-tags">
|
|
82
|
-
<span class="integration-tag direct">No auth</span
|
|
83
|
-
><span class="integration-tag ready">Ready</span>
|
|
84
|
-
</div>
|
|
85
77
|
</div>
|
|
86
78
|
<div class="integration-card">
|
|
87
79
|
<div class="integration-head">
|
|
88
|
-
<span class="integration-mark
|
|
80
|
+
<span class="integration-mark"
|
|
81
|
+
><img src="/integration-logos/linear.svg" alt=""
|
|
82
|
+
/></span>
|
|
89
83
|
<div><strong>Linear</strong><small>Issues & planning</small></div>
|
|
90
84
|
</div>
|
|
91
|
-
<div class="integration-tags">
|
|
92
|
-
<span class="integration-tag oauth">OAuth</span
|
|
93
|
-
><span class="integration-tag ready">Ready</span>
|
|
94
|
-
</div>
|
|
95
85
|
</div>
|
|
96
86
|
<div class="integration-card">
|
|
97
87
|
<div class="integration-head">
|
|
98
|
-
<span class="integration-mark
|
|
88
|
+
<span class="integration-mark"
|
|
89
|
+
><img src="/integration-logos/atlassian.svg" alt=""
|
|
90
|
+
/></span>
|
|
99
91
|
<div><strong>Atlassian</strong><small>Jira & Confluence</small></div>
|
|
100
92
|
</div>
|
|
101
|
-
<div class="integration-tags">
|
|
102
|
-
<span class="integration-tag oauth">OAuth</span
|
|
103
|
-
><span class="integration-tag restricted">Restricted</span>
|
|
104
|
-
</div>
|
|
105
93
|
</div>
|
|
106
94
|
<div class="integration-card">
|
|
107
95
|
<div class="integration-head">
|
|
108
|
-
<span class="integration-mark
|
|
96
|
+
<span class="integration-mark"
|
|
97
|
+
><img src="/integration-logos/supabase.svg" alt=""
|
|
98
|
+
/></span>
|
|
109
99
|
<div><strong>Supabase</strong><small>Database & auth</small></div>
|
|
110
100
|
</div>
|
|
111
|
-
<div class="integration-tags">
|
|
112
|
-
<span class="integration-tag oauth">OAuth</span
|
|
113
|
-
><span class="integration-tag ready">Ready</span>
|
|
114
|
-
</div>
|
|
115
101
|
</div>
|
|
116
102
|
<div class="integration-card">
|
|
117
103
|
<div class="integration-head">
|
|
118
|
-
<span class="integration-mark
|
|
104
|
+
<span class="integration-mark"
|
|
105
|
+
><img src="/integration-logos/neon.svg" alt=""
|
|
106
|
+
/></span>
|
|
119
107
|
<div><strong>Neon</strong><small>Serverless Postgres</small></div>
|
|
120
108
|
</div>
|
|
121
|
-
<div class="integration-tags">
|
|
122
|
-
<span class="integration-tag oauth">OAuth</span
|
|
123
|
-
><span class="integration-tag ready">Ready</span>
|
|
124
|
-
</div>
|
|
125
109
|
</div>
|
|
126
110
|
<div class="integration-card">
|
|
127
111
|
<div class="integration-head">
|
|
128
|
-
<span class="integration-mark
|
|
112
|
+
<span class="integration-mark"
|
|
113
|
+
><img src="/integration-logos/stripe.svg" alt=""
|
|
114
|
+
/></span>
|
|
129
115
|
<div><strong>Stripe</strong><small>Payments & billing</small></div>
|
|
130
116
|
</div>
|
|
131
|
-
<div class="integration-tags">
|
|
132
|
-
<span class="integration-tag oauth">OAuth</span
|
|
133
|
-
><span class="integration-tag ready">Ready</span>
|
|
134
|
-
</div>
|
|
135
117
|
</div>
|
|
136
118
|
<div class="integration-card">
|
|
137
119
|
<div class="integration-head">
|
|
138
|
-
<span class="integration-mark
|
|
120
|
+
<span class="integration-mark"
|
|
121
|
+
><img src="/integration-logos/cloudflare.svg" alt=""
|
|
122
|
+
/></span>
|
|
139
123
|
<div><strong>Cloudflare</strong><small>Cloud & security</small></div>
|
|
140
124
|
</div>
|
|
141
|
-
<div class="integration-tags">
|
|
142
|
-
<span class="integration-tag oauth">OAuth</span
|
|
143
|
-
><span class="integration-tag ready">Ready</span>
|
|
144
|
-
</div>
|
|
145
125
|
</div>
|
|
146
126
|
<div class="integration-card">
|
|
147
127
|
<div class="integration-head">
|
|
148
|
-
<span class="integration-mark
|
|
128
|
+
<span class="integration-mark"
|
|
129
|
+
><img src="/integration-logos/gitlab.svg" alt=""
|
|
130
|
+
/></span>
|
|
149
131
|
<div><strong>GitLab</strong><small>Repos & CI/CD</small></div>
|
|
150
132
|
</div>
|
|
151
|
-
<div class="integration-tags">
|
|
152
|
-
<span class="integration-tag oauth">OAuth</span
|
|
153
|
-
><span class="integration-tag restricted">Beta / restricted</span>
|
|
154
|
-
</div>
|
|
155
133
|
</div>
|
|
156
134
|
<div class="integration-card">
|
|
157
135
|
<div class="integration-head">
|
|
158
|
-
<span class="integration-mark
|
|
136
|
+
<span class="integration-mark"
|
|
137
|
+
><img src="/integration-logos/figma.svg" alt=""
|
|
138
|
+
/></span>
|
|
159
139
|
<div><strong>Figma</strong><small>Design context</small></div>
|
|
160
140
|
</div>
|
|
161
|
-
<div class="integration-tags">
|
|
162
|
-
<span class="integration-tag manual">Manual setup</span
|
|
163
|
-
><span class="integration-tag restricted">Approved clients</span>
|
|
164
|
-
</div>
|
|
165
141
|
</div>
|
|
166
142
|
<div class="integration-card">
|
|
167
143
|
<div class="integration-head">
|
|
168
|
-
<span class="integration-mark
|
|
144
|
+
<span class="integration-mark"
|
|
145
|
+
><img src="/integration-logos/canva.svg" alt=""
|
|
146
|
+
/></span>
|
|
169
147
|
<div><strong>Canva</strong><small>Designs & assets</small></div>
|
|
170
148
|
</div>
|
|
171
|
-
<div class="integration-tags">
|
|
172
|
-
<span class="integration-tag manual">Manual setup</span
|
|
173
|
-
><span class="integration-tag restricted">Approved domains</span>
|
|
174
|
-
</div>
|
|
175
149
|
</div>
|
|
176
150
|
<div class="integration-card">
|
|
177
151
|
<div class="integration-head">
|
|
178
|
-
<span class="integration-mark
|
|
152
|
+
<span class="integration-mark"
|
|
153
|
+
><img src="/integration-logos/vercel.svg" alt=""
|
|
154
|
+
/></span>
|
|
179
155
|
<div><strong>Vercel</strong><small>Deployments & logs</small></div>
|
|
180
156
|
</div>
|
|
181
|
-
<div class="integration-tags">
|
|
182
|
-
<span class="integration-tag manual">Manual setup</span
|
|
183
|
-
><span class="integration-tag restricted">Approved clients</span>
|
|
184
|
-
</div>
|
|
185
157
|
</div>
|
|
186
158
|
<div class="integration-card">
|
|
187
159
|
<div class="integration-head">
|
|
188
|
-
<span class="integration-mark
|
|
160
|
+
<span class="integration-mark"
|
|
161
|
+
><img src="/integration-logos/github.svg" alt=""
|
|
162
|
+
/></span>
|
|
189
163
|
<div><strong>GitHub</strong><small>Code & pull requests</small></div>
|
|
190
164
|
</div>
|
|
191
|
-
<div class="integration-tags">
|
|
192
|
-
<span class="integration-tag manual">Manual setup</span
|
|
193
|
-
><span class="integration-tag restricted">Provider setup</span>
|
|
194
|
-
</div>
|
|
195
165
|
</div>
|
|
196
166
|
<div class="integration-card">
|
|
197
167
|
<div class="integration-head">
|
|
198
|
-
<span class="integration-mark
|
|
168
|
+
<span class="integration-mark"
|
|
169
|
+
><img src="/integration-logos/slack.svg" alt=""
|
|
170
|
+
/></span>
|
|
199
171
|
<div><strong>Slack</strong><small>Messages & channels</small></div>
|
|
200
172
|
</div>
|
|
201
|
-
<div class="integration-tags">
|
|
202
|
-
<span class="integration-tag manual">Manual setup</span
|
|
203
|
-
><span class="integration-tag restricted">Approved clients</span>
|
|
204
|
-
</div>
|
|
205
173
|
</div>
|
|
206
174
|
<div class="integration-card">
|
|
207
175
|
<div class="integration-head">
|
|
208
|
-
<span class="integration-mark
|
|
176
|
+
<span class="integration-mark"
|
|
177
|
+
><img src="/integration-logos/asana.svg" alt=""
|
|
178
|
+
/></span>
|
|
209
179
|
<div><strong>Asana</strong><small>Tasks & projects</small></div>
|
|
210
180
|
</div>
|
|
211
|
-
<div class="integration-tags">
|
|
212
|
-
<span class="integration-tag manual">Manual setup</span
|
|
213
|
-
><span class="integration-tag restricted">Provider setup</span>
|
|
214
|
-
</div>
|
|
215
181
|
</div>
|
|
216
182
|
<div class="integration-card">
|
|
217
183
|
<div class="integration-head">
|
|
218
|
-
<span class="integration-mark
|
|
184
|
+
<span class="integration-mark"
|
|
185
|
+
><img src="/integration-logos/hubspot.svg" alt=""
|
|
186
|
+
/></span>
|
|
219
187
|
<div><strong>HubSpot</strong><small>CRM & customer data</small></div>
|
|
220
188
|
</div>
|
|
221
|
-
<div class="integration-tags">
|
|
222
|
-
<span class="integration-tag manual">Manual setup</span
|
|
223
|
-
><span class="integration-tag restricted">Provider setup</span>
|
|
224
|
-
</div>
|
|
225
189
|
</div>
|
|
226
190
|
<div class="integration-card">
|
|
227
191
|
<div class="integration-head">
|
|
228
|
-
<span class="integration-mark
|
|
192
|
+
<span class="integration-mark"
|
|
193
|
+
><img src="/integration-logos/intercom.svg" alt=""
|
|
194
|
+
/></span>
|
|
229
195
|
<div><strong>Intercom</strong><small>Support conversations</small></div>
|
|
230
196
|
</div>
|
|
231
|
-
<div class="integration-tags">
|
|
232
|
-
<span class="integration-tag oauth">OAuth</span
|
|
233
|
-
><span class="integration-tag ready">Ready</span>
|
|
234
|
-
</div>
|
|
235
197
|
</div>
|
|
236
198
|
<div class="integration-card">
|
|
237
199
|
<div class="integration-head">
|
|
238
|
-
<span class="integration-mark
|
|
200
|
+
<span class="integration-mark"
|
|
201
|
+
><img src="/integration-logos/monday.svg" alt=""
|
|
202
|
+
/></span>
|
|
239
203
|
<div><strong>monday.com</strong><small>Work management</small></div>
|
|
240
204
|
</div>
|
|
241
|
-
<div class="integration-tags">
|
|
242
|
-
<span class="integration-tag oauth">OAuth</span
|
|
243
|
-
><span class="integration-tag ready">Ready</span>
|
|
244
|
-
</div>
|
|
245
205
|
</div>
|
|
246
206
|
<div class="integration-card">
|
|
247
207
|
<div class="integration-head">
|
|
248
|
-
<span class="integration-mark
|
|
208
|
+
<span class="integration-mark"
|
|
209
|
+
><img src="/integration-logos/webflow.svg" alt=""
|
|
210
|
+
/></span>
|
|
249
211
|
<div><strong>Webflow</strong><small>Websites & CMS</small></div>
|
|
250
212
|
</div>
|
|
251
|
-
<div class="integration-tags">
|
|
252
|
-
<span class="integration-tag oauth">OAuth</span
|
|
253
|
-
><span class="integration-tag ready">Ready</span>
|
|
254
|
-
</div>
|
|
255
213
|
</div>
|
|
256
214
|
<div class="integration-card">
|
|
257
215
|
<div class="integration-head">
|
|
258
|
-
<span class="integration-mark
|
|
216
|
+
<span class="integration-mark"
|
|
217
|
+
><img src="/integration-logos/paypal.svg" alt=""
|
|
218
|
+
/></span>
|
|
259
219
|
<div><strong>PayPal</strong><small>Commerce & invoices</small></div>
|
|
260
220
|
</div>
|
|
261
|
-
<div class="integration-tags">
|
|
262
|
-
<span class="integration-tag oauth">OAuth</span
|
|
263
|
-
><span class="integration-tag ready">Ready</span>
|
|
264
|
-
</div>
|
|
265
221
|
</div>
|
|
266
222
|
<div class="integration-card">
|
|
267
223
|
<div class="integration-head">
|
|
268
|
-
<span class="integration-mark
|
|
224
|
+
<span class="integration-mark"
|
|
225
|
+
><img src="/integration-logos/box.svg" alt=""
|
|
226
|
+
/></span>
|
|
269
227
|
<div><strong>Box</strong><small>Files & folders</small></div>
|
|
270
228
|
</div>
|
|
271
|
-
<div class="integration-tags">
|
|
272
|
-
<span class="integration-tag manual">Manual setup</span
|
|
273
|
-
><span class="integration-tag restricted">Beta / restricted</span>
|
|
274
|
-
</div>
|
|
275
229
|
</div>
|
|
276
230
|
<div class="integration-card">
|
|
277
231
|
<div class="integration-head">
|
|
278
|
-
<span class="integration-mark
|
|
232
|
+
<span class="integration-mark"
|
|
233
|
+
><img src="/integration-logos/netlify.svg" alt=""
|
|
234
|
+
/></span>
|
|
279
235
|
<div><strong>Netlify</strong><small>Sites & builds</small></div>
|
|
280
236
|
</div>
|
|
281
|
-
<div class="integration-tags">
|
|
282
|
-
<span class="integration-tag oauth">OAuth</span
|
|
283
|
-
><span class="integration-tag ready">Ready</span>
|
|
284
|
-
</div>
|
|
285
237
|
</div>
|
|
286
238
|
<div class="integration-card">
|
|
287
239
|
<div class="integration-head">
|
|
288
|
-
<span class="integration-mark
|
|
240
|
+
<span class="integration-mark"
|
|
241
|
+
><img src="/integration-logos/zapier.svg" alt=""
|
|
242
|
+
/></span>
|
|
289
243
|
<div><strong>Zapier</strong><small>Automation actions</small></div>
|
|
290
244
|
</div>
|
|
291
|
-
<div class="integration-tags">
|
|
292
|
-
<span class="integration-tag token">Header / token</span
|
|
293
|
-
><span class="integration-tag restricted">User server</span>
|
|
294
|
-
</div>
|
|
295
245
|
</div>
|
|
296
246
|
</div>
|
|
297
247
|
```
|
|
@@ -304,9 +254,8 @@ shipped MCP preset categories documented below.
|
|
|
304
254
|
}
|
|
305
255
|
.integration-card {
|
|
306
256
|
display: flex;
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
min-height: 118px;
|
|
257
|
+
align-items: center;
|
|
258
|
+
min-height: 70px;
|
|
310
259
|
padding: 14px;
|
|
311
260
|
border: 1px solid var(--wf-line);
|
|
312
261
|
border-radius: 12px;
|
|
@@ -343,128 +292,13 @@ shipped MCP preset categories documented below.
|
|
|
343
292
|
height: 38px;
|
|
344
293
|
flex: none;
|
|
345
294
|
border-radius: 10px;
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
font-weight: 800;
|
|
349
|
-
letter-spacing: -0.04em;
|
|
350
|
-
}
|
|
351
|
-
.c7 {
|
|
352
|
-
background: #1f6feb;
|
|
353
|
-
}
|
|
354
|
-
.sentry {
|
|
355
|
-
background: #5b35d5;
|
|
356
|
-
}
|
|
357
|
-
.notion {
|
|
358
|
-
background: #111;
|
|
359
|
-
}
|
|
360
|
-
.semgrep {
|
|
361
|
-
background: #0d8b76;
|
|
362
|
-
}
|
|
363
|
-
.linear {
|
|
364
|
-
background: #5e5ce6;
|
|
365
|
-
}
|
|
366
|
-
.atlassian {
|
|
367
|
-
background: #1868db;
|
|
368
|
-
}
|
|
369
|
-
.supabase {
|
|
370
|
-
background: #3ecf8e;
|
|
371
|
-
color: #062b1a;
|
|
372
|
-
}
|
|
373
|
-
.neon {
|
|
374
|
-
background: #00e5a0;
|
|
375
|
-
color: #062b1a;
|
|
376
|
-
}
|
|
377
|
-
.stripe {
|
|
378
|
-
background: #635bff;
|
|
379
|
-
}
|
|
380
|
-
.cloudflare {
|
|
381
|
-
background: #f38020;
|
|
382
|
-
}
|
|
383
|
-
.gitlab {
|
|
384
|
-
background: #fc6d26;
|
|
385
|
-
}
|
|
386
|
-
.figma {
|
|
387
|
-
background: #f24e1e;
|
|
388
|
-
}
|
|
389
|
-
.canva {
|
|
390
|
-
background: #00c4cc;
|
|
391
|
-
color: #053b40;
|
|
392
|
-
}
|
|
393
|
-
.vercel {
|
|
394
|
-
background: #111;
|
|
395
|
-
}
|
|
396
|
-
.github {
|
|
397
|
-
background: #24292f;
|
|
398
|
-
}
|
|
399
|
-
.slack {
|
|
400
|
-
background: #36c5f0;
|
|
401
|
-
color: #082c3b;
|
|
402
|
-
}
|
|
403
|
-
.asana {
|
|
404
|
-
background: #f06a6a;
|
|
405
|
-
}
|
|
406
|
-
.hubspot {
|
|
407
|
-
background: #ff7a59;
|
|
408
|
-
}
|
|
409
|
-
.intercom {
|
|
410
|
-
background: #286efa;
|
|
411
|
-
}
|
|
412
|
-
.monday {
|
|
413
|
-
background: #6161ff;
|
|
414
|
-
}
|
|
415
|
-
.webflow {
|
|
416
|
-
background: #146ef5;
|
|
417
|
-
}
|
|
418
|
-
.paypal {
|
|
419
|
-
background: #003087;
|
|
420
|
-
}
|
|
421
|
-
.box {
|
|
422
|
-
background: #0061d5;
|
|
423
|
-
}
|
|
424
|
-
.netlify {
|
|
425
|
-
background: #05bdbb;
|
|
426
|
-
color: #062b2b;
|
|
427
|
-
}
|
|
428
|
-
.zapier {
|
|
429
|
-
background: #ff4f00;
|
|
430
|
-
}
|
|
431
|
-
.integration-tags {
|
|
432
|
-
display: flex;
|
|
433
|
-
flex-wrap: wrap;
|
|
434
|
-
gap: 5px;
|
|
435
|
-
margin-top: auto;
|
|
436
|
-
}
|
|
437
|
-
.integration-tag {
|
|
438
|
-
padding: 4px 7px;
|
|
439
|
-
border-radius: 999px;
|
|
440
|
-
background: var(--wf-line);
|
|
441
|
-
color: var(--wf-muted);
|
|
442
|
-
font-size: 10px;
|
|
443
|
-
line-height: 1;
|
|
444
|
-
}
|
|
445
|
-
.integration-tag.oauth {
|
|
446
|
-
background: #e8e7ff;
|
|
447
|
-
color: #4438a8;
|
|
448
|
-
}
|
|
449
|
-
.integration-tag.manual {
|
|
450
|
-
background: #fff0d6;
|
|
451
|
-
color: #8a5200;
|
|
452
|
-
}
|
|
453
|
-
.integration-tag.token {
|
|
454
|
-
background: #e5f3ff;
|
|
455
|
-
color: #075985;
|
|
456
|
-
}
|
|
457
|
-
.integration-tag.direct {
|
|
458
|
-
background: #e1f7ee;
|
|
459
|
-
color: #146c4b;
|
|
460
|
-
}
|
|
461
|
-
.integration-tag.ready {
|
|
462
|
-
background: #e1f7ee;
|
|
463
|
-
color: #146c4b;
|
|
295
|
+
background: #fff;
|
|
296
|
+
box-shadow: inset 0 0 0 1px rgba(15, 23, 42, 0.08);
|
|
464
297
|
}
|
|
465
|
-
.integration-
|
|
466
|
-
|
|
467
|
-
|
|
298
|
+
.integration-mark img {
|
|
299
|
+
width: 26px;
|
|
300
|
+
height: 26px;
|
|
301
|
+
object-fit: contain;
|
|
468
302
|
}
|
|
469
303
|
@media (max-width: 760px) {
|
|
470
304
|
.integration-wall {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-native/core",
|
|
3
|
-
"version": "0.109.
|
|
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
|