@agent-native/core 0.46.0 → 0.48.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (837) hide show
  1. package/bin/agent-native.js +41 -0
  2. package/dist/a2a/handlers.js +2 -2
  3. package/dist/a2a/handlers.js.map +1 -1
  4. package/dist/a2a/server.js +2 -2
  5. package/dist/a2a/server.js.map +1 -1
  6. package/dist/action.d.ts +43 -2
  7. package/dist/action.d.ts.map +1 -1
  8. package/dist/action.js.map +1 -1
  9. package/dist/agent/context-xray/actions/context-evict.d.ts +7 -1
  10. package/dist/agent/context-xray/actions/context-evict.d.ts.map +1 -1
  11. package/dist/agent/context-xray/actions/context-manifest-get.d.ts +4 -1
  12. package/dist/agent/context-xray/actions/context-manifest-get.d.ts.map +1 -1
  13. package/dist/agent/context-xray/actions/context-pin.d.ts +7 -1
  14. package/dist/agent/context-xray/actions/context-pin.d.ts.map +1 -1
  15. package/dist/agent/context-xray/actions/context-report.d.ts +12 -1
  16. package/dist/agent/context-xray/actions/context-report.d.ts.map +1 -1
  17. package/dist/agent/context-xray/actions/context-restore.d.ts +7 -1
  18. package/dist/agent/context-xray/actions/context-restore.d.ts.map +1 -1
  19. package/dist/agent/context-xray/apply-directives.d.ts.map +1 -1
  20. package/dist/agent/context-xray/apply-directives.js.map +1 -1
  21. package/dist/agent/context-xray/schema.d.ts +10 -10
  22. package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
  23. package/dist/agent/engine/ai-sdk-engine.js +26 -3
  24. package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
  25. package/dist/agent/engine/anthropic-engine.d.ts +1 -1
  26. package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
  27. package/dist/agent/engine/builder-engine.d.ts +1 -1
  28. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  29. package/dist/agent/engine/builder-engine.js +47 -8
  30. package/dist/agent/engine/builder-engine.js.map +1 -1
  31. package/dist/agent/engine/builtin.js +1 -1
  32. package/dist/agent/engine/builtin.js.map +1 -1
  33. package/dist/agent/engine/output-tokens.d.ts +1 -1
  34. package/dist/agent/engine/output-tokens.d.ts.map +1 -1
  35. package/dist/agent/engine/output-tokens.js +6 -2
  36. package/dist/agent/engine/output-tokens.js.map +1 -1
  37. package/dist/agent/engine/registry.d.ts.map +1 -1
  38. package/dist/agent/engine/registry.js +7 -4
  39. package/dist/agent/engine/registry.js.map +1 -1
  40. package/dist/agent/engine/types.d.ts +19 -0
  41. package/dist/agent/engine/types.d.ts.map +1 -1
  42. package/dist/agent/engine/types.js +6 -0
  43. package/dist/agent/engine/types.js.map +1 -1
  44. package/dist/agent/model-config.d.ts +22 -14
  45. package/dist/agent/model-config.d.ts.map +1 -1
  46. package/dist/agent/model-config.js +113 -8
  47. package/dist/agent/model-config.js.map +1 -1
  48. package/dist/agent/production-agent.d.ts +47 -1
  49. package/dist/agent/production-agent.d.ts.map +1 -1
  50. package/dist/agent/production-agent.js +267 -46
  51. package/dist/agent/production-agent.js.map +1 -1
  52. package/dist/agent/run-loop-with-resume.d.ts.map +1 -1
  53. package/dist/agent/run-loop-with-resume.js +10 -0
  54. package/dist/agent/run-loop-with-resume.js.map +1 -1
  55. package/dist/agent/run-manager.d.ts +1 -0
  56. package/dist/agent/run-manager.d.ts.map +1 -1
  57. package/dist/agent/run-manager.js +36 -9
  58. package/dist/agent/run-manager.js.map +1 -1
  59. package/dist/agent/run-store.d.ts +47 -4
  60. package/dist/agent/run-store.d.ts.map +1 -1
  61. package/dist/agent/run-store.js +154 -4
  62. package/dist/agent/run-store.js.map +1 -1
  63. package/dist/agent/thread-data-builder.d.ts.map +1 -1
  64. package/dist/agent/thread-data-builder.js +57 -2
  65. package/dist/agent/thread-data-builder.js.map +1 -1
  66. package/dist/agent/types.d.ts +3 -0
  67. package/dist/agent/types.d.ts.map +1 -1
  68. package/dist/agent/types.js.map +1 -1
  69. package/dist/agent-web/generator.d.ts +3 -3
  70. package/dist/appearance/actions/change-appearance.d.ts +6 -1
  71. package/dist/appearance/actions/change-appearance.d.ts.map +1 -1
  72. package/dist/application-state/handlers.d.ts +2 -2
  73. package/dist/application-state/handlers.d.ts.map +1 -1
  74. package/dist/application-state/store.d.ts.map +1 -1
  75. package/dist/application-state/store.js +17 -0
  76. package/dist/application-state/store.js.map +1 -1
  77. package/dist/catalog.json +2 -1
  78. package/dist/cli/code-agent-commands.d.ts.map +1 -1
  79. package/dist/cli/code-agent-commands.js +2 -0
  80. package/dist/cli/code-agent-commands.js.map +1 -1
  81. package/dist/cli/code-agent-connector.js +7 -13
  82. package/dist/cli/code-agent-connector.js.map +1 -1
  83. package/dist/cli/code-agent-executor.d.ts +54 -2
  84. package/dist/cli/code-agent-executor.d.ts.map +1 -1
  85. package/dist/cli/code-agent-executor.js +504 -48
  86. package/dist/cli/code-agent-executor.js.map +1 -1
  87. package/dist/cli/code-agent-runs.d.ts +13 -0
  88. package/dist/cli/code-agent-runs.d.ts.map +1 -1
  89. package/dist/cli/code-agent-runs.js +36 -0
  90. package/dist/cli/code-agent-runs.js.map +1 -1
  91. package/dist/cli/code.js +59 -5
  92. package/dist/cli/code.js.map +1 -1
  93. package/dist/cli/connect.js +141 -3
  94. package/dist/cli/connect.js.map +1 -1
  95. package/dist/cli/index.js +0 -0
  96. package/dist/cli/pr-visual-recap-workflow.js +1 -1
  97. package/dist/cli/pr-visual-recap-workflow.js.map +1 -1
  98. package/dist/cli/recap.js +476 -46
  99. package/dist/cli/recap.js.map +1 -1
  100. package/dist/cli/skills.js +331 -179
  101. package/dist/cli/skills.js.map +1 -1
  102. package/dist/client/AgentPanel.d.ts.map +1 -1
  103. package/dist/client/AgentPanel.js +29 -2
  104. package/dist/client/AgentPanel.js.map +1 -1
  105. package/dist/client/AgentTaskCard.d.ts.map +1 -1
  106. package/dist/client/AgentTaskCard.js +17 -2
  107. package/dist/client/AgentTaskCard.js.map +1 -1
  108. package/dist/client/AssistantChat.d.ts +1 -1
  109. package/dist/client/AssistantChat.d.ts.map +1 -1
  110. package/dist/client/AssistantChat.js +310 -1732
  111. package/dist/client/AssistantChat.js.map +1 -1
  112. package/dist/client/CommandMenu.d.ts +1 -1
  113. package/dist/client/CommandMenu.d.ts.map +1 -1
  114. package/dist/client/CommandMenu.js +1 -1
  115. package/dist/client/CommandMenu.js.map +1 -1
  116. package/dist/client/HighlightedCodeBlock.d.ts +40 -0
  117. package/dist/client/HighlightedCodeBlock.d.ts.map +1 -0
  118. package/dist/client/HighlightedCodeBlock.js +110 -0
  119. package/dist/client/HighlightedCodeBlock.js.map +1 -0
  120. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  121. package/dist/client/MultiTabAssistantChat.js +8 -1
  122. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  123. package/dist/client/PoweredByBadge.d.ts +2 -2
  124. package/dist/client/PoweredByBadge.d.ts.map +1 -1
  125. package/dist/client/RunStuckBanner.d.ts +1 -1
  126. package/dist/client/RunStuckBanner.d.ts.map +1 -1
  127. package/dist/client/StarfieldBackground.d.ts.map +1 -1
  128. package/dist/client/StarfieldBackground.js +10 -5
  129. package/dist/client/StarfieldBackground.js.map +1 -1
  130. package/dist/client/Turnstile.d.ts +1 -1
  131. package/dist/client/Turnstile.d.ts.map +1 -1
  132. package/dist/client/agent-chat-adapter.d.ts +3 -2
  133. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  134. package/dist/client/agent-chat-adapter.js +13 -9
  135. package/dist/client/agent-chat-adapter.js.map +1 -1
  136. package/dist/client/app-providers.d.ts +99 -0
  137. package/dist/client/app-providers.d.ts.map +1 -0
  138. package/dist/client/app-providers.js +19 -0
  139. package/dist/client/app-providers.js.map +1 -0
  140. package/dist/client/assistant-ui-recovery.d.ts +1 -1
  141. package/dist/client/auth-redirect-url.d.ts +1 -1
  142. package/dist/client/auth-redirect-url.d.ts.map +1 -1
  143. package/dist/client/blocks/library/AnnotatedCodeBlock.d.ts +0 -19
  144. package/dist/client/blocks/library/AnnotatedCodeBlock.d.ts.map +1 -1
  145. package/dist/client/blocks/library/AnnotatedCodeBlock.js +141 -55
  146. package/dist/client/blocks/library/AnnotatedCodeBlock.js.map +1 -1
  147. package/dist/client/blocks/library/DiffBlock.js +1 -1
  148. package/dist/client/blocks/library/DiffBlock.js.map +1 -1
  149. package/dist/client/blocks/library/FileTreeBlock.d.ts.map +1 -1
  150. package/dist/client/blocks/library/FileTreeBlock.js +1 -1
  151. package/dist/client/blocks/library/FileTreeBlock.js.map +1 -1
  152. package/dist/client/blocks/library/HighlightedCode.d.ts.map +1 -1
  153. package/dist/client/blocks/library/HighlightedCode.js +5 -3
  154. package/dist/client/blocks/library/HighlightedCode.js.map +1 -1
  155. package/dist/client/blocks/library/annotation-rail.d.ts +5 -4
  156. package/dist/client/blocks/library/annotation-rail.d.ts.map +1 -1
  157. package/dist/client/blocks/library/annotation-rail.js +22 -3
  158. package/dist/client/blocks/library/annotation-rail.js.map +1 -1
  159. package/dist/client/blocks/library/diagram.js +1 -1
  160. package/dist/client/blocks/library/diagram.js.map +1 -1
  161. package/dist/client/blocks/library/diff.config.d.ts +3 -2
  162. package/dist/client/blocks/library/diff.config.d.ts.map +1 -1
  163. package/dist/client/blocks/library/diff.config.js +4 -3
  164. package/dist/client/blocks/library/diff.config.js.map +1 -1
  165. package/dist/client/blocks/library/question-form.d.ts.map +1 -1
  166. package/dist/client/blocks/library/question-form.js +2 -1
  167. package/dist/client/blocks/library/question-form.js.map +1 -1
  168. package/dist/client/blocks/library/wireframe-kit.d.ts +1 -1
  169. package/dist/client/blocks/library/wireframe-kit.d.ts.map +1 -1
  170. package/dist/client/blocks/library/wireframe.js +1 -1
  171. package/dist/client/blocks/library/wireframe.js.map +1 -1
  172. package/dist/client/chat/attachment-adapters.d.ts +58 -0
  173. package/dist/client/chat/attachment-adapters.d.ts.map +1 -0
  174. package/dist/client/chat/attachment-adapters.js +331 -0
  175. package/dist/client/chat/attachment-adapters.js.map +1 -0
  176. package/dist/client/chat/index.d.ts +13 -0
  177. package/dist/client/chat/index.d.ts.map +1 -0
  178. package/dist/client/chat/index.js +13 -0
  179. package/dist/client/chat/index.js.map +1 -0
  180. package/dist/client/chat/markdown-renderer.d.ts +49 -0
  181. package/dist/client/chat/markdown-renderer.d.ts.map +1 -0
  182. package/dist/client/chat/markdown-renderer.js +391 -0
  183. package/dist/client/chat/markdown-renderer.js.map +1 -0
  184. package/dist/client/chat/message-components.d.ts +35 -0
  185. package/dist/client/chat/message-components.d.ts.map +1 -0
  186. package/dist/client/chat/message-components.js +452 -0
  187. package/dist/client/chat/message-components.js.map +1 -0
  188. package/dist/client/chat/repo-helpers.d.ts +41 -0
  189. package/dist/client/chat/repo-helpers.d.ts.map +1 -0
  190. package/dist/client/chat/repo-helpers.js +61 -0
  191. package/dist/client/chat/repo-helpers.js.map +1 -0
  192. package/dist/client/chat/run-recovery.d.ts +41 -0
  193. package/dist/client/chat/run-recovery.d.ts.map +1 -0
  194. package/dist/client/chat/run-recovery.js +348 -0
  195. package/dist/client/chat/run-recovery.js.map +1 -0
  196. package/dist/client/chat/tool-call-display.d.ts +34 -0
  197. package/dist/client/chat/tool-call-display.d.ts.map +1 -0
  198. package/dist/client/chat/tool-call-display.js +284 -0
  199. package/dist/client/chat/tool-call-display.js.map +1 -0
  200. package/dist/client/code-agent-chat-adapter.d.ts.map +1 -1
  201. package/dist/client/code-agent-chat-adapter.js +20 -0
  202. package/dist/client/code-agent-chat-adapter.js.map +1 -1
  203. package/dist/client/collab/index.d.ts +10 -0
  204. package/dist/client/collab/index.d.ts.map +1 -0
  205. package/dist/client/collab/index.js +10 -0
  206. package/dist/client/collab/index.js.map +1 -0
  207. package/dist/client/components/AgentPresenceChip.d.ts +1 -1
  208. package/dist/client/components/AgentPresenceChip.d.ts.map +1 -1
  209. package/dist/client/components/ApiKeySettings.d.ts +1 -1
  210. package/dist/client/components/ApiKeySettings.d.ts.map +1 -1
  211. package/dist/client/components/CodeAgentIndicator.d.ts +1 -1
  212. package/dist/client/components/CodeAgentIndicator.d.ts.map +1 -1
  213. package/dist/client/components/CodeRequiredDialog.d.ts +1 -1
  214. package/dist/client/components/CodeRequiredDialog.d.ts.map +1 -1
  215. package/dist/client/components/LiveCursorOverlay.d.ts.map +1 -1
  216. package/dist/client/components/LiveCursorOverlay.js.map +1 -1
  217. package/dist/client/components/PresenceBar.d.ts +1 -1
  218. package/dist/client/components/PresenceBar.d.ts.map +1 -1
  219. package/dist/client/composer/PromptComposer.d.ts.map +1 -1
  220. package/dist/client/composer/PromptComposer.js +6 -26
  221. package/dist/client/composer/PromptComposer.js.map +1 -1
  222. package/dist/client/composer/TiptapComposer.d.ts +8 -2
  223. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  224. package/dist/client/composer/TiptapComposer.js +21 -9
  225. package/dist/client/composer/TiptapComposer.js.map +1 -1
  226. package/dist/client/composer/VoiceButton.d.ts +2 -2
  227. package/dist/client/composer/VoiceButton.d.ts.map +1 -1
  228. package/dist/client/composer/index.d.ts +1 -1
  229. package/dist/client/composer/index.d.ts.map +1 -1
  230. package/dist/client/composer/index.js +1 -1
  231. package/dist/client/composer/index.js.map +1 -1
  232. package/dist/client/composer/use-skills.d.ts +1 -1
  233. package/dist/client/context-xray/ContextMeter.d.ts +1 -1
  234. package/dist/client/context-xray/ContextMeter.d.ts.map +1 -1
  235. package/dist/client/context-xray/ContextMeter.js +3 -3
  236. package/dist/client/context-xray/ContextMeter.js.map +1 -1
  237. package/dist/client/context-xray/ContextXRayPanel.d.ts.map +1 -1
  238. package/dist/client/context-xray/ContextXRayPanel.js +4 -3
  239. package/dist/client/context-xray/ContextXRayPanel.js.map +1 -1
  240. package/dist/client/context-xray/format.d.ts +11 -0
  241. package/dist/client/context-xray/format.d.ts.map +1 -1
  242. package/dist/client/context-xray/format.js +16 -0
  243. package/dist/client/context-xray/format.js.map +1 -1
  244. package/dist/client/conversation/AgentConversation.d.ts.map +1 -1
  245. package/dist/client/conversation/AgentConversation.js +8 -53
  246. package/dist/client/conversation/AgentConversation.js.map +1 -1
  247. package/dist/client/conversation/use-near-bottom-autoscroll.d.ts +1 -1
  248. package/dist/client/conversation/use-near-bottom-autoscroll.d.ts.map +1 -1
  249. package/dist/client/conversation/use-near-bottom-autoscroll.js +14 -1
  250. package/dist/client/conversation/use-near-bottom-autoscroll.js.map +1 -1
  251. package/dist/client/create-query-client.d.ts +28 -0
  252. package/dist/client/create-query-client.d.ts.map +1 -0
  253. package/dist/client/create-query-client.js +78 -0
  254. package/dist/client/create-query-client.js.map +1 -0
  255. package/dist/client/db-admin/DevDatabaseLink.d.ts +1 -1
  256. package/dist/client/db-admin/DevDatabaseLink.d.ts.map +1 -1
  257. package/dist/client/db-admin/RowSidePanel.d.ts +1 -1
  258. package/dist/client/db-admin/RowSidePanel.d.ts.map +1 -1
  259. package/dist/client/db-admin/RowSidePanel.js +2 -2
  260. package/dist/client/db-admin/RowSidePanel.js.map +1 -1
  261. package/dist/client/db-admin/TableEditor.d.ts +1 -1
  262. package/dist/client/db-admin/TableEditor.d.ts.map +1 -1
  263. package/dist/client/db-admin/TableEditor.js +1 -1
  264. package/dist/client/db-admin/TableEditor.js.map +1 -1
  265. package/dist/client/db-admin/cell-format.d.ts +1 -1
  266. package/dist/client/db-admin/cell-format.d.ts.map +1 -1
  267. package/dist/client/dev-overlay/DevOverlay.d.ts +1 -1
  268. package/dist/client/dev-overlay/DevOverlay.d.ts.map +1 -1
  269. package/dist/client/editor/index.d.ts +2 -0
  270. package/dist/client/editor/index.d.ts.map +1 -0
  271. package/dist/client/editor/index.js +2 -0
  272. package/dist/client/editor/index.js.map +1 -0
  273. package/dist/client/error-format.d.ts.map +1 -1
  274. package/dist/client/error-format.js +4 -0
  275. package/dist/client/error-format.js.map +1 -1
  276. package/dist/client/extensions/AgentNativeExtensionFrame.d.ts +1 -1
  277. package/dist/client/extensions/AgentNativeExtensionFrame.d.ts.map +1 -1
  278. package/dist/client/extensions/EmbeddedExtension.d.ts +1 -1
  279. package/dist/client/extensions/EmbeddedExtension.d.ts.map +1 -1
  280. package/dist/client/extensions/ExtensionSlot.d.ts +1 -1
  281. package/dist/client/extensions/ExtensionSlot.d.ts.map +1 -1
  282. package/dist/client/extensions/ExtensionViewerPage.d.ts +1 -1
  283. package/dist/client/extensions/ExtensionViewerPage.d.ts.map +1 -1
  284. package/dist/client/guided-questions.d.ts +6 -6
  285. package/dist/client/host-bridge.d.ts.map +1 -1
  286. package/dist/client/host-bridge.js +2 -0
  287. package/dist/client/host-bridge.js.map +1 -1
  288. package/dist/client/index.d.ts +7 -6
  289. package/dist/client/index.d.ts.map +1 -1
  290. package/dist/client/index.js +5 -3
  291. package/dist/client/index.js.map +1 -1
  292. package/dist/client/onboarding/OnboardingBanner.d.ts +1 -1
  293. package/dist/client/onboarding/OnboardingBanner.d.ts.map +1 -1
  294. package/dist/client/onboarding/OnboardingPanel.d.ts +1 -1
  295. package/dist/client/onboarding/OnboardingPanel.d.ts.map +1 -1
  296. package/dist/client/onboarding/SetupButton.d.ts +1 -1
  297. package/dist/client/onboarding/SetupButton.d.ts.map +1 -1
  298. package/dist/client/org/InvitationBanner.d.ts +1 -1
  299. package/dist/client/org/InvitationBanner.d.ts.map +1 -1
  300. package/dist/client/org/OrgSwitcher.d.ts +1 -1
  301. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  302. package/dist/client/org/RequireActiveOrg.d.ts +1 -1
  303. package/dist/client/org/RequireActiveOrg.d.ts.map +1 -1
  304. package/dist/client/org/hooks.d.ts +3 -3
  305. package/dist/client/org/hooks.d.ts.map +1 -1
  306. package/dist/client/progress/RunsTray.d.ts +2 -2
  307. package/dist/client/progress/RunsTray.d.ts.map +1 -1
  308. package/dist/client/progress/RunsTray.js +34 -9
  309. package/dist/client/progress/RunsTray.js.map +1 -1
  310. package/dist/client/resources/ResourceEditor.d.ts.map +1 -1
  311. package/dist/client/resources/ResourceEditor.js +1 -1
  312. package/dist/client/resources/ResourceEditor.js.map +1 -1
  313. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  314. package/dist/client/resources/ResourcesPanel.js +2 -0
  315. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  316. package/dist/client/rich-markdown-editor/BubbleToolbar.d.ts +1 -1
  317. package/dist/client/rich-markdown-editor/BubbleToolbar.d.ts.map +1 -1
  318. package/dist/client/rich-markdown-editor/CodeBlockNode.d.ts.map +1 -1
  319. package/dist/client/rich-markdown-editor/CodeBlockNode.js +2 -1
  320. package/dist/client/rich-markdown-editor/CodeBlockNode.js.map +1 -1
  321. package/dist/client/rich-markdown-editor/ImageExtension.d.ts.map +1 -1
  322. package/dist/client/rich-markdown-editor/ImageExtension.js +2 -1
  323. package/dist/client/rich-markdown-editor/ImageExtension.js.map +1 -1
  324. package/dist/client/rich-markdown-editor/RegistryBlockNode.d.ts +1 -1
  325. package/dist/client/rich-markdown-editor/RegistryBlockNode.d.ts.map +1 -1
  326. package/dist/client/rich-markdown-editor/RegistryBlockNode.js +1 -1
  327. package/dist/client/rich-markdown-editor/RegistryBlockNode.js.map +1 -1
  328. package/dist/client/rich-markdown-editor/RichMarkdownEditor.d.ts +1 -1
  329. package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts.map +1 -1
  330. package/dist/client/rich-markdown-editor/SharedRichEditor.js +2 -3
  331. package/dist/client/rich-markdown-editor/SharedRichEditor.js.map +1 -1
  332. package/dist/client/rich-markdown-editor/SlashCommandMenu.d.ts +1 -1
  333. package/dist/client/rich-markdown-editor/SlashCommandMenu.d.ts.map +1 -1
  334. package/dist/client/route-state.d.ts +12 -2
  335. package/dist/client/route-state.d.ts.map +1 -1
  336. package/dist/client/route-state.js +1 -1
  337. package/dist/client/route-state.js.map +1 -1
  338. package/dist/client/route-warmup.d.ts +1 -1
  339. package/dist/client/route-warmup.d.ts.map +1 -1
  340. package/dist/client/settings/VoiceTranscriptionSection.js +1 -1
  341. package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
  342. package/dist/client/settings/useBuilderStatus.d.ts +2 -2
  343. package/dist/client/sharing/ShareDialog.d.ts +1 -1
  344. package/dist/client/sharing/ShareDialog.d.ts.map +1 -1
  345. package/dist/client/sse-event-processor.d.ts +8 -0
  346. package/dist/client/sse-event-processor.d.ts.map +1 -1
  347. package/dist/client/sse-event-processor.js +33 -10
  348. package/dist/client/sse-event-processor.js.map +1 -1
  349. package/dist/client/terminal/AgentTerminal.d.ts +1 -1
  350. package/dist/client/terminal/AgentTerminal.d.ts.map +1 -1
  351. package/dist/client/terminal/AgentTerminal.js +4 -2
  352. package/dist/client/terminal/AgentTerminal.js.map +1 -1
  353. package/dist/client/tool-cells/BashCell.d.ts +25 -0
  354. package/dist/client/tool-cells/BashCell.d.ts.map +1 -0
  355. package/dist/client/tool-cells/BashCell.js +49 -0
  356. package/dist/client/tool-cells/BashCell.js.map +1 -0
  357. package/dist/client/tool-cells/EditCell.d.ts +24 -0
  358. package/dist/client/tool-cells/EditCell.d.ts.map +1 -0
  359. package/dist/client/tool-cells/EditCell.js +126 -0
  360. package/dist/client/tool-cells/EditCell.js.map +1 -0
  361. package/dist/client/tool-cells/FilesChangedSummary.d.ts +13 -0
  362. package/dist/client/tool-cells/FilesChangedSummary.d.ts.map +1 -0
  363. package/dist/client/tool-cells/FilesChangedSummary.js +98 -0
  364. package/dist/client/tool-cells/FilesChangedSummary.js.map +1 -0
  365. package/dist/client/tool-cells/WriteCell.d.ts +17 -0
  366. package/dist/client/tool-cells/WriteCell.d.ts.map +1 -0
  367. package/dist/client/tool-cells/WriteCell.js +26 -0
  368. package/dist/client/tool-cells/WriteCell.js.map +1 -0
  369. package/dist/client/tool-cells/index.d.ts +8 -0
  370. package/dist/client/tool-cells/index.d.ts.map +1 -0
  371. package/dist/client/tool-cells/index.js +5 -0
  372. package/dist/client/tool-cells/index.js.map +1 -0
  373. package/dist/client/transcription/BuilderTranscriptionCta.d.ts +1 -1
  374. package/dist/client/transcription/BuilderTranscriptionCta.d.ts.map +1 -1
  375. package/dist/client/use-chat-threads.d.ts +1 -1
  376. package/dist/client/use-chat-threads.d.ts.map +1 -1
  377. package/dist/client/use-chat-threads.js +11 -8
  378. package/dist/client/use-chat-threads.js.map +1 -1
  379. package/dist/client/use-db-sync.d.ts +2 -0
  380. package/dist/client/use-db-sync.d.ts.map +1 -1
  381. package/dist/client/use-db-sync.js +329 -302
  382. package/dist/client/use-db-sync.js.map +1 -1
  383. package/dist/code-agents/transcript-normalizer.d.ts +15 -1
  384. package/dist/code-agents/transcript-normalizer.d.ts.map +1 -1
  385. package/dist/code-agents/transcript-normalizer.js +47 -0
  386. package/dist/code-agents/transcript-normalizer.js.map +1 -1
  387. package/dist/coding-tools/index.d.ts +75 -0
  388. package/dist/coding-tools/index.d.ts.map +1 -1
  389. package/dist/coding-tools/index.js +137 -10
  390. package/dist/coding-tools/index.js.map +1 -1
  391. package/dist/coding-tools/run-code.d.ts +40 -0
  392. package/dist/coding-tools/run-code.d.ts.map +1 -0
  393. package/dist/coding-tools/run-code.js +511 -0
  394. package/dist/coding-tools/run-code.js.map +1 -0
  395. package/dist/collab/client.d.ts.map +1 -1
  396. package/dist/collab/client.js +15 -9
  397. package/dist/collab/client.js.map +1 -1
  398. package/dist/collab/ydoc-manager.d.ts +1 -1
  399. package/dist/collab/ydoc-manager.d.ts.map +1 -1
  400. package/dist/collab/ydoc-manager.js +1 -1
  401. package/dist/collab/ydoc-manager.js.map +1 -1
  402. package/dist/db/client.d.ts +9 -1
  403. package/dist/db/client.d.ts.map +1 -1
  404. package/dist/db/client.js +204 -48
  405. package/dist/db/client.js.map +1 -1
  406. package/dist/db/create-get-db.d.ts +38 -0
  407. package/dist/db/create-get-db.d.ts.map +1 -1
  408. package/dist/db/create-get-db.js +204 -4
  409. package/dist/db/create-get-db.js.map +1 -1
  410. package/dist/db/migrations.d.ts.map +1 -1
  411. package/dist/db/migrations.js +159 -67
  412. package/dist/db/migrations.js.map +1 -1
  413. package/dist/demo/actions/toggle-demo-mode.d.ts +6 -1
  414. package/dist/demo/actions/toggle-demo-mode.d.ts.map +1 -1
  415. package/dist/deploy/build.d.ts.map +1 -1
  416. package/dist/deploy/build.js +80 -39
  417. package/dist/deploy/build.js.map +1 -1
  418. package/dist/deploy/workspace-deploy.js +20 -10
  419. package/dist/deploy/workspace-deploy.js.map +1 -1
  420. package/dist/extensions/fetch-tool.d.ts.map +1 -1
  421. package/dist/extensions/fetch-tool.js +62 -7
  422. package/dist/extensions/fetch-tool.js.map +1 -1
  423. package/dist/extensions/schema.d.ts +51 -51
  424. package/dist/extensions/slots/schema.d.ts +13 -13
  425. package/dist/extensions/web-search-tool.d.ts +41 -0
  426. package/dist/extensions/web-search-tool.d.ts.map +1 -0
  427. package/dist/extensions/web-search-tool.js +200 -0
  428. package/dist/extensions/web-search-tool.js.map +1 -0
  429. package/dist/file-upload/actions/upload-image.d.ts +26 -1
  430. package/dist/file-upload/actions/upload-image.d.ts.map +1 -1
  431. package/dist/file-upload/index.d.ts +1 -1
  432. package/dist/file-upload/index.d.ts.map +1 -1
  433. package/dist/file-upload/index.js +1 -1
  434. package/dist/file-upload/index.js.map +1 -1
  435. package/dist/file-upload/pre-upload-attachments.d.ts +37 -0
  436. package/dist/file-upload/pre-upload-attachments.d.ts.map +1 -1
  437. package/dist/file-upload/pre-upload-attachments.js +79 -19
  438. package/dist/file-upload/pre-upload-attachments.js.map +1 -1
  439. package/dist/index.d.ts +1 -1
  440. package/dist/index.d.ts.map +1 -1
  441. package/dist/index.js.map +1 -1
  442. package/dist/integrations/adapters/slack.js +1 -1
  443. package/dist/integrations/adapters/slack.js.map +1 -1
  444. package/dist/integrations/plugin.js +1 -1
  445. package/dist/integrations/plugin.js.map +1 -1
  446. package/dist/jobs/scheduler.js +70 -21
  447. package/dist/jobs/scheduler.js.map +1 -1
  448. package/dist/mcp/actions/create-org-service-token.d.ts +14 -0
  449. package/dist/mcp/actions/create-org-service-token.d.ts.map +1 -0
  450. package/dist/mcp/actions/create-org-service-token.js +74 -0
  451. package/dist/mcp/actions/create-org-service-token.js.map +1 -0
  452. package/dist/mcp/actions/list-org-service-tokens.d.ts +17 -0
  453. package/dist/mcp/actions/list-org-service-tokens.d.ts.map +1 -0
  454. package/dist/mcp/actions/list-org-service-tokens.js +42 -0
  455. package/dist/mcp/actions/list-org-service-tokens.js.map +1 -0
  456. package/dist/mcp/actions/revoke-org-service-token.d.ts +7 -0
  457. package/dist/mcp/actions/revoke-org-service-token.d.ts.map +1 -0
  458. package/dist/mcp/actions/revoke-org-service-token.js +28 -0
  459. package/dist/mcp/actions/revoke-org-service-token.js.map +1 -0
  460. package/dist/mcp/actions/service-token-access.d.ts +24 -0
  461. package/dist/mcp/actions/service-token-access.d.ts.map +1 -0
  462. package/dist/mcp/actions/service-token-access.js +63 -0
  463. package/dist/mcp/actions/service-token-access.js.map +1 -0
  464. package/dist/mcp/build-server.d.ts +42 -11
  465. package/dist/mcp/build-server.d.ts.map +1 -1
  466. package/dist/mcp/build-server.js +53 -3
  467. package/dist/mcp/build-server.js.map +1 -1
  468. package/dist/mcp/connect-route.d.ts +35 -0
  469. package/dist/mcp/connect-route.d.ts.map +1 -1
  470. package/dist/mcp/connect-route.js +57 -2
  471. package/dist/mcp/connect-route.js.map +1 -1
  472. package/dist/mcp/connect-store.d.ts +43 -0
  473. package/dist/mcp/connect-store.d.ts.map +1 -1
  474. package/dist/mcp/connect-store.js +129 -12
  475. package/dist/mcp/connect-store.js.map +1 -1
  476. package/dist/mcp/oauth-token.d.ts +10 -0
  477. package/dist/mcp/oauth-token.d.ts.map +1 -1
  478. package/dist/mcp/oauth-token.js +2 -0
  479. package/dist/mcp/oauth-token.js.map +1 -1
  480. package/dist/mcp/server.d.ts.map +1 -1
  481. package/dist/mcp/server.js +3 -0
  482. package/dist/mcp/server.js.map +1 -1
  483. package/dist/mcp-client/routes.js +1 -1
  484. package/dist/mcp-client/routes.js.map +1 -1
  485. package/dist/org/context.d.ts +4 -0
  486. package/dist/org/context.d.ts.map +1 -1
  487. package/dist/org/context.js +10 -0
  488. package/dist/org/context.js.map +1 -1
  489. package/dist/org/handlers.d.ts +11 -7
  490. package/dist/org/handlers.d.ts.map +1 -1
  491. package/dist/org/handlers.js +0 -8
  492. package/dist/org/handlers.js.map +1 -1
  493. package/dist/org/migrations.d.ts.map +1 -1
  494. package/dist/org/migrations.js +8 -0
  495. package/dist/org/migrations.js.map +1 -1
  496. package/dist/org/schema.d.ts +15 -15
  497. package/dist/progress/actions.d.ts.map +1 -1
  498. package/dist/progress/actions.js +13 -5
  499. package/dist/progress/actions.js.map +1 -1
  500. package/dist/provider-api/actions/delete-staged-dataset.d.ts +9 -0
  501. package/dist/provider-api/actions/delete-staged-dataset.d.ts.map +1 -0
  502. package/dist/provider-api/actions/delete-staged-dataset.js +35 -0
  503. package/dist/provider-api/actions/delete-staged-dataset.js.map +1 -0
  504. package/dist/provider-api/actions/list-staged-datasets.d.ts +15 -0
  505. package/dist/provider-api/actions/list-staged-datasets.d.ts.map +1 -0
  506. package/dist/provider-api/actions/list-staged-datasets.js +41 -0
  507. package/dist/provider-api/actions/list-staged-datasets.js.map +1 -0
  508. package/dist/provider-api/actions/query-staged-dataset.d.ts +29 -0
  509. package/dist/provider-api/actions/query-staged-dataset.d.ts.map +1 -0
  510. package/dist/provider-api/actions/query-staged-dataset.js +116 -0
  511. package/dist/provider-api/actions/query-staged-dataset.js.map +1 -0
  512. package/dist/provider-api/custom-registry.d.ts +92 -0
  513. package/dist/provider-api/custom-registry.d.ts.map +1 -0
  514. package/dist/provider-api/custom-registry.js +289 -0
  515. package/dist/provider-api/custom-registry.js.map +1 -0
  516. package/dist/provider-api/index.d.ts +88 -52
  517. package/dist/provider-api/index.d.ts.map +1 -1
  518. package/dist/provider-api/index.js +569 -23
  519. package/dist/provider-api/index.js.map +1 -1
  520. package/dist/provider-api/staged-datasets-aggregate.d.ts +46 -0
  521. package/dist/provider-api/staged-datasets-aggregate.d.ts.map +1 -0
  522. package/dist/provider-api/staged-datasets-aggregate.js +209 -0
  523. package/dist/provider-api/staged-datasets-aggregate.js.map +1 -0
  524. package/dist/provider-api/staged-datasets-store.d.ts +76 -0
  525. package/dist/provider-api/staged-datasets-store.d.ts.map +1 -0
  526. package/dist/provider-api/staged-datasets-store.js +319 -0
  527. package/dist/provider-api/staged-datasets-store.js.map +1 -0
  528. package/dist/provider-api/staging.d.ts +100 -0
  529. package/dist/provider-api/staging.d.ts.map +1 -0
  530. package/dist/provider-api/staging.js +281 -0
  531. package/dist/provider-api/staging.js.map +1 -0
  532. package/dist/resources/handlers.d.ts.map +1 -1
  533. package/dist/resources/handlers.js +13 -1
  534. package/dist/resources/handlers.js.map +1 -1
  535. package/dist/scripts/call-agent.d.ts.map +1 -1
  536. package/dist/scripts/call-agent.js +1 -2
  537. package/dist/scripts/call-agent.js.map +1 -1
  538. package/dist/scripts/resources/migrate-learnings.d.ts +1 -1
  539. package/dist/scripts/resources/migrate-learnings.d.ts.map +1 -1
  540. package/dist/scripts/resources/migrate-learnings.js +1 -1
  541. package/dist/scripts/resources/migrate-learnings.js.map +1 -1
  542. package/dist/secrets/register-framework-secrets.d.ts.map +1 -1
  543. package/dist/secrets/register-framework-secrets.js +36 -3
  544. package/dist/secrets/register-framework-secrets.js.map +1 -1
  545. package/dist/secrets/schema.d.ts +7 -7
  546. package/dist/server/action-discovery.d.ts.map +1 -1
  547. package/dist/server/action-discovery.js +14 -0
  548. package/dist/server/action-discovery.js.map +1 -1
  549. package/dist/server/action-routes.d.ts.map +1 -1
  550. package/dist/server/action-routes.js +3 -2
  551. package/dist/server/action-routes.js.map +1 -1
  552. package/dist/server/agent-chat-plugin.d.ts +69 -0
  553. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  554. package/dist/server/agent-chat-plugin.js +369 -179
  555. package/dist/server/agent-chat-plugin.js.map +1 -1
  556. package/dist/server/agent-discovery.d.ts.map +1 -1
  557. package/dist/server/agent-discovery.js +13 -16
  558. package/dist/server/agent-discovery.js.map +1 -1
  559. package/dist/server/agent-teams-run-queue.d.ts +31 -8
  560. package/dist/server/agent-teams-run-queue.d.ts.map +1 -1
  561. package/dist/server/agent-teams-run-queue.js +61 -18
  562. package/dist/server/agent-teams-run-queue.js.map +1 -1
  563. package/dist/server/agent-teams.d.ts +27 -1
  564. package/dist/server/agent-teams.d.ts.map +1 -1
  565. package/dist/server/agent-teams.js +214 -14
  566. package/dist/server/agent-teams.js.map +1 -1
  567. package/dist/server/app-base-path.d.ts +20 -0
  568. package/dist/server/app-base-path.d.ts.map +1 -1
  569. package/dist/server/app-base-path.js +36 -0
  570. package/dist/server/app-base-path.js.map +1 -1
  571. package/dist/server/attachment-actions.d.ts +43 -0
  572. package/dist/server/attachment-actions.d.ts.map +1 -0
  573. package/dist/server/attachment-actions.js +214 -0
  574. package/dist/server/attachment-actions.js.map +1 -0
  575. package/dist/server/auth.js +1 -1
  576. package/dist/server/auth.js.map +1 -1
  577. package/dist/server/complete-text.d.ts +56 -0
  578. package/dist/server/complete-text.d.ts.map +1 -0
  579. package/dist/server/complete-text.js +147 -0
  580. package/dist/server/complete-text.js.map +1 -0
  581. package/dist/server/core-routes-plugin.d.ts +1 -0
  582. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  583. package/dist/server/core-routes-plugin.js +37 -27
  584. package/dist/server/core-routes-plugin.js.map +1 -1
  585. package/dist/server/cors-origins.d.ts.map +1 -1
  586. package/dist/server/cors-origins.js +6 -1
  587. package/dist/server/cors-origins.js.map +1 -1
  588. package/dist/server/create-server.d.ts.map +1 -1
  589. package/dist/server/create-server.js +2 -1
  590. package/dist/server/create-server.js.map +1 -1
  591. package/dist/server/csrf.d.ts +1 -1
  592. package/dist/server/csrf.d.ts.map +1 -1
  593. package/dist/server/email-actions.d.ts +19 -0
  594. package/dist/server/email-actions.d.ts.map +1 -0
  595. package/dist/server/email-actions.js +191 -0
  596. package/dist/server/email-actions.js.map +1 -0
  597. package/dist/server/embed-route.js +1 -1
  598. package/dist/server/embed-route.js.map +1 -1
  599. package/dist/server/embed-session.d.ts.map +1 -1
  600. package/dist/server/embed-session.js +5 -1
  601. package/dist/server/embed-session.js.map +1 -1
  602. package/dist/server/entry-server.d.ts +24 -0
  603. package/dist/server/entry-server.d.ts.map +1 -0
  604. package/dist/server/entry-server.js +54 -0
  605. package/dist/server/entry-server.js.map +1 -0
  606. package/dist/server/framework-request-handler.d.ts.map +1 -1
  607. package/dist/server/framework-request-handler.js +2 -10
  608. package/dist/server/framework-request-handler.js.map +1 -1
  609. package/dist/server/google-oauth.d.ts.map +1 -1
  610. package/dist/server/google-oauth.js +2 -9
  611. package/dist/server/google-oauth.js.map +1 -1
  612. package/dist/server/google-realtime-session.d.ts.map +1 -1
  613. package/dist/server/google-realtime-session.js +6 -4
  614. package/dist/server/google-realtime-session.js.map +1 -1
  615. package/dist/server/h3-helpers.d.ts +39 -0
  616. package/dist/server/h3-helpers.d.ts.map +1 -1
  617. package/dist/server/h3-helpers.js +104 -1
  618. package/dist/server/h3-helpers.js.map +1 -1
  619. package/dist/server/index.d.ts +2 -1
  620. package/dist/server/index.d.ts.map +1 -1
  621. package/dist/server/index.js +2 -1
  622. package/dist/server/index.js.map +1 -1
  623. package/dist/server/onboarding-html.d.ts.map +1 -1
  624. package/dist/server/onboarding-html.js +1 -8
  625. package/dist/server/onboarding-html.js.map +1 -1
  626. package/dist/server/open-route.d.ts.map +1 -1
  627. package/dist/server/open-route.js +1 -0
  628. package/dist/server/open-route.js.map +1 -1
  629. package/dist/server/prompts/framework-core-compact.d.ts +19 -0
  630. package/dist/server/prompts/framework-core-compact.d.ts.map +1 -0
  631. package/dist/server/prompts/framework-core-compact.js +69 -0
  632. package/dist/server/prompts/framework-core-compact.js.map +1 -0
  633. package/dist/server/prompts/framework-core.d.ts +26 -0
  634. package/dist/server/prompts/framework-core.d.ts.map +1 -0
  635. package/dist/server/prompts/framework-core.js +130 -0
  636. package/dist/server/prompts/framework-core.js.map +1 -0
  637. package/dist/server/prompts/index.d.ts +9 -0
  638. package/dist/server/prompts/index.d.ts.map +1 -0
  639. package/dist/server/prompts/index.js +9 -0
  640. package/dist/server/prompts/index.js.map +1 -0
  641. package/dist/server/prompts/model-overlays.d.ts +18 -0
  642. package/dist/server/prompts/model-overlays.d.ts.map +1 -0
  643. package/dist/server/prompts/model-overlays.js +46 -0
  644. package/dist/server/prompts/model-overlays.js.map +1 -0
  645. package/dist/server/prompts/shared-rules.d.ts +29 -0
  646. package/dist/server/prompts/shared-rules.d.ts.map +1 -0
  647. package/dist/server/prompts/shared-rules.js +54 -0
  648. package/dist/server/prompts/shared-rules.js.map +1 -0
  649. package/dist/server/security-headers.d.ts +7 -1
  650. package/dist/server/security-headers.d.ts.map +1 -1
  651. package/dist/server/security-headers.js +11 -0
  652. package/dist/server/security-headers.js.map +1 -1
  653. package/dist/server/ssr-handler.d.ts.map +1 -1
  654. package/dist/server/ssr-handler.js +135 -46
  655. package/dist/server/ssr-handler.js.map +1 -1
  656. package/dist/server/transcribe-voice.d.ts.map +1 -1
  657. package/dist/server/transcribe-voice.js +7 -4
  658. package/dist/server/transcribe-voice.js.map +1 -1
  659. package/dist/settings/store.d.ts.map +1 -1
  660. package/dist/settings/store.js +9 -0
  661. package/dist/settings/store.js.map +1 -1
  662. package/dist/shared/markdown-block-split.d.ts +39 -0
  663. package/dist/shared/markdown-block-split.d.ts.map +1 -0
  664. package/dist/shared/markdown-block-split.js +97 -0
  665. package/dist/shared/markdown-block-split.js.map +1 -0
  666. package/dist/shared/reasoning-effort.js +13 -1
  667. package/dist/shared/reasoning-effort.js.map +1 -1
  668. package/dist/shared/streaming-text-smoothing.d.ts +18 -0
  669. package/dist/shared/streaming-text-smoothing.d.ts.map +1 -1
  670. package/dist/shared/streaming-text-smoothing.js +70 -4
  671. package/dist/shared/streaming-text-smoothing.js.map +1 -1
  672. package/dist/sharing/actions/list-resource-shares.d.ts +24 -1
  673. package/dist/sharing/actions/list-resource-shares.d.ts.map +1 -1
  674. package/dist/sharing/actions/set-resource-visibility.d.ts +8 -1
  675. package/dist/sharing/actions/set-resource-visibility.d.ts.map +1 -1
  676. package/dist/sharing/actions/share-resource.d.ts +12 -1
  677. package/dist/sharing/actions/share-resource.d.ts.map +1 -1
  678. package/dist/sharing/actions/unshare-resource.d.ts +8 -1
  679. package/dist/sharing/actions/unshare-resource.d.ts.map +1 -1
  680. package/dist/sharing/schema.d.ts +10 -10
  681. package/dist/styles/agent-conversation.css +239 -0
  682. package/dist/templates/default/.agents/skills/delegate-to-agent/SKILL.md +50 -2
  683. package/dist/templates/default/AGENTS.md +1 -1
  684. package/dist/templates/default/DEVELOPING.md +19 -0
  685. package/dist/templates/default/app/entry.client.tsx +4 -1
  686. package/dist/templates/default/app/entry.server.tsx +4 -56
  687. package/dist/templates/default/app/global.css +3 -2
  688. package/dist/templates/default/app/root.tsx +8 -24
  689. package/dist/templates/default/app/routes/_index.tsx +0 -13
  690. package/dist/templates/default/package.json +6 -5
  691. package/dist/templates/default/tsconfig.json +2 -1
  692. package/dist/templates/starter-shell-sync.spec.ts +118 -0
  693. package/dist/templates/ui-primitives-sync.spec.ts +399 -0
  694. package/dist/templates/workspace-core/.agents/skills/delegate-to-agent/SKILL.md +50 -2
  695. package/dist/terminal/pty-server.js +1 -1
  696. package/dist/terminal/pty-server.js.map +1 -1
  697. package/dist/triggers/dispatcher.js +1 -1
  698. package/dist/triggers/dispatcher.js.map +1 -1
  699. package/dist/usage/store.d.ts.map +1 -1
  700. package/dist/usage/store.js +60 -7
  701. package/dist/usage/store.js.map +1 -1
  702. package/dist/vite/client.d.ts.map +1 -1
  703. package/dist/vite/client.js +44 -12
  704. package/dist/vite/client.js.map +1 -1
  705. package/dist/workspace-files/index.d.ts +4 -0
  706. package/dist/workspace-files/index.d.ts.map +1 -0
  707. package/dist/workspace-files/index.js +4 -0
  708. package/dist/workspace-files/index.js.map +1 -0
  709. package/dist/workspace-files/schema.d.ts +195 -0
  710. package/dist/workspace-files/schema.d.ts.map +1 -0
  711. package/dist/workspace-files/schema.js +48 -0
  712. package/dist/workspace-files/schema.js.map +1 -0
  713. package/dist/workspace-files/store.d.ts +89 -0
  714. package/dist/workspace-files/store.d.ts.map +1 -0
  715. package/dist/workspace-files/store.js +298 -0
  716. package/dist/workspace-files/store.js.map +1 -0
  717. package/dist/workspace-files/tool.d.ts +15 -0
  718. package/dist/workspace-files/tool.d.ts.map +1 -0
  719. package/dist/workspace-files/tool.js +225 -0
  720. package/dist/workspace-files/tool.js.map +1 -0
  721. package/docs/content/a2a-protocol.md +18 -12
  722. package/docs/content/actions.md +42 -10
  723. package/docs/content/agent-mentions.md +7 -8
  724. package/docs/content/agent-teams.md +23 -37
  725. package/docs/content/agent-web-surfaces.md +18 -9
  726. package/docs/content/authentication.md +6 -17
  727. package/docs/content/automations.md +43 -15
  728. package/docs/content/cli-adapters.md +25 -24
  729. package/docs/content/client.md +66 -17
  730. package/docs/content/cloneable-saas.md +19 -23
  731. package/docs/content/code-agents-ui.md +3 -31
  732. package/docs/content/components.md +308 -0
  733. package/docs/content/context-awareness.md +4 -0
  734. package/docs/content/creating-templates.md +4 -2
  735. package/docs/content/cross-app-sso.md +45 -19
  736. package/docs/content/database.md +26 -1
  737. package/docs/content/deployment.md +3 -1
  738. package/docs/content/dispatch.md +9 -37
  739. package/docs/content/drop-in-agent.md +123 -2
  740. package/docs/content/embedding-sdk.md +35 -0
  741. package/docs/content/extensions.md +2 -2
  742. package/docs/content/external-agents.md +86 -171
  743. package/docs/content/faq.md +6 -27
  744. package/docs/content/frames.md +9 -12
  745. package/docs/content/getting-started.md +80 -77
  746. package/docs/content/key-concepts.md +29 -19
  747. package/docs/content/mcp-apps.md +103 -0
  748. package/docs/content/mcp-clients.md +2 -2
  749. package/docs/content/mcp-protocol.md +40 -17
  750. package/docs/content/messaging.md +11 -4
  751. package/docs/content/migration-workbench.md +4 -47
  752. package/docs/content/multi-app-workspace.md +48 -17
  753. package/docs/content/multi-tenancy.md +1 -1
  754. package/docs/content/notifications.md +8 -6
  755. package/docs/content/observability.md +26 -15
  756. package/docs/content/onboarding.md +7 -1
  757. package/docs/content/pr-visual-recap.md +203 -23
  758. package/docs/content/progress.md +5 -5
  759. package/docs/content/pure-agent-apps.md +3 -1
  760. package/docs/content/real-time-collaboration.md +106 -0
  761. package/docs/content/recurring-jobs.md +17 -1
  762. package/docs/content/security.md +17 -3
  763. package/docs/content/server.md +39 -3
  764. package/docs/content/sharing.md +20 -1
  765. package/docs/content/skills-guide.md +151 -125
  766. package/docs/content/template-analytics.md +8 -0
  767. package/docs/content/template-assets.md +2 -0
  768. package/docs/content/template-brain.md +59 -3
  769. package/docs/content/template-calendar.md +8 -0
  770. package/docs/content/template-clips.md +11 -2
  771. package/docs/content/template-content.md +24 -4
  772. package/docs/content/template-design.md +19 -17
  773. package/docs/content/template-dispatch.md +2 -0
  774. package/docs/content/template-forms.md +28 -1
  775. package/docs/content/template-mail.md +17 -0
  776. package/docs/content/template-plan.md +177 -10
  777. package/docs/content/template-slides.md +51 -12
  778. package/docs/content/template-videos.md +17 -0
  779. package/docs/content/tracking.md +17 -13
  780. package/docs/content/using-your-agent.md +15 -5
  781. package/docs/content/voice-input.md +1 -1
  782. package/docs/content/what-is-agent-native.md +5 -6
  783. package/docs/content/workspace-connections.md +138 -424
  784. package/docs/content/workspace-management.md +12 -128
  785. package/docs/content/workspace.md +125 -199
  786. package/docs/content/writing-agent-instructions.md +17 -1
  787. package/package.json +26 -6
  788. package/src/templates/default/.agents/skills/delegate-to-agent/SKILL.md +50 -2
  789. package/src/templates/default/AGENTS.md +1 -1
  790. package/src/templates/default/DEVELOPING.md +19 -0
  791. package/src/templates/default/app/entry.client.tsx +4 -1
  792. package/src/templates/default/app/entry.server.tsx +4 -56
  793. package/src/templates/default/app/global.css +3 -2
  794. package/src/templates/default/app/root.tsx +8 -24
  795. package/src/templates/default/app/routes/_index.tsx +0 -13
  796. package/src/templates/default/package.json +6 -5
  797. package/src/templates/default/tsconfig.json +2 -1
  798. package/src/templates/starter-shell-sync.spec.ts +118 -0
  799. package/src/templates/ui-primitives-sync.spec.ts +399 -0
  800. package/src/templates/workspace-core/.agents/skills/delegate-to-agent/SKILL.md +50 -2
  801. package/tsconfig.base.json +2 -10
  802. package/dist/cli/app-skill.d.ts +0 -157
  803. package/dist/cli/app-skill.d.ts.map +0 -1
  804. package/dist/cli/audit-agent-web.d.ts +0 -2
  805. package/dist/cli/audit-agent-web.d.ts.map +0 -1
  806. package/dist/cli/code-agent-connector.d.ts +0 -17
  807. package/dist/cli/code-agent-connector.d.ts.map +0 -1
  808. package/dist/cli/code.d.ts +0 -66
  809. package/dist/cli/code.d.ts.map +0 -1
  810. package/dist/cli/connect.d.ts +0 -140
  811. package/dist/cli/connect.d.ts.map +0 -1
  812. package/dist/cli/context-xray-local.d.ts +0 -16
  813. package/dist/cli/context-xray-local.d.ts.map +0 -1
  814. package/dist/cli/create-workspace.d.ts +0 -8
  815. package/dist/cli/create-workspace.d.ts.map +0 -1
  816. package/dist/cli/index.d.ts +0 -3
  817. package/dist/cli/index.d.ts.map +0 -1
  818. package/dist/cli/info.d.ts +0 -2
  819. package/dist/cli/info.d.ts.map +0 -1
  820. package/dist/cli/mcp-config-writers.d.ts +0 -82
  821. package/dist/cli/mcp-config-writers.d.ts.map +0 -1
  822. package/dist/cli/mcp.d.ts +0 -16
  823. package/dist/cli/mcp.d.ts.map +0 -1
  824. package/dist/cli/migrate.d.ts +0 -38
  825. package/dist/cli/migrate.d.ts.map +0 -1
  826. package/dist/cli/plan-local.d.ts +0 -43
  827. package/dist/cli/plan-local.d.ts.map +0 -1
  828. package/dist/cli/plan-publish-store.d.ts +0 -62
  829. package/dist/cli/plan-publish-store.d.ts.map +0 -1
  830. package/dist/cli/pr-visual-recap-workflow.d.ts +0 -11
  831. package/dist/cli/pr-visual-recap-workflow.d.ts.map +0 -1
  832. package/dist/cli/recap.d.ts +0 -297
  833. package/dist/cli/recap.d.ts.map +0 -1
  834. package/dist/cli/skills.d.ts +0 -162
  835. package/dist/cli/skills.d.ts.map +0 -1
  836. package/dist/cli/workspace-dev.d.ts +0 -96
  837. package/dist/cli/workspace-dev.d.ts.map +0 -1
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Web-search tool — agent tool for searching the public web.
3
+ *
4
+ * Pluggable backends resolved at call time based on which API key is
5
+ * configured (env var or secrets/credentials store):
6
+ *
7
+ * 1. Brave Search API (BRAVE_SEARCH_API_KEY)
8
+ * 2. Tavily (TAVILY_API_KEY)
9
+ * 3. Exa (EXA_API_KEY)
10
+ *
11
+ * The first configured backend wins. If none is configured, the tool
12
+ * returns a helpful message telling the user which keys to add.
13
+ *
14
+ * Register BRAVE_SEARCH_API_KEY, TAVILY_API_KEY, or EXA_API_KEY via the
15
+ * app secrets settings or as environment variables.
16
+ */
17
+ import type { ActionEntry } from "../agent/production-agent.js";
18
+ import type { CredentialContext } from "../credentials/index.js";
19
+ export interface WebSearchResult {
20
+ title: string;
21
+ url: string;
22
+ snippet: string;
23
+ }
24
+ export interface WebSearchToolOptions {
25
+ /**
26
+ * Resolve a credential by key. When not provided the tool falls back to
27
+ * env-var lookup only.
28
+ */
29
+ resolveCredential?: (key: string, ctx: CredentialContext) => Promise<string | undefined>;
30
+ /**
31
+ * Returns the current request's credential context (user email + orgId).
32
+ * Required for per-user credential resolution; env-var fallback still
33
+ * works without it.
34
+ */
35
+ getCredentialContext?: () => CredentialContext | null;
36
+ }
37
+ /**
38
+ * Create the web-search tool entry for the agent tool registry.
39
+ */
40
+ export declare function createWebSearchToolEntry(opts?: WebSearchToolOptions): Record<string, ActionEntry>;
41
+ //# sourceMappingURL=web-search-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-search-tool.d.ts","sourceRoot":"","sources":["../../src/extensions/web-search-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,CAClB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,iBAAiB,KACnB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACjC;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,MAAM,iBAAiB,GAAG,IAAI,CAAC;CACvD;AAyID;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,GAAE,oBAAyB,GAC9B,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CA0F7B"}
@@ -0,0 +1,200 @@
1
+ /**
2
+ * Web-search tool — agent tool for searching the public web.
3
+ *
4
+ * Pluggable backends resolved at call time based on which API key is
5
+ * configured (env var or secrets/credentials store):
6
+ *
7
+ * 1. Brave Search API (BRAVE_SEARCH_API_KEY)
8
+ * 2. Tavily (TAVILY_API_KEY)
9
+ * 3. Exa (EXA_API_KEY)
10
+ *
11
+ * The first configured backend wins. If none is configured, the tool
12
+ * returns a helpful message telling the user which keys to add.
13
+ *
14
+ * Register BRAVE_SEARCH_API_KEY, TAVILY_API_KEY, or EXA_API_KEY via the
15
+ * app secrets settings or as environment variables.
16
+ */
17
+ const DEFAULT_COUNT = 5;
18
+ const MAX_COUNT = 10;
19
+ async function resolveSearchKey(key, opts) {
20
+ // 1. Try per-request credential context (user/org stored key)
21
+ if (opts.resolveCredential && opts.getCredentialContext) {
22
+ const ctx = opts.getCredentialContext();
23
+ if (ctx) {
24
+ try {
25
+ const value = await opts.resolveCredential(key, ctx);
26
+ if (value)
27
+ return value;
28
+ }
29
+ catch {
30
+ // Credential lookup failures are non-fatal; fall through to env.
31
+ }
32
+ }
33
+ }
34
+ // 2. Fall back to env var
35
+ return process.env[key] || undefined;
36
+ }
37
+ // ---------------------------------------------------------------------------
38
+ // Backend implementations
39
+ // ---------------------------------------------------------------------------
40
+ async function searchBrave(query, count, apiKey) {
41
+ const url = `https://api.search.brave.com/res/v1/web/search?q=${encodeURIComponent(query)}&count=${count}`;
42
+ const res = await fetch(url, {
43
+ headers: {
44
+ Accept: "application/json",
45
+ "Accept-Encoding": "gzip",
46
+ "X-Subscription-Token": apiKey,
47
+ },
48
+ signal: AbortSignal.timeout(15_000),
49
+ });
50
+ if (!res.ok) {
51
+ throw new Error(`Brave Search error ${res.status}: ${await res.text()}`);
52
+ }
53
+ const data = (await res.json());
54
+ return (data.web?.results ?? []).map((r) => ({
55
+ title: r.title ?? "",
56
+ url: r.url ?? "",
57
+ snippet: r.description ?? "",
58
+ }));
59
+ }
60
+ async function searchTavily(query, count, apiKey) {
61
+ const res = await fetch("https://api.tavily.com/search", {
62
+ method: "POST",
63
+ headers: {
64
+ "Content-Type": "application/json",
65
+ },
66
+ body: JSON.stringify({
67
+ api_key: apiKey,
68
+ query,
69
+ max_results: count,
70
+ search_depth: "basic",
71
+ }),
72
+ signal: AbortSignal.timeout(15_000),
73
+ });
74
+ if (!res.ok) {
75
+ throw new Error(`Tavily error ${res.status}: ${await res.text()}`);
76
+ }
77
+ const data = (await res.json());
78
+ return (data.results ?? []).map((r) => ({
79
+ title: r.title ?? "",
80
+ url: r.url ?? "",
81
+ snippet: r.content ?? "",
82
+ }));
83
+ }
84
+ async function searchExa(query, count, apiKey) {
85
+ const res = await fetch("https://api.exa.ai/search", {
86
+ method: "POST",
87
+ headers: {
88
+ "Content-Type": "application/json",
89
+ "x-api-key": apiKey,
90
+ },
91
+ body: JSON.stringify({
92
+ query,
93
+ numResults: count,
94
+ type: "auto",
95
+ contents: { text: { maxCharacters: 400 } },
96
+ }),
97
+ signal: AbortSignal.timeout(15_000),
98
+ });
99
+ if (!res.ok) {
100
+ throw new Error(`Exa error ${res.status}: ${await res.text()}`);
101
+ }
102
+ const data = (await res.json());
103
+ return (data.results ?? []).map((r) => ({
104
+ title: r.title ?? "",
105
+ url: r.url ?? "",
106
+ snippet: r.text ?? "",
107
+ }));
108
+ }
109
+ // ---------------------------------------------------------------------------
110
+ // Tool entry factory
111
+ // ---------------------------------------------------------------------------
112
+ /**
113
+ * Create the web-search tool entry for the agent tool registry.
114
+ */
115
+ export function createWebSearchToolEntry(opts = {}) {
116
+ return {
117
+ "web-search": {
118
+ tool: {
119
+ description: "Search the public web. Use to find API documentation, endpoints, current information, or any topic. Returns a ranked list of results (title, URL, snippet). Follow up with web-request or provider-api-docs to fetch the full content of promising URLs. Requires one of: BRAVE_SEARCH_API_KEY, TAVILY_API_KEY, or EXA_API_KEY to be configured.",
120
+ parameters: {
121
+ type: "object",
122
+ properties: {
123
+ query: {
124
+ type: "string",
125
+ description: "Search query. Be specific — include API name, version, and what you need (e.g. 'Stripe API list subscriptions endpoint').",
126
+ },
127
+ count: {
128
+ type: "number",
129
+ description: `Number of results to return. Default ${DEFAULT_COUNT}, max ${MAX_COUNT}.`,
130
+ },
131
+ },
132
+ required: ["query"],
133
+ },
134
+ },
135
+ run: async (args) => {
136
+ const query = (args.query ?? "").trim();
137
+ if (!query)
138
+ return "query is required.";
139
+ const rawCount = Number(args.count);
140
+ const count = Number.isFinite(rawCount) && rawCount > 0
141
+ ? Math.min(Math.floor(rawCount), MAX_COUNT)
142
+ : DEFAULT_COUNT;
143
+ // Backend selection — first configured wins.
144
+ const braveKey = await resolveSearchKey("BRAVE_SEARCH_API_KEY", opts);
145
+ const tavilyKey = await resolveSearchKey("TAVILY_API_KEY", opts);
146
+ const exaKey = await resolveSearchKey("EXA_API_KEY", opts);
147
+ let results;
148
+ let backend;
149
+ try {
150
+ if (braveKey) {
151
+ results = await searchBrave(query, count, braveKey);
152
+ backend = "Brave Search";
153
+ }
154
+ else if (tavilyKey) {
155
+ results = await searchTavily(query, count, tavilyKey);
156
+ backend = "Tavily";
157
+ }
158
+ else if (exaKey) {
159
+ results = await searchExa(query, count, exaKey);
160
+ backend = "Exa";
161
+ }
162
+ else {
163
+ return [
164
+ "No web-search backend configured.",
165
+ "Add one of the following keys via app settings or environment variables:",
166
+ " • BRAVE_SEARCH_API_KEY — https://brave.com/search/api/",
167
+ " • TAVILY_API_KEY — https://tavily.com/",
168
+ " • EXA_API_KEY — https://exa.ai/",
169
+ ].join("\n");
170
+ }
171
+ }
172
+ catch (err) {
173
+ const msg = err instanceof Error ? err.message : String(err);
174
+ return `Web search failed (${msg}). Try web-request to fetch a specific URL directly.`;
175
+ }
176
+ if (results.length === 0) {
177
+ return `No results found for "${query}" (backend: ${backend}).`;
178
+ }
179
+ const lines = [
180
+ `Web search results for "${query}" (backend: ${backend}):`,
181
+ "",
182
+ ];
183
+ for (let i = 0; i < results.length; i++) {
184
+ const r = results[i];
185
+ lines.push(`${i + 1}. ${r.title}`);
186
+ lines.push(` URL: ${r.url}`);
187
+ if (r.snippet) {
188
+ const snippet = r.snippet.slice(0, 300).replace(/\n+/g, " ");
189
+ lines.push(` ${snippet}`);
190
+ }
191
+ lines.push("");
192
+ }
193
+ lines.push("Use web-request or provider-api-docs to fetch full content from promising URLs.");
194
+ return lines.join("\n");
195
+ },
196
+ readOnly: true,
197
+ },
198
+ };
199
+ }
200
+ //# sourceMappingURL=web-search-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-search-tool.js","sourceRoot":"","sources":["../../src/extensions/web-search-tool.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Web-search tool — agent tool for searching the public web.\n *\n * Pluggable backends resolved at call time based on which API key is\n * configured (env var or secrets/credentials store):\n *\n * 1. Brave Search API (BRAVE_SEARCH_API_KEY)\n * 2. Tavily (TAVILY_API_KEY)\n * 3. Exa (EXA_API_KEY)\n *\n * The first configured backend wins. If none is configured, the tool\n * returns a helpful message telling the user which keys to add.\n *\n * Register BRAVE_SEARCH_API_KEY, TAVILY_API_KEY, or EXA_API_KEY via the\n * app secrets settings or as environment variables.\n */\n\nimport type { ActionEntry } from \"../agent/production-agent.js\";\nimport type { CredentialContext } from \"../credentials/index.js\";\n\nexport interface WebSearchResult {\n title: string;\n url: string;\n snippet: string;\n}\n\nexport interface WebSearchToolOptions {\n /**\n * Resolve a credential by key. When not provided the tool falls back to\n * env-var lookup only.\n */\n resolveCredential?: (\n key: string,\n ctx: CredentialContext,\n ) => Promise<string | undefined>;\n /**\n * Returns the current request's credential context (user email + orgId).\n * Required for per-user credential resolution; env-var fallback still\n * works without it.\n */\n getCredentialContext?: () => CredentialContext | null;\n}\n\nconst DEFAULT_COUNT = 5;\nconst MAX_COUNT = 10;\n\nasync function resolveSearchKey(\n key: string,\n opts: WebSearchToolOptions,\n): Promise<string | undefined> {\n // 1. Try per-request credential context (user/org stored key)\n if (opts.resolveCredential && opts.getCredentialContext) {\n const ctx = opts.getCredentialContext();\n if (ctx) {\n try {\n const value = await opts.resolveCredential(key, ctx);\n if (value) return value;\n } catch {\n // Credential lookup failures are non-fatal; fall through to env.\n }\n }\n }\n // 2. Fall back to env var\n return process.env[key] || undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Backend implementations\n// ---------------------------------------------------------------------------\n\nasync function searchBrave(\n query: string,\n count: number,\n apiKey: string,\n): Promise<WebSearchResult[]> {\n const url = `https://api.search.brave.com/res/v1/web/search?q=${encodeURIComponent(query)}&count=${count}`;\n const res = await fetch(url, {\n headers: {\n Accept: \"application/json\",\n \"Accept-Encoding\": \"gzip\",\n \"X-Subscription-Token\": apiKey,\n },\n signal: AbortSignal.timeout(15_000),\n });\n if (!res.ok) {\n throw new Error(`Brave Search error ${res.status}: ${await res.text()}`);\n }\n const data = (await res.json()) as {\n web?: {\n results?: Array<{\n title?: string;\n url?: string;\n description?: string;\n }>;\n };\n };\n return (data.web?.results ?? []).map((r) => ({\n title: r.title ?? \"\",\n url: r.url ?? \"\",\n snippet: r.description ?? \"\",\n }));\n}\n\nasync function searchTavily(\n query: string,\n count: number,\n apiKey: string,\n): Promise<WebSearchResult[]> {\n const res = await fetch(\"https://api.tavily.com/search\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n api_key: apiKey,\n query,\n max_results: count,\n search_depth: \"basic\",\n }),\n signal: AbortSignal.timeout(15_000),\n });\n if (!res.ok) {\n throw new Error(`Tavily error ${res.status}: ${await res.text()}`);\n }\n const data = (await res.json()) as {\n results?: Array<{\n title?: string;\n url?: string;\n content?: string;\n }>;\n };\n return (data.results ?? []).map((r) => ({\n title: r.title ?? \"\",\n url: r.url ?? \"\",\n snippet: r.content ?? \"\",\n }));\n}\n\nasync function searchExa(\n query: string,\n count: number,\n apiKey: string,\n): Promise<WebSearchResult[]> {\n const res = await fetch(\"https://api.exa.ai/search\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": apiKey,\n },\n body: JSON.stringify({\n query,\n numResults: count,\n type: \"auto\",\n contents: { text: { maxCharacters: 400 } },\n }),\n signal: AbortSignal.timeout(15_000),\n });\n if (!res.ok) {\n throw new Error(`Exa error ${res.status}: ${await res.text()}`);\n }\n const data = (await res.json()) as {\n results?: Array<{\n title?: string;\n url?: string;\n text?: string;\n }>;\n };\n return (data.results ?? []).map((r) => ({\n title: r.title ?? \"\",\n url: r.url ?? \"\",\n snippet: r.text ?? \"\",\n }));\n}\n\n// ---------------------------------------------------------------------------\n// Tool entry factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create the web-search tool entry for the agent tool registry.\n */\nexport function createWebSearchToolEntry(\n opts: WebSearchToolOptions = {},\n): Record<string, ActionEntry> {\n return {\n \"web-search\": {\n tool: {\n description:\n \"Search the public web. Use to find API documentation, endpoints, current information, or any topic. Returns a ranked list of results (title, URL, snippet). Follow up with web-request or provider-api-docs to fetch the full content of promising URLs. Requires one of: BRAVE_SEARCH_API_KEY, TAVILY_API_KEY, or EXA_API_KEY to be configured.\",\n parameters: {\n type: \"object\" as const,\n properties: {\n query: {\n type: \"string\",\n description:\n \"Search query. Be specific — include API name, version, and what you need (e.g. 'Stripe API list subscriptions endpoint').\",\n },\n count: {\n type: \"number\",\n description: `Number of results to return. Default ${DEFAULT_COUNT}, max ${MAX_COUNT}.`,\n },\n },\n required: [\"query\"],\n },\n },\n run: async (args: Record<string, string>) => {\n const query = (args.query ?? \"\").trim();\n if (!query) return \"query is required.\";\n\n const rawCount = Number(args.count);\n const count =\n Number.isFinite(rawCount) && rawCount > 0\n ? Math.min(Math.floor(rawCount), MAX_COUNT)\n : DEFAULT_COUNT;\n\n // Backend selection — first configured wins.\n const braveKey = await resolveSearchKey(\"BRAVE_SEARCH_API_KEY\", opts);\n const tavilyKey = await resolveSearchKey(\"TAVILY_API_KEY\", opts);\n const exaKey = await resolveSearchKey(\"EXA_API_KEY\", opts);\n\n let results: WebSearchResult[];\n let backend: string;\n\n try {\n if (braveKey) {\n results = await searchBrave(query, count, braveKey);\n backend = \"Brave Search\";\n } else if (tavilyKey) {\n results = await searchTavily(query, count, tavilyKey);\n backend = \"Tavily\";\n } else if (exaKey) {\n results = await searchExa(query, count, exaKey);\n backend = \"Exa\";\n } else {\n return [\n \"No web-search backend configured.\",\n \"Add one of the following keys via app settings or environment variables:\",\n \" • BRAVE_SEARCH_API_KEY — https://brave.com/search/api/\",\n \" • TAVILY_API_KEY — https://tavily.com/\",\n \" • EXA_API_KEY — https://exa.ai/\",\n ].join(\"\\n\");\n }\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n return `Web search failed (${msg}). Try web-request to fetch a specific URL directly.`;\n }\n\n if (results.length === 0) {\n return `No results found for \"${query}\" (backend: ${backend}).`;\n }\n\n const lines: string[] = [\n `Web search results for \"${query}\" (backend: ${backend}):`,\n \"\",\n ];\n for (let i = 0; i < results.length; i++) {\n const r = results[i];\n lines.push(`${i + 1}. ${r.title}`);\n lines.push(` URL: ${r.url}`);\n if (r.snippet) {\n const snippet = r.snippet.slice(0, 300).replace(/\\n+/g, \" \");\n lines.push(` ${snippet}`);\n }\n lines.push(\"\");\n }\n lines.push(\n \"Use web-request or provider-api-docs to fetch full content from promising URLs.\",\n );\n return lines.join(\"\\n\");\n },\n readOnly: true,\n },\n };\n}\n"]}
@@ -1,3 +1,28 @@
1
- declare const _default: any;
1
+ declare const _default: import("../../action.js").ActionDefinition<{
2
+ data?: string | undefined;
3
+ url?: string | undefined;
4
+ filename?: string | undefined;
5
+ }, {
6
+ error: string;
7
+ configured?: undefined;
8
+ connectPath?: undefined;
9
+ url?: undefined;
10
+ id?: undefined;
11
+ provider?: undefined;
12
+ } | {
13
+ error: string;
14
+ configured: boolean;
15
+ connectPath: string;
16
+ url?: undefined;
17
+ id?: undefined;
18
+ provider?: undefined;
19
+ } | {
20
+ url: string;
21
+ id: string | undefined;
22
+ provider: string;
23
+ error?: undefined;
24
+ configured?: undefined;
25
+ connectPath?: undefined;
26
+ }>;
2
27
  export default _default;
