@agent-native/core 0.184.0 → 0.184.1-nightly-20260922203115

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 (56) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/templates/analytics/changelog/2026-09-22-apps-start-with-an-app-shaped-skeleton-while-session-data-lo.md +6 -0
  3. package/corpus/templates/calendar/changelog/2026-09-22-apps-start-with-an-app-shaped-skeleton-while-session-data-lo.md +6 -0
  4. package/corpus/templates/clips/changelog/2026-09-22-apps-start-with-an-app-shaped-skeleton-while-session-data-lo.md +6 -0
  5. package/corpus/templates/content/AGENTS.md +1 -1
  6. package/corpus/templates/content/actions/_document-search-ranking.ts +191 -0
  7. package/corpus/templates/content/actions/search-documents.ts +184 -49
  8. package/corpus/templates/content/changelog/2026-09-21-search-ranks-title-matches-first.md +6 -0
  9. package/corpus/templates/content/docs/product/capabilities/content.knowledge.search.md +11 -8
  10. package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +10 -3
  11. package/corpus/templates/design/.generated/bridge/nav.generated.ts +1 -0
  12. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +67 -6
  13. package/corpus/templates/design/app/components/design/bridge/nav.bridge.ts +16 -0
  14. package/corpus/templates/design/app/components/design/multi-screen/board-surface-html.ts +26 -0
  15. package/corpus/templates/design/changelog/2026-09-22-apps-start-with-an-app-shaped-skeleton-while-session-data-lo.md +6 -0
  16. package/corpus/templates/design/changelog/2026-09-22-blocks-can-be-selected-with-one-click-inside-screens.md +6 -0
  17. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +136 -123
  18. package/corpus/templates/mail/changelog/2026-09-22-apps-start-with-an-app-shaped-skeleton-while-session-data-lo.md +6 -0
  19. package/corpus/templates/slides/changelog/2026-09-22-apps-start-with-an-app-shaped-skeleton-while-session-data-lo.md +6 -0
  20. package/dist/client/AppShellSkeleton.d.ts +5 -0
  21. package/dist/client/AppShellSkeleton.js +69 -0
  22. package/dist/client/ClientOnly.d.ts +1 -1
  23. package/dist/client/ClientOnly.js +1 -1
  24. package/dist/client/LanguagePicker.d.ts +6 -0
  25. package/dist/client/LanguagePicker.js +128 -0
  26. package/dist/client/analytics.d.ts +3 -2
  27. package/dist/client/analytics.js +1 -1
  28. package/dist/client/app-providers.d.ts +3 -3
  29. package/dist/client/app-providers.js +53 -23
  30. package/dist/client/client-status-requests.d.ts +5 -0
  31. package/dist/client/client-status-requests.js +31 -18
  32. package/dist/client/i18n.d.ts +1 -6
  33. package/dist/client/i18n.js +3 -117
  34. package/dist/client/onboarding/first-run-startup-gate.js +14 -3
  35. package/dist/client/require-session.d.ts +1 -1
  36. package/dist/client/require-session.js +3 -3
  37. package/dist/client/session-replay-context.d.ts +16 -0
  38. package/dist/client/session-replay-context.js +93 -0
  39. package/dist/client/session-replay.d.ts +2 -26
  40. package/dist/client/session-replay.js +1 -64
  41. package/dist/collab/awareness.d.ts +2 -2
  42. package/dist/collab/routes.d.ts +1 -1
  43. package/dist/collab/struct-routes.d.ts +1 -1
  44. package/dist/deploy/build.js +19 -29
  45. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  46. package/dist/observability/routes.d.ts +1 -1
  47. package/dist/progress/routes.d.ts +1 -1
  48. package/dist/resources/handlers.d.ts +1 -1
  49. package/dist/secrets/routes.d.ts +6 -6
  50. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  51. package/dist/server/core-routes-plugin.d.ts +1 -1
  52. package/dist/shared/ssr-session-bootstrap.d.ts +3 -0
  53. package/dist/shared/ssr-session-bootstrap.js +44 -0
  54. package/dist/sharing/actions/list-resource-shares.d.ts +1 -1
  55. package/dist/triggers/actions/manage-automation.d.ts +2 -2
  56. package/package.json +3 -3
@@ -31,7 +31,7 @@ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-run
31
31
  import { useEffect, useRef } from "react";
32
32
  import { SIGN_IN_ENTRY_PATH, signInJourney, } from "../shared/sign-in-journey.js";
33
33
  import { appBasePath, appPath } from "./api-path.js";
34
- import { DefaultSpinner } from "./DefaultSpinner.js";
34
+ import { AppShellSkeleton } from "./AppShellSkeleton.js";
35
35
  import { useSession } from "./use-session.js";
