@agent-native/core 0.123.1 → 0.123.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +1 -1
- package/corpus/core/CHANGELOG.md +8 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/deploy/build.ts +8 -0
- package/corpus/core/src/server/builder-browser.ts +76 -0
- package/corpus/core/src/server/core-routes-plugin.ts +15 -5
- package/corpus/templates/assets/app/global.css +0 -4
- package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +195 -167
- package/corpus/templates/assets/changelog/2026-07-23-drafts-preview-panel-now-fills-the-full-width-with-a-large-p.md +6 -0
- package/corpus/templates/content/actions/_builder-cms-source-adapter.ts +1 -0
- package/corpus/templates/content/actions/_builder-cms-write-client.ts +55 -9
- package/corpus/templates/content/actions/_database-source-utils.ts +756 -182
- package/corpus/templates/content/actions/change-content-database-source-role.ts +21 -20
- package/corpus/templates/content/actions/execute-builder-source-execution.ts +49 -8
- package/corpus/templates/content/actions/materialize-builder-required-fields.ts +42 -9
- package/corpus/templates/content/actions/prepare-builder-source-review.ts +88 -90
- package/corpus/templates/content/actions/preview-builder-source-review.ts +4 -3
- package/corpus/templates/content/actions/refresh-content-database-source.ts +36 -9
- package/corpus/templates/content/actions/set-content-database-source-write-mode.ts +28 -24
- package/corpus/templates/content/app/components/editor/BubbleToolbar.tsx +62 -12
- package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +91 -16
- package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +15 -1
- package/corpus/templates/content/app/components/editor/SlashCommandMenu.tsx +234 -44
- package/corpus/templates/content/app/components/editor/VisualEditor.tsx +194 -16
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +95 -42
- package/corpus/templates/content/app/components/editor/database-sources/BuilderSourceReviewDialog.tsx +4 -2
- package/corpus/templates/content/app/components/editor/extensions/CodeBlockNode.tsx +10 -166
- package/corpus/templates/content/app/components/editor/extensions/VideoBlock.tsx +32 -8
- package/corpus/templates/content/app/components/editor/extensions/VideoNode.ts +14 -0
- package/corpus/templates/content/app/components/editor/registrySlashItems.ts +5 -1
- package/corpus/templates/content/app/hooks/use-content-database.ts +59 -2
- package/corpus/templates/content/app/hooks/use-documents.ts +18 -26
- package/corpus/templates/content/app/root.tsx +1 -6
- package/corpus/templates/content/changelog/2026-07-24-builder-can-now-publish-approved-updates-to-entries-that-are.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-builder-collection-loading-no-longer-restarts-from-the-begin.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-builder-connections-now-complete-securely-from-netlify-deplo.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-builder-draft-creation-now-scopes-execution-to-the-selected-.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-builder-review-now-distinguishes-preparing-a-safe-dry-run-from.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-builder-source-imports-now-recover-from-a-transient-paginati.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-builder-source-refresh-now-preserves-the-provider-bound-fiel.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-builder-update-reviews-now-open-reliably-on-large-collection.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-builder-write-policy-controls-now-reflect-successful-changes.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-date-properties-now-save-reliably-when-selected-with-the-nat.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-editor-slash-search-now-keeps-multi-word-block-names-open.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-exact-editor-slash-commands-now-execute-on-enter-even-if-the.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-new-collaborative-pages-now-save-their-first-edits.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-new-local-builder-rows-no-longer-remain-locked-behind-a-none.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-opening-or-closing-a-collaborative-document-no-longer-lets-u.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-selected-text-now-opens-the-link-editor-with-command-k-or-co.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-slash-menu-block-choices-no-longer-stall-pointer-interaction.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-uploaded-and-embedded-media-now-stay-intact-while-collaborative-document-drafts-save.md +6 -0
- package/corpus/templates/content/changelog/2026-07-24-video-link-insertion-now-keeps-its-source-panel-open-while-t.md +6 -0
- package/corpus/templates/content/changelog/2026-07-26-builder-publishing-now-shows-safe-validation-details-instead.md +6 -0
- package/corpus/templates/content/changelog/2026-07-26-builder-reviews-stay-responsive-on-large-collections-and-pre.md +6 -0
- package/corpus/templates/content/changelog/2026-07-26-collaborative-documents-no-longer-flash-duplicated-recent-bl.md +6 -0
- package/corpus/templates/content/changelog/2026-07-26-corrected-builder-updates-are-now-reviewed-separately-from-f.md +6 -0
- package/corpus/templates/content/changelog/2026-07-26-documents-now-remain-read-only-until-their-live-collaborativ.md +6 -0
- package/corpus/templates/content/changelog/2026-07-26-slash-command-menus-now-stay-reachable-when-editing-near-the.md +6 -0
- package/corpus/templates/content/changelog/2026-07-26-the-slash-menu-now-shows-one-clear-callout-choice-instead-of.md +6 -0
- package/corpus/templates/content/shared/api.ts +1 -0
- package/corpus/templates/content/shared/builder-mdx.ts +73 -16
- package/corpus/toolkit/CHANGELOG.md +6 -0
- package/corpus/toolkit/package.json +1 -1
- package/corpus/toolkit/src/editor/useCollabReconcile.ts +14 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/deploy/build.js +6 -0
- package/dist/deploy/build.js.map +1 -1
- package/dist/resources/handlers.d.ts +1 -1
- package/dist/server/builder-browser.d.ts +13 -0
- package/dist/server/builder-browser.d.ts.map +1 -1
- package/dist/server/builder-browser.js +59 -0
- package/dist/server/builder-browser.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +10 -5
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/realtime-token.d.ts +1 -1
- package/package.json +2 -2
- package/src/deploy/build.ts +8 -0
- package/src/server/builder-browser.ts +76 -0
- package/src/server/core-routes-plugin.ts +15 -5
|
@@ -26,9 +26,9 @@ export declare function createRealtimeTokenHandler(): import("h3").EventHandlerW
|
|
|
26
26
|
expiresAt?: undefined;
|
|
27
27
|
ttlSeconds?: undefined;
|
|
28
28
|
} | {
|
|
29
|
-
error?: undefined;
|
|
30
29
|
token: string;
|
|
31
30
|
expiresAt: string;
|
|
32
31
|
ttlSeconds: number;
|
|
32
|
+
error?: undefined;
|
|
33
33
|
}>>;
|
|
34
34
|
//# sourceMappingURL=realtime-token.d.ts.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-native/core",
|
|
3
|
-
"version": "0.123.
|
|
3
|
+
"version": "0.123.2",
|
|
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": {
|
|
@@ -389,7 +389,7 @@
|
|
|
389
389
|
"yjs": "^13.6.31",
|
|
390
390
|
"zod": "^4.3.6",
|
|
391
391
|
"@agent-native/recap-cli": "0.5.1",
|
|
392
|
-
"@agent-native/toolkit": "^0.10.
|
|
392
|
+
"@agent-native/toolkit": "^0.10.8"
|
|
393
393
|
},
|
|
394
394
|
"devDependencies": {
|
|
395
395
|
"@ai-sdk/anthropic": "^3.0.71",
|
package/src/deploy/build.ts
CHANGED
|
@@ -3778,6 +3778,14 @@ export default bundle;
|
|
|
3778
3778
|
"virtual:agents-bundle": agentsBundleModuleSource,
|
|
3779
3779
|
},
|
|
3780
3780
|
replace: {
|
|
3781
|
+
// Netlify exposes DEPLOY_ID only while building. Embed it into the Nitro
|
|
3782
|
+
// function so preview OAuth relays can target this immutable deployment
|
|
3783
|
+
// even though the value is unavailable in the function runtime.
|
|
3784
|
+
"process.env.AGENT_NATIVE_BUILD_ID": JSON.stringify(
|
|
3785
|
+
process.env.DEPLOY_ID?.trim() ||
|
|
3786
|
+
process.env.AGENT_NATIVE_BUILD_ID?.trim() ||
|
|
3787
|
+
"",
|
|
3788
|
+
),
|
|
3781
3789
|
"process.env.AGENT_NATIVE_BUILD_GA_MEASUREMENT_ID": JSON.stringify(
|
|
3782
3790
|
process.env.GA_MEASUREMENT_ID?.trim() || "",
|
|
3783
3791
|
),
|
|
@@ -36,6 +36,10 @@ const BUILDER_RELAY_PURPOSE = "builder-preview-callback-relay";
|
|
|
36
36
|
const BUILDER_RELAY_STATE_VERSION = 1;
|
|
37
37
|
const BUILDER_RELAY_TTL_MS = 10 * 60 * 1000;
|
|
38
38
|
const BUILDER_RELAY_REQUEST_SKEW_MS = 2 * 60 * 1000;
|
|
39
|
+
const IMMUTABLE_NETLIFY_RELAY_HOST =
|
|
40
|
+
/^(?<deploy>[a-f0-9]{24})--(?<site>[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)\.netlify\.app$/;
|
|
41
|
+
const NETLIFY_DEPLOY_PREVIEW_HOST =
|
|
42
|
+
/^deploy-preview-\d+--(?<site>[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)\.netlify\.app$/;
|
|
39
43
|
|
|
40
44
|
export interface BuilderPreviewRelayState {
|
|
41
45
|
v: 1;
|
|
@@ -165,6 +169,45 @@ export function isTrustedBuilderRelayTargetOrigin(value: string): boolean {
|
|
|
165
169
|
)
|
|
166
170
|
);
|
|
167
171
|
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Netlify's deploy-preview alias is convenient for people but mutable, so it
|
|
175
|
+
* must never be the signed relay destination. The deploy builder embeds
|
|
176
|
+
* Netlify's DEPLOY_ID into the Nitro server bundle, while SITE_NAME remains
|
|
177
|
+
* available to Functions at runtime. Use that pair only when it
|
|
178
|
+
* identifies the same site as the visible preview alias; otherwise preserve
|
|
179
|
+
* the visible origin so callback validation fails closed.
|
|
180
|
+
*/
|
|
181
|
+
export function resolveBuilderPreviewRelayTargetOrigin(
|
|
182
|
+
previewOrigin: string,
|
|
183
|
+
): string {
|
|
184
|
+
let previewUrl: URL;
|
|
185
|
+
try {
|
|
186
|
+
previewUrl = new URL(previewOrigin);
|
|
187
|
+
} catch {
|
|
188
|
+
return previewOrigin;
|
|
189
|
+
}
|
|
190
|
+
const previewMatch = NETLIFY_DEPLOY_PREVIEW_HOST.exec(
|
|
191
|
+
previewUrl.hostname.toLowerCase(),
|
|
192
|
+
);
|
|
193
|
+
if (!previewMatch?.groups?.site) return previewOrigin;
|
|
194
|
+
|
|
195
|
+
const buildId = process.env.AGENT_NATIVE_BUILD_ID?.trim().toLowerCase();
|
|
196
|
+
const siteName = process.env.SITE_NAME?.trim().toLowerCase();
|
|
197
|
+
if (
|
|
198
|
+
!buildId ||
|
|
199
|
+
!siteName ||
|
|
200
|
+
!/^[a-f0-9]{24}$/.test(buildId) ||
|
|
201
|
+
siteName !== previewMatch.groups.site
|
|
202
|
+
) {
|
|
203
|
+
return previewOrigin;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
const immutableOrigin = `https://${buildId}--${siteName}.netlify.app`;
|
|
207
|
+
return IMMUTABLE_NETLIFY_RELAY_HOST.test(new URL(immutableOrigin).hostname)
|
|
208
|
+
? immutableOrigin
|
|
209
|
+
: previewOrigin;
|
|
210
|
+
}
|
|
168
211
|
export function signBuilderPreviewRelayState(input: {
|
|
169
212
|
ownerEmail: string;
|
|
170
213
|
targetOrigin: string;
|
|
@@ -1228,6 +1271,39 @@ export function resolveSafePreviewUrl(
|
|
|
1228
1271
|
return getBuilderBrowserOriginForEvent(event);
|
|
1229
1272
|
}
|
|
1230
1273
|
|
|
1274
|
+
export function resolveBuilderPreviewRelayParentOrigin(options: {
|
|
1275
|
+
openerOrigin?: string | null;
|
|
1276
|
+
targetOrigin: string;
|
|
1277
|
+
}): string {
|
|
1278
|
+
if (!options.openerOrigin) return options.targetOrigin;
|
|
1279
|
+
let openerUrl: URL;
|
|
1280
|
+
let targetUrl: URL;
|
|
1281
|
+
try {
|
|
1282
|
+
openerUrl = new URL(options.openerOrigin);
|
|
1283
|
+
targetUrl = new URL(options.targetOrigin);
|
|
1284
|
+
} catch {
|
|
1285
|
+
return options.targetOrigin;
|
|
1286
|
+
}
|
|
1287
|
+
if (
|
|
1288
|
+
openerUrl.origin !== options.openerOrigin ||
|
|
1289
|
+
!isSafeBuilderRelayTargetOrigin(openerUrl.origin)
|
|
1290
|
+
) {
|
|
1291
|
+
return options.targetOrigin;
|
|
1292
|
+
}
|
|
1293
|
+
if (openerUrl.origin === targetUrl.origin) return openerUrl.origin;
|
|
1294
|
+
|
|
1295
|
+
const openerMatch = NETLIFY_DEPLOY_PREVIEW_HOST.exec(
|
|
1296
|
+
openerUrl.hostname.toLowerCase(),
|
|
1297
|
+
);
|
|
1298
|
+
const targetMatch = IMMUTABLE_NETLIFY_RELAY_HOST.exec(
|
|
1299
|
+
targetUrl.hostname.toLowerCase(),
|
|
1300
|
+
);
|
|
1301
|
+
return openerMatch?.groups?.site &&
|
|
1302
|
+
openerMatch.groups.site === targetMatch?.groups?.site
|
|
1303
|
+
? openerUrl.origin
|
|
1304
|
+
: options.targetOrigin;
|
|
1305
|
+
}
|
|
1306
|
+
|
|
1231
1307
|
export function resolveBuilderCallbackReturnUrl(options: {
|
|
1232
1308
|
event: H3Event;
|
|
1233
1309
|
openerOrigin?: string | null;
|
|
@@ -129,6 +129,8 @@ import {
|
|
|
129
129
|
resolveBuilderCallbackReturnUrl,
|
|
130
130
|
getBuilderBrowserStatusForEvent,
|
|
131
131
|
resolveBuilderBranchProjectId,
|
|
132
|
+
resolveBuilderPreviewRelayParentOrigin,
|
|
133
|
+
resolveBuilderPreviewRelayTargetOrigin,
|
|
132
134
|
resolveSafePreviewUrl,
|
|
133
135
|
runBuilderAgent,
|
|
134
136
|
signBuilderCallbackState,
|
|
@@ -2225,7 +2227,8 @@ export function createCoreRoutesPlugin(
|
|
|
2225
2227
|
try {
|
|
2226
2228
|
relay = signBuilderPreviewRelayState({
|
|
2227
2229
|
ownerEmail,
|
|
2228
|
-
targetOrigin:
|
|
2230
|
+
targetOrigin:
|
|
2231
|
+
resolveBuilderPreviewRelayTargetOrigin(previewOrigin),
|
|
2229
2232
|
basePath: getAppBasePath(),
|
|
2230
2233
|
});
|
|
2231
2234
|
} catch (err) {
|
|
@@ -2598,6 +2601,13 @@ export function createCoreRoutesPlugin(
|
|
|
2598
2601
|
);
|
|
2599
2602
|
}
|
|
2600
2603
|
|
|
2604
|
+
const relayOpenerOrigin =
|
|
2605
|
+
requestUrl.searchParams.get(BUILDER_OPENER_PARAM);
|
|
2606
|
+
const relayParentOrigin = resolveBuilderPreviewRelayParentOrigin({
|
|
2607
|
+
openerOrigin: relayOpenerOrigin,
|
|
2608
|
+
targetOrigin: relayPayload.targetOrigin,
|
|
2609
|
+
});
|
|
2610
|
+
|
|
2601
2611
|
const privateKey = requestUrl.searchParams.get("p-key");
|
|
2602
2612
|
const publicKey = requestUrl.searchParams.get("api-key");
|
|
2603
2613
|
if (!privateKey || !publicKey) {
|
|
@@ -2609,7 +2619,7 @@ export function createCoreRoutesPlugin(
|
|
|
2609
2619
|
);
|
|
2610
2620
|
return createBuilderBrowserCallbackErrorPage(
|
|
2611
2621
|
"Builder didn't return credentials. Restart the connect flow from settings.",
|
|
2612
|
-
{ parentOrigin:
|
|
2622
|
+
{ parentOrigin: relayParentOrigin },
|
|
2613
2623
|
);
|
|
2614
2624
|
}
|
|
2615
2625
|
|
|
@@ -2665,7 +2675,7 @@ export function createCoreRoutesPlugin(
|
|
|
2665
2675
|
"text/html; charset=utf-8",
|
|
2666
2676
|
);
|
|
2667
2677
|
return createBuilderBrowserCallbackErrorPage(message, {
|
|
2668
|
-
parentOrigin:
|
|
2678
|
+
parentOrigin: relayParentOrigin,
|
|
2669
2679
|
});
|
|
2670
2680
|
}
|
|
2671
2681
|
|
|
@@ -2675,8 +2685,8 @@ export function createCoreRoutesPlugin(
|
|
|
2675
2685
|
"text/html; charset=utf-8",
|
|
2676
2686
|
);
|
|
2677
2687
|
return createBuilderBrowserCallbackPage(
|
|
2678
|
-
`${
|
|
2679
|
-
{ parentOrigin:
|
|
2688
|
+
`${relayParentOrigin}${relayPayload.basePath || "/"}`,
|
|
2689
|
+
{ parentOrigin: relayParentOrigin },
|
|
2680
2690
|
);
|
|
2681
2691
|
}
|
|
2682
2692
|
|