@agent-native/core 0.82.0 → 0.84.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 (474) hide show
  1. package/README.md +2 -2
  2. package/corpus/README.md +1 -1
  3. package/corpus/core/CHANGELOG.md +34 -0
  4. package/corpus/core/README.md +2 -2
  5. package/corpus/core/docs/content/cloneable-saas.mdx +2 -2
  6. package/corpus/core/docs/content/faq.mdx +1 -1
  7. package/corpus/core/docs/content/locales/ar-SA/cloneable-saas.mdx +2 -2
  8. package/corpus/core/docs/content/locales/ar-SA/faq.mdx +1 -1
  9. package/corpus/core/docs/content/locales/ar-SA/template-chat.mdx +1 -1
  10. package/corpus/core/docs/content/locales/de-DE/cloneable-saas.mdx +2 -2
  11. package/corpus/core/docs/content/locales/de-DE/faq.mdx +1 -1
  12. package/corpus/core/docs/content/locales/de-DE/template-chat.mdx +1 -1
  13. package/corpus/core/docs/content/locales/es-ES/cloneable-saas.mdx +2 -2
  14. package/corpus/core/docs/content/locales/es-ES/faq.mdx +1 -1
  15. package/corpus/core/docs/content/locales/es-ES/template-chat.mdx +1 -1
  16. package/corpus/core/docs/content/locales/fr-FR/cloneable-saas.mdx +2 -2
  17. package/corpus/core/docs/content/locales/fr-FR/faq.mdx +1 -1
  18. package/corpus/core/docs/content/locales/fr-FR/template-chat.mdx +1 -1
  19. package/corpus/core/docs/content/locales/hi-IN/cloneable-saas.mdx +2 -2
  20. package/corpus/core/docs/content/locales/hi-IN/faq.mdx +1 -1
  21. package/corpus/core/docs/content/locales/hi-IN/template-chat.mdx +1 -1
  22. package/corpus/core/docs/content/locales/ja-JP/cloneable-saas.mdx +2 -2
  23. package/corpus/core/docs/content/locales/ja-JP/faq.mdx +1 -1
  24. package/corpus/core/docs/content/locales/ja-JP/template-chat.mdx +1 -1
  25. package/corpus/core/docs/content/locales/ko-KR/cloneable-saas.mdx +2 -2
  26. package/corpus/core/docs/content/locales/ko-KR/faq.mdx +1 -1
  27. package/corpus/core/docs/content/locales/ko-KR/template-chat.mdx +1 -1
  28. package/corpus/core/docs/content/locales/pt-BR/cloneable-saas.mdx +2 -2
  29. package/corpus/core/docs/content/locales/pt-BR/faq.mdx +1 -1
  30. package/corpus/core/docs/content/locales/pt-BR/template-chat.mdx +1 -1
  31. package/corpus/core/docs/content/locales/zh-CN/cloneable-saas.mdx +2 -2
  32. package/corpus/core/docs/content/locales/zh-CN/faq.mdx +1 -1
  33. package/corpus/core/docs/content/locales/zh-CN/template-chat.mdx +1 -1
  34. package/corpus/core/docs/content/locales/zh-TW/cloneable-saas.mdx +2 -2
  35. package/corpus/core/docs/content/locales/zh-TW/faq.mdx +1 -1
  36. package/corpus/core/docs/content/locales/zh-TW/template-chat.mdx +1 -1
  37. package/corpus/core/docs/content/template-chat.mdx +1 -1
  38. package/corpus/core/package.json +1 -1
  39. package/corpus/core/src/agent/engine/builtin.ts +1 -1
  40. package/corpus/core/src/agent/engine/output-tokens.ts +1 -1
  41. package/corpus/core/src/agent/harness/acp-adapter.ts +28 -4
  42. package/corpus/core/src/agent/harness/ai-sdk-adapter.ts +3 -0
  43. package/corpus/core/src/agent/harness/translate.ts +3 -0
  44. package/corpus/core/src/agent/harness/types.ts +1 -0
  45. package/corpus/core/src/agent/model-config.ts +34 -13
  46. package/corpus/core/src/agent/production-agent.ts +87 -10
  47. package/corpus/core/src/agent/thread-data-builder.ts +29 -4
  48. package/corpus/core/src/agent/tool-call-journal.ts +109 -48
  49. package/corpus/core/src/agent/types.ts +6 -1
  50. package/corpus/core/src/cli/design-connect.ts +106 -0
  51. package/corpus/core/src/cli/gateway-helpers.ts +17 -0
  52. package/corpus/core/src/cli/recap.ts +0 -2
  53. package/corpus/core/src/cli/skills.ts +54 -16
  54. package/corpus/core/src/cli/workspace-dev.ts +29 -5
  55. package/corpus/core/src/client/AssistantChat.tsx +89 -42
  56. package/corpus/core/src/client/CommandMenu.tsx +34 -12
  57. package/corpus/core/src/client/DefaultSpinner.tsx +8 -1
  58. package/corpus/core/src/client/chat/message-components.tsx +49 -1
  59. package/corpus/core/src/client/chat/repo-helpers.ts +71 -0
  60. package/corpus/core/src/client/chat/run-recovery.tsx +15 -5
  61. package/corpus/core/src/client/components/ApiKeySettings.tsx +8 -8
  62. package/corpus/core/src/client/components/CodeRequiredDialog.tsx +26 -15
  63. package/corpus/core/src/client/components/MissingKeyCard.tsx +13 -6
  64. package/corpus/core/src/client/composer/TiptapComposer.tsx +4 -3
  65. package/corpus/core/src/client/extensions/ExtensionsSidebarSection.tsx +0 -1
  66. package/corpus/core/src/client/guided-questions.tsx +21 -27
  67. package/corpus/core/src/client/integrations/IntegrationCard.tsx +1 -1
  68. package/corpus/core/src/client/integrations/IntegrationsPanel.tsx +1 -1
  69. package/corpus/core/src/client/onboarding/OnboardingBanner.tsx +2 -2
  70. package/corpus/core/src/client/onboarding/OnboardingPanel.tsx +23 -19
  71. package/corpus/core/src/client/resources/ResourceEditor.tsx +18 -10
  72. package/corpus/core/src/client/resources/ResourcesPanel.tsx +5 -1
  73. package/corpus/core/src/client/settings/SettingsPanel.tsx +8 -3
  74. package/corpus/core/src/client/settings/useBuilderStatus.ts +8 -41
  75. package/corpus/core/src/client/useProductionAgent.ts +6 -2
  76. package/corpus/core/src/deploy/build.ts +1 -1
  77. package/corpus/core/src/observability/traces.ts +3 -3
  78. package/corpus/core/src/onboarding/default-steps.ts +1 -1
  79. package/corpus/core/src/scripts/agent-engines/manage-agent-engine.ts +1 -1
  80. package/corpus/core/src/scripts/agent-engines/set-agent-engine.ts +1 -1
  81. package/corpus/core/src/server/agent-chat-plugin.ts +177 -81
  82. package/corpus/core/src/server/core-routes-plugin.ts +7 -1
  83. package/corpus/core/src/server/open-route.ts +59 -40
  84. package/corpus/core/src/shared/reasoning-effort.ts +2 -0
  85. package/corpus/core/src/sharing/access.ts +22 -2
  86. package/corpus/core/src/sharing/registry.ts +18 -0
  87. package/corpus/core/src/styles/agent-native.css +104 -20
  88. package/corpus/core/src/styles/rich-markdown-editor.css +11 -10
  89. package/corpus/templates/analytics/actions/hubspot-deals.ts +64 -4
  90. package/corpus/templates/analytics/app/components/dashboard/CumulativeNetChart.tsx +10 -10
  91. package/corpus/templates/analytics/app/components/dashboard/RevenueChart.tsx +10 -10
  92. package/corpus/templates/analytics/app/components/dashboard/RevenueComparisonChart.tsx +6 -5
  93. package/corpus/templates/analytics/app/components/dashboard/TimeSeriesChart.tsx +9 -9
  94. package/corpus/templates/analytics/app/global.css +4 -0
  95. package/corpus/templates/analytics/app/lib/chart-theme.ts +13 -0
  96. package/corpus/templates/analytics/app/pages/adhoc/_shared/KpiChart.tsx +22 -24
  97. package/corpus/templates/analytics/changelog/2026-06-30-dashboard-charts-now-use-theme-aware-tooltip-and-grid-colors.md +6 -0
  98. package/corpus/templates/analytics/changelog/2026-06-30-fixed-ask-composer-spacing-so-the-chat-field-has-a-comfortab.md +6 -0
  99. package/corpus/templates/calendar/AGENTS.md +4 -0
  100. package/corpus/templates/calendar/actions/connect-google-calendar.ts +80 -0
  101. package/corpus/templates/calendar/changelog/2026-06-30-calendar-now-gives-the-agent-a-safe-google-connection-link-i.md +6 -0
  102. package/corpus/templates/calendar/server/plugins/agent-chat.ts +4 -0
  103. package/corpus/templates/content/.env.local.example +6 -0
  104. package/corpus/templates/content/AGENTS.md +10 -1
  105. package/corpus/templates/content/actions/_builder-cms-read-client.ts +14 -1
  106. package/corpus/templates/content/actions/_builder-cms-source-adapter.ts +43 -0
  107. package/corpus/templates/content/actions/_builder-cms-write-adapter.ts +79 -7
  108. package/corpus/templates/content/actions/_database-source-utils.ts +987 -22
  109. package/corpus/templates/content/actions/_database-utils.ts +41 -0
  110. package/corpus/templates/content/actions/_local-file-documents.ts +74 -1
  111. package/corpus/templates/content/actions/attach-content-database-source.ts +33 -8
  112. package/corpus/templates/content/actions/change-content-database-source-role.ts +14 -0
  113. package/corpus/templates/content/actions/disconnect-content-database-source.ts +3 -0
  114. package/corpus/templates/content/actions/execute-builder-source-execution.ts +71 -3
  115. package/corpus/templates/content/actions/list-content-databases.ts +41 -33
  116. package/corpus/templates/content/actions/process-builder-body-hydration.ts +47 -0
  117. package/corpus/templates/content/actions/update-document.ts +93 -0
  118. package/corpus/templates/content/app/blocks/SourceComponentBlock.tsx +277 -0
  119. package/corpus/templates/content/app/blocks/contentBlockRegistry.tsx +2 -0
  120. package/corpus/templates/content/app/components/editor/BubbleToolbar.tsx +5 -5
  121. package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +45 -4
  122. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +5 -1
  123. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +92 -0
  124. package/corpus/templates/content/app/components/editor/database-sources/BuilderSourceReviewDialog.tsx +5 -3
  125. package/corpus/templates/content/app/components/editor/extensions/registryBlocks.ts +41 -0
  126. package/corpus/templates/content/app/components/editor/registrySlashItems.ts +4 -0
  127. package/corpus/templates/content/app/global.css +16 -8
  128. package/corpus/templates/content/app/hooks/use-content-database.ts +24 -0
  129. package/corpus/templates/content/app/i18n/zh-TW.ts +24 -0
  130. package/corpus/templates/content/app/i18n-data.ts +212 -0
  131. package/corpus/templates/content/app/lib/content-command-search.ts +64 -0
  132. package/corpus/templates/content/app/root.tsx +236 -8
  133. package/corpus/templates/content/changelog/2026-06-29-builder-cms-sources-now-sync-article-bodies-through-content.md +6 -0
  134. package/corpus/templates/content/changelog/2026-06-30-builder-article-media-now-render-as-images-and-embeds-when-r.md +6 -0
  135. package/corpus/templates/content/changelog/2026-06-30-builder-source-components-now-render-as-preserved-preview-bl.md +6 -0
  136. package/corpus/templates/content/changelog/2026-06-30-cmd-k-search-now-opens-from-the-editor-and-finds-real-content.md +6 -0
  137. package/corpus/templates/content/changelog/2026-06-30-editor-floating-toolbars-now-use-theme-aware-colors-in-light.md +6 -0
  138. package/corpus/templates/content/package.json +3 -1
  139. package/corpus/templates/content/scripts/check-native-deps.mjs +57 -0
  140. package/corpus/templates/content/scripts/dev-database.mjs +83 -0
  141. package/corpus/templates/content/scripts/seed-demo-user.mjs +107 -0
  142. package/corpus/templates/content/server/db/schema.ts +27 -0
  143. package/corpus/templates/content/server/plugins/db.ts +33 -0
  144. package/corpus/templates/content/shared/api.ts +45 -0
  145. package/corpus/templates/content/shared/builder-mdx.ts +905 -5
  146. package/corpus/templates/content/shared/nfm-registry.ts +2 -0
  147. package/corpus/templates/content/shared/source-component-block.ts +141 -0
  148. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +6 -1
  149. package/corpus/templates/design/actions/add-localhost-screens.ts +63 -8
  150. package/corpus/templates/design/actions/apply-motion-edit.ts +12 -46
  151. package/corpus/templates/design/actions/list-design-native-assets.ts +2 -1
  152. package/corpus/templates/design/actions/migrate-board-objects-to-file.ts +49 -1
  153. package/corpus/templates/design/actions/navigate.ts +3 -12
  154. package/corpus/templates/design/actions/open-visual-edit.ts +341 -0
  155. package/corpus/templates/design/actions/view-screen.ts +1 -1
  156. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +1 -1
  157. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +350 -15
  158. package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +71 -91
  159. package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +25 -27
  160. package/corpus/templates/design/app/components/design/DeviceFrame.tsx +1 -1
  161. package/corpus/templates/design/app/components/design/DrawOverlay.tsx +2 -2
  162. package/corpus/templates/design/app/components/design/EditPanel.tsx +1111 -570
  163. package/corpus/templates/design/app/components/design/LayersPanel.tsx +162 -32
  164. package/corpus/templates/design/app/components/design/MotionDock.tsx +268 -240
  165. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +1193 -207
  166. package/corpus/templates/design/app/components/design/QuestionFlow.tsx +1 -1
  167. package/corpus/templates/design/app/components/design/ReviewPanel.tsx +81 -102
  168. package/corpus/templates/design/app/components/design/StatesPanel.tsx +6 -6
  169. package/corpus/templates/design/app/components/design/TokensPanel.tsx +11 -11
  170. package/corpus/templates/design/app/components/design/TweaksPanel.tsx +9 -7
  171. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +1225 -154
  172. package/corpus/templates/design/app/components/design/bridge/hit-test.bridge.ts +130 -37
  173. package/corpus/templates/design/app/components/design/canvas-primitive-style.ts +24 -11
  174. package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +184 -162
  175. package/corpus/templates/design/app/components/design/inspector/ConstraintsWidget.tsx +137 -79
  176. package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +13 -13
  177. package/corpus/templates/design/app/components/design/inspector/ExportSettingsPanel.tsx +8 -8
  178. package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +2 -2
  179. package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +4 -4
  180. package/corpus/templates/design/app/components/design/inspector/InspectorAiActions.tsx +3 -3
  181. package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +13 -7
  182. package/corpus/templates/design/app/components/design/inspector/ShaderControls.tsx +14 -11
  183. package/corpus/templates/design/app/components/design/inspector/ShaderFillsPanel.tsx +4 -4
  184. package/corpus/templates/design/app/components/design/inspector/index.ts +2 -0
  185. package/corpus/templates/design/app/components/design/types.ts +19 -0
  186. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +61 -78
  187. package/corpus/templates/design/app/components/layout/Header.tsx +0 -1
  188. package/corpus/templates/design/app/components/layout/Layout.tsx +3 -2
  189. package/corpus/templates/design/app/components/layout/Sidebar.tsx +0 -2
  190. package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +5 -4
  191. package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +1 -1
  192. package/corpus/templates/design/app/components/visual-editor/SaveStatusIndicator.tsx +2 -2
  193. package/corpus/templates/design/app/global.css +56 -0
  194. package/corpus/templates/design/app/hooks/use-agent-generating.ts +4 -5
  195. package/corpus/templates/design/app/hooks/use-navigation-state.ts +6 -7
  196. package/corpus/templates/design/app/hooks/use-question-flow.ts +3 -2
  197. package/corpus/templates/design/app/hooks/useAgentEditRequest.ts +6 -4
  198. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +6 -3
  199. package/corpus/templates/design/app/i18n/zh-TW.ts +5 -14
  200. package/corpus/templates/design/app/i18n-data.ts +63 -188
  201. package/corpus/templates/design/app/lib/agent-chat.ts +13 -0
  202. package/corpus/templates/design/app/pages/DesignEditor.tsx +1755 -401
  203. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +9 -5
  204. package/corpus/templates/design/app/pages/DesignSystems.tsx +2 -2
  205. package/corpus/templates/design/app/pages/Index.tsx +49 -26
  206. package/corpus/templates/design/app/pages/NotFound.tsx +25 -8
  207. package/corpus/templates/design/app/pages/VisualEdit.tsx +17 -5
  208. package/corpus/templates/design/app/routes/examples.tsx +1 -7
  209. package/corpus/templates/design/app/routes/templates.tsx +7 -4
  210. package/corpus/templates/design/changelog/2026-06-30-board-shapes-and-auto-layout-controls-are-clearer.md +6 -0
  211. package/corpus/templates/design/changelog/2026-06-30-canvas-editing-now-keeps-undo-redo-and-cross-screen-layer-mo.md +6 -0
  212. package/corpus/templates/design/changelog/2026-06-30-component-selections-now-use-purple-component-chrome-and-sho.md +6 -0
  213. package/corpus/templates/design/changelog/2026-06-30-constraints-now-stay-tucked-into-a-compact-inspector-preview.md +6 -0
  214. package/corpus/templates/design/changelog/2026-06-30-creating-a-component-now-opens-in-a-compact-inspector-popove.md +6 -0
  215. package/corpus/templates/design/changelog/2026-06-30-design-cards-no-longer-show-legacy-project-type-badges.md +6 -0
  216. package/corpus/templates/design/changelog/2026-06-30-design-chat-now-keeps-new-turns-in-the-visible-design-agent-.md +6 -0
  217. package/corpus/templates/design/changelog/2026-06-30-design-editor-panels-now-keep-their-compact-text-sizing-cons.md +6 -0
  218. package/corpus/templates/design/changelog/2026-06-30-design-no-longer-shows-the-connected-local-code-warning-bann.md +6 -0
  219. package/corpus/templates/design/changelog/2026-06-30-design-now-opens-to-the-files-panel-unless-a-generation-is-a.md +6 -0
  220. package/corpus/templates/design/changelog/2026-06-30-design-opens-with-a-cleaner-empty-canvas-and-loading-preview.md +6 -0
  221. package/corpus/templates/design/changelog/2026-06-30-design-tools-use-simpler-less-decorative-icons.md +6 -0
  222. package/corpus/templates/design/changelog/2026-06-30-dragging-absolute-elements-no-longer-shows-coordinate-labels.md +6 -0
  223. package/corpus/templates/design/changelog/2026-06-30-fixed-all-screens-opening-too-zoomed-in-by-default.md +6 -0
  224. package/corpus/templates/design/changelog/2026-06-30-fixed-the-public-design-assets-sidebar-so-native-components-.md +6 -0
  225. package/corpus/templates/design/changelog/2026-06-30-fixed-the-screen-overview-board-so-empty-board-space-no-long.md +6 -0
  226. package/corpus/templates/design/changelog/2026-06-30-full-view-screens-can-now-scroll-while-remaining-editable.md +6 -0
  227. package/corpus/templates/design/changelog/2026-06-30-inspector-element-headers-show-the-selected-html-tag-and-the.md +6 -0
  228. package/corpus/templates/design/changelog/2026-06-30-inspector-inputs-stay-compact-across-desktop-breakpoints.md +6 -0
  229. package/corpus/templates/design/changelog/2026-06-30-layers-can-be-multi-selected-from-the-canvas-and-edited-toge.md +6 -0
  230. package/corpus/templates/design/changelog/2026-06-30-local-visual-edit-links-can-edit-localhost-frames-without-si.md +6 -0
  231. package/corpus/templates/design/changelog/2026-06-30-localhost-visual-edit-frames-can-now-be-selected-and-edited.md +6 -0
  232. package/corpus/templates/design/changelog/2026-06-30-marquee-selection-now-works-inside-screens-multi-selected-la.md +6 -0
  233. package/corpus/templates/design/changelog/2026-06-30-motion-is-now-available-from-the-persistent-left-rail-and-th.md +6 -0
  234. package/corpus/templates/design/changelog/2026-06-30-motion-timeline-collapse-and-reopen-animations-feel-smoother.md +6 -0
  235. package/corpus/templates/design/changelog/2026-06-30-multi-select-outlines-now-stay-consistent-across-all-screens.md +6 -0
  236. package/corpus/templates/design/changelog/2026-06-30-new-board-shapes-now-start-with-neutral-gray-styling.md +6 -0
  237. package/corpus/templates/design/changelog/2026-06-30-new-designs-open-into-a-steadier-loading-state-before-the-ed.md +6 -0
  238. package/corpus/templates/design/changelog/2026-06-30-new-designs-show-a-loading-state-during-handoff-and-keep-edi.md +6 -0
  239. package/corpus/templates/design/changelog/2026-06-30-public-visual-edit-design-links-now-open-directly-instead-of.md +6 -0
  240. package/corpus/templates/design/changelog/2026-06-30-removed-the-confusing-states-section-from-the-design-editor-.md +6 -0
  241. package/corpus/templates/design/changelog/2026-06-30-removed-the-templates-gallery-from-design-navigation.md +6 -0
  242. package/corpus/templates/design/changelog/2026-06-30-share-stays-visible-as-soon-as-editable-designs-load.md +6 -0
  243. package/corpus/templates/design/changelog/2026-06-30-signed-out-save-and-share-controls-use-simpler-labels-and-op.md +6 -0
  244. package/corpus/templates/design/changelog/2026-06-30-text-added-on-the-canvas-now-focuses-cleanly-with-the-right-.md +6 -0
  245. package/corpus/templates/design/changelog/2026-06-30-the-design-editor-loading-skeleton-is-simpler-and-its-bottom.md +6 -0
  246. package/corpus/templates/design/changelog/2026-06-30-the-design-editor-loading-skeleton-now-follows-the-current-t.md +6 -0
  247. package/corpus/templates/design/changelog/2026-06-30-the-design-inspector-no-longer-shows-child-layout-controls-o.md +6 -0
  248. package/corpus/templates/design/changelog/2026-06-30-the-design-inspector-no-longer-shows-the-ask-ai-section-abov.md +6 -0
  249. package/corpus/templates/design/changelog/2026-06-30-the-design-review-panel-no-longer-shows-a-separate-inline-au.md +6 -0
  250. package/corpus/templates/design/changelog/2026-06-30-the-empty-designs-page-now-focuses-on-a-single-primary-new-d.md +6 -0
  251. package/corpus/templates/design/changelog/2026-06-30-the-layers-panel-header-stays-as-layers-while-multiple-items.md +6 -0
  252. package/corpus/templates/design/changelog/2026-06-30-the-missing-design-screen-now-uses-a-neutral-back-button.md +6 -0
  253. package/corpus/templates/design/changelog/2026-06-30-the-motion-timeline-now-closes-without-squeezing-the-canvas-.md +6 -0
  254. package/corpus/templates/design/changelog/2026-06-30-the-new-design-connect-ai-setup-now-lines-up-with-the-compos.md +6 -0
  255. package/corpus/templates/design/changelog/2026-06-30-the-screen-overview-board-now-blends-into-the-canvas-and-new.md +6 -0
  256. package/corpus/templates/design/changelog/2026-06-30-top-level-canvas-drops-now-show-screen-guides.md +6 -0
  257. package/corpus/templates/design/changelog/2026-06-30-top-level-canvas-layers-now-keep-a-transparent-backdrop-and-.md +6 -0
  258. package/corpus/templates/design/changelog/2026-06-30-top-level-canvas-layers-now-select-reliably-from-all-screens.md +6 -0
  259. package/corpus/templates/design/changelog/2026-06-30-visual-edit-can-open-and-refresh-localhost-screens-in-one-au.md +6 -0
  260. package/corpus/templates/design/e2e/helpers.ts +15 -4
  261. package/corpus/templates/design/server/db/index.ts +52 -0
  262. package/corpus/templates/design/server/plugins/agent-chat.ts +5 -0
  263. package/corpus/templates/design/server/plugins/auth.ts +1 -0
  264. package/corpus/templates/design/server/plugins/core-routes.ts +4 -0
  265. package/corpus/templates/design/shared/board-file.ts +380 -5
  266. package/corpus/templates/design/shared/board-objects.ts +2 -2
  267. package/corpus/templates/design/shared/code-layer.ts +50 -6
  268. package/corpus/templates/design/shared/motion-compiler.ts +27 -0
  269. package/corpus/templates/macros/app/components/DailyProgress.tsx +41 -37
  270. package/corpus/templates/macros/app/components/ExerciseCard.tsx +2 -2
  271. package/corpus/templates/macros/app/components/MealCard.tsx +2 -2
  272. package/corpus/templates/macros/app/components/VoiceDictation.tsx +1 -1
  273. package/corpus/templates/macros/app/components/WeeklyCaloriesChart.tsx +1 -1
  274. package/corpus/templates/macros/app/components/WeightCard.tsx +2 -2
  275. package/corpus/templates/macros/app/components/WeightTracker.tsx +1 -1
  276. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +1 -1
  277. package/corpus/templates/macros/app/routes/_index.tsx +5 -5
  278. package/corpus/templates/macros/app/routes/analytics.tsx +1 -1
  279. package/corpus/templates/macros/changelog/2026-06-30-dashboard-loading-and-chart-surfaces-now-use-theme-aware-col.md +6 -0
  280. package/corpus/templates/mail/app/components/email/ComposeBubbleToolbar.tsx +14 -11
  281. package/corpus/templates/mail/app/global.css +3 -2
  282. package/corpus/templates/mail/changelog/2026-06-30-compose-floating-toolbars-now-use-theme-aware-colors-in-ligh.md +6 -0
  283. package/corpus/templates/plan/app/pages/PlansPage.tsx +2 -2
  284. package/corpus/templates/slides/app/components/deck/DeckCard.tsx +3 -3
  285. package/corpus/templates/slides/app/global.css +10 -0
  286. package/corpus/templates/slides/app/pages/Index.tsx +55 -51
  287. package/corpus/templates/slides/changelog/2026-06-30-deck-thumbnails-collapse-cleanly-to-one-column-when-the-chat.md +6 -0
  288. package/dist/agent/engine/anthropic-engine.d.ts +2 -2
  289. package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
  290. package/dist/agent/engine/builder-engine.d.ts +2 -2
  291. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  292. package/dist/agent/engine/builtin.js +1 -1
  293. package/dist/agent/engine/builtin.js.map +1 -1
  294. package/dist/agent/engine/output-tokens.js +1 -1
  295. package/dist/agent/engine/output-tokens.js.map +1 -1
  296. package/dist/agent/harness/acp-adapter.d.ts +4 -1
  297. package/dist/agent/harness/acp-adapter.d.ts.map +1 -1
  298. package/dist/agent/harness/acp-adapter.js +19 -2
  299. package/dist/agent/harness/acp-adapter.js.map +1 -1
  300. package/dist/agent/harness/ai-sdk-adapter.d.ts.map +1 -1
  301. package/dist/agent/harness/ai-sdk-adapter.js +3 -0
  302. package/dist/agent/harness/ai-sdk-adapter.js.map +1 -1
  303. package/dist/agent/harness/translate.d.ts.map +1 -1
  304. package/dist/agent/harness/translate.js +3 -0
  305. package/dist/agent/harness/translate.js.map +1 -1
  306. package/dist/agent/harness/types.d.ts +1 -0
  307. package/dist/agent/harness/types.d.ts.map +1 -1
  308. package/dist/agent/harness/types.js.map +1 -1
  309. package/dist/agent/model-config.d.ts +21 -20
  310. package/dist/agent/model-config.d.ts.map +1 -1
  311. package/dist/agent/model-config.js +31 -13
  312. package/dist/agent/model-config.js.map +1 -1
  313. package/dist/agent/production-agent.d.ts.map +1 -1
  314. package/dist/agent/production-agent.js +85 -10
  315. package/dist/agent/production-agent.js.map +1 -1
  316. package/dist/agent/thread-data-builder.d.ts.map +1 -1
  317. package/dist/agent/thread-data-builder.js +27 -6
  318. package/dist/agent/thread-data-builder.js.map +1 -1
  319. package/dist/agent/tool-call-journal.d.ts +11 -9
  320. package/dist/agent/tool-call-journal.d.ts.map +1 -1
  321. package/dist/agent/tool-call-journal.js +92 -40
  322. package/dist/agent/tool-call-journal.js.map +1 -1
  323. package/dist/agent/types.d.ts +5 -1
  324. package/dist/agent/types.d.ts.map +1 -1
  325. package/dist/agent/types.js.map +1 -1
  326. package/dist/cli/design-connect.d.ts.map +1 -1
  327. package/dist/cli/design-connect.js +84 -0
  328. package/dist/cli/design-connect.js.map +1 -1
  329. package/dist/cli/gateway-helpers.d.ts +4 -0
  330. package/dist/cli/gateway-helpers.d.ts.map +1 -1
  331. package/dist/cli/gateway-helpers.js +9 -0
  332. package/dist/cli/gateway-helpers.js.map +1 -1
  333. package/dist/cli/recap.d.ts.map +1 -1
  334. package/dist/cli/recap.js +0 -2
  335. package/dist/cli/recap.js.map +1 -1
  336. package/dist/cli/skills.d.ts.map +1 -1
  337. package/dist/cli/skills.js +54 -16
  338. package/dist/cli/skills.js.map +1 -1
  339. package/dist/cli/workspace-dev.d.ts.map +1 -1
  340. package/dist/cli/workspace-dev.js +33 -6
  341. package/dist/cli/workspace-dev.js.map +1 -1
  342. package/dist/client/AssistantChat.d.ts.map +1 -1
  343. package/dist/client/AssistantChat.js +72 -26
  344. package/dist/client/AssistantChat.js.map +1 -1
  345. package/dist/client/CommandMenu.d.ts +6 -2
  346. package/dist/client/CommandMenu.d.ts.map +1 -1
  347. package/dist/client/CommandMenu.js +25 -14
  348. package/dist/client/CommandMenu.js.map +1 -1
  349. package/dist/client/DefaultSpinner.d.ts.map +1 -1
  350. package/dist/client/DefaultSpinner.js +8 -1
  351. package/dist/client/DefaultSpinner.js.map +1 -1
  352. package/dist/client/chat/message-components.d.ts +7 -1
  353. package/dist/client/chat/message-components.d.ts.map +1 -1
  354. package/dist/client/chat/message-components.js +37 -1
  355. package/dist/client/chat/message-components.js.map +1 -1
  356. package/dist/client/chat/repo-helpers.d.ts +1 -0
  357. package/dist/client/chat/repo-helpers.d.ts.map +1 -1
  358. package/dist/client/chat/repo-helpers.js +59 -0
  359. package/dist/client/chat/repo-helpers.js.map +1 -1
  360. package/dist/client/chat/run-recovery.d.ts.map +1 -1
  361. package/dist/client/chat/run-recovery.js +4 -4
  362. package/dist/client/chat/run-recovery.js.map +1 -1
  363. package/dist/client/components/ApiKeySettings.js +8 -8
  364. package/dist/client/components/ApiKeySettings.js.map +1 -1
  365. package/dist/client/components/CodeRequiredDialog.d.ts.map +1 -1
  366. package/dist/client/components/CodeRequiredDialog.js +24 -15
  367. package/dist/client/components/CodeRequiredDialog.js.map +1 -1
  368. package/dist/client/components/MissingKeyCard.d.ts.map +1 -1
  369. package/dist/client/components/MissingKeyCard.js +11 -6
  370. package/dist/client/components/MissingKeyCard.js.map +1 -1
  371. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  372. package/dist/client/composer/TiptapComposer.js +4 -3
  373. package/dist/client/composer/TiptapComposer.js.map +1 -1
  374. package/dist/client/extensions/ExtensionsSidebarSection.d.ts.map +1 -1
  375. package/dist/client/extensions/ExtensionsSidebarSection.js +1 -1
  376. package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
  377. package/dist/client/guided-questions.d.ts.map +1 -1
  378. package/dist/client/guided-questions.js +6 -6
  379. package/dist/client/guided-questions.js.map +1 -1
  380. package/dist/client/integrations/IntegrationCard.js +1 -1
  381. package/dist/client/integrations/IntegrationCard.js.map +1 -1
  382. package/dist/client/integrations/IntegrationsPanel.js +1 -1
  383. package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
  384. package/dist/client/onboarding/OnboardingBanner.js +2 -2
  385. package/dist/client/onboarding/OnboardingBanner.js.map +1 -1
  386. package/dist/client/onboarding/OnboardingPanel.js +23 -19
  387. package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
  388. package/dist/client/resources/ResourceEditor.d.ts.map +1 -1
  389. package/dist/client/resources/ResourceEditor.js +13 -10
  390. package/dist/client/resources/ResourceEditor.js.map +1 -1
  391. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  392. package/dist/client/resources/ResourcesPanel.js +2 -1
  393. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  394. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  395. package/dist/client/settings/SettingsPanel.js +8 -3
  396. package/dist/client/settings/SettingsPanel.js.map +1 -1
  397. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  398. package/dist/client/settings/useBuilderStatus.js +6 -38
  399. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  400. package/dist/client/useProductionAgent.d.ts +2 -1
  401. package/dist/client/useProductionAgent.d.ts.map +1 -1
  402. package/dist/client/useProductionAgent.js.map +1 -1
  403. package/dist/deploy/build.js +1 -1
  404. package/dist/deploy/build.js.map +1 -1
  405. package/dist/notifications/routes.d.ts +3 -3
  406. package/dist/observability/routes.d.ts +3 -3
  407. package/dist/observability/traces.d.ts.map +1 -1
  408. package/dist/observability/traces.js.map +1 -1
  409. package/dist/onboarding/default-steps.js +1 -1
  410. package/dist/onboarding/default-steps.js.map +1 -1
  411. package/dist/scripts/agent-engines/manage-agent-engine.js +1 -1
  412. package/dist/scripts/agent-engines/manage-agent-engine.js.map +1 -1
  413. package/dist/scripts/agent-engines/set-agent-engine.js +1 -1
  414. package/dist/scripts/agent-engines/set-agent-engine.js.map +1 -1
  415. package/dist/server/agent-chat-plugin.d.ts +3 -0
  416. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  417. package/dist/server/agent-chat-plugin.js +134 -72
  418. package/dist/server/agent-chat-plugin.js.map +1 -1
  419. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  420. package/dist/server/core-routes-plugin.d.ts +3 -0
  421. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  422. package/dist/server/core-routes-plugin.js +4 -1
  423. package/dist/server/core-routes-plugin.js.map +1 -1
  424. package/dist/server/open-route.d.ts +9 -0
  425. package/dist/server/open-route.d.ts.map +1 -1
  426. package/dist/server/open-route.js +48 -38
  427. package/dist/server/open-route.js.map +1 -1
  428. package/dist/shared/reasoning-effort.js +3 -0
  429. package/dist/shared/reasoning-effort.js.map +1 -1
  430. package/dist/sharing/access.d.ts.map +1 -1
  431. package/dist/sharing/access.js +18 -2
  432. package/dist/sharing/access.js.map +1 -1
  433. package/dist/sharing/registry.d.ts +10 -0
  434. package/dist/sharing/registry.d.ts.map +1 -1
  435. package/dist/sharing/registry.js.map +1 -1
  436. package/dist/styles/agent-native.css +104 -20
  437. package/dist/styles/rich-markdown-editor.css +11 -10
  438. package/docs/content/cloneable-saas.mdx +2 -2
  439. package/docs/content/faq.mdx +1 -1
  440. package/docs/content/locales/ar-SA/cloneable-saas.mdx +2 -2
  441. package/docs/content/locales/ar-SA/faq.mdx +1 -1
  442. package/docs/content/locales/ar-SA/template-chat.mdx +1 -1
  443. package/docs/content/locales/de-DE/cloneable-saas.mdx +2 -2
  444. package/docs/content/locales/de-DE/faq.mdx +1 -1
  445. package/docs/content/locales/de-DE/template-chat.mdx +1 -1
  446. package/docs/content/locales/es-ES/cloneable-saas.mdx +2 -2
  447. package/docs/content/locales/es-ES/faq.mdx +1 -1
  448. package/docs/content/locales/es-ES/template-chat.mdx +1 -1
  449. package/docs/content/locales/fr-FR/cloneable-saas.mdx +2 -2
  450. package/docs/content/locales/fr-FR/faq.mdx +1 -1
  451. package/docs/content/locales/fr-FR/template-chat.mdx +1 -1
  452. package/docs/content/locales/hi-IN/cloneable-saas.mdx +2 -2
  453. package/docs/content/locales/hi-IN/faq.mdx +1 -1
  454. package/docs/content/locales/hi-IN/template-chat.mdx +1 -1
  455. package/docs/content/locales/ja-JP/cloneable-saas.mdx +2 -2
  456. package/docs/content/locales/ja-JP/faq.mdx +1 -1
  457. package/docs/content/locales/ja-JP/template-chat.mdx +1 -1
  458. package/docs/content/locales/ko-KR/cloneable-saas.mdx +2 -2
  459. package/docs/content/locales/ko-KR/faq.mdx +1 -1
  460. package/docs/content/locales/ko-KR/template-chat.mdx +1 -1
  461. package/docs/content/locales/pt-BR/cloneable-saas.mdx +2 -2
  462. package/docs/content/locales/pt-BR/faq.mdx +1 -1
  463. package/docs/content/locales/pt-BR/template-chat.mdx +1 -1
  464. package/docs/content/locales/zh-CN/cloneable-saas.mdx +2 -2
  465. package/docs/content/locales/zh-CN/faq.mdx +1 -1
  466. package/docs/content/locales/zh-CN/template-chat.mdx +1 -1
  467. package/docs/content/locales/zh-TW/cloneable-saas.mdx +2 -2
  468. package/docs/content/locales/zh-TW/faq.mdx +1 -1
  469. package/docs/content/locales/zh-TW/template-chat.mdx +1 -1
  470. package/docs/content/template-chat.mdx +1 -1
  471. package/package.json +1 -1
  472. package/corpus/templates/design/app/components/design/LocalSourceEditBanner.tsx +0 -157
  473. package/corpus/templates/design/app/lib/design-templates.ts +0 -1305
  474. package/corpus/templates/design/app/pages/Templates.tsx +0 -279
