@agent-native/core 0.83.0 → 0.84.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (508) 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/evals.mdx +34 -12
  7. package/corpus/core/docs/content/faq.mdx +1 -1
  8. package/corpus/core/docs/content/locales/ar-SA/cloneable-saas.mdx +2 -2
  9. package/corpus/core/docs/content/locales/ar-SA/evals.mdx +7 -0
  10. package/corpus/core/docs/content/locales/ar-SA/faq.mdx +1 -1
  11. package/corpus/core/docs/content/locales/ar-SA/template-chat.mdx +1 -1
  12. package/corpus/core/docs/content/locales/de-DE/cloneable-saas.mdx +2 -2
  13. package/corpus/core/docs/content/locales/de-DE/evals.mdx +8 -0
  14. package/corpus/core/docs/content/locales/de-DE/faq.mdx +1 -1
  15. package/corpus/core/docs/content/locales/de-DE/template-chat.mdx +1 -1
  16. package/corpus/core/docs/content/locales/es-ES/cloneable-saas.mdx +2 -2
  17. package/corpus/core/docs/content/locales/es-ES/evals.mdx +8 -0
  18. package/corpus/core/docs/content/locales/es-ES/faq.mdx +1 -1
  19. package/corpus/core/docs/content/locales/es-ES/template-chat.mdx +1 -1
  20. package/corpus/core/docs/content/locales/fr-FR/cloneable-saas.mdx +2 -2
  21. package/corpus/core/docs/content/locales/fr-FR/evals.mdx +8 -0
  22. package/corpus/core/docs/content/locales/fr-FR/faq.mdx +1 -1
  23. package/corpus/core/docs/content/locales/fr-FR/template-chat.mdx +1 -1
  24. package/corpus/core/docs/content/locales/hi-IN/cloneable-saas.mdx +2 -2
  25. package/corpus/core/docs/content/locales/hi-IN/evals.mdx +8 -0
  26. package/corpus/core/docs/content/locales/hi-IN/faq.mdx +1 -1
  27. package/corpus/core/docs/content/locales/hi-IN/template-chat.mdx +1 -1
  28. package/corpus/core/docs/content/locales/ja-JP/cloneable-saas.mdx +2 -2
  29. package/corpus/core/docs/content/locales/ja-JP/evals.mdx +7 -0
  30. package/corpus/core/docs/content/locales/ja-JP/faq.mdx +1 -1
  31. package/corpus/core/docs/content/locales/ja-JP/template-chat.mdx +1 -1
  32. package/corpus/core/docs/content/locales/ko-KR/cloneable-saas.mdx +2 -2
  33. package/corpus/core/docs/content/locales/ko-KR/evals.mdx +7 -0
  34. package/corpus/core/docs/content/locales/ko-KR/faq.mdx +1 -1
  35. package/corpus/core/docs/content/locales/ko-KR/template-chat.mdx +1 -1
  36. package/corpus/core/docs/content/locales/pt-BR/cloneable-saas.mdx +2 -2
  37. package/corpus/core/docs/content/locales/pt-BR/evals.mdx +8 -0
  38. package/corpus/core/docs/content/locales/pt-BR/faq.mdx +1 -1
  39. package/corpus/core/docs/content/locales/pt-BR/template-chat.mdx +1 -1
  40. package/corpus/core/docs/content/locales/zh-CN/cloneable-saas.mdx +2 -2
  41. package/corpus/core/docs/content/locales/zh-CN/evals.mdx +7 -0
  42. package/corpus/core/docs/content/locales/zh-CN/faq.mdx +1 -1
  43. package/corpus/core/docs/content/locales/zh-CN/template-chat.mdx +1 -1
  44. package/corpus/core/docs/content/locales/zh-TW/cloneable-saas.mdx +2 -2
  45. package/corpus/core/docs/content/locales/zh-TW/evals.mdx +7 -0
  46. package/corpus/core/docs/content/locales/zh-TW/faq.mdx +1 -1
  47. package/corpus/core/docs/content/locales/zh-TW/template-chat.mdx +1 -1
  48. package/corpus/core/docs/content/template-chat.mdx +1 -1
  49. package/corpus/core/package.json +1 -1
  50. package/corpus/core/src/agent/engine/builtin.ts +1 -1
  51. package/corpus/core/src/agent/engine/output-tokens.ts +1 -1
  52. package/corpus/core/src/agent/harness/acp-adapter.ts +28 -4
  53. package/corpus/core/src/agent/harness/ai-sdk-adapter.ts +3 -0
  54. package/corpus/core/src/agent/harness/translate.ts +3 -0
  55. package/corpus/core/src/agent/harness/types.ts +1 -0
  56. package/corpus/core/src/agent/model-config.ts +34 -13
  57. package/corpus/core/src/agent/production-agent.ts +87 -10
  58. package/corpus/core/src/agent/thread-data-builder.ts +29 -4
  59. package/corpus/core/src/agent/tool-call-journal.ts +109 -48
  60. package/corpus/core/src/agent/types.ts +6 -1
  61. package/corpus/core/src/cli/design-connect.ts +106 -0
  62. package/corpus/core/src/cli/gateway-helpers.ts +17 -0
  63. package/corpus/core/src/cli/recap.ts +0 -2
  64. package/corpus/core/src/cli/skills.ts +54 -16
  65. package/corpus/core/src/cli/workspace-dev.ts +29 -5
  66. package/corpus/core/src/client/AssistantChat.tsx +89 -42
  67. package/corpus/core/src/client/DefaultSpinner.tsx +8 -1
  68. package/corpus/core/src/client/chat/message-components.tsx +49 -1
  69. package/corpus/core/src/client/chat/repo-helpers.ts +71 -0
  70. package/corpus/core/src/client/chat/run-recovery.tsx +15 -5
  71. package/corpus/core/src/client/components/ApiKeySettings.tsx +8 -8
  72. package/corpus/core/src/client/components/CodeRequiredDialog.tsx +26 -15
  73. package/corpus/core/src/client/components/MissingKeyCard.tsx +13 -6
  74. package/corpus/core/src/client/composer/TiptapComposer.tsx +4 -3
  75. package/corpus/core/src/client/extensions/ExtensionsSidebarSection.tsx +0 -1
  76. package/corpus/core/src/client/guided-questions.tsx +21 -27
  77. package/corpus/core/src/client/integrations/IntegrationCard.tsx +1 -1
  78. package/corpus/core/src/client/integrations/IntegrationsPanel.tsx +1 -1
  79. package/corpus/core/src/client/onboarding/OnboardingBanner.tsx +2 -2
  80. package/corpus/core/src/client/onboarding/OnboardingPanel.tsx +23 -19
  81. package/corpus/core/src/client/resources/ResourceEditor.tsx +18 -10
  82. package/corpus/core/src/client/resources/ResourcesPanel.tsx +5 -1
  83. package/corpus/core/src/client/settings/SettingsPanel.tsx +8 -3
  84. package/corpus/core/src/client/settings/useBuilderStatus.ts +8 -41
  85. package/corpus/core/src/client/useProductionAgent.ts +6 -2
  86. package/corpus/core/src/deploy/build.ts +1 -1
  87. package/corpus/core/src/eval/define-eval.ts +4 -1
  88. package/corpus/core/src/eval/report.ts +23 -8
  89. package/corpus/core/src/eval/runner.ts +41 -6
  90. package/corpus/core/src/eval/types.ts +11 -0
  91. package/corpus/core/src/observability/traces.ts +3 -3
  92. package/corpus/core/src/onboarding/default-steps.ts +1 -1
  93. package/corpus/core/src/scripts/agent-engines/manage-agent-engine.ts +1 -1
  94. package/corpus/core/src/scripts/agent-engines/set-agent-engine.ts +1 -1
  95. package/corpus/core/src/server/agent-chat-plugin.ts +177 -81
  96. package/corpus/core/src/server/core-routes-plugin.ts +7 -1
  97. package/corpus/core/src/server/open-route.ts +59 -40
  98. package/corpus/core/src/shared/reasoning-effort.ts +2 -0
  99. package/corpus/core/src/sharing/access.ts +22 -2
  100. package/corpus/core/src/sharing/registry.ts +18 -0
  101. package/corpus/core/src/styles/agent-native.css +104 -20
  102. package/corpus/core/src/styles/rich-markdown-editor.css +11 -10
  103. package/corpus/templates/analytics/app/components/dashboard/CumulativeNetChart.tsx +10 -10
  104. package/corpus/templates/analytics/app/components/dashboard/RevenueChart.tsx +10 -10
  105. package/corpus/templates/analytics/app/components/dashboard/RevenueComparisonChart.tsx +6 -5
  106. package/corpus/templates/analytics/app/components/dashboard/TimeSeriesChart.tsx +9 -9
  107. package/corpus/templates/analytics/app/global.css +4 -0
  108. package/corpus/templates/analytics/app/lib/chart-theme.ts +13 -0
  109. package/corpus/templates/analytics/app/pages/adhoc/_shared/KpiChart.tsx +22 -24
  110. package/corpus/templates/analytics/changelog/2026-06-30-dashboard-charts-now-use-theme-aware-tooltip-and-grid-colors.md +6 -0
  111. package/corpus/templates/analytics/changelog/2026-06-30-fixed-ask-composer-spacing-so-the-chat-field-has-a-comfortab.md +6 -0
  112. package/corpus/templates/calendar/AGENTS.md +4 -0
  113. package/corpus/templates/calendar/actions/connect-google-calendar.ts +80 -0
  114. package/corpus/templates/calendar/changelog/2026-06-30-calendar-now-gives-the-agent-a-safe-google-connection-link-i.md +6 -0
  115. package/corpus/templates/calendar/server/plugins/agent-chat.ts +4 -0
  116. package/corpus/templates/content/AGENTS.md +9 -2
  117. package/corpus/templates/content/actions/_database-row-batch.ts +230 -0
  118. package/corpus/templates/content/actions/_database-utils.ts +17 -9
  119. package/corpus/templates/content/actions/_notion-action-utils.ts +26 -0
  120. package/corpus/templates/content/actions/connect-notion-status.ts +13 -4
  121. package/corpus/templates/content/actions/create-and-link-notion-page.ts +23 -0
  122. package/corpus/templates/content/actions/delete-database-items.ts +55 -0
  123. package/corpus/templates/content/actions/delete-document.ts +4 -4
  124. package/corpus/templates/content/actions/disconnect-notion.ts +16 -0
  125. package/corpus/templates/content/actions/duplicate-database-item.ts +1 -1
  126. package/corpus/templates/content/actions/duplicate-database-items.ts +191 -0
  127. package/corpus/templates/content/actions/link-notion-page.ts +10 -7
  128. package/corpus/templates/content/actions/list-notion-links.ts +3 -4
  129. package/corpus/templates/content/actions/pull-notion-page.ts +7 -9
  130. package/corpus/templates/content/actions/push-notion-page.ts +7 -9
  131. package/corpus/templates/content/actions/refresh-notion-sync-status.ts +24 -0
  132. package/corpus/templates/content/actions/resolve-notion-sync-conflict.ts +23 -0
  133. package/corpus/templates/content/actions/search-notion-pages.ts +67 -0
  134. package/corpus/templates/content/actions/unlink-notion-page.ts +23 -0
  135. package/corpus/templates/content/app/components/editor/BubbleToolbar.tsx +5 -5
  136. package/corpus/templates/content/app/components/editor/DocumentDatabase.tsx +27 -34
  137. package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +16 -13
  138. package/corpus/templates/content/app/components/editor/DocumentToolbar.tsx +10 -10
  139. package/corpus/templates/content/app/components/editor/NotionConflictBanner.tsx +1 -1
  140. package/corpus/templates/content/app/components/editor/NotionSyncBar.tsx +18 -9
  141. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +27 -34
  142. package/corpus/templates/content/app/components/editor/database/navigation-state.ts +10 -4
  143. package/corpus/templates/content/app/components/sidebar/NotionButton.tsx +32 -17
  144. package/corpus/templates/content/app/global.css +6 -5
  145. package/corpus/templates/content/app/hooks/use-content-database.ts +35 -0
  146. package/corpus/templates/content/app/hooks/use-notion.ts +108 -99
  147. package/corpus/templates/content/changelog/2026-06-30-editor-floating-toolbars-now-use-theme-aware-colors-in-light.md +6 -0
  148. package/corpus/templates/content/package.json +3 -0
  149. package/corpus/templates/content/parity/README.md +69 -0
  150. package/corpus/templates/content/parity/eval-scenarios.ts +118 -0
  151. package/corpus/templates/content/parity/exceptions.allowlist.ts +17 -0
  152. package/corpus/templates/content/parity/matrix.md +28 -0
  153. package/corpus/templates/content/parity/matrix.ts +606 -0
  154. package/corpus/templates/content/parity/matrix.types.ts +42 -0
  155. package/corpus/templates/content/parity/parity-evals.eval.ts +4 -0
  156. package/corpus/templates/content/parity/render-matrix.ts +90 -0
  157. package/corpus/templates/content/parity/scenario-to-eval.ts +57 -0
  158. package/corpus/templates/content/shared/api.ts +11 -0
  159. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +6 -1
  160. package/corpus/templates/design/actions/add-localhost-screens.ts +63 -8
  161. package/corpus/templates/design/actions/apply-motion-edit.ts +12 -46
  162. package/corpus/templates/design/actions/list-design-native-assets.ts +2 -1
  163. package/corpus/templates/design/actions/migrate-board-objects-to-file.ts +49 -1
  164. package/corpus/templates/design/actions/navigate.ts +3 -12
  165. package/corpus/templates/design/actions/open-visual-edit.ts +341 -0
  166. package/corpus/templates/design/actions/view-screen.ts +1 -1
  167. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +1 -1
  168. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +345 -14
  169. package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +71 -91
  170. package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +25 -27
  171. package/corpus/templates/design/app/components/design/DeviceFrame.tsx +1 -1
  172. package/corpus/templates/design/app/components/design/DrawOverlay.tsx +2 -2
  173. package/corpus/templates/design/app/components/design/EditPanel.tsx +1111 -570
  174. package/corpus/templates/design/app/components/design/LayersPanel.tsx +162 -32
  175. package/corpus/templates/design/app/components/design/MotionDock.tsx +268 -240
  176. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +1038 -150
  177. package/corpus/templates/design/app/components/design/QuestionFlow.tsx +1 -1
  178. package/corpus/templates/design/app/components/design/ReviewPanel.tsx +81 -102
  179. package/corpus/templates/design/app/components/design/StatesPanel.tsx +6 -6
  180. package/corpus/templates/design/app/components/design/TokensPanel.tsx +11 -11
  181. package/corpus/templates/design/app/components/design/TweaksPanel.tsx +9 -7
  182. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +1129 -155
  183. package/corpus/templates/design/app/components/design/bridge/hit-test.bridge.ts +130 -37
  184. package/corpus/templates/design/app/components/design/canvas-primitive-style.ts +24 -11
  185. package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +184 -162
  186. package/corpus/templates/design/app/components/design/inspector/ConstraintsWidget.tsx +137 -79
  187. package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +13 -13
  188. package/corpus/templates/design/app/components/design/inspector/ExportSettingsPanel.tsx +8 -8
  189. package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +2 -2
  190. package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +4 -4
  191. package/corpus/templates/design/app/components/design/inspector/InspectorAiActions.tsx +3 -3
  192. package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +13 -7
  193. package/corpus/templates/design/app/components/design/inspector/ShaderControls.tsx +14 -11
  194. package/corpus/templates/design/app/components/design/inspector/ShaderFillsPanel.tsx +4 -4
  195. package/corpus/templates/design/app/components/design/inspector/index.ts +2 -0
  196. package/corpus/templates/design/app/components/design/types.ts +19 -0
  197. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +61 -78
  198. package/corpus/templates/design/app/components/layout/Header.tsx +0 -1
  199. package/corpus/templates/design/app/components/layout/Layout.tsx +3 -2
  200. package/corpus/templates/design/app/components/layout/Sidebar.tsx +0 -2
  201. package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +5 -4
  202. package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +1 -1
  203. package/corpus/templates/design/app/components/visual-editor/SaveStatusIndicator.tsx +2 -2
  204. package/corpus/templates/design/app/global.css +56 -0
  205. package/corpus/templates/design/app/hooks/use-agent-generating.ts +4 -5
  206. package/corpus/templates/design/app/hooks/use-navigation-state.ts +6 -7
  207. package/corpus/templates/design/app/hooks/use-question-flow.ts +3 -2
  208. package/corpus/templates/design/app/hooks/useAgentEditRequest.ts +6 -4
  209. package/corpus/templates/design/app/i18n/zh-TW.ts +5 -14
  210. package/corpus/templates/design/app/i18n-data.ts +63 -188
  211. package/corpus/templates/design/app/lib/agent-chat.ts +13 -0
  212. package/corpus/templates/design/app/pages/DesignEditor.tsx +1428 -384
  213. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +9 -5
  214. package/corpus/templates/design/app/pages/DesignSystems.tsx +2 -2
  215. package/corpus/templates/design/app/pages/Index.tsx +49 -26
  216. package/corpus/templates/design/app/pages/NotFound.tsx +25 -8
  217. package/corpus/templates/design/app/pages/VisualEdit.tsx +17 -5
  218. package/corpus/templates/design/app/routes/examples.tsx +1 -7
  219. package/corpus/templates/design/app/routes/templates.tsx +7 -4
  220. package/corpus/templates/design/changelog/2026-06-30-board-shapes-and-auto-layout-controls-are-clearer.md +6 -0
  221. package/corpus/templates/design/changelog/2026-06-30-component-selections-now-use-purple-component-chrome-and-sho.md +6 -0
  222. package/corpus/templates/design/changelog/2026-06-30-constraints-now-stay-tucked-into-a-compact-inspector-preview.md +6 -0
  223. package/corpus/templates/design/changelog/2026-06-30-creating-a-component-now-opens-in-a-compact-inspector-popove.md +6 -0
  224. package/corpus/templates/design/changelog/2026-06-30-design-cards-no-longer-show-legacy-project-type-badges.md +6 -0
  225. package/corpus/templates/design/changelog/2026-06-30-design-chat-now-keeps-new-turns-in-the-visible-design-agent-.md +6 -0
  226. package/corpus/templates/design/changelog/2026-06-30-design-editor-panels-now-keep-their-compact-text-sizing-cons.md +6 -0
  227. package/corpus/templates/design/changelog/2026-06-30-design-no-longer-shows-the-connected-local-code-warning-bann.md +6 -0
  228. package/corpus/templates/design/changelog/2026-06-30-design-now-opens-to-the-files-panel-unless-a-generation-is-a.md +6 -0
  229. package/corpus/templates/design/changelog/2026-06-30-design-opens-with-a-cleaner-empty-canvas-and-loading-preview.md +6 -0
  230. package/corpus/templates/design/changelog/2026-06-30-design-tools-use-simpler-less-decorative-icons.md +6 -0
  231. package/corpus/templates/design/changelog/2026-06-30-dragging-absolute-elements-no-longer-shows-coordinate-labels.md +6 -0
  232. package/corpus/templates/design/changelog/2026-06-30-fixed-all-screens-opening-too-zoomed-in-by-default.md +6 -0
  233. package/corpus/templates/design/changelog/2026-06-30-fixed-the-public-design-assets-sidebar-so-native-components-.md +6 -0
  234. package/corpus/templates/design/changelog/2026-06-30-fixed-the-screen-overview-board-so-empty-board-space-no-long.md +6 -0
  235. package/corpus/templates/design/changelog/2026-06-30-full-view-screens-can-now-scroll-while-remaining-editable.md +6 -0
  236. package/corpus/templates/design/changelog/2026-06-30-inspector-element-headers-show-the-selected-html-tag-and-the.md +6 -0
  237. package/corpus/templates/design/changelog/2026-06-30-inspector-inputs-stay-compact-across-desktop-breakpoints.md +6 -0
  238. package/corpus/templates/design/changelog/2026-06-30-layers-can-be-multi-selected-from-the-canvas-and-edited-toge.md +6 -0
  239. package/corpus/templates/design/changelog/2026-06-30-local-visual-edit-links-can-edit-localhost-frames-without-si.md +6 -0
  240. package/corpus/templates/design/changelog/2026-06-30-localhost-visual-edit-frames-can-now-be-selected-and-edited.md +6 -0
  241. package/corpus/templates/design/changelog/2026-06-30-marquee-selection-now-works-inside-screens-multi-selected-la.md +6 -0
  242. package/corpus/templates/design/changelog/2026-06-30-motion-is-now-available-from-the-persistent-left-rail-and-th.md +6 -0
  243. package/corpus/templates/design/changelog/2026-06-30-motion-timeline-collapse-and-reopen-animations-feel-smoother.md +6 -0
  244. package/corpus/templates/design/changelog/2026-06-30-multi-select-outlines-now-stay-consistent-across-all-screens.md +6 -0
  245. package/corpus/templates/design/changelog/2026-06-30-new-board-shapes-now-start-with-neutral-gray-styling.md +6 -0
  246. package/corpus/templates/design/changelog/2026-06-30-new-designs-open-into-a-steadier-loading-state-before-the-ed.md +6 -0
  247. package/corpus/templates/design/changelog/2026-06-30-new-designs-show-a-loading-state-during-handoff-and-keep-edi.md +6 -0
  248. package/corpus/templates/design/changelog/2026-06-30-public-visual-edit-design-links-now-open-directly-instead-of.md +6 -0
  249. package/corpus/templates/design/changelog/2026-06-30-removed-the-confusing-states-section-from-the-design-editor-.md +6 -0
  250. package/corpus/templates/design/changelog/2026-06-30-removed-the-templates-gallery-from-design-navigation.md +6 -0
  251. package/corpus/templates/design/changelog/2026-06-30-share-stays-visible-as-soon-as-editable-designs-load.md +6 -0
  252. package/corpus/templates/design/changelog/2026-06-30-signed-out-save-and-share-controls-use-simpler-labels-and-op.md +6 -0
  253. package/corpus/templates/design/changelog/2026-06-30-text-added-on-the-canvas-now-focuses-cleanly-with-the-right-.md +6 -0
  254. package/corpus/templates/design/changelog/2026-06-30-the-design-editor-loading-skeleton-is-simpler-and-its-bottom.md +6 -0
  255. package/corpus/templates/design/changelog/2026-06-30-the-design-editor-loading-skeleton-now-follows-the-current-t.md +6 -0
  256. package/corpus/templates/design/changelog/2026-06-30-the-design-inspector-no-longer-shows-child-layout-controls-o.md +6 -0
  257. package/corpus/templates/design/changelog/2026-06-30-the-design-inspector-no-longer-shows-the-ask-ai-section-abov.md +6 -0
  258. package/corpus/templates/design/changelog/2026-06-30-the-design-review-panel-no-longer-shows-a-separate-inline-au.md +6 -0
  259. package/corpus/templates/design/changelog/2026-06-30-the-empty-designs-page-now-focuses-on-a-single-primary-new-d.md +6 -0
  260. package/corpus/templates/design/changelog/2026-06-30-the-layers-panel-header-stays-as-layers-while-multiple-items.md +6 -0
  261. package/corpus/templates/design/changelog/2026-06-30-the-missing-design-screen-now-uses-a-neutral-back-button.md +6 -0
  262. package/corpus/templates/design/changelog/2026-06-30-the-motion-timeline-now-closes-without-squeezing-the-canvas-.md +6 -0
  263. package/corpus/templates/design/changelog/2026-06-30-the-new-design-connect-ai-setup-now-lines-up-with-the-compos.md +6 -0
  264. package/corpus/templates/design/changelog/2026-06-30-the-screen-overview-board-now-blends-into-the-canvas-and-new.md +6 -0
  265. package/corpus/templates/design/changelog/2026-06-30-top-level-canvas-drops-now-show-screen-guides.md +6 -0
  266. package/corpus/templates/design/changelog/2026-06-30-top-level-canvas-layers-now-keep-a-transparent-backdrop-and-.md +6 -0
  267. package/corpus/templates/design/changelog/2026-06-30-top-level-canvas-layers-now-select-reliably-from-all-screens.md +6 -0
  268. package/corpus/templates/design/changelog/2026-06-30-visual-edit-can-open-and-refresh-localhost-screens-in-one-au.md +6 -0
  269. package/corpus/templates/design/e2e/helpers.ts +15 -4
  270. package/corpus/templates/design/server/db/index.ts +52 -0
  271. package/corpus/templates/design/server/plugins/agent-chat.ts +5 -0
  272. package/corpus/templates/design/server/plugins/auth.ts +1 -0
  273. package/corpus/templates/design/server/plugins/core-routes.ts +4 -0
  274. package/corpus/templates/design/shared/board-file.ts +380 -5
  275. package/corpus/templates/design/shared/board-objects.ts +2 -2
  276. package/corpus/templates/design/shared/code-layer.ts +50 -6
  277. package/corpus/templates/design/shared/motion-compiler.ts +27 -0
  278. package/corpus/templates/macros/app/components/DailyProgress.tsx +41 -37
  279. package/corpus/templates/macros/app/components/ExerciseCard.tsx +2 -2
  280. package/corpus/templates/macros/app/components/MealCard.tsx +2 -2
  281. package/corpus/templates/macros/app/components/VoiceDictation.tsx +1 -1
  282. package/corpus/templates/macros/app/components/WeeklyCaloriesChart.tsx +1 -1
  283. package/corpus/templates/macros/app/components/WeightCard.tsx +2 -2
  284. package/corpus/templates/macros/app/components/WeightTracker.tsx +1 -1
  285. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +1 -1
  286. package/corpus/templates/macros/app/routes/_index.tsx +5 -5
  287. package/corpus/templates/macros/app/routes/analytics.tsx +1 -1
  288. package/corpus/templates/macros/changelog/2026-06-30-dashboard-loading-and-chart-surfaces-now-use-theme-aware-col.md +6 -0
  289. package/corpus/templates/mail/app/components/email/ComposeBubbleToolbar.tsx +14 -11
  290. package/corpus/templates/mail/app/global.css +3 -2
  291. package/corpus/templates/mail/changelog/2026-06-30-compose-floating-toolbars-now-use-theme-aware-colors-in-ligh.md +6 -0
  292. package/corpus/templates/plan/app/pages/PlansPage.tsx +2 -2
  293. package/corpus/templates/slides/app/components/deck/DeckCard.tsx +3 -3
  294. package/corpus/templates/slides/app/global.css +10 -0
  295. package/corpus/templates/slides/app/pages/Index.tsx +55 -51
  296. package/corpus/templates/slides/changelog/2026-06-30-deck-thumbnails-collapse-cleanly-to-one-column-when-the-chat.md +6 -0
  297. package/dist/agent/engine/anthropic-engine.d.ts +2 -2
  298. package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
  299. package/dist/agent/engine/builder-engine.d.ts +2 -2
  300. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  301. package/dist/agent/engine/builtin.js +1 -1
  302. package/dist/agent/engine/builtin.js.map +1 -1
  303. package/dist/agent/engine/output-tokens.js +1 -1
  304. package/dist/agent/engine/output-tokens.js.map +1 -1
  305. package/dist/agent/harness/acp-adapter.d.ts +4 -1
  306. package/dist/agent/harness/acp-adapter.d.ts.map +1 -1
  307. package/dist/agent/harness/acp-adapter.js +19 -2
  308. package/dist/agent/harness/acp-adapter.js.map +1 -1
  309. package/dist/agent/harness/ai-sdk-adapter.d.ts.map +1 -1
  310. package/dist/agent/harness/ai-sdk-adapter.js +3 -0
  311. package/dist/agent/harness/ai-sdk-adapter.js.map +1 -1
  312. package/dist/agent/harness/translate.d.ts.map +1 -1
  313. package/dist/agent/harness/translate.js +3 -0
  314. package/dist/agent/harness/translate.js.map +1 -1
  315. package/dist/agent/harness/types.d.ts +1 -0
  316. package/dist/agent/harness/types.d.ts.map +1 -1
  317. package/dist/agent/harness/types.js.map +1 -1
  318. package/dist/agent/model-config.d.ts +21 -20
  319. package/dist/agent/model-config.d.ts.map +1 -1
  320. package/dist/agent/model-config.js +31 -13
  321. package/dist/agent/model-config.js.map +1 -1
  322. package/dist/agent/production-agent.d.ts.map +1 -1
  323. package/dist/agent/production-agent.js +85 -10
  324. package/dist/agent/production-agent.js.map +1 -1
  325. package/dist/agent/thread-data-builder.d.ts.map +1 -1
  326. package/dist/agent/thread-data-builder.js +27 -6
  327. package/dist/agent/thread-data-builder.js.map +1 -1
  328. package/dist/agent/tool-call-journal.d.ts +11 -9
  329. package/dist/agent/tool-call-journal.d.ts.map +1 -1
  330. package/dist/agent/tool-call-journal.js +92 -40
  331. package/dist/agent/tool-call-journal.js.map +1 -1
  332. package/dist/agent/types.d.ts +5 -1
  333. package/dist/agent/types.d.ts.map +1 -1
  334. package/dist/agent/types.js.map +1 -1
  335. package/dist/cli/design-connect.d.ts.map +1 -1
  336. package/dist/cli/design-connect.js +84 -0
  337. package/dist/cli/design-connect.js.map +1 -1
  338. package/dist/cli/gateway-helpers.d.ts +4 -0
  339. package/dist/cli/gateway-helpers.d.ts.map +1 -1
  340. package/dist/cli/gateway-helpers.js +9 -0
  341. package/dist/cli/gateway-helpers.js.map +1 -1
  342. package/dist/cli/recap.d.ts.map +1 -1
  343. package/dist/cli/recap.js +0 -2
  344. package/dist/cli/recap.js.map +1 -1
  345. package/dist/cli/skills.d.ts.map +1 -1
  346. package/dist/cli/skills.js +54 -16
  347. package/dist/cli/skills.js.map +1 -1
  348. package/dist/cli/workspace-dev.d.ts.map +1 -1
  349. package/dist/cli/workspace-dev.js +33 -6
  350. package/dist/cli/workspace-dev.js.map +1 -1
  351. package/dist/client/AssistantChat.d.ts.map +1 -1
  352. package/dist/client/AssistantChat.js +72 -26
  353. package/dist/client/AssistantChat.js.map +1 -1
  354. package/dist/client/DefaultSpinner.d.ts.map +1 -1
  355. package/dist/client/DefaultSpinner.js +8 -1
  356. package/dist/client/DefaultSpinner.js.map +1 -1
  357. package/dist/client/chat/message-components.d.ts +7 -1
  358. package/dist/client/chat/message-components.d.ts.map +1 -1
  359. package/dist/client/chat/message-components.js +37 -1
  360. package/dist/client/chat/message-components.js.map +1 -1
  361. package/dist/client/chat/repo-helpers.d.ts +1 -0
  362. package/dist/client/chat/repo-helpers.d.ts.map +1 -1
  363. package/dist/client/chat/repo-helpers.js +59 -0
  364. package/dist/client/chat/repo-helpers.js.map +1 -1
  365. package/dist/client/chat/run-recovery.d.ts.map +1 -1
  366. package/dist/client/chat/run-recovery.js +4 -4
  367. package/dist/client/chat/run-recovery.js.map +1 -1
  368. package/dist/client/components/ApiKeySettings.js +8 -8
  369. package/dist/client/components/ApiKeySettings.js.map +1 -1
  370. package/dist/client/components/CodeRequiredDialog.d.ts.map +1 -1
  371. package/dist/client/components/CodeRequiredDialog.js +24 -15
  372. package/dist/client/components/CodeRequiredDialog.js.map +1 -1
  373. package/dist/client/components/MissingKeyCard.d.ts.map +1 -1
  374. package/dist/client/components/MissingKeyCard.js +11 -6
  375. package/dist/client/components/MissingKeyCard.js.map +1 -1
  376. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  377. package/dist/client/composer/TiptapComposer.js +4 -3
  378. package/dist/client/composer/TiptapComposer.js.map +1 -1
  379. package/dist/client/extensions/ExtensionsSidebarSection.d.ts.map +1 -1
  380. package/dist/client/extensions/ExtensionsSidebarSection.js +1 -1
  381. package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
  382. package/dist/client/guided-questions.d.ts.map +1 -1
  383. package/dist/client/guided-questions.js +6 -6
  384. package/dist/client/guided-questions.js.map +1 -1
  385. package/dist/client/integrations/IntegrationCard.js +1 -1
  386. package/dist/client/integrations/IntegrationCard.js.map +1 -1
  387. package/dist/client/integrations/IntegrationsPanel.js +1 -1
  388. package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
  389. package/dist/client/onboarding/OnboardingBanner.js +2 -2
  390. package/dist/client/onboarding/OnboardingBanner.js.map +1 -1
  391. package/dist/client/onboarding/OnboardingPanel.js +23 -19
  392. package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
  393. package/dist/client/resources/ResourceEditor.d.ts.map +1 -1
  394. package/dist/client/resources/ResourceEditor.js +13 -10
  395. package/dist/client/resources/ResourceEditor.js.map +1 -1
  396. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  397. package/dist/client/resources/ResourcesPanel.js +2 -1
  398. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  399. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  400. package/dist/client/settings/SettingsPanel.js +8 -3
  401. package/dist/client/settings/SettingsPanel.js.map +1 -1
  402. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  403. package/dist/client/settings/useBuilderStatus.js +6 -38
  404. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  405. package/dist/client/useProductionAgent.d.ts +2 -1
  406. package/dist/client/useProductionAgent.d.ts.map +1 -1
  407. package/dist/client/useProductionAgent.js.map +1 -1
  408. package/dist/collab/awareness.d.ts +2 -2
  409. package/dist/collab/awareness.d.ts.map +1 -1
  410. package/dist/collab/routes.d.ts +1 -1
  411. package/dist/deploy/build.js +1 -1
  412. package/dist/deploy/build.js.map +1 -1
  413. package/dist/eval/define-eval.d.ts.map +1 -1
  414. package/dist/eval/define-eval.js +2 -1
  415. package/dist/eval/define-eval.js.map +1 -1
  416. package/dist/eval/report.d.ts.map +1 -1
  417. package/dist/eval/report.js +19 -4
  418. package/dist/eval/report.js.map +1 -1
  419. package/dist/eval/runner.d.ts.map +1 -1
  420. package/dist/eval/runner.js +38 -6
  421. package/dist/eval/runner.js.map +1 -1
  422. package/dist/eval/types.d.ts +11 -0
  423. package/dist/eval/types.d.ts.map +1 -1
  424. package/dist/eval/types.js.map +1 -1
  425. package/dist/file-upload/actions/upload-image.d.ts +2 -2
  426. package/dist/notifications/routes.d.ts +3 -3
  427. package/dist/observability/routes.d.ts +5 -5
  428. package/dist/observability/traces.d.ts.map +1 -1
  429. package/dist/observability/traces.js.map +1 -1
  430. package/dist/onboarding/default-steps.js +1 -1
  431. package/dist/onboarding/default-steps.js.map +1 -1
  432. package/dist/progress/routes.d.ts +1 -1
  433. package/dist/resources/handlers.d.ts +1 -1
  434. package/dist/scripts/agent-engines/manage-agent-engine.js +1 -1
  435. package/dist/scripts/agent-engines/manage-agent-engine.js.map +1 -1
  436. package/dist/scripts/agent-engines/set-agent-engine.js +1 -1
  437. package/dist/scripts/agent-engines/set-agent-engine.js.map +1 -1
  438. package/dist/server/agent-chat-plugin.d.ts +3 -0
  439. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  440. package/dist/server/agent-chat-plugin.js +134 -72
  441. package/dist/server/agent-chat-plugin.js.map +1 -1
  442. package/dist/server/core-routes-plugin.d.ts +3 -0
  443. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  444. package/dist/server/core-routes-plugin.js +4 -1
  445. package/dist/server/core-routes-plugin.js.map +1 -1
  446. package/dist/server/open-route.d.ts +9 -0
  447. package/dist/server/open-route.d.ts.map +1 -1
  448. package/dist/server/open-route.js +48 -38
  449. package/dist/server/open-route.js.map +1 -1
  450. package/dist/shared/reasoning-effort.js +3 -0
  451. package/dist/shared/reasoning-effort.js.map +1 -1
  452. package/dist/sharing/access.d.ts.map +1 -1
  453. package/dist/sharing/access.js +18 -2
  454. package/dist/sharing/access.js.map +1 -1
  455. package/dist/sharing/registry.d.ts +10 -0
  456. package/dist/sharing/registry.d.ts.map +1 -1
  457. package/dist/sharing/registry.js.map +1 -1
  458. package/dist/styles/agent-native.css +104 -20
  459. package/dist/styles/rich-markdown-editor.css +11 -10
  460. package/docs/content/cloneable-saas.mdx +2 -2
  461. package/docs/content/evals.mdx +34 -12
  462. package/docs/content/faq.mdx +1 -1
  463. package/docs/content/locales/ar-SA/cloneable-saas.mdx +2 -2
  464. package/docs/content/locales/ar-SA/evals.mdx +7 -0
  465. package/docs/content/locales/ar-SA/faq.mdx +1 -1
  466. package/docs/content/locales/ar-SA/template-chat.mdx +1 -1
  467. package/docs/content/locales/de-DE/cloneable-saas.mdx +2 -2
  468. package/docs/content/locales/de-DE/evals.mdx +8 -0
  469. package/docs/content/locales/de-DE/faq.mdx +1 -1
  470. package/docs/content/locales/de-DE/template-chat.mdx +1 -1
  471. package/docs/content/locales/es-ES/cloneable-saas.mdx +2 -2
  472. package/docs/content/locales/es-ES/evals.mdx +8 -0
  473. package/docs/content/locales/es-ES/faq.mdx +1 -1
  474. package/docs/content/locales/es-ES/template-chat.mdx +1 -1
  475. package/docs/content/locales/fr-FR/cloneable-saas.mdx +2 -2
  476. package/docs/content/locales/fr-FR/evals.mdx +8 -0
  477. package/docs/content/locales/fr-FR/faq.mdx +1 -1
  478. package/docs/content/locales/fr-FR/template-chat.mdx +1 -1
  479. package/docs/content/locales/hi-IN/cloneable-saas.mdx +2 -2
  480. package/docs/content/locales/hi-IN/evals.mdx +8 -0
  481. package/docs/content/locales/hi-IN/faq.mdx +1 -1
  482. package/docs/content/locales/hi-IN/template-chat.mdx +1 -1
  483. package/docs/content/locales/ja-JP/cloneable-saas.mdx +2 -2
  484. package/docs/content/locales/ja-JP/evals.mdx +7 -0
  485. package/docs/content/locales/ja-JP/faq.mdx +1 -1
  486. package/docs/content/locales/ja-JP/template-chat.mdx +1 -1
  487. package/docs/content/locales/ko-KR/cloneable-saas.mdx +2 -2
  488. package/docs/content/locales/ko-KR/evals.mdx +7 -0
  489. package/docs/content/locales/ko-KR/faq.mdx +1 -1
  490. package/docs/content/locales/ko-KR/template-chat.mdx +1 -1
  491. package/docs/content/locales/pt-BR/cloneable-saas.mdx +2 -2
  492. package/docs/content/locales/pt-BR/evals.mdx +8 -0
  493. package/docs/content/locales/pt-BR/faq.mdx +1 -1
  494. package/docs/content/locales/pt-BR/template-chat.mdx +1 -1
  495. package/docs/content/locales/zh-CN/cloneable-saas.mdx +2 -2
  496. package/docs/content/locales/zh-CN/evals.mdx +7 -0
  497. package/docs/content/locales/zh-CN/faq.mdx +1 -1
  498. package/docs/content/locales/zh-CN/template-chat.mdx +1 -1
  499. package/docs/content/locales/zh-TW/cloneable-saas.mdx +2 -2
  500. package/docs/content/locales/zh-TW/evals.mdx +7 -0
  501. package/docs/content/locales/zh-TW/faq.mdx +1 -1
  502. package/docs/content/locales/zh-TW/template-chat.mdx +1 -1
  503. package/docs/content/template-chat.mdx +1 -1
  504. package/package.json +1 -1
  505. package/corpus/templates/content/server/routes/api/notion/disconnect.post.ts +0 -12
  506. package/corpus/templates/design/app/components/design/LocalSourceEditBanner.tsx +0 -157
  507. package/corpus/templates/design/app/lib/design-templates.ts +0 -1305
  508. package/corpus/templates/design/app/pages/Templates.tsx +0 -279
