@agent-native/core 0.69.0 → 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 (200) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +48 -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/mcp/build-server.ts +1 -1
  17. package/corpus/core/src/mcp/embed-app.ts +112 -6
  18. package/corpus/core/src/server/attribution.ts +211 -0
  19. package/corpus/core/src/server/auth.ts +6 -0
  20. package/corpus/core/src/server/better-auth-instance.ts +49 -5
  21. package/corpus/core/src/server/builder-browser.ts +27 -1
  22. package/corpus/core/src/server/core-routes-plugin.ts +58 -0
  23. package/corpus/core/src/server/google-oauth.ts +19 -6
  24. package/corpus/core/src/shared/mcp-embed-headers.ts +1 -1
  25. package/corpus/core/src/styles/agent-conversation.css +21 -0
  26. package/corpus/core/src/templates/workspace-core/.agents/skills/changelog/SKILL.md +111 -0
  27. package/corpus/core/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +46 -14
  28. package/corpus/templates/analytics/CHANGELOG.md +10 -0
  29. package/corpus/templates/analytics/actions/install-dashboard-template.ts +2 -2
  30. package/corpus/templates/analytics/actions/open-traffic-dashboard.ts +1 -1
  31. package/corpus/templates/analytics/actions/update-dashboard.ts +5 -3
  32. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +180 -144
  33. package/corpus/templates/analytics/app/components/layout/Header.tsx +2 -2
  34. package/corpus/templates/analytics/app/components/layout/Layout.tsx +7 -5
  35. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +221 -213
  36. package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +6 -3
  37. package/corpus/templates/analytics/app/lib/demo-dashboard-path.ts +1 -1
  38. package/corpus/templates/analytics/app/lib/last-opened.ts +2 -1
  39. package/corpus/templates/analytics/app/pages/Settings.tsx +4 -0
  40. package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +3 -3
  41. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/DashboardFilterBar.tsx +2 -2
  42. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +101 -99
  43. package/corpus/templates/analytics/app/pages/overview/OverviewPage.tsx +1 -1
  44. package/corpus/templates/analytics/app/routes/adhoc.$id.tsx +18 -5
  45. package/corpus/templates/analytics/app/routes/catalog.tsx +1 -1
  46. package/corpus/templates/analytics/app/routes/dashboards.$id.tsx +9 -0
  47. package/corpus/templates/analytics/app/routes/traffic.tsx +1 -1
  48. package/corpus/templates/analytics/changelog/2026-06-23-the-dashboards-and-analyses-sidebar-settings-buttons-now-sta.md +6 -0
  49. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +145 -0
  50. package/corpus/templates/analytics/server/db/index.ts +1 -1
  51. package/corpus/templates/analytics/server/lib/dashboard-catalog.ts +9 -2
  52. package/corpus/templates/analytics/server/lib/demo-dashboards.ts +1 -1
  53. package/corpus/templates/analytics/server/plugins/agent-chat.ts +2 -2
  54. package/corpus/templates/analytics/server/plugins/core-routes.ts +6 -6
  55. package/corpus/templates/assets/CHANGELOG.md +10 -0
  56. package/corpus/templates/assets/app/root.tsx +7 -1
  57. package/corpus/templates/assets/app/routes/settings.tsx +6 -0
  58. package/corpus/templates/brain/CHANGELOG.md +10 -0
  59. package/corpus/templates/brain/app/root.tsx +7 -1
  60. package/corpus/templates/brain/app/routes/settings.tsx +8 -1
  61. package/corpus/templates/calendar/CHANGELOG.md +10 -0
  62. package/corpus/templates/calendar/app/pages/Settings.tsx +4 -0
  63. package/corpus/templates/calendar/app/root.tsx +7 -1
  64. package/corpus/templates/chat/CHANGELOG.md +10 -0
  65. package/corpus/templates/chat/app/root.tsx +7 -1
  66. package/corpus/templates/clips/CHANGELOG.md +10 -0
  67. package/corpus/templates/clips/app/components/player/share-dialog.tsx +33 -7
  68. package/corpus/templates/clips/app/components/player/sign-in-prompt-dialog.tsx +8 -0
  69. package/corpus/templates/clips/app/components/player/video-player.tsx +150 -20
  70. package/corpus/templates/clips/app/components/recorder/pre-record-panel.tsx +7 -11
  71. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +31 -0
  72. package/corpus/templates/clips/app/components/sharing/slack-share-hint.tsx +71 -0
  73. package/corpus/templates/clips/app/root.tsx +7 -1
  74. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +15 -1
  75. package/corpus/templates/clips/app/routes/record.tsx +78 -5
  76. package/corpus/templates/clips/app/routes/share.$shareId.tsx +86 -5
  77. package/corpus/templates/clips/changelog/2026-06-23-clips-shared-in-slack-no-longer-show-a-could-not-start-playb.md +6 -0
  78. package/corpus/templates/clips/changelog/2026-06-23-made-the-play-button-on-shared-and-embedded-clips-scale-with.md +6 -0
  79. package/corpus/templates/clips/changelog/2026-06-23-public-clip-share-links-now-show-whether-they-ll-play-inline.md +6 -0
  80. package/corpus/templates/clips/changelog/2026-06-23-screen-camera-recordings-now-keep-the-presenter-s-face-in-th.md +6 -0
  81. package/corpus/templates/clips/desktop/src/lib/recorder.ts +20 -0
  82. package/corpus/templates/clips/desktop/src/main.tsx +3 -0
  83. package/corpus/templates/clips/desktop/src/overlays/region-record-border.tsx +76 -0
  84. package/corpus/templates/clips/desktop/src/styles.css +49 -0
  85. package/corpus/templates/clips/desktop/src-tauri/capabilities/default.json +2 -1
  86. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +67 -1
  87. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +2 -0
  88. package/corpus/templates/clips/desktop/src-tauri/src/util.rs +4 -1
  89. package/corpus/templates/clips/server/routes/api/video/[recordingId].get.ts +51 -1
  90. package/corpus/templates/clips/shared/share-attribution.ts +79 -0
  91. package/corpus/templates/content/CHANGELOG.md +10 -0
  92. package/corpus/templates/content/app/root.tsx +7 -1
  93. package/corpus/templates/design/CHANGELOG.md +10 -0
  94. package/corpus/templates/design/actions/generate-design.ts +4 -0
  95. package/corpus/templates/design/app/root.tsx +7 -1
  96. package/corpus/templates/design/app/routes/settings.tsx +10 -2
  97. package/corpus/templates/dispatch/CHANGELOG.md +10 -0
  98. package/corpus/templates/dispatch/app/root.tsx +7 -1
  99. package/corpus/templates/forms/CHANGELOG.md +10 -0
  100. package/corpus/templates/forms/app/root.tsx +7 -1
  101. package/corpus/templates/macros/CHANGELOG.md +10 -0
  102. package/corpus/templates/macros/app/root.tsx +7 -1
  103. package/corpus/templates/mail/CHANGELOG.md +10 -0
  104. package/corpus/templates/mail/app/components/layout/CommandPalette.tsx +3 -0
  105. package/corpus/templates/mail/app/pages/SettingsPage.tsx +27 -0
  106. package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +31 -17
  107. package/corpus/templates/plan/.agents/skills/visual-plan/references/wireframe.md +7 -4
  108. package/corpus/templates/plan/.agents/skills/visual-recap/SKILL.md +34 -24
  109. package/corpus/templates/plan/.agents/skills/visual-recap/references/wireframe.md +7 -4
  110. package/corpus/templates/plan/AGENTS.md +4 -0
  111. package/corpus/templates/plan/CHANGELOG.md +10 -0
  112. package/corpus/templates/plan/actions/view-screen.ts +5 -0
  113. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +98 -1
  114. package/corpus/templates/plan/app/pages/PlansPage.tsx +107 -7
  115. package/corpus/templates/plan/app/root.tsx +7 -1
  116. package/corpus/templates/plan/shared/share-attribution.ts +72 -0
  117. package/corpus/templates/slides/CHANGELOG.md +10 -0
  118. package/corpus/templates/slides/app/root.tsx +7 -1
  119. package/corpus/templates/videos/CHANGELOG.md +4 -151
  120. package/corpus/templates/videos/app/root.tsx +7 -1
  121. package/dist/changelog/parse.d.ts +70 -0
  122. package/dist/changelog/parse.d.ts.map +1 -0
  123. package/dist/changelog/parse.js +200 -0
  124. package/dist/changelog/parse.js.map +1 -0
  125. package/dist/cli/changelog.d.ts +4 -0
  126. package/dist/cli/changelog.d.ts.map +1 -0
  127. package/dist/cli/changelog.js +166 -0
  128. package/dist/cli/changelog.js.map +1 -0
  129. package/dist/cli/index.js +18 -0
  130. package/dist/cli/index.js.map +1 -1
  131. package/dist/cli/recap.d.ts.map +1 -1
  132. package/dist/cli/recap.js +22 -1
  133. package/dist/cli/recap.js.map +1 -1
  134. package/dist/cli/skills.d.ts +3 -3
  135. package/dist/cli/skills.d.ts.map +1 -1
  136. package/dist/cli/skills.js +72 -45
  137. package/dist/cli/skills.js.map +1 -1
  138. package/dist/client/CommandMenu.d.ts +17 -1
  139. package/dist/client/CommandMenu.d.ts.map +1 -1
  140. package/dist/client/CommandMenu.js +49 -13
  141. package/dist/client/CommandMenu.js.map +1 -1
  142. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  143. package/dist/client/agent-chat-adapter.js +43 -6
  144. package/dist/client/agent-chat-adapter.js.map +1 -1
  145. package/dist/client/analytics.d.ts +18 -0
  146. package/dist/client/analytics.d.ts.map +1 -1
  147. package/dist/client/analytics.js +177 -0
  148. package/dist/client/analytics.js.map +1 -1
  149. package/dist/client/changelog/Changelog.d.ts +47 -0
  150. package/dist/client/changelog/Changelog.d.ts.map +1 -0
  151. package/dist/client/changelog/Changelog.js +138 -0
  152. package/dist/client/changelog/Changelog.js.map +1 -0
  153. package/dist/client/index.d.ts +2 -1
  154. package/dist/client/index.d.ts.map +1 -1
  155. package/dist/client/index.js +2 -1
  156. package/dist/client/index.js.map +1 -1
  157. package/dist/client/mcp-apps/McpAppRenderer.d.ts +1 -0
  158. package/dist/client/mcp-apps/McpAppRenderer.d.ts.map +1 -1
  159. package/dist/client/mcp-apps/McpAppRenderer.js +42 -1
  160. package/dist/client/mcp-apps/McpAppRenderer.js.map +1 -1
  161. package/dist/client/settings/useBuilderStatus.d.ts +2 -0
  162. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  163. package/dist/client/settings/useBuilderStatus.js +58 -10
  164. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  165. package/dist/mcp/build-server.js +1 -1
  166. package/dist/mcp/build-server.js.map +1 -1
  167. package/dist/mcp/embed-app.d.ts.map +1 -1
  168. package/dist/mcp/embed-app.js +112 -6
  169. package/dist/mcp/embed-app.js.map +1 -1
  170. package/dist/server/attribution.d.ts +83 -0
  171. package/dist/server/attribution.d.ts.map +1 -0
  172. package/dist/server/attribution.js +178 -0
  173. package/dist/server/attribution.js.map +1 -0
  174. package/dist/server/auth.d.ts.map +1 -1
  175. package/dist/server/auth.js +7 -0
  176. package/dist/server/auth.js.map +1 -1
  177. package/dist/server/better-auth-instance.d.ts +9 -1
  178. package/dist/server/better-auth-instance.d.ts.map +1 -1
  179. package/dist/server/better-auth-instance.js +32 -2
  180. package/dist/server/better-auth-instance.js.map +1 -1
  181. package/dist/server/builder-browser.d.ts +4 -0
  182. package/dist/server/builder-browser.d.ts.map +1 -1
  183. package/dist/server/builder-browser.js +20 -1
  184. package/dist/server/builder-browser.js.map +1 -1
  185. package/dist/server/core-routes-plugin.d.ts +25 -0
  186. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  187. package/dist/server/core-routes-plugin.js +38 -0
  188. package/dist/server/core-routes-plugin.js.map +1 -1
  189. package/dist/server/google-oauth.d.ts.map +1 -1
  190. package/dist/server/google-oauth.js +16 -2
  191. package/dist/server/google-oauth.js.map +1 -1
  192. package/dist/shared/mcp-embed-headers.js +1 -1
  193. package/dist/shared/mcp-embed-headers.js.map +1 -1
  194. package/dist/styles/agent-conversation.css +21 -0
  195. package/dist/templates/workspace-core/.agents/skills/changelog/SKILL.md +111 -0
  196. package/dist/templates/workspace-core/.agents/skills/tracking/SKILL.md +46 -14
  197. package/package.json +1 -1
  198. package/src/templates/workspace-core/.agents/skills/changelog/SKILL.md +111 -0
  199. package/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +46 -14
  200. /package/corpus/templates/analytics/app/routes/{dashboards.tsx → dashboards._index.tsx} +0 -0
