@agent-native/core 0.192.0-nightly-20260926081002 → 0.192.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 +1 -1
- package/corpus/templates/analytics/CHANGELOG.md +17 -0
- package/corpus/templates/analytics/actions/get-sql-dashboard.ts +27 -3
- package/corpus/templates/analytics/app/components/AnalyticsReviewArtifactPreview.tsx +8 -2
- package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +14 -10
- package/corpus/templates/analytics/app/root.tsx +2 -4
- package/corpus/templates/analytics/app/routes/_index.tsx +1 -36
- package/corpus/templates/analytics/app/routes/home.tsx +1 -1
- package/corpus/templates/analytics/changelog/2026-09-25-human-review-previews-show-same-organization-dashboard-chart.md +6 -0
- package/corpus/templates/analytics/changelog/2026-09-25-human-review-skips-saved-bigquery-queries-in-previews.md +6 -0
- package/corpus/templates/analytics/changelog/2026-09-26-the-app-entry-now-opens-the-shared-sign-in-and-sign-up-scree.md +6 -0
- package/corpus/templates/analytics/server/lib/dashboards-store.ts +14 -0
- package/corpus/templates/analytics/server/plugins/auth.ts +0 -3
- package/corpus/templates/assets/CHANGELOG.md +16 -0
- package/corpus/templates/assets/app/root.tsx +2 -7
- package/corpus/templates/assets/app/routes/_index.tsx +1 -36
- package/corpus/templates/assets/changelog/2026-09-26-the-app-entry-now-opens-the-shared-sign-in-and-sign-up-scree.md +6 -0
- package/corpus/templates/assets/server/plugins/auth.ts +0 -3
- package/corpus/templates/brain/app/root.tsx +2 -13
- package/corpus/templates/brain/app/routes/_index.tsx +1 -35
- package/corpus/templates/brain/app/routes/home.tsx +1 -1
- package/corpus/templates/calendar/CHANGELOG.md +15 -0
- package/corpus/templates/calendar/app/root.tsx +2 -10
- package/corpus/templates/calendar/app/routes/_index.tsx +1 -34
- package/corpus/templates/calendar/changelog/2026-09-26-the-app-entry-now-opens-the-shared-sign-in-and-sign-up-scree.md +6 -0
- package/corpus/templates/calendar/server/plugins/auth.ts +0 -3
- package/corpus/templates/chat/AGENTS.md +3 -3
- package/corpus/templates/chat/app/root.tsx +3 -15
- package/corpus/templates/chat/app/routes/_index.tsx +1 -37
- package/corpus/templates/chat/server/plugins/auth.ts +0 -3
- package/corpus/templates/clips/CHANGELOG.md +10 -0
- package/corpus/templates/clips/app/root.tsx +2 -10
- package/corpus/templates/clips/app/routes/_index.tsx +1 -33
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +2 -3
- package/corpus/templates/clips/changelog/2026-09-26-the-app-entry-now-opens-the-shared-sign-in-and-sign-up-scree.md +6 -0
- package/corpus/templates/clips/server/plugins/auth.ts +0 -3
- package/corpus/templates/content/app/root.tsx +2 -3
- package/corpus/templates/content/app/routes/_index.tsx +1 -33
- package/corpus/templates/content/server/plugins/auth.ts +0 -3
- package/corpus/templates/crm/app/root.tsx +3 -16
- package/corpus/templates/crm/app/routes/_index.tsx +1 -36
- package/corpus/templates/crm/app/routes/home.tsx +1 -1
- package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +30 -17
- package/corpus/templates/design/CHANGELOG.md +31 -0
- package/corpus/templates/design/actions/connect-localhost.ts +98 -37
- package/corpus/templates/design/actions/get-design.schema.ts +10 -0
- package/corpus/templates/design/actions/get-design.ts +25 -6
- package/corpus/templates/design/actions/publish-visual-edit-pending.ts +4 -59
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +108 -49
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +63 -21
- package/corpus/templates/design/app/components/design/types.ts +2 -0
- package/corpus/templates/design/app/pages/design-editor/commands/cross-screen-element-drop.ts +98 -9
- package/corpus/templates/design/app/pages/design-editor/commands/cross-screen-insert-timeout.ts +61 -6
- package/corpus/templates/design/app/pages/design-editor/commands/mode-change.ts +6 -5
- package/corpus/templates/design/app/pages/design-editor/commands/publish-visual-edit-pending.ts +21 -3
- package/corpus/templates/design/app/pages/design-editor/pending-edits.ts +4 -7
- package/corpus/templates/design/app/root.tsx +2 -20
- package/corpus/templates/design/app/routes/_index.tsx +1 -34
- package/corpus/templates/design/changelog/2026-09-25-fix-live-visual-edit-recovery-handoff-and-interaction-workfl.md +6 -0
- package/corpus/templates/design/changelog/2026-09-25-human-review-previews-show-the-actual-design-when-you-have-o.md +6 -0
- package/corpus/templates/design/changelog/2026-09-25-live-screens-recover-safely-from-interrupted-cross-screen-mo.md +6 -0
- package/corpus/templates/design/changelog/2026-09-26-canvas-focus-stays-on-toolbar-controls-when-a-live-preview-f.md +6 -0
- package/corpus/templates/design/changelog/2026-09-26-the-app-entry-now-opens-the-shared-sign-in-and-sign-up-scree.md +6 -0
- package/corpus/templates/design/server/plugins/auth.ts +0 -3
- package/corpus/templates/dispatch/app/root.tsx +2 -11
- package/corpus/templates/dispatch/app/routes/_index.tsx +1 -34
- package/corpus/templates/dispatch/server/plugins/setup-dispatch.ts +0 -3
- package/corpus/templates/factory/app/root.tsx +3 -15
- package/corpus/templates/factory/app/routes/_index.tsx +1 -34
- package/corpus/templates/factory/app/routes/home.tsx +1 -1
- package/corpus/templates/forms/AGENTS.md +1 -1
- package/corpus/templates/forms/app/root.tsx +2 -4
- package/corpus/templates/forms/app/routes/_index.tsx +1 -34
- package/corpus/templates/forms/server/plugins/auth.ts +0 -3
- package/corpus/templates/mail/CHANGELOG.md +8 -0
- package/corpus/templates/mail/app/root.tsx +2 -6
- package/corpus/templates/mail/app/routes/_index.tsx +1 -36
- package/corpus/templates/mail/app/routes/home.tsx +1 -1
- package/corpus/templates/mail/changelog/2026-09-26-the-app-entry-now-opens-the-shared-sign-in-and-sign-up-scree.md +6 -0
- package/corpus/templates/mail/server/plugins/auth.ts +0 -3
- package/corpus/templates/plan/app/root.tsx +7 -13
- package/corpus/templates/plan/app/routes/_index.tsx +1 -35
- package/corpus/templates/plan/app/routes/home.tsx +1 -1
- package/corpus/templates/plan/server/plugins/auth.ts +0 -3
- package/corpus/templates/slides/CHANGELOG.md +21 -0
- package/corpus/templates/slides/actions/get-deck.ts +49 -12
- package/corpus/templates/slides/app/root.tsx +1 -3
- package/corpus/templates/slides/app/routes/_index.tsx +1 -36
- package/corpus/templates/slides/app/routes/home.tsx +1 -1
- package/corpus/templates/slides/changelog/2026-09-25-human-review-previews-show-same-organization-slides-for-orga.md +6 -0
- package/corpus/templates/slides/changelog/2026-09-26-the-app-entry-now-opens-the-shared-sign-in-and-sign-up-scree.md +6 -0
- package/corpus/templates/slides/server/plugins/auth.ts +0 -3
- package/corpus/templates/tasks/AGENTS.md +1 -1
- package/corpus/templates/tasks/README.md +1 -1
- package/corpus/templates/tasks/app/root.tsx +2 -11
- package/corpus/templates/tasks/app/routes/_index.tsx +1 -37
- package/corpus/templates/tasks/app/routes/home.tsx +1 -1
- package/dist/cli/design-connect.d.ts +1 -0
- package/dist/cli/design-connect.js +94 -32
- package/dist/client/auth/AuthPage.d.ts +1 -17
- package/dist/client/auth/AuthPage.js +7 -49
- package/dist/client/observability/OutputPreview.js +8 -2
- package/dist/client/sign-in-landing.d.ts +1 -0
- package/dist/client/sign-in-landing.js +8 -0
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/deploy/workspace-deploy.js +32 -8
- package/dist/file-upload/actions/upload-image.d.ts +1 -1
- package/dist/provider-api/actions/custom-provider-registration.d.ts +7 -7
- package/dist/provider-api/actions/provider-api.d.ts +3 -3
- package/dist/server/auth-marketing.d.ts +0 -7
- package/dist/server/auth-marketing.js +0 -36
- package/dist/server/auth.d.ts +1 -10
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/onboarding-html.d.ts +1 -12
- package/dist/server/onboarding-html.js +4 -817
- package/dist/shared/ssr-auth-redirect.d.ts +3 -3
- package/dist/shared/ssr-auth-redirect.js +4 -4
- package/dist/templates/chat/AGENTS.md +3 -3
- package/dist/templates/chat/app/root.tsx +3 -15
- package/dist/templates/chat/app/routes/_index.tsx +1 -37
- package/dist/templates/chat/server/plugins/auth.ts +0 -3
- package/dist/templates/default/AGENTS.md +2 -4
- package/dist/templates/default/DEVELOPING.md +3 -5
- package/dist/templates/default/app/root.tsx +2 -9
- package/dist/templates/default/app/routes/_index.tsx +8 -15
- package/package.json +5 -4
- package/src/templates/chat/AGENTS.md +3 -3
- package/src/templates/chat/app/root.tsx +3 -15
- package/src/templates/chat/app/routes/_index.tsx +1 -37
- package/src/templates/chat/server/plugins/auth.ts +0 -3
- package/src/templates/default/AGENTS.md +2 -4
- package/src/templates/default/DEVELOPING.md +3 -5
- package/src/templates/default/app/root.tsx +2 -9
- package/src/templates/default/app/routes/_index.tsx +8 -15
- package/dist/server/auth-marketing-locales.d.ts +0 -9
- package/dist/server/auth-marketing-locales.js +0 -1322
- package/dist/templates/chat/public/auth-marketing/chat.webp +0 -0
- package/src/templates/chat/public/auth-marketing/chat.webp +0 -0
|
@@ -1,36 +1 @@
|
|
|
1
|
-
|
|
2
|
-
import { MarketingHome } from "@agent-native/toolkit/marketing";
|
|
3
|
-
|
|
4
|
-
const SEO_TITLE =
|
|
5
|
-
"Mail - Open Source AI email client and Superhuman alternative";
|
|
6
|
-
const SEO_DESCRIPTION =
|
|
7
|
-
"Open Source AI email client for Gmail triage, drafting, organization, follow-ups, and inbox workflows built around shared actions.";
|
|
8
|
-
|
|
9
|
-
export function meta() {
|
|
10
|
-
return [
|
|
11
|
-
{ title: SEO_TITLE },
|
|
12
|
-
{ name: "description", content: SEO_DESCRIPTION },
|
|
13
|
-
{ property: "og:title", content: SEO_TITLE },
|
|
14
|
-
{ property: "og:description", content: SEO_DESCRIPTION },
|
|
15
|
-
{ name: "twitter:card", content: "summary" },
|
|
16
|
-
{ name: "twitter:title", content: SEO_TITLE },
|
|
17
|
-
{ name: "twitter:description", content: SEO_DESCRIPTION },
|
|
18
|
-
];
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export default function MarketingHomeRoute() {
|
|
22
|
-
return (
|
|
23
|
-
<MarketingHome
|
|
24
|
-
appName="Mail"
|
|
25
|
-
tagline="Your AI agent reads, drafts, and organizes email alongside you."
|
|
26
|
-
description={SEO_DESCRIPTION}
|
|
27
|
-
valueProps={[
|
|
28
|
-
"Draft replies that match your tone and style",
|
|
29
|
-
"Manage multiple Gmail accounts in one unified inbox",
|
|
30
|
-
"Automate triage, archiving, and follow-ups",
|
|
31
|
-
]}
|
|
32
|
-
primaryActionHref={appPath("/home")}
|
|
33
|
-
secondaryActionHref={appPath("/sign-in")}
|
|
34
|
-
/>
|
|
35
|
-
);
|
|
36
|
-
}
|
|
1
|
+
export { signInLandingLoader as loader } from "@agent-native/core/client/sign-in-landing";
|
|
@@ -87,7 +87,7 @@ export function HydrateFallback() {
|
|
|
87
87
|
return <DefaultSpinner />;
|
|
88
88
|
}
|
|
89
89
|
|
|
90
|
-
// Private app entry retained at /home; /
|
|
90
|
+
// Private app entry retained at /home; / redirects to shared sign-in/signup.
|
|
91
91
|
export default function IndexRoute() {
|
|
92
92
|
// Should never render — both loaders redirect to the inbox.
|
|
93
93
|
return null;
|
|
@@ -28,9 +28,6 @@ export default createAuthPlugin({
|
|
|
28
28
|
],
|
|
29
29
|
marketing: {
|
|
30
30
|
appName: "Mail",
|
|
31
|
-
screenshotPath: "/auth-marketing/mail.webp",
|
|
32
|
-
screenshotWidth: 927,
|
|
33
|
-
screenshotHeight: 818,
|
|
34
31
|
learnMoreUrl: "https://agent-native.com/apps/mail",
|
|
35
32
|
tagline: "Your AI agent reads, drafts, and organizes email alongside you.",
|
|
36
33
|
features: [
|
|
@@ -224,7 +224,6 @@ export default function Root() {
|
|
|
224
224
|
const [queryClient] = useState(() => createAgentNativeQueryClient());
|
|
225
225
|
const location = useLocation();
|
|
226
226
|
const pathname = location.pathname.replace(/\/+$/, "") || "/";
|
|
227
|
-
const isMarketingPath = pathname === "/";
|
|
228
227
|
const sessionBypass =
|
|
229
228
|
pathname === "/chat" ||
|
|
230
229
|
pathname === "/plans" ||
|
|
@@ -241,23 +240,18 @@ export default function Root() {
|
|
|
241
240
|
<AppToolkitProvider>
|
|
242
241
|
<AppProviders
|
|
243
242
|
queryClient={queryClient}
|
|
244
|
-
isPublicPath={isMarketingPath}
|
|
245
243
|
sessionBypass={sessionBypass}
|
|
246
244
|
documentTitleFallback={APP_TITLE}
|
|
247
245
|
toaster={<Toaster richColors position="bottom-left" />}
|
|
248
246
|
i18n={{ catalog: i18nCatalog }}
|
|
249
247
|
>
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
<DbSyncSetup />
|
|
258
|
-
<AppContent />
|
|
259
|
-
</div>
|
|
260
|
-
)}
|
|
248
|
+
<div
|
|
249
|
+
data-an-mask={localPlanPrivacyRoute ? "" : undefined}
|
|
250
|
+
style={{ display: "contents" }}
|
|
251
|
+
>
|
|
252
|
+
<DbSyncSetup />
|
|
253
|
+
<AppContent />
|
|
254
|
+
</div>
|
|
261
255
|
</AppProviders>
|
|
262
256
|
</AppToolkitProvider>
|
|
263
257
|
);
|
|
@@ -1,35 +1 @@
|
|
|
1
|
-
|
|
2
|
-
import { MarketingHome } from "@agent-native/toolkit/marketing";
|
|
3
|
-
|
|
4
|
-
const SEO_TITLE = "Plan";
|
|
5
|
-
const SEO_DESCRIPTION =
|
|
6
|
-
"Visual plans, diagrams, wireframes, and shareable reviews for coding-agent work.";
|
|
7
|
-
|
|
8
|
-
export function meta() {
|
|
9
|
-
return [
|
|
10
|
-
{ title: SEO_TITLE },
|
|
11
|
-
{ name: "description", content: SEO_DESCRIPTION },
|
|
12
|
-
{ property: "og:title", content: SEO_TITLE },
|
|
13
|
-
{ property: "og:description", content: SEO_DESCRIPTION },
|
|
14
|
-
{ name: "twitter:card", content: "summary" },
|
|
15
|
-
{ name: "twitter:title", content: SEO_TITLE },
|
|
16
|
-
{ name: "twitter:description", content: SEO_DESCRIPTION },
|
|
17
|
-
];
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export default function MarketingHomeRoute() {
|
|
21
|
-
return (
|
|
22
|
-
<MarketingHome
|
|
23
|
-
appName="Plan"
|
|
24
|
-
tagline="Turn coding-agent plans into visual, annotatable HTML before code changes happen."
|
|
25
|
-
description={SEO_DESCRIPTION}
|
|
26
|
-
valueProps={[
|
|
27
|
-
"Create diagrams, wireframes, mockups, and prototype options from one prompt",
|
|
28
|
-
"Annotate plans as a visual review surface",
|
|
29
|
-
"Share account-backed review links when a plan needs outside feedback",
|
|
30
|
-
]}
|
|
31
|
-
primaryActionHref={appPath("/home")}
|
|
32
|
-
secondaryActionHref={appPath("/sign-in")}
|
|
33
|
-
/>
|
|
34
|
-
);
|
|
35
|
-
}
|
|
1
|
+
export { signInLandingLoader as loader } from "@agent-native/core/client/sign-in-landing";
|
|
@@ -5,7 +5,7 @@ export function loader() {
|
|
|
5
5
|
return withSsrHtmlContentType(redirect("/plans"));
|
|
6
6
|
}
|
|
7
7
|
|
|
8
|
-
// Private app redirect retained at /home; /
|
|
8
|
+
// Private app redirect retained at /home; / redirects to shared sign-in/signup.
|
|
9
9
|
export default function IndexRedirect() {
|
|
10
10
|
return null;
|
|
11
11
|
}
|
|
@@ -65,9 +65,6 @@ export default createAuthPlugin({
|
|
|
65
65
|
],
|
|
66
66
|
marketing: {
|
|
67
67
|
appName: "Plan",
|
|
68
|
-
screenshotPath: "/auth-marketing/plan.webp",
|
|
69
|
-
screenshotWidth: 914,
|
|
70
|
-
screenshotHeight: 818,
|
|
71
68
|
learnMoreUrl: "https://agent-native.com/apps/plan",
|
|
72
69
|
tagline:
|
|
73
70
|
"Turn coding-agent plans into visual, annotatable HTML before code changes happen.",
|
|
@@ -3,21 +3,42 @@
|
|
|
3
3
|
All notable user-facing changes to Agent-Native Slides are documented here. Open it any
|
|
4
4
|
time from the command menu (Cmd+K → "What's new").
|
|
5
5
|
|
|
6
|
+
## 2026-09-26
|
|
7
|
+
|
|
8
|
+
### Changed
|
|
9
|
+
|
|
10
|
+
- The app entry now opens the shared sign-in and sign-up screen instead of a separate marketing page.
|
|
11
|
+
|
|
6
12
|
## 2026-09-25
|
|
7
13
|
|
|
8
14
|
### Added
|
|
9
15
|
|
|
16
|
+
- Open an editable presentation from a template in one click, or inspect every slide in a large modal preview without AI generation.
|
|
17
|
+
- Slides home quick actions now adapt to your onboarding role and appear only when an AI provider is ready.
|
|
10
18
|
- Org admins can review agent runs from Settings
|
|
11
19
|
- Chat messages can be reverted to their autosaved version, including a shortcut to restore the start of a chat.
|
|
12
20
|
|
|
13
21
|
### Improved
|
|
14
22
|
|
|
23
|
+
- Attach Figma frames and websites from focused dialogs while keeping prompt drafts and uploaded design.md files intact.
|
|
24
|
+
- Recent decks now use the same consistent library card layout as templates.
|
|
25
|
+
- Import PDF and PowerPoint files directly from the toolbar, paste Google Slides links in a compact popover, and find design and presentation references together under Design.
|
|
26
|
+
- Start presentations from a prompt or guided source, attach existing Design, Slides, and Figma references, and import decks independently from the home toolbar.
|
|
27
|
+
- Browse design systems and references from the shared context menu and open design-system setup without losing your presentation draft.
|
|
28
|
+
- Shared presentation links show the deck title and slide text in previews
|
|
29
|
+
- Use templates directly from full preview
|
|
30
|
+
- Use text-first menus for import and template actions
|
|
15
31
|
- Keep empty deck lists clear of search and filter controls
|
|
16
32
|
- Selected design-system source forms open directly beneath their row and Figma indexing shows upload and decode progress.
|
|
17
33
|
- Improve Slides design system setup feedback
|
|
18
34
|
|
|
19
35
|
### Fixed
|
|
20
36
|
|
|
37
|
+
- Human Review previews show same-organization slides for organization admins without changing deck data.
|
|
38
|
+
- Searching presentations keeps the results panel visible even when your workspace has no owned decks.
|
|
39
|
+
- Shared-only presentations now open in Recent by default, copied templates wait for deck hydration, and retries remain idempotent.
|
|
40
|
+
- Successful template copies now open even when deck-list refresh is temporarily unavailable.
|
|
41
|
+
- Template copies no longer report success as a failure when deck-list hydration is superseded.
|
|
21
42
|
- The agent recognizes blank slides and its slide prompts avoid duplicate wording.
|
|
22
43
|
- Compact deck reads handle imported slides with invalid selectors.
|
|
23
44
|
- Empty decks show a structured slide preview, and choices before generation are easier to read.
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { defineAction, embedApp, fail } from "@agent-native/core";
|
|
2
|
-
import {
|
|
3
|
-
|
|
2
|
+
import {
|
|
3
|
+
buildDeepLink,
|
|
4
|
+
currentRequestUserIsOrgAdmin,
|
|
5
|
+
} from "@agent-native/core/server";
|
|
6
|
+
import {
|
|
7
|
+
getRequestOrgId,
|
|
8
|
+
getRequestUserEmail,
|
|
9
|
+
} from "@agent-native/core/server/request-context";
|
|
4
10
|
import { loadAgentDesignSystemContext } from "@agent-native/core/shared";
|
|
5
11
|
import { resolveAccess } from "@agent-native/core/sharing";
|
|
6
12
|
import { and, eq, isNull } from "drizzle-orm";
|
|
@@ -29,15 +35,30 @@ import { withDeckLock } from "./patch-deck.js";
|
|
|
29
35
|
|
|
30
36
|
const MAX_REPAIR_ATTEMPTS = 3;
|
|
31
37
|
|
|
32
|
-
async function readDeck(deckId: string) {
|
|
33
|
-
|
|
34
|
-
if (
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
+
async function readDeck(deckId: string, reviewPreview = false) {
|
|
39
|
+
let row;
|
|
40
|
+
if (reviewPreview) {
|
|
41
|
+
const orgId = getRequestOrgId();
|
|
42
|
+
if (!orgId || !(await currentRequestUserIsOrgAdmin(orgId))) {
|
|
43
|
+
fail("Only organization owners and admins can preview reviewed decks.", {
|
|
44
|
+
statusCode: 403,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
[row] = await getDb()
|
|
48
|
+
.select()
|
|
49
|
+
.from(schema.decks)
|
|
50
|
+
.where(and(eq(schema.decks.id, deckId), eq(schema.decks.orgId, orgId)))
|
|
51
|
+
.limit(1);
|
|
52
|
+
if (!row) fail("Deck not found.", { statusCode: 404 });
|
|
53
|
+
} else {
|
|
54
|
+
const access = await resolveAccess("deck", deckId);
|
|
55
|
+
if (!access) {
|
|
56
|
+
// 404 rather than 403/500 so HTTP callers can't probe for decks they
|
|
57
|
+
// can't see, and so the slide preview can tell "missing" from "broken".
|
|
58
|
+
throw Object.assign(new Error("Deck not found"), { statusCode: 404 });
|
|
59
|
+
}
|
|
60
|
+
row = access.resource;
|
|
38
61
|
}
|
|
39
|
-
|
|
40
|
-
const row = access.resource;
|
|
41
62
|
const data = JSON.parse(row.data);
|
|
42
63
|
const normalized = ensureUniqueSlideIds(
|
|
43
64
|
Array.isArray(data?.slides) ? data.slides : [],
|
|
@@ -45,7 +66,14 @@ async function readDeck(deckId: string) {
|
|
|
45
66
|
return { row, data, ...normalized };
|
|
46
67
|
}
|
|
47
68
|
|
|
48
|
-
async function loadDeckWithUniqueSlideIds(
|
|
69
|
+
async function loadDeckWithUniqueSlideIds(
|
|
70
|
+
deckId: string,
|
|
71
|
+
reviewPreview = false,
|
|
72
|
+
) {
|
|
73
|
+
if (reviewPreview) {
|
|
74
|
+
return { ...(await readDeck(deckId, true)), repaired: false };
|
|
75
|
+
}
|
|
76
|
+
|
|
49
77
|
for (let attempt = 0; attempt < MAX_REPAIR_ATTEMPTS; attempt += 1) {
|
|
50
78
|
const snapshot = await readDeck(deckId);
|
|
51
79
|
if (!snapshot.changed) return { ...snapshot, repaired: false };
|
|
@@ -340,6 +368,12 @@ export default defineAction({
|
|
|
340
368
|
.describe(
|
|
341
369
|
"Set to 'true' to return full slide HTML formatted with Prettier for code-style patches. The contentHash still identifies the persisted source.",
|
|
342
370
|
),
|
|
371
|
+
reviewPreview: z
|
|
372
|
+
.boolean()
|
|
373
|
+
.optional()
|
|
374
|
+
.describe(
|
|
375
|
+
"Human Review only: read a deck in the current organization. Requires an organization owner or admin.",
|
|
376
|
+
),
|
|
343
377
|
})
|
|
344
378
|
.superRefine((args, context) => {
|
|
345
379
|
if (args.slideId !== undefined && args.slideIds !== undefined) {
|
|
@@ -379,7 +413,10 @@ export default defineAction({
|
|
|
379
413
|
statusCode: 400,
|
|
380
414
|
});
|
|
381
415
|
}
|
|
382
|
-
const { row, data, slides } = await loadDeckWithUniqueSlideIds(
|
|
416
|
+
const { row, data, slides } = await loadDeckWithUniqueSlideIds(
|
|
417
|
+
deckId,
|
|
418
|
+
args.reviewPreview,
|
|
419
|
+
);
|
|
383
420
|
const ownerEmail = getRequestUserEmail();
|
|
384
421
|
const normalizedOwnerEmail = normalizeOwnerEmail(ownerEmail);
|
|
385
422
|
const selectedSlideIndex =
|
|
@@ -341,7 +341,6 @@ function AppContent() {
|
|
|
341
341
|
export default function Root() {
|
|
342
342
|
const [queryClient] = useState(() => createAgentNativeQueryClient());
|
|
343
343
|
const location = useLocation();
|
|
344
|
-
const isMarketingPath = location.pathname === "/";
|
|
345
344
|
|
|
346
345
|
if (BARE_PREFIXES.some((p) => location.pathname.startsWith(p))) {
|
|
347
346
|
return <Outlet />;
|
|
@@ -352,11 +351,10 @@ export default function Root() {
|
|
|
352
351
|
<AppProviders
|
|
353
352
|
queryClient={queryClient}
|
|
354
353
|
defaultTheme="dark"
|
|
355
|
-
isPublicPath={isMarketingPath}
|
|
356
354
|
i18n={{ catalog: i18nCatalog }}
|
|
357
355
|
sessionBypass={isShareableContentPath(location.pathname)}
|
|
358
356
|
>
|
|
359
|
-
|
|
357
|
+
<AppContent />
|
|
360
358
|
</AppProviders>
|
|
361
359
|
</AppToolkitProvider>
|
|
362
360
|
);
|
|
@@ -1,36 +1 @@
|
|
|
1
|
-
|
|
2
|
-
import { MarketingHome } from "@agent-native/toolkit/marketing";
|
|
3
|
-
|
|
4
|
-
const SEO_TITLE =
|
|
5
|
-
"Slides - Open Source AI presentation builder and Google Slides alternative";
|
|
6
|
-
const SEO_DESCRIPTION =
|
|
7
|
-
"Open Source AI presentation builder for generating, editing, refining, and exporting React decks as Google Slides-ready presentations.";
|
|
8
|
-
|
|
9
|
-
export function meta() {
|
|
10
|
-
return [
|
|
11
|
-
{ title: SEO_TITLE },
|
|
12
|
-
{ name: "description", content: SEO_DESCRIPTION },
|
|
13
|
-
{ property: "og:title", content: SEO_TITLE },
|
|
14
|
-
{ property: "og:description", content: SEO_DESCRIPTION },
|
|
15
|
-
{ name: "twitter:card", content: "summary" },
|
|
16
|
-
{ name: "twitter:title", content: SEO_TITLE },
|
|
17
|
-
{ name: "twitter:description", content: SEO_DESCRIPTION },
|
|
18
|
-
];
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export default function MarketingHomeRoute() {
|
|
22
|
-
return (
|
|
23
|
-
<MarketingHome
|
|
24
|
-
appName="Slides"
|
|
25
|
-
tagline="Your AI agent builds, edits, and refines presentations alongside you."
|
|
26
|
-
description={SEO_DESCRIPTION}
|
|
27
|
-
valueProps={[
|
|
28
|
-
"Generate entire decks from a single prompt",
|
|
29
|
-
"Make surgical slide edits while you present or review",
|
|
30
|
-
"Collaborate in real time with your agent",
|
|
31
|
-
]}
|
|
32
|
-
primaryActionHref={appPath("/home")}
|
|
33
|
-
secondaryActionHref={appPath("/sign-in")}
|
|
34
|
-
/>
|
|
35
|
-
);
|
|
36
|
-
}
|
|
1
|
+
export { signInLandingLoader as loader } from "@agent-native/core/client/sign-in-landing";
|
|
@@ -20,7 +20,7 @@ export function meta() {
|
|
|
20
20
|
];
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
// Private app entry retained at /home; /
|
|
23
|
+
// Private app entry retained at /home; / redirects to shared sign-in/signup.
|
|
24
24
|
export default function IndexRoute() {
|
|
25
25
|
return <Index />;
|
|
26
26
|
}
|
|
@@ -6,9 +6,6 @@ export default createAuthPlugin({
|
|
|
6
6
|
workspaceAppPublicPaths: ["/"],
|
|
7
7
|
marketing: {
|
|
8
8
|
appName: "Slides",
|
|
9
|
-
screenshotPath: "/auth-marketing/slides.webp",
|
|
10
|
-
screenshotWidth: 914,
|
|
11
|
-
screenshotHeight: 818,
|
|
12
9
|
learnMoreUrl: "https://agent-native.com/apps/slides",
|
|
13
10
|
tagline:
|
|
14
11
|
"Your AI agent builds, edits, and refines presentations alongside you.",
|
|
@@ -41,7 +41,7 @@ Default navigation shape on `/tasks`:
|
|
|
41
41
|
- `includeDone` mirrors the task-list filter toggle (incomplete only vs show all).
|
|
42
42
|
- `taskId` highlights a row when opened from a deep link; MVP has no detail page.
|
|
43
43
|
- `fieldId` highlights a custom field when opened from a deep link; the Fields page manages definitions.
|
|
44
|
-
- Chat lives at `/chat`. The public root `/`
|
|
44
|
+
- Chat lives at `/chat`. The public root `/` redirects to shared sign-in/signup, while
|
|
45
45
|
private app entry `/home` redirects to `/tasks`.
|
|
46
46
|
|
|
47
47
|
## Actions
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# agent-native-tasks
|
|
2
2
|
|
|
3
|
-
Task-list-first agent-native app. The public root
|
|
3
|
+
Task-list-first agent-native app. The public root redirects to sign-in; private
|
|
4
4
|
app entry `/home` opens the task list at `/tasks`, while chat handles capture
|
|
5
5
|
and agent operations.
|
|
6
6
|
|
|
@@ -194,24 +194,15 @@ function AppContent() {
|
|
|
194
194
|
|
|
195
195
|
export default function Root() {
|
|
196
196
|
const [queryClient] = useState(() => createAgentNativeQueryClient());
|
|
197
|
-
const location = useLocation();
|
|
198
|
-
const isMarketingPath = location.pathname === "/";
|
|
199
197
|
return (
|
|
200
198
|
<AppProviders
|
|
201
199
|
queryClient={queryClient}
|
|
202
|
-
isPublicPath={isMarketingPath}
|
|
203
200
|
toaster={<Toaster position="bottom-left" />}
|
|
204
201
|
i18n={{ catalog: i18nCatalog }}
|
|
205
202
|
>
|
|
206
203
|
<AppToolkitProvider>
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
) : (
|
|
210
|
-
<>
|
|
211
|
-
<DbSyncSetup />
|
|
212
|
-
<AppContent />
|
|
213
|
-
</>
|
|
214
|
-
)}
|
|
204
|
+
<DbSyncSetup />
|
|
205
|
+
<AppContent />
|
|
215
206
|
</AppToolkitProvider>
|
|
216
207
|
</AppProviders>
|
|
217
208
|
);
|
|
@@ -1,37 +1 @@
|
|
|
1
|
-
|
|
2
|
-
import { MarketingHome } from "@agent-native/toolkit/marketing";
|
|
3
|
-
|
|
4
|
-
import { APP_TITLE } from "@/lib/app-config";
|
|
5
|
-
|
|
6
|
-
const SEO_TITLE = APP_TITLE + " - Open Source agent-native task workspace";
|
|
7
|
-
const SEO_DESCRIPTION =
|
|
8
|
-
"Open Source task workspace for inbox triage, ordered lists, custom fields, and agent-assisted follow-through.";
|
|
9
|
-
|
|
10
|
-
export function meta() {
|
|
11
|
-
return [
|
|
12
|
-
{ title: SEO_TITLE },
|
|
13
|
-
{ name: "description", content: SEO_DESCRIPTION },
|
|
14
|
-
{ property: "og:title", content: SEO_TITLE },
|
|
15
|
-
{ property: "og:description", content: SEO_DESCRIPTION },
|
|
16
|
-
{ name: "twitter:card", content: "summary" },
|
|
17
|
-
{ name: "twitter:title", content: SEO_TITLE },
|
|
18
|
-
{ name: "twitter:description", content: SEO_DESCRIPTION },
|
|
19
|
-
];
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export default function MarketingHomeRoute() {
|
|
23
|
-
return (
|
|
24
|
-
<MarketingHome
|
|
25
|
-
appName={APP_TITLE}
|
|
26
|
-
tagline="Manage personal tasks from inbox to completion, with an agent that can do the work alongside you."
|
|
27
|
-
description={SEO_DESCRIPTION}
|
|
28
|
-
valueProps={[
|
|
29
|
-
"Capture ideas in an inbox and promote them when they are ready",
|
|
30
|
-
"Create, reorder, and complete tasks in the order you choose",
|
|
31
|
-
"Track what matters with custom fields and selected values",
|
|
32
|
-
]}
|
|
33
|
-
primaryActionHref={appPath("/home")}
|
|
34
|
-
secondaryActionHref={appPath("/sign-in")}
|
|
35
|
-
/>
|
|
36
|
-
);
|
|
37
|
-
}
|
|
1
|
+
export { signInLandingLoader as loader } from "@agent-native/core/client/sign-in-landing";
|
|
@@ -18,7 +18,7 @@ export function loader() {
|
|
|
18
18
|
return withSsrHtmlContentType(redirect("/tasks"));
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
// Private app redirect retained at /home; /
|
|
21
|
+
// Private app redirect retained at /home; / redirects to shared sign-in/signup.
|
|
22
22
|
export default function IndexRedirect() {
|
|
23
23
|
return null;
|
|
24
24
|
}
|
|
@@ -87,6 +87,7 @@ export interface DesignConnectBridge {
|
|
|
87
87
|
export interface DesignConnectBridgeOptions {
|
|
88
88
|
bridgeToken?: string;
|
|
89
89
|
previewToken?: string;
|
|
90
|
+
persistBridgeToken?: boolean;
|
|
90
91
|
/** Extra exact browser origins allowed to make CORS requests to the bridge.
|
|
91
92
|
* The production Design origin and loopback development origins are always
|
|
92
93
|
* recognized; custom deployments should pass their app origin here. */
|