@agent-native/core 0.132.2 → 0.133.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 (436) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +161 -0
  3. package/corpus/core/package.json +1 -1
  4. package/corpus/core/src/a2a/correlation.ts +11 -1
  5. package/corpus/core/src/a2a/types.ts +11 -3
  6. package/corpus/core/src/agent/engine/ai-sdk-engine.ts +33 -46
  7. package/corpus/core/src/agent/engine/builder-engine.ts +22 -10
  8. package/corpus/core/src/agent/engine/error-detail.ts +184 -3
  9. package/corpus/core/src/agent/engine/failure-taxonomy.ts +123 -0
  10. package/corpus/core/src/agent/engine/index.ts +8 -0
  11. package/corpus/core/src/agent/engine/registry.ts +92 -8
  12. package/corpus/core/src/agent/engine/translate-ai-sdk.ts +17 -2
  13. package/corpus/core/src/agent/production-agent.ts +13 -33
  14. package/corpus/core/src/agent/run-loop-with-resume.ts +1 -1
  15. package/corpus/core/src/agent/run-manager.ts +43 -14
  16. package/corpus/core/src/agent/run-store.ts +30 -3
  17. package/corpus/core/src/agent/thread-data-builder.ts +36 -4
  18. package/corpus/core/src/cli/templates-meta.ts +13 -0
  19. package/corpus/core/src/cli/workspace-dev.ts +1 -0
  20. package/corpus/core/src/client/error-format.ts +12 -0
  21. package/corpus/core/src/credentials/index.ts +51 -12
  22. package/corpus/core/src/extensions/url-safety.ts +46 -12
  23. package/corpus/core/src/integrations/adapters/slack.ts +32 -10
  24. package/corpus/core/src/integrations/google-docs-poller.ts +12 -1
  25. package/corpus/core/src/integrations/installations-store.ts +30 -0
  26. package/corpus/core/src/integrations/plugin.ts +5 -5
  27. package/corpus/core/src/integrations/types.ts +7 -0
  28. package/corpus/core/src/integrations/webhook-handler.ts +24 -1
  29. package/corpus/core/src/jobs/background-automation-runner.ts +38 -1
  30. package/corpus/core/src/provider-api/index.ts +8 -2
  31. package/corpus/core/src/scripts/call-agent.ts +6 -0
  32. package/corpus/core/src/server/agent-chat-plugin.ts +30 -9
  33. package/corpus/core/src/server/agent-discovery.ts +2 -0
  34. package/corpus/core/src/server/builder-design-systems.ts +21 -0
  35. package/corpus/core/src/server/credential-provider.ts +51 -12
  36. package/corpus/core/src/server/index.ts +1 -0
  37. package/corpus/core/src/server/onboarding-html.ts +37 -2
  38. package/corpus/core/src/shared/reasoning-effort.ts +1 -1
  39. package/corpus/core/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +11 -0
  40. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +6 -2
  41. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +39 -19
  42. package/corpus/templates/assets/changelog/2026-07-31-the-agent-native-logo-stays-visible-when-the-sidebar-is-coll.md +6 -0
  43. package/corpus/templates/brain/app/components/layout/Sidebar.tsx +30 -3
  44. package/corpus/templates/brain/changelog/2026-07-31-clicking-the-agent-native-logo-now-toggles-the-app-sidebar.md +6 -0
  45. package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +1 -1
  46. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +54 -25
  47. package/corpus/templates/calendar/changelog/2026-07-31-the-agent-native-logo-stays-visible-when-the-sidebar-is-coll.md +6 -0
  48. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +30 -3
  49. package/corpus/templates/chat/changelog/2026-07-31-clicking-the-agent-native-logo-now-toggles-the-app-sidebar.md +6 -0
  50. package/corpus/templates/clips/app/components/library/library-layout.tsx +37 -21
  51. package/corpus/templates/clips/changelog/2026-07-31-the-agent-native-logo-stays-visible-when-the-sidebar-is-coll.md +6 -0
  52. package/corpus/templates/clips/desktop/src/hooks/useMediaDevices.ts +1 -1
  53. package/corpus/templates/clips/desktop/src/lib/media-capture-constraints.ts +1 -1
  54. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +34 -17
  55. package/corpus/templates/content/changelog/2026-07-31-the-agent-native-logo-stays-visible-when-the-sidebar-is-coll.md +6 -0
  56. package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +6 -2
  57. package/corpus/templates/design/actions/create-design-system.ts +1 -0
  58. package/corpus/templates/design/actions/set-default-design-system.ts +34 -26
  59. package/corpus/templates/design/app/components/layout/Sidebar.tsx +21 -4
  60. package/corpus/templates/design/app/i18n-data.ts +39 -0
  61. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +229 -12
  62. package/corpus/templates/design/app/pages/DesignSystems.tsx +10 -4
  63. package/corpus/templates/design/changelog/2026-07-31-clicking-the-agent-native-logo-now-toggles-the-app-sidebar.md +6 -0
  64. package/corpus/templates/design/changelog/2026-07-31-design-system-indexing-keeps-your-chosen-name-when-you-uploa.md +6 -0
  65. package/corpus/templates/design/server/lib/builder-design-system-proxy.ts +19 -4
  66. package/corpus/templates/dispatch/AGENTS.md +4 -0
  67. package/corpus/templates/factory/.agents/skills/actions/SKILL.md +562 -0
  68. package/corpus/templates/factory/.agents/skills/adding-a-feature/SKILL.md +198 -0
  69. package/corpus/templates/factory/.agents/skills/agent-native-docs/SKILL.md +115 -0
  70. package/corpus/templates/factory/.agents/skills/agent-native-toolkit/SKILL.md +182 -0
  71. package/corpus/templates/factory/.agents/skills/capture-learnings/SKILL.md +89 -0
  72. package/corpus/templates/factory/.agents/skills/create-skill/SKILL.md +221 -0
  73. package/corpus/templates/factory/.agents/skills/customizing-agent-native/SKILL.md +220 -0
  74. package/corpus/templates/factory/.agents/skills/delegate-to-agent/SKILL.md +263 -0
  75. package/corpus/templates/factory/.agents/skills/factory-graphs/SKILL.md +52 -0
  76. package/corpus/templates/factory/.agents/skills/feature-flags/SKILL.md +169 -0
  77. package/corpus/templates/factory/.agents/skills/frontend-design/SKILL.md +174 -0
  78. package/corpus/templates/factory/.agents/skills/real-time-sync/SKILL.md +232 -0
  79. package/corpus/templates/factory/.agents/skills/security/SKILL.md +324 -0
  80. package/corpus/templates/factory/.agents/skills/self-modifying-code/SKILL.md +119 -0
  81. package/corpus/templates/factory/.agents/skills/shadcn-ui/SKILL.md +123 -0
  82. package/corpus/templates/factory/.agents/skills/sharing/SKILL.md +232 -0
  83. package/corpus/templates/factory/.agents/skills/storing-data/SKILL.md +178 -0
  84. package/corpus/templates/factory/.agents/skills/upgrade-agent-native/SKILL.md +122 -0
  85. package/corpus/templates/factory/.env.example +24 -0
  86. package/corpus/templates/factory/.ignore +0 -0
  87. package/corpus/templates/factory/.oxfmtrc.json +8 -0
  88. package/corpus/templates/factory/AGENTS.md +90 -0
  89. package/corpus/templates/factory/CHANGELOG.md +10 -0
  90. package/corpus/templates/factory/DEVELOPING.md +185 -0
  91. package/corpus/templates/factory/README.md +64 -0
  92. package/corpus/templates/factory/_gitignore +42 -0
  93. package/corpus/templates/factory/actions/add-factory-comment.ts +55 -0
  94. package/corpus/templates/factory/actions/approve-factory-item.ts +214 -0
  95. package/corpus/templates/factory/actions/babysit-pull-request.ts +126 -0
  96. package/corpus/templates/factory/actions/evaluate-triage-item.ts +172 -0
  97. package/corpus/templates/factory/actions/get-factory-graph.ts +62 -0
  98. package/corpus/templates/factory/actions/get-triage-config.ts +42 -0
  99. package/corpus/templates/factory/actions/get-triage-item.ts +74 -0
  100. package/corpus/templates/factory/actions/hello.ts +13 -0
  101. package/corpus/templates/factory/actions/ingest-github-observation.ts +100 -0
  102. package/corpus/templates/factory/actions/list-factories.ts +40 -0
  103. package/corpus/templates/factory/actions/list-factory-comments.ts +40 -0
  104. package/corpus/templates/factory/actions/list-triage-items.ts +85 -0
  105. package/corpus/templates/factory/actions/list-triage-rules.ts +44 -0
  106. package/corpus/templates/factory/actions/navigate.ts +41 -0
  107. package/corpus/templates/factory/actions/poll-slack-channel.ts +118 -0
  108. package/corpus/templates/factory/actions/reconcile-triage-run.ts +179 -0
  109. package/corpus/templates/factory/actions/record-triage-feedback.ts +58 -0
  110. package/corpus/templates/factory/actions/run.ts +2 -0
  111. package/corpus/templates/factory/actions/save-factory-graph.ts +129 -0
  112. package/corpus/templates/factory/actions/save-triage-config.ts +67 -0
  113. package/corpus/templates/factory/actions/save-triage-rule.ts +89 -0
  114. package/corpus/templates/factory/actions/suggest-factory-rules.ts +70 -0
  115. package/corpus/templates/factory/actions/view-screen.ts +73 -0
  116. package/corpus/templates/factory/app/components/factory/FactoryCanvas.tsx +441 -0
  117. package/corpus/templates/factory/app/components/factory/FactoryInspector.tsx +388 -0
  118. package/corpus/templates/factory/app/components/layout/Header.tsx +60 -0
  119. package/corpus/templates/factory/app/components/layout/Layout.tsx +190 -0
  120. package/corpus/templates/factory/app/components/layout/Sidebar.tsx +538 -0
  121. package/corpus/templates/factory/app/components/triage/triage-status-pill.tsx +28 -0
  122. package/corpus/templates/factory/app/components/ui/button.tsx +1 -0
  123. package/corpus/templates/factory/app/components/ui/card.tsx +1 -0
  124. package/corpus/templates/factory/app/components/ui/dropdown-menu.tsx +1 -0
  125. package/corpus/templates/factory/app/components/ui/input.tsx +1 -0
  126. package/corpus/templates/factory/app/components/ui/label.tsx +1 -0
  127. package/corpus/templates/factory/app/components/ui/sheet.tsx +1 -0
  128. package/corpus/templates/factory/app/components/ui/textarea.tsx +1 -0
  129. package/corpus/templates/factory/app/components/ui/toolkit-provider.tsx +17 -0
  130. package/corpus/templates/factory/app/components/ui/tooltip.tsx +1 -0
  131. package/corpus/templates/factory/app/design-system.ts +3 -0
  132. package/corpus/templates/factory/app/entry.client.tsx +22 -0
  133. package/corpus/templates/factory/app/entry.server.tsx +10 -0
  134. package/corpus/templates/factory/app/global.css +93 -0
  135. package/corpus/templates/factory/app/hooks/use-navigation-state.ts +113 -0
  136. package/corpus/templates/factory/app/i18n/en-US.ts +211 -0
  137. package/corpus/templates/factory/app/i18n/index.ts +34 -0
  138. package/corpus/templates/factory/app/i18n-data.ts +556 -0
  139. package/corpus/templates/factory/app/lib/agent-page.tsx +49 -0
  140. package/corpus/templates/factory/app/lib/app-config.ts +11 -0
  141. package/corpus/templates/factory/app/lib/tab-id.ts +1 -0
  142. package/corpus/templates/factory/app/lib/utils.ts +1 -0
  143. package/corpus/templates/factory/app/root.tsx +175 -0
  144. package/corpus/templates/factory/app/routes/_index.tsx +94 -0
  145. package/corpus/templates/factory/app/routes/agent.tsx +24 -0
  146. package/corpus/templates/factory/app/routes/chat.$threadId.tsx +1 -0
  147. package/corpus/templates/factory/app/routes/database.tsx +17 -0
  148. package/corpus/templates/factory/app/routes/extensions.$id.$slug.tsx +2 -0
  149. package/corpus/templates/factory/app/routes/extensions.$id.tsx +11 -0
  150. package/corpus/templates/factory/app/routes/extensions._index.tsx +11 -0
  151. package/corpus/templates/factory/app/routes/extensions.tsx +5 -0
  152. package/corpus/templates/factory/app/routes/factory.tsx +1003 -0
  153. package/corpus/templates/factory/app/routes/observability.tsx +19 -0
  154. package/corpus/templates/factory/app/routes/settings.tsx +89 -0
  155. package/corpus/templates/factory/app/routes/team.tsx +11 -0
  156. package/corpus/templates/factory/app/routes.ts +4 -0
  157. package/corpus/templates/factory/app/vite-env.d.ts +6 -0
  158. package/corpus/templates/factory/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
  159. package/corpus/templates/factory/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  160. package/corpus/templates/factory/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
  161. package/corpus/templates/factory/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  162. package/corpus/templates/factory/changelog/2026-06-29-chat-layouts-adapt-when-the-agent-sidebar-is-open.md +6 -0
  163. package/corpus/templates/factory/changelog/2026-07-08-settings-are-cleaner-and-searchable.md +5 -0
  164. package/corpus/templates/factory/changelog/2026-07-10-chat-now-makes-ai-connection-setup-clear-without-shifting-th.md +6 -0
  165. package/corpus/templates/factory/changelog/2026-07-13-a-full-agent-page-now-brings-context-files-connections-jobs-.md +6 -0
  166. package/corpus/templates/factory/changelog/2026-07-14-chat-opens-reliably-on-hosted-deployments-instead-of-failing.md +6 -0
  167. package/corpus/templates/factory/changelog/2026-07-14-fixed-chat-template-startup-with-older-core-versions.md +6 -0
  168. package/corpus/templates/factory/changelog/2026-07-15-chat-navigation-focuses-on-chat-and-agent.md +6 -0
  169. package/corpus/templates/factory/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
  170. package/corpus/templates/factory/changelog/2026-07-22-compact-sidebar-footer.md +6 -0
  171. package/corpus/templates/factory/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +6 -0
  172. package/corpus/templates/factory/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  173. package/corpus/templates/factory/changelog/2026-07-22-recent-chats-are-easier-to-scan-and-expand.md +6 -0
  174. package/corpus/templates/factory/changelog/2026-07-23-full-page-chat-is-better-centered-with-quieter-chat-history-.md +6 -0
  175. package/corpus/templates/factory/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  176. package/corpus/templates/factory/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  177. package/corpus/templates/factory/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
  178. package/corpus/templates/factory/changelog/2026-07-29-sidebar-footers-now-keep-feedback-search-and-collapse-togeth.md +6 -0
  179. package/corpus/templates/factory/changelog/2026-07-31-added-an-inspectable-observe-only-factory-queue-for-slack-.md +6 -0
  180. package/corpus/templates/factory/changelog/2026-07-31-clicking-the-agent-native-logo-now-toggles-the-app-sidebar.md +6 -0
  181. package/corpus/templates/factory/components.json +20 -0
  182. package/corpus/templates/factory/data/sync-config.json +1 -0
  183. package/corpus/templates/factory/learnings.defaults.md +5 -0
  184. package/corpus/templates/factory/netlify.toml +10 -0
  185. package/corpus/templates/factory/package.json +105 -0
  186. package/corpus/templates/factory/public/agent-native-icon-dark.svg +10 -0
  187. package/corpus/templates/factory/public/agent-native-icon-light.svg +10 -0
  188. package/corpus/templates/factory/public/agent-native-logo-dark.svg +21 -0
  189. package/corpus/templates/factory/public/agent-native-logo-light.svg +21 -0
  190. package/corpus/templates/factory/public/favicon.svg +1 -0
  191. package/corpus/templates/factory/public/icon-180.svg +1 -0
  192. package/corpus/templates/factory/public/icon-192.svg +1 -0
  193. package/corpus/templates/factory/public/icon-512.svg +1 -0
  194. package/corpus/templates/factory/public/manifest.json +21 -0
  195. package/corpus/templates/factory/react-router.config.ts +7 -0
  196. package/corpus/templates/factory/server/connectors/credentials.ts +129 -0
  197. package/corpus/templates/factory/server/connectors/slack.ts +129 -0
  198. package/corpus/templates/factory/server/db/index.ts +6 -0
  199. package/corpus/templates/factory/server/db/schema.ts +193 -0
  200. package/corpus/templates/factory/server/factory-graph/contracts.ts +212 -0
  201. package/corpus/templates/factory/server/factory-graph/store.ts +121 -0
  202. package/corpus/templates/factory/server/lib/require-workspace-member.ts +55 -0
  203. package/corpus/templates/factory/server/middleware/auth.ts +15 -0
  204. package/corpus/templates/factory/server/plugins/agent-chat.ts +58 -0
  205. package/corpus/templates/factory/server/plugins/auth.ts +14 -0
  206. package/corpus/templates/factory/server/plugins/factory-migrations.ts +247 -0
  207. package/corpus/templates/factory/server/plugins/factory-scheduler-job.ts +116 -0
  208. package/corpus/templates/factory/server/plugins/integrations.ts +46 -0
  209. package/corpus/templates/factory/server/routes/[...page].get.ts +5 -0
  210. package/corpus/templates/factory/server/routes/_agent-native/factory/builder-callback.post.ts +116 -0
  211. package/corpus/templates/factory/server/triage/ai-services-git.ts +197 -0
  212. package/corpus/templates/factory/server/triage/builder-executor.ts +118 -0
  213. package/corpus/templates/factory/server/triage/contracts.ts +164 -0
  214. package/corpus/templates/factory/server/triage/github-ingestion.ts +35 -0
  215. package/corpus/templates/factory/server/triage/guards.ts +121 -0
  216. package/corpus/templates/factory/server/triage/ids.ts +27 -0
  217. package/corpus/templates/factory/server/triage/pr-babysit.ts +100 -0
  218. package/corpus/templates/factory/server/triage/pr-monitor.ts +220 -0
  219. package/corpus/templates/factory/server/triage/slack-client.ts +55 -0
  220. package/corpus/templates/factory/server/triage/slack-poller.ts +152 -0
  221. package/corpus/templates/factory/ssr-entry.ts +15 -0
  222. package/corpus/templates/factory/tsconfig.json +21 -0
  223. package/corpus/templates/factory/vite.config.ts +19 -0
  224. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +55 -5
  225. package/corpus/templates/forms/changelog/2026-07-31-the-agent-native-logo-stays-visible-when-the-sidebar-is-coll.md +6 -0
  226. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +6 -2
  227. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +21 -6
  228. package/corpus/templates/plan/changelog/2026-07-31-clicking-the-agent-native-logo-now-toggles-the-app-sidebar.md +6 -0
  229. package/corpus/templates/slides/.agents/skills/create-deck/SKILL.md +12 -0
  230. package/corpus/templates/slides/.agents/skills/design-systems/SKILL.md +9 -0
  231. package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +11 -0
  232. package/corpus/templates/slides/AGENTS.md +5 -6
  233. package/corpus/templates/slides/actions/_await-fit-check.ts +20 -10
  234. package/corpus/templates/slides/actions/add-slide.ts +17 -4
  235. package/corpus/templates/slides/actions/create-design-system.ts +16 -4
  236. package/corpus/templates/slides/actions/delete-design-system.ts +18 -2
  237. package/corpus/templates/slides/actions/get-layout-overflows.ts +88 -0
  238. package/corpus/templates/slides/actions/import-file.ts +1 -0
  239. package/corpus/templates/slides/actions/index-design-system-with-builder.ts +8 -0
  240. package/corpus/templates/slides/actions/patch-deck.ts +48 -16
  241. package/corpus/templates/slides/actions/set-default-design-system.ts +49 -19
  242. package/corpus/templates/slides/actions/update-slide.ts +13 -3
  243. package/corpus/templates/slides/actions/view-screen.ts +87 -10
  244. package/corpus/templates/slides/app/components/deck/SlideRenderer.tsx +155 -28
  245. package/corpus/templates/slides/app/components/design-system/DesignSystemCard.tsx +21 -17
  246. package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +849 -341
  247. package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +102 -2
  248. package/corpus/templates/slides/app/components/editor/PromptDialog.tsx +13 -16
  249. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +60 -12
  250. package/corpus/templates/slides/app/components/editor/SlideOverflowWarning.tsx +11 -1
  251. package/corpus/templates/slides/app/components/layout/Sidebar.tsx +66 -19
  252. package/corpus/templates/slides/app/i18n/en-US.ts +23 -0
  253. package/corpus/templates/slides/app/lib/normalize-slide-padding.ts +8 -15
  254. package/corpus/templates/slides/app/pages/DeckEditor.tsx +4 -3
  255. package/corpus/templates/slides/app/pages/DesignSystems.tsx +4 -3
  256. package/corpus/templates/slides/app/pages/Index.tsx +1 -1
  257. package/corpus/templates/slides/changelog/2026-07-31-design-system-details-now-show-their-source-and-indexing-sta.md +6 -0
  258. package/corpus/templates/slides/changelog/2026-07-31-design-system-indexing-keeps-your-chosen-name-when-you-uploa.md +6 -0
  259. package/corpus/templates/slides/changelog/2026-07-31-design-system-setup-keeps-focus-rings-visible-and-uses-a-sim.md +6 -0
  260. package/corpus/templates/slides/changelog/2026-07-31-skip-prompt-is-now-available-in-the-new-deck-prompt-header.md +6 -0
  261. package/corpus/templates/slides/changelog/2026-07-31-slides-now-detect-real-text-and-box-overflow-across-the-deck.md +6 -0
  262. package/corpus/templates/slides/changelog/2026-07-31-the-agent-native-logo-stays-visible-when-the-sidebar-is-coll.md +6 -0
  263. package/corpus/templates/slides/server/handlers/design-systems.ts +1 -0
  264. package/corpus/templates/slides/server/handlers/index-design-system-sources.ts +1 -0
  265. package/corpus/templates/slides/server/lib/builder-design-system-proxy.ts +23 -4
  266. package/corpus/templates/slides/server/plugins/agent-chat.ts +5 -0
  267. package/corpus/templates/slides/server/plugins/creative-context.ts +16 -3
  268. package/corpus/templates/slides/server/workspace-defaults.ts +5 -1
  269. package/corpus/templates/slides/shared/slide-fit.ts +26 -0
  270. package/corpus/templates/tasks/app/components/layout/Sidebar.tsx +30 -3
  271. package/corpus/templates/tasks/changelog/2026-07-31-clicking-the-agent-native-logo-now-toggles-the-app-sidebar.md +6 -0
  272. package/dist/a2a/correlation.d.ts +4 -1
  273. package/dist/a2a/correlation.d.ts.map +1 -1
  274. package/dist/a2a/correlation.js +8 -1
  275. package/dist/a2a/correlation.js.map +1 -1
  276. package/dist/a2a/types.d.ts +11 -3
  277. package/dist/a2a/types.d.ts.map +1 -1
  278. package/dist/a2a/types.js.map +1 -1
  279. package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
  280. package/dist/agent/engine/ai-sdk-engine.js +27 -41
  281. package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
  282. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  283. package/dist/agent/engine/builder-engine.js +18 -8
  284. package/dist/agent/engine/builder-engine.js.map +1 -1
  285. package/dist/agent/engine/error-detail.d.ts +61 -0
  286. package/dist/agent/engine/error-detail.d.ts.map +1 -1
  287. package/dist/agent/engine/error-detail.js +145 -3
  288. package/dist/agent/engine/error-detail.js.map +1 -1
  289. package/dist/agent/engine/failure-taxonomy.d.ts +24 -0
  290. package/dist/agent/engine/failure-taxonomy.d.ts.map +1 -0
  291. package/dist/agent/engine/failure-taxonomy.js +88 -0
  292. package/dist/agent/engine/failure-taxonomy.js.map +1 -0
  293. package/dist/agent/engine/index.d.ts +2 -1
  294. package/dist/agent/engine/index.d.ts.map +1 -1
  295. package/dist/agent/engine/index.js +2 -1
  296. package/dist/agent/engine/index.js.map +1 -1
  297. package/dist/agent/engine/registry.d.ts +16 -0
  298. package/dist/agent/engine/registry.d.ts.map +1 -1
  299. package/dist/agent/engine/registry.js +71 -6
  300. package/dist/agent/engine/registry.js.map +1 -1
  301. package/dist/agent/engine/translate-ai-sdk.d.ts.map +1 -1
  302. package/dist/agent/engine/translate-ai-sdk.js +14 -2
  303. package/dist/agent/engine/translate-ai-sdk.js.map +1 -1
  304. package/dist/agent/production-agent.d.ts.map +1 -1
  305. package/dist/agent/production-agent.js +13 -24
  306. package/dist/agent/production-agent.js.map +1 -1
  307. package/dist/agent/run-loop-with-resume.js +1 -1
  308. package/dist/agent/run-loop-with-resume.js.map +1 -1
  309. package/dist/agent/run-manager.d.ts.map +1 -1
  310. package/dist/agent/run-manager.js +39 -10
  311. package/dist/agent/run-manager.js.map +1 -1
  312. package/dist/agent/run-store.d.ts +10 -0
  313. package/dist/agent/run-store.d.ts.map +1 -1
  314. package/dist/agent/run-store.js +20 -3
  315. package/dist/agent/run-store.js.map +1 -1
  316. package/dist/agent/thread-data-builder.d.ts.map +1 -1
  317. package/dist/agent/thread-data-builder.js +28 -4
  318. package/dist/agent/thread-data-builder.js.map +1 -1
  319. package/dist/cli/templates-meta.d.ts.map +1 -1
  320. package/dist/cli/templates-meta.js +13 -0
  321. package/dist/cli/templates-meta.js.map +1 -1
  322. package/dist/cli/workspace-dev.d.ts.map +1 -1
  323. package/dist/cli/workspace-dev.js +1 -0
  324. package/dist/cli/workspace-dev.js.map +1 -1
  325. package/dist/client/error-format.d.ts.map +1 -1
  326. package/dist/client/error-format.js +10 -0
  327. package/dist/client/error-format.js.map +1 -1
  328. package/dist/collab/awareness.d.ts +2 -2
  329. package/dist/collab/awareness.d.ts.map +1 -1
  330. package/dist/credentials/index.d.ts +9 -2
  331. package/dist/credentials/index.d.ts.map +1 -1
  332. package/dist/credentials/index.js +50 -8
  333. package/dist/credentials/index.js.map +1 -1
  334. package/dist/extensions/url-safety.d.ts.map +1 -1
  335. package/dist/extensions/url-safety.js +38 -12
  336. package/dist/extensions/url-safety.js.map +1 -1
  337. package/dist/integrations/adapters/slack.d.ts.map +1 -1
  338. package/dist/integrations/adapters/slack.js +25 -8
  339. package/dist/integrations/adapters/slack.js.map +1 -1
  340. package/dist/integrations/google-docs-poller.d.ts.map +1 -1
  341. package/dist/integrations/google-docs-poller.js +13 -1
  342. package/dist/integrations/google-docs-poller.js.map +1 -1
  343. package/dist/integrations/installations-store.d.ts +10 -0
  344. package/dist/integrations/installations-store.d.ts.map +1 -1
  345. package/dist/integrations/installations-store.js +24 -0
  346. package/dist/integrations/installations-store.js.map +1 -1
  347. package/dist/integrations/plugin.d.ts.map +1 -1
  348. package/dist/integrations/plugin.js +6 -5
  349. package/dist/integrations/plugin.js.map +1 -1
  350. package/dist/integrations/types.d.ts +7 -0
  351. package/dist/integrations/types.d.ts.map +1 -1
  352. package/dist/integrations/types.js.map +1 -1
  353. package/dist/integrations/webhook-handler.d.ts.map +1 -1
  354. package/dist/integrations/webhook-handler.js +16 -1
  355. package/dist/integrations/webhook-handler.js.map +1 -1
  356. package/dist/jobs/background-automation-runner.d.ts.map +1 -1
  357. package/dist/jobs/background-automation-runner.js +35 -2
  358. package/dist/jobs/background-automation-runner.js.map +1 -1
  359. package/dist/mcp/screen-memory-stdio.d.ts +7 -7
  360. package/dist/mcp/screen-memory-stdio.d.ts.map +1 -1
  361. package/dist/notifications/routes.d.ts +3 -3
  362. package/dist/observability/routes.d.ts +3 -3
  363. package/dist/provider-api/actions/custom-provider-registration.d.ts +14 -14
  364. package/dist/provider-api/actions/provider-api.d.ts +8 -8
  365. package/dist/provider-api/index.js +7 -3
  366. package/dist/provider-api/index.js.map +1 -1
  367. package/dist/scripts/call-agent.d.ts.map +1 -1
  368. package/dist/scripts/call-agent.js +6 -1
  369. package/dist/scripts/call-agent.js.map +1 -1
  370. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  371. package/dist/server/agent-chat-plugin.js +25 -7
  372. package/dist/server/agent-chat-plugin.js.map +1 -1
  373. package/dist/server/agent-discovery.d.ts +2 -0
  374. package/dist/server/agent-discovery.d.ts.map +1 -1
  375. package/dist/server/agent-discovery.js.map +1 -1
  376. package/dist/server/builder-design-systems.d.ts +4 -1
  377. package/dist/server/builder-design-systems.d.ts.map +1 -1
  378. package/dist/server/builder-design-systems.js +11 -1
  379. package/dist/server/builder-design-systems.js.map +1 -1
  380. package/dist/server/credential-provider.d.ts.map +1 -1
  381. package/dist/server/credential-provider.js +49 -12
  382. package/dist/server/credential-provider.js.map +1 -1
  383. package/dist/server/index.d.ts +1 -1
  384. package/dist/server/index.d.ts.map +1 -1
  385. package/dist/server/index.js.map +1 -1
  386. package/dist/server/onboarding-html.d.ts.map +1 -1
  387. package/dist/server/onboarding-html.js +37 -2
  388. package/dist/server/onboarding-html.js.map +1 -1
  389. package/dist/server/transcribe-voice.d.ts +1 -1
  390. package/dist/shared/reasoning-effort.d.ts +1 -0
  391. package/dist/shared/reasoning-effort.d.ts.map +1 -1
  392. package/dist/shared/reasoning-effort.js +1 -1
  393. package/dist/shared/reasoning-effort.js.map +1 -1
  394. package/dist/templates/chat/app/components/layout/Sidebar.tsx +30 -3
  395. package/dist/templates/chat/changelog/2026-07-31-clicking-the-agent-native-logo-now-toggles-the-app-sidebar.md +6 -0
  396. package/dist/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +11 -0
  397. package/package.json +1 -1
  398. package/src/a2a/correlation.ts +11 -1
  399. package/src/a2a/types.ts +11 -3
  400. package/src/agent/engine/ai-sdk-engine.ts +33 -46
  401. package/src/agent/engine/builder-engine.ts +22 -10
  402. package/src/agent/engine/error-detail.ts +184 -3
  403. package/src/agent/engine/failure-taxonomy.ts +123 -0
  404. package/src/agent/engine/index.ts +8 -0
  405. package/src/agent/engine/registry.ts +92 -8
  406. package/src/agent/engine/translate-ai-sdk.ts +17 -2
  407. package/src/agent/production-agent.ts +13 -33
  408. package/src/agent/run-loop-with-resume.ts +1 -1
  409. package/src/agent/run-manager.ts +43 -14
  410. package/src/agent/run-store.ts +30 -3
  411. package/src/agent/thread-data-builder.ts +36 -4
  412. package/src/cli/templates-meta.ts +13 -0
  413. package/src/cli/workspace-dev.ts +1 -0
  414. package/src/client/error-format.ts +12 -0
  415. package/src/credentials/index.ts +51 -12
  416. package/src/extensions/url-safety.ts +46 -12
  417. package/src/integrations/adapters/slack.ts +32 -10
  418. package/src/integrations/google-docs-poller.ts +12 -1
  419. package/src/integrations/installations-store.ts +30 -0
  420. package/src/integrations/plugin.ts +5 -5
  421. package/src/integrations/types.ts +7 -0
  422. package/src/integrations/webhook-handler.ts +24 -1
  423. package/src/jobs/background-automation-runner.ts +38 -1
  424. package/src/provider-api/index.ts +8 -2
  425. package/src/scripts/call-agent.ts +6 -0
  426. package/src/server/agent-chat-plugin.ts +30 -9
  427. package/src/server/agent-discovery.ts +2 -0
  428. package/src/server/builder-design-systems.ts +21 -0
  429. package/src/server/credential-provider.ts +51 -12
  430. package/src/server/index.ts +1 -0
  431. package/src/server/onboarding-html.ts +37 -2
  432. package/src/shared/reasoning-effort.ts +1 -1
  433. package/src/templates/chat/app/components/layout/Sidebar.tsx +30 -3
  434. package/src/templates/chat/changelog/2026-07-31-clicking-the-agent-native-logo-now-toggles-the-app-sidebar.md +6 -0
  435. package/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +11 -0
  436. package/corpus/templates/clips/desktop/src/lib/media-device-selection.ts +0 -157
