@agent-native/core 0.135.1 → 0.135.3

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 (33) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +12 -0
  3. package/corpus/core/docs/content/getting-started-actions.mdx +235 -0
  4. package/corpus/core/docs/content/getting-started-database.mdx +253 -0
  5. package/corpus/core/docs/content/getting-started-pages.mdx +190 -0
  6. package/corpus/core/docs/content/getting-started.mdx +57 -613
  7. package/corpus/core/docs/content/what-is-agent-native.mdx +155 -298
  8. package/corpus/core/package.json +1 -1
  9. package/corpus/templates/clips/actions/add-comment.ts +6 -2
  10. package/corpus/templates/clips/app/components/player/comments-panel.tsx +9 -2
  11. package/corpus/templates/clips/app/components/player/playback-comment-overlay.tsx +44 -27
  12. package/corpus/templates/clips/app/components/player/scrubber.tsx +10 -2
  13. package/corpus/templates/clips/app/components/player/video-player.tsx +4 -0
  14. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +22 -15
  15. package/corpus/templates/clips/app/routes/share.$shareId.tsx +1 -0
  16. package/corpus/templates/content/app/components/editor/database/sidebar.tsx +23 -10
  17. package/corpus/templates/content/app/components/sidebar/DocumentTreeItem.tsx +20 -9
  18. package/corpus/templates/content/app/components/sidebar/document-sidebar-actions.ts +31 -0
  19. package/corpus/templates/content/changelog/2026-07-26-viewers-can-favorite-shared-pages.md +6 -0
  20. package/dist/collab/routes.d.ts +1 -1
  21. package/dist/collab/struct-routes.d.ts +1 -1
  22. package/dist/notifications/routes.d.ts +2 -2
  23. package/dist/progress/routes.d.ts +1 -1
  24. package/dist/resources/handlers.d.ts +1 -1
  25. package/dist/secrets/routes.d.ts +9 -9
  26. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  27. package/dist/server/realtime-token.d.ts +1 -1
  28. package/docs/content/getting-started-actions.mdx +235 -0
  29. package/docs/content/getting-started-database.mdx +253 -0
  30. package/docs/content/getting-started-pages.mdx +190 -0
  31. package/docs/content/getting-started.mdx +57 -613
  32. package/docs/content/what-is-agent-native.mdx +155 -298
  33. package/package.json +1 -1
@@ -1,4 +1,9 @@
1
- export const PLAYBACK_COMMENT_VISIBLE_MS = 4_000;
1
+ import { useAvatarUrl } from "@agent-native/core/client/hooks";
2
+
3
+ import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar";
4
+ import { cn } from "@/lib/utils";
5
+
6
+ export const PLAYBACK_COMMENT_VISIBLE_MS = 1_000;
2
7
 
