@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 +1 -1
- package/corpus/templates/calendar/CHANGELOG.md +6 -0
- package/corpus/templates/clips/CHANGELOG.md +13 -0
- package/corpus/templates/content/CHANGELOG.md +6 -0
- package/corpus/templates/design/CHANGELOG.md +14 -0
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +12 -2
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +51 -33
- package/corpus/templates/design/app/components/design/design-canvas/external-preview.ts +43 -2
- package/corpus/templates/design/changelog/2026-09-16-url-backed-overview-screens-keep-their-app-session-and-same-.md +6 -0
- package/corpus/templates/mail/CHANGELOG.md +9 -0
- package/corpus/templates/slides/CHANGELOG.md +6 -0
- package/dist/automation/index.d.ts +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/db/runtime-diagnostics.js +4 -1
- package/dist/file-upload/actions/upload-image.d.ts +1 -1
- package/dist/mcp/screen-memory-stdio.d.ts +7 -7
- package/dist/notifications/routes.d.ts +3 -3
- package/dist/observability/routes.d.ts +1 -1
- package/dist/resources/handlers.d.ts +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/better-auth-instance.js +5 -0
- package/dist/server/better-auth-migrations.js +10 -0
- package/dist/server/realtime-token.d.ts +1 -1
- package/package.json +4 -4
package/corpus/README.md
CHANGED
|
@@ -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 &&
|
|
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
|
|
667
|
-
|
|
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)
|
|
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 (
|
|
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={
|
|
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={
|
|
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
|
|
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)
|
|
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;
|
|
@@ -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
|
-
{
|
|
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
|
}>>;
|
|
@@ -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
|
|
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
|
|
489
|
-
"@agent-native/recap-cli": "0.5.
|
|
490
|
-
"@agent-native/toolkit": "^0.20.3
|
|
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",
|