@agent-native/core-corpus 0.209.2 → 0.209.3-nightly-20261016183441

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 (62) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/templates/analytics/.deploy-tmp/agent-native-provided-plugins.mjs +10 -0
  3. package/corpus/templates/analytics/actions/update-dashboard.ts +9 -0
  4. package/corpus/templates/analytics/app/components/auth/SqlQuerySnapshotSessionBridge.tsx +25 -0
  5. package/corpus/templates/analytics/app/components/dashboard/PanelFreshnessClock.tsx +140 -0
  6. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +104 -48
  7. package/corpus/templates/analytics/app/components/dashboard/panel-freshness.ts +171 -0
  8. package/corpus/templates/analytics/app/global.css +59 -0
  9. package/corpus/templates/analytics/app/i18n/en-US.ts +8 -0
  10. package/corpus/templates/analytics/app/lib/cost-tracker.ts +122 -16
  11. package/corpus/templates/analytics/app/lib/query-metrics.ts +50 -13
  12. package/corpus/templates/analytics/app/lib/sql-query-cache.ts +697 -0
  13. package/corpus/templates/analytics/app/lib/sql-query-freshness.ts +85 -0
  14. package/corpus/templates/analytics/app/lib/sql-query-snapshot-session.ts +145 -0
  15. package/corpus/templates/analytics/app/lib/sql-query.ts +366 -36
  16. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +73 -18
  17. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/filter-vars.ts +45 -12
  18. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +5 -0
  19. package/corpus/templates/analytics/app/root.tsx +2 -0
  20. package/corpus/templates/analytics/changelog/2026-10-14-dashboard-charts-now-reappear-instantly-after-a-reload-from-.md +6 -0
  21. package/corpus/templates/analytics/changelog/2026-10-14-dashboard-panels-show-fetch-time-in-a-clock-and-label-only-st.md +6 -0
  22. package/corpus/templates/analytics/changelog/2026-10-15-dashboard-query-costs-and-refresh-confirmations-reflect-actu.md +6 -0
  23. package/corpus/templates/analytics/changelog/2026-10-15-dashboard-results-disappear-when-access-is-withdrawn-and-exp.md +6 -0
  24. package/corpus/templates/analytics/changelog/2026-10-16-dashboard-freshness-stays-in-the-title-row-with-compact-upda.md +6 -0
  25. package/corpus/templates/analytics/changelog/2026-10-16-dashboard-update-status-remains-visible-for-sources-without-.md +6 -0
  26. package/corpus/templates/analytics/server/lib/bigquery.ts +35 -4
  27. package/corpus/templates/analytics/server/lib/dashboard-panel-query.ts +2 -3
  28. package/corpus/templates/analytics/server/lib/first-party-analytics-backend.ts +9 -6
  29. package/corpus/templates/analytics/server/lib/first-party-analytics-cache.ts +2 -2
  30. package/corpus/templates/analytics/server/lib/first-party-analytics.ts +4 -2
  31. package/corpus/templates/analytics/shared/sql-query-contract.ts +49 -0
  32. package/corpus/templates/assets/.deploy-tmp/agent-native-provided-plugins.mjs +10 -0
  33. package/corpus/templates/brain/.deploy-tmp/agent-native-provided-plugins.mjs +10 -0
  34. package/corpus/templates/calendar/.deploy-tmp/agent-native-provided-plugins.mjs +10 -0
  35. package/corpus/templates/chat/.deploy-tmp/agent-native-provided-plugins.mjs +10 -0
  36. package/corpus/templates/clips/.deploy-tmp/agent-native-provided-plugins.mjs +10 -0
  37. package/corpus/templates/content/.deploy-tmp/agent-native-provided-plugins.mjs +10 -0
  38. package/corpus/templates/crm/.deploy-tmp/agent-native-provided-plugins.mjs +10 -0
  39. package/corpus/templates/design/.deploy-tmp/agent-native-provided-plugins.mjs +10 -0
  40. package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +24 -0
  41. package/corpus/templates/design/app/components/design/types.ts +1 -0
  42. package/corpus/templates/design/app/lib/design-import.ts +35 -0
  43. package/corpus/templates/design/app/pages/design-editor/clone-and-pen-edit.ts +11 -0
  44. package/corpus/templates/design/app/pages/design-editor/command-types.ts +2 -0
  45. package/corpus/templates/design/app/pages/design-editor/commands/copy-selection.ts +3 -0
  46. package/corpus/templates/design/app/pages/design-editor/commands/get-selected-layer-snapshots.ts +19 -0
  47. package/corpus/templates/design/app/pages/design-editor/commands/paste-selection.ts +118 -20
  48. package/corpus/templates/design/app/pages/design-editor/domains/use-editor-layer-actions.ts +15 -3
  49. package/corpus/templates/design/app/pages/design-editor/relative-position-offset.ts +109 -0
  50. package/corpus/templates/design/changelog/2026-10-15-dragged-layers-use-the-final-release-position.md +6 -0
  51. package/corpus/templates/design/changelog/2026-10-15-repeated-pastes-preserve-relative-layer-offsets.md +6 -0
  52. package/corpus/templates/design/changelog/2026-10-15-text-wrapping-hug-widths.md +6 -0
  53. package/corpus/templates/design/shared/code-layer.ts +2 -1
  54. package/corpus/templates/design/shared/relative-position-containing-block.ts +40 -0
  55. package/corpus/templates/dispatch/.deploy-tmp/agent-native-provided-plugins.mjs +10 -0
  56. package/corpus/templates/forms/.deploy-tmp/agent-native-provided-plugins.mjs +10 -0
  57. package/corpus/templates/mail/.deploy-tmp/agent-native-provided-plugins.mjs +10 -0
  58. package/corpus/templates/plan/.deploy-tmp/agent-native-provided-plugins.mjs +10 -0
  59. package/corpus/templates/slides/.deploy-tmp/agent-native-provided-plugins.mjs +10 -0
  60. package/corpus/templates/slides/app/components/editor/NewDeckReferenceStep.tsx +137 -118
  61. package/corpus/templates/slides/changelog/2026-10-16-search-and-preview-reference-decks-before-choosing-one.md +6 -0
  62. package/package.json +1 -1
