@agent-native/core 0.128.3 → 0.129.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (350) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +91 -0
  3. package/corpus/core/docs/content/template-design-collaboration-and-full-apps.mdx +3 -1
  4. package/corpus/core/package.json +6 -3
  5. package/corpus/core/src/a2a/client.ts +18 -4
  6. package/corpus/core/src/a2a/server.ts +19 -3
  7. package/corpus/core/src/a2a/types.ts +7 -0
  8. package/corpus/core/src/action.ts +43 -16
  9. package/corpus/core/src/agent/engine/ai-sdk-engine.ts +14 -10
  10. package/corpus/core/src/agent/production-agent.ts +41 -3
  11. package/corpus/core/src/agent/thread-data-builder.ts +5 -0
  12. package/corpus/core/src/chat-threads/migrations.ts +53 -0
  13. package/corpus/core/src/cli/create.ts +4 -0
  14. package/corpus/core/src/cli/skills-content/design-visual-edit-skill.ts +36 -16
  15. package/corpus/core/src/cli/skills.ts +16 -0
  16. package/corpus/core/src/client/AgentPanel.tsx +9 -5
  17. package/corpus/core/src/client/AssistantChat.tsx +138 -46
  18. package/corpus/core/src/client/MultiTabAssistantChat.tsx +16 -10
  19. package/corpus/core/src/client/agent-chat-adapter.ts +21 -3
  20. package/corpus/core/src/client/analytics.ts +159 -102
  21. package/corpus/core/src/client/chat/legacy-chart-shorthand.tsx +479 -0
  22. package/corpus/core/src/client/chat/markdown-renderer.tsx +23 -3
  23. package/corpus/core/src/client/chat/message-components.tsx +12 -5
  24. package/corpus/core/src/client/chat/runtime.ts +2 -1
  25. package/corpus/core/src/client/chat/tool-call-display.tsx +25 -2
  26. package/corpus/core/src/client/chat-model-groups.ts +3 -0
  27. package/corpus/core/src/client/client-status-requests.ts +161 -0
  28. package/corpus/core/src/client/settings/VoiceTranscriptionSection.tsx +2 -2
  29. package/corpus/core/src/client/sse-event-processor.ts +15 -3
  30. package/corpus/core/src/client/use-agent-engine-configured.ts +54 -50
  31. package/corpus/core/src/client/use-chat-models.ts +16 -11
  32. package/corpus/core/src/client/use-chat-threads.ts +32 -9
  33. package/corpus/core/src/client/use-session.ts +4 -5
  34. package/corpus/core/src/db/client.ts +83 -8
  35. package/corpus/core/src/db/ensure-additive-columns.ts +31 -20
  36. package/corpus/core/src/db/migrations.ts +22 -2
  37. package/corpus/core/src/extensions/actions.ts +1 -1
  38. package/corpus/core/src/mcp/approval-store.ts +99 -0
  39. package/corpus/core/src/mcp/build-server.ts +579 -303
  40. package/corpus/core/src/mcp/embed-app.ts +1 -1
  41. package/corpus/core/src/mcp/oauth-client-metadata.ts +380 -0
  42. package/corpus/core/src/mcp/oauth-route.ts +57 -52
  43. package/corpus/core/src/mcp/screen-memory-stdio.ts +400 -378
  44. package/corpus/core/src/mcp/server.ts +29 -145
  45. package/corpus/core/src/mcp/stdio.ts +72 -80
  46. package/corpus/core/src/mcp-client/manager.ts +6 -10
  47. package/corpus/core/src/mcp-client/oauth-client.ts +127 -36
  48. package/corpus/core/src/mcp-client/oauth-routes.ts +16 -6
  49. package/corpus/core/src/mcp-client/routes.ts +6 -5
  50. package/corpus/core/src/server/agent-capabilities.ts +20 -0
  51. package/corpus/core/src/server/agent-chat/action-filters-a2a.ts +27 -0
  52. package/corpus/core/src/server/agent-chat-plugin.ts +18 -0
  53. package/corpus/core/src/server/transcribe-voice.ts +14 -5
  54. package/corpus/core/src/templates/default/.agents/skills/security/SKILL.md +13 -2
  55. package/corpus/core/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +5 -2
  56. package/corpus/core/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +18 -0
  57. package/corpus/core/src/templates/workspace-core/.agents/skills/security/SKILL.md +13 -2
  58. package/corpus/templates/analytics/.agents/skills/data-querying/SKILL.md +12 -0
  59. package/corpus/templates/analytics/.agents/skills/security/SKILL.md +13 -2
  60. package/corpus/templates/analytics/actions/generate-chart.ts +2 -2
  61. package/corpus/templates/analytics/app/components/dashboard/DashboardPanelSkeleton.tsx +1 -10
  62. package/corpus/templates/analytics/app/global.css +0 -31
  63. package/corpus/templates/analytics/app/lib/sql-query.ts +46 -20
  64. package/corpus/templates/analytics/changelog/2026-07-28-analytics-dashboard-loading-states-now-use-a-simpler-standar.md +6 -0
  65. package/corpus/templates/analytics/changelog/2026-07-28-analytics-dashboards-now-load-first-party-charts-reliably-in.md +6 -0
  66. package/corpus/templates/analytics/server/lib/first-party-analytics-cache.ts +42 -16
  67. package/corpus/templates/analytics/server/lib/first-party-analytics.ts +4 -2
  68. package/corpus/templates/analytics/shared/sql-query-limits.ts +1 -0
  69. package/corpus/templates/assets/.agents/skills/security/SKILL.md +13 -2
  70. package/corpus/templates/brain/.agents/skills/security/SKILL.md +13 -2
  71. package/corpus/templates/calendar/.agents/skills/security/SKILL.md +13 -2
  72. package/corpus/templates/chat/.agents/skills/security/SKILL.md +13 -2
  73. package/corpus/templates/clips/.agents/skills/security/SKILL.md +13 -2
  74. package/corpus/templates/clips/app/components/player/player-controls.tsx +3 -6
  75. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +6 -2
  76. package/corpus/templates/clips/app/routes/share.$shareId.tsx +3 -1
  77. package/corpus/templates/clips/changelog/2026-07-28-copied-share-links-no-longer-leave-an-unnecessary-confirmati.md +6 -0
  78. package/corpus/templates/clips/changelog/2026-07-28-playback-skip-controls-no-longer-show-overlapping-numbers.md +6 -0
  79. package/corpus/templates/clips/changelog/2026-07-28-public-clips-share-buttons-now-use-a-clean-text-only-label.md +6 -0
  80. package/corpus/templates/clips/desktop/src/app.tsx +14 -17
  81. package/corpus/templates/clips/desktop/src/overlays/live-audio-bars.tsx +3 -1
  82. package/corpus/templates/clips/desktop/src/styles.css +13 -10
  83. package/corpus/templates/clips/desktop/src-tauri/src/recording_indicator.rs +2 -2
  84. package/corpus/templates/clips/desktop/src-tauri/src/whisper_speech.rs +36 -0
  85. package/corpus/templates/content/.agents/skills/security/SKILL.md +13 -2
  86. package/corpus/templates/content/actions/_builder-cms-read-client.ts +155 -34
  87. package/corpus/templates/content/actions/_builder-docs-client.ts +151 -30
  88. package/corpus/templates/content/actions/stage-builder-source-bulk-update.ts +5 -2
  89. package/corpus/templates/content/app/root.tsx +35 -14
  90. package/corpus/templates/content/changelog/2026-07-28-builder-backed-files-media-fields-now-accept-direct-file-url.md +6 -0
  91. package/corpus/templates/content/changelog/2026-07-28-builder-content-reads-now-negotiate-the-newest-mcp-protocol-.md +6 -0
  92. package/corpus/templates/content/changelog/2026-07-28-public-content-pages-load-faster-before-the-optional-ask-sid.md +6 -0
  93. package/corpus/templates/design/.agents/skills/security/SKILL.md +13 -2
  94. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +36 -16
  95. package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +42 -3
  96. package/corpus/templates/design/actions/open-visual-edit.ts +2 -1
  97. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +2 -2
  98. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +14 -15
  99. package/corpus/templates/design/app/components/design/ResponsiveInteractBar.tsx +314 -0
  100. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +88 -3
  101. package/corpus/templates/design/app/components/design/keyboard-shortcuts.ts +1 -1
  102. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +7 -6
  103. package/corpus/templates/design/app/i18n-data.ts +56 -11
  104. package/corpus/templates/design/app/i18n-responsive-interact.ts +183 -0
  105. package/corpus/templates/design/app/lib/agent-chat.ts +60 -0
  106. package/corpus/templates/design/app/pages/design-editor/responsive-interact.ts +89 -0
  107. package/corpus/templates/design/changelog/2026-07-28-design-edits-can-be-applied-through-the-host-coding-agent-fr.md +6 -0
  108. package/corpus/templates/design/changelog/2026-07-28-interact-mode-can-preview-designs-in-responsive-device-sizes.md +6 -0
  109. package/corpus/templates/design/changelog/2026-07-28-interact-mode-now-opens-a-full-screen-responsive-preview-wit.md +6 -0
  110. package/corpus/templates/design/changelog/2026-07-28-show-or-hide-design-editing-chrome-with-cmd-on-apple-devices.md +2 -2
  111. package/corpus/templates/design/changelog/2026-07-28-visual-edit-now-always-shows-the-live-running-app-in-the-can.md +6 -0
  112. package/corpus/templates/dispatch/.agents/skills/security/SKILL.md +13 -2
  113. package/corpus/templates/forms/.agents/skills/security/SKILL.md +13 -2
  114. package/corpus/templates/macros/.agents/skills/security/SKILL.md +13 -2
  115. package/corpus/templates/mail/.agents/skills/security/SKILL.md +13 -2
  116. package/corpus/templates/plan/.agents/skills/security/SKILL.md +13 -2
  117. package/corpus/templates/slides/.agents/skills/security/SKILL.md +13 -2
  118. package/corpus/templates/tasks/.agents/skills/security/SKILL.md +13 -2
  119. package/corpus/toolkit/CHANGELOG.md +13 -0
  120. package/corpus/toolkit/package.json +1 -1
  121. package/corpus/toolkit/src/chat-history.css +1 -2
  122. package/corpus/toolkit/src/composer/TiptapComposer.tsx +45 -0
  123. package/dist/a2a/client.d.ts +7 -0
  124. package/dist/a2a/client.d.ts.map +1 -1
  125. package/dist/a2a/client.js +8 -3
  126. package/dist/a2a/client.js.map +1 -1
  127. package/dist/a2a/server.d.ts.map +1 -1
  128. package/dist/a2a/server.js +18 -3
  129. package/dist/a2a/server.js.map +1 -1
  130. package/dist/a2a/types.d.ts +7 -0
  131. package/dist/a2a/types.d.ts.map +1 -1
  132. package/dist/a2a/types.js.map +1 -1
  133. package/dist/action.d.ts +15 -1
  134. package/dist/action.d.ts.map +1 -1
  135. package/dist/action.js +39 -16
  136. package/dist/action.js.map +1 -1
  137. package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
  138. package/dist/agent/engine/ai-sdk-engine.js +14 -10
  139. package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
  140. package/dist/agent/production-agent.d.ts.map +1 -1
  141. package/dist/agent/production-agent.js +35 -7
  142. package/dist/agent/production-agent.js.map +1 -1
  143. package/dist/agent/thread-data-builder.d.ts +2 -0
  144. package/dist/agent/thread-data-builder.d.ts.map +1 -1
  145. package/dist/agent/thread-data-builder.js +3 -0
  146. package/dist/agent/thread-data-builder.js.map +1 -1
  147. package/dist/chat-threads/migrations.d.ts +21 -0
  148. package/dist/chat-threads/migrations.d.ts.map +1 -0
  149. package/dist/chat-threads/migrations.js +45 -0
  150. package/dist/chat-threads/migrations.js.map +1 -0
  151. package/dist/cli/create.d.ts.map +1 -1
  152. package/dist/cli/create.js +4 -0
  153. package/dist/cli/create.js.map +1 -1
  154. package/dist/cli/skills-content/design-visual-edit-skill.d.ts +1 -1
  155. package/dist/cli/skills-content/design-visual-edit-skill.d.ts.map +1 -1
  156. package/dist/cli/skills-content/design-visual-edit-skill.js +36 -16
  157. package/dist/cli/skills-content/design-visual-edit-skill.js.map +1 -1
  158. package/dist/cli/skills.d.ts.map +1 -1
  159. package/dist/cli/skills.js +15 -0
  160. package/dist/cli/skills.js.map +1 -1
  161. package/dist/client/AgentPanel.d.ts.map +1 -1
  162. package/dist/client/AgentPanel.js +6 -5
  163. package/dist/client/AgentPanel.js.map +1 -1
  164. package/dist/client/AssistantChat.d.ts +37 -0
  165. package/dist/client/AssistantChat.d.ts.map +1 -1
  166. package/dist/client/AssistantChat.js +41 -8
  167. package/dist/client/AssistantChat.js.map +1 -1
  168. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  169. package/dist/client/MultiTabAssistantChat.js +11 -10
  170. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  171. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  172. package/dist/client/agent-chat-adapter.js +19 -3
  173. package/dist/client/agent-chat-adapter.js.map +1 -1
  174. package/dist/client/analytics.d.ts.map +1 -1
  175. package/dist/client/analytics.js +150 -101
  176. package/dist/client/analytics.js.map +1 -1
  177. package/dist/client/chat/legacy-chart-shorthand.d.ts +29 -0
  178. package/dist/client/chat/legacy-chart-shorthand.d.ts.map +1 -0
  179. package/dist/client/chat/legacy-chart-shorthand.js +330 -0
  180. package/dist/client/chat/legacy-chart-shorthand.js.map +1 -0
  181. package/dist/client/chat/markdown-renderer.d.ts.map +1 -1
  182. package/dist/client/chat/markdown-renderer.js +8 -2
  183. package/dist/client/chat/markdown-renderer.js.map +1 -1
  184. package/dist/client/chat/message-components.d.ts +2 -1
  185. package/dist/client/chat/message-components.d.ts.map +1 -1
  186. package/dist/client/chat/message-components.js +11 -4
  187. package/dist/client/chat/message-components.js.map +1 -1
  188. package/dist/client/chat/runtime.d.ts.map +1 -1
  189. package/dist/client/chat/runtime.js +2 -1
  190. package/dist/client/chat/runtime.js.map +1 -1
  191. package/dist/client/chat/tool-call-display.d.ts +4 -1
  192. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  193. package/dist/client/chat/tool-call-display.js +14 -8
  194. package/dist/client/chat/tool-call-display.js.map +1 -1
  195. package/dist/client/chat-model-groups.d.ts.map +1 -1
  196. package/dist/client/chat-model-groups.js +3 -0
  197. package/dist/client/chat-model-groups.js.map +1 -1
  198. package/dist/client/client-status-requests.d.ts +14 -0
  199. package/dist/client/client-status-requests.d.ts.map +1 -0
  200. package/dist/client/client-status-requests.js +126 -0
  201. package/dist/client/client-status-requests.js.map +1 -0
  202. package/dist/client/settings/VoiceTranscriptionSection.js +1 -1
  203. package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
  204. package/dist/client/sse-event-processor.d.ts +7 -0
  205. package/dist/client/sse-event-processor.d.ts.map +1 -1
  206. package/dist/client/sse-event-processor.js +8 -3
  207. package/dist/client/sse-event-processor.js.map +1 -1
  208. package/dist/client/use-agent-engine-configured.d.ts.map +1 -1
  209. package/dist/client/use-agent-engine-configured.js +29 -43
  210. package/dist/client/use-agent-engine-configured.js.map +1 -1
  211. package/dist/client/use-chat-models.d.ts.map +1 -1
  212. package/dist/client/use-chat-models.js +11 -11
  213. package/dist/client/use-chat-models.js.map +1 -1
  214. package/dist/client/use-chat-threads.d.ts.map +1 -1
  215. package/dist/client/use-chat-threads.js +23 -7
  216. package/dist/client/use-chat-threads.js.map +1 -1
  217. package/dist/client/use-session.d.ts.map +1 -1
  218. package/dist/client/use-session.js +4 -4
  219. package/dist/client/use-session.js.map +1 -1
  220. package/dist/collab/awareness.d.ts +2 -2
  221. package/dist/collab/awareness.d.ts.map +1 -1
  222. package/dist/db/client.d.ts.map +1 -1
  223. package/dist/db/client.js +48 -4
  224. package/dist/db/client.js.map +1 -1
  225. package/dist/db/ensure-additive-columns.d.ts.map +1 -1
  226. package/dist/db/ensure-additive-columns.js +32 -21
  227. package/dist/db/ensure-additive-columns.js.map +1 -1
  228. package/dist/db/migrations.d.ts +9 -0
  229. package/dist/db/migrations.d.ts.map +1 -1
  230. package/dist/db/migrations.js +14 -3
  231. package/dist/db/migrations.js.map +1 -1
  232. package/dist/extensions/actions.js +1 -1
  233. package/dist/extensions/actions.js.map +1 -1
  234. package/dist/mcp/approval-store.d.ts +16 -0
  235. package/dist/mcp/approval-store.d.ts.map +1 -0
  236. package/dist/mcp/approval-store.js +85 -0
  237. package/dist/mcp/approval-store.js.map +1 -0
  238. package/dist/mcp/build-server.d.ts +1 -34
  239. package/dist/mcp/build-server.d.ts.map +1 -1
  240. package/dist/mcp/build-server.js +220 -23
  241. package/dist/mcp/build-server.js.map +1 -1
  242. package/dist/mcp/embed-app.js +1 -1
  243. package/dist/mcp/embed-app.js.map +1 -1
  244. package/dist/mcp/oauth-client-metadata.d.ts +15 -0
  245. package/dist/mcp/oauth-client-metadata.d.ts.map +1 -0
  246. package/dist/mcp/oauth-client-metadata.js +297 -0
  247. package/dist/mcp/oauth-client-metadata.js.map +1 -0
  248. package/dist/mcp/oauth-route.d.ts.map +1 -1
  249. package/dist/mcp/oauth-route.js +39 -53
  250. package/dist/mcp/oauth-route.js.map +1 -1
  251. package/dist/mcp/screen-memory-stdio.d.ts.map +1 -1
  252. package/dist/mcp/screen-memory-stdio.js +304 -296
  253. package/dist/mcp/screen-memory-stdio.js.map +1 -1
  254. package/dist/mcp/server.d.ts +12 -25
  255. package/dist/mcp/server.d.ts.map +1 -1
  256. package/dist/mcp/server.js +24 -133
  257. package/dist/mcp/server.js.map +1 -1
  258. package/dist/mcp/stdio.d.ts.map +1 -1
  259. package/dist/mcp/stdio.js +36 -35
  260. package/dist/mcp/stdio.js.map +1 -1
  261. package/dist/mcp-client/manager.d.ts.map +1 -1
  262. package/dist/mcp-client/manager.js +6 -6
  263. package/dist/mcp-client/manager.js.map +1 -1
  264. package/dist/mcp-client/oauth-client.d.ts +13 -17
  265. package/dist/mcp-client/oauth-client.d.ts.map +1 -1
  266. package/dist/mcp-client/oauth-client.js +74 -16
  267. package/dist/mcp-client/oauth-client.js.map +1 -1
  268. package/dist/mcp-client/oauth-routes.d.ts +2 -2
  269. package/dist/mcp-client/oauth-routes.d.ts.map +1 -1
  270. package/dist/mcp-client/oauth-routes.js +16 -6
  271. package/dist/mcp-client/oauth-routes.js.map +1 -1
  272. package/dist/mcp-client/routes.js +5 -5
  273. package/dist/mcp-client/routes.js.map +1 -1
  274. package/dist/notifications/routes.d.ts +1 -1
  275. package/dist/progress/routes.d.ts +1 -1
  276. package/dist/resources/handlers.d.ts +1 -1
  277. package/dist/secrets/routes.d.ts +9 -9
  278. package/dist/server/agent-capabilities.d.ts.map +1 -1
  279. package/dist/server/agent-capabilities.js +21 -0
  280. package/dist/server/agent-capabilities.js.map +1 -1
  281. package/dist/server/agent-chat/action-filters-a2a.d.ts +14 -0
  282. package/dist/server/agent-chat/action-filters-a2a.d.ts.map +1 -1
  283. package/dist/server/agent-chat/action-filters-a2a.js +16 -0
  284. package/dist/server/agent-chat/action-filters-a2a.js.map +1 -1
  285. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  286. package/dist/server/agent-chat-plugin.js +11 -1
  287. package/dist/server/agent-chat-plugin.js.map +1 -1
  288. package/dist/server/transcribe-voice.js +12 -6
  289. package/dist/server/transcribe-voice.js.map +1 -1
  290. package/dist/templates/chat/.agents/skills/security/SKILL.md +13 -2
  291. package/dist/templates/default/.agents/skills/security/SKILL.md +13 -2
  292. package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +5 -2
  293. package/dist/templates/workspace-core/.agents/skills/external-agents/SKILL.md +18 -0
  294. package/dist/templates/workspace-core/.agents/skills/security/SKILL.md +13 -2
  295. package/docs/content/template-design-collaboration-and-full-apps.mdx +3 -1
  296. package/package.json +7 -4
  297. package/src/a2a/client.ts +18 -4
  298. package/src/a2a/server.ts +19 -3
  299. package/src/a2a/types.ts +7 -0
  300. package/src/action.ts +43 -16
  301. package/src/agent/engine/ai-sdk-engine.ts +14 -10
  302. package/src/agent/production-agent.ts +41 -3
  303. package/src/agent/thread-data-builder.ts +5 -0
  304. package/src/chat-threads/migrations.ts +53 -0
  305. package/src/cli/create.ts +4 -0
  306. package/src/cli/skills-content/design-visual-edit-skill.ts +36 -16
  307. package/src/cli/skills.ts +16 -0
  308. package/src/client/AgentPanel.tsx +9 -5
  309. package/src/client/AssistantChat.tsx +138 -46
  310. package/src/client/MultiTabAssistantChat.tsx +16 -10
  311. package/src/client/agent-chat-adapter.ts +21 -3
  312. package/src/client/analytics.ts +159 -102
  313. package/src/client/chat/legacy-chart-shorthand.tsx +479 -0
  314. package/src/client/chat/markdown-renderer.tsx +23 -3
  315. package/src/client/chat/message-components.tsx +12 -5
  316. package/src/client/chat/runtime.ts +2 -1
  317. package/src/client/chat/tool-call-display.tsx +25 -2
  318. package/src/client/chat-model-groups.ts +3 -0
  319. package/src/client/client-status-requests.ts +161 -0
  320. package/src/client/settings/VoiceTranscriptionSection.tsx +2 -2
  321. package/src/client/sse-event-processor.ts +15 -3
  322. package/src/client/use-agent-engine-configured.ts +54 -50
  323. package/src/client/use-chat-models.ts +16 -11
  324. package/src/client/use-chat-threads.ts +32 -9
  325. package/src/client/use-session.ts +4 -5
  326. package/src/db/client.ts +83 -8
  327. package/src/db/ensure-additive-columns.ts +31 -20
  328. package/src/db/migrations.ts +22 -2
  329. package/src/extensions/actions.ts +1 -1
  330. package/src/mcp/approval-store.ts +99 -0
  331. package/src/mcp/build-server.ts +579 -303
  332. package/src/mcp/embed-app.ts +1 -1
  333. package/src/mcp/oauth-client-metadata.ts +380 -0
  334. package/src/mcp/oauth-route.ts +57 -52
  335. package/src/mcp/screen-memory-stdio.ts +400 -378
  336. package/src/mcp/server.ts +29 -145
  337. package/src/mcp/stdio.ts +72 -80
  338. package/src/mcp-client/manager.ts +6 -10
  339. package/src/mcp-client/oauth-client.ts +127 -36
  340. package/src/mcp-client/oauth-routes.ts +16 -6
  341. package/src/mcp-client/routes.ts +6 -5
  342. package/src/server/agent-capabilities.ts +20 -0
  343. package/src/server/agent-chat/action-filters-a2a.ts +27 -0
  344. package/src/server/agent-chat-plugin.ts +18 -0
  345. package/src/server/transcribe-voice.ts +14 -5
  346. package/src/templates/chat/.agents/skills/security/SKILL.md +13 -2
  347. package/src/templates/default/.agents/skills/security/SKILL.md +13 -2
  348. package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +5 -2
  349. package/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +18 -0
  350. package/src/templates/workspace-core/.agents/skills/security/SKILL.md +13 -2
