@agent-native/core 0.119.0 → 0.119.2

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 (274) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +23 -0
  3. package/corpus/core/package.json +1 -1
  4. package/corpus/core/src/a2a/client.ts +4 -0
  5. package/corpus/core/src/agent/production-agent.ts +1 -0
  6. package/corpus/core/src/client/AssistantChat.tsx +11 -50
  7. package/corpus/core/src/client/ErrorBoundary.tsx +25 -19
  8. package/corpus/core/src/client/agent-page/AgentTabFrame.tsx +1 -1
  9. package/corpus/core/src/client/agent-page/AgentTabsPage.tsx +23 -0
  10. package/corpus/core/src/client/components/ui/message-scroller.tsx +1 -9
  11. package/corpus/core/src/client/resources/ResourceTree.tsx +3 -3
  12. package/corpus/core/src/client/resources/ResourcesPanel.tsx +64 -60
  13. package/corpus/core/src/client/settings/AccountSettingsCard.tsx +228 -0
  14. package/corpus/core/src/client/settings/SecretsSection.tsx +7 -5
  15. package/corpus/core/src/client/settings/SettingsPanel.tsx +67 -244
  16. package/corpus/core/src/client/settings/SettingsTabsPage.tsx +88 -21
  17. package/corpus/core/src/client/settings/agent-settings-search.ts +0 -2
  18. package/corpus/core/src/client/settings/index.ts +7 -0
  19. package/corpus/core/src/client/vite-dev-recovery-script.ts +18 -1
  20. package/corpus/core/src/db/client.ts +65 -15
  21. package/corpus/core/src/db/index.ts +2 -0
  22. package/corpus/core/src/ingestion/figma-node-to-html.ts +20 -99
  23. package/corpus/core/src/ingestion/figma-paint-math.ts +371 -0
  24. package/corpus/core/src/ingestion/index.ts +20 -0
  25. package/corpus/core/src/localization/default-messages.ts +1 -0
  26. package/corpus/core/src/server/email.ts +33 -1
  27. package/corpus/core/src/styles/agent-native.css +23 -0
  28. package/corpus/core/src/templates/default/.agents/skills/frontend-design/SKILL.md +28 -0
  29. package/corpus/core/src/templates/default/app/routes/settings.tsx +2 -0
  30. package/corpus/core/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +28 -0
  31. package/corpus/core/src/vite/client.ts +76 -8
  32. package/corpus/templates/analytics/.agents/skills/frontend-design/SKILL.md +28 -0
  33. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +3 -1
  34. package/corpus/templates/analytics/app/components/layout/Layout.tsx +9 -13
  35. package/corpus/templates/analytics/app/components/layout/layout-route-policy.ts +2 -2
  36. package/corpus/templates/analytics/app/global.css +0 -5
  37. package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +0 -13
  38. package/corpus/templates/analytics/app/lib/sql-query.ts +15 -2
  39. package/corpus/templates/analytics/app/pages/Settings.tsx +2 -24
  40. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +6 -0
  41. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +4 -0
  42. package/corpus/templates/analytics/app/pages/settings/settings-search.ts +1 -1
  43. package/corpus/templates/analytics/changelog/2026-07-23-ask-analytics-is-better-centered-with-a-quieter-chat-rail-an.md +6 -0
  44. package/corpus/templates/analytics/changelog/2026-07-23-daily-dashboard-emails-load-read-heavy-panels-reliably.md +6 -0
  45. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +2 -2
  46. package/corpus/templates/analytics/server/jobs/dashboard-report.ts +39 -5
  47. package/corpus/templates/analytics/server/lib/dashboard-report.ts +186 -62
  48. package/corpus/templates/analytics/server/lib/first-party-analytics.ts +3 -0
  49. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +18 -2
  50. package/corpus/templates/analytics/shared/dashboard-report-timeouts.ts +3 -0
  51. package/corpus/templates/assets/.agents/skills/frontend-design/SKILL.md +28 -0
  52. package/corpus/templates/assets/app/components/layout/Layout.tsx +3 -4
  53. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +1 -1
  54. package/corpus/templates/assets/app/global.css +0 -5
  55. package/corpus/templates/assets/app/hooks/use-navigation-state.ts +0 -22
  56. package/corpus/templates/assets/app/routes/library.tsx +17 -9
  57. package/corpus/templates/assets/app/routes/settings.tsx +2 -0
  58. package/corpus/templates/assets/changelog/2026-07-23-create-and-chat-surfaces-are-better-centered-with-quieter-ch.md +6 -0
  59. package/corpus/templates/brain/.agents/skills/frontend-design/SKILL.md +28 -0
  60. package/corpus/templates/brain/app/components/layout/Layout.tsx +1 -1
  61. package/corpus/templates/brain/app/components/layout/Sidebar.tsx +1 -1
  62. package/corpus/templates/brain/app/global.css +0 -9
  63. package/corpus/templates/brain/app/hooks/use-navigation-state.ts +0 -12
  64. package/corpus/templates/brain/app/i18n-data.ts +1 -0
  65. package/corpus/templates/brain/app/lib/settings-navigation.ts +1 -1
  66. package/corpus/templates/brain/app/routes/settings.tsx +21 -22
  67. package/corpus/templates/brain/changelog/2026-07-23-ask-brain-is-better-centered-with-quieter-chat-history-and-a.md +6 -0
  68. package/corpus/templates/calendar/.agents/skills/frontend-design/SKILL.md +28 -0
  69. package/corpus/templates/calendar/app/pages/Settings.tsx +2 -0
  70. package/corpus/templates/chat/.agents/skills/frontend-design/SKILL.md +28 -0
  71. package/corpus/templates/chat/app/components/layout/Layout.tsx +1 -1
  72. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +1 -1
  73. package/corpus/templates/chat/app/hooks/use-navigation-state.ts +0 -15
  74. package/corpus/templates/chat/app/routes/settings.tsx +2 -0
  75. package/corpus/templates/chat/changelog/2026-07-23-full-page-chat-is-better-centered-with-quieter-chat-history-.md +6 -0
  76. package/corpus/templates/clips/.agents/skills/frontend-design/SKILL.md +28 -0
  77. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +2 -0
  78. package/corpus/templates/content/.agents/skills/frontend-design/SKILL.md +28 -0
  79. package/corpus/templates/content/app/routes/_app.settings.tsx +2 -0
  80. package/corpus/templates/design/.agents/skills/frontend-design/SKILL.md +28 -0
  81. package/corpus/templates/design/AGENTS.md +18 -5
  82. package/corpus/templates/design/FIGMA_INTEROPERABILITY.md +25 -12
  83. package/corpus/templates/design/actions/hydrate-figma-paste-images.ts +115 -0
  84. package/corpus/templates/design/actions/import-figma-clipboard.ts +83 -18
  85. package/corpus/templates/design/actions/import-figma-frame.ts +34 -21
  86. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +28 -1
  87. package/corpus/templates/design/app/components/design/DesignImportPanel.tsx +106 -11
  88. package/corpus/templates/design/app/components/design/FigmaHydrationDialog.tsx +273 -0
  89. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +7 -7
  90. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +57 -9
  91. package/corpus/templates/design/app/components/design/design-canvas/iframe-events.ts +10 -0
  92. package/corpus/templates/design/app/components/design/multi-screen/board-surface-html.ts +8 -1
  93. package/corpus/templates/design/app/components/design/multi-screen/types.ts +3 -0
  94. package/corpus/templates/design/app/i18n-data.ts +150 -2
  95. package/corpus/templates/design/app/lib/design-file-upload.ts +85 -0
  96. package/corpus/templates/design/app/lib/design-import.ts +19 -1
  97. package/corpus/templates/design/app/lib/figma-clipboard.ts +110 -10
  98. package/corpus/templates/design/app/routes/settings.tsx +2 -0
  99. package/corpus/templates/design/changelog/2026-07-20-paste-figma-frames-directly-onto-the-canvas-no-token-needed.md +6 -0
  100. package/corpus/templates/design/changelog/2026-07-21-fig-upload-frame-url-and-rate-limit-errors.md +5 -0
  101. package/corpus/templates/design/changelog/2026-07-22-connecting-a-figma-token-now-actually-fills-in-a-pasted-desi.md +6 -0
  102. package/corpus/templates/design/changelog/2026-07-22-figma-line-arrow-vectors-and-stroked-icons-now-render-instea.md +6 -0
  103. package/corpus/templates/design/changelog/2026-07-22-fill-a-no-token-figma-paste-s-images-by-dropping-the-origina.md +6 -0
  104. package/corpus/templates/design/changelog/2026-07-22-imported-and-pasted-figma-frames-now-render-faithfully-fixed.md +6 -0
  105. package/corpus/templates/design/server/handlers/import-design-file.ts +50 -0
  106. package/corpus/templates/design/server/lib/fig-file-decoder.ts +90 -49
  107. package/corpus/templates/design/server/lib/fig-file-import.ts +19 -5
  108. package/corpus/templates/design/server/lib/fig-file-to-html.ts +583 -78
  109. package/corpus/templates/design/server/lib/figma-clipboard-local-decode.ts +238 -0
  110. package/corpus/templates/design/server/lib/figma-image-hydration.ts +389 -0
  111. package/corpus/templates/design/server/lib/figma-node-import.ts +136 -36
  112. package/corpus/templates/design/server/register-secrets.ts +14 -2
  113. package/corpus/templates/dispatch/.agents/skills/frontend-design/SKILL.md +28 -0
  114. package/corpus/templates/dispatch/app/routes/settings.tsx +2 -0
  115. package/corpus/templates/dispatch/changelog/2026-07-23-quieter-progressive-disclosure.md +6 -0
  116. package/corpus/templates/forms/.agents/skills/frontend-design/SKILL.md +28 -0
  117. package/corpus/templates/forms/app/global.css +0 -5
  118. package/corpus/templates/forms/app/hooks/use-navigation-state.ts +0 -7
  119. package/corpus/templates/forms/app/root.tsx +1 -7
  120. package/corpus/templates/forms/app/routes/_app.settings.tsx +2 -0
  121. package/corpus/templates/forms/changelog/2026-07-23-ask-forms-is-better-centered-with-quieter-chat-history-and-a.md +6 -0
  122. package/corpus/templates/macros/.agents/skills/frontend-design/SKILL.md +28 -0
  123. package/corpus/templates/macros/app/routes/settings.tsx +2 -0
  124. package/corpus/templates/mail/.agents/skills/frontend-design/SKILL.md +28 -0
  125. package/corpus/templates/mail/app/pages/SettingsPage.tsx +3 -1
  126. package/corpus/templates/plan/.agents/skills/frontend-design/SKILL.md +28 -0
  127. package/corpus/templates/plan/app/components/layout/Layout.tsx +2 -2
  128. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +1 -13
  129. package/corpus/templates/plan/app/hooks/use-navigation-state.ts +0 -4
  130. package/corpus/templates/plan/app/routes/settings.tsx +2 -0
  131. package/corpus/templates/plan/changelog/2026-07-23-ask-plan-is-now-a-clean-full-page-chat-surface-with-better-c.md +6 -0
  132. package/corpus/templates/slides/.agents/skills/frontend-design/SKILL.md +28 -0
  133. package/corpus/templates/slides/app/routes/settings.tsx +2 -0
  134. package/corpus/templates/tasks/.agents/skills/frontend-design/SKILL.md +28 -0
  135. package/corpus/toolkit/CHANGELOG.md +6 -0
  136. package/corpus/toolkit/package.json +1 -1
  137. package/corpus/toolkit/src/chat-history.css +2 -2
  138. package/corpus/toolkit/src/composer/PromptComposer.tsx +0 -31
  139. package/corpus/toolkit/src/composer/RealtimeVoiceMode.tsx +7 -2
  140. package/corpus/toolkit/src/styles.css +183 -36
  141. package/dist/a2a/client.d.ts +2 -0
  142. package/dist/a2a/client.d.ts.map +1 -1
  143. package/dist/a2a/client.js +2 -0
  144. package/dist/a2a/client.js.map +1 -1
  145. package/dist/agent/production-agent.d.ts.map +1 -1
  146. package/dist/agent/production-agent.js +1 -0
  147. package/dist/agent/production-agent.js.map +1 -1
  148. package/dist/client/AssistantChat.d.ts.map +1 -1
  149. package/dist/client/AssistantChat.js +11 -42
  150. package/dist/client/AssistantChat.js.map +1 -1
  151. package/dist/client/ErrorBoundary.d.ts.map +1 -1
  152. package/dist/client/ErrorBoundary.js +3 -2
  153. package/dist/client/ErrorBoundary.js.map +1 -1
  154. package/dist/client/agent-page/AgentTabFrame.js +1 -1
  155. package/dist/client/agent-page/AgentTabFrame.js.map +1 -1
  156. package/dist/client/agent-page/AgentTabsPage.d.ts.map +1 -1
  157. package/dist/client/agent-page/AgentTabsPage.js +13 -1
  158. package/dist/client/agent-page/AgentTabsPage.js.map +1 -1
  159. package/dist/client/components/ui/message-scroller.d.ts.map +1 -1
  160. package/dist/client/components/ui/message-scroller.js +2 -2
  161. package/dist/client/components/ui/message-scroller.js.map +1 -1
  162. package/dist/client/resources/ResourceTree.js +2 -2
  163. package/dist/client/resources/ResourceTree.js.map +1 -1
  164. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  165. package/dist/client/resources/ResourcesPanel.js +11 -11
  166. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  167. package/dist/client/settings/AccountSettingsCard.d.ts +9 -0
  168. package/dist/client/settings/AccountSettingsCard.d.ts.map +1 -0
  169. package/dist/client/settings/AccountSettingsCard.js +78 -0
  170. package/dist/client/settings/AccountSettingsCard.js.map +1 -0
  171. package/dist/client/settings/SecretsSection.d.ts.map +1 -1
  172. package/dist/client/settings/SecretsSection.js +2 -2
  173. package/dist/client/settings/SecretsSection.js.map +1 -1
  174. package/dist/client/settings/SettingsPanel.d.ts +3 -0
  175. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  176. package/dist/client/settings/SettingsPanel.js +25 -77
  177. package/dist/client/settings/SettingsPanel.js.map +1 -1
  178. package/dist/client/settings/SettingsTabsPage.d.ts +5 -1
  179. package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
  180. package/dist/client/settings/SettingsTabsPage.js +35 -9
  181. package/dist/client/settings/SettingsTabsPage.js.map +1 -1
  182. package/dist/client/settings/agent-settings-search.d.ts.map +1 -1
  183. package/dist/client/settings/agent-settings-search.js +0 -2
  184. package/dist/client/settings/agent-settings-search.js.map +1 -1
  185. package/dist/client/settings/index.d.ts +2 -1
  186. package/dist/client/settings/index.d.ts.map +1 -1
  187. package/dist/client/settings/index.js +2 -1
  188. package/dist/client/settings/index.js.map +1 -1
  189. package/dist/client/vite-dev-recovery-script.d.ts.map +1 -1
  190. package/dist/client/vite-dev-recovery-script.js +18 -1
  191. package/dist/client/vite-dev-recovery-script.js.map +1 -1
  192. package/dist/collab/routes.d.ts +1 -1
  193. package/dist/db/client.d.ts +18 -8
  194. package/dist/db/client.d.ts.map +1 -1
  195. package/dist/db/client.js +34 -11
  196. package/dist/db/client.js.map +1 -1
  197. package/dist/db/index.d.ts +1 -1
  198. package/dist/db/index.d.ts.map +1 -1
  199. package/dist/db/index.js.map +1 -1
  200. package/dist/ingestion/figma-node-to-html.d.ts.map +1 -1
  201. package/dist/ingestion/figma-node-to-html.js +14 -88
  202. package/dist/ingestion/figma-node-to-html.js.map +1 -1
  203. package/dist/ingestion/figma-paint-math.d.ts +157 -0
  204. package/dist/ingestion/figma-paint-math.d.ts.map +1 -0
  205. package/dist/ingestion/figma-paint-math.js +274 -0
  206. package/dist/ingestion/figma-paint-math.js.map +1 -0
  207. package/dist/ingestion/index.d.ts +1 -0
  208. package/dist/ingestion/index.d.ts.map +1 -1
  209. package/dist/ingestion/index.js +1 -0
  210. package/dist/ingestion/index.js.map +1 -1
  211. package/dist/localization/default-messages.d.ts +1 -0
  212. package/dist/localization/default-messages.d.ts.map +1 -1
  213. package/dist/localization/default-messages.js +1 -0
  214. package/dist/localization/default-messages.js.map +1 -1
  215. package/dist/notifications/routes.d.ts +2 -2
  216. package/dist/observability/routes.d.ts +3 -3
  217. package/dist/provider-api/actions/custom-provider-registration.d.ts +9 -9
  218. package/dist/provider-api/actions/provider-api.d.ts +11 -11
  219. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  220. package/dist/secrets/routes.d.ts +6 -6
  221. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  222. package/dist/server/email.d.ts +1 -0
  223. package/dist/server/email.d.ts.map +1 -1
  224. package/dist/server/email.js +29 -1
  225. package/dist/server/email.js.map +1 -1
  226. package/dist/server/transcribe-voice.d.ts +1 -1
  227. package/dist/styles/agent-native.css +23 -0
  228. package/dist/templates/chat/.agents/skills/frontend-design/SKILL.md +28 -0
  229. package/dist/templates/chat/app/components/layout/Layout.tsx +1 -1
  230. package/dist/templates/chat/app/components/layout/Sidebar.tsx +1 -1
  231. package/dist/templates/chat/app/hooks/use-navigation-state.ts +0 -15
  232. package/dist/templates/chat/app/routes/settings.tsx +2 -0
  233. package/dist/templates/chat/changelog/2026-07-23-full-page-chat-is-better-centered-with-quieter-chat-history-.md +6 -0
  234. package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +28 -0
  235. package/dist/templates/default/app/routes/settings.tsx +2 -0
  236. package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +28 -0
  237. package/dist/vite/client.d.ts.map +1 -1
  238. package/dist/vite/client.js +68 -6
  239. package/dist/vite/client.js.map +1 -1
  240. package/package.json +2 -2
  241. package/src/a2a/client.ts +4 -0
  242. package/src/agent/production-agent.ts +1 -0
  243. package/src/client/AssistantChat.tsx +11 -50
  244. package/src/client/ErrorBoundary.tsx +25 -19
  245. package/src/client/agent-page/AgentTabFrame.tsx +1 -1
  246. package/src/client/agent-page/AgentTabsPage.tsx +23 -0
  247. package/src/client/components/ui/message-scroller.tsx +1 -9
  248. package/src/client/resources/ResourceTree.tsx +3 -3
  249. package/src/client/resources/ResourcesPanel.tsx +64 -60
  250. package/src/client/settings/AccountSettingsCard.tsx +228 -0
  251. package/src/client/settings/SecretsSection.tsx +7 -5
  252. package/src/client/settings/SettingsPanel.tsx +67 -244
  253. package/src/client/settings/SettingsTabsPage.tsx +88 -21
  254. package/src/client/settings/agent-settings-search.ts +0 -2
  255. package/src/client/settings/index.ts +7 -0
  256. package/src/client/vite-dev-recovery-script.ts +18 -1
  257. package/src/db/client.ts +65 -15
  258. package/src/db/index.ts +2 -0
  259. package/src/ingestion/figma-node-to-html.ts +20 -99
  260. package/src/ingestion/figma-paint-math.ts +371 -0
  261. package/src/ingestion/index.ts +20 -0
  262. package/src/localization/default-messages.ts +1 -0
  263. package/src/server/email.ts +33 -1
  264. package/src/styles/agent-native.css +23 -0
  265. package/src/templates/chat/.agents/skills/frontend-design/SKILL.md +28 -0
  266. package/src/templates/chat/app/components/layout/Layout.tsx +1 -1
  267. package/src/templates/chat/app/components/layout/Sidebar.tsx +1 -1
  268. package/src/templates/chat/app/hooks/use-navigation-state.ts +0 -15
  269. package/src/templates/chat/app/routes/settings.tsx +2 -0
  270. package/src/templates/chat/changelog/2026-07-23-full-page-chat-is-better-centered-with-quieter-chat-history-.md +6 -0
  271. package/src/templates/default/.agents/skills/frontend-design/SKILL.md +28 -0
  272. package/src/templates/default/app/routes/settings.tsx +2 -0
  273. package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +28 -0
  274. package/src/vite/client.ts +76 -8
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/core",
3
- "version": "0.119.0",
3
+ "version": "0.119.2",
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": {
@@ -390,7 +390,7 @@
390
390
  "yjs": "^13.6.31",
