@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
@@ -12,12 +12,13 @@ export function MissingKeyCard({
12
12
  return (
13
13
  <div
14
14
  style={{
15
- border: "1px solid #e2e8f0",
15
+ border: "1px solid hsl(var(--border))",
16
16
  borderRadius: 8,
17
17
  padding: "24px 28px",
18
18
  maxWidth: 420,
19
19
  margin: "32px auto",
20
- background: "#f8fafc",
20
+ background: "hsl(var(--card))",
21
+ color: "hsl(var(--card-foreground))",
21
22
  textAlign: "center",
22
23
  }}
23
24
  >
@@ -25,13 +26,19 @@ export function MissingKeyCard({
25
26
  style={{
26
27
  fontSize: 14,
27
28
  fontWeight: 600,
28
- color: "#334155",
29
+ color: "hsl(var(--card-foreground))",
29
30
  marginBottom: 8,
30
31
  }}
31
32
  >
32
33
  {label}
33
34
  </div>
34
- <p style={{ fontSize: 13, color: "#64748b", margin: "0 0 16px" }}>
35
+ <p
36
+ style={{
37
+ fontSize: 13,
38
+ color: "hsl(var(--muted-foreground))",
39
+ margin: "0 0 16px",
40
+ }}
41
+ >
35
42
  {message}
36
43
  </p>
37
44
  <a
@@ -41,8 +48,8 @@ export function MissingKeyCard({
41
48
  padding: "8px 16px",
42
49
  fontSize: 13,
43
50
  fontWeight: 500,
44
- color: "#fff",
45
- background: "#3b82f6",
51
+ color: "hsl(var(--primary-foreground))",
52
+ background: "hsl(var(--primary))",
46
53
  borderRadius: 6,
47
54
  textDecoration: "none",
48
55
  }}
@@ -750,6 +750,7 @@ const FRIENDLY_MODEL_NAMES: Record<string, string> = {
750
750
  "qwen3-coder": "Qwen3 Coder",
751
751
  "kimi-k2-5": "Kimi K2.5",
752
752
  "deepseek-v3-1": "DeepSeek v3.1",
753
+ "z-ai/glm-5.2": "GLM 5.2",
753
754
  };
754
755
 
755
756
  export const MODEL_SELECTOR_POPOVER_STYLE = {
@@ -759,13 +760,13 @@ export const MODEL_SELECTOR_POPOVER_STYLE = {
759
760
 
760
761
  function friendlyModelName(model: string): string {
761
762
  if (FRIENDLY_MODEL_NAMES[model]) return FRIENDLY_MODEL_NAMES[model];
762
- // Claude: claude-{tier}-{major}-{minor}[-dateYYYYMMDD] → Tier Major.Minor
763
+ // Claude: claude-{tier}-{major}[-minor][-dateYYYYMMDD] → Tier Major[.Minor]
763
764
  const claude = model.match(
764
- /^claude-(opus|sonnet|haiku)-(\d+)-(\d+)(?:-\d{8,})?$/,
765
+ /^claude-(opus|sonnet|haiku)-(\d+)(?:-(\d+))?(?:-\d{8,})?$/,
765
766
  );
766
767
  if (claude) {
767
768
  const tier = claude[1][0].toUpperCase() + claude[1].slice(1);
768
- return `${tier} ${claude[2]}.${claude[3]}`;
769
+ return `${tier} ${claude[2]}${claude[3] ? `.${claude[3]}` : ""}`;
769
770
  }
770
771
  // GPT: gpt-{major}-{minor}[-suffix] or gpt-{major}.{minor}[-suffix]
771
772
  if (model.startsWith("gpt-")) {
@@ -596,7 +596,6 @@ function ExtensionSortMenu({
596
596
  <DropdownMenuRadioItem value="alphabetical">
597
597
  {copy.alphabetical}
598
598
  </DropdownMenuRadioItem>
599
- <DropdownMenuSeparator />
600
599
  <DropdownMenuRadioItem value="manual">
601
600
  {copy.manualOrder}
602
601
  </DropdownMenuRadioItem>
@@ -1,7 +1,6 @@
1
1
  import {
2
2
  IconCheck,
3
3
  IconChevronRight,
4
- IconHelpCircle,
5
4
  IconUpload,
6
5
  IconX,
7
6
  } from "@tabler/icons-react";
@@ -433,8 +432,8 @@ export function GuidedQuestionFlow({
433
432
  questions,
434
433
  onSubmit,
435
434
  onSkip,
436
- title = "A few choices before I generate",
437
- description = "Pick what you know. Use Other for anything that does not fit, or let the agent decide.",
435
+ title = "Before I generate",
436
+ description = "Use Other for custom details, or let the agent decide.",
438
437
  skipLabel = "Skip",
439
438
  submitLabel = "Continue",
440
439
  className,
@@ -465,28 +464,23 @@ export function GuidedQuestionFlow({
465
464
  return (
466
465
  <div
467
466
  className={cn(
468
- "flex h-full w-full items-center justify-center bg-background text-foreground",
467
+ "guided-question-flow flex h-full w-full items-center justify-center bg-background text-foreground",
469
468
  className,
470
469
  )}
471
470
  >
472
- <div className="flex max-h-full w-full max-w-3xl flex-col px-4 py-6 sm:px-8 sm:py-10">
473
- <div className="mb-6 flex items-start gap-3">
474
- <div className="mt-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-muted/40 text-primary">
475
- <IconHelpCircle className="h-5 w-5" />
476
- </div>
477
- <div className="min-w-0">
478
- <h2 className="text-xl font-semibold tracking-normal text-foreground sm:text-2xl">
479
- {title}
480
- </h2>
481
- {description && (
482
- <p className="mt-1 max-w-2xl text-sm leading-5 text-muted-foreground">
483
- {description}
484
- </p>
485
- )}
486
- </div>
471
+ <div className="guided-question-flow-inner flex max-h-full w-full max-w-3xl flex-col px-3 py-4">
472
+ <div className="guided-question-flow-header mb-4 min-w-0">
473
+ <h2 className="guided-question-flow-title text-lg font-semibold leading-tight tracking-normal text-foreground">
474
+ {title}
475
+ </h2>
476
+ {description && (
477
+ <p className="guided-question-flow-description mt-1 max-w-2xl text-sm leading-5 text-muted-foreground">
478
+ {description}
479
+ </p>
480
+ )}
487
481
  </div>
488
482
 
489
- <div className="min-h-0 flex-1 space-y-4 overflow-y-auto pe-1">
483
+ <div className="guided-question-flow-list min-h-0 flex-1 overflow-y-auto pe-1">
490
484
  {questions.map((question, index) => (
491
485
  <QuestionCard
492
486
  key={question.id}
@@ -501,7 +495,7 @@ export function GuidedQuestionFlow({
501
495
  ))}
502
496
  </div>
503
497
 
504
- <div className="mt-5 flex shrink-0 items-center justify-between gap-4 border-t border-border pt-4">
498
+ <div className="guided-question-flow-footer mt-4 flex shrink-0 items-center justify-between gap-3 border-t border-border pt-3">
505
499
  <div className="flex items-center gap-1.5">
506
500
  {questions.map((question, index) => (
507
501
  <span
@@ -553,9 +547,9 @@ function QuestionCard({
553
547
  onSubmitAnswer: (value: unknown) => void;
554
548
  }) {
555
549
  return (
556
- <section className="rounded-lg border border-border bg-card/65 p-4 shadow-sm">
557
- <div className="mb-3 flex gap-3">
558
- <div className="flex h-6 min-w-6 items-center justify-center rounded-md bg-muted text-xs font-medium text-muted-foreground">
550
+ <section className="guided-question-card border-t border-border/60 py-3 first:border-t-0 first:pt-0 last:pb-0">
551
+ <div className="mb-2 flex gap-2.5">
552
+ <div className="guided-question-index mt-0.5 min-w-4 text-xs font-medium tabular-nums text-muted-foreground">
559
553
  {index + 1}
560
554
  </div>
561
555
  <div className="min-w-0">
@@ -670,8 +664,8 @@ function TextOptions({
670
664
  const allowOther = question.allowOther !== false;
671
665
 
672
666
  return (
673
- <div className="space-y-3">
674
- <div className="grid gap-2 sm:grid-cols-2">
667
+ <div className="space-y-2.5">
668
+ <div className="guided-question-flow-options grid grid-cols-1 gap-2">
675
669
  {options.map((option) => (
676
670
  <OptionButton
677
671
  key={`${option.value}:${option.label}`}
@@ -724,7 +718,7 @@ function OptionButton({
724
718
  onClick={onClick}
725
719
  aria-pressed={selected}
726
720
  className={cn(
727
- "group flex min-h-[56px] cursor-pointer items-start gap-2 rounded-md border px-3 py-2 text-start transition-colors",
721
+ "group flex min-h-11 min-w-0 cursor-pointer items-start gap-2 rounded-md border px-2.5 py-2 text-start transition-colors",
728
722
  selected
729
723
  ? "border-primary bg-primary/10 text-foreground ring-2 ring-primary/25"
730
724
  : "border-border bg-muted/30 text-muted-foreground hover:border-muted-foreground/50 hover:bg-muted/45 hover:text-foreground",
@@ -38,7 +38,7 @@ function StatusDot({
38
38
  ? "bg-green-500"
39
39
  : configured
40
40
  ? "bg-yellow-500"
41
- : "bg-gray-400";
41
+ : "bg-muted-foreground/55";
42
42
  return <span className={`inline-block h-2 w-2 rounded-full ${color}`} />;
43
43
  }
44
44
 
@@ -598,7 +598,7 @@ export function IntegrationsPanel() {
598
598
  ? "bg-green-500"
599
599
  : s.configured
600
600
  ? "bg-yellow-500"
601
- : "bg-gray-400"
601
+ : "bg-muted-foreground/55"
602
602
  }`}
603
603
  />
604
604
  )}
@@ -53,8 +53,8 @@ const styles: Record<string, React.CSSProperties> = {
53
53
  width: "100%",
54
54
  padding: "8px 12px",
55
55
  border: "none",
56
- borderBottom: "1px solid rgba(255,255,255,0.06)",
57
- background: "rgba(59,130,246,0.06)",
56
+ borderBottom: "1px solid hsl(var(--border) / 0.7)",
57
+ background: "hsl(var(--primary) / 0.06)",
58
58
  color: "inherit",
59
59
  fontSize: 12,
60
60
  cursor: "pointer",
@@ -749,9 +749,9 @@ function buttonPrimary(primary: boolean | undefined): React.CSSProperties {
749
749
  borderRadius: 6,
750
750
  border: primary
751
751
  ? "1px solid transparent"
752
- : "1px solid rgba(255,255,255,0.15)",
753
- background: primary ? "#3b82f6" : "rgba(255,255,255,0.04)",
754
- color: primary ? "#fff" : "inherit",
752
+ : "1px solid hsl(var(--border) / 0.8)",
753
+ background: primary ? "hsl(var(--primary))" : "hsl(var(--muted) / 0.4)",
754
+ color: primary ? "hsl(var(--primary-foreground))" : "inherit",
755
755
  fontSize: 12,
756
756
  fontWeight: 500,
757
757
  cursor: "pointer",
@@ -761,9 +761,9 @@ function buttonPrimary(primary: boolean | undefined): React.CSSProperties {
761
761
  function buttonDisabled(primary: boolean | undefined): React.CSSProperties {
762
762
  return {
763
763
  ...buttonPrimary(primary),
764
- border: "1px solid rgba(255,255,255,0.12)",
765
- background: primary ? "rgba(255,255,255,0.08)" : "rgba(255,255,255,0.04)",
766
- color: "rgba(255,255,255,0.5)",
764
+ border: "1px solid hsl(var(--border) / 0.6)",
765
+ background: "hsl(var(--muted) / 0.35)",
766
+ color: "hsl(var(--muted-foreground))",
767
767
  cursor: "not-allowed",
768
768
  };
769
769
  }
@@ -792,8 +792,8 @@ function badgeStyle(
792
792
 
793
793
  const styles: Record<string, React.CSSProperties> = {
794
794
  root: {
795
- borderBottom: "1px solid rgba(255,255,255,0.06)",
796
- background: "rgba(255,255,255,0.02)",
795
+ borderBottom: "1px solid hsl(var(--border) / 0.7)",
796
+ background: "hsl(var(--muted) / 0.25)",
797
797
  fontSize: 12,
798
798
  display: "flex",
799
799
  flexDirection: "column",
@@ -804,7 +804,7 @@ const styles: Record<string, React.CSSProperties> = {
804
804
  display: "flex",
805
805
  alignItems: "center",
806
806
  justifyContent: "space-between",
807
- borderBottom: "1px solid rgba(255,255,255,0.06)",
807
+ borderBottom: "1px solid hsl(var(--border) / 0.7)",
808
808
  background: "rgba(34,197,94,0.04)",
809
809
  fontSize: 12,
810
810
  },
@@ -915,7 +915,7 @@ const styles: Record<string, React.CSSProperties> = {
915
915
  width: 16,
916
916
  height: 16,
917
917
  borderRadius: "50%",
918
- border: "1px solid rgba(255,255,255,0.2)",
918
+ border: "1px solid hsl(var(--border))",
919
919
  },
920
920
  cardBody: {
921
921
  paddingBlock: "0 10px",
@@ -937,9 +937,9 @@ const styles: Record<string, React.CSSProperties> = {
937
937
  },
938
938
  method: {
939
939
  padding: "8px 10px",
940
- border: "1px solid rgba(255,255,255,0.06)",
940
+ border: "1px solid hsl(var(--border) / 0.65)",
941
941
  borderRadius: 6,
942
- background: "rgba(255,255,255,0.02)",
942
+ background: "hsl(var(--card) / 0.55)",
943
943
  display: "flex",
944
944
  flexDirection: "column",
945
945
  gap: 6,
@@ -967,8 +967,8 @@ const styles: Record<string, React.CSSProperties> = {
967
967
  gap: 8,
968
968
  padding: "7px 8px",
969
969
  borderRadius: 6,
970
- border: "1px solid rgba(255,255,255,0.08)",
971
- background: "rgba(255,255,255,0.025)",
970
+ border: "1px solid hsl(var(--border) / 0.7)",
971
+ background: "hsl(var(--muted) / 0.35)",
972
972
  color: "inherit",
973
973
  cursor: "pointer",
974
974
  fontSize: 11,
@@ -996,8 +996,8 @@ const styles: Record<string, React.CSSProperties> = {
996
996
  padding: "6px 8px",
997
997
  fontSize: 12,
998
998
  borderRadius: 5,
999
- border: "1px solid rgba(255,255,255,0.1)",
1000
- background: "rgba(0,0,0,0.25)",
999
+ border: "1px solid hsl(var(--input))",
1000
+ background: "hsl(var(--background))",
1001
1001
  color: "inherit",
1002
1002
  outline: "none",
1003
1003
  boxSizing: "border-box" as const,
@@ -1007,13 +1007,17 @@ const styles: Record<string, React.CSSProperties> = {
1007
1007
  padding: "6px 8px",
1008
1008
  fontSize: 12,
1009
1009
  borderRadius: 5,
1010
- border: "1px solid rgba(255,255,255,0.1)",
1011
- background: "rgba(0,0,0,0.25)",
1010
+ border: "1px solid hsl(var(--input))",
1011
+ background: "hsl(var(--background))",
1012
1012
  color: "inherit",
1013
1013
  outline: "none",
1014
1014
  boxSizing: "border-box" as const,
1015
1015
  },
1016
- methodHint: { margin: 0, fontSize: 11, color: "rgba(255,255,255,0.62)" },
1016
+ methodHint: {
1017
+ margin: 0,
1018
+ fontSize: 11,
1019
+ color: "hsl(var(--muted-foreground))",
1020
+ },
1017
1021
  errText: { margin: 0, fontSize: 11, color: "#f87171" },
1018
1022
  footer: {
1019
1023
  padding: "0 12px 10px",
@@ -11,6 +11,10 @@ import React, {
11
11
  } from "react";
12
12
  import { Markdown } from "tiptap-markdown";
13
13
 
14
+ import {
15
+ CLAUDE_SONNET_MODEL_ID,
16
+ CLAUDE_SONNET_MODEL_LABEL,
17
+ } from "../../agent/model-config.js";
14
18
  import {
15
19
  type ParsedFrontmatter,
16
20
  getRemoteAgentIdFromPath,
@@ -189,7 +193,9 @@ function FrontmatterBar({
189
193
  <option value="inherit">Default model</option>
190
194
  <option value="claude-fable-5">Claude Fable 5</option>
191
195
  <option value="claude-opus-4-8">Claude Opus 4.8</option>
192
- <option value="claude-sonnet-4-6">Claude Sonnet 4.6</option>
196
+ <option value={CLAUDE_SONNET_MODEL_ID}>
197
+ {CLAUDE_SONNET_MODEL_LABEL}
198
+ </option>
193
199
  <option value="claude-haiku-4-5-20251001">Claude Haiku 4.5</option>
194
200
  </select>
195
201
  ) : null}
@@ -665,7 +671,7 @@ function InlineBubbleToolbar({ editor }: { editor: any }) {
665
671
  onClick={handleSetLink}
666
672
  style={{
667
673
  fontSize: 11,
668
- color: "#60a5fa",
674
+ color: "hsl(var(--primary))",
669
675
  padding: "2px 6px",
670
676
  fontWeight: 500,
671
677
  background: "none",
@@ -689,7 +695,7 @@ function InlineBubbleToolbar({ editor }: { editor: any }) {
689
695
  style={{
690
696
  width: 1,
691
697
  height: 16,
692
- background: "rgba(255,255,255,0.2)",
698
+ background: "hsl(var(--border))",
693
699
  margin: "0 2px",
694
700
  }}
695
701
  />
@@ -1437,28 +1443,30 @@ const editorStyles = `
1437
1443
  .re-bubble-toolbar {
1438
1444
  display: flex;
1439
1445
  align-items: center;
1440
- background: hsl(0 0% 15%);
1446
+ background: hsl(var(--popover));
1447
+ color: hsl(var(--popover-foreground));
1448
+ border: 1px solid hsl(var(--border));
1441
1449
  border-radius: 6px;
1442
1450
  padding: 3px;
1443
- box-shadow: 0 4px 16px rgb(0 0 0 / 0.25), 0 0 0 1px rgb(255 255 255 / 0.06);
1451
+ box-shadow: 0 4px 16px rgb(0 0 0 / 0.12);
1444
1452
  }
1445
1453
  .re-bubble-btn {
1446
1454
  padding: 3px 6px;
1447
1455
  border-radius: 4px;
1448
1456
  font-size: 12px;
1449
- color: rgba(255,255,255,0.75);
1457
+ color: hsl(var(--muted-foreground));
1450
1458
  background: none;
1451
1459
  border: none;
1452
1460
  cursor: pointer;
1453
1461
  line-height: 1;
1454
1462
  }
1455
1463
  .re-bubble-btn:hover {
1456
- background: rgba(255,255,255,0.12);
1457
- color: white;
1464
+ background: hsl(var(--accent));
1465
+ color: hsl(var(--accent-foreground));
1458
1466
  }
1459
1467
  .re-bubble-btn--active {
1460
- background: rgba(255,255,255,0.18);
1461
- color: white;
1468
+ background: hsl(var(--accent));
1469
+ color: hsl(var(--accent-foreground));
1462
1470
  }
1463
1471
 
1464
1472
  /* Slash command menu */
@@ -22,6 +22,10 @@ import React, {
22
22
  useMemo,
23
23
  } from "react";
24
24
 
25
+ import {
26
+ CLAUDE_SONNET_MODEL_ID,
27
+ CLAUDE_SONNET_MODEL_LABEL,
28
+ } from "../../agent/model-config.js";
25
29
  import { serializeFrontmatter } from "../../resources/metadata.js";
26
30
  import { sendToAgentChat } from "../agent-chat.js";
27
31
  import { agentNativePath } from "../api-path.js";
@@ -90,7 +94,7 @@ const AGENT_MODEL_OPTIONS = [
90
94
  { value: "inherit", label: "Default model" },
91
95
  { value: "claude-fable-5", label: "Claude Fable 5" },
92
96
  { value: "claude-opus-4-8", label: "Claude Opus 4.8" },
93
- { value: "claude-sonnet-4-6", label: "Claude Sonnet 4.6" },
97
+ { value: CLAUDE_SONNET_MODEL_ID, label: CLAUDE_SONNET_MODEL_LABEL },
94
98
  { value: "claude-haiku-4-5-20251001", label: "Claude Haiku 4.5" },
95
99
  ] as const;
96
100
 
@@ -499,12 +499,13 @@ function ManualSetupCard({
499
499
  // ─── LLM helpers ────────────────────────────────────────────────────────────
500
500
 
501
501
  function friendlyModelName(model: string): string {
502
+ if (model === "z-ai/glm-5.2") return "GLM 5.2";
502
503
  const claude = model.match(
503
- /^claude-(opus|sonnet|haiku)-(\d+)-(\d+)(?:-\d{8,})?$/,
504
+ /^claude-(opus|sonnet|haiku)-(\d+)(?:-(\d+))?(?:-\d{8,})?$/,
504
505
  );
505
506
  if (claude) {
506
507
  const tier = claude[1][0].toUpperCase() + claude[1].slice(1);
507
- return `${tier} ${claude[2]}.${claude[3]}`;
508
+ return `${tier} ${claude[2]}${claude[3] ? `.${claude[3]}` : ""}`;
508
509
  }
509
510
  if (model.startsWith("gpt-")) return `GPT-${model.slice(4)}`;
510
511
  if (/^o\d/.test(model)) return model;
@@ -718,6 +719,10 @@ function LLMSectionInner({
718
719
  envVar,
719
720
  builderConnected,
720
721
  });
722
+ const manualSetupHint =
723
+ selectedEngine === "ai-sdk:openrouter"
724
+ ? "Provide an OpenRouter key to use OpenRouter models like GLM 5.2."
725
+ : "Choose your AI provider and model.";
721
726
 
722
727
  const engineChanged =
723
728
  selectedEngine !== currentEngine || selectedModel !== currentModel;
@@ -889,7 +894,7 @@ function LLMSectionInner({
889
894
  />
890
895
  {!builderConnected && (
891
896
  <ManualSetupCard
892
- hint="Choose your AI provider and model."
897
+ hint={manualSetupHint}
893
898
  docsUrl={PROVIDER_DOCS[selectedEngine]}
894
899
  sourceBadge={sourceBadge}
895
900
  docsLabel="Get an API key"
@@ -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
  }
@@ -35,7 +35,10 @@ export function defineEval(spec: Eval): Eval {
35
35
  if (!spec.input || typeof spec.input.prompt !== "string") {
36
36
  throw new Error(`defineEval("${spec.name}"): \`input.prompt\` is required`);
37
37
  }
38
- if (!Array.isArray(spec.scorers) || spec.scorers.length === 0) {
38
+ if (
39
+ (!Array.isArray(spec.scorers) || spec.scorers.length === 0) &&
40
+ !spec.skipReason
41
+ ) {
39
42
  throw new Error(
40
43
  `defineEval("${spec.name}"): at least one scorer is required`,
41
44
  );
@@ -27,13 +27,19 @@ export function formatReport(report: EvalRunReport): string {
27
27
  lines.push(" ─────");
28
28
 
29
29
  for (const row of report.results) {
30
- const mark = row.passed ? "✓" : "✗";
30
+ const mark = row.status === "skipped" ? "-" : row.passed ? "✓" : "✗";
31
31
  lines.push("");
32
- lines.push(
33
- ` ${mark} ${row.eval} (avg ${pct(row.avgScore)}, threshold ${pct(
34
- row.threshold,
35
- )})`,
36
- );
32
+ if (row.status === "skipped") {
33
+ lines.push(` ${mark} ${row.eval} (skipped)`);
34
+ lines.push(` reason: ${row.skipReason ?? "No reason provided"}`);
35
+ continue;
36
+ } else {
37
+ lines.push(
38
+ ` ${mark} ${row.eval} (avg ${pct(row.avgScore)}, threshold ${pct(
39
+ row.threshold,
40
+ )})`,
41
+ );
42
+ }
37
43
  if (row.error) {
38
44
  lines.push(` ⚠ run error: ${row.error}`);
39
45
  }
@@ -50,9 +56,18 @@ export function formatReport(report: EvalRunReport): string {
50
56
 
51
57
  lines.push("");
52
58
  lines.push(" ─────");
53
- const verdict = report.failed === 0 ? "PASS" : "FAIL";
59
+ const skipped = report.skipped ?? 0;
60
+ const executedTotal = report.total - skipped;
61
+ const executedPassed = report.passed - skipped;
62
+ const verdict =
63
+ executedTotal === 0 && skipped > 0
64
+ ? "SKIPPED"
65
+ : report.failed === 0
66
+ ? "PASS"
67
+ : "FAIL";
54
68
  lines.push(
55
- ` ${verdict}: ${report.passed}/${report.total} evals passed` +
69
+ ` ${verdict}: ${executedPassed}/${executedTotal} evals passed` +
70
+ (skipped > 0 ? `, ${skipped} skipped` : "") +
56
71
  (report.failed > 0 ? `, ${report.failed} below threshold` : ""),
57
72
  );
58
73
  lines.push("");