@agent-native/core 0.79.18 → 0.79.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/core/CHANGELOG.md +6 -0
  3. package/corpus/core/package.json +1 -1
  4. package/corpus/core/src/client/i18n.tsx +77 -65
  5. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +1 -1
  6. package/corpus/templates/analytics/app/global.css +15 -0
  7. package/corpus/templates/analytics/app/pages/Ask.tsx +1 -1
  8. package/corpus/templates/analytics/changelog/2026-06-26-the-ask-tab-uses-a-softer-dark-gray-canvas-while-sidebar-cha.md +6 -0
  9. package/corpus/templates/clips/app/components/library/library-layout.tsx +325 -333
  10. package/corpus/templates/clips/app/components/player/delete-recording-menu.tsx +80 -40
  11. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +44 -3
  12. package/corpus/templates/clips/app/routes/share.$shareId.tsx +10 -2
  13. package/corpus/templates/clips/changelog/2026-06-26-recording-details-button-stays-at-the-far-right-on-small-screen.md +6 -0
  14. package/corpus/templates/clips/changelog/2026-06-26-the-agent-sidebar-now-slides-in-smoothly-without-duplicate-e.md +6 -0
  15. package/corpus/templates/plan/app/components/plan/CanvasArea.tsx +56 -4
  16. package/corpus/templates/plan/app/global.css +8 -3
  17. package/corpus/templates/plan/app/pages/PlansPage.tsx +1 -1
  18. package/corpus/templates/plan/changelog/2026-06-26-canvas-grid-panning-now-stays-smooth-and-fills-the-workspace.md +6 -0
  19. package/dist/client/i18n.d.ts.map +1 -1
  20. package/dist/client/i18n.js +20 -9
  21. package/dist/client/i18n.js.map +1 -1
  22. package/dist/collab/routes.d.ts +1 -1
  23. package/dist/file-upload/actions/upload-image.d.ts +2 -2
  24. package/dist/notifications/routes.d.ts +2 -2
  25. package/dist/observability/routes.d.ts +8 -8
  26. package/dist/progress/routes.d.ts +1 -1
  27. package/dist/resources/handlers.d.ts +3 -3
  28. package/dist/server/agent-engine-api-key-route.d.ts +2 -2
  29. package/dist/server/transcribe-voice.d.ts +1 -1
  30. package/package.json +1 -1
@@ -233,370 +233,362 @@ export function LibraryLayout({ children }: LibraryLayoutProps) {
233
233
  ];
234
234
 
