@agent-native/core 0.103.1 → 0.104.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 (565) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +30 -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/extensions/actions.ts +106 -16
  39. package/corpus/core/src/extensions/content-patch.ts +22 -0
  40. package/corpus/core/src/extensions/routes.ts +18 -0
  41. package/corpus/core/src/extensions/store.ts +8 -0
  42. package/corpus/core/src/index.ts +3 -0
  43. package/corpus/core/src/ingestion/docx.ts +158 -0
  44. package/corpus/core/src/ingestion/figma-node-to-html.ts +1860 -0
  45. package/corpus/core/src/ingestion/figma.ts +548 -0
  46. package/corpus/core/src/ingestion/index.ts +107 -0
  47. package/corpus/core/src/ingestion/media.ts +264 -0
  48. package/corpus/core/src/ingestion/notion.ts +121 -0
  49. package/corpus/core/src/ingestion/office.ts +214 -0
  50. package/corpus/core/src/ingestion/orchestration.ts +160 -0
  51. package/corpus/core/src/ingestion/pptx.ts +333 -0
  52. package/corpus/core/src/ingestion/selection.ts +81 -0
  53. package/corpus/core/src/ingestion/website.ts +151 -0
  54. package/corpus/core/src/integrations/plugin.ts +45 -37
  55. package/corpus/core/src/localization/default-messages.ts +35 -12
  56. package/corpus/core/src/observability/hosted-model-experiment.ts +118 -0
  57. package/corpus/core/src/observability/traces.ts +5 -3
  58. package/corpus/core/src/provider-api/index.ts +452 -8
  59. package/corpus/core/src/scripts/agent-engines/list-agent-engines.ts +18 -1
  60. package/corpus/core/src/search-utils/index.ts +112 -0
  61. package/corpus/core/src/secrets/register-framework-secrets.ts +61 -0
  62. package/corpus/core/src/server/action-discovery.ts +33 -8
  63. package/corpus/core/src/server/agent-chat/framework-prompts.ts +2 -2
  64. package/corpus/core/src/server/agent-chat/prompt-resources.ts +144 -0
  65. package/corpus/core/src/server/agent-chat-plugin.ts +6 -0
  66. package/corpus/core/src/server/core-routes-plugin.ts +12 -0
  67. package/corpus/core/src/server/index.ts +30 -0
  68. package/corpus/core/src/server/workspace-provider-oauth.ts +583 -0
  69. package/corpus/core/src/styles/agent-native.css +9 -0
  70. package/corpus/core/src/templates/default/app/i18n/en-US.ts +3 -3
  71. package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
  72. package/corpus/core/src/templates/workspace-root/.env.example +12 -0
  73. package/corpus/core/src/workspace-connections/index.ts +6 -0
  74. package/corpus/core/src/workspace-connections/lifecycle.ts +43 -0
  75. package/corpus/core/src/workspace-connections/store.ts +16 -0
  76. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +46 -3
  77. package/corpus/templates/analytics/AGENTS.md +9 -0
  78. package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +120 -6
  79. package/corpus/templates/analytics/actions/mutate-dashboard.ts +92 -30
  80. package/corpus/templates/analytics/actions/update-dashboard.ts +5 -5
  81. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +313 -220
  82. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +2 -2
  83. package/corpus/templates/analytics/app/components/layout/Layout.tsx +9 -6
  84. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +90 -64
  85. package/corpus/templates/analytics/app/i18n-data.ts +3 -3
  86. package/corpus/templates/analytics/app/lib/dashboard-list-loading.ts +25 -0
  87. package/corpus/templates/analytics/app/lib/item-popularity.ts +13 -4
  88. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/DashboardFilterBar.tsx +1 -1
  89. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/pivot.ts +8 -3
  90. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +1 -0
  91. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +15 -3
  92. package/corpus/templates/analytics/changelog/2026-07-16-dashboard-filter-defaults-can-now-be-changed-reliably-withou.md +6 -0
  93. package/corpus/templates/analytics/changelog/2026-07-16-dashboard-lists-load-in-one-stable-order-without-popping-bet.md +6 -0
  94. package/corpus/templates/analytics/changelog/2026-07-16-fixed-dashboard-filter-dropdown-text-alignment.md +6 -0
  95. package/corpus/templates/analytics/changelog/2026-07-16-recurring-signed-in-users-can-now-be-viewed-as-weekly-bars-b.md +6 -0
  96. package/corpus/templates/analytics/changelog/2026-07-16-the-analytics-agent-can-now-duplicate-a-chart-and-place-the-.md +6 -0
  97. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +41 -1
  98. package/corpus/templates/analytics/server/lib/dashboard-catalog.ts +1 -1
  99. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +47 -1
  100. package/corpus/templates/analytics/server/lib/session-replay.ts +68 -0
  101. package/corpus/templates/analytics/server/plugins/agent-chat.ts +1 -0
  102. package/corpus/templates/analytics/server/routes/sessions/lookup.get.ts +47 -0
  103. package/corpus/templates/assets/.agents/skills/asset-generation/SKILL.md +16 -9
  104. package/corpus/templates/assets/.agents/skills/creative-context/SKILL.md +86 -0
  105. package/corpus/templates/assets/AGENTS.md +10 -0
  106. package/corpus/templates/assets/actions/create-generation-session.ts +59 -1
  107. package/corpus/templates/assets/actions/edit-image.ts +2 -0
  108. package/corpus/templates/assets/actions/generate-asset.ts +52 -0
  109. package/corpus/templates/assets/actions/generate-image-batch.ts +55 -0
  110. package/corpus/templates/assets/actions/generate-image.ts +219 -1
  111. package/corpus/templates/assets/actions/open-asset-picker.ts +14 -0
  112. package/corpus/templates/assets/actions/refine-image.ts +3 -0
  113. package/corpus/templates/assets/actions/restyle-image.ts +2 -0
  114. package/corpus/templates/assets/agent-native.app-skill.json +4 -0
  115. package/corpus/templates/assets/app/components/layout/Layout.tsx +2 -0
  116. package/corpus/templates/assets/app/i18n/zh-TW.ts +3 -0
  117. package/corpus/templates/assets/app/i18n-data.ts +29 -13
  118. package/corpus/templates/assets/app/routes/agent.tsx +7 -1
  119. package/corpus/templates/assets/app/routes/library.tsx +9 -0
  120. package/corpus/templates/assets/app/routes/settings.tsx +3 -0
  121. package/corpus/templates/assets/changelog/2026-07-16-creative-context-library.md +6 -0
  122. package/corpus/templates/assets/package.json +1 -0
  123. package/corpus/templates/assets/server/lib/image-processing.ts +1 -22
  124. package/corpus/templates/assets/server/plugins/creative-context.ts +205 -0
  125. package/corpus/templates/brain/app/i18n-data.ts +3 -3
  126. package/corpus/templates/brain/app/lib/brain.ts +1 -1
  127. package/corpus/templates/brain/server/lib/search.ts +17 -67
  128. package/corpus/templates/calendar/app/i18n-data.ts +3 -3
  129. package/corpus/templates/calendar/app/pages/BookingLinksPage.tsx +19 -18
  130. package/corpus/templates/chat/app/i18n/en-US.ts +3 -3
  131. package/corpus/templates/chat/app/lib/agent-page.tsx +10 -1
  132. package/corpus/templates/clips/.agents/skills/meetings/SKILL.md +1 -1
  133. package/corpus/templates/clips/AGENTS.md +4 -0
  134. package/corpus/templates/clips/actions/cleanup-transcript.ts +35 -4
  135. package/corpus/templates/clips/actions/create-meeting.ts +6 -2
  136. package/corpus/templates/clips/actions/create-organization.ts +3 -2
  137. package/corpus/templates/clips/actions/create-recording.ts +4 -1
  138. package/corpus/templates/clips/actions/finalize-recording.ts +44 -7
  139. package/corpus/templates/clips/actions/import-loom-recording.ts +4 -1
  140. package/corpus/templates/clips/actions/lib/create-recording-schema.ts +2 -2
  141. package/corpus/templates/clips/actions/list-meetings.ts +23 -5
  142. package/corpus/templates/clips/actions/list-organization-state.ts +1 -1
  143. package/corpus/templates/clips/actions/remove-silences.ts +10 -1
  144. package/corpus/templates/clips/actions/request-transcript.ts +53 -11
  145. package/corpus/templates/clips/actions/search-recordings-utils.ts +7 -0
  146. package/corpus/templates/clips/actions/search-recordings.ts +5 -8
  147. package/corpus/templates/clips/actions/set-organization-branding.ts +2 -2
  148. package/corpus/templates/clips/actions/stitch-recordings.ts +10 -5
  149. package/corpus/templates/clips/actions/update-ai-request-status.ts +38 -0
  150. package/corpus/templates/clips/app/components/editor/editor-layout.tsx +3 -4
  151. package/corpus/templates/clips/app/components/editor/editor-selection.ts +19 -0
  152. package/corpus/templates/clips/app/components/editor/stitch-manager.tsx +10 -10
  153. package/corpus/templates/clips/app/components/library/bulk-action-toolbar.tsx +1 -2
  154. package/corpus/templates/clips/app/components/library/library-grid.tsx +101 -93
  155. package/corpus/templates/clips/app/components/player/video-player.tsx +11 -0
  156. package/corpus/templates/clips/app/components/workspace/branding-editor.tsx +53 -1
  157. package/corpus/templates/clips/app/i18n/ar-SA.ts +7 -1
  158. package/corpus/templates/clips/app/i18n/de-DE.ts +7 -1
  159. package/corpus/templates/clips/app/i18n/en-US.ts +10 -4
  160. package/corpus/templates/clips/app/i18n/es-ES.ts +7 -1
  161. package/corpus/templates/clips/app/i18n/fr-FR.ts +7 -1
  162. package/corpus/templates/clips/app/i18n/hi-IN.ts +7 -1
  163. package/corpus/templates/clips/app/i18n/ja-JP.ts +7 -1
  164. package/corpus/templates/clips/app/i18n/ko-KR.ts +7 -1
  165. package/corpus/templates/clips/app/i18n/pt-BR.ts +7 -1
  166. package/corpus/templates/clips/app/i18n/zh-CN.ts +6 -1
  167. package/corpus/templates/clips/app/i18n/zh-TW.ts +6 -1
  168. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +5 -9
  169. package/corpus/templates/clips/app/routes/_app.settings.organization.tsx +6 -2
  170. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +129 -27
  171. package/corpus/templates/clips/app/routes/record.tsx +23 -2
  172. package/corpus/templates/clips/app/routes/share.$shareId.tsx +6 -2
  173. package/corpus/templates/clips/changelog/2026-07-16-authorized-viewers-can-open-shared-private-clips-without-a-m.md +6 -0
  174. package/corpus/templates/clips/changelog/2026-07-16-camera-bubble-hover-controls-appear-above-the-face.md +6 -0
  175. package/corpus/templates/clips/changelog/2026-07-16-chrome-extension-recovers-stale-recorder-state.md +6 -0
  176. package/corpus/templates/clips/changelog/2026-07-16-clips-agent-chat-no-longer-shows-a-separate-workspace-header.md +6 -0
  177. package/corpus/templates/clips/changelog/2026-07-16-clips-search-now-matches-recording-content-without-requiring.md +6 -0
  178. package/corpus/templates/clips/changelog/2026-07-16-declined-meetings-no-longer-show-desktop-reminders.md +6 -0
  179. package/corpus/templates/clips/changelog/2026-07-16-failed-desktop-saves-now-show-their-local-recovery-copy.md +6 -0
  180. package/corpus/templates/clips/changelog/2026-07-16-long-desktop-clips-now-preserve-complete-playback-synced-aud.md +6 -0
  181. package/corpus/templates/clips/changelog/2026-07-16-long-recording-lists-keep-stitch-and-library-actions-visible.md +6 -0
  182. package/corpus/templates/clips/changelog/2026-07-16-organization-admins-can-choose-new-recording-visibility.md +6 -0
  183. package/corpus/templates/clips/changelog/2026-07-16-remove-silences-now-shows-queued-active-completed-and-failed.md +6 -0
  184. package/corpus/templates/clips/changelog/2026-07-16-settings-no-longer-repeats-the-builder-connection-status-in-.md +6 -0
  185. package/corpus/templates/clips/changelog/2026-07-16-transcripts-now-appear-from-native-browser-speech-sooner-wit.md +6 -0
  186. package/corpus/templates/clips/chrome-extension/public/manifest.json +1 -1
  187. package/corpus/templates/clips/chrome-extension/src/background.ts +73 -1
  188. package/corpus/templates/clips/chrome-extension/src/native-recording-state.ts +32 -0
  189. package/corpus/templates/clips/chrome-extension/src/native-transcription.ts +248 -0
  190. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +106 -0
  191. package/corpus/templates/clips/desktop/src/app.tsx +66 -28
  192. package/corpus/templates/clips/desktop/src/lib/recorder.ts +335 -285
  193. package/corpus/templates/clips/desktop/src/lib/single-flight.ts +7 -0
  194. package/corpus/templates/clips/desktop/src/lib/upload-verification.ts +51 -0
  195. package/corpus/templates/clips/desktop/src/overlays/bubble.tsx +2 -2
  196. package/corpus/templates/clips/desktop/src/overlays/finalizing.tsx +10 -2
  197. package/corpus/templates/clips/desktop/src/styles.css +13 -11
  198. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +8 -9
  199. package/corpus/templates/clips/desktop/src-tauri/src/meetings_watcher.rs +1 -0
  200. package/corpus/templates/clips/desktop/src-tauri/src/native_screen/custom_capture.rs +88 -13
  201. package/corpus/templates/clips/desktop/src-tauri/src/native_screen/live_upload.rs +13 -2
  202. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +241 -6
  203. package/corpus/templates/clips/server/db/schema.ts +2 -2
  204. package/corpus/templates/clips/server/lib/builder-media-compression.ts +64 -67
  205. package/corpus/templates/clips/server/lib/calendar-event-classification.ts +19 -0
  206. package/corpus/templates/clips/server/lib/google-calendar-client.ts +1 -0
  207. package/corpus/templates/clips/server/lib/recordings.ts +40 -1
  208. package/corpus/templates/clips/server/plugins/agent-chat.ts +1 -0
  209. package/corpus/templates/clips/server/plugins/db.ts +2 -2
  210. package/corpus/templates/clips/server/routes/api/auth/google-calendar.get.ts +1 -1
  211. package/corpus/templates/clips/server/routes/api/public-recording.get.ts +14 -5
  212. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +51 -1
  213. package/corpus/templates/clips/server/routes/api/video/[recordingId].get.ts +1 -64
  214. package/corpus/templates/clips/shared/media-worker-contract.ts +32 -15
  215. package/corpus/templates/content/.agents/skills/content/SKILL.md +16 -0
  216. package/corpus/templates/content/.agents/skills/creative-context/SKILL.md +85 -0
  217. package/corpus/templates/content/.agents/skills/notion-integration/SKILL.md +8 -0
  218. package/corpus/templates/content/AGENTS.md +9 -0
  219. package/corpus/templates/content/actions/create-document.ts +94 -0
  220. package/corpus/templates/content/actions/edit-document.ts +144 -4
  221. package/corpus/templates/content/actions/update-document.ts +138 -0
  222. package/corpus/templates/content/agent-native.app-skill.json +4 -0
  223. package/corpus/templates/content/app/components/layout/Layout.tsx +2 -0
  224. package/corpus/templates/content/app/i18n/zh-TW.ts +3 -0
  225. package/corpus/templates/content/app/i18n-data.ts +13 -4
  226. package/corpus/templates/content/app/routes/_app.agent.tsx +2 -1
  227. package/corpus/templates/content/app/routes/_app.settings.tsx +3 -0
  228. package/corpus/templates/content/changelog/2026-07-16-creative-context-library.md +6 -0
  229. package/corpus/templates/content/package.json +1 -0
  230. package/corpus/templates/content/server/plugins/creative-context.ts +31 -0
  231. package/corpus/templates/design/.agents/skills/creative-context/SKILL.md +116 -0
  232. package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +16 -0
  233. package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +8 -0
  234. package/corpus/templates/design/AGENTS.md +6 -0
  235. package/corpus/templates/design/actions/clone-creative-context-design.ts +176 -0
  236. package/corpus/templates/design/actions/edit-design.ts +128 -0
  237. package/corpus/templates/design/actions/generate-design.ts +278 -14
  238. package/corpus/templates/design/actions/generate-screens.ts +42 -1
  239. package/corpus/templates/design/agent-native.app-skill.json +4 -0
  240. package/corpus/templates/design/app/components/layout/Layout.tsx +7 -3
  241. package/corpus/templates/design/app/i18n/zh-TW.ts +3 -0
  242. package/corpus/templates/design/app/i18n-data.ts +10 -4
  243. package/corpus/templates/design/app/routes/agent.tsx +2 -1
  244. package/corpus/templates/design/app/routes/settings.tsx +3 -0
  245. package/corpus/templates/design/changelog/2026-07-16-creative-context-library.md +6 -0
  246. package/corpus/templates/design/changelog/2026-07-16-design-agent-chat-no-longer-shows-a-separate-workspace-header.md +6 -0
  247. package/corpus/templates/design/package.json +1 -0
  248. package/corpus/templates/design/server/lib/figma-design-context.ts +5 -335
  249. package/corpus/templates/design/server/lib/figma-node-to-html.ts +1 -1859
  250. package/corpus/templates/design/server/lib/import-design-files.ts +6 -8
  251. package/corpus/templates/design/server/plugins/creative-context.ts +31 -0
  252. package/corpus/templates/design/shared/generation-session.ts +7 -0
  253. package/corpus/templates/dispatch/app/i18n-data.ts +3 -3
  254. package/corpus/templates/forms/app/i18n/en-US.ts +3 -3
  255. package/corpus/templates/macros/app/i18n/en-US.ts +3 -3
  256. package/corpus/templates/mail/app/components/email/EmailThread.tsx +35 -5
  257. package/corpus/templates/mail/app/i18n/en-US.ts +3 -3
  258. package/corpus/templates/mail/changelog/2026-07-16-mail-previews-now-expand-to-show-the-full-message-without-an.md +6 -0
  259. package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +30 -11
  260. package/corpus/templates/plan/AGENTS.md +21 -1
  261. package/corpus/templates/plan/actions/get-visual-plan.ts +1 -1
  262. package/corpus/templates/plan/actions/patch-visual-plan-source.ts +161 -0
  263. package/corpus/templates/plan/actions/read-visual-plan-source.ts +1 -1
  264. package/corpus/templates/plan/actions/update-visual-plan.ts +126 -10
  265. package/corpus/templates/plan/app/hooks/use-plans.ts +2 -0
  266. package/corpus/templates/plan/app/i18n/en-US.ts +3 -3
  267. package/corpus/templates/plan/app/pages/PlansPage.tsx +65 -62
  268. package/corpus/templates/plan/changelog/2026-07-16-local-plan-previews-now-load-annotations-containing-html-lik.md +6 -0
  269. package/corpus/templates/plan/changelog/2026-07-16-plan-agents-now-prevent-stale-edits-from-overwriting-newer-p.md +6 -0
  270. package/corpus/templates/plan/server/plan-mdx.ts +75 -2
  271. package/corpus/templates/slides/.agents/skills/create-deck/SKILL.md +21 -4
  272. package/corpus/templates/slides/.agents/skills/creative-context/SKILL.md +122 -0
  273. package/corpus/templates/slides/.agents/skills/design-systems/SKILL.md +11 -0
  274. package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +12 -3
  275. package/corpus/templates/slides/AGENTS.md +6 -0
  276. package/corpus/templates/slides/actions/add-slide.ts +230 -14
  277. package/corpus/templates/slides/actions/clone-context-slide.ts +302 -0
  278. package/corpus/templates/slides/actions/create-deck.ts +130 -0
  279. package/corpus/templates/slides/actions/extract-pdf.ts +6 -2
  280. package/corpus/templates/slides/actions/import-file.ts +5 -4
  281. package/corpus/templates/slides/actions/patch-deck.ts +200 -10
  282. package/corpus/templates/slides/actions/update-slide.ts +208 -15
  283. package/corpus/templates/slides/app/components/layout/Layout.tsx +2 -0
  284. package/corpus/templates/slides/app/components/visual-editor/CanvasCommentPins.tsx +16 -1
  285. package/corpus/templates/slides/app/i18n/ar-SA.ts +3 -0
  286. package/corpus/templates/slides/app/i18n/de-DE.ts +3 -0
  287. package/corpus/templates/slides/app/i18n/en-US.ts +6 -3
  288. package/corpus/templates/slides/app/i18n/es-ES.ts +3 -0
  289. package/corpus/templates/slides/app/i18n/fr-FR.ts +3 -0
  290. package/corpus/templates/slides/app/i18n/hi-IN.ts +3 -0
  291. package/corpus/templates/slides/app/i18n/ja-JP.ts +3 -0
  292. package/corpus/templates/slides/app/i18n/ko-KR.ts +3 -0
  293. package/corpus/templates/slides/app/i18n/pt-BR.ts +3 -0
  294. package/corpus/templates/slides/app/i18n/zh-CN.ts +3 -0
  295. package/corpus/templates/slides/app/i18n/zh-TW.ts +3 -0
  296. package/corpus/templates/slides/app/lib/validate-native-slide-html.ts +176 -0
  297. package/corpus/templates/slides/app/routes/agent.tsx +7 -1
  298. package/corpus/templates/slides/app/routes/settings.tsx +3 -0
  299. package/corpus/templates/slides/changelog/2026-07-16-creative-context-library.md +6 -0
  300. package/corpus/templates/slides/changelog/2026-07-16-google-slides-native-cloning.md +6 -0
  301. package/corpus/templates/slides/package.json +1 -0
  302. package/corpus/templates/slides/server/handlers/import/docx-parser.ts +4 -85
  303. package/corpus/templates/slides/server/handlers/import/pptx-parser.ts +7 -421
  304. package/corpus/templates/slides/server/plugins/creative-context.ts +166 -0
  305. package/dist/agent/engine/credential-errors.d.ts +1 -1
  306. package/dist/agent/engine/credential-errors.d.ts.map +1 -1
  307. package/dist/agent/engine/credential-errors.js +2 -2
  308. package/dist/agent/engine/credential-errors.js.map +1 -1
  309. package/dist/agent/production-agent.d.ts.map +1 -1
  310. package/dist/agent/production-agent.js +25 -0
  311. package/dist/agent/production-agent.js.map +1 -1
  312. package/dist/agent/run-store.d.ts.map +1 -1
  313. package/dist/agent/run-store.js +12 -2
  314. package/dist/agent/run-store.js.map +1 -1
  315. package/dist/cli/create.d.ts.map +1 -1
  316. package/dist/cli/create.js +1 -0
  317. package/dist/cli/create.js.map +1 -1
  318. package/dist/cli/skills-content/visual-plan-skill.d.ts +1 -1
  319. package/dist/cli/skills-content/visual-plan-skill.d.ts.map +1 -1
  320. package/dist/cli/skills-content/visual-plan-skill.js +30 -11
  321. package/dist/cli/skills-content/visual-plan-skill.js.map +1 -1
  322. package/dist/cli/templates-meta.d.ts.map +1 -1
  323. package/dist/cli/templates-meta.js +4 -3
  324. package/dist/cli/templates-meta.js.map +1 -1
  325. package/dist/client/AgentAskPopover.d.ts +11 -0
  326. package/dist/client/AgentAskPopover.d.ts.map +1 -0
  327. package/dist/client/AgentAskPopover.js +30 -0
  328. package/dist/client/AgentAskPopover.js.map +1 -0
  329. package/dist/client/AgentChatHome.d.ts +1 -1
  330. package/dist/client/AgentChatHome.d.ts.map +1 -1
  331. package/dist/client/AgentChatHome.js +2 -2
  332. package/dist/client/AgentChatHome.js.map +1 -1
  333. package/dist/client/AgentPanel.d.ts +9 -19
  334. package/dist/client/AgentPanel.d.ts.map +1 -1
  335. package/dist/client/AgentPanel.js +119 -80
  336. package/dist/client/AgentPanel.js.map +1 -1
  337. package/dist/client/AssistantChat.d.ts.map +1 -1
  338. package/dist/client/AssistantChat.js +4 -4
  339. package/dist/client/AssistantChat.js.map +1 -1
  340. package/dist/client/MultiTabAssistantChat.d.ts +3 -9
  341. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  342. package/dist/client/MultiTabAssistantChat.js +49 -189
  343. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  344. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  345. package/dist/client/agent-chat-adapter.js +12 -1
  346. package/dist/client/agent-chat-adapter.js.map +1 -1
  347. package/dist/client/agent-page/AgentContextTab.d.ts.map +1 -1
  348. package/dist/client/agent-page/AgentContextTab.js +26 -28
  349. package/dist/client/agent-page/AgentContextTab.js.map +1 -1
  350. package/dist/client/agent-page/AgentEmptyState.d.ts +13 -0
  351. package/dist/client/agent-page/AgentEmptyState.d.ts.map +1 -0
  352. package/dist/client/agent-page/AgentEmptyState.js +6 -0
  353. package/dist/client/agent-page/AgentEmptyState.js.map +1 -0
  354. package/dist/client/agent-page/AgentJobsTab.d.ts +1 -1
  355. package/dist/client/agent-page/AgentJobsTab.d.ts.map +1 -1
  356. package/dist/client/agent-page/AgentJobsTab.js +90 -58
  357. package/dist/client/agent-page/AgentJobsTab.js.map +1 -1
  358. package/dist/client/agent-page/AgentTabFrame.d.ts +12 -0
  359. package/dist/client/agent-page/AgentTabFrame.d.ts.map +1 -0
  360. package/dist/client/agent-page/AgentTabFrame.js +7 -0
  361. package/dist/client/agent-page/AgentTabFrame.js.map +1 -0
  362. package/dist/client/agent-page/AgentTabsPage.d.ts +9 -1
  363. package/dist/client/agent-page/AgentTabsPage.d.ts.map +1 -1
  364. package/dist/client/agent-page/AgentTabsPage.js +135 -99
  365. package/dist/client/agent-page/AgentTabsPage.js.map +1 -1
  366. package/dist/client/agent-page/types.d.ts +1 -1
  367. package/dist/client/agent-page/types.d.ts.map +1 -1
  368. package/dist/client/agent-page/types.js.map +1 -1
  369. package/dist/client/analytics.d.ts +10 -3
  370. package/dist/client/analytics.d.ts.map +1 -1
  371. package/dist/client/analytics.js +37 -2
  372. package/dist/client/analytics.js.map +1 -1
  373. package/dist/client/chat/run-recovery.d.ts.map +1 -1
  374. package/dist/client/chat/run-recovery.js +10 -3
  375. package/dist/client/chat/run-recovery.js.map +1 -1
  376. package/dist/client/composer/PromptComposer.d.ts.map +1 -1
  377. package/dist/client/composer/PromptComposer.js +2 -2
  378. package/dist/client/composer/PromptComposer.js.map +1 -1
  379. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  380. package/dist/client/composer/TiptapComposer.js +15 -3
  381. package/dist/client/composer/TiptapComposer.js.map +1 -1
  382. package/dist/client/dynamic-suggestions.js +3 -3
  383. package/dist/client/dynamic-suggestions.js.map +1 -1
  384. package/dist/client/index.d.ts +4 -3
  385. package/dist/client/index.d.ts.map +1 -1
  386. package/dist/client/index.js +3 -2
  387. package/dist/client/index.js.map +1 -1
  388. package/dist/client/resources/ResourceTree.d.ts +5 -1
  389. package/dist/client/resources/ResourceTree.d.ts.map +1 -1
  390. package/dist/client/resources/ResourceTree.js +74 -5
  391. package/dist/client/resources/ResourceTree.js.map +1 -1
  392. package/dist/client/resources/ResourcesPanel.d.ts +11 -2
  393. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  394. package/dist/client/resources/ResourcesPanel.js +105 -31
  395. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  396. package/dist/client/session-replay.d.ts +28 -0
  397. package/dist/client/session-replay.d.ts.map +1 -1
  398. package/dist/client/session-replay.js +122 -8
  399. package/dist/client/session-replay.js.map +1 -1
  400. package/dist/client/settings/AutomationsSection.d.ts +3 -1
  401. package/dist/client/settings/AutomationsSection.d.ts.map +1 -1
  402. package/dist/client/settings/AutomationsSection.js +16 -6
  403. package/dist/client/settings/AutomationsSection.js.map +1 -1
  404. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  405. package/dist/client/settings/SettingsPanel.js +3 -3
  406. package/dist/client/settings/SettingsPanel.js.map +1 -1
  407. package/dist/client/settings/SettingsTabsPage.d.ts +2 -0
  408. package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
  409. package/dist/client/settings/SettingsTabsPage.js.map +1 -1
  410. package/dist/client/settings/agent-settings-search.js +2 -2
  411. package/dist/client/settings/agent-settings-search.js.map +1 -1
  412. package/dist/client/use-chat-threads.d.ts +2 -0
  413. package/dist/client/use-chat-threads.d.ts.map +1 -1
  414. package/dist/client/use-chat-threads.js.map +1 -1
  415. package/dist/collab/routes.d.ts +1 -1
  416. package/dist/connections/catalog.d.ts +41 -7
  417. package/dist/connections/catalog.d.ts.map +1 -1
  418. package/dist/connections/catalog.js +40 -7
  419. package/dist/connections/catalog.js.map +1 -1
  420. package/dist/db/index.d.ts +2 -2
  421. package/dist/db/index.d.ts.map +1 -1
  422. package/dist/db/index.js +2 -2
  423. package/dist/db/index.js.map +1 -1
  424. package/dist/extensions/actions.d.ts.map +1 -1
  425. package/dist/extensions/actions.js +85 -15
  426. package/dist/extensions/actions.js.map +1 -1
  427. package/dist/extensions/content-patch.d.ts +4 -0
  428. package/dist/extensions/content-patch.d.ts.map +1 -1
  429. package/dist/extensions/content-patch.js +18 -0
  430. package/dist/extensions/content-patch.js.map +1 -1
  431. package/dist/extensions/routes.d.ts.map +1 -1
  432. package/dist/extensions/routes.js +14 -0
  433. package/dist/extensions/routes.js.map +1 -1
  434. package/dist/extensions/store.d.ts +1 -0
  435. package/dist/extensions/store.d.ts.map +1 -1
  436. package/dist/extensions/store.js +4 -1
  437. package/dist/extensions/store.js.map +1 -1
  438. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  439. package/dist/index.d.ts +1 -1
  440. package/dist/index.d.ts.map +1 -1
  441. package/dist/index.js +1 -1
  442. package/dist/index.js.map +1 -1
  443. package/dist/ingestion/docx.d.ts +16 -0
  444. package/dist/ingestion/docx.d.ts.map +1 -0
  445. package/dist/ingestion/docx.js +129 -0
  446. package/dist/ingestion/docx.js.map +1 -0
  447. package/dist/ingestion/figma-node-to-html.d.ts +304 -0
  448. package/dist/ingestion/figma-node-to-html.d.ts.map +1 -0
  449. package/dist/ingestion/figma-node-to-html.js +1292 -0
  450. package/dist/ingestion/figma-node-to-html.js.map +1 -0
  451. package/dist/ingestion/figma.d.ts +115 -0
  452. package/dist/ingestion/figma.d.ts.map +1 -0
  453. package/dist/ingestion/figma.js +399 -0
  454. package/dist/ingestion/figma.js.map +1 -0
  455. package/dist/ingestion/index.d.ts +11 -0
  456. package/dist/ingestion/index.d.ts.map +1 -0
  457. package/dist/ingestion/index.js +11 -0
  458. package/dist/ingestion/index.js.map +1 -0
  459. package/dist/ingestion/media.d.ts +36 -0
  460. package/dist/ingestion/media.d.ts.map +1 -0
  461. package/dist/ingestion/media.js +178 -0
  462. package/dist/ingestion/media.js.map +1 -0
  463. package/dist/ingestion/notion.d.ts +12 -0
  464. package/dist/ingestion/notion.d.ts.map +1 -0
  465. package/dist/ingestion/notion.js +104 -0
  466. package/dist/ingestion/notion.js.map +1 -0
  467. package/dist/ingestion/office.d.ts +45 -0
  468. package/dist/ingestion/office.d.ts.map +1 -0
  469. package/dist/ingestion/office.js +141 -0
  470. package/dist/ingestion/office.js.map +1 -0
  471. package/dist/ingestion/orchestration.d.ts +52 -0
  472. package/dist/ingestion/orchestration.d.ts.map +1 -0
  473. package/dist/ingestion/orchestration.js +89 -0
  474. package/dist/ingestion/orchestration.js.map +1 -0
  475. package/dist/ingestion/pptx.d.ts +28 -0
  476. package/dist/ingestion/pptx.d.ts.map +1 -0
  477. package/dist/ingestion/pptx.js +255 -0
  478. package/dist/ingestion/pptx.js.map +1 -0
  479. package/dist/ingestion/selection.d.ts +20 -0
  480. package/dist/ingestion/selection.d.ts.map +1 -0
  481. package/dist/ingestion/selection.js +52 -0
  482. package/dist/ingestion/selection.js.map +1 -0
  483. package/dist/ingestion/website.d.ts +27 -0
  484. package/dist/ingestion/website.d.ts.map +1 -0
  485. package/dist/ingestion/website.js +100 -0
  486. package/dist/ingestion/website.js.map +1 -0
  487. package/dist/integrations/plugin.d.ts.map +1 -1
  488. package/dist/integrations/plugin.js +32 -27
  489. package/dist/integrations/plugin.js.map +1 -1
  490. package/dist/localization/default-messages.d.ts +22 -0
  491. package/dist/localization/default-messages.d.ts.map +1 -1
  492. package/dist/localization/default-messages.js +31 -9
  493. package/dist/localization/default-messages.js.map +1 -1
  494. package/dist/notifications/routes.d.ts +1 -1
  495. package/dist/observability/hosted-model-experiment.d.ts +39 -0
  496. package/dist/observability/hosted-model-experiment.d.ts.map +1 -0
  497. package/dist/observability/hosted-model-experiment.js +90 -0
  498. package/dist/observability/hosted-model-experiment.js.map +1 -0
  499. package/dist/observability/traces.d.ts.map +1 -1
  500. package/dist/observability/traces.js +5 -3
  501. package/dist/observability/traces.js.map +1 -1
  502. package/dist/progress/routes.d.ts +1 -1
  503. package/dist/provider-api/index.d.ts +35 -4
  504. package/dist/provider-api/index.d.ts.map +1 -1
  505. package/dist/provider-api/index.js +339 -8
  506. package/dist/provider-api/index.js.map +1 -1
  507. package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
  508. package/dist/scripts/agent-engines/list-agent-engines.js +18 -1
  509. package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
  510. package/dist/search-utils/index.d.ts +12 -0
  511. package/dist/search-utils/index.d.ts.map +1 -0
  512. package/dist/search-utils/index.js +95 -0
  513. package/dist/search-utils/index.js.map +1 -0
  514. package/dist/secrets/register-framework-secrets.d.ts.map +1 -1
  515. package/dist/secrets/register-framework-secrets.js +57 -0
  516. package/dist/secrets/register-framework-secrets.js.map +1 -1
  517. package/dist/server/action-discovery.d.ts +8 -0
  518. package/dist/server/action-discovery.d.ts.map +1 -1
  519. package/dist/server/action-discovery.js +26 -9
  520. package/dist/server/action-discovery.js.map +1 -1
  521. package/dist/server/agent-chat/framework-prompts.js +2 -2
  522. package/dist/server/agent-chat/framework-prompts.js.map +1 -1
  523. package/dist/server/agent-chat/prompt-resources.d.ts +19 -0
  524. package/dist/server/agent-chat/prompt-resources.d.ts.map +1 -1
  525. package/dist/server/agent-chat/prompt-resources.js +95 -0
  526. package/dist/server/agent-chat/prompt-resources.js.map +1 -1
  527. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  528. package/dist/server/agent-chat-plugin.js +7 -0
  529. package/dist/server/agent-chat-plugin.js.map +1 -1
  530. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  531. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  532. package/dist/server/core-routes-plugin.js +5 -0
  533. package/dist/server/core-routes-plugin.js.map +1 -1
  534. package/dist/server/index.d.ts +5 -1
  535. package/dist/server/index.d.ts.map +1 -1
  536. package/dist/server/index.js +5 -1
  537. package/dist/server/index.js.map +1 -1
  538. package/dist/server/workspace-provider-oauth.d.ts +48 -0
  539. package/dist/server/workspace-provider-oauth.d.ts.map +1 -0
  540. package/dist/server/workspace-provider-oauth.js +415 -0
  541. package/dist/server/workspace-provider-oauth.js.map +1 -0
  542. package/dist/styles/agent-native.css +9 -0
  543. package/dist/templates/chat/app/i18n/en-US.ts +3 -3
  544. package/dist/templates/chat/app/lib/agent-page.tsx +10 -1
  545. package/dist/templates/default/app/i18n/en-US.ts +3 -3
  546. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
  547. package/dist/templates/workspace-root/.env.example +12 -0
  548. package/dist/workspace-connections/index.d.ts +1 -0
  549. package/dist/workspace-connections/index.d.ts.map +1 -1
  550. package/dist/workspace-connections/index.js +1 -0
  551. package/dist/workspace-connections/index.js.map +1 -1
  552. package/dist/workspace-connections/lifecycle.d.ts +16 -0
  553. package/dist/workspace-connections/lifecycle.d.ts.map +1 -0
  554. package/dist/workspace-connections/lifecycle.js +14 -0
  555. package/dist/workspace-connections/lifecycle.js.map +1 -0
  556. package/dist/workspace-connections/store.d.ts.map +1 -1
  557. package/dist/workspace-connections/store.js +16 -0
  558. package/dist/workspace-connections/store.js.map +1 -1
  559. package/package.json +10 -3
  560. package/src/templates/chat/app/i18n/en-US.ts +3 -3
  561. package/src/templates/chat/app/lib/agent-page.spec.tsx +10 -1
  562. package/src/templates/chat/app/lib/agent-page.tsx +10 -1
  563. package/src/templates/default/app/i18n/en-US.ts +3 -3
  564. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
  565. package/src/templates/workspace-root/.env.example +12 -0
