@agent-native/core 0.69.0 → 0.70.1

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 (336) hide show
  1. package/README.md +15 -15
  2. package/corpus/README.md +2 -2
  3. package/corpus/core/CHANGELOG.md +109 -0
  4. package/corpus/core/docs/design/durable-agent-runs.md +217 -0
  5. package/corpus/core/package.json +1 -1
  6. package/corpus/core/src/action.ts +89 -0
  7. package/corpus/core/src/agent/model-config.ts +0 -2
  8. package/corpus/core/src/agent/run-loop-with-resume.ts +48 -0
  9. package/corpus/core/src/changelog/parse.ts +245 -0
  10. package/corpus/core/src/cli/changelog.ts +199 -0
  11. package/corpus/core/src/cli/index.ts +19 -0
  12. package/corpus/core/src/cli/recap.ts +24 -1
  13. package/corpus/core/src/cli/skills.ts +74 -47
  14. package/corpus/core/src/client/AgentPanel.tsx +5 -3
  15. package/corpus/core/src/client/AssistantChat.tsx +8 -0
  16. package/corpus/core/src/client/CommandMenu.tsx +183 -75
  17. package/corpus/core/src/client/agent-chat-adapter.ts +44 -7
  18. package/corpus/core/src/client/analytics.ts +181 -0
  19. package/corpus/core/src/client/changelog/Changelog.tsx +321 -0
  20. package/corpus/core/src/client/client-surface.ts +41 -0
  21. package/corpus/core/src/client/composer/TiptapComposer.tsx +123 -12
  22. package/corpus/core/src/client/feedback-context.ts +4 -0
  23. package/corpus/core/src/client/index.ts +12 -0
  24. package/corpus/core/src/client/mcp-apps/McpAppRenderer.tsx +54 -0
  25. package/corpus/core/src/client/settings/useBuilderStatus.ts +82 -20
  26. package/corpus/core/src/client/sse-event-processor.ts +7 -1
  27. package/corpus/core/src/mcp/build-server.ts +57 -1
  28. package/corpus/core/src/mcp/embed-app.ts +197 -7
  29. package/corpus/core/src/mcp/oauth-route.ts +109 -13
  30. package/corpus/core/src/server/attribution.ts +211 -0
  31. package/corpus/core/src/server/auth.ts +6 -0
  32. package/corpus/core/src/server/better-auth-instance.ts +49 -5
  33. package/corpus/core/src/server/builder-browser.ts +27 -1
  34. package/corpus/core/src/server/core-routes-plugin.ts +136 -0
  35. package/corpus/core/src/server/google-oauth.ts +19 -6
  36. package/corpus/core/src/server/onboarding-html.ts +35 -0
  37. package/corpus/core/src/shared/mcp-embed-headers.ts +1 -1
  38. package/corpus/core/src/styles/agent-conversation.css +21 -0
  39. package/corpus/core/src/templates/workspace-core/.agents/skills/changelog/SKILL.md +111 -0
  40. package/corpus/core/src/templates/workspace-core/.agents/skills/reliable-mutations/SKILL.md +72 -0
  41. package/corpus/core/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +46 -14
  42. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +22 -0
  43. package/corpus/templates/analytics/AGENTS.md +8 -1
  44. package/corpus/templates/analytics/CHANGELOG.md +10 -0
  45. package/corpus/templates/analytics/actions/install-dashboard-template.ts +99 -4
  46. package/corpus/templates/analytics/actions/open-traffic-dashboard.ts +1 -1
  47. package/corpus/templates/analytics/actions/update-dashboard.ts +39 -8
  48. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +30 -3
  49. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +180 -144
  50. package/corpus/templates/analytics/app/components/layout/Header.tsx +2 -3
  51. package/corpus/templates/analytics/app/components/layout/Layout.tsx +7 -5
  52. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +221 -215
  53. package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +6 -6
  54. package/corpus/templates/analytics/app/lib/demo-dashboard-path.ts +1 -1
  55. package/corpus/templates/analytics/app/lib/last-opened.ts +2 -1
  56. package/corpus/templates/analytics/app/pages/Settings.tsx +4 -0
  57. package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +3 -3
  58. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/DashboardFilterBar.tsx +2 -2
  59. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +32 -2
  60. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +101 -99
  61. package/corpus/templates/analytics/app/pages/overview/OverviewPage.tsx +1 -1
  62. package/corpus/templates/analytics/app/routes/adhoc.$id.tsx +18 -5
  63. package/corpus/templates/analytics/app/routes/catalog.tsx +1 -1
  64. package/corpus/templates/analytics/app/routes/dashboards.$id.tsx +9 -0
  65. package/corpus/templates/analytics/app/routes/traffic.tsx +1 -1
  66. package/corpus/templates/analytics/changelog/2026-06-23-long-dashboard-and-analysis-names-in-the-sidebar-now-truncat.md +6 -0
  67. package/corpus/templates/analytics/changelog/2026-06-23-open-any-dashboard-chart-full-screen-in-a-modal-from-the-pan.md +6 -0
  68. package/corpus/templates/analytics/changelog/2026-06-23-the-dashboards-and-analyses-sidebar-settings-buttons-now-sta.md +6 -0
  69. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +145 -0
  70. package/corpus/templates/analytics/server/db/index.ts +1 -1
  71. package/corpus/templates/analytics/server/lib/dashboard-catalog.ts +9 -2
  72. package/corpus/templates/analytics/server/lib/demo-dashboards.ts +1 -1
  73. package/corpus/templates/analytics/server/plugins/agent-chat.ts +2 -2
  74. package/corpus/templates/analytics/server/plugins/core-routes.ts +6 -6
  75. package/corpus/templates/assets/CHANGELOG.md +10 -0
  76. package/corpus/templates/assets/actions/generate-image.ts +24 -0
  77. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +2 -2
  78. package/corpus/templates/assets/app/global.css +17 -1
  79. package/corpus/templates/assets/app/root.tsx +7 -1
  80. package/corpus/templates/assets/app/routes/_index.tsx +94 -14
  81. package/corpus/templates/assets/app/routes/settings.tsx +6 -0
  82. package/corpus/templates/assets/changelog/2026-06-23-chat-dates-in-the-sidebar-no-longer-wrap-onto-two-lines.md +6 -0
  83. package/corpus/templates/assets/changelog/2026-06-23-clicking-image-video-or-refine-on-the-start-screen-now-drops.md +6 -0
  84. package/corpus/templates/assets/changelog/2026-06-23-pick-your-image-generation-model-right-from-the-chat-model-m.md +6 -0
  85. package/corpus/templates/brain/CHANGELOG.md +10 -0
  86. package/corpus/templates/brain/app/root.tsx +7 -1
  87. package/corpus/templates/brain/app/routes/settings.tsx +8 -1
  88. package/corpus/templates/calendar/CHANGELOG.md +10 -0
  89. package/corpus/templates/calendar/app/pages/Settings.tsx +4 -0
  90. package/corpus/templates/calendar/app/root.tsx +7 -1
  91. package/corpus/templates/chat/CHANGELOG.md +10 -0
  92. package/corpus/templates/chat/app/root.tsx +7 -1
  93. package/corpus/templates/clips/CHANGELOG.md +10 -0
  94. package/corpus/templates/clips/app/components/library/library-grid.tsx +1 -20
  95. package/corpus/templates/clips/app/components/player/share-dialog.tsx +33 -7
  96. package/corpus/templates/clips/app/components/player/sign-in-prompt-dialog.tsx +8 -0
  97. package/corpus/templates/clips/app/components/player/video-player.tsx +150 -20
  98. package/corpus/templates/clips/app/components/recorder/countdown-overlay.tsx +72 -48
  99. package/corpus/templates/clips/app/components/recorder/pre-record-panel.tsx +7 -11
  100. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +31 -0
  101. package/corpus/templates/clips/app/components/sharing/slack-share-hint.tsx +71 -0
  102. package/corpus/templates/clips/app/lib/countdown-audio-cue.ts +35 -17
  103. package/corpus/templates/clips/app/root.tsx +7 -1
  104. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +15 -1
  105. package/corpus/templates/clips/app/routes/record.tsx +78 -5
  106. package/corpus/templates/clips/app/routes/share.$shareId.tsx +86 -5
  107. package/corpus/templates/clips/changelog/2026-06-23-clips-shared-in-slack-no-longer-show-a-could-not-start-playb.md +6 -0
  108. package/corpus/templates/clips/changelog/2026-06-23-made-the-play-button-on-shared-and-embedded-clips-scale-with.md +6 -0
  109. package/corpus/templates/clips/changelog/2026-06-23-public-clip-share-links-now-show-whether-they-ll-play-inline.md +6 -0
  110. package/corpus/templates/clips/changelog/2026-06-23-removed-select-button-from-library-hover-a-clip-to-select-it.md +6 -0
  111. package/corpus/templates/clips/changelog/2026-06-23-screen-camera-recordings-now-keep-the-presenter-s-face-in-th.md +6 -0
  112. package/corpus/templates/clips/changelog/2026-06-23-shared-video-links-now-play-for-anyone-without-signing-in.md +6 -0
  113. package/corpus/templates/clips/changelog/2026-06-23-skip-or-cancel-the-recording-countdown-with-buttons-beside-t.md +6 -0
  114. package/corpus/templates/clips/changelog/2026-06-23-the-desktop-camera-bubble-now-looks-sharp-the-instant-it-ope.md +6 -0
  115. package/corpus/templates/clips/changelog/2026-06-23-the-desktop-recording-widget-now-grows-downward-only-when-yo.md +6 -0
  116. package/corpus/templates/clips/changelog/2026-06-23-the-recording-start-sound-is-now-a-softer-more-modern-chime.md +6 -0
  117. package/corpus/templates/clips/chrome-extension/public/manifest.json +17 -8
  118. package/corpus/templates/clips/chrome-extension/src/background.ts +769 -180
  119. package/corpus/templates/clips/chrome-extension/src/content-script.ts +177 -0
  120. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +466 -329
  121. package/corpus/templates/clips/chrome-extension/src/overlay.css +377 -0
  122. package/corpus/templates/clips/chrome-extension/src/overlay.html +12 -0
  123. package/corpus/templates/clips/chrome-extension/src/overlay.ts +330 -0
  124. package/corpus/templates/clips/chrome-extension/src/permission.html +227 -0
  125. package/corpus/templates/clips/chrome-extension/src/permission.ts +105 -0
  126. package/corpus/templates/clips/chrome-extension/src/popup.html +3 -0
  127. package/corpus/templates/clips/chrome-extension/src/popup.ts +50 -2
  128. package/corpus/templates/clips/chrome-extension/src/styles.css +50 -0
  129. package/corpus/templates/clips/chrome-extension/vite.config.ts +3 -0
  130. package/corpus/templates/clips/desktop/src/lib/audio-cue.ts +41 -24
  131. package/corpus/templates/clips/desktop/src/lib/bubble-webrtc.ts +119 -2
  132. package/corpus/templates/clips/desktop/src/lib/recorder.ts +20 -0
  133. package/corpus/templates/clips/desktop/src/main.tsx +3 -0
  134. package/corpus/templates/clips/desktop/src/overlays/countdown.tsx +21 -2
  135. package/corpus/templates/clips/desktop/src/overlays/region-record-border.tsx +76 -0
  136. package/corpus/templates/clips/desktop/src/styles.css +119 -2
  137. package/corpus/templates/clips/desktop/src-tauri/capabilities/default.json +2 -1
  138. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +140 -1
  139. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +2 -0
  140. package/corpus/templates/clips/desktop/src-tauri/src/util.rs +4 -1
  141. package/corpus/templates/clips/server/routes/api/video/[recordingId].get.ts +85 -6
  142. package/corpus/templates/clips/shared/share-attribution.ts +79 -0
  143. package/corpus/templates/content/AGENTS.md +20 -3
  144. package/corpus/templates/content/CHANGELOG.md +10 -0
  145. package/corpus/templates/content/actions/_database-utils.ts +15 -0
  146. package/corpus/templates/content/actions/_property-utils.ts +371 -4
  147. package/corpus/templates/content/actions/configure-document-property.ts +35 -1
  148. package/corpus/templates/content/actions/create-content-database.ts +5 -1
  149. package/corpus/templates/content/actions/delete-document-property.ts +52 -2
  150. package/corpus/templates/content/actions/duplicate-document-property.ts +34 -17
  151. package/corpus/templates/content/actions/reorder-document-property.ts +79 -0
  152. package/corpus/templates/content/actions/set-document-property.ts +39 -0
  153. package/corpus/templates/content/app/components/editor/DocumentBlockFields.tsx +806 -0
  154. package/corpus/templates/content/app/components/editor/DocumentDatabase.tsx +226 -68
  155. package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +59 -30
  156. package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +25 -1
  157. package/corpus/templates/content/app/components/editor/blockFieldSaveController.ts +180 -0
  158. package/corpus/templates/content/app/components/editor/blockFieldSaveRegistry.ts +179 -0
  159. package/corpus/templates/content/app/components/editor/previewDocumentSaveController.ts +244 -0
  160. package/corpus/templates/content/app/components/editor/previewDocumentSaveRegistry.ts +132 -0
  161. package/corpus/templates/content/app/global.css +9 -0
  162. package/corpus/templates/content/app/hooks/use-document-properties.ts +21 -0
  163. package/corpus/templates/content/app/root.tsx +7 -1
  164. package/corpus/templates/content/server/db/schema.ts +30 -0
  165. package/corpus/templates/content/server/plugins/db.ts +87 -0
  166. package/corpus/templates/content/shared/api.ts +7 -0
  167. package/corpus/templates/content/shared/properties.ts +109 -0
  168. package/corpus/templates/design/CHANGELOG.md +10 -0
  169. package/corpus/templates/design/actions/generate-design.ts +4 -0
  170. package/corpus/templates/design/app/root.tsx +7 -1
  171. package/corpus/templates/design/app/routes/settings.tsx +10 -2
  172. package/corpus/templates/dispatch/CHANGELOG.md +10 -0
  173. package/corpus/templates/dispatch/app/root.tsx +7 -1
  174. package/corpus/templates/forms/.agents/skills/form-responses/SKILL.md +10 -0
  175. package/corpus/templates/forms/CHANGELOG.md +10 -0
  176. package/corpus/templates/forms/actions/export-responses.ts +6 -0
  177. package/corpus/templates/forms/actions/list-responses.ts +2 -0
  178. package/corpus/templates/forms/actions/response-insights.ts +2 -0
  179. package/corpus/templates/forms/app/pages/ResponsesPage.tsx +138 -1
  180. package/corpus/templates/forms/app/root.tsx +7 -1
  181. package/corpus/templates/forms/changelog/2026-06-23-response-tables-now-show-the-page-each-submission-came-from-.md +6 -0
  182. package/corpus/templates/forms/changelog/2026-06-23-response-tables-now-show-whether-feedback-came-from-the-web-.md +6 -0
  183. package/corpus/templates/forms/server/db/schema.ts +7 -0
  184. package/corpus/templates/forms/server/handlers/submissions.ts +19 -2
  185. package/corpus/templates/forms/server/lib/integrations.ts +76 -2
  186. package/corpus/templates/forms/server/plugins/db.ts +20 -0
  187. package/corpus/templates/forms/shared/types.ts +12 -0
  188. package/corpus/templates/macros/CHANGELOG.md +10 -0
  189. package/corpus/templates/macros/app/root.tsx +7 -1
  190. package/corpus/templates/mail/CHANGELOG.md +10 -0
  191. package/corpus/templates/mail/app/components/layout/CommandPalette.tsx +3 -0
  192. package/corpus/templates/mail/app/pages/SettingsPage.tsx +27 -0
  193. package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +31 -17
  194. package/corpus/templates/plan/.agents/skills/visual-plan/references/wireframe.md +7 -4
  195. package/corpus/templates/plan/.agents/skills/visual-recap/SKILL.md +34 -24
  196. package/corpus/templates/plan/.agents/skills/visual-recap/references/wireframe.md +7 -4
  197. package/corpus/templates/plan/AGENTS.md +4 -0
  198. package/corpus/templates/plan/CHANGELOG.md +10 -0
  199. package/corpus/templates/plan/actions/view-screen.ts +5 -0
  200. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +98 -1
  201. package/corpus/templates/plan/app/components/plan/wireframe/html-artboard.css +3 -1
  202. package/corpus/templates/plan/app/pages/PlansPage.tsx +107 -7
  203. package/corpus/templates/plan/app/root.tsx +7 -1
  204. package/corpus/templates/plan/changelog/2026-06-23-large-diagrams-in-a-plan-now-scroll-within-their-block-inste.md +6 -0
  205. package/corpus/templates/plan/shared/share-attribution.ts +72 -0
  206. package/corpus/templates/slides/CHANGELOG.md +10 -0
  207. package/corpus/templates/slides/app/root.tsx +7 -1
  208. package/corpus/templates/videos/CHANGELOG.md +4 -151
  209. package/corpus/templates/videos/app/root.tsx +7 -1
  210. package/dist/action.js +87 -0
  211. package/dist/action.js.map +1 -1
  212. package/dist/agent/engine/builder-engine.d.ts +1 -1
  213. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  214. package/dist/agent/model-config.d.ts +2 -2
  215. package/dist/agent/model-config.d.ts.map +1 -1
  216. package/dist/agent/model-config.js +0 -2
  217. package/dist/agent/model-config.js.map +1 -1
  218. package/dist/agent/run-loop-with-resume.d.ts +13 -0
  219. package/dist/agent/run-loop-with-resume.d.ts.map +1 -1
  220. package/dist/agent/run-loop-with-resume.js +44 -0
  221. package/dist/agent/run-loop-with-resume.js.map +1 -1
  222. package/dist/changelog/parse.d.ts +70 -0
  223. package/dist/changelog/parse.d.ts.map +1 -0
  224. package/dist/changelog/parse.js +200 -0
  225. package/dist/changelog/parse.js.map +1 -0
  226. package/dist/cli/changelog.d.ts +4 -0
  227. package/dist/cli/changelog.d.ts.map +1 -0
  228. package/dist/cli/changelog.js +166 -0
  229. package/dist/cli/changelog.js.map +1 -0
  230. package/dist/cli/index.js +18 -0
  231. package/dist/cli/index.js.map +1 -1
  232. package/dist/cli/recap.d.ts.map +1 -1
  233. package/dist/cli/recap.js +22 -1
  234. package/dist/cli/recap.js.map +1 -1
  235. package/dist/cli/skills.d.ts +3 -3
  236. package/dist/cli/skills.d.ts.map +1 -1
  237. package/dist/cli/skills.js +74 -47
  238. package/dist/cli/skills.js.map +1 -1
  239. package/dist/client/AgentPanel.d.ts.map +1 -1
  240. package/dist/client/AgentPanel.js +5 -3
  241. package/dist/client/AgentPanel.js.map +1 -1
  242. package/dist/client/AssistantChat.d.ts +6 -1
  243. package/dist/client/AssistantChat.d.ts.map +1 -1
  244. package/dist/client/AssistantChat.js +2 -2
  245. package/dist/client/AssistantChat.js.map +1 -1
  246. package/dist/client/CommandMenu.d.ts +17 -1
  247. package/dist/client/CommandMenu.d.ts.map +1 -1
  248. package/dist/client/CommandMenu.js +49 -13
  249. package/dist/client/CommandMenu.js.map +1 -1
  250. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  251. package/dist/client/agent-chat-adapter.js +43 -6
  252. package/dist/client/agent-chat-adapter.js.map +1 -1
  253. package/dist/client/analytics.d.ts +18 -0
  254. package/dist/client/analytics.d.ts.map +1 -1
  255. package/dist/client/analytics.js +177 -0
  256. package/dist/client/analytics.js.map +1 -1
  257. package/dist/client/changelog/Changelog.d.ts +47 -0
  258. package/dist/client/changelog/Changelog.d.ts.map +1 -0
  259. package/dist/client/changelog/Changelog.js +138 -0
  260. package/dist/client/changelog/Changelog.js.map +1 -0
  261. package/dist/client/client-surface.d.ts +17 -0
  262. package/dist/client/client-surface.d.ts.map +1 -0
  263. package/dist/client/client-surface.js +24 -0
  264. package/dist/client/client-surface.js.map +1 -0
  265. package/dist/client/composer/TiptapComposer.d.ts +26 -1
  266. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  267. package/dist/client/composer/TiptapComposer.js +27 -5
  268. package/dist/client/composer/TiptapComposer.js.map +1 -1
  269. package/dist/client/feedback-context.d.ts +3 -0
  270. package/dist/client/feedback-context.d.ts.map +1 -1
  271. package/dist/client/feedback-context.js +2 -0
  272. package/dist/client/feedback-context.js.map +1 -1
  273. package/dist/client/index.d.ts +3 -1
  274. package/dist/client/index.d.ts.map +1 -1
  275. package/dist/client/index.js +3 -1
  276. package/dist/client/index.js.map +1 -1
  277. package/dist/client/mcp-apps/McpAppRenderer.d.ts +1 -0
  278. package/dist/client/mcp-apps/McpAppRenderer.d.ts.map +1 -1
  279. package/dist/client/mcp-apps/McpAppRenderer.js +42 -1
  280. package/dist/client/mcp-apps/McpAppRenderer.js.map +1 -1
  281. package/dist/client/settings/useBuilderStatus.d.ts +2 -0
  282. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  283. package/dist/client/settings/useBuilderStatus.js +58 -10
  284. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  285. package/dist/client/sse-event-processor.d.ts.map +1 -1
  286. package/dist/client/sse-event-processor.js +7 -1
  287. package/dist/client/sse-event-processor.js.map +1 -1
  288. package/dist/mcp/build-server.d.ts +21 -0
  289. package/dist/mcp/build-server.d.ts.map +1 -1
  290. package/dist/mcp/build-server.js +43 -1
  291. package/dist/mcp/build-server.js.map +1 -1
  292. package/dist/mcp/embed-app.d.ts.map +1 -1
  293. package/dist/mcp/embed-app.js +197 -7
  294. package/dist/mcp/embed-app.js.map +1 -1
  295. package/dist/mcp/oauth-route.d.ts.map +1 -1
  296. package/dist/mcp/oauth-route.js +95 -12
  297. package/dist/mcp/oauth-route.js.map +1 -1
  298. package/dist/server/attribution.d.ts +83 -0
  299. package/dist/server/attribution.d.ts.map +1 -0
  300. package/dist/server/attribution.js +178 -0
  301. package/dist/server/attribution.js.map +1 -0
  302. package/dist/server/auth.d.ts.map +1 -1
  303. package/dist/server/auth.js +7 -0
  304. package/dist/server/auth.js.map +1 -1
  305. package/dist/server/better-auth-instance.d.ts +9 -1
  306. package/dist/server/better-auth-instance.d.ts.map +1 -1
  307. package/dist/server/better-auth-instance.js +32 -2
  308. package/dist/server/better-auth-instance.js.map +1 -1
  309. package/dist/server/builder-browser.d.ts +4 -0
  310. package/dist/server/builder-browser.d.ts.map +1 -1
  311. package/dist/server/builder-browser.js +20 -1
  312. package/dist/server/builder-browser.js.map +1 -1
  313. package/dist/server/core-routes-plugin.d.ts +25 -0
  314. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  315. package/dist/server/core-routes-plugin.js +101 -0
  316. package/dist/server/core-routes-plugin.js.map +1 -1
  317. package/dist/server/google-oauth.d.ts.map +1 -1
  318. package/dist/server/google-oauth.js +16 -2
  319. package/dist/server/google-oauth.js.map +1 -1
  320. package/dist/server/onboarding-html.d.ts.map +1 -1
  321. package/dist/server/onboarding-html.js +35 -0
  322. package/dist/server/onboarding-html.js.map +1 -1
  323. package/dist/shared/mcp-embed-headers.js +1 -1
  324. package/dist/shared/mcp-embed-headers.js.map +1 -1
  325. package/dist/styles/agent-conversation.css +21 -0
  326. package/dist/templates/workspace-core/.agents/skills/changelog/SKILL.md +111 -0
  327. package/dist/templates/workspace-core/.agents/skills/reliable-mutations/SKILL.md +72 -0
  328. package/dist/templates/workspace-core/.agents/skills/tracking/SKILL.md +46 -14
  329. package/docs/design/durable-agent-runs.md +217 -0
  330. package/package.json +1 -1
  331. package/src/templates/workspace-core/.agents/skills/changelog/SKILL.md +111 -0
  332. package/src/templates/workspace-core/.agents/skills/reliable-mutations/SKILL.md +72 -0
  333. package/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +46 -14
  334. package/corpus/templates/analytics/app/pages/About.tsx +0 -108
  335. package/corpus/templates/analytics/app/routes/about.tsx +0 -9
  336. /package/corpus/templates/analytics/app/routes/{dashboards.tsx → dashboards._index.tsx} +0 -0
