@agent-native/core 0.102.1 → 0.103.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (295) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +15 -0
  3. package/corpus/core/docs/content/local-file-mode.mdx +99 -489
  4. package/corpus/core/docs/content/locales/ar-SA/local-file-mode.mdx +35 -490
  5. package/corpus/core/docs/content/locales/ar-SA/template-content.mdx +10 -24
  6. package/corpus/core/docs/content/locales/de-DE/local-file-mode.mdx +37 -491
  7. package/corpus/core/docs/content/locales/de-DE/template-content.mdx +10 -24
  8. package/corpus/core/docs/content/locales/es-ES/local-file-mode.mdx +35 -493
  9. package/corpus/core/docs/content/locales/es-ES/template-content.mdx +10 -24
  10. package/corpus/core/docs/content/locales/fr-FR/local-file-mode.mdx +38 -491
  11. package/corpus/core/docs/content/locales/fr-FR/template-content.mdx +10 -24
  12. package/corpus/core/docs/content/locales/hi-IN/local-file-mode.mdx +33 -492
  13. package/corpus/core/docs/content/locales/hi-IN/template-content.mdx +10 -24
  14. package/corpus/core/docs/content/locales/ja-JP/local-file-mode.mdx +36 -492
  15. package/corpus/core/docs/content/locales/ja-JP/template-content.mdx +10 -24
  16. package/corpus/core/docs/content/locales/ko-KR/local-file-mode.mdx +35 -490
  17. package/corpus/core/docs/content/locales/ko-KR/template-content.mdx +10 -24
  18. package/corpus/core/docs/content/locales/pt-BR/local-file-mode.mdx +35 -493
  19. package/corpus/core/docs/content/locales/pt-BR/template-content.mdx +10 -24
  20. package/corpus/core/docs/content/locales/zh-CN/local-file-mode.mdx +31 -489
  21. package/corpus/core/docs/content/locales/zh-CN/template-content.mdx +9 -24
  22. package/corpus/core/docs/content/locales/zh-TW/local-file-mode.mdx +31 -489
  23. package/corpus/core/docs/content/locales/zh-TW/template-content.mdx +9 -24
  24. package/corpus/core/docs/content/template-content.mdx +26 -42
  25. package/corpus/core/package.json +1 -1
  26. package/corpus/core/src/cli/content-local.ts +86 -18
  27. package/corpus/core/src/cli/index.ts +2 -2
  28. package/corpus/core/src/cli/skills-content/content-skill.ts +36 -25
  29. package/corpus/core/src/cli/skills.ts +47 -13
  30. package/corpus/core/src/client/AgentPanel.tsx +7 -0
  31. package/corpus/core/src/client/AssistantChat.tsx +7 -0
  32. package/corpus/core/src/client/agent-chat-adapter.ts +7 -1
  33. package/corpus/core/src/client/chat/message-components.tsx +17 -3
  34. package/corpus/core/src/client/composer/ComposerPlusMenu.tsx +96 -6
  35. package/corpus/core/src/client/composer/asset-picker-url.ts +80 -0
  36. package/corpus/core/src/client/error-format.ts +24 -0
  37. package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +8 -1
  38. package/corpus/core/src/local-artifacts/index.ts +65 -0
  39. package/corpus/templates/assets/app/components/library/GenerationPresetsPanel.tsx +325 -0
  40. package/corpus/templates/assets/app/hooks/use-navigation-state.ts +12 -0
  41. package/corpus/templates/assets/app/i18n/zh-TW.ts +21 -0
  42. package/corpus/templates/assets/app/i18n-data.ts +215 -0
  43. package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +19 -479
  44. package/corpus/templates/assets/app/routes/brand-kits.$id_.presets.$presetId.tsx +1 -1
  45. package/corpus/templates/assets/app/routes/brand-kits.$id_.settings.tsx +446 -0
  46. package/corpus/templates/assets/app/routes/library.tsx +69 -0
  47. package/corpus/templates/assets/changelog/2026-07-15-fixed-top-level-image-picker-selections-returning-to-the-com.md +6 -0
  48. package/corpus/templates/clips/actions/disconnect-calendar.ts +57 -9
  49. package/corpus/templates/clips/actions/generate-workflow.ts +102 -59
  50. package/corpus/templates/clips/actions/get-recording-player-data.ts +64 -1
  51. package/corpus/templates/clips/actions/regenerate-summary.ts +7 -0
  52. package/corpus/templates/clips/actions/regenerate-title.ts +29 -11
  53. package/corpus/templates/clips/app/components/editor/editor-layout.tsx +34 -13
  54. package/corpus/templates/clips/app/components/editor/thumbnail-picker.tsx +87 -9
  55. package/corpus/templates/clips/app/components/editor/trim-handles.tsx +15 -0
  56. package/corpus/templates/clips/app/components/editor/waveform.tsx +21 -8
  57. package/corpus/templates/clips/app/components/library/folder-tree.tsx +52 -0
  58. package/corpus/templates/clips/app/components/player/settings-panel.tsx +116 -58
  59. package/corpus/templates/clips/app/components/player/share-dialog.tsx +43 -37
  60. package/corpus/templates/clips/app/components/player/video-player.tsx +50 -2
  61. package/corpus/templates/clips/app/components/recorder/microphone-visualizer.tsx +22 -3
  62. package/corpus/templates/clips/app/i18n/ar-SA.ts +5 -2
  63. package/corpus/templates/clips/app/i18n/de-DE.ts +6 -2
  64. package/corpus/templates/clips/app/i18n/en-US.ts +5 -2
  65. package/corpus/templates/clips/app/i18n/es-ES.ts +6 -2
  66. package/corpus/templates/clips/app/i18n/fr-FR.ts +5 -2
  67. package/corpus/templates/clips/app/i18n/hi-IN.ts +5 -2
  68. package/corpus/templates/clips/app/i18n/ja-JP.ts +6 -1
  69. package/corpus/templates/clips/app/i18n/ko-KR.ts +5 -2
  70. package/corpus/templates/clips/app/i18n/pt-BR.ts +6 -2
  71. package/corpus/templates/clips/app/i18n/zh-CN.ts +5 -2
  72. package/corpus/templates/clips/app/i18n/zh-TW.ts +5 -2
  73. package/corpus/templates/clips/app/lib/timestamp-mapping.ts +14 -0
  74. package/corpus/templates/clips/app/routes/_app.library._index.tsx +1 -2
  75. package/corpus/templates/clips/app/routes/_index.tsx +1 -2
  76. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +98 -32
  77. package/corpus/templates/clips/app/routes/share.$shareId.tsx +4 -1
  78. package/corpus/templates/clips/changelog/2026-07-15-ai-workflow-generation-now-stays-visible-avoids-duplicate-re.md +6 -0
  79. package/corpus/templates/clips/changelog/2026-07-15-clip-playback-and-cta-controls-remain-interactive-through-ed.md +6 -0
  80. package/corpus/templates/clips/changelog/2026-07-15-clip-titles-no-longer-describe-the-product-as-a-loom-alterna.md +6 -0
  81. package/corpus/templates/clips/changelog/2026-07-15-description-regeneration-now-opens-the-agent-chat-so-progres.md +6 -0
  82. package/corpus/templates/clips/changelog/2026-07-15-direct-recording-urls-now-respect-share-link-and-password-ac.md +6 -0
  83. package/corpus/templates/clips/changelog/2026-07-15-disconnecting-a-calendar-now-clears-unrecorded-synced-meetin.md +6 -0
  84. package/corpus/templates/clips/changelog/2026-07-15-folders-now-expose-rename-and-delete-actions-directly-in-the.md +6 -0
  85. package/corpus/templates/clips/changelog/2026-07-15-recording-pages-now-explain-sign-in-access-and-avoid-showing.md +6 -0
  86. package/corpus/templates/clips/changelog/2026-07-15-the-clips-extension-quick-actions-toolbar-can-be-moved-out-o.md +6 -0
  87. package/corpus/templates/clips/changelog/2026-07-15-the-editor-now-skips-cut-sections-during-preview-and-keeps-t.md +6 -0
  88. package/corpus/templates/clips/changelog/2026-07-15-thumbnail-capture-now-updates-previews-while-scrubbing-and-l.md +6 -0
  89. package/corpus/templates/clips/changelog/2026-07-15-windows-permission-links-open-the-matching-settings-page.md +6 -0
  90. package/corpus/templates/clips/chrome-extension/src/content-script.ts +117 -2
  91. package/corpus/templates/clips/chrome-extension/src/overlay.ts +27 -0
  92. package/corpus/templates/clips/desktop/src-tauri/tauri.conf.json +1 -1
  93. package/corpus/templates/clips/server/lib/calendar-event-meetings.ts +139 -101
  94. package/corpus/templates/clips/server/lib/recording-page-access.ts +35 -0
  95. package/corpus/templates/clips/server/lib/share-password.ts +6 -3
  96. package/corpus/templates/content/.agents/skills/content/SKILL.md +26 -39
  97. package/corpus/templates/content/AGENTS.md +25 -30
  98. package/corpus/templates/content/actions/_builder-docs-client.ts +23 -0
  99. package/corpus/templates/content/actions/_content-database-source-adapters.ts +21 -3
  100. package/corpus/templates/content/actions/_content-files.ts +338 -0
  101. package/corpus/templates/content/actions/_content-space-access.ts +135 -0
  102. package/corpus/templates/content/actions/_content-spaces.ts +640 -0
  103. package/corpus/templates/content/actions/_database-source-utils.ts +90 -7
  104. package/corpus/templates/content/actions/_database-utils.ts +7 -1
  105. package/corpus/templates/content/actions/_local-file-documents.ts +0 -9
  106. package/corpus/templates/content/actions/_local-folder-source.ts +53 -0
  107. package/corpus/templates/content/actions/_property-utils.ts +9 -4
  108. package/corpus/templates/content/actions/add-database-item.ts +108 -65
  109. package/corpus/templates/content/actions/backfill-content-files.ts +22 -0
  110. package/corpus/templates/content/actions/connect-local-folder-source.ts +221 -0
  111. package/corpus/templates/content/actions/create-content-database.ts +129 -3
  112. package/corpus/templates/content/actions/create-document.ts +65 -55
  113. package/corpus/templates/content/actions/create-inline-content-database.ts +6 -1
  114. package/corpus/templates/content/actions/delete-content-database.ts +3 -0
  115. package/corpus/templates/content/actions/delete-document.ts +7 -11
  116. package/corpus/templates/content/actions/disconnect-local-folder-source.ts +175 -0
  117. package/corpus/templates/content/actions/duplicate-database-item.ts +10 -0
  118. package/corpus/templates/content/actions/duplicate-database-items.ts +13 -0
  119. package/corpus/templates/content/actions/edit-document.ts +2 -28
  120. package/corpus/templates/content/actions/ensure-content-spaces.ts +26 -0
  121. package/corpus/templates/content/actions/export-content-source.ts +47 -9
  122. package/corpus/templates/content/actions/get-document.ts +0 -14
  123. package/corpus/templates/content/actions/import-content-source.ts +43 -3
  124. package/corpus/templates/content/actions/list-content-spaces.ts +103 -0
  125. package/corpus/templates/content/actions/list-documents.ts +12 -9
  126. package/corpus/templates/content/actions/move-document.ts +3 -14
  127. package/corpus/templates/content/actions/pull-document.ts +0 -23
  128. package/corpus/templates/content/actions/remove-local-file-source.ts +50 -29
  129. package/corpus/templates/content/actions/resolve-local-folder-conflict.ts +442 -0
  130. package/corpus/templates/content/actions/reveal-local-source-file.ts +6 -17
  131. package/corpus/templates/content/actions/search-documents.ts +0 -34
  132. package/corpus/templates/content/actions/share-local-file-document.ts +25 -1
  133. package/corpus/templates/content/actions/submit-content-database-form.ts +12 -0
  134. package/corpus/templates/content/actions/sync-local-folder-source.ts +731 -0
  135. package/corpus/templates/content/actions/sync-manifest-local-folder-source.ts +123 -0
  136. package/corpus/templates/content/actions/update-content-database-view.ts +10 -1
  137. package/corpus/templates/content/actions/update-document.ts +0 -15
  138. package/corpus/templates/content/actions/view-screen.ts +2 -50
  139. package/corpus/templates/content/app/components/editor/SlashCommandMenu.tsx +76 -62
  140. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +70 -22
  141. package/corpus/templates/content/app/components/editor/database/grouping.ts +2 -1
  142. package/corpus/templates/content/app/components/editor/database/settings.tsx +23 -20
  143. package/corpus/templates/content/app/components/editor/database/shared.tsx +2 -0
  144. package/corpus/templates/content/app/components/editor/database/sidebar.tsx +330 -0
  145. package/corpus/templates/content/app/components/editor/database/types.ts +1 -0
  146. package/corpus/templates/content/app/components/editor/database/view-config.ts +3 -1
  147. package/corpus/templates/content/app/components/layout/Layout.tsx +25 -1
  148. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +209 -113
  149. package/corpus/templates/content/app/components/sidebar/select-content-space.ts +31 -0
  150. package/corpus/templates/content/app/hooks/use-content-database.ts +16 -0
  151. package/corpus/templates/content/app/hooks/use-content-spaces.ts +39 -0
  152. package/corpus/templates/content/app/i18n/zh-TW.ts +11 -0
  153. package/corpus/templates/content/app/i18n-data.ts +75 -0
  154. package/corpus/templates/content/app/routes/_app.local-files.tsx +174 -65
  155. package/corpus/templates/content/changelog/2026-07-16-content-callouts-can-now-be-reviewed-and-published-to-builder.md +6 -0
  156. package/corpus/templates/content/changelog/2026-07-16-heading-5-and-heading-6-are-available-from-the-editor-slash-.md +6 -0
  157. package/corpus/templates/content/changelog/2026-07-16-organize-every-workspace-through-a-customizable-files-databa.md +6 -0
  158. package/corpus/templates/content/parity/matrix.md +2 -1
  159. package/corpus/templates/content/parity/matrix.ts +37 -1
  160. package/corpus/templates/content/scripts/dev-database.mjs +7 -5
  161. package/corpus/templates/content/server/db/schema.ts +113 -40
  162. package/corpus/templates/content/server/lib/document-context.ts +15 -1
  163. package/corpus/templates/content/server/lib/notion-sync.ts +6 -0
  164. package/corpus/templates/content/server/plugins/db.ts +153 -0
  165. package/corpus/templates/content/shared/api.ts +17 -3
  166. package/corpus/templates/content/shared/builder-mdx.ts +163 -16
  167. package/corpus/templates/design/.agents/skills/design-templates/SKILL.md +59 -0
  168. package/corpus/templates/design/AGENTS.md +6 -1
  169. package/corpus/templates/design/actions/create-design-from-template.ts +19 -7
  170. package/corpus/templates/design/actions/list-design-templates.ts +69 -21
  171. package/corpus/templates/design/actions/navigate.ts +2 -2
  172. package/corpus/templates/design/actions/view-screen.ts +15 -2
  173. package/corpus/templates/design/agent-native.app-skill.json +5 -0
  174. package/corpus/templates/design/app/components/design/design-canvas/external-preview.ts +7 -3
  175. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +281 -56
  176. package/corpus/templates/design/app/components/templates/TemplatePreview.tsx +14 -2
  177. package/corpus/templates/design/app/hooks/use-navigation-state.ts +3 -2
  178. package/corpus/templates/design/app/i18n/zh-TW.ts +3 -3
  179. package/corpus/templates/design/app/i18n-data.ts +21 -2
  180. package/corpus/templates/design/app/i18n-template-feature.ts +218 -10
  181. package/corpus/templates/design/app/pages/Index.tsx +195 -24
  182. package/corpus/templates/design/app/pages/Templates.tsx +144 -55
  183. package/corpus/templates/design/app/pages/design-editor/generation-prompt-directives.ts +12 -1
  184. package/corpus/templates/design/changelog/2026-07-14-templates-now-appear-in-the-new-design-picker-with-previews-.md +6 -0
  185. package/corpus/templates/design/changelog/2026-07-15-prototype-print-and-download-buttons-now-work-in-preview.md +6 -0
  186. package/corpus/templates/design/changelog/2026-07-15-templates-now-open-immediately-after-copying-even-while-the-.md +6 -0
  187. package/corpus/templates/design/server/plugins/agent-chat.ts +1 -1
  188. package/corpus/templates/mail/AGENTS.md +23 -18
  189. package/corpus/templates/mail/actions/bulk-archive.ts +32 -28
  190. package/corpus/templates/mail/actions/mark-read.ts +131 -20
  191. package/corpus/templates/mail/actions/mark-thread-read.ts +1 -1
  192. package/corpus/templates/mail/actions/move-email.ts +30 -24
  193. package/corpus/templates/mail/actions/send-email.ts +73 -68
  194. package/corpus/templates/mail/changelog/2026-07-15-unread-inbox-cleanup-now-completes-reliably.md +6 -0
  195. package/corpus/templates/mail/server/handlers/emails.ts +218 -209
  196. package/corpus/templates/mail/server/lib/bulk-mark-read.ts +30 -0
  197. package/corpus/templates/mail/server/lib/email-state.ts +198 -113
  198. package/corpus/templates/mail/server/lib/google-auth.ts +218 -25
  199. package/corpus/templates/mail/server/lib/jobs.ts +69 -74
  200. package/corpus/templates/mail/server/lib/local-email-store.ts +265 -0
  201. package/corpus/templates/mail/server/plugins/agent-chat.ts +6 -0
  202. package/corpus/templates/slides/actions/extract-pdf.ts +1 -1
  203. package/corpus/templates/slides/actions/import-file.ts +4 -1
  204. package/corpus/templates/slides/app/components/editor/ImageGenPanel.tsx +1 -1
  205. package/corpus/templates/slides/app/components/editor/ImageSearchPanel.tsx +9 -12
  206. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +29 -21
  207. package/corpus/templates/slides/app/i18n/ar-SA.ts +1 -0
  208. package/corpus/templates/slides/app/i18n/de-DE.ts +1 -0
  209. package/corpus/templates/slides/app/i18n/en-US.ts +1 -0
  210. package/corpus/templates/slides/app/i18n/es-ES.ts +1 -0
  211. package/corpus/templates/slides/app/i18n/fr-FR.ts +1 -0
  212. package/corpus/templates/slides/app/i18n/hi-IN.ts +1 -0
  213. package/corpus/templates/slides/app/i18n/ja-JP.ts +1 -0
  214. package/corpus/templates/slides/app/i18n/ko-KR.ts +1 -0
  215. package/corpus/templates/slides/app/i18n/pt-BR.ts +1 -0
  216. package/corpus/templates/slides/app/i18n/zh-CN.ts +1 -0
  217. package/corpus/templates/slides/app/i18n/zh-TW.ts +1 -0
  218. package/corpus/templates/slides/changelog/2026-07-15-image-search-and-generation-controls-now-use-the-registered-.md +6 -0
  219. package/corpus/templates/slides/changelog/2026-07-15-pdf-deck-references-can-be-imported-for-slide-inspiration-ag.md +6 -0
  220. package/corpus/templates/slides/changelog/2026-07-15-stable-style-inspector-dock.md +6 -0
  221. package/dist/cli/content-local.d.ts +1 -0
  222. package/dist/cli/content-local.d.ts.map +1 -1
  223. package/dist/cli/content-local.js +75 -17
  224. package/dist/cli/content-local.js.map +1 -1
  225. package/dist/cli/index.js +2 -2
  226. package/dist/cli/index.js.map +1 -1
  227. package/dist/cli/skills-content/content-skill.d.ts +1 -1
  228. package/dist/cli/skills-content/content-skill.d.ts.map +1 -1
  229. package/dist/cli/skills-content/content-skill.js +36 -25
  230. package/dist/cli/skills-content/content-skill.js.map +1 -1
  231. package/dist/cli/skills.d.ts.map +1 -1
  232. package/dist/cli/skills.js +47 -14
  233. package/dist/cli/skills.js.map +1 -1
  234. package/dist/client/AgentPanel.d.ts.map +1 -1
  235. package/dist/client/AgentPanel.js +5 -0
  236. package/dist/client/AgentPanel.js.map +1 -1
  237. package/dist/client/AssistantChat.d.ts.map +1 -1
  238. package/dist/client/AssistantChat.js +7 -0
  239. package/dist/client/AssistantChat.js.map +1 -1
  240. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  241. package/dist/client/agent-chat-adapter.js +8 -1
  242. package/dist/client/agent-chat-adapter.js.map +1 -1
  243. package/dist/client/chat/message-components.d.ts +4 -0
  244. package/dist/client/chat/message-components.d.ts.map +1 -1
  245. package/dist/client/chat/message-components.js +10 -3
  246. package/dist/client/chat/message-components.js.map +1 -1
  247. package/dist/client/composer/ComposerPlusMenu.d.ts.map +1 -1
  248. package/dist/client/composer/ComposerPlusMenu.js +58 -6
  249. package/dist/client/composer/ComposerPlusMenu.js.map +1 -1
  250. package/dist/client/composer/asset-picker-url.d.ts +16 -0
  251. package/dist/client/composer/asset-picker-url.d.ts.map +1 -0
  252. package/dist/client/composer/asset-picker-url.js +64 -0
  253. package/dist/client/composer/asset-picker-url.js.map +1 -0
  254. package/dist/client/error-format.d.ts.map +1 -1
  255. package/dist/client/error-format.js +17 -0
  256. package/dist/client/error-format.js.map +1 -1
  257. package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
  258. package/dist/client/resources/McpIntegrationDialog.js +6 -1
  259. package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
  260. package/dist/collab/awareness.d.ts +2 -2
  261. package/dist/collab/awareness.d.ts.map +1 -1
  262. package/dist/collab/struct-routes.d.ts +1 -1
  263. package/dist/local-artifacts/index.d.ts +10 -0
  264. package/dist/local-artifacts/index.d.ts.map +1 -1
  265. package/dist/local-artifacts/index.js +39 -0
  266. package/dist/local-artifacts/index.js.map +1 -1
  267. package/dist/notifications/routes.d.ts +1 -1
  268. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  269. package/dist/resources/handlers.d.ts +3 -3
  270. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  271. package/dist/server/transcribe-voice.d.ts +1 -1
  272. package/docs/content/local-file-mode.mdx +99 -489
  273. package/docs/content/locales/ar-SA/local-file-mode.mdx +35 -490
  274. package/docs/content/locales/ar-SA/template-content.mdx +10 -24
  275. package/docs/content/locales/de-DE/local-file-mode.mdx +37 -491
  276. package/docs/content/locales/de-DE/template-content.mdx +10 -24
  277. package/docs/content/locales/es-ES/local-file-mode.mdx +35 -493
  278. package/docs/content/locales/es-ES/template-content.mdx +10 -24
  279. package/docs/content/locales/fr-FR/local-file-mode.mdx +38 -491
  280. package/docs/content/locales/fr-FR/template-content.mdx +10 -24
  281. package/docs/content/locales/hi-IN/local-file-mode.mdx +33 -492
  282. package/docs/content/locales/hi-IN/template-content.mdx +10 -24
  283. package/docs/content/locales/ja-JP/local-file-mode.mdx +36 -492
  284. package/docs/content/locales/ja-JP/template-content.mdx +10 -24
  285. package/docs/content/locales/ko-KR/local-file-mode.mdx +35 -490
  286. package/docs/content/locales/ko-KR/template-content.mdx +10 -24
  287. package/docs/content/locales/pt-BR/local-file-mode.mdx +35 -493
  288. package/docs/content/locales/pt-BR/template-content.mdx +10 -24
  289. package/docs/content/locales/zh-CN/local-file-mode.mdx +31 -489
  290. package/docs/content/locales/zh-CN/template-content.mdx +9 -24
  291. package/docs/content/locales/zh-TW/local-file-mode.mdx +31 -489
  292. package/docs/content/locales/zh-TW/template-content.mdx +9 -24
  293. package/docs/content/template-content.mdx +26 -42
  294. package/package.json +1 -1
  295. package/corpus/templates/assets/app/components/library/EditLibraryDialog.tsx +0 -126
