@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.
- package/bin/agent-native.js +35 -14
- package/bin/launcher.js +34 -0
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +21 -0
- package/corpus/core/bin/agent-native.js +35 -14
- package/corpus/core/bin/launcher.js +34 -0
- package/corpus/core/docs/content/deployment.mdx +1 -1
- package/corpus/core/docs/content/frames.mdx +1 -1
- package/corpus/core/docs/content/integrations.mdx +27 -27
- package/corpus/core/docs/content/pr-visual-recap.mdx +17 -13
- package/corpus/core/docs/content/workspace-management.mdx +1 -1
- package/corpus/core/package.json +2 -1
- package/corpus/core/src/agent/engine/builder-engine.ts +4 -0
- package/corpus/core/src/client/AgentPanel.tsx +10 -4
- package/corpus/core/src/client/ConnectBuilderCard.tsx +5 -1
- package/corpus/core/src/client/chat/markdown-renderer.tsx +3 -5
- package/corpus/core/src/client/error-format.ts +2 -1
- package/corpus/core/src/client/index.ts +1 -0
- package/corpus/core/src/client/integrations/IntegrationsPanel.tsx +2 -18
- package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +43 -32
- package/corpus/core/src/client/resources/mcp-integration-catalog.ts +4 -2
- package/corpus/core/src/client/settings/BackgroundAgentSection.tsx +5 -1
- package/corpus/core/src/client/settings/SettingsPanel.tsx +4 -4
- package/corpus/core/src/client/settings/useBuilderStatus.ts +3 -0
- package/corpus/core/src/localization/default-messages.ts +1 -7
- package/corpus/core/src/server/builder-browser.ts +4 -0
- package/corpus/core/src/server/builder-design-systems.ts +6 -1
- package/corpus/core/src/server/fusion-app.ts +5 -1
- package/corpus/core/src/shared/builder-link-tracking.ts +41 -0
- package/corpus/core/src/shared/index.ts +1 -0
- package/corpus/templates/analytics/AGENTS.md +10 -1
- package/corpus/templates/analytics/actions/save-dashboard-report-subscription.ts +10 -2
- package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +5 -4
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +20 -32
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/report-panel-window.ts +62 -0
- package/corpus/templates/analytics/changelog/2026-07-21-chart-series-controls-stay-open-while-moving-from-the-legend.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-21-dashboard-email-captures-complete-large-dashboards-in-chunks.md +6 -0
- package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +4 -4
- package/corpus/templates/analytics/server/jobs/dashboard-report.ts +1 -8
- package/corpus/templates/analytics/server/lib/dashboard-report-subscriptions.ts +39 -7
- package/corpus/templates/analytics/server/lib/dashboard-report.ts +341 -251
- package/corpus/templates/analytics/server/lib/first-party-dashboard-repair.ts +114 -0
- package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +84 -6
- package/corpus/templates/analytics/server/plugins/db.ts +13 -0
- package/corpus/templates/clips/app/components/library/bulk-action-toolbar.tsx +25 -8
- package/corpus/templates/clips/app/components/library/library-grid.tsx +118 -9
- package/corpus/templates/clips/app/components/library/library-layout.tsx +1 -1
- package/corpus/templates/clips/app/components/library/recording-card.tsx +10 -8
- package/corpus/templates/clips/app/components/player/video-player.tsx +10 -4
- package/corpus/templates/clips/app/i18n/en-US.ts +6 -0
- package/corpus/templates/clips/app/routes/_app.trash.tsx +16 -1
- package/corpus/templates/clips/changelog/2026-07-21-choose-which-whisper-model-to-use-in-settings.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-21-fixed-organization-recording-visibility-default.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-21-meeting-notes-stop-when-calls-end.md +6 -0
- package/corpus/templates/clips/desktop/src/app.tsx +90 -78
- package/corpus/templates/clips/desktop/src/hooks/useMeetingTranscription.ts +2 -0
- package/corpus/templates/clips/desktop/src/hooks/useWhisperSettings.ts +172 -0
- package/corpus/templates/clips/desktop/src/lib/meeting-call-app.ts +41 -0
- package/corpus/templates/clips/desktop/src/lib/silence-events.ts +1 -0
- package/corpus/templates/clips/desktop/src/shared/config.ts +1 -0
- package/corpus/templates/clips/desktop/src/styles.css +80 -7
- package/corpus/templates/clips/desktop/src-tauri/src/config.rs +32 -0
- package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +3 -0
- package/corpus/templates/clips/desktop/src-tauri/src/silence_detector.rs +268 -20
- package/corpus/templates/clips/desktop/src-tauri/src/whisper_model.rs +285 -164
- package/corpus/templates/clips/desktop/src-tauri/src/whisper_speech.rs +18 -7
- package/corpus/templates/clips/learnings.defaults.md +1 -1
- package/corpus/templates/clips/server/plugins/db.ts +11 -0
- package/corpus/templates/clips/shared/builder-credits.ts +1 -1
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +20 -38
- package/corpus/templates/content/app/components/editor/previewDocumentSaveController.ts +40 -1
- package/corpus/templates/design/app/components/design/FusionAppBanner.tsx +9 -1
- package/corpus/templates/design/app/components/design/edit-panel/component-section.tsx +5 -1
- package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +9 -1
- package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +9 -1
- package/dist/agent/engine/builder-engine.d.ts.map +1 -1
- package/dist/agent/engine/builder-engine.js +4 -0
- package/dist/agent/engine/builder-engine.js.map +1 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +10 -3
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/ConnectBuilderCard.d.ts.map +1 -1
- package/dist/client/ConnectBuilderCard.js +5 -1
- package/dist/client/ConnectBuilderCard.js.map +1 -1
- package/dist/client/chat/markdown-renderer.d.ts.map +1 -1
- package/dist/client/chat/markdown-renderer.js +3 -2
- package/dist/client/chat/markdown-renderer.js.map +1 -1
- package/dist/client/error-format.d.ts +1 -1
- package/dist/client/error-format.d.ts.map +1 -1
- package/dist/client/error-format.js +1 -1
- package/dist/client/error-format.js.map +1 -1
- package/dist/client/index.d.ts +1 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +1 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/integrations/IntegrationsPanel.d.ts.map +1 -1
- package/dist/client/integrations/IntegrationsPanel.js +3 -4
- package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
- package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
- package/dist/client/resources/McpIntegrationDialog.js +21 -7
- package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
- package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
- package/dist/client/resources/mcp-integration-catalog.js +2 -2
- package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
- package/dist/client/settings/BackgroundAgentSection.d.ts.map +1 -1
- package/dist/client/settings/BackgroundAgentSection.js +5 -1
- package/dist/client/settings/BackgroundAgentSection.js.map +1 -1
- package/dist/client/settings/SettingsPanel.js +1 -1
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
- package/dist/client/settings/useBuilderStatus.js +2 -0
- package/dist/client/settings/useBuilderStatus.js.map +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/file-upload/actions/upload-image.d.ts +1 -1
- package/dist/localization/default-messages.d.ts +0 -6
- package/dist/localization/default-messages.d.ts.map +1 -1
- package/dist/localization/default-messages.js +1 -7
- package/dist/localization/default-messages.js.map +1 -1
- package/dist/observability/routes.d.ts +5 -5
- package/dist/resources/handlers.d.ts +1 -1
- package/dist/secrets/routes.d.ts +9 -9
- package/dist/server/builder-browser.d.ts.map +1 -1
- package/dist/server/builder-browser.js +4 -0
- package/dist/server/builder-browser.js.map +1 -1
- package/dist/server/builder-design-systems.d.ts.map +1 -1
- package/dist/server/builder-design-systems.js +6 -1
- package/dist/server/builder-design-systems.js.map +1 -1
- package/dist/server/fusion-app.d.ts.map +1 -1
- package/dist/server/fusion-app.js +2 -1
- package/dist/server/fusion-app.js.map +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/shared/builder-link-tracking.d.ts +14 -0
- package/dist/shared/builder-link-tracking.d.ts.map +1 -0
- package/dist/shared/builder-link-tracking.js +26 -0
- package/dist/shared/builder-link-tracking.js.map +1 -0
- package/dist/shared/index.d.ts +1 -0
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/index.js +1 -0
- package/dist/shared/index.js.map +1 -1
- package/docs/content/deployment.mdx +1 -1
- package/docs/content/frames.mdx +1 -1
- package/docs/content/integrations.mdx +27 -27
- package/docs/content/pr-visual-recap.mdx +17 -13
- package/docs/content/workspace-management.mdx +1 -1
- package/package.json +3 -2
- package/src/agent/engine/builder-engine.ts +4 -0
- package/src/client/AgentPanel.tsx +10 -4
- package/src/client/ConnectBuilderCard.tsx +5 -1
- package/src/client/chat/markdown-renderer.tsx +3 -5
- package/src/client/error-format.ts +2 -1
- package/src/client/index.ts +1 -0
- package/src/client/integrations/IntegrationsPanel.tsx +2 -18
- package/src/client/resources/McpIntegrationDialog.tsx +43 -32
- package/src/client/resources/mcp-integration-catalog.ts +4 -2
- package/src/client/settings/BackgroundAgentSection.tsx +5 -1
- package/src/client/settings/SettingsPanel.tsx +4 -4
- package/src/client/settings/useBuilderStatus.ts +3 -0
- package/src/localization/default-messages.ts +1 -7
- package/src/server/builder-browser.ts +4 -0
- package/src/server/builder-design-systems.ts +6 -1
- package/src/server/fusion-app.ts +5 -1
- package/src/shared/builder-link-tracking.ts +41 -0
- package/src/shared/index.ts +1 -0
package/bin/agent-native.js
CHANGED
|
@@ -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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
|
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
|
|
31
|
+
return 0;
|
|
31
32
|
}
|
|
32
33
|
}
|
|
33
34
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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,
|
package/bin/launcher.js
ADDED
|
@@ -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
package/corpus/core/CHANGELOG.md
CHANGED
|
@@ -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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
|
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
|
|
31
|
+
return 0;
|
|
31
32
|
}
|
|
32
33
|
}
|
|
33
34
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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
|
|
326
|
-
|
|
|
327
|
-
| [Context7](https://context7.com/)
|
|
328
|
-
| [Sentry](https://docs.sentry.io/product/sentry-mcp/)
|
|
329
|
-
| [Notion](https://developers.notion.com/guides/mcp/get-started-with-mcp)
|
|
330
|
-
| [Semgrep](https://github.com/semgrep/mcp#readme)
|
|
331
|
-
| [Linear](https://linear.app/docs/mcp)
|
|
332
|
-
| [Atlassian Rovo MCP](https://developer.atlassian.com/cloud/rovo-mcp/guides/getting-started/)
|
|
333
|
-
| [Supabase](https://www.builder.io/c/docs/fusion-connect-to-supabase)
|
|
334
|
-
| [Neon](https://www.builder.io/c/docs/fusion-connect-to-neon)
|
|
335
|
-
| [Stripe](https://docs.stripe.com/mcp)
|
|
336
|
-
| [Cloudflare](https://developers.cloudflare.com/agents/model-context-protocol/cloudflare/servers-for-cloudflare/)
|
|
337
|
-
| [GitLab](https://docs.gitlab.com/user/model_context_protocol/mcp_server/)
|
|
338
|
-
| [Figma](https://developers.figma.com/docs/figma-mcp-server/)
|
|
339
|
-
| [Canva](https://www.canva.dev/docs/mcp/)
|
|
340
|
-
| [Vercel](https://vercel.com/docs/agent-resources/vercel-mcp)
|
|
341
|
-
| [GitHub](https://github.com/github/github-mcp-server)
|
|
342
|
-
| [Slack](https://docs.slack.dev/ai/slack-mcp-server/)
|
|
343
|
-
| [Asana](https://developers.asana.com/docs/integrating-with-asanas-mcp-server)
|
|
344
|
-
| [HubSpot](https://developers.hubspot.com/docs/apps/developer-platform/build-apps/integrate-with-the-remote-hubspot-mcp-server)
|
|
345
|
-
| [Intercom](https://developers.intercom.com/docs/guides/mcp)
|
|
346
|
-
| [monday.com](https://developer.monday.com/api-reference/docs/build-on-monday-with-ai)
|
|
347
|
-
| [Webflow](https://developers.webflow.com/mcp/reference/getting-started)
|
|
348
|
-
| [PayPal](https://developer.paypal.com/ai-tools/mcp-server/)
|
|
349
|
-
| [Box](https://developer.box.com/guides/box-mcp)
|
|
350
|
-
| [Netlify](https://docs.netlify.com/build/build-with-ai/agent-setup-guides/agent-setup-overview/)
|
|
351
|
-
| [Zapier MCP](https://help.zapier.com/hc/en-us/articles/36265392843917-Use-Zapier-MCP-with-your-client)
|
|
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
|
-
- **
|
|
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
|
|
260
|
-
|
|
|
261
|
-
| `OPENAI_API_KEY`
|
|
262
|
-
| `VISUAL_RECAP_API_KEY`
|
|
263
|
-
| `VISUAL_RECAP_AGENT`
|
|
264
|
-
| `VISUAL_RECAP_BASE_URL`
|
|
265
|
-
| `VISUAL_RECAP_MODEL`
|
|
266
|
-
| `VISUAL_RECAP_REASONING`
|
|
267
|
-
| `
|
|
268
|
-
| `
|
|
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
|
|
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
|
|
package/corpus/core/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-native/core",
|
|
3
|
-
"version": "0.114.
|
|
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
|
-
|
|
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.
|
|
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 =
|
|
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
|