@agent-native/core 0.132.2 → 0.133.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 (437) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +181 -0
  3. package/corpus/core/package.json +1 -1
  4. package/corpus/core/src/a2a/correlation.ts +11 -1
  5. package/corpus/core/src/a2a/types.ts +11 -3
  6. package/corpus/core/src/agent/engine/ai-sdk-engine.ts +61 -46
  7. package/corpus/core/src/agent/engine/builder-engine.ts +22 -10
  8. package/corpus/core/src/agent/engine/error-detail.ts +184 -3
  9. package/corpus/core/src/agent/engine/failure-taxonomy.ts +123 -0
  10. package/corpus/core/src/agent/engine/index.ts +8 -0
  11. package/corpus/core/src/agent/engine/registry.ts +92 -8
  12. package/corpus/core/src/agent/engine/translate-ai-sdk.ts +17 -2
  13. package/corpus/core/src/agent/production-agent.ts +13 -33
  14. package/corpus/core/src/agent/run-loop-with-resume.ts +1 -1
  15. package/corpus/core/src/agent/run-manager.ts +43 -14
  16. package/corpus/core/src/agent/run-store.ts +49 -7
  17. package/corpus/core/src/agent/thread-data-builder.ts +36 -4
  18. package/corpus/core/src/cli/templates-meta.ts +13 -0
  19. package/corpus/core/src/cli/workspace-dev.ts +1 -0
  20. package/corpus/core/src/client/error-format.ts +12 -0
  21. package/corpus/core/src/credentials/index.ts +51 -12
  22. package/corpus/core/src/extensions/url-safety.ts +46 -12
  23. package/corpus/core/src/integrations/adapters/slack.ts +32 -10
  24. package/corpus/core/src/integrations/google-docs-poller.ts +12 -1
  25. package/corpus/core/src/integrations/installations-store.ts +30 -0
  26. package/corpus/core/src/integrations/plugin.ts +5 -5
  27. package/corpus/core/src/integrations/types.ts +7 -0
  28. package/corpus/core/src/integrations/webhook-handler.ts +24 -1
  29. package/corpus/core/src/jobs/background-automation-runner.ts +38 -1
  30. package/corpus/core/src/provider-api/index.ts +8 -2
  31. package/corpus/core/src/scripts/call-agent.ts +6 -0
  32. package/corpus/core/src/server/agent-chat-plugin.ts +30 -9
  33. package/corpus/core/src/server/agent-discovery.ts +2 -0
  34. package/corpus/core/src/server/builder-design-systems.ts +21 -0
  35. package/corpus/core/src/server/credential-provider.ts +51 -12
  36. package/corpus/core/src/server/index.ts +1 -0
  37. package/corpus/core/src/server/onboarding-html.ts +37 -2
  38. package/corpus/core/src/shared/reasoning-effort.ts +1 -1
  39. package/corpus/core/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +11 -0
  40. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +6 -2
  41. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +39 -19
  42. package/corpus/templates/assets/changelog/2026-07-31-the-agent-native-logo-stays-visible-when-the-sidebar-is-coll.md +6 -0
  43. package/corpus/templates/brain/app/components/layout/Sidebar.tsx +30 -3
  44. package/corpus/templates/brain/changelog/2026-07-31-clicking-the-agent-native-logo-now-toggles-the-app-sidebar.md +6 -0
  45. package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +1 -1
  46. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +54 -25
  47. package/corpus/templates/calendar/changelog/2026-07-31-the-agent-native-logo-stays-visible-when-the-sidebar-is-coll.md +6 -0
  48. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +30 -3
  49. package/corpus/templates/chat/changelog/2026-07-31-clicking-the-agent-native-logo-now-toggles-the-app-sidebar.md +6 -0
  50. package/corpus/templates/clips/app/components/library/library-layout.tsx +37 -21
  51. package/corpus/templates/clips/changelog/2026-07-31-the-agent-native-logo-stays-visible-when-the-sidebar-is-coll.md +6 -0
  52. package/corpus/templates/clips/desktop/src/hooks/useMediaDevices.ts +1 -1
  53. package/corpus/templates/clips/desktop/src/lib/media-capture-constraints.ts +1 -1
  54. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +34 -17
  55. package/corpus/templates/content/changelog/2026-07-31-the-agent-native-logo-stays-visible-when-the-sidebar-is-coll.md +6 -0
  56. package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +6 -2
  57. package/corpus/templates/design/actions/create-design-system.ts +1 -0
  58. package/corpus/templates/design/actions/set-default-design-system.ts +34 -26
  59. package/corpus/templates/design/app/components/layout/Sidebar.tsx +21 -4
  60. package/corpus/templates/design/app/i18n-data.ts +39 -0
  61. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +229 -12
  62. package/corpus/templates/design/app/pages/DesignSystems.tsx +10 -4
  63. package/corpus/templates/design/changelog/2026-07-31-clicking-the-agent-native-logo-now-toggles-the-app-sidebar.md +6 -0
  64. package/corpus/templates/design/changelog/2026-07-31-design-system-indexing-keeps-your-chosen-name-when-you-uploa.md +6 -0
  65. package/corpus/templates/design/server/lib/builder-design-system-proxy.ts +19 -4
  66. package/corpus/templates/dispatch/AGENTS.md +4 -0
  67. package/corpus/templates/factory/.agents/skills/actions/SKILL.md +562 -0
  68. package/corpus/templates/factory/.agents/skills/adding-a-feature/SKILL.md +198 -0
  69. package/corpus/templates/factory/.agents/skills/agent-native-docs/SKILL.md +115 -0
  70. package/corpus/templates/factory/.agents/skills/agent-native-toolkit/SKILL.md +182 -0
  71. package/corpus/templates/factory/.agents/skills/capture-learnings/SKILL.md +89 -0
  72. package/corpus/templates/factory/.agents/skills/create-skill/SKILL.md +221 -0
  73. package/corpus/templates/factory/.agents/skills/customizing-agent-native/SKILL.md +220 -0
  74. package/corpus/templates/factory/.agents/skills/delegate-to-agent/SKILL.md +263 -0
  75. package/corpus/templates/factory/.agents/skills/factory-graphs/SKILL.md +52 -0
  76. package/corpus/templates/factory/.agents/skills/feature-flags/SKILL.md +169 -0
  77. package/corpus/templates/factory/.agents/skills/frontend-design/SKILL.md +174 -0
  78. package/corpus/templates/factory/.agents/skills/real-time-sync/SKILL.md +232 -0
  79. package/corpus/templates/factory/.agents/skills/security/SKILL.md +324 -0
  80. package/corpus/templates/factory/.agents/skills/self-modifying-code/SKILL.md +119 -0
  81. package/corpus/templates/factory/.agents/skills/shadcn-ui/SKILL.md +123 -0
  82. package/corpus/templates/factory/.agents/skills/sharing/SKILL.md +232 -0
  83. package/corpus/templates/factory/.agents/skills/storing-data/SKILL.md +178 -0
  84. package/corpus/templates/factory/.agents/skills/upgrade-agent-native/SKILL.md +122 -0
  85. package/corpus/templates/factory/.env.example +24 -0
  86. package/corpus/templates/factory/.ignore +0 -0
  87. package/corpus/templates/factory/.oxfmtrc.json +8 -0
  88. package/corpus/templates/factory/AGENTS.md +90 -0
  89. package/corpus/templates/factory/CHANGELOG.md +10 -0
  90. package/corpus/templates/factory/DEVELOPING.md +185 -0
  91. package/corpus/templates/factory/README.md +64 -0
  92. package/corpus/templates/factory/_gitignore +42 -0
  93. package/corpus/templates/factory/actions/add-factory-comment.ts +55 -0
  94. package/corpus/templates/factory/actions/approve-factory-item.ts +214 -0
  95. package/corpus/templates/factory/actions/babysit-pull-request.ts +126 -0
  96. package/corpus/templates/factory/actions/evaluate-triage-item.ts +172 -0
  97. package/corpus/templates/factory/actions/get-factory-graph.ts +62 -0
  98. package/corpus/templates/factory/actions/get-triage-config.ts +42 -0
  99. package/corpus/templates/factory/actions/get-triage-item.ts +74 -0
  100. package/corpus/templates/factory/actions/hello.ts +13 -0
  101. package/corpus/templates/factory/actions/ingest-github-observation.ts +100 -0
  102. package/corpus/templates/factory/actions/list-factories.ts +40 -0
  103. package/corpus/templates/factory/actions/list-factory-comments.ts +40 -0
  104. package/corpus/templates/factory/actions/list-triage-items.ts +85 -0
  105. package/corpus/templates/factory/actions/list-triage-rules.ts +44 -0
  106. package/corpus/templates/factory/actions/navigate.ts +41 -0
  107. package/corpus/templates/factory/actions/poll-slack-channel.ts +118 -0
  108. package/corpus/templates/factory/actions/reconcile-triage-run.ts +179 -0
  109. package/corpus/templates/factory/actions/record-triage-feedback.ts +58 -0
  110. package/corpus/templates/factory/actions/run.ts +2 -0
  111. package/corpus/templates/factory/actions/save-factory-graph.ts +129 -0
  112. package/corpus/templates/factory/actions/save-triage-config.ts +67 -0
  113. package/corpus/templates/factory/actions/save-triage-rule.ts +89 -0
  114. package/corpus/templates/factory/actions/suggest-factory-rules.ts +70 -0
  115. package/corpus/templates/factory/actions/view-screen.ts +73 -0
  116. package/corpus/templates/factory/app/components/factory/FactoryCanvas.tsx +441 -0
  117. package/corpus/templates/factory/app/components/factory/FactoryInspector.tsx +388 -0
  118. package/corpus/templates/factory/app/components/layout/Header.tsx +60 -0
  119. package/corpus/templates/factory/app/components/layout/Layout.tsx +190 -0
  120. package/corpus/templates/factory/app/components/layout/Sidebar.tsx +538 -0
  121. package/corpus/templates/factory/app/components/triage/triage-status-pill.tsx +28 -0
  122. package/corpus/templates/factory/app/components/ui/button.tsx +1 -0
  123. package/corpus/templates/factory/app/components/ui/card.tsx +1 -0
  124. package/corpus/templates/factory/app/components/ui/dropdown-menu.tsx +1 -0
  125. package/corpus/templates/factory/app/components/ui/input.tsx +1 -0
  126. package/corpus/templates/factory/app/components/ui/label.tsx +1 -0
  127. package/corpus/templates/factory/app/components/ui/sheet.tsx +1 -0
  128. package/corpus/templates/factory/app/components/ui/textarea.tsx +1 -0
  129. package/corpus/templates/factory/app/components/ui/toolkit-provider.tsx +17 -0
  130. package/corpus/templates/factory/app/components/ui/tooltip.tsx +1 -0
  131. package/corpus/templates/factory/app/design-system.ts +3 -0
  132. package/corpus/templates/factory/app/entry.client.tsx +22 -0
  133. package/corpus/templates/factory/app/entry.server.tsx +10 -0
  134. package/corpus/templates/factory/app/global.css +93 -0
  135. package/corpus/templates/factory/app/hooks/use-navigation-state.ts +113 -0
  136. package/corpus/templates/factory/app/i18n/en-US.ts +211 -0
  137. package/corpus/templates/factory/app/i18n/index.ts +34 -0
  138. package/corpus/templates/factory/app/i18n-data.ts +556 -0
  139. package/corpus/templates/factory/app/lib/agent-page.tsx +49 -0
  140. package/corpus/templates/factory/app/lib/app-config.ts +11 -0
  141. package/corpus/templates/factory/app/lib/tab-id.ts +1 -0
  142. package/corpus/templates/factory/app/lib/utils.ts +1 -0
  143. package/corpus/templates/factory/app/root.tsx +175 -0
  144. package/corpus/templates/factory/app/routes/_index.tsx +94 -0
  145. package/corpus/templates/factory/app/routes/agent.tsx +24 -0
  146. package/corpus/templates/factory/app/routes/chat.$threadId.tsx +1 -0
  147. package/corpus/templates/factory/app/routes/database.tsx +17 -0
  148. package/corpus/templates/factory/app/routes/extensions.$id.$slug.tsx +2 -0
  149. package/corpus/templates/factory/app/routes/extensions.$id.tsx +11 -0
  150. package/corpus/templates/factory/app/routes/extensions._index.tsx +11 -0
  151. package/corpus/templates/factory/app/routes/extensions.tsx +5 -0
  152. package/corpus/templates/factory/app/routes/factory.tsx +1003 -0
  153. package/corpus/templates/factory/app/routes/observability.tsx +19 -0
  154. package/corpus/templates/factory/app/routes/settings.tsx +89 -0
  155. package/corpus/templates/factory/app/routes/team.tsx +11 -0
  156. package/corpus/templates/factory/app/routes.ts +4 -0
  157. package/corpus/templates/factory/app/vite-env.d.ts +6 -0
  158. package/corpus/templates/factory/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
  159. package/corpus/templates/factory/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  160. package/corpus/templates/factory/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
  161. package/corpus/templates/factory/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  162. package/corpus/templates/factory/changelog/2026-06-29-chat-layouts-adapt-when-the-agent-sidebar-is-open.md +6 -0
  163. package/corpus/templates/factory/changelog/2026-07-08-settings-are-cleaner-and-searchable.md +5 -0
  164. package/corpus/templates/factory/changelog/2026-07-10-chat-now-makes-ai-connection-setup-clear-without-shifting-th.md +6 -0
  165. package/corpus/templates/factory/changelog/2026-07-13-a-full-agent-page-now-brings-context-files-connections-jobs-.md +6 -0
  166. package/corpus/templates/factory/changelog/2026-07-14-chat-opens-reliably-on-hosted-deployments-instead-of-failing.md +6 -0
  167. package/corpus/templates/factory/changelog/2026-07-14-fixed-chat-template-startup-with-older-core-versions.md +6 -0
  168. package/corpus/templates/factory/changelog/2026-07-15-chat-navigation-focuses-on-chat-and-agent.md +6 -0
  169. package/corpus/templates/factory/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
  170. package/corpus/templates/factory/changelog/2026-07-22-compact-sidebar-footer.md +6 -0
  171. package/corpus/templates/factory/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +6 -0
  172. package/corpus/templates/factory/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  173. package/corpus/templates/factory/changelog/2026-07-22-recent-chats-are-easier-to-scan-and-expand.md +6 -0
  174. package/corpus/templates/factory/changelog/2026-07-23-full-page-chat-is-better-centered-with-quieter-chat-history-.md +6 -0
  175. package/corpus/templates/factory/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
  176. package/corpus/templates/factory/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
  177. package/corpus/templates/factory/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
  178. package/corpus/templates/factory/changelog/2026-07-29-sidebar-footers-now-keep-feedback-search-and-collapse-togeth.md +6 -0
  179. package/corpus/templates/factory/changelog/2026-07-31-added-an-inspectable-observe-only-factory-queue-for-slack-.md +6 -0
  180. package/corpus/templates/factory/changelog/2026-07-31-clicking-the-agent-native-logo-now-toggles-the-app-sidebar.md +6 -0
  181. package/corpus/templates/factory/components.json +20 -0
  182. package/corpus/templates/factory/data/sync-config.json +1 -0
  183. package/corpus/templates/factory/learnings.defaults.md +5 -0
  184. package/corpus/templates/factory/netlify.toml +10 -0
  185. package/corpus/templates/factory/package.json +105 -0
  186. package/corpus/templates/factory/public/agent-native-icon-dark.svg +10 -0
  187. package/corpus/templates/factory/public/agent-native-icon-light.svg +10 -0
  188. package/corpus/templates/factory/public/agent-native-logo-dark.svg +21 -0
  189. package/corpus/templates/factory/public/agent-native-logo-light.svg +21 -0
  190. package/corpus/templates/factory/public/favicon.svg +1 -0
  191. package/corpus/templates/factory/public/icon-180.svg +1 -0
  192. package/corpus/templates/factory/public/icon-192.svg +1 -0
  193. package/corpus/templates/factory/public/icon-512.svg +1 -0
  194. package/corpus/templates/factory/public/manifest.json +21 -0
  195. package/corpus/templates/factory/react-router.config.ts +7 -0
  196. package/corpus/templates/factory/server/connectors/credentials.ts +129 -0
  197. package/corpus/templates/factory/server/connectors/slack.ts +129 -0
  198. package/corpus/templates/factory/server/db/index.ts +6 -0
  199. package/corpus/templates/factory/server/db/schema.ts +193 -0
  200. package/corpus/templates/factory/server/factory-graph/contracts.ts +212 -0
  201. package/corpus/templates/factory/server/factory-graph/store.ts +121 -0
  202. package/corpus/templates/factory/server/lib/require-workspace-member.ts +55 -0
  203. package/corpus/templates/factory/server/middleware/auth.ts +15 -0
  204. package/corpus/templates/factory/server/plugins/agent-chat.ts +58 -0
  205. package/corpus/templates/factory/server/plugins/auth.ts +14 -0
  206. package/corpus/templates/factory/server/plugins/factory-migrations.ts +247 -0
  207. package/corpus/templates/factory/server/plugins/factory-scheduler-job.ts +116 -0
  208. package/corpus/templates/factory/server/plugins/integrations.ts +46 -0
  209. package/corpus/templates/factory/server/routes/[...page].get.ts +5 -0
  210. package/corpus/templates/factory/server/routes/_agent-native/factory/builder-callback.post.ts +116 -0
  211. package/corpus/templates/factory/server/triage/ai-services-git.ts +197 -0
  212. package/corpus/templates/factory/server/triage/builder-executor.ts +118 -0
  213. package/corpus/templates/factory/server/triage/contracts.ts +164 -0
  214. package/corpus/templates/factory/server/triage/github-ingestion.ts +35 -0
  215. package/corpus/templates/factory/server/triage/guards.ts +121 -0
  216. package/corpus/templates/factory/server/triage/ids.ts +27 -0
  217. package/corpus/templates/factory/server/triage/pr-babysit.ts +100 -0
  218. package/corpus/templates/factory/server/triage/pr-monitor.ts +220 -0
  219. package/corpus/templates/factory/server/triage/slack-client.ts +55 -0
  220. package/corpus/templates/factory/server/triage/slack-poller.ts +152 -0
  221. package/corpus/templates/factory/ssr-entry.ts +15 -0
  222. package/corpus/templates/factory/tsconfig.json +21 -0
  223. package/corpus/templates/factory/vite.config.ts +19 -0
  224. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +55 -5
  225. package/corpus/templates/forms/changelog/2026-07-31-the-agent-native-logo-stays-visible-when-the-sidebar-is-coll.md +6 -0
  226. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +6 -2
  227. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +21 -6
  228. package/corpus/templates/plan/changelog/2026-07-31-clicking-the-agent-native-logo-now-toggles-the-app-sidebar.md +6 -0
  229. package/corpus/templates/slides/.agents/skills/create-deck/SKILL.md +12 -0
  230. package/corpus/templates/slides/.agents/skills/design-systems/SKILL.md +9 -0
  231. package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +11 -0
  232. package/corpus/templates/slides/AGENTS.md +5 -6
  233. package/corpus/templates/slides/actions/_await-fit-check.ts +20 -10
  234. package/corpus/templates/slides/actions/add-slide.ts +17 -4
  235. package/corpus/templates/slides/actions/create-design-system.ts +16 -4
  236. package/corpus/templates/slides/actions/delete-design-system.ts +18 -2
  237. package/corpus/templates/slides/actions/get-layout-overflows.ts +88 -0
  238. package/corpus/templates/slides/actions/import-file.ts +1 -0
  239. package/corpus/templates/slides/actions/index-design-system-with-builder.ts +8 -0
  240. package/corpus/templates/slides/actions/patch-deck.ts +48 -16
  241. package/corpus/templates/slides/actions/set-default-design-system.ts +49 -19
  242. package/corpus/templates/slides/actions/update-slide.ts +13 -3
  243. package/corpus/templates/slides/actions/view-screen.ts +87 -10
  244. package/corpus/templates/slides/app/components/deck/SlideRenderer.tsx +155 -28
  245. package/corpus/templates/slides/app/components/design-system/DesignSystemCard.tsx +21 -17
  246. package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +849 -341
  247. package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +102 -2
  248. package/corpus/templates/slides/app/components/editor/PromptDialog.tsx +13 -16
  249. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +60 -12
  250. package/corpus/templates/slides/app/components/editor/SlideOverflowWarning.tsx +11 -1
  251. package/corpus/templates/slides/app/components/layout/Sidebar.tsx +66 -19
  252. package/corpus/templates/slides/app/i18n/en-US.ts +23 -0
  253. package/corpus/templates/slides/app/lib/normalize-slide-padding.ts +8 -15
  254. package/corpus/templates/slides/app/pages/DeckEditor.tsx +4 -3
  255. package/corpus/templates/slides/app/pages/DesignSystems.tsx +4 -3
  256. package/corpus/templates/slides/app/pages/Index.tsx +1 -1
  257. package/corpus/templates/slides/changelog/2026-07-31-design-system-details-now-show-their-source-and-indexing-sta.md +6 -0
  258. package/corpus/templates/slides/changelog/2026-07-31-design-system-indexing-keeps-your-chosen-name-when-you-uploa.md +6 -0
  259. package/corpus/templates/slides/changelog/2026-07-31-design-system-setup-keeps-focus-rings-visible-and-uses-a-sim.md +6 -0
  260. package/corpus/templates/slides/changelog/2026-07-31-skip-prompt-is-now-available-in-the-new-deck-prompt-header.md +6 -0
  261. package/corpus/templates/slides/changelog/2026-07-31-slides-now-detect-real-text-and-box-overflow-across-the-deck.md +6 -0
  262. package/corpus/templates/slides/changelog/2026-07-31-the-agent-native-logo-stays-visible-when-the-sidebar-is-coll.md +6 -0
  263. package/corpus/templates/slides/server/handlers/design-systems.ts +1 -0
  264. package/corpus/templates/slides/server/handlers/index-design-system-sources.ts +1 -0
  265. package/corpus/templates/slides/server/lib/builder-design-system-proxy.ts +23 -4
  266. package/corpus/templates/slides/server/plugins/agent-chat.ts +5 -0
  267. package/corpus/templates/slides/server/plugins/creative-context.ts +16 -3
  268. package/corpus/templates/slides/server/workspace-defaults.ts +5 -1
  269. package/corpus/templates/slides/shared/slide-fit.ts +26 -0
  270. package/corpus/templates/tasks/app/components/layout/Sidebar.tsx +30 -3
  271. package/corpus/templates/tasks/changelog/2026-07-31-clicking-the-agent-native-logo-now-toggles-the-app-sidebar.md +6 -0
  272. package/dist/a2a/correlation.d.ts +4 -1
  273. package/dist/a2a/correlation.d.ts.map +1 -1
  274. package/dist/a2a/correlation.js +8 -1
  275. package/dist/a2a/correlation.js.map +1 -1
  276. package/dist/a2a/types.d.ts +11 -3
  277. package/dist/a2a/types.d.ts.map +1 -1
  278. package/dist/a2a/types.js.map +1 -1
  279. package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
  280. package/dist/agent/engine/ai-sdk-engine.js +51 -41
  281. package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
  282. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  283. package/dist/agent/engine/builder-engine.js +18 -8
  284. package/dist/agent/engine/builder-engine.js.map +1 -1
  285. package/dist/agent/engine/error-detail.d.ts +61 -0
  286. package/dist/agent/engine/error-detail.d.ts.map +1 -1
  287. package/dist/agent/engine/error-detail.js +145 -3
  288. package/dist/agent/engine/error-detail.js.map +1 -1
  289. package/dist/agent/engine/failure-taxonomy.d.ts +24 -0
  290. package/dist/agent/engine/failure-taxonomy.d.ts.map +1 -0
  291. package/dist/agent/engine/failure-taxonomy.js +88 -0
  292. package/dist/agent/engine/failure-taxonomy.js.map +1 -0
  293. package/dist/agent/engine/index.d.ts +2 -1
  294. package/dist/agent/engine/index.d.ts.map +1 -1
  295. package/dist/agent/engine/index.js +2 -1
  296. package/dist/agent/engine/index.js.map +1 -1
  297. package/dist/agent/engine/registry.d.ts +16 -0
  298. package/dist/agent/engine/registry.d.ts.map +1 -1
  299. package/dist/agent/engine/registry.js +71 -6
  300. package/dist/agent/engine/registry.js.map +1 -1
  301. package/dist/agent/engine/translate-ai-sdk.d.ts.map +1 -1
  302. package/dist/agent/engine/translate-ai-sdk.js +14 -2
  303. package/dist/agent/engine/translate-ai-sdk.js.map +1 -1
  304. package/dist/agent/production-agent.d.ts.map +1 -1
  305. package/dist/agent/production-agent.js +13 -24
  306. package/dist/agent/production-agent.js.map +1 -1
  307. package/dist/agent/run-loop-with-resume.js +1 -1
  308. package/dist/agent/run-loop-with-resume.js.map +1 -1
  309. package/dist/agent/run-manager.d.ts.map +1 -1
  310. package/dist/agent/run-manager.js +39 -10
  311. package/dist/agent/run-manager.js.map +1 -1
  312. package/dist/agent/run-store.d.ts +10 -0
  313. package/dist/agent/run-store.d.ts.map +1 -1
  314. package/dist/agent/run-store.js +38 -6
  315. package/dist/agent/run-store.js.map +1 -1
  316. package/dist/agent/thread-data-builder.d.ts.map +1 -1
  317. package/dist/agent/thread-data-builder.js +28 -4
  318. package/dist/agent/thread-data-builder.js.map +1 -1
  319. package/dist/cli/templates-meta.d.ts.map +1 -1
  320. package/dist/cli/templates-meta.js +13 -0
  321. package/dist/cli/templates-meta.js.map +1 -1
  322. package/dist/cli/workspace-dev.d.ts.map +1 -1
  323. package/dist/cli/workspace-dev.js +1 -0
  324. package/dist/cli/workspace-dev.js.map +1 -1
  325. package/dist/client/error-format.d.ts.map +1 -1
  326. package/dist/client/error-format.js +10 -0
  327. package/dist/client/error-format.js.map +1 -1
  328. package/dist/collab/struct-routes.d.ts +1 -1
  329. package/dist/credentials/index.d.ts +9 -2
  330. package/dist/credentials/index.d.ts.map +1 -1
  331. package/dist/credentials/index.js +50 -8
  332. package/dist/credentials/index.js.map +1 -1
  333. package/dist/extensions/url-safety.d.ts.map +1 -1
  334. package/dist/extensions/url-safety.js +38 -12
  335. package/dist/extensions/url-safety.js.map +1 -1
  336. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  337. package/dist/integrations/adapters/slack.d.ts.map +1 -1
  338. package/dist/integrations/adapters/slack.js +25 -8
  339. package/dist/integrations/adapters/slack.js.map +1 -1
  340. package/dist/integrations/google-docs-poller.d.ts.map +1 -1
  341. package/dist/integrations/google-docs-poller.js +13 -1
  342. package/dist/integrations/google-docs-poller.js.map +1 -1
  343. package/dist/integrations/installations-store.d.ts +10 -0
  344. package/dist/integrations/installations-store.d.ts.map +1 -1
  345. package/dist/integrations/installations-store.js +24 -0
  346. package/dist/integrations/installations-store.js.map +1 -1
  347. package/dist/integrations/plugin.d.ts.map +1 -1
  348. package/dist/integrations/plugin.js +6 -5
  349. package/dist/integrations/plugin.js.map +1 -1
  350. package/dist/integrations/types.d.ts +7 -0
  351. package/dist/integrations/types.d.ts.map +1 -1
  352. package/dist/integrations/types.js.map +1 -1
  353. package/dist/integrations/webhook-handler.d.ts.map +1 -1
  354. package/dist/integrations/webhook-handler.js +16 -1
  355. package/dist/integrations/webhook-handler.js.map +1 -1
  356. package/dist/jobs/background-automation-runner.d.ts.map +1 -1
  357. package/dist/jobs/background-automation-runner.js +35 -2
  358. package/dist/jobs/background-automation-runner.js.map +1 -1
  359. package/dist/mcp/screen-memory-stdio.d.ts +7 -7
  360. package/dist/mcp/screen-memory-stdio.d.ts.map +1 -1
  361. package/dist/notifications/routes.d.ts +1 -1
  362. package/dist/observability/routes.d.ts +1 -1
  363. package/dist/provider-api/actions/custom-provider-registration.d.ts +14 -14
  364. package/dist/provider-api/actions/provider-api.d.ts +8 -8
  365. package/dist/provider-api/index.js +7 -3
  366. package/dist/provider-api/index.js.map +1 -1
  367. package/dist/resources/handlers.d.ts +1 -1
  368. package/dist/scripts/call-agent.d.ts.map +1 -1
  369. package/dist/scripts/call-agent.js +6 -1
  370. package/dist/scripts/call-agent.js.map +1 -1
  371. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  372. package/dist/server/agent-chat-plugin.js +25 -7
  373. package/dist/server/agent-chat-plugin.js.map +1 -1
  374. package/dist/server/agent-discovery.d.ts +2 -0
  375. package/dist/server/agent-discovery.d.ts.map +1 -1
  376. package/dist/server/agent-discovery.js.map +1 -1
  377. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  378. package/dist/server/builder-design-systems.d.ts +4 -1
  379. package/dist/server/builder-design-systems.d.ts.map +1 -1
  380. package/dist/server/builder-design-systems.js +11 -1
  381. package/dist/server/builder-design-systems.js.map +1 -1
  382. package/dist/server/credential-provider.d.ts.map +1 -1
  383. package/dist/server/credential-provider.js +49 -12
  384. package/dist/server/credential-provider.js.map +1 -1
  385. package/dist/server/index.d.ts +1 -1
  386. package/dist/server/index.d.ts.map +1 -1
  387. package/dist/server/index.js.map +1 -1
  388. package/dist/server/onboarding-html.d.ts.map +1 -1
  389. package/dist/server/onboarding-html.js +37 -2
  390. package/dist/server/onboarding-html.js.map +1 -1
  391. package/dist/shared/reasoning-effort.d.ts +1 -0
  392. package/dist/shared/reasoning-effort.d.ts.map +1 -1
  393. package/dist/shared/reasoning-effort.js +1 -1
  394. package/dist/shared/reasoning-effort.js.map +1 -1
  395. package/dist/templates/chat/app/components/layout/Sidebar.tsx +30 -3
  396. package/dist/templates/chat/changelog/2026-07-31-clicking-the-agent-native-logo-now-toggles-the-app-sidebar.md +6 -0
  397. package/dist/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +11 -0
  398. package/package.json +1 -1
  399. package/src/a2a/correlation.ts +11 -1
  400. package/src/a2a/types.ts +11 -3
  401. package/src/agent/engine/ai-sdk-engine.ts +61 -46
  402. package/src/agent/engine/builder-engine.ts +22 -10
  403. package/src/agent/engine/error-detail.ts +184 -3
  404. package/src/agent/engine/failure-taxonomy.ts +123 -0
  405. package/src/agent/engine/index.ts +8 -0
  406. package/src/agent/engine/registry.ts +92 -8
  407. package/src/agent/engine/translate-ai-sdk.ts +17 -2
  408. package/src/agent/production-agent.ts +13 -33
  409. package/src/agent/run-loop-with-resume.ts +1 -1
  410. package/src/agent/run-manager.ts +43 -14
  411. package/src/agent/run-store.ts +49 -7
  412. package/src/agent/thread-data-builder.ts +36 -4
  413. package/src/cli/templates-meta.ts +13 -0
  414. package/src/cli/workspace-dev.ts +1 -0
  415. package/src/client/error-format.ts +12 -0
  416. package/src/credentials/index.ts +51 -12
  417. package/src/extensions/url-safety.ts +46 -12
  418. package/src/integrations/adapters/slack.ts +32 -10
  419. package/src/integrations/google-docs-poller.ts +12 -1
  420. package/src/integrations/installations-store.ts +30 -0
  421. package/src/integrations/plugin.ts +5 -5
  422. package/src/integrations/types.ts +7 -0
  423. package/src/integrations/webhook-handler.ts +24 -1
  424. package/src/jobs/background-automation-runner.ts +38 -1
  425. package/src/provider-api/index.ts +8 -2
  426. package/src/scripts/call-agent.ts +6 -0
  427. package/src/server/agent-chat-plugin.ts +30 -9
  428. package/src/server/agent-discovery.ts +2 -0
  429. package/src/server/builder-design-systems.ts +21 -0
  430. package/src/server/credential-provider.ts +51 -12
  431. package/src/server/index.ts +1 -0
  432. package/src/server/onboarding-html.ts +37 -2
  433. package/src/shared/reasoning-effort.ts +1 -1
  434. package/src/templates/chat/app/components/layout/Sidebar.tsx +30 -3
  435. package/src/templates/chat/changelog/2026-07-31-clicking-the-agent-native-logo-now-toggles-the-app-sidebar.md +6 -0
  436. package/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +11 -0
  437. package/corpus/templates/clips/desktop/src/lib/media-device-selection.ts +0 -157
