@agent-native/core 0.182.0-nightly-20260916183124 → 0.182.0

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 CHANGED
@@ -31,4 +31,4 @@ rg -n "defineAction|useActionQuery" node_modules/@agent-native/core/corpus
31
31
 
32
32
  ## Generated Counts
33
33
 
34
- - template files: 9456
34
+ - template files: 9457
@@ -3,6 +3,12 @@
3
3
  All notable user-facing changes to Agent-Native Calendar are documented here. Open it any
4
4
  time from the command menu (Cmd+K → "What's new") or from Settings.
5
5
 
6
+ ## 2026-09-16
7
+
8
+ ### Fixed
9
+
10
+ - Booking link time-zone arrows now scroll to earlier and later times.
11
+
6
12
  ## 2026-09-15
7
13
 
8
14
  ### Improved
@@ -3,6 +3,18 @@
3
3
  All notable user-facing changes to Clips are documented here. Open it any time
4
4
  from the command menu (Cmd+K → "What's new") or from Settings.
5
5
 
6
+ ## 2026-09-16
7
+
8
+ ### Improved
9
+
10
+ - Agents can continue through long recording transcripts without losing later sections.
11
+
12
+ ### Fixed
13
+
14
+ - Clips no longer marks incomplete Loom downloads as ready
15
+ - The desktop retry control stays still while it offers cancellation.
16
+ - Google sign-in now opens reliably from embedded Clips viewers
17
+
6
18
  ## 2026-09-15
7
19
 
8
20
  ### Added
@@ -17,6 +29,7 @@ from the command menu (Cmd+K → "What's new") or from Settings.
17
29
 
18
30
  ### Fixed
19
31
 
32
+ - Google sign-up now opens reliably in embedded browsers
20
33
  - Clips Desktop keeps Dictate visible when voice dictation is enabled
21
34
  - Clips no longer reports 0% completion on a clip that only agents have read - completion and CTA conversion now show as unknown until a human view is counted
22
35
  - Clips popovers now close when you switch to another application.
@@ -3,6 +3,12 @@
3
3
  All notable user-facing changes to Agent-Native Content are documented here. Open it any
4
4
  time from the command menu (Cmd+K → "What's new").
5
5
 
6
+ ## 2026-09-15
7
+
8
+ ### Fixed
9
+
10
+ - Google sign-in and Notion connections now open reliably in embedded browsers
11
+
6
12
  ## 2026-09-14
7
13
 
8
14
  ### Improved
@@ -5,8 +5,22 @@ from the command menu (Cmd+K → "What's new") or from Settings.
5
5
 
6
6
  ## 2026-09-16
7
7
 
8
+ ### Improved
9
+
10
+ - Design editor agent chat uses shared conversation tabs and stays usable at narrow widths
11
+ - Empty template libraries now link directly back to your designs.
12
+
8
13
  ### Fixed
9
14
 
15
+ - Canvas zoom controls and keyboard shortcuts now update the canvas immediately
16
+ - Design auto layout controls stay aligned to the 28-column inspector grid
17
+ - Design review pins follow screens and keep comment actions together
18
+ - Honor requested Design page counts, visual direction, and interactive prototype controls.
19
+ - Inspector alignment, gap, and padding controls keep their 8px spacing at narrow widths
20
+ - Imported layer names stay consistent across editing, selection, comments, exports, and linked components.
21
+ - URL-backed design previews keep authenticated sessions across screens
22
+ - URL-backed overview screens keep their app session and same-origin resources
23
+ - Visual edits stay applied when the page structure shifts after a replacement.
10
24
  - Authored flex direction, wrap, gaps, justify-content, and padding now survive layout edits instead of being reset.
11
25
  - A message that only mentions a design, or pastes Design's own guidance back into chat, no longer ends with a false "couldn't confirm that a Design artifact was saved" reply.
12
26
 
@@ -122,6 +122,7 @@ import {
122
122
  shouldFetchExternalSourceSnapshot,
123
123
  shouldUseIframeLoadReadyFallback,
124
124
  type BridgeRegistrationFailureKind,
125
+ useBrowserOrigin,
125
126
  } from "./design-canvas/external-preview";
126
127
  import { isOsFileDragEvent } from "./design-canvas/file-drop";