36
36
  /**
37
37
  * The sign-in journey for the browser's current location.
@@ -99,7 +99,7 @@ function ResolvedSessionGate({ children, fallback, redirect = true, signedOut, }
99
99
  // Still resolving, or redirect already in flight: show the loading fallback
100
100
  // rather than flashing app chrome the visitor can't use.
101
101
  if (status === "loading")
102
- return _jsx(_Fragment, { children: fallback ?? _jsx(DefaultSpinner, {}) });
102
+ return _jsx(_Fragment, { children: fallback ?? _jsx(AppShellSkeleton, {}) });
103
103
  // Unreadable is not signed-out. Redirecting here would bounce a signed-in
104
104
  // user to the sign-in page over a transient 5xx, and rendering the spinner
105
105
  // would strand them on a screen that never resolves.
@@ -108,7 +108,7 @@ function ResolvedSessionGate({ children, fallback, redirect = true, signedOut, }
108
108
  }
109
109
  if (!session) {
110
110
  if (redirect)
111
- return _jsx(_Fragment, { children: fallback ?? _jsx(DefaultSpinner, {}) });
111
+ return _jsx(_Fragment, { children: fallback ?? _jsx(AppShellSkeleton, {}) });
112
112
  return _jsx(_Fragment, { children: signedOut ?? null });
113
113
  }
114
114
  return _jsx(_Fragment, { children: children });
@@ -0,0 +1,16 @@
1
+ export interface SessionReplayContext {
2
+ replayId: string;
3
+ sessionId: string;
4
+ startedAtMs: number;
5
+ startedAt: string;
6
+ linkBaseUrl: string | null;
7
+ active: boolean;
8
+ }
9
+ export interface SessionReplayLinkOptions {
10
+ /** Event time to seek to when the replay link opens. */
11
+ at?: Date | number | string;
12
+ /** Overrides the configured Analytics app origin for this link. */
13
+ linkBaseUrl?: string;
14
+ }
15
+ export declare function getSessionReplayContext(): SessionReplayContext | null;
16
+ export declare function getSessionReplayUrl(options?: SessionReplayLinkOptions): string | null;
@@ -0,0 +1,93 @@
1
+ import { getOrCreateAnalyticsSessionId } from "./analytics-session.js";
2
+ const SESSION_REPLAY_STATE_KEY = Symbol.for("agent-native.client.sessionReplay");
3
+ const SESSION_REPLAY_ID_STORAGE_KEY = "agent-native.session_replay_id";
4
+ function readStoredReplaySession() {
5
+ if (typeof window === "undefined")
6
+ return null;
7
+ try {
8
+ const raw = window.sessionStorage.getItem(SESSION_REPLAY_ID_STORAGE_KEY);
9
+ if (!raw)
10
+ return null;
11
+ const parsed = JSON.parse(raw);
12
+ return parsed && typeof parsed === "object" ? parsed : null;
13
+ // coercion-ok: disabled session storage means replay context is absent
14
+ }
15
+ catch {
16
+ return null;
17
+ }
18
+ }
19
+ function getLiveReplayState() {
20
+ if (typeof window === "undefined")
21
+ return null;
22
+ const state = globalThis[SESSION_REPLAY_STATE_KEY];
23
+ return state ?? null;
24
+ }
25
+ export function getSessionReplayContext() {
26
+ const state = getLiveReplayState();
27
+ if (state?.active && state.replayId && state.startedAtMs) {
28
+ const sessionId = getOrCreateAnalyticsSessionId();
29
+ if (!sessionId)
30
+ return null;
31
+ return {
32
+ replayId: state.replayId,
33
+ sessionId,
34
+ startedAtMs: state.startedAtMs,
35
+ startedAt: new Date(state.startedAtMs).toISOString(),
36
+ linkBaseUrl: state.replayLinkBaseUrl ?? null,
37
+ active: true,
38
+ };
39
+ }
40
+ const stored = readStoredReplaySession();
41
+ if (!stored?.replayId || !stored.sessionId || !stored.startedAtMs) {
42
+ return null;
43
+ }
44
+ return {
45
+ replayId: stored.replayId,
46
+ sessionId: stored.sessionId,
47
+ startedAtMs: stored.startedAtMs,
48
+ startedAt: new Date(stored.startedAtMs).toISOString(),
49
+ linkBaseUrl: stored.linkBaseUrl ?? null,
50
+ active: false,
51
+ };
52
+ }
53
+ function normalizeReplayLinkBaseUrl(value) {
54
+ const raw = value?.trim() ||
55
+ import.meta.env["VITE_AGENT_NATIVE_ANALYTICS_APP_URL"]?.trim() ||
56
+ (typeof window !== "undefined" ? window.location.origin : "");
57
+ if (!raw)
58
+ return null;
59
+ try {
60
+ return new URL(raw, typeof window !== "undefined" ? window.location.href : undefined).origin;
61
+ // coercion-ok: an invalid configured origin means no replay link is available
62
+ }
63
+ catch {
64
+ return null;
65
+ }
66
+ }
67
+ export function getSessionReplayUrl(options = {}) {
68
+ const context = getSessionReplayContext();
69
+ if (!context)
70
+ return null;
71
+ const base = normalizeReplayLinkBaseUrl(options.linkBaseUrl ?? context.linkBaseUrl ?? undefined);
72
+ if (!base)
73
+ return null;
74
+ try {
75
+ const url = new URL("/sessions/lookup", base);
76
+ url.searchParams.set("sessionId", context.sessionId);
77
+ url.searchParams.set("replayId", context.replayId);
78
+ const at = options.at === undefined ? Date.now() : options.at;
79
+ const timestamp = typeof at === "number"
80
+ ? new Date(at)
81
+ : typeof at === "string"
82
+ ? new Date(at)
83
+ : at;
84
+ if (!Number.isNaN(timestamp.getTime())) {
85
+ url.searchParams.set("at", timestamp.toISOString());
86
+ }
87
+ return url.toString();
88
+ // coercion-ok: invalid link inputs produce no replay URL
89
+ }
90
+ catch {
91
+ return null;
92
+ }
93
+ }
@@ -88,20 +88,6 @@ export interface SessionReplayOptions {
88
88
  onUploadRejected?: (details: SessionReplayUploadRejectedDetails) => void;
89
89
  extraProperties?: Record<string, unknown> | (() => Record<string, unknown> | undefined);
90
90
  }
