@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
@@ -1,5 +1,5 @@
1
- import * as amplitude from "@amplitude/analytics-browser";
2
- import * as Sentry from "@sentry/browser";
1
+ import type * as amplitude from "@amplitude/analytics-browser";
2
+ import type * as Sentry from "@sentry/browser";
3
3
 
4
4
  import {
5
5
  llmConnectionTrackingProperties,
@@ -9,7 +9,10 @@ import {
9
9
  getOrCreateAnalyticsAnonymousId,
10
10
  getOrCreateAnalyticsSessionId,
11
11
  } from "./analytics-session.js";
12
- import { agentNativePath } from "./api-path.js";
12
+ import {
13
+ fetchAgentEngineStatus,
14
+ fetchAuthSessionStatus,
15
+ } from "./client-status-requests.js";
13
16
  import {
14
17
  installErrorCapture,
15
18
  type CapturedExceptionEvent,
@@ -149,7 +152,17 @@ let _getDefaultProps: GetDefaultProps | null = null;
149
152
  let _agentNativeAnalyticsPublicKey: string | null = null;
150
153
  let _agentNativeAnalyticsEndpoint: string | null = null;
151
154
  let _amplitudeInitialized = false;
155
+ let _amplitudeModule: typeof amplitude | null = null;
156
+ let _amplitudeLoadPromise: Promise<typeof amplitude | null> | null = null;
157
+ let _amplitudeApiKey: string | null = null;
158
+ let _pendingAmplitudeEvents: Array<[string, Record<string, unknown>]> = [];
152
159
  let _sentryInitialized = false;
160
+ let _sentryModule: typeof Sentry | null = null;
161
+ let _sentryLoadPromise: Promise<typeof Sentry | null> | null = null;
162
+ let _pendingSentryCaptures: Array<{
163
+ error: unknown;
164
+ context: ClientCaptureContext;
165
+ }> = [];
153
166
  let _llmConnectionStatus: LlmConnectionStatus | null = null;
154
167
  let _llmConnectionRefresh: Promise<void> | null = null;
155
168
  let _llmConnectionRefreshInstalled = false;
@@ -301,20 +314,12 @@ function refreshLlmConnectionStatus(): Promise<void> {
301
314
  return Promise.resolve();
302
315
  }
303
316
  if (_llmConnectionRefresh) return _llmConnectionRefresh;
304
- let request: Promise<Response>;
305
- try {
306
- request = fetch(agentNativePath("/_agent-native/agent-engine/status"));
307
- } catch {
308
- return Promise.resolve();
309
- }
310
- _llmConnectionRefresh = request
311
- .then((res) => (res.ok ? res.json() : null))
312
- .then((data) => {
313
- _llmConnectionStatus = normalizeAgentEngineStatus(data);
314
- cacheLlmConnectionStatus(_llmConnectionStatus);
315
- })
316
- .catch(() => {
317
- if (!_llmConnectionStatus) {
317
+ _llmConnectionRefresh = fetchAgentEngineStatus()
318
+ .then((result) => {
319
+ if (result.state === "available") {
320
+ _llmConnectionStatus = normalizeAgentEngineStatus(result.value);
321
+ cacheLlmConnectionStatus(_llmConnectionStatus);
322
+ } else if (!_llmConnectionStatus) {
318
323
  _llmConnectionStatus = readCachedLlmConnectionStatus();
319
324
  }
320
325
  })
@@ -396,15 +401,11 @@ function refreshTrackingAuthSession(): Promise<void> {
396
401
  return Promise.resolve();
397
402
  }
398
403
  if (_trackingSessionRefresh) return _trackingSessionRefresh;
399
- _trackingSessionRefresh = fetch(
400
- agentNativePath("/_agent-native/auth/session"),
401
- )
402
- .then((res) => (res.ok ? res.json() : null))
403
- .then((data) => {
404
- setTrackingIdentityFromSession(data);
405
- })
406
- .catch(() => {
407
- clearTrackingIdentity();
404
+ _trackingSessionRefresh = fetchAuthSessionStatus()
405
+ .then((result) => {
406
+ if (result.state === "available") {
407
+ setTrackingIdentityFromSession(result.value);
408
+ }
408
409
  })
409
410
  .finally(() => {
410
411
  _trackingIdentityResolved = true;
@@ -616,12 +617,31 @@ function ensureAmplitude(): boolean {
616
617
  const key = (import.meta.env as Record<string, string | undefined>)
617
618
  ?.VITE_AMPLITUDE_API_KEY;
618
619
  if (!key) return false;
619
- // Standard pageviews and explicit events are emitted below. Keep SDK-level
620
- // DOM/network autocapture off so rendered user content is never collected as
621
- // an implicit analytics side effect.
622
- amplitude.init(key, { autocapture: false });
623
- _amplitudeInitialized = true;
624
- return true;
620
+ _amplitudeApiKey = key;
621
+ if (_amplitudeLoadPromise) return false;
622
+
623
+ _amplitudeLoadPromise = import("@amplitude/analytics-browser")
624
+ .then((module) => {
625
+ // Standard pageviews and explicit events are emitted below. Keep SDK-level
626
+ // DOM/network autocapture off so rendered user content is never collected as
627
+ // an implicit analytics side effect.
628
+ module.init(key, { autocapture: false });
629
+ _amplitudeModule = module;
630
+ _amplitudeInitialized = true;
631
+ for (const [name, properties] of _pendingAmplitudeEvents) {
632
+ module.track(name, properties);
633
+ }
634
+ _pendingAmplitudeEvents = [];
635
+ return module;
636
+ })
637
+ .catch(() => {
638
+ _pendingAmplitudeEvents = [];
639
+ return null;
640
+ })
641
+ .finally(() => {
642
+ _amplitudeLoadPromise = null;
643
+ });
644
+ return false;
625
645
  }
626
646
 
627
647
  function hasOnlySourcelessFrames(value: {
@@ -881,58 +901,103 @@ function getClientSentryDsn(): string | undefined {
881
901
  );
882
902
  }
883
903
 
884
- function ensureSentry(): void {
885
- if (_sentryInitialized) return;
886
- const dsn = getClientSentryDsn();
887
- if (!dsn) return;
888
- Sentry.init({
889
- dsn,
890
- environment:
891
- window.__AGENT_NATIVE_CONFIG__?.sentryEnvironment ||
892
- (import.meta.env as Record<string, string | undefined>)?.MODE ||
893
- "production",
894
- beforeSend(event) {
895
- if (shouldDropBrowserSentryNoise(event)) {
896
- return null;
904
+ function captureWithSentry(
905
+ module: typeof Sentry,
906
+ error: unknown,
907
+ context: ClientCaptureContext,
908
+ ): string | undefined {
909
+ return module.withScope((scope) => {
910
+ if (context.tags) {
911
+ for (const [k, v] of Object.entries(context.tags)) {
912
+ if (typeof v === "string") scope.setTag(k, v);
897
913
  }
898
- // Strip sensitive query params from the request URL. React Router
899
- // history can include share tokens, ?signin=1, password reset codes,
900
- // public-share password params (audit F-07), etc.
901
- if (event.request?.url) {
902
- event.request.url = scrubUrl(event.request.url);
914
+ }
915
+ if (context.extra) {
916
+ for (const [k, v] of Object.entries(context.extra)) {
917
+ if (v !== undefined) scope.setExtra(k, v);
903
918
  }
904
- // Clean the same params from breadcrumb URLs (Sentry captures
905
- // history.pushState breadcrumbs by default).
906
- if (Array.isArray(event.breadcrumbs)) {
907
- for (const crumb of event.breadcrumbs) {
908
- if (crumb && typeof crumb === "object" && "data" in crumb) {
909
- const data = crumb.data as Record<string, unknown> | undefined;
910
- if (data && typeof data.url === "string") {
911
- data.url = scrubUrl(data.url);
912
- }
913
- if (data && typeof data.from === "string") {
914
- data.from = scrubUrl(data.from);
915
- }
916
- if (data && typeof data.to === "string") {
917
- data.to = scrubUrl(data.to);
919
+ }
920
+ if (context.contexts) {
921
+ for (const [k, v] of Object.entries(context.contexts)) {
922
+ scope.setContext(k, v);
923
+ }
924
+ }
925
+ return module.captureException(error);
926
+ });
927
+ }
928
+
929
+ function ensureSentry(loadWithoutDsn = false): void {
930
+ if (_sentryInitialized || _sentryLoadPromise) return;
931
+ const dsn = getClientSentryDsn();
932
+ if (!dsn && !loadWithoutDsn) return;
933
+ _sentryLoadPromise = import("@sentry/browser")
934
+ .then((module) => {
935
+ _sentryModule = module;
936
+ if (!dsn) {
937
+ for (const pending of _pendingSentryCaptures) {
938
+ captureWithSentry(module, pending.error, pending.context);
939
+ }
940
+ _pendingSentryCaptures = [];
941
+ return module;
942
+ }
943
+ module.init({
944
+ dsn,
945
+ environment:
946
+ window.__AGENT_NATIVE_CONFIG__?.sentryEnvironment ||
947
+ (import.meta.env as Record<string, string | undefined>)?.MODE ||
948
+ "production",
949
+ beforeSend(event) {
950
+ if (shouldDropBrowserSentryNoise(event)) {
951
+ return null;
952
+ }
953
+ // Strip sensitive query params from the request URL. React Router
954
+ // history can include share tokens, ?signin=1, password reset codes,
955
+ // public-share password params (audit F-07), etc.
956
+ if (event.request?.url) {
957
+ event.request.url = scrubUrl(event.request.url);
958
+ }
959
+ // Clean the same params from breadcrumb URLs (Sentry captures
960
+ // history.pushState breadcrumbs by default).
961
+ if (Array.isArray(event.breadcrumbs)) {
962
+ for (const crumb of event.breadcrumbs) {
963
+ if (crumb && typeof crumb === "object" && "data" in crumb) {
964
+ const data = crumb.data as Record<string, unknown> | undefined;
965
+ if (data && typeof data.url === "string") {
966
+ data.url = scrubUrl(data.url);
967
+ }
968
+ if (data && typeof data.from === "string") {
969
+ data.from = scrubUrl(data.from);
970
+ }
971
+ if (data && typeof data.to === "string") {
972
+ data.to = scrubUrl(data.to);
973
+ }
974
+ }
918
975
  }
919
976
  }
920
- }
977
+ return event;
978
+ },
979
+ });
980
+ module.setTag("runtime", "browser");
981
+ _sentryInitialized = true;
982
+ // Flush any user/tag that was set before init.
983
+ if (_pendingSentryUser !== undefined) {
984
+ module.setUser(_pendingSentryUser);
985
+ _pendingSentryUser = undefined;
921
986
  }
922
- return event;
923
- },
924
- });
925
- Sentry.setTag("runtime", "browser");
926
- _sentryInitialized = true;
927
- // Flush any user/tag that was set before init.
928
- if (_pendingSentryUser !== undefined) {
929
- Sentry.setUser(_pendingSentryUser);
930
- _pendingSentryUser = undefined;
931
- }
932
- if (_pendingSentryOrgId !== undefined) {
933
- Sentry.setTag("orgId", _pendingSentryOrgId);
934
- _pendingSentryOrgId = undefined;
935
- }
987
+ if (_pendingSentryOrgId !== undefined) {
988
+ module.setTag("orgId", _pendingSentryOrgId);
989
+ _pendingSentryOrgId = undefined;
990
+ }
991
+ for (const pending of _pendingSentryCaptures) {
992
+ captureWithSentry(module, pending.error, pending.context);
993
+ }
994
+ _pendingSentryCaptures = [];
995
+ return module;
996
+ })
997
+ .catch(() => null)
998
+ .finally(() => {
999
+ _sentryLoadPromise = null;
1000
+ });
936
1001
  }
937
1002
 
938
1003
  /**
@@ -972,10 +1037,10 @@ export function setSentryUser(
972
1037
  ) {
973
1038
  void startConfiguredSessionReplay(_sessionReplayOptions);
974
1039
  }
975
- if (_sentryInitialized) {
976
- Sentry.setUser(user);
1040
+ if (_sentryInitialized && _sentryModule) {
1041
+ _sentryModule.setUser(user);
977
1042
  if (orgId !== undefined) {
978
- Sentry.setTag("orgId", orgId ?? null);
1043
+ _sentryModule.setTag("orgId", orgId ?? null);
979
1044
  }
980
1045
  return;
981
1046
  }
@@ -1024,25 +1089,12 @@ export function captureClientException(
1024
1089
  ): string | undefined {
1025
1090
  if (typeof window === "undefined") return undefined;
1026
1091
  try {
1027
- ensureSentry();
1028
- return Sentry.withScope((scope) => {
1029
- if (context.tags) {
1030
- for (const [k, v] of Object.entries(context.tags)) {
1031
- if (typeof v === "string") scope.setTag(k, v);
1032
- }
1033
- }
1034
- if (context.extra) {
1035
- for (const [k, v] of Object.entries(context.extra)) {
1036
- if (v !== undefined) scope.setExtra(k, v);
1037
- }
1038
- }
1039
- if (context.contexts) {
1040
- for (const [k, v] of Object.entries(context.contexts)) {
1041
- scope.setContext(k, v);
1042
- }
1043
- }
1044
- return Sentry.captureException(error);
1045
- });
1092
+ ensureSentry(true);
1093
+ if (_sentryModule) return captureWithSentry(_sentryModule, error, context);
1094
+ if (_pendingSentryCaptures.length < 50) {
1095
+ _pendingSentryCaptures.push({ error, context });
1096
+ }
1097
+ return undefined;
1046
1098
  } catch {
1047
1099
  return undefined;
1048
1100
  }
@@ -1647,6 +1699,7 @@ function pageviewProperties(reason: string): Record<string, unknown> {
1647
1699
  }
1648
1700
 
1649
1701
  function emitPageview(reason: string): void {
1702
+ if (typeof window === "undefined") return;
1650
1703
  if (isLocalAnalyticsHostname(window.location.hostname)) return;
1651
1704
  const state = getPageviewTrackingState();
1652
1705
  const key = pageviewKey();
@@ -1767,7 +1820,11 @@ export function trackEvent(
1767
1820
  const props = resolveProps(name, params);
1768
1821
  window.gtag?.("event", name.replace(/\s+/g, "_"), props);
1769
1822
  if (ensureAmplitude()) {
1770
- amplitude.track(name, props);
1823
+ _amplitudeModule?.track(name, props);
1824
+ } else if (_amplitudeApiKey) {
1825
+ if (_pendingAmplitudeEvents.length < 100) {
1826
+ _pendingAmplitudeEvents.push([name, props]);
1827
+ }
1771
1828
  }
1772
1829
  sendAgentNativeAnalytics(name, props);
1773
1830
  }