@@ -1,4 +1,10 @@
1
- import { useT } from "@agent-native/core/client/i18n";
1
+ import { callAction } from "@agent-native/core/client/hooks";
2
+ import { useFormatters, useT } from "@agent-native/core/client/i18n";
3
+ import {
4
+ ComposerContextPickerDialog,
5
+ ComposerRuntimeAdaptersProvider,
6
+ type ComposerContextPickerConfig,
7
+ } from "@agent-native/toolkit/composer";
2
8
  import {
3
9
  IconArrowLeft,
4
10
  IconBrandFigma,
@@ -11,25 +17,13 @@ import {
11
17
  IconWorld,
12
18
  } from "@tabler/icons-react";
13
19
  import { useEffect, useRef, useState } from "react";
14
- import type { ChangeEvent, ReactNode } from "react";
20
+ import type { ChangeEvent, CSSProperties, ReactNode } from "react";
15
21
 
22
+ import SlideRenderer from "@/components/deck/SlideRenderer";
16
23
  import { DesignSystemSetup } from "@/components/design-system/DesignSystemSetup";
17
24
  import { UploadStorageGate } from "@/components/editor/UploadStorageGate";
18
25
  import { Button } from "@/components/ui/button";
19
- import {
20
- Command,
21
- CommandEmpty,
22
- CommandGroup,
23
- CommandInput,
24
- CommandItem,
25
- CommandList,
26
- } from "@/components/ui/command";
27
26
  import { Input } from "@/components/ui/input";
28
- import {
29
- Popover,
30
- PopoverContent,
31
- PopoverTrigger,
32
- } from "@/components/ui/popover";
33
27
  import {
34
28
  Select,
35
29
  SelectContent,
@@ -37,10 +31,11 @@ import {
37
31
  SelectTrigger,
38
32
  SelectValue,
39
33
  } from "@/components/ui/select";
40
- import type { Deck } from "@/context/DeckContext";
34
+ import type { Deck, Slide } from "@/context/DeckContext";
41
35
  import { useDesignSystemWorkflows } from "@/hooks/use-design-system-workflows";
42
36
  import { useSlideFileStorageStatus } from "@/hooks/use-slide-file-storage-status";
43
- import { sortDecksByRecency } from "@/lib/deck-sorting";
37
+ import type { AspectRatio } from "@/lib/aspect-ratios";
38
+ import { getDeckListingPreviewFrameStyle } from "@/lib/deck-preview-frame";
44
39
  import { resolveSelectableDesignSystemId } from "@/lib/design-system-selection";
45
40
  import type {
46
41
  NewDeckReferenceSelection,
@@ -161,6 +156,7 @@ export function NewDeckReferenceStep({
161
156
  promptSummary,
162
157
  }: NewDeckReferenceStepProps) {
163
158
  const t = useT();
159
+ const formatters = useFormatters();
164
160
  const storageQuery = useSlideFileStorageStatus(open);
165
161
  const fileStorageConfigured =
166
162
  storageQuery.data?.configured === true && !storageQuery.isError;
@@ -172,6 +168,8 @@ export function NewDeckReferenceStep({
172
168
  const [selectedReferenceDeckId, setSelectedReferenceDeckId] = useState<
173
169
  string | null
174
170
  >(null);
171
+ const [selectedReferenceDeckTitle, setSelectedReferenceDeckTitle] =
172
+ useState<string>();
175
173
  const [referenceDeckTouched, setReferenceDeckTouched] = useState(false);
176
174
  const [importedReference, setImportedReference] =
177
175
  useState<ImportedReference | null>(null);
@@ -186,12 +184,8 @@ export function NewDeckReferenceStep({
186
184
  const busy = importing || continuing;
187
185
 
188
186
  const designSystemAutoRef = useRef(true);
187
+ const referenceDeckTriggerRef = useRef<HTMLButtonElement>(null);
189
188
 
190
- const deckById = new Map(decks.map((deck) => [deck.id, deck]));
191
- const sortedDecks = sortDecksByRecency(decks);
192
- const selectedReferenceDeck = selectedReferenceDeckId
193
- ? deckById.get(selectedReferenceDeckId)
194
- : undefined;
195
189
  const selectedSourceValid = Boolean(
196
190
  selectedSource &&
197
191
  isValidReferenceSourceValue(selectedSource.kind, selectedSource.value),
@@ -215,6 +209,7 @@ export function NewDeckReferenceStep({
215
209
  resolveSelectableDesignSystemId(designSystems, defaultDesignSystemId),
216
210
  );
217
211
  setSelectedReferenceDeckId(null);
212
+ setSelectedReferenceDeckTitle(undefined);
218
213
  setReferenceDeckTouched(false);
219
214
  setImportedReference(null);
220
215
  setSelectedSource(null);
@@ -256,6 +251,7 @@ export function NewDeckReferenceStep({
256
251
  designSystemAutoRef.current = false;
257
252
  setSelectedDesignSystemId(null);
258
253
  setSelectedReferenceDeckId(imported.id);
254
+ setSelectedReferenceDeckTitle(imported.title);
259
255
  setReferenceDeckTouched(true);
260
256
  setSelectedSource(null);
261
257
  setImportedReference(imported);
@@ -315,6 +311,7 @@ export function NewDeckReferenceStep({
315
311
  setSelectedReferenceDeckId((current) =>
316
312
  current === importedReference.id ? null : current,
317
313
  );
314
+ setSelectedReferenceDeckTitle(undefined);
318
315
  setImportedReference(null);
319
316
  setReferenceDeckTouched(false);
320
317
  }
@@ -326,6 +323,7 @@ export function NewDeckReferenceStep({
326
323
  setSelectedDesignSystemId(null);
327
324
  } else {
328
325
  setSelectedReferenceDeckId(null);
326
+ setSelectedReferenceDeckTitle(undefined);
329
327
  setImportedReference(null);
330
328
  }
331
329
  };
@@ -335,11 +333,96 @@ export function NewDeckReferenceStep({
335
333
  : selectedSource?.kind === "website"
336
334
  ? "Website"
337
335
  : "Figma";
338
- const selectedReferenceDeckTitle =
339
- selectedReferenceDeck?.title ??
340
- (selectedReferenceDeckId === importedReference?.id
341
- ? importedReference.title
342
- : undefined);
336
+ const referenceDeckPicker = {
337
+ presentation: { type: "dialog", mode: "single", layout: "gallery" },
338
+ searchPlaceholder: searchDecksLabel,
339
+ emptyMessage: t("home.noMatchingDecks"),
340
+ selectedIds: selectedReferenceDeckId ? [selectedReferenceDeckId] : [],
341
+ clearSelection: {
342
+ label: t("home.none"),
343
+ onSelect: () => {
344
+ setSelectedReferenceDeckId(null);
345
+ setSelectedReferenceDeckTitle(undefined);
346
+ setReferenceDeckTouched(true);
347
+ setImportedReference(null);
348
+ setSelectedSource(null);
349
+ },
350
+ },
351
+ load: async ({ search, cursor, signal }) => {
352
+ const result = await callAction<{
353
+ decks: Array<{
354
+ id: string;
355
+ title: string;
356
+ previewSlide?: Slide;
357
+ previewTooLarge?: boolean;
358
+ aspectRatio?: AspectRatio;
359
+ updatedAt: string | null;
360
+ }>;
361
+ nextCursor?: string;
362
+ }>(
363
+ "list-decks",
364
+ { includePreview: "true", limit: 12, search, cursor },
365
+ { method: "GET", signal },
366
+ );
367
+ return {
368
+ hasMore: Boolean(result.nextCursor),
369
+ nextCursor: result.nextCursor,
370
+ items: result.decks.map((deck) => {
371
+ const updatedAt = deck.updatedAt ? new Date(deck.updatedAt) : null;
372
+ const validUpdatedAt =
373
+ updatedAt && Number.isFinite(updatedAt.getTime())
374
+ ? updatedAt.toISOString()
375
+ : null;
376
+ return {
377
+ id: deck.id,
378
+ title: deck.title,
379
+ preview: deck.previewSlide ? (
380
+ <div className="flex h-full items-center justify-center overflow-hidden">
381
+ <div
382
+ className="slide-reference-preview-frame relative h-full overflow-hidden"
383
+ style={
384
+ {
385
+ "--reference-ratio": getDeckListingPreviewFrameStyle(
386
+ deck.aspectRatio,
387
+ ).aspectRatio,
388
+ "--reference-width": getDeckListingPreviewFrameStyle(
389
+ deck.aspectRatio,
390
+ ).width,
391
+ } as CSSProperties
392
+ }
393
+ >
394
+ <SlideRenderer
395
+ slide={deck.previewSlide}
396
+ thumbnail
397
+ aspectRatio={deck.aspectRatio}
398
+ />
399
+ </div>
400
+ </div>
401
+ ) : deck.previewTooLarge ? (
402
+ <div
403
+ aria-hidden
404
+ className="slide-reference-preview-fallback flex h-full items-center justify-center bg-muted text-muted-foreground"
405
+ >
406
+ <IconPresentation className="size-8" />
407
+ </div>
408
+ ) : null,
409
+ metadata: validUpdatedAt ? (
410
+ <time dateTime={validUpdatedAt}>
411
+ {formatters.formatDate(validUpdatedAt, { dateStyle: "medium" })}
412
+ </time>
413
+ ) : null,
414
+ };
415
+ }),
416
+ };
417
+ },
418
+ onSelect: (item) => {
419
+ setSelectedReferenceDeckId(item.id);
420
+ setSelectedReferenceDeckTitle(item.title);
421
+ setReferenceDeckTouched(true);
422
+ setImportedReference(null);
423
+ setSelectedSource(null);
424
+ },
425
+ } satisfies ComposerContextPickerConfig;
343
426
  return open ? (
344
427
  <div
345
428
  className="fixed inset-0 z-[200] flex min-h-screen flex-col bg-background text-foreground"
@@ -416,98 +499,22 @@ export function NewDeckReferenceStep({
416
499
  <span className="text-xs font-medium text-muted-foreground">
417
500
  {referenceDeckLabel}
418
501
  </span>
419
- <Popover
420
- open={referenceDeckSearchOpen && !busy}
421
- onOpenChange={(open) =>
422
- !busy && setReferenceDeckSearchOpen(open)
423
- }
502
+ <button
503
+ ref={referenceDeckTriggerRef}
504
+ type="button"
505
+ aria-haspopup="dialog"
506
+ aria-expanded={referenceDeckSearchOpen}
507
+ aria-label={referenceDeckLabel}
508
+ disabled={!referenceOptionsLoaded || busy}
509
+ onClick={() => setReferenceDeckSearchOpen(true)}
510
+ className="flex h-10 w-full items-center justify-between gap-2 rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50"
424
511
  >
425
- <PopoverTrigger asChild>
426
- <button
427
- type="button"
428
- role="combobox"
429
- aria-expanded={referenceDeckSearchOpen}
430
- aria-label={referenceDeckLabel}
431
- disabled={decks.length === 0 || busy}
432
- className="flex h-10 w-full items-center justify-between gap-2 rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50"
433
- >
434
- <span className="truncate">
435
- {selectedReferenceDeckTitle ??
436
- (referenceDeckTouched
437
- ? t("home.none")
438
- : chooseDeckLabel)}
439
- </span>
440
- <IconChevronDown className="size-4 shrink-0 opacity-50" />
441
- </button>
442
- </PopoverTrigger>
443
- <PopoverContent
444
- align="start"
445
- className="w-[--radix-popover-trigger-width] p-0"
446
- >
447
- <Command
448
- filter={(value, search) =>
449
- value.toLowerCase().includes(search.toLowerCase().trim())
450
- ? 1
451
- : 0
452
- }
453
- >
454
- <CommandInput
455
- placeholder={searchDecksLabel}
456
- disabled={busy}
457
- />
458
- <CommandList className="max-h-72">
459
- <CommandEmpty>{t("home.noMatchingDecks")}</CommandEmpty>
460
- <CommandGroup>
461
- <CommandItem
462
- value={`none ${t("home.none")}`}
463
- disabled={busy}
464
- onSelect={() => {
465
- setSelectedReferenceDeckId(null);
466
- setReferenceDeckTouched(true);
467
- setImportedReference(null);
468
- setSelectedSource(null);
469
- setReferenceDeckSearchOpen(false);
470
- }}
471
- >
472
- <IconCheck
473
- className={cn(
474
- "me-2 size-4",
475
- selectedReferenceDeckId === null
476
- ? "opacity-100"
477
- : "opacity-0",
478
- )}
479
- />
480
- <span className="truncate">{t("home.none")}</span>
481
- </CommandItem>
482
- {sortedDecks.map((deck) => (
483
- <CommandItem
484
- key={deck.id}
485
- value={`${deck.title} ${deck.id}`}
486
- disabled={busy}
487
- onSelect={() => {
488
- setSelectedReferenceDeckId(deck.id);
489
- setReferenceDeckTouched(true);
490
- setImportedReference(null);
491
- setSelectedSource(null);
492
- setReferenceDeckSearchOpen(false);
493
- }}
494
- >
495
- <IconCheck
496
- className={cn(
497
- "me-2 size-4",
498
- selectedReferenceDeckId === deck.id
499
- ? "opacity-100"
500
- : "opacity-0",
501
- )}
502
- />
503
- <span className="truncate">{deck.title}</span>
504
- </CommandItem>
505
- ))}
506
- </CommandGroup>
507
- </CommandList>
508
- </Command>
509
- </PopoverContent>
510
- </Popover>
512
+ <span className="truncate">
513
+ {selectedReferenceDeckTitle ??
514
+ (referenceDeckTouched ? t("home.none") : chooseDeckLabel)}
515
+ </span>
516
+ <IconChevronDown className="size-4 shrink-0 opacity-50" />
517
+ </button>
511
518
  </div>
512
519
 
513
520
  <div className="border-t border-border pt-5">
@@ -679,6 +686,18 @@ export function NewDeckReferenceStep({
679
686
  onDesignSystemsChanged();
680
687
  }}
681
688
  />
689
+ {referenceDeckSearchOpen && !busy && (
690
+ <ComposerRuntimeAdaptersProvider
691
+ adapters={{ translate: (key, options) => t(key, options) }}
692
+ >
693
+ <ComposerContextPickerDialog
694
+ config={referenceDeckPicker}
695
+ title={referenceDeckLabel}
696
+ onClose={() => setReferenceDeckSearchOpen(false)}
697
+ onRestoreFocus={() => referenceDeckTriggerRef.current?.focus()}
698
+ />
699
+ </ComposerRuntimeAdaptersProvider>
700
+ )}
682
701
  </div>
683
702
  ) : null;
684
703
  }
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-10-16
4
+ ---
5
+
6
+ Search and preview reference decks before choosing one
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/core-corpus",
3
- "version": "0.209.2",
3
+ "version": "0.209.3-nightly-20261016183441",
4
4
  "description": "Opt-in source corpus for Agent-Native Core source-search.",
5
5
  "homepage": "https://github.com/BuilderIO/agent-native#readme",
6
6
  "bugs": {