@agent-native/core 0.187.0-nightly-20260924183037 → 0.187.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/corpus/README.md CHANGED
@@ -31,4 +31,4 @@ rg -n "defineAction|useActionQuery" node_modules/@agent-native/core/corpus
31
31
 
32
32
  ## Generated Counts
33
33
 
34
- - template files: 9885
34
+ - template files: 9886
@@ -3,10 +3,21 @@
3
3
  All notable user-facing changes to Agent-Native Analytics are documented here. Open it any
4
4
  time from the command menu (Cmd+K → "What's new") or from Settings.
5
5
 
6
+ ## 2026-09-24
7
+
8
+ ### Improved
9
+
10
+ - The Sessions list hides 0m recordings by default, with a filter to include them.
11
+
12
+ ### Fixed
13
+
14
+ - Session recordings no longer cut off partway through when the daily recording budget runs low; new recordings wait for room instead.
15
+
6
16
  ## 2026-09-23
7
17
 
8
18
  ### Improved
9
19
 
20
+ - Transient HTTP 5xx checks now need confirmation before alerting
10
21
  - Analytics opens faster by loading translation catalogs and rarely used surfaces only when needed.
11
22
 
12
23
  ## 2026-09-22
@@ -1389,6 +1389,7 @@ export default {
1389
1389
  app: "App",
1390
1390
  unknownApp: "Unknown app",
1391
1391
  lastSeen: "Last seen",
1392
+ includeZeroMinuteSessions: "Include 0m sessions",
1392
1393
  duration: "Duration",
1393
1394
  events: "Events",
1394
1395
  chunks: "Chunks",
@@ -29,6 +29,7 @@ import { toast } from "sonner";
29
29
  import { Badge } from "@/components/ui/badge";
30
30
  import { Button } from "@/components/ui/button";
31
31
  import { Card, CardContent } from "@/components/ui/card";
32
+ import { Checkbox } from "@/components/ui/checkbox";
32
33
  import {
33
34
  Collapsible,
34
35
  CollapsibleContent,
@@ -170,8 +171,19 @@ type SessionRecordingIdentity = Pick<
170
171
  type SessionRecordingDevice = Pick<SessionRecordingSummary, "metadata">;
171
172
 
172
173
  const RANGE_OPTIONS: ReplayRange[] = ["24h", "7d", "30d", "90d", "all"];
174
+ const MIN_DURATION_FOR_ONE_MINUTE_LABEL_MS = 59_500;
173
175
  const SESSION_QUERY_DEBOUNCE_MS = 250;
174
176
 
177
+ export function shouldShowZeroMinuteRecoveryAction(
178
+ includeZeroMinuteSessions: boolean,
179
+ filteredCount: number,
180
+ unfilteredCount: number,
181
+ ): boolean {
182
+ return (
183
+ !includeZeroMinuteSessions && filteredCount === 0 && unfilteredCount > 0
184
+ );
185
+ }
186
+
175
187
  /**
176
188
  * Local input state for a URL-backed filter, debounced into the URL.
177
189
  *
@@ -212,6 +224,8 @@ export default function SessionsPage() {
212
224
  const range = readRange(searchParams.get("range"));
213
225
  const app = searchParams.get("app") ?? "";
214
226
  const query = searchParams.get("q") ?? "";
227
+ const includeZeroMinuteSessions =
228
+ searchParams.get("includeZeroMinuteSessions") === "true";
215
229
  const from = useMemo(() => rangeToFrom(range), [range]);
216
230
 
217
231
  const updateFilter = useCallback(
@@ -243,21 +257,55 @@ export default function SessionsPage() {
243
257
  );
244
258
  const [appInput, setAppInput] = useDebouncedUrlFilter(app, commitApp);
245
259
 
260
+ const sessionListFilters = {
261
+ from: from ?? undefined,
262
+ app: app || undefined,
263
+ query: query || undefined,
264
+ };
246
265
  const { data, isLoading, isFetching, refetch, error } = useActionQuery<
247
266
  SessionRecordingSummary[]
248
267
  >(
249
268
  "list-session-recordings",
250
269
  {
251
- from: from ?? undefined,
252
- app: app || undefined,
253
- query: query || undefined,
270
+ ...sessionListFilters,
271
+ minDurationMs: includeZeroMinuteSessions
272
+ ? undefined
273
+ : MIN_DURATION_FOR_ONE_MINUTE_LABEL_MS,
254
274
  limit: 100,
255
275
  },
256
276
  { staleTime: 30_000 },
257
277
  );
258
278
 
259
279
  const recordings = data ?? [];
260
- const popoverFiltered = range !== "30d" || app !== "";
280
+ const shouldCheckForHiddenSessions =
281
+ !includeZeroMinuteSessions &&
282
+ !isLoading &&
283
+ !error &&
284
+ recordings.length === 0;
285
+ const {
286
+ data: unfilteredRecordings,
287
+ isLoading: isCheckingForHiddenSessions,
288
+ isFetching: isFetchingHiddenSessions,
289
+ error: hiddenSessionsError,
290
+ refetch: refetchHiddenSessions,
291
+ } = useActionQuery<SessionRecordingSummary[]>(
292
+ "list-session-recordings",
293
+ { ...sessionListFilters, limit: 1 },
294
+ { enabled: shouldCheckForHiddenSessions, staleTime: 30_000 },
295
+ );
296
+ const showZeroMinuteRecoveryAction = shouldShowZeroMinuteRecoveryAction(
297
+ includeZeroMinuteSessions,
298
+ recordings.length,
299
+ unfilteredRecordings?.length ?? 0,
300
+ );
301
+ const loadError =
302
+ error ?? (shouldCheckForHiddenSessions ? hiddenSessionsError : null);
303
+ const isCheckingEmptyState =
304
+ shouldCheckForHiddenSessions && isCheckingForHiddenSessions;
305
+ const isRefreshing =
306
+ isFetching || (shouldCheckForHiddenSessions && isFetchingHiddenSessions);
307
+ const popoverFiltered =
308
+ range !== "30d" || app !== "" || includeZeroMinuteSessions;
261
309
 
262
310
  return (
263
311
  <div className="analytics-sessions-page mx-auto flex w-full max-w-7xl flex-col gap-4 px-4 py-5">
@@ -328,6 +376,18 @@ export default function SessionsPage() {
328
376
  </SelectContent>
329
377
  </Select>
330
378
  </div>
379
+ <label className="flex cursor-pointer items-center gap-2 border-t pt-3 text-sm">
380
+ <Checkbox
381
+ checked={includeZeroMinuteSessions}
382
+ onCheckedChange={(checked) =>
383
+ updateFilter(
384
+ "includeZeroMinuteSessions",
385
+ checked === true ? "true" : "",
386
+ )
387
+ }
388
+ />
389
+ {t("sessions.includeZeroMinuteSessions")}
390
+ </label>
331
391
  <div className="grid gap-1.5 border-t pt-3">
332
392
  <div className="text-xs font-medium text-muted-foreground">
333
393
  {t("sessions.userFilters")}
@@ -355,12 +415,17 @@ export default function SessionsPage() {
355
415
  variant="ghost"
356
416
  size="icon"
357
417
  className="h-9 w-9"
358
- onClick={() => void refetch()}
359
- disabled={isFetching}
418
+ onClick={() => {
419
+ void refetch();
420
+ if (shouldCheckForHiddenSessions) {
421
+ void refetchHiddenSessions();
422
+ }
423
+ }}
424
+ disabled={isRefreshing}
360
425
  aria-label={t("sessions.refresh")}
361
426
  >
362
427
  <IconRefresh
363
- className={cn("h-4 w-4", isFetching && "animate-spin")}
428
+ className={cn("h-4 w-4", isRefreshing && "animate-spin")}
364
429
  />
365
430
  </Button>
366
431
  </div>
@@ -369,14 +434,22 @@ export default function SessionsPage() {
369
434
 
370
435
  <Card>
371
436
  <CardContent className="p-0">
372
- {error ? (
437
+ {loadError ? (
373
438
  <div className="p-6 text-sm text-destructive">
374
- {t("sessions.loadFailed", { message: error.message })}
439
+ {t("sessions.loadFailed", { message: loadError.message })}
375
440
  </div>
376
- ) : isLoading ? (
441
+ ) : isLoading || isCheckingEmptyState ? (
377
442
  <SessionSkeleton />
378
443
  ) : recordings.length === 0 ? (
379
- <EmptySessionsState />
444
+ showZeroMinuteRecoveryAction ? (
445
+ <FilteredEmptySessionsState
446
+ onIncludeZeroMinuteSessions={() =>
447
+ updateFilter("includeZeroMinuteSessions", "true")
448
+ }
449
+ />
450
+ ) : (
451
+ <EmptySessionsState />
452
+ )
380
453
  ) : (
381
454
  <div>
382
455
  <div className="flex items-center justify-between border-b px-4 py-3">
@@ -525,6 +598,22 @@ function EmptySessionsState() {
525
598
  );
526
599
  }
527
600
 
601
+ function FilteredEmptySessionsState({
602
+ onIncludeZeroMinuteSessions,
603
+ }: {
604
+ onIncludeZeroMinuteSessions: () => void;
605
+ }) {
606
+ const t = useT();
607
+ return (
608
+ <div className="flex min-h-[380px] flex-col items-center justify-center gap-4 p-6">
609
+ <h2 className="text-lg font-semibold">{t("sessions.noSessions")}</h2>
610
+ <Button variant="outline" onClick={onIncludeZeroMinuteSessions}>
611
+ {t("sessions.includeZeroMinuteSessions")}
612
+ </Button>
613
+ </div>
614
+ );
615
+ }
616
+
528
617
  export function ReplayStorageHint({
529
618
  embedded = false,
530
619
  }: {
@@ -862,6 +951,7 @@ function formatDateTime(value: string): string {
862
951
 
863
952
  export function formatSessionDuration(ms: number | null): string {
864
953
  if (!ms || !Number.isFinite(ms) || ms <= 0) return "0m";
954
+ if (ms < MIN_DURATION_FOR_ONE_MINUTE_LABEL_MS) return "0m";
865
955
  const seconds = Math.round(ms / 1000);
866
956
  const minutes = Math.floor(seconds / 60);
867
957
  if (minutes < 60) return `${minutes}m`;
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-09-24
4
+ ---
5
+
6
+ The Sessions list hides 0m recordings by default, with a filter to include them.
@@ -3,6 +3,12 @@
3
3
  All notable user-facing changes to Assets are documented here. Open it any
4
4
  time from the command menu (Cmd+K → "What's new") or from Settings.
5
5
 
6
+ ## 2026-09-23
7
+
8
+ ### Fixed
9
+
10
+ - Stale image candidates stop showing as generating when their generation run is missing.
11
+
6
12
  ## 2026-09-01
7
13
 
8
14
  ### Improved
@@ -9,6 +9,12 @@ time from the command menu (Cmd+K → "What's new") or from Settings.
9
9
 
10
10
  - Calendar opens faster by loading translated catalogs only when you need them.
11
11
 
12
+ ### Fixed
13
+
14
+ - Bookings no longer confirm without their configured Zoom meeting
15
+ - Release a booking slot when Zoom creation never starts
16
+ - Zoom booking timeouts keep the slot reserved to prevent duplicate meetings.
17
+
12
18
  ## 2026-09-22
13
19
 
14
20
  ### Improved
@@ -7,10 +7,19 @@ from the command menu (Cmd+K → "What's new") or from Settings.
7
7
 
8
8
  ### Improved
9
9
 
10
+ - Clip share sidebars stay expanded in stacked layouts and use a floating, borderless control when collapsed.
11
+ - Clip viewers can collapse the comments, transcript, and Agent sidebar
12
+ - Search results clarify where a match appears in the video.
13
+ - Search results show where a transcript or comment match appears
10
14
  - Insights charts load only when opened, keeping the recording library faster.
11
15
 
12
16
  ### Fixed
13
17
 
18
+ - Comment fields grow as you type so longer messages stay visible
19
+ - New recordings stay loading until their share is available
20
+ - Playback errors no longer cover the video player controls
21
+ - Trash recordings are excluded from search results.
22
+ - Opening a trashed recording now links its breadcrumb back to Trash.
14
23
  - Long recording menus scroll within the visible space so every action stays reachable.
15
24
 
16
25
  ## 2026-09-22
@@ -28,6 +37,7 @@ from the command menu (Cmd+K → "What's new") or from Settings.
28
37
 
29
38
  ### Fixed
30
39
 
40
+ - Stopped Clips AI actions now clear the in-progress status.
31
41
  - Clips keeps uploaded videos visible while the library refreshes and localizes Loom import failures.
32
42
  - Clips recovers dropped uploads after a lost finalization response and clears saving feedback after successful saves.
33
43
  - The desktop app stops re-checking flags and meetings every few seconds after your session expires, and resumes when you sign in again.
@@ -3,6 +3,28 @@
3
3
  All notable user-facing changes to Agent-Native Content are documented here. Open it any
4
4
  time from the command menu (Cmd+K → "What's new").
5
5
 
6
+ ## 2026-09-23
7
+
8
+ ### Added
9
+
10
+ - Every page in the sidebar now has a "…" menu to rename, duplicate, move, copy its link, open it in a new tab, or move it to Trash, and it shows who last edited the page. Duplicate copies sub-pages too, and Move can take a page and its sub-pages to another workspace after warning you that its sharing will change.
11
+
12
+ ### Improved
13
+
14
+ - The sidebar is easier to scan: the page you're on is highlighted wherever it appears, nested pages show guide lines and Trash stays in reach below the page list.
15
+
16
+ ### Fixed
17
+
18
+ - Tables inserted in the visual editor now let you resize columns.
19
+ - Markdown tables with aligned columns now open as editable tables in pages, keeping column alignment and all cell content.
20
+ - The Trash view no longer highlights a document that is not in Trash.
21
+
22
+ ## 2026-09-22
23
+
24
+ ### Fixed
25
+
26
+ - Comments, replies, and suggested-edit decisions now appear immediately without leaving duplicate text in the composer while they save.
27
+
6
28
  ## 2026-09-21
7
29
 
8
30
  ### Improved