@@ -233,6 +233,23 @@ export interface ResolvedAccess {
233
233
  resource: any;
234
234
  }
235
235
 
236
+ async function publicAccessRoleForResource(
237
+ reg: ShareableResourceRegistration,
238
+ resource: any,
239
+ ctx: AccessContext,
240
+ ): Promise<ShareRole> {
241
+ const roleResolver = reg.publicAccessRole;
242
+ if (!roleResolver) return "viewer";
243
+ return typeof roleResolver === "function"
244
+ ? await roleResolver(resource, ctx)
245
+ : roleResolver;
246
+ }
247
+
248
+ function higherShareRole(a: ShareRole, b: ShareRole | null): ShareRole {
249
+ if (!b) return a;
250
+ return ROLE_RANK[b] > ROLE_RANK[a] ? b : a;
251
+ }
252
+
236
253
  /**
237
254
  * Return the effective role the current user has on a specific resource, or
238
255
  * null if they have no access. Loads the resource and relevant share rows.
@@ -263,9 +280,12 @@ export async function resolveAccess(
263
280
  return { role: "owner", resource };
264
281
  }
265
282
  if (resource.visibility === "public" && reg.allowPublic !== false) {
266
- // No share row needed; default viewer unless upgraded below.
283
+ // No share row needed; default viewer unless the resource registration
284
+ // deliberately grants a stronger public-by-link role or explicit shares
285
+ // upgrade the current principal.
286
+ const publicRole = await publicAccessRoleForResource(reg, resource, ctx);
267
287
  const role = await highestShareRole(reg, resourceId, ctx, resource);
268
- return { role: role ?? "viewer", resource };
288
+ return { role: higherShareRole(publicRole, role), resource };
269
289
  }
270
290
  // `visibility === "public"` on an `allowPublic: false` resource is treated
271
291
  // as private: only owner + explicit shares grant access. Falls through to
@@ -56,6 +56,24 @@ export interface ShareableResourceRegistration {
56
56
  * Default: `true` (matches the historical behavior — most resources can be public).
57
57
  */