3
28
  //# sourceMappingURL=upload-image.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"upload-image.d.ts","sourceRoot":"","sources":["../../../src/file-upload/actions/upload-image.ts"],"names":[],"mappings":";AA2IA,wBAwEG"}
1
+ {"version":3,"file":"upload-image.d.ts","sourceRoot":"","sources":["../../../src/file-upload/actions/upload-image.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA2IA,wBAwEG"}
@@ -1,5 +1,5 @@
1
1
  export type { FileUploadInput, FileUploadProvider, FileUploadResult, } from "./types.js";
2
2
  export { registerFileUploadProvider, unregisterFileUploadProvider, listFileUploadProviders, getActiveFileUploadProvider, uploadFile, } from "./registry.js";
3
3
  export { builderFileUploadProvider } from "./builder.js";
4
- export { preUploadImageAttachments, type PreUploadAttachmentsResult, type PreUploadedImageAttachment, } from "./pre-upload-attachments.js";
4
+ export { preUploadImageAttachments, preUploadAttachments, isFileUploadProviderConfigured, type PreUploadAttachmentsResult, type PreUploadedImageAttachment, type PreUploadedFileAttachment, } from "./pre-upload-attachments.js";
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/file-upload/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,eAAe,EACf,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,0BAA0B,EAC1B,4BAA4B,EAC5B,uBAAuB,EACvB,2BAA2B,EAC3B,UAAU,GACX,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EACL,yBAAyB,EACzB,KAAK,0BAA0B,EAC/B,KAAK,0BAA0B,GAChC,MAAM,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/file-upload/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,eAAe,EACf,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,0BAA0B,EAC1B,4BAA4B,EAC5B,uBAAuB,EACvB,2BAA2B,EAC3B,UAAU,GACX,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,8BAA8B,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,GAC/B,MAAM,6BAA6B,CAAC"}
@@ -1,4 +1,4 @@
1
1
  export { registerFileUploadProvider, unregisterFileUploadProvider, listFileUploadProviders, getActiveFileUploadProvider, uploadFile, } from "./registry.js";
2
2
  export { builderFileUploadProvider } from "./builder.js";
3
- export { preUploadImageAttachments, } from "./pre-upload-attachments.js";
3
+ export { preUploadImageAttachments, preUploadAttachments, isFileUploadProviderConfigured, } from "./pre-upload-attachments.js";
4
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/file-upload/index.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,0BAA0B,EAC1B,4BAA4B,EAC5B,uBAAuB,EACvB,2BAA2B,EAC3B,UAAU,GACX,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EACL,yBAAyB,GAG1B,MAAM,6BAA6B,CAAC","sourcesContent":["export type {\n FileUploadInput,\n FileUploadProvider,\n FileUploadResult,\n} from \"./types.js\";\nexport {\n registerFileUploadProvider,\n unregisterFileUploadProvider,\n listFileUploadProviders,\n getActiveFileUploadProvider,\n uploadFile,\n} from \"./registry.js\";\nexport { builderFileUploadProvider } from \"./builder.js\";\nexport {\n preUploadImageAttachments,\n type PreUploadAttachmentsResult,\n type PreUploadedImageAttachment,\n} from \"./pre-upload-attachments.js\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/file-upload/index.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,0BAA0B,EAC1B,4BAA4B,EAC5B,uBAAuB,EACvB,2BAA2B,EAC3B,UAAU,GACX,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,8BAA8B,GAI/B,MAAM,6BAA6B,CAAC","sourcesContent":["export type {\n FileUploadInput,\n FileUploadProvider,\n FileUploadResult,\n} from \"./types.js\";\nexport {\n registerFileUploadProvider,\n unregisterFileUploadProvider,\n listFileUploadProviders,\n getActiveFileUploadProvider,\n uploadFile,\n} from \"./registry.js\";\nexport { builderFileUploadProvider } from \"./builder.js\";\nexport {\n preUploadImageAttachments,\n preUploadAttachments,\n isFileUploadProviderConfigured,\n type PreUploadAttachmentsResult,\n type PreUploadedImageAttachment,\n type PreUploadedFileAttachment,\n} from \"./pre-upload-attachments.js\";\n"]}
@@ -5,6 +5,18 @@ export interface PreUploadedImageAttachment {
5
5
  provider: string;
6
6
  contentType?: string;
7
7
  }
