@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
@@ -188,7 +188,6 @@ export interface BuilderConnectFlow {
188
188
 
189
189
  const POLL_INTERVAL_MS = 2000;
190
190
  const POLL_TIMEOUT_MS = 5 * 60 * 1000;
191
- const POPUP_CLOSED_CONFIRMATION_GRACE_MS = 5000;
192
191
  const CALLBACK_SUCCESS_STATUS_RETRY_MS = 500;
193
192
  const CALLBACK_SUCCESS_STATUS_RETRIES = 10;
194
193
  const BUILDER_CONNECT_PARAM = "_an_connect";
@@ -447,15 +446,6 @@ function delay(ms: number): Promise<void> {
447
446
  return new Promise((resolve) => setTimeout(resolve, ms));
448
447
  }
449
448
 
450
- function isPopupClosed(opened: Window | null): boolean {
451
- if (!opened) return false;
452
- try {
453
- return opened.closed === true;
454
- } catch {
455
- return false;
456
- }
457
- }
458
-
459
449
  function isTrustedBuilderConnectMessageOrigin(origin: string): boolean {
460
450
  if (typeof window !== "undefined" && origin === window.location.origin) {
461
451
  return true;
@@ -693,8 +683,6 @@ export function useBuilderConnectFlow(
693
683
  const clickTrackingSource =
694
684
  startOptions?.trackingSource ?? trackingSource;
695
685
  const clickTrackingFlow = startOptions?.trackingFlow ?? trackingFlow;
696
- let openedPopup: Window | null = null;
697
- let popupClosedAt: number | null = null;
698
686
  connectStartedAtRef.current = started;
699
687
  setConnecting(true);
700
688
  setError(null);
@@ -730,7 +718,6 @@ export function useBuilderConnectFlow(
730
718
  source: clickTrackingSource,
731
719
  flow: clickTrackingFlow,
732
720
  });
733
- openedPopup = opened;
734
721
  if (!opened) {
735
722
  // Agent Native Desktop handles the popup in Electron and reports
736
723
  // null to the embedded webview, so null is not a blocker here.
@@ -783,7 +770,6 @@ export function useBuilderConnectFlow(
783
770
  );
784
771
  })();
785
772
  } else {
786
- openedPopup = opened;
787
773
  showBuilderConnectPopupPlaceholder(opened);
788
774
  void (async () => {
789
775
  const s = await fetchStatus();
@@ -884,25 +870,6 @@ export function useBuilderConnectFlow(
884
870
  setError(
885
871
  `Couldn't save Builder credentials: ${s.connectError.message}. Try again or contact support.`,
886
872
  );
887
- } else if (isPopupClosed(openedPopup)) {
888
- popupClosedAt ??= Date.now();
889
- if (Date.now() - popupClosedAt > POPUP_CLOSED_CONFIRMATION_GRACE_MS) {
890
- stopPoll();
891
- connectStartedAtRef.current = null;
892
- setConnecting(false);
893
- trackEvent("builder connect failed", {
894
- feature: "builder",
895
- stage: "client",
896
- reason: "popup_closed_without_status",
897
- source: clickTrackingSource,
898
- flow:
899
- cleanTrackingParam(clickTrackingFlow) ??
900
- inferBuilderConnectTrackingFlow(clickTrackingSource),
901
- });
902
- setError(
903
- "Builder finished, but this workspace couldn't confirm the saved credentials. Refresh this page or try Connect Builder.io again.",
904
- );
905
- }
906
873
  } else if (Date.now() - started > POLL_TIMEOUT_MS) {
907
874
  stopPoll();
908
875
  connectStartedAtRef.current = null;
@@ -972,7 +939,6 @@ export function useBuilderConnectFlow(
972
939
  )
973
940
  ? s?.connectError
974
941
  : null;
975
- stopPoll();
976
942
  setHasFetchedStatus(true);
977
943
  if (s) {
978
944
  setConfigured(false);
@@ -983,13 +949,14 @@ export function useBuilderConnectFlow(
983
949
  statusConnectUrlAtRef.current = nextConnectUrl ? Date.now() : null;
984
950
  setOrgName(s.orgName ?? null);
985
951
  }
986
- connectStartedAtRef.current = null;
987
- setConnecting(false);
988
- setError(
989
- connectError
990
- ? `Couldn't save Builder credentials: ${connectError.message}. Try again or contact support.`
991
- : "Builder finished, but this workspace couldn't confirm the saved credentials. Refresh this page or try Connect Builder.io again.",
992
- );
952
+ if (connectError) {
953
+ stopPoll();
954
+ connectStartedAtRef.current = null;
955
+ setConnecting(false);
956
+ setError(
957
+ `Couldn't save Builder credentials: ${connectError.message}. Try again or contact support.`,
958
+ );
959
+ }
993
960
  return;
994
961
  }
995
962
  stopPoll();
@@ -1,6 +1,10 @@
1
1
  import { useState, useCallback, useRef } from "react";
2
2
 
3
- import type { AgentMessage, AgentChatEvent } from "../agent/types.js";
3
+ import type {
4
+ AgentMessage,
5
+ AgentChatEvent,
6
+ AgentToolInput,
7
+ } from "../agent/types.js";
4
8
  import { agentNativePath } from "./api-path.js";
5
9
  import { formatChatErrorText } from "./error-format.js";
6
10
 
@@ -10,7 +14,7 @@ export interface ProductionAgentMessage {
10
14
  content: string;
11
15
  toolCalls?: Array<{
12
16
  tool: string;
13
- input: Record<string, string>;
17
+ input: AgentToolInput;
14
18
  result?: string;
15
19
  }>;
16
20
  }
@@ -1135,7 +1135,7 @@ async function getHandler() {
1135
1135
  headers: {
1136
1136
  "Access-Control-Allow-Origin": "*",
1137
1137
  "Access-Control-Allow-Methods": "GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS",
1138
- "Access-Control-Allow-Headers": "Content-Type,Authorization,X-Requested-With,X-Request-Source,X-Agent-Native-CSRF,X-Agent-Native-Embed-Target",
1138
+ "Access-Control-Allow-Headers": "Content-Type,Authorization,X-Requested-With,X-Request-Source,X-Agent-Native-CSRF,X-User-Timezone,X-Agent-Native-Tool-Bridge,X-Agent-Native-Tool-Id,X-Agent-Native-Frontend,X-Agent-Native-Embed-Target",
1139
1139
  },
1140
1140
  });
1141
1141
  }
@@ -1,5 +1,5 @@
1
1
  import type { AgentLoopUsage } from "../agent/production-agent.js";
2
- import type { AgentChatEvent } from "../agent/types.js";
2
+ import type { AgentChatEvent, AgentToolInput } from "../agent/types.js";
3
3
  import { type AgentSpan, endAgentSpan, startAgentSpan } from "./tracing.js";
4
4
  import type { TraceSpan, TraceSummary, ObservabilityConfig } from "./types.js";
5
5
  import { DEFAULT_OBSERVABILITY_CONFIG } from "./types.js";
@@ -115,7 +115,7 @@ export async function instrumentAgentLoop(opts: {
115
115
  spanId: string;
116
116
  startMs: number;
117
117
  toolName: string;
118
- input: Record<string, string>;
118
+ input: AgentToolInput;
119
119
  otelSpan: AgentSpan | null;
120
120
  endResult?: { status: "success" | "error"; errorMessage: string | null };
121
121
  }
@@ -148,7 +148,7 @@ export async function instrumentAgentLoop(opts: {
148
148
  spanId: string;
149
149
  startMs: number;
150
150
  toolName: string;
151
- input: Record<string, string>;
151
+ input: AgentToolInput;
152
152
  otelSpan: AgentSpan | null;
153
153
  // Set by the done handler if it fires before the span promise
154
154
  // resolves, so the resolved span is ended with the correct status.
@@ -54,7 +54,7 @@ const LLM_KEY_METHODS: LlmKeyMethod[] = [
54
54
  provider: "openrouter",
55
55
  id: "openrouter-key",
56
56
  label: "OpenRouter",
57
- description: "OpenRouter models with your own OpenRouter key.",
57
+ description: "OpenRouter models, including GLM 5.2, with your own key.",
58
58
  },
59
59
  {
60
60
  provider: "groq",
@@ -54,7 +54,7 @@ export const tool: ActionTool = {
54
54
  model: {
55
55
  type: "string",
56
56
  description:
57
- "Model ID (e.g. 'gpt-5.5', 'claude-sonnet-4-6', 'gemini-3-1-pro'). Required for \"set-app-default\"; optional for \"set\" and \"test\" where it defaults to the engine's default model.",
57
+ "Model ID (e.g. 'gpt-5.5', 'claude-sonnet-5', 'gemini-3-1-pro'). Required for \"set-app-default\"; optional for \"set\" and \"test\" where it defaults to the engine's default model.",
58
58
  },
59
59
  baseUrl: {
60
60
  type: "string",
@@ -27,7 +27,7 @@ export const tool: ActionTool = {
27
27
  model: {
28
28
  type: "string",
29
29
  description:
30
- "Model ID to use with this engine (e.g. 'gpt-5.5', 'claude-sonnet-4-6'). Defaults to the engine's default model if omitted.",
30
+ "Model ID to use with this engine (e.g. 'gpt-5.5', 'claude-sonnet-5'). Defaults to the engine's default model if omitted.",
31
31
  },
32
32
  },
33
33
  required: ["engine"],
@@ -3789,6 +3789,81 @@ export function shouldBlockInProductCodeEditingSurface(input: {
3789
3789
  );
3790
3790
  }
3791
3791
 
3792
+ type RecurringJobsRuntimeEnvKey =
3793
+ | "AGENT_NATIVE_DISABLE_RECURRING_JOBS"
3794
+ | "AGENT_NATIVE_ENABLE_LOCAL_RECURRING_JOBS"
3795
+ | "APP_URL"
3796
+ | "BETTER_AUTH_URL"
3797
+ | "DEPLOY_URL"
3798
+ | "NODE_ENV"
3799
+ | "URL"
3800
+ | "VITE_APP_URL"
3801
+ | "VITE_WORKSPACE_GATEWAY_URL"
3802
+ | "WORKSPACE_GATEWAY_URL";
3803
+
3804
+ type RecurringJobsRuntimeEnv = Partial<
3805
+ Record<RecurringJobsRuntimeEnvKey, string | undefined>
3806
+ >;
3807
+
3808
+ function isTruthyEnv(value: string | undefined): boolean {
3809
+ return /^(1|true|yes|on)$/i.test(value?.trim() ?? "");
3810
+ }
3811
+
3812
+ function isLoopbackAppUrl(value: string | undefined): boolean {
3813
+ const raw = value?.trim();
3814
+ if (!raw) return false;
3815
+
3816
+ const candidates = /^[a-z][a-z0-9+.-]*:\/\//i.test(raw)
3817
+ ? [raw]
3818
+ : [raw, `http://${raw}`];
3819
+ for (const candidate of candidates) {
3820
+ try {
3821
+ const url = new URL(candidate);
3822
+ const host = url.hostname.toLowerCase().replace(/^\[|\]$/g, "");
3823
+ if (
3824
+ host === "localhost" ||
3825
+ host === "127.0.0.1" ||
3826
+ host === "0.0.0.0" ||
3827
+ host === "::1" ||
3828
+ host === "tauri.localhost" ||
3829
+ host.endsWith(".localhost")
3830
+ ) {
3831
+ return true;
3832
+ }
3833
+ } catch {}
3834
+ }
3835
+
3836
+ return false;
3837
+ }
3838
+
3839
+ export function shouldDisableRecurringJobsRuntime(
3840
+ env: RecurringJobsRuntimeEnv = process.env,
3841
+ ): boolean {
3842
+ if (isTruthyEnv(env.AGENT_NATIVE_DISABLE_RECURRING_JOBS)) return true;
3843
+
3844
+ const isLocalRuntime =
3845
+ env.NODE_ENV === "development" ||
3846
+ env.NODE_ENV === "test" ||
3847
+ [
3848
+ env.APP_URL,
3849
+ env.BETTER_AUTH_URL,
3850
+ env.DEPLOY_URL,
3851
+ env.URL,
3852
+ env.VITE_APP_URL,
3853
+ env.VITE_WORKSPACE_GATEWAY_URL,
3854
+ env.WORKSPACE_GATEWAY_URL,
3855
+ ].some(isLoopbackAppUrl);
3856
+
3857
+ if (
3858
+ isLocalRuntime &&
3859
+ isTruthyEnv(env.AGENT_NATIVE_ENABLE_LOCAL_RECURRING_JOBS)
3860
+ ) {
3861
+ return false;
3862
+ }
3863
+
3864
+ return isLocalRuntime;
3865
+ }
3866
+
3792
3867
  export function createAgentChatPlugin(
3793
3868
  options?: AgentChatPluginOptions,
3794
3869
  ): NitroPluginDef {
@@ -7994,56 +8069,69 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
7994
8069
  }),
7995
8070
  );
7996
8071
 
8072
+ const disableRecurringJobsRuntime = shouldDisableRecurringJobsRuntime();
8073
+
7997
8074
  // ─── Recurring Jobs Scheduler ──────────────────────────────────────
7998
8075
  // Poll every 60 seconds for due recurring jobs and execute them.
7999
8076
  // Uses setInterval so it works in all deployment environments without
8000
8077
  // requiring Nitro experimental tasks configuration.
8001
- try {
8002
- const { processRecurringJobs } = await import("../jobs/scheduler.js");
8078
+ if (disableRecurringJobsRuntime) {
8079
+ if (process.env.DEBUG) {
8080
+ console.log(
8081
+ "[recurring-jobs] Scheduler disabled for local development",
8082
+ );
8083
+ }
8084
+ } else {
8085
+ try {
8086
+ const { processRecurringJobs } = await import("../jobs/scheduler.js");
8003
8087
 
8004
- const schedulerDeps = {
8005
- getActions: () => ({
8006
- ...templateScripts,
8007
- ...resourceScripts,
8008
- ...docsScripts,
8009
- ...(lazyContext ? frameworkContextTool : {}),
8010
- ...chatScripts,
8011
- ...jobTools,
8012
- ...automationTools,
8013
- ...notificationTools,
8014
- ...progressTools,
8015
- ...fetchTool,
8016
- ...webSearchTool,
8017
- ...toolActions,
8018
- }),
8019
- getSystemPrompt: async (owner: string) => {
8020
- const resources = await loadResourcesForPrompt(
8021
- owner,
8022
- lazyContext,
8023
- options?.appId,
8024
- );
8025
- const schemaBlock = lazyContext
8026
- ? ""
8027
- : await buildSchemaBlock(owner, databaseToolsMode);
8028
- return basePrompt + resources + schemaBlock;
8029
- },
8030
- apiKey: options?.apiKey,
8031
- model: options?.model,
8032
- appId: options?.appId,
8033
- };
8088
+ const schedulerDeps = {
8089
+ getActions: () => ({
8090
+ ...templateScripts,
8091
+ ...resourceScripts,
8092
+ ...docsScripts,
8093
+ ...(lazyContext ? frameworkContextTool : {}),
8094
+ ...chatScripts,
8095
+ ...jobTools,
8096
+ ...automationTools,
8097
+ ...notificationTools,
8098
+ ...progressTools,
8099
+ ...fetchTool,
8100
+ ...webSearchTool,
8101
+ ...toolActions,
8102
+ }),
8103
+ getSystemPrompt: async (owner: string) => {
8104
+ const resources = await loadResourcesForPrompt(
8105
+ owner,
8106
+ lazyContext,
8107
+ options?.appId,
8108
+ );
8109
+ const schemaBlock = lazyContext
8110
+ ? ""
8111
+ : await buildSchemaBlock(owner, databaseToolsMode);
8112
+ return basePrompt + resources + schemaBlock;
8113
+ },
8114
+ apiKey: options?.apiKey,
8115
+ model: options?.model,
8116
+ appId: options?.appId,
8117
+ };
8034
8118
 
8035
- // Start after a 10-second delay to let the server fully initialize
8036
- setTimeout(() => {
8037
- setInterval(() => {
8038
- processRecurringJobs(schedulerDeps).catch((err) => {
8039
- console.error("[recurring-jobs] Scheduler error:", err?.message);
8040
- });
8041
- }, 60_000);
8042
- if (process.env.DEBUG)
8043
- console.log("[recurring-jobs] Scheduler started (60s interval)");
8044
- }, 10_000);
8045
- } catch (err) {
8046
- // Jobs module not available — skip silently
8119
+ // Start after a 10-second delay to let the server fully initialize
8120
+ setTimeout(() => {
8121
+ setInterval(() => {
8122
+ processRecurringJobs(schedulerDeps).catch((err) => {
8123
+ console.error(
8124
+ "[recurring-jobs] Scheduler error:",
8125
+ err?.message,
8126
+ );
8127
+ });
8128
+ }, 60_000);
8129
+ if (process.env.DEBUG)
8130
+ console.log("[recurring-jobs] Scheduler started (60s interval)");
8131
+ }, 10_000);
8132
+ } catch (err) {
8133
+ // Jobs module not available — skip silently
8134
+ }
8047
8135
  }
8048
8136
 
8049
8137
  // ─── Agent Teams orphan sweep ─────────────────────────────────────
@@ -8097,43 +8185,51 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
8097
8185
  })();
8098
8186
 
8099
8187
  // ─── Trigger Dispatcher (event-based automations) ─────────────────
8100
- try {
8101
- const { initTriggerDispatcher } =
8102
- await import("../triggers/dispatcher.js");
8103
- await initTriggerDispatcher({
8104
- getActions: () => ({
8105
- ...templateScripts,
8106
- ...resourceScripts,
8107
- ...docsScripts,
8108
- ...(lazyContext ? frameworkContextTool : {}),
8109
- ...chatScripts,
8110
- ...jobTools,
8111
- ...automationTools,
8112
- ...notificationTools,
8113
- ...progressTools,
8114
- ...fetchTool,
8115
- ...webSearchTool,
8116
- ...toolActions,
8117
- }),
8118
- getSystemPrompt: async (owner: string) => {
8119
- const resources = await loadResourcesForPrompt(
8120
- owner,
8121
- lazyContext,
8122
- options?.appId,
8123
- );
8124
- const schemaBlock = lazyContext
8125
- ? ""
8126
- : await buildSchemaBlock(owner, databaseToolsMode);
8127
- return basePrompt + resources + schemaBlock;
8128
- },
8129
- apiKey: options?.apiKey,
8130
- model: options?.model,
8131
- appId: options?.appId,
8132
- });
8133
- if (process.env.DEBUG)
8134
- console.log("[triggers] Trigger dispatcher initialized");
8135
- } catch (err) {
8136
- // Triggers module not available — skip silently
8188
+ if (disableRecurringJobsRuntime) {
8189
+ if (process.env.DEBUG) {
8190
+ console.log(
8191
+ "[triggers] Trigger dispatcher disabled for local development",
8192
+ );
8193
+ }
8194
+ } else {
8195
+ try {
8196
+ const { initTriggerDispatcher } =
8197
+ await import("../triggers/dispatcher.js");
8198
+ await initTriggerDispatcher({
8199
+ getActions: () => ({
8200
+ ...templateScripts,
8201
+ ...resourceScripts,
8202
+ ...docsScripts,
8203
+ ...(lazyContext ? frameworkContextTool : {}),
8204
+ ...chatScripts,
8205
+ ...jobTools,
8206
+ ...automationTools,
8207
+ ...notificationTools,
8208
+ ...progressTools,
8209
+ ...fetchTool,
8210
+ ...webSearchTool,
8211
+ ...toolActions,
8212
+ }),
8213
+ getSystemPrompt: async (owner: string) => {
8214
+ const resources = await loadResourcesForPrompt(
8215
+ owner,
8216
+ lazyContext,
8217
+ options?.appId,
8218
+ );
8219
+ const schemaBlock = lazyContext
8220
+ ? ""
8221
+ : await buildSchemaBlock(owner, databaseToolsMode);
8222
+ return basePrompt + resources + schemaBlock;
8223
+ },
8224
+ apiKey: options?.apiKey,
8225
+ model: options?.model,
8226
+ appId: options?.appId,
8227
+ });
8228
+ if (process.env.DEBUG)
8229
+ console.log("[triggers] Trigger dispatcher initialized");
8230
+ } catch (err) {
8231
+ // Triggers module not available — skip silently
8232
+ }
8137
8233
  }
8138
8234
  })().catch((err) => {
8139
8235
  // If the init fails, the routes never get registered and requests
@@ -715,6 +715,9 @@ export interface CoreRoutesPluginOptions {
715
715
  /** Per-template override mapping deep-link params → client SPA path.
716
716
  * See `createOpenRouteHandler`. */
717
717
  resolveOpenPath?: import("./open-route.js").OpenRouteOptions["resolveOpenPath"];
718
+ /** Per-template allowlist for open-route targets that may redirect without
719
+ * a browser session. See `createOpenRouteHandler`. */
720
+ allowUnauthenticatedOpen?: import("./open-route.js").OpenRouteOptions["allowUnauthenticatedOpen"];
718
721
  /** Env key configuration. Enables env-status and env-vars routes. */
719
722
  envKeys?: EnvKeyConfig[];
720
723
  /**
@@ -3196,7 +3199,10 @@ export function createCoreRoutesPlugin(
3196
3199
  // guard bypasses this exact path so it can serve its own login form.
3197
3200
  getH3App(nitroApp).use(
3198
3201
  `${P}/open`,
3199
- createOpenRouteHandler({ resolveOpenPath: options.resolveOpenPath }),
3202
+ createOpenRouteHandler({
3203
+ resolveOpenPath: options.resolveOpenPath,
3204
+ allowUnauthenticatedOpen: options.allowUnauthenticatedOpen,
3205
+ }),
3200
3206
  );
3201
3207
  }
3202
3208
 
@@ -73,6 +73,15 @@ export interface OpenRouteOptions {
73
73
  view?: string;
74
74
  params: Record<string, string>;
75
75
  }) => string | null | undefined;
76
+ /** Per-template escape hatch for public deep-link targets. Return true only
77
+ * when the resolved SPA target is safe to show without a session. The open
78
+ * route will redirect without writing application state. */
79
+ allowUnauthenticatedOpen?: (params: {
80
+ app?: string;
81
+ view?: string;
82
+ params: Record<string, string>;
83
+ target: string;
84
+ }) => boolean | Promise<boolean>;
76
85
  }
77
86
 
78
87
  function getRequestUrl(event: H3Event): string {
@@ -180,11 +189,60 @@ export function createOpenRouteHandler(options: OpenRouteOptions = {}) {
180
189
  const toParam = search.get("to") ?? undefined;
181
190
  const compose = search.get("compose") ?? undefined;
182
191
 
192
+ // Build the navigation payload from every non-reserved query param
193
+ // (record ids + filters: threadId, eventId, dashboardId, f_*, ...).
194
+ const navParams: Record<string, string> = {};
195
+ for (const [k, v] of search.entries()) {
196
+ if (RESERVED.has(k)) continue;
197
+ navParams[k] = v;
198
+ }
199
+ const navPayload: Record<string, unknown> = { ...navParams };
200
+ if (view) navPayload.view = view;
201
+
202
+ // Resolve the SPA path to redirect to.
203
+ let target =
204
+ safeRelativePath(toParam) ??
205
+ safeRelativePath(
206
+ options.resolveOpenPath?.({ app, view, params: navParams }) ??
207
+ (view ? `/${view}` : null),
208
+ ) ??
209
+ "/";
210
+
211
+ // Forward filter params (f_*) onto the redirect so dashboards/lists open
212
+ // pre-filtered even before the navigate command is drained.
213
+ const filters = new URLSearchParams();
214
+ for (const [k, v] of search.entries()) {
215
+ if (k.startsWith("f_")) filters.set(k, v);
216
+ }
217
+ target = appendSearchParams(target, filters);
218
+ const embedParams = new URLSearchParams();
219
+ for (const key of [
220
+ EMBED_MODE_QUERY_PARAM,
221
+ EMBED_TOKEN_QUERY_PARAM,
222
+ MCP_APP_CHAT_BRIDGE_QUERY_PARAM,
223
+ ]) {
224
+ const value = search.get(key);
225
+ if (value) embedParams.set(key, value);
226
+ }
227
+ target = appendSearchParams(target, embedParams);
228
+ target = withCollapsedAgentSidebarParam(target);
229
+ target = withConfiguredRedirectBasePath(target);
230
+
183
231
  // Resolve the BROWSER session. When unauthenticated, serve the same login
184
232
  // form the guard would — at this URL — so the post-login reload returns
185
- // here authenticated.
233
+ // here authenticated. Public templates may opt specific deep-link targets
234
+ // into anonymous redirect; no app-state writes happen without a session.
186
235
  const session = await getSession(event);
187
236
  if (!session?.email) {
237
+ const allowAnonymous = await options.allowUnauthenticatedOpen?.({
238
+ app,
239
+ view,
240
+ params: navParams,
241
+ target,
242
+ });
243
+ if (allowAnonymous) {
244
+ return redirect(event, target, requestHasEmbedAuthMarker(event));
245
+ }
188
246
  const html = getConfiguredLoginHtml(event);
189
247
  if (html) {
190
248
  return new Response(html, {
@@ -196,16 +254,6 @@ export function createOpenRouteHandler(options: OpenRouteOptions = {}) {
196
254
  // the user to the view; nothing to scope the navigate write to.
197
255
  }
198
256
 
199
- // Build the navigation payload from every non-reserved query param
200
- // (record ids + filters: threadId, eventId, dashboardId, f_*, ...).
201
- const navParams: Record<string, string> = {};
202
- for (const [k, v] of search.entries()) {
203
- if (RESERVED.has(k)) continue;
204
- navParams[k] = v;
205
- }
206
- const navPayload: Record<string, unknown> = { ...navParams };
207
- if (view) navPayload.view = view;
208
-
209
257
  if (session?.email) {
210
258
  try {
211
259
  await appStatePut(session.email, "navigate", navPayload, {
@@ -258,35 +306,6 @@ export function createOpenRouteHandler(options: OpenRouteOptions = {}) {
258
306
  }
259
307
  }
260
308
 
261
- // Resolve the SPA path to redirect to.
262
- let target =
263
- safeRelativePath(toParam) ??
264
- safeRelativePath(
265
- options.resolveOpenPath?.({ app, view, params: navParams }) ??
266
- (view ? `/${view}` : null),
267
- ) ??
268
- "/";
269
-
270
- // Forward filter params (f_*) onto the redirect so dashboards/lists open
271
- // pre-filtered even before the navigate command is drained.
272
- const filters = new URLSearchParams();
273
- for (const [k, v] of search.entries()) {
274
- if (k.startsWith("f_")) filters.set(k, v);
275
- }
276
- target = appendSearchParams(target, filters);
277
- const embedParams = new URLSearchParams();
278
- for (const key of [
279
- EMBED_MODE_QUERY_PARAM,
280
- EMBED_TOKEN_QUERY_PARAM,
281
- MCP_APP_CHAT_BRIDGE_QUERY_PARAM,
282
- ]) {
283
- const value = search.get(key);
284
- if (value) embedParams.set(key, value);
285
- }
286
- target = appendSearchParams(target, embedParams);
287
- target = withCollapsedAgentSidebarParam(target);
288
- target = withConfiguredRedirectBasePath(target);
289
-
290
309
  return redirect(event, target, requestHasEmbedAuthMarker(event));
291
310
  });
292
311
  }
@@ -113,6 +113,8 @@ function supportsClaudeXHigh(model: string) {
113
113
  // silently falling back to the lower "high" tier.
114
114
  // claude-fable-5 is a Mythos-class model and also supports xhigh.
115
115
  if (model.includes("fable-5")) return true;
116
+ // Sonnet 5 supports the expanded effort ladder through Builder/Anthropic.
117
+ if (model.includes("sonnet-5")) return true;
116
118
  // opus-4-7 introduced xhigh; all opus-4.x successors (4-8, 4-9…) should too.
117
119
  const opusMatch = model.match(/opus-4-(\d+)/);
118
120
  if (opusMatch) {