@agent-native/core 0.114.13 → 0.114.16

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 (163) hide show
  1. package/bin/agent-native.js +35 -14
  2. package/bin/launcher.js +34 -0
  3. package/corpus/README.md +2 -2
  4. package/corpus/core/CHANGELOG.md +21 -0
  5. package/corpus/core/bin/agent-native.js +35 -14
  6. package/corpus/core/bin/launcher.js +34 -0
  7. package/corpus/core/docs/content/deployment.mdx +1 -1
  8. package/corpus/core/docs/content/frames.mdx +1 -1
  9. package/corpus/core/docs/content/integrations.mdx +27 -27
  10. package/corpus/core/docs/content/pr-visual-recap.mdx +17 -13
  11. package/corpus/core/docs/content/workspace-management.mdx +1 -1
  12. package/corpus/core/package.json +2 -1
  13. package/corpus/core/src/agent/engine/builder-engine.ts +4 -0
  14. package/corpus/core/src/client/AgentPanel.tsx +10 -4
  15. package/corpus/core/src/client/ConnectBuilderCard.tsx +5 -1
  16. package/corpus/core/src/client/chat/markdown-renderer.tsx +3 -5
  17. package/corpus/core/src/client/error-format.ts +2 -1
  18. package/corpus/core/src/client/index.ts +1 -0
  19. package/corpus/core/src/client/integrations/IntegrationsPanel.tsx +2 -18
  20. package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +43 -32
  21. package/corpus/core/src/client/resources/mcp-integration-catalog.ts +4 -2
  22. package/corpus/core/src/client/settings/BackgroundAgentSection.tsx +5 -1
  23. package/corpus/core/src/client/settings/SettingsPanel.tsx +4 -4
  24. package/corpus/core/src/client/settings/useBuilderStatus.ts +3 -0
  25. package/corpus/core/src/localization/default-messages.ts +1 -7
  26. package/corpus/core/src/server/builder-browser.ts +4 -0
  27. package/corpus/core/src/server/builder-design-systems.ts +6 -1
  28. package/corpus/core/src/server/fusion-app.ts +5 -1
  29. package/corpus/core/src/shared/builder-link-tracking.ts +41 -0
  30. package/corpus/core/src/shared/index.ts +1 -0
  31. package/corpus/templates/analytics/AGENTS.md +10 -1
  32. package/corpus/templates/analytics/actions/save-dashboard-report-subscription.ts +10 -2
  33. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +5 -4
  34. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +20 -32
  35. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/report-panel-window.ts +62 -0
  36. package/corpus/templates/analytics/changelog/2026-07-21-chart-series-controls-stay-open-while-moving-from-the-legend.md +6 -0
  37. package/corpus/templates/analytics/changelog/2026-07-21-dashboard-email-captures-complete-large-dashboards-in-chunks.md +6 -0
  38. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +4 -4
  39. package/corpus/templates/analytics/server/jobs/dashboard-report.ts +1 -8
  40. package/corpus/templates/analytics/server/lib/dashboard-report-subscriptions.ts +39 -7
  41. package/corpus/templates/analytics/server/lib/dashboard-report.ts +341 -251
  42. package/corpus/templates/analytics/server/lib/first-party-dashboard-repair.ts +114 -0
  43. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +84 -6
  44. package/corpus/templates/analytics/server/plugins/db.ts +13 -0
  45. package/corpus/templates/clips/app/components/library/bulk-action-toolbar.tsx +25 -8
  46. package/corpus/templates/clips/app/components/library/library-grid.tsx +118 -9
  47. package/corpus/templates/clips/app/components/library/library-layout.tsx +1 -1
  48. package/corpus/templates/clips/app/components/library/recording-card.tsx +10 -8
  49. package/corpus/templates/clips/app/components/player/video-player.tsx +10 -4
  50. package/corpus/templates/clips/app/i18n/en-US.ts +6 -0
  51. package/corpus/templates/clips/app/routes/_app.trash.tsx +16 -1
  52. package/corpus/templates/clips/changelog/2026-07-21-choose-which-whisper-model-to-use-in-settings.md +6 -0
  53. package/corpus/templates/clips/changelog/2026-07-21-fixed-organization-recording-visibility-default.md +6 -0
  54. package/corpus/templates/clips/changelog/2026-07-21-meeting-notes-stop-when-calls-end.md +6 -0
  55. package/corpus/templates/clips/desktop/src/app.tsx +90 -78
  56. package/corpus/templates/clips/desktop/src/hooks/useMeetingTranscription.ts +2 -0
  57. package/corpus/templates/clips/desktop/src/hooks/useWhisperSettings.ts +172 -0
  58. package/corpus/templates/clips/desktop/src/lib/meeting-call-app.ts +41 -0
  59. package/corpus/templates/clips/desktop/src/lib/silence-events.ts +1 -0
  60. package/corpus/templates/clips/desktop/src/shared/config.ts +1 -0
  61. package/corpus/templates/clips/desktop/src/styles.css +80 -7
  62. package/corpus/templates/clips/desktop/src-tauri/src/config.rs +32 -0
  63. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +3 -0
  64. package/corpus/templates/clips/desktop/src-tauri/src/silence_detector.rs +268 -20
  65. package/corpus/templates/clips/desktop/src-tauri/src/whisper_model.rs +285 -164
  66. package/corpus/templates/clips/desktop/src-tauri/src/whisper_speech.rs +18 -7
  67. package/corpus/templates/clips/learnings.defaults.md +1 -1
  68. package/corpus/templates/clips/server/plugins/db.ts +11 -0
  69. package/corpus/templates/clips/shared/builder-credits.ts +1 -1
  70. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +20 -38
  71. package/corpus/templates/content/app/components/editor/previewDocumentSaveController.ts +40 -1
  72. package/corpus/templates/design/app/components/design/FusionAppBanner.tsx +9 -1
  73. package/corpus/templates/design/app/components/design/edit-panel/component-section.tsx +5 -1
  74. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +9 -1
  75. package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +9 -1
  76. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  77. package/dist/agent/engine/builder-engine.js +4 -0
  78. package/dist/agent/engine/builder-engine.js.map +1 -1
  79. package/dist/client/AgentPanel.d.ts.map +1 -1
  80. package/dist/client/AgentPanel.js +10 -3
  81. package/dist/client/AgentPanel.js.map +1 -1
  82. package/dist/client/ConnectBuilderCard.d.ts.map +1 -1
  83. package/dist/client/ConnectBuilderCard.js +5 -1
  84. package/dist/client/ConnectBuilderCard.js.map +1 -1
  85. package/dist/client/chat/markdown-renderer.d.ts.map +1 -1
  86. package/dist/client/chat/markdown-renderer.js +3 -2
  87. package/dist/client/chat/markdown-renderer.js.map +1 -1
  88. package/dist/client/error-format.d.ts +1 -1
  89. package/dist/client/error-format.d.ts.map +1 -1
  90. package/dist/client/error-format.js +1 -1
  91. package/dist/client/error-format.js.map +1 -1
  92. package/dist/client/index.d.ts +1 -0
  93. package/dist/client/index.d.ts.map +1 -1
  94. package/dist/client/index.js +1 -0
  95. package/dist/client/index.js.map +1 -1
  96. package/dist/client/integrations/IntegrationsPanel.d.ts.map +1 -1
  97. package/dist/client/integrations/IntegrationsPanel.js +3 -4
  98. package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
  99. package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
  100. package/dist/client/resources/McpIntegrationDialog.js +21 -7
  101. package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
  102. package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
  103. package/dist/client/resources/mcp-integration-catalog.js +2 -2
  104. package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
  105. package/dist/client/settings/BackgroundAgentSection.d.ts.map +1 -1
  106. package/dist/client/settings/BackgroundAgentSection.js +5 -1
  107. package/dist/client/settings/BackgroundAgentSection.js.map +1 -1
  108. package/dist/client/settings/SettingsPanel.js +1 -1
  109. package/dist/client/settings/SettingsPanel.js.map +1 -1
  110. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  111. package/dist/client/settings/useBuilderStatus.js +2 -0
  112. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  113. package/dist/collab/struct-routes.d.ts +1 -1
  114. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  115. package/dist/localization/default-messages.d.ts +0 -6
  116. package/dist/localization/default-messages.d.ts.map +1 -1
  117. package/dist/localization/default-messages.js +1 -7
  118. package/dist/localization/default-messages.js.map +1 -1
  119. package/dist/observability/routes.d.ts +5 -5
  120. package/dist/resources/handlers.d.ts +1 -1
  121. package/dist/secrets/routes.d.ts +9 -9
  122. package/dist/server/builder-browser.d.ts.map +1 -1
  123. package/dist/server/builder-browser.js +4 -0
  124. package/dist/server/builder-browser.js.map +1 -1
  125. package/dist/server/builder-design-systems.d.ts.map +1 -1
  126. package/dist/server/builder-design-systems.js +6 -1
  127. package/dist/server/builder-design-systems.js.map +1 -1
  128. package/dist/server/fusion-app.d.ts.map +1 -1
  129. package/dist/server/fusion-app.js +2 -1
  130. package/dist/server/fusion-app.js.map +1 -1
  131. package/dist/server/transcribe-voice.d.ts +1 -1
  132. package/dist/shared/builder-link-tracking.d.ts +14 -0
  133. package/dist/shared/builder-link-tracking.d.ts.map +1 -0
  134. package/dist/shared/builder-link-tracking.js +26 -0
  135. package/dist/shared/builder-link-tracking.js.map +1 -0
  136. package/dist/shared/index.d.ts +1 -0
  137. package/dist/shared/index.d.ts.map +1 -1
  138. package/dist/shared/index.js +1 -0
  139. package/dist/shared/index.js.map +1 -1
  140. package/docs/content/deployment.mdx +1 -1
  141. package/docs/content/frames.mdx +1 -1
  142. package/docs/content/integrations.mdx +27 -27
  143. package/docs/content/pr-visual-recap.mdx +17 -13
  144. package/docs/content/workspace-management.mdx +1 -1
  145. package/package.json +3 -2
  146. package/src/agent/engine/builder-engine.ts +4 -0
  147. package/src/client/AgentPanel.tsx +10 -4
  148. package/src/client/ConnectBuilderCard.tsx +5 -1
  149. package/src/client/chat/markdown-renderer.tsx +3 -5
  150. package/src/client/error-format.ts +2 -1
  151. package/src/client/index.ts +1 -0
  152. package/src/client/integrations/IntegrationsPanel.tsx +2 -18
  153. package/src/client/resources/McpIntegrationDialog.tsx +43 -32
  154. package/src/client/resources/mcp-integration-catalog.ts +4 -2
  155. package/src/client/settings/BackgroundAgentSection.tsx +5 -1
  156. package/src/client/settings/SettingsPanel.tsx +4 -4
  157. package/src/client/settings/useBuilderStatus.ts +3 -0
  158. package/src/localization/default-messages.ts +1 -7
  159. package/src/server/builder-browser.ts +4 -0
  160. package/src/server/builder-design-systems.ts +6 -1
  161. package/src/server/fusion-app.ts +5 -1
  162. package/src/shared/builder-link-tracking.ts +41 -0
  163. package/src/shared/index.ts +1 -0