@@ -533,7 +533,7 @@ export function DocumentToolbar({
533
533
  async (pageId: string) => {
534
534
  setLinkingPageId(pageId);
535
535
  try {
536
- await linkDocument.mutateAsync({ pageIdOrUrl: pageId });
536
+ await linkDocument.mutateAsync({ documentId, pageIdOrUrl: pageId });
537
537
  toast.success(t("editor.toolbar.linkedToNotionPage"));
538
538
  setSearchQuery("");
539
539
  } catch (error) {
@@ -546,34 +546,34 @@ export function DocumentToolbar({
546
546
  setLinkingPageId(null);
547
547
  }
548
548
  },
549
- [linkDocument, t],
549
+ [documentId, linkDocument, t],
550
550
  );
551
551
 
552
552
  const handlePull = useCallback(async () => {
553
553
  try {
554
- await pullDocument.mutateAsync();
554
+ await pullDocument.mutateAsync({ documentId });
555
555
  toast.success(t("editor.toolbar.pulledFromNotion"));
556
556
  } catch (error) {
557
557
  toast.error(
558
558
  error instanceof Error ? error.message : t("editor.toolbar.pullFailed"),
559
559
  );
560
560
  }
561
- }, [pullDocument, t]);
561
+ }, [documentId, pullDocument, t]);
562
562
 
563
563
  const handlePush = useCallback(async () => {
564
564
  try {
565
- await pushDocument.mutateAsync();
565
+ await pushDocument.mutateAsync({ documentId });
566
566
  toast.success(t("editor.toolbar.pushedToNotion"));
567
567
  } catch (error) {
568
568
  toast.error(
569
569
  error instanceof Error ? error.message : t("editor.toolbar.pushFailed"),
570
570
  );
571
571
  }
572
- }, [pushDocument, t]);
572
+ }, [documentId, pushDocument, t]);
573
573
 