@@ -49,6 +49,7 @@ import {
49
49
  import { getOrgContext } from "@agent-native/core/org";
50
50
  import { resolveAccess } from "@agent-native/core/sharing";
51
51
  import {
52
+ captureRouteError,
52
53
  getSession,
53
54
  runWithRequestContext,
54
55
  signShortLivedToken,
@@ -404,7 +405,56 @@ export default defineEventHandler(async (event: H3Event) => {
404
405
  setResponseStatus(event, upstream.status);
405
406
  return { error: upstream.error };
406
407
  }
407
- return providerResponse(upstream);
408
+ // The provider answered, but with a server error (e.g. the CDN asset is
409
+ // broken and returns 5xx). Don't proxy an opaque upstream error — and
410
+ // don't risk reconstructing a Response from it, which previously threw
411
+ // and surfaced as an unhandled 500 on every request. Capture it so the
412
+ // broken asset is diagnosable, and return a clean 502.
413
+ if (upstream.status >= 500) {
414
+ captureRouteError(
415
+ new Error(
416
+ `Storage provider returned ${upstream.status} for recording media`,
417
+ ),
418
+ {
419
+ route: "api/video",
420
+ tags: {
421
+ mediaPath: "provider-proxy",
422
+ upstreamStatus: String(upstream.status),
423
+ },
424
+ extra: { recordingId },
425
+ },
426
+ );
427
+ setResponseStatus(event, 502);
428
+ setResponseHeader(
429
+ event,
430
+ "Cache-Control",
431
+ "private, max-age=0, no-store",
432
+ );
433
+ return {
434
+ error: "The recording's media could not be loaded from storage.",
435
+ upstreamStatus: upstream.status,
436
+ };
437
+ }
438
+ try {
439
+ return providerResponse(upstream);
440
+ } catch (err) {
441
+ // Reconstructing the proxied Response should not happen, but if it
442
+ // does, fail cleanly instead of as an unhandled 500.
443
+ captureRouteError(err, {
444
+ route: "api/video",
445
+ tags: { mediaPath: "provider-proxy-response" },
446
+ extra: { recordingId, upstreamStatus: String(upstream.status) },
447
+ });
448
+ setResponseStatus(event, 502);
449
+ setResponseHeader(
450
+ event,
451
+ "Cache-Control",
452
+ "private, max-age=0, no-store",
453
+ );
454
+ return {
455
+ error: "The recording's media could not be loaded from storage.",
456
+ };
457
+ }
408
458
  }
409
459
  const mimeType =
410
460
  typeof blob?.mimeType === "string" ? blob.mimeType : "video/webm";
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Viral attribution contract for shared Clips links.
3
+ *
4
+ * Shared clip URLs self-attribute so the signup funnel can be measured even
5
+ * when `document.referrer` is empty (desktop app, Slack, native clients, etc.).
6
+ * The framework captures first-touch from these params into a cookie and
7
+ * enriches the `signup` event; Clips' job is to (a) tag share/embed URLs and
8
+ * (b) emit funnel events from the public share page.
9
+ *
10
+ * Contract strings are centralized here so the minting side (share dialog) and
11
+ * the measuring side (public share page) cannot drift apart.
12
+ *
13
+ * Privacy: `via` must be a non-PII stable id (e.g. the owner's user id), never
14
+ * an email. Omit `via` rather than leak PII into a public URL or event.
15
+ */
16
+
17
+ /** Fixed referral source for clip shares. */
18
+ export const CLIP_SHARE_REF = "clip_share";
19
+
20
+ /** Query param names that carry attribution. */
21
+ export const REF_PARAM = "ref";
22
+ export const VIA_PARAM = "via";
23
+
24
+ /**
25
+ * Append `ref=clip_share` (and `via=<ownerId>` when a non-PII owner id is
26
+ * known) to an absolute share/embed URL, preserving any existing query params.
27
+ * Returns the input unchanged when it isn't a parseable absolute URL.
28
+ */
29
+ export function withShareAttribution(
30
+ url: string,
31
+ ownerId?: string | null,
32
+ ): string {
33
+ if (!url) return url;
34
+ try {
35
+ const parsed = new URL(url);
36
+ parsed.searchParams.set(REF_PARAM, CLIP_SHARE_REF);
37
+ const owner = (ownerId ?? "").trim();
38
+ if (owner) parsed.searchParams.set(VIA_PARAM, owner);
39
+ return parsed.toString();
40
+ } catch {
41
+ return url;
42
+ }
43
+ }
44
+
45
+ export type ShareAttribution = {
46
+ ref: string | undefined;
47
+ via: string | undefined;
48
+ };
49
+
50
+ /**
51
+ * Read `ref`/`via` from a query string (e.g. `window.location.search`). Falls
52
+ * back to `ref=clip_share` so downstream attribution stays meaningful even when
53
+ * the visitor arrived via a link that lost the param.
54
+ */
55
+ export function readShareAttribution(search: string): ShareAttribution {
56
+ let ref: string | undefined;
57
+ let via: string | undefined;
58
+ try {
59
+ const params = new URLSearchParams(search ?? "");
60
+ ref = params.get(REF_PARAM) ?? undefined;
61
+ via = params.get(VIA_PARAM) ?? undefined;
62
+ } catch {
63
+ // Ignore malformed query strings — fall through to the default below.
64
+ }
65
+ return { ref: ref || CLIP_SHARE_REF, via: via || undefined };
66
+ }
67
+
68
+ /**
69
+ * Build the attribution-forwarding signup path so attribution survives even if
70
+ * cookies are blocked. The framework also captures these params on the
71
+ * `/signup` page load.
72
+ */
73
+ export function buildSignupAttributionQuery(via?: string | null): string {
74
+ const params = new URLSearchParams();
75
+ params.set(REF_PARAM, CLIP_SHARE_REF);
76
+ const owner = (via ?? "").trim();
77
+ if (owner) params.set(VIA_PARAM, owner);
78
+ return params.toString();
79
+ }
@@ -0,0 +1,10 @@
1
+ # Changelog
2
+
3
+ All notable user-facing changes to Agent-Native Content are documented here. Open it any
4
+ time from the command menu (Cmd+K → "What's new").
5
+
6
+ ## 2026-06-23
7
+
8
+ ### Added
9
+
10
+ - See what's new right inside Agent-Native Content — a changelog now lives in the command menu (Cmd+K).
@@ -26,6 +26,7 @@ import {
26
26
  } from "@agent-native/core/client";
27
27
  import { useDbSync } from "./hooks/use-db-sync";
28
28
  import { useNavigationState } from "./hooks/use-navigation-state";
29
+ import changelog from "../CHANGELOG.md?raw";
29
30
  import type { LinksFunction } from "react-router";
30
31
  import stylesheet from "./global.css?url";
31
32
  import { configureTracking } from "@agent-native/core/client";
@@ -247,7 +248,12 @@ export default function Root() {
247
248
  >
248
249
  <AppSetup />
249
250
  <Toaster />
250
- <CommandMenu open={cmdkOpen} onOpenChange={setCmdkOpen}>
251
+ <CommandMenu
252
+ open={cmdkOpen}
253
+ onOpenChange={setCmdkOpen}
254
+ changelog={changelog}
255
+ changelogKey="content"
256
+ >
251
257
  <CommandMenu.Group heading="Content">
252
258
  <CommandMenu.Item onSelect={() => {}}>
253
259
  Search documents
@@ -0,0 +1,10 @@
1
+ # Changelog
2
+
3
+ All notable user-facing changes to Design are documented here. Open it any time
4
+ from the command menu (Cmd+K → "What's new") or from Settings.
5
+
6
+ ## 2026-06-23
7
+
8
+ ### Added
9
+
10
+ - See what's new right inside Design — a changelog now lives in the command menu (Cmd+K) and in Settings.
@@ -29,6 +29,10 @@ export default defineAction({
29
29
  "The agent calls this after generating HTML/CSS/JSX content to persist it " +
30
30
  "as files in the design project. Creates or updates files as needed. " +
31
31
  "Returns the saved files and design URL path for iframe rendering. " +
32
+ "Keep the first save compact and working; for large designs, persist a minimal " +
33
+ "version then refine individual files with `edit-design` (search/replace) rather " +
34
+ "than resending a big multi-file payload — a single oversized payload can get cut " +
35
+ "off mid-stream and stall the turn. " +
32
36
  "Do not report a design as ready until this action succeeds.",
33
37
  schema: z.object({
34
38
  designId: z.string().describe("Design project ID to save content to"),
@@ -14,6 +14,7 @@ import {
14
14
  configureTracking,
15
15
  } from "@agent-native/core/client";
16
16
  import { IconSun, IconMoon } from "@tabler/icons-react";
17
+ import changelog from "../CHANGELOG.md?raw";
17
18
  import { Toaster } from "@/components/ui/sonner";
18
19
  import { Layout as AppLayout } from "@/components/layout/Layout";
19
20
  import type { LinksFunction } from "react-router";
@@ -99,7 +100,12 @@ export default function Root() {
99
100
  <AppProviders queryClient={queryClient}>
100
101
  <DbSyncSetup />
101
102
  <Toaster richColors position="bottom-left" />
102
- <CommandMenu open={cmdkOpen} onOpenChange={setCmdkOpen}>
103
+ <CommandMenu
104
+ open={cmdkOpen}
105
+ onOpenChange={setCmdkOpen}
106
+ changelog={changelog}
107
+ changelogKey="design"
108
+ >
103
109
  <CommandMenu.Group heading="Actions">
104
110
  <CommandMenu.Item onSelect={() => {}}>Search</CommandMenu.Item>
105
111
  </CommandMenu.Group>
@@ -1,4 +1,9 @@
1
- import { SettingsPanel, useDevMode } from "@agent-native/core/client";
1
+ import {
2
+ SettingsPanel,
3
+ useDevMode,
4
+ ChangelogSettingsCard,
5
+ } from "@agent-native/core/client";
6
+ import changelog from "../../CHANGELOG.md?raw";
2
7
 
3
8
  export function meta() {
4
9
  return [{ title: "Settings — Design" }];
@@ -8,12 +13,15 @@ export default function SettingsRoute() {
8
13
  const { isDevMode, canToggle, setDevMode } = useDevMode();
9
14
 
10
15
  return (
11
- <div className="flex h-full min-h-0 flex-col bg-background">
16
+ <div className="flex h-full min-h-0 flex-col overflow-y-auto bg-background">
12
17
  <SettingsPanel
13
18
  isDevMode={isDevMode}
14
19
  onToggleDevMode={() => setDevMode(!isDevMode)}
15
20
  showDevToggle={canToggle}
16
21
  />
22
+ <div className="mx-auto w-full max-w-2xl px-4 pb-8">
23
+ <ChangelogSettingsCard markdown={changelog} />
24
+ </div>
17
25
  </div>
18
26
  );
19
27
  }
@@ -0,0 +1,10 @@
1
+ # Changelog
2
+
3
+ All notable user-facing changes to Agent-Native Dispatch are documented here. Open it any
4
+ time from the command menu (Cmd+K → "What's new").
5
+
6
+ ## 2026-06-23
7
+
8
+ ### Added
9
+
10
+ - See what's new right inside Agent-Native Dispatch — a changelog now lives in the command menu (Cmd+K).
@@ -25,6 +25,7 @@ import { useTheme } from "next-themes";
25
25
  import { Layout as AppLayout } from "@agent-native/dispatch/components";
26
26
  import type { LinksFunction } from "react-router";
27
27
  import { dispatchExtensions } from "./dispatch-extensions";
28
+ import changelog from "../CHANGELOG.md?raw";
28
29
  import stylesheet from "./global.css?url";
29
30
 
30
31
  configureTracking({
@@ -166,7 +167,12 @@ function AppContent() {
166
167
  return (
167
168
  <>
168
169
  <DbSyncSetup />
169
- <CommandMenu open={cmdkOpen} onOpenChange={setCmdkOpen}>
170
+ <CommandMenu
171
+ open={cmdkOpen}
172
+ onOpenChange={setCmdkOpen}
173
+ changelog={changelog}
174
+ changelogKey="dispatch"
175
+ >
170
176
  <CommandMenu.Group heading="Actions">
171
177
  <CommandMenu.Item onSelect={() => {}}>Search</CommandMenu.Item>
172
178
  </CommandMenu.Group>
@@ -0,0 +1,10 @@
1
+ # Changelog
2
+
3
+ All notable user-facing changes to Agent-Native Forms are documented here. Open it any
4
+ time from the command menu (Cmd+K → "What's new").
5
+
6
+ ## 2026-06-23
7
+
8
+ ### Added
9
+
10
+ - See what's new right inside Agent-Native Forms — a changelog now lives in the command menu (Cmd+K).
@@ -27,6 +27,7 @@ import {
27
27
  setClientAppState,
28
28
  } from "@agent-native/core/client";
29
29
  import type { LinksFunction } from "react-router";
30
+ import changelog from "../CHANGELOG.md?raw";
30
31
  import stylesheet from "./global.css?url";
31
32
  import { TAB_ID } from "@/lib/tab-id";
32
33
 
@@ -198,7 +199,12 @@ export default function Root() {
198
199
  <NavigationStateSync />
199
200
  <UrlStateSync />
200
201
  <OpenLinkInterceptor />
201
- <CommandMenu open={cmdkOpen} onOpenChange={setCmdkOpen}>
202
+ <CommandMenu
203
+ open={cmdkOpen}
204
+ onOpenChange={setCmdkOpen}
205
+ changelog={changelog}
206
+ changelogKey="forms"
207
+ >
202
208
  <CommandMenu.Group heading="Forms">
203
209
  <CommandMenu.Item onSelect={() => {}}>Search forms</CommandMenu.Item>
204
210
  </CommandMenu.Group>
@@ -0,0 +1,10 @@
1
+ # Changelog
2
+
3
+ All notable user-facing changes to Agent-Native Macros are documented here. Open it any
4
+ time from the command menu (Cmd+K → "What's new").
5
+
6
+ ## 2026-06-23
7
+
8
+ ### Added
9
+
10
+ - See what's new right inside Agent-Native Macros — a changelog now lives in the command menu (Cmd+K).
@@ -17,6 +17,7 @@ import { IconSun, IconMoon } from "@tabler/icons-react";
17
17
  import { TAB_ID } from "@/lib/tab-id";
18
18
  import { AppLayout } from "@/components/layout/AppLayout";
19
19
  import type { LinksFunction } from "react-router";
20
+ import changelog from "../CHANGELOG.md?raw";
20
21
  import stylesheet from "./global.css?url";
21
22
 
22
23
  configureTracking({
@@ -124,7 +125,12 @@ export default function Root() {
124
125
  toaster={<Toaster richColors position="bottom-left" />}
125
126
  >
126
127
  <DbSyncSetup />
127
- <CommandMenu open={cmdkOpen} onOpenChange={setCmdkOpen}>
128
+ <CommandMenu
129
+ open={cmdkOpen}
130
+ onOpenChange={setCmdkOpen}
131
+ changelog={changelog}
132
+ changelogKey="macros"
133
+ >
128
134
  <CommandMenu.Group heading="Actions">
129
135
  <CommandMenu.Item onSelect={() => {}}>Search</CommandMenu.Item>
130
136
  </CommandMenu.Group>
@@ -0,0 +1,10 @@
1
+ # Changelog
2
+
3
+ All notable user-facing changes to Agent-Native Mail are documented here. Open it any
4
+ time from the command menu (Cmd+K → "What's new") or from Settings.
5
+
6
+ ## 2026-06-23
7
+
8
+ ### Added
9
+
10
+ - See what's new right inside Agent-Native Mail — a changelog now lives in the command menu (Cmd+K) and in Settings.
@@ -25,6 +25,7 @@ import { CommandMenu } from "@agent-native/core/client";
25
25
  import { useTheme } from "next-themes";
26
26
  import { useSettings, useUpdateSettings } from "@/hooks/use-emails";
27
27
  import { getResolvedTheme } from "@/lib/theme";
28
+ import changelog from "../../../CHANGELOG.md?raw";
28
29
 
29
30
  interface CommandPaletteProps {
30
31
  open: boolean;
@@ -91,6 +92,8 @@ export function CommandPalette({
91
92
  open={open}
92
93
  onOpenChange={onOpenChange}
93
94
  placeholder="Type a command or ask AI..."
95
+ changelog={changelog}
96
+ changelogKey="mail"
94
97
  >
95
98
  <CommandMenu.Group heading="Actions">
96
99
  <CommandMenu.Item
@@ -6,8 +6,10 @@ import {
6
6
  useActionMutation,
7
7
  useChatModels,
8
8
  useChangeVersions,
9
+ ChangelogSettingsCard,
9
10
  } from "@agent-native/core/client";
10
11
  import { appApiPath } from "@agent-native/core/client";
12
+ import changelog from "../../CHANGELOG.md?raw";
11
13
  import {
12
14
  IconUsers,
13
15
  IconPlus,
@@ -24,6 +26,7 @@ import {
24
26
  IconSignature,
25
27
  IconFilter,
26
28
  IconInfoCircle,
29
+ IconHistory,
27
30
  } from "@tabler/icons-react";
28
31
  import { cn } from "@/lib/utils";
29
32
  import { Button } from "@/components/ui/button";
@@ -1379,9 +1382,31 @@ function SlackIntakeSection() {
1379
1382
  );
1380
1383
  }
1381
1384
 
1385
+ // ─── What's New Section ──────────────────────────────────────────────────────
1386
+
1387
+ function WhatsNewSection() {
1388
+ return (
1389
+ <div className="flex-1 overflow-y-auto p-4 sm:p-8">
1390
+ <div className="mb-6">
1391
+ <h2 className="text-[16px] font-semibold text-foreground">
1392
+ What's new
1393
+ </h2>
1394
+ <p className="mt-0.5 text-[13px] text-muted-foreground">
1395
+ Recent user-facing changes to Agent-Native Mail.
1396
+ </p>
1397
+ </div>
1398
+
1399
+ <div className="max-w-2xl">
1400
+ <ChangelogSettingsCard markdown={changelog} />
1401
+ </div>
1402
+ </div>
1403
+ );
1404
+ }
1405
+
1382
1406
  // ─── Settings Page ────────────────────────────────────────────────────────────
1383
1407
 
1384
1408
  type SettingsSection =
1409
+ | "whats-new"
1385
1410
  | "drafting"
1386
1411
  | "automations"
1387
1412
  | "gmail-filters"
@@ -1395,6 +1420,7 @@ const navItems: {
1395
1420
  label: string;
1396
1421
  icon: React.ComponentType<{ className?: string }>;
1397
1422
  }[] = [
1423
+ { id: "whats-new", label: "What's new", icon: IconHistory },
1398
1424
  { id: "drafting", label: "Drafting", icon: IconSignature },
1399
1425
  { id: "automations", label: "Automations", icon: IconBolt },
1400
1426
  { id: "gmail-filters", label: "Gmail Filters", icon: IconFilter },
@@ -1464,6 +1490,7 @@ export function SettingsPage() {
1464
1490
 
1465
1491
  {/* Right content panel */}
1466
1492
  <div className="flex flex-1 overflow-hidden bg-background">
1493
+ {activeSection === "whats-new" && <WhatsNewSection />}
1467
1494
  {activeSection === "drafting" && <DraftingSection />}
1468
1495
  {activeSection === "automations" && <AutomationsSection />}
1469
1496
  {activeSection === "gmail-filters" && <GmailFiltersSection />}
@@ -88,13 +88,14 @@ surface.
88
88
  approach and options in the plan. Ask a clarifying question only when an
89
89
  ambiguity would change the design and you cannot resolve it from the code; use
90
90
  the host agent's normal ask-user-question flow and batch 2-4 high-leverage
91
- questions before finalizing. Do not call `create-visual-questions` from
92
- `/visual-plan`. Otherwise state the assumption explicitly and proceed, and
93
- keep anything unresolved in the plan's single bottom `question-form` Open
94
- Questions block. For complex plans, do a final open-question pass before
95
- handoff: if a decision would affect architecture, scope, UX, data shape, or
96
- rollout, either decide it in the plan with rationale or put it in that bottom
97
- form with a recommended default.
91
+ questions before finalizing. Do not call `create-visual-questions` for
92
+ ordinary clarification or preflight; reserve it for the visual-intake mode when
93
+ the user explicitly asks for a visual intake questionnaire. Otherwise state the
94
+ assumption explicitly and proceed, and keep anything unresolved in the plan's
95
+ single bottom `question-form` Open Questions block. For complex plans, do a
96
+ final open-question pass before handoff: if a decision would affect
97
+ architecture, scope, UX, data shape, or rollout, either decide it in the plan
98
+ with rationale or put it in that bottom form with a recommended default.
98
99
  - **The plan is the approval gate.** After surfacing it, ask the user to review
99
100
  and approve before you write code, and name which files/areas the work touches.
100
101
  Presenting the plan and requesting sign-off is the approval step — do not ask a
@@ -139,6 +140,11 @@ is reachable. Local-files privacy mode (after Tool Guidance) is the exception.
139
140
 
140
141
  ## Core Workflow
141
142
 
143
+ This section describes the default hosted Plan MCP workflow. If
144
+ `AGENT_NATIVE_PLANS_MODE=local-files` is set, or the user asks for fully local
145
+ files/no hosted Plan writes, use **Local-Files Privacy Mode** instead; carry
146
+ forward only the code-research and plan-composition guidance here.
147
+
142
148
  1. Follow the host agent's normal planning flow: inspect the codebase, delegate
143
149
  wide exploration when useful, gather the info needed, and ask native
144
150
  clarifying questions as needed before generating the plan. If a source plan
@@ -185,11 +191,13 @@ is reachable. Local-files privacy mode (after Tool Guidance) is the exception.
185
191
  backend, data, multi-file, or risky), also kick off the self-review pass in
186
192
  **Self-Review Before Handoff** while the user reads, instead of blocking the
187
193
  handoff on it.
188
- 5. Call `get-plan-feedback` before editing, after review, after any long pause,
194
+ 5. For hosted plans, call `get-plan-feedback` before editing, after review,
195
+ after any long pause,
189
196
  and before the final response. Treat `anchorDetails`, resolver intent, recent
190
197
  review events, and any focused screenshots from browser handoff as the source
191
198
  of truth for exactly what changed and exactly what each comment points at.
192
- 6. Apply changes with `update-visual-plan`, preferring targeted `contentPatches`.
199
+ 6. For hosted plans, apply changes with `update-visual-plan`, preferring
200
+ targeted `contentPatches`.
193
201
  Treat the top-level `content` payload as a full replacement, not a merge; do
194
202
  not send a partial `content` object to add a canvas or one block. If a full
195
203
  replacement is unavoidable, first read the complete plan source/content, carry
@@ -197,8 +205,8 @@ is reachable. Local-files privacy mode (after Tool Guidance) is the exception.
197
205
  afterward so the document body was not truncated. When the user wants
198
206
  source-control friendly edits, use `patch-visual-plan-source` against the MDX
199
207
  files instead of regenerating the plan.
200
- 7. Export with `export-visual-plan` only when the user wants a shareable receipt
201
- or repo-check-in artifacts.
208
+ 7. For hosted plans, export with `export-visual-plan` only when the user wants a
209
+ shareable receipt or repo-check-in artifacts.
202
210
 
203
211
  ## Self-Review Before Handoff
204
212
 
@@ -394,11 +402,12 @@ The local-files contract is:
394
402
  wants the artifact checked into the repo, or use a repo-ignored/temporary
395
403
  folder such as `.agent-native/plans/<slug>/` or `/tmp/agent-native-plans/<slug>/`
396
404
  when it should not be checked in. The folder contains `plan.mdx`, optional
397
- `canvas.mdx`, optional `prototype.mdx`, and optional `.plan-state.json`.
398
- - Run `npx @agent-native/core@latest plan local check --dir plans/<slug>`
399
- before serving, then run
400
- `npx @agent-native/core@latest plan local serve --dir plans/<slug> --kind plan --open`.
401
- Report the returned local bridge URL from stdout or `plans/<slug>/.plan-url`.
405
+ `canvas.mdx`, optional `prototype.mdx`, and optional `.plan-state.json`. Use
406
+ that exact chosen folder as `<plan-dir>` in every local CLI command below.
407
+ - Run `npx @agent-native/core@latest plan local check --dir <plan-dir>` before
408
+ serving, then run
409
+ `npx @agent-native/core@latest plan local serve --dir <plan-dir> --kind plan --open`.
410
+ Report the returned local bridge URL from stdout or `<plan-dir>/.plan-url`.
402
411
  Treat `.plan-url` as a local token file and do not commit it. The URL opens
403
412
  the hosted Plan UI but reads from the localhost bridge on this machine, so it
404
413
  is not shareable across machines. On macOS, `--open` prefers Chromium browsers;
@@ -407,7 +416,7 @@ The local-files contract is:
407
416
  running locally with the same `PLAN_LOCAL_DIR`, the `/local-plans/<slug>` route
408
417
  is also valid.
409
418
  - For headless verification, run
410
- `npx @agent-native/core@latest plan local verify --dir plans/<slug> --kind plan`.
419
+ `npx @agent-native/core@latest plan local verify --dir <plan-dir> --kind plan`.
411
420
  It starts the bridge, checks the private-network preflight and JSON payload,
412
421
  prints diagnostics, and exits. If the browser hangs on "Loading plan", fetch
413
422
  the `bridgeUrl` from the verify/serve JSON to read the concrete validation
@@ -429,6 +438,11 @@ otherwise approved by the user.
429
438
 
430
439
  ## Interpreting comment anchors
431
440
 
441
+ This section applies to hosted plans with `get-plan-feedback` /
442
+ `update-visual-plan`. In local-files mode, do not call hosted feedback or update
443
+ tools; interpret file/chat feedback directly, edit the MDX files, rerun the
444
+ local bridge check/serve/verify command, and report the new local URL.
445
+
432
446
  `get-plan-feedback` returns rich anchors — read them before acting on any comment.
433
447
 
434
448
  - **Coordinate frames.** `targetX`/`targetY` are percentages *within* the
@@ -135,12 +135,15 @@ no labels or copy. The renderer drops borders, sketch, and color into the
135
135
  skeleton register automatically. Never escape to a `custom-html` document block
136
136
  to fake a loader.
137
137
 
138
- **Editing an existing mockup.** To change one element, text, or color in an
139
- existing html mockup, call `update-visual-plan`
140
- with `contentPatches: [{ op: "patch-wireframe-html", blockId, edits: [{ find,
138
+ **Editing an existing mockup.** In hosted mode, to change one element, text, or
139
+ color in an existing html mockup, do not regenerate the frame — call
140
+ `update-visual-plan` with
141
+ `contentPatches: [{ op: "patch-wireframe-html", blockId, edits: [{ find,
141
142
  replace }] }]`. Each `find` is a unique snippet of the current html (read it
142
143
  first with `get-visual-plan`); set `all: true` on an edit to replace every
143
- occurrence. The result is re-sanitized.
144
+ occurrence. The result is re-sanitized. In local-files privacy mode, do not call
145
+ hosted Plan tools; edit the local MDX source directly and rerun the local
146
+ check/serve or verify command for `<plan-dir>`.
144
147
 
145
148
  **Treat the wireframe border as part of the visible design.** Always wrap HTML
146
149
  wireframe content in a root container with real inner padding before drawing