8
+ /**
9
+ * A file/non-image attachment that was successfully uploaded to a hosted URL.
10
+ * Consumers can use the URL in place of the base64 data to avoid persisting
11
+ * large blobs in the thread repo and SQL.
12
+ */
13
+ export interface PreUploadedFileAttachment {
14
+ name?: string;
15
+ url: string;
16
+ provider: string;
17
+ contentType?: string;
18
+ sizeBytes?: number;
19
+ }
8
20
  export interface PreUploadAttachmentsResult {
9
21
  /** Same array reference. Each image attachment that was uploaded also gets a
10
22
  * `url` property attached (non-breaking; consumers that don't read it are
@@ -13,6 +25,9 @@ export interface PreUploadAttachmentsResult {
13
25
  /** Set when at least one image was uploaded. List of hosted URLs the agent
14
26
  * can embed in HTML, slide content, documents, etc. */
15
27
  uploaded: PreUploadedImageAttachment[];
28
+ /** Uploaded non-image files (PDF, generic binary). Parallel to `uploaded`
29
+ * but for the file/document attachment type. */
30
+ uploadedFiles: PreUploadedFileAttachment[];
16
31
  /** True if at least one image attachment failed to upload because no
17
32
  * file-upload provider is configured. Templates use this to render a
18
33
  * "Connect Builder.io" suggestion. */
@@ -22,6 +37,11 @@ export interface PreUploadAttachmentsResult {
22
37
  * is configured. */
23
38
  injectedText: string | null;
24
39
  }
40
+ /**
41
+ * Returns true when a file-upload provider is currently configured.
42
+ * Used to decide whether to attempt upload-first or fall back to base64.
43
+ */
44
+ export declare function isFileUploadProviderConfigured(): boolean;
25
45
  /**
26
46
  * Pre-upload chat image attachments through the active file-upload provider
27
47
  * (Builder.io by default) so the agent can embed hosted URLs in HTML, slide
@@ -36,4 +56,21 @@ export declare function preUploadImageAttachments(opts: {
36
56
  attachments: AgentChatAttachment[] | undefined;
37
57
  ownerEmail: string | null | undefined;
38
58
  }): Promise<PreUploadAttachmentsResult>;
59
+ /**
60
+ * Pre-upload ALL chat attachments (images AND files/PDFs) through the active
61
+ * file-upload provider. When a provider is configured, each attachment gets a
62
+ * `url` property injected so downstream code can store/send URLs instead of
63
+ * base64. The base64 data is kept in-memory for the current turn so vision and
64
+ * file-reading still work; callers that persist the attachment can drop the
65
+ * data when a URL exists.
66
+ *
67
+ * Falls back gracefully when no provider is configured: returns untouched
68
+ * attachments with `providerMissing: true` for image-type failures.
69
+ */
70
+ export declare function preUploadAttachments(opts: {
71
+ attachments: AgentChatAttachment[] | undefined;
72
+ ownerEmail: string | null | undefined;
73
+ /** When false, only images are uploaded (legacy behaviour). Default: true */
74
+ includeFiles?: boolean;
75
+ }): Promise<PreUploadAttachmentsResult>;
39
76
  //# sourceMappingURL=pre-upload-attachments.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pre-upload-attachments.d.ts","sourceRoot":"","sources":["../../src/file-upload/pre-upload-attachments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAG7D,MAAM,WAAW,0BAA0B;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,0BAA0B;IACzC;;uBAEmB;IACnB,WAAW,EAAE,mBAAmB,EAAE,CAAC;IACnC;4DACwD;IACxD,QAAQ,EAAE,0BAA0B,EAAE,CAAC;IACvC;;2CAEuC;IACvC,eAAe,EAAE,OAAO,CAAC;IACzB;;yBAEqB;IACrB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAYD;;;;;;;;;GASG;AACH,wBAAsB,yBAAyB,CAAC,IAAI,EAAE;IACpD,WAAW,EAAE,mBAAmB,EAAE,GAAG,SAAS,CAAC;IAC/C,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CACvC,GAAG,OAAO,CAAC,0BAA0B,CAAC,CA6FtC"}
1
+ {"version":3,"file":"pre-upload-attachments.d.ts","sourceRoot":"","sources":["../../src/file-upload/pre-upload-attachments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAG7D,MAAM,WAAW,0BAA0B;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,MAAM,WAAW,yBAAyB;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,0BAA0B;IACzC;;uBAEmB;IACnB,WAAW,EAAE,mBAAmB,EAAE,CAAC;IACnC;4DACwD;IACxD,QAAQ,EAAE,0BAA0B,EAAE,CAAC;IACvC;qDACiD;IACjD,aAAa,EAAE,yBAAyB,EAAE,CAAC;IAC3C;;2CAEuC;IACvC,eAAe,EAAE,OAAO,CAAC;IACzB;;yBAEqB;IACrB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAaD;;;GAGG;AACH,wBAAgB,8BAA8B,IAAI,OAAO,CAExD;AAED;;;;;;;;;GASG;AACH,wBAAsB,yBAAyB,CAAC,IAAI,EAAE;IACpD,WAAW,EAAE,mBAAmB,EAAE,GAAG,SAAS,CAAC;IAC/C,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CACvC,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAEtC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAC/C,WAAW,EAAE,mBAAmB,EAAE,GAAG,SAAS,CAAC;IAC/C,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACtC,6EAA6E;IAC7E,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAgItC"}
@@ -1,5 +1,6 @@
1
- import { uploadFile } from "./registry.js";
2
- const DATA_URL_RE = /^data:(image\/[^;]+);base64,(.+)$/;
1
+ import { getActiveFileUploadProvider, uploadFile } from "./registry.js";
2
+ const IMAGE_DATA_URL_RE = /^data:(image\/[^;]+);base64,(.+)$/;
3
+ const FILE_DATA_URL_RE = /^data:([^;]+);base64,(.+)$/;
3
4
  function escapeXmlAttr(value) {
4
5
  return value
5
6
  .replace(/&/g, "&amp;")
@@ -7,6 +8,13 @@ function escapeXmlAttr(value) {
7
8
  .replace(/>/g, "&gt;")
8
9
  .replace(/"/g, "&quot;");
9
10
  }
11
+ /**
12
+ * Returns true when a file-upload provider is currently configured.
13
+ * Used to decide whether to attempt upload-first or fall back to base64.
14
+ */
15
+ export function isFileUploadProviderConfigured() {
16
+ return getActiveFileUploadProvider() !== null;
17
+ }
10
18
  /**
11
19
  * Pre-upload chat image attachments through the active file-upload provider
12
20
  * (Builder.io by default) so the agent can embed hosted URLs in HTML, slide
@@ -18,34 +26,62 @@ function escapeXmlAttr(value) {
18
26
  * Builder.io hint to the agent.
19
27
  */
20
28
  export async function preUploadImageAttachments(opts) {
29
+ return preUploadAttachments({ ...opts, includeFiles: false });
30
+ }
31
+ /**
32
+ * Pre-upload ALL chat attachments (images AND files/PDFs) through the active
33
+ * file-upload provider. When a provider is configured, each attachment gets a
34
+ * `url` property injected so downstream code can store/send URLs instead of
35
+ * base64. The base64 data is kept in-memory for the current turn so vision and
36
+ * file-reading still work; callers that persist the attachment can drop the
37
+ * data when a URL exists.
38
+ *
39
+ * Falls back gracefully when no provider is configured: returns untouched
40
+ * attachments with `providerMissing: true` for image-type failures.
41
+ */
42
+ export async function preUploadAttachments(opts) {
21
43
  const list = Array.isArray(opts.attachments) ? opts.attachments : [];
44
+ const includeFiles = opts.includeFiles !== false;
22
45
  const uploaded = [];
46
+ const uploadedFiles = [];
23
47
  let providerMissing = false;
24
48
  if (list.length === 0) {
25
49
  return {
26
50
  attachments: list,
27
51
  uploaded,
52
+ uploadedFiles,
28
53
  providerMissing: false,
29
54
  injectedText: null,
30
55
  };
31
56
  }
32
57
  for (const att of list) {
33
- if (att.type !== "image" || typeof att.data !== "string")
58
+ const isImage = att.type === "image";
59
+ const isFile = att.type === "file" || att.type === "document";
60
+ if (!isImage && !(includeFiles && isFile))
61
+ continue;
62
+ if (typeof att.data !== "string")
34
63
  continue;
35
64
  if (att.url) {
36
65
  // Already pre-uploaded earlier in the pipeline — reuse it.
37
- uploaded.push({
66
+ const entry = {
38
67
  name: att.name,
39
68
  url: att.url,
40
69
  provider: att.uploadProvider || "unknown",
41
70
  contentType: att.contentType,
42
- });
71
+ };
72
+ if (isImage) {
73
+ uploaded.push(entry);
74
+ }
75
+ else {
76
+ uploadedFiles.push(entry);
77
+ }
43
78
  continue;
44
79
  }
45
- const match = att.data.match(DATA_URL_RE);
80
+ const re = isImage ? IMAGE_DATA_URL_RE : FILE_DATA_URL_RE;
81
+ const match = att.data.match(re);
46
82
  if (!match)
47
83
  continue;
48
- const mimeType = match[1];
84
+ const mimeType = att.contentType || match[1];
49
85
  let bytes;
50
86
  try {
51
87
  bytes = new Uint8Array(Buffer.from(match[2], "base64"));
@@ -61,39 +97,57 @@ export async function preUploadImageAttachments(opts) {
61
97
  ownerEmail: opts.ownerEmail || undefined,
62
98
  });
63
99
  if (!result) {
64
- providerMissing = true;
100
+ if (isImage)
101
+ providerMissing = true;
65
102
  continue;
66
103
  }
67
104
  att.url = result.url;
68
105
  att.uploadProvider = result.provider;
69
- uploaded.push({
106
+ const entry = {
70
107
  name: att.name,
71
108
  url: result.url,
72
109
  provider: result.provider,
73
110
  contentType: att.contentType,
74
- });
111
+ sizeBytes: bytes.byteLength,
112
+ };
113
+ if (isImage) {
114
+ uploaded.push(entry);
115
+ }
116
+ else {
117
+ uploadedFiles.push(entry);
118
+ }
75
119
  }
76
120
  catch (err) {
77
121
  // Real upload failure (network, API). Keep the base64 so the model
78
- // can still see the image, but don't crash the turn.
79
- console.warn("[agent-native] pre-upload of chat image attachment failed:", err instanceof Error ? err.message : String(err));
122
+ // can still see the image/file, but don't crash the turn.
123
+ console.warn("[agent-native] pre-upload of chat attachment failed:", err instanceof Error ? err.message : String(err));
80
124
  }
81
125
  }
82
126
  let injectedText = null;
83
- if (uploaded.length > 0) {
84
- const lines = uploaded.map((u) => {
127
+ if (uploaded.length > 0 || uploadedFiles.length > 0) {
128
+ const lines = [];
129
+ for (const u of uploaded) {
85
130
  const attrs = [
86
131
  u.name ? `name="${escapeXmlAttr(u.name)}"` : null,
87
132
  `url="${escapeXmlAttr(u.url)}"`,
88
133
  u.contentType ? `contentType="${escapeXmlAttr(u.contentType)}"` : null,
89
134
  `provider="${escapeXmlAttr(u.provider)}"`,
90
135
  ].filter(Boolean);
91
- return `<chat-image-attachment ${attrs.join(" ")} />`;
92
- });
136
+ lines.push(`<chat-image-attachment ${attrs.join(" ")} />`);
137
+ }
138
+ for (const f of uploadedFiles) {
139
+ const attrs = [
140
+ f.name ? `name="${escapeXmlAttr(f.name)}"` : null,
141
+ `url="${escapeXmlAttr(f.url)}"`,
142
+ f.contentType ? `contentType="${escapeXmlAttr(f.contentType)}"` : null,
143
+ `provider="${escapeXmlAttr(f.provider)}"`,
144
+ ].filter(Boolean);
145
+ lines.push(`<chat-file-attachment ${attrs.join(" ")} />`);
146
+ }
93
147
  injectedText = [
94
- '<chat-image-attachments note="The user attached these images. They have been uploaded — use the url attribute when embedding in HTML, slide content, or any outbound message.">',
148
+ '<chat-attachments note="The user attached these files. They have been uploaded — use the url attribute when embedding in HTML, slide content, or any outbound message.">',
95
149
  ...lines,
96
- "</chat-image-attachments>",
150
+ "</chat-attachments>",
97
151
  ].join("\n");
98
152
  }
99
153
  else if (providerMissing) {
@@ -105,6 +159,12 @@ export async function preUploadImageAttachments(opts) {
105
159
  "</chat-image-attachment-upload-error>",
106
160
  ].join("\n");
107
161
  }
108
- return { attachments: list, uploaded, providerMissing, injectedText };
162
+ return {
163
+ attachments: list,
164
+ uploaded,
165
+ uploadedFiles,
166
+ providerMissing,
167
+ injectedText,
168
+ };
109
169
  }
110
170
  //# sourceMappingURL=pre-upload-attachments.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pre-upload-attachments.js","sourceRoot":"","sources":["../../src/file-upload/pre-upload-attachments.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentChatAttachment } from \"../agent/types.js\";\nimport { uploadFile } from \"./registry.js\";\n\nexport interface PreUploadedImageAttachment {\n name?: string;\n url: string;\n provider: string;\n contentType?: string;\n}\n\nexport interface PreUploadAttachmentsResult {\n /** Same array reference. Each image attachment that was uploaded also gets a\n * `url` property attached (non-breaking; consumers that don't read it are\n * unaffected). */\n attachments: AgentChatAttachment[];\n /** Set when at least one image was uploaded. List of hosted URLs the agent\n * can embed in HTML, slide content, documents, etc. */\n uploaded: PreUploadedImageAttachment[];\n /** True if at least one image attachment failed to upload because no\n * file-upload provider is configured. Templates use this to render a\n * \"Connect Builder.io\" suggestion. */\n providerMissing: boolean;\n /** A pre-formatted block to inject into the user message text so the agent\n * has each hosted URL inline. Null when nothing was uploaded or no provider\n * is configured. */\n injectedText: string | null;\n}\n\nconst DATA_URL_RE = /^data:(image\\/[^;]+);base64,(.+)$/;\n\nfunction escapeXmlAttr(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\");\n}\n\n/**\n * Pre-upload chat image attachments through the active file-upload provider\n * (Builder.io by default) so the agent can embed hosted URLs in HTML, slide\n * content, and outbound messages. Keeps the original base64 data URL on the\n * attachment so multimodal vision still works — only adds a hosted `url`.\n *\n * Safe to call when no provider is configured: it returns the attachments\n * untouched with `providerMissing: true` so callers can surface a connect-\n * Builder.io hint to the agent.\n */\nexport async function preUploadImageAttachments(opts: {\n attachments: AgentChatAttachment[] | undefined;\n ownerEmail: string | null | undefined;\n}): Promise<PreUploadAttachmentsResult> {\n const list = Array.isArray(opts.attachments) ? opts.attachments : [];\n const uploaded: PreUploadedImageAttachment[] = [];\n let providerMissing = false;\n\n if (list.length === 0) {\n return {\n attachments: list,\n uploaded,\n providerMissing: false,\n injectedText: null,\n };\n }\n\n for (const att of list) {\n if (att.type !== \"image\" || typeof att.data !== \"string\") continue;\n if ((att as any).url) {\n // Already pre-uploaded earlier in the pipeline — reuse it.\n uploaded.push({\n name: att.name,\n url: (att as any).url as string,\n provider: ((att as any).uploadProvider as string) || \"unknown\",\n contentType: att.contentType,\n });\n continue;\n }\n\n const match = att.data.match(DATA_URL_RE);\n if (!match) continue;\n const mimeType = match[1];\n let bytes: Uint8Array;\n try {\n bytes = new Uint8Array(Buffer.from(match[2], \"base64\"));\n } catch {\n continue;\n }\n\n try {\n const result = await uploadFile({\n data: bytes,\n filename: att.name,\n mimeType,\n ownerEmail: opts.ownerEmail || undefined,\n });\n if (!result) {\n providerMissing = true;\n continue;\n }\n (att as any).url = result.url;\n (att as any).uploadProvider = result.provider;\n uploaded.push({\n name: att.name,\n url: result.url,\n provider: result.provider,\n contentType: att.contentType,\n });\n } catch (err) {\n // Real upload failure (network, API). Keep the base64 so the model\n // can still see the image, but don't crash the turn.\n console.warn(\n \"[agent-native] pre-upload of chat image attachment failed:\",\n err instanceof Error ? err.message : String(err),\n );\n }\n }\n\n let injectedText: string | null = null;\n if (uploaded.length > 0) {\n const lines = uploaded.map((u) => {\n const attrs = [\n u.name ? `name=\"${escapeXmlAttr(u.name)}\"` : null,\n `url=\"${escapeXmlAttr(u.url)}\"`,\n u.contentType ? `contentType=\"${escapeXmlAttr(u.contentType)}\"` : null,\n `provider=\"${escapeXmlAttr(u.provider)}\"`,\n ].filter(Boolean);\n return `<chat-image-attachment ${attrs.join(\" \")} />`;\n });\n injectedText = [\n '<chat-image-attachments note=\"The user attached these images. They have been uploaded — use the url attribute when embedding in HTML, slide content, or any outbound message.\">',\n ...lines,\n \"</chat-image-attachments>\",\n ].join(\"\\n\");\n } else if (providerMissing) {\n injectedText = [\n \"<chat-image-attachment-upload-error>\",\n \"The user attached one or more images, but no file-upload provider is configured for this app.\",\n \"Tell the user they need to configure one of: (a) Builder.io — recommended, free credits, one-click connect from Settings → File uploads, (b) BUILDER_PRIVATE_KEY environment variable, (c) a custom provider like S3 / R2 / GCS registered via registerFileUploadProvider(). Use `connect-builder` to render an inline connect card for option (a) when available.\",\n \"Until that's done, you can still SEE the image, but you do NOT have a URL to embed it in HTML or share with other apps.\",\n \"</chat-image-attachment-upload-error>\",\n ].join(\"\\n\");\n }\n\n return { attachments: list, uploaded, providerMissing, injectedText };\n}\n"]}
1
+ {"version":3,"file":"pre-upload-attachments.js","sourceRoot":"","sources":["../../src/file-upload/pre-upload-attachments.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentChatAttachment } from \"../agent/types.js\";\nimport { getActiveFileUploadProvider, uploadFile } from \"./registry.js\";\n\nexport interface PreUploadedImageAttachment {\n name?: string;\n url: string;\n provider: string;\n contentType?: string;\n}\n\n/**\n * A file/non-image attachment that was successfully uploaded to a hosted URL.\n * Consumers can use the URL in place of the base64 data to avoid persisting\n * large blobs in the thread repo and SQL.\n */\nexport interface PreUploadedFileAttachment {\n name?: string;\n url: string;\n provider: string;\n contentType?: string;\n sizeBytes?: number;\n}\n\nexport interface PreUploadAttachmentsResult {\n /** Same array reference. Each image attachment that was uploaded also gets a\n * `url` property attached (non-breaking; consumers that don't read it are\n * unaffected). */\n attachments: AgentChatAttachment[];\n /** Set when at least one image was uploaded. List of hosted URLs the agent\n * can embed in HTML, slide content, documents, etc. */\n uploaded: PreUploadedImageAttachment[];\n /** Uploaded non-image files (PDF, generic binary). Parallel to `uploaded`\n * but for the file/document attachment type. */\n uploadedFiles: PreUploadedFileAttachment[];\n /** True if at least one image attachment failed to upload because no\n * file-upload provider is configured. Templates use this to render a\n * \"Connect Builder.io\" suggestion. */\n providerMissing: boolean;\n /** A pre-formatted block to inject into the user message text so the agent\n * has each hosted URL inline. Null when nothing was uploaded or no provider\n * is configured. */\n injectedText: string | null;\n}\n\nconst IMAGE_DATA_URL_RE = /^data:(image\\/[^;]+);base64,(.+)$/;\nconst FILE_DATA_URL_RE = /^data:([^;]+);base64,(.+)$/;\n\nfunction escapeXmlAttr(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\");\n}\n\n/**\n * Returns true when a file-upload provider is currently configured.\n * Used to decide whether to attempt upload-first or fall back to base64.\n */\nexport function isFileUploadProviderConfigured(): boolean {\n return getActiveFileUploadProvider() !== null;\n}\n\n/**\n * Pre-upload chat image attachments through the active file-upload provider\n * (Builder.io by default) so the agent can embed hosted URLs in HTML, slide\n * content, and outbound messages. Keeps the original base64 data URL on the\n * attachment so multimodal vision still works — only adds a hosted `url`.\n *\n * Safe to call when no provider is configured: it returns the attachments\n * untouched with `providerMissing: true` so callers can surface a connect-\n * Builder.io hint to the agent.\n */\nexport async function preUploadImageAttachments(opts: {\n attachments: AgentChatAttachment[] | undefined;\n ownerEmail: string | null | undefined;\n}): Promise<PreUploadAttachmentsResult> {\n return preUploadAttachments({ ...opts, includeFiles: false });\n}\n\n/**\n * Pre-upload ALL chat attachments (images AND files/PDFs) through the active\n * file-upload provider. When a provider is configured, each attachment gets a\n * `url` property injected so downstream code can store/send URLs instead of\n * base64. The base64 data is kept in-memory for the current turn so vision and\n * file-reading still work; callers that persist the attachment can drop the\n * data when a URL exists.\n *\n * Falls back gracefully when no provider is configured: returns untouched\n * attachments with `providerMissing: true` for image-type failures.\n */\nexport async function preUploadAttachments(opts: {\n attachments: AgentChatAttachment[] | undefined;\n ownerEmail: string | null | undefined;\n /** When false, only images are uploaded (legacy behaviour). Default: true */\n includeFiles?: boolean;\n}): Promise<PreUploadAttachmentsResult> {\n const list = Array.isArray(opts.attachments) ? opts.attachments : [];\n const includeFiles = opts.includeFiles !== false;\n const uploaded: PreUploadedImageAttachment[] = [];\n const uploadedFiles: PreUploadedFileAttachment[] = [];\n let providerMissing = false;\n\n if (list.length === 0) {\n return {\n attachments: list,\n uploaded,\n uploadedFiles,\n providerMissing: false,\n injectedText: null,\n };\n }\n\n for (const att of list) {\n const isImage = att.type === \"image\";\n const isFile = att.type === \"file\" || att.type === \"document\";\n if (!isImage && !(includeFiles && isFile)) continue;\n if (typeof att.data !== \"string\") continue;\n\n if ((att as any).url) {\n // Already pre-uploaded earlier in the pipeline — reuse it.\n const entry = {\n name: att.name,\n url: (att as any).url as string,\n provider: ((att as any).uploadProvider as string) || \"unknown\",\n contentType: att.contentType,\n };\n if (isImage) {\n uploaded.push(entry);\n } else {\n uploadedFiles.push(entry);\n }\n continue;\n }\n\n const re = isImage ? IMAGE_DATA_URL_RE : FILE_DATA_URL_RE;\n const match = att.data.match(re);\n if (!match) continue;\n const mimeType = att.contentType || match[1];\n let bytes: Uint8Array;\n try {\n bytes = new Uint8Array(Buffer.from(match[2], \"base64\"));\n } catch {\n continue;\n }\n\n try {\n const result = await uploadFile({\n data: bytes,\n filename: att.name,\n mimeType,\n ownerEmail: opts.ownerEmail || undefined,\n });\n if (!result) {\n if (isImage) providerMissing = true;\n continue;\n }\n (att as any).url = result.url;\n (att as any).uploadProvider = result.provider;\n const entry = {\n name: att.name,\n url: result.url,\n provider: result.provider,\n contentType: att.contentType,\n sizeBytes: bytes.byteLength,\n };\n if (isImage) {\n uploaded.push(entry);\n } else {\n uploadedFiles.push(entry);\n }\n } catch (err) {\n // Real upload failure (network, API). Keep the base64 so the model\n // can still see the image/file, but don't crash the turn.\n console.warn(\n \"[agent-native] pre-upload of chat attachment failed:\",\n err instanceof Error ? err.message : String(err),\n );\n }\n }\n\n let injectedText: string | null = null;\n if (uploaded.length > 0 || uploadedFiles.length > 0) {\n const lines: string[] = [];\n for (const u of uploaded) {\n const attrs = [\n u.name ? `name=\"${escapeXmlAttr(u.name)}\"` : null,\n `url=\"${escapeXmlAttr(u.url)}\"`,\n u.contentType ? `contentType=\"${escapeXmlAttr(u.contentType)}\"` : null,\n `provider=\"${escapeXmlAttr(u.provider)}\"`,\n ].filter(Boolean);\n lines.push(`<chat-image-attachment ${attrs.join(\" \")} />`);\n }\n for (const f of uploadedFiles) {\n const attrs = [\n f.name ? `name=\"${escapeXmlAttr(f.name)}\"` : null,\n `url=\"${escapeXmlAttr(f.url)}\"`,\n f.contentType ? `contentType=\"${escapeXmlAttr(f.contentType)}\"` : null,\n `provider=\"${escapeXmlAttr(f.provider)}\"`,\n ].filter(Boolean);\n lines.push(`<chat-file-attachment ${attrs.join(\" \")} />`);\n }\n injectedText = [\n '<chat-attachments note=\"The user attached these files. They have been uploaded — use the url attribute when embedding in HTML, slide content, or any outbound message.\">',\n ...lines,\n \"</chat-attachments>\",\n ].join(\"\\n\");\n } else if (providerMissing) {\n injectedText = [\n \"<chat-image-attachment-upload-error>\",\n \"The user attached one or more images, but no file-upload provider is configured for this app.\",\n \"Tell the user they need to configure one of: (a) Builder.io — recommended, free credits, one-click connect from Settings → File uploads, (b) BUILDER_PRIVATE_KEY environment variable, (c) a custom provider like S3 / R2 / GCS registered via registerFileUploadProvider(). Use `connect-builder` to render an inline connect card for option (a) when available.\",\n \"Until that's done, you can still SEE the image, but you do NOT have a URL to embed it in HTML or share with other apps.\",\n \"</chat-image-attachment-upload-error>\",\n ].join(\"\\n\");\n }\n\n return {\n attachments: list,\n uploaded,\n uploadedFiles,\n providerMissing,\n injectedText,\n };\n}\n"]}