@@ -5,6 +5,8 @@ import { existsSync, statSync } from "node:fs";
5
5
  import { dirname, join } from "node:path";
6
6
  import { fileURLToPath, pathToFileURL } from "node:url";
7
7
 
8
+ import { shouldUseSourceFallback } from "./launcher.js";
9
+
8
10
  const binDir = dirname(fileURLToPath(import.meta.url));
9
11
  const distEntry = join(binDir, "../dist/cli/index.js");
10
12
  const sourceEntry = join(binDir, "../src/cli/index.ts");
@@ -16,31 +18,50 @@ const freshnessChecks = [
16
18
  ],
17
19
  ];
18
20
 
19
- function shouldUseSourceFallback() {
20
- if (!existsSync(sourceEntry)) return false;
21
- if (!existsSync(distEntry)) return true;
21
+ // The tsx source fallback and mtime freshness check are for local monorepo
22
+ // development only. Published installs ship both src and dist, and tarball
23
+ // extraction can leave .ts files newer than .js, which must not trigger tsx
24
+ // (not a runtime dependency). Only consider the fallback in a source checkout.
25
+ const isSourceCheckout = existsSync(join(binDir, "../tsconfig.cli.json"));
26
+
27
+ function statMtimeMs(path) {
22
28
  try {
23
- return freshnessChecks.some(
24
- ([source, dist]) =>
25
- existsSync(source) &&
26
- existsSync(dist) &&
27
- statSync(source).mtimeMs > statSync(dist).mtimeMs,
28
- );
29
+ return statSync(path).mtimeMs;
29
30
  } catch {
30
- return false;
31
+ return 0;
31
32
  }
32
33
  }
33
34
 
34
- if (!shouldUseSourceFallback() && existsSync(distEntry)) {
35
- await import(pathToFileURL(distEntry).href);
36
- } else {
37
- if (!existsSync(sourceEntry)) {
35
+ const freshness = freshnessChecks.map(([source, dist]) => {
36
+ const sourceExists = existsSync(source);
37
+ const distExists = existsSync(dist);
38
+ return {
39
+ sourceExists,
40
+ distExists,
41
+ sourceMtimeMs: sourceExists ? statMtimeMs(source) : 0,
42
+ distMtimeMs: distExists ? statMtimeMs(dist) : 0,
43
+ };
44
+ });
45
+
46
+ const useSourceFallback = shouldUseSourceFallback({
47
+ isSourceCheckout,
48
+ sourceEntryExists: existsSync(sourceEntry),
49
+ distEntryExists: existsSync(distEntry),
50
+ freshness,
51
+ });
52
+
53
+ if (!useSourceFallback) {
54
+ // Installed packages (and up-to-date checkouts) always run the shipped build.
55
+ // tsx is not a runtime dependency, so it must never be invoked here.
56
+ if (!existsSync(distEntry)) {
38
57
  console.error(
39
58
  "agent-native CLI build output is missing. Run `pnpm --filter @agent-native/core build` and try again.",
40
59
  );
41
60
  process.exit(1);
42
61
  }
43
62
 
63
+ await import(pathToFileURL(distEntry).href);
64
+ } else {
44
65
  const child = spawn("tsx", [sourceEntry, ...process.argv.slice(2)], {
45
66
  stdio: "inherit",
46
67
  env: process.env,
@@ -0,0 +1,34 @@
1
+ // Pure decision logic for the agent-native CLI launcher shim, kept dependency
2
+ // free so it can be unit tested without touching the filesystem.
3
+ //
4
+ // The tsx source fallback and mtime freshness check exist for local monorepo
5
+ // development only. Published installs ship both src and dist, and tarball
6
+ // extraction can leave .ts files newer than .js — that must never route to tsx
7
+ // (not a runtime dependency), or `npx @agent-native/core ...` fails with
8
+ // `spawn tsx ENOENT`. The `isSourceCheckout` gate is what keeps installed
9
+ // packages on the shipped dist build.
10
+
11
+ /**
12
+ * @param {object} input
13
+ * @param {boolean} input.isSourceCheckout Whether we run from a monorepo checkout.
14
+ * @param {boolean} input.sourceEntryExists Whether the .ts CLI entry exists.
15
+ * @param {boolean} input.distEntryExists Whether the compiled .js CLI entry exists.
16
+ * @param {Array<{sourceExists: boolean, distExists: boolean, sourceMtimeMs: number, distMtimeMs: number}>} [input.freshness]
17
+ * @returns {boolean}
18
+ */
19
+ export function shouldUseSourceFallback({
20
+ isSourceCheckout,
21
+ sourceEntryExists,
22
+ distEntryExists,
23
+ freshness = [],
24
+ }) {
25
+ if (!isSourceCheckout) return false;
26
+ if (!sourceEntryExists) return false;
27
+ if (!distEntryExists) return true;
28
+ return freshness.some(
29
+ (pair) =>
30
+ pair.sourceExists &&
31
+ pair.distExists &&
32
+ pair.sourceMtimeMs > pair.distMtimeMs,
33
+ );
34
+ }
package/corpus/README.md CHANGED
@@ -28,6 +28,6 @@ rg -n "defineAction|useActionQuery" node_modules/@agent-native/core/corpus
28
28
 
29
29
  ## Generated Counts
30
30
 
31
- - core files: 1519
31
+ - core files: 1521
32
32
  - toolkit files: 137
33
- - template files: 6185
33
+ - template files: 6194
@@ -1,5 +1,26 @@
1
1
  # @agent-native/core
2
2
 
3
+ ## 0.114.16
4
+
5
+ ### Patch Changes
6
+
7
+ - 3a3eb9a: Fix `npx @agent-native/core create` failing with `spawn tsx ENOENT`. The CLI launcher's tsx source fallback is now scoped to monorepo source checkouts, so installed packages always run the shipped `dist` build even when tarball extraction leaves `.ts` files newer than their compiled `.js`.
8
+
9
+ ## 0.114.15
10
+
11
+ ### Patch Changes
12
+
13
+ - f8fe58b: Add `VISUAL_RECAP_REQUIRED_LABELS` so PR Visual Recap can run only when a pull request has an opt-in label.
14
+ - Updated dependencies [f8fe58b]
15
+ - @agent-native/recap-cli@0.5.0
16
+
17
+ ## 0.114.14
18
+
19
+ ### Patch Changes
20
+
21
+ - 8df32f6: Improve the integrations picker by removing dead discovery controls, clearly showing the available catalog size, and simplifying provider setup guidance.
22
+ - 8df32f6: Add UTM attribution to Builder.io links opened from Agent Native.
23
+
3
24
  ## 0.114.13
4
25
 
5
26
  ### Patch Changes
@@ -5,6 +5,8 @@ import { existsSync, statSync } from "node:fs";
5
5
  import { dirname, join } from "node:path";
6
6
  import { fileURLToPath, pathToFileURL } from "node:url";
7
7
 
8
+ import { shouldUseSourceFallback } from "./launcher.js";
9
+
8
10
  const binDir = dirname(fileURLToPath(import.meta.url));
9
11
  const distEntry = join(binDir, "../dist/cli/index.js");
10
12
  const sourceEntry = join(binDir, "../src/cli/index.ts");
@@ -16,31 +18,50 @@ const freshnessChecks = [
16
18
  ],
17
19
  ];
18
20
 
19
- function shouldUseSourceFallback() {
20
- if (!existsSync(sourceEntry)) return false;
21
- if (!existsSync(distEntry)) return true;
21
+ // The tsx source fallback and mtime freshness check are for local monorepo
22
+ // development only. Published installs ship both src and dist, and tarball
23
+ // extraction can leave .ts files newer than .js, which must not trigger tsx
24
+ // (not a runtime dependency). Only consider the fallback in a source checkout.
25
+ const isSourceCheckout = existsSync(join(binDir, "../tsconfig.cli.json"));
26
+
27
+ function statMtimeMs(path) {
22
28
  try {
23
- return freshnessChecks.some(
24
- ([source, dist]) =>
25
- existsSync(source) &&
26
- existsSync(dist) &&
27
- statSync(source).mtimeMs > statSync(dist).mtimeMs,
28
- );
29
+ return statSync(path).mtimeMs;
29
30
  } catch {
30
- return false;
31
+ return 0;
31
32
  }
32
33
  }
33
34
 
34
- if (!shouldUseSourceFallback() && existsSync(distEntry)) {
35
- await import(pathToFileURL(distEntry).href);
36
- } else {
37
- if (!existsSync(sourceEntry)) {
35
+ const freshness = freshnessChecks.map(([source, dist]) => {
36
+ const sourceExists = existsSync(source);
37
+ const distExists = existsSync(dist);
38
+ return {
39
+ sourceExists,
40
+ distExists,
41
+ sourceMtimeMs: sourceExists ? statMtimeMs(source) : 0,
42
+ distMtimeMs: distExists ? statMtimeMs(dist) : 0,
43
+ };
44
+ });
45
+
46
+ const useSourceFallback = shouldUseSourceFallback({
47
+ isSourceCheckout,
48
+ sourceEntryExists: existsSync(sourceEntry),
49
+ distEntryExists: existsSync(distEntry),
50
+ freshness,
51
+ });
52
+
53
+ if (!useSourceFallback) {
54
+ // Installed packages (and up-to-date checkouts) always run the shipped build.
55
+ // tsx is not a runtime dependency, so it must never be invoked here.
56
+ if (!existsSync(distEntry)) {
38
57
  console.error(
39
58
  "agent-native CLI build output is missing. Run `pnpm --filter @agent-native/core build` and try again.",
40
59
  );
41
60
  process.exit(1);
42
61
  }
43
62
 
63
+ await import(pathToFileURL(distEntry).href);
64
+ } else {
44
65
  const child = spawn("tsx", [sourceEntry, ...process.argv.slice(2)], {
45
66
  stdio: "inherit",
46
67
  env: process.env,
@@ -0,0 +1,34 @@
1
+ // Pure decision logic for the agent-native CLI launcher shim, kept dependency
2
+ // free so it can be unit tested without touching the filesystem.
3
+ //
4
+ // The tsx source fallback and mtime freshness check exist for local monorepo
5
+ // development only. Published installs ship both src and dist, and tarball
6
+ // extraction can leave .ts files newer than .js — that must never route to tsx
7
+ // (not a runtime dependency), or `npx @agent-native/core ...` fails with
8
+ // `spawn tsx ENOENT`. The `isSourceCheckout` gate is what keeps installed
9
+ // packages on the shipped dist build.
10
+
11
+ /**
12
+ * @param {object} input
13
+ * @param {boolean} input.isSourceCheckout Whether we run from a monorepo checkout.
14
+ * @param {boolean} input.sourceEntryExists Whether the .ts CLI entry exists.
15
+ * @param {boolean} input.distEntryExists Whether the compiled .js CLI entry exists.
16
+ * @param {Array<{sourceExists: boolean, distExists: boolean, sourceMtimeMs: number, distMtimeMs: number}>} [input.freshness]
17
+ * @returns {boolean}
18
+ */
19
+ export function shouldUseSourceFallback({
20
+ isSourceCheckout,
21
+ sourceEntryExists,
22
+ distEntryExists,
23
+ freshness = [],
24
+ }) {
25
+ if (!isSourceCheckout) return false;
26
+ if (!sourceEntryExists) return false;
27
+ if (!distEntryExists) return true;
28
+ return freshness.some(
29
+ (pair) =>
30
+ pair.sourceExists &&
31
+ pair.distExists &&
32
+ pair.sourceMtimeMs > pair.distMtimeMs,
33
+ );
34
+ }
@@ -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.
@@ -322,33 +322,33 @@ endpoint is reachable or cataloged, but a live provider authorization or tool
322
322
  session still needs to be completed. **Restricted** entries remain discoverable
323
323
  but need provider or administrator setup before a generic connection can work.
324
324
 
325
- | Integration | Connection mode | Status | Endpoint | Setup and notes |
326
- | ------------------------------------------------------------------------------------------------------------------------------ | ---------------------- | ---------------------------------- | ----------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
327
- | [Context7](https://context7.com/) | No auth | Ready · verified | `https://mcp.context7.com/mcp` | Fetch current library and framework docs. |
328
- | [Sentry](https://docs.sentry.io/product/sentry-mcp/) | Header / token | Ready · preflight only | `https://mcp.sentry.dev/mcp` | Add a Sentry bearer token as the `Authorization` header. |
329
- | [Notion](https://developers.notion.com/guides/mcp/get-started-with-mcp) | OAuth | Ready · preflight only | `https://mcp.notion.com/mcp` | User OAuth; enterprise admins can audit or restrict MCP clients. |
330
- | [Semgrep](https://github.com/semgrep/mcp#readme) | No auth | Ready · preflight only | `https://mcp.semgrep.ai/mcp` | Scan code for security findings. |
331
- | [Linear](https://linear.app/docs/mcp) | OAuth | Ready · preflight only | `https://mcp.linear.app/mcp` | Authorize the workspace and issue permissions required by the workflow. |
332
- | [Atlassian Rovo MCP](https://developer.atlassian.com/cloud/rovo-mcp/guides/getting-started/) | OAuth + provider setup | Restricted | `https://mcp.atlassian.com/v1/mcp/authv2` | Admins may need to trust the app origin and enable Rovo Read, Write, and Search permissions. |
333
- | [Supabase](https://www.builder.io/c/docs/fusion-connect-to-supabase) | OAuth | Ready · preflight only | `https://mcp.supabase.com/mcp` | Authorize the Supabase project and requested backend scopes. |
334
- | [Neon](https://www.builder.io/c/docs/fusion-connect-to-neon) | OAuth | Ready · preflight only | `https://mcp.neon.tech/sse` | Authorize access to the serverless Postgres projects needed by the app. |
335
- | [Stripe](https://docs.stripe.com/mcp) | OAuth | Ready · preflight only | `https://mcp.stripe.com` | Review payment, customer, and subscription permissions before authorizing. |
336
- | [Cloudflare](https://developers.cloudflare.com/agents/model-context-protocol/cloudflare/servers-for-cloudflare/) | OAuth | Ready · preflight only | `https://mcp.cloudflare.com/mcp` | Choose the narrowest Cloudflare server and review scopes. |
337
- | [GitLab](https://docs.gitlab.com/user/model_context_protocol/mcp_server/) | OAuth + provider setup | Beta · restricted | `https://gitlab.com/api/v4/mcp` | A top-level group admin, or the equivalent self-managed instance admin, must allow MCP. |
338
- | [Figma](https://developers.figma.com/docs/figma-mcp-server/) | Manual setup | Approved clients only · restricted | `https://mcp.figma.com/mcp` | Figma only allows clients in its MCP Catalog. Use the [Figma REST API personal access token fallback](https://developers.figma.com/docs/rest-api/personal-access-tokens/) for file and node reads until Agent Native is approved. |
339
- | [Canva](https://www.canva.dev/docs/mcp/) | Manual setup | Approved domains · restricted | `https://mcp.canva.com/mcp` | Per-user OAuth; clients must allow Canva's canva.com and canva.ai domains and follow the current redirect setup. |
340
- | [Vercel](https://vercel.com/docs/agent-resources/vercel-mcp) | Manual setup | Approved clients only · restricted | `https://mcp.vercel.com` | Vercel must list the client as approved before a generic connection will work. |
341
- | [GitHub](https://github.com/github/github-mcp-server) | Manual setup | Provider setup · restricted | `https://api.githubcopilot.com/mcp/` | Use a registered OAuth app; organizations may also enforce OAuth App Access Policies. |
342
- | [Slack](https://docs.slack.dev/ai/slack-mcp-server/) | Manual setup | Approved clients only · restricted | `https://mcp.slack.com/mcp` | Requires a fixed registered Slack app; dynamic client registration is not supported. |
343
- | [Asana](https://developers.asana.com/docs/integrating-with-asanas-mcp-server) | Manual setup | Provider setup · restricted | `https://mcp.asana.com/v2/mcp` | Pre-register an Asana MCP OAuth app before connecting. |
344
- | [HubSpot](https://developers.hubspot.com/docs/apps/developer-platform/build-apps/integrate-with-the-remote-hubspot-mcp-server) | Manual setup | Provider setup · restricted | `https://mcp.hubspot.com` | Create a HubSpot MCP Auth App with PKCE; the existing HubSpot OAuth connector remains available to app actions. |
345
- | [Intercom](https://developers.intercom.com/docs/guides/mcp) | OAuth | Ready · preflight only | `https://mcp.intercom.com/mcp` | Available for US-hosted workspaces; confirm region and scopes during authorization. |
346
- | [monday.com](https://developer.monday.com/api-reference/docs/build-on-monday-with-ai) | OAuth | Ready · preflight only | `https://mcp.monday.com/mcp` | Choose the workspace and permissions to share during authorization. |
347
- | [Webflow](https://developers.webflow.com/mcp/reference/getting-started) | OAuth | Ready · preflight only | `https://mcp.webflow.com/mcp` | Designer capabilities may install Webflow's Bridge App; Data API access is separate. |
348
- | [PayPal](https://developer.paypal.com/ai-tools/mcp-server/) | OAuth | Ready · preflight only | `https://mcp.paypal.com/sse` | Review merchant permissions before authorizing the remote server. |
349
- | [Box](https://developer.box.com/guides/box-mcp) | Manual setup | Beta · restricted | `https://mcp.box.com` | An administrator must enable Box MCP; custom clients also need credentials, a redirect URI, and approved scopes. |
350
- | [Netlify](https://docs.netlify.com/build/build-with-ai/agent-setup-guides/agent-setup-overview/) | OAuth | Ready · preflight only | `https://netlify-mcp.netlify.app/mcp` | Review site and team permissions before completing OAuth. |
351
- | [Zapier MCP](https://help.zapier.com/hc/en-us/articles/36265392843917-Use-Zapier-MCP-with-your-client) | Header / token | User-created server · restricted | `https://mcp.zapier.com/api/v1/connect` | Create the MCP server in Zapier, then paste its generated bearer token into the header field. |
325
+ | Integration | Connection mode | Status | Endpoint | Setup and notes |
326
+ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------- | ---------------------------------- | ----------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
327
+ | [Context7](https://context7.com/) | No auth | Ready · verified | `https://mcp.context7.com/mcp` | Fetch current library and framework docs. |
328
+ | [Sentry](https://docs.sentry.io/product/sentry-mcp/) | Header / token | Ready · preflight only | `https://mcp.sentry.dev/mcp` | Add a Sentry bearer token as the `Authorization` header. |
329
+ | [Notion](https://developers.notion.com/guides/mcp/get-started-with-mcp) | OAuth | Ready · preflight only | `https://mcp.notion.com/mcp` | User OAuth; enterprise admins can audit or restrict MCP clients. |
330
+ | [Semgrep](https://github.com/semgrep/mcp#readme) | No auth | Ready · preflight only | `https://mcp.semgrep.ai/mcp` | Scan code for security findings. |
331
+ | [Linear](https://linear.app/docs/mcp) | OAuth | Ready · preflight only | `https://mcp.linear.app/mcp` | Authorize the workspace and issue permissions required by the workflow. |
332
+ | [Atlassian Rovo MCP](https://developer.atlassian.com/cloud/rovo-mcp/guides/getting-started/) | OAuth + provider setup | Restricted | `https://mcp.atlassian.com/v1/mcp/authv2` | Admins may need to trust the app origin and enable Rovo Read, Write, and Search permissions. |
333
+ | [Supabase](https://www.builder.io/c/docs/fusion-connect-to-supabase?utm_source=agent-native&utm_medium=docs&utm_campaign=framework&utm_content=fusion_connect_supabase) | OAuth | Ready · preflight only | `https://mcp.supabase.com/mcp` | Authorize the Supabase project and requested backend scopes. |
334
+ | [Neon](https://www.builder.io/c/docs/fusion-connect-to-neon?utm_source=agent-native&utm_medium=docs&utm_campaign=framework&utm_content=fusion_connect_neon) | OAuth | Ready · preflight only | `https://mcp.neon.tech/sse` | Authorize access to the serverless Postgres projects needed by the app. |
335
+ | [Stripe](https://docs.stripe.com/mcp) | OAuth | Ready · preflight only | `https://mcp.stripe.com` | Review payment, customer, and subscription permissions before authorizing. |
336
+ | [Cloudflare](https://developers.cloudflare.com/agents/model-context-protocol/cloudflare/servers-for-cloudflare/) | OAuth | Ready · preflight only | `https://mcp.cloudflare.com/mcp` | Choose the narrowest Cloudflare server and review scopes. |
337
+ | [GitLab](https://docs.gitlab.com/user/model_context_protocol/mcp_server/) | OAuth + provider setup | Beta · restricted | `https://gitlab.com/api/v4/mcp` | A top-level group admin, or the equivalent self-managed instance admin, must allow MCP. |
338
+ | [Figma](https://developers.figma.com/docs/figma-mcp-server/) | Manual setup | Approved clients only · restricted | `https://mcp.figma.com/mcp` | Figma only allows clients in its MCP Catalog. Use the [Figma REST API personal access token fallback](https://developers.figma.com/docs/rest-api/personal-access-tokens/) for file and node reads until Agent Native is approved. |
339
+ | [Canva](https://www.canva.dev/docs/mcp/) | Manual setup | Approved domains · restricted | `https://mcp.canva.com/mcp` | Per-user OAuth; clients must allow Canva's canva.com and canva.ai domains and follow the current redirect setup. |
340
+ | [Vercel](https://vercel.com/docs/agent-resources/vercel-mcp) | Manual setup | Approved clients only · restricted | `https://mcp.vercel.com` | Vercel must list the client as approved before a generic connection will work. |
341
+ | [GitHub](https://github.com/github/github-mcp-server) | Manual setup | Provider setup · restricted | `https://api.githubcopilot.com/mcp/` | Use a registered OAuth app; organizations may also enforce OAuth App Access Policies. |
342
+ | [Slack](https://docs.slack.dev/ai/slack-mcp-server/) | Manual setup | Approved clients only · restricted | `https://mcp.slack.com/mcp` | Requires a fixed registered Slack app; dynamic client registration is not supported. |
343
+ | [Asana](https://developers.asana.com/docs/integrating-with-asanas-mcp-server) | Manual setup | Provider setup · restricted | `https://mcp.asana.com/v2/mcp` | Pre-register an Asana MCP OAuth app before connecting. |
344
+ | [HubSpot](https://developers.hubspot.com/docs/apps/developer-platform/build-apps/integrate-with-the-remote-hubspot-mcp-server) | Manual setup | Provider setup · restricted | `https://mcp.hubspot.com` | Create a HubSpot MCP Auth App with PKCE; the existing HubSpot OAuth connector remains available to app actions. |
345
+ | [Intercom](https://developers.intercom.com/docs/guides/mcp) | OAuth | Ready · preflight only | `https://mcp.intercom.com/mcp` | Available for US-hosted workspaces; confirm region and scopes during authorization. |
346
+ | [monday.com](https://developer.monday.com/api-reference/docs/build-on-monday-with-ai) | OAuth | Ready · preflight only | `https://mcp.monday.com/mcp` | Choose the workspace and permissions to share during authorization. |
347
+ | [Webflow](https://developers.webflow.com/mcp/reference/getting-started) | OAuth | Ready · preflight only | `https://mcp.webflow.com/mcp` | Designer capabilities may install Webflow's Bridge App; Data API access is separate. |
348
+ | [PayPal](https://developer.paypal.com/ai-tools/mcp-server/) | OAuth | Ready · preflight only | `https://mcp.paypal.com/sse` | Review merchant permissions before authorizing the remote server. |
349
+ | [Box](https://developer.box.com/guides/box-mcp) | Manual setup | Beta · restricted | `https://mcp.box.com` | An administrator must enable Box MCP; custom clients also need credentials, a redirect URI, and approved scopes. |
350
+ | [Netlify](https://docs.netlify.com/build/build-with-ai/agent-setup-guides/agent-setup-overview/) | OAuth | Ready · preflight only | `https://netlify-mcp.netlify.app/mcp` | Review site and team permissions before completing OAuth. |
351
+ | [Zapier MCP](https://help.zapier.com/hc/en-us/articles/36265392843917-Use-Zapier-MCP-with-your-client) | Header / token | User-created server · restricted | `https://mcp.zapier.com/api/v1/connect` | Create the MCP server in Zapier, then paste its generated bearer token into the header field. |
352
352
 
353
353
  ### Repeatable preflight verification
354
354
 
@@ -209,7 +209,8 @@ To reduce cost:
209
209
  - **Pin a cheaper model.** For Claude, set `VISUAL_RECAP_MODEL=claude-haiku-4-5` for simple or small repos — it's the cheapest Claude tier; `claude-sonnet-5` (the default) is the balanced tier.
210
210
  - **Switch to Codex with a cheaper model.** Set `VISUAL_RECAP_AGENT=codex` with `VISUAL_RECAP_MODEL=gpt-5.6-luna` (the cheapest GPT-5.6 tier) or `gpt-5.6-terra` (mid-tier), and set `VISUAL_RECAP_REASONING=low` to cut reasoning-token spend further. Reasoning depth only applies to Codex.
211
211
  - **Point at a cheaper OpenAI-compatible provider.** Set `VISUAL_RECAP_AGENT=openai-compatible` with `VISUAL_RECAP_BASE_URL`/`VISUAL_RECAP_MODEL`/`VISUAL_RECAP_API_KEY` targeting DeepSeek, Kimi, or any other OpenAI-compatible endpoint.
212
- - **Recap less often.** Edit the installed workflow's `on.pull_request.types` from `[opened, synchronize, reopened, ready_for_review, closed]` to `[opened, ready_for_review, closed]` so it recaps only when a PR opens and when it merges, instead of on every push.
212
+ - **Require an explicit PR label.** Set `VISUAL_RECAP_REQUIRED_LABELS=visual recap` to keep the workflow installed but skip recaps until a PR has that label. Use a comma-separated list, such as `visual recap,recap`, when several labels should opt in. Applying a listed label wakes the workflow immediately.
213
+ - **Recap less often.** Edit the installed workflow's `on.pull_request.types` from `[opened, synchronize, reopened, ready_for_review, labeled, closed]` to `[opened, ready_for_review, closed]` so it recaps only when a PR opens and when it merges, instead of on every push.
213
214
 
214
215
  Every run records what it actually spent: the workflow's `recap usage` step attaches token and cost usage to the published plan, so you can look at real spend per run instead of guessing.
215
216
 
@@ -256,16 +257,17 @@ real token.
256
257
 
257
258
  ### Optional (only if you change defaults)
258
259
 
259
- | Secret / variable | Default | When you need it |
260
- | ------------------------ | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
261
- | `OPENAI_API_KEY` | — | Secret. Set together with `VISUAL_RECAP_AGENT=codex` to run the recap with Codex instead. |
262
- | `VISUAL_RECAP_API_KEY` | — | Secret. Set with `VISUAL_RECAP_AGENT=openai-compatible` for DeepSeek, Kimi, or another OpenAI-compatible provider. |
263
- | `VISUAL_RECAP_AGENT` | `claude` | Variable. Selects the coding-agent backend (`claude`, `codex`, or `openai-compatible`). |
264
- | `VISUAL_RECAP_BASE_URL` | required for compatible backend | Variable. HTTP(S) base URL for the OpenAI-compatible backend; credentials are rejected. |
265
- | `VISUAL_RECAP_MODEL` | `claude-sonnet-5` for Claude; required for compatible backend | Variable. Provider model id for OpenAI-compatible backends (required there). For Claude, unset now defaults to `claude-sonnet-5` — set it to override, e.g. `claude-haiku-4-5` for the cheapest tier. For Codex, unset uses the Codex CLI's own default. |
266
- | `VISUAL_RECAP_REASONING` | each model's default | Variable. Reasoning depth: `none`, `minimal`, `low`, `medium`, `high`, or `xhigh`. Applies to the Codex backend. |
267
- | `RECAP_CLI_VERSION` | `latest` | Variable. Pins the `@agent-native/recap-cli` version the workflow installs e.g. `1.5.0`. See [Version pinning](#version-pinning-copy-variant). |
268
- | `PLAN_RECAP_APP_URL` | `https://plan.agent-native.com` | Secret. Only when self-hosting the Plans app at a different origin. |
260
+ | Secret / variable | Default | When you need it |
261
+ | ------------------------------ | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
262
+ | `OPENAI_API_KEY` | — | Secret. Set together with `VISUAL_RECAP_AGENT=codex` to run the recap with Codex instead. |
263
+ | `VISUAL_RECAP_API_KEY` | — | Secret. Set with `VISUAL_RECAP_AGENT=openai-compatible` for DeepSeek, Kimi, or another OpenAI-compatible provider. |
264
+ | `VISUAL_RECAP_AGENT` | `claude` | Variable. Selects the coding-agent backend (`claude`, `codex`, or `openai-compatible`). |
265
+ | `VISUAL_RECAP_BASE_URL` | required for compatible backend | Variable. HTTP(S) base URL for the OpenAI-compatible backend; credentials are rejected. |
266
+ | `VISUAL_RECAP_MODEL` | `claude-sonnet-5` for Claude; required for compatible backend | Variable. Provider model id for OpenAI-compatible backends (required there). For Claude, unset now defaults to `claude-sonnet-5` — set it to override, e.g. `claude-haiku-4-5` for the cheapest tier. For Codex, unset uses the Codex CLI's own default. |
267
+ | `VISUAL_RECAP_REASONING` | each model's default | Variable. Reasoning depth: `none`, `minimal`, `low`, `medium`, `high`, or `xhigh`. Applies to the Codex backend. |
268
+ | `VISUAL_RECAP_REQUIRED_LABELS` | | Variable. Comma-separated PR labels. When set, the gate skips until the PR has at least one listed label, for example `visual recap`. |
269
+ | `RECAP_CLI_VERSION` | `latest` | Variable. Pins the `@agent-native/recap-cli` version the workflow installs e.g. `1.5.0`. See [Version pinning](#version-pinning-copy-variant). |
270
+ | `PLAN_RECAP_APP_URL` | `https://plan.agent-native.com` | Secret. Only when self-hosting the Plans app at a different origin. |
269
271
 
270
272
  The workflow auto-detects how to invoke its helper CLI (local source inside this monorepo, the published `@agent-native/recap-cli` elsewhere), so there is no `RECAP_CLI` variable to set.
271
273
 
@@ -510,10 +512,11 @@ name: PR Visual Recap
510
512
 
511
513
  on:
512
514
  pull_request:
513
- types: [opened, synchronize, reopened, ready_for_review, closed]
515
+ types: [opened, synchronize, reopened, ready_for_review, labeled, closed]
514
516
 
515
517
  jobs:
516
518
  visual-recap:
519
+ if: github.event.action != 'labeled' || vars.VISUAL_RECAP_REQUIRED_LABELS != ''
517
520
  permissions:
518
521
  actions: write
519
522
  contents: read
@@ -535,10 +538,11 @@ jobs:
535
538
  skill-source: ${{ vars.VISUAL_RECAP_SKILL_SOURCE || 'auto' }}
536
539
  runs-on: ${{ vars.VISUAL_RECAP_RUNS_ON || '"ubuntu-latest"' }}
537
540
  gate-runs-on: ${{ vars.VISUAL_RECAP_GATE_RUNS_ON || 'ubuntu-latest' }}
541
+ required-labels: ${{ vars.VISUAL_RECAP_REQUIRED_LABELS || '' }}
538
542
  # cli-version: "latest" # pin to a specific @agent-native/recap-cli version
539
543
  ```
540
544
 
541
- The same secrets and variables described in [Secrets and variables](#secrets-and-variables) apply — set them in your repo settings the same way as for the copy variant. The reusable caller forwards `VISUAL_RECAP_RUNS_ON` through its JSON `runs-on` input for the full recap job and `VISUAL_RECAP_GATE_RUNS_ON` through its plain-label `gate-runs-on` input for the metadata-only gate. The latter is used only for trusted same-repository authors; other PRs use GitHub-hosted `ubuntu-latest`. Omitting either input preserves its `ubuntu-latest` default.
545
+ The same secrets and variables described in [Secrets and variables](#secrets-and-variables) apply — set them in your repo settings the same way as for the copy variant. The reusable caller forwards `VISUAL_RECAP_RUNS_ON` through its JSON `runs-on` input for the full recap job, `VISUAL_RECAP_GATE_RUNS_ON` through its plain-label `gate-runs-on` input for the metadata-only gate, and `VISUAL_RECAP_REQUIRED_LABELS` through `required-labels` for optional PR-label gating. The gate runner input is used only for trusted same-repository authors; other PRs use GitHub-hosted `ubuntu-latest`. Omitting the runner inputs preserves their `ubuntu-latest` defaults; omitting required labels preserves automatic recap behavior.
542
546
 
543
547
  ### Installing via the CLI
544
548
 
@@ -91,7 +91,7 @@ Keep branches short-lived. Long-lived branches diverge from main and create pain
91
91
 
92
92
  ### Non-Developer Branching
93
93
 
94
- Not everyone who needs to make changes is comfortable with git. [Builder.io](https://www.builder.io) supports a visual branching model that maps to git branches under the hood — useful for content and copy changes, layout adjustments, design iterations, and A/B testing without a dev environment.
94
+ Not everyone who needs to make changes is comfortable with git. [Builder.io](https://www.builder.io?utm_source=agent-native&utm_medium=docs&utm_campaign=framework&utm_content=workspace_management) supports a visual branching model that maps to git branches under the hood — useful for content and copy changes, layout adjustments, design iterations, and A/B testing without a dev environment.
95
95
 
96
96
  ## Code Ownership
97
97
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/core",
3
- "version": "0.114.13",
3
+ "version": "0.114.16",
4
4
  "description": "Framework for agent-native application development — where AI agents and UI share SQL state, actions, and context",
5
5
  "homepage": "https://github.com/BuilderIO/agent-native#readme",
6
6
  "bugs": {
@@ -150,6 +150,7 @@
150
150
  "./embedding/react": "./dist/embedding/react.js",
151
151
  "./onboarding": "./dist/onboarding/index.js",
152
152
  "./shared": "./dist/shared/index.js",
153
+ "./shared/builder-link-tracking": "./dist/shared/builder-link-tracking.js",
153
154
  "./voice": "./dist/voice/index.js",
154
155
  "./scripts": "./dist/scripts/index.js",
155
156
  "./guards": {
@@ -20,6 +20,7 @@ import {
20
20
  getBuilderGatewayBaseUrl,
21
21
  recordBuilderCredentialAuthFailure,
22
22
  } from "../../server/credential-provider.js";
23
+ import { applyBuilderUtmTrackingParams } from "../../shared/builder-link-tracking.js";
23
24
  import {
24
25
  normalizeReasoningEffortForModel,
25
26
  type ReasoningEffort,
@@ -112,6 +113,9 @@ async function buildUpgradeUrl(): Promise<string> {
112
113
  url.searchParams.set("agentNativeConnectSource", "gateway_quota_upgrade");
113
114
  url.searchParams.set("agentNativeFlow", "connect_llm");
114
115
  url.searchParams.set("framework", "agent-native");
116
+ applyBuilderUtmTrackingParams(url.searchParams, {
117
+ content: "gateway_quota_upgrade",
118
+ });
115
119
  return url.toString();
116
120
  }
117
121
 
@@ -81,6 +81,7 @@ const MultiTabAssistantChatLazy = lazy(() =>
81
81
  import { useQuery, useQueryClient } from "@tanstack/react-query";
82
82
  import { Link, useLocation, useNavigate } from "react-router";
83
83
 
84
+ import { withBuilderUtmTrackingParams } from "../shared/builder-link-tracking.js";
84
85
  import type { AgentChatSurfaceKind } from "./agent-chat-adapter.js";
85
86
  import {
86
87
  consumeAgentSidebarUrlOpenOverride,
@@ -670,14 +671,19 @@ function CodeAccessUnavailablePanel({
670
671
  compact?: boolean;
671
672
  }) {
672
673
  const { connectUrl: builderConnectUrl } = useBuilderConnectUrl();
673
- const builderHref =
674
- secondaryCtaHref ??
675
- (builderConnectUrl
674
+ const builderHref = secondaryCtaHref
675
+ ? withBuilderUtmTrackingParams(secondaryCtaHref, {
676
+ campaign: "product",
677
+ content: "code_access_unavailable_panel",
678
+ })
679
+ : builderConnectUrl
676
680
  ? withBuilderConnectTrackingParams(builderConnectUrl, {
677
681
  source: "code_access_unavailable_panel",
678
682
  flow: "background_agent",
679
683
  })
680
- : "https://builder.io");
684
+ : withBuilderUtmTrackingParams("https://builder.io", {
685
+ content: "code_access_unavailable_panel",
686
+ });
681
687
 
682
688
  return (
683
689
  <div
@@ -1,6 +1,7 @@
1
1
  import { IconExternalLink, IconLoader2 } from "@tabler/icons-react";
2
2
  import React, { useCallback, useEffect, useRef, useState } from "react";
3
3
 
4
+ import { withBuilderUtmTrackingParams } from "../shared/builder-link-tracking.js";
4
5
  import { agentNativePath } from "./api-path.js";
5
6
  import { BuilderBMark } from "./builder-mark.js";
6
7
  import { getCallbackOrigin } from "./frame.js";
@@ -307,7 +308,10 @@ export function ConnectBuilderCard({
307
308
  <div className="mt-3">
308
309
  {runResult ? (
309
310
  <a
310
- href={runResult.url}
311
+ href={withBuilderUtmTrackingParams(runResult.url, {
312
+ campaign: "product",
313
+ content: "connect_builder_card_branch",
314
+ })}
311
315
  target="_blank"
312
316
  rel="noopener noreferrer"
313
317
  className={cn(
@@ -28,10 +28,7 @@ import {
28
28
  smoothStreamingRevealCount,
29
29
  splitStreamingTextGraphemes,
30
30
  } from "../../shared/streaming-text-smoothing.js";
31
- import {
32
- NEW_CHAT_ACTION_HREF,
33
- BUILDER_SPACE_SETTINGS_URL,
34
- } from "../error-format.js";
31
+ import { NEW_CHAT_ACTION_HREF } from "../error-format.js";
35
32
  import { HighlightedCodeBlock as SharedHighlightedCodeBlock } from "../HighlightedCodeBlock.js";
36
33
  import { IframeEmbed, parseEmbedBody } from "../IframeEmbed.js";
37
34
  import { cn } from "../utils.js";
@@ -187,7 +184,8 @@ function isBuilderErrorCtaHref(href: string | undefined): boolean {
187
184
  return false;
188
185
  }
189
186
  return (
190
- url.href === BUILDER_SPACE_SETTINGS_URL ||
187
+ (url.origin === "https://builder.io" &&
188
+ url.pathname === "/account/space") ||
191
189
  url.pathname === "/account/billing" ||
192
190
  url.pathname === "/account/subscription" ||
193
191
  /^\/app\/organizations\/[^/]+\/billing$/.test(url.pathname)
@@ -11,7 +11,8 @@
11
11
  * regex stays narrow; the gateway may emit URLs containing `(`
12
12
  * (e.g. `?ref=Acme%20(staging)`) and we don't want to reject them.
13
13
  */
14
- export const BUILDER_SPACE_SETTINGS_URL = "https://builder.io/account/space";
14
+ export const BUILDER_SPACE_SETTINGS_URL =
15
+ "https://builder.io/account/space?utm_source=agent-native&utm_medium=product&utm_campaign=onboarding&utm_content=space_settings";
15
16
 
16
17
  // Pseudo-href used to mark an in-app "Start new chat" CTA inside the markdown
17
18
  // error message. The chat renderer intercepts this href and renders a button
@@ -49,6 +49,7 @@ export {
49
49
  type FeatureFlagRules,
50
50
  type SetFeatureFlagInput,
51
51
  } from "./feature-flags/index.js";
52
+ export { withBuilderUtmTrackingParams } from "../shared/builder-link-tracking.js";
52
53
  export {
53
54
  SettingsPanel,
54
55
  SettingsTabsPage,