@@ -220,7 +220,7 @@ type AgentPanelStyle = React.CSSProperties & {
220
220
  "--agent-sidebar-width"?: string;
221
221
  };
222
222
  const AGENT_PANEL_HEADER_CLASS =
223
- "agent-native-shell-topbar relative z-[240] flex h-12 shrink-0 items-center justify-between gap-2 border-b border-border";
223
+ "agent-native-shell-topbar relative z-[240] flex h-12 shrink-0 items-center justify-between gap-2";
224
224
  const AGENT_PANEL_HEADER_STYLE = {
225
225
  paddingLeft: 8,
226
226
  paddingRight: 8,
@@ -422,6 +422,12 @@ export function shouldShowAgentPanelChatTabBar(
422
422
  return mainTabs.length > 1 || hasSubTabs;
423
423
  }
424
424
 
425
+ export function shouldShowAgentPanelSidebarChatTabs(
426
+ tabs: MultiTabAssistantChatHeaderProps["tabs"],
427
+ ) {
428
+ return tabs.some((tab) => !tab.parentThreadId);
429
+ }
430
+
425
431
  export function shouldShowAgentPanelPageNewChatButton(
426
432
  tabs: MultiTabAssistantChatHeaderProps["tabs"],
427
433
  activeTabId: string,
@@ -588,16 +594,9 @@ export interface AgentPanelProps extends Omit<
588
594
  storageKey?: string;
589
595
  /** Restore the previously active chat thread on mount. Default: true. */
590
596
  restoreActiveThread?: boolean;
591
- /**
592
- * Bind the chat to a specific resource (deck, design, dashboard, ...).
593
- * When set, chats started inside the panel inherit this scope and tuck
594
- * away when the user leaves that resource. General chats stay visible
595
- * across resource navigation. Scoped chats get a context badge with a
596
- * Detach escape hatch. Templates compute this from the current route —
597
- * see the `Layout` files for each template.
598
- */
597
+ /** Ambient resource context rendered as a composer chip. */
599
598
  scope?: import("./use-chat-threads.js").ChatThreadScope | null;
600
- /** Show the compact scope chip above the composer. Default: true. */
599
+ /** @deprecated Scope context now appears inside the composer. */
601
600
  showScopeBadge?: MultiTabAssistantChatProps["showScopeBadge"];
602
601
  /** Stable browser tab id used for tab-scoped app-state context. */
603
602
  browserTabId?: string;
@@ -1230,7 +1229,7 @@ function AgentPanelInner({
1230
1229
  />
1231
1230
  }
1232
1231
  />
1233
- {!onCollapse && mode === "chat" && (
1232
+ {mode === "chat" && (
1234
1233
  <IconTooltip content={t("agentPanel.newChat")}>
1235
1234
  <button
1236
1235
  onClick={addTab}
@@ -1567,147 +1566,289 @@ function AgentPanelInner({
1567
1566
  closeAllTabs,
1568
1567
  showHistory,
1569
1568
  toggleHistory,
1570
- }: MultiTabAssistantChatHeaderProps) => (
1571
- <div
1572
- className="agent-sidebar-chat-header flex flex-col shrink-0"
1573
- data-agent-sidebar-chat-header={onCollapse ? "" : undefined}
1574
- data-agent-sidebar-chat-header-active={
1575
- headerMenuOpen || feedbackOpen ? "" : undefined
1576
- }
1577
- >
1578
- {/* Top bar: mode buttons + actions */}
1569
+ }: MultiTabAssistantChatHeaderProps) => {
1570
+ const { activeTab, childTabs, focusParentId, hasSubTabs, mainTabs } =
1571
+ getAgentPanelChatTabGroups(tabs, activeTabId);
1572
+ const showSidebarChatTabs =
1573
+ Boolean(onCollapse) &&
1574
+ mode === "chat" &&
1575
+ shouldShowAgentPanelSidebarChatTabs(tabs);
1576
+
1577
+ return (
1579
1578
  <div
1580
- className={AGENT_PANEL_HEADER_CLASS}
1581
- style={AGENT_PANEL_HEADER_STYLE}
1579
+ className="agent-sidebar-chat-header flex flex-col shrink-0"
1580
+ data-agent-sidebar-chat-header={onCollapse ? "" : undefined}
1581
+ data-agent-sidebar-chat-header-active={
1582
+ headerMenuOpen || feedbackOpen ? "" : undefined
1583
+ }
1582
1584
  >
1583
- <div className="flex min-w-0 flex-1 items-center gap-1 overflow-hidden">
1584
- {shouldShowAgentPanelModeButtons(Boolean(onCollapse))
1585
- ? renderModeButtons(mode)
1586
- : null}
1587
- </div>
1588
- <div className="flex items-center gap-0.5">
1589
- {renderHeaderActions({
1590
- activeChatSessionId: activeTabId,
1591
- activeTabId,
1592
- activeTabMessageCount,
1593
- addTab,
1594
- clearActiveTab,
1595
- closeAllTabs,
1596
- closeOtherTabs,
1597
- closeTab,
1598
- showHistory,
1599
- tabs,
1600
- toggleHistory,
1601
- })}
1585
+ {/* Top bar: chat tabs/mode buttons + actions */}
1586
+ <div
1587
+ className={cn(
1588
+ AGENT_PANEL_HEADER_CLASS,
1589
+ !onCollapse && "border-b border-border",
1590
+ )}
1591
+ style={AGENT_PANEL_HEADER_STYLE}
1592
+ >
1593
+ <div className="flex min-w-0 flex-1 items-center gap-1 overflow-hidden">
1594
+ {showSidebarChatTabs ? (
1595
+ <div className="agent-tabs-scroll flex min-w-0 flex-1 items-center gap-0.5 overflow-x-auto">
1596
+ {mainTabs.map((tab) => {
1597
+ const isActive =
1598
+ tab.id === activeTabId ||
1599
+ (tab.id === focusParentId &&
1600
+ activeTab?.parentThreadId === tab.id);
1601
+ return (
1602
+ <div
1603
+ key={tab.id}
1604
+ role="button"
1605
+ tabIndex={0}
1606
+ ref={isActive ? activeTabRefCb : undefined}
1607
+ onClick={() => setActiveTabId(tab.id)}
1608
+ onKeyDown={activateOnKeyDown(() =>
1609
+ setActiveTabId(tab.id),
1610
+ )}
1611
+ className={cn(
1612
+ "agent-tab relative flex shrink-0 items-center gap-1 rounded-md px-2.5 py-1.5 text-[11px] font-medium cursor-pointer max-w-[150px]",
1613
+ isActive
1614
+ ? "bg-accent text-foreground"
1615
+ : "text-muted-foreground hover:bg-accent hover:text-foreground",
1616
+ )}
1617
+ >
1618
+ <span className="truncate pe-1">{tab.label}</span>
1619
+ {tab.status === "running" && (
1620
+ <span className="h-1.5 w-1.5 shrink-0 rounded-full bg-muted-foreground/50 animate-pulse" />
1621
+ )}
1622
+ <button
1623
+ type="button"
1624
+ aria-label="Close tab"
1625
+ onClick={(e) => {
1626
+ e.stopPropagation();
1627
+ closeTab(tab.id);
1628
+ }}
1629
+ className="agent-tab-close flex items-center justify-end text-muted-foreground hover:text-foreground"
1630
+ style={{
1631
+ position: "absolute",
1632
+ right: 0,
1633
+ top: 0,
1634
+ bottom: 0,
1635
+ width: 28,
1636
+ paddingRight: 6,
1637
+ borderRadius: "0 6px 6px 0",
1638
+ background:
1639
+ "linear-gradient(to right, transparent, hsl(var(--accent)) 40%)",
1640
+ }}
1641
+ >
1642
+ <IconX size={10} />
1643
+ </button>
1644
+ </div>
1645
+ );
1646
+ })}
1647
+ </div>
1648
+ ) : shouldShowAgentPanelModeButtons(Boolean(onCollapse)) ? (
1649
+ renderModeButtons(mode)
1650
+ ) : null}
1651
+ </div>
1652
+ <div className="flex items-center gap-0.5">
1653
+ {renderHeaderActions({
1654
+ activeChatSessionId: activeTabId,
1655
+ activeTabId,
1656
+ activeTabMessageCount,
1657
+ addTab,
1658
+ clearActiveTab,
1659
+ closeAllTabs,
1660
+ closeOtherTabs,
1661
+ closeTab,
1662
+ showHistory,
1663
+ tabs,
1664
+ toggleHistory,
1665
+ })}
1666
+ </div>
1602
1667
  </div>
1603
- </div>
1604
- {mode === "chat" && chatNotice ? (
1605
- <div className="border-b border-border">{chatNotice}</div>
1606
- ) : null}
1607
- {/* Tab bar: only visible when there is actually more than one tab to switch between. */}
1608
- {showTabBar &&
1609
- (mode === "chat" || (mode === "cli" && canUseCodeTools)) &&
1610
- (() => {
1611
- const {
1612
- activeTab,
1613
- childTabs,
1614
- focusParentId,
1615
- hasSubTabs,
1616
- mainTabs,
1617
- } = getAgentPanelChatTabGroups(tabs, activeTabId);
1618
- const showChatTabBar =
1619
- mode === "chat" &&
1620
- shouldShowAgentPanelChatTabBar(tabs, activeTabId);
1621
- const showCliTabBar =
1622
- mode === "cli" &&
1623
- canUseCodeTools &&
1624
- shouldShowAgentPanelCliTabBar(cliTabs);
1625
-
1626
- if (!showChatTabBar && !showCliTabBar) return null;
1627
-
1628
- return (
1629
- <>
1630
- <div className="flex items-center px-2 py-1 border-b border-border gap-0.5">
1631
- <div className="agent-tabs-scroll flex items-center gap-0.5 min-w-0 overflow-x-auto flex-1">
1632
- {mode === "chat"
1633
- ? mainTabs.map((tab) => {
1634
- // Highlight the parent tab if a child is active
1635
- const isActive =
1636
- tab.id === activeTabId ||
1637
- (tab.id === focusParentId &&
1638
- activeTab?.parentThreadId === tab.id);
1639
- return (
1640
- <div
1641
- key={tab.id}
1642
- role="button"
1643
- tabIndex={0}
1644
- ref={isActive ? activeTabRefCb : undefined}
1645
- onClick={() => setActiveTabId(tab.id)}
1646
- onKeyDown={activateOnKeyDown(() =>
1647
- setActiveTabId(tab.id),
1648
- )}
1649
- className={cn(
1650
- "agent-tab relative flex shrink-0 items-center gap-1 rounded-md px-2.5 py-1.5 text-[11px] font-medium cursor-pointer max-w-[150px]",
1651
- isActive
1652
- ? "bg-accent text-foreground"
1653
- : "text-muted-foreground hover:bg-accent hover:text-foreground",
1654
- )}
1655
- >
1656
- <span className="truncate pe-1">{tab.label}</span>
1657
- {tab.status === "running" && (
1658
- <span className="h-1.5 w-1.5 shrink-0 rounded-full bg-muted-foreground/50 animate-pulse" />
1659
- )}
1660
- <button
1661
- type="button"
1662
- aria-label="Close tab"
1663
- onClick={(e) => {
1664
- e.stopPropagation();
1665
- closeTab(tab.id);
1666
- }}
1667
- className="agent-tab-close flex items-center justify-end text-muted-foreground hover:text-foreground"
1668
- style={{
1669
- position: "absolute",
1670
- right: 0,
1671
- top: 0,
1672
- bottom: 0,
1673
- width: 28,
1674
- paddingRight: 6,
1675
- borderRadius: "0 6px 6px 0",
1676
- background:
1677
- "linear-gradient(to right, transparent, hsl(var(--accent)) 40%)",
1678
- }}
1668
+ {mode === "chat" && chatNotice ? (
1669
+ <div className="border-b border-border">{chatNotice}</div>
1670
+ ) : null}
1671
+ {/* Tab bar: only visible when there is actually more than one tab to switch between. */}
1672
+ {showTabBar &&
1673
+ (mode === "chat" || (mode === "cli" && canUseCodeTools)) &&
1674
+ (() => {
1675
+ const showChatTabBar =
1676
+ mode === "chat" &&
1677
+ shouldShowAgentPanelChatTabBar(tabs, activeTabId);
1678
+ const showCliTabBar =
1679
+ mode === "cli" &&
1680
+ canUseCodeTools &&
1681
+ shouldShowAgentPanelCliTabBar(cliTabs);
1682
+
1683
+ if (!showChatTabBar && !showCliTabBar) return null;
1684
+
1685
+ return (
1686
+ <>
1687
+ {!showSidebarChatTabs && (
1688
+ <div className="flex items-center px-2 py-1 border-b border-border gap-0.5">
1689
+ <div className="agent-tabs-scroll flex items-center gap-0.5 min-w-0 overflow-x-auto flex-1">
1690
+ {mode === "chat"
1691
+ ? mainTabs.map((tab) => {
1692
+ // Highlight the parent tab if a child is active
1693
+ const isActive =
1694
+ tab.id === activeTabId ||
1695
+ (tab.id === focusParentId &&
1696
+ activeTab?.parentThreadId === tab.id);
1697
+ return (
1698
+ <div
1699
+ key={tab.id}
1700
+ role="button"
1701
+ tabIndex={0}
1702
+ ref={isActive ? activeTabRefCb : undefined}
1703
+ onClick={() => setActiveTabId(tab.id)}
1704
+ onKeyDown={activateOnKeyDown(() =>
1705
+ setActiveTabId(tab.id),
1706
+ )}
1707
+ className={cn(
1708
+ "agent-tab relative flex shrink-0 items-center gap-1 rounded-md px-2.5 py-1.5 text-[11px] font-medium cursor-pointer max-w-[150px]",
1709
+ isActive
1710
+ ? "bg-accent text-foreground"
1711
+ : "text-muted-foreground hover:bg-accent hover:text-foreground",
1712
+ )}
1713
+ >
1714
+ <span className="truncate pe-1">
1715
+ {tab.label}
1716
+ </span>
1717
+ {tab.status === "running" && (
1718
+ <span className="h-1.5 w-1.5 shrink-0 rounded-full bg-muted-foreground/50 animate-pulse" />
1719
+ )}
1720
+ <button
1721
+ type="button"
1722
+ aria-label="Close tab"
1723
+ onClick={(e) => {
1724
+ e.stopPropagation();
1725
+ closeTab(tab.id);
1726
+ }}
1727
+ className="agent-tab-close flex items-center justify-end text-muted-foreground hover:text-foreground"
1728
+ style={{
1729
+ position: "absolute",
1730
+ right: 0,
1731
+ top: 0,
1732
+ bottom: 0,
1733
+ width: 28,
1734
+ paddingRight: 6,
1735
+ borderRadius: "0 6px 6px 0",
1736
+ background:
1737
+ "linear-gradient(to right, transparent, hsl(var(--accent)) 40%)",
1738
+ }}
1739
+ >
1740
+ <IconX size={10} />
1741
+ </button>
1742
+ </div>
1743
+ );
1744
+ })
1745
+ : cliTabs.map((id, i) => (
1746
+ <div
1747
+ key={id}
1748
+ role="button"
1749
+ tabIndex={0}
1750
+ ref={
1751
+ id === activeCliTab
1752
+ ? activeTabRefCb
1753
+ : undefined
1754
+ }
1755
+ onClick={() => setActiveCliTab(id)}
1756
+ onKeyDown={activateOnKeyDown(() =>
1757
+ setActiveCliTab(id),
1758
+ )}
1759
+ className={cn(
1760
+ "agent-tab relative flex shrink-0 items-center gap-1 rounded-md px-2.5 py-1.5 text-[11px] font-medium cursor-pointer",
1761
+ id === activeCliTab
1762
+ ? "bg-accent text-foreground"
1763
+ : "text-muted-foreground hover:bg-accent hover:text-foreground",
1764
+ )}
1679
1765
  >
1680
- <IconX size={10} />
1681
- </button>
1682
- </div>
1683
- );
1684
- })
1685
- : cliTabs.map((id, i) => (
1766
+ <span>Terminal {i + 1}</span>
1767
+ <button
1768
+ type="button"
1769
+ aria-label="Close tab"
1770
+ onClick={(e) => {
1771
+ e.stopPropagation();
1772
+ closeCliTab(id);
1773
+ }}
1774
+ className="agent-tab-close flex items-center justify-end text-muted-foreground hover:text-foreground"
1775
+ style={{
1776
+ position: "absolute",
1777
+ right: 0,
1778
+ top: 0,
1779
+ bottom: 0,
1780
+ width: 28,
1781
+ paddingRight: 6,
1782
+ borderRadius: "0 6px 6px 0",
1783
+ background:
1784
+ "linear-gradient(to right, transparent, hsl(var(--accent)) 40%)",
1785
+ }}
1786
+ >
1787
+ <IconX size={10} />
1788
+ </button>
1789
+ </div>
1790
+ ))}
1791
+ </div>
1792
+ </div>
1793
+ )}
1794
+ {/* Sub-agent tab row — shown when the active context has children */}
1795
+ {mode === "chat" && hasSubTabs && (
1796
+ <div
1797
+ className={cn(
1798
+ "flex items-center px-2 py-0.5 gap-0.5 bg-muted/30",
1799
+ !showSidebarChatTabs && "border-b border-border",
1800
+ )}
1801
+ >
1802
+ <div className="agent-tabs-scroll flex items-center gap-0.5 min-w-0 overflow-x-auto flex-1">
1803
+ <div
1804
+ role="button"
1805
+ tabIndex={0}
1806
+ onClick={() => setActiveTabId(focusParentId)}
1807
+ onKeyDown={activateOnKeyDown(() =>
1808
+ setActiveTabId(focusParentId),
1809
+ )}
1810
+ className={cn(
1811
+ "flex shrink-0 items-center gap-1 rounded-md px-2 py-1 text-[10px] font-medium cursor-pointer",
1812
+ activeTabId === focusParentId
1813
+ ? "bg-accent text-foreground"
1814
+ : "text-muted-foreground hover:bg-accent hover:text-foreground",
1815
+ )}
1816
+ >
1817
+ Main
1818
+ </div>
1819
+ {childTabs.map((tab) => (
1686
1820
  <div
1687
- key={id}
1821
+ key={tab.id}
1688
1822
  role="button"
1689
1823
  tabIndex={0}
1690
1824
  ref={
1691
- id === activeCliTab ? activeTabRefCb : undefined
1825
+ tab.id === activeTabId
1826
+ ? activeTabRefCb
1827
+ : undefined
1692
1828
  }
1693
- onClick={() => setActiveCliTab(id)}
1829
+ onClick={() => setActiveTabId(tab.id)}
1694
1830
  onKeyDown={activateOnKeyDown(() =>
1695
- setActiveCliTab(id),
1831
+ setActiveTabId(tab.id),
1696
1832
  )}
1697
1833
  className={cn(
1698
- "agent-tab relative flex shrink-0 items-center gap-1 rounded-md px-2.5 py-1.5 text-[11px] font-medium cursor-pointer",
1699
- id === activeCliTab
1834
+ "agent-tab relative flex shrink-0 items-center gap-1 rounded-md px-2 py-1 text-[10px] font-medium cursor-pointer max-w-[140px]",
1835
+ tab.id === activeTabId
1700
1836
  ? "bg-accent text-foreground"
1701
1837
  : "text-muted-foreground hover:bg-accent hover:text-foreground",
1702
1838
  )}
1703
1839
  >
1704
- <span>Terminal {i + 1}</span>
1840
+ <span className="truncate pe-1">
1841
+ {tab.subAgentName || tab.label}
1842
+ </span>
1843
+ {tab.status === "running" && (
1844
+ <span className="h-1 w-1 shrink-0 rounded-full bg-muted-foreground/50 animate-pulse" />
1845
+ )}
1705
1846
  <button
1706
1847
  type="button"
1707
1848
  aria-label="Close tab"
1708
1849
  onClick={(e) => {
1709
1850
  e.stopPropagation();
1710
- closeCliTab(id);
1851
+ closeTab(tab.id);
1711
1852
  }}
1712
1853
  className="agent-tab-close flex items-center justify-end text-muted-foreground hover:text-foreground"
1713
1854
  style={{
@@ -1715,96 +1856,26 @@ function AgentPanelInner({
1715
1856
  right: 0,
1716
1857
  top: 0,
1717
1858
  bottom: 0,
1718
- width: 28,
1719
- paddingRight: 6,
1859
+ width: 24,
1860
+ paddingRight: 4,
1720
1861
  borderRadius: "0 6px 6px 0",
1721
1862
  background:
1722
1863
  "linear-gradient(to right, transparent, hsl(var(--accent)) 40%)",
1723
1864
  }}
1724
1865
  >
1725
- <IconX size={10} />
1866
+ <IconX size={8} />
1726
1867
  </button>
1727
1868
  </div>
1728
1869
  ))}
1729
- </div>
1730
- </div>
1731
- {/* Sub-agent tab row — shown when the active context has children */}
1732
- {mode === "chat" && hasSubTabs && (
1733
- <div className="flex items-center px-2 py-0.5 border-b border-border gap-0.5 bg-muted/30">
1734
- <div className="agent-tabs-scroll flex items-center gap-0.5 min-w-0 overflow-x-auto flex-1">
1735
- <div
1736
- role="button"
1737
- tabIndex={0}
1738
- onClick={() => setActiveTabId(focusParentId)}
1739
- onKeyDown={activateOnKeyDown(() =>
1740
- setActiveTabId(focusParentId),
1741
- )}
1742
- className={cn(
1743
- "flex shrink-0 items-center gap-1 rounded-md px-2 py-1 text-[10px] font-medium cursor-pointer",
1744
- activeTabId === focusParentId
1745
- ? "bg-accent text-foreground"
1746
- : "text-muted-foreground hover:bg-accent hover:text-foreground",
1747
- )}
1748
- >
1749
- Main
1750
1870
  </div>
1751
- {childTabs.map((tab) => (
1752
- <div
1753
- key={tab.id}
1754
- role="button"
1755
- tabIndex={0}
1756
- ref={
1757
- tab.id === activeTabId ? activeTabRefCb : undefined
1758
- }
1759
- onClick={() => setActiveTabId(tab.id)}
1760
- onKeyDown={activateOnKeyDown(() =>
1761
- setActiveTabId(tab.id),
1762
- )}
1763
- className={cn(
1764
- "agent-tab relative flex shrink-0 items-center gap-1 rounded-md px-2 py-1 text-[10px] font-medium cursor-pointer max-w-[140px]",
1765
- tab.id === activeTabId
1766
- ? "bg-accent text-foreground"
1767
- : "text-muted-foreground hover:bg-accent hover:text-foreground",
1768
- )}
1769
- >
1770
- <span className="truncate pe-1">
1771
- {tab.subAgentName || tab.label}
1772
- </span>
1773
- {tab.status === "running" && (
1774
- <span className="h-1 w-1 shrink-0 rounded-full bg-muted-foreground/50 animate-pulse" />
1775
- )}
1776
- <button
1777
- type="button"
1778
- aria-label="Close tab"
1779
- onClick={(e) => {
1780
- e.stopPropagation();
1781
- closeTab(tab.id);
1782
- }}
1783
- className="agent-tab-close flex items-center justify-end text-muted-foreground hover:text-foreground"
1784
- style={{
1785
- position: "absolute",
1786
- right: 0,
1787
- top: 0,
1788
- bottom: 0,
1789
- width: 24,
1790
- paddingRight: 4,
1791
- borderRadius: "0 6px 6px 0",
1792
- background:
1793
- "linear-gradient(to right, transparent, hsl(var(--accent)) 40%)",
1794
- }}
1795
- >
1796
- <IconX size={8} />
1797
- </button>
1798
- </div>
1799
- ))}
1800
1871
  </div>
1801
- </div>
1802
- )}
1803
- </>
1804
- );
1805
- })()}
1806
- </div>
1807
- ),
1872
+ )}
1873
+ </>
1874
+ );
1875
+ })()}
1876
+ </div>
1877
+ );
1878
+ },
1808
1879
  [
1809
1880
  mode,
1810
1881
  renderHeaderActions,
@@ -2034,15 +2105,23 @@ const FULLSCREEN_CHAT_COLUMN_MAX_PX = 684;
2034
2105
  function ResizeHandle({
2035
2106
  position,
2036
2107
  onDrag,
2108
+ onResizeStart,
2109
+ onResizeEnd,
2037
2110
  }: {
2038
2111
  position: "left" | "right";
2039
2112
  onDrag: (delta: number) => void;
2113
+ onResizeStart: () => void;
2114
+ onResizeEnd: () => void;
2040
2115
  }) {
2041
2116
  const ref = useRef<HTMLDivElement>(null);
2042
2117
  const dragging = useRef(false);
2043
2118
  const lastX = useRef(0);
2044
2119
  const onDragRef = useRef(onDrag);
2120
+ const onResizeStartRef = useRef(onResizeStart);
2121
+ const onResizeEndRef = useRef(onResizeEnd);
2045
2122
  onDragRef.current = onDrag;
2123
+ onResizeStartRef.current = onResizeStart;
2124
+ onResizeEndRef.current = onResizeEnd;
2046
2125
  const GRAB_ZONE = 5; // px on each side of the border
2047
2126
 
2048
2127
  // All drag logic runs via document-level listeners so the 1px-wide
@@ -2059,6 +2138,7 @@ function ResizeHandle({
2059
2138
  e.preventDefault();
2060
2139
  dragging.current = true;
2061
2140
  lastX.current = e.clientX;
2141
+ onResizeStartRef.current();
2062
2142
  document.body.style.cursor = "col-resize";
2063
2143
  document.body.style.userSelect = "none";
2064
2144
  }
@@ -2088,6 +2168,7 @@ function ResizeHandle({
2088
2168
  dragging.current = false;
2089
2169
  document.body.style.cursor = "";
2090
2170
  document.body.style.userSelect = "";
2171
+ onResizeEndRef.current();
2091
2172
  }
2092
2173
 
2093
2174
  // mouseup covers the normal release-inside-the-page case; window blur
@@ -2113,6 +2194,7 @@ function ResizeHandle({
2113
2194
  // selection app-wide until reload.
2114
2195
  document.body.style.userSelect = "";
2115
2196
  dragging.current = false;
2197
+ onResizeEndRef.current();
2116
2198
  };
2117
2199
  }, [position]);
2118
2200
 
@@ -2512,7 +2594,8 @@ export interface AgentChatSurfaceProps extends AgentPanelProps {
2512
2594
  /**
2513
2595
  * Layout treatment for the reusable chat surface. Use "page" when rendering
2514
2596
  * chat as the primary route content instead of inside the sidebar shell.
2515
- * Default: "panel".
2597
+ * Default: "panel". Inline header and chat-tab chrome are hidden by default;
2598
+ * pass `showHeader` or `showTabBar` to opt into those controls.
2516
2599
  */
2517
2600
  mode?: AgentChatSurfaceMode;
2518
2601
  /**
@@ -2541,13 +2624,15 @@ export function shouldAllowAgentChatSurfaceSettingsMode(
2541
2624
  * Reusable chat surface backed by AgentPanel internals.
2542
2625
  *
2543
2626
  * This gives page-level routes the same tabbed conversations, composer,
2544
- * model controls, scoped chat behavior, and recovery boundary used by the
2627
+ * model controls, context chips, and recovery boundary used by the
2545
2628
  * sidebar without introducing a second chat implementation.
2546
2629
  */
2547
2630
  export function AgentChatSurface({
2548
2631
  mode = "panel",
2549
2632
  className,
2550
2633
  defaultMode = "chat",
2634
+ showHeader = false,
2635
+ showTabBar = false,
2551
2636
  isFullscreen,
2552
2637
  style,
2553
2638
  chatViewTransition = false,
@@ -2556,12 +2641,14 @@ export function AgentChatSurface({
2556
2641
  }: AgentChatSurfaceProps) {
2557
2642
  const pageMode = mode === "page";
2558
2643
  const defaultShowPageNewChatButton =
2559
- shouldDefaultAgentChatSurfacePageNewChatButton(mode, props.showTabBar);
2644
+ shouldDefaultAgentChatSurfacePageNewChatButton(mode, showTabBar);
2560
2645
 
2561
2646
  return (
2562
2647
  <AgentPanel
2563
2648
  {...props}
2564
2649
  defaultMode={defaultMode}
2650
+ showHeader={showHeader}
2651
+ showTabBar={showTabBar}
2565
2652
  isFullscreen={isFullscreen ?? pageMode}
2566
2653
  allowSettingsMode={shouldAllowAgentChatSurfaceSettingsMode(
2567
2654
  mode,
@@ -2626,14 +2713,9 @@ export interface AgentSidebarProps {
2626
2713
  openOnChatRunning?: boolean;
2627
2714
  /** Override the fullscreen menu action, for templates with a chat-first page. */
2628
2715
  onFullscreenRequest?: () => void;
2629
- /**
2630
- * Bind chats to a resource. When set, every chat started here is
2631
- * scoped to `{type, id}`, the tab bar/history partition by that scope,
2632
- * and a "Working on {label}" badge appears with a Detach option.
2633
- * Templates compute this from the active route (see template layouts).
2634
- */
2716
+ /** Ambient resource context rendered as a composer chip. */
2635
2717
  scope?: import("./use-chat-threads.js").ChatThreadScope | null;
2636
- /** Show the compact scope chip above the composer. Default: true. */
2718
+ /** @deprecated Scope context now appears inside the composer. */
2637
2719
  showScopeBadge?: MultiTabAssistantChatProps["showScopeBadge"];
2638
2720
  /** Stable browser tab id used for tab-scoped app-state context. */
2639
2721
  browserTabId?: string;
@@ -2680,6 +2762,7 @@ export function AgentSidebar({
2680
2762
  );
2681
2763
  const [presentationMode, setPresentationMode] = useState(false);
2682
2764
  const [width, setWidth] = useState(initialWidth);
2765
+ const [isResizing, setIsResizing] = useState(false);
2683
2766
  const [fullscreen, setFullscreen] = useState(() => {
2684
2767
  // Force-disable on mobile: a Claude-style centered column makes no sense
2685
2768
  // when the sidebar already covers most of the viewport.
@@ -3046,6 +3129,8 @@ export function AgentSidebar({
3046
3129
  return next;
3047
3130
  });
3048
3131
  }, []);
3132
+ const handleResizeStart = useCallback(() => setIsResizing(true), []);
3133
+ const handleResizeEnd = useCallback(() => setIsResizing(false), []);
3049
3134
 
3050
3135
  const isLeft = position === "left";
3051
3136
  // Fullscreen only applies on desktop — on mobile the existing overlay is
@@ -3161,7 +3246,12 @@ export function AgentSidebar({
3161
3246
  const sidebar = shouldRenderPanel ? (
3162
3247
  <>
3163
3248
  {showResizeHandle && !isLeft && (
3164
- <ResizeHandle position={position} onDrag={handleDrag} />
3249
+ <ResizeHandle
3250
+ position={position}
3251
+ onDrag={handleDrag}
3252
+ onResizeStart={handleResizeStart}
3253
+ onResizeEnd={handleResizeEnd}
3254
+ />
3165
3255
  )}
3166
3256
  <div
3167
3257
  className={cn(
@@ -3179,6 +3269,7 @@ export function AgentSidebar({
3179
3269
  data-agent-sidebar-layout={panelLayout}
3180
3270
  data-agent-sidebar-position={position}
3181
3271
  data-agent-sidebar-state={panelOpen ? "open" : "closed"}
3272
+ data-agent-sidebar-resizing={isResizing ? "true" : undefined}
3182
3273
  style={
3183
3274
  chatViewTransition
3184
3275
  ? getAgentChatViewTransitionStyle(panelStyle)
@@ -3214,7 +3305,12 @@ export function AgentSidebar({
3214
3305
  </div>
3215
3306
  </div>
3216
3307
  {showResizeHandle && isLeft && (
3217
- <ResizeHandle position={position} onDrag={handleDrag} />
3308
+ <ResizeHandle
3309
+ position={position}
3310
+ onDrag={handleDrag}
3311
+ onResizeStart={handleResizeStart}
3312
+ onResizeEnd={handleResizeEnd}
3313
+ />
3218
3314
  )}
3219
3315
  </>
3220
3316
  ) : null;
@@ -3224,6 +3320,7 @@ export function AgentSidebar({
3224
3320
  <div
3225
3321
  className="agent-sidebar-shell flex min-w-0 flex-1 h-screen overflow-hidden"
3226
3322
  data-agent-sidebar-position={position}
3323
+ data-agent-sidebar-resizing={isResizing ? "true" : undefined}
3227
3324
  >
3228
3325
  <AgentNativeRouteWarmup />
3229
3326
  {/* Mobile backdrop — tapping it closes the sidebar */}
@@ -3256,6 +3353,7 @@ export function AgentSidebar({
3256
3353
  ? "open"
3257
3354
  : "closed"
3258
3355
  }
3356
+ data-agent-sidebar-resizing={isResizing ? "true" : undefined}
3259
3357
  >
3260
3358
  {/* Screen-refresh key: the agent's `refresh-screen` tool bumps this
3261
3359
  counter, remounting only the main content subtree so it re-fetches