235
235
  return (
236
- <div className="flex h-screen overflow-hidden bg-background">
237
- <AgentSidebar
238
- position="right"
239
- defaultOpen={!isMobile}
240
- animateMobile={false}
241
- animateDesktop={false}
242
- emptyStateText={t("navigation.agentEmptyState")}
243
- suggestions={[
244
- t("navigation.agentSuggestionSummary"),
245
- t("navigation.agentSuggestionPricing"),
246
- t("navigation.agentSuggestionFiller"),
247
- ]}
248
- scope={recordingScope}
249
- browserTabId={getBrowserTabId()}
236
+ <div className="agent-layout-shell flex h-screen overflow-hidden bg-background">
237
+ {/* Mobile backdrop */}
238
+ {sidebarOpen && (
239
+ <div
240
+ className="fixed inset-0 z-40 bg-black/50 md:hidden"
241
+ onClick={() => setSidebarOpen(false)}
242
+ />
243
+ )}
244
+
245
+ {/* Left sidebar */}
246
+ <aside
247
+ className={cn(
248
+ "agent-layout-left-drawer fixed inset-y-0 start-0 z-50 flex h-full w-[260px] flex-col overflow-hidden border-e border-border bg-sidebar transition-[width,transform] duration-200 ease-out md:static md:z-auto",
249
+ showCollapsedSidebar && "md:w-14",
250
+ sidebarOpen
251
+ ? "translate-x-0"
252
+ : "-translate-x-full rtl:translate-x-full md:translate-x-0",
253
+ )}
250
254
  >
251
- <div className="agent-layout-shell flex h-full w-full">
252
- {/* Mobile backdrop */}
253
- {sidebarOpen && (
254
- <div
255
- className="fixed inset-0 z-40 bg-black/50 md:hidden"
256
- onClick={() => setSidebarOpen(false)}
257
- />
255
+ <div
256
+ className={cn(
257
+ "flex h-12 shrink-0 items-center border-b border-border",
258
+ showCollapsedSidebar ? "justify-center px-2" : "px-4",
258
259
  )}
259
-
260
- {/* Left sidebar */}
261
- <aside
260
+ >
261
+ <div
262
262
  className={cn(
263
- "agent-layout-left-drawer fixed inset-y-0 start-0 z-50 flex h-full w-[260px] flex-col overflow-hidden border-e border-border bg-sidebar transition-[width,transform] duration-200 ease-out md:static md:z-auto",
264
- showCollapsedSidebar && "md:w-14",
265
- sidebarOpen
266
- ? "translate-x-0"
267
- : "-translate-x-full rtl:translate-x-full md:translate-x-0",
263
+ "flex min-w-0 items-center gap-2",
264
+ !showCollapsedSidebar && "flex-1",
268
265
  )}
269
266
  >
270
- <div
271
- className={cn(
272
- "flex h-12 shrink-0 items-center border-b border-border",
273
- showCollapsedSidebar ? "justify-center px-2" : "px-4",
274
- )}
275
- >
276
- <div
277
- className={cn(
278
- "flex min-w-0 items-center gap-2",
279
- !showCollapsedSidebar && "flex-1",
280
- )}
267
+ {!showCollapsedSidebar && (
268
+ <>
269
+ <img
270
+ src={appPath("/agent-native-icon-light.svg")}
271
+ alt=""
272
+ aria-hidden="true"
273
+ className="block h-4 w-auto shrink-0 dark:hidden"
274
+ />
275
+ <img
276
+ src={appPath("/agent-native-icon-dark.svg")}
277
+ alt=""
278
+ aria-hidden="true"
279
+ className="hidden h-4 w-auto shrink-0 dark:block"
280
+ />
281
+ <span className="truncate text-sm font-semibold text-foreground">
282
+ {t("navigation.brand")}
283
+ </span>
284
+ </>
285
+ )}
286
+ </div>
287
+
288
+ <Tooltip>
289
+ <TooltipTrigger asChild>
290
+ <Button
291
+ type="button"
292
+ variant="ghost"
293
+ size="icon"
294
+ className="hidden h-7 w-7 shrink-0 text-muted-foreground hover:text-foreground md:inline-flex"
295
+ aria-label={
296
+ showCollapsedSidebar
297
+ ? t("navigation.expandSidebar")
298
+ : t("navigation.collapseSidebar")
299
+ }
300
+ aria-expanded={!showCollapsedSidebar}
301
+ onClick={() => setSidebarCollapsed((value) => !value)}
281
302
  >
282
- {!showCollapsedSidebar && (
283
- <>
284
- <img
285
- src={appPath("/agent-native-icon-light.svg")}
286
- alt=""
287
- aria-hidden="true"
288
- className="block h-4 w-auto shrink-0 dark:hidden"
289
- />
290
- <img
291
- src={appPath("/agent-native-icon-dark.svg")}
292
- alt=""
293
- aria-hidden="true"
294
- className="hidden h-4 w-auto shrink-0 dark:block"
295
- />
296
- <span className="truncate text-sm font-semibold text-foreground">
297
- {t("navigation.brand")}
298
- </span>
299
- </>
303
+ {showCollapsedSidebar ? (
304
+ <IconLayoutSidebarLeftExpand className="h-4 w-4" />
305
+ ) : (
306
+ <IconLayoutSidebarLeftCollapse className="h-4 w-4" />
300
307
  )}
308
+ </Button>
309
+ </TooltipTrigger>
310
+ <TooltipContent side="right">
311
+ {showCollapsedSidebar
312
+ ? t("navigation.expandSidebar")
313
+ : t("navigation.collapseSidebar")}
314
+ </TooltipContent>
315
+ </Tooltip>
316
+ </div>
317
+ <div className="min-h-0 flex-1 overflow-y-auto">
318
+ {showCollapsedSidebar ? (
319
+ <>
320
+ <div className="flex justify-center px-2 py-3">
321
+ <Tooltip>
322
+ <TooltipTrigger asChild>
323
+ <NavLink
324
+ to="/record"
325
+ aria-label={t("navigation.newRecording")}
326
+ className="flex h-9 w-9 items-center justify-center rounded-md bg-primary text-primary-foreground shadow-sm hover:bg-primary/90"
327
+ >
328
+ <IconPlayerRecord className="h-4 w-4" />
329
+ </NavLink>
330
+ </TooltipTrigger>
331
+ <TooltipContent side="right">
332
+ {t("navigation.newRecording")}
333
+ </TooltipContent>
334
+ </Tooltip>
301
335
  </div>
302
336
 
303
- <Tooltip>
304
- <TooltipTrigger asChild>
305
- <Button
306
- type="button"
307
- variant="ghost"
308
- size="icon"
309
- className="hidden h-7 w-7 shrink-0 text-muted-foreground hover:text-foreground md:inline-flex"
310
- aria-label={
311
- showCollapsedSidebar
312
- ? t("navigation.expandSidebar")
313
- : t("navigation.collapseSidebar")
314
- }
315
- aria-expanded={!showCollapsedSidebar}
316
- onClick={() => setSidebarCollapsed((value) => !value)}
317
- >
318
- {showCollapsedSidebar ? (
319
- <IconLayoutSidebarLeftExpand className="h-4 w-4" />
320
- ) : (
321
- <IconLayoutSidebarLeftCollapse className="h-4 w-4" />
322
- )}
323
- </Button>
324
- </TooltipTrigger>
325
- <TooltipContent side="right">
326
- {showCollapsedSidebar
327
- ? t("navigation.expandSidebar")
328
- : t("navigation.collapseSidebar")}
329
- </TooltipContent>
330
- </Tooltip>
331
- </div>
332
- <div className="min-h-0 flex-1 overflow-y-auto">
333
- {showCollapsedSidebar ? (
334
- <>
335
- <div className="flex justify-center px-2 py-3">
336
- <Tooltip>
337
+ <nav className="mt-3 flex flex-col items-center gap-1 px-2">
338
+ {navItems.map(({ to, label, icon: Icon, match }) => {
339
+ const active = match(location.pathname);
340
+ return (
341
+ <Tooltip key={to}>
337
342
  <TooltipTrigger asChild>
338
343
  <NavLink
339
- to="/record"
340
- aria-label={t("navigation.newRecording")}
341
- className="flex h-9 w-9 items-center justify-center rounded-md bg-primary text-primary-foreground shadow-sm hover:bg-primary/90"
344
+ to={to}
345
+ aria-label={label}
346
+ className={cn(
347
+ "flex h-9 w-9 items-center justify-center rounded-md text-muted-foreground hover:bg-accent/60 hover:text-foreground",
348
+ active &&
349
+ "bg-primary/10 text-primary hover:bg-primary/10 hover:text-primary",
350
+ )}
342
351
  >
343
- <IconPlayerRecord className="h-4 w-4" />
352
+ <Icon className="h-4 w-4" />
344
353
  </NavLink>
345
354
  </TooltipTrigger>
346
- <TooltipContent side="right">
347
- {t("navigation.newRecording")}
348
- </TooltipContent>
355
+ <TooltipContent side="right">{label}</TooltipContent>
349
356
  </Tooltip>
350
- </div>
357
+ );
358
+ })}
359
+ </nav>
360
+ </>
361
+ ) : (
362
+ <>
363
+ <div className="px-3 py-3">
364
+ <Button
365
+ className="w-full gap-1.5 bg-primary text-primary-foreground shadow-sm hover:bg-primary/90"
366
+ size="sm"
367
+ asChild
368
+ >
369
+ <NavLink to="/record">
370
+ <IconPlayerRecord className="h-4 w-4" />
371
+ {t("navigation.newRecording")}
372
+ </NavLink>
373
+ </Button>
374
+ </div>
351
375
 
352
- <nav className="mt-3 flex flex-col items-center gap-1 px-2">
353
- {navItems.map(({ to, label, icon: Icon, match }) => {
354
- const active = match(location.pathname);
355
- return (
356
- <Tooltip key={to}>
357
- <TooltipTrigger asChild>
358
- <NavLink
359
- to={to}
360
- aria-label={label}
361
- className={cn(
362
- "flex h-9 w-9 items-center justify-center rounded-md text-muted-foreground hover:bg-accent/60 hover:text-foreground",
363
- active &&
364
- "bg-primary/10 text-primary hover:bg-primary/10 hover:text-primary",
365
- )}
366
- >
367
- <Icon className="h-4 w-4" />
368
- </NavLink>
369
- </TooltipTrigger>
370
- <TooltipContent side="right">{label}</TooltipContent>
371
- </Tooltip>
372
- );
373
- })}
374
- </nav>
375
- </>
376
- ) : (
377
- <>
378
- <div className="px-3 py-3">
379
- <Button
380
- className="w-full gap-1.5 bg-primary text-primary-foreground shadow-sm hover:bg-primary/90"
381
- size="sm"
382
- asChild
376
+ <nav className="mt-3 space-y-0.5 px-2">
377
+ {navItems.map(({ to, label, icon: Icon, match, count }) => {
378
+ const active = match(location.pathname);
379
+ return (
380
+ <NavLink
381
+ key={to}
382
+ to={to}
383
+ className={cn(
384
+ "flex items-center gap-2 rounded px-2 py-1.5 text-xs",
385
+ active
386
+ ? "bg-primary/10 font-medium text-primary"
387
+ : "text-foreground hover:bg-accent/60",
388
+ )}
383
389
  >
384
- <NavLink to="/record">
385
- <IconPlayerRecord className="h-4 w-4" />
386
- {t("navigation.newRecording")}
387
- </NavLink>
388
- </Button>
389
- </div>
390
-
391
- <nav className="mt-3 space-y-0.5 px-2">
392
- {navItems.map(({ to, label, icon: Icon, match, count }) => {
393
- const active = match(location.pathname);
394
- return (
395
- <NavLink
396
- key={to}
397
- to={to}
390
+ <Icon className="h-4 w-4" />
391
+ <span className="flex-1 truncate">{label}</span>
392
+ {count !== undefined && count > 0 && (
393
+ <span
398
394
  className={cn(
399
- "flex items-center gap-2 rounded px-2 py-1.5 text-xs",
395
+ "shrink-0 tabular-nums text-[11px]",
400
396
  active
401
- ? "bg-primary/10 font-medium text-primary"
402
- : "text-foreground hover:bg-accent/60",
397
+ ? "text-primary/80"
398
+ : "text-muted-foreground",
403
399
  )}
404
400
  >
405
- <Icon className="h-4 w-4" />
406
- <span className="flex-1 truncate">{label}</span>
407
- {count !== undefined && count > 0 && (
408
- <span
409
- className={cn(
410
- "shrink-0 tabular-nums text-[11px]",
411
- active
412
- ? "text-primary/80"
413
- : "text-muted-foreground",
414
- )}
401
+ {count}
402
+ </span>
403
+ )}
404
+ </NavLink>
405
+ );
406
+ })}
407
+ </nav>
408
+
409
+ <div className="mt-4 space-y-4 px-2 pb-3">
410
+ <div>
411
+ <div className="flex items-center justify-between px-2 pb-1">
412
+ <span className="text-[10px] font-semibold uppercase tracking-wide text-muted-foreground">
413
+ {t("navigation.folders")}
414
+ </span>
415
+ <Tooltip>
416
+ <TooltipTrigger asChild>
417
+ <button
418
+ type="button"
419
+ aria-label={t("navigation.newFolder")}
420
+ className="rounded p-1 text-muted-foreground hover:bg-accent"
421
+ onClick={() => setNewFolderOpen(true)}
422
+ >
423
+ <IconFolderPlus className="h-3.5 w-3.5" />
424
+ </button>
425
+ </TooltipTrigger>
426
+ <TooltipContent>
427
+ {t("navigation.newFolder")}
428
+ </TooltipContent>
429
+ </Tooltip>
430
+ </div>
431
+ <FolderTree
432
+ folders={libFolderList}
433
+ organizationId={currentOrganizationId}
434
+ spaceId={null}
435
+ buildPath={(id) => `/library/folder/${id}`}
436
+ activeFolderId={folderId ?? null}
437
+ />
438
+ </div>
439
+
440
+ <div>
441
+ <div className="flex items-center justify-between px-2 pb-1">
442
+ <span className="text-[10px] font-semibold uppercase tracking-wide text-muted-foreground">
443
+ {t("navigation.spaces")}
444
+ </span>
445
+ <Tooltip>
446
+ <TooltipTrigger asChild>
447
+ <button
448
+ type="button"
449
+ aria-label={t("navigation.spaces")}
450
+ className="rounded p-1 text-muted-foreground hover:bg-accent"
451
+ onClick={() => setNewSpaceOpen(true)}
452
+ >
453
+ <IconPlus className="h-3.5 w-3.5" />
454
+ </button>
455
+ </TooltipTrigger>
456
+ <TooltipContent>{t("navigation.spaces")}</TooltipContent>
457
+ </Tooltip>
458
+ </div>
459
+ <ul className="space-y-0.5">
460
+ {(spaces?.spaces ?? []).map((s: any) => {
461
+ const active = spaceId === s.id;
462
+ return (
463
+ <li key={s.id}>
464
+ <NavLink
465
+ to={`/spaces/${s.id}`}
466
+ className={cn(
467
+ "flex items-center gap-2 rounded px-2 py-1 text-xs",
468
+ active
469
+ ? "bg-primary/10 text-primary"
470
+ : "text-foreground hover:bg-accent/60",
471
+ )}
472
+ >
473
+ <div
474
+ className="flex h-4 w-4 items-center justify-center rounded text-[10px]"
475
+ style={{
476
+ background: s.color ?? "hsl(var(--primary))",
477
+ color: "white",
478
+ }}
415
479
  >
416
- {count}
417
- </span>
418
- )}
419
- </NavLink>
480
+ {s.iconEmoji ?? s.name.slice(0, 1).toUpperCase()}
481
+ </div>
482
+ <span className="truncate">{s.name}</span>
483
+ </NavLink>
484
+ </li>
420
485
  );
421
486
  })}
422
- </nav>
487
+ {(spaces?.spaces ?? []).length === 0 && (
488
+ <li className="px-2 py-1 text-[11px] text-muted-foreground/70">
489
+ {t("navigation.noSpaces")}
490
+ </li>
491
+ )}
492
+ </ul>
493
+ </div>
494
+ </div>
495
+ </>
496
+ )}
497
+ </div>
423
498
 
424
- <div className="mt-4 space-y-4 px-2 pb-3">
425
- <div>
426
- <div className="flex items-center justify-between px-2 pb-1">
427
- <span className="text-[10px] font-semibold uppercase tracking-wide text-muted-foreground">
428
- {t("navigation.folders")}
429
- </span>
430
- <Tooltip>
431
- <TooltipTrigger asChild>
432
- <button
433
- type="button"
434
- aria-label={t("navigation.newFolder")}
435
- className="rounded p-1 text-muted-foreground hover:bg-accent"
436
- onClick={() => setNewFolderOpen(true)}
437
- >
438
- <IconFolderPlus className="h-3.5 w-3.5" />
439
- </button>
440
- </TooltipTrigger>
441
- <TooltipContent>
442
- {t("navigation.newFolder")}
443
- </TooltipContent>
444
- </Tooltip>
445
- </div>
446
- <FolderTree
447
- folders={libFolderList}
448
- organizationId={currentOrganizationId}
449
- spaceId={null}
450
- buildPath={(id) => `/library/folder/${id}`}
451
- activeFolderId={folderId ?? null}
452
- />
453
- </div>
454
-
455
- <div>
456
- <div className="flex items-center justify-between px-2 pb-1">
457
- <span className="text-[10px] font-semibold uppercase tracking-wide text-muted-foreground">
458
- {t("navigation.spaces")}
459
- </span>
460
- <Tooltip>
461
- <TooltipTrigger asChild>
462
- <button
463
- type="button"
464
- aria-label={t("navigation.spaces")}
465
- className="rounded p-1 text-muted-foreground hover:bg-accent"
466
- onClick={() => setNewSpaceOpen(true)}
467
- >
468
- <IconPlus className="h-3.5 w-3.5" />
469
- </button>
470
- </TooltipTrigger>
471
- <TooltipContent>
472
- {t("navigation.spaces")}
473
- </TooltipContent>
474
- </Tooltip>
475
- </div>
476
- <ul className="space-y-0.5">
477
- {(spaces?.spaces ?? []).map((s: any) => {
478
- const active = spaceId === s.id;
479
- return (
480
- <li key={s.id}>
481
- <NavLink
482
- to={`/spaces/${s.id}`}
483
- className={cn(
484
- "flex items-center gap-2 rounded px-2 py-1 text-xs",
485
- active
486
- ? "bg-primary/10 text-primary"
487
- : "text-foreground hover:bg-accent/60",
488
- )}
489
- >
490
- <div
491
- className="flex h-4 w-4 items-center justify-center rounded text-[10px]"
492
- style={{
493
- background:
494
- s.color ?? "hsl(var(--primary))",
495
- color: "white",
496
- }}
497
- >
498
- {s.iconEmoji ??
499
- s.name.slice(0, 1).toUpperCase()}
500
- </div>
501
- <span className="truncate">{s.name}</span>
502
- </NavLink>
503
- </li>
504
- );
505
- })}
506
- {(spaces?.spaces ?? []).length === 0 && (
507
- <li className="px-2 py-1 text-[11px] text-muted-foreground/70">
508
- {t("navigation.noSpaces")}
509
- </li>
510
- )}
511
- </ul>
512
- </div>
513
- </div>
514
- </>
499
+ {!showCollapsedSidebar && (
500
+ <>
501
+ <div className="shrink-0 space-y-1.5 border-t border-border px-2 py-1.5">
502
+ {shouldShowSidebarLink && (
503
+ <CaptureInstallInlineLink className="flex items-center gap-2 rounded px-2 py-1.5 text-xs text-foreground hover:bg-accent/60">
504
+ <IconAppWindow className="h-4 w-4" />
505
+ {t("navigation.desktopCta")}
506
+ </CaptureInstallInlineLink>
515
507
  )}
508
+ <SearchBar />
516
509
  </div>
517
510
 
518
- {!showCollapsedSidebar && (
519
- <>
520
- <div className="shrink-0 space-y-1.5 border-t border-border px-2 py-1.5">
521
- {shouldShowSidebarLink && (
522
- <CaptureInstallInlineLink className="flex items-center gap-2 rounded px-2 py-1.5 text-xs text-foreground hover:bg-accent/60">
523
- <IconAppWindow className="h-4 w-4" />
524
- {t("navigation.desktopCta")}
525
- </CaptureInstallInlineLink>
526
- )}
527
- <SearchBar />
528
- </div>
511
+ <div className="shrink-0 border-t border-border px-1 py-1">
512
+ <ExtensionsSidebarSection />
513
+ </div>
529
514
 
530
- <div className="shrink-0 border-t border-border px-1 py-1">
531
- <ExtensionsSidebarSection />
532
- </div>
515
+ <div className="shrink-0 space-y-2 border-t border-border px-3 py-2">
516
+ <OrgSwitcher settingsPath="/settings/organization" />
517
+ <DevDatabaseLink />
518
+ <FeedbackButton />
519
+ </div>
520
+ </>
521
+ )}
522
+ </aside>
533
523
 
534
- <div className="shrink-0 space-y-2 border-t border-border px-3 py-2">
535
- <OrgSwitcher settingsPath="/settings/organization" />
536
- <DevDatabaseLink />
537
- <FeedbackButton />
538
- </div>
539
- </>
540
- )}
541
- </aside>
542
-
543
- {/* Main content area */}
544
- <div className="agent-layout-main-surface flex min-w-0 flex-1 flex-col">
545
- {!pageOwnsToolbar && (
546
- <header className="flex shrink-0 items-center gap-3 border-b border-border px-5 py-3">
547
- <button
548
- onClick={() => setSidebarOpen(true)}
549
- className="flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-background text-muted-foreground hover:text-foreground md:hidden"
550
- >
551
- <IconMenu2 className="h-4 w-4" />
552
- </button>
553
- <div
554
- ref={setHeaderSlot}
555
- className="flex min-w-0 flex-1 items-center gap-3 overflow-hidden"
556
- />
557
- <div className="ms-auto flex items-center gap-2">
558
- <ClipsAgentToggleButton />
559
- </div>
560
- </header>
561
- )}
562
- <InvitationBanner />
563
- {shouldShowPromo && (
564
- <div className="flex items-center gap-3 border-b border-border bg-primary/5 px-5 py-2.5 text-sm">
565
- <IconAppWindow className="h-4 w-4 shrink-0 text-primary" />
566
- <div className="min-w-0 flex-1">
567
- <span className="font-medium">
568
- {t("navigation.desktopTitle")}
569
- </span>{" "}
570
- <span className="text-muted-foreground">
571
- {t("navigation.desktopBody")}
572
- </span>
573
- </div>
574
- <CaptureInstallButton size="sm" className="shrink-0">
575
- Download
576
- </CaptureInstallButton>
577
- <Tooltip>
578
- <TooltipTrigger asChild>
579
- <Button
580
- variant="ghost"
581
- size="icon"
582
- className="h-7 w-7 shrink-0 text-muted-foreground hover:text-foreground"
583
- onClick={dismiss}
584
- >
585
- <IconX className="h-4 w-4" />
586
- </Button>
587
- </TooltipTrigger>
588
- <TooltipContent>
589
- {t("clipsFinalRaw.alreadyHaveIt")}
590
- </TooltipContent>
591
- </Tooltip>
524
+ <AgentSidebar
525
+ position="right"
526
+ defaultOpen={!isMobile}
527
+ emptyStateText={t("navigation.agentEmptyState")}
528
+ suggestions={[
529
+ t("navigation.agentSuggestionSummary"),
530
+ t("navigation.agentSuggestionPricing"),
531
+ t("navigation.agentSuggestionFiller"),
532
+ ]}
533
+ scope={recordingScope}
534
+ browserTabId={getBrowserTabId()}
535
+ >
536
+ {/* Main content area */}
537
+ <div className="flex min-w-0 flex-1 flex-col">
538
+ {!pageOwnsToolbar && (
539
+ <header className="flex shrink-0 items-center gap-3 border-b border-border px-5 py-3">
540
+ <button
541
+ onClick={() => setSidebarOpen(true)}
542
+ className="flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-background text-muted-foreground hover:text-foreground md:hidden"
543
+ >
544
+ <IconMenu2 className="h-4 w-4" />
545
+ </button>
546
+ <div
547
+ ref={setHeaderSlot}
548
+ className="flex min-w-0 flex-1 items-center gap-3 overflow-hidden"
549
+ />
550
+ <div className="ms-auto flex items-center gap-2">
551
+ <ClipsAgentToggleButton />
592
552
  </div>
593
- )}
594
- <main className="flex min-h-0 flex-1 flex-col overflow-y-auto">
595
- <PageHeaderSlotProvider slot={headerSlot}>
596
- {children}
597
- </PageHeaderSlotProvider>
598
- </main>
599
- </div>
553
+ </header>
554
+ )}
555
+ <InvitationBanner />
556
+ {shouldShowPromo && (
557
+ <div className="flex items-center gap-3 border-b border-border bg-primary/5 px-5 py-2.5 text-sm">
558
+ <IconAppWindow className="h-4 w-4 shrink-0 text-primary" />
559
+ <div className="min-w-0 flex-1">
560
+ <span className="font-medium">
561
+ {t("navigation.desktopTitle")}
562
+ </span>{" "}
563
+ <span className="text-muted-foreground">
564
+ {t("navigation.desktopBody")}
565
+ </span>
566
+ </div>
567
+ <CaptureInstallButton size="sm" className="shrink-0">
568
+ Download
569
+ </CaptureInstallButton>
570
+ <Tooltip>
571
+ <TooltipTrigger asChild>
572
+ <Button
573
+ variant="ghost"
574
+ size="icon"
575
+ className="h-7 w-7 shrink-0 text-muted-foreground hover:text-foreground"
576
+ onClick={dismiss}
577
+ >
578
+ <IconX className="h-4 w-4" />
579
+ </Button>
580
+ </TooltipTrigger>
581
+ <TooltipContent>
582
+ {t("clipsFinalRaw.alreadyHaveIt")}
583
+ </TooltipContent>
584
+ </Tooltip>
585
+ </div>
586
+ )}
587
+ <main className="flex min-h-0 flex-1 flex-col overflow-y-auto">
588
+ <PageHeaderSlotProvider slot={headerSlot}>
589
+ {children}
590
+ </PageHeaderSlotProvider>
591
+ </main>
600
592
  </div>
601
593
  </AgentSidebar>
602
594