@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.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +48 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/changelog/parse.ts +245 -0
- package/corpus/core/src/cli/changelog.ts +199 -0
- package/corpus/core/src/cli/index.ts +19 -0
- package/corpus/core/src/cli/recap.ts +24 -1
- package/corpus/core/src/cli/skills.ts +72 -45
- package/corpus/core/src/client/CommandMenu.tsx +183 -75
- package/corpus/core/src/client/agent-chat-adapter.ts +44 -7
- package/corpus/core/src/client/analytics.ts +181 -0
- package/corpus/core/src/client/changelog/Changelog.tsx +321 -0
- package/corpus/core/src/client/index.ts +11 -0
- package/corpus/core/src/client/mcp-apps/McpAppRenderer.tsx +54 -0
- package/corpus/core/src/client/settings/useBuilderStatus.ts +82 -20
- package/corpus/core/src/mcp/build-server.ts +1 -1
- package/corpus/core/src/mcp/embed-app.ts +112 -6
- package/corpus/core/src/server/attribution.ts +211 -0
- package/corpus/core/src/server/auth.ts +6 -0
- package/corpus/core/src/server/better-auth-instance.ts +49 -5
- package/corpus/core/src/server/builder-browser.ts +27 -1
- package/corpus/core/src/server/core-routes-plugin.ts +58 -0
- package/corpus/core/src/server/google-oauth.ts +19 -6
- package/corpus/core/src/shared/mcp-embed-headers.ts +1 -1
- package/corpus/core/src/styles/agent-conversation.css +21 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/changelog/SKILL.md +111 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +46 -14
- package/corpus/templates/analytics/CHANGELOG.md +10 -0
- package/corpus/templates/analytics/actions/install-dashboard-template.ts +2 -2
- package/corpus/templates/analytics/actions/open-traffic-dashboard.ts +1 -1
- package/corpus/templates/analytics/actions/update-dashboard.ts +5 -3
- package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +180 -144
- package/corpus/templates/analytics/app/components/layout/Header.tsx +2 -2
- package/corpus/templates/analytics/app/components/layout/Layout.tsx +7 -5
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +221 -213
- package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +6 -3
- package/corpus/templates/analytics/app/lib/demo-dashboard-path.ts +1 -1
- package/corpus/templates/analytics/app/lib/last-opened.ts +2 -1
- package/corpus/templates/analytics/app/pages/Settings.tsx +4 -0
- package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +3 -3
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/DashboardFilterBar.tsx +2 -2
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +101 -99
- package/corpus/templates/analytics/app/pages/overview/OverviewPage.tsx +1 -1
- package/corpus/templates/analytics/app/routes/adhoc.$id.tsx +18 -5
- package/corpus/templates/analytics/app/routes/catalog.tsx +1 -1
- package/corpus/templates/analytics/app/routes/dashboards.$id.tsx +9 -0
- package/corpus/templates/analytics/app/routes/traffic.tsx +1 -1
- package/corpus/templates/analytics/changelog/2026-06-23-the-dashboards-and-analyses-sidebar-settings-buttons-now-sta.md +6 -0
- package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +145 -0
- package/corpus/templates/analytics/server/db/index.ts +1 -1
- package/corpus/templates/analytics/server/lib/dashboard-catalog.ts +9 -2
- package/corpus/templates/analytics/server/lib/demo-dashboards.ts +1 -1
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +2 -2
- package/corpus/templates/analytics/server/plugins/core-routes.ts +6 -6
- package/corpus/templates/assets/CHANGELOG.md +10 -0
- package/corpus/templates/assets/app/root.tsx +7 -1
- package/corpus/templates/assets/app/routes/settings.tsx +6 -0
- package/corpus/templates/brain/CHANGELOG.md +10 -0
- package/corpus/templates/brain/app/root.tsx +7 -1
- package/corpus/templates/brain/app/routes/settings.tsx +8 -1
- package/corpus/templates/calendar/CHANGELOG.md +10 -0
- package/corpus/templates/calendar/app/pages/Settings.tsx +4 -0
- package/corpus/templates/calendar/app/root.tsx +7 -1
- package/corpus/templates/chat/CHANGELOG.md +10 -0
- package/corpus/templates/chat/app/root.tsx +7 -1
- package/corpus/templates/clips/CHANGELOG.md +10 -0
- package/corpus/templates/clips/app/components/player/share-dialog.tsx +33 -7
- package/corpus/templates/clips/app/components/player/sign-in-prompt-dialog.tsx +8 -0
- package/corpus/templates/clips/app/components/player/video-player.tsx +150 -20
- package/corpus/templates/clips/app/components/recorder/pre-record-panel.tsx +7 -11
- package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +31 -0
- package/corpus/templates/clips/app/components/sharing/slack-share-hint.tsx +71 -0
- package/corpus/templates/clips/app/root.tsx +7 -1
- package/corpus/templates/clips/app/routes/_app.settings._index.tsx +15 -1
- package/corpus/templates/clips/app/routes/record.tsx +78 -5
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +86 -5
- package/corpus/templates/clips/changelog/2026-06-23-clips-shared-in-slack-no-longer-show-a-could-not-start-playb.md +6 -0
- package/corpus/templates/clips/changelog/2026-06-23-made-the-play-button-on-shared-and-embedded-clips-scale-with.md +6 -0
- package/corpus/templates/clips/changelog/2026-06-23-public-clip-share-links-now-show-whether-they-ll-play-inline.md +6 -0
- package/corpus/templates/clips/changelog/2026-06-23-screen-camera-recordings-now-keep-the-presenter-s-face-in-th.md +6 -0
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +20 -0
- package/corpus/templates/clips/desktop/src/main.tsx +3 -0
- package/corpus/templates/clips/desktop/src/overlays/region-record-border.tsx +76 -0
- package/corpus/templates/clips/desktop/src/styles.css +49 -0
- package/corpus/templates/clips/desktop/src-tauri/capabilities/default.json +2 -1
- package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +67 -1
- package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +2 -0
- package/corpus/templates/clips/desktop/src-tauri/src/util.rs +4 -1
- package/corpus/templates/clips/server/routes/api/video/[recordingId].get.ts +51 -1
- package/corpus/templates/clips/shared/share-attribution.ts +79 -0
- package/corpus/templates/content/CHANGELOG.md +10 -0
- package/corpus/templates/content/app/root.tsx +7 -1
- package/corpus/templates/design/CHANGELOG.md +10 -0
- package/corpus/templates/design/actions/generate-design.ts +4 -0
- package/corpus/templates/design/app/root.tsx +7 -1
- package/corpus/templates/design/app/routes/settings.tsx +10 -2
- package/corpus/templates/dispatch/CHANGELOG.md +10 -0
- package/corpus/templates/dispatch/app/root.tsx +7 -1
- package/corpus/templates/forms/CHANGELOG.md +10 -0
- package/corpus/templates/forms/app/root.tsx +7 -1
- package/corpus/templates/macros/CHANGELOG.md +10 -0
- package/corpus/templates/macros/app/root.tsx +7 -1
- package/corpus/templates/mail/CHANGELOG.md +10 -0
- package/corpus/templates/mail/app/components/layout/CommandPalette.tsx +3 -0
- package/corpus/templates/mail/app/pages/SettingsPage.tsx +27 -0
- package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +31 -17
- package/corpus/templates/plan/.agents/skills/visual-plan/references/wireframe.md +7 -4
- package/corpus/templates/plan/.agents/skills/visual-recap/SKILL.md +34 -24
- package/corpus/templates/plan/.agents/skills/visual-recap/references/wireframe.md +7 -4
- package/corpus/templates/plan/AGENTS.md +4 -0
- package/corpus/templates/plan/CHANGELOG.md +10 -0
- package/corpus/templates/plan/actions/view-screen.ts +5 -0
- package/corpus/templates/plan/app/components/layout/Sidebar.tsx +98 -1
- package/corpus/templates/plan/app/pages/PlansPage.tsx +107 -7
- package/corpus/templates/plan/app/root.tsx +7 -1
- package/corpus/templates/plan/shared/share-attribution.ts +72 -0
- package/corpus/templates/slides/CHANGELOG.md +10 -0
- package/corpus/templates/slides/app/root.tsx +7 -1
- package/corpus/templates/videos/CHANGELOG.md +4 -151
- package/corpus/templates/videos/app/root.tsx +7 -1
- package/dist/changelog/parse.d.ts +70 -0
- package/dist/changelog/parse.d.ts.map +1 -0
- package/dist/changelog/parse.js +200 -0
- package/dist/changelog/parse.js.map +1 -0
- package/dist/cli/changelog.d.ts +4 -0
- package/dist/cli/changelog.d.ts.map +1 -0
- package/dist/cli/changelog.js +166 -0
- package/dist/cli/changelog.js.map +1 -0
- package/dist/cli/index.js +18 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/recap.d.ts.map +1 -1
- package/dist/cli/recap.js +22 -1
- package/dist/cli/recap.js.map +1 -1
- package/dist/cli/skills.d.ts +3 -3
- package/dist/cli/skills.d.ts.map +1 -1
- package/dist/cli/skills.js +72 -45
- package/dist/cli/skills.js.map +1 -1
- package/dist/client/CommandMenu.d.ts +17 -1
- package/dist/client/CommandMenu.d.ts.map +1 -1
- package/dist/client/CommandMenu.js +49 -13
- package/dist/client/CommandMenu.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +43 -6
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/analytics.d.ts +18 -0
- package/dist/client/analytics.d.ts.map +1 -1
- package/dist/client/analytics.js +177 -0
- package/dist/client/analytics.js.map +1 -1
- package/dist/client/changelog/Changelog.d.ts +47 -0
- package/dist/client/changelog/Changelog.d.ts.map +1 -0
- package/dist/client/changelog/Changelog.js +138 -0
- package/dist/client/changelog/Changelog.js.map +1 -0
- package/dist/client/index.d.ts +2 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +2 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/mcp-apps/McpAppRenderer.d.ts +1 -0
- package/dist/client/mcp-apps/McpAppRenderer.d.ts.map +1 -1
- package/dist/client/mcp-apps/McpAppRenderer.js +42 -1
- package/dist/client/mcp-apps/McpAppRenderer.js.map +1 -1
- package/dist/client/settings/useBuilderStatus.d.ts +2 -0
- package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
- package/dist/client/settings/useBuilderStatus.js +58 -10
- package/dist/client/settings/useBuilderStatus.js.map +1 -1
- package/dist/mcp/build-server.js +1 -1
- package/dist/mcp/build-server.js.map +1 -1
- package/dist/mcp/embed-app.d.ts.map +1 -1
- package/dist/mcp/embed-app.js +112 -6
- package/dist/mcp/embed-app.js.map +1 -1
- package/dist/server/attribution.d.ts +83 -0
- package/dist/server/attribution.d.ts.map +1 -0
- package/dist/server/attribution.js +178 -0
- package/dist/server/attribution.js.map +1 -0
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +7 -0
- package/dist/server/auth.js.map +1 -1
- package/dist/server/better-auth-instance.d.ts +9 -1
- package/dist/server/better-auth-instance.d.ts.map +1 -1
- package/dist/server/better-auth-instance.js +32 -2
- package/dist/server/better-auth-instance.js.map +1 -1
- package/dist/server/builder-browser.d.ts +4 -0
- package/dist/server/builder-browser.d.ts.map +1 -1
- package/dist/server/builder-browser.js +20 -1
- package/dist/server/builder-browser.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts +25 -0
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +38 -0
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/google-oauth.d.ts.map +1 -1
- package/dist/server/google-oauth.js +16 -2
- package/dist/server/google-oauth.js.map +1 -1
- package/dist/shared/mcp-embed-headers.js +1 -1
- package/dist/shared/mcp-embed-headers.js.map +1 -1
- package/dist/styles/agent-conversation.css +21 -0
- package/dist/templates/workspace-core/.agents/skills/changelog/SKILL.md +111 -0
- package/dist/templates/workspace-core/.agents/skills/tracking/SKILL.md +46 -14
- package/package.json +1 -1
- package/src/templates/workspace-core/.agents/skills/changelog/SKILL.md +111 -0
- package/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +46 -14
- /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
|
-
|
|
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
|
|
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
|
|
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 {
|
|
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
|
|
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
|
|
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
|
|
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`
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
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
|
|
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.**
|
|
139
|
-
existing html mockup, call
|
|
140
|
-
|
|
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
|