@agent-native/core-corpus 0.209.2-nightly-20261016124700 → 0.209.2

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 (88) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/templates/analytics/.agents/skills/storing-data/SKILL.md +5 -3
  3. package/corpus/templates/analytics/CHANGELOG.md +18 -0
  4. package/corpus/templates/assets/.agents/skills/storing-data/SKILL.md +5 -3
  5. package/corpus/templates/brain/.agents/skills/storing-data/SKILL.md +5 -3
  6. package/corpus/templates/brain/CHANGELOG.md +6 -0
  7. package/corpus/templates/calendar/.agents/skills/storing-data/SKILL.md +5 -3
  8. package/corpus/templates/chat/.agents/skills/storing-data/SKILL.md +5 -3
  9. package/corpus/templates/chat/scripts/migrate-production.ts +5 -1
  10. package/corpus/templates/clips/CHANGELOG.md +18 -0
  11. package/corpus/templates/clips/app/components/library/bulk-action-toolbar.tsx +17 -20
  12. package/corpus/templates/clips/app/components/library/folder-move-items.tsx +110 -0
  13. package/corpus/templates/clips/app/components/library/recording-card.tsx +29 -42
  14. package/corpus/templates/clips/app/components/player/player-controls.tsx +0 -2
  15. package/corpus/templates/clips/app/components/player/video-player.tsx +0 -2
  16. package/corpus/templates/clips/app/i18n/en-US.ts +1 -0
  17. package/corpus/templates/content/.agents/skills/storing-data/SKILL.md +5 -3
  18. package/corpus/templates/content/CHANGELOG.md +6 -0
  19. package/corpus/templates/crm/.agents/skills/storing-data/SKILL.md +5 -3
  20. package/corpus/templates/design/.agents/skills/storing-data/SKILL.md +5 -3
  21. package/corpus/templates/design/CHANGELOG.md +14 -0
  22. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +7 -32
  23. package/corpus/templates/design/app/components/design/LayersPanel.tsx +6 -12
  24. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +11 -6
  25. package/corpus/templates/design/app/components/design/TokensPanel.tsx +4 -18
  26. package/corpus/templates/design/app/components/design/code-workbench/editor/BufferSync.tsx +26 -1
  27. package/corpus/templates/design/app/components/design/context-menu-item.tsx +3 -8
  28. package/corpus/templates/design/app/i18n/en-US.ts +2 -0
  29. package/corpus/templates/design/app/pages/design-editor/design-editor-view.tsx +3 -7
  30. package/corpus/templates/design/app/pages/design-editor/domains/use-editor-edit-commands.ts +17 -10
  31. package/corpus/templates/design/app/pages/design-editor/selection-state.ts +26 -0
  32. package/corpus/templates/design/app/pages/design-editor/view/publish-waitlist-control.tsx +73 -76
  33. package/corpus/templates/design/app/pages/design-editor/view/share-copy-link-button.tsx +82 -0
  34. package/corpus/templates/design/changelog/2026-10-16-shift-drag-keeps-selected-screens-screen-nudges-stay-with-th.md +6 -0
  35. package/corpus/templates/dispatch/.agents/skills/storing-data/SKILL.md +5 -3
  36. package/corpus/templates/factory/.agents/skills/storing-data/SKILL.md +5 -3
  37. package/corpus/templates/forms/.agents/skills/storing-data/SKILL.md +5 -3
  38. package/corpus/templates/mail/.agents/skills/storing-data/SKILL.md +5 -3
  39. package/corpus/templates/mail/CHANGELOG.md +1 -0
  40. package/corpus/templates/plan/.agents/skills/storing-data/SKILL.md +5 -3
  41. package/corpus/templates/slides/.agents/skills/slide-editing/references/animations.md +5 -0
  42. package/corpus/templates/slides/.agents/skills/storing-data/SKILL.md +5 -3
  43. package/corpus/templates/slides/CHANGELOG.md +33 -0
  44. package/corpus/templates/slides/actions/get-deck.ts +2 -0
  45. package/corpus/templates/slides/actions/patch-deck.ts +7 -0
  46. package/corpus/templates/slides/app/components/editor/AnimationsPanel.tsx +118 -42
  47. package/corpus/templates/slides/app/components/editor/AppMenu.tsx +356 -0
  48. package/corpus/templates/slides/app/components/editor/AssetLibraryPanel.tsx +1 -1
  49. package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +193 -220
  50. package/corpus/templates/slides/app/components/editor/ExportMenu.tsx +117 -72
  51. package/corpus/templates/slides/app/components/editor/HistoryPanel.tsx +1 -1
  52. package/corpus/templates/slides/app/components/editor/ImageGenPanel.tsx +1 -1
  53. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +97 -32
  54. package/corpus/templates/slides/app/components/presentation/PresentationView.tsx +7 -2
  55. package/corpus/templates/slides/app/components/presentation/PresenterView.tsx +6 -2
  56. package/corpus/templates/slides/app/components/presentation/SlideTransitionStage.tsx +6 -2
  57. package/corpus/templates/slides/app/components/presentation/slide-build-steps.ts +36 -11
  58. package/corpus/templates/slides/app/context/DeckContext.tsx +5 -0
  59. package/corpus/templates/slides/app/i18n/en-US.ts +29 -0
  60. package/corpus/templates/slides/app/lib/generation-state.ts +10 -2
  61. package/corpus/templates/slides/app/lib/slide-animation-elements.ts +59 -1
  62. package/corpus/templates/slides/app/lib/slide-clipboard.ts +10 -0
  63. package/corpus/templates/slides/app/pages/DeckEditor.tsx +563 -171
  64. package/corpus/templates/slides/changelog/2026-10-14-the-logo-now-opens-an-app-menu-with-file-edit-view-preferenc.md +6 -0
  65. package/corpus/templates/slides/changelog/2026-10-15-deck-prompts-stay-visible-when-generation-status-checks-fail.md +6 -0
  66. package/corpus/templates/slides/changelog/2026-10-15-your-original-prompt-stays-available-when-you-reopen-a-deck-.md +6 -0
  67. package/corpus/templates/slides/changelog/2026-10-16-animations-can-now-play-with-the-previous-one-so-several-obj.md +6 -0
  68. package/corpus/templates/slides/changelog/2026-10-16-slides-keeps-the-original-prompt-available-if-saving-a-faile.md +6 -0
  69. package/corpus/templates/slides/shared/api.ts +10 -0
  70. package/corpus/templates/slides/shared/pdf-sidecar.ts +2 -0
  71. package/corpus/templates/tasks/.agents/skills/storing-data/SKILL.md +5 -3
  72. package/package.json +1 -1
  73. package/corpus/templates/analytics/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  74. package/corpus/templates/assets/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  75. package/corpus/templates/brain/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  76. package/corpus/templates/calendar/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  77. package/corpus/templates/chat/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  78. package/corpus/templates/clips/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  79. package/corpus/templates/content/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  80. package/corpus/templates/crm/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  81. package/corpus/templates/design/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  82. package/corpus/templates/design/app/components/design/context-menu-styles.ts +0 -10
  83. package/corpus/templates/design/app/pages/design-editor/view/share-export-menu.tsx +0 -99
  84. package/corpus/templates/dispatch/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  85. package/corpus/templates/forms/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  86. package/corpus/templates/mail/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  87. package/corpus/templates/plan/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
  88. package/corpus/templates/slides/.deploy-tmp/agent-native-provided-plugins.mjs +0 -10