574
574
  const handleUnlink = useCallback(async () => {
575
575
  try {
576
- await unlinkDocument.mutateAsync();
576
+ await unlinkDocument.mutateAsync({ documentId });
577
577
  toast.success(t("editor.toolbar.unlinkedFromNotion"));
578
578
  } catch (error) {
579
579
  toast.error(
@@ -582,13 +582,13 @@ export function DocumentToolbar({
582
582
  : t("editor.toolbar.unlinkFailed"),
583
583
  );
584
584
  }
585
- }, [unlinkDocument, t]);
585
+ }, [documentId, unlinkDocument, t]);
586
586
 
587
587
  const handleCreateAndLink = useCallback(
588
588
  (parentPageIdOrUrl?: string) => {
589
589
  if (parentPageIdOrUrl) setCreatingParentPageId(parentPageIdOrUrl);
590
590
  createAndLink.mutate(
591
- parentPageIdOrUrl ? { parentPageIdOrUrl } : undefined,
591
+ { documentId, ...(parentPageIdOrUrl ? { parentPageIdOrUrl } : {}) },
592
592
  {
593
593
  onSuccess: () => {
594
594
  toast.success(t("editor.toolbar.createdAndLinkedToNotionPage"));
@@ -605,7 +605,7 @@ export function DocumentToolbar({
605
605
  },
606
606
  );
607
607
  },
608
- [createAndLink, t],
608
+ [createAndLink, documentId, t],
609
609
  );
610
610
 
611
611
  const handleSetup = () => {
@@ -34,7 +34,7 @@ export function NotionConflictBanner({
34
34
  const handleResolve = async (dir: "pull" | "push") => {
35
35
  setDirection(dir);
36
36
  try {
37
- await resolveConflict.mutateAsync({ direction: dir });
37
+ await resolveConflict.mutateAsync({ documentId, direction: dir });
38
38
  toast.success(
39
39
  dir === "pull"
40
40
  ? t("editor.notionConflictResolvedPulled")
@@ -19,6 +19,7 @@ import {
19
19
  useDocumentSyncStatus,
20
20
  useLinkDocumentToNotion,
21
21
  useNotionConnection,
22
+ openNotionOAuthUrl,
22
23
  usePullDocumentFromNotion,
23
24
  usePushDocumentToNotion,
24
25
  useResolveDocumentSyncConflict,
@@ -63,12 +64,20 @@ export function NotionSyncBar({ documentId }: NotionSyncBarProps) {
63
64
  resolveConflict.isPending ||
64
65
  disconnectNotion.isPending;
65
66
 
66
- const handleConnect = () => {
67
- if (!connection?.authUrl) {
67
+ const handleConnect = async () => {
68
+ if (connection?.error === "missing_credentials") {
68
69
  toast.error(t("editor.toolbar.setUpNotionFirst"));
69
70
  return;
70
71
  }
71
- window.location.href = connection.authUrl;
72
+ try {
73
+ window.location.href = await openNotionOAuthUrl();
74
+ } catch (error) {
75
+ toast.error(
76
+ error instanceof Error
77
+ ? error.message
78
+ : t("editor.toolbar.setUpNotionFirst"),
79
+ );
80
+ }
72
81
  };
73
82
 
74
83
  const handleLink = async () => {
@@ -77,7 +86,7 @@ export function NotionSyncBar({ documentId }: NotionSyncBarProps) {
77
86
  return;
78
87
  }
79
88
  try {
80
- await linkDocument.mutateAsync({ pageIdOrUrl });
89
+ await linkDocument.mutateAsync({ documentId, pageIdOrUrl });
81
90
  setPageIdOrUrl("");
82
91
  toast.success(t("editor.toolbar.linkedToNotion"));
83
92
  } catch (error) {
@@ -91,7 +100,7 @@ export function NotionSyncBar({ documentId }: NotionSyncBarProps) {
91
100
 
92
101
  const handlePull = async () => {
93
102
  try {
94
- await pullDocument.mutateAsync();
103
+ await pullDocument.mutateAsync({ documentId });
95
104
  toast.success(t("editor.toolbar.pulledFromNotion"));
96
105
  } catch (error) {
97
106
  toast.error(
@@ -102,7 +111,7 @@ export function NotionSyncBar({ documentId }: NotionSyncBarProps) {
102
111
 
103
112
  const handlePush = async () => {
104
113
  try {
105
- await pushDocument.mutateAsync();
114
+ await pushDocument.mutateAsync({ documentId });
106
115
  toast.success(t("editor.toolbar.pushedToNotion"));
107
116
  } catch (error) {
108
117
  toast.error(
@@ -113,7 +122,7 @@ export function NotionSyncBar({ documentId }: NotionSyncBarProps) {
113
122
 
114
123
  const handleResolve = async (direction: "pull" | "push") => {
115
124
  try {
116
- await resolveConflict.mutateAsync({ direction });
125
+ await resolveConflict.mutateAsync({ documentId, direction });
117
126
  toast.success(
118
127
  direction === "pull"
119
128
  ? t("editor.toolbar.conflictResolvedFromNotion")
@@ -130,7 +139,7 @@ export function NotionSyncBar({ documentId }: NotionSyncBarProps) {
130
139
 
131
140
  const handleUnlink = async () => {
132
141
  try {
133
- await unlinkDocument.mutateAsync();
142
+ await unlinkDocument.mutateAsync({ documentId });
134
143
  toast.success(t("editor.toolbar.unlinkedFromNotion"));
135
144
  } catch (error) {
136
145
  toast.error(
@@ -143,7 +152,7 @@ export function NotionSyncBar({ documentId }: NotionSyncBarProps) {
143
152
 
144
153
  const handleDisconnect = async () => {
145
154
  try {
146
- await disconnectNotion.mutateAsync();
155
+ await disconnectNotion.mutateAsync({});
147
156
  toast.success(t("editor.toolbar.disconnectedNotionWorkspace"));
148
157
  } catch (error) {
149
158
  toast.error(
@@ -146,8 +146,10 @@ import {
146
146
  useContentDatabase,
147
147
  useContentDatabases,
148
148
  contentDatabaseQueryKey,
149
+ useDeleteDatabaseItems,
149
150
  useDisconnectContentDatabaseSource,
150
151
  useDuplicateDatabaseItem,
152
+ useDuplicateDatabaseItems,
151
153
  useExecuteBuilderSourceExecution,
152
154
  useMoveDatabaseItem,
153
155
  usePrepareBuilderSourceReview,
@@ -2766,9 +2768,9 @@ function DatabaseTableView({
2766
2768
  }) {
2767
2769
  const queryClient = useQueryClient();
2768
2770
  const moveItem = useMoveDatabaseItem(databaseDocumentId);
2769
- const duplicateItem = useDuplicateDatabaseItem(databaseDocumentId);
2771
+ const duplicateItems = useDuplicateDatabaseItems(databaseDocumentId);
2770
2772
  const setProperty = useSetDocumentProperty(databaseDocumentId);
2771
- const deleteDocument = useDeleteDocument();
2773
+ const deleteItems = useDeleteDatabaseItems(databaseDocumentId);
2772
2774
  const [draggedItemId, setDraggedItemId] = useState<string | null>(null);
2773
2775
  const [dropTargetItemId, setDropTargetItemId] = useState<string | null>(null);
2774
2776
  const [draggedPropertyId, setDraggedPropertyId] = useState<string | null>(
@@ -3012,14 +3014,15 @@ function DatabaseTableView({
3012
3014
  async function deleteSelectedRows() {
3013
3015
  if (selectedItems.length === 0) return;
3014
3016
  const selectedSnapshot = selectedItems;
3015
- onClearSelection();
3016
3017
  setConfirmDeleteSelectedOpen(false);
3017
3018
 
3018
3019
  try {
3020
+ await deleteItems.mutateAsync({
3021
+ documentId: databaseDocumentId,
3022
+ itemIds: selectedSnapshot.map((item) => item.id),
3023
+ });
3024
+ onClearSelection();
3019
3025
  onDeletedPreviewItems(selectedSnapshot);
3020
- for (const item of selectedSnapshot) {
3021
- await deleteDocument.mutateAsync({ id: item.document.id });
3022
- }
3023
3026
  await queryClient.invalidateQueries({
3024
3027
  queryKey: [
3025
3028
  "action",
@@ -3043,22 +3046,11 @@ function DatabaseTableView({
3043
3046
  const selectedSnapshot = selectedItems;
3044
3047
  setIsDuplicatingSelected(true);
3045
3048
 
3046
- let duplicatedPreviewItem: ContentDatabaseItem | null = null;
3047
- let duplicatedCount = 0;
3048
- let failedCount = 0;
3049
-
3050
3049
  try {
3051
- for (const item of selectedSnapshot) {
3052
- try {
3053
- const response = await duplicateItem.mutateAsync({ itemId: item.id });
3054
- duplicatedCount += 1;
3055
- duplicatedPreviewItem =
3056
- databaseDuplicatedItemFromResponse(response) ??
3057
- duplicatedPreviewItem;
3058
- } catch {
3059
- failedCount += 1;
3060
- }
3061
- }
3050
+ const response = await duplicateItems.mutateAsync({
3051
+ documentId: databaseDocumentId,
3052
+ itemIds: selectedSnapshot.map((item) => item.id),
3053
+ });
3062
3054
 
3063
3055
  await queryClient.invalidateQueries({
3064
3056
  queryKey: [
@@ -3071,16 +3063,15 @@ function DatabaseTableView({
3071
3063
  queryKey: ["action", "list-documents"],
3072
3064
  });
3073
3065
 
3066
+ const duplicatedPreviewItem =
3067
+ databaseDuplicatedItemFromResponse(response);
3074
3068
  if (duplicatedPreviewItem) onPreview(duplicatedPreviewItem);
3075
- if (duplicatedCount > 0) onClearSelection();
3076
- if (failedCount > 0) {
3077
- toast.error(dbText("failedToDuplicateEverySelectedRow"), {
3078
- description:
3079
- duplicatedCount > 0
3080
- ? `${duplicatedCount} duplicated, ${failedCount} failed.`
3081
- : "No rows were duplicated.",
3082
- });
3083
- }
3069
+ onClearSelection();
3070
+ } catch (err) {
3071
+ toast.error(dbText("failedToDuplicateEverySelectedRow"), {
3072
+ description:
3073
+ err instanceof Error ? err.message : dbText("somethingWentWrong"),
3074
+ });
3084
3075
  } finally {
3085
3076
  setIsDuplicatingSelected(false);
3086
3077
  }
@@ -3139,9 +3130,11 @@ function DatabaseTableView({
3139
3130
  canEdit={canEdit}
3140
3131
  properties={bulkEditableProperties}
3141
3132
  duplicateDisabled={
3142
- isDuplicatingSelected || deleteDocument.isPending
3133
+ isDuplicatingSelected ||
3134
+ duplicateItems.isPending ||
3135
+ deleteItems.isPending
3143
3136
  }
3144
- deleteDisabled={deleteDocument.isPending}
3137
+ deleteDisabled={deleteItems.isPending}
3145
3138
  updateDisabled={setProperty.isPending}
3146
3139
  onClearSelection={onClearSelection}
3147
3140
  onSetPropertyValue={setSelectedPropertyValue}
@@ -3360,10 +3353,10 @@ function DatabaseTableView({
3360
3353
  <AlertDialogCancel>Cancel</AlertDialogCancel>
3361
3354
  <AlertDialogAction
3362
3355
  className="bg-destructive text-destructive-foreground hover:bg-destructive/90"
3363
- disabled={deleteDocument.isPending}
3356
+ disabled={deleteItems.isPending}
3364
3357
  onClick={() => void deleteSelectedRows()}
3365
3358
  >
3366
- {deleteDocument.isPending ? "Deleting..." : "Delete"}
3359
+ {deleteItems.isPending ? "Deleting..." : "Delete"}
3367
3360
  </AlertDialogAction>
3368
3361
  </AlertDialogFooter>
3369
3362
  </AlertDialogContent>
@@ -250,11 +250,17 @@ export function databaseBulkScalarInputState(
250
250
 
251
251
  export function databaseDuplicatedItemFromResponse(
252
252
  response: Pick<ContentDatabaseResponse, "items"> &
253
- Pick<Partial<ContentDatabaseResponse>, "duplicatedItemId">,
253
+ Pick<
254
+ Partial<ContentDatabaseResponse>,
255
+ "duplicatedItemId" | "duplicatedItemIds"
256
+ >,
254
257
  ) {
255
- return (
256
- response.items.find((item) => item.id === response.duplicatedItemId) ?? null
257
- );
258
+ const duplicatedItemIds = response.duplicatedItemIds ?? [];
259
+ const duplicatedItemId =
260
+ duplicatedItemIds.length > 0
261
+ ? duplicatedItemIds[duplicatedItemIds.length - 1]
262
+ : response.duplicatedItemId;
263
+ return response.items.find((item) => item.id === duplicatedItemId) ?? null;
258
264
  }
259
265
 
260
266
  export function toggleDatabaseRowSelection(
@@ -22,7 +22,11 @@ import {
22
22
  TooltipContent,
23
23
  TooltipTrigger,
24
24
  } from "@/components/ui/tooltip";
25
- import { useNotionConnection, useDisconnectNotion } from "@/hooks/use-notion";
25
+ import {
26
+ openNotionOAuthUrl,
27
+ useDisconnectNotion,
28
+ useNotionConnection,
29
+ } from "@/hooks/use-notion";
26
30
  import { cn } from "@/lib/utils";
27
31
 
28
32
  // ─── Notion SVG icon ────────────────────────────────────────────────────────
@@ -125,8 +129,8 @@ export function NotionButton() {
125
129
  };
126
130
  }, []);
127
131
 
128
- function handleConnect() {
129
- if (!connection?.authUrl) {
132
+ async function handleConnect() {
133
+ if (connection?.error === "missing_credentials") {
130
134
  if (needsCredentials) {
131
135
  setShowWizard(true);
132
136
  return;
@@ -134,7 +138,24 @@ export function NotionButton() {
134
138
  toast.error(t("sidebar.notionOAuthNotConfigured"));
135
139
  return;
136
140
  }
137
- window.open(connection.authUrl, "_blank");
141
+ const popup = window.open("about:blank", "_blank");
142
+ if (!popup) {
143
+ toast.error(t("sidebar.notionOAuthNotConfigured"));
144
+ return;
145
+ }
146
+ popup.opener = null;
147
+
148
+ try {
149
+ popup.location.href = await openNotionOAuthUrl();
150
+ } catch (error) {
151
+ popup.close();
152
+ toast.error(
153
+ error instanceof Error
154
+ ? error.message
155
+ : t("sidebar.notionOAuthNotConfigured"),
156
+ );
157
+ return;
158
+ }
138
159
 
139
160
  // Clear any existing poll before starting a new one
140
161
  if (pollRef.current) clearInterval(pollRef.current);
@@ -142,18 +163,12 @@ export function NotionButton() {
142
163
 
143
164
  // Poll for connection
144
165
  pollRef.current = setInterval(async () => {
145
- const res = await fetch(appApiPath("/api/notion/status")).catch(
146
- () => null,
147
- );
148
- if (res?.ok) {
149
- const data = await res.json();
150
- if (data.connected) {
151
- clearInterval(pollRef.current);
152
- pollRef.current = undefined;
153
- setShowWizard(false);
154
- setOpen(false);
155
- refetch();
156
- }
166
+ const result = await refetch();
167
+ if (result.data?.connected) {
168
+ clearInterval(pollRef.current);
169
+ pollRef.current = undefined;
170
+ setShowWizard(false);
171
+ setOpen(false);
157
172
  }
158
173
  }, 2000);
159
174
 
@@ -166,7 +181,7 @@ export function NotionButton() {
166
181
 
167
182
  async function handleDisconnect() {
168
183
  try {
169
- await disconnectNotion.mutateAsync();
184
+ await disconnectNotion.mutateAsync({});
170
185
  toast.success(t("sidebar.notionDisconnectedWorkspace"));
171
186
  } catch (err) {
172
187
  toast.error(
@@ -1537,10 +1537,10 @@ audio.media-block__content {
1537
1537
  flex-direction: column;
1538
1538
  gap: 0.18rem;
1539
1539
  max-width: 22rem;
1540
- border: 0;
1540
+ border: 1px solid hsl(var(--border));
1541
1541
  border-radius: 8px;
1542
- background: hsl(0 0% 15%);
1543
- color: white;
1542
+ background: hsl(var(--popover));
1543
+ color: hsl(var(--popover-foreground));
1544
1544
  padding: 0.6rem 0.75rem;
1545
1545
  box-shadow: 0 10px 24px hsl(0 0% 0% / 0.22);
1546
1546
  }
@@ -2218,12 +2218,13 @@ audio.media-block__content {
2218
2218
  .bubble-toolbar {
2219
2219
  display: flex;
2220
2220
  align-items: center;
2221
- background: hsl(0 0% 15%);
2221
+ background: hsl(var(--popover));
2222
+ color: hsl(var(--popover-foreground));
2222
2223
  border-radius: 8px;
2223
2224
  padding: 4px;
2224
2225
  box-shadow:
2225
2226
  0 4px 20px rgb(0 0 0 / 0.25),
2226
- 0 0 0 1px rgb(255 255 255 / 0.06);
2227
+ 0 0 0 1px hsl(var(--border));
2227
2228
  }
2228
2229
 
2229
2230
  /* ===== Inline comment highlights ===== */
@@ -13,6 +13,7 @@ import type {
13
13
  ContentDatabaseSourceFieldPropertyResponse,
14
14
  ContentDatabaseSourceStatusResponse,
15
15
  CreateDatabaseRequest,
16
+ DatabaseItemsBatchRequest,
16
17
  DisconnectContentDatabaseSourceRequest,
17
18
  ExecuteBuilderSourceBatchRequest,
18
19
  ExecuteBuilderSourceBatchResponse,
@@ -258,6 +259,40 @@ export function useDuplicateDatabaseItem(documentId: string) {
258
259
  });
259
260
  }
260
261
 
262
+ export function useDuplicateDatabaseItems(documentId: string) {
263
+ const queryClient = useQueryClient();
264
+ return useActionMutation<ContentDatabaseResponse, DatabaseItemsBatchRequest>(
265
+ "duplicate-database-items",
266
+ {
267
+ onSuccess: () => {
268
+ queryClient.invalidateQueries({
269
+ queryKey: contentDatabaseQueryKey(documentId),
270
+ });
271
+ queryClient.invalidateQueries({
272
+ queryKey: ["action", "list-documents"],
273
+ });
274
+ },
275
+ },
276
+ );
277
+ }
278
+
279
+ export function useDeleteDatabaseItems(documentId: string) {
280
+ const queryClient = useQueryClient();
281
+ return useActionMutation<ContentDatabaseResponse, DatabaseItemsBatchRequest>(
282
+ "delete-database-items",
283
+ {
284
+ onSuccess: () => {
285
+ queryClient.invalidateQueries({
286
+ queryKey: contentDatabaseQueryKey(documentId),
287
+ });
288
+ queryClient.invalidateQueries({
289
+ queryKey: ["action", "list-documents"],
290
+ });
291
+ },
292
+ },
293
+ );
294
+ }
295
+
261
296
  export function useMoveDatabaseItem(documentId: string) {
262
297
  const queryClient = useQueryClient();
263
298
  return useActionMutation<ContentDatabaseResponse, MoveDatabaseItemRequest>(