91
- export interface SessionReplayContext {
92
- replayId: string;
93
- sessionId: string;
94
- startedAtMs: number;
95
- startedAt: string;
96
- linkBaseUrl: string | null;
97
- active: boolean;
98
- }
99
- export interface SessionReplayLinkOptions {
100
- /** Event time to seek to when the replay link opens. */
101
- at?: Date | number | string;
102
- /** Overrides the configured Analytics app origin for this link. */
103
- linkBaseUrl?: string;
104
- }
105
91
  export interface SessionReplayStartResult {
106
92
  started: boolean;
107
93
  reason?: "disabled" | "not-browser" | "missing-public-key" | "missing-session-id" | "missing-user-id" | "sampled-out" | "url-blocked" | "already-active" | "import-failed" | "record-failed";
@@ -130,18 +116,8 @@ export declare function isSessionReplayActive(): boolean;
130
116
  * `/sessions/<recordingId>`.
131
117
  */
132
118
  export declare function getSessionReplayId(): string | null;
133
- /**
134
- * Return the replay identity associated with this browser tab. The context is
135
- * intentionally small so it can be attached to analytics events without
136
- * exposing replay content or credentials.
137
- */
138
- export declare function getSessionReplayContext(): SessionReplayContext | null;
139
- /**
140
- * Build a scoped Analytics replay lookup link. The Analytics server resolves
141
- * the client replay id to its server recording id and converts the event time
142
- * into the replay player's offset before redirecting to the detail page.
143
- */
144
- export declare function getSessionReplayUrl(options?: SessionReplayLinkOptions): string | null;
119
+ export { getSessionReplayContext, getSessionReplayUrl, } from "./session-replay-context.js";
120
+ export type { SessionReplayContext, SessionReplayLinkOptions, } from "./session-replay-context.js";
145
121
  /**
146
122
  * Surface a manually captured exception on the active session replay timeline
147
123
  * as an `agent-native.console` custom event, reusing the diagnostics contract
@@ -2901,70 +2901,7 @@ export function getSessionReplayId() {
2901
2901
  const stored = readStoredReplaySession();
2902
2902
  return stored?.replayId ?? null;
2903
2903
  }
2904
- /**
2905
- * Return the replay identity associated with this browser tab. The context is
2906
- * intentionally small so it can be attached to analytics events without
2907
- * exposing replay content or credentials.
2908
- */
2909
- export function getSessionReplayContext() {
2910
- const state = getState();
2911
- if (state.active && state.replayId && state.startedAtMs) {
2912
- const sessionId = getOrCreateAnalyticsSessionId();
2913
- if (!sessionId)
2914
- return null;
2915
- return {
2916
- replayId: state.replayId,
2917
- sessionId,
2918
- startedAtMs: state.startedAtMs,
2919
- startedAt: new Date(state.startedAtMs).toISOString(),
2920
- linkBaseUrl: state.replayLinkBaseUrl,
2921
- active: true,
2922
- };
2923
- }
2924
- const stored = readStoredReplaySession();
2925
- if (!stored?.replayId || !stored.sessionId || !stored.startedAtMs) {
2926
- return null;
2927
- }
2928
- return {
2929
- replayId: stored.replayId,
2930
- sessionId: stored.sessionId,
2931
- startedAtMs: stored.startedAtMs,
2932
- startedAt: new Date(stored.startedAtMs).toISOString(),
2933
- linkBaseUrl: stored.linkBaseUrl ?? null,
2934
- active: false,
2935
- };
2936
- }
2937
- /**
2938
- * Build a scoped Analytics replay lookup link. The Analytics server resolves
2939
- * the client replay id to its server recording id and converts the event time
2940
- * into the replay player's offset before redirecting to the detail page.
2941
- */
2942
- export function getSessionReplayUrl(options = {}) {
2943
- const context = getSessionReplayContext();
2944
- if (!context)
2945
- return null;
2946
- const base = normalizeReplayLinkBaseUrl(options.linkBaseUrl ?? context.linkBaseUrl ?? undefined);
2947
- if (!base)
2948
- return null;
2949
- try {
2950
- const url = new URL("/sessions/lookup", base);
2951
- url.searchParams.set("sessionId", context.sessionId);
2952
- url.searchParams.set("replayId", context.replayId);
2953
- const at = options.at === undefined ? Date.now() : options.at;
2954
- const timestamp = typeof at === "number"
2955
- ? new Date(at)
2956
- : typeof at === "string"
2957
- ? new Date(at)
2958
- : at;
2959
- if (!Number.isNaN(timestamp.getTime())) {
2960
- url.searchParams.set("at", timestamp.toISOString());
2961
- }
2962
- return url.toString();
2963
- }
2964
- catch {
2965
- return null;
2966
- }
2967
- }
2904
+ export { getSessionReplayContext, getSessionReplayUrl, } from "./session-replay-context.js";
2968
2905
  /**
2969
2906
  * Surface a manually captured exception on the active session replay timeline
2970
2907
  * as an `agent-native.console` custom event, reusing the diagnostics contract
@@ -62,11 +62,11 @@ export declare const postAwareness: import("h3").EventHandlerWithFetch<import("h
62
62
  error: string;
63
63
  states?: undefined;
64
64
  } | {
65
+ error?: undefined;
65
66
  states: {
66
67
  clientId: number;
67
68
  state: string;
68
69
  }[];
69
- error?: undefined;
70
70
  }>>;
71
71
  /**
72
72
  * GET /_agent-native/collab/:docId/users
@@ -77,9 +77,9 @@ export declare const getActiveUsers: import("h3").EventHandlerWithFetch<import("
77
77
  error: string;
78
78
  users?: undefined;
79
79
  } | {
80
+ error?: undefined;
80
81
  users: {
81
82
  clientId: number;
82
83
  lastSeen: number;
83
84
  }[];
84
- error?: undefined;
85
85
  }>>;
@@ -26,8 +26,8 @@ export declare const getCollabState: import("h3").EventHandlerWithFetch<import("
26
26
  * Body: { update: string (base64), requestSource?: string }
27
27
  */
28
28
  export declare const postCollabUpdate: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
29
- error: string;
30
29
  ok?: undefined;
30
+ error: string;
31
31
  } | {
32
32
  error?: undefined;
33
33
  ok: boolean;
@@ -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;
@@ -33,7 +33,6 @@ import { frameworkSessionHintCookieName, resolveAuthCookieNamespace, } from "../
33
33
  import { resolveAgentNativeBuildId } from "../shared/build-id.js";
34
34
  import { DEFAULT_SPECULATION_RULES_PATH, resolveSsrCacheHeaders, resolveSsrCacheKeyHeaders, SSR_QUERY_CACHE_KEY_HEADER, } from "../shared/cache-control.js";
35
35
  import { normalizeFrameworkRoutePrefix } from "../shared/framework-route-prefix.js";
36
- import { LOADING_LABELS } from "../shared/loading-labels.js";
37
36
  import { mcpEmbedStaticAssetRouteRules } from "../shared/mcp-embed-headers.js";
38
37
  import { isTruthyRuntimeValue } from "../shared/runtime-config.js";
39
38
  import { AGENT_NATIVE_SOCIAL_IMAGE_ALT, AGENT_NATIVE_SOCIAL_IMAGE_CACHE_BUSTER, AGENT_NATIVE_SOCIAL_IMAGE_HEIGHT, AGENT_NATIVE_SOCIAL_IMAGE_PATH, AGENT_NATIVE_SOCIAL_IMAGE_TYPE, AGENT_NATIVE_SOCIAL_IMAGE_WIDTH, } from "../shared/social-meta.js";
@@ -2183,41 +2182,32 @@ const EMPTY_REACT_ROUTER_TURBO_STREAM = '[{"_1":2,"_3":-5,"_4":-5},"loaderData",
2183
2182
  // Manifest fallbacks cannot execute server loaders, so root loaders get the
2184
2183
  // framework's default locale shape to keep hydration from reading undefined.
2185
2184
  const DEFAULT_ROOT_LOADER_REACT_ROUTER_TURBO_STREAM = '[{"_1":2,"_3":-5,"_4":-5},"loaderData",{"_5":6},"actionData","errors","root",{"_7":8,"_9":10,"_11":12,"_13":14},"locale","en-US","preference",{"_7":15},"dir","ltr","messages",{},"system"]\n';
2186
- const STATIC_SHELL_CUBE_DELAYS = [90, 180, 270, 0, 90, 180, 90, 180, 270];
2187
2185
  const STATIC_SHELL_LOADING_MARKUP = [
2188
- '<div style="display:flex;flex-direction:column;align-items:center;justify-content:center;height:var(--agent-native-viewport-height, 100vh);width:100%">',
2189
- '<div style="display:flex;align-items:center;gap:12px">',
2190
- '<svg aria-label="Loading" role="status" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" class="size-6" data-agent-native-cube-loader="true">',
2186
+ '<div role="status" aria-label="Loading application" data-agent-native-app-skeleton="true" style="display:flex;height:var(--agent-native-viewport-height, 100vh);width:100%;overflow:hidden;background-color:hsl(var(--background, 0 0% 100%));color:hsl(var(--foreground, 240 10% 3.9%))">',
2191
2187
  `<style>
2192
- @keyframes an-cube-pulse {
2193
- 0%, 100% { opacity: 0.15; }
2194
- 50% { opacity: 0.95; }
2188
+ [data-agent-native-app-skeleton] [aria-hidden="true"] {
2189
+ animation: an-app-shell-skeleton-pulse 1.2s ease-in-out infinite;
2195
2190
  }
2196
- .an-cube-cell {
2197
- animation: an-cube-pulse 650ms ease-in-out infinite;
2198
- fill: currentColor;
2199
- opacity: 0.15;
2191
+ @keyframes an-app-shell-skeleton-pulse {
2192
+ 0%, 100% { opacity: 0.45; }
2193
+ 50% { opacity: 0.85; }
2200
2194
  }
2201
2195
  @media (prefers-reduced-motion: reduce) {
2202
- .an-cube-cell { animation: none; }
2196
+ [data-agent-native-app-skeleton] [aria-hidden="true"] { animation: none; }
2203
2197
  }
2204
- </style>`,
2205
- ...STATIC_SHELL_CUBE_DELAYS.map((delay, index) => `<rect class="an-cube-cell" x="${2.5 + (index % 3) * 7}" y="${2.5 + Math.floor(index / 3) * 7}" width="5" height="5" rx="1" style="animation-delay:calc(${delay}ms - var(--an-cube-loader-phase, 0ms))"></rect>`),
2206
- `</svg><span data-agent-native-loading-label="true" class="agent-running-shimmer agent-loading-label" style="font-family:ui-sans-serif, system-ui, sans-serif;font-size:16px;font-weight:500;opacity:0.65">${LOADING_LABELS[0]}</span>`,
2207
- `<\/div><style>
2208
- html {
2209
- background: hsl(var(--background, 0 0% 100%));
2210
- color: hsl(var(--foreground, 240 10% 3.9%));
2211
- }
2212
- @media (prefers-color-scheme: dark) {
2213
- html {
2214
- background: hsl(var(--background, 240 10% 3.9%));
2215
- color: hsl(var(--foreground, 0 0% 98%));
2216
- }
2198
+ @media (max-width: 767px) {
2199
+ [data-agent-native-app-skeleton] [data-agent-native-app-skeleton-sidebar] { display: none; }
2217
2200
  }
2218
- </style></div>`,
2201
+ </style>`,
2202
+ '<aside data-agent-native-app-skeleton-sidebar="true" aria-hidden="true" style="display:flex;width:248px;flex-shrink:0;flex-direction:column;gap:16px;border-right:1px solid hsl(var(--border, 240 5.9% 90%));padding:16px">',
2203
+ '<span aria-hidden="true" style="display:block;width:132px;height:32px;background-color:hsl(var(--muted, 240 5% 96.1%));border-radius:6px;opacity:0.7"></span>',
2204
+ '<div style="display:flex;flex-direction:column;gap:10px"><span aria-hidden="true" style="display:block;width:68%;height:14px;background-color:hsl(var(--muted, 240 5% 96.1%));border-radius:6px;opacity:0.7"></span><span aria-hidden="true" style="display:block;width:82%;height:14px;background-color:hsl(var(--muted, 240 5% 96.1%));border-radius:6px;opacity:0.7"></span><span aria-hidden="true" style="display:block;width:96%;height:14px;background-color:hsl(var(--muted, 240 5% 96.1%));border-radius:6px;opacity:0.7"></span><span aria-hidden="true" style="display:block;width:68%;height:14px;background-color:hsl(var(--muted, 240 5% 96.1%));border-radius:6px;opacity:0.7"></span><span aria-hidden="true" style="display:block;width:82%;height:14px;background-color:hsl(var(--muted, 240 5% 96.1%));border-radius:6px;opacity:0.7"></span><span aria-hidden="true" style="display:block;width:96%;height:14px;background-color:hsl(var(--muted, 240 5% 96.1%));border-radius:6px;opacity:0.7"></span></div>',
2205
+ "</aside>",
2206
+ '<main style="display:flex;min-width:0;flex:1;flex-direction:column">',
2207
+ '<header aria-hidden="true" style="display:flex;height:48px;flex-shrink:0;align-items:center;gap:12px;border-bottom:1px solid hsl(var(--border, 240 5.9% 90%));padding:0 16px"><span aria-hidden="true" style="display:block;width:32px;height:32px;background-color:hsl(var(--muted, 240 5% 96.1%));border-radius:8px;opacity:0.7"></span><span aria-hidden="true" style="display:block;width:128px;height:14px;background-color:hsl(var(--muted, 240 5% 96.1%));border-radius:6px;opacity:0.7"></span></header>',
2208
+ '<section aria-hidden="true" style="display:flex;width:100%;max-width:960px;flex:1;flex-direction:column;gap:12px;margin:0 auto;padding:24px"><span aria-hidden="true" style="display:block;width:38%;height:28px;margin-bottom:8px;background-color:hsl(var(--muted, 240 5% 96.1%));border-radius:6px;opacity:0.7"></span><span aria-hidden="true" style="display:block;width:24%;height:14px;margin-bottom:16px;background-color:hsl(var(--muted, 240 5% 96.1%));border-radius:6px;opacity:0.7"></span><div style="display:flex;align-items:center;gap:12px"><span aria-hidden="true" style="display:block;width:32px;height:32px;background-color:hsl(var(--muted, 240 5% 96.1%));border-radius:8px;opacity:0.7"></span><div style="display:flex;flex:1;flex-direction:column;gap:8px"><span aria-hidden="true" style="display:block;width:52%;height:12px;background-color:hsl(var(--muted, 240 5% 96.1%));border-radius:6px;opacity:0.7"></span><span aria-hidden="true" style="display:block;width:34%;height:10px;background-color:hsl(var(--muted, 240 5% 96.1%));border-radius:6px;opacity:0.7"></span></div></div><div style="display:flex;align-items:center;gap:12px"><span aria-hidden="true" style="display:block;width:32px;height:32px;background-color:hsl(var(--muted, 240 5% 96.1%));border-radius:8px;opacity:0.7"></span><div style="display:flex;flex:1;flex-direction:column;gap:8px"><span aria-hidden="true" style="display:block;width:64%;height:12px;background-color:hsl(var(--muted, 240 5% 96.1%));border-radius:6px;opacity:0.7"></span><span aria-hidden="true" style="display:block;width:44%;height:10px;background-color:hsl(var(--muted, 240 5% 96.1%));border-radius:6px;opacity:0.7"></span></div></div><div style="display:flex;align-items:center;gap:12px"><span aria-hidden="true" style="display:block;width:32px;height:32px;background-color:hsl(var(--muted, 240 5% 96.1%));border-radius:8px;opacity:0.7"></span><div style="display:flex;flex:1;flex-direction:column;gap:8px"><span aria-hidden="true" style="display:block;width:76%;height:12px;background-color:hsl(var(--muted, 240 5% 96.1%));border-radius:6px;opacity:0.7"></span><span aria-hidden="true" style="display:block;width:54%;height:10px;background-color:hsl(var(--muted, 240 5% 96.1%));border-radius:6px;opacity:0.7"></span></div></div><div style="display:flex;align-items:center;gap:12px"><span aria-hidden="true" style="display:block;width:32px;height:32px;background-color:hsl(var(--muted, 240 5% 96.1%));border-radius:8px;opacity:0.7"></span><div style="display:flex;flex:1;flex-direction:column;gap:8px"><span aria-hidden="true" style="display:block;width:52%;height:12px;background-color:hsl(var(--muted, 240 5% 96.1%));border-radius:6px;opacity:0.7"></span><span aria-hidden="true" style="display:block;width:64%;height:10px;background-color:hsl(var(--muted, 240 5% 96.1%));border-radius:6px;opacity:0.7"></span></div></div><div style="display:flex;align-items:center;gap:12px"><span aria-hidden="true" style="display:block;width:32px;height:32px;background-color:hsl(var(--muted, 240 5% 96.1%));border-radius:8px;opacity:0.7"></span><div style="display:flex;flex:1;flex-direction:column;gap:8px"><span aria-hidden="true" style="display:block;width:64%;height:12px;background-color:hsl(var(--muted, 240 5% 96.1%));border-radius:6px;opacity:0.7"></span><span aria-hidden="true" style="display:block;width:74%;height:10px;background-color:hsl(var(--muted, 240 5% 96.1%));border-radius:6px;opacity:0.7"></span></div></div><div style="display:flex;align-items:center;gap:12px"><span aria-hidden="true" style="display:block;width:32px;height:32px;background-color:hsl(var(--muted, 240 5% 96.1%));border-radius:8px;opacity:0.7"></span><div style="display:flex;flex:1;flex-direction:column;gap:8px"><span aria-hidden="true" style="display:block;width:76%;height:12px;background-color:hsl(var(--muted, 240 5% 96.1%));border-radius:6px;opacity:0.7"></span><span aria-hidden="true" style="display:block;width:84%;height:10px;background-color:hsl(var(--muted, 240 5% 96.1%));border-radius:6px;opacity:0.7"></span></div></div></section>',
2209
+ "</main></div>",
2219
2210
  ].join("");
2220
- const STATIC_SHELL_LOADING_LABEL_SCRIPT = `<script>(function(){var labels=${JSON.stringify(LOADING_LABELS)};var label=document.querySelector('[data-agent-native-loading-label]');var loader=document.querySelector('[data-agent-native-cube-loader]');var observer;var cleanup=function(){if(window.__agentNativeLoadingLabelInterval!==undefined){window.clearInterval(window.__agentNativeLoadingLabelInterval);delete window.__agentNativeLoadingLabelInterval;}if(observer)observer.disconnect();if(window.__agentNativeLoadingLabelCleanup===cleanup)delete window.__agentNativeLoadingLabelCleanup;};window.__agentNativeLoadingLabelCleanup=cleanup;var update=function(){var now=window.performance.now();if(loader)loader.style.setProperty('--an-cube-loader-phase',(now%650)+'ms');if(label){label.textContent=labels[window.__agentNativeLoadingLabelIndex];label.style.animationDelay='-'+now%2600+'ms';}};window.__agentNativeLoadingLabelIndex=Math.floor(Math.random()*labels.length);update();window.__agentNativeLoadingLabelInterval=window.setInterval(function(){if(window.__agentNativeLoadingLabelHydrated||!loader||!loader.isConnected){cleanup();return;}window.__agentNativeLoadingLabelIndex=(window.__agentNativeLoadingLabelIndex+1)%labels.length;update();},3000);if(window.MutationObserver){observer=new MutationObserver(function(){if(!loader.isConnected)cleanup();});observer.observe(document,{childList:true,subtree:true});}})();</script>`;
2221
2211
  export function generateCloudflarePagesStaticShellFromManifest(manifest, basePath = normalizeConfiguredAppBasePath()) {
2222
2212
  const rootRoute = manifest.routes.root;
2223
2213
  if (!rootRoute) {
@@ -2240,7 +2230,7 @@ export function generateCloudflarePagesStaticShellFromManifest(manifest, basePat
2240
2230
  const encodedInitialState = rootRoute.hasLoader
2241
2231
  ? DEFAULT_ROOT_LOADER_REACT_ROUTER_TURBO_STREAM
2242
2232
  : EMPTY_REACT_ROUTER_TURBO_STREAM;
2243
- return `<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"/><link rel="icon" type="image/svg+xml" href="/favicon.svg"/>${modulePreloads}${stylesheets}</head><body>${STATIC_SHELL_LOADING_MARKUP}${STATIC_SHELL_LOADING_LABEL_SCRIPT}<script>window.__reactRouterContext = ${JSON.stringify(context)};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamController = controller;}}).pipeThrough(new TextEncoderStream());</script><script type="module" async="">${routeModuleScript}</script><!--$--><script>window.__reactRouterContext.streamController.enqueue(${JSON.stringify(encodedInitialState)});</script><!--$--><script>window.__reactRouterContext.streamController.close();</script><!--/$--><!--/$--></body></html>`;
2233
+ return `<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"/><link rel="icon" type="image/svg+xml" href="/favicon.svg"/>${modulePreloads}${stylesheets}</head><body>${STATIC_SHELL_LOADING_MARKUP}<script>window.__reactRouterContext = ${JSON.stringify(context)};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamController = controller;}}).pipeThrough(new TextEncoderStream());</script><script type="module" async="">${routeModuleScript}</script><!--$--><script>window.__reactRouterContext.streamController.enqueue(${JSON.stringify(encodedInitialState)});</script><!--$--><script>window.__reactRouterContext.streamController.close();</script><!--/$--><!--/$--></body></html>`;
2244
2234
  }
2245
2235
  function writeCloudflarePagesStaticShell({ serverDir, distDir, tmpDir, }) {
2246
2236
  const serverEntry = path.join(serverDir, "index.js");
@@ -44,9 +44,9 @@ declare const _default: import("../../action.js").ActionDefinition<{
44
44
  url: string;
45
45
  id: string;
46
46
  provider: string;
47
- error?: undefined;
48
47
  configured?: undefined;
49
48
  connectPath?: undefined;
49
+ error?: undefined;
50
50
  } | {
51
51
  url?: undefined;
52
52
  id?: undefined;
@@ -62,6 +62,6 @@ export declare function createObservabilityHandler(): import("h3").EventHandlerW
62
62
  summary?: undefined;
63
63
  spans?: undefined;
64
64
  id?: undefined;
65
- error?: undefined;
66
65
  ok: boolean;
66
+ error?: undefined;
67
67
  }>>;
@@ -15,6 +15,6 @@ export declare function createProgressHandler(): import("h3").EventHandlerWithFe
15
15
  error: string;
16
16
  ok?: undefined;
17
17
  } | {
18
- ok: boolean;
19
18
  error?: undefined;
19
+ ok: boolean;
20
20
  }>>;
@@ -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;
@@ -60,17 +60,17 @@ export declare function createWriteSecretHandler(): import("h3").EventHandlerWit
60
60
  ok?: undefined;
61
61
  status?: undefined;
62
62
  } | {
63
- error?: undefined;
64
63
  ok: boolean;
65
64
  status: string;
65
+ error?: undefined;
66
66
  } | {
67
67
  ok?: undefined;
68
68
  error: string;
69
69
  removed?: undefined;
70
70
  } | {
71
- error?: undefined;
72
71
  ok: boolean;
73
72
  removed: boolean;
73
+ error?: undefined;
74
74
  }>>;