package/corpus/README.md CHANGED
@@ -32,4 +32,4 @@ rg -n "defineAction|useActionQuery" node_modules/@agent-native/core-corpus/corpu
32
32
 
33
33
  ## Generated Counts
34
34
 
35
- - template files: 12566
35
+ - template files: 12525
@@ -44,9 +44,11 @@ second migration owner beside it. The Chat and default starters do not ship that
44
44
  Drizzle Kit setup; follow their local instructions and the Database docs for
45
45
  the migration path. In Chat, add `server/db/schema.ts`, `server/db/index.ts`
46
46
  with `createGetDb(schema)`, and `server/plugins/db.ts` with
47
- `runMigrations([...], { table })`. `scripts/migrate-production.ts` is framework-only;
48
- do not create a parallel `runMigrations([...])` list beside a generated Drizzle
49
- migration owner. Give each handwritten migration a unique, stable `name`
47
+ `runMigrations([...], { table })`. `scripts/migrate-production.ts` applies the
48
+ framework tables and then that plugin (`runAppReleaseMigrations`), because a
49
+ release-owned deploy skips it at boot; a project with a Drizzle config is left to
50
+ `db:migrate`, and do not create a parallel `runMigrations([...])` list beside a
51
+ generated Drizzle migration owner. Give each handwritten migration a unique, stable `name`
50
52
  alongside its `version`; append changes instead of renumbering, reusing, or
51
53
  editing an applied entry.
52
54
 
@@ -5,19 +5,37 @@ time from the command menu (Cmd+K → "What's new") or from Settings.
5
5
 
6
6
  ## 2026-10-15
7
7
 
8
+ ### Added
9
+
10
+ - Add key dates and data notes from the dashboard's new Annotations menu or a chart's menu, show or hide key-date sets per dashboard, and mark a note fixed or hide it on one chart from its hover card.
11
+ - Data notes shade the days a chart's numbers were affected by an incident or a tracking problem, on the dashboard and in scheduled email reports.
12
+ - Each dashboard save you make pops up with Undo, says whether everyone sees it, and shows how many others have the dashboard open.
13
+ - In Edit mode, check two or more values in a multi-select filter and save them as a named group that everyone can pick in one click.
14
+
8
15
  ### Improved