58
58
  allowPublic?: boolean;
59
+ /**
60
+ * Optional role granted by a public-by-link read. Most resources should omit
61
+ * this so public visibility remains viewer-only. Use narrowly for local or
62
+ * otherwise constrained resources where the resource owner intentionally wants
63
+ * unauthenticated link holders to do more than view.
64
+ */
65
+ publicAccessRole?:
66
+ | "viewer"
67
+ | "editor"
68
+ | "admin"
69
+ | ((
70
+ resource: any,
71
+ ctx: { userEmail?: string; orgId?: string },
72
+ ) =>
73
+ | "viewer"
74
+ | "editor"
75
+ | "admin"
76
+ | Promise<"viewer" | "editor" | "admin">);
59
77
  /**
60
78
  * When `true`, individual user shares (`principalType: "user"`) must target
61
79
  * an email that is already a member of the same org as the resource, OR has
@@ -167,17 +167,6 @@
167
167
  container: agent-native-main / inline-size;
168
168
  }
169
169
 
170
- .agent-layout-main-surface::before,
171
- .agent-sidebar-main-surface::before {
172
- content: "";
173
- position: absolute;
174
- inset: 0;
175
- z-index: 20;
176
- pointer-events: none;
177
- border-radius: inherit;
178
- box-shadow: var(--agent-native-raised-outline);
179
- }
180
-
181
170
  .agent-layout-shell
182
171
  :where(.agent-layout-main-surface, .agent-sidebar-main-surface)
183
172
  > :first-child
@@ -537,6 +526,57 @@
537
526
  }
538
527
  }
539
528
 
529
+ /* Guided questions size themselves from the rendered container, not viewport
530
+ breakpoints, so they stay readable in narrow chat sidebars. */
531
+ .guided-question-flow {
532
+ container-type: inline-size;
533
+ container-name: guided-question-flow;
534
+ }
535
+
536
+ .guided-question-flow-options {
537
+ grid-template-columns: minmax(0, 1fr);
538
+ }
539
+
540
+ @container guided-question-flow (min-width: 42rem) {
541
+ .guided-question-flow-inner {
542
+ padding: 2rem;
543
+ }
544
+
545
+ .guided-question-flow-header {
546
+ margin-bottom: 1.5rem;
547
+ }
548
+
549
+ .guided-question-flow-title {
550
+ font-size: 1.5rem;
551
+ line-height: 2rem;
552
+ }
553
+
554
+ .guided-question-flow-options {
555
+ grid-template-columns: repeat(2, minmax(0, 1fr));
556
+ }
557
+
558
+ .guided-question-flow-footer {
559
+ margin-top: 1.25rem;
560
+ padding-top: 1rem;
561
+ }
562
+ }
563
+
564
+ @container guided-question-flow (max-width: 24rem) {
565
+ .guided-question-flow-description {
566
+ font-size: 0.8125rem;
567
+ line-height: 1.25rem;
568
+ }
569
+
570
+ .guided-question-flow-footer {
571
+ align-items: stretch;
572
+ flex-direction: column;
573
+ }
574
+
575
+ .guided-question-flow-footer > :last-child {
576
+ justify-content: flex-end;
577
+ }
578
+ }
579
+
540
580
  /* Connect AI card: use the card width, not the viewport, so narrow embedded
541
581
  sidebars stack the copy and actions before the secondary button clips. */