@@ -26,6 +26,7 @@ export declare function reasoningEffortLabel(effort: ReasoningEffort | undefined
26
26
  */
27
27
  export declare function resolveReasoningEffortSelection(model: string | undefined, effort: ReasoningEffort | undefined): ReasoningEffort;
28
28
  export declare function stepDownReasoningEffort(effort: ReasoningEffort | undefined): ReasoningEffort | undefined;
29
+ export declare function isGPTReasoningModel(model: string): boolean;
29
30
  /**
30
31
  * Anthropic's adaptive-thinking API is only available on the newer Claude
31
32
  * model families. Claude Haiku 4.5 is reasoning-capable, but it still
@@ -1 +1 @@
1
- {"version":3,"file":"reasoning-effort.d.ts","sourceRoot":"","sources":["../../src/shared/reasoning-effort.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,YAC5B,MAAM,EACN,MAAM,EACN,SAAS,EACT,KAAK,EACL,QAAQ,EACR,MAAM,EACN,OAAO,EACP,KAAK,CACG,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjE;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,EAAE,eAA0B,CAAC;AAElE,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CASnE,CAAC;AAsBF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAE1E;AAED,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,eAAe,EAAE,CAcnB;AAED,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,eAAe,GAAG,SAAS,GAClC,eAAe,GAAG,SAAS,CAmB7B;AAED;;;;GAIG;AACH,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,eAAe,GAAG,SAAS,GAClC,eAAe,GAAG,SAAS,CAG7B;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,UAIvE;AAED;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,eAAe,GAAG,SAAS,GAClC,eAAe,CAOjB;AAkBD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,eAAe,GAAG,SAAS,GAClC,eAAe,GAAG,SAAS,CAG7B;AAgBD;;;;GAIG;AACH,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,WAOvE;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,eAAe,sCAepE"}
1
+ {"version":3,"file":"reasoning-effort.d.ts","sourceRoot":"","sources":["../../src/shared/reasoning-effort.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,YAC5B,MAAM,EACN,MAAM,EACN,SAAS,EACT,KAAK,EACL,QAAQ,EACR,MAAM,EACN,OAAO,EACP,KAAK,CACG,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjE;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,EAAE,eAA0B,CAAC;AAElE,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CASnE,CAAC;AAsBF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAE1E;AAED,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,eAAe,EAAE,CAcnB;AAED,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,eAAe,GAAG,SAAS,GAClC,eAAe,GAAG,SAAS,CAmB7B;AAED;;;;GAIG;AACH,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,eAAe,GAAG,SAAS,GAClC,eAAe,GAAG,SAAS,CAG7B;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,UAIvE;AAED;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,eAAe,GAAG,SAAS,GAClC,eAAe,CAOjB;AAkBD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,eAAe,GAAG,SAAS,GAClC,eAAe,GAAG,SAAS,CAG7B;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,WAGhD;AAWD;;;;GAIG;AACH,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,WAOvE;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,eAAe,sCAepE"}
@@ -121,7 +121,7 @@ export function stepDownReasoningEffort(effort) {
121
121
  return effort;
122
122
  return REASONING_EFFORT_STEP_DOWN[effort] ?? effort;
123
123
  }
124
- function isGPTReasoningModel(model) {
124
+ export function isGPTReasoningModel(model) {
125
125
  const id = model.toLowerCase().replace(/^openai\//, "");
126
126
  return /^gpt-5/.test(id) || /^o\d/.test(id);
127
127
  }
@@ -1 +1 @@
1
- {"version":3,"file":"reasoning-effort.js","sourceRoot":"","sources":["../../src/shared/reasoning-effort.ts"],"names":[],"mappings":"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","sourcesContent":["export const REASONING_EFFORTS = [\n \"auto\",\n \"none\",\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n \"max\",\n] as const;\n\nexport type ReasoningEffort = (typeof REASONING_EFFORTS)[number];\n\n/**\n * Shared chat always chooses an explicit reasoning tier. Keep `auto` in the\n * accepted type only so older persisted selections and external callers can\n * migrate cleanly; new UI and engine defaults resolve it to Medium.\n */\nexport const DEFAULT_REASONING_EFFORT: ReasoningEffort = \"medium\";\n\nexport const REASONING_EFFORT_LABELS: Record<ReasoningEffort, string> = {\n auto: \"Auto\",\n none: \"None\",\n minimal: \"Minimal\",\n low: \"Low\",\n medium: \"Medium\",\n high: \"High\",\n xhigh: \"Extra High\",\n max: \"Max\",\n};\n\nconst VISIBLE_STANDARD_EFFORTS: ReasoningEffort[] = [\"low\", \"medium\", \"high\"];\n\nconst VISIBLE_GPT_EFFORTS: ReasoningEffort[] = [\n ...VISIBLE_STANDARD_EFFORTS,\n \"xhigh\",\n];\n\nconst VISIBLE_CLAUDE_BUILT_IN_EFFORTS: ReasoningEffort[] = [\n ...VISIBLE_STANDARD_EFFORTS,\n \"xhigh\",\n \"max\",\n];\n\nconst VISIBLE_CLAUDE_EFFORTS: ReasoningEffort[] = [\n ...VISIBLE_STANDARD_EFFORTS,\n \"max\",\n];\n\nconst effortSet = new Set<string>(REASONING_EFFORTS);\n\nexport function isReasoningEffort(value: unknown): value is ReasoningEffort {\n return typeof value === \"string\" && effortSet.has(value);\n}\n\nexport function getReasoningEffortOptionsForModel(\n model: string | undefined,\n): ReasoningEffort[] {\n if (!model) return [];\n if (isGPTReasoningModel(model)) {\n return VISIBLE_GPT_EFFORTS;\n }\n if (isClaudeReasoningModel(model)) {\n return supportsClaudeXHigh(model)\n ? VISIBLE_CLAUDE_BUILT_IN_EFFORTS\n : VISIBLE_CLAUDE_EFFORTS;\n }\n if (isGeminiReasoningModel(model)) {\n return VISIBLE_STANDARD_EFFORTS;\n }\n return [];\n}\n\nexport function normalizeReasoningEffortForModel(\n model: string | undefined,\n effort: ReasoningEffort | undefined,\n): ReasoningEffort | undefined {\n if (!model) return undefined;\n let normalized =\n !effort || effort === \"auto\" ? DEFAULT_REASONING_EFFORT : effort;\n if (\n normalized === \"xhigh\" &&\n isClaudeReasoningModel(model) &&\n !supportsClaudeXHigh(model)\n ) {\n normalized = \"high\";\n }\n if (normalized === \"max\" && isGPTReasoningModel(model)) {\n normalized = \"xhigh\";\n }\n const options = getReasoningEffortOptionsForModel(model);\n if (!options.length || !options.includes(normalized)) {\n return undefined;\n }\n return normalized;\n}\n\n/**\n * Normalize a chat request before it reaches an engine. Explicit off/minimal\n * sentinels must survive this layer so the engine can distinguish them from a\n * missing selection, which now means the Medium default.\n */\nexport function normalizeReasoningEffortForRequest(\n model: string | undefined,\n effort: ReasoningEffort | undefined,\n): ReasoningEffort | undefined {\n if (effort === \"none\" || effort === \"minimal\") return effort;\n return normalizeReasoningEffortForModel(model, effort);\n}\n\nexport function reasoningEffortLabel(effort: ReasoningEffort | undefined) {\n return REASONING_EFFORT_LABELS[\n !effort || effort === \"auto\" ? DEFAULT_REASONING_EFFORT : effort\n ];\n}\n\n/**\n * Resolve a user-facing selection for a model. Legacy `auto`, missing values,\n * and tiers unsupported by the newly selected model all become Medium.\n * Non-reasoning models still retain Medium in persisted chat state so moving\n * back to a reasoning model has a predictable default; their engines omit the\n * effort through `normalizeReasoningEffortForModel`.\n */\nexport function resolveReasoningEffortSelection(\n model: string | undefined,\n effort: ReasoningEffort | undefined,\n): ReasoningEffort {\n const requested =\n !effort || effort === \"auto\" ? DEFAULT_REASONING_EFFORT : effort;\n const options = getReasoningEffortOptionsForModel(model);\n return options.length === 0 || options.includes(requested)\n ? requested\n : DEFAULT_REASONING_EFFORT;\n}\n\n/**\n * One tier down from each effort, stopping at \"minimal\" — legacy `auto`,\n * \"none\", and \"minimal\" itself are left unchanged. Used by the\n * empty-final-response retry so a retried turn asks for meaningfully less\n * reasoning instead of repeating the exact request that came back empty.\n */\nconst REASONING_EFFORT_STEP_DOWN: Partial<\n Record<ReasoningEffort, ReasoningEffort>\n> = {\n max: \"xhigh\",\n xhigh: \"high\",\n high: \"medium\",\n medium: \"low\",\n low: \"minimal\",\n};\n\nexport function stepDownReasoningEffort(\n effort: ReasoningEffort | undefined,\n): ReasoningEffort | undefined {\n if (!effort) return effort;\n return REASONING_EFFORT_STEP_DOWN[effort] ?? effort;\n}\n\nfunction isGPTReasoningModel(model: string) {\n const id = model.toLowerCase().replace(/^openai\\//, \"\");\n return /^gpt-5/.test(id) || /^o\\d/.test(id);\n}\n\nfunction isClaudeReasoningModel(model: string) {\n const id = model.toLowerCase().replace(/^anthropic\\//, \"\");\n if (id.includes(\"fable-5\") || id.includes(\"mythos-5\")) return true;\n if (id.includes(\"sonnet-5\") || id.includes(\"sonnet-4-6\")) return true;\n if (id.includes(\"haiku-4-5\")) return true;\n const opusMatch = id.match(/opus-4[-.](\\d+)/);\n return opusMatch ? parseInt(opusMatch[1], 10) >= 6 : false;\n}\n\n/**\n * Anthropic's adaptive-thinking API is only available on the newer Claude\n * model families. Claude Haiku 4.5 is reasoning-capable, but it still\n * requires the legacy manual `budget_tokens` configuration.\n */\nexport function supportsClaudeAdaptiveThinking(model: string | undefined) {\n if (!model) return false;\n const id = model.toLowerCase().replace(/^anthropic\\//, \"\");\n if (id.includes(\"fable-5\") || id.includes(\"mythos-5\")) return true;\n if (id.includes(\"sonnet-5\") || id.includes(\"sonnet-4-6\")) return true;\n const opusMatch = id.match(/opus-4[-.](\\d+)/);\n return opusMatch ? parseInt(opusMatch[1], 10) >= 6 : false;\n}\n\n/**\n * Map the shared reasoning ladder to Anthropic's manual thinking budgets for\n * models that do not support adaptive thinking (currently Claude Haiku 4.5).\n */\nexport function anthropicManualThinkingBudget(effort: ReasoningEffort) {\n switch (effort) {\n case \"low\":\n return 1_024;\n case \"medium\":\n return 4_096;\n case \"high\":\n return 8_000;\n case \"xhigh\":\n return 16_000;\n case \"max\":\n return 32_000;\n default:\n return 4_096;\n }\n}\n\nfunction supportsClaudeXHigh(model: string) {\n const id = model.toLowerCase().replace(/^anthropic\\//, \"\");\n // Models that support the xhigh effort tier (built-in extended thinking via\n // output_config.effort). Keep this version-aware so any future Claude model\n // with a higher patch/minor number is automatically included rather than\n // silently falling back to the lower \"high\" tier.\n // claude-fable-5 is a Mythos-class model and also supports xhigh.\n if (id.includes(\"fable-5\")) return true;\n // Sonnet 5 supports the expanded effort ladder through Builder/Anthropic.\n if (id.includes(\"sonnet-5\")) return true;\n // opus-4-7 introduced xhigh; all opus-4.x successors (4-8, 4-9…) should too.\n const opusMatch = id.match(/opus-4[-.](\\d+)/);\n if (opusMatch) {\n return parseInt(opusMatch[1], 10) >= 7;\n }\n return false;\n}\n\nfunction isGeminiReasoningModel(model: string) {\n return /^gemini-/.test(model.toLowerCase().replace(/^google\\//, \"\"));\n}\n"]}
1
+ {"version":3,"file":"reasoning-effort.js","sourceRoot":"","sources":["../../src/shared/reasoning-effort.ts"],"names":[],"mappings":"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","sourcesContent":["export const REASONING_EFFORTS = [\n \"auto\",\n \"none\",\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n \"max\",\n] as const;\n\nexport type ReasoningEffort = (typeof REASONING_EFFORTS)[number];\n\n/**\n * Shared chat always chooses an explicit reasoning tier. Keep `auto` in the\n * accepted type only so older persisted selections and external callers can\n * migrate cleanly; new UI and engine defaults resolve it to Medium.\n */\nexport const DEFAULT_REASONING_EFFORT: ReasoningEffort = \"medium\";\n\nexport const REASONING_EFFORT_LABELS: Record<ReasoningEffort, string> = {\n auto: \"Auto\",\n none: \"None\",\n minimal: \"Minimal\",\n low: \"Low\",\n medium: \"Medium\",\n high: \"High\",\n xhigh: \"Extra High\",\n max: \"Max\",\n};\n\nconst VISIBLE_STANDARD_EFFORTS: ReasoningEffort[] = [\"low\", \"medium\", \"high\"];\n\nconst VISIBLE_GPT_EFFORTS: ReasoningEffort[] = [\n ...VISIBLE_STANDARD_EFFORTS,\n \"xhigh\",\n];\n\nconst VISIBLE_CLAUDE_BUILT_IN_EFFORTS: ReasoningEffort[] = [\n ...VISIBLE_STANDARD_EFFORTS,\n \"xhigh\",\n \"max\",\n];\n\nconst VISIBLE_CLAUDE_EFFORTS: ReasoningEffort[] = [\n ...VISIBLE_STANDARD_EFFORTS,\n \"max\",\n];\n\nconst effortSet = new Set<string>(REASONING_EFFORTS);\n\nexport function isReasoningEffort(value: unknown): value is ReasoningEffort {\n return typeof value === \"string\" && effortSet.has(value);\n}\n\nexport function getReasoningEffortOptionsForModel(\n model: string | undefined,\n): ReasoningEffort[] {\n if (!model) return [];\n if (isGPTReasoningModel(model)) {\n return VISIBLE_GPT_EFFORTS;\n }\n if (isClaudeReasoningModel(model)) {\n return supportsClaudeXHigh(model)\n ? VISIBLE_CLAUDE_BUILT_IN_EFFORTS\n : VISIBLE_CLAUDE_EFFORTS;\n }\n if (isGeminiReasoningModel(model)) {\n return VISIBLE_STANDARD_EFFORTS;\n }\n return [];\n}\n\nexport function normalizeReasoningEffortForModel(\n model: string | undefined,\n effort: ReasoningEffort | undefined,\n): ReasoningEffort | undefined {\n if (!model) return undefined;\n let normalized =\n !effort || effort === \"auto\" ? DEFAULT_REASONING_EFFORT : effort;\n if (\n normalized === \"xhigh\" &&\n isClaudeReasoningModel(model) &&\n !supportsClaudeXHigh(model)\n ) {\n normalized = \"high\";\n }\n if (normalized === \"max\" && isGPTReasoningModel(model)) {\n normalized = \"xhigh\";\n }\n const options = getReasoningEffortOptionsForModel(model);\n if (!options.length || !options.includes(normalized)) {\n return undefined;\n }\n return normalized;\n}\n\n/**\n * Normalize a chat request before it reaches an engine. Explicit off/minimal\n * sentinels must survive this layer so the engine can distinguish them from a\n * missing selection, which now means the Medium default.\n */\nexport function normalizeReasoningEffortForRequest(\n model: string | undefined,\n effort: ReasoningEffort | undefined,\n): ReasoningEffort | undefined {\n if (effort === \"none\" || effort === \"minimal\") return effort;\n return normalizeReasoningEffortForModel(model, effort);\n}\n\nexport function reasoningEffortLabel(effort: ReasoningEffort | undefined) {\n return REASONING_EFFORT_LABELS[\n !effort || effort === \"auto\" ? DEFAULT_REASONING_EFFORT : effort\n ];\n}\n\n/**\n * Resolve a user-facing selection for a model. Legacy `auto`, missing values,\n * and tiers unsupported by the newly selected model all become Medium.\n * Non-reasoning models still retain Medium in persisted chat state so moving\n * back to a reasoning model has a predictable default; their engines omit the\n * effort through `normalizeReasoningEffortForModel`.\n */\nexport function resolveReasoningEffortSelection(\n model: string | undefined,\n effort: ReasoningEffort | undefined,\n): ReasoningEffort {\n const requested =\n !effort || effort === \"auto\" ? DEFAULT_REASONING_EFFORT : effort;\n const options = getReasoningEffortOptionsForModel(model);\n return options.length === 0 || options.includes(requested)\n ? requested\n : DEFAULT_REASONING_EFFORT;\n}\n\n/**\n * One tier down from each effort, stopping at \"minimal\" — legacy `auto`,\n * \"none\", and \"minimal\" itself are left unchanged. Used by the\n * empty-final-response retry so a retried turn asks for meaningfully less\n * reasoning instead of repeating the exact request that came back empty.\n */\nconst REASONING_EFFORT_STEP_DOWN: Partial<\n Record<ReasoningEffort, ReasoningEffort>\n> = {\n max: \"xhigh\",\n xhigh: \"high\",\n high: \"medium\",\n medium: \"low\",\n low: \"minimal\",\n};\n\nexport function stepDownReasoningEffort(\n effort: ReasoningEffort | undefined,\n): ReasoningEffort | undefined {\n if (!effort) return effort;\n return REASONING_EFFORT_STEP_DOWN[effort] ?? effort;\n}\n\nexport function isGPTReasoningModel(model: string) {\n const id = model.toLowerCase().replace(/^openai\\//, \"\");\n return /^gpt-5/.test(id) || /^o\\d/.test(id);\n}\n\nfunction isClaudeReasoningModel(model: string) {\n const id = model.toLowerCase().replace(/^anthropic\\//, \"\");\n if (id.includes(\"fable-5\") || id.includes(\"mythos-5\")) return true;\n if (id.includes(\"sonnet-5\") || id.includes(\"sonnet-4-6\")) return true;\n if (id.includes(\"haiku-4-5\")) return true;\n const opusMatch = id.match(/opus-4[-.](\\d+)/);\n return opusMatch ? parseInt(opusMatch[1], 10) >= 6 : false;\n}\n\n/**\n * Anthropic's adaptive-thinking API is only available on the newer Claude\n * model families. Claude Haiku 4.5 is reasoning-capable, but it still\n * requires the legacy manual `budget_tokens` configuration.\n */\nexport function supportsClaudeAdaptiveThinking(model: string | undefined) {\n if (!model) return false;\n const id = model.toLowerCase().replace(/^anthropic\\//, \"\");\n if (id.includes(\"fable-5\") || id.includes(\"mythos-5\")) return true;\n if (id.includes(\"sonnet-5\") || id.includes(\"sonnet-4-6\")) return true;\n const opusMatch = id.match(/opus-4[-.](\\d+)/);\n return opusMatch ? parseInt(opusMatch[1], 10) >= 6 : false;\n}\n\n/**\n * Map the shared reasoning ladder to Anthropic's manual thinking budgets for\n * models that do not support adaptive thinking (currently Claude Haiku 4.5).\n */\nexport function anthropicManualThinkingBudget(effort: ReasoningEffort) {\n switch (effort) {\n case \"low\":\n return 1_024;\n case \"medium\":\n return 4_096;\n case \"high\":\n return 8_000;\n case \"xhigh\":\n return 16_000;\n case \"max\":\n return 32_000;\n default:\n return 4_096;\n }\n}\n\nfunction supportsClaudeXHigh(model: string) {\n const id = model.toLowerCase().replace(/^anthropic\\//, \"\");\n // Models that support the xhigh effort tier (built-in extended thinking via\n // output_config.effort). Keep this version-aware so any future Claude model\n // with a higher patch/minor number is automatically included rather than\n // silently falling back to the lower \"high\" tier.\n // claude-fable-5 is a Mythos-class model and also supports xhigh.\n if (id.includes(\"fable-5\")) return true;\n // Sonnet 5 supports the expanded effort ladder through Builder/Anthropic.\n if (id.includes(\"sonnet-5\")) return true;\n // opus-4-7 introduced xhigh; all opus-4.x successors (4-8, 4-9…) should too.\n const opusMatch = id.match(/opus-4[-.](\\d+)/);\n if (opusMatch) {\n return parseInt(opusMatch[1], 10) >= 7;\n }\n return false;\n}\n\nfunction isGeminiReasoningModel(model: string) {\n return /^gemini-/.test(model.toLowerCase().replace(/^google\\//, \"\"));\n}\n"]}
@@ -358,23 +358,50 @@ export function Sidebar({
358
358
  >
359
359
  <Link
360
360
  to="/"
361
+ onClick={(event) => {
362
+ if (
363
+ !collapsible ||
364
+ !onCollapsedChange ||
365
+ event.metaKey ||
366
+ event.ctrlKey ||
367
+ event.shiftKey ||
368
+ event.altKey ||
369
+ event.button !== 0
370
+ ) {
371
+ return;
372
+ }
373
+ event.preventDefault();
374
+ onCollapsedChange(!collapsed);
375
+ }}
361
376
  className={cn(
362
377
  "flex min-w-0 items-center rounded outline-none focus-visible:ring-2 focus-visible:ring-ring",
363
378
  collapsed ? "size-7 justify-center" : "flex-1 gap-3",
364
379
  )}
365
- aria-label={collapsed ? APP_TITLE : undefined}
380
+ aria-label={
381
+ collapsible && onCollapsedChange
382
+ ? collapsed
383
+ ? t("navigation.expandSidebar")
384
+ : t("navigation.collapseSidebar")
385
+ : collapsed
386
+ ? APP_TITLE
387
+ : undefined
388
+ }
366
389
  >
367
390
  <img
368
391
  src={appPath("/agent-native-icon-light.svg")}
369
392
  alt=""
370
393
  aria-hidden="true"
371
- className="block h-4 w-auto shrink-0 dark:hidden"
394
+ width={28}
395
+ height={16}
396
+ className="block h-4 w-7 shrink-0 object-contain object-center dark:hidden"
372
397
  />
373
398
  <img
374
399
  src={appPath("/agent-native-icon-dark.svg")}
375
400
  alt=""
376
401
  aria-hidden="true"
377
- className="hidden h-4 w-auto shrink-0 dark:block"
402
+ width={28}
403
+ height={16}
404
+ className="hidden h-4 w-7 shrink-0 object-contain object-center dark:block"
378
405
  />
379
406
  <div className={cn("min-w-0", collapsed && "sr-only")}>
380
407
  <p className="truncate text-sm font-semibold text-sidebar-accent-foreground">
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-31
4
+ ---
5
+
6
+ Clicking the Agent Native logo now toggles the app sidebar.
@@ -17,6 +17,17 @@ Agents call other agents over A2A, a JSON-RPC protocol for discovery and
17
17
  delegation. Use it when work belongs to a different agent entirely — not the
18
18
  local agent chat.
19
19
 
20
+ **No workarounds when A2A feels flaky.** The strong default is `ask_app` (or
21
+ `call-agent`) working reliably, full stop — not apps reaching around it. Do
22
+ not have app A generate and execute raw SQL against app B's database, and do
23
+ not expose B's internal tools directly to A as a substitute for delegation.
24
+ The receiving agent has context, skills, and guardrails the caller doesn't;
25
+ bypassing it to work around a flaky A2A call reintroduces exactly the bugs A2A
26
+ exists to prevent, and makes the real reliability problem invisible instead of
27
+ fixing it. If A2A delegation is unreliable, fix A2A — file it as a bug in the
28
+ delegation path (timeout handling, retries, typed terminal states), don't
29
+ route around it app by app.
30
+
20
31
  Connecting app A to app B is two independent things, and both must be true:
21
32
 
22
33
  1. **B is registered on A** as a `remote-agents/<id>.json` resource.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/core",
3
- "version": "0.132.2",
3
+ "version": "0.133.1",
4
4
  "description": "Framework for agent-native application development — where AI agents and UI share SQL state, actions, and context",
5
5
  "homepage": "https://github.com/BuilderIO/agent-native#readme",
6
6
  "bugs": {
@@ -5,6 +5,8 @@ export const MAX_A2A_DELEGATION_HOPS = 3;
5
5
 
6
6
  const APP_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;
7
7
  const CORRELATION_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._:-]*$/;
8
+ // Model ids also carry `/` (provider-prefixed gateway ids).
9
+ const MODEL_HINT_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._:/-]*$/;
8
10
 
9
11
  function boundedIdentifier(
10
12
  value: unknown,
@@ -29,7 +31,10 @@ export function sanitizeA2ACorrelationId(value: unknown): string | undefined {
29
31
  /**
30
32
  * Keep only bounded, opaque ASCII correlation identifiers. These values
31
33
  * remain telemetry hints; authentication continues to come exclusively from
32
- * the verified A2A token/request context.
34
+ * the verified A2A token/request context. `callerModel` is the one value here
35
+ * a receiver may act on, and only as a preference — it never reaches identity,
36
+ * org, access, or approval resolution, and it can only name a model the
37
+ * receiver's own engine already offers (see `resolveDelegatedRunModel`).
33
38
  */
34
39
  export function sanitizeA2ACorrelationMetadata(
35
40
  value: unknown,
@@ -41,6 +46,10 @@ export function sanitizeA2ACorrelationMetadata(
41
46
  const parentRunId = sanitizeA2ACorrelationId(metadata.parentRunId);
42
47
  const parentTurnId = sanitizeA2ACorrelationId(metadata.parentTurnId);
43
48
  const invocationId = sanitizeA2ACorrelationId(metadata.invocationId);
49
+ const callerModel = boundedIdentifier(
50
+ metadata.callerModel,
51
+ MODEL_HINT_PATTERN,
52
+ );
44
53
  const providedDelegationDepth =
45
54
  typeof metadata.delegationDepth === "number" &&
46
55
  Number.isInteger(metadata.delegationDepth) &&
@@ -77,5 +86,6 @@ export function sanitizeA2ACorrelationMetadata(
77
86
  ...(invocationId ? { invocationId } : {}),
78
87
  ...(delegationDepth !== undefined ? { delegationDepth } : {}),
79
88
  ...(visitedApps.length > 0 ? { visitedApps } : {}),
89
+ ...(callerModel ? { callerModel } : {}),
80
90
  };
81
91
  }
package/src/a2a/types.ts CHANGED
@@ -160,9 +160,11 @@ export interface A2ASourceContextReference {
160
160
  }
161
161
 
162
162
  /**
163
- * Telemetry-only cross-app correlation. Receivers must never use these
164
- * caller-supplied values for identity, ownership, org scoping, access, or
165
- * approval decisions.
163
+ * Telemetry-only cross-app correlation, plus `callerModel` a preference
164
+ * hint. Receivers must never use any caller-supplied value here for identity,
165
+ * ownership, org scoping, access, or approval decisions. `callerModel` widens
166
+ * this channel to a preference, never to an authorization: it may at most pick
167
+ * a model the receiver's already-resolved engine advertises.
166
168
  */
167
169
  export interface A2ACorrelationMetadata {
168
170
  callerApp?: string;
@@ -174,6 +176,12 @@ export interface A2ACorrelationMetadata {
174
176
  delegationDepth?: number;
175
177
  /** Bounded app ids already visited, used only for cycle prevention. */
176
178
  visitedApps?: string[];
179
+ /**
180
+ * Model the caller resolved for its own turn. A hint only: the receiver
181
+ * honours it just when it has no model of its own, and only after bounding
182
+ * it to its own engine's catalog.
183
+ */
184
+ callerModel?: string;
177
185
  }
178
186
 
179
187
  // --- Framework config ---
@@ -23,7 +23,14 @@ import {
23
23
  supportsClaudeAdaptiveThinking,
24
24
  } from "../../shared/reasoning-effort.js";
25
25
  import { AI_SDK_MODEL_CONFIG, type AISDKProvider } from "../model-config.js";
26
- import { describeErrorWithCauses } from "./error-detail.js";
26
+ import {
27
+ LLM_MISSING_CREDENTIALS_ERROR_CODE,
28
+ LLM_MISSING_CREDENTIALS_MESSAGE,
29
+ } from "./credential-errors.js";
30
+ import {
31
+ classifyProviderError,
32
+ describeErrorWithCauses,
33
+ } from "./error-detail.js";
27
34
  import {
28
35
  createFirstEventAbortController,
29
36
  FIRST_STREAM_EVENT_TIMEOUT_MS,
@@ -225,6 +232,8 @@ class AISDKEngine implements AgentEngine {
225
232
  private readonly provider: AISDKProvider;
226
233
  private readonly apiKey?: string;
227
234
  private readonly baseUrl?: string;
235
+ /** Empty for providers that need no key (ollama). */
236
+ private readonly requiredEnvVars: readonly string[];
228
237
  private readonly appName?: string;
229
238
  private readonly appUrl?: string;
230
239
 
@@ -240,12 +249,34 @@ class AISDKEngine implements AgentEngine {
240
249
  this.apiKey =
241
250
  config.apiKey ??
242
251
  (config.allowEnvFallback === false ? "" : getProviderApiKey(provider));
252
+ this.requiredEnvVars = PROVIDER_ENV_VARS[provider];
243
253
  this.baseUrl = config.baseUrl;
244
254
  this.appName = config.appName;
245
255
  this.appUrl = config.appUrl;
246
256
  }
247
257
 
248
258
  async *stream(opts: EngineStreamOptions): AsyncIterable<EngineEvent> {
259
+ // An absent key is not an anonymous request. Without this the provider
260
+ // factory is constructed with no `apiKey`, the SDK omits the Authorization
261
+ // header entirely, and the gateway's 401 comes back as
262
+ // "Missing Authentication header" — which `classifyProviderError` codes
263
+ // `http_401`, a transport failure naming the wrong cause. A scheduled job
264
+ // then repeats that doomed unauthenticated request on every tick forever.
265
+ // `builder-engine` and `anthropic-engine` already fail closed here; this
266
+ // engine was the only one that did not.
267
+ //
268
+ // A configured `baseUrl` is exempt: a self-hosted or local gateway may
269
+ // legitimately accept unauthenticated requests.
270
+ if (!this.apiKey && !this.baseUrl && this.requiredEnvVars.length > 0) {
271
+ yield {
272
+ type: "stop",
273
+ reason: "error",
274
+ error: `${LLM_MISSING_CREDENTIALS_MESSAGE} (engine "${this.name}" has no ${this.requiredEnvVars.join(" or ")})`,
275
+ errorCode: LLM_MISSING_CREDENTIALS_ERROR_CODE,
276
+ };
277
+ return;
278
+ }
279
+
249
280
  let aiModule: any;
250
281
  try {
251
282
  aiModule = await import("ai");
@@ -440,6 +471,7 @@ class AISDKEngine implements AgentEngine {
440
471
  // before it, regardless of where `finish` arrives in the stream.
441
472
  let bufferedStop: EngineEvent | undefined;
442
473
  let sawFirstEvent = false;
474
+ let credentialFailureRecorded = false;
443
475
 
444
476
  for await (const part of result.fullStream) {
445
477
  // "start" is a synthetic lifecycle marker the AI SDK enqueues
@@ -453,6 +485,21 @@ class AISDKEngine implements AgentEngine {
453
485
  }
454
486
  for (const event of aiSdkPartToEngineEvents(part)) {
455
487
  observeStreamedToolInput(toolInputs, event);
488
+ if (
489
+ event.type === "stop" &&
490
+ event.reason === "error" &&
491
+ event.statusCode === 401
492
+ ) {
493
+ await recordProviderCredentialAuthFailure({
494
+ key: PROVIDER_ENV_VARS[this.provider][0],
495
+ value: this.apiKey,
496
+ status: event.statusCode,
497
+ code: event.errorCode ?? "http_401",
498
+ message:
499
+ event.error || "The model provider rejected the saved API key.",
500
+ });
501
+ credentialFailureRecorded = true;
502
+ }
456
503
  if (event.type === "stop") {
457
504
  bufferedStop = event;
458
505
  } else {
@@ -491,47 +538,25 @@ class AISDKEngine implements AgentEngine {
491
538
  }
492
539
 
493
540
  yield { type: "assistant-content", parts: assistantContent };
494
- await clearProviderCredentialAuthFailure({
495
- key: PROVIDER_ENV_VARS[this.provider][0],
496
- value: this.apiKey,
497
- });
541
+ if (!credentialFailureRecorded) {
542
+ await clearProviderCredentialAuthFailure({
543
+ key: PROVIDER_ENV_VARS[this.provider][0],
544
+ value: this.apiKey,
545
+ });
546
+ }
498
547
  yield bufferedStop ?? { type: "stop", reason: "end_turn" };
499
548
  } catch (err: any) {
500
549
  const timedOut = firstEventAbort.didTimeout();
501
- // AI SDK wraps exhausted retries in RetryError and keeps the final
502
- // APICallError on `lastError`. Read classification fields from that
503
- // provider error so the retry wrapper does not erase transport status.
504
- const providerError =
505
- err?.lastError instanceof Error ? err.lastError : err;
506
- // Surface structured fields from AI SDK's APICallError so
507
- // isRetryableError can check statusCode/providerRetryable directly
508
- // rather than keyword-matching the message string.
509
- const statusCode: number | undefined =
510
- typeof providerError?.statusCode === "number"
511
- ? providerError.statusCode
512
- : undefined;
513
- const rawMessage: string =
514
- providerError?.message ?? String(providerError);
515
- // Classify on the bare message — the recorded `errorMessage` carries the
516
- // cause chain, which is where the real transport failure lives.
517
550
  const errorMessage = describeErrorWithCauses(err);
518
- const normalizedRawMessage = rawMessage.trim().toLowerCase();
519
- const isConnectionError =
520
- !timedOut &&
521
- statusCode === undefined &&
522
- (normalizedRawMessage === "connection error." ||
523
- normalizedRawMessage.startsWith("cannot connect to api:"));
524
- const providerRetryable: boolean | undefined =
525
- typeof providerError?.isRetryable === "boolean"
526
- ? providerError.isRetryable
527
- : isConnectionError || timedOut
528
- ? true
529
- : undefined;
530
- if (statusCode === 401) {
551
+ // Same classifier the stream-part path uses (translate-ai-sdk.ts) — a
552
+ // provider failure must not be classifiable only when it happens to
553
+ // throw.
554
+ const classification = classifyProviderError(err, timedOut);
555
+ if (classification.statusCode === 401) {
531
556
  await recordProviderCredentialAuthFailure({
532
557
  key: PROVIDER_ENV_VARS[this.provider][0],
533
558
  value: this.apiKey,
534
- status: statusCode,
559
+ status: classification.statusCode,
535
560
  code: "http_401",
536
561
  message: errorMessage,
537
562
  });
@@ -540,17 +565,7 @@ class AISDKEngine implements AgentEngine {
540
565
  type: "stop",
541
566
  reason: "error",
542
567
  error: errorMessage,
543
- // Tag every known status with `http_<status>` (not just 401) so a
544
- // rate limit surfaces as `http_429`. The structured statusCode
545
- // already drives turn-level retries, but the run-level continuation
546
- // logic keys off the errorCode, so this lets a rate-limited turn
547
- // auto-resume too — matching the Builder gateway path.
548
- ...(statusCode !== undefined
549
- ? { errorCode: `http_${statusCode}`, statusCode }
550
- : isConnectionError || timedOut
551
- ? { errorCode: "provider_network_error" }
552
- : {}),
553
- ...(providerRetryable !== undefined ? { providerRetryable } : {}),
568
+ ...classification,
554
569
  };
555
570
  throw err;
556
571
  } finally {
@@ -22,6 +22,7 @@ import {
22
22
  } from "../../server/credential-provider.js";
23
23
  import { applyBuilderUtmTrackingParams } from "../../shared/builder-link-tracking.js";
24
24
  import {
25
+ isGPTReasoningModel,
25
26
  normalizeReasoningEffortForModel,
26
27
  type ReasoningEffort,
27
28
  } from "../../shared/reasoning-effort.js";
@@ -32,7 +33,10 @@ import {
32
33
  LLM_MISSING_CREDENTIALS_ERROR_CODE,
33
34
  LLM_MISSING_CREDENTIALS_MESSAGE,
34
35
  } from "./credential-errors.js";
35
- import { describeErrorWithCauses } from "./error-detail.js";
36
+ import {
37
+ describeErrorWithCauses,
38
+ isProviderConnectionErrorMessage,
39
+ } from "./error-detail.js";
36
40
  import { FIRST_STREAM_EVENT_TIMEOUT_MS } from "./first-event-timeout.js";
37
41
  import { resolveMaxOutputTokensForEngine } from "./output-tokens.js";
38
42
  import {
@@ -235,6 +239,8 @@ class BuilderEngine implements AgentEngine {
235
239
  }
236
240
  }
237
241
 
242
+ const gptToolsRequireExplicitNoReasoning =
243
+ cachedTools.length > 0 && isGPTReasoningModel(opts.model);
238
244
  const body: Record<string, unknown> = {
239
245
  model: opts.model,
240
246
  messages: cachedMessages,
@@ -248,7 +254,21 @@ class BuilderEngine implements AgentEngine {
248
254
  ...(typeof opts.temperature === "number"
249
255
  ? { temperature: opts.temperature }
250
256
  : {}),
251
- ...(reasoningEffort ? { reasoning_effort: reasoningEffort } : {}),
257
+ // OpenAI rejects `reasoning_effort` alongside function tools on Chat
258
+ // Completions ("Function tools with reasoning_effort are not supported
259
+ // for <model> in /v1/chat/completions … or set reasoning_effort to
260
+ // 'none'"), and the gateway routes GPT models there. Every chat on a
261
+ // gpt-5.x model failed deterministically because of this. Omitting the
262
+ // field does NOT help — OpenAI then applies the model's own default
263
+ // effort and rejects identically; only the explicit "none" clears it.
264
+ // Same guard as the ai-sdk engine's forced-Chat-Completions path.
265
+ ...(reasoningEffort || gptToolsRequireExplicitNoReasoning
266
+ ? {
267
+ reasoning_effort: gptToolsRequireExplicitNoReasoning
268
+ ? "none"
269
+ : reasoningEffort,
270
+ }
271
+ : {}),
252
272
  };
253
273
 
254
274
  const gatewayBaseUrl = getBuilderGatewayBaseUrl();
@@ -1137,14 +1157,6 @@ function isBuilderGatewayNetworkError(err: unknown): boolean {
1137
1157
  );
1138
1158
  }
1139
1159
 
1140
- function isProviderConnectionErrorMessage(message: string): boolean {
1141
- const normalized = message.trim().toLowerCase();
1142
- return (
1143
- normalized === "connection error." ||
1144
- normalized.includes("cannot connect to api:")
1145
- );
1146
- }
1147
-
1148
1160
  function captureBuilderGatewayTransportError(
1149
1161
  err: unknown,
1150
1162
  context: {