75
75
  /**
76
76
  * POST /_agent-native/secrets/:key/test — validate an optional candidate value
@@ -81,13 +81,13 @@ export declare function createTestSecretHandler(): import("h3").EventHandlerWith
81
81
  error: string;
82
82
  note?: undefined;
83
83
  } | {
84
- error?: undefined;
85
84
  ok: boolean;
86
85
  note?: undefined;
87
- } | {
88
86
  error?: undefined;
87
+ } | {
89
88
  ok: boolean;
90
89
  note: string;
90
+ error?: undefined;
91
91
  } | {
92
92
  note?: undefined;
93
93
  ok: boolean;
@@ -119,11 +119,11 @@ export interface AdHocSecretPayload {
119
119
  export declare function createAdHocSecretHandler(): import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<AdHocSecretPayload[] | {
120
120
  error: string;
121
121
  } | {
122
- error?: undefined;
123
122
  ok: boolean;
124
123
  key: string;
125
- } | {
126
124
  error?: undefined;
125
+ } | {
127
126
  ok: boolean;
128
127
  removed: boolean;
128
+ error?: undefined;
129
129
  }>>;
@@ -46,10 +46,10 @@ export declare function createAgentEngineApiKeyHandler(): import("h3").EventHand
46
46
  scope?: undefined;
47
47
  ok?: undefined;
48
48
  } | {
49
- error?: undefined;
50
49
  ok: boolean;
51
50
  key: string;
52
51
  scope: string;
52
+ error?: undefined;
53
53
  } | {
54
54
  key?: undefined;
55
55
  scope?: undefined;
@@ -408,8 +408,8 @@ export declare function createPublicRemoteAgentsHandler(discover?: PublicAgentDi
408
408
  error: string;
409
409
  agents?: undefined;
410
410
  } | {
411
- agents: Omit<import("./agent-discovery.js").DiscoveredAgent, "auth" | "kind">[];
412
411
  error?: undefined;
412
+ agents: Omit<import("./agent-discovery.js").DiscoveredAgent, "auth" | "kind">[];
413
413
  }>>;
414
414
  export declare function getBuilderConnectErrorDisposition(error: unknown, connectAttemptId: string | null): "correlated" | "legacy" | null;
415
415
  export declare function getBuilderConnectErrorKey(ownerEmail: string, connectAttemptId?: string | null): string;
@@ -0,0 +1,3 @@
1
+ export declare const SSR_SESSION_BOOTSTRAP_MARKER = "data-agent-native-session-bootstrap=\"1\"";
2
+ export declare const SSR_SESSION_BOOTSTRAP_TIMEOUT_MS = 15000;
3
+ export declare function getSsrSessionBootstrapScriptBody(sessionPath: string, sessionHintCookieName?: string): string;
@@ -0,0 +1,44 @@
1
+ import { safeJsonForHtml } from "./agent-readable-resource.js";
2
+ export const SSR_SESSION_BOOTSTRAP_MARKER = 'data-agent-native-session-bootstrap="1"';
3
+ export const SSR_SESSION_BOOTSTRAP_TIMEOUT_MS = 15_000;
4
+ export function getSsrSessionBootstrapScriptBody(sessionPath, sessionHintCookieName) {
5
+ return `(function __anEarlySessionBootstrap() {
6
+ if (window.__agentNativeSessionBootstrap) return;
7
+ var sessionHintCookieName = ${safeJsonForHtml(sessionHintCookieName ?? "")};
8
+ var hasSessionHint = document.cookie.split(";").some(function (cookie) {
9
+ var entry = cookie.trim();
10
+ var separator = entry.indexOf("=");
11
+ if (separator < 1 || entry.slice(separator + 1) !== "1") return false;
12
+ var name = entry.slice(0, separator);
13
+ return sessionHintCookieName
14
+ ? name === sessionHintCookieName
15
+ : name === "an_session_hint" ||
16
+ (name.indexOf("an_session_") === 0 && name.endsWith("_hint"));
17
+ });
18
+ if (!hasSessionHint) return;
19
+ var controller = typeof AbortController === "function"
20
+ ? new AbortController()
21
+ : null;
22
+ var timeoutId = setTimeout(function () {
23
+ if (controller) controller.abort();
24
+ }, ${SSR_SESSION_BOOTSTRAP_TIMEOUT_MS});
25
+ var requestInit = {
26
+ credentials: "same-origin",
27
+ cache: "no-store",
28
+ headers: { Accept: "application/json" }
29
+ };
30
+ if (controller) requestInit.signal = controller.signal;
31
+ window.__agentNativeSessionBootstrap = fetch(${safeJsonForHtml(sessionPath)}, requestInit).then(function (response) {
32
+ if (!response.ok) return { state: "unavailable", status: response.status };
33
+ return response.json().then(function (value) {
34
+ return { state: "available", value: value };
35
+ }, function () {
36
+ return { state: "unavailable", status: response.status };
37
+ });
38
+ }).catch(function () {
39
+ return { state: "unavailable" };
40
+ }).finally(function () {
41
+ clearTimeout(timeoutId);
42
+ });
43
+ })();`;
44
+ }
@@ -2,6 +2,7 @@ declare const _default: import("../../action.js").ActionDefinition<{
2
2
  resourceType: string;
3
3
  resourceId: string;
4
4
  }, {
5
+ role?: undefined;
5
6
  ownerEmail: any;
6
7
  visibility: any;
7
8
  shares: any[];
@@ -11,7 +12,6 @@ declare const _default: import("../../action.js").ActionDefinition<{
11
12
  supportsGroupShares?: boolean;
12
13
  };
13
14
  orgId?: undefined;
14
- role?: undefined;
15
15
  agentReadable?: undefined;
16
16
  } | {
17
17
  ownerEmail: string;
@@ -13,7 +13,6 @@ declare const _default: import("../../action.js").ActionDefinition<{
13
13
  executionEngine?: string;
14
14
  executionCwd?: string;
15
15
  }, {
16
- deleted?: undefined;
17
16
  created: boolean;
18
17
  name: string;
19
18
  scope: "organization" | "personal";
@@ -24,6 +23,7 @@ declare const _default: import("../../action.js").ActionDefinition<{
24
23
  reasoningEffort: "auto" | "high" | "low" | "max" | "medium" | "minimal" | "none" | "xhigh";
25
24
  webhookPath: string;
26
25
  nextRun: string;
26
+ deleted?: undefined;
27
27
  enabled?: undefined;
28
28
  executionHostId?: undefined;
29
29
  executionEngine?: undefined;
@@ -45,11 +45,11 @@ declare const _default: import("../../action.js").ActionDefinition<{
45
45
  nextRun?: undefined;
46
46
  webhookPath?: undefined;
47
47
  } | {
48
- deleted?: undefined;
49
48
  scope?: undefined;
50
49
  created?: undefined;
51
50
  triggerType?: undefined;
52
51
  event?: undefined;
52
+ deleted?: undefined;
53
53
  name: string;
54
54
  enabled: boolean;
55
55
  schedule: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/core",
3
- "version": "0.184.0",
3
+ "version": "0.184.1-nightly-20260922203115",
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": {
@@ -493,8 +493,8 @@
493
493
  "yjs": "^13.6.32",
494
494
  "zod": "^4.3.6",
495
495
  "@agent-native/agentkit": "^0.2.6",
496
- "@agent-native/recap-cli": "0.5.36",
497
- "@agent-native/toolkit": "^0.20.6"
496
+ "@agent-native/toolkit": "^0.20.6",
497
+ "@agent-native/recap-cli": "0.5.36"
498
498
  },
499
499
  "devDependencies": {
500
500
  "@ai-sdk/anthropic": "^3.0.71",