@@ -1 +1 @@
1
- {"version":3,"file":"ComposerPlusMenu.js","sourceRoot":"","sources":["../../../src/client/composer/ComposerPlusMenu.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useComposerRuntime } from \"@assistant-ui/react\";\nimport {\n IconPlus,\n IconUpload,\n IconBulb,\n IconClock,\n IconBolt,\n IconTool,\n IconPlugConnected,\n IconPhotoPlus,\n IconLoader2,\n IconArrowLeft,\n IconX,\n} from \"@tabler/icons-react\";\nimport React, {\n useState,\n useRef,\n useEffect,\n useMemo,\n useCallback,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { setAgentChatContextItem } from \"../agent-chat.js\";\nimport { agentNativePath } from \"../api-path.js\";\nimport {\n Popover,\n PopoverTrigger,\n PopoverContent,\n} from \"../components/ui/popover.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\nimport { useT } from \"../i18n.js\";\nimport { useOrg } from \"../org/hooks.js\";\nimport { isMcpIntegrationCatalogAvailable } from \"../resources/mcp-integration-catalog.js\";\nimport { McpIntegrationDialog } from \"../resources/McpIntegrationDialog.js\";\nimport {\n useCreateMcpServer,\n type McpServerScope,\n} from \"../resources/use-mcp-servers.js\";\nimport { cn } from \"../utils.js\";\nimport type { ComposerMode } from \"./types.js\";\n\ninterface ComposerPlusMenuProps {\n onSelectMode?: (mode: ComposerMode) => void;\n onAttachmentError?: (message: string) => void;\n /**\n * \"full\" (default): full + menu with Upload File, Create Skill, Schedule Task,\n * Automation, Extension, MCP Server. \"upload-only\": clicking + opens the file\n * picker directly — no popover, no other modes. Use for prompt popovers\n * (create extension, create deck, create dashboard, etc.) where the only thing\n * to attach is a file.\n */\n mode?: \"full\" | \"upload-only\";\n}\n\ntype View = \"menu\" | \"skill-upload\";\n\nconst DEFAULT_ASSETS_PICKER_URL = \"https://assets.agent-native.com/picker\";\nconst EMBED_PROTOCOL = \"agent-native.embed\";\nconst EMBED_VERSION = 1;\n\ninterface EmbedEnvelope<TPayload = unknown> {\n protocol?: string;\n version?: number;\n type?: string;\n name?: string;\n payload?: TPayload;\n}\n\ninterface AssetPickerPayload {\n assetId?: unknown;\n url?: unknown;\n previewUrl?: unknown;\n downloadUrl?: unknown;\n embedUrl?: unknown;\n altText?: unknown;\n title?: unknown;\n prompt?: unknown;\n mediaType?: unknown;\n libraryId?: unknown;\n}\n\nfunction assetPickerUrl() {\n const env = (import.meta.env as Record<string, string | undefined>) ?? {};\n return env.VITE_AGENT_NATIVE_ASSETS_PICKER_URL || DEFAULT_ASSETS_PICKER_URL;\n}\n\nfunction withEmbeddedParams(url: string): string {\n try {\n const parsed = new URL(url, window.location.href);\n parsed.searchParams.set(\"embedded\", \"1\");\n parsed.searchParams.set(\"mediaType\", \"image\");\n return parsed.toString();\n } catch {\n const separator = url.includes(\"?\") ? \"&\" : \"?\";\n return `${url}${separator}embedded=1&mediaType=image`;\n }\n}\n\nfunction assetPickerOrigin(url: string): string | null {\n try {\n return new URL(url, window.location.href).origin;\n } catch {\n return null;\n }\n}\n\nfunction embedEnvelope(\n type: \"message\" | \"ready\",\n options: { name?: string; payload?: unknown } = {},\n): EmbedEnvelope {\n return {\n protocol: EMBED_PROTOCOL,\n version: EMBED_VERSION,\n type,\n ...options,\n };\n}\n\nfunction isEmbedEnvelope(value: unknown): value is EmbedEnvelope {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n const candidate = value as EmbedEnvelope;\n return (\n candidate.protocol === EMBED_PROTOCOL &&\n candidate.version === EMBED_VERSION &&\n typeof candidate.type === \"string\"\n );\n}\n\nfunction assetString(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction assetImageSource(payload: unknown): string | null {\n if (!payload || typeof payload !== \"object\") return null;\n const asset = payload as AssetPickerPayload;\n return (\n assetString(asset.url) ??\n assetString(asset.previewUrl) ??\n assetString(asset.downloadUrl) ??\n assetString(asset.embedUrl)\n );\n}\n\nfunction assetTitle(payload: unknown, url: string): string {\n if (payload && typeof payload === \"object\") {\n const title = assetString((payload as AssetPickerPayload).title);\n if (title) return title;\n const prompt = assetString((payload as AssetPickerPayload).prompt);\n if (prompt) return prompt.slice(0, 80);\n }\n try {\n const name = new URL(url).pathname.split(\"/\").filter(Boolean).pop();\n return name ? decodeURIComponent(name) : \"Generated image\";\n } catch {\n return \"Generated image\";\n }\n}\n\nfunction assetContext(payload: unknown, url: string): string {\n const lines = [`Image URL: ${url}`];\n if (payload && typeof payload === \"object\") {\n const asset = payload as AssetPickerPayload;\n const assetId = assetString(asset.assetId);\n const libraryId = assetString(asset.libraryId);\n const prompt = assetString(asset.prompt);\n const altText = assetString(asset.altText);\n if (assetId) lines.push(`Asset ID: ${assetId}`);\n if (libraryId) lines.push(`Library ID: ${libraryId}`);\n if (prompt) lines.push(`Prompt: ${prompt}`);\n if (altText) lines.push(`Alt text: ${altText}`);\n }\n return lines.join(\"\\n\");\n}\n\nfunction slugifyName(value: string): string {\n return (\n value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\") || \"uploaded-skill\"\n );\n}\n\nfunction formatAttachmentError(error: unknown, fallback: string): string {\n return error instanceof Error ? error.message : fallback;\n}\n\nfunction UploadOnlyAttachButton({\n onAttachmentError,\n}: Pick<ComposerPlusMenuProps, \"onAttachmentError\">) {\n const composerRuntime = useComposerRuntime();\n const inputRef = useRef<HTMLInputElement>(null);\n const handleFilesSelected = async (files: FileList | null) => {\n if (!files || files.length === 0) return;\n try {\n await Promise.all(\n Array.from(files).map((file) => composerRuntime.addAttachment(file)),\n );\n } catch (error) {\n onAttachmentError?.(\n formatAttachmentError(error, \"Could not upload the selected file.\"),\n );\n }\n };\n\n return (\n <>\n <input\n ref={inputRef}\n type=\"file\"\n multiple\n className=\"hidden\"\n onChange={(event) => {\n void handleFilesSelected(event.target.files);\n event.target.value = \"\";\n }}\n />\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"inline-flex shrink-0\">\n <button\n type=\"button\"\n className=\"shrink-0 flex h-7 w-7 cursor-pointer items-center justify-center rounded-md text-muted-foreground hover:text-foreground hover:bg-accent/50\"\n aria-label=\"Upload\"\n onClick={() => inputRef.current?.click()}\n >\n <IconPlus className=\"h-4 w-4\" />\n </button>\n </span>\n </TooltipTrigger>\n <TooltipContent>Upload</TooltipContent>\n </Tooltip>\n </>\n );\n}\n\nexport function ComposerPlusMenu({\n onSelectMode,\n onAttachmentError,\n mode = \"full\",\n}: ComposerPlusMenuProps) {\n if (mode === \"upload-only\") {\n return <UploadOnlyAttachButton onAttachmentError={onAttachmentError} />;\n }\n return (\n <ComposerPlusMenuFull\n onSelectMode={onSelectMode}\n onAttachmentError={onAttachmentError}\n />\n );\n}\n\nfunction ComposerPlusMenuFull({\n onSelectMode,\n onAttachmentError,\n}: Pick<ComposerPlusMenuProps, \"onSelectMode\" | \"onAttachmentError\">) {\n const t = useT();\n const composerRuntime = useComposerRuntime();\n const [open, setOpen] = useState(false);\n const [assetsPickerOpen, setAssetsPickerOpen] = useState(false);\n const [mcpDialogOpen, setMcpDialogOpen] = useState(false);\n const [view, setView] = useState<View>(\"menu\");\n const showMcpIntegrations = useMemo(\n () => isMcpIntegrationCatalogAvailable(),\n [],\n );\n\n const { data: org } = useOrg();\n const canCreateOrgMcp =\n !org?.orgId || org.role === \"owner\" || org.role === \"admin\";\n const hasOrg = !!org?.orgId;\n const defaultMcpScope: McpServerScope =\n hasOrg && canCreateOrgMcp ? \"org\" : \"user\";\n const createMcp = useCreateMcpServer();\n\n const fileUploadRef = useRef<HTMLInputElement>(null);\n const skillFileInputRef = useRef<HTMLInputElement>(null);\n const skillHoverTimerRef = useRef<number | null>(null);\n const [skillUploadSlug, setSkillUploadSlug] = useState(\"\");\n const [skillUploadContent, setSkillUploadContent] = useState(\"\");\n const [skillUploadFileName, setSkillUploadFileName] = useState(\"\");\n const [skillUploadStatus, setSkillUploadStatus] = useState<{\n kind: \"ok\" | \"err\";\n message: string;\n } | null>(null);\n const [skillUploadBusy, setSkillUploadBusy] = useState(false);\n const [skillFlyoutOpen, setSkillFlyoutOpen] = useState(false);\n const [skillFlyoutSide, setSkillFlyoutSide] = useState<\"right\" | \"left\">(\n \"right\",\n );\n const skillFlyoutCloseTimerRef = useRef<number | null>(null);\n const openSkillFlyout = (rowEl?: HTMLElement | null) => {\n if (skillFlyoutCloseTimerRef.current) {\n window.clearTimeout(skillFlyoutCloseTimerRef.current);\n skillFlyoutCloseTimerRef.current = null;\n }\n if (rowEl && typeof window !== \"undefined\") {\n const rect = rowEl.getBoundingClientRect();\n const FLYOUT_WIDTH = 248;\n setSkillFlyoutSide(\n window.innerWidth - rect.right < FLYOUT_WIDTH ? \"left\" : \"right\",\n );\n }\n setSkillFlyoutOpen(true);\n };\n const scheduleSkillFlyoutClose = () => {\n if (skillFlyoutCloseTimerRef.current)\n window.clearTimeout(skillFlyoutCloseTimerRef.current);\n skillFlyoutCloseTimerRef.current = window.setTimeout(() => {\n setSkillFlyoutOpen(false);\n }, 160);\n };\n\n useEffect(() => {\n if (open) {\n setView(\"menu\");\n setSkillUploadSlug(\"\");\n setSkillUploadContent(\"\");\n setSkillUploadFileName(\"\");\n setSkillUploadStatus(null);\n setSkillUploadBusy(false);\n setSkillFlyoutOpen(false);\n }\n }, [open]);\n\n const handleSkillFileSelected = async (files: FileList | null) => {\n if (!files || files.length === 0) return;\n const file = files[0];\n const text = await file.text();\n const baseName = file.name.replace(/\\.[^./]+$/, \"\");\n const slug = slugifyName(\n baseName.toLowerCase() === \"skill\" ? \"uploaded-skill\" : baseName,\n );\n setSkillUploadSlug(slug);\n setSkillUploadContent(text);\n setSkillUploadFileName(file.name);\n setSkillUploadStatus(null);\n setView(\"skill-upload\");\n };\n\n const handleFilesSelected = async (files: FileList | null) => {\n if (!files || files.length === 0) return;\n try {\n await Promise.all(\n Array.from(files).map((file) => composerRuntime.addAttachment(file)),\n );\n } catch (error) {\n onAttachmentError?.(\n formatAttachmentError(error, \"Could not upload the selected file.\"),\n );\n }\n };\n\n const submitSkillUpload = async () => {\n if (skillUploadBusy) return;\n const slug = slugifyName(skillUploadSlug || \"uploaded-skill\");\n const path = `skills/${slug}/SKILL.md`;\n setSkillUploadBusy(true);\n setSkillUploadStatus(null);\n try {\n const res = await fetch(agentNativePath(\"/_agent-native/resources\"), {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n path,\n content: skillUploadContent,\n mimeType: \"text/markdown\",\n shared: false,\n }),\n });\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n throw new Error(body || `Upload failed (${res.status})`);\n }\n setSkillUploadStatus({\n kind: \"ok\",\n message: `Skill \"${skillUploadFileName || `${slug}/SKILL.md`}\" added`,\n });\n window.setTimeout(() => setOpen(false), 1200);\n } catch (err: any) {\n setSkillUploadStatus({\n kind: \"err\",\n message: err?.message || \"Failed to save skill file\",\n });\n } finally {\n setSkillUploadBusy(false);\n }\n };\n\n const menuItems: {\n icon: React.ReactNode;\n label: string;\n desc: string;\n action: () => void;\n hoverAction?: () => void;\n }[] = [\n {\n icon: <IconUpload className=\"h-3.5 w-3.5\" />,\n label: \"Upload File\",\n desc: \"Images, PDFs, text/code, JSON, CSV\",\n action: () => {\n setOpen(false);\n setTimeout(() => fileUploadRef.current?.click(), 0);\n },\n },\n {\n icon: <IconPhotoPlus className=\"h-3.5 w-3.5\" />,\n label: \"Generate Image\",\n desc: \"Open the Assets image picker\",\n action: () => {\n setOpen(false);\n setAssetsPickerOpen(true);\n },\n },\n {\n icon: <IconClock className=\"h-3.5 w-3.5\" />,\n label: \"Schedule Task\",\n desc: \"Run something on a schedule\",\n action: () => {\n onSelectMode?.(\"job\");\n setOpen(false);\n },\n },\n {\n icon: <IconBolt className=\"h-3.5 w-3.5\" />,\n label: \"Create Automation\",\n desc: \"Set up a when-X-do-Y rule\",\n action: () => {\n onSelectMode?.(\"automation\");\n setOpen(false);\n },\n },\n {\n icon: <IconTool className=\"h-3.5 w-3.5\" />,\n label: \"Create Extension\",\n desc: \"Build a mini app extension\",\n action: () => {\n onSelectMode?.(\"extension\");\n setOpen(false);\n },\n },\n ...(showMcpIntegrations\n ? [\n {\n icon: <IconPlugConnected className=\"h-3.5 w-3.5\" />,\n label: t(\"mcpIntegrations.menuLabel\"),\n desc: t(\"mcpIntegrations.menuDescription\"),\n action: () => {\n setOpen(false);\n setMcpDialogOpen(true);\n },\n },\n ]\n : []),\n {\n icon: <IconBulb className=\"h-3.5 w-3.5\" />,\n label: \"Create Skill\",\n desc: \"Teach the agent a new ability\",\n action: openSkillFlyout,\n hoverAction: openSkillFlyout,\n },\n ];\n\n return (\n <>\n {/* Hidden input to trigger the native file upload with explicit errors. */}\n <input\n ref={fileUploadRef}\n type=\"file\"\n multiple\n className=\"hidden\"\n onChange={(event) => {\n void handleFilesSelected(event.target.files);\n event.target.value = \"\";\n }}\n />\n <input\n ref={skillFileInputRef}\n type=\"file\"\n accept=\".md,text/markdown\"\n className=\"hidden\"\n onChange={(e) => {\n void handleSkillFileSelected(e.target.files);\n e.target.value = \"\";\n }}\n />\n\n <Popover open={open} onOpenChange={setOpen}>\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"shrink-0 flex h-7 w-7 items-center justify-center rounded-md text-muted-foreground hover:text-foreground hover:bg-accent/50 disabled:opacity-30 disabled:cursor-not-allowed\"\n >\n <IconPlus className=\"h-4 w-4\" />\n </button>\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent>Add...</TooltipContent>\n </Tooltip>\n <PopoverContent\n side=\"top\"\n align=\"start\"\n sideOffset={8}\n className={cn(\n \"p-0 rounded-lg\",\n view === \"skill-upload\"\n ? \"max-h-[70vh] w-[calc(100vw-24px)] max-w-[380px] overflow-y-auto\"\n : \"w-[260px]\",\n )}\n style={{ fontSize: 13, lineHeight: \"normal\" }}\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n {view === \"menu\" && (\n <div className=\"py-1\">\n {menuItems.map((item) => {\n const isSkill = item.label === \"Create Skill\";\n return (\n <div\n key={item.label}\n className={cn(\"relative\", isSkill && \"group/skill\")}\n onMouseEnter={(e) => {\n if (isSkill) {\n openSkillFlyout(e.currentTarget);\n return;\n }\n if (!item.hoverAction) return;\n if (skillHoverTimerRef.current)\n window.clearTimeout(skillHoverTimerRef.current);\n skillHoverTimerRef.current = window.setTimeout(() => {\n item.hoverAction?.();\n }, 180);\n }}\n onMouseLeave={() => {\n if (isSkill) {\n scheduleSkillFlyoutClose();\n return;\n }\n if (skillHoverTimerRef.current) {\n window.clearTimeout(skillHoverTimerRef.current);\n skillHoverTimerRef.current = null;\n }\n }}\n >\n <button\n type=\"button\"\n onClick={item.action}\n className={cn(\n \"flex w-full items-center gap-2.5 px-3 py-2 text-start hover:bg-accent/50\",\n isSkill && skillFlyoutOpen && \"bg-accent/50\",\n )}\n >\n <span className=\"text-muted-foreground\">{item.icon}</span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-[12px] font-medium text-foreground\">\n {item.label}\n </div>\n <div className=\"mt-0.5 text-[10px] text-muted-foreground/60\">\n {item.desc}\n </div>\n </div>\n {isSkill && (\n <span className=\"ms-auto text-muted-foreground/60\">\n ›\n </span>\n )}\n </button>\n {isSkill && skillFlyoutOpen && (\n <div\n role=\"menu\"\n onMouseEnter={() => openSkillFlyout()}\n onMouseLeave={scheduleSkillFlyoutClose}\n className={cn(\n \"absolute top-0 z-20 w-[240px] rounded-lg border border-border bg-popover py-1 shadow-md\",\n skillFlyoutSide === \"right\"\n ? \"left-full ml-1\"\n : \"right-full mr-1\",\n )}\n >\n <button\n type=\"button\"\n onClick={() => {\n onSelectMode?.(\"skill\");\n setSkillFlyoutOpen(false);\n setOpen(false);\n }}\n className=\"flex w-full items-center gap-2.5 px-3 py-2 text-start hover:bg-accent/50\"\n >\n <span className=\"text-muted-foreground\">\n <IconBulb className=\"h-3.5 w-3.5\" />\n </span>\n <div className=\"min-w-0\">\n <div className=\"text-[12px] font-medium text-foreground\">\n Create new skill\n </div>\n <div className=\"mt-0.5 text-[10px] text-muted-foreground/60\">\n Describe a skill and let the agent draft it\n </div>\n </div>\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setSkillFlyoutOpen(false);\n skillFileInputRef.current?.click();\n }}\n className=\"flex w-full items-center gap-2.5 px-3 py-2 text-start hover:bg-accent/50\"\n >\n <span className=\"text-muted-foreground\">\n <IconUpload className=\"h-3.5 w-3.5\" />\n </span>\n <div className=\"min-w-0\">\n <div className=\"text-[12px] font-medium text-foreground\">\n Upload skill file\n </div>\n <div className=\"mt-0.5 text-[10px] text-muted-foreground/60\">\n Import an existing SKILL.md file\n </div>\n </div>\n </button>\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n\n {view === \"skill-upload\" && (\n <div className=\"p-3\">\n <button\n type=\"button\"\n onClick={() => setView(\"menu\")}\n className=\"mb-1.5 flex items-center gap-1 text-[11px] text-muted-foreground hover:text-foreground\"\n >\n <IconArrowLeft className=\"h-3 w-3 rtl:-scale-x-100\" />\n Back\n </button>\n <label className=\"mb-1 block text-[11px] font-semibold text-foreground\">\n Upload skill file\n </label>\n <p className=\"mb-2 text-[10px] leading-relaxed text-muted-foreground/60\">\n Review the content from{\" \"}\n <span className=\"font-mono\">\n {skillUploadFileName || \"the selected file\"}\n </span>{\" \"}\n before saving.\n </p>\n <label className=\"mb-1 block text-[10px] font-medium text-muted-foreground\">\n Skill name\n </label>\n <input\n value={skillUploadSlug}\n onChange={(e) => setSkillUploadSlug(e.target.value)}\n className=\"mb-2 w-full rounded-md border border-border bg-background px-2.5 py-1.5 text-[12px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-accent\"\n placeholder=\"my-skill\"\n />\n <p className=\"mb-2 text-[10px] text-muted-foreground/60\">\n Saved at{\" \"}\n <span className=\"font-mono\">\n skills/{slugifyName(skillUploadSlug || \"uploaded-skill\")}\n /SKILL.md\n </span>\n </p>\n <label className=\"mb-1 block text-[10px] font-medium text-muted-foreground\">\n Content\n </label>\n <textarea\n value={skillUploadContent}\n onChange={(e) => setSkillUploadContent(e.target.value)}\n rows={10}\n className=\"w-full rounded-md border border-border bg-background px-2.5 py-1.5 font-mono text-[11px] leading-relaxed text-foreground outline-none focus:ring-1 focus:ring-accent\"\n />\n {skillUploadStatus && (\n <div\n className={cn(\n \"mt-2 text-[11px] leading-snug\",\n skillUploadStatus.kind === \"ok\"\n ? \"text-green-600 dark:text-green-400\"\n : \"text-red-600 dark:text-red-400\",\n )}\n >\n {skillUploadStatus.message}\n </div>\n )}\n <div className=\"mt-2.5 flex justify-end gap-2\">\n <button\n type=\"button\"\n onClick={() => setView(\"menu\")}\n className=\"rounded-md px-3 py-1.5 text-[12px] font-medium text-muted-foreground hover:bg-accent/40\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={submitSkillUpload}\n disabled={\n skillUploadBusy ||\n !skillUploadContent.trim() ||\n !skillUploadSlug.trim()\n }\n className=\"rounded-md bg-accent px-3 py-1.5 text-[12px] font-medium text-foreground hover:bg-accent/80 disabled:opacity-40 disabled:pointer-events-none\"\n >\n {skillUploadBusy ? (\n <IconLoader2 className=\"h-3 w-3 animate-spin\" />\n ) : (\n \"Save\"\n )}\n </button>\n </div>\n </div>\n )}\n </PopoverContent>\n </Popover>\n <McpIntegrationDialog\n open={mcpDialogOpen}\n onOpenChange={setMcpDialogOpen}\n defaultScope={defaultMcpScope}\n canCreateOrgMcp={canCreateOrgMcp}\n hasOrg={hasOrg}\n onCreateMcpServer={(args) => createMcp.mutateAsync(args)}\n />\n <AssetsPickerModal\n open={assetsPickerOpen}\n onOpenChange={setAssetsPickerOpen}\n />\n </>\n );\n}\n\nfunction AssetsPickerModal({\n open,\n onOpenChange,\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}) {\n const iframeRef = useRef<HTMLIFrameElement | null>(null);\n const [pickerReady, setPickerReady] = useState(false);\n const sourceUrl = useMemo(() => assetPickerUrl(), []);\n const iframeUrl = useMemo(() => withEmbeddedParams(sourceUrl), [sourceUrl]);\n const targetOrigin = useMemo(() => assetPickerOrigin(iframeUrl), [iframeUrl]);\n const configurePicker = useCallback(() => {\n if (!targetOrigin) return;\n iframeRef.current?.contentWindow?.postMessage(\n embedEnvelope(\"message\", {\n name: \"configure\",\n payload: { mediaType: \"image\", count: 3 },\n }),\n targetOrigin,\n );\n }, [targetOrigin]);\n\n useEffect(() => {\n if (open) setPickerReady(false);\n }, [iframeUrl, open]);\n\n useEffect(() => {\n if (!open || !targetOrigin) return;\n\n const handleMessage = (event: MessageEvent) => {\n if (event.source !== iframeRef.current?.contentWindow) return;\n if (event.origin !== targetOrigin) return;\n if (!isEmbedEnvelope(event.data)) return;\n\n if (event.data.type === \"ready\") {\n setPickerReady(true);\n configurePicker();\n return;\n }\n\n if (event.data.type !== \"message\") return;\n if (event.data.name === \"close\") {\n onOpenChange(false);\n return;\n }\n if (\n event.data.name !== \"chooseImage\" &&\n event.data.name !== \"chooseAsset\"\n )\n return;\n\n const url = assetImageSource(event.data.payload);\n if (!url) return;\n const title = assetTitle(event.data.payload, url);\n const assetId =\n event.data.payload && typeof event.data.payload === \"object\"\n ? assetString((event.data.payload as AssetPickerPayload).assetId)\n : null;\n setAgentChatContextItem({\n key: `asset-image:${assetId ?? url}`,\n title: `Image: ${title}`,\n context: assetContext(event.data.payload, url),\n });\n onOpenChange(false);\n };\n\n const handleKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") onOpenChange(false);\n };\n\n window.addEventListener(\"message\", handleMessage);\n window.addEventListener(\"keydown\", handleKey);\n return () => {\n window.removeEventListener(\"message\", handleMessage);\n window.removeEventListener(\"keydown\", handleKey);\n };\n }, [configurePicker, onOpenChange, open, targetOrigin]);\n\n if (!open || typeof document === \"undefined\") return null;\n\n return createPortal(\n <div\n className=\"fixed inset-0 z-[280] flex items-center justify-center bg-black/50 p-3\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"composer-assets-picker-title\"\n onMouseDown={(event) => {\n if (event.target === event.currentTarget) onOpenChange(false);\n }}\n >\n <div className=\"flex h-[min(86vh,760px)] w-[min(96vw,1040px)] flex-col overflow-hidden rounded-xl border border-border bg-background shadow-2xl\">\n <div className=\"flex h-12 shrink-0 items-center justify-between border-b border-border px-4\">\n <div\n id=\"composer-assets-picker-title\"\n className=\"text-sm font-medium text-foreground\"\n >\n Generate image\n </div>\n <button\n type=\"button\"\n onClick={() => onOpenChange(false)}\n className=\"flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground\"\n aria-label=\"Close image picker\"\n >\n <IconX className=\"h-4 w-4\" />\n </button>\n </div>\n {targetOrigin ? (\n <div className=\"relative min-h-0 flex-1 overflow-hidden bg-background\">\n {!pickerReady && <AssetsPickerLoadingSkeleton />}\n <iframe\n ref={iframeRef}\n src={iframeUrl}\n title=\"Assets image picker\"\n className={cn(\n \"absolute inset-0 h-full w-full border-0 bg-background transition-opacity duration-150\",\n pickerReady ? \"opacity-100\" : \"pointer-events-none opacity-0\",\n )}\n sandbox=\"allow-scripts allow-same-origin allow-forms allow-popups allow-downloads\"\n allow=\"clipboard-read; clipboard-write; microphone; fullscreen\"\n referrerPolicy=\"strict-origin-when-cross-origin\"\n onLoad={() => {\n configurePicker();\n setPickerReady(true);\n }}\n />\n </div>\n ) : (\n <div className=\"flex min-h-0 flex-1 items-center justify-center p-8 text-center text-sm text-muted-foreground\">\n The configured image picker URL is not valid.\n </div>\n )}\n </div>\n </div>,\n document.body,\n );\n}\n\nfunction AssetsPickerLoadingSkeleton() {\n return (\n <div\n className=\"absolute inset-0 flex flex-col gap-5 p-5\"\n role=\"status\"\n aria-label=\"Loading Assets picker\"\n >\n <div className=\"flex items-center gap-3\">\n <div className=\"h-9 flex-1 animate-pulse rounded-md bg-muted\" />\n <div className=\"h-9 w-24 animate-pulse rounded-md bg-muted\" />\n </div>\n <div className=\"grid min-h-0 flex-1 grid-cols-2 gap-4 sm:grid-cols-3 lg:grid-cols-4\">\n {Array.from({ length: 8 }).map((_, index) => (\n <div key={index} className=\"flex min-w-0 flex-col gap-2\">\n <div className=\"aspect-square w-full animate-pulse rounded-lg bg-muted\" />\n <div className=\"h-3 w-3/4 animate-pulse rounded bg-muted\" />\n <div className=\"h-3 w-1/2 animate-pulse rounded bg-muted\" />\n </div>\n ))}\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"ComposerPlusMenu.js","sourceRoot":"","sources":["../../../src/client/composer/ComposerPlusMenu.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useComposerRuntime } from \"@assistant-ui/react\";\nimport {\n IconPlus,\n IconUpload,\n IconBulb,\n IconClock,\n IconBolt,\n IconTool,\n IconPlugConnected,\n IconPhotoPlus,\n IconLoader2,\n IconArrowLeft,\n IconX,\n} from \"@tabler/icons-react\";\nimport React, {\n useState,\n useRef,\n useEffect,\n useMemo,\n useCallback,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { setAgentChatContextItem } from \"../agent-chat.js\";\nimport { agentNativePath } from \"../api-path.js\";\nimport {\n Popover,\n PopoverTrigger,\n PopoverContent,\n} from \"../components/ui/popover.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\nimport { useT } from \"../i18n.js\";\nimport { useOrg } from \"../org/hooks.js\";\nimport { isMcpIntegrationCatalogAvailable } from \"../resources/mcp-integration-catalog.js\";\nimport { McpIntegrationDialog } from \"../resources/McpIntegrationDialog.js\";\nimport {\n useCreateMcpServer,\n type McpServerScope,\n} from \"../resources/use-mcp-servers.js\";\nimport { cn } from \"../utils.js\";\nimport {\n createAssetPickerHandoffId,\n isExternalAssetPickerUrl,\n standaloneAssetPickerUrl,\n} from \"./asset-picker-url.js\";\nimport type { ComposerMode } from \"./types.js\";\n\ninterface ComposerPlusMenuProps {\n onSelectMode?: (mode: ComposerMode) => void;\n onAttachmentError?: (message: string) => void;\n /**\n * \"full\" (default): full + menu with Upload File, Create Skill, Schedule Task,\n * Automation, Extension, MCP Server. \"upload-only\": clicking + opens the file\n * picker directly — no popover, no other modes. Use for prompt popovers\n * (create extension, create deck, create dashboard, etc.) where the only thing\n * to attach is a file.\n */\n mode?: \"full\" | \"upload-only\";\n}\n\ntype View = \"menu\" | \"skill-upload\";\n\nconst DEFAULT_ASSETS_PICKER_URL = \"https://assets.agent-native.com/picker\";\nconst EMBED_PROTOCOL = \"agent-native.embed\";\nconst EMBED_VERSION = 1;\n\ninterface EmbedEnvelope<TPayload = unknown> {\n protocol?: string;\n version?: number;\n type?: string;\n name?: string;\n payload?: TPayload;\n}\n\ninterface AssetPickerPayload {\n assetId?: unknown;\n handoffId?: unknown;\n url?: unknown;\n previewUrl?: unknown;\n downloadUrl?: unknown;\n embedUrl?: unknown;\n altText?: unknown;\n title?: unknown;\n prompt?: unknown;\n mediaType?: unknown;\n libraryId?: unknown;\n}\n\nfunction assetPickerUrl() {\n const env = (import.meta.env as Record<string, string | undefined>) ?? {};\n return env.VITE_AGENT_NATIVE_ASSETS_PICKER_URL || DEFAULT_ASSETS_PICKER_URL;\n}\n\nfunction withEmbeddedParams(url: string): string {\n try {\n const parsed = new URL(url, window.location.href);\n parsed.searchParams.set(\"embedded\", \"1\");\n parsed.searchParams.set(\"mediaType\", \"image\");\n return parsed.toString();\n } catch {\n const separator = url.includes(\"?\") ? \"&\" : \"?\";\n return `${url}${separator}embedded=1&mediaType=image`;\n }\n}\n\nfunction assetPickerOrigin(url: string): string | null {\n try {\n return new URL(url, window.location.href).origin;\n } catch {\n return null;\n }\n}\n\nfunction embedEnvelope(\n type: \"message\" | \"ready\",\n options: { name?: string; payload?: unknown } = {},\n): EmbedEnvelope {\n return {\n protocol: EMBED_PROTOCOL,\n version: EMBED_VERSION,\n type,\n ...options,\n };\n}\n\nfunction isEmbedEnvelope(value: unknown): value is EmbedEnvelope {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n const candidate = value as EmbedEnvelope;\n return (\n candidate.protocol === EMBED_PROTOCOL &&\n candidate.version === EMBED_VERSION &&\n typeof candidate.type === \"string\"\n );\n}\n\nfunction assetString(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction assetImageSource(payload: unknown): string | null {\n if (!payload || typeof payload !== \"object\") return null;\n const asset = payload as AssetPickerPayload;\n return (\n assetString(asset.url) ??\n assetString(asset.previewUrl) ??\n assetString(asset.downloadUrl) ??\n assetString(asset.embedUrl)\n );\n}\n\nfunction assetTitle(payload: unknown, url: string): string {\n if (payload && typeof payload === \"object\") {\n const title = assetString((payload as AssetPickerPayload).title);\n if (title) return title;\n const prompt = assetString((payload as AssetPickerPayload).prompt);\n if (prompt) return prompt.slice(0, 80);\n }\n try {\n const name = new URL(url).pathname.split(\"/\").filter(Boolean).pop();\n return name ? decodeURIComponent(name) : \"Generated image\";\n } catch {\n return \"Generated image\";\n }\n}\n\nfunction assetContext(payload: unknown, url: string): string {\n const lines = [`Image URL: ${url}`];\n if (payload && typeof payload === \"object\") {\n const asset = payload as AssetPickerPayload;\n const assetId = assetString(asset.assetId);\n const libraryId = assetString(asset.libraryId);\n const prompt = assetString(asset.prompt);\n const altText = assetString(asset.altText);\n if (assetId) lines.push(`Asset ID: ${assetId}`);\n if (libraryId) lines.push(`Library ID: ${libraryId}`);\n if (prompt) lines.push(`Prompt: ${prompt}`);\n if (altText) lines.push(`Alt text: ${altText}`);\n }\n return lines.join(\"\\n\");\n}\n\nfunction slugifyName(value: string): string {\n return (\n value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\") || \"uploaded-skill\"\n );\n}\n\nfunction formatAttachmentError(error: unknown, fallback: string): string {\n return error instanceof Error ? error.message : fallback;\n}\n\nfunction UploadOnlyAttachButton({\n onAttachmentError,\n}: Pick<ComposerPlusMenuProps, \"onAttachmentError\">) {\n const composerRuntime = useComposerRuntime();\n const inputRef = useRef<HTMLInputElement>(null);\n const handleFilesSelected = async (files: FileList | null) => {\n if (!files || files.length === 0) return;\n try {\n await Promise.all(\n Array.from(files).map((file) => composerRuntime.addAttachment(file)),\n );\n } catch (error) {\n onAttachmentError?.(\n formatAttachmentError(error, \"Could not upload the selected file.\"),\n );\n }\n };\n\n return (\n <>\n <input\n ref={inputRef}\n type=\"file\"\n multiple\n className=\"hidden\"\n onChange={(event) => {\n void handleFilesSelected(event.target.files);\n event.target.value = \"\";\n }}\n />\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"inline-flex shrink-0\">\n <button\n type=\"button\"\n className=\"shrink-0 flex h-7 w-7 cursor-pointer items-center justify-center rounded-md text-muted-foreground hover:text-foreground hover:bg-accent/50\"\n aria-label=\"Upload\"\n onClick={() => inputRef.current?.click()}\n >\n <IconPlus className=\"h-4 w-4\" />\n </button>\n </span>\n </TooltipTrigger>\n <TooltipContent>Upload</TooltipContent>\n </Tooltip>\n </>\n );\n}\n\nexport function ComposerPlusMenu({\n onSelectMode,\n onAttachmentError,\n mode = \"full\",\n}: ComposerPlusMenuProps) {\n if (mode === \"upload-only\") {\n return <UploadOnlyAttachButton onAttachmentError={onAttachmentError} />;\n }\n return (\n <ComposerPlusMenuFull\n onSelectMode={onSelectMode}\n onAttachmentError={onAttachmentError}\n />\n );\n}\n\nfunction ComposerPlusMenuFull({\n onSelectMode,\n onAttachmentError,\n}: Pick<ComposerPlusMenuProps, \"onSelectMode\" | \"onAttachmentError\">) {\n const t = useT();\n const composerRuntime = useComposerRuntime();\n const [open, setOpen] = useState(false);\n const [assetsPickerOpen, setAssetsPickerOpen] = useState(false);\n const [mcpDialogOpen, setMcpDialogOpen] = useState(false);\n const [view, setView] = useState<View>(\"menu\");\n const showMcpIntegrations = useMemo(\n () => isMcpIntegrationCatalogAvailable(),\n [],\n );\n\n const { data: org } = useOrg();\n const canCreateOrgMcp =\n !org?.orgId || org.role === \"owner\" || org.role === \"admin\";\n const hasOrg = !!org?.orgId;\n const defaultMcpScope: McpServerScope =\n hasOrg && canCreateOrgMcp ? \"org\" : \"user\";\n const createMcp = useCreateMcpServer();\n\n const fileUploadRef = useRef<HTMLInputElement>(null);\n const skillFileInputRef = useRef<HTMLInputElement>(null);\n const skillHoverTimerRef = useRef<number | null>(null);\n const [skillUploadSlug, setSkillUploadSlug] = useState(\"\");\n const [skillUploadContent, setSkillUploadContent] = useState(\"\");\n const [skillUploadFileName, setSkillUploadFileName] = useState(\"\");\n const [skillUploadStatus, setSkillUploadStatus] = useState<{\n kind: \"ok\" | \"err\";\n message: string;\n } | null>(null);\n const [skillUploadBusy, setSkillUploadBusy] = useState(false);\n const [skillFlyoutOpen, setSkillFlyoutOpen] = useState(false);\n const [skillFlyoutSide, setSkillFlyoutSide] = useState<\"right\" | \"left\">(\n \"right\",\n );\n const skillFlyoutCloseTimerRef = useRef<number | null>(null);\n const openSkillFlyout = (rowEl?: HTMLElement | null) => {\n if (skillFlyoutCloseTimerRef.current) {\n window.clearTimeout(skillFlyoutCloseTimerRef.current);\n skillFlyoutCloseTimerRef.current = null;\n }\n if (rowEl && typeof window !== \"undefined\") {\n const rect = rowEl.getBoundingClientRect();\n const FLYOUT_WIDTH = 248;\n setSkillFlyoutSide(\n window.innerWidth - rect.right < FLYOUT_WIDTH ? \"left\" : \"right\",\n );\n }\n setSkillFlyoutOpen(true);\n };\n const scheduleSkillFlyoutClose = () => {\n if (skillFlyoutCloseTimerRef.current)\n window.clearTimeout(skillFlyoutCloseTimerRef.current);\n skillFlyoutCloseTimerRef.current = window.setTimeout(() => {\n setSkillFlyoutOpen(false);\n }, 160);\n };\n\n useEffect(() => {\n if (open) {\n setView(\"menu\");\n setSkillUploadSlug(\"\");\n setSkillUploadContent(\"\");\n setSkillUploadFileName(\"\");\n setSkillUploadStatus(null);\n setSkillUploadBusy(false);\n setSkillFlyoutOpen(false);\n }\n }, [open]);\n\n const handleSkillFileSelected = async (files: FileList | null) => {\n if (!files || files.length === 0) return;\n const file = files[0];\n const text = await file.text();\n const baseName = file.name.replace(/\\.[^./]+$/, \"\");\n const slug = slugifyName(\n baseName.toLowerCase() === \"skill\" ? \"uploaded-skill\" : baseName,\n );\n setSkillUploadSlug(slug);\n setSkillUploadContent(text);\n setSkillUploadFileName(file.name);\n setSkillUploadStatus(null);\n setView(\"skill-upload\");\n };\n\n const handleFilesSelected = async (files: FileList | null) => {\n if (!files || files.length === 0) return;\n try {\n await Promise.all(\n Array.from(files).map((file) => composerRuntime.addAttachment(file)),\n );\n } catch (error) {\n onAttachmentError?.(\n formatAttachmentError(error, \"Could not upload the selected file.\"),\n );\n }\n };\n\n const submitSkillUpload = async () => {\n if (skillUploadBusy) return;\n const slug = slugifyName(skillUploadSlug || \"uploaded-skill\");\n const path = `skills/${slug}/SKILL.md`;\n setSkillUploadBusy(true);\n setSkillUploadStatus(null);\n try {\n const res = await fetch(agentNativePath(\"/_agent-native/resources\"), {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n path,\n content: skillUploadContent,\n mimeType: \"text/markdown\",\n shared: false,\n }),\n });\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n throw new Error(body || `Upload failed (${res.status})`);\n }\n setSkillUploadStatus({\n kind: \"ok\",\n message: `Skill \"${skillUploadFileName || `${slug}/SKILL.md`}\" added`,\n });\n window.setTimeout(() => setOpen(false), 1200);\n } catch (err: any) {\n setSkillUploadStatus({\n kind: \"err\",\n message: err?.message || \"Failed to save skill file\",\n });\n } finally {\n setSkillUploadBusy(false);\n }\n };\n\n const menuItems: {\n icon: React.ReactNode;\n label: string;\n desc: string;\n action: () => void;\n hoverAction?: () => void;\n }[] = [\n {\n icon: <IconUpload className=\"h-3.5 w-3.5\" />,\n label: \"Upload File\",\n desc: \"Images, PDFs, text/code, JSON, CSV\",\n action: () => {\n setOpen(false);\n setTimeout(() => fileUploadRef.current?.click(), 0);\n },\n },\n {\n icon: <IconPhotoPlus className=\"h-3.5 w-3.5\" />,\n label: \"Generate Image\",\n desc: \"Open the Assets image picker\",\n action: () => {\n setOpen(false);\n setAssetsPickerOpen(true);\n },\n },\n {\n icon: <IconClock className=\"h-3.5 w-3.5\" />,\n label: \"Schedule Task\",\n desc: \"Run something on a schedule\",\n action: () => {\n onSelectMode?.(\"job\");\n setOpen(false);\n },\n },\n {\n icon: <IconBolt className=\"h-3.5 w-3.5\" />,\n label: \"Create Automation\",\n desc: \"Set up a when-X-do-Y rule\",\n action: () => {\n onSelectMode?.(\"automation\");\n setOpen(false);\n },\n },\n {\n icon: <IconTool className=\"h-3.5 w-3.5\" />,\n label: \"Create Extension\",\n desc: \"Build a mini app extension\",\n action: () => {\n onSelectMode?.(\"extension\");\n setOpen(false);\n },\n },\n ...(showMcpIntegrations\n ? [\n {\n icon: <IconPlugConnected className=\"h-3.5 w-3.5\" />,\n label: t(\"mcpIntegrations.menuLabel\"),\n desc: t(\"mcpIntegrations.menuDescription\"),\n action: () => {\n setOpen(false);\n setMcpDialogOpen(true);\n },\n },\n ]\n : []),\n {\n icon: <IconBulb className=\"h-3.5 w-3.5\" />,\n label: \"Create Skill\",\n desc: \"Teach the agent a new ability\",\n action: openSkillFlyout,\n hoverAction: openSkillFlyout,\n },\n ];\n\n return (\n <>\n {/* Hidden input to trigger the native file upload with explicit errors. */}\n <input\n ref={fileUploadRef}\n type=\"file\"\n multiple\n className=\"hidden\"\n onChange={(event) => {\n void handleFilesSelected(event.target.files);\n event.target.value = \"\";\n }}\n />\n <input\n ref={skillFileInputRef}\n type=\"file\"\n accept=\".md,text/markdown\"\n className=\"hidden\"\n onChange={(e) => {\n void handleSkillFileSelected(e.target.files);\n e.target.value = \"\";\n }}\n />\n\n <Popover open={open} onOpenChange={setOpen}>\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"shrink-0 flex h-7 w-7 items-center justify-center rounded-md text-muted-foreground hover:text-foreground hover:bg-accent/50 disabled:opacity-30 disabled:cursor-not-allowed\"\n >\n <IconPlus className=\"h-4 w-4\" />\n </button>\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent>Add...</TooltipContent>\n </Tooltip>\n <PopoverContent\n side=\"top\"\n align=\"start\"\n sideOffset={8}\n className={cn(\n \"p-0 rounded-lg\",\n view === \"skill-upload\"\n ? \"max-h-[70vh] w-[calc(100vw-24px)] max-w-[380px] overflow-y-auto\"\n : \"w-[260px]\",\n )}\n style={{ fontSize: 13, lineHeight: \"normal\" }}\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n {view === \"menu\" && (\n <div className=\"py-1\">\n {menuItems.map((item) => {\n const isSkill = item.label === \"Create Skill\";\n return (\n <div\n key={item.label}\n className={cn(\"relative\", isSkill && \"group/skill\")}\n onMouseEnter={(e) => {\n if (isSkill) {\n openSkillFlyout(e.currentTarget);\n return;\n }\n if (!item.hoverAction) return;\n if (skillHoverTimerRef.current)\n window.clearTimeout(skillHoverTimerRef.current);\n skillHoverTimerRef.current = window.setTimeout(() => {\n item.hoverAction?.();\n }, 180);\n }}\n onMouseLeave={() => {\n if (isSkill) {\n scheduleSkillFlyoutClose();\n return;\n }\n if (skillHoverTimerRef.current) {\n window.clearTimeout(skillHoverTimerRef.current);\n skillHoverTimerRef.current = null;\n }\n }}\n >\n <button\n type=\"button\"\n onClick={item.action}\n className={cn(\n \"flex w-full items-center gap-2.5 px-3 py-2 text-start hover:bg-accent/50\",\n isSkill && skillFlyoutOpen && \"bg-accent/50\",\n )}\n >\n <span className=\"text-muted-foreground\">{item.icon}</span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-[12px] font-medium text-foreground\">\n {item.label}\n </div>\n <div className=\"mt-0.5 text-[10px] text-muted-foreground/60\">\n {item.desc}\n </div>\n </div>\n {isSkill && (\n <span className=\"ms-auto text-muted-foreground/60\">\n ›\n </span>\n )}\n </button>\n {isSkill && skillFlyoutOpen && (\n <div\n role=\"menu\"\n onMouseEnter={() => openSkillFlyout()}\n onMouseLeave={scheduleSkillFlyoutClose}\n className={cn(\n \"absolute top-0 z-20 w-[240px] rounded-lg border border-border bg-popover py-1 shadow-md\",\n skillFlyoutSide === \"right\"\n ? \"left-full ml-1\"\n : \"right-full mr-1\",\n )}\n >\n <button\n type=\"button\"\n onClick={() => {\n onSelectMode?.(\"skill\");\n setSkillFlyoutOpen(false);\n setOpen(false);\n }}\n className=\"flex w-full items-center gap-2.5 px-3 py-2 text-start hover:bg-accent/50\"\n >\n <span className=\"text-muted-foreground\">\n <IconBulb className=\"h-3.5 w-3.5\" />\n </span>\n <div className=\"min-w-0\">\n <div className=\"text-[12px] font-medium text-foreground\">\n Create new skill\n </div>\n <div className=\"mt-0.5 text-[10px] text-muted-foreground/60\">\n Describe a skill and let the agent draft it\n </div>\n </div>\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setSkillFlyoutOpen(false);\n skillFileInputRef.current?.click();\n }}\n className=\"flex w-full items-center gap-2.5 px-3 py-2 text-start hover:bg-accent/50\"\n >\n <span className=\"text-muted-foreground\">\n <IconUpload className=\"h-3.5 w-3.5\" />\n </span>\n <div className=\"min-w-0\">\n <div className=\"text-[12px] font-medium text-foreground\">\n Upload skill file\n </div>\n <div className=\"mt-0.5 text-[10px] text-muted-foreground/60\">\n Import an existing SKILL.md file\n </div>\n </div>\n </button>\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n\n {view === \"skill-upload\" && (\n <div className=\"p-3\">\n <button\n type=\"button\"\n onClick={() => setView(\"menu\")}\n className=\"mb-1.5 flex items-center gap-1 text-[11px] text-muted-foreground hover:text-foreground\"\n >\n <IconArrowLeft className=\"h-3 w-3 rtl:-scale-x-100\" />\n Back\n </button>\n <label className=\"mb-1 block text-[11px] font-semibold text-foreground\">\n Upload skill file\n </label>\n <p className=\"mb-2 text-[10px] leading-relaxed text-muted-foreground/60\">\n Review the content from{\" \"}\n <span className=\"font-mono\">\n {skillUploadFileName || \"the selected file\"}\n </span>{\" \"}\n before saving.\n </p>\n <label className=\"mb-1 block text-[10px] font-medium text-muted-foreground\">\n Skill name\n </label>\n <input\n value={skillUploadSlug}\n onChange={(e) => setSkillUploadSlug(e.target.value)}\n className=\"mb-2 w-full rounded-md border border-border bg-background px-2.5 py-1.5 text-[12px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-accent\"\n placeholder=\"my-skill\"\n />\n <p className=\"mb-2 text-[10px] text-muted-foreground/60\">\n Saved at{\" \"}\n <span className=\"font-mono\">\n skills/{slugifyName(skillUploadSlug || \"uploaded-skill\")}\n /SKILL.md\n </span>\n </p>\n <label className=\"mb-1 block text-[10px] font-medium text-muted-foreground\">\n Content\n </label>\n <textarea\n value={skillUploadContent}\n onChange={(e) => setSkillUploadContent(e.target.value)}\n rows={10}\n className=\"w-full rounded-md border border-border bg-background px-2.5 py-1.5 font-mono text-[11px] leading-relaxed text-foreground outline-none focus:ring-1 focus:ring-accent\"\n />\n {skillUploadStatus && (\n <div\n className={cn(\n \"mt-2 text-[11px] leading-snug\",\n skillUploadStatus.kind === \"ok\"\n ? \"text-green-600 dark:text-green-400\"\n : \"text-red-600 dark:text-red-400\",\n )}\n >\n {skillUploadStatus.message}\n </div>\n )}\n <div className=\"mt-2.5 flex justify-end gap-2\">\n <button\n type=\"button\"\n onClick={() => setView(\"menu\")}\n className=\"rounded-md px-3 py-1.5 text-[12px] font-medium text-muted-foreground hover:bg-accent/40\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={submitSkillUpload}\n disabled={\n skillUploadBusy ||\n !skillUploadContent.trim() ||\n !skillUploadSlug.trim()\n }\n className=\"rounded-md bg-accent px-3 py-1.5 text-[12px] font-medium text-foreground hover:bg-accent/80 disabled:opacity-40 disabled:pointer-events-none\"\n >\n {skillUploadBusy ? (\n <IconLoader2 className=\"h-3 w-3 animate-spin\" />\n ) : (\n \"Save\"\n )}\n </button>\n </div>\n </div>\n )}\n </PopoverContent>\n </Popover>\n <McpIntegrationDialog\n open={mcpDialogOpen}\n onOpenChange={setMcpDialogOpen}\n defaultScope={defaultMcpScope}\n canCreateOrgMcp={canCreateOrgMcp}\n hasOrg={hasOrg}\n onCreateMcpServer={(args) => createMcp.mutateAsync(args)}\n />\n <AssetsPickerModal\n open={assetsPickerOpen}\n onOpenChange={setAssetsPickerOpen}\n />\n </>\n );\n}\n\nfunction AssetsPickerModal({\n open,\n onOpenChange,\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}) {\n const iframeRef = useRef<HTMLIFrameElement | null>(null);\n const standaloneWindowRef = useRef<Window | null>(null);\n const [pickerReady, setPickerReady] = useState(false);\n const [standaloneHandoffId, setStandaloneHandoffId] = useState<string | null>(\n null,\n );\n const sourceUrl = useMemo(() => assetPickerUrl(), []);\n const externalPicker = useMemo(\n () =>\n typeof window !== \"undefined\" &&\n isExternalAssetPickerUrl(sourceUrl, window.location.origin),\n [sourceUrl],\n );\n const standaloneUrl = useMemo(\n () =>\n standaloneAssetPickerUrl(\n sourceUrl,\n typeof window !== \"undefined\" ? window.location.href : undefined,\n {\n handoffId: standaloneHandoffId ?? undefined,\n returnOrigin:\n typeof window !== \"undefined\" ? window.location.origin : undefined,\n },\n ),\n [sourceUrl, standaloneHandoffId],\n );\n const iframeUrl = useMemo(() => withEmbeddedParams(sourceUrl), [sourceUrl]);\n const targetOrigin = useMemo(() => assetPickerOrigin(iframeUrl), [iframeUrl]);\n const configurePicker = useCallback(() => {\n if (!targetOrigin) return;\n iframeRef.current?.contentWindow?.postMessage(\n embedEnvelope(\"message\", {\n name: \"configure\",\n payload: { mediaType: \"image\", count: 3 },\n }),\n targetOrigin,\n );\n }, [targetOrigin]);\n\n useEffect(() => {\n if (open) {\n setPickerReady(false);\n if (externalPicker) {\n standaloneWindowRef.current = null;\n setStandaloneHandoffId(createAssetPickerHandoffId());\n } else {\n setStandaloneHandoffId(null);\n }\n return;\n }\n if (!standaloneWindowRef.current) setStandaloneHandoffId(null);\n }, [externalPicker, iframeUrl, open]);\n\n useEffect(() => {\n if (\n !targetOrigin ||\n (!open && !standaloneWindowRef.current) ||\n (externalPicker && !standaloneHandoffId)\n )\n return;\n\n const handleMessage = (event: MessageEvent) => {\n const expectedSource = externalPicker\n ? standaloneWindowRef.current\n : iframeRef.current?.contentWindow;\n if (!expectedSource || event.source !== expectedSource) return;\n if (event.origin !== targetOrigin) return;\n if (!isEmbedEnvelope(event.data)) return;\n\n if (event.data.type === \"ready\") {\n setPickerReady(true);\n configurePicker();\n return;\n }\n\n if (event.data.type !== \"message\") return;\n if (externalPicker) {\n const payload = event.data.payload;\n const handoffId =\n payload && typeof payload === \"object\"\n ? assetString((payload as AssetPickerPayload).handoffId)\n : null;\n if (handoffId !== standaloneHandoffId) return;\n }\n if (event.data.name === \"close\") {\n onOpenChange(false);\n return;\n }\n if (\n event.data.name !== \"chooseImage\" &&\n event.data.name !== \"chooseAsset\"\n )\n return;\n\n const url = assetImageSource(event.data.payload);\n if (!url) return;\n const title = assetTitle(event.data.payload, url);\n const assetId =\n event.data.payload && typeof event.data.payload === \"object\"\n ? assetString((event.data.payload as AssetPickerPayload).assetId)\n : null;\n setAgentChatContextItem({\n key: `asset-image:${assetId ?? url}`,\n title: `Image: ${title}`,\n context: assetContext(event.data.payload, url),\n });\n standaloneWindowRef.current = null;\n setStandaloneHandoffId(null);\n onOpenChange(false);\n };\n\n const handleKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") onOpenChange(false);\n };\n\n window.addEventListener(\"message\", handleMessage);\n window.addEventListener(\"keydown\", handleKey);\n return () => {\n window.removeEventListener(\"message\", handleMessage);\n window.removeEventListener(\"keydown\", handleKey);\n };\n }, [\n configurePicker,\n externalPicker,\n onOpenChange,\n open,\n standaloneHandoffId,\n targetOrigin,\n ]);\n\n const openStandalonePicker = useCallback(\n (event: React.MouseEvent<HTMLAnchorElement>) => {\n if (!standaloneHandoffId) return;\n event.preventDefault();\n const pickerWindow = window.open(standaloneUrl, \"_blank\");\n if (!pickerWindow) return;\n standaloneWindowRef.current = pickerWindow;\n onOpenChange(false);\n },\n [onOpenChange, standaloneHandoffId, standaloneUrl],\n );\n\n if (!open || typeof document === \"undefined\") return null;\n\n return createPortal(\n <div\n className=\"fixed inset-0 z-[280] flex items-center justify-center bg-black/50 p-3\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"composer-assets-picker-title\"\n onMouseDown={(event) => {\n if (event.target === event.currentTarget) onOpenChange(false);\n }}\n >\n <div className=\"flex h-[min(86vh,760px)] w-[min(96vw,1040px)] flex-col overflow-hidden rounded-xl border border-border bg-background shadow-2xl\">\n <div className=\"flex h-12 shrink-0 items-center justify-between border-b border-border px-4\">\n <div\n id=\"composer-assets-picker-title\"\n className=\"text-sm font-medium text-foreground\"\n >\n Generate image\n </div>\n <button\n type=\"button\"\n onClick={() => onOpenChange(false)}\n className=\"flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground\"\n aria-label=\"Close image picker\"\n >\n <IconX className=\"h-4 w-4\" />\n </button>\n </div>\n {externalPicker ? (\n <div className=\"flex min-h-0 flex-1 flex-col items-center justify-center gap-3 p-8 text-center\">\n <div className=\"max-w-md text-sm text-muted-foreground\">\n Open Assets in a new tab to sign in and choose an image securely.\n </div>\n <a\n href={standaloneUrl}\n target=\"_blank\"\n onClick={openStandalonePicker}\n className=\"inline-flex h-9 items-center justify-center rounded-md bg-primary px-4 text-sm font-medium text-primary-foreground hover:bg-primary/90\"\n >\n Open Assets image picker\n </a>\n </div>\n ) : targetOrigin ? (\n <div className=\"relative min-h-0 flex-1 overflow-hidden bg-background\">\n {!pickerReady && <AssetsPickerLoadingSkeleton />}\n <iframe\n ref={iframeRef}\n src={iframeUrl}\n title=\"Assets image picker\"\n className={cn(\n \"absolute inset-0 h-full w-full border-0 bg-background transition-opacity duration-150\",\n pickerReady ? \"opacity-100\" : \"pointer-events-none opacity-0\",\n )}\n sandbox=\"allow-scripts allow-same-origin allow-forms allow-popups allow-downloads\"\n allow=\"clipboard-read; clipboard-write; microphone; fullscreen\"\n referrerPolicy=\"strict-origin-when-cross-origin\"\n onLoad={() => {\n configurePicker();\n setPickerReady(true);\n }}\n />\n </div>\n ) : (\n <div className=\"flex min-h-0 flex-1 items-center justify-center p-8 text-center text-sm text-muted-foreground\">\n The configured image picker URL is not valid.\n </div>\n )}\n </div>\n </div>,\n document.body,\n );\n}\n\nfunction AssetsPickerLoadingSkeleton() {\n return (\n <div\n className=\"absolute inset-0 flex flex-col gap-5 p-5\"\n role=\"status\"\n aria-label=\"Loading Assets picker\"\n >\n <div className=\"flex items-center gap-3\">\n <div className=\"h-9 flex-1 animate-pulse rounded-md bg-muted\" />\n <div className=\"h-9 w-24 animate-pulse rounded-md bg-muted\" />\n </div>\n <div className=\"grid min-h-0 flex-1 grid-cols-2 gap-4 sm:grid-cols-3 lg:grid-cols-4\">\n {Array.from({ length: 8 }).map((_, index) => (\n <div key={index} className=\"flex min-w-0 flex-col gap-2\">\n <div className=\"aspect-square w-full animate-pulse rounded-lg bg-muted\" />\n <div className=\"h-3 w-3/4 animate-pulse rounded bg-muted\" />\n <div className=\"h-3 w-1/2 animate-pulse rounded bg-muted\" />\n </div>\n ))}\n </div>\n </div>\n );\n}\n"]}
@@ -0,0 +1,16 @@
1
+ export declare const ASSET_PICKER_HANDOFF_PARAM = "__an_asset_picker_handoff";
2
+ export declare const ASSET_PICKER_RETURN_ORIGIN_PARAM = "__an_asset_picker_return_origin";
3
+ export interface StandaloneAssetPickerOptions {
4
+ handoffId?: string;
5
+ returnOrigin?: string;
6
+ }
7
+ export declare function createAssetPickerHandoffId(): string;
8
+ /**
9
+ * Cross-origin Assets pages cannot inherit the host app's authenticated
10
+ * session inside an iframe. Treat those URLs as link-out targets so provider
11
+ * sign-in runs in a normal top-level browser context.
12
+ */
13
+ export declare function isExternalAssetPickerUrl(value: string, currentOrigin: string): boolean;
14
+ /** Build a top-level picker URL without iframe-only auth flags. */
15
+ export declare function standaloneAssetPickerUrl(value: string, baseUrl?: string, options?: StandaloneAssetPickerOptions): string;
16
+ //# sourceMappingURL=asset-picker-url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-picker-url.d.ts","sourceRoot":"","sources":["../../../src/client/composer/asset-picker-url.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,0BAA0B,8BAA8B,CAAC;AACtE,eAAO,MAAM,gCAAgC,oCACV,CAAC;AAEpC,MAAM,WAAW,4BAA4B;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,0BAA0B,IAAI,MAAM,CAWnD;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,GACpB,OAAO,CAQT;AAED,mEAAmE;AACnE,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,EACb,OAAO,SAAoB,EAC3B,OAAO,GAAE,4BAAiC,GACzC,MAAM,CAgCR"}
@@ -0,0 +1,64 @@
1
+ const FALLBACK_BASE_URL = "http://agent-native.invalid";
2
+ export const ASSET_PICKER_HANDOFF_PARAM = "__an_asset_picker_handoff";
3
+ export const ASSET_PICKER_RETURN_ORIGIN_PARAM = "__an_asset_picker_return_origin";
4
+ export function createAssetPickerHandoffId() {
5
+ if (typeof crypto !== "undefined" && crypto.randomUUID) {
6
+ return crypto.randomUUID();
7
+ }
8
+ if (typeof crypto !== "undefined" && crypto.getRandomValues) {
9
+ const bytes = crypto.getRandomValues(new Uint8Array(16));
10
+ return Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join("");
11
+ }
12
+ return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;
13
+ }
14
+ /**
15
+ * Cross-origin Assets pages cannot inherit the host app's authenticated
16
+ * session inside an iframe. Treat those URLs as link-out targets so provider
17
+ * sign-in runs in a normal top-level browser context.
18
+ */
19
+ export function isExternalAssetPickerUrl(value, currentOrigin) {
20
+ try {
21
+ return new URL(value, currentOrigin).origin !== currentOrigin;
22
+ }
23
+ catch {
24
+ // A malformed configured URL should fail closed instead of being loaded in
25
+ // an iframe with an unknown auth boundary.
26
+ return true;
27
+ }
28
+ }
29
+ /** Build a top-level picker URL without iframe-only auth flags. */
30
+ export function standaloneAssetPickerUrl(value, baseUrl = FALLBACK_BASE_URL, options = {}) {
31
+ try {
32
+ const parsed = new URL(value, baseUrl);
33
+ parsed.searchParams.delete("embedded");
34
+ parsed.searchParams.delete("__an_embed_token");
35
+ parsed.searchParams.set("mediaType", "image");
36
+ let returnOrigin = null;
37
+ if (options.returnOrigin) {
38
+ try {
39
+ const parsedOrigin = new URL(options.returnOrigin);
40
+ if (parsedOrigin.protocol === "http:" ||
41
+ parsedOrigin.protocol === "https:") {
42
+ returnOrigin = parsedOrigin.origin;
43
+ }
44
+ }
45
+ catch {
46
+ // Omit an invalid return target rather than emitting an unverified
47
+ // cross-origin callback URL.
48
+ }
49
+ }
50
+ if (options.handoffId && returnOrigin) {
51
+ parsed.searchParams.set(ASSET_PICKER_HANDOFF_PARAM, options.handoffId);
52
+ parsed.searchParams.set(ASSET_PICKER_RETURN_ORIGIN_PARAM, returnOrigin);
53
+ }
54
+ else {
55
+ parsed.searchParams.delete(ASSET_PICKER_HANDOFF_PARAM);
56
+ parsed.searchParams.delete(ASSET_PICKER_RETURN_ORIGIN_PARAM);
57
+ }
58
+ return parsed.toString();
59
+ }
60
+ catch {
61
+ return value;
62
+ }
63
+ }
64
+ //# sourceMappingURL=asset-picker-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-picker-url.js","sourceRoot":"","sources":["../../../src/client/composer/asset-picker-url.ts"],"names":[],"mappings":"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","sourcesContent":["const FALLBACK_BASE_URL = \"http://agent-native.invalid\";\n\nexport const ASSET_PICKER_HANDOFF_PARAM = \"__an_asset_picker_handoff\";\nexport const ASSET_PICKER_RETURN_ORIGIN_PARAM =\n \"__an_asset_picker_return_origin\";\n\nexport interface StandaloneAssetPickerOptions {\n handoffId?: string;\n returnOrigin?: string;\n}\n\nexport function createAssetPickerHandoffId(): string {\n if (typeof crypto !== \"undefined\" && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n if (typeof crypto !== \"undefined\" && crypto.getRandomValues) {\n const bytes = crypto.getRandomValues(new Uint8Array(16));\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\n \"\",\n );\n }\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n\n/**\n * Cross-origin Assets pages cannot inherit the host app's authenticated\n * session inside an iframe. Treat those URLs as link-out targets so provider\n * sign-in runs in a normal top-level browser context.\n */\nexport function isExternalAssetPickerUrl(\n value: string,\n currentOrigin: string,\n): boolean {\n try {\n return new URL(value, currentOrigin).origin !== currentOrigin;\n } catch {\n // A malformed configured URL should fail closed instead of being loaded in\n // an iframe with an unknown auth boundary.\n return true;\n }\n}\n\n/** Build a top-level picker URL without iframe-only auth flags. */\nexport function standaloneAssetPickerUrl(\n value: string,\n baseUrl = FALLBACK_BASE_URL,\n options: StandaloneAssetPickerOptions = {},\n): string {\n try {\n const parsed = new URL(value, baseUrl);\n parsed.searchParams.delete(\"embedded\");\n parsed.searchParams.delete(\"__an_embed_token\");\n parsed.searchParams.set(\"mediaType\", \"image\");\n let returnOrigin: string | null = null;\n if (options.returnOrigin) {\n try {\n const parsedOrigin = new URL(options.returnOrigin);\n if (\n parsedOrigin.protocol === \"http:\" ||\n parsedOrigin.protocol === \"https:\"\n ) {\n returnOrigin = parsedOrigin.origin;\n }\n } catch {\n // Omit an invalid return target rather than emitting an unverified\n // cross-origin callback URL.\n }\n }\n if (options.handoffId && returnOrigin) {\n parsed.searchParams.set(ASSET_PICKER_HANDOFF_PARAM, options.handoffId);\n parsed.searchParams.set(ASSET_PICKER_RETURN_ORIGIN_PARAM, returnOrigin);\n } else {\n parsed.searchParams.delete(ASSET_PICKER_HANDOFF_PARAM);\n parsed.searchParams.delete(ASSET_PICKER_RETURN_ORIGIN_PARAM);\n }\n return parsed.toString();\n } catch {\n return value;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"error-format.d.ts","sourceRoot":"","sources":["../../src/client/error-format.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,0BAA0B,qCAAqC,CAAC;AAK7E,eAAO,MAAM,oBAAoB,0BAA0B,CAAC;AAY5D,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CAqBR;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AA4CD,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,MAAM,GACjB,mBAAmB,CA4DrB"}
1
+ {"version":3,"file":"error-format.d.ts","sourceRoot":"","sources":["../../src/client/error-format.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,0BAA0B,qCAAqC,CAAC;AAK7E,eAAO,MAAM,oBAAoB,0BAA0B,CAAC;AAY5D,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CAqBR;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAwDD,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,MAAM,GACjB,mBAAmB,CAwErB"}
@@ -73,6 +73,13 @@ function isProviderAuthenticationError(text, errorCode) {
73
73
  lower.includes("api key is invalid") ||
74
74
  (lower.includes("authentication_error") && lower.includes("api")));
75
75
  }