3
8
  export function getPlaybackCommentVisibleMs(playbackRate = 1): number {
4
9
  const safePlaybackRate =
@@ -50,50 +55,62 @@ export function PlaybackCommentOverlay({
50
55
  comments,
51
56
  currentMs,
52
57
  playbackRate = 1,
58
+ onClick,
53
59
  }: {
54
60
  comments: PlaybackComment[] | undefined;
55
61
  currentMs: number;
56
62
  playbackRate?: number;
63
+ onClick?: () => void;
57
64
  }) {
58
65
  const activeComments = getActivePlaybackComments(
59
66
  comments,
60
67
  currentMs,
61
68
  playbackRate,
62
69
  );
70
+ const avatarUrl = useAvatarUrl(activeComments[0]?.authorEmail);
63
71
  if (activeComments.length === 0) return null;
64
72
 
73
+ const [comment, ...rest] = activeComments;
74
+ const author = displayAuthor(comment);
75
+ const Card = (onClick ? "button" : "div") as "button" | "div";
76
+
65
77
  return (
66
78
  <div
67
79
  data-player-ui
68
80
  className="pointer-events-none absolute inset-x-3 bottom-[5.25rem] z-20 flex justify-center sm:inset-x-6"
69
81
  aria-live="polite"
70
82
  >
71
- <div className="flex w-full max-w-xl flex-col items-center gap-2">
72
- {activeComments.map((comment) => {
73
- const author = displayAuthor(comment);
74
- return (
75
- <div
76
- key={comment.id}
77
- className="animate-in fade-in slide-in-from-bottom-2 flex max-w-full items-start gap-2.5 rounded-xl bg-black/85 px-3 py-2.5 text-white shadow-2xl ring-1 ring-white/15 backdrop-blur-md duration-200"
78
- >
79
- <span
80
- aria-hidden="true"
81
- className="flex size-7 shrink-0 items-center justify-center rounded-full bg-white/15 text-[10px] font-semibold text-white"
82
- >
83
- {initials(author)}
84
- </span>
85
- <div className="min-w-0">
86
- <p className="truncate text-xs font-semibold text-white/80">
87
- {author}
88
- </p>
89
- <p className="line-clamp-3 break-words text-sm leading-5 text-white">
90
- {comment.content}
91
- </p>
92
- </div>
93
- </div>
94
- );
95
- })}
96
- </div>
83
+ <Card
84
+ key={comment.id}
85
+ type={onClick ? "button" : undefined}
86
+ onClick={onClick}
87
+ className={cn(
88
+ "animate-in fade-in slide-in-from-bottom-2 flex w-full max-w-xl flex-col gap-1.5 rounded-xl bg-black/85 px-3 py-2.5 text-left text-white shadow-2xl ring-1 ring-white/15 backdrop-blur-md duration-200",
89
+ onClick && "pointer-events-auto cursor-pointer hover:bg-black/95",
90
+ )}
91
+ >
92
+ <div className="flex max-w-full items-start gap-2.5">
93
+ <Avatar aria-hidden="true" className="size-7 shrink-0">
94
+ {avatarUrl ? <AvatarImage src={avatarUrl} alt={author} /> : null}
95
+ <AvatarFallback className="bg-white/15 text-[10px] font-semibold text-white">
96
+ {initials(author)}
97
+ </AvatarFallback>
98
+ </Avatar>
99
+ <div className="min-w-0">
100
+ <p className="truncate text-xs font-semibold text-white/80">
101
+ {author}
102
+ </p>
103
+ <p className="line-clamp-3 break-words text-sm leading-5 text-white">
104
+ {comment.content}
105
+ </p>
106
+ </div>
107
+ </div>
108
+ {rest.length > 0 && (
109
+ <p className="pl-[2.375rem] text-xs text-white/60">
110
+ +{rest.length} other comment{rest.length > 1 ? "s" : ""}
111
+ </p>
112
+ )}
113
+ </Card>
97
114
  </div>
98
115
  );
99
116
  }
@@ -1,3 +1,4 @@
1
+ import { IconMessage2Filled } from "@tabler/icons-react";
1
2
  import { useMemo, useRef, useState } from "react";
2
3
 
3
4
  import { cn } from "@/lib/utils";
@@ -225,10 +226,17 @@ export function Scrubber(props: ScrubberProps) {
225
226
  e.stopPropagation();
226
227
  onSeek(ms);
227
228
  }}
228
- className="absolute -top-1 -translate-x-1/2 h-3.5 w-3.5 rounded-full bg-yellow-400 border-2 border-black/50 hover:scale-125 transition-transform"
229
+ className="absolute top-1/2 -translate-x-1/2 -translate-y-1/2 flex h-4 w-4 items-center justify-center rounded-full bg-primary text-primary-foreground shadow-md ring-2 ring-background transition-transform hover:scale-125"
229
230
  style={{ left: (ms / Math.max(1, durationMs)) * 100 + "%" }}
230
231
  aria-label={`${list.length} comment${list.length > 1 ? "s" : ""}`}
231
- />
232
+ >
233
+ <IconMessage2Filled className="h-2.5 w-2.5" />
234
+ {list.length > 1 && (
235
+ <span className="absolute -top-1.5 -right-1.5 flex h-3.5 min-w-3.5 items-center justify-center rounded-full bg-primary px-0.5 text-[8px] font-bold leading-none text-primary-foreground ring-2 ring-background">
236
+ {list.length}
237
+ </span>
238
+ )}
239
+ </button>
232
240
  ))}
233
241
 
234
242
  {/* Reaction dots */}
