@agent-native/core 0.208.0-nightly-20261013153438 → 0.208.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.
@@ -1,5 +1,11 @@
1
1
  export declare function shouldRetryAuthSessionProbe(response: Pick<Response, "status">, readable: boolean): boolean;
2
2
  export declare function isAgentNativeDesktop(userAgent?: string): boolean;
3
+ export declare function identityBootstrapCallbackHref(target: string, options: {
4
+ enabled: boolean;
5
+ bootstrapPath: string;
6
+ origin?: string;
7
+ userAgent?: string;
8
+ }): string;
3
9
  export declare function isElectron(userAgent?: string): boolean;
4
10
  export declare function isBuilderDesktop(userAgent?: string): boolean;
5
11
  export declare function normalizeOAuthReturnPath(target: string, origin?: string): string;
@@ -4,6 +4,23 @@ export function shouldRetryAuthSessionProbe(response, readable) {
4
4
  export function isAgentNativeDesktop(userAgent = typeof navigator === "undefined" ? "" : navigator.userAgent) {
5
5
  return /AgentNativeDesktop/i.test(userAgent);
6
6
  }
7
+ export function identityBootstrapCallbackHref(target, options) {
8
+ const origin = options.origin ??
9
+ (typeof window === "undefined"
10
+ ? "http://agent-native.local"
11
+ : window.location.origin);
12
+ const appOrigin = new URL(origin);
13
+ const targetUrl = new URL(target || "/", appOrigin);
14
+ if (targetUrl.origin !== appOrigin.origin) {
15
+ throw new TypeError("Identity callback target must be same-origin");
16
+ }
17
+ const safeTarget = `${targetUrl.pathname}${targetUrl.search}${targetUrl.hash}`;
18
+ if (!options.enabled || isAgentNativeDesktop(options.userAgent))
19
+ return safeTarget;
20
+ const url = new URL(options.bootstrapPath, origin);
21
+ url.searchParams.set("return", safeTarget);
22
+ return `${url.pathname}${url.search}`;
23
+ }
7
24
  export function isElectron(userAgent = typeof navigator === "undefined" ? "" : navigator.userAgent) {
8
25
  return userAgent.includes("Electron");
9
26
  }
@@ -0,0 +1,2 @@
1
+ /** Requests another verification message for the signed-in user's email. */
2
+ export declare function resendVerificationEmail(email: string, callbackURL?: string): Promise<void>;
@@ -0,0 +1,32 @@
1
+ import { agentNativePath } from "../api-path.js";
2
+ function isSuccessfulResendResponse(value) {
3
+ return (value !== null &&
4
+ typeof value === "object" &&
5
+ "status" in value &&
6
+ value.status === true);
7
+ }
8
+ /** Requests another verification message for the signed-in user's email. */
9
+ export async function resendVerificationEmail(email, callbackURL) {
10
+ const response = await fetch(agentNativePath("/_agent-native/auth/ba/send-verification-email"), {
11
+ method: "POST",
12
+ credentials: "include",
13
+ headers: { "Content-Type": "application/json" },
14
+ body: JSON.stringify({
15
+ email,
16
+ ...(callbackURL ? { callbackURL } : {}),
17
+ }),
18
+ });
19
+ if (!response.ok) {
20
+ throw new Error("verification email request failed");
21
+ }
22
+ let result;
23
+ try {
24
+ result = await response.json();
25
+ }
26
+ catch {
27
+ throw new Error("verification email request failed");
28
+ }
29
+ if (!isSuccessfulResendResponse(result)) {
30
+ throw new Error("verification email request failed");
31
+ }
32
+ }
@@ -1,5 +1,8 @@
1
1
  import type { AuthSession } from "../server/auth.js";
2
2
  export type { AuthSession };
3
+ interface ClientAuthSession extends AuthSession {
4
+ identitySsoEnabled?: boolean;
5
+ }
3
6
  export { hasSessionHint, isSessionNavigationPending, } from "../shared/ssr-session-bootstrap.js";
4
7
  /**
5
8
  * True while the app tree is mounted hidden ahead of the session read (a hinted
@@ -25,7 +28,7 @@ export type SessionNavigationReason = "signed_out" | "signed_in_app" | "sso_prob
25
28
  export declare function navigateForSession(href: string, reason?: SessionNavigationReason): boolean;
26
29
  export type SessionStatus = "loading" | "authenticated" | "unauthenticated" | "unavailable" | "signing-out";
27
30
  interface UseSessionResult {
28
- session: AuthSession | null;
31
+ session: ClientAuthSession | null;
29
32
  isLoading: boolean;
30
33
  status: SessionStatus;
31
34
  error: Error | null;
@@ -38,19 +38,19 @@ export declare const postAwareness: import("h3").EventHandlerWithFetch<import("h
38
38
  error: string;
39
39
  states?: undefined;
40
40
  } | {
41
+ error?: undefined;
41
42
  states: {
42
43
  clientId: number;
43
44
  state: string;
44
45
  }[];
45
- error?: undefined;
46
46
  }>>;
47
47
  export declare const getActiveUsers: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
48
48
  error: string;
49
49
  users?: undefined;
50
50
  } | {
51
+ error?: undefined;
51
52
  users: {
52
53
  clientId: number;
53
54
  lastSeen: number;
54
55
  }[];
55
- error?: undefined;
56
56
  }>>;
@@ -42,8 +42,8 @@ declare const _default: import("../../action.js").ActionDefinition<{
42
42
  url: string;
43
43
  id: string;
44
44
  provider: string;
45
- configured?: undefined;
46
45
  error?: undefined;
46
+ configured?: undefined;
47
47
  } | {
48
48
  url?: undefined;
49
49
  id?: undefined;
@@ -33,26 +33,26 @@ export declare function createObservabilityHandler(): import("h3").EventHandlerW
33
33
  spans?: undefined;
34
34
  ok?: undefined;
35
35
  } | {
36
+ error?: undefined;
36
37
  message?: undefined;
37
38
  summary: import("./types.js").TraceSummary;
38
39
  spans: import("./types.js").TraceSpan[];
39
- error?: undefined;
40
40
  ok?: undefined;
41
41
  } | {
42
+ error?: undefined;
42
43
  message?: undefined;
43
44
  summary?: undefined;
44
45
  spans?: undefined;
45
46
  traceMissing: true;
46
47
  id: string;
47
- error?: undefined;
48
48
  ok?: undefined;
49
49
  } | {
50
+ error?: undefined;
50
51
  message?: undefined;
51
52
  summary?: undefined;
52
53
  spans?: undefined;
53
54
  traceMissing?: undefined;
54
55
  id: string;
55
- error?: undefined;
56
56
  ok?: undefined;
57
57
  } | {
58
58
  message?: undefined;
@@ -61,9 +61,9 @@ export declare function createObservabilityHandler(): import("h3").EventHandlerW
61
61
  error: any;
62
62
  ok?: undefined;
63
63
  } | {
64
+ error?: undefined;
64
65
  message?: undefined;
65
66
  summary?: undefined;
66
67
  spans?: undefined;
67
- error?: undefined;
68
68
  ok: boolean;
69
69
  }>>;
@@ -76,7 +76,9 @@ export declare function createCustomProviderRegistrationAction<TSchema extends Z
76
76
  }>>;
77
77
  }, z.core.$strip>>, {
78
78
  message?: undefined;
79
- found?: undefined;
79
+ id?: undefined;
80
+ provider?: undefined;
81
+ deleted?: undefined;
80
82
  providers: {
81
83
  id: string;
82
84
  label: string;
@@ -87,47 +89,45 @@ export declare function createCustomProviderRegistrationAction<TSchema extends Z
87
89
  updatedAt: number;
88
90
  }[];
89
91
  count: number;
90
- provider?: undefined;
91
- deleted?: undefined;
92
+ found?: undefined;
92
93
  registered?: undefined;
93
- id?: undefined;
94
94
  label?: undefined;
95
95
  } | {
96
- count?: undefined;
97
96
  message?: undefined;
97
+ id?: undefined;
98
+ deleted?: undefined;
98
99
  providers?: undefined;
100
+ count?: undefined;
99
101
  found: boolean;
100
102
  provider: import("../custom-registry.js").CustomProviderConfig;
101
- deleted?: undefined;
102
103
  registered?: undefined;
103
- id?: undefined;
104
104
  label?: undefined;
105
105
  } | {
106
- count?: undefined;
107
106
  message?: undefined;
108
- providers?: undefined;
109
107
  provider?: undefined;
108
+ deleted?: undefined;
109
+ providers?: undefined;
110
+ count?: undefined;
110
111
  found: boolean;
111
112
  id: string;
112
- deleted?: undefined;
113
113
  registered?: undefined;
114
114
  label?: undefined;
115
115
  } | {
116
- count?: undefined;
117
116
  message?: undefined;
118
- found?: undefined;
119
- providers?: undefined;
120
117
  provider?: undefined;
118
+ providers?: undefined;
119
+ count?: undefined;
120
+ found?: undefined;
121
121
  deleted: boolean;
122
122
  id: string;
123
123
  registered?: undefined;
124
124
  label?: undefined;
125
125
  } | {
126
- count?: undefined;
127
- found?: undefined;
128
- providers?: undefined;
129
126
  provider?: undefined;
130
127
  deleted?: undefined;
128
+ providers?: undefined;
129
+ count?: undefined;
130
+ found?: undefined;
131
131
  registered: boolean;
132
132
  id: string;
133
133
  label: string;
@@ -311,9 +311,10 @@ export declare function createProviderApiActions(runtime: Pick<ProviderApiRuntim
311
311
  notes?: string | undefined;
312
312
  scope?: "org" | "user" | undefined;
313
313
  }, {
314
+ provider?: undefined;
315
+ deleted?: undefined;
314
316
  id?: undefined;
315
317
  message?: undefined;
316
- found?: undefined;
317
318
  providers: {
318
319
  id: string;
319
320
  label: string;
@@ -324,46 +325,45 @@ export declare function createProviderApiActions(runtime: Pick<ProviderApiRuntim
324
325
  updatedAt: number;
325
326
  }[];
326
327
  count: number;
327
- provider?: undefined;
328
- deleted?: undefined;
328
+ found?: undefined;
329
329
  registered?: undefined;
330
330
  label?: undefined;
331
331
  } | {
332
+ deleted?: undefined;
332
333
  id?: undefined;
334
+ count?: undefined;
333
335
  message?: undefined;
334
336
  providers?: undefined;
335
- count?: undefined;
336
337
  found: boolean;
337
338
  provider: import("../custom-registry.js").CustomProviderConfig;
338
- deleted?: undefined;
339
339
  registered?: undefined;
340
340
  label?: undefined;
341
341
  } | {
342
+ provider?: undefined;
343
+ deleted?: undefined;
344
+ count?: undefined;
342
345
  message?: undefined;
343
346
  providers?: undefined;
344
- count?: undefined;
345
- provider?: undefined;
346
347
  found: boolean;
347
348
  id: string;
348
- deleted?: undefined;
349
349
  registered?: undefined;
350
350
  label?: undefined;
351
351
  } | {
352
+ provider?: undefined;
353
+ count?: undefined;
352
354
  message?: undefined;
353
- found?: undefined;
354
355
  providers?: undefined;
355
- count?: undefined;
356
- provider?: undefined;
356
+ found?: undefined;
357
357
  deleted: boolean;
358
358
  id: string;
359
359
  registered?: undefined;
360
360
  label?: undefined;
361
361
  } | {
362
- found?: undefined;
363
- providers?: undefined;
364
- count?: undefined;
365
362
  provider?: undefined;
366
363
  deleted?: undefined;
364
+ count?: undefined;
365
+ providers?: undefined;
366
+ found?: undefined;
367
367
  registered: boolean;
368
368
  id: string;
369
369
  label: string;
@@ -73,7 +73,6 @@ export declare function createProviderCorpusJobAction(options: CreateProviderCor
73
73
  offset?: unknown;
74
74
  limit?: unknown;
75
75
  }, {
76
- deleted?: undefined;
77
76
  jobs: {
78
77
  id: string;
79
78
  name: string;
@@ -84,6 +83,7 @@ export declare function createProviderCorpusJobAction(options: CreateProviderCor
84
83
  updatedAt: string;
85
84
  }[];
86
85
  total: number;
86
+ deleted?: undefined;
87
87
  jobId?: undefined;
88
88
  } | {
89
89
  jobs?: undefined;
@@ -91,9 +91,9 @@ export declare function createProviderCorpusJobAction(options: CreateProviderCor
91
91
  deleted: boolean;
92
92
  jobId: string;
93
93
  } | {
94
- deleted?: undefined;
95
94
  jobs?: undefined;
96
95
  total?: undefined;
96
+ deleted?: undefined;
97
97
  jobId?: undefined;
98
98
  hits: Record<string, unknown>[];
99
99
  offset: number;
@@ -39,8 +39,8 @@ export declare function handleUpdateResource(event: any): Promise<import("./stor
39
39
  error: string;
40
40
  }>;
41
41
  export declare function handleDeleteResource(event: any): Promise<{
42
- ok?: undefined;
43
42
  error: string;
43
+ ok?: undefined;
44
44
  } | {
45
45
  error?: undefined;
46
46
  ok: boolean;
@@ -57,31 +57,31 @@ export declare function createWriteSecretHandler(): import("h3").EventHandlerWit
57
57
  } | {
58
58
  error: string;
59
59
  errorCode?: undefined;
60
- ok?: undefined;
61
60
  status?: undefined;
61
+ ok?: undefined;
62
62
  } | {
63
63
  error: string;
64
64
  errorCode: string;
65
- ok?: undefined;
66
65
  status?: undefined;
66
+ ok?: undefined;
67
67
  } | {
68
68
  error?: undefined;
69
69
  errorCode?: undefined;
70
70
  ok: boolean;
71
71
  status: string;
72
72
  } | {
73
- ok?: undefined;
74
73
  error: string;
75
74
  removed?: undefined;
75
+ ok?: undefined;
76
76
  } | {
77
77
  error?: undefined;
78
78
  ok: boolean;
79
79
  removed: boolean;
80
80
  }>>;
81
81
  export declare function createTestSecretHandler(): import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
82
- ok?: undefined;
83
82
  error: string;
84
83
  note?: undefined;
84
+ ok?: undefined;
85
85
  } | {
86
86
  error?: undefined;
87
87
  ok: boolean;
@@ -67,12 +67,12 @@ export declare function createAgentEngineApiKeyHandler(): import("h3").EventHand
67
67
  code: any;
68
68
  } | {
69
69
  errorCode?: undefined;
70
- error?: undefined;
71
70
  code?: undefined;
72
71
  ok: boolean;
73
72
  key: string;
74
73
  baseUrlKey?: string;
75
74
  scope: AgentEngineApiKeyScope;
76
75
  defaultModel?: import("./agent-engine-default-model-route.js").SavedKeyDefaultModelOutcome;
76
+ error?: undefined;
77
77
  }>>;
78
78
  export {};
@@ -3,7 +3,7 @@ export declare function createAgentEngineOllamaModelsHandler(): import("h3").Eve
3
3
  models?: undefined;
4
4
  ok?: undefined;
5
5
  } | {
6
+ error?: undefined;
6
7
  ok: boolean;
7
8
  models: string[];
8
- error?: undefined;
9
9
  }>>;
@@ -26,6 +26,7 @@ export interface AuthSession {
26
26
  */
27
27
  export interface AuthSessionResponse extends AuthSession {
28
28
  testIdentity: boolean;
29
+ identitySsoEnabled?: boolean;
29
30
  }
30
31
  export interface AuthOptions {
31
32
  maxAge?: number;
@@ -81,7 +81,7 @@ import { getDeploymentEmailReadiness } from "./email.js";
81
81
  import { resolveGoogleSignInCredentials } from "./google-oauth-credentials.js";
82
82
  import { isElectron as isElectronRequest, getAppBasePath, getAppUrl, getOrigin, encodeOAuthState, decodeOAuthState, logOAuthStateDecodeFailure, createOAuthSession, oauthCallbackResponse, oauthDesktopExchangePage, oauthErrorPage, resolveOAuthRedirectUri, isAllowedOAuthRedirectUri, decodeNetlifyPreviewGoogleOAuthRelayState, isNetlifyPreviewGoogleOAuthCallbackUrl, isNetlifyPreviewGoogleOAuthRelayState, wrapNetlifyPreviewGoogleOAuthState, } from "./google-oauth.js";
83
83
  import { clearIdentityGoogleAuthCookie } from "./identity-auth-provider.js";
84
- import { isCanonicalAgentNativeAppRequest, isCanonicalIdentitySsoClientRequest, isDesktopSsoUserAgent, isIdentitySsoExplicitlyEnabled, isNetlifyDeployPermalinkIdentitySsoClientRequest, } from "./identity-sso-store.js";
84
+ import { isCanonicalAgentNativeAppRequest, isCanonicalIdentitySsoClientRequest, isDesktopSsoUserAgent, isIdentitySsoAvailableForRequest, isIdentitySsoExplicitlyEnabled, isNetlifyDeployPermalinkIdentitySsoClientRequest, } from "./identity-sso-store.js";
85
85
  import { healUndecryptableJwks } from "./jwks-secret-rotation.js";
86
86
  import { resolveCanonicalUserForLegacySession, } from "./legacy-auth-migration.js";
87
87
  import * as loopback from "./loopback.js";
@@ -90,6 +90,7 @@ import { safeOAuthReturnUrl } from "./oauth-return-url.js";
90
90
  import { getDeploySettingsRequiredHtml, getOnboardingHtml, getResetPasswordHtml, } from "./onboarding-html.js";
91
91
  import { queryEchoSafeRedirect } from "./query-echo-safe-redirect.js";
92
92
  import { getRequestContext, markRequestIdentityAuthenticatedAtMs, markVerifiedServiceIdentityForEvent, hasContinuationLocalRequestContext, hasExplicitPersonalOrgScope, markExplicitPersonalOrgScope, runWithRequestContext, } from "./request-context.js";
93
+ import { getForwardedRequestOrigin } from "./request-origin.js";
93
94
  import { captureAuthError } from "./sentry.js";
94
95
  import { isTestIdentity } from "./test-identity.js";
95
96
  import { isWorkspaceOAuthCallbackRelayEnabled } from "./workspace-oauth.js";
@@ -3627,6 +3628,13 @@ function setFrameworkSessionHintCookie(event) {
3627
3628
  maxAge: sessionMaxAge,
3628
3629
  });
3629
3630
  }