127
128
  import {
@@ -1390,6 +1391,7 @@ export function DesignCanvas({
1390
1391
  }: DesignCanvasProps) {
1391
1392
  const t = useT();
1392
1393
  const { resolvedTheme } = useTheme();
1394
+ const browserOrigin = useBrowserOrigin();
1393
1395
  const iframeRef = useRef<HTMLIFrameElement>(null);
1394
1396
  const restoreKScalePreviewRef = useRef<(() => void) | null>(null);
1395
1397
  const textEditingStateRef = useRef<Omit<TextEditingState, "screenId">>({
@@ -5830,6 +5832,9 @@ export function DesignCanvas({
5830
5832
  : handToolActive || spacePanActive
5831
5833
  ? "grab"
5832
5834
  : null;
5835
+ const externalPreviewPendingOrigin = Boolean(
5836
+ externalPreviewUrl && !browserOrigin,
5837
+ );
5833
5838
 
5834
5839
  // OS file drag-and-drop (Figma parity §1): the sandboxed iframe sits on top
5835
5840
  // of the wrapper and is a normal DOM element to the parent document's drag
@@ -5979,7 +5984,8 @@ export function DesignCanvas({
5979
5984
  )}
5980
5985
  />
5981
5986
  ) : null}
5982
- {rawExternalPreviewUrl && !externalPreviewUrl ? null : (
5987
+ {rawExternalPreviewUrl &&
5988
+ !externalPreviewUrl ? null : externalPreviewPendingOrigin ? null : (
5983
5989
  <iframe
5984
5990
  key={iframeDocumentIdentity}
5985
5991
  ref={iframeRef}
@@ -5988,6 +5994,8 @@ export function DesignCanvas({
5988
5994
  sandbox={getDesignCanvasIframeSandbox({
5989
5995
  externalPreview: Boolean(externalPreviewUrl),
5990
5996
  readOnly,
5997
+ previewUrl: externalPreviewUrl,
5998
+ parentOrigin: browserOrigin ?? undefined,
5991
5999
  })}
5992
6000
  data-design-preview-iframe
5993
6001
  onLoad={(event) => {
@@ -6039,7 +6047,7 @@ export function DesignCanvas({
6039
6047
  </span>
6040
6048
  </div>
6041
6049
  ) : null}
6042
- {runtimeVerificationUrl ? (
6050
+ {runtimeVerificationUrl && browserOrigin ? (
6043
6051
  <iframe
6044
6052
  key={`${runtimeVerificationUrl}::${runtimeVerificationRequest?.requestId ?? 0}`}
6045
6053
  ref={runtimeVerificationIframeRef}
@@ -6047,6 +6055,8 @@ export function DesignCanvas({
6047
6055
  sandbox={getDesignCanvasIframeSandbox({
6048
6056
  externalPreview: true,
6049
6057
  readOnly: true,
6058
+ previewUrl: runtimeVerificationUrl,
6059
+ parentOrigin: browserOrigin,
6050
6060
  })}
6051
6061
  data-runtime-verification-iframe
6052
6062
  aria-hidden="true"
@@ -4,7 +4,6 @@ import {
4
4
  } from "@agent-native/core/client/host";
5
5
  import { useT } from "@agent-native/core/client/i18n";
6
6
  import { constrainCanvasDragDelta } from "@agent-native/toolkit/canvas-interactions";
7
- import { isBuilderPreviewUrl } from "@shared/builder-preview-url";
8
7
  import {
9
8
  CANVAS_FIT_PADDING_PX,
10
9
  DEFAULT_CANVAS_MAX_ZOOM,
@@ -113,6 +112,10 @@ import {
113
112
  resolveStableContentSizeSample,
114
113
  type ContentSizeSample,
115
114
  } from "./design-canvas/content-size-report";
115
+ import {
116
+ getDesignCanvasIframeSandbox,
117
+ useBrowserOrigin,
118
+ } from "./design-canvas/external-preview";
116
119
  import { appendHitTestResponder } from "./design-canvas/hit-test";
117
120
  import { withLocalRuntimes } from "./design-canvas/local-runtime";
118
121
  import { roundGeo, trace, type TraceArea } from "./design-trace";
@@ -189,27 +192,6 @@ const FRAME_LABEL_HEIGHT = 28;
189
192
  const FRAME_HEADER_BUTTON_COMPACT_WIDTH = 260;
190
193
  const FRAME_HEADER_BUTTON_RESERVE = 116;
191
194
  const FRAME_HEADER_COMPACT_BUTTON_RESERVE = 32;
192
- // Explicitly recognized Builder/loopback previews need their real origin for
193
- // origin-scoped session state. Keep arbitrary URL content and same-origin URL
194
- // fallbacks opaque: combining allow-scripts with allow-same-origin would let
195
- // them remove their sandbox.
196
- const URL_SCREEN_IFRAME_SANDBOX = "allow-scripts allow-same-origin";
197
- const INLINE_SCREEN_IFRAME_SANDBOX = "allow-scripts";
198
-
199
- function getScreenIframeSandbox(previewUrl?: string): string {
200
- if (!previewUrl || typeof window === "undefined") {
201
- return INLINE_SCREEN_IFRAME_SANDBOX;
202
- }
203
- try {
204
- const resolvedUrl = new URL(previewUrl, window.location.href);
205
- return resolvedUrl.origin === window.location.origin ||
206
- !isBuilderPreviewUrl(resolvedUrl.toString())
207
- ? INLINE_SCREEN_IFRAME_SANDBOX
208
- : URL_SCREEN_IFRAME_SANDBOX;
209
- } catch {
210
- return INLINE_SCREEN_IFRAME_SANDBOX;
211
- }
212
- }
213
195
  const TRANSFORM_BADGE_OFFSET = 12;
214
196
  const TRANSFORM_BADGE_EDGE_PADDING = 8;
215
197
  const TRANSFORM_BADGE_HEIGHT = 28;
@@ -663,8 +645,12 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
663
645
  const panRef = useRef(pan);
664
646
  const [canvasZoom, setCanvasZoom] = useState(zoom);
665
647
  const zoomRef = useRef(zoom);
666
- const latestControlledZoomRef = useRef(zoom);
667
- latestControlledZoomRef.current = zoom;
648
+ const previousControlledZoomRef = useRef(zoom);
649
+ const controlledZoomRevisionRef = useRef(0);
650
+ if (previousControlledZoomRef.current !== zoom) {
651
+ previousControlledZoomRef.current = zoom;
652
+ controlledZoomRevisionRef.current += 1;
653
+ }
668
654
  const lastReportedZoomRef = useRef(zoom);
669
655
  const lineupRecenterCameraRef = useRef({
670
656
  x: panRef.current.x,
@@ -1220,6 +1206,10 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
1220
1206
  // unrelated screen/selection render.
1221
1207
  const lastCameraCommandZoomRef = useRef<number | null>(null);
1222
1208
  const lastCameraCommandControlledZoomRef = useRef<number | null>(null);
1209
+ const pendingCameraCommandZoomRevisionRef = useRef<{
1210
+ nonce: number;
1211
+ revision: number;
1212
+ } | null>(null);
1223
1213
  const pendingChromeSettleRef = useRef(false);
1224
1214
  const chromeSettleTimerRef = useRef<number | null>(null);
1225
1215
  const [chromeSettling, setChromeSettling] = useState(false);
@@ -8347,9 +8337,21 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
8347
8337
  // settled wheel/pinch gesture uses — one `applyViewToDom` + one
8348
8338
  // `scheduleViewCommit`, not a fresh render-per-frame loop.
8349
8339
  useEffect(() => {
8350
- if (!cameraCommand) return;
8340
+ if (!cameraCommand) {
8341
+ pendingCameraCommandZoomRevisionRef.current = null;
8342
+ return;
8343
+ }
8351
8344
  if (lastCameraCommandNonceRef.current === cameraCommand.nonce) return;
8352
8345
 
8346
+ const pendingCommandRevision =
8347
+ pendingCameraCommandZoomRevisionRef.current?.nonce === cameraCommand.nonce
8348
+ ? pendingCameraCommandZoomRevisionRef.current.revision
8349
+ : controlledZoomRevisionRef.current;
8350
+ pendingCameraCommandZoomRevisionRef.current = {
8351
+ nonce: cameraCommand.nonce,
8352
+ revision: pendingCommandRevision,
8353
+ };
8354
+
8353
8355
  let cancelled = false;
8354
8356
  let retryFrame: number | null = null;
8355
8357
  let retryCount = 0;
@@ -8369,8 +8371,9 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
8369
8371
  // the overview surface to become measurable, that newer action owns the
8370
8372
  // camera. Acknowledge the stale fit without applying it or scheduling a
8371
8373
  // delayed commit that could overwrite the user's zoom.
8372
- if (latestControlledZoomRef.current !== zoom) {
8374
+ if (controlledZoomRevisionRef.current !== pendingCommandRevision) {
8373
8375
  lastCameraCommandNonceRef.current = cameraCommand.nonce;
8376
+ pendingCameraCommandZoomRevisionRef.current = null;
8374
8377
  resizeObserver?.disconnect();
8375
8378
  return true;
8376
8379
  }
@@ -8401,8 +8404,7 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
8401
8404
  camera.x += chromeInsetLeft;
8402
8405
  zoomRef.current = camera.zoom;
8403
8406
  lastCameraCommandZoomRef.current = camera.zoom;
8404
- lastCameraCommandControlledZoomRef.current =
8405
- latestControlledZoomRef.current;
8407
+ lastCameraCommandControlledZoomRef.current = zoom;
8406
8408
  panRef.current = { x: camera.x, y: camera.y };
8407
8409
  applyViewToDom();
8408
8410
  scheduleViewCommit();
@@ -8411,6 +8413,7 @@ export const MultiScreenCanvas = memo(function MultiScreenCanvas({
8411
8413
  // command during the brief zero-size overview remount caused by active
8412
8414
  // screen URL synchronization.
8413
8415
  lastCameraCommandNonceRef.current = cameraCommand.nonce;
8416
+ pendingCameraCommandZoomRevisionRef.current = null;
8414
8417
  resizeObserver?.disconnect();
8415
8418
  return true;
8416
8419
  };
@@ -11538,8 +11541,10 @@ const Screen = memo(function Screen({
11538
11541
  onEditBreakpoint,
11539
11542
  }: ScreenProps) {
11540
11543
  const t = useT();
11544
+ const browserOrigin = useBrowserOrigin();
11541
11545
  const display = screenDisplayName(screen, metadata);
11542
11546
  const previewUrl = metadata.previewUrl ?? getPreviewUrl(screen.content);
11547
+ const externalPreviewPendingOrigin = Boolean(previewUrl && !browserOrigin);
11543
11548
  const previewViewport = getScreenPreviewViewport(metadata, geometry);
11544
11549
  const suppressNextClick = useRef(false);
11545
11550
  // Overview viewport culling (PF22): mounting only. Unmounting a culled screen
@@ -11958,7 +11963,8 @@ const Screen = memo(function Screen({
11958
11963
  </div>
11959
11964
  ))
11960
11965
  ) : (
11961
- (screenContent ?? (
11966
+ (screenContent ??
11967
+ (externalPreviewPendingOrigin ? null : (
11962
11968
  <iframe
11963
11969
  {...{
11964
11970
  [SESSION_REPLAY_IFRAME_ATTRIBUTE]: previewUrl
@@ -11968,7 +11974,12 @@ const Screen = memo(function Screen({
11968
11974
  data-screen-iframe-id={screen.id}
11969
11975
  src={previewUrl}
11970
11976
  srcDoc={previewUrl ? undefined : srcdocWithHitTest}
11971
- sandbox={getScreenIframeSandbox(previewUrl)}
11977
+ sandbox={getDesignCanvasIframeSandbox({
11978
+ externalPreview: Boolean(previewUrl),
11979
+ readOnly: true,
11980
+ previewUrl,
11981
+ parentOrigin: browserOrigin ?? undefined,
11982
+ })}
11972
11983
  // Visible includes the generous overscan band, so eager load
11973
11984
  // here prewarms the document before it crosses the raw
11974
11985
  // viewport edge. Warm hidden iframes are already loaded.
@@ -11993,7 +12004,7 @@ const Screen = memo(function Screen({
11993
12004
  }}
11994
12005
  title={screen.filename}
11995
12006
  />
11996
- ))
12007
+ )))
11997
12008
  )}
11998
12009
  {layoutGridBoardSize > 0 ? (
11999
12010
  <span
@@ -12346,6 +12357,8 @@ function BreakpointPreviewRow({
12346
12357
  canEdit?: boolean;
12347
12358
  }) {
12348
12359
  const t = useT();
12360
+ const browserOrigin = useBrowserOrigin();
12361
+ const externalPreviewPendingOrigin = Boolean(previewUrl && !browserOrigin);
12349
12362
  const frameActionLabel = t("designEditor.modes.interact");
12350
12363
  const primaryWidthPx = metadata.width ?? primaryGeometry.width;
12351
12364
  const breakpointWidths = visibleBreakpointWidths(
@@ -12732,7 +12745,7 @@ function BreakpointPreviewRow({
12732
12745
  </div>
12733
12746
  ) : editableContent ? (
12734
12747
  editableContent
12735
- ) : (
12748
+ ) : externalPreviewPendingOrigin ? null : (
12736
12749
  <iframe
12737
12750
  // Distinct id per breakpoint sub-frame — the primary iframe
12738
12751
  // above uses the bare screen id, so without a suffix here
@@ -12754,7 +12767,12 @@ function BreakpointPreviewRow({
12754
12767
  }}
12755
12768
  src={previewUrl}
12756
12769
  srcDoc={previewUrl ? undefined : srcdocWithHitTest}
12757
- sandbox={getScreenIframeSandbox(previewUrl)}
12770
+ sandbox={getDesignCanvasIframeSandbox({
12771
+ externalPreview: Boolean(previewUrl),
12772
+ readOnly: true,
12773
+ previewUrl,
12774
+ parentOrigin: browserOrigin ?? undefined,
12775
+ })}
12758
12776
  onLoad={() => {
12759
12777
  getBootStartCallback?.(
12760
12778
  screen.id,
@@ -1,3 +1,18 @@
1
+ import { isBuilderPreviewUrl } from "@shared/builder-preview-url";
2
+ import { useSyncExternalStore } from "react";
3
+
4
+ const subscribeToBrowserOrigin = () => () => {};
5
+ const getBrowserOrigin = () => window.location.origin;
6
+ const getServerOrigin = () => null;
7
+
8
+ export function useBrowserOrigin(): string | null {
9
+ return useSyncExternalStore(
10
+ subscribeToBrowserOrigin,
11
+ getBrowserOrigin,
12
+ getServerOrigin,
13
+ );
14
+ }
15
+
1
16
  export function liveEditEndpointUrl(
2
17
  bridgeUrl: string,
3
18
  previewUrl: string,
@@ -157,17 +172,43 @@ export function sanitizeLocalhostSourceSnapshotHtml(html: string): string {
157
172
  // work inside an iframe. Without these tokens the browser silently ignores
158
173
  // the common "Download / Print PDF" pattern.
159
174
  const EXTERNAL_PREVIEW_IFRAME_SANDBOX =
160
- "allow-scripts allow-forms allow-popups allow-popups-to-escape-sandbox allow-downloads allow-modals allow-same-origin";
175
+ "allow-scripts allow-forms allow-popups allow-popups-to-escape-sandbox allow-downloads allow-modals";
176
+ const TRUSTED_EXTERNAL_PREVIEW_IFRAME_SANDBOX = `${EXTERNAL_PREVIEW_IFRAME_SANDBOX} allow-same-origin`;
161
177
  const EDITABLE_INLINE_IFRAME_SANDBOX =
162
178
  "allow-scripts allow-popups allow-popups-to-escape-sandbox allow-downloads allow-modals allow-same-origin";
163
179
  const READ_ONLY_INLINE_IFRAME_SANDBOX =
164
180
  "allow-scripts allow-popups allow-popups-to-escape-sandbox allow-downloads allow-modals";
165
181
 
182
+ export function isTrustedCrossOriginPreviewUrl(
183
+ previewUrl: string | null | undefined,
184
+ parentOrigin?: string,
185
+ ): boolean {
186
+ if (!previewUrl || !isBuilderPreviewUrl(previewUrl)) return false;
187
+
188
+ const effectiveParentOrigin =
189
+ parentOrigin ??
190
+ (typeof window === "undefined" ? undefined : window.location.origin);
191
+ if (!effectiveParentOrigin) return false;
192
+
193
+ try {
194
+ return new URL(previewUrl).origin !== new URL(effectiveParentOrigin).origin;
195
+ // coercion-ok: invalid origins are untrusted and cannot grant same-origin access.
196
+ } catch {
197
+ return false;
198
+ }
199
+ }
200
+
166
201
  export function getDesignCanvasIframeSandbox(args: {
167
202
  externalPreview: boolean;
168
203
  readOnly: boolean;
204
+ previewUrl?: string | null;
205
+ parentOrigin?: string;
169
206
  }): string {
170
- if (args.externalPreview) return EXTERNAL_PREVIEW_IFRAME_SANDBOX;
207
+ if (args.externalPreview) {
208
+ return isTrustedCrossOriginPreviewUrl(args.previewUrl, args.parentOrigin)
209
+ ? TRUSTED_EXTERNAL_PREVIEW_IFRAME_SANDBOX
210
+ : EXTERNAL_PREVIEW_IFRAME_SANDBOX;
211
+ }
171
212
  return args.readOnly
172
213
  ? READ_ONLY_INLINE_IFRAME_SANDBOX
173
214
  : EDITABLE_INLINE_IFRAME_SANDBOX;
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-09-16
4
+ ---
5
+
6
+ URL-backed overview screens keep their app session and same-origin resources
@@ -3,6 +3,14 @@
3
3
  All notable user-facing changes to Agent-Native Mail are documented here. Open it any
4
4
  time from the command menu (Cmd+K → "What's new") or from Settings.
5
5
 
6
+ ## 2026-09-16
7
+
8
+ ### Fixed
9
+
10
+ - Light and dark mode choices now persist while navigating in the desktop app.
11
+ - Moving a conversation to a label now shows it in that label's list immediately, and when two quick actions touch the same conversation, undoing or failing one no longer makes the other one reappear in the inbox.
12
+ - Reporting spam, blocking a sender, or muting a conversation now updates the inbox immediately, and if the action fails only that conversation comes back instead of other recent changes being undone.
13
+
6
14
  ## 2026-09-15
7
15
 
8
16
  ### Improved
@@ -13,6 +21,7 @@ time from the command menu (Cmd+K → "What's new") or from Settings.
13
21
 
14
22
  ### Fixed
15
23
 
24
+ - Google connections now open reliably in embedded browsers
16
25
  - Inbox archive and read-state changes stay consistent during rapid actions
17
26
  - Mail keeps rapid archive and read actions in sync
18
27
  - Mail recovers cleanly when an email view or navigation takes too long to load.
@@ -3,6 +3,12 @@
3
3
  All notable user-facing changes to Agent-Native Slides are documented here. Open it any
4
4
  time from the command menu (Cmd+K → "What's new").
5
5
 
6
+ ## 2026-09-16
7
+
8
+ ### Fixed
9
+
10
+ - Content-only agent edits now preserve the slide's existing backgrounds and styling.
11
+
6
12
  ## 2026-09-15
7
13
 
8
14
  ### Improved
@@ -186,8 +186,8 @@ export declare function createAutomationCallbackHandler(runtime: AutomationRunti
186
186
  duplicate?: undefined;
187
187
  eventId?: undefined;
188
188
  } | {
189
- error?: undefined;
190
189
  accepted: boolean;
191
190
  duplicate: boolean;
192
191
  eventId: string;
192
+ error?: undefined;
193
193
  }>;
@@ -13,8 +13,8 @@
13
13
  * Body: { json: any, fieldName?: string, type?: "map"|"array", requestSource?: string }
14
14
  */
15
15
  export declare const postCollabJson: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
16
- error: string;
17
16
  ok?: undefined;
17
+ error: string;
18
18
  } | {
19
19
  error?: undefined;
20
20
  ok: boolean;
@@ -91,7 +91,10 @@ export const BETTER_AUTH_REQUIRED_SCHEMA = [
91
91
  table: "verification",
92
92
  columns: ["id", "identifier", "value", "expires_at"],
93
93
  },
94
- { table: "jwks", columns: ["id", "public_key", "private_key"] },
94
+ {
95
+ table: "jwks",
96
+ columns: ["id", "public_key", "private_key", "alg", "crv"],
97
+ },
95
98
  ];
96
99
  /** Same AUTH_DISABLED resolution as getRuntimeConfigReport() in shared/runtime-config.ts. */
97
100
  function isAuthDisabled() {
@@ -17,11 +17,11 @@ declare const _default: import("../../action.js").ActionDefinition<{
17
17
  id?: undefined;
18
18
  provider?: undefined;
19
19
  } | {
20
+ error?: undefined;
20
21
  configured?: undefined;
21
22
  connectPath?: undefined;
22
23
  url: string;
23
24
  id: string;
24
25
  provider: string;
25
- error?: undefined;
26
26
  }>;
27
27
  export default _default;
@@ -137,13 +137,13 @@ export declare function screenMemoryMcpToolDefinitions(): ({
137
137
  inputSchema: {
138
138
  type: string;
139
139
  properties: {
140
+ count?: undefined;
140
141
  query?: undefined;
141
142
  minutes?: undefined;
142
143
  limit?: undefined;
143
144
  clientHint?: undefined;
144
145
  timestamp?: undefined;
145
146
  chapterId?: undefined;
146
- count?: undefined;
147
147
  startAt?: undefined;
148
148
  endAt?: undefined;
149
149
  reason?: undefined;
@@ -159,6 +159,7 @@ export declare function screenMemoryMcpToolDefinitions(): ({
159
159
  inputSchema: {
160
160
  type: string;
161
161
  properties: {
162
+ count?: undefined;
162
163
  query: {
163
164
  type: string;
164
165
  description: string;
@@ -174,7 +175,6 @@ export declare function screenMemoryMcpToolDefinitions(): ({
174
175
  clientHint?: undefined;
175
176
  timestamp?: undefined;
176
177
  chapterId?: undefined;
177
- count?: undefined;
178
178
  startAt?: undefined;
179
179
  endAt?: undefined;
180
180
  reason?: undefined;
@@ -190,6 +190,7 @@ export declare function screenMemoryMcpToolDefinitions(): ({
190
190
  inputSchema: {
191
191
  type: string;
192
192
  properties: {
193
+ count?: undefined;
193
194
  minutes: {
194
195
  type: string;
195
196
  description: string;
@@ -199,7 +200,6 @@ export declare function screenMemoryMcpToolDefinitions(): ({
199
200
  clientHint?: undefined;
200
201
  timestamp?: undefined;
201
202
  chapterId?: undefined;
202
- count?: undefined;
203
203
  startAt?: undefined;
204
204
  endAt?: undefined;
205
205
  reason?: undefined;
@@ -216,6 +216,7 @@ export declare function screenMemoryMcpToolDefinitions(): ({
216
216
  type: string;
217
217
  required: string[];
218
218
  properties: {
219
+ count?: undefined;
219
220
  query: {
220
221
  type: string;
221
222
  description: string;
@@ -234,7 +235,6 @@ export declare function screenMemoryMcpToolDefinitions(): ({
234
235
  };
235
236
  timestamp?: undefined;
236
237
  chapterId?: undefined;
237
- count?: undefined;
238
238
  startAt?: undefined;
239
239
  endAt?: undefined;
240
240
  reason?: undefined;
@@ -250,6 +250,7 @@ export declare function screenMemoryMcpToolDefinitions(): ({
250
250
  type: string;
251
251
  required: string[];
252
252
  properties: {
253
+ count?: undefined;
253
254
  query?: undefined;
254
255
  minutes?: undefined;
255
256
  limit?: undefined;
@@ -263,7 +264,6 @@ export declare function screenMemoryMcpToolDefinitions(): ({
263
264
  description: string;
264
265
  };
265
266
  chapterId?: undefined;
266
- count?: undefined;
267
267
  startAt?: undefined;
268
268
  endAt?: undefined;
269
269
  includeMicrophone?: undefined;
@@ -314,13 +314,13 @@ export declare function screenMemoryMcpToolDefinitions(): ({
314
314
  type: string;
315
315
  required: string[];
316
316
  properties: {
317
+ count?: undefined;
317
318
  query?: undefined;
318
319
  minutes?: undefined;
319
320
  limit?: undefined;
320
321
  clientHint?: undefined;
321
322
  timestamp?: undefined;
322
323
  chapterId?: undefined;
323
- count?: undefined;
324
324
  startAt: {
325
325
  type: string;
326
326
  description: string;
@@ -349,13 +349,13 @@ export declare function screenMemoryMcpToolDefinitions(): ({
349
349
  type: string;
350
350
  required: string[];
351
351
  properties: {
352
+ count?: undefined;
352
353
  query?: undefined;
353
354
  minutes?: undefined;
354
355
  limit?: undefined;
355
356
  clientHint?: undefined;
356
357
  timestamp?: undefined;
357
358
  chapterId?: undefined;
358
- count?: undefined;
359
359
  startAt?: undefined;
360
360
  endAt?: undefined;
361
361
  reason?: undefined;
@@ -16,18 +16,18 @@ export declare function createNotificationsHandler(): import("h3").EventHandlerW
16
16
  error?: undefined;
17
17
  ok?: undefined;
18
18
  } | {
19
+ count?: undefined;
19
20
  updated: number;
20
21
  error?: undefined;
21
22
  ok?: undefined;
22
- count?: undefined;
23
23
  } | {
24
+ count?: undefined;
24
25
  updated?: undefined;
25
26
  error: string;
26
27
  ok?: undefined;
27
- count?: undefined;
28
28
  } | {
29
+ count?: undefined;
29
30
  updated?: undefined;
30
31
  ok: boolean;
31
32
  error?: undefined;
32
- count?: undefined;
33
33
  }>>;
@@ -62,6 +62,6 @@ export declare function createObservabilityHandler(): import("h3").EventHandlerW
62
62
  id?: undefined;
63
63
  summary?: undefined;
64
64
  spans?: undefined;
65
- error?: undefined;
66
65
  ok: boolean;
66
+ error?: undefined;
67
67
  }>>;
@@ -48,8 +48,8 @@ export declare function handleUpdateResource(event: any): Promise<import("./stor
48
48
  }>;
49
49
  /** DELETE /_agent-native/resources/:id — delete a resource */
50
50
  export declare function handleDeleteResource(event: any): Promise<{
51
- ok?: undefined;
52
51
  error: string;
52
+ ok?: undefined;
53
53
  } | {
54
54
  error?: undefined;
55
55
  ok: boolean;
@@ -56,10 +56,10 @@ export declare function createAgentEngineApiKeyHandler(): import("h3").EventHand
56
56
  ok: boolean;
57
57
  error: string;
58
58
  } | {
59
+ error?: undefined;
59
60
  ok: boolean;
60
61
  key: string;
61
62
  baseUrlKey?: string;
62
63
  scope: AgentEngineApiKeyScope;
63
- error?: undefined;
64
64
  }>>;
65
65
  export {};
@@ -646,6 +646,11 @@ const pgAuthSchema = {
646
646
  privateKey: pgText("private_key").notNull(),
647
647
  createdAt: pgTimestamp("created_at", { withTimezone: true }).notNull(),
648
648
  expiresAt: pgTimestamp("expires_at", { withTimezone: true }),
649
+ // Better Auth writes both on every minted key, and the Drizzle adapter
650
+ // rejects a create whose fields are missing here: without them the app
651
+ // cannot mint a signing key at all.
652
+ alg: pgText("alg"),
653
+ crv: pgText("crv"),
649
654
  }),
650
655
  // Better Auth's opt-in SSO/SCIM plugins use these model keys. Keep their
651
656
  // Drizzle schema here even when the plugins are disabled so enabling either
@@ -407,6 +407,16 @@ export const BETTER_AUTH_MIGRATIONS = [
407
407
  `,
408
408
  },
409
409
  },
410
+ {
411
+ version: 8,
412
+ name: "better-auth-jwks-alg-crv-columns",
413
+ sql: {
414
+ postgres: `
415
+ ALTER TABLE "jwks" ADD COLUMN IF NOT EXISTS "alg" TEXT;
416
+ ALTER TABLE "jwks" ADD COLUMN IF NOT EXISTS "crv" TEXT
417
+ `,
418
+ },
419
+ },
410
420
  ];
411
421
  export async function runBetterAuthMigrations(nitroApp) {
412
422
  await runMigrations(BETTER_AUTH_MIGRATIONS, {
@@ -59,8 +59,8 @@ export declare function createRealtimeTokenHandler(): import("h3").EventHandlerW
59
59
  expiresAt?: undefined;
60
60
  ttlSeconds?: undefined;
61
61
  } | {
62
+ error?: undefined;
62
63
  token: string;
63
64
  expiresAt: string;
64
65
  ttlSeconds: number;
65
- error?: undefined;
66
66
  }>>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/core",
3
- "version": "0.182.0-nightly-20260916183124",
3
+ "version": "0.182.0",
4
4
  "description": "The agentic application framework for building autonomous agents with intuitive UIs",
5
5
  "homepage": "https://github.com/BuilderIO/agent-native#readme",
6
6
  "bugs": {
@@ -485,9 +485,9 @@
485
485
  "yaml": "^2.9.0",
486
486
  "yjs": "^13.6.32",
487
487
  "zod": "^4.3.6",
488
- "@agent-native/agentkit": "^0.2.3-nightly-20260916183124",
489
- "@agent-native/recap-cli": "0.5.32",
490
- "@agent-native/toolkit": "^0.20.3-nightly-20260916183124"
488
+ "@agent-native/agentkit": "^0.2.3",
489
+ "@agent-native/recap-cli": "0.5.33",
490
+ "@agent-native/toolkit": "^0.20.3"
491
491
  },
492
492
  "devDependencies": {
493
493
  "@ai-sdk/anthropic": "^3.0.71",