@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 +1 -1
- package/corpus/templates/analytics/CHANGELOG.md +11 -0
- package/corpus/templates/analytics/app/i18n/en-US.ts +1 -0
- package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +101 -11
- package/corpus/templates/analytics/changelog/2026-09-24-session-list-hides-0m-recordings-by-default.md +6 -0
- package/corpus/templates/assets/CHANGELOG.md +6 -0
- package/corpus/templates/calendar/CHANGELOG.md +6 -0
- package/corpus/templates/clips/CHANGELOG.md +10 -0
- package/corpus/templates/content/CHANGELOG.md +22 -0
- package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +559 -227
- package/corpus/templates/content/app/components/editor/VisualEditor.tsx +25 -1
- package/corpus/templates/design/CHANGELOG.md +36 -0
- package/corpus/templates/dispatch/CHANGELOG.md +7 -0
- package/corpus/templates/mail/CHANGELOG.md +17 -0
- package/corpus/templates/slides/CHANGELOG.md +7 -0
- package/dist/observability/routes.d.ts +8 -8
- package/dist/org/handlers.d.ts +1 -1
- package/dist/progress/routes.d.ts +1 -1
- package/package.json +4 -4
package/corpus/README.md
CHANGED
|
@@ -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
|
|
@@ -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
|
-
|
|
252
|
-
|
|
253
|
-
|
|
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
|
|
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={() =>
|
|
359
|
-
|
|
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",
|
|
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
|
-
{
|
|
437
|
+
{loadError ? (
|
|
373
438
|
<div className="p-6 text-sm text-destructive">
|
|
374
|
-
{t("sessions.loadFailed", { 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
|
-
|
|
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`;
|
|
@@ -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
|