@agent-native/core 0.114.13 → 0.114.15

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 (151) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +15 -0
  3. package/corpus/core/docs/content/deployment.mdx +1 -1
  4. package/corpus/core/docs/content/frames.mdx +1 -1
  5. package/corpus/core/docs/content/integrations.mdx +27 -27
  6. package/corpus/core/docs/content/pr-visual-recap.mdx +17 -13
  7. package/corpus/core/docs/content/workspace-management.mdx +1 -1
  8. package/corpus/core/package.json +2 -1
  9. package/corpus/core/src/agent/engine/builder-engine.ts +4 -0
  10. package/corpus/core/src/client/AgentPanel.tsx +10 -4
  11. package/corpus/core/src/client/ConnectBuilderCard.tsx +5 -1
  12. package/corpus/core/src/client/chat/markdown-renderer.tsx +3 -5
  13. package/corpus/core/src/client/error-format.ts +2 -1
  14. package/corpus/core/src/client/index.ts +1 -0
  15. package/corpus/core/src/client/integrations/IntegrationsPanel.tsx +2 -18
  16. package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +43 -32
  17. package/corpus/core/src/client/resources/mcp-integration-catalog.ts +4 -2
  18. package/corpus/core/src/client/settings/BackgroundAgentSection.tsx +5 -1
  19. package/corpus/core/src/client/settings/SettingsPanel.tsx +4 -4
  20. package/corpus/core/src/client/settings/useBuilderStatus.ts +3 -0
  21. package/corpus/core/src/localization/default-messages.ts +1 -7
  22. package/corpus/core/src/server/builder-browser.ts +4 -0
  23. package/corpus/core/src/server/builder-design-systems.ts +6 -1
  24. package/corpus/core/src/server/fusion-app.ts +5 -1
  25. package/corpus/core/src/shared/builder-link-tracking.ts +41 -0
  26. package/corpus/core/src/shared/index.ts +1 -0
  27. package/corpus/templates/analytics/AGENTS.md +10 -1
  28. package/corpus/templates/analytics/actions/save-dashboard-report-subscription.ts +10 -2
  29. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +5 -4
  30. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +20 -32
  31. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/report-panel-window.ts +62 -0
  32. package/corpus/templates/analytics/changelog/2026-07-21-chart-series-controls-stay-open-while-moving-from-the-legend.md +6 -0
  33. package/corpus/templates/analytics/changelog/2026-07-21-dashboard-email-captures-complete-large-dashboards-in-chunks.md +6 -0
  34. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +4 -4
  35. package/corpus/templates/analytics/server/jobs/dashboard-report.ts +1 -8
  36. package/corpus/templates/analytics/server/lib/dashboard-report-subscriptions.ts +39 -7
  37. package/corpus/templates/analytics/server/lib/dashboard-report.ts +341 -251
  38. package/corpus/templates/analytics/server/lib/first-party-dashboard-repair.ts +114 -0
  39. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +84 -6
  40. package/corpus/templates/analytics/server/plugins/db.ts +13 -0
  41. package/corpus/templates/clips/app/components/player/video-player.tsx +10 -4
  42. package/corpus/templates/clips/changelog/2026-07-21-choose-which-whisper-model-to-use-in-settings.md +6 -0
  43. package/corpus/templates/clips/changelog/2026-07-21-fixed-organization-recording-visibility-default.md +6 -0
  44. package/corpus/templates/clips/changelog/2026-07-21-meeting-notes-stop-when-calls-end.md +6 -0
  45. package/corpus/templates/clips/desktop/src/app.tsx +66 -75
  46. package/corpus/templates/clips/desktop/src/hooks/useMeetingTranscription.ts +2 -0
  47. package/corpus/templates/clips/desktop/src/hooks/useWhisperSettings.ts +172 -0
  48. package/corpus/templates/clips/desktop/src/lib/meeting-call-app.ts +41 -0
  49. package/corpus/templates/clips/desktop/src/lib/silence-events.ts +1 -0
  50. package/corpus/templates/clips/desktop/src/shared/config.ts +1 -0
  51. package/corpus/templates/clips/desktop/src/styles.css +80 -7
  52. package/corpus/templates/clips/desktop/src-tauri/src/config.rs +32 -0
  53. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +3 -0
  54. package/corpus/templates/clips/desktop/src-tauri/src/silence_detector.rs +268 -20
  55. package/corpus/templates/clips/desktop/src-tauri/src/whisper_model.rs +285 -164
  56. package/corpus/templates/clips/desktop/src-tauri/src/whisper_speech.rs +18 -7
  57. package/corpus/templates/clips/learnings.defaults.md +1 -1
  58. package/corpus/templates/clips/server/plugins/db.ts +11 -0
  59. package/corpus/templates/clips/shared/builder-credits.ts +1 -1
  60. package/corpus/templates/design/app/components/design/FusionAppBanner.tsx +9 -1
  61. package/corpus/templates/design/app/components/design/edit-panel/component-section.tsx +5 -1
  62. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +9 -1
  63. package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +9 -1
  64. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  65. package/dist/agent/engine/builder-engine.js +4 -0
  66. package/dist/agent/engine/builder-engine.js.map +1 -1
  67. package/dist/client/AgentPanel.d.ts.map +1 -1
  68. package/dist/client/AgentPanel.js +10 -3
  69. package/dist/client/AgentPanel.js.map +1 -1
  70. package/dist/client/ConnectBuilderCard.d.ts.map +1 -1
  71. package/dist/client/ConnectBuilderCard.js +5 -1
  72. package/dist/client/ConnectBuilderCard.js.map +1 -1
  73. package/dist/client/chat/markdown-renderer.d.ts.map +1 -1
  74. package/dist/client/chat/markdown-renderer.js +3 -2
  75. package/dist/client/chat/markdown-renderer.js.map +1 -1
  76. package/dist/client/error-format.d.ts +1 -1
  77. package/dist/client/error-format.d.ts.map +1 -1
  78. package/dist/client/error-format.js +1 -1
  79. package/dist/client/error-format.js.map +1 -1
  80. package/dist/client/index.d.ts +1 -0
  81. package/dist/client/index.d.ts.map +1 -1
  82. package/dist/client/index.js +1 -0
  83. package/dist/client/index.js.map +1 -1
  84. package/dist/client/integrations/IntegrationsPanel.d.ts.map +1 -1
  85. package/dist/client/integrations/IntegrationsPanel.js +3 -4
  86. package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
  87. package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
  88. package/dist/client/resources/McpIntegrationDialog.js +21 -7
  89. package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
  90. package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
  91. package/dist/client/resources/mcp-integration-catalog.js +2 -2
  92. package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
  93. package/dist/client/settings/BackgroundAgentSection.d.ts.map +1 -1
  94. package/dist/client/settings/BackgroundAgentSection.js +5 -1
  95. package/dist/client/settings/BackgroundAgentSection.js.map +1 -1
  96. package/dist/client/settings/SettingsPanel.js +1 -1
  97. package/dist/client/settings/SettingsPanel.js.map +1 -1
  98. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  99. package/dist/client/settings/useBuilderStatus.js +2 -0
  100. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  101. package/dist/collab/struct-routes.d.ts +1 -1
  102. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  103. package/dist/localization/default-messages.d.ts +0 -6
  104. package/dist/localization/default-messages.d.ts.map +1 -1
  105. package/dist/localization/default-messages.js +1 -7
  106. package/dist/localization/default-messages.js.map +1 -1
  107. package/dist/notifications/routes.d.ts +3 -3
  108. package/dist/observability/routes.d.ts +1 -1
  109. package/dist/resources/handlers.d.ts +1 -1
  110. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  111. package/dist/server/builder-browser.d.ts.map +1 -1
  112. package/dist/server/builder-browser.js +4 -0
  113. package/dist/server/builder-browser.js.map +1 -1
  114. package/dist/server/builder-design-systems.d.ts.map +1 -1
  115. package/dist/server/builder-design-systems.js +6 -1
  116. package/dist/server/builder-design-systems.js.map +1 -1
  117. package/dist/server/fusion-app.d.ts.map +1 -1
  118. package/dist/server/fusion-app.js +2 -1
  119. package/dist/server/fusion-app.js.map +1 -1
  120. package/dist/shared/builder-link-tracking.d.ts +14 -0
  121. package/dist/shared/builder-link-tracking.d.ts.map +1 -0
  122. package/dist/shared/builder-link-tracking.js +26 -0
  123. package/dist/shared/builder-link-tracking.js.map +1 -0
  124. package/dist/shared/index.d.ts +1 -0
  125. package/dist/shared/index.d.ts.map +1 -1
  126. package/dist/shared/index.js +1 -0
  127. package/dist/shared/index.js.map +1 -1
  128. package/docs/content/deployment.mdx +1 -1
  129. package/docs/content/frames.mdx +1 -1
  130. package/docs/content/integrations.mdx +27 -27
  131. package/docs/content/pr-visual-recap.mdx +17 -13
  132. package/docs/content/workspace-management.mdx +1 -1
  133. package/package.json +3 -2
  134. package/src/agent/engine/builder-engine.ts +4 -0
  135. package/src/client/AgentPanel.tsx +10 -4
  136. package/src/client/ConnectBuilderCard.tsx +5 -1
  137. package/src/client/chat/markdown-renderer.tsx +3 -5
  138. package/src/client/error-format.ts +2 -1
  139. package/src/client/index.ts +1 -0
  140. package/src/client/integrations/IntegrationsPanel.tsx +2 -18
  141. package/src/client/resources/McpIntegrationDialog.tsx +43 -32
  142. package/src/client/resources/mcp-integration-catalog.ts +4 -2
  143. package/src/client/settings/BackgroundAgentSection.tsx +5 -1
  144. package/src/client/settings/SettingsPanel.tsx +4 -4
  145. package/src/client/settings/useBuilderStatus.ts +3 -0
  146. package/src/localization/default-messages.ts +1 -7
  147. package/src/server/builder-browser.ts +4 -0
  148. package/src/server/builder-design-systems.ts +6 -1
  149. package/src/server/fusion-app.ts +5 -1
  150. package/src/shared/builder-link-tracking.ts +41 -0
  151. package/src/shared/index.ts +1 -0
