@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.
Files changed (80) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/core/CHANGELOG.md +8 -0
  3. package/corpus/core/package.json +1 -1
  4. package/corpus/core/src/deploy/build.ts +8 -0
  5. package/corpus/core/src/server/builder-browser.ts +76 -0
  6. package/corpus/core/src/server/core-routes-plugin.ts +15 -5
  7. package/corpus/templates/assets/app/global.css +0 -4
  8. package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +195 -167
  9. package/corpus/templates/assets/changelog/2026-07-23-drafts-preview-panel-now-fills-the-full-width-with-a-large-p.md +6 -0
  10. package/corpus/templates/content/actions/_builder-cms-source-adapter.ts +1 -0
  11. package/corpus/templates/content/actions/_builder-cms-write-client.ts +55 -9
  12. package/corpus/templates/content/actions/_database-source-utils.ts +756 -182
  13. package/corpus/templates/content/actions/change-content-database-source-role.ts +21 -20
  14. package/corpus/templates/content/actions/execute-builder-source-execution.ts +49 -8
  15. package/corpus/templates/content/actions/materialize-builder-required-fields.ts +42 -9
  16. package/corpus/templates/content/actions/prepare-builder-source-review.ts +88 -90
  17. package/corpus/templates/content/actions/preview-builder-source-review.ts +4 -3
  18. package/corpus/templates/content/actions/refresh-content-database-source.ts +36 -9
  19. package/corpus/templates/content/actions/set-content-database-source-write-mode.ts +28 -24
  20. package/corpus/templates/content/app/components/editor/BubbleToolbar.tsx +62 -12
  21. package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +91 -16
  22. package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +15 -1
  23. package/corpus/templates/content/app/components/editor/SlashCommandMenu.tsx +234 -44
  24. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +194 -16
  25. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +95 -42
  26. package/corpus/templates/content/app/components/editor/database-sources/BuilderSourceReviewDialog.tsx +4 -2
  27. package/corpus/templates/content/app/components/editor/extensions/CodeBlockNode.tsx +10 -166
  28. package/corpus/templates/content/app/components/editor/extensions/VideoBlock.tsx +32 -8
  29. package/corpus/templates/content/app/components/editor/extensions/VideoNode.ts +14 -0
  30. package/corpus/templates/content/app/components/editor/registrySlashItems.ts +5 -1
  31. package/corpus/templates/content/app/hooks/use-content-database.ts +59 -2
  32. package/corpus/templates/content/app/hooks/use-documents.ts +18 -26
  33. package/corpus/templates/content/app/root.tsx +1 -6
  34. package/corpus/templates/content/changelog/2026-07-24-builder-can-now-publish-approved-updates-to-entries-that-are.md +6 -0
  35. package/corpus/templates/content/changelog/2026-07-24-builder-collection-loading-no-longer-restarts-from-the-begin.md +6 -0
  36. package/corpus/templates/content/changelog/2026-07-24-builder-connections-now-complete-securely-from-netlify-deplo.md +6 -0
  37. package/corpus/templates/content/changelog/2026-07-24-builder-draft-creation-now-scopes-execution-to-the-selected-.md +6 -0
  38. package/corpus/templates/content/changelog/2026-07-24-builder-review-now-distinguishes-preparing-a-safe-dry-run-from.md +6 -0
  39. package/corpus/templates/content/changelog/2026-07-24-builder-source-imports-now-recover-from-a-transient-paginati.md +6 -0
  40. package/corpus/templates/content/changelog/2026-07-24-builder-source-refresh-now-preserves-the-provider-bound-fiel.md +6 -0
  41. package/corpus/templates/content/changelog/2026-07-24-builder-update-reviews-now-open-reliably-on-large-collection.md +6 -0
  42. package/corpus/templates/content/changelog/2026-07-24-builder-write-policy-controls-now-reflect-successful-changes.md +6 -0
  43. package/corpus/templates/content/changelog/2026-07-24-date-properties-now-save-reliably-when-selected-with-the-nat.md +6 -0
  44. package/corpus/templates/content/changelog/2026-07-24-editor-slash-search-now-keeps-multi-word-block-names-open.md +6 -0
  45. package/corpus/templates/content/changelog/2026-07-24-exact-editor-slash-commands-now-execute-on-enter-even-if-the.md +6 -0
  46. package/corpus/templates/content/changelog/2026-07-24-new-collaborative-pages-now-save-their-first-edits.md +6 -0
  47. package/corpus/templates/content/changelog/2026-07-24-new-local-builder-rows-no-longer-remain-locked-behind-a-none.md +6 -0
  48. package/corpus/templates/content/changelog/2026-07-24-opening-or-closing-a-collaborative-document-no-longer-lets-u.md +6 -0
  49. package/corpus/templates/content/changelog/2026-07-24-selected-text-now-opens-the-link-editor-with-command-k-or-co.md +6 -0
  50. package/corpus/templates/content/changelog/2026-07-24-slash-menu-block-choices-no-longer-stall-pointer-interaction.md +6 -0
  51. package/corpus/templates/content/changelog/2026-07-24-uploaded-and-embedded-media-now-stay-intact-while-collaborative-document-drafts-save.md +6 -0
  52. package/corpus/templates/content/changelog/2026-07-24-video-link-insertion-now-keeps-its-source-panel-open-while-t.md +6 -0
  53. package/corpus/templates/content/changelog/2026-07-26-builder-publishing-now-shows-safe-validation-details-instead.md +6 -0
  54. package/corpus/templates/content/changelog/2026-07-26-builder-reviews-stay-responsive-on-large-collections-and-pre.md +6 -0
  55. package/corpus/templates/content/changelog/2026-07-26-collaborative-documents-no-longer-flash-duplicated-recent-bl.md +6 -0
  56. package/corpus/templates/content/changelog/2026-07-26-corrected-builder-updates-are-now-reviewed-separately-from-f.md +6 -0
  57. package/corpus/templates/content/changelog/2026-07-26-documents-now-remain-read-only-until-their-live-collaborativ.md +6 -0
  58. package/corpus/templates/content/changelog/2026-07-26-slash-command-menus-now-stay-reachable-when-editing-near-the.md +6 -0
  59. package/corpus/templates/content/changelog/2026-07-26-the-slash-menu-now-shows-one-clear-callout-choice-instead-of.md +6 -0
  60. package/corpus/templates/content/shared/api.ts +1 -0
  61. package/corpus/templates/content/shared/builder-mdx.ts +73 -16
  62. package/corpus/toolkit/CHANGELOG.md +6 -0
  63. package/corpus/toolkit/package.json +1 -1
  64. package/corpus/toolkit/src/editor/useCollabReconcile.ts +14 -1
  65. package/dist/collab/routes.d.ts +1 -1
  66. package/dist/deploy/build.js +6 -0
  67. package/dist/deploy/build.js.map +1 -1
  68. package/dist/resources/handlers.d.ts +1 -1
  69. package/dist/server/builder-browser.d.ts +13 -0
  70. package/dist/server/builder-browser.d.ts.map +1 -1
  71. package/dist/server/builder-browser.js +59 -0
  72. package/dist/server/builder-browser.js.map +1 -1
  73. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  74. package/dist/server/core-routes-plugin.js +10 -5
  75. package/dist/server/core-routes-plugin.js.map +1 -1
  76. package/dist/server/realtime-token.d.ts +1 -1
  77. package/package.json +2 -2
  78. package/src/deploy/build.ts +8 -0
  79. package/src/server/builder-browser.ts +76 -0
  80. 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.1",
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.7"
392
+ "@agent-native/toolkit": "^0.10.8"
393
393
  },
394
394
  "devDependencies": {
395
395
  "@ai-sdk/anthropic": "^3.0.71",
@@ -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: previewOrigin,
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: relayPayload.targetOrigin },
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: relayPayload.targetOrigin,
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
- `${relayPayload.targetOrigin}${relayPayload.basePath || "/"}`,
2679
- { parentOrigin: relayPayload.targetOrigin },
2688
+ `${relayParentOrigin}${relayPayload.basePath || "/"}`,
2689
+ { parentOrigin: relayParentOrigin },
2680
2690
  );
2681
2691
  }
2682
2692