@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.
- package/corpus/README.md +1 -1
- package/corpus/templates/analytics/changelog/2026-09-22-apps-start-with-an-app-shaped-skeleton-while-session-data-lo.md +6 -0
- package/corpus/templates/calendar/changelog/2026-09-22-apps-start-with-an-app-shaped-skeleton-while-session-data-lo.md +6 -0
- package/corpus/templates/clips/changelog/2026-09-22-apps-start-with-an-app-shaped-skeleton-while-session-data-lo.md +6 -0
- package/corpus/templates/content/AGENTS.md +1 -1
- package/corpus/templates/content/actions/_document-search-ranking.ts +191 -0
- package/corpus/templates/content/actions/search-documents.ts +184 -49
- package/corpus/templates/content/changelog/2026-09-21-search-ranks-title-matches-first.md +6 -0
- package/corpus/templates/content/docs/product/capabilities/content.knowledge.search.md +11 -8
- package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +10 -3
- package/corpus/templates/design/.generated/bridge/nav.generated.ts +1 -0
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +67 -6
- package/corpus/templates/design/app/components/design/bridge/nav.bridge.ts +16 -0
- package/corpus/templates/design/app/components/design/multi-screen/board-surface-html.ts +26 -0
- package/corpus/templates/design/changelog/2026-09-22-apps-start-with-an-app-shaped-skeleton-while-session-data-lo.md +6 -0
- package/corpus/templates/design/changelog/2026-09-22-blocks-can-be-selected-with-one-click-inside-screens.md +6 -0
- package/corpus/templates/mail/app/components/layout/AppLayout.tsx +136 -123
- package/corpus/templates/mail/changelog/2026-09-22-apps-start-with-an-app-shaped-skeleton-while-session-data-lo.md +6 -0
- package/corpus/templates/slides/changelog/2026-09-22-apps-start-with-an-app-shaped-skeleton-while-session-data-lo.md +6 -0
- package/dist/client/AppShellSkeleton.d.ts +5 -0
- package/dist/client/AppShellSkeleton.js +69 -0
- package/dist/client/ClientOnly.d.ts +1 -1
- package/dist/client/ClientOnly.js +1 -1
- package/dist/client/LanguagePicker.d.ts +6 -0
- package/dist/client/LanguagePicker.js +128 -0
- package/dist/client/analytics.d.ts +3 -2
- package/dist/client/analytics.js +1 -1
- package/dist/client/app-providers.d.ts +3 -3
- package/dist/client/app-providers.js +53 -23
- package/dist/client/client-status-requests.d.ts +5 -0
- package/dist/client/client-status-requests.js +31 -18
- package/dist/client/i18n.d.ts +1 -6
- package/dist/client/i18n.js +3 -117
- package/dist/client/onboarding/first-run-startup-gate.js +14 -3
- package/dist/client/require-session.d.ts +1 -1
- package/dist/client/require-session.js +3 -3
- package/dist/client/session-replay-context.d.ts +16 -0
- package/dist/client/session-replay-context.js +93 -0
- package/dist/client/session-replay.d.ts +2 -26
- package/dist/client/session-replay.js +1 -64
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/routes.d.ts +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/deploy/build.js +19 -29
- package/dist/file-upload/actions/upload-image.d.ts +1 -1
- package/dist/observability/routes.d.ts +1 -1
- package/dist/progress/routes.d.ts +1 -1
- package/dist/resources/handlers.d.ts +1 -1
- package/dist/secrets/routes.d.ts +6 -6
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/core-routes-plugin.d.ts +1 -1
- package/dist/shared/ssr-session-bootstrap.d.ts +3 -0
- package/dist/shared/ssr-session-bootstrap.js +44 -0
- package/dist/sharing/actions/list-resource-shares.d.ts +1 -1
- package/dist/triggers/actions/manage-automation.d.ts +2 -2
- 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 {
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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
|
}>>;
|
package/dist/collab/routes.d.ts
CHANGED
|
@@ -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;
|
package/dist/deploy/build.js
CHANGED
|
@@ -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;
|
|
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
|
-
|
|
2193
|
-
|
|
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
|
-
|
|
2197
|
-
|
|
2198
|
-
|
|
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
|
-
|
|
2196
|
+
[data-agent-native-app-skeleton] [aria-hidden="true"] { animation: none; }
|
|
2203
2197
|
}
|
|
2204
|
-
|
|
2205
|
-
|
|
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
|
|
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}
|
|
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;
|
|
@@ -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;
|
package/dist/secrets/routes.d.ts
CHANGED
|
@@ -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.
|
|
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/
|
|
497
|
-
"@agent-native/
|
|
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",
|