9
16
 
17
+ - Dashboard history now says what each save changed, and the save toast names the change
18
+ - The agent now sees which key dates and data notes a dashboard's charts draw, and confirms which charts a new key date or data note shows on.
10
19
  - Collapsed navigation has clearer spacing between its icons
11
20
 
12
21
  ## 2026-10-14
13
22
 
14
23
  ### Added
15
24
 
25
+ - Dashboard charts can mark key dates, like a launch, with a hoverable badge on the x-axis.
26
+ - Funnel charts can split each stage into completed, skipped, moved on and left the app, so a skipped optional step no longer reads as drop-off.
27
+ - Key-date sets: add launches and product changes once and they show on every time chart of every dashboard and in emailed reports; a dashboard can hide a set.
16
28
  - Multi-select dashboard filters can offer presets, named groups of values you pick in one click without changing the other filters.
17
29
  - Preview Sigma workbooks in Analytics; SQL import stays blocked until the BigQuery project mapping can be verified.
18
30
 
19
31
  ### Improved
20
32
 
33
+ - Changed dashboard filters now say only you see them, and coming back to a dashboard without a default view reopens the saved view you had open.
34
+ - Dashboard charts stay visible while they refresh or while new filters load, marked as updating, instead of blanking to a skeleton
35
+ - Dashboards open in View mode, so looking around never changes them for everyone; switch to Edit to rearrange, rename, or resize for everyone, and column widths you drag while viewing stay just for you.
36
+ - Dashboards show a Reset filters button whenever a filter differs from the saved view you have open, or from the defaults when no view is open, and it puts every filter back in one click.
37
+ - Key-date markers on charts now show every event of the day in one hover card, accept a time of day and time zone, and appear on combo charts in emailed reports.
38
+ - Dashboard charts below the fold no longer re-run their queries when filters change until you scroll to them, and scrolling a loaded chart away and back never re-runs it
21
39
  - Dashboards show a Reset filters button whenever a filter differs from the defaults, and it returns every filter to them in one click.
22
40
  - Gong questions use Gong's own search and answer in seconds instead of paging through every call.
23
41
  - Start Sigma workbook imports from the dashboard menu, use an Analytics-only connection with direct credentials, or choose a Sigma connection already granted through Dispatch.
@@ -44,9 +44,11 @@ second migration owner beside it. The Chat and default starters do not ship that
44
44
  Drizzle Kit setup; follow their local instructions and the Database docs for
45
45
  the migration path. In Chat, add `server/db/schema.ts`, `server/db/index.ts`
46
46
  with `createGetDb(schema)`, and `server/plugins/db.ts` with
47
- `runMigrations([...], { table })`. `scripts/migrate-production.ts` is framework-only;
48
- do not create a parallel `runMigrations([...])` list beside a generated Drizzle
49
- migration owner. Give each handwritten migration a unique, stable `name`
47
+ `runMigrations([...], { table })`. `scripts/migrate-production.ts` applies the
48
+ framework tables and then that plugin (`runAppReleaseMigrations`), because a
49
+ release-owned deploy skips it at boot; a project with a Drizzle config is left to
50
+ `db:migrate`, and do not create a parallel `runMigrations([...])` list beside a
51
+ generated Drizzle migration owner. Give each handwritten migration a unique, stable `name`
50
52
  alongside its `version`; append changes instead of renumbering, reusing, or
51
53
  editing an applied entry.
52
54
 
@@ -44,9 +44,11 @@ second migration owner beside it. The Chat and default starters do not ship that
44
44
  Drizzle Kit setup; follow their local instructions and the Database docs for
45
45
  the migration path. In Chat, add `server/db/schema.ts`, `server/db/index.ts`
46
46
  with `createGetDb(schema)`, and `server/plugins/db.ts` with
47
- `runMigrations([...], { table })`. `scripts/migrate-production.ts` is framework-only;
48
- do not create a parallel `runMigrations([...])` list beside a generated Drizzle
49
- migration owner. Give each handwritten migration a unique, stable `name`
47
+ `runMigrations([...], { table })`. `scripts/migrate-production.ts` applies the
48
+ framework tables and then that plugin (`runAppReleaseMigrations`), because a
49
+ release-owned deploy skips it at boot; a project with a Drizzle config is left to
50
+ `db:migrate`, and do not create a parallel `runMigrations([...])` list beside a
51
+ generated Drizzle migration owner. Give each handwritten migration a unique, stable `name`
50
52
  alongside its `version`; append changes instead of renumbering, reusing, or