@@ -218,6 +218,8 @@ export interface VideoPlayerProps {
218
218
  * lifecycle instead of polling an imperative-handle getter.
219
219
  */
220
220
  onVideoElementChange?: (video: HTMLVideoElement | null) => void;
221
+ /** Called when the viewer clicks the timestamped-comment overlay. */
222
+ onCommentClick?: () => void;
221
223
  }
222
224
 
223
225
  export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
@@ -255,6 +257,7 @@ export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
255
257
  recordingId,
256
258
  role,
257
259
  onVideoElementChange,
260
+ onCommentClick,
258
261
  } = props;
259
262
 
260
263
  const resolvedVideoSrc = useMemo(
@@ -1651,6 +1654,7 @@ export const VideoPlayer = forwardRef<VideoPlayerHandle, VideoPlayerProps>(
1651
1654
  comments={comments}
1652
1655
  currentMs={currentMs}
1653
1656
  playbackRate={speed}
1657
+ onClick={onCommentClick}
1654
1658
  />
1655
1659
  ) : null}
1656
1660
 
@@ -261,15 +261,26 @@ export default function RecordingPage() {
261
261
  // The compact layout stacks the panel below the video, so switching tabs
262
262
  // alone leaves the user looking at the player. Desktop always renders the
263
263
  // side aside, so nothing to scroll there.
264
- const openInsightsPanel = useCallback(() => {
265
- setPanel("insights");
266
- if (!isCompactLayout) return;
267
- requestAnimationFrame(() => {
268
- document
269
- .getElementById("clip-activity-panel")
270
- ?.scrollIntoView({ block: "start" });
271
- });
272
- }, [isCompactLayout]);
264
+ const openSidePanel = useCallback(
265
+ (next: SidePanel) => {
266
+ setPanel(next);
267
+ if (!isCompactLayout) return;
268
+ requestAnimationFrame(() => {
269
+ document
270
+ .getElementById("clip-activity-panel")
271
+ ?.scrollIntoView({ block: "start" });
272
+ });
273
+ },
274
+ [isCompactLayout],
275
+ );
276
+ const openInsightsPanel = useCallback(
277
+ () => openSidePanel("insights"),
278
+ [openSidePanel],
279
+ );
280
+ const openCommentsPanel = useCallback(
281
+ () => openSidePanel("comments"),
282
+ [openSidePanel],
283
+ );
273
284
  const transcriptKickedRef = useRef<string | null>(null);
274
285
  // When the recording lands in the processing state but never flips to
275
286
  // 'ready', stop spinning forever and surface an error banner so the user
@@ -1608,6 +1619,7 @@ export default function RecordingPage() {
1608
1619
  cta={firstCta}
1609
1620
  onCtaClick={() => tracking.reportCtaClick()}
1610
1621
  onTimeUpdate={(ms) => setCurrentMs(ms)}
1622
+ onCommentClick={openCommentsPanel}
1611
1623
  className="h-full w-full rounded-none sm:rounded-xl"
1612
1624
  />
1613
1625
  {commentOpen ? (
@@ -1667,12 +1679,7 @@ export default function RecordingPage() {
1667
1679
  className="shrink-0"
1668
1680
  onOpen={() => {
1669
1681
  if (isCompactLayout) {
1670
- setPanel("comments");
1671
- requestAnimationFrame(() => {
1672
- document
1673
- .getElementById("clip-activity-panel")
1674
- ?.scrollIntoView({ block: "start" });
1675
- });
1682
+ openCommentsPanel();
1676
1683
  return;
1677
1684
  }
1678
1685
  setCommentAtMs(resolvePlaybackMs());
@@ -997,6 +997,7 @@ export default function ShareRoute() {
997
997
  cta={firstCta}
998
998
  onCtaClick={() => tracking.reportCtaClick()}
999
999
  onTimeUpdate={(ms) => setCurrentMs(ms)}
1000
+ onCommentClick={() => setPanel("comments")}
1000
1001
  className="h-full w-full rounded-none sm:rounded-xl"
1001
1002
  />
1002
1003
  </div>
@@ -21,6 +21,7 @@ import {
21
21
  import { useEffect, useState, type MouseEvent, type ReactNode } from "react";
22
22
  import { Link } from "react-router";
23
23
 
24
+ import { documentSidebarActionAvailability } from "@/components/sidebar/document-sidebar-actions";
24
25
  import { Button } from "@/components/ui/button";
25
26
  import {
26
27
  Collapsible,
@@ -717,14 +718,12 @@ function DatabaseSidebarRow({
717
718
  };
718
719
  }) {
719
720
  const t = useT();
720
- const canEdit = item.document.canEdit !== false;
721
- const canManage =
722
- item.document.canManage === true ||
723
- item.document.accessRole === "owner" ||
724
- item.document.accessRole === "admin";
721
+ const { canEdit, canManage, canFavorite, hasMenuActions } =
722
+ documentSidebarActionAvailability(item.document, {
723
+ favoriteAvailable: Boolean(onToggleFavorite),
724
+ manageAvailable: Boolean(onDeleteItem),
725
+ });
725
726
  const canCreateChild = canEdit && Boolean(onCreateChildPage);
726
- const hasMenuActions =
727
- Boolean(onToggleFavorite) || (canManage && Boolean(onDeleteItem));
728
727
  function handleClick(event: MouseEvent<HTMLAnchorElement>) {
729
728
  if (
730
729
  event.defaultPrevented ||
@@ -828,7 +827,7 @@ function DatabaseSidebarRow({
828
827
  </button>
829
828
  </DropdownMenuTrigger>
830
829
  <DropdownMenuContent align="start" className="w-48">
831
- {onToggleFavorite ? (
830
+ {canFavorite && onToggleFavorite ? (
832
831
  <DropdownMenuItem onSelect={() => onToggleFavorite(item)}>
833
832
  <IconStar
834
833
  className={cn(
@@ -841,7 +840,10 @@ function DatabaseSidebarRow({
841
840
  : t("sidebar.pinToSidebar")}
842
841
  </DropdownMenuItem>
843
842
  ) : null}
844
- {onToggleFavorite && canManage && onDeleteItem ? (
843
+ {canFavorite &&
844
+ onToggleFavorite &&
845
+ canManage &&
846
+ onDeleteItem ? (
845
847
  <DropdownMenuSeparator />
846
848
  ) : null}
847
849
  {canManage && onDeleteItem ? (
@@ -857,7 +859,7 @@ function DatabaseSidebarRow({
857
859
  </DropdownMenu>
858
860
  )}
859
861
 
860
- {canCreateChild && (
862
+ {canCreateChild ? (
861
863
  <DropdownMenu>
862
864
  <Tooltip>
863
865
  <TooltipTrigger asChild>
@@ -866,6 +868,7 @@ function DatabaseSidebarRow({
866
868
  type="button"
867
869
  className="flex size-6 items-center justify-center rounded text-foreground hover:bg-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
868
870
  aria-label={t("sidebar.addChildTo", { title })}
871
+ data-sidebar-add-child
869
872
  >
870
873
  <IconPlus size={14} />
871
874
  </button>
@@ -888,6 +891,16 @@ function DatabaseSidebarRow({
888
891
  ) : null}
889
892
  </DropdownMenuContent>
890
893
  </DropdownMenu>
894
+ ) : (
895
+ <button
896
+ type="button"
897
+ className="flex size-6 cursor-not-allowed items-center justify-center rounded text-muted-foreground/50"
898
+ aria-label={t("sidebar.addChildTo", { title })}
899
+ data-sidebar-add-child
900
+ disabled
901
+ >
902
+ <IconPlus size={14} />
903
+ </button>
891
904
  )}
892
905
  </div>
893
906
  )}
@@ -33,6 +33,8 @@ import {
33
33
  } from "@/components/ui/tooltip";
34
34
  import { cn } from "@/lib/utils";
35
35
 
36
+ import { documentSidebarActionAvailability } from "./document-sidebar-actions";
37
+
36
38
  interface DocumentTreeItemProps {
37
39
  node: DocumentTreeNode;
38
40
  depth: number;
@@ -97,12 +99,8 @@ export function DocumentTreeItem({
97
99
  const isActive = node.id === activeId;
98
100
  const isLocalFileNode = node.source?.mode === "local-files";
99
101
  const isLocalFolder = isLocalFileNode && node.source?.kind === "folder";
100
- const canEdit = node.canEdit !== false;
101
- const canManage =
102
- node.canManage === true ||
103
- node.accessRole === "owner" ||
104
- node.accessRole === "admin";
105
- const hasMenuActions = canEdit || canManage;
102
+ const { canEdit, canManage, canFavorite, hasMenuActions } =
103
+ documentSidebarActionAvailability(node, { favoriteAvailable: true });
106
104
  const canCreateChild = canEdit && !isLocalFileNode;
107
105
  const [contextSheetOpen, setContextSheetOpen] = useState(false);
108
106
  const indent = depth * 12 + 12;
@@ -224,7 +222,7 @@ export function DocumentTreeItem({
224
222
  </button>
225
223
  </DropdownMenuTrigger>
226
224
  <DropdownMenuContent align="start" className="w-48">
227
- {canEdit && (
225
+ {canFavorite && (
228
226
  <DropdownMenuItem
229
227
  onClick={(e) => {
230
228
  e.stopPropagation();
@@ -240,7 +238,7 @@ export function DocumentTreeItem({
240
238
  : t("sidebar.pinToSidebar")}
241
239
  </DropdownMenuItem>
242
240
  )}
243
- {canEdit && canManage && <DropdownMenuSeparator />}
241
+ {canFavorite && canManage && <DropdownMenuSeparator />}
244
242
  {canEdit && !isLocalFileNode && (
245
243
  <DropdownMenuItem
246
244
  onSelect={(event) => {
@@ -269,7 +267,7 @@ export function DocumentTreeItem({
269
267
  </DropdownMenu>
270
268
  )}
271
269
 
272
- {canCreateChild && (
270
+ {canCreateChild ? (
273
271
  <DropdownMenu>
274
272
  <Tooltip>
275
273
  <TooltipTrigger asChild>
@@ -280,6 +278,7 @@ export function DocumentTreeItem({
280
278
  aria-label={t("sidebar.addChildTo", {
281
279
  title: node.title || t("sidebar.untitled"),
282
280
  })}
281
+ data-sidebar-add-child
283
282
  onClick={(e) => e.stopPropagation()}
284
283
  >
285
284
  <IconPlus size={14} />
@@ -309,6 +308,18 @@ export function DocumentTreeItem({
309
308
  </DropdownMenuItem>
310
309
  </DropdownMenuContent>
311
310
  </DropdownMenu>
311
+ ) : (
312
+ <button
313
+ type="button"
314
+ className="flex h-7 w-7 cursor-not-allowed items-center justify-center rounded text-muted-foreground/50"
315
+ aria-label={t("sidebar.addChildTo", {
316
+ title: node.title || t("sidebar.untitled"),
317
+ })}
318
+ data-sidebar-add-child
319
+ disabled
320
+ >
321
+ <IconPlus size={14} />
322
+ </button>
312
323
  )}
313
324
  </div>
314
325
  </div>
@@ -0,0 +1,31 @@
1
+ import type { Document } from "@shared/api";
2
+
3
+ type SidebarDocumentAccess = Pick<
4
+ Document,
5
+ "accessRole" | "canEdit" | "canManage"
6
+ >;
7
+
8
+ export function documentSidebarActionAvailability(
9
+ document: SidebarDocumentAccess,
10
+ {
11
+ favoriteAvailable,
12
+ manageAvailable = true,
13
+ }: {
14
+ favoriteAvailable: boolean;
15
+ manageAvailable?: boolean;
16
+ },
17
+ ) {
18
+ const canEdit = document.canEdit !== false;
19
+ const canManage =
20
+ document.canManage === true ||
21
+ document.accessRole === "owner" ||
22
+ document.accessRole === "admin";
23
+ const canFavorite = favoriteAvailable;
24
+
25
+ return {
26
+ canEdit,
27
+ canManage,
28
+ canFavorite,
29
+ hasMenuActions: canFavorite || (canManage && manageAvailable),
30
+ };
31
+ }
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-26
4
+ ---
5
+
6
+ View-only collaborators can pin or unpin shared pages while the unavailable add-child control stays aligned and visibly disabled.
@@ -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
- ok?: undefined;
17
16
  error: string;
17
+ ok?: undefined;
18
18
  } | {
19
19
  error?: undefined;
20
20
  ok: boolean;
@@ -13,12 +13,12 @@
13
13
  export declare function createNotificationsHandler(): import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<"" | import("./types.js").Notification[] | {
14
14
  count: number;
15
15
  updated?: undefined;
16
- error?: undefined;
17
16
  ok?: undefined;
17
+ error?: undefined;
18
18
  } | {
19
19
  updated: number;
20
- error?: undefined;
21
20
  ok?: undefined;
21
+ error?: undefined;
22
22
  count?: undefined;
23
23
  } | {
24
24
  updated?: undefined;
@@ -15,7 +15,7 @@ export declare function createProgressHandler(): import("h3").EventHandlerWithFe
15
15
  error: string;
16
16
  ok?: undefined;
17
17
  } | {
18
- error?: undefined;
19
18
  ok: boolean;
19
+ error?: undefined;
20
20
  }>>;
21
21
  //# sourceMappingURL=routes.d.ts.map
@@ -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;
@@ -34,37 +34,37 @@ export declare function createListSecretsHandler(): import("h3").EventHandlerWit
34
34
  /** POST /_agent-native/secrets/:key — write a secret. */
35
35
  export declare function createWriteSecretHandler(): import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
36
36
  error: string;
37
- ok?: undefined;
38
37
  status?: undefined;
38
+ ok?: undefined;
39
39
  } | {
40
- error?: undefined;
41
40
  ok: boolean;
42
41
  status: string;
42
+ error?: undefined;
43
43
  } | {
44
- ok?: undefined;
45
44
  error: string;
46
45
  removed?: undefined;
46
+ ok?: undefined;
47
47
  } | {
48
- error?: undefined;
49
48
  ok: boolean;
50
49
  removed: boolean;
50
+ error?: undefined;
51
51
  }>>;
52
52
  /**
53
53
  * POST /_agent-native/secrets/:key/test — re-run the validator against the
54
54
  * current stored value without changing anything. Useful for the "Test" button.
55
55
  */
56
56
  export declare function createTestSecretHandler(): import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
57
- ok?: undefined;
58
57
  error: string;
59
58
  note?: undefined;
59
+ ok?: undefined;
60
60
  } | {
61
- error?: undefined;
62
61
  ok: boolean;
63
62
  note?: undefined;
64
- } | {
65
63
  error?: undefined;
64
+ } | {
66
65
  ok: boolean;
67
66
  note: string;
67
+ error?: undefined;
68
68
  } | {
69
69
  note?: undefined;
70
70
  ok: boolean;
@@ -95,12 +95,12 @@ export interface AdHocSecretPayload {
95
95
  export declare function createAdHocSecretHandler(): import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<AdHocSecretPayload[] | {
96
96
  error: string;
97
97
  } | {
98
- error?: undefined;
99
98
  ok: boolean;
100
99
  key: string;
101
- } | {
102
100
  error?: undefined;
101
+ } | {
103
102
  ok: boolean;
104
103
  removed: boolean;
104
+ error?: undefined;
105
105
  }>>;
106
106
  //# sourceMappingURL=routes.d.ts.map
@@ -27,11 +27,11 @@ export declare function resolveAgentEngineApiKeyWriteTarget(event: H3Event, scop
27
27
  export declare function createAgentEngineApiKeyHandler(): import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
28
28
  error: any;
29
29
  } | {
30
+ error?: undefined;
30
31
  ok: boolean;
31
32
  key: string;
32
33
  baseUrlKey?: string;
33
34
  scope: AgentEngineApiKeyScope;
34
- error?: undefined;
35
35
  }>>;
36
36
  export {};
37
37
  //# sourceMappingURL=agent-engine-api-key-route.d.ts.map
@@ -26,9 +26,9 @@ export declare function createRealtimeTokenHandler(): import("h3").EventHandlerW
26
26
  expiresAt?: undefined;
27
27
  ttlSeconds?: undefined;
28
28
  } | {
29
+ error?: undefined;
29
30
  token: string;
30
31
  expiresAt: string;
31
32
  ttlSeconds: number;
32
- error?: undefined;
33
33
  }>>;
34
34
  //# sourceMappingURL=realtime-token.d.ts.map