542
582
  .agent-builder-setup-card {
@@ -548,6 +588,32 @@
548
588
  container-name: agent-builder-setup;
549
589
  }
550
590
 
591
+ .agent-builder-setup-card--sidebar .agent-builder-setup-card__actions {
592
+ gap: 0.25rem;
593
+ }
594
+
595
+ .agent-builder-setup-card--sidebar .agent-builder-setup-card__builder-button {
596
+ justify-content: center;
597
+ min-height: 2rem;
598
+ }
599
+
600
+ .agent-builder-setup-card--sidebar .agent-builder-setup-card__key-button {
601
+ align-self: center;
602
+ justify-content: center;
603
+ width: auto;
604
+ min-height: 1.5rem;
605
+ height: 1.5rem;
606
+ border: 0;
607
+ background: transparent;
608
+ color: hsl(var(--muted-foreground));
609
+ padding-inline: 0.25rem;
610
+ }
611
+
612
+ .agent-builder-setup-card--sidebar .agent-builder-setup-card__key-button:hover {
613
+ background: transparent;
614
+ color: hsl(var(--foreground));
615
+ }
616
+
551
617
  @container agent-builder-setup (max-width: 560px) {
552
618
  .agent-builder-setup-card__content {
553
619
  align-items: stretch;
@@ -564,23 +630,19 @@
564
630
 
565
631
  .agent-builder-setup-card__builder-cta {
566
632
  align-items: stretch;
567
- flex: 1 1 11rem;
633
+ flex: 0 1 auto;
568
634
  }
569
635
 
570
- .agent-builder-setup-card__builder-button,
571
- .agent-builder-setup-card__key-button {
636
+ .agent-builder-setup-card__builder-button {
572
637
  justify-content: center;
573
638
  min-width: 0;
574
639
  width: 100%;
575
640
  }
576
641
 
577
642
  .agent-builder-setup-card__key-button {
578
- border: 1px solid hsl(var(--border));
579
- background: hsl(var(--background));
580
- color: hsl(var(--foreground));
581
- flex: 1 1 8rem;
582
- height: 2rem;
583
- padding-inline: 0.75rem;
643
+ flex: 0 0 auto;
644
+ min-width: 0;
645
+ width: auto;
584
646
  }
585
647
  }
586
648
 
@@ -629,6 +691,28 @@
629
691
  overflow: visible;
630
692
  }
631
693
 
694
+ [data-agent-empty-state="compact-setup"] > .agent-chat-scroll {
695
+ flex: 0 0 auto;
696
+ overflow: visible;
697
+ }
698
+
699
+ [data-agent-empty-state="compact-setup"] .agent-empty-state {
700
+ height: auto;
701
+ min-height: 5rem;
702
+ gap: 0.5rem;
703
+ padding-block: 0.875rem;
704
+ }
705
+
706
+ [data-agent-empty-state="compact-setup"] .agent-empty-state > div:first-child {
707
+ width: 2rem;
708
+ height: 2rem;
709
+ }
710
+
711
+ [data-agent-empty-state="compact-setup"] .agent-empty-state svg {
712
+ width: 1rem;
713
+ height: 1rem;
714
+ }
715
+
632
716
  .agent-thinking-indicator {
633
717
  display: inline-flex;
634
718
  align-items: center;
@@ -333,11 +333,12 @@
333
333
  display: flex;
334
334
  align-items: center;
335
335
  border-radius: 6px;
336
- background: hsl(0 0% 15%);
336
+ background: hsl(var(--popover));
337
+ color: hsl(var(--popover-foreground));
337
338
  padding: 3px;
338
339
  box-shadow:
339
340
  0 4px 16px rgb(0 0 0 / 0.25),
340
- 0 0 0 1px rgb(255 255 255 / 0.06);
341
+ 0 0 0 1px hsl(var(--border));
341
342
  }
342
343
 
343
344
  .an-rich-md-bubble-items,
@@ -351,7 +352,7 @@
351
352
  padding: 3px 6px;
352
353
  border-radius: 4px;
353
354
  font-size: 12px;
354
- color: rgb(255 255 255 / 0.76);
355
+ color: hsl(var(--popover-foreground) / 0.76);
355
356
  background: none;
356
357
  border: none;
357
358
  cursor: pointer;
@@ -359,20 +360,20 @@
359
360
  }