51
53
  editing an applied entry.
52
54
 
@@ -3,6 +3,12 @@
3
3
  All notable user-facing changes to Agent-Native Brain 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-10-15
7
+
8
+ ### Improved
9
+
10
+ - Saving a source's settings refreshes the Sources list faster, and the source shows "Updating…" until its new settings appear.
11
+
6
12
  ## 2026-10-13
7
13
 
8
14
  ### Changed
@@ -44,9 +44,11 @@ second migration owner beside it. The Chat and default starters do not ship that
44
44
  Drizzle Kit setup; follow their local instructions and the Database docs for
45
45
  the migration path. In Chat, add `server/db/schema.ts`, `server/db/index.ts`
46
46
  with `createGetDb(schema)`, and `server/plugins/db.ts` with
47
- `runMigrations([...], { table })`. `scripts/migrate-production.ts` is framework-only;
48
- do not create a parallel `runMigrations([...])` list beside a generated Drizzle
49
- migration owner. Give each handwritten migration a unique, stable `name`
47
+ `runMigrations([...], { table })`. `scripts/migrate-production.ts` applies the
48
+ framework tables and then that plugin (`runAppReleaseMigrations`), because a
49
+ release-owned deploy skips it at boot; a project with a Drizzle config is left to
50
+ `db:migrate`, and do not create a parallel `runMigrations([...])` list beside a
51
+ generated Drizzle migration owner. Give each handwritten migration a unique, stable `name`
50
52
  alongside its `version`; append changes instead of renumbering, reusing, or
51
53
  editing an applied entry.
52
54
 
@@ -44,9 +44,11 @@ second migration owner beside it. The Chat and default starters do not ship that
44
44
  Drizzle Kit setup; follow their local instructions and the Database docs for
45
45
  the migration path. In Chat, add `server/db/schema.ts`, `server/db/index.ts`
46
46
  with `createGetDb(schema)`, and `server/plugins/db.ts` with
47
- `runMigrations([...], { table })`. `scripts/migrate-production.ts` is framework-only;
48
- do not create a parallel `runMigrations([...])` list beside a generated Drizzle
49
- migration owner. Give each handwritten migration a unique, stable `name`
47
+ `runMigrations([...], { table })`. `scripts/migrate-production.ts` applies the
48
+ framework tables and then that plugin (`runAppReleaseMigrations`), because a
49
+ release-owned deploy skips it at boot; a project with a Drizzle config is left to
50
+ `db:migrate`, and do not create a parallel `runMigrations([...])` list beside a
51
+ generated Drizzle migration owner. Give each handwritten migration a unique, stable `name`
50
52
  alongside its `version`; append changes instead of renumbering, reusing, or
51
53
  editing an applied entry.
52
54
 
@@ -1,12 +1,16 @@
1
1
  import { closeDbExec, withMigrationRuntime } from "@agent-native/core/db";
2
2
  import { loadEnv } from "@agent-native/core/scripts";
3
- import { runFrameworkReleaseMigrations } from "@agent-native/core/server";
3
+ import {
4
+ runAppReleaseMigrations,
5
+ runFrameworkReleaseMigrations,
6
+ } from "@agent-native/core/server";
4
7
 
5
8
  loadEnv();
6
9
 
7
10
  async function main(): Promise<void> {
8
11
  await withMigrationRuntime(async () => {
9
12
  await runFrameworkReleaseMigrations(null);
13
+ await runAppReleaseMigrations();
10
14
  });
11
15
  }
12
16
 
@@ -5,6 +5,10 @@ from the command menu (Cmd+K → "What's new") or from Settings.
5
5
 
6
6
  ## 2026-10-15
7
7
 
8
+ ### Added
9
+
10
+ - Step through a paused clip frame by frame with the comma and period keys, and comments keep the exact frame they were left on.
11
+
8
12
  ### Improved
9
13
 
10
14
  - Clips stays labeled in the menu bar while idle
@@ -12,6 +16,9 @@ from the command menu (Cmd+K → "What's new") or from Settings.
12
16
 
13
17
  ### Fixed
14
18
 
19
+ - Camera permission denials now show the right recovery guidance
20
+ - The Dictionary scrolls through long lists and stays closed during dictation, Archive and Trash show counts, and selection checkboxes stay visible over dark previews.
21
+ - The Share and copy-link buttons now match in color.
15
22
  - Rewind can be enabled from Include last without leaving the recorder.
16
23
  - Screen Memory checks privacy exclusions during capture recovery
17
24
  - Screen Memory retries capture promptly after audio mode changes fail
@@ -20,6 +27,14 @@ from the command menu (Cmd+K → "What's new") or from Settings.
20
27
 
21
28
  ## 2026-10-14