@@ -16,7 +16,6 @@ import {
16
16
  IconChevronDown,
17
17
  IconSun,
18
18
  IconMoon,
19
- IconInfoCircle,
20
19
  IconTrash,
21
20
  IconDots,
22
21
  IconLoader2,
@@ -146,7 +145,6 @@ import { CSS } from "@dnd-kit/utilities";
146
145
  const bottomItems = [
147
146
  { icon: IconUsers, label: "Team", href: "/team" },
148
147
  { icon: IconSettings, label: "Settings", href: "/settings" },
149
- { icon: IconInfoCircle, label: "About", href: "/about" },
150
148
  ];
151
149
 
152
150
  function getStoredBoolean(key: string, fallback: boolean): boolean {
@@ -236,7 +234,7 @@ function SidebarSectionSettingsPopover({
236
234
  <PopoverTrigger asChild>
237
235
  <button
238
236
  type="button"
239
- className="flex h-7 w-7 shrink-0 items-center justify-center rounded-md text-muted-foreground/65 transition-all hover:bg-sidebar-accent hover:text-foreground focus:outline-none focus:ring-2 focus:ring-ring"
237
+ className="flex h-7 w-7 shrink-0 items-center justify-center rounded-md text-muted-foreground/65 opacity-0 transition-all hover:bg-sidebar-accent hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring group-hover/section:opacity-100 data-[state=open]:opacity-100"
240
238
  aria-label={`${label} settings`}
241
239
  >
242
240
  <IconSettings className="h-3.5 w-3.5" />
@@ -734,7 +732,7 @@ function SortableDashboardItem({
734
732
  visibility: Visibility,
735
733
  ) => Promise<void>;
736
734
  }) {
737
- const href = `/adhoc/${d.id}`;
735
+ const href = `/dashboards/${d.id}`;
738
736
  const { mutateAsync: deleteView } = useDeleteDashboardView();
739
737
  const [deletingViewId, setDeletingViewId] = useState<string | null>(null);
740
738
 
@@ -1337,7 +1335,7 @@ export function Sidebar({ mobile }: { mobile?: boolean } = {}) {
1337
1335
  );
1338
1336
 
1339
1337
  const activeDashboardId = useMemo(() => {
1340
- const match = location.pathname.match(/^\/adhoc\/([^/]+)/);
1338
+ const match = location.pathname.match(/^\/(?:adhoc|dashboards)\/([^/]+)/);
1341
1339
  if (!match?.[1]) return null;
1342
1340
  return new URLSearchParams(location.search).get("id") || match[1];
1343
1341
  }, [location.pathname, location.search]);
@@ -1830,7 +1828,9 @@ export function Sidebar({ mobile }: { mobile?: boolean } = {}) {
1830
1828
  [sidebarWidth],
1831
1829
  );
1832
1830
 
1833
- const isAdhocActive = location.pathname.startsWith("/adhoc");
1831
+ const isAdhocActive =
1832
+ location.pathname.startsWith("/adhoc") ||
1833
+ location.pathname.startsWith("/dashboards");
1834
1834
 
1835
1835
  return (
1836
1836
  <div
@@ -1945,227 +1945,233 @@ export function Sidebar({ mobile }: { mobile?: boolean } = {}) {
1945
1945
  </Link>
1946
1946
 
1947
1947
  {/* Dashboards section */}
1948
- <div
1949
- className={cn(
1950
- "group/section flex w-full min-w-0 items-center rounded-lg transition-all hover:text-primary",
1951
- isAdhocActive
1952
- ? "text-sidebar-accent-foreground"
1953
- : "text-muted-foreground hover:bg-sidebar-accent/50",
1954
- )}
1955
- >
1956
- <button
1957
- type="button"
1958
- onClick={toggleDashOpen}
1959
- className="flex min-w-0 flex-1 items-center gap-3 px-3 py-2 text-left"
1960
- aria-expanded={dashOpen}
1961
- >
1962
- <IconChartBar className="h-4 w-4 shrink-0" />
1963
- <span className="min-w-0 flex-1 truncate">Dashboards</span>
1964
- </button>
1965
- <SidebarSectionSettingsPopover
1966
- label="Dashboards"
1967
- sortMode={dashboardSortMode}
1968
- onSortModeChange={setDashboardSortMode}
1969
- sharedOnly={dashFilter === "org"}
1970
- onSharedOnlyChange={(checked) =>
1971
- setDashFilter(checked ? "org" : "all")
1972
- }
1973
- />
1974
- <button
1975
- type="button"
1976
- onClick={toggleDashOpen}
1977
- className="mr-1 flex h-7 w-7 shrink-0 items-center justify-center rounded-md text-muted-foreground/70 hover:bg-sidebar-accent hover:text-foreground"
1978
- aria-label={
1979
- dashOpen ? "Collapse dashboards" : "Expand dashboards"
1980
- }
1948
+ <div className="group/section min-w-0 space-y-1">
1949
+ <div
1950
+ className={cn(
1951
+ "flex w-full min-w-0 items-center rounded-lg transition-all hover:text-primary",
1952
+ isAdhocActive
1953
+ ? "text-sidebar-accent-foreground"
1954
+ : "text-muted-foreground hover:bg-sidebar-accent/50",
1955
+ )}
1981
1956
  >
1982
- <IconChevronDown
1983
- className={cn(
1984
- "h-3.5 w-3.5 shrink-0 transition-transform",
1985
- !dashOpen && "-rotate-90",
1986
- )}
1957
+ <button
1958
+ type="button"
1959
+ onClick={toggleDashOpen}
1960
+ className="flex min-w-0 flex-1 items-center gap-3 px-3 py-2 text-left"
1961
+ aria-expanded={dashOpen}
1962
+ >
1963
+ <IconChartBar className="h-4 w-4 shrink-0" />
1964
+ <span className="min-w-0 flex-1 truncate">Dashboards</span>
1965
+ </button>
1966
+ <SidebarSectionSettingsPopover
1967
+ label="Dashboards"
1968
+ sortMode={dashboardSortMode}
1969
+ onSortModeChange={setDashboardSortMode}
1970
+ sharedOnly={dashFilter === "org"}
1971
+ onSharedOnlyChange={(checked) =>
1972
+ setDashFilter(checked ? "org" : "all")
1973
+ }
1987
1974
  />
1988
- </button>
1989
- </div>
1990
-
1991
- {dashOpen && (
1992
- <DndContext
1993
- sensors={sensors}
1994
- collisionDetection={closestCenter}
1995
- onDragEnd={handleDashboardDragEnd}
1996
- >
1997
- <SortableContext
1998
- items={displayedDashboards.map((d) => d.id)}
1999
- strategy={verticalListSortingStrategy}
1975
+ <button
1976
+ type="button"
1977
+ onClick={toggleDashOpen}
1978
+ className="mr-1 flex h-7 w-7 shrink-0 items-center justify-center rounded-md text-muted-foreground/70 hover:bg-sidebar-accent hover:text-foreground"
1979
+ aria-label={
1980
+ dashOpen ? "Collapse dashboards" : "Expand dashboards"
1981
+ }
2000
1982
  >
2001
- <div className="ml-4 min-w-0 space-y-0.5">
2002
- {displayedDashboards.map((d) => (
2003
- <SortableDashboardItem
2004
- key={d.id}
2005
- d={d}
2006
- isActive={activeDashboardId === d.id}
2007
- location={location}
2008
- favoriteIds={favoriteIds}
2009
- onToggleFavorite={toggleFavorite}
2010
- onDelete={handleDashboardDelete}
2011
- onRename={handleDashboardRename}
2012
- onArchive={handleDashboardArchive}
2013
- onSetVisibility={handleDashboardSetVisibility}
2014
- onPrefetch={prefetchDashboard}
2015
- views={allViewsMap[d.id]}
2016
- />
2017
- ))}
2018
- {filteredDashboards.length > SIDEBAR_PREVIEW_COUNT && (
2019
- <button
2020
- onClick={() => setDashShowAll(!dashShowAll)}
2021
- className="flex items-center gap-1 px-3 py-1 text-[11px] text-muted-foreground/70 hover:text-primary"
2022
- >
2023
- {dashShowAll
2024
- ? "Show less"
2025
- : `Show ${filteredDashboards.length - SIDEBAR_PREVIEW_COUNT} more`}
2026
- </button>
1983
+ <IconChevronDown
1984
+ className={cn(
1985
+ "h-3.5 w-3.5 shrink-0 transition-transform",
1986
+ !dashOpen && "-rotate-90",
2027
1987
  )}
2028
- {sqlDashboardsLoading &&
2029
- sqlDashboards.length === 0 &&
2030
- Array.from({ length: 3 }).map((_, i) => (
2031
- <div
2032
- key={`sql-skeleton-${i}`}
2033
- className="flex items-center gap-2 px-3 py-1"
2034
- >
2035
- <Skeleton className="h-3.5 w-3.5 shrink-0 rounded-sm" />
2036
- <Skeleton
2037
- className="h-3 rounded"
2038
- style={{ width: `${60 + ((i * 17) % 30)}%` }}
2039
- />
2040
- </div>
2041
- ))}
2042
- <NewDashboardDialog />
2043
- </div>
2044
- </SortableContext>
2045
- </DndContext>
2046
- )}
1988
+ />
1989
+ </button>
1990
+ </div>
2047
1991
 
2048
- {/* Analyses section */}
2049
- <div
2050
- className={cn(
2051
- "group/section flex w-full min-w-0 items-center rounded-lg transition-all hover:text-primary",
2052
- location.pathname.startsWith("/analyses")
2053
- ? "text-sidebar-accent-foreground"
2054
- : "text-muted-foreground hover:bg-sidebar-accent/50",
1992
+ {dashOpen && (
1993
+ <DndContext
1994
+ sensors={sensors}
1995
+ collisionDetection={closestCenter}
1996
+ onDragEnd={handleDashboardDragEnd}
1997
+ >
1998
+ <SortableContext
1999
+ items={displayedDashboards.map((d) => d.id)}
2000
+ strategy={verticalListSortingStrategy}
2001
+ >
2002
+ <div className="ml-4 min-w-0 space-y-0.5">
2003
+ {displayedDashboards.map((d) => (
2004
+ <SortableDashboardItem
2005
+ key={d.id}
2006
+ d={d}
2007
+ isActive={activeDashboardId === d.id}
2008
+ location={location}
2009
+ favoriteIds={favoriteIds}
2010
+ onToggleFavorite={toggleFavorite}
2011
+ onDelete={handleDashboardDelete}
2012
+ onRename={handleDashboardRename}
2013
+ onArchive={handleDashboardArchive}
2014
+ onSetVisibility={handleDashboardSetVisibility}
2015
+ onPrefetch={prefetchDashboard}
2016
+ views={allViewsMap[d.id]}
2017
+ />
2018
+ ))}
2019
+ {filteredDashboards.length > SIDEBAR_PREVIEW_COUNT && (
2020
+ <button
2021
+ onClick={() => setDashShowAll(!dashShowAll)}
2022
+ className="flex items-center gap-1 px-3 py-1 text-[11px] text-muted-foreground/70 hover:text-primary"
2023
+ >
2024
+ {dashShowAll
2025
+ ? "Show less"
2026
+ : `Show ${filteredDashboards.length - SIDEBAR_PREVIEW_COUNT} more`}
2027
+ </button>
2028
+ )}
2029
+ {sqlDashboardsLoading &&
2030
+ sqlDashboards.length === 0 &&
2031
+ Array.from({ length: 3 }).map((_, i) => (
2032
+ <div
2033
+ key={`sql-skeleton-${i}`}
2034
+ className="flex items-center gap-2 px-3 py-1"
2035
+ >
2036
+ <Skeleton className="h-3.5 w-3.5 shrink-0 rounded-sm" />
2037
+ <Skeleton
2038
+ className="h-3 rounded"
2039
+ style={{ width: `${60 + ((i * 17) % 30)}%` }}
2040
+ />
2041
+ </div>
2042
+ ))}
2043
+ <NewDashboardDialog />
2044
+ </div>
2045
+ </SortableContext>
2046
+ </DndContext>
2055
2047
  )}
2056
- >
2057
- <button
2058
- type="button"
2059
- onClick={toggleAnalysesOpen}
2060
- className="flex min-w-0 flex-1 items-center gap-3 px-3 py-2 text-left"
2061
- aria-expanded={analysesOpen}
2062
- >
2063
- <IconReportAnalytics className="h-4 w-4 shrink-0" />
2064
- <span className="min-w-0 flex-1 truncate">Analyses</span>
2065
- </button>
2066
- <SidebarSectionSettingsPopover
2067
- label="Analyses"
2068
- sortMode={analysisSortMode}
2069
- onSortModeChange={setAnalysisSortMode}
2070
- sharedOnly={analysisFilter === "org"}
2071
- onSharedOnlyChange={(checked) =>
2072
- setAnalysisFilter(checked ? "org" : "all")
2073
- }
2074
- showHidden={analysisHiddenFilter === "hidden"}
2075
- onShowHiddenChange={(checked) =>
2076
- setAnalysisHiddenFilter(checked ? "hidden" : "visible")
2077
- }
2078
- />
2079
- <button
2080
- type="button"
2081
- onClick={toggleAnalysesOpen}
2082
- className="mr-1 flex h-7 w-7 shrink-0 items-center justify-center rounded-md text-muted-foreground/70 hover:bg-sidebar-accent hover:text-foreground"
2083
- aria-label={
2084
- analysesOpen ? "Collapse analyses" : "Expand analyses"
2085
- }
2086
- >
2087
- <IconChevronDown
2088
- className={cn(
2089
- "h-3.5 w-3.5 shrink-0 transition-transform",
2090
- !analysesOpen && "-rotate-90",
2091
- )}
2092
- />
2093
- </button>
2094
2048
  </div>
2095
2049
 
2096
- {analysesOpen && (
2097
- <DndContext
2098
- sensors={sensors}
2099
- collisionDetection={closestCenter}
2100
- onDragEnd={handleAnalysisDragEnd}
2050
+ {/* Analyses section */}
2051
+ <div className="group/section min-w-0 space-y-1">
2052
+ <div
2053
+ className={cn(
2054
+ "flex w-full min-w-0 items-center rounded-lg transition-all hover:text-primary",
2055
+ location.pathname.startsWith("/analyses")
2056
+ ? "text-sidebar-accent-foreground"
2057
+ : "text-muted-foreground hover:bg-sidebar-accent/50",
2058
+ )}
2101
2059
  >
2102
- <SortableContext
2103
- items={displayedAnalyses.map((a) => a.id)}
2104
- strategy={verticalListSortingStrategy}
2060
+ <button
2061
+ type="button"
2062
+ onClick={toggleAnalysesOpen}
2063
+ className="flex min-w-0 flex-1 items-center gap-3 px-3 py-2 text-left"
2064
+ aria-expanded={analysesOpen}
2105
2065
  >
2106
- <div className="ml-4 min-w-0 space-y-0.5">
2107
- {displayedAnalyses.map((a) => (
2108
- <SortableRow
2109
- key={a.id}
2110
- id={a.id}
2111
- favoriteKey={`analysis:${a.id}`}
2112
- name={a.name}
2113
- href={`/analyses/${a.id}`}
2114
- isActive={location.pathname === `/analyses/${a.id}`}
2115
- favoriteIds={favoriteIds}
2116
- onToggleFavorite={toggleFavorite}
2117
- onDelete={() => handleAnalysisDelete(a)}
2118
- onRename={(name) => handleAnalysisRename(a, name)}
2119
- hidden={analysisHiddenFilter === "hidden"}
2120
- onHide={
2121
- analysisHiddenFilter === "hidden"
2122
- ? undefined
2123
- : () => handleAnalysisHide(a)
2124
- }
2125
- onUnhide={
2126
- analysisHiddenFilter === "hidden"
2127
- ? () => handleAnalysisUnhide(a)
2128
- : undefined
2129
- }
2130
- visibility={a.visibility}
2131
- onSetVisibility={(v) => handleAnalysisSetVisibility(a, v)}
2132
- onPrefetch={() => prefetchAnalysis(a.id)}
2133
- />
2134
- ))}
2135
- {filteredAnalyses.length > SIDEBAR_PREVIEW_COUNT && (
2136
- <button
2137
- onClick={() => setAnalysesShowAll(!analysesShowAll)}
2138
- className="flex items-center gap-1 px-3 py-1 text-[11px] text-muted-foreground/70 hover:text-primary"
2139
- >
2140
- {analysesShowAll
2141
- ? "Show less"
2142
- : `Show ${filteredAnalyses.length - SIDEBAR_PREVIEW_COUNT} more`}
2143
- </button>
2066
+ <IconReportAnalytics className="h-4 w-4 shrink-0" />
2067
+ <span className="min-w-0 flex-1 truncate">Analyses</span>
2068
+ </button>
2069
+ <SidebarSectionSettingsPopover
2070
+ label="Analyses"
2071
+ sortMode={analysisSortMode}
2072
+ onSortModeChange={setAnalysisSortMode}
2073
+ sharedOnly={analysisFilter === "org"}
2074
+ onSharedOnlyChange={(checked) =>
2075
+ setAnalysisFilter(checked ? "org" : "all")
2076
+ }
2077
+ showHidden={analysisHiddenFilter === "hidden"}
2078
+ onShowHiddenChange={(checked) =>
2079
+ setAnalysisHiddenFilter(checked ? "hidden" : "visible")
2080
+ }
2081
+ />
2082
+ <button
2083
+ type="button"
2084
+ onClick={toggleAnalysesOpen}
2085
+ className="mr-1 flex h-7 w-7 shrink-0 items-center justify-center rounded-md text-muted-foreground/70 hover:bg-sidebar-accent hover:text-foreground"
2086
+ aria-label={
2087
+ analysesOpen ? "Collapse analyses" : "Expand analyses"
2088
+ }
2089
+ >
2090
+ <IconChevronDown
2091
+ className={cn(
2092
+ "h-3.5 w-3.5 shrink-0 transition-transform",
2093
+ !analysesOpen && "-rotate-90",
2144
2094
  )}
2145
- {analysesLoading &&
2146
- sortedAnalyses.length === 0 &&
2147
- Array.from({ length: 3 }).map((_, i) => (
2148
- <div
2149
- key={`analysis-skeleton-${i}`}
2150
- className="flex items-center gap-2 px-3 py-1"
2151
- >
2152
- <Skeleton className="h-3.5 w-3.5 shrink-0 rounded-sm" />
2153
- <Skeleton
2154
- className="h-3 rounded"
2155
- style={{ width: `${60 + ((i * 17) % 30)}%` }}
2156
- />
2157
- </div>
2095
+ />
2096
+ </button>
2097
+ </div>
2098
+
2099
+ {analysesOpen && (
2100
+ <DndContext
2101
+ sensors={sensors}
2102
+ collisionDetection={closestCenter}
2103
+ onDragEnd={handleAnalysisDragEnd}
2104
+ >
2105
+ <SortableContext
2106
+ items={displayedAnalyses.map((a) => a.id)}
2107
+ strategy={verticalListSortingStrategy}
2108
+ >
2109
+ <div className="ml-4 min-w-0 space-y-0.5">
2110
+ {displayedAnalyses.map((a) => (
2111
+ <SortableRow
2112
+ key={a.id}
2113
+ id={a.id}
2114
+ favoriteKey={`analysis:${a.id}`}
2115
+ name={a.name}
2116
+ href={`/analyses/${a.id}`}
2117
+ isActive={location.pathname === `/analyses/${a.id}`}
2118
+ favoriteIds={favoriteIds}
2119
+ onToggleFavorite={toggleFavorite}
2120
+ onDelete={() => handleAnalysisDelete(a)}
2121
+ onRename={(name) => handleAnalysisRename(a, name)}
2122
+ hidden={analysisHiddenFilter === "hidden"}
2123
+ onHide={
2124
+ analysisHiddenFilter === "hidden"
2125
+ ? undefined
2126
+ : () => handleAnalysisHide(a)
2127
+ }
2128
+ onUnhide={
2129
+ analysisHiddenFilter === "hidden"
2130
+ ? () => handleAnalysisUnhide(a)
2131
+ : undefined
2132
+ }
2133
+ visibility={a.visibility}
2134
+ onSetVisibility={(v) =>
2135
+ handleAnalysisSetVisibility(a, v)
2136
+ }
2137
+ onPrefetch={() => prefetchAnalysis(a.id)}
2138
+ />
2158
2139
  ))}
2159
- {!analysesLoading && sortedAnalyses.length === 0 && (
2160
- <p className="px-3 py-1 text-[11px] text-muted-foreground/60">
2161
- No analyses yet
2162
- </p>
2163
- )}
2164
- <NewAnalysisDialog />
2165
- </div>
2166
- </SortableContext>
2167
- </DndContext>
2168
- )}
2140
+ {filteredAnalyses.length > SIDEBAR_PREVIEW_COUNT && (
2141
+ <button
2142
+ onClick={() => setAnalysesShowAll(!analysesShowAll)}
2143
+ className="flex items-center gap-1 px-3 py-1 text-[11px] text-muted-foreground/70 hover:text-primary"
2144
+ >
2145
+ {analysesShowAll
2146
+ ? "Show less"
2147
+ : `Show ${filteredAnalyses.length - SIDEBAR_PREVIEW_COUNT} more`}
2148
+ </button>
2149
+ )}
2150
+ {analysesLoading &&
2151
+ sortedAnalyses.length === 0 &&
2152
+ Array.from({ length: 3 }).map((_, i) => (
2153
+ <div
2154
+ key={`analysis-skeleton-${i}`}
2155
+ className="flex items-center gap-2 px-3 py-1"
2156
+ >
2157
+ <Skeleton className="h-3.5 w-3.5 shrink-0 rounded-sm" />
2158
+ <Skeleton
2159
+ className="h-3 rounded"
2160
+ style={{ width: `${60 + ((i * 17) % 30)}%` }}
2161
+ />
2162
+ </div>
2163
+ ))}
2164
+ {!analysesLoading && sortedAnalyses.length === 0 && (
2165
+ <p className="px-3 py-1 text-[11px] text-muted-foreground/60">
2166
+ No analyses yet
2167
+ </p>
2168
+ )}
2169
+ <NewAnalysisDialog />
2170
+ </div>
2171
+ </SortableContext>
2172
+ </DndContext>
2173
+ )}
2174
+ </div>
2169
2175
  </nav>
2170
2176
 
2171
2177
  <div className="mt-auto min-w-0 px-2 pt-2 text-sm font-medium lg:px-4">
@@ -26,9 +26,12 @@ export function useNavigationState() {
26
26
  state.view = "overview";
27
27
  } else if (pathname === "/ask") {
28
28
  state.view = "ask";
29
- } else if (pathname.startsWith("/adhoc/")) {
29
+ } else if (
30
+ pathname.startsWith("/dashboards/") ||
31
+ pathname.startsWith("/adhoc/")
32
+ ) {
30
33
  state.view = "adhoc";
31
- const match = pathname.match(/\/adhoc\/(.+)/);
34
+ const match = pathname.match(/\/(?:adhoc|dashboards)\/(.+)/);
32
35
  if (match) {
33
36
  state.dashboardId = match[1];
34
37
  localStorage.setItem("last-dashboard-id", match[1]);
@@ -60,15 +63,13 @@ export function useNavigationState() {
60
63
  state.view = "catalog";
61
64
  } else if (pathname === "/settings") {
62
65
  state.view = "settings";
63
- } else if (pathname === "/about") {
64
- state.view = "about";
65
66
  }
66
67
 
67
68
  return state;
68
69
  },
69
70
  getCommandPath: (cmd) => {
70
71
  if (cmd.view === "adhoc" && cmd.dashboardId)
71
- return `/adhoc/${cmd.dashboardId}`;
72
+ return `/dashboards/${cmd.dashboardId}`;
72
73
  if (cmd.view === "analyses" && cmd.analysisId)
73
74
  return `/analyses/${cmd.analysisId}`;
74
75
  if (cmd.view === "analyses") return "/analyses";
@@ -81,7 +82,6 @@ export function useNavigationState() {
81
82
  if (cmd.view === "ask") return "/ask";
82
83
  if (cmd.view === "settings") return "/settings";
83
84
  if (cmd.view === "overview") return "/overview";
84
- if (cmd.view === "about") return "/about";
85
85
  return "/";
86
86
  },
87
87
  onNavigate: (_command, path) => {
@@ -8,7 +8,7 @@ export function demoNodeExporterDashboardPath(
8
8
  tab: DEMO_NODE_EXPORTER_DEFAULT_TAB,
9
9
  });
10
10
  if (options.intro) params.set("demoIntro", "1");
11
- return `/adhoc/${dashboardId}?${params.toString()}`;
11
+ return `/dashboards/${dashboardId}?${params.toString()}`;
12
12
  }
13
13
 
14
14
  export function withDemoIntro(path: string): string {
@@ -19,7 +19,8 @@ function isLastOpenedItem(value: unknown): value is LastOpenedItem {
19
19
  typeof item.id === "string" &&
20
20
  item.id.length > 0 &&
21
21
  typeof item.path === "string" &&
22
- (item.path.startsWith("/adhoc/") ||
22
+ (item.path.startsWith("/dashboards/") ||
23
+ item.path.startsWith("/adhoc/") ||
23
24
  item.path.startsWith("/analyses/") ||
24
25
  item.path.startsWith("/extensions/")) &&
25
26
  typeof item.updatedAt === "number"
@@ -1,13 +1,17 @@
1
+ import { ChangelogSettingsCard } from "@agent-native/core/client";
1
2
  import { useAuth } from "@/components/auth/AuthProvider";
2
3
  import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
3
4
  import { Button } from "@/components/ui/button";
4
5
  import { Link } from "react-router";
6
+ import changelog from "../../CHANGELOG.md?raw";
5
7
 
6
8
  export default function Settings() {
7
9
  const { auth } = useAuth();
8
10
 
9
11
  return (
10
12
  <div className="space-y-6 max-w-2xl">
13
+ <ChangelogSettingsCard markdown={changelog} />
14
+
11
15
  <Card className="bg-card border-border/50">
12
16
  <CardHeader>
13
17
  <CardTitle className="text-base">Account</CardTitle>
@@ -326,7 +326,7 @@ export default function ExplorerDashboardPage() {
326
326
  queryKey: ["explorer-dashboards-palette"],
327
327
  });
328
328
  toast.success(`Archived "${dashboard?.name ?? "dashboard"}"`);
329
- navigate("/adhoc/explorer");
329
+ navigate("/dashboards/explorer");
330
330
  } catch (err) {
331
331
  toast.error(
332
332
  err instanceof Error ? err.message : "Couldn't archive dashboard",
@@ -657,7 +657,7 @@ export default function ExplorerDashboardPage() {
657
657
  queryKey: ["explorer-dashboards-palette"],
658
658
  });
659
659
  setConfirmDeleteOpen(false);
660
- navigate("/adhoc/explorer");
660
+ navigate("/dashboards/explorer");
661
661
  } catch (err) {
662
662
  toast.error(
663
663
  err instanceof Error
@@ -717,7 +717,7 @@ export default function ExplorerDashboardPage() {
717
717
  onRemove={() => removeChart(chart.id)}
718
718
  onToggleWidth={() => toggleWidth(chart.id)}
719
719
  onEdit={() =>
720
- navigate(`/adhoc/explorer?config=${chart.configId}`)
720
+ navigate(`/dashboards/explorer?config=${chart.configId}`)
721
721
  }
722
722
  editable={canEdit}
723
723
  />
@@ -224,7 +224,7 @@ export function DashboardFilterBar({
224
224
  <Collapsible
225
225
  open={filtersOpen}
226
226
  onOpenChange={setFiltersOpen}
227
- className="rounded-lg border border-border bg-card p-3"
227
+ className="group rounded-lg border border-border bg-card p-3"
228
228
  >
229
229
  <div className="flex items-center justify-between gap-3">
230
230
  <div className="flex items-baseline gap-2">
@@ -235,7 +235,7 @@ export function DashboardFilterBar({
235
235
  auto-applied
236
236
  </span>
237
237
  </div>
238
- <div className="flex items-center gap-1">
238
+ <div className="flex items-center gap-1 opacity-0 transition-opacity focus-within:opacity-100 group-hover:opacity-100 group-data-[state=closed]:opacity-100">
239
239
  {onSaveView && filtersActive && (
240
240
  <Button
241
241
  variant="ghost"