@agent-native/core 0.68.3 → 0.70.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +54 -0
  3. package/corpus/core/package.json +1 -1
  4. package/corpus/core/src/changelog/parse.ts +245 -0
  5. package/corpus/core/src/cli/changelog.ts +199 -0
  6. package/corpus/core/src/cli/index.ts +19 -0
  7. package/corpus/core/src/cli/recap.ts +24 -1
  8. package/corpus/core/src/cli/skills.ts +72 -45
  9. package/corpus/core/src/client/CommandMenu.tsx +183 -75
  10. package/corpus/core/src/client/agent-chat-adapter.ts +44 -7
  11. package/corpus/core/src/client/analytics.ts +181 -0
  12. package/corpus/core/src/client/changelog/Changelog.tsx +321 -0
  13. package/corpus/core/src/client/index.ts +11 -0
  14. package/corpus/core/src/client/mcp-apps/McpAppRenderer.tsx +54 -0
  15. package/corpus/core/src/client/settings/useBuilderStatus.ts +82 -20
  16. package/corpus/core/src/extensions/web-search-tool.ts +45 -4
  17. package/corpus/core/src/mcp/build-server.ts +1 -1
  18. package/corpus/core/src/mcp/embed-app.ts +112 -6
  19. package/corpus/core/src/secrets/register-framework-secrets.ts +7 -0
  20. package/corpus/core/src/server/attribution.ts +211 -0
  21. package/corpus/core/src/server/auth.ts +6 -0
  22. package/corpus/core/src/server/better-auth-instance.ts +49 -5
  23. package/corpus/core/src/server/builder-browser.ts +27 -1
  24. package/corpus/core/src/server/core-routes-plugin.ts +58 -0
  25. package/corpus/core/src/server/google-oauth.ts +19 -6
  26. package/corpus/core/src/shared/mcp-embed-headers.ts +1 -1
  27. package/corpus/core/src/styles/agent-conversation.css +21 -0
  28. package/corpus/core/src/templates/workspace-core/.agents/skills/changelog/SKILL.md +111 -0
  29. package/corpus/core/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +46 -14
  30. package/corpus/templates/analytics/CHANGELOG.md +10 -0
  31. package/corpus/templates/analytics/actions/install-dashboard-template.ts +2 -2
  32. package/corpus/templates/analytics/actions/open-traffic-dashboard.ts +1 -1
  33. package/corpus/templates/analytics/actions/update-dashboard.ts +5 -3
  34. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +180 -144
  35. package/corpus/templates/analytics/app/components/layout/Header.tsx +2 -2
  36. package/corpus/templates/analytics/app/components/layout/Layout.tsx +7 -5
  37. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +221 -213
  38. package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +6 -3
  39. package/corpus/templates/analytics/app/lib/demo-dashboard-path.ts +1 -1
  40. package/corpus/templates/analytics/app/lib/last-opened.ts +2 -1
  41. package/corpus/templates/analytics/app/pages/Settings.tsx +4 -0
  42. package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +3 -3
  43. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/DashboardFilterBar.tsx +2 -2
  44. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +101 -99
  45. package/corpus/templates/analytics/app/pages/overview/OverviewPage.tsx +1 -1
  46. package/corpus/templates/analytics/app/routes/adhoc.$id.tsx +18 -5
  47. package/corpus/templates/analytics/app/routes/catalog.tsx +1 -1
  48. package/corpus/templates/analytics/app/routes/dashboards.$id.tsx +9 -0
  49. package/corpus/templates/analytics/app/routes/traffic.tsx +1 -1
  50. package/corpus/templates/analytics/changelog/2026-06-23-the-dashboards-and-analyses-sidebar-settings-buttons-now-sta.md +6 -0
  51. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +145 -0
  52. package/corpus/templates/analytics/server/db/index.ts +1 -1
  53. package/corpus/templates/analytics/server/lib/dashboard-catalog.ts +9 -2
  54. package/corpus/templates/analytics/server/lib/demo-dashboards.ts +1 -1
  55. package/corpus/templates/analytics/server/plugins/agent-chat.ts +2 -2
  56. package/corpus/templates/analytics/server/plugins/core-routes.ts +6 -6
  57. package/corpus/templates/assets/CHANGELOG.md +10 -0
  58. package/corpus/templates/assets/app/root.tsx +7 -1
  59. package/corpus/templates/assets/app/routes/settings.tsx +6 -0
  60. package/corpus/templates/brain/CHANGELOG.md +10 -0
  61. package/corpus/templates/brain/app/root.tsx +7 -1
  62. package/corpus/templates/brain/app/routes/settings.tsx +8 -1
  63. package/corpus/templates/calendar/CHANGELOG.md +10 -0
  64. package/corpus/templates/calendar/app/pages/Settings.tsx +4 -0
  65. package/corpus/templates/calendar/app/root.tsx +7 -1
  66. package/corpus/templates/chat/CHANGELOG.md +10 -0
  67. package/corpus/templates/chat/app/root.tsx +7 -1
  68. package/corpus/templates/clips/CHANGELOG.md +10 -0
  69. package/corpus/templates/clips/app/components/player/share-dialog.tsx +33 -7
  70. package/corpus/templates/clips/app/components/player/sign-in-prompt-dialog.tsx +8 -0
  71. package/corpus/templates/clips/app/components/player/video-player.tsx +150 -20
  72. package/corpus/templates/clips/app/components/recorder/pre-record-panel.tsx +72 -20
  73. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +69 -2
  74. package/corpus/templates/clips/app/components/sharing/slack-share-hint.tsx +71 -0
  75. package/corpus/templates/clips/app/lib/recorder-preferences.ts +67 -0
  76. package/corpus/templates/clips/app/root.tsx +7 -1
  77. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +15 -1
  78. package/corpus/templates/clips/app/routes/_app.trash.tsx +21 -0
  79. package/corpus/templates/clips/app/routes/record.tsx +92 -8
  80. package/corpus/templates/clips/app/routes/share.$shareId.tsx +86 -5
  81. package/corpus/templates/clips/changelog/2026-06-23-clips-shared-in-slack-no-longer-show-a-could-not-start-playb.md +6 -0
  82. package/corpus/templates/clips/changelog/2026-06-23-made-the-play-button-on-shared-and-embedded-clips-scale-with.md +6 -0
  83. package/corpus/templates/clips/changelog/2026-06-23-public-clip-share-links-now-show-whether-they-ll-play-inline.md +6 -0
  84. package/corpus/templates/clips/changelog/2026-06-23-screen-camera-recordings-now-keep-the-presenter-s-face-in-th.md +6 -0
  85. package/corpus/templates/clips/desktop/src/lib/recorder.ts +20 -0
  86. package/corpus/templates/clips/desktop/src/main.tsx +3 -0
  87. package/corpus/templates/clips/desktop/src/overlays/region-record-border.tsx +76 -0
  88. package/corpus/templates/clips/desktop/src/styles.css +49 -0
  89. package/corpus/templates/clips/desktop/src-tauri/capabilities/default.json +2 -1
  90. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +67 -1
  91. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +2 -0
  92. package/corpus/templates/clips/desktop/src-tauri/src/util.rs +4 -1
  93. package/corpus/templates/clips/server/routes/api/video/[recordingId].get.ts +51 -1
  94. package/corpus/templates/clips/shared/share-attribution.ts +79 -0
  95. package/corpus/templates/content/CHANGELOG.md +10 -0
  96. package/corpus/templates/content/app/root.tsx +7 -1
  97. package/corpus/templates/content/vitest.config.ts +3 -0
  98. package/corpus/templates/design/CHANGELOG.md +10 -0
  99. package/corpus/templates/design/actions/generate-design.ts +4 -0
  100. package/corpus/templates/design/app/root.tsx +7 -1
  101. package/corpus/templates/design/app/routes/settings.tsx +10 -2
  102. package/corpus/templates/dispatch/CHANGELOG.md +10 -0
  103. package/corpus/templates/dispatch/app/root.tsx +7 -1
  104. package/corpus/templates/forms/CHANGELOG.md +10 -0
  105. package/corpus/templates/forms/app/root.tsx +7 -1
  106. package/corpus/templates/macros/CHANGELOG.md +10 -0
  107. package/corpus/templates/macros/app/root.tsx +7 -1
  108. package/corpus/templates/mail/CHANGELOG.md +10 -0
  109. package/corpus/templates/mail/app/components/layout/CommandPalette.tsx +3 -0
  110. package/corpus/templates/mail/app/pages/SettingsPage.tsx +27 -0
  111. package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +31 -17
  112. package/corpus/templates/plan/.agents/skills/visual-plan/references/wireframe.md +7 -4
  113. package/corpus/templates/plan/.agents/skills/visual-recap/SKILL.md +34 -24
  114. package/corpus/templates/plan/.agents/skills/visual-recap/references/wireframe.md +7 -4
  115. package/corpus/templates/plan/AGENTS.md +4 -0
  116. package/corpus/templates/plan/CHANGELOG.md +10 -0
  117. package/corpus/templates/plan/actions/view-screen.ts +5 -0
  118. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +98 -1
  119. package/corpus/templates/plan/app/pages/PlansPage.tsx +107 -7
  120. package/corpus/templates/plan/app/root.tsx +7 -1
  121. package/corpus/templates/plan/shared/share-attribution.ts +72 -0
  122. package/corpus/templates/slides/CHANGELOG.md +10 -0
  123. package/corpus/templates/slides/app/root.tsx +7 -1
  124. package/corpus/templates/videos/CHANGELOG.md +4 -151
  125. package/corpus/templates/videos/app/root.tsx +7 -1
  126. package/dist/changelog/parse.d.ts +70 -0
  127. package/dist/changelog/parse.d.ts.map +1 -0
  128. package/dist/changelog/parse.js +200 -0
  129. package/dist/changelog/parse.js.map +1 -0
  130. package/dist/cli/changelog.d.ts +4 -0
  131. package/dist/cli/changelog.d.ts.map +1 -0
  132. package/dist/cli/changelog.js +166 -0
  133. package/dist/cli/changelog.js.map +1 -0
  134. package/dist/cli/index.js +18 -0
  135. package/dist/cli/index.js.map +1 -1
  136. package/dist/cli/recap.d.ts.map +1 -1
  137. package/dist/cli/recap.js +22 -1
  138. package/dist/cli/recap.js.map +1 -1
  139. package/dist/cli/skills.d.ts +3 -3
  140. package/dist/cli/skills.d.ts.map +1 -1
  141. package/dist/cli/skills.js +72 -45
  142. package/dist/cli/skills.js.map +1 -1
  143. package/dist/client/CommandMenu.d.ts +17 -1
  144. package/dist/client/CommandMenu.d.ts.map +1 -1
  145. package/dist/client/CommandMenu.js +49 -13
  146. package/dist/client/CommandMenu.js.map +1 -1
  147. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  148. package/dist/client/agent-chat-adapter.js +43 -6
  149. package/dist/client/agent-chat-adapter.js.map +1 -1
  150. package/dist/client/analytics.d.ts +18 -0
  151. package/dist/client/analytics.d.ts.map +1 -1
  152. package/dist/client/analytics.js +177 -0
  153. package/dist/client/analytics.js.map +1 -1
  154. package/dist/client/changelog/Changelog.d.ts +47 -0
  155. package/dist/client/changelog/Changelog.d.ts.map +1 -0
  156. package/dist/client/changelog/Changelog.js +138 -0
  157. package/dist/client/changelog/Changelog.js.map +1 -0
  158. package/dist/client/index.d.ts +2 -1
  159. package/dist/client/index.d.ts.map +1 -1
  160. package/dist/client/index.js +2 -1
  161. package/dist/client/index.js.map +1 -1
  162. package/dist/client/mcp-apps/McpAppRenderer.d.ts +1 -0
  163. package/dist/client/mcp-apps/McpAppRenderer.d.ts.map +1 -1
  164. package/dist/client/mcp-apps/McpAppRenderer.js +42 -1
  165. package/dist/client/mcp-apps/McpAppRenderer.js.map +1 -1
  166. package/dist/client/settings/useBuilderStatus.d.ts +2 -0
  167. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  168. package/dist/client/settings/useBuilderStatus.js +58 -10
  169. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  170. package/dist/extensions/web-search-tool.d.ts +5 -3
  171. package/dist/extensions/web-search-tool.d.ts.map +1 -1
  172. package/dist/extensions/web-search-tool.js +36 -4
  173. package/dist/extensions/web-search-tool.js.map +1 -1
  174. package/dist/mcp/build-server.js +1 -1
  175. package/dist/mcp/build-server.js.map +1 -1
  176. package/dist/mcp/embed-app.d.ts.map +1 -1
  177. package/dist/mcp/embed-app.js +112 -6
  178. package/dist/mcp/embed-app.js.map +1 -1
  179. package/dist/secrets/register-framework-secrets.d.ts.map +1 -1
  180. package/dist/secrets/register-framework-secrets.js +6 -0
  181. package/dist/secrets/register-framework-secrets.js.map +1 -1
  182. package/dist/server/attribution.d.ts +83 -0
  183. package/dist/server/attribution.d.ts.map +1 -0
  184. package/dist/server/attribution.js +178 -0
  185. package/dist/server/attribution.js.map +1 -0
  186. package/dist/server/auth.d.ts.map +1 -1
  187. package/dist/server/auth.js +7 -0
  188. package/dist/server/auth.js.map +1 -1
  189. package/dist/server/better-auth-instance.d.ts +9 -1
  190. package/dist/server/better-auth-instance.d.ts.map +1 -1
  191. package/dist/server/better-auth-instance.js +32 -2
  192. package/dist/server/better-auth-instance.js.map +1 -1
  193. package/dist/server/builder-browser.d.ts +4 -0
  194. package/dist/server/builder-browser.d.ts.map +1 -1
  195. package/dist/server/builder-browser.js +20 -1
  196. package/dist/server/builder-browser.js.map +1 -1
  197. package/dist/server/core-routes-plugin.d.ts +25 -0
  198. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  199. package/dist/server/core-routes-plugin.js +38 -0
  200. package/dist/server/core-routes-plugin.js.map +1 -1
  201. package/dist/server/google-oauth.d.ts.map +1 -1
  202. package/dist/server/google-oauth.js +16 -2
  203. package/dist/server/google-oauth.js.map +1 -1
  204. package/dist/shared/mcp-embed-headers.js +1 -1
  205. package/dist/shared/mcp-embed-headers.js.map +1 -1
  206. package/dist/styles/agent-conversation.css +21 -0
  207. package/dist/templates/workspace-core/.agents/skills/changelog/SKILL.md +111 -0
  208. package/dist/templates/workspace-core/.agents/skills/tracking/SKILL.md +46 -14
  209. package/package.json +1 -1
  210. package/src/templates/workspace-core/.agents/skills/changelog/SKILL.md +111 -0
  211. package/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +46 -14
  212. /package/corpus/templates/analytics/app/routes/{dashboards.tsx → dashboards._index.tsx} +0 -0