@@ -1,4 +1,7 @@
1
- import { appBasePath } from "@agent-native/core/client/api-path";
1
+ import {
2
+ agentNativePath,
3
+ appBasePath,
4
+ } from "@agent-native/core/client/api-path";
2
5
  import {
3
6
  type AttributedRecentEdit,
4
7
  type CollabUser,
@@ -13,6 +16,8 @@ import {
13
16
  verticalListSortingStrategy,
14
17
  } from "@dnd-kit/sortable";
15
18
  import { CSS } from "@dnd-kit/utilities";
19
+ import { appStateKeyForBrowserTab } from "@shared/app-state-tabs";
20
+ import { hashSlideContent, type DeckFitState } from "@shared/slide-fit";
16
21
  import {
17
22
  IconPlus,
18
23
  IconGripVertical,
@@ -27,6 +32,7 @@ import { createPortal } from "react-dom";
27
32
  import { toast } from "sonner";
28
33
 
29
34
  import SlideRenderer from "@/components/deck/SlideRenderer";
35
+ import type { SlideOverflowInfo } from "@/components/deck/SlideRenderer";
30
36
  import { GoogleDocImportHint } from "@/components/editor/GoogleDocImportHint";
31
37
  import {
32
38
  isInsidePortaledLayer,
@@ -41,6 +47,7 @@ import type { Slide } from "@/context/DeckContext";
41
47
  import { useAgentGenerating } from "@/hooks/use-agent-generating";
42
48
  import { addSlideAgentMessage } from "@/lib/agent-visible-message";
43
49
  import type { AspectRatio } from "@/lib/aspect-ratios";
50
+ import { TAB_ID } from "@/lib/tab-id";
44
51
 
45
52
  interface EditorSidebarProps {
46
53
  slides: Slide[];
@@ -61,6 +68,11 @@ interface EditorSidebarProps {
61
68
  aspectRatio?: AspectRatio;
62
69
  }
63
70
 
71
+ const DECK_FIT_STATE_KEYS = [
72
+ appStateKeyForBrowserTab("deck-fit-checks", TAB_ID),
73
+ "deck-fit-checks",
74
+ ];
75
+
64
76
  /** Extract the slide id from a `{kind:"paths",paths:["slides.<id>"]}` edit. */
65
77
  function slideIdFromEdit(edit: AttributedRecentEdit): string | null {
66
78
  const d = edit.descriptor;
@@ -183,6 +195,7 @@ function SortableSlideThumb({
183
195
  registerButtonRef,
184
196
  presenceUsers = [],
185
197
  aspectRatio,
198
+ onOverflowChange,
186
199
  readOnly = false,
187
200
  }: {
188
201
  slide: Slide;
@@ -195,6 +208,7 @@ function SortableSlideThumb({
195
208
  registerButtonRef: (slideId: string, node: HTMLButtonElement | null) => void;
196
209
  presenceUsers?: CollabUser[];
197
210
  aspectRatio?: AspectRatio;
211
+ onOverflowChange: (info: SlideOverflowInfo) => void;
198
212
  }) {
199
213
  const t = useT();
200
214
  const {
@@ -267,7 +281,11 @@ function SortableSlideThumb({
267
281
  : "rgba(255,255,255,0.06)",
268
282
  }}
269
283
  >
270
- <SlideRenderer slide={slide} aspectRatio={aspectRatio} />
284
+ <SlideRenderer
285
+ slide={slide}
286
+ aspectRatio={aspectRatio}
287
+ onOverflowChange={onOverflowChange}
288
+ />
271
289
  </div>
272
290
  </div>
273
291
  </button>
@@ -567,6 +585,85 @@ export default function EditorSidebar({
567
585
  const headerAddRef = useRef<HTMLButtonElement>(null);
568
586
  const slideButtonRefs = useRef(new Map<string, HTMLButtonElement>());
569
587
  const thumbScrollRef = useRef<HTMLDivElement>(null);
588
+ const measurementsRef = useRef(
589
+ new Map<
590
+ string,
591
+ { contentHash: string; info: SlideOverflowInfo; measuredAt: number }
592
+ >(),
593
+ );
594
+ const writeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
595
+
596
+ const writeDeckFitState = useCallback(() => {
597
+ const currentSlideIds = new Set(slides.map((slide) => slide.id));
598
+ const measuredSlides = Object.fromEntries(
599
+ Array.from(measurementsRef.current.entries())
600
+ .filter(([slideId]) => currentSlideIds.has(slideId))
601
+ .map(([slideId, measurement]) => [
602
+ slideId,
603
+ {
604
+ contentHash: measurement.contentHash,
605
+ contentHeight: measurement.info.contentHeight,
606
+ contentWidth: measurement.info.contentWidth,
607
+ viewportHeight: measurement.info.viewportHeight,
608
+ viewportWidth: measurement.info.viewportWidth,
609
+ verticalOverflow: measurement.info.verticalOverflow,
610
+ horizontalOverflow: measurement.info.horizontalOverflow,
611
+ measuredAt: measurement.measuredAt,
612
+ },
613
+ ]),
614
+ );
615
+ const payload: DeckFitState = {
616
+ deckId,
617
+ aspectRatio: aspectRatio ?? "16:9",
618
+ slides: measuredSlides,
619
+ };
620
+ const body = JSON.stringify(payload);
621
+ for (const key of DECK_FIT_STATE_KEYS) {
622
+ fetch(agentNativePath(`/_agent-native/application-state/${key}`), {
623
+ method: "PUT",
624
+ keepalive: true,
625
+ headers: {
626
+ "Content-Type": "application/json",
627
+ "X-Request-Source": TAB_ID,
628
+ },
629
+ body,
630
+ }).catch(() => {});
631
+ }
632
+ }, [aspectRatio, deckId, slides]);
633
+
634
+ const handleSlideOverflowChange = useCallback(
635
+ (slide: Slide, info: SlideOverflowInfo) => {
636
+ const contentHash = hashSlideContent(slide.content);
637
+ measurementsRef.current.set(slide.id, {
638
+ contentHash,
639
+ info,
640
+ measuredAt: Date.now(),
641
+ });
642
+ if (writeTimerRef.current) clearTimeout(writeTimerRef.current);
643
+ writeTimerRef.current = setTimeout(() => {
644
+ writeTimerRef.current = null;
645
+ writeDeckFitState();
646
+ }, 0);
647
+ },
648
+ [writeDeckFitState],
649
+ );
650
+
651
+ useEffect(() => {
652
+ measurementsRef.current.clear();
653
+ }, [deckId, aspectRatio]);
654
+
655
+ useEffect(() => {
656
+ return () => {
657
+ if (writeTimerRef.current) clearTimeout(writeTimerRef.current);
658
+ for (const key of DECK_FIT_STATE_KEYS) {
659
+ fetch(agentNativePath(`/_agent-native/application-state/${key}`), {
660
+ method: "DELETE",
661
+ keepalive: true,
662
+ headers: { "X-Request-Source": TAB_ID },
663
+ }).catch(() => {});
664
+ }
665
+ };
666
+ }, []);
570
667
 
571
668
  // Resolve a recent-edit descriptor (`slides.<id>`) to the on-screen rect of
572
669
  // that slide's thumbnail button, relative to the scroll container, so the
@@ -682,6 +779,9 @@ export default function EditorSidebar({
682
779
  registerButtonRef={registerSlideButton}
683
780
  presenceUsers={slidePresence?.get(slide.id) ?? []}
684
781
  aspectRatio={aspectRatio}
782
+ onOverflowChange={(info) =>
783
+ handleSlideOverflowChange(slide, info)
784
+ }
685
785
  />
686
786
  ))}
687
787
  </SortableContext>
@@ -200,10 +200,22 @@ export default function PromptPopover({
200
200
  className="fixed z-[200] w-[min(420px,calc(100vw-24px))] rounded-xl border border-border bg-popover shadow-2xl shadow-black/60"
201
201
  style={{ top: 0, left: 0, visibility: "visible" }}
202
202
  >
203
- <div className="px-3.5 pt-3 pb-2">
203
+ <div className="flex items-center justify-between gap-3 px-3.5 pt-3 pb-2">
204
204
  <span className="text-sm font-medium text-foreground/90">
205
205
  {title}
206
206
  </span>
207
+ {onSkip && (
208
+ <button
209
+ type="button"
210
+ onClick={() => {
211
+ onSkip();
212
+ onOpenChange(false);
213
+ }}
214
+ className="shrink-0 cursor-pointer text-xs text-primary hover:text-primary/80"
215
+ >
216
+ {skipLabel}
217
+ </button>
218
+ )}
207
219
  </div>
208
220
 
209
221
  <div className="px-2 pb-2">
@@ -226,21 +238,6 @@ export default function PromptPopover({
226
238
  promptText={promptText}
227
239
  onSourceContextChange={setGoogleDocContext}
228
240
  />
229
-
230
- {onSkip && (
231
- <div className="flex justify-end border-t border-border px-3.5 py-2">
232
- <button
233
- type="button"
234
- onClick={() => {
235
- onSkip();
236
- onOpenChange(false);
237
- }}
238
- className="cursor-pointer text-xs text-[#609FF8] hover:text-[#7AB2FA]"
239
- >
240
- {skipLabel}
241
- </button>
242
- </div>
243
- )}
244
241
  </div>
245
242
  </>
246
243
  );
@@ -1,5 +1,5 @@
1
1
  import { agentChat } from "@agent-native/core";
2
- import { sendToAgentChat } from "@agent-native/core/client/agent-chat";
2
+ import { sendToAgentChatAndConfirm } from "@agent-native/core/client/agent-chat";
3
3
  import { agentNativePath } from "@agent-native/core/client/api-path";
4
4
  import {
5
5
  type AttributedRecentEdit,
@@ -16,6 +16,7 @@ import {
16
16
  RecentEditHighlights,
17
17
  } from "@agent-native/toolkit/collab-ui";
18
18
  import { appStateKeyForBrowserTab } from "@shared/app-state-tabs";
19
+ import { hashSlideContent } from "@shared/slide-fit";
19
20
  import { IconMaximize, IconZoomIn, IconZoomOut } from "@tabler/icons-react";
20
21
  import {
21
22
  useState,
@@ -983,9 +984,13 @@ function syncOverflowToAppState(
983
984
  payload: {
984
985
  slideId: string;
985
986
  deckId?: string;
987
+ contentHash: string;
986
988
  contentHeight: number;
989
+ contentWidth: number;
987
990
  viewportHeight: number;
991
+ viewportWidth: number;
988
992
  verticalOverflow: number;
993
+ horizontalOverflow: number;
989
994
  } | null,
990
995
  ) {
991
996
  const keys = Array.from(
@@ -1159,7 +1164,7 @@ export default function SlideEditor({
1159
1164
  w: number;
1160
1165
  h: number;
1161
1166
  } | null>(null);
1162
- /** Vertical overflow for the current slide (0 = fits). Reported by the
1167
+ /** Content overflow for the current slide (both axes 0 = fits). Reported by the
1163
1168
  * renderer so we can prompt the agent to rewrite the slide HTML instead of
1164
1169
  * silently scaling it down (which created unbalanced right/bottom margins
1165
1170
  * on slides whose content was too tall for the canvas). */
@@ -1167,6 +1172,9 @@ export default function SlideEditor({
1167
1172
  null,
1168
1173
  );
1169
1174
  const [isAskingAgentToFix, setIsAskingAgentToFix] = useState(false);
1175
+ const repairRequestTimerRef = useRef<ReturnType<typeof setTimeout> | null>(
1176
+ null,
1177
+ );
1170
1178
  const [isOverflowWarningDismissed, setIsOverflowWarningDismissed] =
1171
1179
  useState(false);
1172
1180
  const dims = getAspectRatioDims(aspectRatio);
@@ -1285,6 +1293,10 @@ export default function SlideEditor({
1285
1293
  // Reset overflow state whenever the slide changes — the renderer will
1286
1294
  // report the next measurement (or stay null if the new slide fits).
1287
1295
  useEffect(() => {
1296
+ if (repairRequestTimerRef.current) {
1297
+ clearTimeout(repairRequestTimerRef.current);
1298
+ repairRequestTimerRef.current = null;
1299
+ }
1288
1300
  setOverflowInfo(null);
1289
1301
  setIsAskingAgentToFix(false);
1290
1302
  setIsOverflowWarningDismissed(false);
@@ -1295,19 +1307,27 @@ export default function SlideEditor({
1295
1307
  // measurement never leaks into a different deck/slide context.
1296
1308
  useEffect(() => {
1297
1309
  return () => {
1310
+ if (repairRequestTimerRef.current) {
1311
+ clearTimeout(repairRequestTimerRef.current);
1312
+ repairRequestTimerRef.current = null;
1313
+ }
1298
1314
  syncOverflowToAppState(null);
1299
1315
  };
1300
1316
  }, []);
1301
1317
 
1302
1318
  const handleOverflowChange = useCallback(
1303
1319
  (info: SlideOverflowInfo) => {
1304
- const overflowing = info.verticalOverflow > 0 ? info : null;
1320
+ const overflowing =
1321
+ info.verticalOverflow > 0 || info.horizontalOverflow > 0 ? info : null;
1305
1322
  // Dedup the React state update — the renderer fires on every
1306
1323
  // measurement (so the action can confirm freshness via the app-state
1307
1324
  // `measuredAt` timestamp), but most measurements report the same
1308
1325
  // value and shouldn't churn the badge UI.
1309
1326
  setOverflowInfo((prev) => {
1310
- if (prev?.verticalOverflow === overflowing?.verticalOverflow) {
1327
+ if (
1328
+ prev?.verticalOverflow === overflowing?.verticalOverflow &&
1329
+ prev?.horizontalOverflow === overflowing?.horizontalOverflow
1330
+ ) {
1311
1331
  return prev;
1312
1332
  }
1313
1333
  return overflowing;
@@ -1318,16 +1338,26 @@ export default function SlideEditor({
1318
1338
  syncOverflowToAppState({
1319
1339
  slideId: slide.id,
1320
1340
  deckId,
1341
+ contentHash: hashSlideContent(slide.content),
1321
1342
  contentHeight: info.contentHeight,
1343
+ contentWidth: info.contentWidth,
1322
1344
  viewportHeight: info.viewportHeight,
1345
+ viewportWidth: info.viewportWidth,
1323
1346
  verticalOverflow: info.verticalOverflow,
1347
+ horizontalOverflow: info.horizontalOverflow,
1324
1348
  });
1325
1349
  },
1326
1350
  [slide.id, deckId],
1327
1351
  );
1328
1352
 
1329
1353
  const handleAskAgentToFixLayout = useCallback(() => {
1330
- if (!overflowInfo || overflowInfo.verticalOverflow <= 0) return;
1354
+ if (
1355
+ !overflowInfo ||
1356
+ (overflowInfo.verticalOverflow <= 0 &&
1357
+ overflowInfo.horizontalOverflow <= 0)
1358
+ ) {
1359
+ return;
1360
+ }
1331
1361
  const slideHeading = (() => {
1332
1362
  if (typeof document === "undefined") return null;
1333
1363
  const main = document.querySelector("[data-main-slide-canvas]");
@@ -1337,27 +1367,44 @@ export default function SlideEditor({
1337
1367
  const dimsW = dims.width;
1338
1368
  const dimsH = dims.height;
1339
1369
  setIsAskingAgentToFix(true);
1340
- sendToAgentChat({
1370
+ if (repairRequestTimerRef.current) {
1371
+ clearTimeout(repairRequestTimerRef.current);
1372
+ }
1373
+ // Delivery only proves that the prompt reached chat, not that an action
1374
+ // changed this slide. Release the control after one bounded repair window
1375
+ // so a stalled or no-op agent run cannot strand the warning UI.
1376
+ repairRequestTimerRef.current = setTimeout(() => {
1377
+ repairRequestTimerRef.current = null;
1378
+ setIsAskingAgentToFix(false);
1379
+ }, 30_000);
1380
+ void sendToAgentChatAndConfirm({
1341
1381
  message: [
1342
- `The current slide's content vertically overflows the canvas by ${overflowInfo.verticalOverflow}px and needs to be rewritten to fit.`,
1382
+ `The current slide's content overflows the canvas${overflowInfo.verticalOverflow > 0 ? ` vertically by ${overflowInfo.verticalOverflow}px` : ""}${overflowInfo.horizontalOverflow > 0 ? ` horizontally by ${overflowInfo.horizontalOverflow}px` : ""} and needs to be rewritten to fit.`,
1343
1383
  ``,
1344
1384
  `Slide id: \`${slide.id}\``,
1345
1385
  slideHeading ? `Slide heading: "${slideHeading}"` : null,
1346
- `Canvas size: ${dimsW}x${dimsH}px (16:9 native render).`,
1347
- `Available content area inside the slide's padding: ${overflowInfo.viewportHeight}px tall.`,
1348
- `Natural rendered content height: ${overflowInfo.contentHeight}px overflows by ${overflowInfo.verticalOverflow}px.`,
1386
+ `Canvas size: ${dimsW}x${dimsH}px (native render).`,
1387
+ `Available content area inside the slide's padding: ${overflowInfo.viewportWidth}x${overflowInfo.viewportHeight}px.`,
1388
+ `Natural rendered content: ${overflowInfo.contentWidth}x${overflowInfo.contentHeight}px inside a ${overflowInfo.viewportWidth}x${overflowInfo.viewportHeight}px content area.`,
1349
1389
  ``,
1350
- `Please use \`view-screen\` to read the current slide HTML, then \`update-slide --fullContent\` to rewrite the slide so its rendered height is at most ${overflowInfo.viewportHeight}px. Options to shrink the layout, in order of preference:`,
1390
+ `Please use \`view-screen\` to read the current slide HTML, then make one bounded \`update-slide --fullContent\` repair so its rendered content fits within ${overflowInfo.viewportWidth}x${overflowInfo.viewportHeight}px. Options to shrink the layout, in order of preference:`,
1351
1391
  `1. Tighten copy — shorten headings/body, drop low-value bullets, replace prose with terse phrases.`,
1352
1392
  `2. Reduce vertical density — fewer stacked cards, smaller gaps, smaller body font (don't go below 16px), shorter labels.`,
1353
1393
  `3. Reduce slide padding (e.g. 40px top/bottom instead of 60-80px) if the layout is genuinely tight.`,
1354
1394
  `4. If the content really can't be compressed without losing meaning, split it across two slides.`,
1355
1395
  ``,
1356
- `Do NOT solve this by adding \`transform: scale()\` or \`overflow: scroll\`. Preserve existing manually positioned absolute objects, including text boxes; rewrite only the overflowing flow layout so the HTML itself fits ${dimsW}x${dimsH}.`,
1396
+ `Do NOT solve this by adding zoom, \`transform: scale()\`, clipping, or \`overflow: scroll\`. Preserve existing manually positioned absolute objects, including text boxes; rewrite only the overflowing flow layout so the HTML itself fits ${dimsW}x${dimsH}. After the write, verify the result with \`view-screen\`; do not repeat repairs in a loop.`,
1357
1397
  ]
1358
1398
  .filter(Boolean)
1359
1399
  .join("\n"),
1360
1400
  submit: true,
1401
+ chatTarget: "local",
1402
+ }).then((delivery) => {
1403
+ if (!delivery.delivered) {
1404
+ // A missing or delayed chat handoff must not leave the only repair
1405
+ // control permanently disabled with no visible mutation to wait for.
1406
+ setIsAskingAgentToFix(false);
1407
+ }
1361
1408
  });
1362
1409
  }, [overflowInfo, slide.id, dims.width, dims.height]);
1363
1410
  /** Marquee origin (viewport coords). Set on pointerdown. */
@@ -4134,6 +4181,7 @@ export default function SlideEditor({
4134
4181
  !isOverflowWarningDismissed && (
4135
4182
  <SlideOverflowWarning
4136
4183
  verticalOverflow={overflowInfo.verticalOverflow}
4184
+ horizontalOverflow={overflowInfo.horizontalOverflow}
4137
4185
  isAskingAgentToFix={isAskingAgentToFix}
4138
4186
  dismissLabel={t("deckEditor.dismissLayoutWarning")}
4139
4187
  onFix={handleAskAgentToFixLayout}
@@ -4,6 +4,7 @@ import { Button } from "@/components/ui/button";
4
4
 
5
5
  interface SlideOverflowWarningProps {
6
6
  verticalOverflow: number;
7
+ horizontalOverflow?: number;
7
8
  isAskingAgentToFix: boolean;
8
9
  dismissLabel: string;
9
10
  onFix: () => void;
@@ -12,11 +13,20 @@ interface SlideOverflowWarningProps {
12
13
 
13
14
  export function SlideOverflowWarning({
14
15
  verticalOverflow,
16
+ horizontalOverflow = 0,
15
17
  isAskingAgentToFix,
16
18
  dismissLabel,
17
19
  onFix,
18
20
  onDismiss,
19
21
  }: SlideOverflowWarningProps) {
22
+ const overflowLabel = [
23
+ verticalOverflow > 0 ? `vertical ${verticalOverflow}px` : "",
24
+ horizontalOverflow > 0 ? `horizontal ${horizontalOverflow}px` : "",
25
+ ]
26
+ .filter(Boolean)
27
+ .join(", ");
28
+ const visibleOverflowLabel =
29
+ horizontalOverflow > 0 ? overflowLabel : `${verticalOverflow}px`;
20
30
  return (
21
31
  <div
22
32
  role="status"
@@ -27,7 +37,7 @@ export function SlideOverflowWarning({
27
37
  >
28
38
  <IconAlertTriangle className="h-3.5 w-3.5 flex-shrink-0" stroke={2} />
29
39
  <span className="leading-tight">
30
- Layout overflows by {verticalOverflow}px
40
+ Layout overflows by {visibleOverflowLabel}
31
41
  </span>
32
42
  <Button
33
43
  size="sm"
@@ -99,9 +99,72 @@ export function Sidebar({ collapsed, onToggleCollapsed }: SidebarProps) {
99
99
  />
100
100
  );
101
101
 
102
+ const brand = (
103
+ <div
104
+ className={cn(
105
+ "flex items-center gap-2",
106
+ collapsed ? "size-8 justify-center" : "min-w-0 flex-1",
107
+ )}
108
+ >
109
+ <img
110
+ src={appPath("/agent-native-icon-light.svg")}
111
+ alt=""
112
+ aria-hidden="true"
113
+ width={28}
114
+ height={16}
115
+ className="block h-4 w-7 shrink-0 object-contain object-center dark:hidden"
116
+ />
117
+ <img
118
+ src={appPath("/agent-native-icon-dark.svg")}
119
+ alt=""
120
+ aria-hidden="true"
121
+ width={28}
122
+ height={16}
123
+ className="hidden h-4 w-7 shrink-0 object-contain object-center dark:block"
124
+ />
125
+ {!collapsed && (
126
+ <span className="truncate text-sm font-semibold tracking-tight">
127
+ {t("navigation.brand")}
128
+ </span>
129
+ )}
130
+ </div>
131
+ );
132
+ const brandControl = onToggleCollapsed ? (
133
+ <Tooltip delayDuration={0}>
134
+ <TooltipTrigger asChild>
135
+ <button
136
+ type="button"
137
+ onClick={onToggleCollapsed}
138
+ aria-label={
139
+ collapsed
140
+ ? t("sidebar.expandSidebar")
141
+ : t("sidebar.collapseSidebar")
142
+ }
143
+ className={cn(
144
+ "flex min-w-0 items-center rounded-md text-foreground outline-none transition-colors hover:bg-sidebar-accent/50 focus-visible:ring-2 focus-visible:ring-ring",
145
+ collapsed
146
+ ? "size-8 justify-center"
147
+ : "w-full gap-2 px-1 py-1 text-start",
148
+ )}
149
+ data-sidebar-brand-toggle
150
+ >
151
+ {brand}
152
+ </button>
153
+ </TooltipTrigger>
154
+ <TooltipContent side="right">
155
+ {collapsed ? t("sidebar.expandSidebar") : t("sidebar.collapseSidebar")}
156
+ </TooltipContent>
157
+ </Tooltip>
158
+ ) : (
159
+ brand
160
+ );
161
+
102
162
  if (collapsed) {
103
163
  return (
104
- <aside className="flex h-full w-12 shrink-0 flex-col items-center gap-1 overflow-hidden border-e border-border bg-sidebar py-2 text-sidebar-foreground transition-[width] duration-200 ease-out">
164
+ <aside className="flex h-full w-12 shrink-0 flex-col items-center overflow-hidden border-e border-border bg-sidebar text-sidebar-foreground transition-[width] duration-200 ease-out">
165
+ <div className="flex h-12 w-full shrink-0 items-center justify-center border-b border-border">
166
+ {brandControl}
167
+ </div>
105
168
  <nav className="flex min-h-0 flex-1 flex-col items-center gap-1 overflow-y-auto pt-1">
106
169
  {navItems.map((item) => {
107
170
  const Icon = item.icon;
@@ -162,24 +225,8 @@ export function Sidebar({ collapsed, onToggleCollapsed }: SidebarProps) {
162
225
 
163
226
  return (
164
227
  <aside className="flex h-full w-56 min-w-0 shrink-0 flex-col overflow-hidden border-e border-border bg-sidebar text-sidebar-foreground transition-[width] duration-200 ease-out">
165
- <div className="flex h-12 shrink-0 items-center justify-between border-b border-border px-4">
166
- <div className="flex items-center gap-2">
167
- <img
168
- src={appPath("/agent-native-icon-light.svg")}
169
- alt=""
170
- aria-hidden="true"
171
- className="block h-4 w-auto dark:hidden"
172
- />
173
- <img
174
- src={appPath("/agent-native-icon-dark.svg")}
175
- alt=""
176
- aria-hidden="true"
177
- className="hidden h-4 w-auto dark:block"
178
- />
179
- <span className="text-sm font-semibold tracking-tight">
180
- {t("navigation.brand")}
181
- </span>
182
- </div>
228
+ <div className="flex h-12 shrink-0 items-center border-b border-border px-4">
229
+ {brandControl}
183
230
  </div>
184
231
 
185
232
  <div className="flex min-h-0 flex-1 flex-col overflow-y-auto">
@@ -548,6 +548,10 @@ const messages = {
548
548
  figFileTooLarge: "File too large (max {{maxSize}}).",
549
549
  figParseFailed: "Could not start Builder indexing for that Figma file.",
550
550
  updated: "Design system updated",
551
+ otherSources: "Other",
552
+ otherSourcesDescription:
553
+ "Connect from a website, code, files, or an existing design system.",
554
+ chooseSourcePrompt: "Choose one source to configure",
551
555
  updateFailed: "Failed to update",
552
556
  generationStarted: "Design system generation started",
553
557
  generationStartedDescription:
@@ -589,6 +593,25 @@ const messages = {
589
593
  "e.g. Always open with a single-stat title slide. Never use bullet lists longer than 3 items. Keep slide titles under 6 words...",
590
594
  customInstructionsDescription:
591
595
  "Saved with the design system. Re-applied every time the agent uses it to generate slides.",
596
+ sourceLabel: "Source",
597
+ sourceFigma: "Figma file",
598
+ sourceCode: "Code files",
599
+ sourceGitHub: "GitHub repository",
600
+ sourceMixed: "Multiple sources",
601
+ sourceBuilder: "Builder Design System Intelligence",
602
+ sourceIndexing: "Indexing in progress",
603
+ sourceIndexed: "Indexed",
604
+ sourceUnavailable: "Results unavailable",
605
+ sourceIndexingDescription:
606
+ "Builder is still processing this source. Results will appear here as they are ready.",
607
+ sourceIndexedDescription: "{{docs}} docs · {{tokens}} tokens indexed",
608
+ sourceIndexedDocsOnly: "{{docs}} docs indexed",
609
+ sourceIndexedTokensOnly: "{{tokens}} tokens indexed",
610
+ sourceUnavailableDescription:
611
+ "Builder could not load the latest source results.",
612
+ sourceOpenInBuilder: "Open in Builder",
613
+ loading: "Loading design system",
614
+ loadFailed: "We couldn't load this design system. Close and try again.",
592
615
  cancel: "Cancel",
593
616
  saving: "Saving...",
594
617
  saveChanges: "Save Changes",
@@ -1,10 +1,9 @@
1
1
  /**
2
- * Force the canonical `padding: 80px 110px` on the outer `.fmd-slide` wrapper
3
- * when the agent supplies slide HTML. Models drift on numeric values during
4
- * regeneration most often dropping the second padding arg, which collapses
5
- * horizontal padding from 110px to 80px and looks like the right margin
6
- * shrunk. AGENTS.md treats `80px 110px` as canonical for every layout, so we
7
- * normalize server-side rather than trusting the model's output.
2
+ * Ensure the outer `.fmd-slide` wrapper has a padding declaration.
3
+ *
4
+ * Explicit padding is part of the slide layout, so preserve it. In particular,
5
+ * an overflow repair often needs to reduce vertical padding; rewriting that
6
+ * value here makes a successful-looking agent edit a no-op in the renderer.
8
7
  */
9
8
  export function normalizeSlidePadding(html: string): string {
10
9
  if (!html.includes('class="fmd-slide"')) return html;
@@ -13,15 +12,9 @@ export function normalizeSlidePadding(html: string): string {
13
12
  /(<div\b[^>]*\bclass="fmd-slide"[^>]*\bstyle=")([^"]*)(")/,
14
13
  (_match, before, style, after) => {
15
14
  const hasPadding = /(?:^|;)\s*padding\s*:/i.test(style);
16
- let nextStyle: string;
17
- if (hasPadding) {
18
- nextStyle = style.replace(
19
- /(^|;)\s*padding\s*:\s*[^;]*/i,
20
- `$1${style.startsWith("padding") ? "" : " "}padding: 80px 110px`,
21
- );
22
- } else {
23
- nextStyle = `padding: 80px 110px;${style.startsWith(" ") ? "" : " "}${style}`;
24
- }
15
+ const nextStyle = hasPadding
16
+ ? style
17
+ : `padding: 80px 110px;${style.startsWith(" ") ? "" : " "}${style}`;
25
18
  return `${before}${nextStyle}${after}`;
26
19
  },
27
20
  );
@@ -52,7 +52,7 @@ import {
52
52
  useSlideComments,
53
53
  type CommentThread,
54
54
  } from "@/hooks/use-slide-comments";
55
- import type { AspectRatio } from "@/lib/aspect-ratios";
55
+ import { getAspectRatioDims, type AspectRatio } from "@/lib/aspect-ratios";
56
56
  import {
57
57
  deckAccessCheckKey,
58
58
  shouldShowDeckEditorSkeleton,
@@ -254,6 +254,7 @@ export default function DeckEditor() {
254
254
  }, []);
255
255
 
256
256
  const deck = getDeck(id || "");
257
+ const fitDims = getAspectRatioDims(deck?.aspectRatio);
257
258
  const currentDeckAccessKey = deckAccessCheckKey(id, org?.orgId);
258
259
  const hasTeamJoinOption =
259
260
  !org?.orgId &&
@@ -297,12 +298,12 @@ export default function DeckEditor() {
297
298
  "Answers:",
298
299
  formattedAnswers,
299
300
  "",
300
- "Every slide is rendered into a fixed native canvas (default 16:9 is 960x540 CSS pixels). Keep each slide within the density limits in AGENTS.md; split dense source material across more slides instead of packing it tightly.",
301
+ `Every slide is rendered into a fixed native canvas (${fitDims.width}x${fitDims.height} CSS pixels; standard padding leaves ${Math.max(0, fitDims.width - 220)}x${Math.max(0, fitDims.height - 160)}px for main content). Keep the main content within that fit budget; split dense source material across more slides instead of packing it tightly. Never use zoom, transform: scale(), clipping, or scroll overflow to hide content overflow, and keep body text at least 16px.`,
301
302
  "",
302
303
  `Now generate the slides based on these preferences. Start a manage-progress run, add the first slide as soon as it is ready, then continue one slide at a time so the editor visibly fills in. Use add-slide with --deckId=${id} to add slides sequentially. Wait for each add-slide result before calling it again.`,
303
304
  ].join("\n"),
304
305
  buildSkipContext: () =>
305
- `The user skipped the pre-generation questions for deck ${id}. Proceed with reasonable defaults. Every slide is rendered into a fixed native canvas (default 16:9 is 960x540 CSS pixels); keep each slide within the density limits in AGENTS.md and split dense source material across more slides instead of packing it tightly. Start a manage-progress run, add the first slide as soon as it is ready, then continue sequentially using add-slide with --deckId=${id}. Wait for each add-slide result before calling it again.`,
306
+ `The user skipped the pre-generation questions for deck ${id}. Proceed with reasonable defaults. Every slide is rendered into a fixed native canvas (${fitDims.width}x${fitDims.height} CSS pixels; standard padding leaves ${Math.max(0, fitDims.width - 220)}x${Math.max(0, fitDims.height - 160)}px for main content); keep each slide within that fit budget and split dense source material across more slides instead of packing it tightly. Never use zoom, transform: scale(), clipping, or scroll overflow to hide content overflow, and keep body text at least 16px. Start a manage-progress run, add the first slide as soon as it is ready, then continue sequentially using add-slide with --deckId=${id}. Wait for each add-slide result before calling it again.`,
306
307
  });
307
308
 
308
309
  const showQuestionFlow = Boolean(questionFlowQuestions?.length);
@@ -53,9 +53,9 @@ export default function DesignSystems() {
53
53
  setShowSetup(true);
54
54
  };
55
55
 
56
- const handleSetDefault = async (id: string) => {
56
+ const handleSetDefault = async (id: string, isDefault: boolean) => {
57
57
  try {
58
- await callAction("set-default-design-system", { id });
58
+ await callAction("set-default-design-system", { id, isDefault });
59
59
  refetch();
60
60
  } catch (err) {
61
61
  console.error("Failed to set default design system:", err);
@@ -264,9 +264,10 @@ export default function DesignSystems() {
264
264
  data={parsed}
265
265
  isDefault={ds.isDefault}
266
266
  visibility={ds.visibility}
267
+ accessRole={ds.accessRole}
267
268
  canManage={ds.canManage}
268
269
  onClick={() => handleCardClick(ds.id)}
269
- onSetDefault={() => handleSetDefault(ds.id)}
270
+ onSetDefault={() => handleSetDefault(ds.id, !ds.isDefault)}
270
271
  onDelete={() => setDeleteId(ds.id)}
271
272
  isWorkspaceDefault={workspaceDesignSystem?.id === ds.id}
272
273
  canSetWorkspaceDefault={canManageWorkspaceDefaults}