@agent-native/core 0.103.1 → 0.105.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 (568) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +61 -0
  3. package/corpus/core/package.json +9 -2
  4. package/corpus/core/src/agent/engine/credential-errors.ts +2 -2
  5. package/corpus/core/src/agent/production-agent.ts +30 -0
  6. package/corpus/core/src/agent/run-store.ts +12 -2
  7. package/corpus/core/src/cli/create.ts +1 -0
  8. package/corpus/core/src/cli/skills-content/visual-plan-skill.ts +30 -11
  9. package/corpus/core/src/cli/templates-meta.ts +4 -3
  10. package/corpus/core/src/client/AgentAskPopover.tsx +89 -0
  11. package/corpus/core/src/client/AgentChatHome.tsx +4 -0
  12. package/corpus/core/src/client/AgentPanel.tsx +321 -223
  13. package/corpus/core/src/client/AssistantChat.tsx +6 -10
  14. package/corpus/core/src/client/MultiTabAssistantChat.tsx +53 -372
  15. package/corpus/core/src/client/agent-chat-adapter.ts +13 -1
  16. package/corpus/core/src/client/agent-page/AgentContextTab.tsx +133 -149
  17. package/corpus/core/src/client/agent-page/AgentEmptyState.tsx +44 -0
  18. package/corpus/core/src/client/agent-page/AgentJobsTab.tsx +153 -82
  19. package/corpus/core/src/client/agent-page/AgentTabFrame.tsx +39 -0
  20. package/corpus/core/src/client/agent-page/AgentTabsPage.tsx +368 -356
  21. package/corpus/core/src/client/agent-page/types.ts +1 -1
  22. package/corpus/core/src/client/analytics.ts +51 -5
  23. package/corpus/core/src/client/chat/run-recovery.tsx +12 -4
  24. package/corpus/core/src/client/composer/PromptComposer.tsx +5 -15
  25. package/corpus/core/src/client/composer/TiptapComposer.tsx +32 -3
  26. package/corpus/core/src/client/dynamic-suggestions.ts +3 -3
  27. package/corpus/core/src/client/index.ts +16 -1
  28. package/corpus/core/src/client/resources/ResourceTree.tsx +249 -38
  29. package/corpus/core/src/client/resources/ResourcesPanel.tsx +307 -140
  30. package/corpus/core/src/client/session-replay.ts +158 -5
  31. package/corpus/core/src/client/settings/AutomationsSection.tsx +30 -10
  32. package/corpus/core/src/client/settings/SettingsPanel.tsx +3 -2
  33. package/corpus/core/src/client/settings/SettingsTabsPage.tsx +2 -0
  34. package/corpus/core/src/client/settings/agent-settings-search.ts +2 -2
  35. package/corpus/core/src/client/use-chat-threads.ts +2 -0
  36. package/corpus/core/src/connections/catalog.ts +49 -7
  37. package/corpus/core/src/db/index.ts +6 -1
  38. package/corpus/core/src/deploy/build.ts +23 -0
  39. package/corpus/core/src/extensions/actions.ts +106 -16
  40. package/corpus/core/src/extensions/content-patch.ts +22 -0
  41. package/corpus/core/src/extensions/routes.ts +18 -0
  42. package/corpus/core/src/extensions/store.ts +8 -0
  43. package/corpus/core/src/index.ts +3 -0
  44. package/corpus/core/src/ingestion/docx.ts +158 -0
  45. package/corpus/core/src/ingestion/figma-node-to-html.ts +1860 -0
  46. package/corpus/core/src/ingestion/figma.ts +548 -0
  47. package/corpus/core/src/ingestion/index.ts +107 -0
  48. package/corpus/core/src/ingestion/media.ts +264 -0
  49. package/corpus/core/src/ingestion/notion.ts +121 -0
  50. package/corpus/core/src/ingestion/office.ts +214 -0
  51. package/corpus/core/src/ingestion/orchestration.ts +160 -0
  52. package/corpus/core/src/ingestion/pptx.ts +333 -0
  53. package/corpus/core/src/ingestion/selection.ts +81 -0
  54. package/corpus/core/src/ingestion/website.ts +151 -0
  55. package/corpus/core/src/integrations/plugin.ts +45 -37
  56. package/corpus/core/src/localization/default-messages.ts +35 -12
  57. package/corpus/core/src/observability/hosted-model-experiment.ts +118 -0
  58. package/corpus/core/src/observability/traces.ts +5 -3
  59. package/corpus/core/src/provider-api/index.ts +452 -8
  60. package/corpus/core/src/scripts/agent-engines/list-agent-engines.ts +18 -1
  61. package/corpus/core/src/search-utils/index.ts +112 -0
  62. package/corpus/core/src/secrets/register-framework-secrets.ts +61 -0
  63. package/corpus/core/src/server/action-discovery.ts +33 -8
  64. package/corpus/core/src/server/agent-chat/framework-prompts.ts +2 -2
  65. package/corpus/core/src/server/agent-chat/prompt-resources.ts +144 -0
  66. package/corpus/core/src/server/agent-chat-plugin.ts +6 -0
  67. package/corpus/core/src/server/core-routes-plugin.ts +12 -0
  68. package/corpus/core/src/server/index.ts +30 -0
  69. package/corpus/core/src/server/workspace-provider-oauth.ts +583 -0
  70. package/corpus/core/src/styles/agent-native.css +9 -0
  71. package/corpus/core/src/templates/default/app/i18n/en-US.ts +3 -3
  72. package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
  73. package/corpus/core/src/templates/workspace-root/.env.example +12 -0
  74. package/corpus/core/src/workspace-connections/index.ts +6 -0
  75. package/corpus/core/src/workspace-connections/lifecycle.ts +43 -0
  76. package/corpus/core/src/workspace-connections/store.ts +16 -0
  77. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +46 -3
  78. package/corpus/templates/analytics/AGENTS.md +9 -0
  79. package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +120 -6
  80. package/corpus/templates/analytics/actions/mutate-dashboard.ts +92 -30
  81. package/corpus/templates/analytics/actions/update-dashboard.ts +5 -5
  82. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +313 -220
  83. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +2 -2
  84. package/corpus/templates/analytics/app/components/layout/Layout.tsx +9 -6
  85. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +90 -64
  86. package/corpus/templates/analytics/app/i18n-data.ts +3 -3
  87. package/corpus/templates/analytics/app/lib/dashboard-list-loading.ts +25 -0
  88. package/corpus/templates/analytics/app/lib/item-popularity.ts +13 -4
  89. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/DashboardFilterBar.tsx +1 -1
  90. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/pivot.ts +8 -3
  91. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +1 -0
  92. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +15 -3
  93. package/corpus/templates/analytics/changelog/2026-07-16-dashboard-filter-defaults-can-now-be-changed-reliably-withou.md +6 -0
  94. package/corpus/templates/analytics/changelog/2026-07-16-dashboard-lists-load-in-one-stable-order-without-popping-bet.md +6 -0
  95. package/corpus/templates/analytics/changelog/2026-07-16-fixed-dashboard-filter-dropdown-text-alignment.md +6 -0
  96. package/corpus/templates/analytics/changelog/2026-07-16-recurring-signed-in-users-can-now-be-viewed-as-weekly-bars-b.md +6 -0
  97. package/corpus/templates/analytics/changelog/2026-07-16-the-analytics-agent-can-now-duplicate-a-chart-and-place-the-.md +6 -0
  98. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +41 -1
  99. package/corpus/templates/analytics/server/lib/dashboard-catalog.ts +1 -1
  100. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +47 -1
  101. package/corpus/templates/analytics/server/lib/session-replay.ts +68 -0
  102. package/corpus/templates/analytics/server/plugins/agent-chat.ts +1 -0
  103. package/corpus/templates/analytics/server/routes/sessions/lookup.get.ts +47 -0
  104. package/corpus/templates/assets/.agents/skills/asset-generation/SKILL.md +16 -9
  105. package/corpus/templates/assets/.agents/skills/creative-context/SKILL.md +86 -0
  106. package/corpus/templates/assets/AGENTS.md +10 -0
  107. package/corpus/templates/assets/actions/create-generation-session.ts +59 -1
  108. package/corpus/templates/assets/actions/edit-image.ts +2 -0
  109. package/corpus/templates/assets/actions/generate-asset.ts +52 -0
  110. package/corpus/templates/assets/actions/generate-image-batch.ts +55 -0
  111. package/corpus/templates/assets/actions/generate-image.ts +219 -1
  112. package/corpus/templates/assets/actions/open-asset-picker.ts +14 -0
  113. package/corpus/templates/assets/actions/refine-image.ts +3 -0
  114. package/corpus/templates/assets/actions/restyle-image.ts +2 -0
  115. package/corpus/templates/assets/agent-native.app-skill.json +4 -0
  116. package/corpus/templates/assets/app/components/layout/Layout.tsx +2 -0
  117. package/corpus/templates/assets/app/i18n/zh-TW.ts +3 -0
  118. package/corpus/templates/assets/app/i18n-data.ts +29 -13
  119. package/corpus/templates/assets/app/routes/agent.tsx +7 -1
  120. package/corpus/templates/assets/app/routes/library.tsx +9 -0
  121. package/corpus/templates/assets/app/routes/settings.tsx +3 -0
  122. package/corpus/templates/assets/changelog/2026-07-16-creative-context-library.md +6 -0
  123. package/corpus/templates/assets/package.json +1 -0
  124. package/corpus/templates/assets/server/lib/image-processing.ts +1 -22
  125. package/corpus/templates/assets/server/plugins/creative-context.ts +205 -0
  126. package/corpus/templates/brain/app/i18n-data.ts +3 -3
  127. package/corpus/templates/brain/app/lib/brain.ts +1 -1
  128. package/corpus/templates/brain/server/lib/search.ts +17 -67
  129. package/corpus/templates/calendar/app/i18n-data.ts +3 -3
  130. package/corpus/templates/calendar/app/pages/BookingLinksPage.tsx +19 -18
  131. package/corpus/templates/chat/app/i18n/en-US.ts +3 -3
  132. package/corpus/templates/chat/app/lib/agent-page.tsx +10 -1
  133. package/corpus/templates/clips/.agents/skills/meetings/SKILL.md +1 -1
  134. package/corpus/templates/clips/AGENTS.md +4 -0
  135. package/corpus/templates/clips/actions/cleanup-transcript.ts +35 -4
  136. package/corpus/templates/clips/actions/create-meeting.ts +6 -2
  137. package/corpus/templates/clips/actions/create-organization.ts +3 -2
  138. package/corpus/templates/clips/actions/create-recording.ts +4 -1
  139. package/corpus/templates/clips/actions/finalize-recording.ts +44 -7
  140. package/corpus/templates/clips/actions/import-loom-recording.ts +4 -1
  141. package/corpus/templates/clips/actions/lib/create-recording-schema.ts +2 -2
  142. package/corpus/templates/clips/actions/list-meetings.ts +23 -5
  143. package/corpus/templates/clips/actions/list-organization-state.ts +1 -1
  144. package/corpus/templates/clips/actions/remove-silences.ts +10 -1
  145. package/corpus/templates/clips/actions/request-transcript.ts +53 -11
  146. package/corpus/templates/clips/actions/search-recordings-utils.ts +7 -0
  147. package/corpus/templates/clips/actions/search-recordings.ts +5 -8
  148. package/corpus/templates/clips/actions/set-organization-branding.ts +2 -2
  149. package/corpus/templates/clips/actions/stitch-recordings.ts +10 -5
  150. package/corpus/templates/clips/actions/update-ai-request-status.ts +38 -0
  151. package/corpus/templates/clips/app/components/editor/editor-layout.tsx +3 -4
  152. package/corpus/templates/clips/app/components/editor/editor-selection.ts +19 -0
  153. package/corpus/templates/clips/app/components/editor/stitch-manager.tsx +10 -10
  154. package/corpus/templates/clips/app/components/library/bulk-action-toolbar.tsx +1 -2
  155. package/corpus/templates/clips/app/components/library/library-grid.tsx +101 -93
  156. package/corpus/templates/clips/app/components/player/video-player.tsx +11 -0
  157. package/corpus/templates/clips/app/components/workspace/branding-editor.tsx +53 -1
  158. package/corpus/templates/clips/app/i18n/ar-SA.ts +7 -1
  159. package/corpus/templates/clips/app/i18n/de-DE.ts +7 -1
  160. package/corpus/templates/clips/app/i18n/en-US.ts +10 -4
  161. package/corpus/templates/clips/app/i18n/es-ES.ts +7 -1
  162. package/corpus/templates/clips/app/i18n/fr-FR.ts +7 -1
  163. package/corpus/templates/clips/app/i18n/hi-IN.ts +7 -1
  164. package/corpus/templates/clips/app/i18n/ja-JP.ts +7 -1
  165. package/corpus/templates/clips/app/i18n/ko-KR.ts +7 -1
  166. package/corpus/templates/clips/app/i18n/pt-BR.ts +7 -1
  167. package/corpus/templates/clips/app/i18n/zh-CN.ts +6 -1
  168. package/corpus/templates/clips/app/i18n/zh-TW.ts +6 -1
  169. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +5 -9
  170. package/corpus/templates/clips/app/routes/_app.settings.organization.tsx +6 -2
  171. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +129 -27
  172. package/corpus/templates/clips/app/routes/record.tsx +23 -2
  173. package/corpus/templates/clips/app/routes/share.$shareId.tsx +6 -2
  174. package/corpus/templates/clips/app/routes.ts +3 -1
  175. package/corpus/templates/clips/changelog/2026-07-16-authorized-viewers-can-open-shared-private-clips-without-a-m.md +6 -0
  176. package/corpus/templates/clips/changelog/2026-07-16-camera-bubble-hover-controls-appear-above-the-face.md +6 -0
  177. package/corpus/templates/clips/changelog/2026-07-16-chrome-extension-recovers-stale-recorder-state.md +6 -0
  178. package/corpus/templates/clips/changelog/2026-07-16-clips-agent-chat-no-longer-shows-a-separate-workspace-header.md +6 -0
  179. package/corpus/templates/clips/changelog/2026-07-16-clips-search-now-matches-recording-content-without-requiring.md +6 -0
  180. package/corpus/templates/clips/changelog/2026-07-16-declined-meetings-no-longer-show-desktop-reminders.md +6 -0
  181. package/corpus/templates/clips/changelog/2026-07-16-failed-desktop-saves-now-show-their-local-recovery-copy.md +6 -0
  182. package/corpus/templates/clips/changelog/2026-07-16-long-desktop-clips-now-preserve-complete-playback-synced-aud.md +6 -0
  183. package/corpus/templates/clips/changelog/2026-07-16-long-recording-lists-keep-stitch-and-library-actions-visible.md +6 -0
  184. package/corpus/templates/clips/changelog/2026-07-16-organization-admins-can-choose-new-recording-visibility.md +6 -0
  185. package/corpus/templates/clips/changelog/2026-07-16-remove-silences-now-shows-queued-active-completed-and-failed.md +6 -0
  186. package/corpus/templates/clips/changelog/2026-07-16-settings-no-longer-repeats-the-builder-connection-status-in-.md +6 -0
  187. package/corpus/templates/clips/changelog/2026-07-16-transcripts-now-appear-from-native-browser-speech-sooner-wit.md +6 -0
  188. package/corpus/templates/clips/chrome-extension/public/manifest.json +1 -1
  189. package/corpus/templates/clips/chrome-extension/src/background.ts +73 -1
  190. package/corpus/templates/clips/chrome-extension/src/native-recording-state.ts +32 -0
  191. package/corpus/templates/clips/chrome-extension/src/native-transcription.ts +248 -0
  192. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +106 -0
  193. package/corpus/templates/clips/desktop/src/app.tsx +66 -28
  194. package/corpus/templates/clips/desktop/src/lib/recorder.ts +335 -285
  195. package/corpus/templates/clips/desktop/src/lib/single-flight.ts +7 -0
  196. package/corpus/templates/clips/desktop/src/lib/upload-verification.ts +51 -0
  197. package/corpus/templates/clips/desktop/src/overlays/bubble.tsx +2 -2
  198. package/corpus/templates/clips/desktop/src/overlays/finalizing.tsx +10 -2
  199. package/corpus/templates/clips/desktop/src/styles.css +13 -11
  200. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +8 -9
  201. package/corpus/templates/clips/desktop/src-tauri/src/meetings_watcher.rs +1 -0
  202. package/corpus/templates/clips/desktop/src-tauri/src/native_screen/custom_capture.rs +88 -13
  203. package/corpus/templates/clips/desktop/src-tauri/src/native_screen/live_upload.rs +13 -2
  204. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +241 -6
  205. package/corpus/templates/clips/server/db/schema.ts +2 -2
  206. package/corpus/templates/clips/server/lib/builder-media-compression.ts +64 -67
  207. package/corpus/templates/clips/server/lib/calendar-event-classification.ts +19 -0
  208. package/corpus/templates/clips/server/lib/google-calendar-client.ts +1 -0
  209. package/corpus/templates/clips/server/lib/recordings.ts +40 -1
  210. package/corpus/templates/clips/server/plugins/agent-chat.ts +1 -0
  211. package/corpus/templates/clips/server/plugins/db.ts +2 -2
  212. package/corpus/templates/clips/server/routes/api/auth/google-calendar.get.ts +1 -1
  213. package/corpus/templates/clips/server/routes/api/public-recording.get.ts +14 -5
  214. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +51 -1
  215. package/corpus/templates/clips/server/routes/api/video/[recordingId].get.ts +1 -64
  216. package/corpus/templates/clips/shared/media-worker-contract.ts +32 -15
  217. package/corpus/templates/content/.agents/skills/content/SKILL.md +16 -0
  218. package/corpus/templates/content/.agents/skills/creative-context/SKILL.md +85 -0
  219. package/corpus/templates/content/.agents/skills/notion-integration/SKILL.md +8 -0
  220. package/corpus/templates/content/AGENTS.md +9 -0
  221. package/corpus/templates/content/actions/create-document.ts +94 -0
  222. package/corpus/templates/content/actions/edit-document.ts +144 -4
  223. package/corpus/templates/content/actions/update-document.ts +138 -0
  224. package/corpus/templates/content/agent-native.app-skill.json +4 -0
  225. package/corpus/templates/content/app/components/layout/Layout.tsx +2 -0
  226. package/corpus/templates/content/app/i18n/zh-TW.ts +3 -0
  227. package/corpus/templates/content/app/i18n-data.ts +13 -4
  228. package/corpus/templates/content/app/routes/_app.agent.tsx +2 -1
  229. package/corpus/templates/content/app/routes/_app.settings.tsx +3 -0
  230. package/corpus/templates/content/changelog/2026-07-16-creative-context-library.md +6 -0
  231. package/corpus/templates/content/package.json +1 -0
  232. package/corpus/templates/content/server/plugins/creative-context.ts +31 -0
  233. package/corpus/templates/design/.agents/skills/creative-context/SKILL.md +116 -0
  234. package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +16 -0
  235. package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +8 -0
  236. package/corpus/templates/design/AGENTS.md +6 -0
  237. package/corpus/templates/design/actions/clone-creative-context-design.ts +176 -0
  238. package/corpus/templates/design/actions/edit-design.ts +128 -0
  239. package/corpus/templates/design/actions/generate-design.ts +278 -14
  240. package/corpus/templates/design/actions/generate-screens.ts +42 -1
  241. package/corpus/templates/design/agent-native.app-skill.json +4 -0
  242. package/corpus/templates/design/app/components/layout/Layout.tsx +7 -3
  243. package/corpus/templates/design/app/i18n/zh-TW.ts +3 -0
  244. package/corpus/templates/design/app/i18n-data.ts +10 -4
  245. package/corpus/templates/design/app/routes/agent.tsx +2 -1
  246. package/corpus/templates/design/app/routes/settings.tsx +3 -0
  247. package/corpus/templates/design/changelog/2026-07-16-creative-context-library.md +6 -0
  248. package/corpus/templates/design/changelog/2026-07-16-design-agent-chat-no-longer-shows-a-separate-workspace-header.md +6 -0
  249. package/corpus/templates/design/package.json +1 -0
  250. package/corpus/templates/design/server/lib/figma-design-context.ts +5 -335
  251. package/corpus/templates/design/server/lib/figma-node-to-html.ts +1 -1859
  252. package/corpus/templates/design/server/lib/import-design-files.ts +6 -8
  253. package/corpus/templates/design/server/plugins/creative-context.ts +31 -0
  254. package/corpus/templates/design/shared/generation-session.ts +7 -0
  255. package/corpus/templates/dispatch/app/i18n-data.ts +3 -3
  256. package/corpus/templates/forms/app/i18n/en-US.ts +3 -3
  257. package/corpus/templates/macros/app/i18n/en-US.ts +3 -3
  258. package/corpus/templates/mail/app/components/email/EmailThread.tsx +35 -5
  259. package/corpus/templates/mail/app/i18n/en-US.ts +3 -3
  260. package/corpus/templates/mail/changelog/2026-07-16-mail-previews-now-expand-to-show-the-full-message-without-an.md +6 -0
  261. package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +30 -11
  262. package/corpus/templates/plan/AGENTS.md +21 -1
  263. package/corpus/templates/plan/actions/get-visual-plan.ts +1 -1
  264. package/corpus/templates/plan/actions/patch-visual-plan-source.ts +161 -0
  265. package/corpus/templates/plan/actions/read-visual-plan-source.ts +1 -1
  266. package/corpus/templates/plan/actions/update-visual-plan.ts +126 -10
  267. package/corpus/templates/plan/app/hooks/use-plans.ts +2 -0
  268. package/corpus/templates/plan/app/i18n/en-US.ts +3 -3
  269. package/corpus/templates/plan/app/pages/PlansPage.tsx +65 -62
  270. package/corpus/templates/plan/changelog/2026-07-16-local-plan-previews-now-load-annotations-containing-html-lik.md +6 -0
  271. package/corpus/templates/plan/changelog/2026-07-16-plan-agents-now-prevent-stale-edits-from-overwriting-newer-p.md +6 -0
  272. package/corpus/templates/plan/server/plan-mdx.ts +75 -2
  273. package/corpus/templates/slides/.agents/skills/create-deck/SKILL.md +21 -4
  274. package/corpus/templates/slides/.agents/skills/creative-context/SKILL.md +122 -0
  275. package/corpus/templates/slides/.agents/skills/design-systems/SKILL.md +11 -0
  276. package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +12 -3
  277. package/corpus/templates/slides/AGENTS.md +6 -0
  278. package/corpus/templates/slides/actions/add-slide.ts +230 -14
  279. package/corpus/templates/slides/actions/clone-context-slide.ts +302 -0
  280. package/corpus/templates/slides/actions/create-deck.ts +130 -0
  281. package/corpus/templates/slides/actions/extract-pdf.ts +6 -2
  282. package/corpus/templates/slides/actions/import-file.ts +5 -4
  283. package/corpus/templates/slides/actions/patch-deck.ts +200 -10
  284. package/corpus/templates/slides/actions/update-slide.ts +208 -15
  285. package/corpus/templates/slides/app/components/layout/Layout.tsx +2 -0
  286. package/corpus/templates/slides/app/components/visual-editor/CanvasCommentPins.tsx +16 -1
  287. package/corpus/templates/slides/app/i18n/ar-SA.ts +3 -0
  288. package/corpus/templates/slides/app/i18n/de-DE.ts +3 -0
  289. package/corpus/templates/slides/app/i18n/en-US.ts +6 -3
  290. package/corpus/templates/slides/app/i18n/es-ES.ts +3 -0
  291. package/corpus/templates/slides/app/i18n/fr-FR.ts +3 -0
  292. package/corpus/templates/slides/app/i18n/hi-IN.ts +3 -0
  293. package/corpus/templates/slides/app/i18n/ja-JP.ts +3 -0
  294. package/corpus/templates/slides/app/i18n/ko-KR.ts +3 -0
  295. package/corpus/templates/slides/app/i18n/pt-BR.ts +3 -0
  296. package/corpus/templates/slides/app/i18n/zh-CN.ts +3 -0
  297. package/corpus/templates/slides/app/i18n/zh-TW.ts +3 -0
  298. package/corpus/templates/slides/app/lib/validate-native-slide-html.ts +176 -0
  299. package/corpus/templates/slides/app/routes/agent.tsx +7 -1
  300. package/corpus/templates/slides/app/routes/settings.tsx +3 -0
  301. package/corpus/templates/slides/changelog/2026-07-16-creative-context-library.md +6 -0
  302. package/corpus/templates/slides/changelog/2026-07-16-google-slides-native-cloning.md +6 -0
  303. package/corpus/templates/slides/package.json +1 -0
  304. package/corpus/templates/slides/server/handlers/import/docx-parser.ts +4 -85
  305. package/corpus/templates/slides/server/handlers/import/pptx-parser.ts +7 -421
  306. package/corpus/templates/slides/server/plugins/creative-context.ts +166 -0
  307. package/dist/agent/engine/credential-errors.d.ts +1 -1
  308. package/dist/agent/engine/credential-errors.d.ts.map +1 -1
  309. package/dist/agent/engine/credential-errors.js +2 -2
  310. package/dist/agent/engine/credential-errors.js.map +1 -1
  311. package/dist/agent/production-agent.d.ts.map +1 -1
  312. package/dist/agent/production-agent.js +25 -0
  313. package/dist/agent/production-agent.js.map +1 -1
  314. package/dist/agent/run-store.d.ts.map +1 -1
  315. package/dist/agent/run-store.js +12 -2
  316. package/dist/agent/run-store.js.map +1 -1
  317. package/dist/cli/create.d.ts.map +1 -1
  318. package/dist/cli/create.js +1 -0
  319. package/dist/cli/create.js.map +1 -1
  320. package/dist/cli/skills-content/visual-plan-skill.d.ts +1 -1
  321. package/dist/cli/skills-content/visual-plan-skill.d.ts.map +1 -1
  322. package/dist/cli/skills-content/visual-plan-skill.js +30 -11
  323. package/dist/cli/skills-content/visual-plan-skill.js.map +1 -1
  324. package/dist/cli/templates-meta.d.ts.map +1 -1
  325. package/dist/cli/templates-meta.js +4 -3
  326. package/dist/cli/templates-meta.js.map +1 -1
  327. package/dist/client/AgentAskPopover.d.ts +11 -0
  328. package/dist/client/AgentAskPopover.d.ts.map +1 -0
  329. package/dist/client/AgentAskPopover.js +30 -0
  330. package/dist/client/AgentAskPopover.js.map +1 -0
  331. package/dist/client/AgentChatHome.d.ts +1 -1
  332. package/dist/client/AgentChatHome.d.ts.map +1 -1
  333. package/dist/client/AgentChatHome.js +2 -2
  334. package/dist/client/AgentChatHome.js.map +1 -1
  335. package/dist/client/AgentPanel.d.ts +9 -19
  336. package/dist/client/AgentPanel.d.ts.map +1 -1
  337. package/dist/client/AgentPanel.js +119 -80
  338. package/dist/client/AgentPanel.js.map +1 -1
  339. package/dist/client/AssistantChat.d.ts.map +1 -1
  340. package/dist/client/AssistantChat.js +4 -4
  341. package/dist/client/AssistantChat.js.map +1 -1
  342. package/dist/client/MultiTabAssistantChat.d.ts +3 -9
  343. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  344. package/dist/client/MultiTabAssistantChat.js +49 -189
  345. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  346. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  347. package/dist/client/agent-chat-adapter.js +12 -1
  348. package/dist/client/agent-chat-adapter.js.map +1 -1
  349. package/dist/client/agent-page/AgentContextTab.d.ts.map +1 -1
  350. package/dist/client/agent-page/AgentContextTab.js +26 -28
  351. package/dist/client/agent-page/AgentContextTab.js.map +1 -1
  352. package/dist/client/agent-page/AgentEmptyState.d.ts +13 -0
  353. package/dist/client/agent-page/AgentEmptyState.d.ts.map +1 -0
  354. package/dist/client/agent-page/AgentEmptyState.js +6 -0
  355. package/dist/client/agent-page/AgentEmptyState.js.map +1 -0
  356. package/dist/client/agent-page/AgentJobsTab.d.ts +1 -1
  357. package/dist/client/agent-page/AgentJobsTab.d.ts.map +1 -1
  358. package/dist/client/agent-page/AgentJobsTab.js +90 -58
  359. package/dist/client/agent-page/AgentJobsTab.js.map +1 -1
  360. package/dist/client/agent-page/AgentTabFrame.d.ts +12 -0
  361. package/dist/client/agent-page/AgentTabFrame.d.ts.map +1 -0
  362. package/dist/client/agent-page/AgentTabFrame.js +7 -0
  363. package/dist/client/agent-page/AgentTabFrame.js.map +1 -0
  364. package/dist/client/agent-page/AgentTabsPage.d.ts +9 -1
  365. package/dist/client/agent-page/AgentTabsPage.d.ts.map +1 -1
  366. package/dist/client/agent-page/AgentTabsPage.js +135 -99
  367. package/dist/client/agent-page/AgentTabsPage.js.map +1 -1
  368. package/dist/client/agent-page/types.d.ts +1 -1
  369. package/dist/client/agent-page/types.d.ts.map +1 -1
  370. package/dist/client/agent-page/types.js.map +1 -1
  371. package/dist/client/analytics.d.ts +10 -3
  372. package/dist/client/analytics.d.ts.map +1 -1
  373. package/dist/client/analytics.js +37 -2
  374. package/dist/client/analytics.js.map +1 -1
  375. package/dist/client/chat/run-recovery.d.ts.map +1 -1
  376. package/dist/client/chat/run-recovery.js +10 -3
  377. package/dist/client/chat/run-recovery.js.map +1 -1
  378. package/dist/client/composer/PromptComposer.d.ts.map +1 -1
  379. package/dist/client/composer/PromptComposer.js +2 -2
  380. package/dist/client/composer/PromptComposer.js.map +1 -1
  381. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  382. package/dist/client/composer/TiptapComposer.js +15 -3
  383. package/dist/client/composer/TiptapComposer.js.map +1 -1
  384. package/dist/client/dynamic-suggestions.js +3 -3
  385. package/dist/client/dynamic-suggestions.js.map +1 -1
  386. package/dist/client/index.d.ts +4 -3
  387. package/dist/client/index.d.ts.map +1 -1
  388. package/dist/client/index.js +3 -2
  389. package/dist/client/index.js.map +1 -1
  390. package/dist/client/resources/ResourceTree.d.ts +5 -1
  391. package/dist/client/resources/ResourceTree.d.ts.map +1 -1
  392. package/dist/client/resources/ResourceTree.js +74 -5
  393. package/dist/client/resources/ResourceTree.js.map +1 -1
  394. package/dist/client/resources/ResourcesPanel.d.ts +11 -2
  395. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  396. package/dist/client/resources/ResourcesPanel.js +105 -31
  397. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  398. package/dist/client/session-replay.d.ts +28 -0
  399. package/dist/client/session-replay.d.ts.map +1 -1
  400. package/dist/client/session-replay.js +122 -8
  401. package/dist/client/session-replay.js.map +1 -1
  402. package/dist/client/settings/AutomationsSection.d.ts +3 -1
  403. package/dist/client/settings/AutomationsSection.d.ts.map +1 -1
  404. package/dist/client/settings/AutomationsSection.js +16 -6
  405. package/dist/client/settings/AutomationsSection.js.map +1 -1
  406. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  407. package/dist/client/settings/SettingsPanel.js +3 -3
  408. package/dist/client/settings/SettingsPanel.js.map +1 -1
  409. package/dist/client/settings/SettingsTabsPage.d.ts +2 -0
  410. package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
  411. package/dist/client/settings/SettingsTabsPage.js.map +1 -1
  412. package/dist/client/settings/agent-settings-search.js +2 -2
  413. package/dist/client/settings/agent-settings-search.js.map +1 -1
  414. package/dist/client/use-chat-threads.d.ts +2 -0
  415. package/dist/client/use-chat-threads.d.ts.map +1 -1
  416. package/dist/client/use-chat-threads.js.map +1 -1
  417. package/dist/connections/catalog.d.ts +41 -7
  418. package/dist/connections/catalog.d.ts.map +1 -1
  419. package/dist/connections/catalog.js +40 -7
  420. package/dist/connections/catalog.js.map +1 -1
  421. package/dist/db/index.d.ts +2 -2
  422. package/dist/db/index.d.ts.map +1 -1
  423. package/dist/db/index.js +2 -2
  424. package/dist/db/index.js.map +1 -1
  425. package/dist/deploy/build.d.ts.map +1 -1
  426. package/dist/deploy/build.js +17 -0
  427. package/dist/deploy/build.js.map +1 -1
  428. package/dist/extensions/actions.d.ts.map +1 -1
  429. package/dist/extensions/actions.js +85 -15
  430. package/dist/extensions/actions.js.map +1 -1
  431. package/dist/extensions/content-patch.d.ts +4 -0
  432. package/dist/extensions/content-patch.d.ts.map +1 -1
  433. package/dist/extensions/content-patch.js +18 -0
  434. package/dist/extensions/content-patch.js.map +1 -1
  435. package/dist/extensions/routes.d.ts.map +1 -1
  436. package/dist/extensions/routes.js +14 -0
  437. package/dist/extensions/routes.js.map +1 -1
  438. package/dist/extensions/store.d.ts +1 -0
  439. package/dist/extensions/store.d.ts.map +1 -1
  440. package/dist/extensions/store.js +4 -1
  441. package/dist/extensions/store.js.map +1 -1
  442. package/dist/index.d.ts +1 -1
  443. package/dist/index.d.ts.map +1 -1
  444. package/dist/index.js +1 -1
  445. package/dist/index.js.map +1 -1
  446. package/dist/ingestion/docx.d.ts +16 -0
  447. package/dist/ingestion/docx.d.ts.map +1 -0
  448. package/dist/ingestion/docx.js +129 -0
  449. package/dist/ingestion/docx.js.map +1 -0
  450. package/dist/ingestion/figma-node-to-html.d.ts +304 -0
  451. package/dist/ingestion/figma-node-to-html.d.ts.map +1 -0
  452. package/dist/ingestion/figma-node-to-html.js +1292 -0
  453. package/dist/ingestion/figma-node-to-html.js.map +1 -0
  454. package/dist/ingestion/figma.d.ts +115 -0
  455. package/dist/ingestion/figma.d.ts.map +1 -0
  456. package/dist/ingestion/figma.js +399 -0
  457. package/dist/ingestion/figma.js.map +1 -0
  458. package/dist/ingestion/index.d.ts +11 -0
  459. package/dist/ingestion/index.d.ts.map +1 -0
  460. package/dist/ingestion/index.js +11 -0
  461. package/dist/ingestion/index.js.map +1 -0
  462. package/dist/ingestion/media.d.ts +36 -0
  463. package/dist/ingestion/media.d.ts.map +1 -0
  464. package/dist/ingestion/media.js +178 -0
  465. package/dist/ingestion/media.js.map +1 -0
  466. package/dist/ingestion/notion.d.ts +12 -0
  467. package/dist/ingestion/notion.d.ts.map +1 -0
  468. package/dist/ingestion/notion.js +104 -0
  469. package/dist/ingestion/notion.js.map +1 -0
  470. package/dist/ingestion/office.d.ts +45 -0
  471. package/dist/ingestion/office.d.ts.map +1 -0
  472. package/dist/ingestion/office.js +141 -0
  473. package/dist/ingestion/office.js.map +1 -0
  474. package/dist/ingestion/orchestration.d.ts +52 -0
  475. package/dist/ingestion/orchestration.d.ts.map +1 -0
  476. package/dist/ingestion/orchestration.js +89 -0
  477. package/dist/ingestion/orchestration.js.map +1 -0
  478. package/dist/ingestion/pptx.d.ts +28 -0
  479. package/dist/ingestion/pptx.d.ts.map +1 -0
  480. package/dist/ingestion/pptx.js +255 -0
  481. package/dist/ingestion/pptx.js.map +1 -0
  482. package/dist/ingestion/selection.d.ts +20 -0
  483. package/dist/ingestion/selection.d.ts.map +1 -0
  484. package/dist/ingestion/selection.js +52 -0
  485. package/dist/ingestion/selection.js.map +1 -0
  486. package/dist/ingestion/website.d.ts +27 -0
  487. package/dist/ingestion/website.d.ts.map +1 -0
  488. package/dist/ingestion/website.js +100 -0
  489. package/dist/ingestion/website.js.map +1 -0
  490. package/dist/integrations/plugin.d.ts.map +1 -1
  491. package/dist/integrations/plugin.js +32 -27
  492. package/dist/integrations/plugin.js.map +1 -1
  493. package/dist/localization/default-messages.d.ts +22 -0
  494. package/dist/localization/default-messages.d.ts.map +1 -1
  495. package/dist/localization/default-messages.js +31 -9
  496. package/dist/localization/default-messages.js.map +1 -1
  497. package/dist/notifications/routes.d.ts +2 -2
  498. package/dist/observability/hosted-model-experiment.d.ts +39 -0
  499. package/dist/observability/hosted-model-experiment.d.ts.map +1 -0
  500. package/dist/observability/hosted-model-experiment.js +90 -0
  501. package/dist/observability/hosted-model-experiment.js.map +1 -0
  502. package/dist/observability/routes.d.ts +5 -5
  503. package/dist/observability/traces.d.ts.map +1 -1
  504. package/dist/observability/traces.js +5 -3
  505. package/dist/observability/traces.js.map +1 -1
  506. package/dist/provider-api/index.d.ts +35 -4
  507. package/dist/provider-api/index.d.ts.map +1 -1
  508. package/dist/provider-api/index.js +339 -8
  509. package/dist/provider-api/index.js.map +1 -1
  510. package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
  511. package/dist/scripts/agent-engines/list-agent-engines.js +18 -1
  512. package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
  513. package/dist/search-utils/index.d.ts +12 -0
  514. package/dist/search-utils/index.d.ts.map +1 -0
  515. package/dist/search-utils/index.js +95 -0
  516. package/dist/search-utils/index.js.map +1 -0
  517. package/dist/secrets/register-framework-secrets.d.ts.map +1 -1
  518. package/dist/secrets/register-framework-secrets.js +57 -0
  519. package/dist/secrets/register-framework-secrets.js.map +1 -1
  520. package/dist/secrets/routes.d.ts +9 -9
  521. package/dist/server/action-discovery.d.ts +8 -0
  522. package/dist/server/action-discovery.d.ts.map +1 -1
  523. package/dist/server/action-discovery.js +26 -9
  524. package/dist/server/action-discovery.js.map +1 -1
  525. package/dist/server/agent-chat/framework-prompts.js +2 -2
  526. package/dist/server/agent-chat/framework-prompts.js.map +1 -1
  527. package/dist/server/agent-chat/prompt-resources.d.ts +19 -0
  528. package/dist/server/agent-chat/prompt-resources.d.ts.map +1 -1
  529. package/dist/server/agent-chat/prompt-resources.js +95 -0
  530. package/dist/server/agent-chat/prompt-resources.js.map +1 -1
  531. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  532. package/dist/server/agent-chat-plugin.js +7 -0
  533. package/dist/server/agent-chat-plugin.js.map +1 -1
  534. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  535. package/dist/server/core-routes-plugin.js +5 -0
  536. package/dist/server/core-routes-plugin.js.map +1 -1
  537. package/dist/server/index.d.ts +5 -1
  538. package/dist/server/index.d.ts.map +1 -1
  539. package/dist/server/index.js +5 -1
  540. package/dist/server/index.js.map +1 -1
  541. package/dist/server/workspace-provider-oauth.d.ts +48 -0
  542. package/dist/server/workspace-provider-oauth.d.ts.map +1 -0
  543. package/dist/server/workspace-provider-oauth.js +415 -0
  544. package/dist/server/workspace-provider-oauth.js.map +1 -0
  545. package/dist/styles/agent-native.css +9 -0
  546. package/dist/templates/chat/app/i18n/en-US.ts +3 -3
  547. package/dist/templates/chat/app/lib/agent-page.tsx +10 -1
  548. package/dist/templates/default/app/i18n/en-US.ts +3 -3
  549. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
  550. package/dist/templates/workspace-root/.env.example +12 -0
  551. package/dist/workspace-connections/index.d.ts +1 -0
  552. package/dist/workspace-connections/index.d.ts.map +1 -1
  553. package/dist/workspace-connections/index.js +1 -0
  554. package/dist/workspace-connections/index.js.map +1 -1
  555. package/dist/workspace-connections/lifecycle.d.ts +16 -0
  556. package/dist/workspace-connections/lifecycle.d.ts.map +1 -0
  557. package/dist/workspace-connections/lifecycle.js +14 -0
  558. package/dist/workspace-connections/lifecycle.js.map +1 -0
  559. package/dist/workspace-connections/store.d.ts.map +1 -1
  560. package/dist/workspace-connections/store.js +16 -0
  561. package/dist/workspace-connections/store.js.map +1 -1
  562. package/package.json +10 -3
  563. package/src/templates/chat/app/i18n/en-US.ts +3 -3
  564. package/src/templates/chat/app/lib/agent-page.spec.tsx +10 -1
  565. package/src/templates/chat/app/lib/agent-page.tsx +10 -1
  566. package/src/templates/default/app/i18n/en-US.ts +3 -3
  567. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
  568. package/src/templates/workspace-root/.env.example +12 -0