391
391
  "zod": "^4.3.6",
392
392
  "@agent-native/recap-cli": "0.5.1",
393
- "@agent-native/toolkit": "^0.10.1"
393
+ "@agent-native/toolkit": "^0.10.2"
394
394
  },
395
395
  "devDependencies": {
396
396
  "@ai-sdk/anthropic": "^3.0.71",
package/src/a2a/client.ts CHANGED
@@ -647,6 +647,8 @@ export async function callAgent(
647
647
  text: string,
648
648
  opts?: {
649
649
  apiKey?: string;
650
+ /** Additional bearer tokens to try in order after apiKey during rotation. */
651
+ apiKeyFallbacks?: string[];
650
652
  /** Additional transport metadata. Receivers must not use it as identity. */
651
653
  metadata?: Record<string, unknown>;
652
654
  contextId?: string;
@@ -831,6 +833,7 @@ export async function callAction(
831
833
  async function buildA2AApiKeyAttempts(
832
834
  opts?: {
833
835
  apiKey?: string;
836
+ apiKeyFallbacks?: string[];
834
837
  userEmail?: string;
835
838
  orgDomain?: string;
836
839
  orgSecret?: string;
@@ -844,6 +847,7 @@ async function buildA2AApiKeyAttempts(
844
847
  };
845
848
 
846
849
  add(opts?.apiKey);
850
+ for (const fallback of opts?.apiKeyFallbacks ?? []) add(fallback);
847
851
 
848
852
  if (opts?.userEmail && (opts.orgSecret || process.env.A2A_SECRET)) {
849
853
  if (process.env.A2A_SECRET?.trim()) {
@@ -1846,6 +1846,7 @@ export async function callConnectedAgentReference(input: {
1846
1846
  const response = await input.callAgent(input.path, input.message, {
1847
1847
  async: true,
1848
1848
  apiKey: callerAuth.apiKey,
1849
+ apiKeyFallbacks: callerAuth.apiKeyFallbacks,
1849
1850
  metadata: callerAuth.metadata,
1850
1851
  userEmail: callerAuth.userEmail,
1851
1852
  orgDomain: callerAuth.orgDomain,
@@ -186,10 +186,7 @@ import {
186
186
  readSSEStreamRaw,
187
187
  settleInterruptedToolCalls,
188
188
  } from "./sse-event-processor.js";
189
- import {
190
- fetchAgentEngineConfiguredState,
191
- useAgentEngineConfigured,
192
- } from "./use-agent-engine-configured.js";
189
+ import { useAgentEngineConfigured } from "./use-agent-engine-configured.js";
193
190
  import type {
194
191
  ChatThreadScope,
195
192
  ChatThreadSnapshot,
@@ -292,8 +289,6 @@ const RECONNECT_NO_PROGRESS_CONTINUE_MESSAGE =
292
289
  // through transient labels ("Contacting model", "Preparing X action"); past it
293
290
  // the live label appears so a genuinely slow step reads as working, not hung.
294
291
  const ACTIVITY_LABEL_REVEAL_DELAY_MS = 6_000;
295
- const SUBMIT_ENGINE_STATUS_TIMEOUT_MS = 1000;
296
-
297
292
  type ActiveRunLookup = {
298
293
  active?: boolean;
299
294
  runId?: string;
@@ -2376,8 +2371,6 @@ const AssistantChatInner = forwardRef<
2376
2371
  { tabId, threadId },
2377
2372
  );
2378
2373
  const missingApiKey = agentEngineConfigured.missing;
2379
- const isProviderStatusChecking =
2380
- providerStatusChecksEnabled && agentEngineConfigured.state === "unknown";
2381
2374
  const isProviderStatusUnavailable =
2382
2375
  providerStatusChecksEnabled &&
2383
2376
  agentEngineConfigured.state === "unavailable";
@@ -2396,36 +2389,6 @@ const AssistantChatInner = forwardRef<
2396
2389
  if (agentEngineConfigured.state !== "configured") return;
2397
2390
  setMissingKeySetupOpen(false);
2398
2391
  }, [agentEngineConfigured.state]);
2399
- const ensureAgentEngineReadyForSubmit = useCallback(async () => {
2400
- const state =
2401
- agentEngineConfigured.state === "missing"
2402
- ? "missing"
2403
- : await fetchAgentEngineConfiguredState(providerStatusChecksEnabled, {
2404
- timeoutMs: SUBMIT_ENGINE_STATUS_TIMEOUT_MS,
2405
- });
2406
- if (state === "configured") return true;
2407
-
2408
- // Unknown means the readiness endpoint is unavailable or still resolving.
2409
- // Do not start a run optimistically: that recreates the long failure path
2410
- // this preflight exists to prevent. The mounted hook retries automatically.
2411
- if (state === "unknown" || state === "unavailable") return false;
2412
-
2413
- requestMissingKeySetup();
2414
- if (typeof window !== "undefined") {
2415
- window.dispatchEvent(
2416
- new CustomEvent("agent-chat:missing-api-key", {
2417
- detail: { tabId, threadId },
2418
- }),
2419
- );
2420
- }
2421
- return false;
2422
- }, [
2423
- agentEngineConfigured.state,
2424
- providerStatusChecksEnabled,
2425
- requestMissingKeySetup,
2426
- tabId,
2427
- threadId,
2428
- ]);
2429
2392
  const [authError, setAuthError] = useState<{
2430
2393
  sessionExpired?: boolean;
2431
2394
  } | null>(null);
@@ -4449,7 +4412,7 @@ const AssistantChatInner = forwardRef<
4449
4412
  ) => {
4450
4413
  if (isAgentChatSubmitCancelled(submitMessageId)) return;
4451
4414
  if (agentEngineConfigured.state === "missing") {
4452
- void ensureAgentEngineReadyForSubmit();
4415
+ requestMissingKeySetup();
4453
4416
  reportAgentChatSubmitResult(submitMessageId, false, "missing-engine");
4454
4417
  return;
4455
4418
  }
@@ -4687,12 +4650,12 @@ const AssistantChatInner = forwardRef<
4687
4650
  applyLocalQueuedMessages,
4688
4651
  agentEngineConfigured.state,
4689
4652
  buildComposerContextSubmission,
4690
- ensureAgentEngineReadyForSubmit,
4691
4653
  execMode,
4692
4654
  isRunning,
4693
4655
  materializeFrozenReconnectContent,
4694
4656
  markOptimisticRunning,
4695
4657
  appendThreadMessage,
4658
+ requestMissingKeySetup,
4696
4659
  updateComposerContextItems,
4697
4660
  ],
4698
4661
  );
@@ -5654,16 +5617,14 @@ const AssistantChatInner = forwardRef<
5654
5617
  ? "Connect AI to start chatting..."
5655
5618
  : isProviderStatusUnavailable
5656
5619
  ? t("agentPanel.connectionUnavailable")
5657
- : isProviderStatusChecking
5658
- ? t("agentPanel.checkingAiConnection")
5659
- : composerDisabled
5660
- ? (composerDisabledPlaceholder ??
5661
- "Open Desktop to use this chat.")
5662
- : isRunning
5663
- ? queuedMessages.length > 0
5664
- ? `${queuedMessages.length} queued — send a follow-up...`
5665
- : "Send a follow-up..."
5666
- : composerPlaceholder
5620
+ : composerDisabled
5621
+ ? (composerDisabledPlaceholder ??
5622
+ "Open Desktop to use this chat.")
5623
+ : isRunning
5624
+ ? queuedMessages.length > 0
5625
+ ? `${queuedMessages.length} queued — send a follow-up...`
5626
+ : "Send a follow-up..."
5627
+ : composerPlaceholder
5667
5628
  }
5668
5629
  onSubmit={
5669
5630
  isRunning || composerContextItems.length > 0
@@ -304,6 +304,8 @@ function ErrorScreen({ error }: { error: unknown }) {
304
304
  console.error("[ErrorBoundary]", error);
305
305
  }
306
306
 
307
+ const isNotFound = status === 404;
308
+
307
309
  return (
308
310
  <main className="flex items-center justify-center min-h-screen p-4 bg-background text-foreground">
309
311
  <div className="flex flex-col items-center text-center max-w-md">
@@ -318,25 +320,29 @@ function ErrorScreen({ error }: { error: unknown }) {
318
320
  <a href={appPath("/")} className={primaryActionClassName}>
319
321
  {copy.goHome}
320
322
  </a>
321
- <button
322
- type="button"
323
- onClick={() => window.location.reload()}
324
- className={secondaryActionClassName}
325
- >
326
- {copy.reload}
327
- </button>
328
- <ErrorReportActions
329
- appName="Agent Native"
330
- title={title}
331
- details={details}
332
- status={status}
333
- issueTitle={`Error screen: ${title}`}
334
- feedbackLabel={copy.sendFeedback}
335
- feedbackPlaceholder={copy.feedbackPlaceholder}
336
- githubLabel={copy.openGitHubIssue}
337
- feedbackClassName="h-9"
338
- githubClassName="h-9"
339
- />
323
+ {!isNotFound && (
324
+ <>
325
+ <button
326
+ type="button"
327
+ onClick={() => window.location.reload()}
328
+ className={secondaryActionClassName}
329
+ >
330
+ {copy.reload}
331
+ </button>
332
+ <ErrorReportActions
333
+ appName="Agent Native"
334
+ title={title}
335
+ details={details}
336
+ status={status}
337
+ issueTitle={`Error screen: ${title}`}
338
+ feedbackLabel={copy.sendFeedback}
339
+ feedbackPlaceholder={copy.feedbackPlaceholder}
340
+ githubLabel={copy.openGitHubIssue}
341
+ feedbackClassName="h-9"
342
+ githubClassName="h-9"
343
+ />
344
+ </>
345
+ )}
340
346
  </div>
341
347
  {stack && (
342
348
  <pre className="mt-6 w-full text-start text-xs overflow-auto p-4 bg-muted rounded">
@@ -27,7 +27,7 @@ export function AgentTabFrame({
27
27
  <div
28
28
  className={cn("mx-auto flex w-full max-w-5xl flex-col gap-6", className)}
29
29
  >
30
- <header className="flex flex-wrap items-start justify-between gap-4 border-b border-border/70 pb-5">
30
+ <header className="flex flex-wrap items-start justify-between gap-4 pb-5">
31
31
  <div className="space-y-1">
32
32
  <div className="flex items-center gap-1.5">
33
33
  <h2 className="text-xl font-semibold tracking-tight text-foreground">
@@ -10,6 +10,7 @@ import {
10
10
  IconPlugConnected,
11
11
  IconTopologyRing2,
12
12
  IconSearch,
13
+ IconSettings,
13
14
  IconShieldLock,
14
15
  IconX,
15
16
  } from "@tabler/icons-react";
@@ -49,6 +50,11 @@ import {
49
50
  type McpServer,
50
51
  type McpServerScope,
51
52
  } from "../resources/use-mcp-servers.js";
53
+ import {
54
+ AGENT_SETTINGS_SECTIONS,
55
+ buildSectionSearchEntries,
56
+ } from "../settings/agent-settings-search.js";
57
+ import { AgentSettingsContent } from "../settings/SettingsPanel.js";
52
58
  import type {
53
59
  SettingsSearchEntry,
54
60
  SettingsTabItem,
@@ -685,6 +691,7 @@ export function AgentTabsPage({
685
691
  value,
686
692
  onValueChange,
687
693
  }: AgentTabsPageProps) {
694
+ const t = useT();
688
695
  const { data: org } = useOrg();
689
696
  const canManageOrg =
690
697
  !org?.orgId || org.role === "owner" || org.role === "admin";
@@ -826,6 +833,22 @@ export function AgentTabsPage({
826
833
  </Suspense>
827
834
  ),
828
835
  },
836
+ {
837
+ id: "settings",
838
+ label: t("settings.agentTitle"),
839
+ icon: IconSettings,
840
+ group: "agent",
841
+ keywords: "agent settings model llm api keys limits voice automations",
842
+ searchEntries: buildSectionSearchEntries(AGENT_SETTINGS_SECTIONS),
843
+ content: (
844
+ <AgentTabFrame
845
+ title={t("settings.agentTitle")}
846
+ description={t("settings.agentDescription")}
847
+ >
848
+ <AgentSettingsContent />
849
+ </AgentTabFrame>
850
+ ),
851
+ },
829
852
  {
830
853
  id: "access",
831
854
  label: "Access",
@@ -57,19 +57,11 @@ function MessageScrollerViewport({
57
57
  <ShadcnMessageScroller.Viewport
58
58
  className={cn(
59
59
  "min-h-0 flex-1 overflow-y-auto overflow-x-hidden",
60
+ hasContentAbove && "message-scroller-viewport--top-fade",
60
61
  className,
61
62
  )}
62
63
  {...props}
63
64
  >
64
- {hasContentAbove && (
65
- <div
66
- aria-hidden="true"
67
- className="pointer-events-none sticky top-0 z-10 h-0"
68
- data-message-scroller-top-fade
69
- >
70
- <div className="absolute inset-x-0 top-0 h-12 bg-gradient-to-b from-background via-background/90 to-transparent" />
71
- </div>
72
- )}
73
65
  {children}
74
66
  </ShadcnMessageScroller.Viewport>
75
67
  );
@@ -771,7 +771,7 @@ export function ResourceTree({
771
771
 
772
772
  {variant === "collection"
773
773
  ? leafResources.length > 0 && (
774
- <div className="divide-y divide-border/60">
774
+ <div className="space-y-1">
775
775
  {leafResources.map((node) => (
776
776
  <CollectionResourceRow
777
777
  key={node.resource.id}
@@ -849,8 +849,8 @@ export function ResourceTree({
849
849
  )}
850
850
 
851
851
  {isEmpty && !creating && !isLoading && (
852
- <div className="flex flex-col items-start border-y border-border/60 px-2 py-5">
853
- <p className="ps-5 text-xs text-muted-foreground">
852
+ <div className="flex flex-col items-start px-2 py-5">
853
+ <p className="text-xs text-muted-foreground">
854
854
  {variant === "collection"
855
855
  ? "No resources in this collection yet"
856
856
  : "No files yet"}
@@ -1944,68 +1944,72 @@ export function ResourcesPanel({
1944
1944
  />
1945
1945
  )}
1946
1946
  {showPersonalTree && (
1947
- <ResourceTree
1948
- tree={displayedPersonalTree}
1949
- variant={resourceTreeVariant}
1950
- isLoading={personalTreeQuery.isLoading}
1951
- deletingId={
1952
- deleteResource.isPending
1953
- ? (deleteResource.variables as string)
1954
- : deleteMcpServer.isPending
1955
- ? `mcp:${(deleteMcpServer.variables as { scope: string }).scope}:${(deleteMcpServer.variables as { id: string }).id}`
1956
- : null
1957
- }
1958
- selectedId={selectedResourceId}
1959
- onSelect={handleSelect}
1960
- onCreateFile={(parentPath, name) =>
1961
- handleCreateFile(parentPath, name, "personal")
1962
- }
1963
- onCreateFolder={(parentPath, name) =>
1964
- handleCreateFolder(parentPath, name, "personal")
1965
- }
1966
- onDelete={handleDelete}
1967
- onRename={handleRename}
1968
- onDrop={(files) => handleUploadFiles(files, "personal")}
1969
- title="Personal"
1970
- titleTooltip="Files visible only to you"
1971
- sectionAction={renderScopeCreateMenu("personal")}
1972
- emptyStateAction={renderEmptyStateAction("personal")}
1973
- />
1947
+ <div className="pt-3">
1948
+ <ResourceTree
1949
+ tree={displayedPersonalTree}
1950
+ variant={resourceTreeVariant}
1951
+ isLoading={personalTreeQuery.isLoading}
1952
+ deletingId={
1953
+ deleteResource.isPending
1954
+ ? (deleteResource.variables as string)
1955
+ : deleteMcpServer.isPending
1956
+ ? `mcp:${(deleteMcpServer.variables as { scope: string }).scope}:${(deleteMcpServer.variables as { id: string }).id}`
1957
+ : null
1958
+ }
1959
+ selectedId={selectedResourceId}
1960
+ onSelect={handleSelect}
1961
+ onCreateFile={(parentPath, name) =>
1962
+ handleCreateFile(parentPath, name, "personal")
1963
+ }
1964
+ onCreateFolder={(parentPath, name) =>
1965
+ handleCreateFolder(parentPath, name, "personal")
1966
+ }
1967
+ onDelete={handleDelete}
1968
+ onRename={handleRename}
1969
+ onDrop={(files) => handleUploadFiles(files, "personal")}
1970
+ title="Personal"
1971
+ titleTooltip="Files visible only to you"
1972
+ sectionAction={renderScopeCreateMenu("personal")}
1973
+ emptyStateAction={renderEmptyStateAction("personal")}
1974
+ />
1975
+ </div>
1974
1976
  )}
1975
1977
  {showSharedTree && (
1976
- <ResourceTree
1977
- tree={displayedSharedTree}
1978
- variant={resourceTreeVariant}
1979
- isLoading={sharedTreeQuery.isLoading}
1980
- deletingId={
1981
- deleteResource.isPending
1982
- ? (deleteResource.variables as string)
1983
- : deleteMcpServer.isPending
1984
- ? `mcp:${(deleteMcpServer.variables as { scope: string }).scope}:${(deleteMcpServer.variables as { id: string }).id}`
1985
- : null
1986
- }
1987
- selectedId={selectedResourceId}
1988
- onSelect={handleSelect}
1989
- onCreateFile={(parentPath, name) =>
1990
- handleCreateFile(parentPath, name, "shared")
1991
- }
1992
- onCreateFolder={(parentPath, name) =>
1993
- handleCreateFolder(parentPath, name, "shared")
1994
- }
1995
- onDelete={handleDelete}
1996
- onRename={handleRename}
1997
- onDrop={(files) => handleUploadFiles(files, "shared")}
1998
- title="Organization"
1999
- titleTooltip={
2000
- canEditOrg
2001
- ? "Files visible to everyone in your organization"
2002
- : "Files visible to everyone in your organization. Read-only — only admins can edit."
2003
- }
2004
- readOnly={!canEditOrg}
2005
- headingHint={!canEditOrg ? "Read only" : undefined}
2006
- sectionAction={renderScopeCreateMenu("shared")}
2007
- emptyStateAction={renderEmptyStateAction("shared")}
2008
- />
1978
+ <div className="pt-3">
1979
+ <ResourceTree
1980
+ tree={displayedSharedTree}
1981
+ variant={resourceTreeVariant}
1982
+ isLoading={sharedTreeQuery.isLoading}
1983
+ deletingId={
1984
+ deleteResource.isPending
1985
+ ? (deleteResource.variables as string)
1986
+ : deleteMcpServer.isPending
1987
+ ? `mcp:${(deleteMcpServer.variables as { scope: string }).scope}:${(deleteMcpServer.variables as { id: string }).id}`
1988
+ : null
1989
+ }
1990
+ selectedId={selectedResourceId}
1991
+ onSelect={handleSelect}
1992
+ onCreateFile={(parentPath, name) =>
1993
+ handleCreateFile(parentPath, name, "shared")
1994
+ }
1995
+ onCreateFolder={(parentPath, name) =>
1996
+ handleCreateFolder(parentPath, name, "shared")
1997
+ }
1998
+ onDelete={handleDelete}
1999
+ onRename={handleRename}
2000
+ onDrop={(files) => handleUploadFiles(files, "shared")}
2001
+ title="Organization"
2002
+ titleTooltip={
2003
+ canEditOrg
2004
+ ? "Files visible to everyone in your organization"
2005
+ : "Files visible to everyone in your organization. Read-only — only admins can edit."
2006
+ }
2007
+ readOnly={!canEditOrg}
2008
+ headingHint={!canEditOrg ? "Read only" : undefined}
2009
+ sectionAction={renderScopeCreateMenu("shared")}
2010
+ emptyStateAction={renderEmptyStateAction("shared")}
2011
+ />
2012
+ </div>
2009
2013
  )}
2010
2014
  </div>
2011
2015
  )}