@@ -16,6 +16,7 @@ import {
16
16
  IconLayoutDashboard,
17
17
  IconSun,
18
18
  IconMoon,
19
+ IconHistory,
19
20
  } from "@tabler/icons-react";
20
21
  import { useTheme } from "next-themes";
21
22
  import { dashboards } from "@/pages/adhoc/registry";
@@ -25,8 +26,10 @@ import {
25
26
  appApiPath,
26
27
  callAction,
27
28
  useChangeVersions,
29
+ ChangelogDialog,
28
30
  } from "@agent-native/core/client";
29
31
  import { extensionPath } from "@agent-native/core/client/extensions";
32
+ import changelog from "../../../CHANGELOG.md?raw";
30
33
  import { commandPaletteKeywords } from "./command-palette-search";
31
34
 
32
35
  interface SavedConfig {
@@ -47,11 +50,11 @@ interface ExtensionSearchItem {
47
50
  }
48
51
 
49
52
  const defaultTools = [
50
- { id: "explorer", name: "Explorer", href: "/adhoc/explorer" },
53
+ { id: "explorer", name: "Explorer", href: "/dashboards/explorer" },
51
54
  {
52
55
  id: "customer-health",
53
56
  name: "Customer Health",
54
- href: "/adhoc/customer-health",
57
+ href: "/dashboards/customer-health",
55
58
  },
56
59
  ];
57
60
 
@@ -181,6 +184,7 @@ function persistThemePreference(theme: "light" | "dark") {
181
184
 
182
185
  export function CommandPalette() {
183
186
  const [open, setOpen] = useState(false);
187
+ const [changelogOpen, setChangelogOpen] = useState(false);
184
188
  const [searchQuery, setSearchQuery] = useState("");
185
189
  const navigate = useNavigate();
186
190
  const { resolvedTheme, setTheme } = useTheme();
@@ -263,168 +267,200 @@ export function CommandPalette() {
263
267
  : sqlDashboards.filter((dashboard) => !dashboard.hiddenAt);
264
268
 
265
269
  return (
266
- <CommandDialog
267
- open={open}
268
- onOpenChange={(next) => {
269
- setOpen(next);
270
- if (!next) setSearchQuery("");
271
- }}
272
- >
273
- <CommandInput
274
- placeholder="Search dashboards, extensions, charts..."
275
- value={searchQuery}
276
- onValueChange={setSearchQuery}
277
- />
278
- <CommandList>
279
- {!asyncGroupsLoading && <CommandEmpty>No results found.</CommandEmpty>}
280
-
281
- {explorerDashboardsFetching && explorerDashboards.length === 0 && (
282
- <CommandLoadingGroup heading="Explorer Dashboards" rows={2} />
283
- )}
284
-
285
- {visibleExplorerDashboards.length > 0 && (
286
- <CommandGroup heading="Explorer Dashboards">
287
- {visibleExplorerDashboards.map((d) => (
288
- <CommandItem
289
- key={`ed-${d.id}`}
290
- onSelect={() => go(`/adhoc/explorer-dashboard?id=${d.id}`)}
291
- keywords={commandPaletteKeywords(
292
- d.name,
293
- "explorer dashboard",
294
- "dashboard",
295
- )}
296
- >
297
- <IconLayoutDashboard className="mr-2 h-4 w-4 text-muted-foreground" />
298
- <span className="truncate">{d.name}</span>
299
- {d.hiddenAt ? (
300
- <span className="ml-2 rounded border border-border px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground">
301
- Hidden
302
- </span>
303
- ) : null}
304
- </CommandItem>
305
- ))}
306
- </CommandGroup>
307
- )}
308
-
309
- {sqlDashboardsFetching && sqlDashboards.length === 0 && (
310
- <CommandLoadingGroup heading="SQL Dashboards" rows={3} />
311
- )}
312
-
313
- {visibleSqlDashboards.length > 0 && (
314
- <CommandGroup heading="SQL Dashboards">
315
- {visibleSqlDashboards.map((d) => (
270
+ <>
271
+ <CommandDialog
272
+ open={open}
273
+ onOpenChange={(next) => {
274
+ setOpen(next);
275
+ if (!next) setSearchQuery("");
276
+ }}
277
+ >
278
+ <CommandInput
279
+ placeholder="Search dashboards, extensions, charts..."
280
+ value={searchQuery}
281
+ onValueChange={setSearchQuery}
282
+ />
283
+ <CommandList>
284
+ {!asyncGroupsLoading && (
285
+ <CommandEmpty>No results found.</CommandEmpty>
286
+ )}
287
+
288
+ {explorerDashboardsFetching && explorerDashboards.length === 0 && (
289
+ <CommandLoadingGroup heading="Explorer Dashboards" rows={2} />
290
+ )}
291
+
292
+ {visibleExplorerDashboards.length > 0 && (
293
+ <CommandGroup heading="Explorer Dashboards">
294
+ {visibleExplorerDashboards.map((d) => (
295
+ <CommandItem
296
+ key={`ed-${d.id}`}
297
+ onSelect={() =>
298
+ go(`/dashboards/explorer-dashboard?id=${d.id}`)
299
+ }
300
+ keywords={commandPaletteKeywords(
301
+ d.name,
302
+ "explorer dashboard",
303
+ "dashboard",
304
+ )}
305
+ >
306
+ <IconLayoutDashboard className="mr-2 h-4 w-4 text-muted-foreground" />
307
+ <span className="truncate">{d.name}</span>
308
+ {d.hiddenAt ? (
309
+ <span className="ml-2 rounded border border-border px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground">
310
+ Hidden
311
+ </span>
312
+ ) : null}
313
+ </CommandItem>
314
+ ))}
315
+ </CommandGroup>
316
+ )}
317
+
318
+ {sqlDashboardsFetching && sqlDashboards.length === 0 && (
319
+ <CommandLoadingGroup heading="SQL Dashboards" rows={3} />
320
+ )}
321
+
322
+ {visibleSqlDashboards.length > 0 && (
323
+ <CommandGroup heading="SQL Dashboards">
324
+ {visibleSqlDashboards.map((d) => (
325
+ <CommandItem
326
+ key={`sql-${d.id}`}
327
+ onSelect={() => go(`/dashboards/${d.id}`)}
328
+ keywords={commandPaletteKeywords(
329
+ d.name,
330
+ "sql dashboard",
331
+ "dashboard",
332
+ )}
333
+ >
334
+ <IconLayoutDashboard className="mr-2 h-4 w-4 text-muted-foreground" />
335
+ <span className="truncate">{d.name}</span>
336
+ {d.hiddenAt ? (
337
+ <span className="ml-2 rounded border border-border px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground">
338
+ Hidden
339
+ </span>
340
+ ) : null}
341
+ </CommandItem>
342
+ ))}
343
+ </CommandGroup>
344
+ )}
345
+
346
+ {extensionsFetching && extensions.length === 0 && (
347
+ <CommandLoadingGroup heading="Extensions" rows={3} />
348
+ )}
349
+
350
+ {extensions.length > 0 && (
351
+ <CommandGroup heading="Extensions">
352
+ {extensions.map((extension) => (
353
+ <CommandItem
354
+ key={`extension-${extension.id}`}
355
+ onSelect={() =>
356
+ go(extensionPath(extension.id, extension.name))
357
+ }
358
+ keywords={commandPaletteKeywords(
359
+ extension.name,
360
+ extension.description,
361
+ "extension",
362
+ "tool",
363
+ )}
364
+ >
365
+ <IconTool className="mr-2 h-4 w-4 text-muted-foreground" />
366
+ {extension.name}
367
+ </CommandItem>
368
+ ))}
369
+ </CommandGroup>
370
+ )}
371
+
372
+ <CommandGroup heading="Dashboards">
373
+ {dashboards.map((d) => (
316
374
  <CommandItem
317
- key={`sql-${d.id}`}
318
- onSelect={() => go(`/adhoc/${d.id}`)}
319
- keywords={commandPaletteKeywords(
320
- d.name,
321
- "sql dashboard",
322
- "dashboard",
323
- )}
375
+ key={`dash-${d.id}`}
376
+ onSelect={() => go(`/dashboards/${d.id}`)}
377
+ keywords={commandPaletteKeywords(d.name, "dashboard")}
324
378
  >
325
- <IconLayoutDashboard className="mr-2 h-4 w-4 text-muted-foreground" />
326
- <span className="truncate">{d.name}</span>
327
- {d.hiddenAt ? (
328
- <span className="ml-2 rounded border border-border px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground">
329
- Hidden
330
- </span>
331
- ) : null}
379
+ <IconFlask className="mr-2 h-4 w-4 text-muted-foreground" />
380
+ {d.name}
332
381
  </CommandItem>
333
382
  ))}
334
383
  </CommandGroup>
335
- )}
336
-
337
- {extensionsFetching && extensions.length === 0 && (
338
- <CommandLoadingGroup heading="Extensions" rows={3} />
339
- )}
340
384
 
341
- {extensions.length > 0 && (
342
- <CommandGroup heading="Extensions">
343
- {extensions.map((extension) => (
385
+ <CommandGroup heading="Tools">
386
+ {defaultTools.map((t) => (
344
387
  <CommandItem
345
- key={`extension-${extension.id}`}
346
- onSelect={() => go(extensionPath(extension.id, extension.name))}
347
- keywords={commandPaletteKeywords(
348
- extension.name,
349
- extension.description,
350
- "extension",
351
- "tool",
352
- )}
388
+ key={`tool-${t.id}`}
389
+ onSelect={() => go(t.href)}
390
+ keywords={commandPaletteKeywords(t.name, "tool")}
353
391
  >
354
392
  <IconTool className="mr-2 h-4 w-4 text-muted-foreground" />
355
- {extension.name}
393
+ {t.name}
356
394
  </CommandItem>
357
395
  ))}
358
396
  </CommandGroup>
359
- )}
360
397
 
361
- <CommandGroup heading="Dashboards">
362
- {dashboards.map((d) => (
398
+ <CommandGroup heading="Appearance">
363
399
  <CommandItem
364
- key={`dash-${d.id}`}
365
- onSelect={() => go(`/adhoc/${d.id}`)}
366
- keywords={commandPaletteKeywords(d.name, "dashboard")}
400
+ onSelect={() => {
401
+ const nextTheme = isDark ? "light" : "dark";
402
+ setTheme(nextTheme);
403
+ persistThemePreference(nextTheme);
404
+ }}
405
+ keywords={["theme", "dark", "light", "mode"]}
367
406
  >
368
- <IconFlask className="mr-2 h-4 w-4 text-muted-foreground" />
369
- {d.name}
407
+ {isDark ? (
408
+ <IconSun className="mr-2 h-4 w-4 text-muted-foreground" />
409
+ ) : (
410
+ <IconMoon className="mr-2 h-4 w-4 text-muted-foreground" />
411
+ )}
412
+ Toggle {isDark ? "light" : "dark"} mode
370
413
  </CommandItem>
371
- ))}
372
- </CommandGroup>
414
+ </CommandGroup>
373
415
 
374
- <CommandGroup heading="Tools">
375
- {defaultTools.map((t) => (
416
+ <CommandGroup heading="Help">
376
417
  <CommandItem
377
- key={`tool-${t.id}`}
378
- onSelect={() => go(t.href)}
379
- keywords={commandPaletteKeywords(t.name, "tool")}
418
+ onSelect={() => {
419
+ setOpen(false);
420
+ setChangelogOpen(true);
421
+ }}
422
+ keywords={commandPaletteKeywords(
423
+ "What's new",
424
+ "changelog",
425
+ "updates",
426
+ "release notes",
427
+ "changes",
428
+ )}
380
429
  >
381
- <IconTool className="mr-2 h-4 w-4 text-muted-foreground" />
382
- {t.name}
430
+ <IconHistory className="mr-2 h-4 w-4 text-muted-foreground" />
431
+ What's new
383
432
  </CommandItem>
384
- ))}
385
- </CommandGroup>
386
-
387
- <CommandGroup heading="Appearance">
388
- <CommandItem
389
- onSelect={() => {
390
- const nextTheme = isDark ? "light" : "dark";
391
- setTheme(nextTheme);
392
- persistThemePreference(nextTheme);
393
- }}
394
- keywords={["theme", "dark", "light", "mode"]}
395
- >
396
- {isDark ? (
397
- <IconSun className="mr-2 h-4 w-4 text-muted-foreground" />
398
- ) : (
399
- <IconMoon className="mr-2 h-4 w-4 text-muted-foreground" />
400
- )}
401
- Toggle {isDark ? "light" : "dark"} mode
402
- </CommandItem>
403
- </CommandGroup>
404
-
405
- {savedChartsFetching && savedCharts.length === 0 && (
406
- <CommandLoadingGroup heading="Saved Charts" rows={2} />
407
- )}
408
-
409
- {savedCharts.length > 0 && (
410
- <CommandGroup heading="Saved Charts">
411
- {savedCharts.map((c) => (
412
- <CommandItem
413
- key={`chart-${c.id}`}
414
- onSelect={() => go(`/adhoc/explorer?config=${c.id}`)}
415
- keywords={commandPaletteKeywords(
416
- c.name,
417
- "saved chart",
418
- "chart",
419
- )}
420
- >
421
- <IconChartBar className="mr-2 h-4 w-4 text-muted-foreground" />
422
- {c.name}
423
- </CommandItem>
424
- ))}
425
433
  </CommandGroup>
426
- )}
427
- </CommandList>
428
- </CommandDialog>
434
+
435
+ {savedChartsFetching && savedCharts.length === 0 && (
436
+ <CommandLoadingGroup heading="Saved Charts" rows={2} />
437
+ )}
438
+
439
+ {savedCharts.length > 0 && (
440
+ <CommandGroup heading="Saved Charts">
441
+ {savedCharts.map((c) => (
442
+ <CommandItem
443
+ key={`chart-${c.id}`}
444
+ onSelect={() => go(`/dashboards/explorer?config=${c.id}`)}
445
+ keywords={commandPaletteKeywords(
446
+ c.name,
447
+ "saved chart",
448
+ "chart",
449
+ )}
450
+ >
451
+ <IconChartBar className="mr-2 h-4 w-4 text-muted-foreground" />
452
+ {c.name}
453
+ </CommandItem>
454
+ ))}
455
+ </CommandGroup>
456
+ )}
457
+ </CommandList>
458
+ </CommandDialog>
459
+ <ChangelogDialog
460
+ open={changelogOpen}
461
+ onOpenChange={setChangelogOpen}
462
+ markdown={changelog}
463
+ />
464
+ </>
429
465
  );
430
466
  }
@@ -15,7 +15,7 @@ const pageTitles: Record<string, string> = {
15
15
  "/data-dictionary": "Data Dictionary",
16
16
  "/catalog": "Template Catalog",
17
17
  "/analyses": "Analyses",
18
- "/adhoc/explorer": "Explorer",
18
+ "/dashboards/explorer": "Explorer",
19
19
  "/team": "Team",
20
20
  "/settings": "Settings",
21
21
  "/about": "About",
@@ -24,7 +24,7 @@ const pageTitles: Record<string, string> = {
24
24
  function resolveTitle(pathname: string): ReactNode {
25
25
  if (pageTitles[pathname]) return pageTitles[pathname];
26
26
 
27
- const adhocMatch = pathname.match(/^\/adhoc\/(.+)$/);
27
+ const adhocMatch = pathname.match(/^\/(?:adhoc|dashboards)\/(.+)$/);
28
28
  if (adhocMatch) {
29
29
  const id = adhocMatch[1];
30
30
  const dash = dashboards.find((d) => d.id === id);
@@ -29,12 +29,14 @@ export function Layout({ children }: LayoutProps) {
29
29
  const navigate = useNavigate();
30
30
 
31
31
  // Analytics has two distinct "primary resources" — dashboards
32
- // (`/adhoc/:id`) and ad-hoc analyses (`/analyses/:id`). Each binds the
33
- // chat to that artifact so a dashboard chat doesn't leak into a
34
- // different analysis (and vice versa). The list pages and overview
35
- // leave scope null so general data questions still work.
32
+ // (`/dashboards/:id`, legacy `/adhoc/:id`) and ad-hoc analyses
33
+ // (`/analyses/:id`). Each binds the chat to that artifact so a dashboard
34
+ // chat doesn't leak into a different analysis (and vice versa). The list
35
+ // pages and overview leave scope null so general data questions still work.
36
36
  const analyticsScope = useMemo(() => {
37
- const dashMatch = location.pathname.match(/^\/adhoc\/([^/]+)/);
37
+ const dashMatch = location.pathname.match(
38
+ /^\/(?:adhoc|dashboards)\/([^/]+)/,
39
+ );
38
40
  if (dashMatch?.[1]) {
39
41
  return { type: "dashboard" as const, id: dashMatch[1] };
40
42
  }