@agent-native/core 0.153.10 → 0.154.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/templates/analytics/AGENTS.md +20 -30
  3. package/corpus/templates/analytics/actions/search-dashboard-references.ts +58 -0
  4. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +1 -1
  5. package/corpus/templates/analytics/app/lib/utils.ts +1 -1
  6. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/ViewSqlPopover.tsx +1 -1
  7. package/corpus/templates/analytics/server/lib/agent-chat-plan-mode.ts +2 -0
  8. package/corpus/templates/analytics/server/lib/dashboards-store.ts +366 -3
  9. package/corpus/templates/analytics/server/lib/real-data-actions.ts +3 -1
  10. package/corpus/templates/analytics/server/plugins/agent-chat.ts +6 -2
  11. package/corpus/templates/calendar/app/components/calendar/EventDialog.tsx +1 -1
  12. package/corpus/templates/calendar/app/lib/utils.ts +1 -1
  13. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +32 -5
  14. package/corpus/templates/clips/app/components/sharing/share-ui.tsx +15 -15
  15. package/corpus/templates/clips/app/i18n/en-US.ts +3 -3
  16. package/corpus/templates/clips/app/lib/utils.ts +5 -6
  17. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +43 -8
  18. package/corpus/templates/clips/desktop/src/app.tsx +26 -12
  19. package/corpus/templates/clips/desktop/src/lib/recorder.ts +23 -9
  20. package/corpus/templates/clips/desktop/src-tauri/src/native_screen/custom_capture.rs +261 -11
  21. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +21 -3
  22. package/corpus/templates/clips/shared/mic-audio-cleanup.ts +350 -0
  23. package/corpus/templates/content/actions/resolve-content-landing.ts +162 -32
  24. package/corpus/templates/content/app/i18n-data.ts +10 -10
  25. package/corpus/templates/content/scripts/check-native-deps.mjs +181 -15
  26. package/corpus/templates/content/shared/content-landing.ts +5 -0
  27. package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +79 -7
  28. package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +14 -2
  29. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +2 -2
  30. package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +35 -11
  31. package/corpus/templates/design/actions/get-design-system.ts +103 -3
  32. package/corpus/templates/design/actions/import-design-tokens.ts +37 -8
  33. package/corpus/templates/design/actions/import-github.ts +32 -138
  34. package/corpus/templates/design/actions/index-design-system-with-builder.ts +49 -16
  35. package/corpus/templates/design/actions/present-design-variants.ts +93 -4
  36. package/corpus/templates/design/actions/run-design-audit.ts +229 -0
  37. package/corpus/templates/design/actions/sync-design-system-with-builder.ts +64 -0
  38. package/corpus/templates/design/app/components/design/code-workbench/commands.ts +2 -2
  39. package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +17 -4
  40. package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +5 -1
  41. package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +5 -1
  42. package/corpus/templates/design/app/hooks/use-question-flow.ts +81 -5
  43. package/corpus/templates/design/app/i18n/en-US.ts +1 -1
  44. package/corpus/templates/design/app/i18n-data.ts +32 -1
  45. package/corpus/templates/design/app/i18n-keyboard-shortcuts.ts +10 -10
  46. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +83 -11
  47. package/corpus/templates/design/app/pages/DesignSystems.tsx +14 -0
  48. package/corpus/templates/design/app/pages/design-editor/generation-prompt-directives.ts +22 -0
  49. package/corpus/templates/design/changelog/2026-08-13-a-screen-that-would-render-behind-an-invisible-alpine-overla.md +6 -0
  50. package/corpus/templates/design/changelog/2026-08-13-attach-a-ui-screenshot-and-the-design-is-reproduced-not-rein.md +6 -0
  51. package/corpus/templates/design/changelog/2026-08-13-linking-a-design-system-means-you-never-get-generic-directio.md +6 -0
  52. package/corpus/templates/design/changelog/2026-08-13-the-design-audit-now-reports-when-a-screen-ignores-its-linke.md +6 -0
  53. package/corpus/templates/design/changelog/2026-08-13-the-design-system-preview-now-shows-how-many-named-tokens-we.md +6 -0
  54. package/corpus/templates/design/changelog/2026-08-13-your-design-system-prompt-and-reference-screenshots-now-reac.md +6 -0
  55. package/corpus/templates/design/server/lib/builder-design-system-proxy.ts +18 -2
  56. package/corpus/templates/design/shared/design-review.ts +1 -0
  57. package/corpus/templates/design/shared/html-integrity.ts +171 -0
  58. package/corpus/templates/mail/app/lib/utils.ts +1 -1
  59. package/corpus/templates/slides/.agents/skills/design-systems/SKILL.md +10 -6
  60. package/corpus/templates/slides/actions/index-design-system-with-builder.ts +41 -3
  61. package/corpus/templates/slides/actions/patch-deck.ts +12 -3
  62. package/corpus/templates/slides/actions/sync-design-system-with-builder.ts +64 -0
  63. package/corpus/templates/slides/app/components/deck/DeckCard.tsx +1 -1
  64. package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +193 -20
  65. package/corpus/templates/slides/app/components/editor/EditorActionCluster.tsx +73 -1
  66. package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +64 -34
  67. package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +34 -41
  68. package/corpus/templates/slides/app/components/editor/ExportMenu.tsx +119 -91
  69. package/corpus/templates/slides/app/components/editor/ImageOverlay.tsx +16 -0
  70. package/corpus/templates/slides/app/components/editor/NewDeckReferenceStep.tsx +15 -0
  71. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +158 -31
  72. package/corpus/templates/slides/app/components/editor/SlideOverflowWarning.tsx +30 -14
  73. package/corpus/templates/slides/app/components/editor/SpeakerNotesPanel.tsx +2 -2
  74. package/corpus/templates/slides/app/components/editor/canvas-interactions/slides-canvas-adapter.ts +4 -1
  75. package/corpus/templates/slides/app/components/editor/rich-text-selection.ts +14 -0
  76. package/corpus/templates/slides/app/components/editor/slide-text-targets.ts +24 -0
  77. package/corpus/templates/slides/app/context/DeckContext.tsx +19 -31
  78. package/corpus/templates/slides/app/global.css +24 -0
  79. package/corpus/templates/slides/app/hooks/use-navigation-state.ts +20 -17
  80. package/corpus/templates/slides/app/i18n/en-US.ts +19 -10
  81. package/corpus/templates/slides/app/lib/deck-filter.ts +47 -0
  82. package/corpus/templates/slides/app/lib/export-google-slides-client.ts +15 -4
  83. package/corpus/templates/slides/app/lib/export-pptx-client.ts +637 -1
  84. package/corpus/templates/slides/app/lib/image-download.ts +84 -0
  85. package/corpus/templates/slides/app/lib/utils.ts +1 -1
  86. package/corpus/templates/slides/app/pages/DeckEditor.tsx +9 -0
  87. package/corpus/templates/slides/app/pages/Index.tsx +25 -9
  88. package/corpus/templates/slides/changelog/2026-08-13-clicking-a-slide-thumbnail-now-focuses-it-so-the-slide-shortc.md +6 -0
  89. package/corpus/templates/slides/changelog/2026-08-13-duplicating-or-restoring-a-slide-now-keeps-its-transition-ani.md +6 -0
  90. package/corpus/templates/slides/changelog/2026-08-13-opening-presentation-mode-from-the-agent-now-starts-on-the-re.md +6 -0
  91. package/corpus/templates/slides/changelog/2026-08-13-slide-transitions-can-be-set-from-a-visible-control-in-the-sl.md +6 -0
  92. package/corpus/templates/slides/netlify.toml +1 -0
  93. package/corpus/templates/slides/server/lib/builder-design-system-proxy.ts +14 -2
  94. package/dist/a2a/audience.d.ts +2 -0
  95. package/dist/a2a/audience.js +23 -0
  96. package/dist/a2a/client.d.ts +4 -0
  97. package/dist/a2a/client.js +32 -14
  98. package/dist/a2a/server.d.ts +9 -4
  99. package/dist/a2a/server.js +52 -25
  100. package/dist/a2a/types.d.ts +4 -4
  101. package/dist/agent/production-agent.js +1 -1
  102. package/dist/brand-kit/types.d.ts +10 -2
  103. package/dist/cli/code.js +1 -1
  104. package/dist/cli/index.js +30 -1
  105. package/dist/cli/native-dependencies.d.ts +24 -0
  106. package/dist/cli/native-dependencies.js +264 -0
  107. package/dist/cli/plan-local.js +1 -1
  108. package/dist/cli/skills-content/design-visual-edit-skill.d.ts +1 -1
  109. package/dist/cli/skills-content/design-visual-edit-skill.js +2 -2
  110. package/dist/cli/visualize-repo.js +1 -1
  111. package/dist/client/FeedbackButton.js +12 -12
  112. package/dist/client/agent-chat-adapter.js +3 -4
  113. package/dist/client/assistant-ui-recovery.d.ts +1 -1
  114. package/dist/client/assistant-ui-recovery.js +4 -0
  115. package/dist/client/chat/message-components.d.ts +11 -3
  116. package/dist/client/chat/message-components.js +31 -5
  117. package/dist/client/chat/tool-call-display.d.ts +2 -1
  118. package/dist/client/chat/tool-call-display.js +33 -15
  119. package/dist/client/db-admin/SqlEditor.js +1 -1
  120. package/dist/client/dev-overlay/DevOverlay.js +2 -2
  121. package/dist/client/extensions/portable-extension.js +4 -0
  122. package/dist/client/guided-questions.d.ts +8 -0
  123. package/dist/client/guided-questions.js +12 -3
  124. package/dist/client/sharing/ShareButton.js +16 -24
  125. package/dist/client/sse-event-processor.js +35 -15
  126. package/dist/client/tool-display.d.ts +9 -0
  127. package/dist/client/tool-display.js +39 -0
  128. package/dist/client/vite-dev-recovery-script.js +1 -1
  129. package/dist/collab/awareness.d.ts +2 -2
  130. package/dist/collab/routes.d.ts +1 -1
  131. package/dist/collab/struct-routes.d.ts +1 -1
  132. package/dist/extensions/html-shell.js +5 -0
  133. package/dist/notifications/routes.d.ts +1 -1
  134. package/dist/observability/routes.d.ts +3 -3
  135. package/dist/provider-api/actions/custom-provider-registration.d.ts +2 -2
  136. package/dist/server/agent-capabilities.js +0 -0
  137. package/dist/server/agent-chat/action-filters-a2a.d.ts +14 -13
  138. package/dist/server/agent-chat/action-filters-a2a.js +59 -23
  139. package/dist/server/agent-chat/prompt-resources.js +17 -16
  140. package/dist/server/agent-chat-plugin.d.ts +9 -0
  141. package/dist/server/agent-chat-plugin.js +29 -7
  142. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  143. package/dist/server/builder-design-systems.d.ts +33 -1
  144. package/dist/server/builder-design-systems.js +293 -11
  145. package/dist/server/design-token-utils.d.ts +11 -0
  146. package/dist/server/design-token-utils.js +68 -16
  147. package/dist/server/index.d.ts +1 -1
  148. package/dist/server/index.js +1 -1
  149. package/package.json +2 -2