3631
+ function identitySsoEnabledForRequest(event) {
3632
+ const requestOrigin = new URL(getForwardedRequestOrigin(event));
3633
+ return isIdentitySsoAvailableForRequest({
3634
+ requestHost: requestOrigin.host,
3635
+ requestProtocol: requestOrigin.protocol.slice(0, -1),
3636
+ });
3637
+ }
3630
3638
  export const authSessionHandler = defineEventHandler(async (event) => {
3631
3639
  setResponseHeader(event, "Cache-Control", "no-store");
3632
3640
  if (!isReadMethod(event)) {
@@ -3646,6 +3654,7 @@ export const authSessionHandler = defineEventHandler(async (event) => {
3646
3654
  const response = {
3647
3655
  ...session,
3648
3656
  testIdentity: isTestIdentity(session.email),
3657
+ identitySsoEnabled: identitySsoEnabledForRequest(event),
3649
3658
  };
3650
3659
  return response;
3651
3660
  });
@@ -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;
@@ -136,29 +136,34 @@ Turn Rewind on under the Rewind tab in Settings. Once it's on, you can ask the a
136
136
 
137
137
  ### Earlier screen time {#earlier-screen-time}
138
138
 
139
- Earlier screen time adds up to five minutes of your screen from before you started a recording, taken from Rewind on this device. It is attached to the recording as its own context. It is not stitched into the recording's video.
139
+ Earlier screen time attaches up to five minutes of local screen history from before a recording as its own context. It never becomes part of the video's footage.
140
140
 
141
- Earlier screen time is an optional lab that is on by default. You can turn it off under **Settings > Labs**, "Include earlier screen time", in the Clips web app or the desktop app.
141
+ <WireframeBlock id="clips-earlier-screen-time-popover">
142
+ <Screen
143
+ surface="popover"
144
+ frame="show"
145
+ html={
146
+ "<div style='display:flex;flex-direction:column;gap:10px;padding:16px;box-sizing:border-box'><div style='display:flex;align-items:center;gap:8px;padding:8px'><span>Include last</span><div style='flex:1'></div><span>Off</span><span data-icon='chevronDown'></span></div><div class='wf-card' style='display:flex;flex-direction:column;gap:8px'><strong>Turn on Rewind</strong><small class='wf-muted'>Off by default. Screen history stays on this device until you add it to a recording or approve a request to share it.</small><button class='primary'>Turn on Rewind</button><button style='width:100%;display:flex;justify-content:center;background:transparent;border:0'>What is this?</button></div></div>"
147
+ }
148
+ />
149
+ </WireframeBlock>
142
150
 
143
- With the lab on, the Clips desktop popover has an **Include last** control. Choose **Off** (the default), **30 s**, **5 min**, or **Custom…** for any length up to five minutes. Rewind must be on and running for an amount to take effect. If Rewind is off, choosing an amount opens a short explanation with a **Turn on Rewind** button.
151
+ **Include it with a recording**
144
152
 
145
- When you start a recording, the window you chose under **Include last** is requested and uploads from this device when the recording starts. With **Off**, nothing is requested.
153
+ - **Include earlier screen time** is an optional lab, on by default. Turn it off under **Settings > Labs** in the Clips web or desktop app. In the desktop tray, choose **Off** (default), **30 s**, **5 min**, or **Custom…** up to five minutes. Rewind must be on and running; if it is off, choosing a duration opens the **Turn on Rewind** explanation.
154
+ - When you start a recording, Clips requests the selected window from Rewind on this device and uploads it. **Off** makes no request.
146
155
 
147
- To see exactly what you're sharing, choose **Edit** next to the earlier screen time in the desktop app once it's ready. The editor shows a preview of up to five minutes of local history from before the recording started. The preview is built on your device and is never uploaded. The selection starts on the window you chose. Drag its handles to trim it, and use **Play selection** to play only that part.
156
+ **Review before upload**
148
157
 
149
- The window has three readouts: **From 1:30 before** (how far back it starts), **Length 1 min 30 s**, and **To recording start**, because every window ends where the recording starts. When the window starts at the recording start, its first readout reads **From recording start**.
158
+ - In the Clips desktop app, choose **Edit** when it's ready to review an on-device preview of up to five minutes. It is never uploaded, starts at the selected window, and ends at recording start. Drag the handles to trim it, or use **Play selection** to play that range.
159
+ - **Save** uploads only the selection. Cancel or close the editor to discard the preview. Readouts show the start offset, length, and recording start; when the range starts with the recording, the offset reads **From recording start**.
150
160
 
151
- **Save** uploads only the selected window. Cancel, or closing the editor in any other way, discards the preview and uploads nothing.
161
+ **Privacy and removal**
152
162
 
153
- To remove earlier screen time, choose **Remove earlier screen time** in the desktop edit view or in the Transcript tab's panel on the clip page, then confirm. You can also ask the agent to remove it. The footage recording moves to Trash, where it stays until you delete it there, and the clip no longer includes it. Discarding a recording also removes the earlier screen time it had.
154
-
155
- A recording captured on another device shows **Waiting for the device that recorded this clip** until that device saves it. Only that device can export its footage, so your other devices skip it. An item with no recording device on file, such as one requested before device tracking, is still processed by the desktop app that captured the recording.
156
-
157
- While a clip has earlier screen time, it stays private. Requesting it makes the clip private, and the request is refused if the clip is still shared directly with other people. Sharing is blocked until you remove the earlier screen time: making the clip public or visible to your organization, or giving someone access, is refused.
158
-
159
- On the clip page, the Transcript tab shows earlier screen time above the transcript, with its window and an inline player. Editing happens in the Clips desktop app; the same panel can remove it. The agent can read the window and its status.
160
-
161
- Limits: earlier screen time is five minutes at most. The history is only what Rewind still keeps on this device, so older moments may no longer be available.
163
+ - Earlier screen time stays private while attached. Requesting it makes the clip private, and a request is refused while the clip is shared directly with others. Sharing, public or organization visibility, and new access stay blocked until you remove it.
164
+ - The clip's **Transcript** tab shows the attached window above the transcript with an inline player. Remove it from the desktop edit view or that panel, then confirm. Its footage moves to Trash and the clip no longer includes it. Discarding the recording removes it too. The agent can read its window and status, and can remove it.
165
+ - If another device captured the recording, it waits for that device to save the footage; only that device can export it, and other devices skip it. If no recording device is on file, the desktop app that captured the recording processes it.
166
+ - The limit is five minutes, and only history Rewind still keeps on this device is available.
162
167
 
163
168
  ### Chrome extension browser logs
164
169
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/core",
3
- "version": "0.208.0-nightly-20261013153438",
3
+ "version": "0.208.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": {
@@ -499,6 +499,7 @@
499
499
  "./client/app-model-default": "./dist/client/app-model-default.js",
500
500
  "./client/appearance": "./dist/client/appearance.js",
501
501
  "./client/auth/change-email": "./dist/client/auth/change-email.js",
502
+ "./client/auth/resend-verification-email": "./dist/client/auth/resend-verification-email.js",
502
503
  "./client/auth/two-factor": "./dist/client/auth/two-factor.js",
503
504
  "./client/browser-tab-id": "./dist/client/browser-tab-id.js",
504
505
  "./client/builder-frame": "./dist/client/builder-frame.js",
@@ -702,8 +703,8 @@
702
703
  "yaml": "^2.9.0",
703
704
  "yjs": "^13.6.33",
704
705
  "zod": "^4.3.6",
705
- "@agent-native/agentkit": "^0.208.0-nightly-20261013153438",
706
- "@agent-native/recap-cli": "^0.5.70"
706
+ "@agent-native/agentkit": "^0.208.0",
707
+ "@agent-native/recap-cli": "^0.5.71"
707
708
  },
708
709
  "devDependencies": {
709
710
  "@ai-sdk/anthropic": "^3.0.71",
@@ -773,7 +774,7 @@
773
774
  "xlsx": "^0.18.5"
774
775
  },
775
776
  "peerDependencies": {
776
- "@agent-native/core-corpus": "0.208.0-nightly-20261013153438",
777
+ "@agent-native/core-corpus": ">=0.196.0",
777
778
  "@ai-sdk/anthropic": ">=3",
778
779
  "@ai-sdk/cohere": ">=3",
779
780
  "@ai-sdk/google": ">=3",