@@ -95,6 +95,7 @@ import {
95
95
  AGENT_CHAT_VIEW_TRANSITION_CLASS,
96
96
  getAgentChatViewTransitionStyle,
97
97
  } from "./chat-view-transition.js";
98
+ import { fetchBuilderStatus } from "./client-status-requests.js";
98
99
  import { RealtimeVoiceModeProvider } from "./composer/index.js";
99
100
  import {
100
101
  getFramePostMessageTargetOrigin,
@@ -481,13 +482,16 @@ function useBuilderConnectUrl() {
481
482
  // global), refresh fired again, and we'd loop forever.
482
483
  let lastConfigured = false;
483
484
  const refresh = () => {
484
- fetch(agentNativePath("/_agent-native/builder/status"))
485
- .then((res) => (res.ok ? res.json() : null))
485
+ fetchBuilderStatus<{
486
+ cliAuthUrl?: string;
487
+ connectUrl?: string;
488
+ configured?: boolean;
489
+ }>()
490
+ .then((result) => (result.state === "available" ? result.value : null))
486
491
  .then((data) => {
487
492
  if (cancelled || !data) return;
488
- if (data.cliAuthUrl || data.connectUrl) {
489
- setConnectUrl(data.cliAuthUrl || data.connectUrl);
490
- }
493
+ const nextConnectUrl = data.cliAuthUrl || data.connectUrl;
494
+ if (nextConnectUrl) setConnectUrl(nextConnectUrl);
491
495
  const nextConfigured = !!data.configured;
492
496
  setConfigured(nextConfigured);
493
497
  if (nextConfigured && !lastConfigured) {
@@ -24,6 +24,8 @@ import type {
24
24
  } from "@assistant-ui/react";
25
25
  import { CompositeAttachmentAdapter } from "@assistant-ui/react";
26
26
  import {
27
+ IconArrowUp,
28
+ IconClock,
27
29
  IconMessage,
28
30
  IconX,
29
31
  IconPlayerStopFilled,
@@ -223,7 +225,7 @@ export interface AssistantChatSendOptions {
223
225
  submitMessageId?: string;
224
226
  }
225
227
 
226
- function createUserMessageRunConfig(
228
+ export function createUserMessageRunConfig(
227
229
  references?: Reference[],
228
230
  requestMode?: AgentRequestMode,
229
231
  recoveryAction?: AgentRecoveryAction,
@@ -231,6 +233,11 @@ function createUserMessageRunConfig(
231
233
  approvedToolCalls?: string[],
232
234
  queuedMessageId?: string,
233
235
  hideUserMessage?: boolean,
236
+ modelSnapshot?: {
237
+ model?: string;
238
+ engine?: string;
239
+ effort?: ReasoningEffort;
240
+ },
234
241
  ) {
235
242
  const custom: {
236
243
  references?: Reference[];
@@ -238,7 +245,13 @@ function createUserMessageRunConfig(
238
245
  trackInRunsTray?: boolean;
239
246
  agentNativeQueuedMessageId?: string;
240
247
  approvedToolCalls?: string[];
248
+ model?: string;
249
+ engine?: string;
250
+ effort?: ReasoningEffort;
241
251
  } = {};
252
+ if (modelSnapshot?.model) custom.model = modelSnapshot.model;
253
+ if (modelSnapshot?.engine) custom.engine = modelSnapshot.engine;
254
+ if (modelSnapshot?.effort) custom.effort = modelSnapshot.effort;
242
255
  if (references && references.length > 0) {
243
256
  custom.references = references;
244
257
  }
@@ -1650,8 +1663,27 @@ type QueuedMessage = {
1650
1663
  recoveryAction?: AgentRecoveryAction;
1651
1664
  trackInRunsTray?: boolean;
1652
1665
  hideUserMessage?: boolean;
1666
+ /**
1667
+ * Model/engine/effort snapshotted at enqueue time, for the same reason
1668
+ * `requestMode` is: the picker is global and live, so a queue that flushes
1669
+ * after the user switches models would otherwise silently run the message
1670
+ * under a model it was never composed for. Entries persisted before this
1671
+ * existed simply lack the fields and fall back to the live selection.
1672
+ */
1673
+ model?: string;
1674
+ engine?: string;
1675
+ effort?: ReasoningEffort;
1653
1676
  };
1654
1677
 
1678
+ export function hoistQueuedMessageToFront<T extends { id: string }>(
1679
+ messages: readonly T[],
1680
+ id: string,
1681
+ ): T[] {
1682
+ const target = messages.find((message) => message.id === id);
1683
+ if (!target) return [...messages];
1684
+ return [target, ...messages.filter((message) => message.id !== id)];
1685
+ }
1686
+
1655
1687
  export function queuedMessageImageSources(
1656
1688
  message: Pick<QueuedMessage, "attachments" | "images">,
1657
1689
  ): string[] {
@@ -2241,6 +2273,7 @@ const AssistantChatInner = forwardRef<
2241
2273
  planModeDisabledReason,
2242
2274
  selectedModel,
2243
2275
  defaultModel,
2276
+ selectedEngine,
2244
2277
  selectedEffort,
2245
2278
  availableModels,
2246
2279
  modelListLoading,
@@ -4170,6 +4203,11 @@ const AssistantChatInner = forwardRef<
4170
4203
  undefined,
4171
4204
  next.id,
4172
4205
  next.hideUserMessage,
4206
+ {
4207
+ model: next.model,
4208
+ engine: next.engine,
4209
+ effort: next.effort,
4210
+ },
4173
4211
  ),
4174
4212
  } as Parameters<typeof threadRuntime.append>[0]);
4175
4213
  appended = true;
@@ -4493,6 +4531,22 @@ const AssistantChatInner = forwardRef<
4493
4531
  // Keep the ref current so addToQueue can call it without a stale closure.
4494
4532
  stopActiveRunRef.current = stopActiveRun;
4495
4533
 
4534
+ // Explicit opt-in interrupt from a queued bubble: hoist the entry to the
4535
+ // front and abort the active run, letting auto-dequeue re-send it once the
4536
+ // run clears. Plain Enter still queues — this is the only send-now gesture.
4537
+ const sendQueuedMessageNow = useCallback(
4538
+ (id: string) => {
4539
+ applyLocalQueuedMessages((prev) => hoistQueuedMessageToFront(prev, id));
4540
+ stopActiveRunRef.current({ preserveQueuedMessages: true });
4541
+ },
4542
+ [applyLocalQueuedMessages],
4543
+ );
4544
+
4545
+ const visibleQueuedMessages = useMemo(
4546
+ () => queuedMessages.filter((message) => !message.hideUserMessage),
4547
+ [queuedMessages],
4548
+ );
4549
+
4496
4550
  const addToQueue = useCallback(
4497
4551
  async (
4498
4552
  text: string,
@@ -4663,6 +4717,12 @@ const AssistantChatInner = forwardRef<
4663
4717
  : execMode === "build"
4664
4718
  ? "act"
4665
4719
  : undefined);
4720
+ // Same reasoning for the model picker — see `QueuedMessage.model`.
4721
+ const modelSnapshot = {
4722
+ model: selectedModel,
4723
+ engine: selectedEngine,
4724
+ effort: selectedEffort,
4725
+ };
4666
4726
  if (isRunning && intent === "immediate") {
4667
4727
  // Explicit interrupt path: abort the active server run, then let the
4668
4728
  // auto-dequeue path append this message once the run is clear. Normal
@@ -4683,6 +4743,7 @@ const AssistantChatInner = forwardRef<
4683
4743
  recoveryAction,
4684
4744
  trackInRunsTray,
4685
4745
  hideUserMessage,
4746
+ ...modelSnapshot,
4686
4747
  },
4687
4748
  ]);
4688
4749
  stopActiveRunRef.current({ preserveQueuedMessages: true });
@@ -4703,6 +4764,7 @@ const AssistantChatInner = forwardRef<
4703
4764
  recoveryAction,
4704
4765
  trackInRunsTray,
4705
4766
  hideUserMessage,
4767
+ ...modelSnapshot,
4706
4768
  },
4707
4769
  ]);
4708
4770
  } else {
@@ -4754,6 +4816,9 @@ const AssistantChatInner = forwardRef<
4754
4816
  markOptimisticRunning,
4755
4817
  appendThreadMessage,
4756
4818
  requestMissingKeySetup,
4819
+ selectedEffort,
4820
+ selectedEngine,
4821
+ selectedModel,
4757
4822
  updateComposerContextItems,
4758
4823
  ],
4759
4824
  );
@@ -5539,52 +5604,79 @@ const AssistantChatInner = forwardRef<
5539
5604
  />
5540
5605
  </MessageScrollerItem>
5541
5606
  )}
5542
- {queuedMessages
5543
- .filter((msg) => !msg.hideUserMessage)
5544
- .map((msg) => {
5545
- const displayText =
5546
- displayableUserMessageText(msg.text);
5547
- const imageSources =
5548
- queuedMessageImageSources(msg);
5549
- return (
5550
- <MessageScrollerItem
5551
- key={msg.id}
5552
- messageId={msg.id}
5553
- >
5554
- <div className="group flex items-start justify-end gap-1.5">
5555
- <button
5556
- type="button"
5557
- onClick={() =>
5558
- applyLocalQueuedMessages((prev) =>
5559
- prev.filter(
5560
- (m) => m.id !== msg.id,
5561
- ),
5562
- )
5563
- }
5564
- aria-label="Remove from queue"
5565
- className="mt-1.5 flex h-5 w-5 items-center justify-center rounded-full border border-border bg-background text-muted-foreground opacity-0 shadow-sm transition-opacity hover:bg-accent hover:text-foreground focus-visible:opacity-100 group-hover:opacity-100"
5566
- >
5567
- <IconX className="h-3 w-3" />
5568
- </button>
5569
- <div className="max-w-[85%] rounded-lg bg-accent/50 px-3 py-2 text-sm leading-relaxed text-foreground/60 whitespace-pre-wrap break-words">
5570
- {displayText}
5571
- {imageSources.length > 0 && (
5572
- <div className="flex flex-wrap gap-1.5 mt-1.5">
5573
- {imageSources.map((img, j) => (
5574
- <img
5575
- key={j}
5576
- src={img}
5577
- alt=""
5578
- className="h-12 w-12 rounded object-cover border border-border/50"
5579
- />
5580
- ))}
5581
- </div>
5582
- )}
5583
- </div>
5607
+ {visibleQueuedMessages.length > 0 && (
5608
+ <MessageScrollerItem>
5609
+ <div className="flex items-center justify-end gap-1.5 pr-0.5 text-xs text-muted-foreground">
5610
+ <IconClock className="h-3 w-3" />
5611
+ <span>
5612
+ {visibleQueuedMessages.length} queued
5613
+ </span>
5614
+ </div>
5615
+ </MessageScrollerItem>
5616
+ )}
5617
+ {visibleQueuedMessages.map((msg) => {
5618
+ const displayText = displayableUserMessageText(
5619
+ msg.text,
5620
+ );
5621
+ const imageSources =
5622
+ queuedMessageImageSources(msg);
5623
+ return (
5624
+ <MessageScrollerItem
5625
+ key={msg.id}
5626
+ messageId={msg.id}
5627
+ >
5628
+ <div className="group flex items-start justify-end gap-1.5">
5629
+ {isRunning && (
5630
+ <Tooltip>
5631
+ <TooltipTrigger asChild>
5632
+ <button
5633
+ type="button"
5634
+ onClick={() =>
5635
+ sendQueuedMessageNow(msg.id)
5636
+ }
5637
+ aria-label="Send now"
5638
+ className="mt-1.5 flex h-5 w-5 cursor-pointer items-center justify-center rounded-full border border-border bg-background text-muted-foreground opacity-0 shadow-sm transition-opacity hover:bg-accent hover:text-foreground focus-visible:opacity-100 group-hover:opacity-100"
5639
+ >
5640
+ <IconArrowUp className="h-3 w-3" />
5641
+ </button>
5642
+ </TooltipTrigger>
5643
+ <TooltipContent>
5644
+ Send now (stops the current
5645
+ response)
5646
+ </TooltipContent>
5647
+ </Tooltip>
5648
+ )}
5649
+ <button
5650
+ type="button"
5651
+ onClick={() =>
5652
+ applyLocalQueuedMessages((prev) =>
5653
+ prev.filter((m) => m.id !== msg.id),
5654
+ )
5655
+ }
5656
+ aria-label="Remove from queue"
5657
+ className="mt-1.5 flex h-5 w-5 cursor-pointer items-center justify-center rounded-full border border-border bg-background text-muted-foreground opacity-0 shadow-sm transition-opacity hover:bg-accent hover:text-foreground focus-visible:opacity-100 group-hover:opacity-100"
5658
+ >
5659
+ <IconX className="h-3 w-3" />
5660
+ </button>
5661
+ <div className="max-w-[85%] rounded-lg bg-accent/50 px-3 py-2 text-sm leading-relaxed text-foreground/60 whitespace-pre-wrap break-words">
5662
+ {displayText}
5663
+ {imageSources.length > 0 && (
5664
+ <div className="flex flex-wrap gap-1.5 mt-1.5">
5665
+ {imageSources.map((img, j) => (
5666
+ <img
5667
+ key={j}
5668
+ src={img}
5669
+ alt=""
5670
+ className="h-12 w-12 rounded object-cover border border-border/50"
5671
+ />
5672
+ ))}
5673
+ </div>
5674
+ )}
5584
5675
  </div>
5585
- </MessageScrollerItem>
5586
- );
5587
- })}
5676
+ </div>
5677
+ </MessageScrollerItem>
5678
+ );
5679
+ })}
5588
5680
  {resolvedThreadFooterSlot ? (
5589
5681
  <MessageScrollerItem>
5590
5682
  <div className="agent-thread-footer-slot">
@@ -41,6 +41,10 @@ import {
41
41
  type ChatHistoryItem,
42
42
  type ChatHistorySection,
43
43
  } from "./chat/ChatHistoryList.js";
44
+ import {
45
+ fetchBuilderStatus,
46
+ fetchEnvironmentStatus,
47
+ } from "./client-status-requests.js";
44
48
  import {
45
49
  Popover,
46
50
  PopoverAnchor,
@@ -1114,14 +1118,10 @@ export function MultiTabAssistantChat({
1114
1118
  callAction("manage-agent-engine" as any, { action: "list" } as any).catch(
1115
1119
  () => null,
1116
1120
  ),
1117
- fetch(agentNativePath("/_agent-native/env-status"))
1118
- .then((r) => (r.ok ? r.json() : []))
1119
- .catch(() => []),
1120
- fetch(agentNativePath("/_agent-native/builder/status"))
1121
- .then((r) => (r.ok ? r.json() : null))
1122
- .catch(() => null),
1121
+ fetchEnvironmentStatus<Array<{ key: string; configured: boolean }>>(),
1122
+ fetchBuilderStatus<{ configured?: boolean }>(),
1123
1123
  ])
1124
- .then(([enginesData, envKeys, builderStatus]) => {
1124
+ .then(([enginesData, envResult, builderResult]) => {
1125
1125
  if (!enginesData?.engines) {
1126
1126
  // Leaves `availableModels` empty for the session, so an override with
1127
1127
  // no engine of its own has nothing to resolve against.
@@ -1130,10 +1130,16 @@ export function MultiTabAssistantChat({
1130
1130
  );
1131
1131
  return;
1132
1132
  }
1133
+ if (
1134
+ envResult.state !== "available" ||
1135
+ builderResult.state !== "available"
1136
+ ) {
1137
+ return;
1138
+ }
1139
+ const envKeys = envResult.value;
1140
+ const builderStatus = builderResult.value;
1133
1141
  const configuredKeys = new Set(
1134
- (envKeys as Array<{ key: string; configured: boolean }>)
1135
- .filter((k) => k.configured)
1136
- .map((k) => k.key),
1142
+ envKeys.filter((k) => k.configured).map((k) => k.key),
1137
1143
  );
1138
1144
  const builderConnected = builderStatus?.configured === true;
1139
1145
  const currentEngineName: string | undefined =
@@ -884,6 +884,9 @@ function lastCompletedTimeoutCandidateTool(
884
884
  part.activity !== true &&
885
885
  part.result !== undefined &&
886
886
  part.isError !== true &&
887
+ // A settled-interrupted tool has a result but an unknown outcome; claiming
888
+ // it completed is the same false-success this message exists to avoid.
889
+ part.outcome !== "unknown" &&
887
890
  isCompletedToolTimeoutCandidate(part)
888
891
  ) {
889
892
  return part;
@@ -1633,6 +1636,21 @@ export function createAgentChatAdapter(
1633
1636
  : execModeRef?.current === "build"
1634
1637
  ? "act"
1635
1638
  : undefined;
1639
+ // Queued turns carry the model/engine/effort they were composed with.
1640
+ // The refs track the live picker, so without this a queue that flushes
1641
+ // after the user switches models runs under the wrong one.
1642
+ const runConfigSelection = (key: "model" | "engine" | "effort") => {
1643
+ const raw =
1644
+ runConfig?.custom && typeof runConfig.custom === "object"
1645
+ ? (runConfig.custom as Record<string, unknown>)[key]
1646
+ : undefined;
1647
+ return typeof raw === "string" && raw.length > 0 ? raw : undefined;
1648
+ };
1649
+ const model = runConfigSelection("model") ?? modelRef?.current;
1650
+ const engine = runConfigSelection("engine") ?? engineRef?.current;
1651
+ const effort =
1652
+ (runConfigSelection("effort") as ReasoningEffort | undefined) ??
1653
+ effortRef?.current;
1636
1654
 
1637
1655
  const withRequestModeMetadata = (
1638
1656
  result: ChatModelRunResult,
@@ -3181,9 +3199,9 @@ export function createAgentChatAdapter(
3181
3199
  ? { internalContinuation: true }
3182
3200
  : {}),
3183
3201
  ...(requestMode ? { mode: requestMode } : {}),
3184
- ...(modelRef?.current ? { model: modelRef.current } : {}),
3185
- ...(engineRef?.current ? { engine: engineRef.current } : {}),
3186
- ...(effortRef?.current ? { effort: effortRef.current } : {}),
3202
+ ...(model ? { model } : {}),
3203
+ ...(engine ? { engine } : {}),
3204
+ ...(effort ? { effort } : {}),
3187
3205
  ...(browserTabId ? { browserTabId } : {}),
3188
3206
  ...(scopeRef?.current ? { scope: scopeRef.current } : {}),
3189
3207
  ...(includeAttachments ? { attachments } : {}),