@@ -4,6 +4,7 @@ import { useQuery, useQueryClient } from "@tanstack/react-query";
4
4
  import { useEffect, useRef } from "react";
5
5
  import { useLocation, useNavigate } from "react-router";
6
6
 
7
+ import { readStoredDeckFilter, resolveDeckFilter } from "@/lib/deck-filter";
7
8
  import { TAB_ID } from "@/lib/tab-id";
8
9
 
9
10
  export interface NavigationState {
@@ -59,7 +60,10 @@ export function useNavigationState() {
59
60
  } else {
60
61
  const params = new URLSearchParams(location.search);
61
62
  state.deckFilter =
62
- params.get("createdBy") === "me" ? "created-by-me" : "all";
63
+ resolveDeckFilter(params.get("createdBy"), readStoredDeckFilter()) ===
64
+ "mine"
65
+ ? "created-by-me"
66
+ : "all";
63
67
  }
64
68
 
65
69
  const write = (key: string) =>
@@ -152,22 +156,21 @@ export function useNavigationState() {
152
156
  path = `/deck/${cmd.deckId}`;
153
157
  if (cmd.view === "present") {
154
158
  path += "/present";
155
- } else {
156
- const internalSlideIndex =
157
- typeof cmd.slideNumber === "number" &&
158
- Number.isFinite(cmd.slideNumber) &&
159
- cmd.slideNumber >= 1
160
- ? cmd.slideNumber - 1
161
- : cmd.slideIndex;
162
- if (
163
- typeof internalSlideIndex === "number" &&
164
- Number.isFinite(internalSlideIndex) &&
165
- internalSlideIndex >= 0
166
- ) {
167
- // Convert the internal zero-based value back to the 1-based
168
- // ?slide=N URL param the editor reads.
169
- path += `?slide=${internalSlideIndex + 1}`;
170
- }
159
+ }
160
+ const internalSlideIndex =
161
+ typeof cmd.slideNumber === "number" &&
162
+ Number.isFinite(cmd.slideNumber) &&
163
+ cmd.slideNumber >= 1
164
+ ? cmd.slideNumber - 1
165
+ : cmd.slideIndex;
166
+ if (
167
+ typeof internalSlideIndex === "number" &&
168
+ Number.isFinite(internalSlideIndex) &&
169
+ internalSlideIndex >= 0
170
+ ) {
171
+ // Convert the internal zero-based value back to the 1-based
172
+ // ?slide=N URL param both the editor and presentation view read.
173
+ path += `?slide=${internalSlideIndex + 1}`;
171
174
  }
172
175
  }
173
176
 
@@ -242,8 +242,7 @@ const messages = {
242
242
  code: "Code",
243
243
  comments: "Comments",
244
244
  editorLink: "Editor link",
245
- editorLinkDescription:
246
- "Opens the deck in the editor. Anyone with access can use this link.",
245
+ editorLinkDescription: "Opens the deck in the editor",
247
246
  presentationLink: "Presentation link",
248
247
  presentationLinkDescription:
249
248
  "Opens directly in fullscreen presentation mode.",
@@ -251,7 +250,7 @@ const messages = {
251
250
  more: "More",
252
251
  importing: "Importing...",
253
252
  importFile: "Import file",
254
- savedVersions: "Saved versions",
253
+ savedVersions: "History",
255
254
  lightTheme: "Light theme",
256
255
  darkTheme: "Dark theme",
257
256
  },
@@ -273,8 +272,8 @@ const messages = {
273
272
  exportPdf: "Export as PDF",
274
273
  exportPptx: "Export as PPTX",
275
274
  connectGoogle: "Connect Google",
276
- openInGoogleSlides: "Open in Google Slides",
277
- googleSlidesCreated: "Opened in Google Slides",
275
+ openInGoogleSlides: "Export to Google Slides",
276
+ googleSlidesCreated: "Exported to Google Slides",
278
277
  googleSlidesCreatedHint:
279
278
  "A copy of this deck was created in your Google Drive.",
280
279
  duplicateDeck: "Duplicate deck",
@@ -494,17 +493,17 @@ const messages = {
494
493
  "The deck was rolled back to the selected snapshot.",
495
494
  restoreFailed: "Restore failed",
496
495
  restoreFailedDescription: "Could not restore this deck version.",
497
- backToSavedVersions: "Back to saved versions",
498
- savedVersions: "Saved versions",
499
- description: "Browse saved deck versions and restore a previous snapshot.",
496
+ backToSavedVersions: "Back to history",
497
+ savedVersions: "History",
498
+ description: "Browse deck history and restore a previous snapshot.",
500
499
  untitled: "Untitled",
501
500
  snapshotUnavailable: "Snapshot unavailable",
502
501
  slideNumber: "Slide {{number}}",
503
502
  noSlidesInSnapshot: "No slides in this snapshot.",
504
503
  restoreThisVersion: "Restore this version",
505
- noSavedVersions: "No saved versions yet",
504
+ noSavedVersions: "No history yet",
506
505
  noSavedVersionsDescription:
507
- "Versions are saved automatically before future deck edits.",
506
+ "History is saved automatically before future deck edits.",
508
507
  },
509
508
  editorSidebar: {
510
509
  selectSlide: "Select slide {{number}}",
@@ -561,6 +560,10 @@ const messages = {
561
560
  deckHasNoSlides: "Deck has no slides.",
562
561
  pdfRenderFailed: "Could not render PDF.",
563
562
  buildingDeck: "Building deck",
563
+ layoutOverflowWarning: "Layout overflows",
564
+ layoutOverflowDetails: "Show overflow details",
565
+ layoutOverflowVertical: "Vertical overflow: {{pixels}}px",
566
+ layoutOverflowHorizontal: "Horizontal overflow: {{pixels}}px",
564
567
  dismissLayoutWarning: "Dismiss layout warning",
565
568
  slidesAdded_one: "{{count}} slide added",
566
569
  slidesAdded_other: "{{count}} slides added",
@@ -606,6 +609,8 @@ const messages = {
606
609
  websitePlaceholder: "example.com or Nike",
607
610
  add: "Add",
608
611
  githubRepository: "Connect Code: GitHub repository",
612
+ githubRef: "Branch, tag, or commit (optional)",
613
+ githubPaths: "Files or folders, comma-separated (optional)",
609
614
  codeFiles: "Connect Code Files",
610
615
  codeFilesDrop:
611
616
  "CSS, Tailwind config, theme files, design.md — drop or click",
@@ -639,6 +644,10 @@ const messages = {
639
644
  sourceUnavailableDescription:
640
645
  "Builder could not load the latest source results.",
641
646
  sourceOpenInBuilder: "Open in Builder",
647
+ syncSource: "Sync source",
648
+ syncingSource: "Syncing source...",
649
+ syncStarted: "Design system sync started",
650
+ syncFailed: "Could not sync design system",
642
651
  loading: "Loading design system",
643
652
  loadFailed: "We couldn't load this design system. Close and try again.",
644
653
  cancel: "Cancel",
@@ -0,0 +1,47 @@
1
+ export const DECK_FILTER_STORAGE_KEY = "slides:deck-filter";
2
+
3
+ export type DeckFilter = "all" | "mine";
4
+
5
+ export function resolveDeckFilter(
6
+ createdByParam: string | null,
7
+ storedFilter: DeckFilter | undefined,
8
+ ): DeckFilter {
9
+ if (createdByParam === "me") return "mine";
10
+ if (createdByParam !== null) return "all";
11
+ return storedFilter ?? "mine";
12
+ }
13
+
14
+ export function readStoredDeckFilter(
15
+ storage: Pick<Storage, "getItem"> | null | undefined = typeof window ===
16
+ "undefined"
17
+ ? null
18
+ : window.localStorage,
19
+ ): DeckFilter | undefined {
20
+ if (!storage) return undefined;
21
+
22
+ try {
23
+ const stored = storage.getItem(DECK_FILTER_STORAGE_KEY);
24
+ return stored === "all" || stored === "mine" ? stored : undefined;
25
+ } catch {
26
+ // coercion-ok: localStorage failures intentionally fall back to the default filter.
27
+ return undefined;
28
+ }
29
+ }
30
+
31
+ export function writeStoredDeckFilter(
32
+ filter: DeckFilter,
33
+ storage: Pick<Storage, "setItem"> | null | undefined = typeof window ===
34
+ "undefined"
35
+ ? null
36
+ : window.localStorage,
37
+ ): boolean {
38
+ if (!storage) return false;
39
+
40
+ try {
41
+ storage.setItem(DECK_FILTER_STORAGE_KEY, filter);
42
+ return true;
43
+ } catch {
44
+ // coercion-ok: a non-persisted filter is an acceptable browser-storage fallback.
45
+ return false;
46
+ }
47
+ }
@@ -11,7 +11,9 @@ interface GoogleSlidesExportSlide {
11
11
  export type GoogleSlidesExportResult =
12
12
  | { url: string }
13
13
  /** Drive was unavailable, so the PPTX was downloaded for a manual import. */
14
- | { url: null; downloaded: true; reason: string };
14
+ | { url: null; downloaded: true; reason: string }
15
+ /** The export action should send the user through Google OAuth first. */
16
+ | { url: null; requiresConnection: true; reason: string };
15
17
 
16
18
  function triggerBlobDownload(blob: Blob, filename: string) {
17
19
  const url = URL.createObjectURL(blob);
@@ -27,9 +29,9 @@ function triggerBlobDownload(blob: Blob, filename: string) {
27
29
 
28
30
  /**
29
31
  * Creates a native Google Slides deck in the user's Drive when their Google
30
- * account is connected. Without a connection — or if Drive rejects the upload —
31
- * the PPTX is downloaded instead so the user can import it by hand, and the
32
- * reason is reported rather than swallowed.
32
+ * account is connected. A missing connection is returned to the caller so the
33
+ * export action can launch OAuth; other Drive failures still fall back to a
34
+ * manual PPTX import with the reason reported rather than swallowed.
33
35
  */
34
36
  export async function exportDeckToGoogleSlides(
35
37
  deckTitle: string,
@@ -54,10 +56,19 @@ export async function exportDeckToGoogleSlides(
54
56
  const payload = (await res.json().catch(() => null)) as {
55
57
  url?: string;
56
58
  error?: string;
59
+ code?: string;
57
60
  } | null;
58
61
 
59
62
  if (res.ok && payload?.url) return { url: payload.url };
60
63
 
64
+ if (payload?.code === "google-not-connected") {
65
+ return {
66
+ url: null,
67
+ requiresConnection: true,
68
+ reason: payload.error ?? "No connected Google account.",
69
+ };
70
+ }
71
+
61
72
  triggerBlobDownload(blob, filename);
62
73
  return {
63
74
  url: null,