@@ -5145,13 +5145,11 @@ const AssistantChatInner = forwardRef<
5145
5145
  "agent-empty-state",
5146
5146
  emptyStateDisplay === "hidden"
5147
5147
  ? "sr-only"
5148
- : "flex h-full flex-col items-center justify-center gap-4 px-4 py-16",
5148
+ : "flex h-full flex-col items-center justify-center gap-3 px-4 py-16",
5149
5149
  )}
5150
5150
  aria-busy="true"
5151
5151
  >
5152
- <div className="flex h-10 w-10 items-center justify-center rounded-full bg-muted">
5153
- <IconMessage className="h-5 w-5 text-muted-foreground" />
5154
- </div>
5152
+ <IconMessage className="h-5 w-5 text-muted-foreground/60" />
5155
5153
  <p className="sr-only">
5156
5154
  {emptyStateText ?? "Loading chat..."}
5157
5155
  </p>
@@ -5173,19 +5171,17 @@ const AssistantChatInner = forwardRef<
5173
5171
  "agent-empty-state",
5174
5172
  emptyStateDisplay === "hidden"
5175
5173
  ? "sr-only"
5176
- : "flex h-full flex-col items-center justify-center gap-4 px-4 py-16",
5174
+ : "flex h-full flex-col items-center justify-center gap-3 px-4 py-16",
5177
5175
  )}