360
361
 
361
362
  .an-rich-md-bubble-button:hover {
362
- background: rgb(255 255 255 / 0.12);
363
- color: white;
363
+ background: hsl(var(--accent));
364
+ color: hsl(var(--accent-foreground));
364
365
  }
365
366
 
366
367
  .an-rich-md-bubble-button--active {
367
- background: rgb(255 255 255 / 0.18);
368
- color: white;
368
+ background: hsl(var(--accent));
369
+ color: hsl(var(--accent-foreground));
369
370
  }
370
371
 
371
372
  .an-rich-md-bubble-divider {
372
373
  width: 1px;
373
374
  height: 16px;
374
375
  margin: 0 2px;
375
- background: rgb(255 255 255 / 0.2);
376
+ background: hsl(var(--border));
376
377
  }
377
378
 
378
379
  .an-rich-md-link-editor {
@@ -384,7 +385,7 @@
384
385
  border: none;
385
386
  outline: none;
386
387
  background: transparent;
387
- color: white;
388
+ color: hsl(var(--popover-foreground));
388
389
  font-size: 12px;
389
390
  padding: 2px 4px;
390
391
  }
@@ -392,7 +393,7 @@
392
393
  .an-rich-md-link-editor button {
393
394
  border: none;
394
395
  background: none;
395
- color: #60a5fa;
396
+ color: hsl(var(--primary));
396
397
  cursor: pointer;
397
398
  font-size: 11px;
398
399
  font-weight: 500;
@@ -264,6 +264,12 @@ function hasStructuredFilters(filters: ReturnType<typeof buildFilterSummary>) {
264
264
  function buildGuidance(options: {
265
265
  query: string | undefined;
266
266
  structuredFilters: boolean;
267
+ truncated: boolean;
268
+ hasMore: boolean;
269
+ total: number;
270
+ returned: number;
271
+ offset: number;
272
+ limit: number;
267
273
  }) {
268
274
  const guidance: string[] = [];
269
275
 
@@ -285,6 +291,15 @@ function buildGuidance(options: {
285
291
  );
286
292
  }
287
293
 
294
+ if (options.truncated) {
295
+ const more = options.hasMore
296
+ ? `Fetch the next page with offset ${options.offset + options.returned}.`
297
+ : "This is the last page of the cohort.";
298
+ guidance.push(
299
+ `Returned ${options.returned} of ${options.total} matching deals (limit ${options.limit}, offset ${options.offset}). This is a partial slice — do NOT treat it as the full cohort. Use total for counts/aggregates. ${more} Narrow the filters or, for exhaustive cohort analysis, use provider-api-request with provider = hubspot and stageAs.`,
300
+ );
301
+ }
302
+
288
303
  return guidance.join(" ");
289
304
  }
290
305
 
@@ -293,7 +308,7 @@ export default defineAction({
293
308
  // reusable across continuation retries (no re-fetch on resume).
294
309
  readOnly: true,
295
310
  description:
296
- "Get HubSpot deals with normalized stage, pipeline, owner, forecast, and NBM fields. This is a bounded deal analytics shortcut, not the full HubSpot capability surface. Use query for a specific customer/deal/account deep dive. For cohorts like products field = Publish, closed-won, pipeline = New Business, or close date in a range, use the structured product, pipeline, closedStatus, closedDateFrom, and closedDateTo filters instead of query when the answer is the deal list itself. If the cohort feeds a cross-source join, transcript/message/ticket search, exhaustive absence check, or downstream code/corpus workflow, prefer provider-api-catalog/provider-api-request with provider = hubspot and stageAs so the cohort is available as a staged dataset. For non-deal CRM records use hubspot-records; for arbitrary HubSpot endpoints, filters, associations, batch APIs, or payloads use provider-api-catalog/provider-api-docs/provider-api-request with provider = hubspot.",
311
+ "Get HubSpot deals with normalized stage, pipeline, owner, forecast, and NBM fields. This is a bounded deal analytics shortcut, not the full HubSpot capability surface. Use query for a specific customer/deal/account deep dive. For cohorts like products field = Publish, closed-won, pipeline = New Business, or close date in a range, use the structured product, pipeline, closedStatus, closedDateFrom, and closedDateTo filters instead of query when the answer is the deal list itself. If the cohort feeds a cross-source join, transcript/message/ticket search, exhaustive absence check, or downstream code/corpus workflow, prefer provider-api-catalog/provider-api-request with provider = hubspot and stageAs so the cohort is available as a staged dataset. Both paths are bounded: at most limit deals are returned (default 25, max 100). The structured-filter path returns total as the true matched count and a truncated flag; page with offset (or narrow filters) instead of expecting the whole cohort in one call, since a full enriched cohort can be several MB and overruns extension and context budgets. For non-deal CRM records use hubspot-records; for arbitrary HubSpot endpoints, filters, associations, batch APIs, or payloads use provider-api-catalog/provider-api-docs/provider-api-request with provider = hubspot.",
297
312
  schema: z.object({
298
313
  properties: StringListSchema.describe(
299
314
  "Optional comma-separated extra HubSpot deal property names to include.",
@@ -344,7 +359,17 @@ export default defineAction({
344
359
  .min(1)
345
360
  .max(100)
346
361
  .default(25)
347
- .describe("Maximum records to return when query is provided."),
362
+ .describe(
363
+ "Maximum deals to return. Applies to BOTH full-text query results and structured-filter cohorts. The structured-filter path returns at most this many enriched deals (use total for the true matched count and offset to page).",
364
+ ),
365
+ offset: z.coerce
366
+ .number()
367
+ .int()
368
+ .min(0)
369
+ .default(0)
370
+ .describe(
371
+ "Number of structured-filter results to skip before returning limit deals. Use for paging through a large cohort; ignored when query is provided.",
372
+ ),
348
373
  after: z
349
374
  .string()
350
375
  .optional()
@@ -362,6 +387,7 @@ export default defineAction({
362
387
  closedDateTo,
363
388
  query,
364
389
  limit = 25,
390
+ offset = 0,
365
391
  after,
366
392
  }) => {
367
393
  const trimmedQuery = query?.trim();
@@ -414,7 +440,7 @@ export default defineAction({
414
440
  closedDateTo: closedDateTo?.trim(),
415
441
  });
416
442
  const structuredFilters = hasStructuredFilters(filters);
417
- const deals = rawDeals
443
+ const matchedDeals = rawDeals
418
444
  .filter((d) => visibleIds.has(String(d.properties.pipeline)))
419
445
  .map((deal) => enrichDeal(deal, lookups, owners))
420
446
  .filter((deal) => {
@@ -435,18 +461,52 @@ export default defineAction({
435
461
  return matchesDateRange(deal, fromMs, toMs);
436
462
  });
437
463
 
464
+ // The full-text query path is already bounded by HubSpot's own `limit`.
465
+ // EVERY non-query call (with or without structured filters) scans the whole
466
+ // visible deal set, so bound the returned cohort here. This is deliberately
467
+ // NOT gated on `structuredFilters`: the unfiltered `hubspot-deals({})` call
468
+ // is the LARGEST payload of all (every visible deal), so it must be bounded
469
+ // too — a full enriched cohort can be multiple MB, which overruns the
470
+ // extension iframe bridge and the agent context. We
471
+ // keep `total` as the true matched count and signal partial slices via
472
+ // `truncated` so callers never mistake a page for the full cohort.
473
+ // `truncated` means "this response is only part of the cohort" (returned <
474
+ // total) and stays true on the LAST page of a paginated read too; pagination
475
+ // (is there a next page) is reported separately via `hasMore` / `nextOffset`.
476
+ const matchedTotal = matchedDeals.length;
477
+ const deals = trimmedQuery
478
+ ? matchedDeals
479
+ : matchedDeals.slice(offset, offset + limit);
480
+ const truncated = !trimmedQuery && deals.length < matchedTotal;
481
+ const hasMore = !trimmedQuery && offset + deals.length < matchedTotal;
482
+
438
483
  return {
439
484
  deals,
440
485
  stageLabels: lookups.stageLabels,
441
486
  pipelineLabels: lookups.pipelineLabels,
442
- total: deals.length,
487
+ total: matchedTotal,
443
488
  count: deals.length,
444
489
  query: trimmedQuery || null,
445
490
  filters,
446
491
  nextAfter: Array.isArray(dealResult) ? null : dealResult.nextAfter,
492
+ ...(trimmedQuery
493
+ ? {}
494
+ : {
495
+ limit,
496
+ offset,
497
+ truncated,
498
+ hasMore,
499
+ nextOffset: hasMore ? offset + deals.length : null,
500
+ }),
447
501
  guidance: buildGuidance({
448
502
  query: trimmedQuery,
449
503
  structuredFilters,
504
+ truncated,
505
+ hasMore,
506
+ total: matchedTotal,
507
+ returned: deals.length,
508
+ offset,
509
+ limit,
450
510
  }),
451
511
  ...(Array.isArray(dealResult)
452
512
  ? {}
@@ -12,6 +12,11 @@ import {
12
12
 
13
13
  import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
14
14
  import { Skeleton } from "@/components/ui/skeleton";
15
+ import {
16
+ chartAxisStroke,
17
+ chartGridStroke,
18
+ chartTooltipContentStyle,
19
+ } from "@/lib/chart-theme";
15
20
 
16
21
  interface CumulativeNetChartProps {
17
22
  title: string;
@@ -78,14 +83,14 @@ export function CumulativeNetChart({
78
83
  </defs>
79
84
  <XAxis
80
85
  dataKey="day"
81
- stroke="#52525b"
86
+ stroke={chartAxisStroke}
82
87
  fontSize={12}
83
88
  tickLine={false}
84
89
  axisLine={false}
85
90
  tickFormatter={formatDate}
86
91
  />
87
92
  <YAxis
88
- stroke="#52525b"
93
+ stroke={chartAxisStroke}
89
94
  fontSize={12}
90
95
  tickLine={false}
91
96
  axisLine={false}
@@ -93,17 +98,12 @@ export function CumulativeNetChart({
93
98
  />
94
99
  <CartesianGrid
95
100
  strokeDasharray="3 3"
96
- stroke="#27272a"
101
+ stroke={chartGridStroke}
97
102
  vertical={false}
98
103
  />
99
- <ReferenceLine y={0} stroke="#52525b" strokeWidth={1} />
104
+ <ReferenceLine y={0} stroke={chartAxisStroke} strokeWidth={1} />
100
105
  <Tooltip
101
- contentStyle={{
102
- backgroundColor: "#09090b",
103
- border: "1px solid #27272a",
104
- borderRadius: "8px",
105
- color: "#fafafa",
106
- }}
106
+ contentStyle={chartTooltipContentStyle}
107
107
  labelFormatter={formatDate}
108
108
  formatter={(value: any) => [
109
109
  `$${Number(value).toLocaleString(undefined, { maximumFractionDigits: 0 })}`,
@@ -10,6 +10,11 @@ import {
10
10
  } from "recharts";
11
11
 
12
12
  import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
13
+ import {
14
+ chartAxisStroke,
15
+ chartGridStroke,
16
+ chartTooltipContentStyle,
17
+ } from "@/lib/chart-theme";
13
18
 
14
19
  const data = [
15
20
  { name: "Jan", total: 1200 },
@@ -49,13 +54,13 @@ export function RevenueChart() {
49
54
  </defs>
50
55
  <XAxis
51
56
  dataKey="name"
52
- stroke="#52525b"
57
+ stroke={chartAxisStroke}
53
58
  fontSize={12}
54
59
  tickLine={false}
55
60
  axisLine={false}
56
61
  />
57
62
  <YAxis
58
- stroke="#52525b"
63
+ stroke={chartAxisStroke}
59
64
  fontSize={12}
60
65
  tickLine={false}
61
66
  axisLine={false}
@@ -63,17 +68,12 @@ export function RevenueChart() {
63
68
  />
64
69
  <CartesianGrid
65
70
  strokeDasharray="3 3"
66
- stroke="#27272a"
71
+ stroke={chartGridStroke}
67
72
  vertical={false}
68
73
  />
69
74
  <Tooltip
70
- contentStyle={{
71
- backgroundColor: "#09090b",
72
- border: "1px solid #27272a",
73
- borderRadius: "8px",
74
- color: "#fafafa",
75
- }}
76
- itemStyle={{ color: "#38bdf8" }}
75
+ contentStyle={chartTooltipContentStyle}
76
+ itemStyle={{ color: "var(--brand-blue)" }}
77
77
  />
78
78
  <Area
79
79
  type="monotone"
@@ -14,6 +14,7 @@ import {
14
14
 
15
15
  import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
16
16
  import { Skeleton } from "@/components/ui/skeleton";
17
+ import { chartAxisStroke, chartGridStroke } from "@/lib/chart-theme";
17
18
 
18
19
  interface RevenueComparisonChartProps {
19
20
  title: string;
@@ -42,7 +43,7 @@ const formatDate = (value: string) => {
42
43
  function CustomTooltip({ active, payload, label }: any) {
43
44
  if (!active || !payload?.length) return null;
44
45
  return (
45
- <div className="rounded-lg border border-border bg-[#09090b] px-3 py-2 text-xs text-foreground shadow-lg">
46
+ <div className="rounded-lg border border-border bg-popover px-3 py-2 text-xs text-popover-foreground shadow-lg">
46
47
  <p className="mb-1 font-medium">{formatDate(label)}</p>
47
48
  {payload.map((entry: any) => (
48
49
  <p
@@ -94,19 +95,19 @@ export function RevenueComparisonChart({
94
95
  <ComposedChart data={chartData}>
95
96
  <CartesianGrid
96
97
  strokeDasharray="3 3"
97
- stroke="#27272a"
98
+ stroke={chartGridStroke}
98
99
  vertical={false}
99
100
  />
100
101
  <XAxis
101
102
  dataKey="day"
102
- stroke="#52525b"
103
+ stroke={chartAxisStroke}
103
104
  fontSize={12}
104
105
  tickLine={false}
105
106
  axisLine={false}
106
107
  tickFormatter={formatDate}
107
108
  />
108
109
  <YAxis
109
- stroke="#52525b"
110
+ stroke={chartAxisStroke}
110
111
  fontSize={12}
111
112
  tickLine={false}
112
113
  axisLine={false}
@@ -116,7 +117,7 @@ export function RevenueComparisonChart({
116
117
  return `$${v}`;
117
118
  }}
118
119
  />
119
- <ReferenceLine y={0} stroke="#52525b" strokeWidth={1} />
120
+ <ReferenceLine y={0} stroke={chartAxisStroke} strokeWidth={1} />
120
121
  <Tooltip content={<CustomTooltip />} />
121
122
  <Legend
122
123
  wrapperStyle={{ fontSize: "12px", paddingTop: "8px" }}
@@ -11,6 +11,11 @@ import {
11
11
 
12
12
  import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
13
13
  import { Skeleton } from "@/components/ui/skeleton";
14
+ import {
15
+ chartAxisStroke,
16
+ chartGridStroke,
17
+ chartTooltipContentStyle,
18
+ } from "@/lib/chart-theme";
14
19
 
15
20
  interface TimeSeriesChartProps {
16
21
  title: string;
@@ -75,14 +80,14 @@ export function TimeSeriesChart({
75
80
  </defs>
76
81
  <XAxis
77
82
  dataKey={xKey}
78
- stroke="#52525b"
83
+ stroke={chartAxisStroke}
79
84
  fontSize={12}
80
85
  tickLine={false}
81
86
  axisLine={false}
82
87
  tickFormatter={formatXLabel}
83
88
  />
84
89
  <YAxis
85
- stroke="#52525b"
90
+ stroke={chartAxisStroke}
86
91
  fontSize={12}
87
92
  tickLine={false}
88
93
  axisLine={false}
@@ -90,16 +95,11 @@ export function TimeSeriesChart({
90
95
  />
91
96
  <CartesianGrid
92
97
  strokeDasharray="3 3"
93
- stroke="#27272a"
98
+ stroke={chartGridStroke}
94
99
  vertical={false}
95
100
  />
96
101
  <Tooltip
97
- contentStyle={{
98
- backgroundColor: "#09090b",
99
- border: "1px solid #27272a",
100
- borderRadius: "8px",
101
- color: "#fafafa",
102
- }}
102
+ contentStyle={chartTooltipContentStyle}
103
103
  labelFormatter={formatXLabel}
104
104
  />
105
105
  <Area
@@ -191,6 +191,10 @@
191
191
  overflow: visible;
192
192
  }
193
193
 
194
+ .analytics-chat-panel .agent-composer-area--hero {
195
+ padding-inline: 1rem;
196
+ }
197
+
194
198
  .analytics-chat-panel [data-agent-empty-state="centered"] .agent-composer-area {
195
199
  width: 100%;
196
200
  max-width: min(760px, 90%);
@@ -0,0 +1,13 @@
1
+ import type { CSSProperties } from "react";
2
+
3
+ export const chartAxisStroke = "hsl(var(--muted-foreground))";
4
+ export const chartGridStroke = "hsl(var(--border))";
5
+ export const chartTooltipCursorStroke = "hsl(var(--muted-foreground) / 0.25)";
6
+ export const chartTooltipCursorFill = "hsl(var(--muted) / 0.5)";
7
+
8
+ export const chartTooltipContentStyle = {
9
+ backgroundColor: "hsl(var(--popover))",
10
+ border: "1px solid hsl(var(--border))",
11
+ borderRadius: "8px",
12
+ color: "hsl(var(--popover-foreground))",
13
+ } satisfies CSSProperties;