22
29
 
30
+ ### Added
31
+
32
+ - Add a transcript file to a clip from the transcript panel: WebVTT, SRT, or a timestamped transcript copied from YouTube. Clips keeps its timings, labels it as imported, and automatic transcription never replaces it.
33
+ - Agents connected over MCP can upload a local video file to Clips, choose who can open it, and get its share link back.
34
+ - Extension recordings of Agent-Native apps include what the app did, from 30 seconds before recording started, in the Debug panel and for agents.
35
+ - Record and store your first three clips before connecting your own storage
36
+ - Record three clips before connecting your own storage
37
+
23
38
  ### Improved
24
39
 
25
40
  - Earlier screen time now follows its clip's normal share rules: adding it no longer makes the clip private, and sharing the clip shares its earlier screen time with it.
@@ -28,6 +43,9 @@ from the command menu (Cmd+K → "What's new") or from Settings.
28
43
 
29
44
  ### Fixed
30
45
 
46
+ - Captions and the transcript highlight change on cue instead of up to a quarter second late.
47
+ - Clips recognizes existing sign-ins when checking access to free hosted recordings
48
+ - Hosted clips now save reliably to S3-compatible storage, including streamed recordings.
31
49
  - Clips keeps the camera preview open while Control Center is active.
32
50
  - Clips recording errors without a recovery action now dismiss automatically
33
51
  - Dictation cleanup can be undone and the original transcript remains available.
@@ -14,9 +14,14 @@ import {
14
14
  DropdownMenuItem,
15
15
  DropdownMenuLabel,
16
16
  DropdownMenuSeparator,
17
+ DropdownMenuSub,
18
+ DropdownMenuSubContent,
19
+ DropdownMenuSubTrigger,
17
20
  DropdownMenuTrigger,
18
21
  } from "@/components/ui/dropdown-menu";
19
22
 