5178
5176
  >
5179
- <div className="flex h-10 w-10 items-center justify-center rounded-full bg-muted">
5180
- <IconMessage className="h-5 w-5 text-muted-foreground" />
5181
- </div>
5177
+ <IconMessage className="h-5 w-5 text-muted-foreground/60" />
5182
5178
  <p className="sr-only">
5183
5179
  {emptyStateText ?? "How can I help you?"}
5184
5180
  </p>
5185
5181
  {emptyStateAddon}
5186
5182
  {resolvedSuggestions &&
5187
5183
  resolvedSuggestions.length > 0 ? (
5188
- <div className="flex flex-col gap-1.5 w-full max-w-[280px]">
5184
+ <div className="flex w-full max-w-[280px] flex-col gap-1">
5189
5185
  {resolvedSuggestions.map((suggestion) => (
5190
5186
  <button
5191
5187
  key={suggestion}
@@ -5196,7 +5192,7 @@ const AssistantChatInner = forwardRef<
5196
5192
  }
5197
5193
  void addToQueue(suggestion);
5198
5194
  }}
5199
- className="w-full rounded-lg border border-border px-3 py-2 text-start text-[13px] text-muted-foreground hover:bg-accent hover:text-foreground"
5195
+ className="w-full px-2 py-1 text-center text-[13px] text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2"
5200
5196
  >
5201
5197
  {suggestion}
5202
5198
  </button>
@@ -1,18 +1,5 @@
1
- import {
2
- IconX,
3
- IconPlus,
4
- IconHistory,
5
- IconLink,
6
- IconLinkOff,
7
- IconCheck,
8
- } from "@tabler/icons-react";
9
- import React, {
10
- useState,
11
- useRef,
12
- useEffect,
13
- useCallback,
14
- useMemo,
15
- } from "react";
1
+ import { IconPlus, IconHistory, IconX } from "@tabler/icons-react";
2
+ import React, { useState, useRef, useEffect, useCallback } from "react";
16
3
 
17
4
  import { DEFAULT_MODEL } from "../agent/default-model.js";
18
5
  import {
@@ -30,10 +17,13 @@ import {
30
17
  claimAgentChatSubmit,
31
18
  drainBufferedAgentChatOpenRequests,
32
19
  drainBufferedAgentChatSubmits,
20
+ getAgentChatContextState,
33
21
  isAgentChatSubmitCancelled,
34
22
  normalizeAgentChatContextItem,
35
23
  parseSubmitChatMessage,
24
+ removeAgentChatContextItem,
36
25
  reportAgentChatSubmitResult,
26
+ setAgentChatContextItem,
37
27
  type AgentChatContextItem,
38
28
  } from "./agent-chat.js";
39
29
  import { agentNativePath, appPath } from "./api-path.js";
@@ -55,7 +45,6 @@ import {
55
45
  Popover,
56
46
  PopoverAnchor,
57
47
  PopoverContent,
58
- PopoverTrigger,
59
48
  } from "./components/ui/popover.js";
60
49
  import {
61
50
  Tooltip,
@@ -228,153 +217,12 @@ function ChatSkeleton({
228
217
  );
229
218
  }
230
219
 
231
- // ─── Scope Badge ─────────────────────────────────────────────────────────────
220
+ // ─── Resource context ────────────────────────────────────────────────────────
232
221
 
233
222
  function formatScopeType(type: string) {
234
223
  return type.replace(/[-_]+/g, " ");
235
224
  }
236
225
 
237
- function indefiniteArticleFor(value: string) {
238
- return /^[aeiou]/i.test(value.trim()) ? "an" : "a";
239
- }
240
-
241
- function getScopeCopy(scope: ChatThreadScope, isCurrentScope: boolean) {
242
- const type = formatScopeType(scope.type);
243
- const fallbackObject = isCurrentScope
244
- ? `this ${type}`
245
- : `${indefiniteArticleFor(type)} ${type}`;
246
- const objectLabel = scope.label || fallbackObject;
247
- return {
248
- objectLabel,
249
- chipLabel:
250
- scope.label || (isCurrentScope ? `this ${type}` : `${type} context`),
251
- };
252
- }
253
-
254
- /**
255
- * Compact context tab above the composer. Click → popover with related chats
256
- * and the remove-context action. It stays attached to the chat field so scoped
257
- * context is visible right where the next message will be composed.
258
- */
259
- function ScopeBadge({
260
- scope,
261
- currentScope,
262
- onDetach,
263
- otherScopedThreads,
264
- activeThreadId,
265
- openTabIds,
266
- onSelectThread,
267
- }: {
268
- scope: ChatThreadScope;
269
- currentScope?: ChatThreadScope | null;
270
- onDetach: () => void;
271
- /** Other threads scoped to the same resource (excluding the active one),
272
- * pre-sorted most-recent-first. The chip popover lists these so the user
273
- * can hop between this resource's chats without opening the full history. */
274
- otherScopedThreads: ChatThreadSummary[];
275
- activeThreadId: string;
276
- openTabIds: Set<string>;
277
- onSelectThread: (id: string) => void;
278
- }) {
279
- const [open, setOpen] = useState(false);
280
- const isCurrentScope = Boolean(
281
- currentScope &&
282
- currentScope.type === scope.type &&
283
- currentScope.id === scope.id,
284
- );
285
- const hasDifferentCurrentScope = Boolean(currentScope && !isCurrentScope);
286
- const { objectLabel, chipLabel } = getScopeCopy(scope, isCurrentScope);
287
- const heading = `Using ${chipLabel}`;
288
- const detailSuffix = hasDifferentCurrentScope
289
- ? "Start a new chat to use the current page."
290
- : isCurrentScope
291
- ? "New chats here keep this context."
292
- : "Start a new chat for a general conversation.";
293
- const otherCount = otherScopedThreads.length;
294
- return (
295
- <div className="agent-scope-badge-wrapper relative z-[1] -mb-2 flex shrink-0 items-end justify-center px-3 pt-1 text-[11px] text-muted-foreground">
296
- <Popover open={open} onOpenChange={setOpen}>
297
- <PopoverTrigger asChild>
298
- <button
299
- type="button"
300
- className="inline-flex h-7 min-w-0 max-w-full cursor-pointer items-center gap-1.5 rounded-t-lg border border-b-0 border-input bg-background px-3 text-muted-foreground transition-colors hover:bg-accent hover:text-foreground sm:max-w-72"
301
- aria-label={heading}
302
- >
303
- <IconLink size={11} className="shrink-0 opacity-70" />
304
- <span className="min-w-0 truncate">{heading}</span>
305
- {otherCount > 0 && (
306
- <span
307
- className="ms-0.5 shrink-0 rounded-full bg-muted px-1.5 py-px text-[10px] leading-none text-muted-foreground"
308
- aria-label={`${otherCount} other chats for ${objectLabel}`}
309
- >
310
- +{otherCount}
311
- </span>
312
- )}
313
- </button>
314
- </PopoverTrigger>
315
- <PopoverContent align="center" side="top" className="w-72 p-0">
316
- <p className="px-3 pt-2 pb-1.5 text-[11px] text-muted-foreground">
317
- This chat can see{" "}
318
- <span className="text-foreground">{objectLabel}</span>.{" "}
319
- {detailSuffix}
320
- </p>
321
- {otherCount > 0 && (
322
- <div className="border-t border-border">
323
- <div className="px-3 pt-1.5 pb-1 text-[10px] uppercase tracking-wider text-muted-foreground/70">
324
- Chats for {objectLabel}
325
- </div>
326
- <div className="max-h-56 overflow-y-auto pb-1">
327
- {otherScopedThreads.map((thread) =>
328
- renderThreadRow(
329
- thread,
330
- activeThreadId,
331
- openTabIds,
332
- formatThreadTime,
333
- onSelectThread,
334
- () => setOpen(false),
335
- ),
336
- )}
337
- </div>
338
- </div>
339
- )}
340
- <div className="border-t border-border p-1">
341
- <button
342
- type="button"
343
- onClick={() => {
344
- setOpen(false);
345
- onDetach();
346
- }}
347
- className="flex w-full items-center gap-2 rounded px-2 py-1.5 text-xs text-foreground hover:bg-accent cursor-pointer"
348
- >
349
- <IconLinkOff size={13} />
350
- <span>Remove context</span>
351
- </button>
352
- </div>
353
- </PopoverContent>
354
- </Popover>
355
- </div>
356
- );
357
- }
358
-
359
- /**
360
- * Thin confirmation banner shown briefly after detach. The chip itself
361
- * unmounts the moment scope clears on the active thread, so this banner
362
- * holds the visual feedback long enough for the user to register what
363
- * just happened and learn where the chat went (History popover).
364
- */
365
- function DetachConfirmationBanner() {
366
- return (
367
- <div className="agent-scope-badge-wrapper relative z-[1] -mb-2 flex shrink-0 items-end justify-center px-3 pt-1 text-[11px] text-muted-foreground">
368
- <span className="inline-flex h-7 min-w-0 max-w-full items-center gap-1.5 rounded-t-lg border border-b-0 border-input bg-background px-3 text-foreground shadow-[0_-8px_24px_hsl(var(--background)/0.72)] sm:max-w-80">
369
- <IconCheck size={11} className="shrink-0 opacity-80" />
370
- <span className="min-w-0 truncate">
371
- Context removed. Find this chat in History.
372
- </span>
373
- </span>
374
- </div>
375
- );
376
- }
377
-
378
226
  // ─── History Popover ─────────────────────────────────────────────────────────
379
227
 
380
228
  function formatThreadTime(ts: number): string {
@@ -389,58 +237,10 @@ function formatThreadTime(ts: number): string {
389
237
  return d.toLocaleDateString([], { month: "short", day: "numeric" });
390
238
  }
391
239
 
392
- function renderThreadRow(
393
- thread: ChatThreadSummary,
394
- activeThreadId: string | null,
395
- openTabIds: Set<string>,
396
- formatTime: (ts: number) => string,
397
- onSelect: (id: string) => void,
398
- onClose: () => void,
399
- ) {
400
- const isActive = thread.id === activeThreadId;
401
- return (
402
- <button
403
- key={thread.id}
404
- onClick={() => {
405
- onSelect(thread.id);
406
- onClose();
407
- }}
408
- className={cn(
409
- "w-full px-3 py-2 text-start hover:bg-accent/50 cursor-pointer",
410
- isActive && "bg-accent/30",
411
- )}
412
- >
413
- <div className="flex items-baseline justify-between gap-2">
414
- <span className="text-xs font-medium text-foreground truncate">
415
- {thread.title || thread.preview || "Chat"}
416
- </span>
417
- <span className="text-[10px] text-muted-foreground shrink-0">
418
- {isActive
419
- ? "Active"
420
- : openTabIds.has(thread.id)
421
- ? "Open"
422
- : formatTime(thread.updatedAt)}
423
- </span>
424
- </div>
425
- {thread.preview && thread.title !== thread.preview && (
426
- <div className="text-[11px] text-muted-foreground truncate mt-0.5">
427
- {thread.preview}
428
- </div>
429
- )}
430
- {thread.scope?.label && (
431
- <div className="mt-0.5 text-[10px] text-muted-foreground/70 truncate">
432
- {thread.scope.label}
433
- </div>
434
- )}
435
- </button>
436
- );
437
- }
438
-
439
240
  function HistoryPopover({
440
241
  threads,
441
242
  openTabIds,
442
243
  activeThreadId,
443
- currentScope,
444
244
  hasMoreThreads = false,
445
245
  isLoadingMoreThreads = false,
446
246
  loadError,
@@ -454,7 +254,6 @@ function HistoryPopover({
454
254
  threads: ChatThreadSummary[];
455
255
  openTabIds: Set<string>;
456
256
  activeThreadId: string | null;
457
- currentScope?: ChatThreadScope | null;
458
257
  hasMoreThreads?: boolean;
459
258
  isLoadingMoreThreads?: boolean;
460
259
  loadError?: string | null;
@@ -531,26 +330,6 @@ function HistoryPopover({
531
330
  const pinnedThreads = filtered.filter((t) => t.pinnedAt != null);
532
331
  const unpinnedThreads = filtered.filter((t) => t.pinnedAt == null);
533
332
 
534
- // When scope is set we split (unpinned) history into two sections so the
535
- // user can see "this deck's chats" first without losing access to general /
536
- // other-deck chats. Section labels intentionally use the current
537
- // resource type (deck/design/dashboard) instead of a generic phrase.
538
- const sectionedThreads = currentScope
539
- ? {
540
- scoped: unpinnedThreads.filter(
541
- (t) =>
542
- t.scope?.type === currentScope.type &&
543
- t.scope?.id === currentScope.id,
544
- ),
545
- other: unpinnedThreads.filter(
546
- (t) =>
547
- !t.scope ||
548
- t.scope.type !== currentScope.type ||
549
- t.scope.id !== currentScope.id,
550
- ),
551
- }
552
- : null;
553
-
554
333
  const toHistoryItem = (thread: ChatThreadSummary): ChatHistoryItem => {
555
334
  const isActive = thread.id === activeThreadId;
556
335
  const title = thread.title || thread.preview || "Chat";
@@ -562,7 +341,6 @@ function HistoryPopover({
562
341
  thread.preview && thread.title !== thread.preview
563
342
  ? thread.preview
564
343
  : undefined,
565
- detail: thread.scope?.label || undefined,
566
344
  timestamp: isActive
567
345
  ? "Active"
568
346
  : openTabIds.has(thread.id)
@@ -582,20 +360,7 @@ function HistoryPopover({
582
360
  },
583
361
  ]
584
362
  : []),
585
- ...(sectionedThreads
586
- ? [
587
- {
588
- id: "scoped",
589
- label: `This ${currentScope!.type}`,
590
- items: sectionedThreads.scoped.map(toHistoryItem),
591
- },
592
- {
593
- id: "other",
594
- label: "All chats",
595
- items: sectionedThreads.other.map(toHistoryItem),
596
- },
597
- ]
598
- : [{ id: "all", items: unpinnedThreads.map(toHistoryItem) }]),
363
+ { id: "all", items: unpinnedThreads.map(toHistoryItem) },
599
364
  ];
600
365
 
601
366
  return (
@@ -954,15 +719,9 @@ export type MultiTabAssistantChatProps = Omit<
954
719
  * route params such as `/chat/:threadId`.
955
720
  */
956
721
  threadUrlSync?: boolean | ChatThreadUrlSyncOptions;
957
- /**
958
- * Bind new chats to a resource (deck, design, dashboard, etc.). When set,
959
- * new chats automatically inherit this scope and scoped chats tuck away when
960
- * the user leaves the resource. General chats remain visible across resource
961
- * navigation, and the user can detach a scoped chat via the scope chip above
962
- * the composer.
963
- */
722
+ /** Ambient resource context to show as a composer chip. */
964
723
  scope?: ChatThreadScope | null;
965
- /** Show the compact scope chip above the composer. Default: true. */
724
+ /** @deprecated Scope context is now rendered in the composer. */
966
725
  showScopeBadge?: boolean;
967
726
  };
968
727
 
@@ -977,7 +736,6 @@ export function MultiTabAssistantChat({
977
736
  browserTabId,
978
737
  threadUrlSync = false,
979
738
  scope = null,
980
- showScopeBadge = true,
981
739
  ...props
982
740
  }: MultiTabAssistantChatProps) {
983
741
  const {
@@ -1084,7 +842,6 @@ export function MultiTabAssistantChat({
1084
842
  isLoading,
1085
843
  createThread,
1086
844
  switchThread: switchThreadState,
1087
- detachThread,
1088
845
  forkThread,
1089
846
  saveThreadData,
1090
847
  generateTitle,
@@ -1097,7 +854,7 @@ export function MultiTabAssistantChat({
1097
854
  isNewThread,
1098
855
  pinThread,
1099
856
  renameThread,
1100
- } = useChatThreads(apiUrl, storageKey, scope, {
857
+ } = useChatThreads(apiUrl, storageKey, null, {
1101
858
  restoreActiveThread,
1102
859
  routeThreadId: threadUrlSyncEnabled ? urlThreadId : undefined,
1103
860
  });
@@ -1370,11 +1127,7 @@ export function MultiTabAssistantChat({
1370
1127
  }, [subAgentNames, SUB_AGENT_NAMES_KEY]);
1371
1128
 
1372
1129
  // Open tabs — persisted to localStorage so they survive refresh.
1373
- // Per-scope: when scope changes (e.g. user navigates from Deck A to Deck
1374
- // B), the tab bar reflects whichever tabs they had open for *that*
1375
- // resource. We do not bleed deck A's tabs into deck B's view.
1376
- const scopeKeyPart = scope ? `:scope:${scope.type}:${scope.id}` : "";
1377
- const OPEN_TABS_KEY = `agent-chat-open-tabs${keyPrefix}${scopeKeyPart}`;
1130
+ const OPEN_TABS_KEY = `agent-chat-open-tabs${keyPrefix}`;
1378
1131
  const [openTabIds, setOpenTabIds] = useState<string[]>(() => {
1379
1132
  if (!restoreActiveThread && activeThreadId) {
1380
1133
  for (const id of [activeThreadId]) mountedTabsRef.current.add(id);
@@ -1397,87 +1150,50 @@ export function MultiTabAssistantChat({
1397
1150
  openTabIdsRef.current = openTabIds;
1398
1151
  const initializedRef = useRef(false);
1399
1152
 
1400
- // Rehydrate open tabs when the scope flips. Mirrors `persistedKeyRef` in
1401
- // `useChatThreads`: on a scope change we need to read the new key BEFORE
1402
- // the persistence effect writes the current (now-wrong) tab list under
1403
- // that new key.
1404
1153
  const openTabsKeyRef = useRef(OPEN_TABS_KEY);
1154
+
1405
1155
  useEffect(() => {
1406
- if (openTabsKeyRef.current === OPEN_TABS_KEY) return;
1407
- openTabsKeyRef.current = OPEN_TABS_KEY;
1408
- initializedRef.current = false;
1409
- if (!restoreActiveThread) {
1410
- setOpenTabIds(activeThreadId ? [activeThreadId] : []);
1411
- return;
1412
- }
1413
- try {
1414
- const saved = localStorage.getItem(OPEN_TABS_KEY);
1415
- if (saved) {
1416
- const parsed = JSON.parse(saved);
1417
- if (Array.isArray(parsed)) {
1418
- for (const id of parsed) mountedTabsRef.current.add(id);
1419
- setOpenTabIds(parsed);
1420
- return;
1421
- }
1422
- }
1423
- } catch {}
1424
- setOpenTabIds([]);
1425
- }, [OPEN_TABS_KEY, activeThreadId, restoreActiveThread]);
1426
-
1427
- // Look up the active thread's actual scope from the list — when the
1428
- // user opens a chat from history that was scoped to a different
1429
- // resource, the badge should advertise that thread's binding, not
1430
- // necessarily the resource currently in the viewport. When the thread
1431
- // and the live prop refer to the same resource, prefer the prop's
1432
- // label so a rename or a deferred deck-title load shows up in the UI
1433
- // without waiting on the next persistence cycle.
1434
- const activeThreadScope = useMemo<ChatThreadScope | null>(() => {
1435
- if (!activeThreadId) return null;
1436
- const t = threads.find((x) => x.id === activeThreadId);
1437
- const stored = t?.scope ?? null;
1438
- if (!stored) return null;
1439
- if (scope && stored.type === scope.type && stored.id === scope.id) {
1440
- return { ...stored, label: scope.label || stored.label };
1156
+ const nextScope = scope;
1157
+ if (!nextScope) return;
1158
+ const type = formatScopeType(nextScope.type);
1159
+ const title =
1160
+ nextScope.label?.trim() ||
1161
+ type.replace(/^./, (character) => character.toUpperCase());
1162
+ const key = nextScope.contextKey || "agent-current-resource-context";
1163
+ const marker = `Resource context: ${nextScope.type}:${nextScope.id}`;
1164
+ const existing = getAgentChatContextState().items.find(
1165
+ (item) => item.key === key,
1166
+ );
1167
+ let ownsContextItem = false;
1168
+ if (!existing || existing.context.startsWith(marker)) {
1169
+ setAgentChatContextItem({
1170
+ key,
1171
+ title,
1172
+ context: [
1173
+ marker,
1174
+ `The user is currently viewing this ${type}.`,
1175
+ nextScope.label ? `Resource name: ${nextScope.label}` : "",
1176
+ `Resource id: ${nextScope.id}`,
1177
+ typeof window !== "undefined"
1178
+ ? `Current URL: ${window.location.pathname}${window.location.search}`
1179
+ : "",
1180
+ ]
1181
+ .filter(Boolean)
1182
+ .join("\n"),
1183
+ openSidebar: false,
1184
+ focus: false,
1185
+ });
1186
+ ownsContextItem = true;
1441
1187
  }
1442
- return stored;
1443
- }, [threads, activeThreadId, scope?.type, scope?.id, scope?.label]);
1444
-
1445
- // Brief confirmation banner shown after detach. The chip itself disappears
1446
- // the instant scope clears, which the user described as "nothing different
1447
- // happened." We hold the confirmation in the same slot for ~2s so the
1448
- // detach is visually acknowledged and the user is pointed at History.
1449
- const [detachConfirmType, setDetachConfirmType] = useState<string | null>(
1450
- null,
1451
- );
1452
- const detachTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
1453
- useEffect(() => {
1454
1188
  return () => {
1455
- if (detachTimerRef.current) clearTimeout(detachTimerRef.current);
1189
+ const current = getAgentChatContextState().items.find(
1190
+ (item) => item.key === key,
1191
+ );
1192
+ if (ownsContextItem && current?.context.startsWith(marker)) {
1193
+ removeAgentChatContextItem(key);
1194
+ }
1456
1195
  };
1457
- }, []);
1458
- const handleDetachActiveThread = useCallback(() => {
1459
- if (!activeThreadId || !activeThreadScope) return;
1460
- const type = activeThreadScope.type;
1461
- setDetachConfirmType(type);
1462
- if (detachTimerRef.current) clearTimeout(detachTimerRef.current);
1463
- detachTimerRef.current = setTimeout(() => setDetachConfirmType(null), 2200);
1464
- detachThread(activeThreadId);
1465
- }, [activeThreadId, activeThreadScope, detachThread]);
1466
-
1467
- // Other chats scoped to the active thread's resource (excluding the active
1468
- // thread itself). Sorted most-recent-first to match user expectation in the
1469
- // chip popover and empty-state addon.
1470
- const otherScopedThreads = useMemo<ChatThreadSummary[]>(() => {
1471
- if (!activeThreadScope) return [];
1472
- return threads
1473
- .filter(
1474
- (t) =>
1475
- t.id !== activeThreadId &&
1476
- t.scope?.type === activeThreadScope.type &&
1477
- t.scope?.id === activeThreadScope.id,
1478
- )
1479
- .sort((a, b) => b.updatedAt - a.updatedAt);
1480
- }, [threads, activeThreadId, activeThreadScope]);
1196
+ }, [scope?.contextKey, scope?.id, scope?.label, scope?.type]);
1481
1197
 
1482
1198
  // Persist open tab IDs to localStorage (exclude sub-agent tabs — they're session-only)
1483
1199
  useEffect(() => {
@@ -1555,9 +1271,8 @@ export function MultiTabAssistantChat({
1555
1271
  // Use functional update to check inside the setter — avoids race with the
1556
1272
  // initialization effect that may have already added the ID in the same batch.
1557
1273
  //
1558
- // Scoped navigation can reset openTabIds from a different localStorage key
1559
- // without changing activeThreadId. Re-check after tab-list resets so the
1560
- // sidebar cannot end up with a live active thread but no mounted chat.
1274
+ // Re-check after tab-list resets so the sidebar cannot end up with a live
1275
+ // active thread but no mounted chat.
1561
1276
  useEffect(() => {
1562
1277
  if (!activeThreadId || openTabIds.includes(activeThreadId)) return;
1563
1278
  if (parentMap[activeThreadId]) return;
@@ -2711,7 +2426,6 @@ export function MultiTabAssistantChat({
2711
2426
  threads={threads}
2712
2427
  openTabIds={new Set(openTabIds)}
2713
2428
  activeThreadId={activeThreadId}
2714
- currentScope={scope}
2715
2429
  hasMoreThreads={hasMoreThreads}
2716
2430
  isLoadingMoreThreads={isLoadingMoreThreads}
2717
2431
  loadError={threadsLoadError}
@@ -2737,37 +2451,10 @@ export function MultiTabAssistantChat({
2737
2451
  )
2738
2452
  .map((tabId) => {
2739
2453
  const modelSelection = resolveThreadModelSelection(tabId);
2740
- const tabThread = threads.find((thread) => thread.id === tabId);
2741
- const tabScope =
2742
- tabThread?.scope ??
2743
- (tabId === activeThreadId ? activeThreadScope : null);
2744
2454
  const tabDynamicSuggestions =
2745
2455
  tabId === activeThreadId && !contentHidden
2746
2456
  ? props.dynamicSuggestions
2747
2457
  : false;
2748
- const scopeComposerSlot =
2749
- showScopeBadge && tabId === activeThreadId && !contentHidden ? (
2750
- tabScope && activeThreadId ? (
2751
- <ScopeBadge
2752
- scope={tabScope}
2753
- currentScope={scope}
2754
- onDetach={handleDetachActiveThread}
2755
- otherScopedThreads={otherScopedThreads}
2756
- activeThreadId={activeThreadId}
2757
- openTabIds={new Set(openTabIds)}
2758
- onSelectThread={openFromHistory}
2759
- />
2760
- ) : detachConfirmType ? (
2761
- <DetachConfirmationBanner />
2762
- ) : null
2763
- ) : null;
2764
- const composerSlot =
2765
- scopeComposerSlot || props.composerSlot ? (
2766
- <>
2767
- {props.composerSlot}
2768
- {scopeComposerSlot}
2769
- </>
2770
- ) : undefined;
2771
2458
  return (
2772
2459
  <div
2773
2460
  key={tabId}
@@ -2802,11 +2489,6 @@ export function MultiTabAssistantChat({
2802
2489
  <AssistantChat
2803
2490
  {...props}
2804
2491
  dynamicSuggestions={tabDynamicSuggestions}
2805
- emptyStateText={
2806
- tabScope?.label && tabId === activeThreadId
2807
- ? `Ask about ${tabScope.label}`
2808
- : props.emptyStateText
2809
- }
2810
2492
  ref={(handle) => {
2811
2493
  if (handle) {
2812
2494
  chatRefs.current.set(tabId, handle);
@@ -2817,7 +2499,6 @@ export function MultiTabAssistantChat({
2817
2499
  threadId={tabId}
2818
2500
  tabId={tabId}
2819
2501
  browserTabId={browserTabId}
2820
- contextScope={tabScope}
2821
2502
  isActiveComposer={tabId === activeThreadId}
2822
2503
  apiUrl={apiUrl}
2823
2504
  isNewThread={
@@ -2838,7 +2519,7 @@ export function MultiTabAssistantChat({
2838
2519
  selectedEffort={
2839
2520
  modelSelection?.effort ?? DEFAULT_REASONING_EFFORT
2840
2521
  }
2841
- composerSlot={composerSlot}
2522
+ composerSlot={props.composerSlot}
2842
2523
  defaultModel={defaultModel}
2843
2524
  availableModels={availableModels}
2844
2525
  onModelChange={handleModelChange}
@@ -529,6 +529,7 @@ function messageTextForHistory(message: {
529
529
  }
530
530
 
531
531
  type AdapterMessage = {
532
+ id?: string;
532
533
  role: string;
533
534
  content: readonly { type: string; text?: string }[];
534
535
  attachments?: readonly AssistantUiAttachment[];
@@ -1486,6 +1487,9 @@ export function createAgentChatAdapter(
1486
1487
  const browserTabId = options?.browserTabId;
1487
1488
  const scopeRef = options?.scopeRef;
1488
1489
  const surface = options?.surface ?? "app";
1490
+ // A queued recovery can survive until a server-owned continuation finishes,
1491
+ // and assistant-ui may ask the same memoized adapter to run that item again.
1492
+ const claimedRecoveryMessageIds = new Set<string>();
1489
1493
  let runtimeDebugDetails = "";
1490
1494
  const runtimeDebugUrl = runtimeDebugUrlForApiUrl(apiUrl);
1491
1495
  if (runtimeDebugUrl && typeof fetch === "function") {
@@ -1512,6 +1516,14 @@ export function createAgentChatAdapter(
1512
1516
  const latestUserIsRecovery = latestUserMsg
1513
1517
  ? isRecoveryUserMessage(latestUserMsg)
1514
1518
  : false;
1519
+ const recoveryMessageId =
1520
+ latestUserIsRecovery && latestUserMsg?.id?.trim()
1521
+ ? latestUserMsg.id.trim()
1522
+ : null;
1523
+ if (recoveryMessageId) {
1524
+ if (claimedRecoveryMessageIds.has(recoveryMessageId)) return;
1525
+ claimedRecoveryMessageIds.add(recoveryMessageId);
1526
+ }
1515
1527
  const lastUserMsg =
1516
1528
  latestUserIsRecovery && latestUserIndex >= 0
1517
1529
  ? (latestUserMessage(adapterMessages, {
@@ -1638,7 +1650,7 @@ export function createAgentChatAdapter(
1638
1650
  structuredHistory;
1639
1651
  let includeAttachments = attachments.length > 0;
1640
1652
  let includeReferences = Boolean(runConfig?.custom?.references);
1641
- let internalContinuationRequest = false;
1653
+ let internalContinuationRequest = latestUserIsRecovery;
1642
1654
  let startupRecoveryAttempts = 0;
1643
1655
  let queuedConflictRetries = 0;
1644
1656
  let staleRunContinuationAttempts = 0;