76
+ function isConnectionError(text, errorCode) {
77
+ const code = normalizeErrorCode(errorCode);
78
+ return (code === "provider_network_error" ||
79
+ code === "connection_error" ||
80
+ code === "network_error" ||
81
+ /^(?:provider_network_error|connection_error|network_error)$/i.test(text.trim()));
82
+ }
76
83
  export function normalizeChatError(errorMessage, errorCode) {
77
84
  const raw = String(errorMessage || "Unknown error");
78
85
  const looksHtml = /<html[\s>]|<body[\s>]|<head[\s>]/i.test(raw);
@@ -89,6 +96,16 @@ export function normalizeChatError(errorMessage, errorCode) {
89
96
  details: text,
90
97
  };
91
98
  }
99
+ if (isConnectionError(text, errorCode)) {
100
+ const providerNetworkError = normalizeErrorCode(errorCode) === "provider_network_error" ||
101
+ /provider_network_error/i.test(text);
102
+ return {
103
+ message: providerNetworkError
104
+ ? "The model provider could not be reached. Check your connection and retry."
105
+ : "The agent connection was interrupted. Check your connection and retry.",
106
+ details: text,
107
+ };
108
+ }
92
109
  if (/^Gateway error \(no detail; raw event:/i.test(text)) {
93
110
  // The previous copy promised auto-recovery and suggested switching models,
94
111
  // but neither helps for this code: the server already retried once and
@@ -1 +1 @@
1
- {"version":3,"file":"error-format.js","sourceRoot":"","sources":["../../src/client/error-format.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,kCAAkC,CAAC;AAE7E,8EAA8E;AAC9E,6EAA6E;AAC7E,iFAAiF;AACjF,MAAM,CAAC,MAAM,oBAAoB,GAAG,uBAAuB,CAAC;AAE5D,SAAS,gBAAgB,CAAC,GAAW;IACnC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC/C,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,YAAoB,EACpB,UAAmB,EACnB,SAAkB;IAElB,MAAM,UAAU,GAAG,kBAAkB,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IAC/D,IACE,SAAS,KAAK,qBAAqB;QACnC,wCAAwC,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EACjE,CAAC;QACD,OAAO,UAAU,UAAU,CAAC,OAAO,qCAAqC,0BAA0B,GAAG,CAAC;IACxG,CAAC;IACD,IAAI,SAAS,KAAK,uBAAuB,EAAE,CAAC;QAC1C,OAAO,UAAU,UAAU,CAAC,OAAO,wBAAwB,oBAAoB,GAAG,CAAC;IACrF,CAAC;IACD,IACE,SAAS,KAAK,yBAAyB;QACvC,SAAS,KAAK,gBAAgB,EAC9B,CAAC;QACD,OAAO,UAAU,UAAU,CAAC,OAAO,wBAAwB,oBAAoB,GAAG,CAAC;IACrF,CAAC;IACD,IAAI,CAAC,UAAU,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC;QACjD,OAAO,UAAU,UAAU,CAAC,OAAO,EAAE,CAAC;IACxC,CAAC;IACD,OAAO,UAAU,UAAU,CAAC,OAAO,+BAA+B,UAAU,GAAG,CAAC;AAClF,CAAC;AAOD,SAAS,kBAAkB,CAAC,SAAkB;IAC5C,OAAO,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;SAC3B,IAAI,EAAE;SACN,WAAW,EAAE,CAAC;AACnB,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY,EAAE,SAAkB;IAC3D,MAAM,IAAI,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC3C,OAAO,CACL,IAAI,KAAK,uBAAuB;QAChC,IAAI,KAAK,UAAU;QACnB,IAAI,KAAK,cAAc;QACvB,IAAI,KAAK,qBAAqB;QAC9B,uCAAuC,CAAC,IAAI,CAAC,IAAI,CAAC;QAClD,iFAAiF,CAAC,IAAI,CACpF,IAAI,CACL;QACD,8DAA8D,CAAC,IAAI,CAAC,IAAI,CAAC,CAC1E,CAAC;AACJ,CAAC;AAED,SAAS,6BAA6B,CACpC,IAAY,EACZ,SAAkB;IAElB,MAAM,IAAI,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,OAAO,CACL,IAAI,KAAK,sBAAsB;QAC/B,IAAI,KAAK,UAAU;QACnB,uCAAuC,CAAC,IAAI,CAAC,IAAI,CAAC;QAClD,+EAA+E,CAAC,IAAI,CAClF,IAAI,CACL;QACD,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QACnC,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QACjC,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QACnC,KAAK,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QACpC,CAAC,KAAK,CAAC,QAAQ,CAAC,sBAAsB,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAClE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,YAAoB,EACpB,SAAkB;IAElB,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,IAAI,eAAe,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,mCAAmC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IAEtD,IAAI,mBAAmB,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC;QACzC,OAAO;YACL,OAAO,EACL,qFAAqF;YACvF,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,IAAI,6BAA6B,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC;QACnD,OAAO;YACL,OAAO,EACL,sGAAsG;YACxG,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,IAAI,yCAAyC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACzD,2EAA2E;QAC3E,uEAAuE;QACvE,kDAAkD;QAClD,wEAAwE;QACxE,mEAAmE;QACnE,0CAA0C;QAC1C,OAAO;YACL,OAAO,EACL,gJAAgJ;YAClJ,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,IAAI,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,OAAO;YACL,OAAO,EACL,yGAAyG;YAC3G,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,IAAI,yDAAyD,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACzE,OAAO;YACL,OAAO,EACL,0IAA0I;YAC5I,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACd,OAAO;YACL,OAAO,EACL,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,2CAA2C;YACnE,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI;SACR,OAAO,CAAC,6BAA6B,EAAE,GAAG,CAAC;SAC3C,OAAO,CAAC,2BAA2B,EAAE,GAAG,CAAC;SACzC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC;SAC7B,OAAO,CAAC,8BAA8B,EAAE,IAAI,CAAC;SAC7C,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;SACxB,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;SACxB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;SACxB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC;SACvB,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;SAC1B,IAAI,EAAE,CAAC;AACZ,CAAC","sourcesContent":["/**\n * Append a Builder CTA markdown link to gateway errors that users can fix\n * outside the app. Used by both\n * chat SSE consumers (`sse-event-processor.ts` and `useProductionAgent.ts`)\n * to keep the copy in lockstep.\n *\n * `upgradeUrl` comes from the gateway response body and ends up interpolated\n * into markdown, so we validate it's a plain https URL with no characters\n * that would escape the `[...](url)` link target. Only `)` and whitespace\n * terminate the link target — `(`, `<`, `>` are fine inside it — so the\n * regex stays narrow; the gateway may emit URLs containing `(`\n * (e.g. `?ref=Acme%20(staging)`) and we don't want to reject them.\n */\nexport const BUILDER_SPACE_SETTINGS_URL = \"https://builder.io/account/space\";\n\n// Pseudo-href used to mark an in-app \"Start new chat\" CTA inside the markdown\n// error message. The chat renderer intercepts this href and renders a button\n// that dispatches the `agent-native:new-chat` CustomEvent instead of navigating.\nexport const NEW_CHAT_ACTION_HREF = \"agent-native:new-chat\";\n\nfunction isSafeUpgradeUrl(url: string): boolean {\n try {\n const parsed = new URL(url);\n if (parsed.protocol !== \"https:\") return false;\n return !/[\\s)]/.test(url);\n } catch {\n return false;\n }\n}\n\nexport function formatChatErrorText(\n errorMessage: string,\n upgradeUrl?: string,\n errorCode?: string,\n): string {\n const normalized = normalizeChatError(errorMessage, errorCode);\n if (\n errorCode === \"gateway_not_enabled\" ||\n /space has not enabled the LLM gateway/i.test(normalized.message)\n ) {\n return `Error: ${normalized.message}\\n\\n[Open Builder space settings](${BUILDER_SPACE_SETTINGS_URL})`;\n }\n if (errorCode === \"builder_gateway_error\") {\n return `Error: ${normalized.message}\\n\\n[Start new chat](${NEW_CHAT_ACTION_HREF})`;\n }\n if (\n errorCode === \"context_length_exceeded\" ||\n errorCode === \"input_too_long\"\n ) {\n return `Error: ${normalized.message}\\n\\n[Start new chat](${NEW_CHAT_ACTION_HREF})`;\n }\n if (!upgradeUrl || !isSafeUpgradeUrl(upgradeUrl)) {\n return `Error: ${normalized.message}`;\n }\n return `Error: ${normalized.message}\\n\\n[Upgrade at builder.io](${upgradeUrl})`;\n}\n\nexport interface NormalizedChatError {\n message: string;\n details?: string;\n}\n\nfunction normalizeErrorCode(errorCode?: string): string {\n return String(errorCode ?? \"\")\n .trim()\n .toLowerCase();\n}\n\nfunction isProviderRateLimit(text: string, errorCode?: string): boolean {\n const code = normalizeErrorCode(errorCode);\n return (\n code === \"provider_rate_limited\" ||\n code === \"http_429\" ||\n code === \"rate_limited\" ||\n code === \"rate_limit_exceeded\" ||\n /^429 status code(?:\\s*\\(no body\\))?$/i.test(text) ||\n /\\b(?:http\\s*)?429\\b.*\\b(?:status|too many requests|rate[-_\\s]?limit|no body)\\b/i.test(\n text,\n ) ||\n /\\b(?:too many requests|rate[-_\\s]?limit(?:ed| exceeded)?)\\b/i.test(text)\n );\n}\n\nfunction isProviderAuthenticationError(\n text: string,\n errorCode?: string,\n): boolean {\n const code = normalizeErrorCode(errorCode);\n const lower = text.toLowerCase();\n return (\n code === \"authentication_error\" ||\n code === \"http_401\" ||\n /^401 status code(?:\\s*\\(no body\\))?$/i.test(text) ||\n /\\b(?:http\\s*)?401\\b.*\\b(?:status|unauthorized|authentication|auth|no body)\\b/i.test(\n text,\n ) ||\n lower.includes(\"invalid x-api-key\") ||\n lower.includes(\"invalid api key\") ||\n lower.includes(\"incorrect api key\") ||\n lower.includes(\"api key is invalid\") ||\n (lower.includes(\"authentication_error\") && lower.includes(\"api\"))\n );\n}\n\nexport function normalizeChatError(\n errorMessage: string,\n errorCode?: string,\n): NormalizedChatError {\n const raw = String(errorMessage || \"Unknown error\");\n const looksHtml = /<html[\\s>]|<body[\\s>]|<head[\\s>]/i.test(raw);\n const text = looksHtml ? htmlToText(raw) : raw.trim();\n\n if (isProviderRateLimit(text, errorCode)) {\n return {\n message:\n \"The model provider is rate-limiting this chat right now. Wait a moment, then retry.\",\n details: text,\n };\n }\n\n if (isProviderAuthenticationError(text, errorCode)) {\n return {\n message:\n \"The model provider rejected the saved API key. Update the key in API Keys & Connections, then retry.\",\n details: text,\n };\n }\n\n if (/^Gateway error \\(no detail; raw event:/i.test(text)) {\n // The previous copy promised auto-recovery and suggested switching models,\n // but neither helps for this code: the server already retried once and\n // the client deliberately skips auto-continuation\n // (see `builder_gateway_error` in sse-event-processor.ts). The error is\n // almost always upstream, so retrying the same conversation with a\n // different model lands on the same wall.\n return {\n message:\n \"The model gateway returned no error details and the chat couldn't recover. Wait a moment and retry, or start a new chat if it keeps happening.\",\n details: text,\n };\n }\n\n if (/inactivity timeout/i.test(text)) {\n return {\n message:\n \"The agent connection timed out before it could finish. You can continue from the partial work or retry.\",\n details: text,\n };\n }\n\n if (/Invalid request body:\\s*tools\\.\\d+\\.input_schema\\.type/i.test(text)) {\n return {\n message:\n \"A tool schema was invalid, so the model rejected the request before it started. The invalid tool can be skipped and the request retried.\",\n details: text,\n };\n }\n\n if (looksHtml) {\n return {\n message:\n text.slice(0, 240) || \"The provider returned an HTML error page.\",\n details: text,\n };\n }\n\n return { message: text };\n}\n\nfunction htmlToText(html: string): string {\n return html\n .replace(/<script[\\s\\S]*?<\\/script>/gi, \" \")\n .replace(/<style[\\s\\S]*?<\\/style>/gi, \" \")\n .replace(/<br\\s*\\/?>/gi, \"\\n\")\n .replace(/<\\/(p|div|h1|h2|h3|li|tr)>/gi, \"\\n\")\n .replace(/<[^>]+>/g, \" \")\n .replace(/&nbsp;/gi, \" \")\n .replace(/&lt;/gi, \"<\")\n .replace(/&gt;/gi, \">\")\n .replace(/&amp;/gi, \"&\")\n .replace(/&quot;/gi, '\"')\n .replace(/&#39;/gi, \"'\")\n .replace(/[ \\t]+/g, \" \")\n .replace(/\\n\\s+/g, \"\\n\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n}\n"]}
1
+ {"version":3,"file":"error-format.js","sourceRoot":"","sources":["../../src/client/error-format.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Append a Builder CTA markdown link to gateway errors that users can fix\n * outside the app. Used by both\n * chat SSE consumers (`sse-event-processor.ts` and `useProductionAgent.ts`)\n * to keep the copy in lockstep.\n *\n * `upgradeUrl` comes from the gateway response body and ends up interpolated\n * into markdown, so we validate it's a plain https URL with no characters\n * that would escape the `[...](url)` link target. Only `)` and whitespace\n * terminate the link target — `(`, `<`, `>` are fine inside it — so the\n * regex stays narrow; the gateway may emit URLs containing `(`\n * (e.g. `?ref=Acme%20(staging)`) and we don't want to reject them.\n */\nexport const BUILDER_SPACE_SETTINGS_URL = \"https://builder.io/account/space\";\n\n// Pseudo-href used to mark an in-app \"Start new chat\" CTA inside the markdown\n// error message. The chat renderer intercepts this href and renders a button\n// that dispatches the `agent-native:new-chat` CustomEvent instead of navigating.\nexport const NEW_CHAT_ACTION_HREF = \"agent-native:new-chat\";\n\nfunction isSafeUpgradeUrl(url: string): boolean {\n try {\n const parsed = new URL(url);\n if (parsed.protocol !== \"https:\") return false;\n return !/[\\s)]/.test(url);\n } catch {\n return false;\n }\n}\n\nexport function formatChatErrorText(\n errorMessage: string,\n upgradeUrl?: string,\n errorCode?: string,\n): string {\n const normalized = normalizeChatError(errorMessage, errorCode);\n if (\n errorCode === \"gateway_not_enabled\" ||\n /space has not enabled the LLM gateway/i.test(normalized.message)\n ) {\n return `Error: ${normalized.message}\\n\\n[Open Builder space settings](${BUILDER_SPACE_SETTINGS_URL})`;\n }\n if (errorCode === \"builder_gateway_error\") {\n return `Error: ${normalized.message}\\n\\n[Start new chat](${NEW_CHAT_ACTION_HREF})`;\n }\n if (\n errorCode === \"context_length_exceeded\" ||\n errorCode === \"input_too_long\"\n ) {\n return `Error: ${normalized.message}\\n\\n[Start new chat](${NEW_CHAT_ACTION_HREF})`;\n }\n if (!upgradeUrl || !isSafeUpgradeUrl(upgradeUrl)) {\n return `Error: ${normalized.message}`;\n }\n return `Error: ${normalized.message}\\n\\n[Upgrade at builder.io](${upgradeUrl})`;\n}\n\nexport interface NormalizedChatError {\n message: string;\n details?: string;\n}\n\nfunction normalizeErrorCode(errorCode?: string): string {\n return String(errorCode ?? \"\")\n .trim()\n .toLowerCase();\n}\n\nfunction isProviderRateLimit(text: string, errorCode?: string): boolean {\n const code = normalizeErrorCode(errorCode);\n return (\n code === \"provider_rate_limited\" ||\n code === \"http_429\" ||\n code === \"rate_limited\" ||\n code === \"rate_limit_exceeded\" ||\n /^429 status code(?:\\s*\\(no body\\))?$/i.test(text) ||\n /\\b(?:http\\s*)?429\\b.*\\b(?:status|too many requests|rate[-_\\s]?limit|no body)\\b/i.test(\n text,\n ) ||\n /\\b(?:too many requests|rate[-_\\s]?limit(?:ed| exceeded)?)\\b/i.test(text)\n );\n}\n\nfunction isProviderAuthenticationError(\n text: string,\n errorCode?: string,\n): boolean {\n const code = normalizeErrorCode(errorCode);\n const lower = text.toLowerCase();\n return (\n code === \"authentication_error\" ||\n code === \"http_401\" ||\n /^401 status code(?:\\s*\\(no body\\))?$/i.test(text) ||\n /\\b(?:http\\s*)?401\\b.*\\b(?:status|unauthorized|authentication|auth|no body)\\b/i.test(\n text,\n ) ||\n lower.includes(\"invalid x-api-key\") ||\n lower.includes(\"invalid api key\") ||\n lower.includes(\"incorrect api key\") ||\n lower.includes(\"api key is invalid\") ||\n (lower.includes(\"authentication_error\") && lower.includes(\"api\"))\n );\n}\n\nfunction isConnectionError(text: string, errorCode?: string): boolean {\n const code = normalizeErrorCode(errorCode);\n return (\n code === \"provider_network_error\" ||\n code === \"connection_error\" ||\n code === \"network_error\" ||\n /^(?:provider_network_error|connection_error|network_error)$/i.test(\n text.trim(),\n )\n );\n}\n\nexport function normalizeChatError(\n errorMessage: string,\n errorCode?: string,\n): NormalizedChatError {\n const raw = String(errorMessage || \"Unknown error\");\n const looksHtml = /<html[\\s>]|<body[\\s>]|<head[\\s>]/i.test(raw);\n const text = looksHtml ? htmlToText(raw) : raw.trim();\n\n if (isProviderRateLimit(text, errorCode)) {\n return {\n message:\n \"The model provider is rate-limiting this chat right now. Wait a moment, then retry.\",\n details: text,\n };\n }\n\n if (isProviderAuthenticationError(text, errorCode)) {\n return {\n message:\n \"The model provider rejected the saved API key. Update the key in API Keys & Connections, then retry.\",\n details: text,\n };\n }\n\n if (isConnectionError(text, errorCode)) {\n const providerNetworkError =\n normalizeErrorCode(errorCode) === \"provider_network_error\" ||\n /provider_network_error/i.test(text);\n return {\n message: providerNetworkError\n ? \"The model provider could not be reached. Check your connection and retry.\"\n : \"The agent connection was interrupted. Check your connection and retry.\",\n details: text,\n };\n }\n\n if (/^Gateway error \\(no detail; raw event:/i.test(text)) {\n // The previous copy promised auto-recovery and suggested switching models,\n // but neither helps for this code: the server already retried once and\n // the client deliberately skips auto-continuation\n // (see `builder_gateway_error` in sse-event-processor.ts). The error is\n // almost always upstream, so retrying the same conversation with a\n // different model lands on the same wall.\n return {\n message:\n \"The model gateway returned no error details and the chat couldn't recover. Wait a moment and retry, or start a new chat if it keeps happening.\",\n details: text,\n };\n }\n\n if (/inactivity timeout/i.test(text)) {\n return {\n message:\n \"The agent connection timed out before it could finish. You can continue from the partial work or retry.\",\n details: text,\n };\n }\n\n if (/Invalid request body:\\s*tools\\.\\d+\\.input_schema\\.type/i.test(text)) {\n return {\n message:\n \"A tool schema was invalid, so the model rejected the request before it started. The invalid tool can be skipped and the request retried.\",\n details: text,\n };\n }\n\n if (looksHtml) {\n return {\n message:\n text.slice(0, 240) || \"The provider returned an HTML error page.\",\n details: text,\n };\n }\n\n return { message: text };\n}\n\nfunction htmlToText(html: string): string {\n return html\n .replace(/<script[\\s\\S]*?<\\/script>/gi, \" \")\n .replace(/<style[\\s\\S]*?<\\/style>/gi, \" \")\n .replace(/<br\\s*\\/?>/gi, \"\\n\")\n .replace(/<\\/(p|div|h1|h2|h3|li|tr)>/gi, \"\\n\")\n .replace(/<[^>]+>/g, \" \")\n .replace(/&nbsp;/gi, \" \")\n .replace(/&lt;/gi, \"<\")\n .replace(/&gt;/gi, \">\")\n .replace(/&amp;/gi, \"&\")\n .replace(/&quot;/gi, '\"')\n .replace(/&#39;/gi, \"'\")\n .replace(/[ \\t]+/g, \" \")\n .replace(/\\n\\s+/g, \"\\n\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"McpIntegrationDialog.d.ts","sourceRoot":"","sources":["../../../src/client/resources/McpIntegrationDialog.tsx"],"names":[],"mappings":"AA8BA,OAAO,EAKL,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACpB,MAAM,sBAAsB,CAAC;AAI9B,UAAU,yBAAyB;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,YAAY,EAAE,cAAc,CAAC;IAC7B,eAAe,EAAE,OAAO,CAAC;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,iBAAiB,EAAE,CAAC,IAAI,EAAE,mBAAmB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACnE,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAgCD,wBAAgB,oBAAoB,CAAC,EACnC,IAAI,EACJ,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,MAAM,EACN,iBAAiB,EACjB,SAAS,GACV,EAAE,yBAAyB,sCA8e3B"}
1
+ {"version":3,"file":"McpIntegrationDialog.d.ts","sourceRoot":"","sources":["../../../src/client/resources/McpIntegrationDialog.tsx"],"names":[],"mappings":"AA8BA,OAAO,EAKL,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACpB,MAAM,sBAAsB,CAAC;AAI9B,UAAU,yBAAyB;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,YAAY,EAAE,cAAc,CAAC;IAC7B,eAAe,EAAE,OAAO,CAAC;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,iBAAiB,EAAE,CAAC,IAAI,EAAE,mBAAmB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACnE,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAgCD,wBAAgB,oBAAoB,CAAC,EACnC,IAAI,EACJ,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,MAAM,EACN,iBAAiB,EACjB,SAAS,GACV,EAAE,yBAAyB,sCAqf3B"}
@@ -58,7 +58,12 @@ export function McpIntegrationDialog({ open, onOpenChange, defaultScope, canCrea
58
58
  ...(mcpServersQuery.data?.user ?? []),
59
59
  ...(mcpServersQuery.data?.org ?? []),
60
60
  ];
61
- return new Set(servers.map((server) => compareUrl(server.url)));
61
+ // A saved server is not necessarily a working connection. The settings
62
+ // page reports failed and unknown health states separately, so only mark
63
+ // catalog entries as connected after the health probe succeeds.
64
+ return new Set(servers
65
+ .filter((server) => server.status.state === "connected")
66
+ .map((server) => compareUrl(server.url)));
62
67
  }, [mcpServersQuery.data]);
63
68
  const filteredIntegrations = useMemo(() => filterMcpIntegrations(query, defaultIntegrations), [defaultIntegrations, query]);
64
69
  useEffect(() => {