23
+ import { FolderMoveItems } from "./folder-move-items";
24
+
20
25
  export interface BulkMoveTarget {
21
26
  id: string | null;
22
27
  name: string;
@@ -107,7 +112,6 @@ export function BulkActionToolbar({
107
112
  <DropdownMenuLabel>
108
113
  {t("clipsFinalRaw.moveSelected", { count })}
109
114
  </DropdownMenuLabel>
110
- <DropdownMenuSeparator />
111
115
  <DropdownMenuItem
112
116
  disabled={isPending}
113
117
  onSelect={() => {
@@ -118,25 +122,18 @@ export function BulkActionToolbar({
118
122
  {t("navigation.newFolder")}
119
123
  </DropdownMenuItem>
120
124
  <DropdownMenuSeparator />
121
- {moveTargets.map((target, index) => (
122
- <DropdownMenuItem
123
- key={target.id ?? `root-${index}`}
124
- disabled={target.disabled || isPending}
125
- onSelect={() => onMove?.(target.id)}
126
- >
127
- <span
128
- className="truncate"
129
- style={{ paddingInlineStart: (target.depth ?? 0) * 12 }}
130
- >
131
- {target.name}
132
- </span>
133
- {target.disabled && (
134
- <span className="ms-auto text-xs text-muted-foreground">
135
- {t("clipsFinalRaw.current")}
136
- </span>
137
- )}
138
- </DropdownMenuItem>
139
- ))}
125
+ <FolderMoveItems
126
+ parts={{
127
+ Item: DropdownMenuItem,
128
+ Separator: DropdownMenuSeparator,
129
+ Sub: DropdownMenuSub,
130
+ SubTrigger: DropdownMenuSubTrigger,
131
+ SubContent: DropdownMenuSubContent,
132
+ }}
133
+ targets={moveTargets}
134
+ disabled={isPending}
135
+ onMove={(folderId) => onMove?.(folderId)}
136
+ />
140
137
  </DropdownMenuContent>
141
138
  </DropdownMenu>
142
139
  )}
@@ -0,0 +1,110 @@
1
+ import { useT } from "@agent-native/core/client/i18n";
2
+ import type { ComponentType, ReactNode } from "react";
3
+
4
+ import type { BulkMoveTarget } from "./bulk-action-toolbar";
5
+
6
+ interface MenuItemProps {
7
+ children?: ReactNode;
8
+ disabled?: boolean;
9
+ onSelect?: (event: Event) => void;
10
+ }
11
+
12
+ interface MenuContainerProps {
13
+ children?: ReactNode;
14
+ className?: string;
15
+ }
16
+
17
+ /** The dropdown or context menu primitives to render folder rows with. */
18
+ export interface FolderMenuParts {
19
+ Item: ComponentType<MenuItemProps>;
20
+ Separator: ComponentType;
21
+ Sub: ComponentType<{ children?: ReactNode }>;
22
+ SubTrigger: ComponentType<MenuContainerProps>;
23
+ SubContent: ComponentType<MenuContainerProps>;
24
+ }
25
+
26
+ interface FolderNode {
27
+ target: BulkMoveTarget;
28
+ children: FolderNode[];
29
+ }
30
+
31
+ // Targets arrive flattened depth-first with a `depth`; the library root has
32
+ // no depth and never has children.
33
+ function buildFolderTree(targets: BulkMoveTarget[]): FolderNode[] {
34
+ const roots: FolderNode[] = [];
35
+ const stack: { depth: number; node: FolderNode }[] = [];
36
+ for (const target of targets) {
37
+ const node: FolderNode = { target, children: [] };
38
+ if (target.id === null) {
39
+ roots.push(node);
40
+ continue;
41
+ }
42
+ const depth = target.depth ?? 0;
43
+ while (stack.length > 0 && stack[stack.length - 1].depth >= depth) {
44
+ stack.pop();
45
+ }
46
+ const parent = stack[stack.length - 1];
47
+ (parent ? parent.node.children : roots).push(node);
48
+ stack.push({ depth, node });
49
+ }
50
+ return roots;
51
+ }
52
+
53
+ export function FolderMoveItems({
54
+ parts,
55
+ targets,
56
+ disabled,
57
+ onMove,
58
+ }: {
59
+ parts: FolderMenuParts;
60
+ targets: BulkMoveTarget[];
61
+ disabled?: boolean;
62
+ onMove: (folderId: string | null) => void;
63
+ }) {
64
+ const t = useT();
65
+ const { Item, Separator, Sub, SubTrigger, SubContent } = parts;
66
+
67
+ const renderMoveRow = (
68
+ key: string,
69
+ target: BulkMoveTarget,
70
+ label: ReactNode,
71
+ ) => (
72
+ <Item
73
+ key={key}
74
+ disabled={target.disabled || disabled}
75
+ onSelect={() => onMove(target.id)}
76
+ >
77
+ <span className="truncate">{label}</span>
78
+ {target.disabled ? (
79
+ <span className="ms-auto text-xs text-muted-foreground">
80
+ {t("clipsFinalRaw.current")}
81
+ </span>
82
+ ) : null}
83
+ </Item>
84
+ );
85
+
86
+ const renderNode = (node: FolderNode, index: number): ReactNode => {
87
+ const key = node.target.id ?? `root-${index}`;
88
+ if (node.children.length === 0) {
89
+ return renderMoveRow(key, node.target, node.target.name);
90
+ }
91
+ return (
92
+ <Sub key={key}>
93
+ <SubTrigger>
94
+ <span className="truncate">{node.target.name}</span>
95
+ </SubTrigger>
96
+ <SubContent className="w-64">
97
+ {renderMoveRow(
98
+ `${key}-here`,
99
+ node.target,
100
+ t("clipsFinalRaw.moveHere"),
101
+ )}
102
+ <Separator />
103
+ {node.children.map(renderNode)}
104
+ </SubContent>
105
+ </Sub>
106
+ );
107
+ };
108
+
109
+ return <>{buildFolderTree(targets).map(renderNode)}</>;
110
+ }
@@ -66,6 +66,23 @@ import { isStorageSetupFailureReason } from "@/lib/storage-failures";
66
66
  import { cn } from "@/lib/utils";
67
67
 
68
68
  import type { BulkMoveTarget } from "./bulk-action-toolbar";
69
+ import { FolderMoveItems, type FolderMenuParts } from "./folder-move-items";
70
+
71
+ const DROPDOWN_FOLDER_PARTS: FolderMenuParts = {
72
+ Item: DropdownMenuItem,
73
+ Separator: DropdownMenuSeparator,
74
+ Sub: DropdownMenuSub,
75
+ SubTrigger: DropdownMenuSubTrigger,
76
+ SubContent: DropdownMenuSubContent,
77
+ };
78
+
79
+ const CONTEXT_FOLDER_PARTS: FolderMenuParts = {
80
+ Item: ContextMenuItem,
81
+ Separator: ContextMenuSeparator,
82
+ Sub: ContextMenuSub,
83
+ SubTrigger: ContextMenuSubTrigger,
84
+ SubContent: ContextMenuSubContent,
85
+ };
69
86
 
70
87
  function formatDuration(ms: number): string {
71
88
  const totalSeconds = Math.max(0, Math.floor(ms / 1000));
@@ -590,27 +607,12 @@ export function RecordingCard({
590
607
  {t("navigation.newFolder")}
591
608
  </DropdownMenuItem>
592
609
  <DropdownMenuSeparator />
593
- {moveTargets.map((target, index) => (
594
- <DropdownMenuItem
595
- key={target.id ?? `root-${index}`}
596
- disabled={target.disabled || isMovePending}
597
- onSelect={() => onMove?.(recording, target.id)}
598
- >
599
- <span
600
- className="truncate"
601
- style={{
602
- paddingInlineStart: (target.depth ?? 0) * 12,
603
- }}
604
- >
605
- {target.name}
606
- </span>
607
- {target.disabled && (
608
- <span className="ms-auto text-xs text-muted-foreground">
609
- {t("clipsFinalRaw.current")}
610
- </span>
611
- )}
612
- </DropdownMenuItem>
613
- ))}
610
+ <FolderMoveItems
611
+ parts={DROPDOWN_FOLDER_PARTS}
612
+ targets={moveTargets}
613
+ disabled={isMovePending}
614
+ onMove={(folderId) => onMove?.(recording, folderId)}
615
+ />
614
616
  </DropdownMenuSubContent>
615
617
  </DropdownMenuSub>
616
618
  ) : null}
@@ -751,27 +753,12 @@ export function RecordingCard({
751
753
  {t("navigation.newFolder")}
752
754
  </ContextMenuItem>
753
755
  <ContextMenuSeparator />
754
- {moveTargets.map((target, index) => (
755
- <ContextMenuItem
756
- key={target.id ?? `context-root-${index}`}
757
- disabled={target.disabled || isMovePending}
758
- onSelect={() => onMove?.(recording, target.id)}
759
- >
760
- <span
761
- className="truncate"
762
- style={{
763
- paddingInlineStart: (target.depth ?? 0) * 12,
764
- }}
765
- >
766
- {target.name}
767
- </span>
768
- {target.disabled && (
769
- <span className="ms-auto text-xs text-muted-foreground">
770
- {t("clipsFinalRaw.current")}
771
- </span>
772
- )}
773
- </ContextMenuItem>
774
- ))}
756
+ <FolderMoveItems
757
+ parts={CONTEXT_FOLDER_PARTS}
758
+ targets={moveTargets}
759
+ disabled={isMovePending}
760
+ onMove={(folderId) => onMove?.(recording, folderId)}
761
+ />
775
762
  </ContextMenuSubContent>
776
763
  </ContextMenuSub>
777
764
  ) : null}
@@ -20,7 +20,6 @@ import {
20
20
  DropdownMenuItem,
21
21
  DropdownMenuTrigger,
22
22
  DropdownMenuLabel,
23
- DropdownMenuSeparator,
24
23
  } from "@/components/ui/dropdown-menu";
25
24
  import {
26
25
  Popover,
@@ -255,7 +254,6 @@ export function PlayerControls(props: PlayerControlsProps) {
255
254
  container={menuPortalContainer}
256
255
  >
257
256
  <DropdownMenuLabel>Speed</DropdownMenuLabel>
258
- <DropdownMenuSeparator />
259
257
  {SPEED_OPTIONS.map((rate) => (
260
258
  <DropdownMenuItem
261
259
  key={rate}
@@ -25,7 +25,6 @@ import {
25
25
  DropdownMenuContent,
26
26
  DropdownMenuItem,
27
27
  DropdownMenuLabel,
28
- DropdownMenuSeparator,
29
28
  DropdownMenuTrigger,
30
29
  } from "@/components/ui/dropdown-menu";
31
30
  import { Spinner } from "@/components/ui/spinner";
@@ -2265,7 +2264,6 @@ function CenterPlaybackOverlay({
2265
2264
  container={menuPortalContainer}
2266
2265
  >
2267
2266
  <DropdownMenuLabel>Speed</DropdownMenuLabel>
2268
- <DropdownMenuSeparator />
2269
2267
  {SPEED_OPTIONS.map((rate) => (
2270
2268
  <DropdownMenuItem
2271
2269
  key={rate}
@@ -2154,6 +2154,7 @@ const messages = {
2154
2154
  viewsCount: "{{count}} views",
2155
2155
  recordingMenu: "Recording menu",
2156
2156
  moveToFolder: "Move to folder",
2157
+ moveHere: "Move here",
2157
2158
  unarchive: "Unarchive",
2158
2159
  shareNamedMeeting: 'Share "{{title}}"',
2159
2160
  shareMeeting: "Share meeting",
@@ -44,9 +44,11 @@ second migration owner beside it. The Chat and default starters do not ship that
44
44
  Drizzle Kit setup; follow their local instructions and the Database docs for
45
45
  the migration path. In Chat, add `server/db/schema.ts`, `server/db/index.ts`
46
46
  with `createGetDb(schema)`, and `server/plugins/db.ts` with
47
- `runMigrations([...], { table })`. `scripts/migrate-production.ts` is framework-only;
48
- do not create a parallel `runMigrations([...])` list beside a generated Drizzle
49
- migration owner. Give each handwritten migration a unique, stable `name`
47
+ `runMigrations([...], { table })`. `scripts/migrate-production.ts` applies the
48
+ framework tables and then that plugin (`runAppReleaseMigrations`), because a
49
+ release-owned deploy skips it at boot; a project with a Drizzle config is left to
50
+ `db:migrate`, and do not create a parallel `runMigrations([...])` list beside a
51
+ generated Drizzle migration owner. Give each handwritten migration a unique, stable `name`
50
52
  alongside its `version`; append changes instead of renumbering, reusing, or
51
53
  editing an applied entry.
52
54
 
@@ -3,6 +3,12 @@
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-10-12
7
+
8
+ ### Improved
9
+
10
+ - Pages open faster in a fresh browser
11
+
6
12
  ## 2026-10-11
7
13
 
8
14
  ### Improved
@@ -44,9 +44,11 @@ second migration owner beside it. The Chat and default starters do not ship that
44
44
  Drizzle Kit setup; follow their local instructions and the Database docs for
45
45
  the migration path. In Chat, add `server/db/schema.ts`, `server/db/index.ts`
46
46
  with `createGetDb(schema)`, and `server/plugins/db.ts` with
47
- `runMigrations([...], { table })`. `scripts/migrate-production.ts` is framework-only;
48
- do not create a parallel `runMigrations([...])` list beside a generated Drizzle
49
- migration owner. Give each handwritten migration a unique, stable `name`
47
+ `runMigrations([...], { table })`. `scripts/migrate-production.ts` applies the
48
+ framework tables and then that plugin (`runAppReleaseMigrations`), because a
49
+ release-owned deploy skips it at boot; a project with a Drizzle config is left to
50
+ `db:migrate`, and do not create a parallel `runMigrations([...])` list beside a
51
+ generated Drizzle migration owner. Give each handwritten migration a unique, stable `name`
50
52
  alongside its `version`; append changes instead of renumbering, reusing, or
51
53
  editing an applied entry.
52
54
 
@@ -44,9 +44,11 @@ second migration owner beside it. The Chat and default starters do not ship that
44
44
  Drizzle Kit setup; follow their local instructions and the Database docs for
45
45
  the migration path. In Chat, add `server/db/schema.ts`, `server/db/index.ts`
46
46
  with `createGetDb(schema)`, and `server/plugins/db.ts` with
47
- `runMigrations([...], { table })`. `scripts/migrate-production.ts` is framework-only;
48
- do not create a parallel `runMigrations([...])` list beside a generated Drizzle
49
- migration owner. Give each handwritten migration a unique, stable `name`
47
+ `runMigrations([...], { table })`. `scripts/migrate-production.ts` applies the
48
+ framework tables and then that plugin (`runAppReleaseMigrations`), because a
49
+ release-owned deploy skips it at boot; a project with a Drizzle config is left to
50
+ `db:migrate`, and do not create a parallel `runMigrations([...])` list beside a
51
+ generated Drizzle migration owner. Give each handwritten migration a unique, stable `name`
50
52
  alongside its `version`; append changes instead of renumbering, reusing, or
51
53
  editing an applied entry.
52
54
 
@@ -3,12 +3,23 @@
3
3
  All notable user-facing changes to Design are documented here. Open it any time
4
4
  from the command menu (Cmd+K → "What's new") or from Settings.
5
5
 
6
+ ## 2026-10-16
7
+
8
+ ### Fixed
9
+
10
+ - Shift-drag keeps selected screens, screen nudges stay with the canvas selection, and Code refreshes when reopened.
11
+
6
12
  ## 2026-10-15
7
13
 
8
14
  ### Added
9
15
 
10
16
  - External Design agents can delete screens when you ask them.
11
17
 
18
+ ### Fixed
19
+
20
+ - Empty inspector section titles stay compact
21
+ - Fixed local screen, account, and storage setup when route or connection data is unavailable.
22
+
12
23
  ## 2026-10-14
13
24
 
14
25
  ### Improved
@@ -46,6 +57,9 @@ from the command menu (Cmd+K → "What's new") or from Settings.
46
57
 
47
58
  ### Fixed
48
59
 
60
+ - Dropping a layer in the empty end of an auto-layout row of buttons keeps it in the row as the last item
61
+ - Layers dropped onto another screen, or beside an auto-layout frame they don't fit, land where they are released instead of the screen's top-left corner
62
+ - Moving a layer in the Layers panel, including from the board into a screen, keeps it where it sits on the canvas
49
63
  - Home prompt suggestions stay hidden until AI is connected
50
64
  - Undo reliably restores screen positions after repeated keyboard nudges
51
65
  - Comment pins no longer show in Interact mode or paint over the editor panels.