@@ -1 +1 @@
1
- {"version":3,"file":"builder-design-systems.js","sourceRoot":"","sources":["../../src/server/builder-design-systems.ts"],"names":[],"mappings":"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","sourcesContent":["import { FeatureNotConfiguredError } from \"./credential-provider.js\";\nimport {\n getBuilderProxyOrigin,\n resolveBuilderCredentials,\n} from \"./credential-provider.js\";\n\nconst DEFAULT_TIMEOUT_MS = 120_000;\n\nexport interface BuilderDesignSystemIndexFile {\n name: string;\n data: Uint8Array;\n mimeType?: string;\n}\n\nexport interface BuilderDesignSystemCodeFileInput {\n filename: string;\n content: string;\n mimeType?: string;\n /**\n * How `content` is encoded. Defaults to `\"utf8\"` (existing behavior,\n * unchanged for every current text-file caller). Pass `\"base64\"` for\n * binary files -- most importantly `.fig` (a zip/kiwi binary container,\n * never valid UTF-8 text). Without this, a `.fig` upload silently\n * corrupts: `mimeTypeForBuilderDesignSystemFilename` already special-cases\n * `.fig` as `application/octet-stream`, but the actual byte pipeline ran\n * every file through `TextEncoder().encode()` regardless, which mangles\n * any byte >= 0x80 in a binary-as-string payload (or, if the caller\n * base64-encoded first with no decode step here, stores the literal\n * base64 text instead of the decoded binary). Callers sending `.fig`/PDF/\n * other binary bytes must base64-encode `content` and set this to\n * `\"base64\"`.\n */\n encoding?: \"utf8\" | \"base64\";\n}\n\nexport interface BuildBuilderDesignSystemIndexFilesOptions {\n codeFiles?: BuilderDesignSystemCodeFileInput[];\n designMd?: string;\n designMdFilename?: string;\n maxCodeFiles?: number;\n maxTotalCodeBytes?: number;\n /** Default keeps legacy best-effort code indexing; upload/chat surfaces should fail loudly. */\n overflowBehavior?: \"skip\" | \"throw\";\n}\n\nexport interface BuilderDesignSystemProxyFieldsOptions {\n result: BuilderDesignSystemIndexResult;\n projectName?: string;\n description?: string;\n surface: \"design\" | \"slides\";\n}\n\nexport interface BuilderDesignSystemProxyFields {\n title: string;\n description: string;\n data: string;\n customInstructions: string;\n}\n\nexport interface BuilderDesignSystemProxyReference {\n source: \"builder\";\n builderDesignSystemId: string;\n builderJobId: string;\n builderProjectId?: string;\n builderUrl?: string;\n builderStatus?: string;\n}\n\nexport interface BuilderDesignSystemDocsOptions {\n page?: number;\n pageSize?: number;\n minimal?: boolean;\n type?: string;\n}\n\nexport interface BuilderDesignSystemDocument {\n id?: string;\n name?: string;\n type?: string;\n description?: string;\n content?: string;\n tokenValues?: Record<string, string>;\n rawTokens?: string[];\n relevantFiles?: string[];\n relatedComponents?: string[];\n}\n\nexport interface BuilderDesignSystemHydratedReference extends BuilderDesignSystemProxyReference {\n docs: BuilderDesignSystemDocument[];\n tokenValues: Record<string, string>;\n docCount: number;\n}\n\nexport interface BuilderDesignSystemIndexOptions {\n projectName?: string;\n description?: string;\n githubRepoUrl?: string;\n connectedProjectId?: string;\n files?: BuilderDesignSystemIndexFile[];\n selection?: Record<string, string[]>;\n devToolsVersion?: string;\n}\n\nexport interface BuilderDesignSystemIndexResult {\n ok: true;\n source: \"builder\";\n projectId: string;\n jobId: string;\n designSystemId: string;\n suggestedTitle: string | null;\n builderUrl: string;\n status: \"in-progress\";\n}\n\ninterface BuilderDesignSystemCredentials {\n privateKey: string;\n publicKey: string;\n userId: string | null;\n}\n\ninterface UploadStartResponse {\n uploads?: Array<{ idx: number; uploadUrl: string; uploadToken: string }>;\n}\n\ninterface GenerateResponse {\n projectId?: string;\n jobId?: string;\n designSystemId?: string;\n}\n\nconst DEFAULT_MAX_CODE_FILES = 50;\nconst DEFAULT_MAX_TOTAL_CODE_BYTES = 2 * 1024 * 1024;\nconst MAX_DOC_CONTENT_CHARS = 4_000;\n\nfunction trimTrailingSlash(value: string): string {\n return value.replace(/\\/+$/, \"\");\n}\n\nexport function getBuilderDesignSystemsBaseUrl(): string {\n return (\n process.env.BUILDER_DESIGN_SYSTEMS_BASE_URL ||\n `${trimTrailingSlash(getBuilderProxyOrigin())}/design-systems/v1`\n );\n}\n\nfunction getBuilderAppHost(): string {\n return (\n process.env.BUILDER_APP_HOST ||\n process.env.BUILDER_PUBLIC_APP_HOST ||\n \"https://builder.io\"\n );\n}\n\nfunction makeBuilderDesignSystemUrl(\n path: string,\n credentials: BuilderDesignSystemCredentials,\n): URL {\n const base = `${trimTrailingSlash(getBuilderDesignSystemsBaseUrl())}/`;\n const url = new URL(path.replace(/^\\/+/, \"\"), base);\n url.searchParams.set(\"apiKey\", credentials.publicKey);\n if (credentials.userId) url.searchParams.set(\"userId\", credentials.userId);\n return url;\n}\n\nfunction makeBuilderHeaders(\n credentials: BuilderDesignSystemCredentials,\n): Record<string, string> {\n return {\n Authorization: `Bearer ${credentials.privateKey}`,\n \"x-builder-api-key\": credentials.publicKey,\n ...(credentials.userId ? { \"x-builder-user-id\": credentials.userId } : {}),\n };\n}\n\nexport function mimeTypeForBuilderDesignSystemFilename(\n filename: string,\n explicit?: string,\n): string {\n if (explicit?.trim()) return explicit.trim();\n const lower = filename.toLowerCase();\n if (lower.endsWith(\".fig\")) return \"application/octet-stream\";\n if (lower.endsWith(\".pdf\")) return \"application/pdf\";\n if (lower.endsWith(\".md\") || lower.endsWith(\".markdown\"))\n return \"text/markdown\";\n if (lower.endsWith(\".mdx\")) return \"text/markdown\";\n if (lower.endsWith(\".json\")) return \"application/json\";\n if (lower.endsWith(\".css\")) return \"text/css\";\n if (lower.endsWith(\".html\") || lower.endsWith(\".htm\")) return \"text/html\";\n if (lower.endsWith(\".svg\")) return \"image/svg+xml\";\n return \"text/plain\";\n}\n\nexport function buildBuilderDesignSystemIndexFiles({\n codeFiles,\n designMd,\n designMdFilename,\n maxCodeFiles = DEFAULT_MAX_CODE_FILES,\n maxTotalCodeBytes = DEFAULT_MAX_TOTAL_CODE_BYTES,\n overflowBehavior = \"skip\",\n}: BuildBuilderDesignSystemIndexFilesOptions): BuilderDesignSystemIndexFile[] {\n const encoder = new TextEncoder();\n const files: BuilderDesignSystemIndexFile[] = [];\n let totalBytes = 0;\n\n function pushFile(\n filename: string,\n content: string,\n mimeType?: string,\n encoding?: \"utf8\" | \"base64\",\n ) {\n const normalizedName = filename.replace(/^\\/+/, \"\") || \"code.txt\";\n // `.fig`/PDF/other binary payloads must round-trip through base64, not\n // UTF-8 -- TextEncoder().encode() on a binary-as-string payload mangles\n // any byte >= 0x80. See BuilderDesignSystemCodeFileInput.encoding.\n const data =\n encoding === \"base64\"\n ? new Uint8Array(Buffer.from(content, \"base64\"))\n : encoder.encode(content);\n if (data.byteLength === 0) return;\n if (totalBytes + data.byteLength > maxTotalCodeBytes) {\n if (overflowBehavior === \"throw\") {\n throw new Error(\n `Design-system file \"${normalizedName}\" exceeds the ${Math.round(maxTotalCodeBytes / 1024 / 1024)} MB inline upload budget. Use the dedicated file upload instead of sending large binary files through an action payload.`,\n );\n }\n return;\n }\n totalBytes += data.byteLength;\n files.push({\n name: normalizedName,\n data,\n mimeType: mimeTypeForBuilderDesignSystemFilename(\n normalizedName,\n mimeType,\n ),\n });\n }\n\n if (designMd?.trim()) {\n pushFile(\n designMdFilename?.trim() || \"design.md\",\n designMd,\n \"text/markdown\",\n );\n }\n\n if (overflowBehavior === \"throw\" && (codeFiles?.length ?? 0) > maxCodeFiles) {\n throw new Error(\n `Too many design-system files (max ${maxCodeFiles}); no files were indexed.`,\n );\n }\n for (const file of (codeFiles ?? []).slice(0, maxCodeFiles)) {\n pushFile(file.filename, file.content, file.mimeType, file.encoding);\n }\n\n return files;\n}\n\nasync function resolveBuilderDesignSystemCredentials(): Promise<BuilderDesignSystemCredentials> {\n const credentials = await resolveBuilderCredentials();\n if (!credentials.privateKey || !credentials.publicKey) {\n throw new FeatureNotConfiguredError({\n requiredCredential: \"BUILDER_PRIVATE_KEY\",\n message:\n \"Connect Builder.io before indexing a design system from Figma or code.\",\n builderConnectUrl: \"/_agent-native/builder/connect\",\n });\n }\n return {\n privateKey: credentials.privateKey,\n publicKey: credentials.publicKey,\n userId: credentials.userId ?? null,\n };\n}\n\nfunction mimeTypeForFile(file: BuilderDesignSystemIndexFile): string {\n return mimeTypeForBuilderDesignSystemFilename(file.name, file.mimeType);\n}\n\nfunction makeBody(bytes: Uint8Array, mimeType: string): BodyInit {\n return typeof Blob !== \"undefined\"\n ? new Blob([bytes as unknown as BlobPart], { type: mimeType })\n : (bytes as unknown as BodyInit);\n}\n\nasync function fetchWithTimeout(\n url: string | URL,\n init: RequestInit,\n timeoutMs = DEFAULT_TIMEOUT_MS,\n): Promise<Response> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } finally {\n clearTimeout(timer);\n }\n}\n\nasync function parseErrorBody(response: Response): Promise<string> {\n const text = await response.text().catch(() => \"\");\n if (!text) return response.statusText || `HTTP ${response.status}`;\n try {\n const json = JSON.parse(text) as { error?: unknown };\n if (typeof json.error === \"string\") return json.error;\n if (json.error && typeof json.error === \"object\") {\n return JSON.stringify(json.error).slice(0, 500);\n }\n } catch {}\n return text.replace(/\\s+/g, \" \").trim().slice(0, 500);\n}\n\nasync function assertOk(response: Response, label: string): Promise<void> {\n if (response.ok) return;\n throw new Error(\n `${label} (${response.status}): ${await parseErrorBody(response)}`,\n );\n}\n\nasync function uploadToResumableUrl(\n slot: { uploadUrl: string },\n file: BuilderDesignSystemIndexFile,\n): Promise<void> {\n const mimeType = mimeTypeForFile(file);\n const bytes = file.data;\n const start = await fetchWithTimeout(slot.uploadUrl, {\n method: \"POST\",\n headers: {\n \"x-goog-resumable\": \"start\",\n \"x-goog-content-length-range\": `0,${bytes.byteLength}`,\n \"Content-Type\": mimeType,\n },\n });\n await assertOk(start, \"Builder design-system upload session failed\");\n const sessionUrl = start.headers.get(\"Location\");\n if (!sessionUrl) {\n throw new Error(\"Builder design-system upload session returned no URL.\");\n }\n\n const response = await fetchWithTimeout(sessionUrl, {\n method: \"PUT\",\n headers: {\n \"Content-Range\": `bytes 0-${bytes.byteLength - 1}/${bytes.byteLength}`,\n \"Content-Type\": mimeType,\n },\n body: makeBody(bytes, mimeType),\n });\n await assertOk(response, \"Builder design-system file upload failed\");\n}\n\nfunction nonEmptyFiles(\n files: BuilderDesignSystemIndexFile[] | undefined,\n): BuilderDesignSystemIndexFile[] {\n return (files ?? []).filter((file) => file.data.byteLength > 0);\n}\n\nexport function builderDesignSystemUrl(designSystemId?: string | null): string {\n const host = trimTrailingSlash(getBuilderAppHost());\n return designSystemId\n ? `${host}/app/design-system-intelligence/${encodeURIComponent(\n designSystemId,\n )}`\n : `${host}/app/design-system-intelligence`;\n}\n\nexport function localBuilderDesignSystemId(\n builderDesignSystemId: string,\n): string {\n const slug = builderDesignSystemId\n .replace(/[^a-zA-Z0-9_-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 96);\n return `builder-${slug || \"design-system\"}`;\n}\n\nexport function createBuilderDesignSystemProxyFields({\n result,\n projectName,\n description,\n surface,\n}: BuilderDesignSystemProxyFieldsOptions): BuilderDesignSystemProxyFields {\n const title = projectName?.trim() || \"Builder indexed design system\";\n const fallbackDescription =\n description ?? `Builder indexed design system ${result.designSystemId}`;\n const surfaceNoun = surface === \"slides\" ? \"slides\" : \"designs\";\n const spacingKey = surface === \"slides\" ? \"slidePadding\" : \"pagePadding\";\n const data = JSON.stringify({\n source: \"builder\",\n builderDesignSystemId: result.designSystemId,\n builderJobId: result.jobId,\n builderProjectId: result.projectId,\n builderUrl: result.builderUrl,\n builderStatus: result.status,\n colors: {\n primary: \"var(--primary)\",\n secondary: \"var(--secondary)\",\n accent: \"var(--accent)\",\n background: \"var(--background)\",\n surface: \"var(--card)\",\n text: \"var(--foreground)\",\n textMuted: \"var(--muted-foreground)\",\n },\n typography: {\n headingFont: \"inherit\",\n bodyFont: \"inherit\",\n headingWeight: \"700\",\n bodyWeight: \"400\",\n headingSizes: { h1: \"48px\", h2: \"32px\", h3: \"24px\" },\n },\n spacing: { elementGap: \"24px\", [spacingKey]: \"48px\" },\n borders: { radius: \"12px\", accentWidth: \"1px\" },\n logos: [],\n notes: [\n \"This is a local selectable proxy for a Builder DSI-indexed design system.\",\n `Builder design system id: ${result.designSystemId}`,\n `Builder indexing job id: ${result.jobId}`,\n `Builder project id: ${result.projectId}`,\n `Builder URL: ${result.builderUrl}`,\n projectName ? `Requested name: ${projectName}` : \"\",\n description ? `Context: ${description}` : \"\",\n \"Builder Design System Intelligence is the source of truth for indexed tokens, components, assets, and usage guidance.\",\n ]\n .filter(Boolean)\n .join(\"\\n\"),\n });\n const customInstructions = [\n \"This design system is indexed by Builder Design System Intelligence (DSI).\",\n `Builder design system id: ${result.designSystemId}`,\n `Builder job id: ${result.jobId}`,\n `Builder project id: ${result.projectId}`,\n `Builder URL: ${result.builderUrl}`,\n `When generating ${surfaceNoun}, treat Builder DSI as the source of truth for indexed tokens, components, assets, and usage guidance.`,\n \"Call get-design-system for this local id before generation and use the returned builder docs and token values when available.\",\n ].join(\"\\n\");\n\n return {\n title,\n description: fallbackDescription,\n data,\n customInstructions,\n };\n}\n\nexport function parseBuilderDesignSystemProxyReference(\n data: unknown,\n): BuilderDesignSystemProxyReference | null {\n let parsed: unknown = data;\n if (typeof data === \"string\") {\n try {\n parsed = JSON.parse(data);\n } catch {\n return null;\n }\n }\n if (!parsed || typeof parsed !== \"object\") return null;\n const value = parsed as Record<string, unknown>;\n if (value.source !== \"builder\") return null;\n if (typeof value.builderDesignSystemId !== \"string\") return null;\n if (typeof value.builderJobId !== \"string\") return null;\n return {\n source: \"builder\",\n builderDesignSystemId: value.builderDesignSystemId,\n builderJobId: value.builderJobId,\n builderProjectId:\n typeof value.builderProjectId === \"string\"\n ? value.builderProjectId\n : undefined,\n builderUrl:\n typeof value.builderUrl === \"string\" ? value.builderUrl : undefined,\n builderStatus:\n typeof value.builderStatus === \"string\" ? value.builderStatus : undefined,\n };\n}\n\nfunction truncateDocContent(content: unknown): string | undefined {\n if (typeof content !== \"string\") return undefined;\n if (content.length <= MAX_DOC_CONTENT_CHARS) return content;\n return `${content.slice(0, MAX_DOC_CONTENT_CHARS)}\\n\\n[truncated]`;\n}\n\nfunction normalizeBuilderDesignSystemDocument(\n value: unknown,\n): BuilderDesignSystemDocument {\n const doc =\n value && typeof value === \"object\"\n ? (value as Record<string, unknown>)\n : {};\n return {\n id: typeof doc.id === \"string\" ? doc.id : undefined,\n name: typeof doc.name === \"string\" ? doc.name : undefined,\n type: typeof doc.type === \"string\" ? doc.type : undefined,\n description:\n typeof doc.description === \"string\" ? doc.description : undefined,\n content: truncateDocContent(doc.content),\n tokenValues:\n doc.tokenValues && typeof doc.tokenValues === \"object\"\n ? (doc.tokenValues as Record<string, string>)\n : undefined,\n rawTokens: Array.isArray(doc.rawTokens)\n ? doc.rawTokens.filter(\n (token): token is string => typeof token === \"string\",\n )\n : undefined,\n relevantFiles: Array.isArray(doc.relevantFiles)\n ? doc.relevantFiles.filter(\n (file): file is string => typeof file === \"string\",\n )\n : undefined,\n relatedComponents: Array.isArray(doc.relatedComponents)\n ? doc.relatedComponents.filter(\n (component): component is string => typeof component === \"string\",\n )\n : undefined,\n };\n}\n\nexport async function fetchBuilderDesignSystemDocs(\n designSystemId: string,\n options: BuilderDesignSystemDocsOptions = {},\n): Promise<BuilderDesignSystemDocument[]> {\n const credentials = await resolveBuilderDesignSystemCredentials();\n const url = makeBuilderDesignSystemUrl(\n `${encodeURIComponent(designSystemId)}/docs`,\n credentials,\n );\n if (options.page !== undefined)\n url.searchParams.set(\"page\", String(options.page));\n if (options.pageSize !== undefined)\n url.searchParams.set(\"pageSize\", String(options.pageSize));\n if (options.minimal !== undefined)\n url.searchParams.set(\"minimal\", options.minimal ? \"true\" : \"false\");\n if (options.type?.trim()) url.searchParams.set(\"type\", options.type.trim());\n\n const response = await fetchWithTimeout(url, {\n method: \"GET\",\n headers: makeBuilderHeaders(credentials),\n });\n await assertOk(response, \"Builder design-system docs fetch failed\");\n const json = (await response.json()) as unknown;\n if (!Array.isArray(json)) return [];\n return json.map(normalizeBuilderDesignSystemDocument);\n}\n\nexport async function hydrateBuilderDesignSystemReference(\n reference: BuilderDesignSystemProxyReference,\n options: BuilderDesignSystemDocsOptions = { page: 0, pageSize: 40 },\n): Promise<BuilderDesignSystemHydratedReference> {\n const docs = await fetchBuilderDesignSystemDocs(\n reference.builderDesignSystemId,\n options,\n );\n const tokenValues: Record<string, string> = {};\n for (const doc of docs) {\n if (!doc.tokenValues) continue;\n for (const [name, value] of Object.entries(doc.tokenValues)) {\n if (typeof value === \"string\") tokenValues[name] = value;\n }\n }\n return {\n ...reference,\n docs,\n tokenValues,\n docCount: docs.length,\n };\n}\n\nexport async function startBuilderDesignSystemIndex(\n options: BuilderDesignSystemIndexOptions,\n): Promise<BuilderDesignSystemIndexResult> {\n const files = nonEmptyFiles(options.files);\n const description = options.description?.trim();\n if (description) {\n files.unshift({\n name: \"additional-context.txt\",\n data: new TextEncoder().encode(description),\n mimeType: \"text/plain\",\n });\n }\n if (\n files.length === 0 &&\n !options.githubRepoUrl &&\n !options.connectedProjectId\n ) {\n throw new Error(\n \"Provide at least one .fig/code/text file or a GitHub repository URL to index with Builder.\",\n );\n }\n\n const credentials = await resolveBuilderDesignSystemCredentials();\n let uploadTokens: string[] = [];\n if (files.length > 0) {\n const uploadStart = await fetchWithTimeout(\n makeBuilderDesignSystemUrl(\"upload/start\", credentials),\n {\n method: \"POST\",\n headers: {\n ...makeBuilderHeaders(credentials),\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n attachments: files.map((file) => ({\n name: file.name,\n mimetype: mimeTypeForFile(file),\n declaredSize: file.data.byteLength,\n })),\n }),\n },\n );\n await assertOk(uploadStart, \"Builder design-system upload start failed\");\n const uploadJson = (await uploadStart.json()) as UploadStartResponse;\n const slots = [...(uploadJson.uploads ?? [])].sort((a, b) => a.idx - b.idx);\n if (slots.length !== files.length) {\n throw new Error(\"Builder did not return upload slots for all files.\");\n }\n for (let i = 0; i < slots.length; i++) {\n if (slots[i].idx !== i) {\n throw new Error(`Builder upload slot mismatch: expected ${i}.`);\n }\n await uploadToResumableUrl(slots[i], files[i]);\n }\n uploadTokens = slots.map((slot) => slot.uploadToken);\n }\n\n const generate = await fetchWithTimeout(\n makeBuilderDesignSystemUrl(\"generate\", credentials),\n {\n method: \"POST\",\n headers: {\n ...makeBuilderHeaders(credentials),\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n uploads: uploadTokens,\n ...(options.projectName?.trim()\n ? { projectName: options.projectName.trim() }\n : {}),\n ...(options.githubRepoUrl?.trim()\n ? { githubRepoUrl: options.githubRepoUrl.trim() }\n : {}),\n ...(options.connectedProjectId?.trim()\n ? { connectedProjectId: options.connectedProjectId.trim() }\n : {}),\n ...(options.selection ? { selection: options.selection } : {}),\n ...(options.devToolsVersion?.trim()\n ? { devToolsVersion: options.devToolsVersion.trim() }\n : {}),\n }),\n },\n );\n await assertOk(generate, \"Builder design-system indexing failed\");\n const generated = (await generate.json()) as GenerateResponse;\n if (!generated.projectId || !generated.jobId || !generated.designSystemId) {\n throw new Error(\n \"Builder design-system indexing returned an incomplete response.\",\n );\n }\n\n return {\n ok: true,\n source: \"builder\",\n projectId: generated.projectId,\n jobId: generated.jobId,\n designSystemId: generated.designSystemId,\n suggestedTitle: options.projectName?.trim() || null,\n builderUrl: builderDesignSystemUrl(generated.designSystemId),\n status: \"in-progress\",\n };\n}\n"]}
1
+ {"version":3,"file":"builder-design-systems.js","sourceRoot":"","sources":["../../src/server/builder-design-systems.ts"],"names":[],"mappings":"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","sourcesContent":["import { withBuilderUtmTrackingParams } from \"../shared/builder-link-tracking.js\";\nimport { FeatureNotConfiguredError } from \"./credential-provider.js\";\nimport {\n getBuilderProxyOrigin,\n resolveBuilderCredentials,\n} from \"./credential-provider.js\";\n\nconst DEFAULT_TIMEOUT_MS = 120_000;\n\nexport interface BuilderDesignSystemIndexFile {\n name: string;\n data: Uint8Array;\n mimeType?: string;\n}\n\nexport interface BuilderDesignSystemCodeFileInput {\n filename: string;\n content: string;\n mimeType?: string;\n /**\n * How `content` is encoded. Defaults to `\"utf8\"` (existing behavior,\n * unchanged for every current text-file caller). Pass `\"base64\"` for\n * binary files -- most importantly `.fig` (a zip/kiwi binary container,\n * never valid UTF-8 text). Without this, a `.fig` upload silently\n * corrupts: `mimeTypeForBuilderDesignSystemFilename` already special-cases\n * `.fig` as `application/octet-stream`, but the actual byte pipeline ran\n * every file through `TextEncoder().encode()` regardless, which mangles\n * any byte >= 0x80 in a binary-as-string payload (or, if the caller\n * base64-encoded first with no decode step here, stores the literal\n * base64 text instead of the decoded binary). Callers sending `.fig`/PDF/\n * other binary bytes must base64-encode `content` and set this to\n * `\"base64\"`.\n */\n encoding?: \"utf8\" | \"base64\";\n}\n\nexport interface BuildBuilderDesignSystemIndexFilesOptions {\n codeFiles?: BuilderDesignSystemCodeFileInput[];\n designMd?: string;\n designMdFilename?: string;\n maxCodeFiles?: number;\n maxTotalCodeBytes?: number;\n /** Default keeps legacy best-effort code indexing; upload/chat surfaces should fail loudly. */\n overflowBehavior?: \"skip\" | \"throw\";\n}\n\nexport interface BuilderDesignSystemProxyFieldsOptions {\n result: BuilderDesignSystemIndexResult;\n projectName?: string;\n description?: string;\n surface: \"design\" | \"slides\";\n}\n\nexport interface BuilderDesignSystemProxyFields {\n title: string;\n description: string;\n data: string;\n customInstructions: string;\n}\n\nexport interface BuilderDesignSystemProxyReference {\n source: \"builder\";\n builderDesignSystemId: string;\n builderJobId: string;\n builderProjectId?: string;\n builderUrl?: string;\n builderStatus?: string;\n}\n\nexport interface BuilderDesignSystemDocsOptions {\n page?: number;\n pageSize?: number;\n minimal?: boolean;\n type?: string;\n}\n\nexport interface BuilderDesignSystemDocument {\n id?: string;\n name?: string;\n type?: string;\n description?: string;\n content?: string;\n tokenValues?: Record<string, string>;\n rawTokens?: string[];\n relevantFiles?: string[];\n relatedComponents?: string[];\n}\n\nexport interface BuilderDesignSystemHydratedReference extends BuilderDesignSystemProxyReference {\n docs: BuilderDesignSystemDocument[];\n tokenValues: Record<string, string>;\n docCount: number;\n}\n\nexport interface BuilderDesignSystemIndexOptions {\n projectName?: string;\n description?: string;\n githubRepoUrl?: string;\n connectedProjectId?: string;\n files?: BuilderDesignSystemIndexFile[];\n selection?: Record<string, string[]>;\n devToolsVersion?: string;\n}\n\nexport interface BuilderDesignSystemIndexResult {\n ok: true;\n source: \"builder\";\n projectId: string;\n jobId: string;\n designSystemId: string;\n suggestedTitle: string | null;\n builderUrl: string;\n status: \"in-progress\";\n}\n\ninterface BuilderDesignSystemCredentials {\n privateKey: string;\n publicKey: string;\n userId: string | null;\n}\n\ninterface UploadStartResponse {\n uploads?: Array<{ idx: number; uploadUrl: string; uploadToken: string }>;\n}\n\ninterface GenerateResponse {\n projectId?: string;\n jobId?: string;\n designSystemId?: string;\n}\n\nconst DEFAULT_MAX_CODE_FILES = 50;\nconst DEFAULT_MAX_TOTAL_CODE_BYTES = 2 * 1024 * 1024;\nconst MAX_DOC_CONTENT_CHARS = 4_000;\n\nfunction trimTrailingSlash(value: string): string {\n return value.replace(/\\/+$/, \"\");\n}\n\nexport function getBuilderDesignSystemsBaseUrl(): string {\n return (\n process.env.BUILDER_DESIGN_SYSTEMS_BASE_URL ||\n `${trimTrailingSlash(getBuilderProxyOrigin())}/design-systems/v1`\n );\n}\n\nfunction getBuilderAppHost(): string {\n return (\n process.env.BUILDER_APP_HOST ||\n process.env.BUILDER_PUBLIC_APP_HOST ||\n \"https://builder.io\"\n );\n}\n\nfunction makeBuilderDesignSystemUrl(\n path: string,\n credentials: BuilderDesignSystemCredentials,\n): URL {\n const base = `${trimTrailingSlash(getBuilderDesignSystemsBaseUrl())}/`;\n const url = new URL(path.replace(/^\\/+/, \"\"), base);\n url.searchParams.set(\"apiKey\", credentials.publicKey);\n if (credentials.userId) url.searchParams.set(\"userId\", credentials.userId);\n return url;\n}\n\nfunction makeBuilderHeaders(\n credentials: BuilderDesignSystemCredentials,\n): Record<string, string> {\n return {\n Authorization: `Bearer ${credentials.privateKey}`,\n \"x-builder-api-key\": credentials.publicKey,\n ...(credentials.userId ? { \"x-builder-user-id\": credentials.userId } : {}),\n };\n}\n\nexport function mimeTypeForBuilderDesignSystemFilename(\n filename: string,\n explicit?: string,\n): string {\n if (explicit?.trim()) return explicit.trim();\n const lower = filename.toLowerCase();\n if (lower.endsWith(\".fig\")) return \"application/octet-stream\";\n if (lower.endsWith(\".pdf\")) return \"application/pdf\";\n if (lower.endsWith(\".md\") || lower.endsWith(\".markdown\"))\n return \"text/markdown\";\n if (lower.endsWith(\".mdx\")) return \"text/markdown\";\n if (lower.endsWith(\".json\")) return \"application/json\";\n if (lower.endsWith(\".css\")) return \"text/css\";\n if (lower.endsWith(\".html\") || lower.endsWith(\".htm\")) return \"text/html\";\n if (lower.endsWith(\".svg\")) return \"image/svg+xml\";\n return \"text/plain\";\n}\n\nexport function buildBuilderDesignSystemIndexFiles({\n codeFiles,\n designMd,\n designMdFilename,\n maxCodeFiles = DEFAULT_MAX_CODE_FILES,\n maxTotalCodeBytes = DEFAULT_MAX_TOTAL_CODE_BYTES,\n overflowBehavior = \"skip\",\n}: BuildBuilderDesignSystemIndexFilesOptions): BuilderDesignSystemIndexFile[] {\n const encoder = new TextEncoder();\n const files: BuilderDesignSystemIndexFile[] = [];\n let totalBytes = 0;\n\n function pushFile(\n filename: string,\n content: string,\n mimeType?: string,\n encoding?: \"utf8\" | \"base64\",\n ) {\n const normalizedName = filename.replace(/^\\/+/, \"\") || \"code.txt\";\n // `.fig`/PDF/other binary payloads must round-trip through base64, not\n // UTF-8 -- TextEncoder().encode() on a binary-as-string payload mangles\n // any byte >= 0x80. See BuilderDesignSystemCodeFileInput.encoding.\n const data =\n encoding === \"base64\"\n ? new Uint8Array(Buffer.from(content, \"base64\"))\n : encoder.encode(content);\n if (data.byteLength === 0) return;\n if (totalBytes + data.byteLength > maxTotalCodeBytes) {\n if (overflowBehavior === \"throw\") {\n throw new Error(\n `Design-system file \"${normalizedName}\" exceeds the ${Math.round(maxTotalCodeBytes / 1024 / 1024)} MB inline upload budget. Use the dedicated file upload instead of sending large binary files through an action payload.`,\n );\n }\n return;\n }\n totalBytes += data.byteLength;\n files.push({\n name: normalizedName,\n data,\n mimeType: mimeTypeForBuilderDesignSystemFilename(\n normalizedName,\n mimeType,\n ),\n });\n }\n\n if (designMd?.trim()) {\n pushFile(\n designMdFilename?.trim() || \"design.md\",\n designMd,\n \"text/markdown\",\n );\n }\n\n if (overflowBehavior === \"throw\" && (codeFiles?.length ?? 0) > maxCodeFiles) {\n throw new Error(\n `Too many design-system files (max ${maxCodeFiles}); no files were indexed.`,\n );\n }\n for (const file of (codeFiles ?? []).slice(0, maxCodeFiles)) {\n pushFile(file.filename, file.content, file.mimeType, file.encoding);\n }\n\n return files;\n}\n\nasync function resolveBuilderDesignSystemCredentials(): Promise<BuilderDesignSystemCredentials> {\n const credentials = await resolveBuilderCredentials();\n if (!credentials.privateKey || !credentials.publicKey) {\n throw new FeatureNotConfiguredError({\n requiredCredential: \"BUILDER_PRIVATE_KEY\",\n message:\n \"Connect Builder.io before indexing a design system from Figma or code.\",\n builderConnectUrl: \"/_agent-native/builder/connect\",\n });\n }\n return {\n privateKey: credentials.privateKey,\n publicKey: credentials.publicKey,\n userId: credentials.userId ?? null,\n };\n}\n\nfunction mimeTypeForFile(file: BuilderDesignSystemIndexFile): string {\n return mimeTypeForBuilderDesignSystemFilename(file.name, file.mimeType);\n}\n\nfunction makeBody(bytes: Uint8Array, mimeType: string): BodyInit {\n return typeof Blob !== \"undefined\"\n ? new Blob([bytes as unknown as BlobPart], { type: mimeType })\n : (bytes as unknown as BodyInit);\n}\n\nasync function fetchWithTimeout(\n url: string | URL,\n init: RequestInit,\n timeoutMs = DEFAULT_TIMEOUT_MS,\n): Promise<Response> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } finally {\n clearTimeout(timer);\n }\n}\n\nasync function parseErrorBody(response: Response): Promise<string> {\n const text = await response.text().catch(() => \"\");\n if (!text) return response.statusText || `HTTP ${response.status}`;\n try {\n const json = JSON.parse(text) as { error?: unknown };\n if (typeof json.error === \"string\") return json.error;\n if (json.error && typeof json.error === \"object\") {\n return JSON.stringify(json.error).slice(0, 500);\n }\n } catch {}\n return text.replace(/\\s+/g, \" \").trim().slice(0, 500);\n}\n\nasync function assertOk(response: Response, label: string): Promise<void> {\n if (response.ok) return;\n throw new Error(\n `${label} (${response.status}): ${await parseErrorBody(response)}`,\n );\n}\n\nasync function uploadToResumableUrl(\n slot: { uploadUrl: string },\n file: BuilderDesignSystemIndexFile,\n): Promise<void> {\n const mimeType = mimeTypeForFile(file);\n const bytes = file.data;\n const start = await fetchWithTimeout(slot.uploadUrl, {\n method: \"POST\",\n headers: {\n \"x-goog-resumable\": \"start\",\n \"x-goog-content-length-range\": `0,${bytes.byteLength}`,\n \"Content-Type\": mimeType,\n },\n });\n await assertOk(start, \"Builder design-system upload session failed\");\n const sessionUrl = start.headers.get(\"Location\");\n if (!sessionUrl) {\n throw new Error(\"Builder design-system upload session returned no URL.\");\n }\n\n const response = await fetchWithTimeout(sessionUrl, {\n method: \"PUT\",\n headers: {\n \"Content-Range\": `bytes 0-${bytes.byteLength - 1}/${bytes.byteLength}`,\n \"Content-Type\": mimeType,\n },\n body: makeBody(bytes, mimeType),\n });\n await assertOk(response, \"Builder design-system file upload failed\");\n}\n\nfunction nonEmptyFiles(\n files: BuilderDesignSystemIndexFile[] | undefined,\n): BuilderDesignSystemIndexFile[] {\n return (files ?? []).filter((file) => file.data.byteLength > 0);\n}\n\nexport function builderDesignSystemUrl(designSystemId?: string | null): string {\n const host = trimTrailingSlash(getBuilderAppHost());\n const url = designSystemId\n ? `${host}/app/design-system-intelligence/${encodeURIComponent(\n designSystemId,\n )}`\n : `${host}/app/design-system-intelligence`;\n return withBuilderUtmTrackingParams(url, {\n campaign: \"product\",\n content: \"design_system_intelligence\",\n });\n}\n\nexport function localBuilderDesignSystemId(\n builderDesignSystemId: string,\n): string {\n const slug = builderDesignSystemId\n .replace(/[^a-zA-Z0-9_-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 96);\n return `builder-${slug || \"design-system\"}`;\n}\n\nexport function createBuilderDesignSystemProxyFields({\n result,\n projectName,\n description,\n surface,\n}: BuilderDesignSystemProxyFieldsOptions): BuilderDesignSystemProxyFields {\n const title = projectName?.trim() || \"Builder indexed design system\";\n const fallbackDescription =\n description ?? `Builder indexed design system ${result.designSystemId}`;\n const surfaceNoun = surface === \"slides\" ? \"slides\" : \"designs\";\n const spacingKey = surface === \"slides\" ? \"slidePadding\" : \"pagePadding\";\n const data = JSON.stringify({\n source: \"builder\",\n builderDesignSystemId: result.designSystemId,\n builderJobId: result.jobId,\n builderProjectId: result.projectId,\n builderUrl: result.builderUrl,\n builderStatus: result.status,\n colors: {\n primary: \"var(--primary)\",\n secondary: \"var(--secondary)\",\n accent: \"var(--accent)\",\n background: \"var(--background)\",\n surface: \"var(--card)\",\n text: \"var(--foreground)\",\n textMuted: \"var(--muted-foreground)\",\n },\n typography: {\n headingFont: \"inherit\",\n bodyFont: \"inherit\",\n headingWeight: \"700\",\n bodyWeight: \"400\",\n headingSizes: { h1: \"48px\", h2: \"32px\", h3: \"24px\" },\n },\n spacing: { elementGap: \"24px\", [spacingKey]: \"48px\" },\n borders: { radius: \"12px\", accentWidth: \"1px\" },\n logos: [],\n notes: [\n \"This is a local selectable proxy for a Builder DSI-indexed design system.\",\n `Builder design system id: ${result.designSystemId}`,\n `Builder indexing job id: ${result.jobId}`,\n `Builder project id: ${result.projectId}`,\n `Builder URL: ${result.builderUrl}`,\n projectName ? `Requested name: ${projectName}` : \"\",\n description ? `Context: ${description}` : \"\",\n \"Builder Design System Intelligence is the source of truth for indexed tokens, components, assets, and usage guidance.\",\n ]\n .filter(Boolean)\n .join(\"\\n\"),\n });\n const customInstructions = [\n \"This design system is indexed by Builder Design System Intelligence (DSI).\",\n `Builder design system id: ${result.designSystemId}`,\n `Builder job id: ${result.jobId}`,\n `Builder project id: ${result.projectId}`,\n `Builder URL: ${result.builderUrl}`,\n `When generating ${surfaceNoun}, treat Builder DSI as the source of truth for indexed tokens, components, assets, and usage guidance.`,\n \"Call get-design-system for this local id before generation and use the returned builder docs and token values when available.\",\n ].join(\"\\n\");\n\n return {\n title,\n description: fallbackDescription,\n data,\n customInstructions,\n };\n}\n\nexport function parseBuilderDesignSystemProxyReference(\n data: unknown,\n): BuilderDesignSystemProxyReference | null {\n let parsed: unknown = data;\n if (typeof data === \"string\") {\n try {\n parsed = JSON.parse(data);\n } catch {\n return null;\n }\n }\n if (!parsed || typeof parsed !== \"object\") return null;\n const value = parsed as Record<string, unknown>;\n if (value.source !== \"builder\") return null;\n if (typeof value.builderDesignSystemId !== \"string\") return null;\n if (typeof value.builderJobId !== \"string\") return null;\n return {\n source: \"builder\",\n builderDesignSystemId: value.builderDesignSystemId,\n builderJobId: value.builderJobId,\n builderProjectId:\n typeof value.builderProjectId === \"string\"\n ? value.builderProjectId\n : undefined,\n builderUrl:\n typeof value.builderUrl === \"string\" ? value.builderUrl : undefined,\n builderStatus:\n typeof value.builderStatus === \"string\" ? value.builderStatus : undefined,\n };\n}\n\nfunction truncateDocContent(content: unknown): string | undefined {\n if (typeof content !== \"string\") return undefined;\n if (content.length <= MAX_DOC_CONTENT_CHARS) return content;\n return `${content.slice(0, MAX_DOC_CONTENT_CHARS)}\\n\\n[truncated]`;\n}\n\nfunction normalizeBuilderDesignSystemDocument(\n value: unknown,\n): BuilderDesignSystemDocument {\n const doc =\n value && typeof value === \"object\"\n ? (value as Record<string, unknown>)\n : {};\n return {\n id: typeof doc.id === \"string\" ? doc.id : undefined,\n name: typeof doc.name === \"string\" ? doc.name : undefined,\n type: typeof doc.type === \"string\" ? doc.type : undefined,\n description:\n typeof doc.description === \"string\" ? doc.description : undefined,\n content: truncateDocContent(doc.content),\n tokenValues:\n doc.tokenValues && typeof doc.tokenValues === \"object\"\n ? (doc.tokenValues as Record<string, string>)\n : undefined,\n rawTokens: Array.isArray(doc.rawTokens)\n ? doc.rawTokens.filter(\n (token): token is string => typeof token === \"string\",\n )\n : undefined,\n relevantFiles: Array.isArray(doc.relevantFiles)\n ? doc.relevantFiles.filter(\n (file): file is string => typeof file === \"string\",\n )\n : undefined,\n relatedComponents: Array.isArray(doc.relatedComponents)\n ? doc.relatedComponents.filter(\n (component): component is string => typeof component === \"string\",\n )\n : undefined,\n };\n}\n\nexport async function fetchBuilderDesignSystemDocs(\n designSystemId: string,\n options: BuilderDesignSystemDocsOptions = {},\n): Promise<BuilderDesignSystemDocument[]> {\n const credentials = await resolveBuilderDesignSystemCredentials();\n const url = makeBuilderDesignSystemUrl(\n `${encodeURIComponent(designSystemId)}/docs`,\n credentials,\n );\n if (options.page !== undefined)\n url.searchParams.set(\"page\", String(options.page));\n if (options.pageSize !== undefined)\n url.searchParams.set(\"pageSize\", String(options.pageSize));\n if (options.minimal !== undefined)\n url.searchParams.set(\"minimal\", options.minimal ? \"true\" : \"false\");\n if (options.type?.trim()) url.searchParams.set(\"type\", options.type.trim());\n\n const response = await fetchWithTimeout(url, {\n method: \"GET\",\n headers: makeBuilderHeaders(credentials),\n });\n await assertOk(response, \"Builder design-system docs fetch failed\");\n const json = (await response.json()) as unknown;\n if (!Array.isArray(json)) return [];\n return json.map(normalizeBuilderDesignSystemDocument);\n}\n\nexport async function hydrateBuilderDesignSystemReference(\n reference: BuilderDesignSystemProxyReference,\n options: BuilderDesignSystemDocsOptions = { page: 0, pageSize: 40 },\n): Promise<BuilderDesignSystemHydratedReference> {\n const docs = await fetchBuilderDesignSystemDocs(\n reference.builderDesignSystemId,\n options,\n );\n const tokenValues: Record<string, string> = {};\n for (const doc of docs) {\n if (!doc.tokenValues) continue;\n for (const [name, value] of Object.entries(doc.tokenValues)) {\n if (typeof value === \"string\") tokenValues[name] = value;\n }\n }\n return {\n ...reference,\n docs,\n tokenValues,\n docCount: docs.length,\n };\n}\n\nexport async function startBuilderDesignSystemIndex(\n options: BuilderDesignSystemIndexOptions,\n): Promise<BuilderDesignSystemIndexResult> {\n const files = nonEmptyFiles(options.files);\n const description = options.description?.trim();\n if (description) {\n files.unshift({\n name: \"additional-context.txt\",\n data: new TextEncoder().encode(description),\n mimeType: \"text/plain\",\n });\n }\n if (\n files.length === 0 &&\n !options.githubRepoUrl &&\n !options.connectedProjectId\n ) {\n throw new Error(\n \"Provide at least one .fig/code/text file or a GitHub repository URL to index with Builder.\",\n );\n }\n\n const credentials = await resolveBuilderDesignSystemCredentials();\n let uploadTokens: string[] = [];\n if (files.length > 0) {\n const uploadStart = await fetchWithTimeout(\n makeBuilderDesignSystemUrl(\"upload/start\", credentials),\n {\n method: \"POST\",\n headers: {\n ...makeBuilderHeaders(credentials),\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n attachments: files.map((file) => ({\n name: file.name,\n mimetype: mimeTypeForFile(file),\n declaredSize: file.data.byteLength,\n })),\n }),\n },\n );\n await assertOk(uploadStart, \"Builder design-system upload start failed\");\n const uploadJson = (await uploadStart.json()) as UploadStartResponse;\n const slots = [...(uploadJson.uploads ?? [])].sort((a, b) => a.idx - b.idx);\n if (slots.length !== files.length) {\n throw new Error(\"Builder did not return upload slots for all files.\");\n }\n for (let i = 0; i < slots.length; i++) {\n if (slots[i].idx !== i) {\n throw new Error(`Builder upload slot mismatch: expected ${i}.`);\n }\n await uploadToResumableUrl(slots[i], files[i]);\n }\n uploadTokens = slots.map((slot) => slot.uploadToken);\n }\n\n const generate = await fetchWithTimeout(\n makeBuilderDesignSystemUrl(\"generate\", credentials),\n {\n method: \"POST\",\n headers: {\n ...makeBuilderHeaders(credentials),\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n uploads: uploadTokens,\n ...(options.projectName?.trim()\n ? { projectName: options.projectName.trim() }\n : {}),\n ...(options.githubRepoUrl?.trim()\n ? { githubRepoUrl: options.githubRepoUrl.trim() }\n : {}),\n ...(options.connectedProjectId?.trim()\n ? { connectedProjectId: options.connectedProjectId.trim() }\n : {}),\n ...(options.selection ? { selection: options.selection } : {}),\n ...(options.devToolsVersion?.trim()\n ? { devToolsVersion: options.devToolsVersion.trim() }\n : {}),\n }),\n },\n );\n await assertOk(generate, \"Builder design-system indexing failed\");\n const generated = (await generate.json()) as GenerateResponse;\n if (!generated.projectId || !generated.jobId || !generated.designSystemId) {\n throw new Error(\n \"Builder design-system indexing returned an incomplete response.\",\n );\n }\n\n return {\n ok: true,\n source: \"builder\",\n projectId: generated.projectId,\n jobId: generated.jobId,\n designSystemId: generated.designSystemId,\n suggestedTitle: options.projectName?.trim() || null,\n builderUrl: builderDesignSystemUrl(generated.designSystemId),\n status: \"in-progress\",\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"fusion-app.d.ts","sourceRoot":"","sources":["../../src/server/fusion-app.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,2BAA2B;IAC1C;;;;;OAKG;IACH,MAAM,EAAE,OAAO,GAAG,cAAc,GAAG,OAAO,CAAC;IAC3C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,OAAO,CAAC;IACd,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAkCD,yDAAyD;AACzD,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAGrE;AAED,qDAAqD;AACrD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExD;AAiDD;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,eAAe,GAAG;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7C,OAAO,CAAC,2BAA2B,CAAC,CAkEtC;AAID;;;;;;;;GAQG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,eAAe,GAAG;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACA,OAAO,CAAC,uBAAuB,CAAC,CAmGlC;AAuCD;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,eAAe,GACnB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAKlC;AAED,uEAAuE;AACvE,wBAAsB,wBAAwB,CAAC,IAAI,EAAE;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAQ5B;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAWhD;AAED,wEAAwE;AACxE,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAiB1C"}
1
+ {"version":3,"file":"fusion-app.d.ts","sourceRoot":"","sources":["../../src/server/fusion-app.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAKH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,2BAA2B;IAC1C;;;;;OAKG;IACH,MAAM,EAAE,OAAO,GAAG,cAAc,GAAG,OAAO,CAAC;IAC3C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,OAAO,CAAC;IACd,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAkCD,yDAAyD;AACzD,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAMrE;AAED,qDAAqD;AACrD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExD;AAiDD;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,eAAe,GAAG;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7C,OAAO,CAAC,2BAA2B,CAAC,CAkEtC;AAID;;;;;;;;GAQG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,eAAe,GAAG;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACA,OAAO,CAAC,uBAAuB,CAAC,CAmGlC;AAuCD;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,eAAe,GACnB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAKlC;AAED,uEAAuE;AACvE,wBAAsB,wBAAwB,CAAC,IAAI,EAAE;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAQ5B;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAWhD;AAED,wEAAwE;AACxE,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAiB1C"}
@@ -23,6 +23,7 @@
23
23
  * Endpoints match ai-services `packages/service/main.ts`; streaming endpoints
24
24
  * respond with newline-delimited JSON over chunked HTTP.
25
25
  */
26
+ import { withBuilderUtmTrackingParams } from "../shared/builder-link-tracking.js";
26
27
  import { getBuilderApiHost, getBuilderAppHost } from "./builder-browser.js";
27
28
  async function resolveFusionAuth() {
28
29
  const { resolveBuilderCredentials } = await import("./credential-provider.js");
@@ -49,7 +50,7 @@ function fusionUrl(path, auth, params) {
49
50
  /** The Builder visual-editor URL for a fusion branch. */
50
51
  export function getFusionBranchEditorUrl(ref) {
51
52
  const host = getBuilderAppHost().replace(/\/+$/, "");
52
- return `${host}/app/projects/${encodeURIComponent(ref.projectId)}/${encodeURIComponent(ref.branchName)}`;
53
+ return withBuilderUtmTrackingParams(`${host}/app/projects/${encodeURIComponent(ref.projectId)}/${encodeURIComponent(ref.branchName)}`, { campaign: "product", content: "fusion_editor" });
53
54
  }
54
55
  /** Public URL for a reserved fusion hosting slug. */
55
56
  export function getFusionHostingUrl(slug) {
@@ -1 +1 @@
1
- {"version":3,"file":"fusion-app.js","sourceRoot":"","sources":["../../src/server/fusion-app.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * fusion-app — server helpers for driving the Builder Fusion app-building\n * backend (ai-services) from agent-native apps.\n *\n * Fusion projects/branches are full running apps: a cloud container runs the\n * dev server (preview URL) and an in-container coding agent applies edits.\n * These helpers cover the lifecycle an app template needs:\n *\n * - `ensureFusionContainer` — boot/attach the branch container, resolve the\n * iframe-able dev-server preview URL.\n * - `sendFusionBranchMessage` — send a prompt to the branch's coding agent\n * (fire-and-forget by default so callers stay\n * within hosted action budgets).\n * - `pushFusionBranch` — push the branch's code to its git remote.\n * - `reserveFusionHostingSlug` — reserve a `<slug>.builder.cloud` hosting slug.\n * - `deployFusionProject` — trigger a hosted deploy of the project.\n * - `getFusionDeploys` — list deploys (poll deploy status).\n *\n * All calls authenticate the same way as `runBuilderAgent`: the Builder\n * private key as a bearer token plus the space/public key as the `apiKey`\n * query param, resolved through the shared credential provider.\n *\n * Endpoints match ai-services `packages/service/main.ts`; streaming endpoints\n * respond with newline-delimited JSON over chunked HTTP.\n */\n\nimport { getBuilderApiHost, getBuilderAppHost } from \"./builder-browser.js\";\n\nexport interface FusionBranchRef {\n projectId: string;\n branchName: string;\n}\n\nexport interface EnsureFusionContainerResult {\n /**\n * `ready` — container is up; `url` is the dev-server preview URL.\n * `provisioning` — still booting when the time budget ran out; callers\n * should poll again.\n * `error` — the backend reported a failure.\n */\n status: \"ready\" | \"provisioning\" | \"error\";\n url?: string;\n /** Last human-readable progress/error message seen on the stream. */\n message?: string;\n}\n\nexport interface SendFusionMessageResult {\n sent: boolean;\n /** Final agent text when the call waited for completion. */\n response?: string;\n error?: string;\n}\n\nasync function resolveFusionAuth(): Promise<{\n privateKey: string;\n publicKey: string;\n userId: string | null;\n}> {\n const { resolveBuilderCredentials } =\n await import(\"./credential-provider.js\");\n const creds = await resolveBuilderCredentials();\n if (!creds.privateKey || !creds.publicKey) {\n throw new Error(\"Builder keys are not configured\");\n }\n return {\n privateKey: creds.privateKey,\n publicKey: creds.publicKey,\n userId: creds.userId,\n };\n}\n\nfunction fusionUrl(\n path: string,\n auth: { publicKey: string; userId: string | null },\n params?: Record<string, string>,\n): URL {\n const url = new URL(path, getBuilderApiHost());\n url.searchParams.set(\"apiKey\", auth.publicKey);\n if (auth.userId) url.searchParams.set(\"userId\", auth.userId);\n for (const [key, value] of Object.entries(params ?? {})) {\n url.searchParams.set(key, value);\n }\n return url;\n}\n\n/** The Builder visual-editor URL for a fusion branch. */\nexport function getFusionBranchEditorUrl(ref: FusionBranchRef): string {\n const host = getBuilderAppHost().replace(/\\/+$/, \"\");\n return `${host}/app/projects/${encodeURIComponent(ref.projectId)}/${encodeURIComponent(ref.branchName)}`;\n}\n\n/** Public URL for a reserved fusion hosting slug. */\nexport function getFusionHostingUrl(slug: string): string {\n return `https://${slug}.builder.cloud`;\n}\n\n/**\n * Read an NDJSON response stream, invoking `onLine` per parsed JSON object.\n * Unparseable lines are skipped. Resolves when the stream ends or `onLine`\n * returns `true` (early stop).\n */\nasync function readNdjsonStream(\n response: Response,\n onLine: (chunk: Record<string, unknown>) => boolean | undefined,\n): Promise<void> {\n const body = response.body;\n if (!body) return;\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffered = \"\";\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (value) buffered += decoder.decode(value, { stream: true });\n const lines = buffered.split(\"\\n\");\n buffered = done ? \"\" : (lines.pop() ?? \"\");\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed);\n } catch {\n continue;\n }\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n if (onLine(parsed as Record<string, unknown>)) return;\n }\n }\n if (done) return;\n }\n } finally {\n // Release the connection; safe to call after the stream is exhausted.\n reader.cancel().catch(() => {});\n }\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nconst DEFAULT_ENSURE_CONTAINER_TIMEOUT_MS = 25_000;\n\n/**\n * Ensure the branch container is running and resolve its preview URL.\n *\n * Streams provisioning progress from `/projects/ensure-container`; resolves\n * `ready` + `url` from the terminal chunk. When the container is still booting\n * after `timeoutMs`, aborts the request and returns `provisioning` so callers\n * can poll again without blowing their run budget.\n */\nexport async function ensureFusionContainer(\n args: FusionBranchRef & { timeoutMs?: number },\n): Promise<EnsureFusionContainerResult> {\n const auth = await resolveFusionAuth();\n const controller = new AbortController();\n const timeoutMs = args.timeoutMs ?? DEFAULT_ENSURE_CONTAINER_TIMEOUT_MS;\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n let readyUrl: string | undefined;\n let lastMessage: string | undefined;\n let errorMessage: string | undefined;\n\n try {\n const response = await fetch(\n fusionUrl(\"/projects/ensure-container\", auth),\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${auth.privateKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n projectId: args.projectId,\n branchName: args.branchName,\n }),\n signal: controller.signal,\n },\n );\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n return {\n status: \"error\",\n message:\n text.slice(0, 500) || `ensure-container failed (${response.status})`,\n };\n }\n await readNdjsonStream(response, (chunk) => {\n const message = asString(chunk.message) ?? asString(chunk.error);\n if (message) lastMessage = message;\n const url = asString(chunk.url);\n if (url) readyUrl = url;\n const state = asString(chunk.state) ?? asString(chunk.type);\n if (state === \"error\" || state === \"init-error\") {\n errorMessage = message ?? \"Container provisioning failed\";\n return true;\n }\n if (state === \"ready\" && readyUrl) return true;\n return undefined;\n });\n } catch (error) {\n if (controller.signal.aborted) {\n return {\n status: readyUrl ? \"ready\" : \"provisioning\",\n url: readyUrl,\n message: lastMessage ?? \"Container is still starting\",\n };\n }\n return {\n status: \"error\",\n message: error instanceof Error ? error.message : String(error),\n };\n } finally {\n clearTimeout(timer);\n }\n\n if (errorMessage) return { status: \"error\", message: errorMessage };\n if (readyUrl) return { status: \"ready\", url: readyUrl, message: lastMessage };\n return { status: \"provisioning\", message: lastMessage };\n}\n\nconst DEFAULT_SEND_MESSAGE_TIMEOUT_MS = 30_000;\n\n/**\n * Send a prompt to the fusion branch's in-container coding agent via\n * `/projects/branch/message`.\n *\n * Defaults to `fireAndForget: true`: the backend dispatches the message and\n * ends the stream without waiting for the agent turn, so this returns in\n * seconds. Pass `fireAndForget: false` (with a generous `timeoutMs`) to wait\n * for the turn and capture the agent's final text.\n */\nexport async function sendFusionBranchMessage(\n args: FusionBranchRef & {\n prompt: string;\n fireAndForget?: boolean;\n timeoutMs?: number;\n userEmail?: string;\n },\n): Promise<SendFusionMessageResult> {\n const prompt = args.prompt?.trim();\n if (!prompt) throw new Error(\"prompt is required\");\n const auth = await resolveFusionAuth();\n const fireAndForget = args.fireAndForget ?? true;\n const controller = new AbortController();\n const timeoutMs = args.timeoutMs ?? DEFAULT_SEND_MESSAGE_TIMEOUT_MS;\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n let dispatched = false;\n let finalText: string | undefined;\n let errorMessage: string | undefined;\n\n try {\n const response = await fetch(fusionUrl(\"/projects/branch/message\", auth), {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${auth.privateKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n projectId: args.projectId,\n branchName: args.branchName,\n fireAndForget,\n userMessage: {\n userPrompt: prompt,\n ...(auth.userId || args.userEmail\n ? {\n user: {\n source: \"agent-native\",\n role: \"user\",\n ...(auth.userId ? { userId: auth.userId } : {}),\n ...(args.userEmail ? { userEmail: args.userEmail } : {}),\n },\n }\n : {}),\n },\n }),\n signal: controller.signal,\n });\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n return {\n sent: false,\n error:\n text.slice(0, 500) || `branch message failed (${response.status})`,\n };\n }\n await readNdjsonStream(response, (chunk) => {\n const type = asString(chunk.type);\n if (type === \"sending-message\") dispatched = true;\n if (type === \"error\") {\n errorMessage =\n asString(chunk.error) ?? asString(chunk.message) ?? \"Message failed\";\n return true;\n }\n if (type === \"ai\") {\n dispatched = true;\n const event = chunk.event;\n if (event && typeof event === \"object\") {\n const ev = event as Record<string, unknown>;\n if (asString(ev.type) === \"done\" && Array.isArray(ev.actions)) {\n for (const action of ev.actions) {\n if (\n action &&\n typeof action === \"object\" &&\n (action as Record<string, unknown>).type === \"text\"\n ) {\n const content = asString(\n (action as Record<string, unknown>).content,\n );\n if (content) finalText = content;\n }\n }\n }\n }\n }\n return undefined;\n });\n } catch (error) {\n if (controller.signal.aborted) {\n // Timed out reading the stream. With fire-and-forget the dispatch has\n // already happened server-side once we saw any progress chunk.\n if (dispatched) return { sent: true };\n return {\n sent: false,\n error: \"Timed out sending message to the app agent\",\n };\n }\n return {\n sent: false,\n error: error instanceof Error ? error.message : String(error),\n };\n } finally {\n clearTimeout(timer);\n }\n\n if (errorMessage) return { sent: dispatched, error: errorMessage };\n return { sent: true, response: finalText };\n}\n\nasync function fusionJsonRequest(\n path: string,\n init: { method: \"GET\" | \"POST\" | \"DELETE\"; body?: Record<string, unknown> },\n params?: Record<string, string>,\n): Promise<Record<string, unknown>> {\n const auth = await resolveFusionAuth();\n const response = await fetch(fusionUrl(path, auth, params), {\n method: init.method,\n headers: {\n Authorization: `Bearer ${auth.privateKey}`,\n ...(init.body ? { \"Content-Type\": \"application/json\" } : {}),\n },\n ...(init.body ? { body: JSON.stringify(init.body) } : {}),\n });\n const text = await response.text().catch(() => \"\");\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n parsed = undefined;\n }\n if (!response.ok) {\n const errorDetail =\n parsed && typeof parsed === \"object\"\n ? asString((parsed as Record<string, unknown>).error)\n : undefined;\n throw new Error(\n errorDetail ??\n `${path} failed (${response.status}): ${text.slice(0, 300)}`,\n );\n }\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n return {};\n}\n\n/**\n * Push the fusion branch's code to its git remote. Starts/attaches the\n * container if needed, then syncs with `canPush`.\n */\nexport async function pushFusionBranch(\n ref: FusionBranchRef,\n): Promise<Record<string, unknown>> {\n return fusionJsonRequest(\"/projects/branch/push-to-remote\", {\n method: \"POST\",\n body: { projectId: ref.projectId, branchName: ref.branchName },\n });\n}\n\n/** Reserve a hosting slug (`<slug>.builder.cloud`) for the project. */\nexport async function reserveFusionHostingSlug(args: {\n projectId: string;\n slug: string;\n}): Promise<{ slug: string }> {\n const result = await fusionJsonRequest(\"/projects/hosting/reserve-slug\", {\n method: \"POST\",\n body: { projectId: args.projectId, slug: args.slug },\n });\n const slug = asString(result.slug);\n if (!slug) throw new Error(\"Slug reservation returned no slug\");\n return { slug };\n}\n\n/**\n * Trigger a hosted deploy for the project. Requires a reserved hosting slug.\n * Returns immediately; poll `getFusionDeploys` for progress\n * (`queued → building → uploading → deploying → live | failed | canceled`).\n */\nexport async function deployFusionProject(args: {\n projectId: string;\n checkoutBranch?: string;\n}): Promise<{ deployId: string; status: string }> {\n const result = await fusionJsonRequest(\"/projects/deploy\", {\n method: \"POST\",\n body: {\n projectId: args.projectId,\n ...(args.checkoutBranch ? { checkoutBranch: args.checkoutBranch } : {}),\n },\n });\n const deployId = asString(result.deployId);\n if (!deployId) throw new Error(\"Deploy did not return a deployId\");\n return { deployId, status: asString(result.status) ?? \"queued\" };\n}\n\n/** List the project's deploys, optionally filtered to one deploy id. */\nexport async function getFusionDeploys(args: {\n projectId: string;\n deployId?: string;\n}): Promise<Array<Record<string, unknown>>> {\n const result = await fusionJsonRequest(\n \"/projects/deploys\",\n { method: \"GET\" },\n {\n projectId: args.projectId,\n ...(args.deployId ? { deployId: args.deployId } : {}),\n },\n );\n const deploys = (result.deploys ?? result.data ?? result) as unknown;\n if (Array.isArray(deploys)) {\n return deploys.filter(\n (entry): entry is Record<string, unknown> =>\n !!entry && typeof entry === \"object\",\n );\n }\n return [];\n}\n"]}
1
+ {"version":3,"file":"fusion-app.js","sourceRoot":"","sources":["../../src/server/fusion-app.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * fusion-app — server helpers for driving the Builder Fusion app-building\n * backend (ai-services) from agent-native apps.\n *\n * Fusion projects/branches are full running apps: a cloud container runs the\n * dev server (preview URL) and an in-container coding agent applies edits.\n * These helpers cover the lifecycle an app template needs:\n *\n * - `ensureFusionContainer` — boot/attach the branch container, resolve the\n * iframe-able dev-server preview URL.\n * - `sendFusionBranchMessage` — send a prompt to the branch's coding agent\n * (fire-and-forget by default so callers stay\n * within hosted action budgets).\n * - `pushFusionBranch` — push the branch's code to its git remote.\n * - `reserveFusionHostingSlug` — reserve a `<slug>.builder.cloud` hosting slug.\n * - `deployFusionProject` — trigger a hosted deploy of the project.\n * - `getFusionDeploys` — list deploys (poll deploy status).\n *\n * All calls authenticate the same way as `runBuilderAgent`: the Builder\n * private key as a bearer token plus the space/public key as the `apiKey`\n * query param, resolved through the shared credential provider.\n *\n * Endpoints match ai-services `packages/service/main.ts`; streaming endpoints\n * respond with newline-delimited JSON over chunked HTTP.\n */\n\nimport { withBuilderUtmTrackingParams } from \"../shared/builder-link-tracking.js\";\nimport { getBuilderApiHost, getBuilderAppHost } from \"./builder-browser.js\";\n\nexport interface FusionBranchRef {\n projectId: string;\n branchName: string;\n}\n\nexport interface EnsureFusionContainerResult {\n /**\n * `ready` — container is up; `url` is the dev-server preview URL.\n * `provisioning` — still booting when the time budget ran out; callers\n * should poll again.\n * `error` — the backend reported a failure.\n */\n status: \"ready\" | \"provisioning\" | \"error\";\n url?: string;\n /** Last human-readable progress/error message seen on the stream. */\n message?: string;\n}\n\nexport interface SendFusionMessageResult {\n sent: boolean;\n /** Final agent text when the call waited for completion. */\n response?: string;\n error?: string;\n}\n\nasync function resolveFusionAuth(): Promise<{\n privateKey: string;\n publicKey: string;\n userId: string | null;\n}> {\n const { resolveBuilderCredentials } =\n await import(\"./credential-provider.js\");\n const creds = await resolveBuilderCredentials();\n if (!creds.privateKey || !creds.publicKey) {\n throw new Error(\"Builder keys are not configured\");\n }\n return {\n privateKey: creds.privateKey,\n publicKey: creds.publicKey,\n userId: creds.userId,\n };\n}\n\nfunction fusionUrl(\n path: string,\n auth: { publicKey: string; userId: string | null },\n params?: Record<string, string>,\n): URL {\n const url = new URL(path, getBuilderApiHost());\n url.searchParams.set(\"apiKey\", auth.publicKey);\n if (auth.userId) url.searchParams.set(\"userId\", auth.userId);\n for (const [key, value] of Object.entries(params ?? {})) {\n url.searchParams.set(key, value);\n }\n return url;\n}\n\n/** The Builder visual-editor URL for a fusion branch. */\nexport function getFusionBranchEditorUrl(ref: FusionBranchRef): string {\n const host = getBuilderAppHost().replace(/\\/+$/, \"\");\n return withBuilderUtmTrackingParams(\n `${host}/app/projects/${encodeURIComponent(ref.projectId)}/${encodeURIComponent(ref.branchName)}`,\n { campaign: \"product\", content: \"fusion_editor\" },\n );\n}\n\n/** Public URL for a reserved fusion hosting slug. */\nexport function getFusionHostingUrl(slug: string): string {\n return `https://${slug}.builder.cloud`;\n}\n\n/**\n * Read an NDJSON response stream, invoking `onLine` per parsed JSON object.\n * Unparseable lines are skipped. Resolves when the stream ends or `onLine`\n * returns `true` (early stop).\n */\nasync function readNdjsonStream(\n response: Response,\n onLine: (chunk: Record<string, unknown>) => boolean | undefined,\n): Promise<void> {\n const body = response.body;\n if (!body) return;\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffered = \"\";\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (value) buffered += decoder.decode(value, { stream: true });\n const lines = buffered.split(\"\\n\");\n buffered = done ? \"\" : (lines.pop() ?? \"\");\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed);\n } catch {\n continue;\n }\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n if (onLine(parsed as Record<string, unknown>)) return;\n }\n }\n if (done) return;\n }\n } finally {\n // Release the connection; safe to call after the stream is exhausted.\n reader.cancel().catch(() => {});\n }\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nconst DEFAULT_ENSURE_CONTAINER_TIMEOUT_MS = 25_000;\n\n/**\n * Ensure the branch container is running and resolve its preview URL.\n *\n * Streams provisioning progress from `/projects/ensure-container`; resolves\n * `ready` + `url` from the terminal chunk. When the container is still booting\n * after `timeoutMs`, aborts the request and returns `provisioning` so callers\n * can poll again without blowing their run budget.\n */\nexport async function ensureFusionContainer(\n args: FusionBranchRef & { timeoutMs?: number },\n): Promise<EnsureFusionContainerResult> {\n const auth = await resolveFusionAuth();\n const controller = new AbortController();\n const timeoutMs = args.timeoutMs ?? DEFAULT_ENSURE_CONTAINER_TIMEOUT_MS;\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n let readyUrl: string | undefined;\n let lastMessage: string | undefined;\n let errorMessage: string | undefined;\n\n try {\n const response = await fetch(\n fusionUrl(\"/projects/ensure-container\", auth),\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${auth.privateKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n projectId: args.projectId,\n branchName: args.branchName,\n }),\n signal: controller.signal,\n },\n );\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n return {\n status: \"error\",\n message:\n text.slice(0, 500) || `ensure-container failed (${response.status})`,\n };\n }\n await readNdjsonStream(response, (chunk) => {\n const message = asString(chunk.message) ?? asString(chunk.error);\n if (message) lastMessage = message;\n const url = asString(chunk.url);\n if (url) readyUrl = url;\n const state = asString(chunk.state) ?? asString(chunk.type);\n if (state === \"error\" || state === \"init-error\") {\n errorMessage = message ?? \"Container provisioning failed\";\n return true;\n }\n if (state === \"ready\" && readyUrl) return true;\n return undefined;\n });\n } catch (error) {\n if (controller.signal.aborted) {\n return {\n status: readyUrl ? \"ready\" : \"provisioning\",\n url: readyUrl,\n message: lastMessage ?? \"Container is still starting\",\n };\n }\n return {\n status: \"error\",\n message: error instanceof Error ? error.message : String(error),\n };\n } finally {\n clearTimeout(timer);\n }\n\n if (errorMessage) return { status: \"error\", message: errorMessage };\n if (readyUrl) return { status: \"ready\", url: readyUrl, message: lastMessage };\n return { status: \"provisioning\", message: lastMessage };\n}\n\nconst DEFAULT_SEND_MESSAGE_TIMEOUT_MS = 30_000;\n\n/**\n * Send a prompt to the fusion branch's in-container coding agent via\n * `/projects/branch/message`.\n *\n * Defaults to `fireAndForget: true`: the backend dispatches the message and\n * ends the stream without waiting for the agent turn, so this returns in\n * seconds. Pass `fireAndForget: false` (with a generous `timeoutMs`) to wait\n * for the turn and capture the agent's final text.\n */\nexport async function sendFusionBranchMessage(\n args: FusionBranchRef & {\n prompt: string;\n fireAndForget?: boolean;\n timeoutMs?: number;\n userEmail?: string;\n },\n): Promise<SendFusionMessageResult> {\n const prompt = args.prompt?.trim();\n if (!prompt) throw new Error(\"prompt is required\");\n const auth = await resolveFusionAuth();\n const fireAndForget = args.fireAndForget ?? true;\n const controller = new AbortController();\n const timeoutMs = args.timeoutMs ?? DEFAULT_SEND_MESSAGE_TIMEOUT_MS;\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n let dispatched = false;\n let finalText: string | undefined;\n let errorMessage: string | undefined;\n\n try {\n const response = await fetch(fusionUrl(\"/projects/branch/message\", auth), {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${auth.privateKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n projectId: args.projectId,\n branchName: args.branchName,\n fireAndForget,\n userMessage: {\n userPrompt: prompt,\n ...(auth.userId || args.userEmail\n ? {\n user: {\n source: \"agent-native\",\n role: \"user\",\n ...(auth.userId ? { userId: auth.userId } : {}),\n ...(args.userEmail ? { userEmail: args.userEmail } : {}),\n },\n }\n : {}),\n },\n }),\n signal: controller.signal,\n });\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n return {\n sent: false,\n error:\n text.slice(0, 500) || `branch message failed (${response.status})`,\n };\n }\n await readNdjsonStream(response, (chunk) => {\n const type = asString(chunk.type);\n if (type === \"sending-message\") dispatched = true;\n if (type === \"error\") {\n errorMessage =\n asString(chunk.error) ?? asString(chunk.message) ?? \"Message failed\";\n return true;\n }\n if (type === \"ai\") {\n dispatched = true;\n const event = chunk.event;\n if (event && typeof event === \"object\") {\n const ev = event as Record<string, unknown>;\n if (asString(ev.type) === \"done\" && Array.isArray(ev.actions)) {\n for (const action of ev.actions) {\n if (\n action &&\n typeof action === \"object\" &&\n (action as Record<string, unknown>).type === \"text\"\n ) {\n const content = asString(\n (action as Record<string, unknown>).content,\n );\n if (content) finalText = content;\n }\n }\n }\n }\n }\n return undefined;\n });\n } catch (error) {\n if (controller.signal.aborted) {\n // Timed out reading the stream. With fire-and-forget the dispatch has\n // already happened server-side once we saw any progress chunk.\n if (dispatched) return { sent: true };\n return {\n sent: false,\n error: \"Timed out sending message to the app agent\",\n };\n }\n return {\n sent: false,\n error: error instanceof Error ? error.message : String(error),\n };\n } finally {\n clearTimeout(timer);\n }\n\n if (errorMessage) return { sent: dispatched, error: errorMessage };\n return { sent: true, response: finalText };\n}\n\nasync function fusionJsonRequest(\n path: string,\n init: { method: \"GET\" | \"POST\" | \"DELETE\"; body?: Record<string, unknown> },\n params?: Record<string, string>,\n): Promise<Record<string, unknown>> {\n const auth = await resolveFusionAuth();\n const response = await fetch(fusionUrl(path, auth, params), {\n method: init.method,\n headers: {\n Authorization: `Bearer ${auth.privateKey}`,\n ...(init.body ? { \"Content-Type\": \"application/json\" } : {}),\n },\n ...(init.body ? { body: JSON.stringify(init.body) } : {}),\n });\n const text = await response.text().catch(() => \"\");\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n parsed = undefined;\n }\n if (!response.ok) {\n const errorDetail =\n parsed && typeof parsed === \"object\"\n ? asString((parsed as Record<string, unknown>).error)\n : undefined;\n throw new Error(\n errorDetail ??\n `${path} failed (${response.status}): ${text.slice(0, 300)}`,\n );\n }\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n return {};\n}\n\n/**\n * Push the fusion branch's code to its git remote. Starts/attaches the\n * container if needed, then syncs with `canPush`.\n */\nexport async function pushFusionBranch(\n ref: FusionBranchRef,\n): Promise<Record<string, unknown>> {\n return fusionJsonRequest(\"/projects/branch/push-to-remote\", {\n method: \"POST\",\n body: { projectId: ref.projectId, branchName: ref.branchName },\n });\n}\n\n/** Reserve a hosting slug (`<slug>.builder.cloud`) for the project. */\nexport async function reserveFusionHostingSlug(args: {\n projectId: string;\n slug: string;\n}): Promise<{ slug: string }> {\n const result = await fusionJsonRequest(\"/projects/hosting/reserve-slug\", {\n method: \"POST\",\n body: { projectId: args.projectId, slug: args.slug },\n });\n const slug = asString(result.slug);\n if (!slug) throw new Error(\"Slug reservation returned no slug\");\n return { slug };\n}\n\n/**\n * Trigger a hosted deploy for the project. Requires a reserved hosting slug.\n * Returns immediately; poll `getFusionDeploys` for progress\n * (`queued → building → uploading → deploying → live | failed | canceled`).\n */\nexport async function deployFusionProject(args: {\n projectId: string;\n checkoutBranch?: string;\n}): Promise<{ deployId: string; status: string }> {\n const result = await fusionJsonRequest(\"/projects/deploy\", {\n method: \"POST\",\n body: {\n projectId: args.projectId,\n ...(args.checkoutBranch ? { checkoutBranch: args.checkoutBranch } : {}),\n },\n });\n const deployId = asString(result.deployId);\n if (!deployId) throw new Error(\"Deploy did not return a deployId\");\n return { deployId, status: asString(result.status) ?? \"queued\" };\n}\n\n/** List the project's deploys, optionally filtered to one deploy id. */\nexport async function getFusionDeploys(args: {\n projectId: string;\n deployId?: string;\n}): Promise<Array<Record<string, unknown>>> {\n const result = await fusionJsonRequest(\n \"/projects/deploys\",\n { method: \"GET\" },\n {\n projectId: args.projectId,\n ...(args.deployId ? { deployId: args.deployId } : {}),\n },\n );\n const deploys = (result.deploys ?? result.data ?? result) as unknown;\n if (Array.isArray(deploys)) {\n return deploys.filter(\n (entry): entry is Record<string, unknown> =>\n !!entry && typeof entry === \"object\",\n );\n }\n return [];\n}\n"]}
@@ -0,0 +1,14 @@
1
+ export declare const BUILDER_UTM_SOURCE = "agent-native";
2
+ export declare const BUILDER_UTM_MEDIUM = "product";
3
+ export declare const BUILDER_UTM_CAMPAIGN = "onboarding";
4
+ export declare function applyBuilderUtmTrackingParams(params: URLSearchParams, options?: {
5
+ medium?: string;
6
+ campaign?: string;
7
+ content?: string | null;
8
+ }): void;
9
+ export declare function withBuilderUtmTrackingParams(url: string, options?: {
10
+ medium?: string;
11
+ campaign?: string;
12
+ content?: string | null;
13
+ }): string;
14
+ //# sourceMappingURL=builder-link-tracking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder-link-tracking.d.ts","sourceRoot":"","sources":["../../src/shared/builder-link-tracking.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,iBAAiB,CAAC;AACjD,eAAO,MAAM,kBAAkB,YAAY,CAAC;AAC5C,eAAO,MAAM,oBAAoB,eAAe,CAAC;AAEjD,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,eAAe,EACvB,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB,GACL,IAAI,CAKN;AAED,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB,GACL,MAAM,CAeR"}
@@ -0,0 +1,26 @@
1
+ export const BUILDER_UTM_SOURCE = "agent-native";
2
+ export const BUILDER_UTM_MEDIUM = "product";
3
+ export const BUILDER_UTM_CAMPAIGN = "onboarding";
4
+ export function applyBuilderUtmTrackingParams(params, options = {}) {
5
+ params.set("utm_source", BUILDER_UTM_SOURCE);
6
+ params.set("utm_medium", options.medium ?? BUILDER_UTM_MEDIUM);
7
+ params.set("utm_campaign", options.campaign ?? BUILDER_UTM_CAMPAIGN);
8
+ if (options.content)
9
+ params.set("utm_content", options.content);
10
+ }
11
+ export function withBuilderUtmTrackingParams(url, options = {}) {
12
+ let parsed;
13
+ try {
14
+ parsed = new URL(url);
15
+ }
16
+ catch {
17
+ return url;
18
+ }
19
+ if (parsed.hostname !== "builder.io" &&
20
+ parsed.hostname !== "www.builder.io") {
21
+ return url;
22
+ }
23
+ applyBuilderUtmTrackingParams(parsed.searchParams, options);
24
+ return parsed.toString();
25
+ }
26
+ //# sourceMappingURL=builder-link-tracking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder-link-tracking.js","sourceRoot":"","sources":["../../src/shared/builder-link-tracking.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,cAAc,CAAC;AACjD,MAAM,CAAC,MAAM,kBAAkB,GAAG,SAAS,CAAC;AAC5C,MAAM,CAAC,MAAM,oBAAoB,GAAG,YAAY,CAAC;AAEjD,MAAM,UAAU,6BAA6B,CAC3C,MAAuB,EACvB,OAAO,GAIH,EAAE;IAEN,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC;IAC7C,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,MAAM,IAAI,kBAAkB,CAAC,CAAC;IAC/D,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,QAAQ,IAAI,oBAAoB,CAAC,CAAC;IACrE,IAAI,OAAO,CAAC,OAAO;QAAE,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,GAAW,EACX,OAAO,GAIH,EAAE;IAEN,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;IACD,IACE,MAAM,CAAC,QAAQ,KAAK,YAAY;QAChC,MAAM,CAAC,QAAQ,KAAK,gBAAgB,EACpC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,6BAA6B,CAAC,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAC5D,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;AAC3B,CAAC","sourcesContent":["export const BUILDER_UTM_SOURCE = \"agent-native\";\nexport const BUILDER_UTM_MEDIUM = \"product\";\nexport const BUILDER_UTM_CAMPAIGN = \"onboarding\";\n\nexport function applyBuilderUtmTrackingParams(\n params: URLSearchParams,\n options: {\n medium?: string;\n campaign?: string;\n content?: string | null;\n } = {},\n): void {\n params.set(\"utm_source\", BUILDER_UTM_SOURCE);\n params.set(\"utm_medium\", options.medium ?? BUILDER_UTM_MEDIUM);\n params.set(\"utm_campaign\", options.campaign ?? BUILDER_UTM_CAMPAIGN);\n if (options.content) params.set(\"utm_content\", options.content);\n}\n\nexport function withBuilderUtmTrackingParams(\n url: string,\n options: {\n medium?: string;\n campaign?: string;\n content?: string | null;\n } = {},\n): string {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return url;\n }\n if (\n parsed.hostname !== \"builder.io\" &&\n parsed.hostname !== \"www.builder.io\"\n ) {\n return url;\n }\n applyBuilderUtmTrackingParams(parsed.searchParams, options);\n return parsed.toString();\n}\n"]}
@@ -2,6 +2,7 @@ export { agentChat, type AgentChatMessage, type AgentChatCallOptions, type Agent
2
2
  export { agentEnv, type EnvVar } from "./agent-env.js";
3
3
  export { extractOAuthStateAppId } from "./oauth-state.js";
4
4
  export { truncate } from "./truncate.js";
5
+ export { withBuilderUtmTrackingParams } from "./builder-link-tracking.js";
5
6
  export { llmConnectionTrackingProperties, normalizeLlmConnection, type LlmConnectionStatus, } from "./llm-connection.js";
6
7
  export { DISPATCH_WORKSPACE_ROOT_REDIRECTS, RESERVED_WORKSPACE_APP_IDS, assertValidWorkspaceAppId, getWorkspaceAppIdValidationError, isValidWorkspaceAppIdFormat, } from "./workspace-app-id.js";
7
8
  export { DEFAULT_WORKSPACE_APP_AUDIENCE, WORKSPACE_APP_AUDIENCES, normalizeWorkspaceAppAudience, normalizeWorkspaceAppPathList, workspaceAppAudienceFromEnv, workspaceAppAudienceFromPackageJson, workspaceAppRouteAccessFromEnv, workspaceAppRouteAccessFromPackageJson, type WorkspaceAppRouteAccess, type WorkspaceAppRouteAccessFromConfig, type WorkspaceAppAudience, } from "./workspace-app-audience.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/shared/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,GACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,KAAK,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EACL,+BAA+B,EAC/B,sBAAsB,EACtB,KAAK,mBAAmB,GACzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,iCAAiC,EACjC,0BAA0B,EAC1B,yBAAyB,EACzB,gCAAgC,EAChC,2BAA2B,GAC5B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,8BAA8B,EAC9B,uBAAuB,EACvB,6BAA6B,EAC7B,6BAA6B,EAC7B,2BAA2B,EAC3B,mCAAmC,EACnC,8BAA8B,EAC9B,sCAAsC,EACtC,KAAK,uBAAuB,EAC5B,KAAK,iCAAiC,EACtC,KAAK,oBAAoB,GAC1B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,gCAAgC,EAChC,yBAAyB,EACzB,8BAA8B,GAC/B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,iCAAiC,EACjC,sCAAsC,EACtC,6BAA6B,EAC7B,gCAAgC,EAChC,8BAA8B,EAC9B,8BAA8B,EAC9B,+BAA+B,EAC/B,sBAAsB,EACtB,qCAAqC,EACrC,sBAAsB,EACtB,KAAK,oBAAoB,GAC1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,kBAAkB,EAClB,gCAAgC,EAChC,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,4BAA4B,EAC5B,0BAA0B,EAC1B,2BAA2B,EAC3B,gBAAgB,EAChB,KAAK,wBAAwB,EAC7B,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,GAC3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,oCAAoC,EACpC,mCAAmC,EACnC,mCAAmC,EACnC,0CAA0C,EAC1C,eAAe,EACf,KAAK,8BAA8B,EACnC,KAAK,0CAA0C,GAChD,MAAM,8BAA8B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/shared/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,GACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,KAAK,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EACL,+BAA+B,EAC/B,sBAAsB,EACtB,KAAK,mBAAmB,GACzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,iCAAiC,EACjC,0BAA0B,EAC1B,yBAAyB,EACzB,gCAAgC,EAChC,2BAA2B,GAC5B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,8BAA8B,EAC9B,uBAAuB,EACvB,6BAA6B,EAC7B,6BAA6B,EAC7B,2BAA2B,EAC3B,mCAAmC,EACnC,8BAA8B,EAC9B,sCAAsC,EACtC,KAAK,uBAAuB,EAC5B,KAAK,iCAAiC,EACtC,KAAK,oBAAoB,GAC1B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,gCAAgC,EAChC,yBAAyB,EACzB,8BAA8B,GAC/B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,iCAAiC,EACjC,sCAAsC,EACtC,6BAA6B,EAC7B,gCAAgC,EAChC,8BAA8B,EAC9B,8BAA8B,EAC9B,+BAA+B,EAC/B,sBAAsB,EACtB,qCAAqC,EACrC,sBAAsB,EACtB,KAAK,oBAAoB,GAC1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,kBAAkB,EAClB,gCAAgC,EAChC,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,4BAA4B,EAC5B,0BAA0B,EAC1B,2BAA2B,EAC3B,gBAAgB,EAChB,KAAK,wBAAwB,EAC7B,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,GAC3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,oCAAoC,EACpC,mCAAmC,EACnC,mCAAmC,EACnC,0CAA0C,EAC1C,eAAe,EACf,KAAK,8BAA8B,EACnC,KAAK,0CAA0C,GAChD,MAAM,8BAA8B,CAAC"}
@@ -2,6 +2,7 @@ export { agentChat, } from "./agent-chat.js";
2
2
  export { agentEnv } from "./agent-env.js";
3
3
  export { extractOAuthStateAppId } from "./oauth-state.js";
4
4
  export { truncate } from "./truncate.js";
5
+ export { withBuilderUtmTrackingParams } from "./builder-link-tracking.js";
5
6
  export { llmConnectionTrackingProperties, normalizeLlmConnection, } from "./llm-connection.js";
6
7
  export { DISPATCH_WORKSPACE_ROOT_REDIRECTS, RESERVED_WORKSPACE_APP_IDS, assertValidWorkspaceAppId, getWorkspaceAppIdValidationError, isValidWorkspaceAppIdFormat, } from "./workspace-app-id.js";
7
8
  export { DEFAULT_WORKSPACE_APP_AUDIENCE, WORKSPACE_APP_AUDIENCES, normalizeWorkspaceAppAudience, normalizeWorkspaceAppPathList, workspaceAppAudienceFromEnv, workspaceAppAudienceFromPackageJson, workspaceAppRouteAccessFromEnv, workspaceAppRouteAccessFromPackageJson, } from "./workspace-app-audience.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/shared/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,GAIV,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAe,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EACL,+BAA+B,EAC/B,sBAAsB,GAEvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,iCAAiC,EACjC,0BAA0B,EAC1B,yBAAyB,EACzB,gCAAgC,EAChC,2BAA2B,GAC5B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,8BAA8B,EAC9B,uBAAuB,EACvB,6BAA6B,EAC7B,6BAA6B,EAC7B,2BAA2B,EAC3B,mCAAmC,EACnC,8BAA8B,EAC9B,sCAAsC,GAIvC,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,gCAAgC,EAChC,yBAAyB,EACzB,8BAA8B,GAC/B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,iCAAiC,EACjC,sCAAsC,EACtC,6BAA6B,EAC7B,gCAAgC,EAChC,8BAA8B,EAC9B,8BAA8B,EAC9B,+BAA+B,EAC/B,sBAAsB,EACtB,qCAAqC,EACrC,sBAAsB,GAEvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,kBAAkB,EAClB,gCAAgC,EAChC,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,4BAA4B,EAC5B,0BAA0B,EAC1B,2BAA2B,EAC3B,gBAAgB,GAIjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,oCAAoC,EACpC,mCAAmC,EACnC,mCAAmC,EACnC,0CAA0C,EAC1C,eAAe,GAGhB,MAAM,8BAA8B,CAAC","sourcesContent":["export {\n agentChat,\n type AgentChatMessage,\n type AgentChatCallOptions,\n type AgentChatResponse,\n} from \"./agent-chat.js\";\nexport { agentEnv, type EnvVar } from \"./agent-env.js\";\nexport { extractOAuthStateAppId } from \"./oauth-state.js\";\nexport { truncate } from \"./truncate.js\";\nexport {\n llmConnectionTrackingProperties,\n normalizeLlmConnection,\n type LlmConnectionStatus,\n} from \"./llm-connection.js\";\nexport {\n DISPATCH_WORKSPACE_ROOT_REDIRECTS,\n RESERVED_WORKSPACE_APP_IDS,\n assertValidWorkspaceAppId,\n getWorkspaceAppIdValidationError,\n isValidWorkspaceAppIdFormat,\n} from \"./workspace-app-id.js\";\nexport {\n DEFAULT_WORKSPACE_APP_AUDIENCE,\n WORKSPACE_APP_AUDIENCES,\n normalizeWorkspaceAppAudience,\n normalizeWorkspaceAppPathList,\n workspaceAppAudienceFromEnv,\n workspaceAppAudienceFromPackageJson,\n workspaceAppRouteAccessFromEnv,\n workspaceAppRouteAccessFromPackageJson,\n type WorkspaceAppRouteAccess,\n type WorkspaceAppRouteAccessFromConfig,\n type WorkspaceAppAudience,\n} from \"./workspace-app-audience.js\";\nexport {\n AGENT_NATIVE_OPEN_PATH,\n AGENT_SIDEBAR_QUERY_PARAM,\n AGENT_SIDEBAR_QUERY_VALUE_CLOSED,\n isAgentNativeOpenDeepLink,\n withCollapsedAgentSidebarParam,\n} from \"./agent-sidebar-url.js\";\nexport {\n AGENT_NATIVE_DEFAULT_SOCIAL_IMAGE,\n AGENT_NATIVE_SOCIAL_IMAGE_CACHE_BUSTER,\n AGENT_NATIVE_SOCIAL_IMAGE_ALT,\n AGENT_NATIVE_SOCIAL_IMAGE_HEIGHT,\n AGENT_NATIVE_SOCIAL_IMAGE_PATH,\n AGENT_NATIVE_SOCIAL_IMAGE_TYPE,\n AGENT_NATIVE_SOCIAL_IMAGE_WIDTH,\n defaultSocialImageMeta,\n withAgentNativeSocialImageCacheBuster,\n withDefaultSocialImage,\n type SocialMetaDescriptor,\n} from \"./social-meta.js\";\nexport {\n EMBED_MODE_QUERY_PARAM,\n EMBED_SESSION_COOKIE,\n EMBED_START_PATH,\n EMBED_TOKEN_QUERY_PARAM,\n} from \"./embed-auth.js\";\nexport {\n AGENT_ACCESS_PARAM,\n DEFAULT_AGENT_ACCESS_TTL_SECONDS,\n appendAgentAccessParam,\n buildAgentAccessApiUrl,\n buildAgentAccessUrl,\n normalizeAgentAccessBasePath,\n normalizeAgentAccessOrigin,\n scopedAgentAccessResourceId,\n toAgentAccessUrl,\n type AgentAccessApiUrlOptions,\n type AgentAccessResourceScope,\n type AgentAccessUrlOptions,\n} from \"./agent-access.js\";\nexport {\n AGENT_READABLE_RESOURCE_PAYLOAD_TYPE,\n AGENT_READABLE_RESOURCE_SCRIPT_TYPE,\n buildAgentReadableResourceDiscovery,\n renderAgentReadableResourceDiscoveryScript,\n safeJsonForHtml,\n type AgentReadableResourceDiscovery,\n type BuildAgentReadableResourceDiscoveryOptions,\n} from \"./agent-readable-resource.js\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/shared/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,GAIV,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAe,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EACL,+BAA+B,EAC/B,sBAAsB,GAEvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,iCAAiC,EACjC,0BAA0B,EAC1B,yBAAyB,EACzB,gCAAgC,EAChC,2BAA2B,GAC5B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,8BAA8B,EAC9B,uBAAuB,EACvB,6BAA6B,EAC7B,6BAA6B,EAC7B,2BAA2B,EAC3B,mCAAmC,EACnC,8BAA8B,EAC9B,sCAAsC,GAIvC,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,gCAAgC,EAChC,yBAAyB,EACzB,8BAA8B,GAC/B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,iCAAiC,EACjC,sCAAsC,EACtC,6BAA6B,EAC7B,gCAAgC,EAChC,8BAA8B,EAC9B,8BAA8B,EAC9B,+BAA+B,EAC/B,sBAAsB,EACtB,qCAAqC,EACrC,sBAAsB,GAEvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,kBAAkB,EAClB,gCAAgC,EAChC,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,4BAA4B,EAC5B,0BAA0B,EAC1B,2BAA2B,EAC3B,gBAAgB,GAIjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,oCAAoC,EACpC,mCAAmC,EACnC,mCAAmC,EACnC,0CAA0C,EAC1C,eAAe,GAGhB,MAAM,8BAA8B,CAAC","sourcesContent":["export {\n agentChat,\n type AgentChatMessage,\n type AgentChatCallOptions,\n type AgentChatResponse,\n} from \"./agent-chat.js\";\nexport { agentEnv, type EnvVar } from \"./agent-env.js\";\nexport { extractOAuthStateAppId } from \"./oauth-state.js\";\nexport { truncate } from \"./truncate.js\";\nexport { withBuilderUtmTrackingParams } from \"./builder-link-tracking.js\";\nexport {\n llmConnectionTrackingProperties,\n normalizeLlmConnection,\n type LlmConnectionStatus,\n} from \"./llm-connection.js\";\nexport {\n DISPATCH_WORKSPACE_ROOT_REDIRECTS,\n RESERVED_WORKSPACE_APP_IDS,\n assertValidWorkspaceAppId,\n getWorkspaceAppIdValidationError,\n isValidWorkspaceAppIdFormat,\n} from \"./workspace-app-id.js\";\nexport {\n DEFAULT_WORKSPACE_APP_AUDIENCE,\n WORKSPACE_APP_AUDIENCES,\n normalizeWorkspaceAppAudience,\n normalizeWorkspaceAppPathList,\n workspaceAppAudienceFromEnv,\n workspaceAppAudienceFromPackageJson,\n workspaceAppRouteAccessFromEnv,\n workspaceAppRouteAccessFromPackageJson,\n type WorkspaceAppRouteAccess,\n type WorkspaceAppRouteAccessFromConfig,\n type WorkspaceAppAudience,\n} from \"./workspace-app-audience.js\";\nexport {\n AGENT_NATIVE_OPEN_PATH,\n AGENT_SIDEBAR_QUERY_PARAM,\n AGENT_SIDEBAR_QUERY_VALUE_CLOSED,\n isAgentNativeOpenDeepLink,\n withCollapsedAgentSidebarParam,\n} from \"./agent-sidebar-url.js\";\nexport {\n AGENT_NATIVE_DEFAULT_SOCIAL_IMAGE,\n AGENT_NATIVE_SOCIAL_IMAGE_CACHE_BUSTER,\n AGENT_NATIVE_SOCIAL_IMAGE_ALT,\n AGENT_NATIVE_SOCIAL_IMAGE_HEIGHT,\n AGENT_NATIVE_SOCIAL_IMAGE_PATH,\n AGENT_NATIVE_SOCIAL_IMAGE_TYPE,\n AGENT_NATIVE_SOCIAL_IMAGE_WIDTH,\n defaultSocialImageMeta,\n withAgentNativeSocialImageCacheBuster,\n withDefaultSocialImage,\n type SocialMetaDescriptor,\n} from \"./social-meta.js\";\nexport {\n EMBED_MODE_QUERY_PARAM,\n EMBED_SESSION_COOKIE,\n EMBED_START_PATH,\n EMBED_TOKEN_QUERY_PARAM,\n} from \"./embed-auth.js\";\nexport {\n AGENT_ACCESS_PARAM,\n DEFAULT_AGENT_ACCESS_TTL_SECONDS,\n appendAgentAccessParam,\n buildAgentAccessApiUrl,\n buildAgentAccessUrl,\n normalizeAgentAccessBasePath,\n normalizeAgentAccessOrigin,\n scopedAgentAccessResourceId,\n toAgentAccessUrl,\n type AgentAccessApiUrlOptions,\n type AgentAccessResourceScope,\n type AgentAccessUrlOptions,\n} from \"./agent-access.js\";\nexport {\n AGENT_READABLE_RESOURCE_PAYLOAD_TYPE,\n AGENT_READABLE_RESOURCE_SCRIPT_TYPE,\n buildAgentReadableResourceDiscovery,\n renderAgentReadableResourceDiscoveryScript,\n safeJsonForHtml,\n type AgentReadableResourceDiscovery,\n type BuildAgentReadableResourceDiscoveryOptions,\n} from \"./agent-readable-resource.js\";\n"]}
@@ -567,7 +567,7 @@ In a standard production deployment with [production code execution](#production
567
567
 
568
568
  ### Builder.io: Visual Editing in Production {#builderio}
569
569
 
570
- [Builder.io](https://www.builder.io) solves this by providing a managed cloud environment where the agent retains the ability to modify your app's UI in production. Connect your repo to Builder.io and prompt for UI changes directly — no redeploy needed.
570
+ [Builder.io](https://www.builder.io?utm_source=agent-native&utm_medium=docs&utm_campaign=framework&utm_content=deployment) solves this by providing a managed cloud environment where the agent retains the ability to modify your app's UI in production. Connect your repo to Builder.io and prompt for UI changes directly — no redeploy needed.
571
571
 
572
572
  **How it works:**
573
573
 
@@ -186,7 +186,7 @@ time.
186
186
 
187
187
  ## Builder.io cloud frame {#cloud-frame}
188
188
 
189
- [Builder.io](https://www.builder.io) provides a managed frame that hosts the
189
+ [Builder.io](https://www.builder.io?utm_source=agent-native&utm_medium=docs&utm_campaign=framework&utm_content=frames) provides a managed frame that hosts the
190
190
  same app and the same agent panel, in the cloud:
191
191
 
192
192
  - Real-time collaboration — multiple users can watch and interact at once.