@agent-native/core 0.88.0 → 0.90.2

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 (1866) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +96 -2
  3. package/corpus/core/docs/content/agent-native-toolkit.mdx +87 -146
  4. package/corpus/core/docs/content/cloneable-saas.mdx +19 -19
  5. package/corpus/core/docs/content/components.mdx +16 -4
  6. package/corpus/core/docs/content/data-programs.mdx +329 -0
  7. package/corpus/core/docs/content/deployment.mdx +9 -9
  8. package/corpus/core/docs/content/extensions.mdx +8 -7
  9. package/corpus/core/docs/content/generative-ui.mdx +5 -3
  10. package/corpus/core/docs/content/key-concepts.mdx +6 -9
  11. package/corpus/core/docs/content/locales/ar-SA/agent-native-toolkit.mdx +100 -70
  12. package/corpus/core/docs/content/locales/ar-SA/cloneable-saas.mdx +19 -19
  13. package/corpus/core/docs/content/locales/ar-SA/components.mdx +12 -2
  14. package/corpus/core/docs/content/locales/ar-SA/data-programs.mdx +329 -0
  15. package/corpus/core/docs/content/locales/ar-SA/deployment.mdx +8 -9
  16. package/corpus/core/docs/content/locales/ar-SA/extensions.mdx +6 -4
  17. package/corpus/core/docs/content/locales/ar-SA/key-concepts.mdx +7 -9
  18. package/corpus/core/docs/content/locales/ar-SA/real-time-collaboration.mdx +9 -10
  19. package/corpus/core/docs/content/locales/de-DE/agent-native-toolkit.mdx +100 -74
  20. package/corpus/core/docs/content/locales/de-DE/cloneable-saas.mdx +19 -19
  21. package/corpus/core/docs/content/locales/de-DE/components.mdx +12 -2
  22. package/corpus/core/docs/content/locales/de-DE/data-programs.mdx +329 -0
  23. package/corpus/core/docs/content/locales/de-DE/deployment.mdx +8 -9
  24. package/corpus/core/docs/content/locales/de-DE/extensions.mdx +6 -4
  25. package/corpus/core/docs/content/locales/de-DE/key-concepts.mdx +8 -10
  26. package/corpus/core/docs/content/locales/de-DE/real-time-collaboration.mdx +9 -10
  27. package/corpus/core/docs/content/locales/es-ES/agent-native-toolkit.mdx +100 -74
  28. package/corpus/core/docs/content/locales/es-ES/cloneable-saas.mdx +19 -19
  29. package/corpus/core/docs/content/locales/es-ES/components.mdx +12 -2
  30. package/corpus/core/docs/content/locales/es-ES/data-programs.mdx +329 -0
  31. package/corpus/core/docs/content/locales/es-ES/deployment.mdx +8 -9
  32. package/corpus/core/docs/content/locales/es-ES/extensions.mdx +6 -4
  33. package/corpus/core/docs/content/locales/es-ES/key-concepts.mdx +8 -10
  34. package/corpus/core/docs/content/locales/es-ES/real-time-collaboration.mdx +9 -10
  35. package/corpus/core/docs/content/locales/fr-FR/agent-native-toolkit.mdx +100 -76
  36. package/corpus/core/docs/content/locales/fr-FR/cloneable-saas.mdx +19 -19
  37. package/corpus/core/docs/content/locales/fr-FR/components.mdx +12 -2
  38. package/corpus/core/docs/content/locales/fr-FR/data-programs.mdx +329 -0
  39. package/corpus/core/docs/content/locales/fr-FR/deployment.mdx +8 -9
  40. package/corpus/core/docs/content/locales/fr-FR/extensions.mdx +6 -4
  41. package/corpus/core/docs/content/locales/fr-FR/key-concepts.mdx +8 -10
  42. package/corpus/core/docs/content/locales/fr-FR/real-time-collaboration.mdx +9 -10
  43. package/corpus/core/docs/content/locales/hi-IN/agent-native-toolkit.mdx +100 -71
  44. package/corpus/core/docs/content/locales/hi-IN/cloneable-saas.mdx +19 -19
  45. package/corpus/core/docs/content/locales/hi-IN/components.mdx +20 -10
  46. package/corpus/core/docs/content/locales/hi-IN/data-programs.mdx +329 -0
  47. package/corpus/core/docs/content/locales/hi-IN/deployment.mdx +8 -9
  48. package/corpus/core/docs/content/locales/hi-IN/extensions.mdx +6 -4
  49. package/corpus/core/docs/content/locales/hi-IN/key-concepts.mdx +8 -10
  50. package/corpus/core/docs/content/locales/hi-IN/real-time-collaboration.mdx +9 -10
  51. package/corpus/core/docs/content/locales/ja-JP/agent-native-toolkit.mdx +100 -64
  52. package/corpus/core/docs/content/locales/ja-JP/cloneable-saas.mdx +19 -19
  53. package/corpus/core/docs/content/locales/ja-JP/components.mdx +12 -2
  54. package/corpus/core/docs/content/locales/ja-JP/data-programs.mdx +329 -0
  55. package/corpus/core/docs/content/locales/ja-JP/deployment.mdx +8 -9
  56. package/corpus/core/docs/content/locales/ja-JP/extensions.mdx +6 -4
  57. package/corpus/core/docs/content/locales/ja-JP/key-concepts.mdx +9 -11
  58. package/corpus/core/docs/content/locales/ja-JP/real-time-collaboration.mdx +9 -10
  59. package/corpus/core/docs/content/locales/ko-KR/agent-native-toolkit.mdx +100 -60
  60. package/corpus/core/docs/content/locales/ko-KR/cloneable-saas.mdx +19 -19
  61. package/corpus/core/docs/content/locales/ko-KR/components.mdx +20 -10
  62. package/corpus/core/docs/content/locales/ko-KR/data-programs.mdx +329 -0
  63. package/corpus/core/docs/content/locales/ko-KR/deployment.mdx +8 -9
  64. package/corpus/core/docs/content/locales/ko-KR/extensions.mdx +16 -14
  65. package/corpus/core/docs/content/locales/ko-KR/key-concepts.mdx +9 -11
  66. package/corpus/core/docs/content/locales/ko-KR/real-time-collaboration.mdx +9 -10
  67. package/corpus/core/docs/content/locales/pt-BR/agent-native-toolkit.mdx +100 -74
  68. package/corpus/core/docs/content/locales/pt-BR/cloneable-saas.mdx +19 -19
  69. package/corpus/core/docs/content/locales/pt-BR/components.mdx +12 -2
  70. package/corpus/core/docs/content/locales/pt-BR/data-programs.mdx +329 -0
  71. package/corpus/core/docs/content/locales/pt-BR/deployment.mdx +8 -9
  72. package/corpus/core/docs/content/locales/pt-BR/extensions.mdx +6 -4
  73. package/corpus/core/docs/content/locales/pt-BR/key-concepts.mdx +8 -11
  74. package/corpus/core/docs/content/locales/pt-BR/real-time-collaboration.mdx +9 -10
  75. package/corpus/core/docs/content/locales/zh-CN/agent-native-toolkit.mdx +100 -58
  76. package/corpus/core/docs/content/locales/zh-CN/cloneable-saas.mdx +19 -19
  77. package/corpus/core/docs/content/locales/zh-CN/components.mdx +20 -10
  78. package/corpus/core/docs/content/locales/zh-CN/data-programs.mdx +329 -0
  79. package/corpus/core/docs/content/locales/zh-CN/deployment.mdx +7 -9
  80. package/corpus/core/docs/content/locales/zh-CN/extensions.mdx +16 -14
  81. package/corpus/core/docs/content/locales/zh-CN/key-concepts.mdx +7 -11
  82. package/corpus/core/docs/content/locales/zh-CN/real-time-collaboration.mdx +10 -11
  83. package/corpus/core/docs/content/locales/zh-TW/agent-native-toolkit.mdx +100 -58
  84. package/corpus/core/docs/content/locales/zh-TW/cloneable-saas.mdx +19 -19
  85. package/corpus/core/docs/content/locales/zh-TW/components.mdx +20 -10
  86. package/corpus/core/docs/content/locales/zh-TW/data-programs.mdx +329 -0
  87. package/corpus/core/docs/content/locales/zh-TW/deployment.mdx +7 -9
  88. package/corpus/core/docs/content/locales/zh-TW/extensions.mdx +16 -14
  89. package/corpus/core/docs/content/locales/zh-TW/key-concepts.mdx +7 -11
  90. package/corpus/core/docs/content/locales/zh-TW/real-time-collaboration.mdx +10 -11
  91. package/corpus/core/docs/content/real-time-collaboration.mdx +10 -11
  92. package/corpus/core/docs/content/toolkit-app-adapters.mdx +46 -0
  93. package/corpus/core/docs/content/toolkit-collaboration-ui.mdx +48 -0
  94. package/corpus/core/docs/content/toolkit-sharing-ui.mdx +33 -0
  95. package/corpus/core/docs/content/toolkit-shell-hooks.mdx +27 -0
  96. package/corpus/core/docs/content/toolkit-ui.mdx +69 -0
  97. package/corpus/core/package.json +5 -1
  98. package/corpus/core/src/agent/durable-background.ts +53 -0
  99. package/corpus/core/src/agent/engine/ai-sdk-engine.ts +7 -1
  100. package/corpus/core/src/agent/engine/anthropic-engine.ts +29 -1
  101. package/corpus/core/src/agent/engine/builder-engine.ts +1 -0
  102. package/corpus/core/src/agent/engine/output-tokens.ts +26 -13
  103. package/corpus/core/src/agent/engine/registry.ts +45 -26
  104. package/corpus/core/src/agent/engine/translate-ai-sdk.ts +56 -7
  105. package/corpus/core/src/agent/engine/translate-anthropic.ts +43 -1
  106. package/corpus/core/src/agent/engine/types.ts +16 -0
  107. package/corpus/core/src/agent/model-config.ts +100 -0
  108. package/corpus/core/src/agent/production-agent.ts +492 -241
  109. package/corpus/core/src/agent/runtime-context.ts +50 -12
  110. package/corpus/core/src/agent/tool-result-images.ts +178 -0
  111. package/corpus/core/src/brand-kit/fig/index.ts +8 -4
  112. package/corpus/core/src/client/AgentPanel.tsx +89 -32
  113. package/corpus/core/src/client/AssistantChat.tsx +95 -46
  114. package/corpus/core/src/client/KeepTabOpenNotice.tsx +176 -0
  115. package/corpus/core/src/client/MultiTabAssistantChat.tsx +7 -0
  116. package/corpus/core/src/client/RunStuckBanner.tsx +13 -1
  117. package/corpus/core/src/client/chat/run-recovery.tsx +7 -1
  118. package/corpus/core/src/client/clipboard.ts +17 -13
  119. package/corpus/core/src/client/components/AgentPresenceChip.tsx +4 -69
  120. package/corpus/core/src/client/components/LiveCursorOverlay.tsx +5 -240
  121. package/corpus/core/src/client/components/PresenceBar.tsx +4 -346
  122. package/corpus/core/src/client/components/RecentEditHighlights.tsx +4 -219
  123. package/corpus/core/src/client/components/RemoteSelectionRings.tsx +5 -220
  124. package/corpus/core/src/client/composer/TiptapComposer.tsx +94 -38
  125. package/corpus/core/src/client/db-admin/SqlEditor.tsx +13 -3
  126. package/corpus/core/src/client/dynamic-suggestions.ts +6 -1
  127. package/corpus/core/src/client/extensions/ExtensionViewer.tsx +0 -14
  128. package/corpus/core/src/client/extensions/ExtensionsListPage.tsx +29 -30
  129. package/corpus/core/src/client/extensions/ExtensionsSidebarSection.tsx +2 -1
  130. package/corpus/core/src/client/host-bridge.ts +29 -8
  131. package/corpus/core/src/client/i18n.tsx +7 -1
  132. package/corpus/core/src/client/index.ts +5 -0
  133. package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +34 -69
  134. package/corpus/core/src/client/rich-markdown-editor/SharedRichEditor.tsx +4 -0
  135. package/corpus/core/src/client/rich-markdown-editor/useCollabReconcile.ts +18 -7
  136. package/corpus/core/src/client/settings/SettingsPanel.tsx +409 -230
  137. package/corpus/core/src/client/settings/SettingsTabsPage.tsx +5 -7
  138. package/corpus/core/src/client/settings/index.ts +5 -1
  139. package/corpus/core/src/client/sharing/VisibilityBadge.tsx +4 -37
  140. package/corpus/core/src/client/use-action.ts +39 -2
  141. package/corpus/core/src/client/use-db-sync.ts +44 -18
  142. package/corpus/core/src/client/use-run-stuck-detection.ts +10 -1
  143. package/corpus/core/src/coding-tools/run-code.ts +473 -74
  144. package/corpus/core/src/coding-tools/sandbox/background.ts +406 -0
  145. package/corpus/core/src/coding-tools/sandbox/executions-store.ts +517 -0
  146. package/corpus/core/src/coding-tools/sandbox/index.ts +53 -13
  147. package/corpus/core/src/coding-tools/sandbox/local-child-process-adapter.ts +61 -4
  148. package/corpus/core/src/collab/client.ts +870 -562
  149. package/corpus/core/src/collab/presence.ts +12 -23
  150. package/corpus/core/src/collab/recent-edits.ts +13 -32
  151. package/corpus/core/src/data-programs/actions.ts +335 -0
  152. package/corpus/core/src/data-programs/contract.ts +284 -0
  153. package/corpus/core/src/data-programs/execute.ts +693 -0
  154. package/corpus/core/src/data-programs/index.ts +72 -0
  155. package/corpus/core/src/data-programs/schema.ts +148 -0
  156. package/corpus/core/src/data-programs/store.ts +755 -0
  157. package/corpus/core/src/db/create-get-db.ts +32 -2
  158. package/corpus/core/src/deploy/build.ts +34 -0
  159. package/corpus/core/src/extensions/actions.ts +2 -2
  160. package/corpus/core/src/file-upload/builder.ts +11 -0
  161. package/corpus/core/src/integrations/webhook-handler.ts +27 -8
  162. package/corpus/core/src/local-artifacts/index.ts +1 -1
  163. package/corpus/core/src/localization/default-messages.ts +1 -2
  164. package/corpus/core/src/mcp-client/index.ts +29 -0
  165. package/corpus/core/src/onboarding/default-steps.ts +5 -2
  166. package/corpus/core/src/resources/store.ts +34 -3
  167. package/corpus/core/src/scripts/agent-engines/list-agent-engines.ts +4 -8
  168. package/corpus/core/src/scripts/agent-engines/test-agent-engine.ts +9 -2
  169. package/corpus/core/src/scripts/db/tool-mode.ts +2 -2
  170. package/corpus/core/src/scripts/resources/migrate-learnings.ts +9 -13
  171. package/corpus/core/src/server/agent-chat-plugin.ts +154 -62
  172. package/corpus/core/src/server/agent-discovery.ts +67 -7
  173. package/corpus/core/src/server/auth.ts +90 -3
  174. package/corpus/core/src/server/builder-design-systems.ts +2 -2
  175. package/corpus/core/src/server/core-routes-plugin.ts +119 -22
  176. package/corpus/core/src/server/credential-provider.ts +28 -8
  177. package/corpus/core/src/server/csrf.ts +3 -0
  178. package/corpus/core/src/server/framework-request-handler.ts +52 -4
  179. package/corpus/core/src/server/oauth-helpers.ts +11 -1
  180. package/corpus/core/src/server/onboarding-html.ts +80 -48
  181. package/corpus/core/src/server/prompts/shared-rules.ts +2 -2
  182. package/corpus/core/src/server/transcribe-voice.ts +93 -9
  183. package/corpus/core/src/styles/agent-native.css +57 -45
  184. package/corpus/core/src/templates/default/.agents/skills/actions/SKILL.md +55 -0
  185. package/corpus/core/src/templates/default/AGENTS.md +11 -14
  186. package/corpus/core/src/templates/default/actions/navigate.ts +1 -1
  187. package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +0 -1
  188. package/corpus/core/src/templates/default/app/i18n/de-DE.ts +0 -1
  189. package/corpus/core/src/templates/default/app/i18n/en-US.ts +0 -1
  190. package/corpus/core/src/templates/default/app/i18n/es-ES.ts +0 -1
  191. package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +0 -1
  192. package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +0 -1
  193. package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +0 -1
  194. package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +0 -1
  195. package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +0 -1
  196. package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +0 -1
  197. package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +0 -1
  198. package/corpus/core/src/templates/default/app/routes/settings.tsx +22 -33
  199. package/corpus/core/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +20 -7
  200. package/corpus/core/src/templates/headless/AGENTS.md +9 -6
  201. package/corpus/core/src/templates/workspace-core/.agents/skills/actions/SKILL.md +55 -0
  202. package/corpus/core/src/templates/workspace-core/.agents/skills/data-programs/SKILL.md +128 -0
  203. package/corpus/core/src/templates/workspace-core/.agents/skills/harness-agents/SKILL.md +10 -4
  204. package/corpus/core/src/vite/agents-bundle-plugin.ts +26 -1
  205. package/corpus/core/src/vite/client.ts +12 -0
  206. package/corpus/templates/analytics/.agents/skills/actions/SKILL.md +55 -0
  207. package/corpus/templates/analytics/.agents/skills/analysis-workspace/SKILL.md +8 -0
  208. package/corpus/templates/analytics/.agents/skills/data-programs/SKILL.md +348 -0
  209. package/corpus/templates/analytics/.agents/skills/provider-api/SKILL.md +10 -0
  210. package/corpus/templates/analytics/AGENTS.md +31 -32
  211. package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +1 -1
  212. package/corpus/templates/analytics/actions/delete-data-source-credentials.ts +32 -0
  213. package/corpus/templates/analytics/actions/ensure-risk-meeting-dashboard.ts +247 -0
  214. package/corpus/templates/analytics/actions/update-data-source-credentials.ts +123 -0
  215. package/corpus/templates/analytics/app/components/InlineMetric.tsx +2 -2
  216. package/corpus/templates/analytics/app/components/dashboard/CumulativeNetChart.tsx +2 -7
  217. package/corpus/templates/analytics/app/components/dashboard/DataTable.tsx +11 -16
  218. package/corpus/templates/analytics/app/components/dashboard/DateRangePicker.tsx +1 -2
  219. package/corpus/templates/analytics/app/components/dashboard/MetricCard.tsx +2 -7
  220. package/corpus/templates/analytics/app/components/dashboard/RecentActivity.tsx +3 -6
  221. package/corpus/templates/analytics/app/components/dashboard/RevenueChart.tsx +1 -6
  222. package/corpus/templates/analytics/app/components/dashboard/RevenueComparisonChart.tsx +2 -7
  223. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +11 -15
  224. package/corpus/templates/analytics/app/components/dashboard/StatsCard.tsx +1 -7
  225. package/corpus/templates/analytics/app/components/dashboard/TimeSeriesChart.tsx +2 -7
  226. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +16 -16
  227. package/corpus/templates/analytics/app/components/layout/Header.tsx +2 -2
  228. package/corpus/templates/analytics/app/components/layout/HeaderActions.tsx +2 -1
  229. package/corpus/templates/analytics/app/components/layout/Layout.tsx +2 -2
  230. package/corpus/templates/analytics/app/components/layout/MobileNav.tsx +33 -17
  231. package/corpus/templates/analytics/app/components/layout/NewAnalysisDialog.tsx +6 -6
  232. package/corpus/templates/analytics/app/components/layout/NewDashboardDialog.tsx +4 -3
  233. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +119 -68
  234. package/corpus/templates/analytics/app/components/ui/alert-dialog.tsx +1 -0
  235. package/corpus/templates/analytics/app/components/ui/alert.tsx +1 -0
  236. package/corpus/templates/analytics/app/components/ui/avatar.tsx +1 -0
  237. package/corpus/templates/analytics/app/components/ui/badge.tsx +1 -0
  238. package/corpus/templates/analytics/app/components/ui/button.tsx +1 -0
  239. package/corpus/templates/analytics/app/components/ui/calendar.tsx +1 -1
  240. package/corpus/templates/analytics/app/components/ui/card.tsx +1 -0
  241. package/corpus/templates/analytics/app/components/ui/checkbox.tsx +1 -0
  242. package/corpus/templates/analytics/app/components/ui/collapsible.tsx +1 -0
  243. package/corpus/templates/analytics/app/components/ui/command.tsx +1 -0
  244. package/corpus/templates/analytics/app/components/ui/date-picker.tsx +1 -0
  245. package/corpus/templates/analytics/app/components/ui/dialog.tsx +1 -0
  246. package/corpus/templates/analytics/app/components/ui/dropdown-menu.tsx +1 -0
  247. package/corpus/templates/analytics/app/components/ui/input.tsx +1 -0
  248. package/corpus/templates/analytics/app/components/ui/label.tsx +1 -0
  249. package/corpus/templates/analytics/app/components/ui/popover.tsx +1 -0
  250. package/corpus/templates/analytics/app/components/ui/progress.tsx +1 -0
  251. package/corpus/templates/analytics/app/components/ui/select.tsx +1 -0
  252. package/corpus/templates/analytics/app/components/ui/sheet.tsx +1 -0
  253. package/corpus/templates/analytics/app/components/ui/skeleton.tsx +1 -0
  254. package/corpus/templates/analytics/app/components/ui/sonner.tsx +1 -0
  255. package/corpus/templates/analytics/app/components/ui/spinner.tsx +1 -0
  256. package/corpus/templates/analytics/app/components/ui/switch.tsx +1 -0
  257. package/corpus/templates/analytics/app/components/ui/table.tsx +1 -0
  258. package/corpus/templates/analytics/app/components/ui/tabs.tsx +1 -0
  259. package/corpus/templates/analytics/app/components/ui/textarea.tsx +1 -0
  260. package/corpus/templates/analytics/app/components/ui/toaster.tsx +1 -0
  261. package/corpus/templates/analytics/app/components/ui/toggle-group.tsx +1 -0
  262. package/corpus/templates/analytics/app/components/ui/toolkit-provider.tsx +12 -0
  263. package/corpus/templates/analytics/app/components/ui/tooltip.tsx +1 -0
  264. package/corpus/templates/analytics/app/global.css +26 -3
  265. package/corpus/templates/analytics/app/i18n/zh-TW.ts +27 -4
  266. package/corpus/templates/analytics/app/i18n-data.ts +277 -42
  267. package/corpus/templates/analytics/app/pages/Agents.tsx +19 -19
  268. package/corpus/templates/analytics/app/pages/DataDictionary.tsx +21 -21
  269. package/corpus/templates/analytics/app/pages/DataSources.tsx +31 -54
  270. package/corpus/templates/analytics/app/pages/NotFound.tsx +2 -1
  271. package/corpus/templates/analytics/app/pages/Placeholder.tsx +2 -1
  272. package/corpus/templates/analytics/app/pages/Settings.tsx +19 -37
  273. package/corpus/templates/analytics/app/pages/adhoc/DashboardSkeleton.tsx +3 -2
  274. package/corpus/templates/analytics/app/pages/adhoc/_shared/KpiChart.tsx +8 -13
  275. package/corpus/templates/analytics/app/pages/adhoc/_shared/components/DateRangeInput.tsx +1 -2
  276. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/ChartTypePicker.tsx +2 -4
  277. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/DateRangePicker.tsx +1 -2
  278. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/EventCombobox.tsx +7 -7
  279. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/EventPanel.tsx +2 -1
  280. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/EventRow.tsx +2 -1
  281. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/ExplorerChart.tsx +3 -8
  282. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/FilterBuilder.tsx +5 -4
  283. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/GroupByPicker.tsx +2 -1
  284. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/PropertyCombobox.tsx +7 -7
  285. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/PropertyValueCombobox.tsx +7 -7
  286. package/corpus/templates/analytics/app/pages/adhoc/explorer/components/SqlPreview.tsx +1 -1
  287. package/corpus/templates/analytics/app/pages/adhoc/explorer/index.tsx +16 -16
  288. package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/ChartCard.tsx +16 -21
  289. package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +32 -32
  290. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/DashboardFilterBar.tsx +14 -14
  291. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/EmailReportDialog.tsx +14 -13
  292. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +200 -52
  293. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +23 -28
  294. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/ViewSqlPopover.tsx +13 -12
  295. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/ViewsMenu.tsx +15 -15
  296. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +32 -36
  297. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +2 -1
  298. package/corpus/templates/analytics/app/pages/analyses/AnalysesList.tsx +8 -7
  299. package/corpus/templates/analytics/app/pages/analyses/AnalysisDetail.tsx +19 -19
  300. package/corpus/templates/analytics/app/pages/analyses/LegacyFusionAnalysis.tsx +11 -15
  301. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +14 -14
  302. package/corpus/templates/analytics/app/pages/sessions/SessionDevToolsPanel.tsx +7 -12
  303. package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +12 -12
  304. package/corpus/templates/analytics/app/pages/settings/AlertRulesSettingsCard.tsx +25 -25
  305. package/corpus/templates/analytics/app/root.tsx +22 -19
  306. package/corpus/templates/analytics/app/routes/catalog.tsx +8 -8
  307. package/corpus/templates/analytics/changelog/2026-07-06-dashboard-lists-and-headers-stay-compact.md +6 -0
  308. package/corpus/templates/analytics/changelog/2026-07-06-dashboards-can-now-chart-data-programs-saved-server-side-scr.md +6 -0
  309. package/corpus/templates/analytics/changelog/2026-07-06-extension-pages-and-mobile-headers-now-share-one-background-shade.md +6 -0
  310. package/corpus/templates/analytics/changelog/2026-07-06-mobile-chat-header-is-more-compact-and-the-menu-button-opens-navigation.md +5 -0
  311. package/corpus/templates/analytics/learnings.defaults.md +36 -0
  312. package/corpus/templates/analytics/seeds/data-programs/risk-meeting-cohort.js +254 -0
  313. package/corpus/templates/analytics/seeds/data-programs/risk-meeting-pylon-early-warning.js +184 -0
  314. package/corpus/templates/analytics/server/handlers/sql-query.ts +1 -1
  315. package/corpus/templates/analytics/server/lib/dashboard-panel-query.ts +109 -1
  316. package/corpus/templates/assets/.agents/skills/actions/SKILL.md +55 -0
  317. package/corpus/templates/assets/.agents/skills/asset-generation/SKILL.md +5 -0
  318. package/corpus/templates/assets/.agents/skills/logo-composite/SKILL.md +34 -6
  319. package/corpus/templates/assets/AGENTS.md +23 -4
  320. package/corpus/templates/assets/actions/_generation-preset-settings.ts +48 -0
  321. package/corpus/templates/assets/actions/_helpers.ts +8 -1
  322. package/corpus/templates/assets/actions/_preset-skeleton-validation.ts +64 -0
  323. package/corpus/templates/assets/actions/create-generation-preset.ts +11 -3
  324. package/corpus/templates/assets/actions/generate-image-batch.ts +7 -2
  325. package/corpus/templates/assets/actions/generate-image.ts +342 -25
  326. package/corpus/templates/assets/actions/get-library.ts +4 -3
  327. package/corpus/templates/assets/actions/navigate.ts +2 -1
  328. package/corpus/templates/assets/actions/refresh-generation-run.ts +5 -1
  329. package/corpus/templates/assets/actions/update-asset.ts +1 -0
  330. package/corpus/templates/assets/actions/update-generation-preset.ts +8 -1
  331. package/corpus/templates/assets/actions/view-screen.ts +8 -1
  332. package/corpus/templates/assets/app/components/create/RecentDraftsSection.tsx +3 -2
  333. package/corpus/templates/assets/app/components/generation/GenerationResults.tsx +25 -11
  334. package/corpus/templates/assets/app/components/layout/Header.tsx +1 -1
  335. package/corpus/templates/assets/app/components/layout/PageShell.tsx +4 -4
  336. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +12 -12
  337. package/corpus/templates/assets/app/components/library/CreateLibraryDialog.tsx +8 -8
  338. package/corpus/templates/assets/app/components/library/EditLibraryDialog.tsx +7 -7
  339. package/corpus/templates/assets/app/components/library/LibraryCard.tsx +8 -8
  340. package/corpus/templates/assets/app/components/library/LibraryPresetGrid.tsx +3 -2
  341. package/corpus/templates/assets/app/components/ui/alert-dialog.tsx +1 -0
  342. package/corpus/templates/assets/app/components/ui/badge.tsx +1 -0
  343. package/corpus/templates/assets/app/components/ui/button.tsx +1 -0
  344. package/corpus/templates/assets/app/components/ui/card.tsx +1 -0
  345. package/corpus/templates/assets/app/components/ui/checkbox.tsx +1 -0
  346. package/corpus/templates/assets/app/components/ui/dialog.tsx +1 -0
  347. package/corpus/templates/assets/app/components/ui/dropdown-menu.tsx +1 -0
  348. package/corpus/templates/assets/app/components/ui/input.tsx +1 -0
  349. package/corpus/templates/assets/app/components/ui/label.tsx +1 -0
  350. package/corpus/templates/assets/app/components/ui/popover.tsx +1 -0
  351. package/corpus/templates/assets/app/components/ui/select.tsx +1 -0
  352. package/corpus/templates/assets/app/components/ui/separator.tsx +1 -0
  353. package/corpus/templates/assets/app/components/ui/sheet.tsx +1 -0
  354. package/corpus/templates/assets/app/components/ui/skeleton.tsx +1 -0
  355. package/corpus/templates/assets/app/components/ui/sonner.tsx +1 -0
  356. package/corpus/templates/assets/app/components/ui/spinner.tsx +1 -0
  357. package/corpus/templates/assets/app/components/ui/tabs.tsx +1 -0
  358. package/corpus/templates/assets/app/components/ui/toolkit-provider.tsx +12 -0
  359. package/corpus/templates/assets/app/components/ui/tooltip.tsx +1 -0
  360. package/corpus/templates/assets/app/global.css +1 -0
  361. package/corpus/templates/assets/app/hooks/use-image-model-menu.ts +1 -0
  362. package/corpus/templates/assets/app/hooks/use-navigation-state.ts +11 -0
  363. package/corpus/templates/assets/app/i18n/zh-TW.ts +64 -0
  364. package/corpus/templates/assets/app/i18n-data.ts +650 -0
  365. package/corpus/templates/assets/app/root.tsx +12 -9
  366. package/corpus/templates/assets/app/routes/asset.$id.tsx +21 -20
  367. package/corpus/templates/assets/app/routes/audit.tsx +15 -14
  368. package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +93 -87
  369. package/corpus/templates/assets/app/routes/brand-kits.$id_.presets.$presetId.tsx +1474 -0
  370. package/corpus/templates/assets/app/routes/library.tsx +74 -32
  371. package/corpus/templates/assets/app/routes/settings.tsx +21 -35
  372. package/corpus/templates/assets/changelog/2026-07-06-mobile-layouts-no-longer-stack-two-top-headers.md +5 -0
  373. package/corpus/templates/assets/server/lib/generation.ts +366 -44
  374. package/corpus/templates/assets/server/lib/image-processing.ts +252 -0
  375. package/corpus/templates/assets/server/lib/preset-skeleton.ts +137 -0
  376. package/corpus/templates/assets/shared/api.ts +47 -0
  377. package/corpus/templates/brain/.agents/skills/actions/SKILL.md +55 -0
  378. package/corpus/templates/brain/.agents/skills/ask-across-everything/SKILL.md +6 -1
  379. package/corpus/templates/brain/.agents/skills/brain/SKILL.md +63 -5
  380. package/corpus/templates/brain/.agents/skills/ingestion-and-connectors/SKILL.md +112 -0
  381. package/corpus/templates/brain/AGENTS.md +93 -8
  382. package/corpus/templates/brain/app/components/brain/CanonicalPreviewSheet.tsx +6 -5
  383. package/corpus/templates/brain/app/components/brain/Surface.tsx +3 -8
  384. package/corpus/templates/brain/app/components/layout/Layout.tsx +7 -7
  385. package/corpus/templates/brain/app/components/layout/Sidebar.tsx +6 -6
  386. package/corpus/templates/brain/app/components/ui/badge.tsx +1 -0
  387. package/corpus/templates/brain/app/components/ui/button.tsx +1 -0
  388. package/corpus/templates/brain/app/components/ui/card.tsx +1 -0
  389. package/corpus/templates/brain/app/components/ui/input.tsx +1 -0
  390. package/corpus/templates/brain/app/components/ui/label.tsx +1 -0
  391. package/corpus/templates/brain/app/components/ui/progress.tsx +1 -0
  392. package/corpus/templates/brain/app/components/ui/select.tsx +1 -0
  393. package/corpus/templates/brain/app/components/ui/separator.tsx +1 -0
  394. package/corpus/templates/brain/app/components/ui/sheet.tsx +1 -0
  395. package/corpus/templates/brain/app/components/ui/skeleton.tsx +1 -0
  396. package/corpus/templates/brain/app/components/ui/switch.tsx +1 -0
  397. package/corpus/templates/brain/app/components/ui/table.tsx +1 -0
  398. package/corpus/templates/brain/app/components/ui/textarea.tsx +1 -0
  399. package/corpus/templates/brain/app/components/ui/toolkit-provider.tsx +12 -0
  400. package/corpus/templates/brain/app/components/ui/tooltip.tsx +1 -0
  401. package/corpus/templates/brain/app/global.css +1 -0
  402. package/corpus/templates/brain/app/hooks/use-distillation-bridge.ts +9 -4
  403. package/corpus/templates/brain/app/root.tsx +11 -8
  404. package/corpus/templates/brain/app/routes/knowledge.tsx +19 -19
  405. package/corpus/templates/brain/app/routes/ops.tsx +18 -18
  406. package/corpus/templates/brain/app/routes/review.tsx +22 -27
  407. package/corpus/templates/brain/app/routes/search.tsx +20 -20
  408. package/corpus/templates/brain/app/routes/settings.tsx +25 -40
  409. package/corpus/templates/brain/app/routes/sources.tsx +23 -23
  410. package/corpus/templates/calendar/.agents/skills/actions/SKILL.md +55 -0
  411. package/corpus/templates/calendar/actions/find-a-time.ts +29 -16
  412. package/corpus/templates/calendar/actions/list-bookings.ts +33 -2
  413. package/corpus/templates/calendar/actions/list-events.ts +34 -8
  414. package/corpus/templates/calendar/actions/update-calendar-visual-preferences.ts +105 -34
  415. package/corpus/templates/calendar/app/components/ThemeToggle.tsx +5 -5
  416. package/corpus/templates/calendar/app/components/TimezoneCombobox.tsx +6 -6
  417. package/corpus/templates/calendar/app/components/booking/BookingConfirmation.tsx +2 -1
  418. package/corpus/templates/calendar/app/components/booking/BookingForm.tsx +9 -8
  419. package/corpus/templates/calendar/app/components/booking/DatePicker.tsx +2 -2
  420. package/corpus/templates/calendar/app/components/booking/TimeSlotPicker.tsx +3 -2
  421. package/corpus/templates/calendar/app/components/calendar/AddCalendarDialog.tsx +10 -15
  422. package/corpus/templates/calendar/app/components/calendar/AttendeeAutocomplete.tsx +6 -6
  423. package/corpus/templates/calendar/app/components/calendar/CommandPalette.tsx +73 -3
  424. package/corpus/templates/calendar/app/components/calendar/CreateEventDialog.tsx +27 -27
  425. package/corpus/templates/calendar/app/components/calendar/DayView.tsx +553 -267
  426. package/corpus/templates/calendar/app/components/calendar/DeleteEventDialog.tsx +9 -12
  427. package/corpus/templates/calendar/app/components/calendar/EventAttendeesSection.tsx +10 -13
  428. package/corpus/templates/calendar/app/components/calendar/EventDetailPanel.tsx +7 -7
  429. package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +21 -21
  430. package/corpus/templates/calendar/app/components/calendar/EventDialog.tsx +11 -11
  431. package/corpus/templates/calendar/app/components/calendar/EventOptionControls.tsx +9 -9
  432. package/corpus/templates/calendar/app/components/calendar/FindTimePanel.tsx +9 -9
  433. package/corpus/templates/calendar/app/components/calendar/GoogleConnectBanner.tsx +6 -6
  434. package/corpus/templates/calendar/app/components/calendar/GoogleSetupWizard.tsx +3 -3
  435. package/corpus/templates/calendar/app/components/calendar/GoogleSyncButton.tsx +1 -1
  436. package/corpus/templates/calendar/app/components/calendar/GuestNotificationDialog.tsx +8 -10
  437. package/corpus/templates/calendar/app/components/calendar/IntegrationsSidebar.tsx +12 -12
  438. package/corpus/templates/calendar/app/components/calendar/KeyboardShortcutsHelp.tsx +2 -2
  439. package/corpus/templates/calendar/app/components/calendar/MonthView.tsx +93 -41
  440. package/corpus/templates/calendar/app/components/calendar/PeopleSearchDialog.tsx +6 -6
  441. package/corpus/templates/calendar/app/components/calendar/WeekView.tsx +530 -299
  442. package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +229 -134
  443. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +135 -108
  444. package/corpus/templates/calendar/app/components/ui/alert-dialog.tsx +1 -0
  445. package/corpus/templates/calendar/app/components/ui/badge.tsx +1 -0
  446. package/corpus/templates/calendar/app/components/ui/button.tsx +1 -0
  447. package/corpus/templates/calendar/app/components/ui/card.tsx +1 -0
  448. package/corpus/templates/calendar/app/components/ui/checkbox.tsx +1 -0
  449. package/corpus/templates/calendar/app/components/ui/collapsible.tsx +1 -0
  450. package/corpus/templates/calendar/app/components/ui/command.tsx +1 -0
  451. package/corpus/templates/calendar/app/components/ui/dialog.tsx +1 -0
  452. package/corpus/templates/calendar/app/components/ui/dropdown-menu.tsx +1 -0
  453. package/corpus/templates/calendar/app/components/ui/input.tsx +1 -0
  454. package/corpus/templates/calendar/app/components/ui/label.tsx +1 -0
  455. package/corpus/templates/calendar/app/components/ui/popover.tsx +1 -0
  456. package/corpus/templates/calendar/app/components/ui/radio-group.tsx +1 -0
  457. package/corpus/templates/calendar/app/components/ui/select.tsx +1 -0
  458. package/corpus/templates/calendar/app/components/ui/separator.tsx +1 -0
  459. package/corpus/templates/calendar/app/components/ui/skeleton.tsx +1 -0
  460. package/corpus/templates/calendar/app/components/ui/spinner.tsx +1 -0
  461. package/corpus/templates/calendar/app/components/ui/switch.tsx +1 -0
  462. package/corpus/templates/calendar/app/components/ui/table.tsx +1 -0
  463. package/corpus/templates/calendar/app/components/ui/tabs.tsx +1 -0
  464. package/corpus/templates/calendar/app/components/ui/textarea.tsx +1 -0
  465. package/corpus/templates/calendar/app/components/ui/toolkit-provider.tsx +12 -0
  466. package/corpus/templates/calendar/app/components/ui/tooltip.tsx +1 -0
  467. package/corpus/templates/calendar/app/global.css +1 -0
  468. package/corpus/templates/calendar/app/hooks/use-event-drag.ts +63 -9
  469. package/corpus/templates/calendar/app/hooks/use-google-auth.ts +15 -27
  470. package/corpus/templates/calendar/app/hooks/use-grid-create-drag.ts +254 -0
  471. package/corpus/templates/calendar/app/hooks/use-mobile.ts +1 -0
  472. package/corpus/templates/calendar/app/hooks/use-view-preferences.ts +287 -21
  473. package/corpus/templates/calendar/app/hooks/use-zoom-auth.ts +56 -19
  474. package/corpus/templates/calendar/app/i18n/zh-TW.ts +3 -0
  475. package/corpus/templates/calendar/app/i18n-data.ts +31 -0
  476. package/corpus/templates/calendar/app/lib/event-colors.ts +29 -8
  477. package/corpus/templates/calendar/app/pages/AvailabilitySettings.tsx +11 -11
  478. package/corpus/templates/calendar/app/pages/BookingLinksPage.tsx +45 -50
  479. package/corpus/templates/calendar/app/pages/BookingPage.tsx +2 -2
  480. package/corpus/templates/calendar/app/pages/BookingsList.tsx +12 -12
  481. package/corpus/templates/calendar/app/pages/CalendarView.tsx +438 -271
  482. package/corpus/templates/calendar/app/pages/ManageBookingPage.tsx +13 -13
  483. package/corpus/templates/calendar/app/pages/Settings.tsx +15 -29
  484. package/corpus/templates/calendar/app/root.tsx +19 -15
  485. package/corpus/templates/calendar/app/routes/event.tsx +2 -2
  486. package/corpus/templates/calendar/changelog/2026-07-06-calendar-now-loads-view-preferences-much-more-efficiently.md +6 -0
  487. package/corpus/templates/calendar/changelog/2026-07-06-connected-calendars-keep-their-own-color-when-you-customize-.md +6 -0
  488. package/corpus/templates/calendar/changelog/2026-07-06-create-events-from-the-command-menu-with-natural-phrases-lik.md +6 -0
  489. package/corpus/templates/calendar/changelog/2026-07-06-drag-across-empty-week-or-day-slots-to-create-an-event-with-.md +6 -0
  490. package/corpus/templates/calendar/changelog/2026-07-06-dragging-and-resizing-events-is-much-smoother-especially-on-.md +6 -0
  491. package/corpus/templates/calendar/changelog/2026-07-06-each-connected-google-account-can-now-have-its-own-calendar-.md +6 -0
  492. package/corpus/templates/calendar/changelog/2026-07-06-events-spanning-multiple-days-now-show-on-every-day-they-cov.md +6 -0
  493. package/corpus/templates/calendar/changelog/2026-07-06-google-calendar-now-finishes-connecting-correctly-after-sign.md +6 -0
  494. package/corpus/templates/calendar/changelog/2026-07-06-public-booking-pages-respond-faster.md +6 -0
  495. package/corpus/templates/calendar/changelog/2026-07-06-the-app-header-no-longer-shows-the-global-notifications-bell.md +6 -0
  496. package/corpus/templates/calendar/package.json +1 -0
  497. package/corpus/templates/calendar/server/handlers/bookings.ts +46 -52
  498. package/corpus/templates/calendar/server/handlers/google-auth.ts +21 -5
  499. package/corpus/templates/calendar/server/lib/google-calendar.ts +32 -3
  500. package/corpus/templates/calendar/shared/calendar-view-preferences.ts +66 -2
  501. package/corpus/templates/chat/.agents/skills/actions/SKILL.md +55 -0
  502. package/corpus/templates/chat/app/components/layout/Layout.tsx +6 -6
  503. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +12 -12
  504. package/corpus/templates/chat/app/components/ui/button.tsx +1 -0
  505. package/corpus/templates/chat/app/components/ui/card.tsx +1 -0
  506. package/corpus/templates/chat/app/components/ui/dropdown-menu.tsx +1 -0
  507. package/corpus/templates/chat/app/components/ui/input.tsx +1 -0
  508. package/corpus/templates/chat/app/components/ui/label.tsx +1 -0
  509. package/corpus/templates/chat/app/components/ui/sheet.tsx +1 -0
  510. package/corpus/templates/chat/app/components/ui/toolkit-provider.tsx +12 -0
  511. package/corpus/templates/chat/app/components/ui/tooltip.tsx +1 -0
  512. package/corpus/templates/chat/app/global.css +1 -0
  513. package/corpus/templates/chat/app/root.tsx +7 -4
  514. package/corpus/templates/chat/app/routes/settings.tsx +6 -21
  515. package/corpus/templates/clips/.agents/skills/actions/SKILL.md +55 -0
  516. package/corpus/templates/clips/.agents/skills/video-sharing/SKILL.md +18 -4
  517. package/corpus/templates/clips/.env.example +8 -0
  518. package/corpus/templates/clips/actions/accept-invite.ts +3 -0
  519. package/corpus/templates/clips/actions/add-recording-to-space.ts +55 -27
  520. package/corpus/templates/clips/actions/add-vocabulary-term.ts +3 -1
  521. package/corpus/templates/clips/actions/archive-recording.ts +5 -12
  522. package/corpus/templates/clips/actions/cleanup-transcript.ts +5 -4
  523. package/corpus/templates/clips/actions/clear-edits.ts +42 -29
  524. package/corpus/templates/clips/actions/create-meeting.ts +87 -40
  525. package/corpus/templates/clips/actions/create-recording.ts +6 -3
  526. package/corpus/templates/clips/actions/delete-meeting.ts +25 -0
  527. package/corpus/templates/clips/actions/delete-recording-permanent.ts +3 -0
  528. package/corpus/templates/clips/actions/disconnect-calendar.ts +10 -4
  529. package/corpus/templates/clips/actions/export-insights-csv.ts +28 -8
  530. package/corpus/templates/clips/actions/finalize-meeting.ts +106 -33
  531. package/corpus/templates/clips/actions/finalize-recording.ts +201 -3
  532. package/corpus/templates/clips/actions/get-organization-insights.ts +51 -7
  533. package/corpus/templates/clips/actions/import-loom-recording.ts +17 -0
  534. package/corpus/templates/clips/actions/lib/audio-only-transcription.ts +18 -1
  535. package/corpus/templates/clips/actions/lib/create-recording-schema.ts +7 -1
  536. package/corpus/templates/clips/actions/lib/ensure-seekable-video.ts +16 -0
  537. package/corpus/templates/clips/actions/list-clip-views.ts +60 -0
  538. package/corpus/templates/clips/actions/regenerate-summary.ts +10 -0
  539. package/corpus/templates/clips/actions/remove-vocabulary-term.ts +59 -0
  540. package/corpus/templates/clips/actions/request-transcript.ts +170 -25
  541. package/corpus/templates/clips/actions/restore-recording.ts +5 -12
  542. package/corpus/templates/clips/actions/save-browser-transcript.ts +13 -2
  543. package/corpus/templates/clips/actions/set-chapters.ts +6 -15
  544. package/corpus/templates/clips/actions/set-thumbnail.ts +77 -36
  545. package/corpus/templates/clips/actions/split-recording.ts +49 -35
  546. package/corpus/templates/clips/actions/stitch-recordings.ts +7 -4
  547. package/corpus/templates/clips/actions/stop-meeting-recording.ts +15 -1
  548. package/corpus/templates/clips/actions/sync-calendars.ts +10 -108
  549. package/corpus/templates/clips/actions/trash-recording.ts +43 -14
  550. package/corpus/templates/clips/actions/trim-recording.ts +48 -27
  551. package/corpus/templates/clips/actions/undo-edit.ts +49 -37
  552. package/corpus/templates/clips/app/components/capture-install-options.tsx +6 -6
  553. package/corpus/templates/clips/app/components/dictate/vocabulary-section.tsx +208 -0
  554. package/corpus/templates/clips/app/components/editable-recording-title.tsx +2 -2
  555. package/corpus/templates/clips/app/components/editor/chapters-editor.tsx +7 -7
  556. package/corpus/templates/clips/app/components/editor/editor-toolbar.tsx +26 -26
  557. package/corpus/templates/clips/app/components/editor/split-button.tsx +5 -4
  558. package/corpus/templates/clips/app/components/editor/stitch-manager.tsx +9 -9
  559. package/corpus/templates/clips/app/components/editor/thumbnail-picker.tsx +11 -16
  560. package/corpus/templates/clips/app/components/editor/timeline.tsx +3 -3
  561. package/corpus/templates/clips/app/components/editor/transcript-editor.tsx +5 -5
  562. package/corpus/templates/clips/app/components/library/bulk-action-toolbar.tsx +4 -4
  563. package/corpus/templates/clips/app/components/library/create-space-dialog.tsx +8 -8
  564. package/corpus/templates/clips/app/components/library/empty-state.tsx +2 -1
  565. package/corpus/templates/clips/app/components/library/folder-tree.tsx +14 -14
  566. package/corpus/templates/clips/app/components/library/library-grid.tsx +24 -98
  567. package/corpus/templates/clips/app/components/library/library-layout.tsx +25 -21
  568. package/corpus/templates/clips/app/components/library/organization-switcher.tsx +11 -11
  569. package/corpus/templates/clips/app/components/library/recording-card.tsx +44 -50
  570. package/corpus/templates/clips/app/components/library/search-bar.tsx +5 -5
  571. package/corpus/templates/clips/app/components/library/sort-menu.tsx +5 -4
  572. package/corpus/templates/clips/app/components/library/tag-input.tsx +4 -4
  573. package/corpus/templates/clips/app/components/meetings/attendee-stack.tsx +2 -6
  574. package/corpus/templates/clips/app/components/meetings/auto-record-prompt.tsx +1 -1
  575. package/corpus/templates/clips/app/components/meetings/bullet-link.tsx +4 -4
  576. package/corpus/templates/clips/app/components/meetings/canvas-editor.tsx +5 -5
  577. package/corpus/templates/clips/app/components/meetings/meeting-card.tsx +3 -3
  578. package/corpus/templates/clips/app/components/meetings/quick-ask-sidebar.tsx +17 -9
  579. package/corpus/templates/clips/app/components/meetings/share-meeting-dialog.tsx +6 -11
  580. package/corpus/templates/clips/app/components/meetings/transcript-bubbles.tsx +215 -21
  581. package/corpus/templates/clips/app/components/player/access-password-prompt.tsx +3 -2
  582. package/corpus/templates/clips/app/components/player/comments-panel.tsx +14 -14
  583. package/corpus/templates/clips/app/components/player/delete-recording-menu.tsx +7 -6
  584. package/corpus/templates/clips/app/components/player/insights-panel.tsx +18 -6
  585. package/corpus/templates/clips/app/components/player/player-controls.tsx +42 -36
  586. package/corpus/templates/clips/app/components/player/reactions-tray.tsx +4 -4
  587. package/corpus/templates/clips/app/components/player/settings-panel.tsx +13 -12
  588. package/corpus/templates/clips/app/components/player/share-dialog.tsx +80 -49
  589. package/corpus/templates/clips/app/components/player/sign-in-prompt-dialog.tsx +3 -2
  590. package/corpus/templates/clips/app/components/player/timestamped-comment-button.tsx +2 -2
  591. package/corpus/templates/clips/app/components/player/transcript-panel.tsx +7 -7
  592. package/corpus/templates/clips/app/components/player/video-player.tsx +182 -15
  593. package/corpus/templates/clips/app/components/recorder/camera-visualizer.tsx +1 -1
  594. package/corpus/templates/clips/app/components/recorder/microphone-visualizer.tsx +1 -1
  595. package/corpus/templates/clips/app/components/recorder/pre-record-panel.tsx +49 -36
  596. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +399 -57
  597. package/corpus/templates/clips/app/components/recorder/recording-toolbar.tsx +6 -5
  598. package/corpus/templates/clips/app/components/recorder/storage-setup-card.tsx +7 -6
  599. package/corpus/templates/clips/app/components/sharing/share-ui.tsx +10 -10
  600. package/corpus/templates/clips/app/components/sharing/viewed-by-popover.tsx +132 -0
  601. package/corpus/templates/clips/app/components/ui/alert-dialog.tsx +1 -0
  602. package/corpus/templates/clips/app/components/ui/avatar.tsx +1 -0
  603. package/corpus/templates/clips/app/components/ui/badge.tsx +1 -0
  604. package/corpus/templates/clips/app/components/ui/button.tsx +1 -0
  605. package/corpus/templates/clips/app/components/ui/card.tsx +1 -0
  606. package/corpus/templates/clips/app/components/ui/checkbox.tsx +1 -0
  607. package/corpus/templates/clips/app/components/ui/collapsible.tsx +1 -0
  608. package/corpus/templates/clips/app/components/ui/context-menu.tsx +1 -0
  609. package/corpus/templates/clips/app/components/ui/dialog.tsx +1 -0
  610. package/corpus/templates/clips/app/components/ui/dropdown-menu.tsx +1 -0
  611. package/corpus/templates/clips/app/components/ui/input.tsx +1 -0
  612. package/corpus/templates/clips/app/components/ui/label.tsx +1 -0
  613. package/corpus/templates/clips/app/components/ui/popover.tsx +1 -0
  614. package/corpus/templates/clips/app/components/ui/scroll-area.tsx +1 -0
  615. package/corpus/templates/clips/app/components/ui/select.tsx +1 -0
  616. package/corpus/templates/clips/app/components/ui/separator.tsx +1 -0
  617. package/corpus/templates/clips/app/components/ui/sheet.tsx +1 -0
  618. package/corpus/templates/clips/app/components/ui/skeleton.tsx +1 -0
  619. package/corpus/templates/clips/app/components/ui/slider.tsx +1 -0
  620. package/corpus/templates/clips/app/components/ui/sonner.tsx +1 -0
  621. package/corpus/templates/clips/app/components/ui/spinner.tsx +1 -0
  622. package/corpus/templates/clips/app/components/ui/switch.tsx +1 -0
  623. package/corpus/templates/clips/app/components/ui/table.tsx +1 -0
  624. package/corpus/templates/clips/app/components/ui/tabs.tsx +1 -0
  625. package/corpus/templates/clips/app/components/ui/textarea.tsx +1 -0
  626. package/corpus/templates/clips/app/components/ui/toolkit-provider.tsx +12 -0
  627. package/corpus/templates/clips/app/components/ui/tooltip.tsx +1 -0
  628. package/corpus/templates/clips/app/components/workspace/branding-editor.tsx +5 -9
  629. package/corpus/templates/clips/app/components/workspace/insights-hub.tsx +9 -19
  630. package/corpus/templates/clips/app/components/workspace/invite-dialog.tsx +10 -9
  631. package/corpus/templates/clips/app/components/workspace/members-list.tsx +11 -10
  632. package/corpus/templates/clips/app/components/workspace/notifications-list.tsx +2 -1
  633. package/corpus/templates/clips/app/components/workspace/top-creators-table.tsx +3 -2
  634. package/corpus/templates/clips/app/components/workspace/top-videos-table.tsx +3 -2
  635. package/corpus/templates/clips/app/global.css +1 -0
  636. package/corpus/templates/clips/app/hooks/use-desktop-promo.ts +2 -1
  637. package/corpus/templates/clips/app/hooks/use-mobile.ts +1 -0
  638. package/corpus/templates/clips/app/hooks/use-player-shortcuts.ts +14 -10
  639. package/corpus/templates/clips/app/hooks/use-view-tracking.ts +14 -0
  640. package/corpus/templates/clips/app/i18n/ar-SA.ts +56 -0
  641. package/corpus/templates/clips/app/i18n/de-DE.ts +53 -0
  642. package/corpus/templates/clips/app/i18n/en-US.ts +52 -0
  643. package/corpus/templates/clips/app/i18n/es-ES.ts +53 -0
  644. package/corpus/templates/clips/app/i18n/fr-FR.ts +53 -0
  645. package/corpus/templates/clips/app/i18n/hi-IN.ts +52 -0
  646. package/corpus/templates/clips/app/i18n/ja-JP.ts +53 -0
  647. package/corpus/templates/clips/app/i18n/ko-KR.ts +52 -0
  648. package/corpus/templates/clips/app/i18n/pt-BR.ts +53 -0
  649. package/corpus/templates/clips/app/i18n/zh-CN.ts +51 -0
  650. package/corpus/templates/clips/app/i18n/zh-TW.ts +51 -0
  651. package/corpus/templates/clips/app/lib/recorder-preferences.ts +4 -0
  652. package/corpus/templates/clips/app/lib/timestamp-mapping.ts +5 -0
  653. package/corpus/templates/clips/app/root.tsx +26 -23
  654. package/corpus/templates/clips/app/routes/_app.dictate.tsx +39 -23
  655. package/corpus/templates/clips/app/routes/_app.library._index.tsx +27 -1
  656. package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +134 -39
  657. package/corpus/templates/clips/app/routes/_app.meetings._index.tsx +20 -20
  658. package/corpus/templates/clips/app/routes/_app.notifications.tsx +3 -3
  659. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +92 -60
  660. package/corpus/templates/clips/app/routes/_app.settings.organization.tsx +8 -13
  661. package/corpus/templates/clips/app/routes/_app.spaces._index.tsx +1 -1
  662. package/corpus/templates/clips/app/routes/_app.trash.tsx +96 -31
  663. package/corpus/templates/clips/app/routes/bug-report.done.tsx +1 -1
  664. package/corpus/templates/clips/app/routes/bug-report.tsx +11 -11
  665. package/corpus/templates/clips/app/routes/download.tsx +2 -2
  666. package/corpus/templates/clips/app/routes/embed.$shareId.tsx +2 -1
  667. package/corpus/templates/clips/app/routes/invite.$token.tsx +8 -13
  668. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +263 -251
  669. package/corpus/templates/clips/app/routes/record.tsx +185 -78
  670. package/corpus/templates/clips/app/routes/share.$shareId.tsx +51 -29
  671. package/corpus/templates/clips/app/routes/share.meeting.$meetingId.tsx +71 -16
  672. package/corpus/templates/clips/changelog/2026-07-05-mobile-clip-pages-use-a-tighter-viewer-layout-with-inline-ac.md +6 -0
  673. package/corpus/templates/clips/changelog/2026-07-06-ai-setup-now-switches-to-your-saved-provider-key-and-uses-fa.md +6 -0
  674. package/corpus/templates/clips/changelog/2026-07-06-browsers-that-can-t-play-a-clip-s-video-format-now-see-a-cle.md +6 -0
  675. package/corpus/templates/clips/changelog/2026-07-06-calendar-connections-no-longer-ask-you-to-reconnect-after-te.md +6 -0
  676. package/corpus/templates/clips/changelog/2026-07-06-chrome-extension-recordings-keep-your-selected-microphone.md +6 -0
  677. package/corpus/templates/clips/changelog/2026-07-06-clip-recordings-now-use-streaming-uploads-by-default.md +6 -0
  678. package/corpus/templates/clips/changelog/2026-07-06-clip-titles-in-the-library-grid-now-open-the-clip-instead-of.md +6 -0
  679. package/corpus/templates/clips/changelog/2026-07-06-desktop-countdown-now-dims-the-screen-before-recording.md +5 -0
  680. package/corpus/templates/clips/changelog/2026-07-06-desktop-popover-no-longer-drops-bluetooth-headphones-into-call-quality-mode.md +6 -0
  681. package/corpus/templates/clips/changelog/2026-07-06-desktop-recorder-now-refreshes-cameras-and-mics-when-the-pop.md +6 -0
  682. package/corpus/templates/clips/changelog/2026-07-06-desktop-recordings-keep-microphone-volume-clear-while-recor.md +5 -0
  683. package/corpus/templates/clips/changelog/2026-07-06-desktop-recordings-no-longer-get-stuck-optimizing-when-scree.md +6 -0
  684. package/corpus/templates/clips/changelog/2026-07-06-dictation-history-from-the-desktop-app-now-appears-in-the-di.md +6 -0
  685. package/corpus/templates/clips/changelog/2026-07-06-dictation-no-longer-overwrites-your-clipboard-and-messaging-.md +6 -0
  686. package/corpus/templates/clips/changelog/2026-07-06-double-tap-your-dictation-key-for-hands-free-dictation-tap-a.md +6 -0
  687. package/corpus/templates/clips/changelog/2026-07-06-fixed-desktop-recordings-sometimes-uploading-without-audio-a.md +6 -0
  688. package/corpus/templates/clips/changelog/2026-07-06-fixed-desktop-recordings-that-could-get-stuck-uploading-and-.md +6 -0
  689. package/corpus/templates/clips/changelog/2026-07-06-fixed-recordings-sometimes-capturing-from-the-wrong-micropho.md +6 -0
  690. package/corpus/templates/clips/changelog/2026-07-06-hands-free-dictation-and-meeting-cleanup-recover-more-reliab.md +6 -0
  691. package/corpus/templates/clips/changelog/2026-07-06-live-meetings-show-time-remaining-and-you-can-end-a-meeting-.md +6 -0
  692. package/corpus/templates/clips/changelog/2026-07-06-manage-your-personal-dictation-dictionary-from-the-dictate-t.md +6 -0
  693. package/corpus/templates/clips/changelog/2026-07-06-meetings-interrupted-by-quitting-or-crashing-now-close-out-c.md +6 -0
  694. package/corpus/templates/clips/changelog/2026-07-06-mic-only-desktop-recordings-now-use-the-selected-microphone-.md +6 -0
  695. package/corpus/templates/clips/changelog/2026-07-06-paste-your-last-dictation-anytime-with-cmd-ctrl-v-or-from-th.md +6 -0
  696. package/corpus/templates/clips/changelog/2026-07-06-press-esc-to-cancel-a-dictation-in-progress.md +6 -0
  697. package/corpus/templates/clips/changelog/2026-07-06-recordings-whose-video-file-contains-no-audio-track-no-longe.md +6 -0
  698. package/corpus/templates/clips/changelog/2026-07-06-search-inside-meeting-transcripts.md +6 -0
  699. package/corpus/templates/clips/changelog/2026-07-06-see-who-viewed-your-shared-clips-and-when-click-the-view-cou.md +6 -0
  700. package/corpus/templates/clips/changelog/2026-07-06-share-links-for-agents-now-appear-as-soon-as-the-share-menu-.md +6 -0
  701. package/corpus/templates/clips/changelog/2026-07-06-share-popovers-now-stay-above-video-playback-controls.md +6 -0
  702. package/corpus/templates/clips/changelog/2026-07-06-shared-clip-pages-now-recover-automatically-from-transient-v.md +6 -0
  703. package/corpus/templates/clips/changelog/2026-07-06-the-desktop-app-now-walks-you-through-permissions-on-first-l.md +6 -0
  704. package/corpus/templates/clips/changelog/2026-07-06-transcript-cleanup-preferences-now-save-per-user.md +6 -0
  705. package/corpus/templates/clips/changelog/2026-07-06-transcripts-now-retry-automatically-after-transient-failures.md +6 -0
  706. package/corpus/templates/clips/changelog/2026-07-06-video-compression-now-runs-in-the-background-without-blocking.md +6 -0
  707. package/corpus/templates/clips/changelog/2026-07-07-native-microphone-recordings-now-reduce-steady-background-noise.md +6 -0
  708. package/corpus/templates/clips/changelog/2026-07-07-recording-transcripts-now-line-up-with-the-video-start-afte.md +6 -0
  709. package/corpus/templates/clips/chrome-extension/public/manifest.json +1 -1
  710. package/corpus/templates/clips/chrome-extension/src/background.ts +141 -48
  711. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +383 -59
  712. package/corpus/templates/clips/chrome-extension/src/overlay.ts +51 -10
  713. package/corpus/templates/clips/chrome-extension/src/popup.ts +57 -6
  714. package/corpus/templates/clips/desktop/package.json +1 -1
  715. package/corpus/templates/clips/desktop/scripts/sign-macos-local.ts +67 -0
  716. package/corpus/templates/clips/desktop/src/app.tsx +38 -13
  717. package/corpus/templates/clips/desktop/src/components/SourceRow.tsx +1 -0
  718. package/corpus/templates/clips/desktop/src/hooks/useMediaDevices.ts +88 -28
  719. package/corpus/templates/clips/desktop/src/hooks/useMeetingTranscription.ts +165 -55
  720. package/corpus/templates/clips/desktop/src/hooks/useMicMeter.ts +35 -10
  721. package/corpus/templates/clips/desktop/src/lib/backtrack.ts +12 -0
  722. package/corpus/templates/clips/desktop/src/lib/media-capture-constraints.ts +129 -34
  723. package/corpus/templates/clips/desktop/src/lib/media-device-selection.ts +157 -0
  724. package/corpus/templates/clips/desktop/src/lib/permissions.ts +2 -0
  725. package/corpus/templates/clips/desktop/src/lib/recorder.ts +109 -47
  726. package/corpus/templates/clips/desktop/src/lib/transcription-capture.ts +22 -2
  727. package/corpus/templates/clips/desktop/src/lib/transcription-engine.ts +29 -1
  728. package/corpus/templates/clips/desktop/src/lib/updater.ts +6 -0
  729. package/corpus/templates/clips/desktop/src/lib/voice-dictation.ts +372 -31
  730. package/corpus/templates/clips/desktop/src/overlays/finalizing.tsx +90 -0
  731. package/corpus/templates/clips/desktop/src/overlays/flow-bar.tsx +4 -6
  732. package/corpus/templates/clips/desktop/src/overlays/onboarding.tsx +214 -9
  733. package/corpus/templates/clips/desktop/src/overlays/recording-pill.tsx +37 -52
  734. package/corpus/templates/clips/desktop/src/styles.css +1 -1
  735. package/corpus/templates/clips/desktop/src-tauri/Cargo.toml +7 -0
  736. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +371 -43
  737. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +79 -0
  738. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +1418 -260
  739. package/corpus/templates/clips/desktop/src-tauri/src/native_speech.rs +188 -44
  740. package/corpus/templates/clips/desktop/src-tauri/src/shortcuts.rs +197 -8
  741. package/corpus/templates/clips/desktop/src-tauri/src/silence_detector.rs +64 -8
  742. package/corpus/templates/clips/desktop/src-tauri/src/state.rs +3 -2
  743. package/corpus/templates/clips/desktop/src-tauri/src/system_audio.rs +10 -0
  744. package/corpus/templates/clips/desktop/src-tauri/src/tray.rs +29 -8
  745. package/corpus/templates/clips/desktop/src-tauri/src/whisper_speech.rs +136 -13
  746. package/corpus/templates/clips/desktop/vite.config.ts +3 -0
  747. package/corpus/templates/clips/package.json +1 -1
  748. package/corpus/templates/clips/server/db/schema.ts +26 -0
  749. package/corpus/templates/clips/server/jobs/builder-media-compression.ts +41 -0
  750. package/corpus/templates/clips/server/jobs/stale-meeting-sweeper.ts +294 -0
  751. package/corpus/templates/clips/server/lib/builder-media-compression.ts +976 -0
  752. package/corpus/templates/clips/server/lib/calendar-event-meetings.ts +107 -56
  753. package/corpus/templates/clips/server/lib/env-flags.ts +4 -0
  754. package/corpus/templates/clips/server/lib/google-calendar-client.ts +8 -1
  755. package/corpus/templates/clips/server/lib/media-worker.ts +153 -0
  756. package/corpus/templates/clips/server/lib/s3-upload-provider.ts +58 -17
  757. package/corpus/templates/clips/server/lib/streaming-upload-mode.ts +17 -5
  758. package/corpus/templates/clips/server/lib/video-remux.ts +90 -0
  759. package/corpus/templates/clips/server/plugins/calendar-jobs.ts +4 -0
  760. package/corpus/templates/clips/server/plugins/db.ts +196 -0
  761. package/corpus/templates/clips/server/register-secrets.ts +78 -0
  762. package/corpus/templates/clips/server/routes/_agent-native/clips/user-prefs.get.ts +15 -0
  763. package/corpus/templates/clips/server/routes/_agent-native/clips/user-prefs.put.ts +27 -0
  764. package/corpus/templates/clips/server/routes/api/media-worker/callback.post.ts +88 -0
  765. package/corpus/templates/clips/server/routes/api/public-recording.get.ts +87 -7
  766. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/abort.post.ts +11 -4
  767. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +55 -13
  768. package/corpus/templates/clips/server/routes/api/video/[recordingId].get.ts +24 -42
  769. package/corpus/templates/clips/server/routes/api/view-event.post.ts +29 -1
  770. package/corpus/templates/clips/shared/finalize-recovery.ts +23 -3
  771. package/corpus/templates/clips/shared/media-device-selection.ts +157 -0
  772. package/corpus/templates/clips/shared/media-worker-contract.ts +146 -0
  773. package/corpus/templates/content/.agents/skills/actions/SKILL.md +55 -0
  774. package/corpus/templates/content/.agents/skills/notion-integration/SKILL.md +67 -2
  775. package/corpus/templates/content/AGENTS.md +73 -65
  776. package/corpus/templates/content/actions/_builder-cms-read-client.ts +188 -8
  777. package/corpus/templates/content/actions/_builder-docs-client.ts +41 -3
  778. package/corpus/templates/content/actions/_database-source-utils.ts +998 -160
  779. package/corpus/templates/content/actions/_database-utils.ts +44 -4
  780. package/corpus/templates/content/actions/_local-file-documents.ts +90 -1
  781. package/corpus/templates/content/actions/_notion-action-utils.ts +12 -4
  782. package/corpus/templates/content/actions/add-content-database-source-field-property.ts +23 -1
  783. package/corpus/templates/content/actions/attach-content-database-source.ts +85 -12
  784. package/corpus/templates/content/actions/change-content-database-source-role.ts +9 -1
  785. package/corpus/templates/content/actions/delete-content-database.ts +1 -0
  786. package/corpus/templates/content/actions/delete-document.ts +8 -0
  787. package/corpus/templates/content/actions/get-document.ts +11 -2
  788. package/corpus/templates/content/actions/list-content-databases.ts +57 -9
  789. package/corpus/templates/content/actions/prepare-builder-source-review.ts +23 -6
  790. package/corpus/templates/content/actions/refresh-content-database-source.ts +26 -3
  791. package/corpus/templates/content/actions/remove-local-file-source.ts +100 -0
  792. package/corpus/templates/content/actions/restore-content-database.ts +1 -0
  793. package/corpus/templates/content/actions/sync-notion-comments.ts +174 -20
  794. package/corpus/templates/content/actions/update-document.ts +134 -5
  795. package/corpus/templates/content/app/blocks/SourceComponentBlock.tsx +31 -3
  796. package/corpus/templates/content/app/blocks/contentBlockRegistry.tsx +4 -4
  797. package/corpus/templates/content/app/components/EmptyState.tsx +1 -1
  798. package/corpus/templates/content/app/components/ThemeToggle.tsx +6 -6
  799. package/corpus/templates/content/app/components/editor/BubbleToolbar.tsx +5 -5
  800. package/corpus/templates/content/app/components/editor/BuilderBodySyncingNotice.tsx +21 -0
  801. package/corpus/templates/content/app/components/editor/CommentsSidebar.tsx +5 -5
  802. package/corpus/templates/content/app/components/editor/ContentReferencePreview.tsx +1 -1
  803. package/corpus/templates/content/app/components/editor/DocumentDatabase.tsx +9 -14630
  804. package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +142 -79
  805. package/corpus/templates/content/app/components/editor/DocumentEditorSkeleton.tsx +36 -0
  806. package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +98 -46
  807. package/corpus/templates/content/app/components/editor/DocumentToolbar.tsx +29 -44
  808. package/corpus/templates/content/app/components/editor/EmojiPicker.tsx +5 -4
  809. package/corpus/templates/content/app/components/editor/LinkHoverPreview.tsx +5 -4
  810. package/corpus/templates/content/app/components/editor/NotionConflictBanner.tsx +1 -1
  811. package/corpus/templates/content/app/components/editor/NotionSyncBar.tsx +2 -2
  812. package/corpus/templates/content/app/components/editor/SlashCommandMenu.tsx +5 -5
  813. package/corpus/templates/content/app/components/editor/TableHoverControls.tsx +13 -13
  814. package/corpus/templates/content/app/components/editor/VersionHistoryPanel.tsx +10 -10
  815. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +28 -11
  816. package/corpus/templates/content/app/components/editor/body-hydration.ts +112 -0
  817. package/corpus/templates/content/app/components/editor/builder-body-hydration-pump.ts +52 -0
  818. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +736 -69
  819. package/corpus/templates/content/app/components/editor/database/navigation-state.ts +36 -1
  820. package/corpus/templates/content/app/components/editor/database/settings.tsx +3224 -0
  821. package/corpus/templates/content/app/components/editor/database/shared.tsx +19 -19
  822. package/corpus/templates/content/app/components/editor/database/text.ts +23 -0
  823. package/corpus/templates/content/app/components/editor/database-sources/BuilderSourceReviewDialog.tsx +50 -9
  824. package/corpus/templates/content/app/components/editor/extensions/AudioBlock.tsx +19 -18
  825. package/corpus/templates/content/app/components/editor/extensions/ImageBlock.tsx +57 -31
  826. package/corpus/templates/content/app/components/editor/extensions/LocalMdxComponentNode.tsx +8 -8
  827. package/corpus/templates/content/app/components/editor/extensions/NotionExtensions.tsx +9 -0
  828. package/corpus/templates/content/app/components/editor/extensions/VideoBlock.tsx +19 -18
  829. package/corpus/templates/content/app/components/editor/previewDocumentSaveController.ts +21 -1
  830. package/corpus/templates/content/app/components/layout/Header.tsx +1 -5
  831. package/corpus/templates/content/app/components/layout/Layout.tsx +25 -8
  832. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +214 -56
  833. package/corpus/templates/content/app/components/sidebar/DocumentTreeItem.tsx +33 -30
  834. package/corpus/templates/content/app/components/sidebar/NotionButton.tsx +11 -11
  835. package/corpus/templates/content/app/components/sidebar/document-sidebar-sections.ts +109 -1
  836. package/corpus/templates/content/app/components/ui/alert-dialog.tsx +1 -0
  837. package/corpus/templates/content/app/components/ui/button.tsx +1 -0
  838. package/corpus/templates/content/app/components/ui/dialog.tsx +1 -0
  839. package/corpus/templates/content/app/components/ui/dropdown-menu.tsx +1 -0
  840. package/corpus/templates/content/app/components/ui/input.tsx +1 -0
  841. package/corpus/templates/content/app/components/ui/label.tsx +1 -0
  842. package/corpus/templates/content/app/components/ui/popover.tsx +1 -0
  843. package/corpus/templates/content/app/components/ui/separator.tsx +1 -0
  844. package/corpus/templates/content/app/components/ui/sheet.tsx +1 -0
  845. package/corpus/templates/content/app/components/ui/skeleton.tsx +1 -0
  846. package/corpus/templates/content/app/components/ui/sonner.tsx +1 -0
  847. package/corpus/templates/content/app/components/ui/spinner.tsx +1 -0
  848. package/corpus/templates/content/app/components/ui/table.tsx +1 -0
  849. package/corpus/templates/content/app/components/ui/toaster.tsx +1 -0
  850. package/corpus/templates/content/app/components/ui/toolkit-provider.tsx +12 -0
  851. package/corpus/templates/content/app/components/ui/tooltip.tsx +1 -0
  852. package/corpus/templates/content/app/global.css +42 -0
  853. package/corpus/templates/content/app/hooks/use-content-database.ts +346 -42
  854. package/corpus/templates/content/app/hooks/use-db-sync.ts +9 -0
  855. package/corpus/templates/content/app/hooks/use-documents.ts +136 -37
  856. package/corpus/templates/content/app/hooks/use-mobile.ts +1 -0
  857. package/corpus/templates/content/app/hooks/use-notion.ts +85 -15
  858. package/corpus/templates/content/app/i18n/zh-TW.ts +49 -0
  859. package/corpus/templates/content/app/i18n-data.ts +508 -0
  860. package/corpus/templates/content/app/root.tsx +57 -29
  861. package/corpus/templates/content/app/routes/_app._index.tsx +1 -1
  862. package/corpus/templates/content/app/routes/_app.local-files.tsx +268 -81
  863. package/corpus/templates/content/app/routes/_app.settings.tsx +4 -21
  864. package/corpus/templates/content/changelog/2026-07-01-builder-database-sources-keep-loading-rows-in-the-background.md +6 -0
  865. package/corpus/templates/content/changelog/2026-07-01-builder-source-attach-starts-with-usable-rows.md +6 -0
  866. package/corpus/templates/content/changelog/2026-07-01-builder-source-attachment-now-stays-connected-after-large.md +6 -0
  867. package/corpus/templates/content/changelog/2026-07-01-builder-source-components-show-preservation-and-review-states.md +6 -0
  868. package/corpus/templates/content/changelog/2026-07-01-builder-source-refreshes-now-show-progress-for-large-docs-blog.md +6 -0
  869. package/corpus/templates/content/changelog/2026-07-01-database-pages-now-delete-to-trash-without-route-errors.md +6 -0
  870. package/corpus/templates/content/changelog/2026-07-02-builder-source-refreshes-recover-from-stalled-background-row.md +6 -0
  871. package/corpus/templates/content/changelog/2026-07-02-builder-sourced-rows-open-with-sync-protection.md +6 -0
  872. package/corpus/templates/content/changelog/2026-07-02-database-rows-and-pages-open-faster-from-recently-loaded-dat.md +6 -0
  873. package/corpus/templates/content/changelog/2026-07-02-preview-panels-close-reliably-narrow-sidebar-row-actions-sta.md +6 -0
  874. package/corpus/templates/content/changelog/2026-07-06-builder-sync-progress-no-longer-shows-continue.md +6 -0
  875. package/corpus/templates/content/changelog/2026-07-06-document-headers-and-page-bodies-now-share-one-background-shade.md +6 -0
  876. package/corpus/templates/content/changelog/2026-07-06-export-submenus-stay-visible-outside-the-page-actions-menu.md +6 -0
  877. package/corpus/templates/content/changelog/2026-07-06-fixed-collaborative-documents-reapplying-content-before-save.md +6 -0
  878. package/corpus/templates/content/changelog/2026-07-06-local-files-now-remember-sidebar-collapse-state-and-include-.md +6 -0
  879. package/corpus/templates/content/changelog/2026-07-06-notion-comment-sync-now-preserves-threads-replies-stay-attac.md +6 -0
  880. package/corpus/templates/content/changelog/2026-07-06-notion-sync-is-far-more-reliable-auto-sync-no-longer-overwri.md +6 -0
  881. package/corpus/templates/content/changelog/2026-07-06-opening-pages-now-highlights-the-sidebar-item-and-shows-the-.md +6 -0
  882. package/corpus/templates/content/changelog/2026-07-06-presence-markers-in-the-editor-are-now-compact-instead-of-co.md +6 -0
  883. package/corpus/templates/content/changelog/2026-07-06-sidebar-collapse-now-keeps-the-same-background-shade-as-the-.md +6 -0
  884. package/corpus/templates/content/changelog/2026-07-06-the-content-header-no-longer-shows-the-global-notifications-.md +6 -0
  885. package/corpus/templates/content/parity/matrix.md +24 -24
  886. package/corpus/templates/content/parity/matrix.ts +7 -3
  887. package/corpus/templates/content/server/db/schema.ts +15 -0
  888. package/corpus/templates/content/server/lib/notion-sync.ts +481 -39
  889. package/corpus/templates/content/server/lib/notion.ts +212 -48
  890. package/corpus/templates/content/server/plugins/db.ts +20 -0
  891. package/corpus/templates/content/server/routes/api/documents/[id]/notion/resolve.post.ts +14 -2
  892. package/corpus/templates/content/server/routes/api/notion/callback.get.ts +54 -6
  893. package/corpus/templates/content/shared/api.ts +13 -0
  894. package/corpus/templates/content/shared/builder-mdx.ts +84 -15
  895. package/corpus/templates/content/shared/builder-source-component-registry.ts +177 -0
  896. package/corpus/templates/content/shared/nfm.ts +459 -66
  897. package/corpus/templates/content/shared/source-component-block.ts +72 -6
  898. package/corpus/templates/content/vite.config.ts +17 -1
  899. package/corpus/templates/design/.agents/skills/actions/SKILL.md +55 -0
  900. package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +44 -25
  901. package/corpus/templates/design/.agents/skills/responsive-breakpoints/SKILL.md +98 -0
  902. package/corpus/templates/design/.agents/skills/shader-fills/SKILL.md +162 -0
  903. package/corpus/templates/design/AGENTS.md +12 -4
  904. package/corpus/templates/design/actions/add-breakpoint.ts +6 -3
  905. package/corpus/templates/design/actions/apply-a11y-fix.ts +57 -37
  906. package/corpus/templates/design/actions/apply-component-prop-edit.ts +41 -20
  907. package/corpus/templates/design/actions/apply-motion-edit.ts +251 -38
  908. package/corpus/templates/design/actions/apply-shader-fill.ts +90 -66
  909. package/corpus/templates/design/actions/apply-visual-edit.ts +282 -55
  910. package/corpus/templates/design/actions/create-component.ts +29 -60
  911. package/corpus/templates/design/actions/create-file.ts +9 -2
  912. package/corpus/templates/design/actions/duplicate-design.ts +31 -2
  913. package/corpus/templates/design/actions/edit-design.ts +36 -38
  914. package/corpus/templates/design/actions/generate-design-title.ts +87 -0
  915. package/corpus/templates/design/actions/generate-design.ts +53 -18
  916. package/corpus/templates/design/actions/generate-screens.ts +108 -4
  917. package/corpus/templates/design/actions/get-motion-timeline.ts +35 -7
  918. package/corpus/templates/design/actions/import-design-source.ts +8 -58
  919. package/corpus/templates/design/actions/insert-asset.ts +34 -29
  920. package/corpus/templates/design/actions/insert-design-native-asset.ts +129 -32
  921. package/corpus/templates/design/actions/insert-figma-library-asset.ts +35 -30
  922. package/corpus/templates/design/actions/present-design-variants.ts +7 -2
  923. package/corpus/templates/design/actions/remove-motion-timeline.ts +31 -36
  924. package/corpus/templates/design/actions/run-design-audit.ts +127 -1
  925. package/corpus/templates/design/actions/take-design-screenshot.ts +673 -0
  926. package/corpus/templates/design/actions/update-file.ts +190 -75
  927. package/corpus/templates/design/app/components/ThemeToggle.tsx +6 -6
  928. package/corpus/templates/design/app/components/design/BreakpointBar.tsx +403 -0
  929. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +480 -233
  930. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +708 -53
  931. package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +2 -2
  932. package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +99 -24
  933. package/corpus/templates/design/app/components/design/DesignImportPanel.tsx +6 -97
  934. package/corpus/templates/design/app/components/design/DrawOverlay.tsx +7 -7
  935. package/corpus/templates/design/app/components/design/EditPanel.tsx +1120 -6977
  936. package/corpus/templates/design/app/components/design/FusionAppBanner.tsx +9 -8
  937. package/corpus/templates/design/app/components/design/LayersPanel.tsx +433 -99
  938. package/corpus/templates/design/app/components/design/LocalhostWriteConsentDialog.tsx +6 -5
  939. package/corpus/templates/design/app/components/design/MotionDock.tsx +1138 -117
  940. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +2610 -1398
  941. package/corpus/templates/design/app/components/design/QuestionFlow.tsx +3 -3
  942. package/corpus/templates/design/app/components/design/ReadOnlyDesignBanner.tsx +22 -0
  943. package/corpus/templates/design/app/components/design/ReviewPanel.tsx +3 -3
  944. package/corpus/templates/design/app/components/design/StatesPanel.tsx +13 -13
  945. package/corpus/templates/design/app/components/design/TokensPanel.tsx +14 -14
  946. package/corpus/templates/design/app/components/design/TweaksPanel.tsx +6 -6
  947. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +2221 -244
  948. package/corpus/templates/design/app/components/design/bridge/motion-preview.bridge.ts +187 -11
  949. package/corpus/templates/design/app/components/design/bridge/shader-fill-preview.bridge.ts +376 -1
  950. package/corpus/templates/design/app/components/design/bridge/shader-runtime.bridge.ts +746 -0
  951. package/corpus/templates/design/app/components/design/canvas-primitive-style.ts +17 -0
  952. package/corpus/templates/design/app/components/design/code-workbench/ActivityBar.tsx +3 -3
  953. package/corpus/templates/design/app/components/design/code-workbench/SideBar.tsx +5 -8
  954. package/corpus/templates/design/app/components/design/code-workbench/editor/EditorTabs.tsx +6 -6
  955. package/corpus/templates/design/app/components/design/code-workbench/editor/MonacoHost.tsx +2 -1
  956. package/corpus/templates/design/app/components/design/code-workbench/explorer/FileTree.tsx +18 -20
  957. package/corpus/templates/design/app/components/design/code-workbench/quickinput/QuickInput.tsx +1 -1
  958. package/corpus/templates/design/app/components/design/code-workbench/search/SearchView.tsx +6 -6
  959. package/corpus/templates/design/app/components/design/edit-panel/appearance-properties.tsx +518 -0
  960. package/corpus/templates/design/app/components/design/edit-panel/code-inspect-helpers.tsx +562 -0
  961. package/corpus/templates/design/app/components/design/edit-panel/component-section.tsx +763 -0
  962. package/corpus/templates/design/app/components/design/edit-panel/document-colors.ts +94 -0
  963. package/corpus/templates/design/app/components/design/edit-panel/effects-properties.tsx +780 -0
  964. package/corpus/templates/design/app/components/design/edit-panel/element-classification.ts +446 -0
  965. package/corpus/templates/design/app/components/design/edit-panel/element-identity.ts +79 -0
  966. package/corpus/templates/design/app/components/design/edit-panel/field-primitives.tsx +315 -0
  967. package/corpus/templates/design/app/components/design/edit-panel/fill-gradient-helpers.ts +344 -0
  968. package/corpus/templates/design/app/components/design/edit-panel/fill-properties.tsx +594 -0
  969. package/corpus/templates/design/app/components/design/edit-panel/frame-presets-panel.tsx +119 -0
  970. package/corpus/templates/design/app/components/design/edit-panel/inspector-controls.tsx +248 -0
  971. package/corpus/templates/design/app/components/design/edit-panel/interaction-state-helpers.ts +45 -0
  972. package/corpus/templates/design/app/components/design/edit-panel/layout-properties.tsx +693 -0
  973. package/corpus/templates/design/app/components/design/edit-panel/panel-primitives.tsx +724 -0
  974. package/corpus/templates/design/app/components/design/edit-panel/position-helpers.ts +207 -0
  975. package/corpus/templates/design/app/components/design/edit-panel/position-layout-properties.tsx +628 -0
  976. package/corpus/templates/design/app/components/design/edit-panel/selection-helpers.ts +91 -0
  977. package/corpus/templates/design/app/components/design/edit-panel/stroke-properties.tsx +649 -0
  978. package/corpus/templates/design/app/components/design/edit-panel/style-change-types.ts +118 -0
  979. package/corpus/templates/design/app/components/design/edit-panel/style-options.ts +88 -0
  980. package/corpus/templates/design/app/components/design/edit-panel/transform-helpers.ts +100 -0
  981. package/corpus/templates/design/app/components/design/edit-panel/typography-helpers.ts +117 -0
  982. package/corpus/templates/design/app/components/design/edit-panel/typography-properties.tsx +501 -0
  983. package/corpus/templates/design/app/components/design/inspector/AlignmentMatrix.tsx +3 -3
  984. package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +98 -47
  985. package/corpus/templates/design/app/components/design/inspector/BreakpointOverrideIndicator.tsx +82 -0
  986. package/corpus/templates/design/app/components/design/inspector/ConstraintsWidget.tsx +3 -3
  987. package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +207 -105
  988. package/corpus/templates/design/app/components/design/inspector/ExportSettingsPanel.tsx +6 -6
  989. package/corpus/templates/design/app/components/design/inspector/GlslShaderPanel.tsx +1097 -0
  990. package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +44 -0
  991. package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +6 -6
  992. package/corpus/templates/design/app/components/design/inspector/InteractionStatePanel.tsx +258 -0
  993. package/corpus/templates/design/app/components/design/inspector/MotionKeyframeDiamond.tsx +144 -0
  994. package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +106 -16
  995. package/corpus/templates/design/app/components/design/inspector/ShaderControls.tsx +14 -14
  996. package/corpus/templates/design/app/components/design/inspector/ShaderEffectRow.tsx +9 -9
  997. package/corpus/templates/design/app/components/design/inspector/ShaderFillsPanel.tsx +6 -6
  998. package/corpus/templates/design/app/components/design/inspector/frame-size-presets.ts +116 -0
  999. package/corpus/templates/design/app/components/design/inspector/index.ts +26 -0
  1000. package/corpus/templates/design/app/components/design/inspector/scrub-input-utils.ts +29 -0
  1001. package/corpus/templates/design/app/components/design/multi-screen/alt-hover-measurement.ts +171 -0
  1002. package/corpus/templates/design/app/components/design/multi-screen/board-surface-html.ts +220 -0
  1003. package/corpus/templates/design/app/components/design/multi-screen/chrome-transitions.ts +35 -0
  1004. package/corpus/templates/design/app/components/design/multi-screen/cross-screen-drop.ts +134 -0
  1005. package/corpus/templates/design/app/components/design/multi-screen/culling.ts +185 -0
  1006. package/corpus/templates/design/app/components/design/multi-screen/gradient-overlay-geometry.ts +120 -0
  1007. package/corpus/templates/design/app/components/design/multi-screen/types.ts +892 -0
  1008. package/corpus/templates/design/app/components/design/multi-screen/vector-edit-geometry.ts +21 -0
  1009. package/corpus/templates/design/app/components/design/types.ts +15 -0
  1010. package/corpus/templates/design/app/components/design-system/DesignSystemCard.tsx +3 -2
  1011. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +124 -23
  1012. package/corpus/templates/design/app/components/layout/Header.tsx +2 -2
  1013. package/corpus/templates/design/app/components/layout/Sidebar.tsx +5 -5
  1014. package/corpus/templates/design/app/components/ui/alert-dialog.tsx +1 -0
  1015. package/corpus/templates/design/app/components/ui/avatar.tsx +1 -0
  1016. package/corpus/templates/design/app/components/ui/badge.tsx +1 -0
  1017. package/corpus/templates/design/app/components/ui/button.tsx +1 -0
  1018. package/corpus/templates/design/app/components/ui/card.tsx +1 -0
  1019. package/corpus/templates/design/app/components/ui/checkbox.tsx +1 -0
  1020. package/corpus/templates/design/app/components/ui/collapsible.tsx +1 -0
  1021. package/corpus/templates/design/app/components/ui/context-menu.tsx +1 -0
  1022. package/corpus/templates/design/app/components/ui/dialog.tsx +1 -0
  1023. package/corpus/templates/design/app/components/ui/dropdown-menu.tsx +1 -0
  1024. package/corpus/templates/design/app/components/ui/input.tsx +1 -0
  1025. package/corpus/templates/design/app/components/ui/label.tsx +1 -0
  1026. package/corpus/templates/design/app/components/ui/popover.tsx +1 -0
  1027. package/corpus/templates/design/app/components/ui/select.tsx +1 -0
  1028. package/corpus/templates/design/app/components/ui/separator.tsx +1 -0
  1029. package/corpus/templates/design/app/components/ui/sheet.tsx +1 -0
  1030. package/corpus/templates/design/app/components/ui/skeleton.tsx +1 -0
  1031. package/corpus/templates/design/app/components/ui/slider.tsx +1 -0
  1032. package/corpus/templates/design/app/components/ui/sonner.tsx +1 -0
  1033. package/corpus/templates/design/app/components/ui/spinner.tsx +1 -0
  1034. package/corpus/templates/design/app/components/ui/switch.tsx +1 -0
  1035. package/corpus/templates/design/app/components/ui/tabs.tsx +1 -0
  1036. package/corpus/templates/design/app/components/ui/textarea.tsx +1 -0
  1037. package/corpus/templates/design/app/components/ui/toolkit-provider.tsx +12 -0
  1038. package/corpus/templates/design/app/components/ui/tooltip.tsx +1 -0
  1039. package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +7 -7
  1040. package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +7 -7
  1041. package/corpus/templates/design/app/components/visual-editor/SaveStatusIndicator.tsx +3 -3
  1042. package/corpus/templates/design/app/global.css +9 -8
  1043. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +259 -2
  1044. package/corpus/templates/design/app/i18n/zh-TW.ts +166 -13
  1045. package/corpus/templates/design/app/i18n-breakpoints.ts +205 -0
  1046. package/corpus/templates/design/app/i18n-data.ts +1702 -187
  1047. package/corpus/templates/design/app/i18n-motion.ts +563 -0
  1048. package/corpus/templates/design/app/lib/design-import.ts +73 -0
  1049. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +6 -6
  1050. package/corpus/templates/design/app/pages/DesignSystems.tsx +31 -31
  1051. package/corpus/templates/design/app/pages/Index.tsx +66 -51
  1052. package/corpus/templates/design/app/pages/NotFound.tsx +2 -1
  1053. package/corpus/templates/design/app/pages/Present.tsx +2 -1
  1054. package/corpus/templates/design/app/pages/VisualEdit.tsx +2 -1
  1055. package/corpus/templates/design/app/root.tsx +7 -4
  1056. package/corpus/templates/design/app/routes/settings.tsx +22 -49
  1057. package/corpus/templates/design/changelog/2026-06-29-design-inspector-controls-now-match-figmas-softer-dark-chrome.md +1 -1
  1058. package/corpus/templates/design/changelog/2026-06-30-design-now-has-a-figma-style-left-rail-for-file-agent-assets.md +1 -1
  1059. package/corpus/templates/design/changelog/2026-06-30-design-tools-now-use-a-quieter-figma-style-list-layout.md +1 -1
  1060. package/corpus/templates/design/changelog/2026-06-30-multi-select-outlines-now-stay-consistent-across-all-screens.md +1 -1
  1061. package/corpus/templates/design/changelog/2026-07-03-canvas-interactions-now-match-figma-rotation-aware-resizing-.md +1 -1
  1062. package/corpus/templates/design/changelog/2026-07-03-layers-panel-matches-figma-top-layer-on-top-drag-with-auto-s.md +1 -1
  1063. package/corpus/templates/design/changelog/2026-07-05-code-sidebar-tabs-now-use-a-quieter-active-highlight-that-ma.md +6 -0
  1064. package/corpus/templates/design/changelog/2026-07-05-designs-get-ai-generated-names-from-your-prompt.md +6 -0
  1065. package/corpus/templates/design/changelog/2026-07-05-local-code-screens-keep-their-connection-when-duplicated-and.md +6 -0
  1066. package/corpus/templates/design/changelog/2026-07-05-press-a-to-draw-screens-on-the-canvas-inside-a-screen-it-dr.md +6 -0
  1067. package/corpus/templates/design/changelog/2026-07-06-3d-rotation-and-perspective-controls-on-every-element.md +6 -0
  1068. package/corpus/templates/design/changelog/2026-07-06-ai-generated-and-duplicated-screens-now-get-their-editor-sel.md +6 -0
  1069. package/corpus/templates/design/changelog/2026-07-06-applying-shaders-and-fills-in-quick-succession-can-no-longer.md +6 -0
  1070. package/corpus/templates/design/changelog/2026-07-06-breakpoint-frames-in-the-overview-now-support-click-to-selec.md +6 -0
  1071. package/corpus/templates/design/changelog/2026-07-06-breakpoint-segments-in-the-inspector-now-show-a-device-icon-.md +6 -0
  1072. package/corpus/templates/design/changelog/2026-07-06-breakpoint-targeting-now-lives-in-one-compact-control-in-the.md +6 -0
  1073. package/corpus/templates/design/changelog/2026-07-06-canvas-edits-can-no-longer-be-overwritten-by-stale-collabora.md +6 -0
  1074. package/corpus/templates/design/changelog/2026-07-06-canvas-edits-inside-screens-save-reliably-again.md +6 -0
  1075. package/corpus/templates/design/changelog/2026-07-06-cleaner-inspector-removed-the-ask-ai-box-from-the-design-tab.md +6 -0
  1076. package/corpus/templates/design/changelog/2026-07-06-clicking-empty-canvas-space-now-deselects-an-element-inside-.md +6 -0
  1077. package/corpus/templates/design/changelog/2026-07-06-dragging-an-element-onto-a-rectangle-now-nests-it-inside-wit.md +6 -0
  1078. package/corpus/templates/design/changelog/2026-07-06-dragging-screens-and-objects-on-the-canvas-is-now-much-smoot.md +6 -0
  1079. package/corpus/templates/design/changelog/2026-07-06-drawing-a-shape-or-text-on-the-canvas-no-longer-flashes-away.md +6 -0
  1080. package/corpus/templates/design/changelog/2026-07-06-dropping-an-element-between-two-others-inside-a-screen-now-s.md +6 -0
  1081. package/corpus/templates/design/changelog/2026-07-06-duplicating-a-screen-now-places-the-copy-exactly-where-you-d.md +6 -0
  1082. package/corpus/templates/design/changelog/2026-07-06-edit-gradients-directly-on-elements-inside-screens-scale-str.md +6 -0
  1083. package/corpus/templates/design/changelog/2026-07-06-edits-from-collaborators-and-the-agent-now-update-the-canvas.md +6 -0
  1084. package/corpus/templates/design/changelog/2026-07-06-fig-files-now-stay-on-the-builder-indexing-path-through-desi.md +6 -0
  1085. package/corpus/templates/design/changelog/2026-07-06-fixed-a-bug-where-most-style-position-and-text-edits-briefly.md +6 -0
  1086. package/corpus/templates/design/changelog/2026-07-06-fixed-a-confusing-raw-error-message-when-a-file-upload-fails.md +6 -0
  1087. package/corpus/templates/design/changelog/2026-07-06-fixed-a-rare-case-where-an-edit-could-be-silently-overwritte.md +6 -0
  1088. package/corpus/templates/design/changelog/2026-07-06-fixed-inserted-assets-sometimes-disappearing-reappearing-or-.md +6 -0
  1089. package/corpus/templates/design/changelog/2026-07-06-fixed-inspector-value-scrubbing-producing-erratic-numbers-an.md +6 -0
  1090. package/corpus/templates/design/changelog/2026-07-06-fixed-padding-gap-and-min-max-size-scrubbing-not-updating-th.md +6 -0
  1091. package/corpus/templates/design/changelog/2026-07-06-fixed-text-stroke-color-turning-black-and-glyphs-disappearin.md +6 -0
  1092. package/corpus/templates/design/changelog/2026-07-06-fixed-the-collapsed-effects-and-stroke-inspector-sections-sh.md +6 -0
  1093. package/corpus/templates/design/changelog/2026-07-06-fixed-the-new-design-dialog-closing-unexpectedly-when-using-.md +6 -0
  1094. package/corpus/templates/design/changelog/2026-07-06-fixed-the-typography-section-missing-when-selecting-text-nes.md +6 -0
  1095. package/corpus/templates/design/changelog/2026-07-06-full-view-no-longer-flashes-back-to-the-overview-on-entry-no.md +6 -0
  1096. package/corpus/templates/design/changelog/2026-07-06-keyframe-animation-timeline-per-property-keyframes-easing-cu.md +6 -0
  1097. package/corpus/templates/design/changelog/2026-07-06-mobile-layouts-no-longer-stack-two-top-headers.md +5 -0
  1098. package/corpus/templates/design/changelog/2026-07-06-moving-restyling-and-scrubbing-values-on-elements-in-ai-gene.md +6 -0
  1099. package/corpus/templates/design/changelog/2026-07-06-padding-and-corner-radius-value-scrubbing-now-snaps-to-whole.md +6 -0
  1100. package/corpus/templates/design/changelog/2026-07-06-padding-handles-now-only-resize-on-the-handle-line-itself-sh.md +6 -0
  1101. package/corpus/templates/design/changelog/2026-07-06-preview-and-edit-hover-focus-and-pressed-states-with-real-cs.md +6 -0
  1102. package/corpus/templates/design/changelog/2026-07-06-promoting-an-element-to-a-component-now-works-correctly-for-.md +6 -0
  1103. package/corpus/templates/design/changelog/2026-07-06-reduced-url-history-churn-and-selection-overlay-flicker-whil.md +6 -0
  1104. package/corpus/templates/design/changelog/2026-07-06-removed-the-decorative-dot-before-screen-names-in-the-overvi.md +6 -0
  1105. package/corpus/templates/design/changelog/2026-07-06-responsive-breakpoints-edit-at-any-width-with-cascading-over.md +6 -0
  1106. package/corpus/templates/design/changelog/2026-07-06-screen-labels-no-longer-turn-blue-when-you-hover-inside-the-.md +6 -0
  1107. package/corpus/templates/design/changelog/2026-07-06-scrolling-a-screen-with-an-element-selected-stays-smooth-on-.md +6 -0
  1108. package/corpus/templates/design/changelog/2026-07-06-selecting-multiple-elements-and-dragging-now-moves-the-whole.md +6 -0
  1109. package/corpus/templates/design/changelog/2026-07-06-selection-borders-handles-and-value-readouts-now-stay-the-sa.md +6 -0
  1110. package/corpus/templates/design/changelog/2026-07-06-selection-handles-and-editing-chrome-now-stay-a-constant-siz.md +6 -0
  1111. package/corpus/templates/design/changelog/2026-07-06-shader-fills-and-effects-ai-authored-or-preset-glsl-shaders-.md +6 -0
  1112. package/corpus/templates/design/changelog/2026-07-06-text-drawn-on-the-canvas-now-defaults-to-white-and-inter-in-.md +6 -0
  1113. package/corpus/templates/design/changelog/2026-07-06-text-dropped-into-a-shape-now-stays-readable-instead-of-disa.md +6 -0
  1114. package/corpus/templates/design/changelog/2026-07-06-the-add-tweak-controls-prompt-no-longer-jumps-to-the-corner-.md +6 -0
  1115. package/corpus/templates/design/changelog/2026-07-06-the-design-agent-now-visually-reviews-rendered-screenshots-o.md +6 -0
  1116. package/corpus/templates/design/changelog/2026-07-06-the-padding-value-readout-now-stays-visible-while-you-hover-.md +6 -0
  1117. package/corpus/templates/design/changelog/2026-07-06-the-selected-element-attachment-now-clears-from-the-chat-com.md +6 -0
  1118. package/corpus/templates/design/changelog/2026-07-06-the-zoom-menu-is-more-compact-with-tight-rows-and-right-alig.md +6 -0
  1119. package/corpus/templates/design/changelog/2026-07-06-undo-and-redo-no-longer-flash-the-screen-changes-now-apply-i.md +6 -0
  1120. package/corpus/templates/design/changelog/2026-07-06-zoom-presets-like-zoom-to-50-now-stay-on-the-focused-screen-.md +6 -0
  1121. package/corpus/templates/design/server/handlers/import-design-file.ts +4 -43
  1122. package/corpus/templates/design/server/handlers/index-design-system-with-builder.ts +2 -2
  1123. package/corpus/templates/design/server/lib/import-design-files.ts +11 -2
  1124. package/corpus/templates/design/server/lib/visible-clipboard-html.ts +32 -0
  1125. package/corpus/templates/design/server/source-workspace.ts +139 -59
  1126. package/corpus/templates/design/shared/board-file.ts +11 -2
  1127. package/corpus/templates/design/shared/breakpoint-media.ts +543 -0
  1128. package/corpus/templates/design/shared/canvas-math.ts +354 -35
  1129. package/corpus/templates/design/shared/code-layer.ts +277 -8
  1130. package/corpus/templates/design/shared/design-review.ts +1 -0
  1131. package/corpus/templates/design/shared/design-state.ts +11 -4
  1132. package/corpus/templates/design/shared/interaction-states.ts +548 -0
  1133. package/corpus/templates/design/shared/motion-compiler.ts +186 -23
  1134. package/corpus/templates/design/shared/motion-easing.ts +294 -0
  1135. package/corpus/templates/design/shared/motion-timeline.ts +400 -34
  1136. package/corpus/templates/design/shared/prompt-title.ts +95 -0
  1137. package/corpus/templates/design/shared/responsive-classes.ts +448 -10
  1138. package/corpus/templates/design/shared/screen-annotation.ts +46 -0
  1139. package/corpus/templates/design/shared/shader-fills.ts +1009 -0
  1140. package/corpus/templates/design/shared/shader-presets.ts +852 -4
  1141. package/corpus/templates/dispatch/.agents/skills/actions/SKILL.md +55 -0
  1142. package/corpus/templates/dispatch/actions/list-staged-datasets.ts +3 -0
  1143. package/corpus/templates/dispatch/app/routes/settings.tsx +3 -17
  1144. package/corpus/templates/forms/.agents/skills/actions/SKILL.md +55 -0
  1145. package/corpus/templates/forms/app/components/CloudUpgrade.tsx +10 -10
  1146. package/corpus/templates/forms/app/components/ThemeToggle.tsx +5 -5
  1147. package/corpus/templates/forms/app/components/builder/FieldPropertiesPanel.tsx +11 -10
  1148. package/corpus/templates/forms/app/components/builder/FieldRenderer.tsx +10 -13
  1149. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +17 -17
  1150. package/corpus/templates/forms/app/components/ui/alert-dialog.tsx +1 -0
  1151. package/corpus/templates/forms/app/components/ui/badge.tsx +1 -0
  1152. package/corpus/templates/forms/app/components/ui/button.tsx +1 -0
  1153. package/corpus/templates/forms/app/components/ui/calendar.tsx +1 -1
  1154. package/corpus/templates/forms/app/components/ui/card.tsx +1 -0
  1155. package/corpus/templates/forms/app/components/ui/checkbox.tsx +1 -0
  1156. package/corpus/templates/forms/app/components/ui/command.tsx +1 -1
  1157. package/corpus/templates/forms/app/components/ui/dialog.tsx +1 -0
  1158. package/corpus/templates/forms/app/components/ui/dropdown-menu.tsx +1 -0
  1159. package/corpus/templates/forms/app/components/ui/input.tsx +1 -0
  1160. package/corpus/templates/forms/app/components/ui/label.tsx +1 -0
  1161. package/corpus/templates/forms/app/components/ui/popover.tsx +1 -0
  1162. package/corpus/templates/forms/app/components/ui/radio-group.tsx +1 -0
  1163. package/corpus/templates/forms/app/components/ui/scroll-area.tsx +1 -0
  1164. package/corpus/templates/forms/app/components/ui/select.tsx +1 -0
  1165. package/corpus/templates/forms/app/components/ui/separator.tsx +1 -0
  1166. package/corpus/templates/forms/app/components/ui/skeleton.tsx +1 -0
  1167. package/corpus/templates/forms/app/components/ui/slider.tsx +1 -0
  1168. package/corpus/templates/forms/app/components/ui/switch.tsx +1 -0
  1169. package/corpus/templates/forms/app/components/ui/table.tsx +1 -0
  1170. package/corpus/templates/forms/app/components/ui/tabs.tsx +1 -0
  1171. package/corpus/templates/forms/app/components/ui/textarea.tsx +1 -0
  1172. package/corpus/templates/forms/app/components/ui/toolkit-provider.tsx +12 -0
  1173. package/corpus/templates/forms/app/components/ui/tooltip.tsx +1 -0
  1174. package/corpus/templates/forms/app/global.css +1 -0
  1175. package/corpus/templates/forms/app/hooks/use-mobile.ts +1 -0
  1176. package/corpus/templates/forms/app/hooks/use-navigation-state.ts +0 -1
  1177. package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +24 -26
  1178. package/corpus/templates/forms/app/pages/FormFillPage.tsx +2 -2
  1179. package/corpus/templates/forms/app/pages/FormsListPage.tsx +21 -21
  1180. package/corpus/templates/forms/app/pages/ResponseInsightsPage.tsx +11 -11
  1181. package/corpus/templates/forms/app/pages/ResponsesPage.tsx +4 -4
  1182. package/corpus/templates/forms/app/root.tsx +11 -8
  1183. package/corpus/templates/forms/app/routes/_app.settings.tsx +6 -21
  1184. package/corpus/templates/forms/app/routes/form-preview.tsx +3 -3
  1185. package/corpus/templates/forms/changelog/2026-07-06-the-form-builder-header-no-longer-shows-the-global-notificat.md +6 -0
  1186. package/corpus/templates/macros/app/components/AddExerciseDialog.tsx +1 -1
  1187. package/corpus/templates/macros/app/components/AddMealDialog.tsx +1 -1
  1188. package/corpus/templates/macros/app/components/AddWeightDialog.tsx +1 -1
  1189. package/corpus/templates/macros/app/components/DailyProgress.tsx +7 -7
  1190. package/corpus/templates/macros/app/components/WeeklyCaloriesChart.tsx +2 -1
  1191. package/corpus/templates/macros/app/components/WeightCard.tsx +10 -10
  1192. package/corpus/templates/macros/app/components/WeightTracker.tsx +1 -1
  1193. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +6 -10
  1194. package/corpus/templates/macros/app/components/ui/alert-dialog.tsx +1 -0
  1195. package/corpus/templates/macros/app/components/ui/label.tsx +1 -0
  1196. package/corpus/templates/macros/app/components/ui/select.tsx +1 -0
  1197. package/corpus/templates/macros/app/components/ui/sheet.tsx +1 -0
  1198. package/corpus/templates/macros/app/components/ui/skeleton.tsx +1 -0
  1199. package/corpus/templates/macros/app/components/ui/sonner.tsx +1 -0
  1200. package/corpus/templates/macros/app/components/ui/toolkit-provider.tsx +12 -0
  1201. package/corpus/templates/macros/app/components/ui/tooltip.tsx +1 -0
  1202. package/corpus/templates/macros/app/global.css +1 -0
  1203. package/corpus/templates/macros/app/root.tsx +17 -14
  1204. package/corpus/templates/macros/app/routes/_index.tsx +1 -1
  1205. package/corpus/templates/macros/app/routes/analytics.tsx +8 -8
  1206. package/corpus/templates/macros/app/routes/settings.tsx +4 -19
  1207. package/corpus/templates/mail/.agents/skills/actions/SKILL.md +55 -0
  1208. package/corpus/templates/mail/.agents/skills/contacts-and-crm/SKILL.md +67 -0
  1209. package/corpus/templates/mail/.agents/skills/draft-queue/SKILL.md +35 -1
  1210. package/corpus/templates/mail/.agents/skills/email-drafts/SKILL.md +74 -33
  1211. package/corpus/templates/mail/AGENTS.md +102 -16
  1212. package/corpus/templates/mail/actions/archive-email.ts +67 -11
  1213. package/corpus/templates/mail/actions/manage-snippets.ts +106 -0
  1214. package/corpus/templates/mail/actions/mark-read.ts +45 -11
  1215. package/corpus/templates/mail/actions/send-queued-drafts.ts +77 -42
  1216. package/corpus/templates/mail/actions/star-email.ts +55 -10
  1217. package/corpus/templates/mail/actions/trash-email.ts +48 -9
  1218. package/corpus/templates/mail/app/components/GoogleConnectBanner.tsx +1 -1
  1219. package/corpus/templates/mail/app/components/ThemeToggle.tsx +6 -6
  1220. package/corpus/templates/mail/app/components/agent-engine-picker.tsx +10 -10
  1221. package/corpus/templates/mail/app/components/email/CodeBlockLangPicker.tsx +4 -3
  1222. package/corpus/templates/mail/app/components/email/ComposeBubbleToolbar.tsx +5 -5
  1223. package/corpus/templates/mail/app/components/email/ComposeEditor.tsx +109 -10
  1224. package/corpus/templates/mail/app/components/email/ComposeModal.tsx +44 -19
  1225. package/corpus/templates/mail/app/components/email/ComposeSlashMenu.tsx +139 -17
  1226. package/corpus/templates/mail/app/components/email/EmailList.tsx +522 -314
  1227. package/corpus/templates/mail/app/components/email/EmailListItem.tsx +130 -45
  1228. package/corpus/templates/mail/app/components/email/EmailThread.tsx +9 -9
  1229. package/corpus/templates/mail/app/components/email/InlineReplyComposer.tsx +35 -13
  1230. package/corpus/templates/mail/app/components/email/IntegrationsSidebar.tsx +13 -13
  1231. package/corpus/templates/mail/app/components/email/MobileActionBar.tsx +13 -13
  1232. package/corpus/templates/mail/app/components/email/RecipientInput.tsx +53 -42
  1233. package/corpus/templates/mail/app/components/email/SendLaterButton.tsx +5 -4
  1234. package/corpus/templates/mail/app/components/email/SnoozeModal.tsx +1 -1
  1235. package/corpus/templates/mail/app/components/email/SnoozePopover.tsx +6 -6
  1236. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +19 -23
  1237. package/corpus/templates/mail/app/components/layout/HeaderActions.tsx +12 -4
  1238. package/corpus/templates/mail/app/components/layout/SearchBar.tsx +138 -18
  1239. package/corpus/templates/mail/app/components/settings/GmailFiltersSection.tsx +23 -23
  1240. package/corpus/templates/mail/app/components/settings/SnippetsSection.tsx +303 -0
  1241. package/corpus/templates/mail/app/components/ui/alert-dialog.tsx +1 -0
  1242. package/corpus/templates/mail/app/components/ui/badge.tsx +1 -0
  1243. package/corpus/templates/mail/app/components/ui/button.tsx +1 -0
  1244. package/corpus/templates/mail/app/components/ui/calendar.tsx +1 -1
  1245. package/corpus/templates/mail/app/components/ui/command.tsx +1 -1
  1246. package/corpus/templates/mail/app/components/ui/dialog.tsx +1 -0
  1247. package/corpus/templates/mail/app/components/ui/drawer.tsx +1 -0
  1248. package/corpus/templates/mail/app/components/ui/dropdown-menu.tsx +1 -0
  1249. package/corpus/templates/mail/app/components/ui/popover.tsx +1 -0
  1250. package/corpus/templates/mail/app/components/ui/select.tsx +1 -0
  1251. package/corpus/templates/mail/app/components/ui/skeleton.tsx +1 -0
  1252. package/corpus/templates/mail/app/components/ui/spinner.tsx +1 -0
  1253. package/corpus/templates/mail/app/components/ui/switch.tsx +1 -0
  1254. package/corpus/templates/mail/app/components/ui/toolkit-provider.tsx +12 -0
  1255. package/corpus/templates/mail/app/components/ui/tooltip.tsx +1 -0
  1256. package/corpus/templates/mail/app/global.css +20 -3
  1257. package/corpus/templates/mail/app/hooks/use-emails.ts +187 -0
  1258. package/corpus/templates/mail/app/hooks/use-snippets.ts +103 -0
  1259. package/corpus/templates/mail/app/i18n/ar-SA.ts +17 -0
  1260. package/corpus/templates/mail/app/i18n/de-DE.ts +18 -0
  1261. package/corpus/templates/mail/app/i18n/en-US.ts +17 -0
  1262. package/corpus/templates/mail/app/i18n/es-ES.ts +17 -0
  1263. package/corpus/templates/mail/app/i18n/fr-FR.ts +18 -0
  1264. package/corpus/templates/mail/app/i18n/hi-IN.ts +17 -0
  1265. package/corpus/templates/mail/app/i18n/ja-JP.ts +18 -0
  1266. package/corpus/templates/mail/app/i18n/ko-KR.ts +17 -0
  1267. package/corpus/templates/mail/app/i18n/pt-BR.ts +17 -0
  1268. package/corpus/templates/mail/app/i18n/zh-CN.ts +16 -0
  1269. package/corpus/templates/mail/app/i18n/zh-TW.ts +16 -0
  1270. package/corpus/templates/mail/app/pages/DraftQueuePage.tsx +14 -14
  1271. package/corpus/templates/mail/app/pages/InboxPage.tsx +3 -3
  1272. package/corpus/templates/mail/app/pages/NotFound.tsx +2 -1
  1273. package/corpus/templates/mail/app/pages/SettingsPage.tsx +64 -66
  1274. package/corpus/templates/mail/app/root.tsx +21 -18
  1275. package/corpus/templates/mail/app/routes/_index.tsx +2 -1
  1276. package/corpus/templates/mail/app/routes/email.tsx +2 -2
  1277. package/corpus/templates/mail/changelog/2026-07-06-a-queued-draft-can-no-longer-be-sent-twice-by-simultaneous-s.md +6 -0
  1278. package/corpus/templates/mail/changelog/2026-07-06-bulk-archive-trash-star-and-mark-read-now-complete-in-one-fa.md +6 -0
  1279. package/corpus/templates/mail/changelog/2026-07-06-dark-mode-sidebars-and-notifications-now-use-the-softer-gray.md +6 -0
  1280. package/corpus/templates/mail/changelog/2026-07-06-inbox-automations-pick-up-new-mail-faster.md +6 -0
  1281. package/corpus/templates/mail/changelog/2026-07-06-inbox-lists-stay-fast-as-scheduled-and-snoozed-mail-accumula.md +6 -0
  1282. package/corpus/templates/mail/changelog/2026-07-06-long-inboxes-scroll-smoothly-and-stay-fast-as-more-mail-load.md +6 -0
  1283. package/corpus/templates/mail/changelog/2026-07-06-paste-or-drop-images-straight-into-the-composer-to-send-them.md +6 -0
  1284. package/corpus/templates/mail/changelog/2026-07-06-save-reusable-snippets-and-insert-them-from-the-compose-slas.md +6 -0
  1285. package/corpus/templates/mail/changelog/2026-07-06-scrolling-older-mail-keeps-loading-correctly-when-no-gmail-a.md +6 -0
  1286. package/corpus/templates/mail/changelog/2026-07-06-search-shows-instant-matches-from-already-loaded-mail-while-.md +6 -0
  1287. package/corpus/templates/mail/changelog/2026-07-06-sends-now-fail-with-a-clear-error-instead-of-quietly-missing.md +6 -0
  1288. package/corpus/templates/mail/changelog/2026-07-06-the-mail-header-no-longer-shows-the-global-notifications-bel.md +6 -0
  1289. package/corpus/templates/mail/package.json +1 -0
  1290. package/corpus/templates/mail/server/db/schema.ts +11 -0
  1291. package/corpus/templates/mail/server/handlers/emails.ts +20 -1
  1292. package/corpus/templates/mail/server/lib/automation-engine.ts +53 -25
  1293. package/corpus/templates/mail/server/lib/google-auth.ts +140 -9
  1294. package/corpus/templates/mail/server/lib/jobs.ts +22 -6
  1295. package/corpus/templates/mail/server/lib/outgoing-email.ts +11 -2
  1296. package/corpus/templates/mail/server/lib/queued-drafts.ts +145 -4
  1297. package/corpus/templates/mail/server/plugins/db.ts +29 -0
  1298. package/corpus/templates/plan/.agents/skills/actions/SKILL.md +55 -0
  1299. package/corpus/templates/plan/app/components/editor/PlanDocumentEditor.tsx +42 -3
  1300. package/corpus/templates/plan/app/components/layout/Layout.tsx +5 -4
  1301. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +20 -20
  1302. package/corpus/templates/plan/app/components/plan/CanvasArea.tsx +3 -2
  1303. package/corpus/templates/plan/app/components/plan/DocumentArea.tsx +2 -2
  1304. package/corpus/templates/plan/app/components/plan/GuestModeBanner.tsx +2 -1
  1305. package/corpus/templates/plan/app/components/plan/LocalCodebasePicker.tsx +8 -8
  1306. package/corpus/templates/plan/app/components/plan/PlanContentRenderer.tsx +6 -1
  1307. package/corpus/templates/plan/app/components/plan/PlanImageViewer.tsx +8 -12
  1308. package/corpus/templates/plan/app/components/plan/PlanMarkdownEditor.tsx +6 -1
  1309. package/corpus/templates/plan/app/components/plan/PlanVisualSurface.tsx +3 -3
  1310. package/corpus/templates/plan/app/components/plan/planBlocks.tsx +4 -4
  1311. package/corpus/templates/plan/app/components/plan/wireframe/kit/rough.tsx +61 -27
  1312. package/corpus/templates/plan/app/components/ui/alert-dialog.tsx +1 -0
  1313. package/corpus/templates/plan/app/components/ui/avatar.tsx +1 -0
  1314. package/corpus/templates/plan/app/components/ui/badge.tsx +1 -0
  1315. package/corpus/templates/plan/app/components/ui/button.tsx +1 -0
  1316. package/corpus/templates/plan/app/components/ui/card.tsx +1 -0
  1317. package/corpus/templates/plan/app/components/ui/checkbox.tsx +1 -0
  1318. package/corpus/templates/plan/app/components/ui/collapsible.tsx +1 -0
  1319. package/corpus/templates/plan/app/components/ui/dialog.tsx +1 -0
  1320. package/corpus/templates/plan/app/components/ui/dropdown-menu.tsx +1 -0
  1321. package/corpus/templates/plan/app/components/ui/input.tsx +1 -0
  1322. package/corpus/templates/plan/app/components/ui/label.tsx +1 -0
  1323. package/corpus/templates/plan/app/components/ui/popover.tsx +1 -0
  1324. package/corpus/templates/plan/app/components/ui/scroll-area.tsx +1 -0
  1325. package/corpus/templates/plan/app/components/ui/select.tsx +1 -0
  1326. package/corpus/templates/plan/app/components/ui/separator.tsx +1 -0
  1327. package/corpus/templates/plan/app/components/ui/sheet.tsx +1 -0
  1328. package/corpus/templates/plan/app/components/ui/skeleton.tsx +1 -0
  1329. package/corpus/templates/plan/app/components/ui/sonner.tsx +1 -0
  1330. package/corpus/templates/plan/app/components/ui/spinner.tsx +1 -0
  1331. package/corpus/templates/plan/app/components/ui/textarea.tsx +1 -0
  1332. package/corpus/templates/plan/app/components/ui/toggle-group.tsx +1 -0
  1333. package/corpus/templates/plan/app/components/ui/toolkit-provider.tsx +12 -0
  1334. package/corpus/templates/plan/app/components/ui/tooltip.tsx +1 -0
  1335. package/corpus/templates/plan/app/global.css +13 -0
  1336. package/corpus/templates/plan/app/hooks/use-plan-presence.ts +11 -1
  1337. package/corpus/templates/plan/app/lib/plan-access-prompt.ts +74 -0
  1338. package/corpus/templates/plan/app/lib/plan-annotation-runtime.ts +1435 -0
  1339. package/corpus/templates/plan/app/lib/plan-comment-editor-helpers.ts +142 -0
  1340. package/corpus/templates/plan/app/lib/plan-local-bridge.ts +376 -0
  1341. package/corpus/templates/plan/app/lib/plan-native-anchors.ts +682 -0
  1342. package/corpus/templates/plan/app/pages/PlansPage.tsx +216 -2747
  1343. package/corpus/templates/plan/app/root.tsx +13 -10
  1344. package/corpus/templates/plan/app/routes/_index.tsx +1 -2
  1345. package/corpus/templates/plan/app/routes/local-plans.$slug.tsx +1 -1
  1346. package/corpus/templates/plan/app/routes/plans.$id.tsx +1 -2
  1347. package/corpus/templates/plan/app/routes/plans.tsx +1 -2
  1348. package/corpus/templates/plan/app/routes/recaps.$id.tsx +1 -2
  1349. package/corpus/templates/plan/app/routes/recaps.tsx +1 -2
  1350. package/corpus/templates/plan/app/routes/settings.tsx +7 -21
  1351. package/corpus/templates/plan/changelog/2026-07-05-plan-pages-open-at-the-top-unless-a-shared-link-targets-a-sp.md +6 -0
  1352. package/corpus/templates/plan/changelog/2026-07-06-fixed-collaborative-plan-editing-so-content-no-longer-duplic.md +6 -0
  1353. package/corpus/templates/plan/changelog/2026-07-06-fixed-visual-reports-using-excessive-cpu-while-rendering-ske.md +6 -0
  1354. package/corpus/templates/slides/.agents/skills/actions/SKILL.md +55 -0
  1355. package/corpus/templates/slides/app/components/ThemeToggle.tsx +6 -6
  1356. package/corpus/templates/slides/app/components/comments/SlideCommentsPanel.tsx +5 -5
  1357. package/corpus/templates/slides/app/components/deck/DeckCard.tsx +7 -7
  1358. package/corpus/templates/slides/app/components/deck/ExcalidrawSlide.tsx +2 -1
  1359. package/corpus/templates/slides/app/components/deck/SlideRenderer.tsx +1 -1
  1360. package/corpus/templates/slides/app/components/design-system/DesignSystemCard.tsx +3 -2
  1361. package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +15 -14
  1362. package/corpus/templates/slides/app/components/editor/AnimationsPanel.tsx +7 -7
  1363. package/corpus/templates/slides/app/components/editor/BlockBubbleMenu.tsx +5 -5
  1364. package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +6 -6
  1365. package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +29 -16
  1366. package/corpus/templates/slides/app/components/editor/ExportMenu.tsx +10 -9
  1367. package/corpus/templates/slides/app/components/editor/GenerateSlidesDialog.tsx +6 -5
  1368. package/corpus/templates/slides/app/components/editor/HistoryPanel.tsx +12 -12
  1369. package/corpus/templates/slides/app/components/editor/ImageDropPromptPopover.tsx +4 -3
  1370. package/corpus/templates/slides/app/components/editor/ImageSearchPanel.tsx +5 -4
  1371. package/corpus/templates/slides/app/components/editor/ImportButton.tsx +14 -4
  1372. package/corpus/templates/slides/app/components/editor/PromptDialog.tsx +2 -1
  1373. package/corpus/templates/slides/app/components/editor/ShareDialog.tsx +10 -10
  1374. package/corpus/templates/slides/app/components/editor/SlideBubbleMenu.tsx +10 -10
  1375. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +6 -6
  1376. package/corpus/templates/slides/app/components/editor/SlideStyleInspector.tsx +2 -1
  1377. package/corpus/templates/slides/app/components/editor/TweaksPanel.tsx +1 -1
  1378. package/corpus/templates/slides/app/components/layout/Header.tsx +2 -2
  1379. package/corpus/templates/slides/app/components/layout/Sidebar.tsx +5 -5
  1380. package/corpus/templates/slides/app/components/ui/alert-dialog.tsx +1 -0
  1381. package/corpus/templates/slides/app/components/ui/button.tsx +1 -0
  1382. package/corpus/templates/slides/app/components/ui/card.tsx +1 -0
  1383. package/corpus/templates/slides/app/components/ui/dialog.tsx +1 -0
  1384. package/corpus/templates/slides/app/components/ui/dropdown-menu.tsx +1 -0
  1385. package/corpus/templates/slides/app/components/ui/input.tsx +1 -0
  1386. package/corpus/templates/slides/app/components/ui/label.tsx +1 -0
  1387. package/corpus/templates/slides/app/components/ui/popover.tsx +1 -0
  1388. package/corpus/templates/slides/app/components/ui/scroll-area.tsx +1 -0
  1389. package/corpus/templates/slides/app/components/ui/select.tsx +1 -0
  1390. package/corpus/templates/slides/app/components/ui/separator.tsx +1 -0
  1391. package/corpus/templates/slides/app/components/ui/sheet.tsx +1 -0
  1392. package/corpus/templates/slides/app/components/ui/skeleton.tsx +1 -0
  1393. package/corpus/templates/slides/app/components/ui/spinner.tsx +1 -0
  1394. package/corpus/templates/slides/app/components/ui/textarea.tsx +1 -0
  1395. package/corpus/templates/slides/app/components/ui/toast.tsx +1 -0
  1396. package/corpus/templates/slides/app/components/ui/toaster.tsx +1 -0
  1397. package/corpus/templates/slides/app/components/ui/toggle-group.tsx +1 -0
  1398. package/corpus/templates/slides/app/components/ui/toolkit-provider.tsx +12 -0
  1399. package/corpus/templates/slides/app/components/ui/tooltip.tsx +1 -0
  1400. package/corpus/templates/slides/app/components/visual-editor/CanvasCommentPins.tsx +6 -6
  1401. package/corpus/templates/slides/app/components/visual-editor/DrawOverlay.tsx +7 -7
  1402. package/corpus/templates/slides/app/global.css +1 -0
  1403. package/corpus/templates/slides/app/hooks/use-toast.ts +1 -0
  1404. package/corpus/templates/slides/app/lib/upload-response.ts +71 -0
  1405. package/corpus/templates/slides/app/pages/DeckEditor.tsx +3 -3
  1406. package/corpus/templates/slides/app/pages/DesignSystems.tsx +1 -1
  1407. package/corpus/templates/slides/app/pages/Index.tsx +14 -17
  1408. package/corpus/templates/slides/app/root.tsx +13 -10
  1409. package/corpus/templates/slides/app/routes/settings.tsx +6 -21
  1410. package/corpus/templates/slides/changelog/2026-07-06-mobile-layouts-no-longer-stack-two-top-headers.md +5 -0
  1411. package/corpus/templates/slides/server/handlers/uploads.ts +7 -2
  1412. package/corpus/templates/slides/server/lib/chat-attachments.ts +1 -1
  1413. package/dist/agent/durable-background.d.ts +29 -0
  1414. package/dist/agent/durable-background.d.ts.map +1 -1
  1415. package/dist/agent/durable-background.js +46 -0
  1416. package/dist/agent/durable-background.js.map +1 -1
  1417. package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
  1418. package/dist/agent/engine/ai-sdk-engine.js +7 -2
  1419. package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
  1420. package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
  1421. package/dist/agent/engine/anthropic-engine.js +28 -2
  1422. package/dist/agent/engine/anthropic-engine.js.map +1 -1
  1423. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  1424. package/dist/agent/engine/builder-engine.js +1 -1
  1425. package/dist/agent/engine/builder-engine.js.map +1 -1
  1426. package/dist/agent/engine/output-tokens.d.ts +3 -3
  1427. package/dist/agent/engine/output-tokens.d.ts.map +1 -1
  1428. package/dist/agent/engine/output-tokens.js +16 -14
  1429. package/dist/agent/engine/output-tokens.js.map +1 -1
  1430. package/dist/agent/engine/registry.d.ts +3 -3
  1431. package/dist/agent/engine/registry.d.ts.map +1 -1
  1432. package/dist/agent/engine/registry.js +28 -25
  1433. package/dist/agent/engine/registry.js.map +1 -1
  1434. package/dist/agent/engine/translate-ai-sdk.d.ts +14 -2
  1435. package/dist/agent/engine/translate-ai-sdk.d.ts.map +1 -1
  1436. package/dist/agent/engine/translate-ai-sdk.js +33 -18
  1437. package/dist/agent/engine/translate-ai-sdk.js.map +1 -1
  1438. package/dist/agent/engine/translate-anthropic.d.ts.map +1 -1
  1439. package/dist/agent/engine/translate-anthropic.js +42 -1
  1440. package/dist/agent/engine/translate-anthropic.js.map +1 -1
  1441. package/dist/agent/engine/types.d.ts +15 -0
  1442. package/dist/agent/engine/types.d.ts.map +1 -1
  1443. package/dist/agent/engine/types.js.map +1 -1
  1444. package/dist/agent/model-config.d.ts +8 -0
  1445. package/dist/agent/model-config.d.ts.map +1 -1
  1446. package/dist/agent/model-config.js +86 -0
  1447. package/dist/agent/model-config.js.map +1 -1
  1448. package/dist/agent/production-agent.d.ts +91 -5
  1449. package/dist/agent/production-agent.d.ts.map +1 -1
  1450. package/dist/agent/production-agent.js +389 -180
  1451. package/dist/agent/production-agent.js.map +1 -1
  1452. package/dist/agent/runtime-context.d.ts +29 -0
  1453. package/dist/agent/runtime-context.d.ts.map +1 -1
  1454. package/dist/agent/runtime-context.js +40 -11
  1455. package/dist/agent/runtime-context.js.map +1 -1
  1456. package/dist/agent/tool-result-images.d.ts +49 -0
  1457. package/dist/agent/tool-result-images.d.ts.map +1 -0
  1458. package/dist/agent/tool-result-images.js +141 -0
  1459. package/dist/agent/tool-result-images.js.map +1 -0
  1460. package/dist/brand-kit/fig/index.d.ts.map +1 -1
  1461. package/dist/brand-kit/fig/index.js +6 -3
  1462. package/dist/brand-kit/fig/index.js.map +1 -1
  1463. package/dist/client/AgentPanel.d.ts.map +1 -1
  1464. package/dist/client/AgentPanel.js +67 -18
  1465. package/dist/client/AgentPanel.js.map +1 -1
  1466. package/dist/client/AssistantChat.d.ts.map +1 -1
  1467. package/dist/client/AssistantChat.js +72 -40
  1468. package/dist/client/AssistantChat.js.map +1 -1
  1469. package/dist/client/KeepTabOpenNotice.d.ts +55 -0
  1470. package/dist/client/KeepTabOpenNotice.d.ts.map +1 -0
  1471. package/dist/client/KeepTabOpenNotice.js +85 -0
  1472. package/dist/client/KeepTabOpenNotice.js.map +1 -0
  1473. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  1474. package/dist/client/MultiTabAssistantChat.js +2 -1
  1475. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  1476. package/dist/client/RunStuckBanner.d.ts +7 -1
  1477. package/dist/client/RunStuckBanner.d.ts.map +1 -1
  1478. package/dist/client/RunStuckBanner.js +7 -2
  1479. package/dist/client/RunStuckBanner.js.map +1 -1
  1480. package/dist/client/chat/run-recovery.d.ts.map +1 -1
  1481. package/dist/client/chat/run-recovery.js +7 -1
  1482. package/dist/client/chat/run-recovery.js.map +1 -1
  1483. package/dist/client/clipboard.d.ts.map +1 -1
  1484. package/dist/client/clipboard.js +5 -6
  1485. package/dist/client/clipboard.js.map +1 -1
  1486. package/dist/client/components/AgentPresenceChip.d.ts +1 -11
  1487. package/dist/client/components/AgentPresenceChip.d.ts.map +1 -1
  1488. package/dist/client/components/AgentPresenceChip.js +1 -41
  1489. package/dist/client/components/AgentPresenceChip.js.map +1 -1
  1490. package/dist/client/components/LiveCursorOverlay.d.ts +1 -44
  1491. package/dist/client/components/LiveCursorOverlay.d.ts.map +1 -1
  1492. package/dist/client/components/LiveCursorOverlay.js +1 -123
  1493. package/dist/client/components/LiveCursorOverlay.js.map +1 -1
  1494. package/dist/client/components/PresenceBar.d.ts +1 -26
  1495. package/dist/client/components/PresenceBar.d.ts.map +1 -1
  1496. package/dist/client/components/PresenceBar.js +1 -164
  1497. package/dist/client/components/PresenceBar.js.map +1 -1
  1498. package/dist/client/components/RecentEditHighlights.d.ts +1 -42
  1499. package/dist/client/components/RecentEditHighlights.d.ts.map +1 -1
  1500. package/dist/client/components/RecentEditHighlights.js +1 -145
  1501. package/dist/client/components/RecentEditHighlights.js.map +1 -1
  1502. package/dist/client/components/RemoteSelectionRings.d.ts +1 -51
  1503. package/dist/client/components/RemoteSelectionRings.d.ts.map +1 -1
  1504. package/dist/client/components/RemoteSelectionRings.js +1 -129
  1505. package/dist/client/components/RemoteSelectionRings.js.map +1 -1
  1506. package/dist/client/composer/TiptapComposer.d.ts +4 -0
  1507. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  1508. package/dist/client/composer/TiptapComposer.js +74 -26
  1509. package/dist/client/composer/TiptapComposer.js.map +1 -1
  1510. package/dist/client/db-admin/SqlEditor.d.ts.map +1 -1
  1511. package/dist/client/db-admin/SqlEditor.js +13 -3
  1512. package/dist/client/db-admin/SqlEditor.js.map +1 -1
  1513. package/dist/client/dynamic-suggestions.d.ts.map +1 -1
  1514. package/dist/client/dynamic-suggestions.js +7 -1
  1515. package/dist/client/dynamic-suggestions.js.map +1 -1
  1516. package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
  1517. package/dist/client/extensions/ExtensionViewer.js +7 -7
  1518. package/dist/client/extensions/ExtensionViewer.js.map +1 -1
  1519. package/dist/client/extensions/ExtensionsListPage.d.ts.map +1 -1
  1520. package/dist/client/extensions/ExtensionsListPage.js +5 -7
  1521. package/dist/client/extensions/ExtensionsListPage.js.map +1 -1
  1522. package/dist/client/extensions/ExtensionsSidebarSection.d.ts.map +1 -1
  1523. package/dist/client/extensions/ExtensionsSidebarSection.js +1 -1
  1524. package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
  1525. package/dist/client/host-bridge.d.ts +2 -0
  1526. package/dist/client/host-bridge.d.ts.map +1 -1
  1527. package/dist/client/host-bridge.js +26 -10
  1528. package/dist/client/host-bridge.js.map +1 -1
  1529. package/dist/client/i18n.d.ts +1 -0
  1530. package/dist/client/i18n.d.ts.map +1 -1
  1531. package/dist/client/i18n.js +3 -1
  1532. package/dist/client/i18n.js.map +1 -1
  1533. package/dist/client/index.d.ts +2 -1
  1534. package/dist/client/index.d.ts.map +1 -1
  1535. package/dist/client/index.js +2 -1
  1536. package/dist/client/index.js.map +1 -1
  1537. package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
  1538. package/dist/client/resources/McpIntegrationDialog.js +12 -31
  1539. package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
  1540. package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts +3 -1
  1541. package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts.map +1 -1
  1542. package/dist/client/rich-markdown-editor/SharedRichEditor.js +2 -1
  1543. package/dist/client/rich-markdown-editor/SharedRichEditor.js.map +1 -1
  1544. package/dist/client/rich-markdown-editor/useCollabReconcile.d.ts +3 -1
  1545. package/dist/client/rich-markdown-editor/useCollabReconcile.d.ts.map +1 -1
  1546. package/dist/client/rich-markdown-editor/useCollabReconcile.js +17 -8
  1547. package/dist/client/rich-markdown-editor/useCollabReconcile.js.map +1 -1
  1548. package/dist/client/settings/SettingsPanel.d.ts +3 -1
  1549. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  1550. package/dist/client/settings/SettingsPanel.js +103 -9
  1551. package/dist/client/settings/SettingsPanel.js.map +1 -1
  1552. package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
  1553. package/dist/client/settings/SettingsTabsPage.js +5 -5
  1554. package/dist/client/settings/SettingsTabsPage.js.map +1 -1
  1555. package/dist/client/settings/index.d.ts +1 -1
  1556. package/dist/client/settings/index.d.ts.map +1 -1
  1557. package/dist/client/settings/index.js +1 -1
  1558. package/dist/client/settings/index.js.map +1 -1
  1559. package/dist/client/sharing/VisibilityBadge.d.ts +1 -10
  1560. package/dist/client/sharing/VisibilityBadge.d.ts.map +1 -1
  1561. package/dist/client/sharing/VisibilityBadge.js +1 -18
  1562. package/dist/client/sharing/VisibilityBadge.js.map +1 -1
  1563. package/dist/client/use-action.d.ts +3 -0
  1564. package/dist/client/use-action.d.ts.map +1 -1
  1565. package/dist/client/use-action.js +34 -3
  1566. package/dist/client/use-action.js.map +1 -1
  1567. package/dist/client/use-db-sync.d.ts +4 -0
  1568. package/dist/client/use-db-sync.d.ts.map +1 -1
  1569. package/dist/client/use-db-sync.js +37 -18
  1570. package/dist/client/use-db-sync.js.map +1 -1
  1571. package/dist/client/use-run-stuck-detection.d.ts +8 -1
  1572. package/dist/client/use-run-stuck-detection.d.ts.map +1 -1
  1573. package/dist/client/use-run-stuck-detection.js +3 -2
  1574. package/dist/client/use-run-stuck-detection.js.map +1 -1
  1575. package/dist/coding-tools/run-code.d.ts +36 -0
  1576. package/dist/coding-tools/run-code.d.ts.map +1 -1
  1577. package/dist/coding-tools/run-code.js +333 -62
  1578. package/dist/coding-tools/run-code.js.map +1 -1
  1579. package/dist/coding-tools/sandbox/background.d.ts +141 -0
  1580. package/dist/coding-tools/sandbox/background.d.ts.map +1 -0
  1581. package/dist/coding-tools/sandbox/background.js +279 -0
  1582. package/dist/coding-tools/sandbox/background.js.map +1 -0
  1583. package/dist/coding-tools/sandbox/executions-store.d.ts +138 -0
  1584. package/dist/coding-tools/sandbox/executions-store.d.ts.map +1 -0
  1585. package/dist/coding-tools/sandbox/executions-store.js +380 -0
  1586. package/dist/coding-tools/sandbox/executions-store.js.map +1 -0
  1587. package/dist/coding-tools/sandbox/index.d.ts +22 -13
  1588. package/dist/coding-tools/sandbox/index.d.ts.map +1 -1
  1589. package/dist/coding-tools/sandbox/index.js +31 -13
  1590. package/dist/coding-tools/sandbox/index.js.map +1 -1
  1591. package/dist/coding-tools/sandbox/local-child-process-adapter.d.ts.map +1 -1
  1592. package/dist/coding-tools/sandbox/local-child-process-adapter.js +61 -4
  1593. package/dist/coding-tools/sandbox/local-child-process-adapter.js.map +1 -1
  1594. package/dist/collab/awareness.d.ts +2 -2
  1595. package/dist/collab/awareness.d.ts.map +1 -1
  1596. package/dist/collab/client.d.ts +16 -12
  1597. package/dist/collab/client.d.ts.map +1 -1
  1598. package/dist/collab/client.js +744 -496
  1599. package/dist/collab/client.js.map +1 -1
  1600. package/dist/collab/presence.d.ts +2 -20
  1601. package/dist/collab/presence.d.ts.map +1 -1
  1602. package/dist/collab/presence.js +3 -0
  1603. package/dist/collab/presence.js.map +1 -1
  1604. package/dist/collab/recent-edits.d.ts +2 -37
  1605. package/dist/collab/recent-edits.d.ts.map +1 -1
  1606. package/dist/collab/recent-edits.js +2 -9
  1607. package/dist/collab/recent-edits.js.map +1 -1
  1608. package/dist/collab/struct-routes.d.ts +1 -1
  1609. package/dist/data-programs/actions.d.ts +19 -0
  1610. package/dist/data-programs/actions.d.ts.map +1 -0
  1611. package/dist/data-programs/actions.js +279 -0
  1612. package/dist/data-programs/actions.js.map +1 -0
  1613. package/dist/data-programs/contract.d.ts +70 -0
  1614. package/dist/data-programs/contract.d.ts.map +1 -0
  1615. package/dist/data-programs/contract.js +225 -0
  1616. package/dist/data-programs/contract.js.map +1 -0
  1617. package/dist/data-programs/execute.d.ts +96 -0
  1618. package/dist/data-programs/execute.d.ts.map +1 -0
  1619. package/dist/data-programs/execute.js +454 -0
  1620. package/dist/data-programs/execute.js.map +1 -0
  1621. package/dist/data-programs/index.d.ts +11 -0
  1622. package/dist/data-programs/index.d.ts.map +1 -0
  1623. package/dist/data-programs/index.js +11 -0
  1624. package/dist/data-programs/index.js.map +1 -0
  1625. package/dist/data-programs/schema.d.ts +517 -0
  1626. package/dist/data-programs/schema.d.ts.map +1 -0
  1627. package/dist/data-programs/schema.js +138 -0
  1628. package/dist/data-programs/schema.js.map +1 -0
  1629. package/dist/data-programs/store.d.ts +158 -0
  1630. package/dist/data-programs/store.d.ts.map +1 -0
  1631. package/dist/data-programs/store.js +493 -0
  1632. package/dist/data-programs/store.js.map +1 -0
  1633. package/dist/db/create-get-db.d.ts +25 -0
  1634. package/dist/db/create-get-db.d.ts.map +1 -1
  1635. package/dist/db/create-get-db.js +25 -2
  1636. package/dist/db/create-get-db.js.map +1 -1
  1637. package/dist/deploy/build.d.ts.map +1 -1
  1638. package/dist/deploy/build.js +34 -0
  1639. package/dist/deploy/build.js.map +1 -1
  1640. package/dist/extensions/actions.js +2 -2
  1641. package/dist/extensions/actions.js.map +1 -1
  1642. package/dist/file-upload/builder.d.ts.map +1 -1
  1643. package/dist/file-upload/builder.js +9 -0
  1644. package/dist/file-upload/builder.js.map +1 -1
  1645. package/dist/integrations/webhook-handler.d.ts.map +1 -1
  1646. package/dist/integrations/webhook-handler.js +21 -10
  1647. package/dist/integrations/webhook-handler.js.map +1 -1
  1648. package/dist/local-artifacts/index.js +1 -1
  1649. package/dist/local-artifacts/index.js.map +1 -1
  1650. package/dist/localization/default-messages.d.ts +0 -1
  1651. package/dist/localization/default-messages.d.ts.map +1 -1
  1652. package/dist/localization/default-messages.js +1 -2
  1653. package/dist/localization/default-messages.js.map +1 -1
  1654. package/dist/mcp-client/index.d.ts +9 -0
  1655. package/dist/mcp-client/index.d.ts.map +1 -1
  1656. package/dist/mcp-client/index.js +23 -0
  1657. package/dist/mcp-client/index.js.map +1 -1
  1658. package/dist/observability/routes.d.ts +3 -3
  1659. package/dist/onboarding/default-steps.d.ts.map +1 -1
  1660. package/dist/onboarding/default-steps.js +2 -2
  1661. package/dist/onboarding/default-steps.js.map +1 -1
  1662. package/dist/progress/routes.d.ts +1 -1
  1663. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  1664. package/dist/resources/store.d.ts.map +1 -1
  1665. package/dist/resources/store.js +35 -3
  1666. package/dist/resources/store.js.map +1 -1
  1667. package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
  1668. package/dist/scripts/agent-engines/list-agent-engines.js +4 -8
  1669. package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
  1670. package/dist/scripts/agent-engines/test-agent-engine.d.ts.map +1 -1
  1671. package/dist/scripts/agent-engines/test-agent-engine.js +7 -2
  1672. package/dist/scripts/agent-engines/test-agent-engine.js.map +1 -1
  1673. package/dist/scripts/db/tool-mode.js +3 -3
  1674. package/dist/scripts/db/tool-mode.js.map +1 -1
  1675. package/dist/scripts/resources/migrate-learnings.d.ts +5 -1
  1676. package/dist/scripts/resources/migrate-learnings.d.ts.map +1 -1
  1677. package/dist/scripts/resources/migrate-learnings.js +8 -10
  1678. package/dist/scripts/resources/migrate-learnings.js.map +1 -1
  1679. package/dist/server/agent-chat-plugin.d.ts +20 -6
  1680. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  1681. package/dist/server/agent-chat-plugin.js +138 -59
  1682. package/dist/server/agent-chat-plugin.js.map +1 -1
  1683. package/dist/server/agent-discovery.d.ts.map +1 -1
  1684. package/dist/server/agent-discovery.js +62 -8
  1685. package/dist/server/agent-discovery.js.map +1 -1
  1686. package/dist/server/auth.d.ts.map +1 -1
  1687. package/dist/server/auth.js +75 -3
  1688. package/dist/server/auth.js.map +1 -1
  1689. package/dist/server/builder-design-systems.js +2 -2
  1690. package/dist/server/builder-design-systems.js.map +1 -1
  1691. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  1692. package/dist/server/core-routes-plugin.js +100 -20
  1693. package/dist/server/core-routes-plugin.js.map +1 -1
  1694. package/dist/server/credential-provider.d.ts +6 -3
  1695. package/dist/server/credential-provider.d.ts.map +1 -1
  1696. package/dist/server/credential-provider.js +25 -8
  1697. package/dist/server/credential-provider.js.map +1 -1
  1698. package/dist/server/csrf.d.ts.map +1 -1
  1699. package/dist/server/csrf.js +3 -0
  1700. package/dist/server/csrf.js.map +1 -1
  1701. package/dist/server/framework-request-handler.d.ts.map +1 -1
  1702. package/dist/server/framework-request-handler.js +37 -1
  1703. package/dist/server/framework-request-handler.js.map +1 -1
  1704. package/dist/server/oauth-helpers.d.ts.map +1 -1
  1705. package/dist/server/oauth-helpers.js +9 -1
  1706. package/dist/server/oauth-helpers.js.map +1 -1
  1707. package/dist/server/onboarding-html.d.ts.map +1 -1
  1708. package/dist/server/onboarding-html.js +80 -48
  1709. package/dist/server/onboarding-html.js.map +1 -1
  1710. package/dist/server/prompts/shared-rules.js +2 -2
  1711. package/dist/server/prompts/shared-rules.js.map +1 -1
  1712. package/dist/server/transcribe-voice.d.ts +1 -1
  1713. package/dist/server/transcribe-voice.d.ts.map +1 -1
  1714. package/dist/server/transcribe-voice.js +77 -15
  1715. package/dist/server/transcribe-voice.js.map +1 -1
  1716. package/dist/styles/agent-native.css +57 -45
  1717. package/dist/templates/default/.agents/skills/actions/SKILL.md +55 -0
  1718. package/dist/templates/default/AGENTS.md +11 -14
  1719. package/dist/templates/default/actions/navigate.ts +1 -1
  1720. package/dist/templates/default/app/i18n/ar-SA.ts +0 -1
  1721. package/dist/templates/default/app/i18n/de-DE.ts +0 -1
  1722. package/dist/templates/default/app/i18n/en-US.ts +0 -1
  1723. package/dist/templates/default/app/i18n/es-ES.ts +0 -1
  1724. package/dist/templates/default/app/i18n/fr-FR.ts +0 -1
  1725. package/dist/templates/default/app/i18n/hi-IN.ts +0 -1
  1726. package/dist/templates/default/app/i18n/ja-JP.ts +0 -1
  1727. package/dist/templates/default/app/i18n/ko-KR.ts +0 -1
  1728. package/dist/templates/default/app/i18n/pt-BR.ts +0 -1
  1729. package/dist/templates/default/app/i18n/zh-CN.ts +0 -1
  1730. package/dist/templates/default/app/i18n/zh-TW.ts +0 -1
  1731. package/dist/templates/default/app/routes/settings.tsx +22 -33
  1732. package/dist/templates/headless/.agents/skills/agent-native-docs/SKILL.md +20 -7
  1733. package/dist/templates/headless/AGENTS.md +9 -6
  1734. package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +55 -0
  1735. package/dist/templates/workspace-core/.agents/skills/data-programs/SKILL.md +128 -0
  1736. package/dist/templates/workspace-core/.agents/skills/harness-agents/SKILL.md +10 -4
  1737. package/dist/vite/agents-bundle-plugin.d.ts.map +1 -1
  1738. package/dist/vite/agents-bundle-plugin.js +26 -1
  1739. package/dist/vite/agents-bundle-plugin.js.map +1 -1
  1740. package/dist/vite/client.d.ts.map +1 -1
  1741. package/dist/vite/client.js +11 -0
  1742. package/dist/vite/client.js.map +1 -1
  1743. package/docs/content/agent-native-toolkit.mdx +87 -146
  1744. package/docs/content/cloneable-saas.mdx +19 -19
  1745. package/docs/content/components.mdx +16 -4
  1746. package/docs/content/data-programs.mdx +329 -0
  1747. package/docs/content/deployment.mdx +9 -9
  1748. package/docs/content/extensions.mdx +8 -7
  1749. package/docs/content/generative-ui.mdx +5 -3
  1750. package/docs/content/key-concepts.mdx +6 -9
  1751. package/docs/content/locales/ar-SA/agent-native-toolkit.mdx +100 -70
  1752. package/docs/content/locales/ar-SA/cloneable-saas.mdx +19 -19
  1753. package/docs/content/locales/ar-SA/components.mdx +12 -2
  1754. package/docs/content/locales/ar-SA/data-programs.mdx +329 -0
  1755. package/docs/content/locales/ar-SA/deployment.mdx +8 -9
  1756. package/docs/content/locales/ar-SA/extensions.mdx +6 -4
  1757. package/docs/content/locales/ar-SA/key-concepts.mdx +7 -9
  1758. package/docs/content/locales/ar-SA/real-time-collaboration.mdx +9 -10
  1759. package/docs/content/locales/de-DE/agent-native-toolkit.mdx +100 -74
  1760. package/docs/content/locales/de-DE/cloneable-saas.mdx +19 -19
  1761. package/docs/content/locales/de-DE/components.mdx +12 -2
  1762. package/docs/content/locales/de-DE/data-programs.mdx +329 -0
  1763. package/docs/content/locales/de-DE/deployment.mdx +8 -9
  1764. package/docs/content/locales/de-DE/extensions.mdx +6 -4
  1765. package/docs/content/locales/de-DE/key-concepts.mdx +8 -10
  1766. package/docs/content/locales/de-DE/real-time-collaboration.mdx +9 -10
  1767. package/docs/content/locales/es-ES/agent-native-toolkit.mdx +100 -74
  1768. package/docs/content/locales/es-ES/cloneable-saas.mdx +19 -19
  1769. package/docs/content/locales/es-ES/components.mdx +12 -2
  1770. package/docs/content/locales/es-ES/data-programs.mdx +329 -0
  1771. package/docs/content/locales/es-ES/deployment.mdx +8 -9
  1772. package/docs/content/locales/es-ES/extensions.mdx +6 -4
  1773. package/docs/content/locales/es-ES/key-concepts.mdx +8 -10
  1774. package/docs/content/locales/es-ES/real-time-collaboration.mdx +9 -10
  1775. package/docs/content/locales/fr-FR/agent-native-toolkit.mdx +100 -76
  1776. package/docs/content/locales/fr-FR/cloneable-saas.mdx +19 -19
  1777. package/docs/content/locales/fr-FR/components.mdx +12 -2
  1778. package/docs/content/locales/fr-FR/data-programs.mdx +329 -0
  1779. package/docs/content/locales/fr-FR/deployment.mdx +8 -9
  1780. package/docs/content/locales/fr-FR/extensions.mdx +6 -4
  1781. package/docs/content/locales/fr-FR/key-concepts.mdx +8 -10
  1782. package/docs/content/locales/fr-FR/real-time-collaboration.mdx +9 -10
  1783. package/docs/content/locales/hi-IN/agent-native-toolkit.mdx +100 -71
  1784. package/docs/content/locales/hi-IN/cloneable-saas.mdx +19 -19
  1785. package/docs/content/locales/hi-IN/components.mdx +20 -10
  1786. package/docs/content/locales/hi-IN/data-programs.mdx +329 -0
  1787. package/docs/content/locales/hi-IN/deployment.mdx +8 -9
  1788. package/docs/content/locales/hi-IN/extensions.mdx +6 -4
  1789. package/docs/content/locales/hi-IN/key-concepts.mdx +8 -10
  1790. package/docs/content/locales/hi-IN/real-time-collaboration.mdx +9 -10
  1791. package/docs/content/locales/ja-JP/agent-native-toolkit.mdx +100 -64
  1792. package/docs/content/locales/ja-JP/cloneable-saas.mdx +19 -19
  1793. package/docs/content/locales/ja-JP/components.mdx +12 -2
  1794. package/docs/content/locales/ja-JP/data-programs.mdx +329 -0
  1795. package/docs/content/locales/ja-JP/deployment.mdx +8 -9
  1796. package/docs/content/locales/ja-JP/extensions.mdx +6 -4
  1797. package/docs/content/locales/ja-JP/key-concepts.mdx +9 -11
  1798. package/docs/content/locales/ja-JP/real-time-collaboration.mdx +9 -10
  1799. package/docs/content/locales/ko-KR/agent-native-toolkit.mdx +100 -60
  1800. package/docs/content/locales/ko-KR/cloneable-saas.mdx +19 -19
  1801. package/docs/content/locales/ko-KR/components.mdx +20 -10
  1802. package/docs/content/locales/ko-KR/data-programs.mdx +329 -0
  1803. package/docs/content/locales/ko-KR/deployment.mdx +8 -9
  1804. package/docs/content/locales/ko-KR/extensions.mdx +16 -14
  1805. package/docs/content/locales/ko-KR/key-concepts.mdx +9 -11
  1806. package/docs/content/locales/ko-KR/real-time-collaboration.mdx +9 -10
  1807. package/docs/content/locales/pt-BR/agent-native-toolkit.mdx +100 -74
  1808. package/docs/content/locales/pt-BR/cloneable-saas.mdx +19 -19
  1809. package/docs/content/locales/pt-BR/components.mdx +12 -2
  1810. package/docs/content/locales/pt-BR/data-programs.mdx +329 -0
  1811. package/docs/content/locales/pt-BR/deployment.mdx +8 -9
  1812. package/docs/content/locales/pt-BR/extensions.mdx +6 -4
  1813. package/docs/content/locales/pt-BR/key-concepts.mdx +8 -11
  1814. package/docs/content/locales/pt-BR/real-time-collaboration.mdx +9 -10
  1815. package/docs/content/locales/zh-CN/agent-native-toolkit.mdx +100 -58
  1816. package/docs/content/locales/zh-CN/cloneable-saas.mdx +19 -19
  1817. package/docs/content/locales/zh-CN/components.mdx +20 -10
  1818. package/docs/content/locales/zh-CN/data-programs.mdx +329 -0
  1819. package/docs/content/locales/zh-CN/deployment.mdx +7 -9
  1820. package/docs/content/locales/zh-CN/extensions.mdx +16 -14
  1821. package/docs/content/locales/zh-CN/key-concepts.mdx +7 -11
  1822. package/docs/content/locales/zh-CN/real-time-collaboration.mdx +10 -11
  1823. package/docs/content/locales/zh-TW/agent-native-toolkit.mdx +100 -58
  1824. package/docs/content/locales/zh-TW/cloneable-saas.mdx +19 -19
  1825. package/docs/content/locales/zh-TW/components.mdx +20 -10
  1826. package/docs/content/locales/zh-TW/data-programs.mdx +329 -0
  1827. package/docs/content/locales/zh-TW/deployment.mdx +7 -9
  1828. package/docs/content/locales/zh-TW/extensions.mdx +16 -14
  1829. package/docs/content/locales/zh-TW/key-concepts.mdx +7 -11
  1830. package/docs/content/locales/zh-TW/real-time-collaboration.mdx +10 -11
  1831. package/docs/content/real-time-collaboration.mdx +10 -11
  1832. package/docs/content/toolkit-app-adapters.mdx +46 -0
  1833. package/docs/content/toolkit-collaboration-ui.mdx +48 -0
  1834. package/docs/content/toolkit-sharing-ui.mdx +33 -0
  1835. package/docs/content/toolkit-shell-hooks.mdx +27 -0
  1836. package/docs/content/toolkit-ui.mdx +69 -0
  1837. package/package.json +6 -2
  1838. package/src/templates/default/.agents/skills/actions/SKILL.md +55 -0
  1839. package/src/templates/default/AGENTS.md +11 -14
  1840. package/src/templates/default/actions/navigate.spec.ts +53 -0
  1841. package/src/templates/default/actions/navigate.ts +1 -1
  1842. package/src/templates/default/app/i18n/ar-SA.ts +0 -1
  1843. package/src/templates/default/app/i18n/de-DE.ts +0 -1
  1844. package/src/templates/default/app/i18n/en-US.ts +0 -1
  1845. package/src/templates/default/app/i18n/es-ES.ts +0 -1
  1846. package/src/templates/default/app/i18n/fr-FR.ts +0 -1
  1847. package/src/templates/default/app/i18n/hi-IN.ts +0 -1
  1848. package/src/templates/default/app/i18n/ja-JP.ts +0 -1
  1849. package/src/templates/default/app/i18n/ko-KR.ts +0 -1
  1850. package/src/templates/default/app/i18n/pt-BR.ts +0 -1
  1851. package/src/templates/default/app/i18n/zh-CN.ts +0 -1
  1852. package/src/templates/default/app/i18n/zh-TW.ts +0 -1
  1853. package/src/templates/default/app/routes/settings.tsx +22 -33
  1854. package/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +20 -7
  1855. package/src/templates/headless/AGENTS.md +9 -6
  1856. package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +55 -0
  1857. package/src/templates/workspace-core/.agents/skills/data-programs/SKILL.md +128 -0
  1858. package/src/templates/workspace-core/.agents/skills/harness-agents/SKILL.md +10 -4
  1859. package/corpus/templates/design/app/components/design/inspector/InspectorAiActions.tsx +0 -153
  1860. package/corpus/templates/design/app/hooks/useAgentEditRequest.ts +0 -133
  1861. package/corpus/templates/design/app/pages/DesignEditor.tsx +0 -22928
  1862. package/corpus/templates/design/server/lib/figma-import/clipboard.ts +0 -122
  1863. package/corpus/templates/design/server/lib/figma-import/decode.ts +0 -455
  1864. package/corpus/templates/design/server/lib/figma-import/processor.ts +0 -116
  1865. package/corpus/templates/design/server/lib/figma-import/render-html.ts +0 -397
  1866. package/corpus/templates/design/server/lib/figma-import/types.ts +0 -60
@@ -1 +1 @@
1
- {"version":3,"file":"MultiTabAssistantChat.js","sourceRoot":"","sources":["../../src/client/MultiTabAssistantChat.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n IconX,\n IconPlus,\n IconHistory,\n IconSearch,\n IconLink,\n IconLinkOff,\n IconCheck,\n} from \"@tabler/icons-react\";\nimport React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n useMemo,\n} from \"react\";\n\nimport { DEFAULT_MODEL } from \"../agent/default-model.js\";\nimport {\n getReasoningEffortOptionsForModel,\n isReasoningEffort,\n type ReasoningEffort,\n} from \"../shared/reasoning-effort.js\";\nimport {\n AGENT_CHAT_CLEAR_CONTEXT_MESSAGE_TYPE,\n AGENT_CHAT_REMOVE_CONTEXT_MESSAGE_TYPE,\n AGENT_CHAT_SET_CONTEXT_MESSAGE_TYPE,\n appendAgentChatContextToMessage,\n claimAgentChatOpenRequest,\n claimAgentChatSubmit,\n drainBufferedAgentChatOpenRequests,\n drainBufferedAgentChatSubmits,\n normalizeAgentChatContextItem,\n parseSubmitChatMessage,\n type AgentChatContextItem,\n} from \"./agent-chat.js\";\nimport { agentNativePath, appPath } from \"./api-path.js\";\nimport {\n AssistantChat,\n type AssistantChatProps,\n type AssistantChatHandle,\n} from \"./AssistantChat.js\";\nimport {\n buildChatModelGroups,\n type EngineModelGroup,\n} from \"./chat-model-groups.js\";\nimport {\n Popover,\n PopoverAnchor,\n PopoverContent,\n PopoverTrigger,\n} from \"./components/ui/popover.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"./components/ui/tooltip.js\";\nimport { isTrustedFrameMessage } from \"./frame.js\";\nimport { RunStuckBanner } from \"./RunStuckBanner.js\";\nimport { callAction } from \"./use-action.js\";\nimport {\n useChatThreads,\n type ChatThreadScope,\n type ChatThreadSummary,\n} from \"./use-chat-threads.js\";\nimport { cn } from \"./utils.js\";\n\ninterface ModelSelection {\n model: string;\n engine?: string;\n effort?: ReasoningEffort;\n}\n\ninterface PendingSend {\n message: string;\n images?: string[];\n submit: boolean;\n trackInRunsTray?: boolean;\n requestMode?: \"act\" | \"plan\";\n}\n\n/**\n * A send queued until its target thread is ready. `threadId: null` targets the\n * first thread to become active (cold start); a concrete id is a thread whose\n * chat ref hasn't mounted yet. Drained by the flush effect.\n */\ninterface PendingDelivery {\n threadId: string | null;\n send: PendingSend;\n}\n\n/** The single path that hands a queued send to a mounted chat ref. */\nfunction deliverPendingSend(ref: AssistantChatHandle, send: PendingSend): void {\n if (!send.submit) {\n ref.prefillMessage(send.message);\n return;\n }\n if (send.trackInRunsTray || send.requestMode) {\n ref.sendMessage(send.message, send.images, {\n ...(send.trackInRunsTray ? { trackInRunsTray: true } : {}),\n ...(send.requestMode ? { requestMode: send.requestMode } : {}),\n });\n } else {\n ref.sendMessage(send.message, send.images);\n }\n}\n\nconst MODEL_SELECTION_STORAGE_KEY = \"agent-native:chat-models:selection\";\n\nfunction readStoredModelSelection(key: string): ModelSelection | undefined {\n if (typeof window === \"undefined\") return undefined;\n try {\n const raw = window.localStorage.getItem(key);\n if (!raw) return undefined;\n const parsed = JSON.parse(raw) as Partial<ModelSelection>;\n if (typeof parsed.model !== \"string\" || !parsed.model.trim()) {\n return undefined;\n }\n const selection: ModelSelection = {\n model: parsed.model,\n effort: isReasoningEffort(parsed.effort) ? parsed.effort : \"auto\",\n };\n if (typeof parsed.engine === \"string\") selection.engine = parsed.engine;\n return selection;\n } catch {\n return undefined;\n }\n}\n\nfunction writeStoredModelSelection(key: string, selection: ModelSelection) {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(key, JSON.stringify(selection));\n } catch {}\n}\n\nfunction resolveModelSelection(\n selection: ModelSelection | undefined,\n groups: EngineModelGroup[],\n): ModelSelection | undefined {\n if (!selection?.model) return undefined;\n if (groups.length === 0) {\n const requestedEffort = selection.effort ?? \"auto\";\n const effortOptions = getReasoningEffortOptionsForModel(selection.model);\n return {\n model: selection.model,\n effort:\n requestedEffort === \"auto\" || effortOptions.includes(requestedEffort)\n ? requestedEffort\n : \"auto\",\n };\n }\n const preferredGroup = groups.find(\n (group) =>\n group.engine === selection.engine &&\n group.models.includes(selection.model),\n );\n const fallbackGroup = groups.find((group) =>\n group.models.includes(selection.model),\n );\n if (groups.length > 0 && !preferredGroup && !fallbackGroup) {\n return undefined;\n }\n const engine =\n preferredGroup?.engine ?? fallbackGroup?.engine ?? selection.engine;\n if (!engine && groups.length > 0) return undefined;\n\n const requestedEffort = selection.effort ?? \"auto\";\n const effortOptions = getReasoningEffortOptionsForModel(selection.model);\n const effort =\n requestedEffort === \"auto\" || effortOptions.includes(requestedEffort)\n ? requestedEffort\n : \"auto\";\n const resolved: ModelSelection = { model: selection.model, effort };\n if (engine) resolved.engine = engine;\n return resolved;\n}\n\n// ─── Skeleton Loader ─────────────────────────────────────────────────────────\n\nfunction ChatSkeleton({\n header,\n headerOnly = false,\n}: {\n header?: React.ReactNode;\n headerOnly?: boolean;\n}) {\n return (\n <div\n className={cn(\n \"flex flex-col min-h-0\",\n headerOnly ? \"shrink-0\" : \"flex-1 h-full\",\n )}\n >\n {header ?? (\n <div className=\"flex items-center px-1 py-1 border-b border-border shrink-0 gap-0.5\">\n <div className=\"h-[22px] w-20 rounded-md bg-muted animate-pulse\" />\n <div className=\"ms-auto flex gap-0.5\">\n <div className=\"h-[22px] w-[22px] rounded-md bg-muted animate-pulse\" />\n <div className=\"h-[22px] w-[22px] rounded-md bg-muted animate-pulse\" />\n </div>\n </div>\n )}\n {!headerOnly && (\n <div className=\"flex-1 flex flex-col gap-3 p-4\">\n <div className=\"flex justify-center py-8\">\n <div className=\"h-10 w-10 rounded-full bg-muted animate-pulse\" />\n </div>\n <div className=\"h-3 w-32 rounded bg-muted animate-pulse mx-auto\" />\n </div>\n )}\n </div>\n );\n}\n\n// ─── Scope Badge ─────────────────────────────────────────────────────────────\n\nfunction formatScopeType(type: string) {\n return type.replace(/[-_]+/g, \" \");\n}\n\nfunction indefiniteArticleFor(value: string) {\n return /^[aeiou]/i.test(value.trim()) ? \"an\" : \"a\";\n}\n\nfunction getScopeCopy(scope: ChatThreadScope, isCurrentScope: boolean) {\n const type = formatScopeType(scope.type);\n const fallbackObject = isCurrentScope\n ? `this ${type}`\n : `${indefiniteArticleFor(type)} ${type}`;\n const objectLabel = scope.label || fallbackObject;\n return {\n objectLabel,\n chipLabel:\n scope.label || (isCurrentScope ? `this ${type}` : `${type} context`),\n };\n}\n\n/**\n * Compact context tab above the composer. Click → popover with related chats\n * and the remove-context action. It stays attached to the chat field so scoped\n * context is visible right where the next message will be composed.\n */\nfunction ScopeBadge({\n scope,\n currentScope,\n onDetach,\n otherScopedThreads,\n activeThreadId,\n openTabIds,\n onSelectThread,\n}: {\n scope: ChatThreadScope;\n currentScope?: ChatThreadScope | null;\n onDetach: () => void;\n /** Other threads scoped to the same resource (excluding the active one),\n * pre-sorted most-recent-first. The chip popover lists these so the user\n * can hop between this resource's chats without opening the full history. */\n otherScopedThreads: ChatThreadSummary[];\n activeThreadId: string;\n openTabIds: Set<string>;\n onSelectThread: (id: string) => void;\n}) {\n const [open, setOpen] = useState(false);\n const isCurrentScope = Boolean(\n currentScope &&\n currentScope.type === scope.type &&\n currentScope.id === scope.id,\n );\n const hasDifferentCurrentScope = Boolean(currentScope && !isCurrentScope);\n const { objectLabel, chipLabel } = getScopeCopy(scope, isCurrentScope);\n const heading = `Using ${chipLabel}`;\n const detailSuffix = hasDifferentCurrentScope\n ? \"Start a new chat to use the current page.\"\n : isCurrentScope\n ? \"New chats here keep this context.\"\n : \"Start a new chat for a general conversation.\";\n const otherCount = otherScopedThreads.length;\n return (\n <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\">\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n 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\"\n aria-label={heading}\n >\n <IconLink size={11} className=\"shrink-0 opacity-70\" />\n <span className=\"min-w-0 truncate\">{heading}</span>\n {otherCount > 0 && (\n <span\n className=\"ms-0.5 shrink-0 rounded-full bg-muted px-1.5 py-px text-[10px] leading-none text-muted-foreground\"\n aria-label={`${otherCount} other chats for ${objectLabel}`}\n >\n +{otherCount}\n </span>\n )}\n </button>\n </PopoverTrigger>\n <PopoverContent align=\"center\" side=\"top\" className=\"w-72 p-0\">\n <p className=\"px-3 pt-2 pb-1.5 text-[11px] text-muted-foreground\">\n This chat can see{\" \"}\n <span className=\"text-foreground\">{objectLabel}</span>.{\" \"}\n {detailSuffix}\n </p>\n {otherCount > 0 && (\n <div className=\"border-t border-border\">\n <div className=\"px-3 pt-1.5 pb-1 text-[10px] uppercase tracking-wider text-muted-foreground/70\">\n Chats for {objectLabel}\n </div>\n <div className=\"max-h-56 overflow-y-auto pb-1\">\n {otherScopedThreads.map((thread) =>\n renderThreadRow(\n thread,\n activeThreadId,\n openTabIds,\n formatThreadTime,\n onSelectThread,\n () => setOpen(false),\n ),\n )}\n </div>\n </div>\n )}\n <div className=\"border-t border-border p-1\">\n <button\n type=\"button\"\n onClick={() => {\n setOpen(false);\n onDetach();\n }}\n className=\"flex w-full items-center gap-2 rounded px-2 py-1.5 text-xs text-foreground hover:bg-accent cursor-pointer\"\n >\n <IconLinkOff size={13} />\n <span>Remove context</span>\n </button>\n </div>\n </PopoverContent>\n </Popover>\n </div>\n );\n}\n\n/**\n * Thin confirmation banner shown briefly after detach. The chip itself\n * unmounts the moment scope clears on the active thread, so this banner\n * holds the visual feedback long enough for the user to register what\n * just happened and learn where the chat went (History popover).\n */\nfunction DetachConfirmationBanner() {\n return (\n <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\">\n <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\">\n <IconCheck size={11} className=\"shrink-0 opacity-80\" />\n <span className=\"min-w-0 truncate\">\n Context removed. Find this chat in History.\n </span>\n </span>\n </div>\n );\n}\n\n// ─── History Popover ─────────────────────────────────────────────────────────\n\nfunction formatThreadTime(ts: number): string {\n const d = new Date(ts);\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffDays = Math.floor(diffMs / 86400000);\n if (diffDays === 0)\n return d.toLocaleTimeString([], { hour: \"numeric\", minute: \"2-digit\" });\n if (diffDays === 1) return \"Yesterday\";\n if (diffDays < 7) return d.toLocaleDateString([], { weekday: \"short\" });\n return d.toLocaleDateString([], { month: \"short\", day: \"numeric\" });\n}\n\nfunction renderThreadRow(\n thread: ChatThreadSummary,\n activeThreadId: string | null,\n openTabIds: Set<string>,\n formatTime: (ts: number) => string,\n onSelect: (id: string) => void,\n onClose: () => void,\n) {\n const isActive = thread.id === activeThreadId;\n return (\n <button\n key={thread.id}\n onClick={() => {\n onSelect(thread.id);\n onClose();\n }}\n className={cn(\n \"w-full px-3 py-2 text-start hover:bg-accent/50 cursor-pointer\",\n isActive && \"bg-accent/30\",\n )}\n >\n <div className=\"flex items-baseline justify-between gap-2\">\n <span className=\"text-xs font-medium text-foreground truncate\">\n {thread.title || thread.preview || \"Chat\"}\n </span>\n <span className=\"text-[10px] text-muted-foreground shrink-0\">\n {isActive\n ? \"Active\"\n : openTabIds.has(thread.id)\n ? \"Open\"\n : formatTime(thread.updatedAt)}\n </span>\n </div>\n {thread.preview && thread.title !== thread.preview && (\n <div className=\"text-[11px] text-muted-foreground truncate mt-0.5\">\n {thread.preview}\n </div>\n )}\n {thread.scope?.label && (\n <div className=\"mt-0.5 text-[10px] text-muted-foreground/70 truncate\">\n {thread.scope.label}\n </div>\n )}\n </button>\n );\n}\n\nfunction HistoryPopover({\n threads,\n openTabIds,\n activeThreadId,\n currentScope,\n hasMoreThreads = false,\n isLoadingMoreThreads = false,\n loadError,\n onSelect,\n onClose,\n onLoadMore,\n onSearch,\n}: {\n threads: ChatThreadSummary[];\n openTabIds: Set<string>;\n activeThreadId: string | null;\n currentScope?: ChatThreadScope | null;\n hasMoreThreads?: boolean;\n isLoadingMoreThreads?: boolean;\n loadError?: string | null;\n onSelect: (id: string) => void;\n onClose: () => void;\n onLoadMore?: () => void;\n onSearch?: (query: string) => Promise<ChatThreadSummary[]>;\n}) {\n const [search, setSearch] = useState(\"\");\n const [searchResults, setSearchResults] = useState<\n ChatThreadSummary[] | null\n >(null);\n const [isSearching, setIsSearching] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const debounceRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n useEffect(() => {\n inputRef.current?.focus();\n }, []);\n\n // Debounced server-side search\n const searchIdRef = useRef(0);\n useEffect(() => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n const q = search.trim();\n if (!q) {\n searchIdRef.current++;\n setSearchResults(null);\n setIsSearching(false);\n return;\n }\n setIsSearching(true);\n const id = ++searchIdRef.current;\n debounceRef.current = setTimeout(async () => {\n if (onSearch) {\n const results = await onSearch(q);\n if (id !== searchIdRef.current) return;\n setSearchResults(results);\n } else {\n // Fallback to client-side filtering\n setSearchResults(null);\n }\n setIsSearching(false);\n }, 250);\n return () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n };\n }, [search, onSearch]);\n\n // Hide empty threads from the history list — except the currently-active\n // one. The active thread always belongs in the list so the user can see\n // they're in it (the previous filter dropped a brand-new chat the user\n // had just opened, making them think their chat had vanished).\n const visibleThreads = threads.filter(\n (t) => t.messageCount > 0 || t.id === activeThreadId,\n );\n\n const filtered = search.trim()\n ? (searchResults ?? visibleThreads).filter(\n (t) => t.messageCount > 0 || t.id === activeThreadId,\n )\n : visibleThreads;\n\n // When scope is set we split history into two sections so the user can\n // see \"this deck's chats\" first without losing access to general /\n // other-deck chats. Section labels intentionally use the current\n // resource type (deck/design/dashboard) instead of a generic phrase.\n const sectionedThreads = currentScope\n ? {\n scoped: filtered.filter(\n (t) =>\n t.scope?.type === currentScope.type &&\n t.scope?.id === currentScope.id,\n ),\n other: filtered.filter(\n (t) =>\n !t.scope ||\n t.scope.type !== currentScope.type ||\n t.scope.id !== currentScope.id,\n ),\n }\n : null;\n\n return (\n <Popover open onOpenChange={(open) => !open && onClose()}>\n <PopoverAnchor asChild>\n <span aria-hidden className=\"absolute end-2 top-0 h-px w-px\" />\n </PopoverAnchor>\n <PopoverContent\n align=\"end\"\n side=\"bottom\"\n sideOffset={0}\n onOpenAutoFocus={(event) => {\n event.preventDefault();\n inputRef.current?.focus();\n }}\n className=\"w-72 rounded-lg p-0\"\n >\n <div className=\"flex items-center gap-2 px-3 py-2 border-b border-border\">\n <IconSearch size={13} />\n <input\n ref={inputRef}\n type=\"text\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Search chats...\"\n className=\"flex-1 bg-transparent text-xs text-foreground placeholder:text-muted-foreground outline-none\"\n />\n </div>\n <div className=\"max-h-64 overflow-y-auto py-1\">\n {loadError && !search.trim() ? (\n <div className=\"px-3 py-4 text-xs text-amber-500 text-center\">\n {loadError}\n </div>\n ) : isSearching ? (\n <div className=\"px-3 py-4 text-xs text-muted-foreground text-center\">\n Searching...\n </div>\n ) : filtered.length === 0 ? (\n <div className=\"px-3 py-4 text-xs text-muted-foreground text-center\">\n {search ? \"No matching chats\" : \"No chats yet\"}\n </div>\n ) : sectionedThreads ? (\n <>\n {sectionedThreads.scoped.length > 0 && (\n <>\n <div className=\"px-3 pt-1.5 pb-1 text-[10px] uppercase tracking-wider text-muted-foreground/70\">\n This {currentScope!.type}\n </div>\n {sectionedThreads.scoped.map((thread) =>\n renderThreadRow(\n thread,\n activeThreadId,\n openTabIds,\n formatThreadTime,\n onSelect,\n onClose,\n ),\n )}\n </>\n )}\n {sectionedThreads.other.length > 0 && (\n <>\n <div className=\"px-3 pt-2 pb-1 text-[10px] uppercase tracking-wider text-muted-foreground/70\">\n All chats\n </div>\n {sectionedThreads.other.map((thread) =>\n renderThreadRow(\n thread,\n activeThreadId,\n openTabIds,\n formatThreadTime,\n onSelect,\n onClose,\n ),\n )}\n </>\n )}\n </>\n ) : (\n filtered.map((thread) =>\n renderThreadRow(\n thread,\n activeThreadId,\n openTabIds,\n formatThreadTime,\n onSelect,\n onClose,\n ),\n )\n )}\n {!search.trim() && hasMoreThreads && (\n <button\n type=\"button\"\n onClick={() => onLoadMore?.()}\n disabled={isLoadingMoreThreads}\n className=\"mx-1 mt-1 flex w-[calc(100%-0.5rem)] items-center justify-center rounded-md px-3 py-2 text-xs text-muted-foreground hover:bg-accent hover:text-foreground disabled:cursor-default disabled:opacity-60\"\n >\n {isLoadingMoreThreads ? \"Loading...\" : \"Load older chats\"}\n </button>\n )}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\n// ─── Help Popover ────────────────────────────────────────────────────────────\n\nfunction HelpPopover({ onClose }: { onClose: () => void }) {\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [onClose]);\n\n const commands = [\n {\n name: \"/clear\",\n description: \"Start a new chat (keeps current chat in history)\",\n },\n { name: \"/new\", description: \"Same as /clear\" },\n { name: \"/history\", description: \"Browse all chats\" },\n { name: \"/plan\", description: \"Switch to read-only planning\" },\n { name: \"/act\", description: \"Switch back to acting\" },\n { name: \"/help\", description: \"Show this list of commands\" },\n { name: \"@\", description: \"Mention files, agents, or resources\" },\n ];\n\n return (\n <>\n <div className=\"fixed inset-0 z-40\" onClick={onClose} />\n <div className=\"absolute end-2 top-0 z-50 w-72 rounded-lg border border-border bg-popover shadow-lg\">\n <div className=\"flex items-center justify-between px-3 py-2 border-b border-border\">\n <span className=\"text-xs font-medium text-foreground\">\n Available Commands\n </span>\n <button\n onClick={onClose}\n aria-label=\"Close help\"\n className=\"flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground\"\n >\n <IconX size={12} />\n </button>\n </div>\n <div className=\"py-1\">\n {commands.map((cmd) => (\n <div key={cmd.name} className=\"px-3 py-1.5\">\n <div className=\"text-xs font-medium text-foreground\">\n {cmd.name}\n </div>\n <div className=\"text-[11px] text-muted-foreground\">\n {cmd.description}\n </div>\n </div>\n ))}\n </div>\n </div>\n </>\n );\n}\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport interface ChatTab {\n id: string;\n label: string;\n status: \"idle\" | \"running\" | \"completed\";\n /** If this tab is a sub-agent, the parent thread ID */\n parentThreadId?: string;\n /** Short name for sub-agent tabs (e.g. \"Research\", \"Draft email\") */\n subAgentName?: string;\n}\n\ntype AgentTeamRunStatus =\n | \"queued\"\n | \"running\"\n | \"paused\"\n | \"needs-approval\"\n | \"completed\"\n | \"errored\"\n | \"unknown\";\n\ninterface AgentTeamRunSummary {\n title?: string;\n status?: AgentTeamRunStatus;\n sourceRecord?: {\n type?: string;\n threadId?: unknown;\n parentThreadId?: unknown;\n name?: unknown;\n };\n metadata?: Record<string, unknown>;\n}\n\ninterface AgentTeamTabInfo {\n threadId: string;\n parentThreadId: string;\n name: string;\n status: AgentTeamRunStatus;\n}\n\nfunction readString(value: unknown): string {\n return typeof value === \"string\" ? value.trim() : \"\";\n}\n\nfunction requestModeFromExecMode(\n value: AssistantChatProps[\"execMode\"],\n): \"act\" | \"plan\" | undefined {\n if (value === \"plan\") return \"plan\";\n if (value === \"build\") return \"act\";\n return undefined;\n}\n\nfunction isActiveAgentTeamStatus(status?: AgentTeamRunStatus): boolean {\n return (\n status === \"queued\" ||\n status === \"running\" ||\n status === \"paused\" ||\n status === \"needs-approval\"\n );\n}\n\nfunction chatTabStatusFromAgentTeamStatus(\n status?: AgentTeamRunStatus,\n): ChatTab[\"status\"] | undefined {\n if (!status) return undefined;\n return isActiveAgentTeamStatus(status) ? \"running\" : \"completed\";\n}\n\nconst STALE_THREAD_THRESHOLD_MS = 12 * 60 * 60 * 1000;\nconst DEFAULT_THREAD_URL_PARAM = \"thread\";\nconst THREAD_URL_CHANGED_EVENT = \"agent-chat:url-thread-changed\";\nconst hasOwn = Object.prototype.hasOwnProperty;\n\n// The history patch is installed once and shared via a ref count so that\n// multiple synced chats (or a remount) don't restore a stale `pushState`\n// reference and silently drop a wrapper installed by another instance.\nlet historyPatchRefCount = 0;\nlet restoreHistoryPatch: (() => void) | null = null;\n\nfunction installHistoryThreadUrlPatch(): () => void {\n if (typeof window === \"undefined\") return () => {};\n historyPatchRefCount += 1;\n if (historyPatchRefCount === 1) {\n const originalPushState = window.history.pushState;\n const originalReplaceState = window.history.replaceState;\n const dispatchUrlChange = () => {\n window.dispatchEvent(new Event(THREAD_URL_CHANGED_EVENT));\n };\n window.history.pushState = function pushState(...args) {\n const result = originalPushState.apply(this, args);\n dispatchUrlChange();\n return result;\n };\n window.history.replaceState = function replaceState(...args) {\n const result = originalReplaceState.apply(this, args);\n dispatchUrlChange();\n return result;\n };\n restoreHistoryPatch = () => {\n window.history.pushState = originalPushState;\n window.history.replaceState = originalReplaceState;\n };\n }\n return () => {\n historyPatchRefCount = Math.max(0, historyPatchRefCount - 1);\n if (historyPatchRefCount === 0) {\n restoreHistoryPatch?.();\n restoreHistoryPatch = null;\n }\n };\n}\n\nexport interface ChatThreadUrlSyncOptions {\n /** Query-string parameter used by the generic URL adapter. Default: `thread`. */\n paramName?: string;\n /**\n * Route-owned thread id. Pass `null` for the create route and a string for\n * thread routes like `/chat/:threadId`.\n */\n routeThreadId?: string | null;\n /** Build the URL path for a thread id, or for create mode when id is null. */\n getPath?: (threadId: string | null) => string;\n /** Optional router navigation callback used with `getPath`. */\n navigate?: (path: string, options?: { replace?: boolean }) => void;\n}\n\nfunction normalizeUrlThreadId(value: string | null | undefined): string | null {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n return trimmed || null;\n}\n\nfunction resolveThreadUrlSync(\n value: MultiTabAssistantChatProps[\"threadUrlSync\"],\n): {\n enabled: boolean;\n paramName: string;\n routeThreadId?: string | null;\n getPath?: (threadId: string | null) => string;\n navigate?: (path: string, options?: { replace?: boolean }) => void;\n} {\n if (!value) return { enabled: false, paramName: DEFAULT_THREAD_URL_PARAM };\n if (value === true) {\n return { enabled: true, paramName: DEFAULT_THREAD_URL_PARAM };\n }\n return {\n enabled: true,\n paramName: value.paramName?.trim() || DEFAULT_THREAD_URL_PARAM,\n ...(hasOwn.call(value, \"routeThreadId\")\n ? { routeThreadId: normalizeUrlThreadId(value.routeThreadId) }\n : {}),\n ...(value.getPath ? { getPath: value.getPath } : {}),\n ...(value.navigate ? { navigate: value.navigate } : {}),\n };\n}\n\nfunction readUrlThreadId(paramName: string): string | null {\n if (typeof window === \"undefined\") return null;\n try {\n const params = new URLSearchParams(window.location.search);\n return normalizeUrlThreadId(\n params.get(paramName) ??\n (paramName === DEFAULT_THREAD_URL_PARAM\n ? params.get(\"threadId\")\n : null),\n );\n } catch {\n return null;\n }\n}\n\nfunction runToAgentTeamTabInfo(\n run: AgentTeamRunSummary,\n): AgentTeamTabInfo | null {\n if (run.sourceRecord?.type && run.sourceRecord.type !== \"agent-team-task\") {\n return null;\n }\n const metadata = run.metadata ?? {};\n const threadId =\n readString(run.sourceRecord?.threadId) || readString(metadata.threadId);\n const parentThreadId =\n readString(run.sourceRecord?.parentThreadId) ||\n readString(metadata.parentThreadId);\n if (!threadId || !parentThreadId || threadId === parentThreadId) return null;\n const name =\n readString(run.sourceRecord?.name) ||\n readString(metadata.name) ||\n readString(run.title) ||\n \"Sub-agent\";\n return {\n threadId,\n parentThreadId,\n name,\n status: run.status ?? \"unknown\",\n };\n}\n\nexport interface MultiTabAssistantChatHeaderProps {\n tabs: ChatTab[];\n activeTabId: string;\n activeTabMessageCount: number;\n setActiveTabId: (tabId: string) => void;\n addTab: () => void;\n closeTab: (tabId: string) => void;\n closeOtherTabs: (tabId: string) => void;\n closeAllTabs: () => void;\n clearActiveTab: () => void;\n /** Open the history popover */\n showHistory?: boolean;\n toggleHistory?: () => void;\n /** Number of open tabs (useful for triggering scroll on tab count change) */\n tabCount: number;\n}\n\n// ─── Component ──────────────────────────────────────────────────────────────\n\nexport type MultiTabAssistantChatProps = Omit<\n AssistantChatProps,\n \"tabId\" | \"threadId\"\n> & {\n /** Show the tab bar. Default: true */\n showTabBar?: boolean;\n /** Optional custom single-row header renderer */\n renderHeader?: (props: MultiTabAssistantChatHeaderProps) => React.ReactNode;\n /** Optional overlay actions renderer for the active tab */\n renderOverlay?: (props: MultiTabAssistantChatHeaderProps) => React.ReactNode;\n /** Hide the chat content while keeping the header visible. Used when CLI/resources mode is active. */\n contentHidden?: boolean;\n /** Namespace for localStorage keys — used to isolate chat state per app in the frame. */\n storageKey?: string;\n /** Restore the previously active thread and open tabs from localStorage. */\n restoreActiveThread?: boolean;\n /** Stable browser tab id used for tab-scoped app-state context. */\n browserTabId?: string;\n /**\n * Keep the active thread in URL state. `true` uses the generic `?thread=id`\n * adapter; passing `routeThreadId` + `getPath` lets an app bind chats to\n * route params such as `/chat/:threadId`.\n */\n threadUrlSync?: boolean | ChatThreadUrlSyncOptions;\n /**\n * Bind new chats to a resource (deck, design, dashboard, etc.). When set,\n * new chats automatically inherit this scope and scoped chats tuck away when\n * the user leaves the resource. General chats remain visible across resource\n * navigation, and the user can detach a scoped chat via the scope chip above\n * the composer.\n */\n scope?: ChatThreadScope | null;\n /** Show the compact scope chip above the composer. Default: true. */\n showScopeBadge?: boolean;\n};\n\nexport function MultiTabAssistantChat({\n showTabBar = true,\n renderHeader,\n renderOverlay,\n contentHidden = false,\n apiUrl = agentNativePath(\"/_agent-native/agent-chat\"),\n storageKey,\n restoreActiveThread = true,\n browserTabId,\n threadUrlSync = false,\n scope = null,\n showScopeBadge = true,\n ...props\n}: MultiTabAssistantChatProps) {\n const {\n enabled: threadUrlSyncEnabled,\n paramName: threadUrlParamName,\n routeThreadId,\n getPath: getThreadPath,\n navigate: navigateThreadUrl,\n } = resolveThreadUrlSync(threadUrlSync);\n const threadRouteControlsActiveThread =\n threadUrlSyncEnabled &&\n threadUrlSync !== true &&\n typeof threadUrlSync === \"object\" &&\n hasOwn.call(threadUrlSync, \"routeThreadId\");\n const [urlThreadId, setUrlThreadId] = useState<string | null>(() =>\n threadUrlSyncEnabled\n ? threadRouteControlsActiveThread\n ? (routeThreadId ?? null)\n : readUrlThreadId(threadUrlParamName)\n : null,\n );\n const urlThreadIdRef = useRef(urlThreadId);\n urlThreadIdRef.current = urlThreadId;\n\n useEffect(() => {\n if (!threadUrlSyncEnabled || threadRouteControlsActiveThread) return;\n const update = () => setUrlThreadId(readUrlThreadId(threadUrlParamName));\n const uninstallHistoryPatch = installHistoryThreadUrlPatch();\n update();\n window.addEventListener(\"popstate\", update);\n window.addEventListener(THREAD_URL_CHANGED_EVENT, update);\n return () => {\n uninstallHistoryPatch();\n window.removeEventListener(\"popstate\", update);\n window.removeEventListener(THREAD_URL_CHANGED_EVENT, update);\n };\n }, [\n threadRouteControlsActiveThread,\n threadUrlParamName,\n threadUrlSyncEnabled,\n ]);\n\n useEffect(() => {\n if (!threadUrlSyncEnabled || !threadRouteControlsActiveThread) return;\n setUrlThreadId(routeThreadId ?? null);\n }, [routeThreadId, threadRouteControlsActiveThread, threadUrlSyncEnabled]);\n\n const writeThreadUrl = useCallback(\n (threadId: string | null, options: { replace?: boolean } = {}): void => {\n if (!threadUrlSyncEnabled || typeof window === \"undefined\") return;\n try {\n const normalizedThreadId = normalizeUrlThreadId(threadId);\n let next: string;\n if (getThreadPath) {\n next = getThreadPath(normalizedThreadId);\n } else {\n const url = new URL(window.location.href);\n if (normalizedThreadId) {\n url.searchParams.set(threadUrlParamName, normalizedThreadId);\n } else {\n url.searchParams.delete(threadUrlParamName);\n }\n if (threadUrlParamName !== \"threadId\") {\n url.searchParams.delete(\"threadId\");\n }\n next = `${url.pathname}${url.search}${url.hash}`;\n }\n const current = `${window.location.pathname}${window.location.search}${window.location.hash}`;\n if (next === current) {\n setUrlThreadId(normalizedThreadId);\n return;\n }\n if (getThreadPath && navigateThreadUrl) {\n navigateThreadUrl(next, { replace: options.replace === true });\n setUrlThreadId(normalizedThreadId);\n return;\n }\n const method = options.replace ? \"replaceState\" : \"pushState\";\n // `getThreadPath` returns a router-local path (no app basename). When we\n // fall back to the raw History API instead of a router navigate, resolve\n // the basename so deep-link reloads work in mounted apps.\n const historyTarget = getThreadPath ? appPath(next) : next;\n window.history[method](window.history.state, \"\", historyTarget);\n setUrlThreadId(normalizedThreadId);\n window.dispatchEvent(new Event(THREAD_URL_CHANGED_EVENT));\n const popstate =\n typeof PopStateEvent === \"function\"\n ? new PopStateEvent(\"popstate\", { state: window.history.state })\n : new Event(\"popstate\");\n window.dispatchEvent(popstate);\n } catch {}\n },\n [\n getThreadPath,\n navigateThreadUrl,\n threadUrlParamName,\n threadUrlSyncEnabled,\n ],\n );\n\n const {\n threads,\n activeThreadId,\n isLoading,\n createThread,\n switchThread: switchThreadState,\n detachThread,\n forkThread,\n saveThreadData,\n generateTitle,\n searchThreads,\n loadMoreThreads,\n refreshThreads,\n hasMoreThreads,\n isLoadingMoreThreads,\n threadsLoadError,\n isNewThread,\n } = useChatThreads(apiUrl, storageKey, scope, {\n restoreActiveThread,\n routeThreadId: threadUrlSyncEnabled ? urlThreadId : undefined,\n });\n\n const switchThread = useCallback(\n (threadId: string, options: { replace?: boolean } = {}) => {\n switchThreadState(threadId);\n writeThreadUrl(threadId, options);\n },\n [switchThreadState, writeThreadUrl],\n );\n\n // Namespace all localStorage keys by storageKey when provided (for per-app isolation in frame)\n const keyPrefix = storageKey ? `:${storageKey}` : \"\";\n const modelSelectionKey = `${MODEL_SELECTION_STORAGE_KEY}${keyPrefix}`;\n\n // Track which tabs have been focused at least once (lazy mount for sub-agent tabs)\n const mountedTabsRef = useRef<Set<string>>(new Set());\n const activeThreadIdRef = useRef(activeThreadId);\n activeThreadIdRef.current = activeThreadId;\n // Mark the active tab as mounted so it persists when switched away\n if (activeThreadId) mountedTabsRef.current.add(activeThreadId);\n const chatRefs = useRef<Map<string, AssistantChatHandle>>(new Map());\n // Sends queued until their target thread is ready (see PendingDelivery).\n const pendingDeliveries = useRef<PendingDelivery[]>([]);\n const pendingContextItems = useRef<Map<string, AgentChatContextItem[]>>(\n new Map(),\n );\n const [runningThreads, setRunningThreads] = useState<Set<string>>(new Set());\n const [showHistory, setShowHistory] = useState(false);\n const newThreadIds = useRef<Set<string>>(new Set());\n\n // ─── Model state ─────────────────────────────────────────────────────────\n const [availableModels, setAvailableModels] = useState<EngineModelGroup[]>(\n [],\n );\n const [defaultModel, setDefaultModel] = useState<string>(DEFAULT_MODEL);\n const threadModelRef = useRef<\n Map<string, { model: string; engine?: string; effort?: ReasoningEffort }>\n >(new Map());\n const [persistedModelSelection, setPersistedModelSelection] = useState<\n ModelSelection | undefined\n >(() => readStoredModelSelection(modelSelectionKey));\n const [modelSelectionVersion, setModelSelectionVersion] = useState(0);\n\n useEffect(() => {\n setPersistedModelSelection(readStoredModelSelection(modelSelectionKey));\n }, [modelSelectionKey]);\n\n const bumpModelSelectionVersion = useCallback(() => {\n setModelSelectionVersion((version) => version + 1);\n }, []);\n const postMessageSubmissionsDisabled = props.composerDisabled === true;\n\n const setContextInTab = useCallback(\n (\n threadId: string,\n item: AgentChatContextItem,\n options?: { focus?: boolean },\n ) => {\n const ref = chatRefs.current.get(threadId);\n if (ref) {\n ref.setComposerContextItem(item, options);\n return;\n }\n const existing = pendingContextItems.current.get(threadId) ?? [];\n const index = existing.findIndex((current) => current.key === item.key);\n const next =\n index === -1\n ? [...existing, item]\n : existing.map((current, currentIndex) =>\n currentIndex === index ? item : current,\n );\n pendingContextItems.current.set(threadId, next);\n },\n [],\n );\n\n const removeContextInTab = useCallback((threadId: string, key: string) => {\n const ref = chatRefs.current.get(threadId);\n if (ref) {\n ref.removeComposerContextItem(key);\n return;\n }\n const existing = pendingContextItems.current.get(threadId);\n if (!existing) return;\n const next = existing.filter((item) => item.key !== key);\n if (next.length === 0) {\n pendingContextItems.current.delete(threadId);\n } else {\n pendingContextItems.current.set(threadId, next);\n }\n }, []);\n\n const clearContextInTab = useCallback((threadId: string) => {\n const ref = chatRefs.current.get(threadId);\n if (ref) {\n ref.clearComposerContextItems();\n return;\n }\n pendingContextItems.current.delete(threadId);\n }, []);\n\n const resolveThreadModelSelection = useCallback(\n (threadId: string) =>\n resolveModelSelection(\n threadModelRef.current.get(threadId) ?? persistedModelSelection,\n availableModels,\n ),\n [availableModels, persistedModelSelection, modelSelectionVersion],\n );\n\n const persistModelSelection = useCallback(\n (selection: ModelSelection) => {\n setPersistedModelSelection(selection);\n writeStoredModelSelection(modelSelectionKey, selection);\n },\n [modelSelectionKey],\n );\n\n const handleModelChange = useCallback(\n (model: string, engine: string) => {\n const threadId = activeThreadIdRef.current;\n if (!threadId) return;\n const existing = threadModelRef.current.get(threadId);\n const existingEffort = existing?.effort ?? \"auto\";\n const effortOptions = getReasoningEffortOptionsForModel(model);\n const effort =\n existingEffort === \"auto\" || effortOptions.includes(existingEffort)\n ? existingEffort\n : \"auto\";\n const selection = { model, engine, effort };\n threadModelRef.current.set(threadId, selection);\n persistModelSelection(selection);\n bumpModelSelectionVersion();\n },\n [bumpModelSelectionVersion, persistModelSelection],\n );\n\n const handleEffortChange = useCallback(\n (effort: ReasoningEffort) => {\n const threadId = activeThreadIdRef.current;\n if (!threadId) return;\n const existing = resolveThreadModelSelection(threadId);\n const model = existing?.model ?? defaultModel;\n const engine =\n existing?.engine ??\n availableModels.find((group) => group.models.includes(model))?.engine ??\n availableModels[0]?.engine;\n const selection: ModelSelection = { model, effort };\n if (engine) selection.engine = engine;\n threadModelRef.current.set(threadId, selection);\n persistModelSelection(selection);\n bumpModelSelectionVersion();\n },\n [\n availableModels,\n bumpModelSelectionVersion,\n defaultModel,\n persistModelSelection,\n resolveThreadModelSelection,\n ],\n );\n\n const refreshEngines = useCallback(() => {\n Promise.all([\n callAction(\"manage-agent-engine\" as any, { action: \"list\" } as any).catch(\n () => null,\n ),\n fetch(agentNativePath(\"/_agent-native/env-status\"))\n .then((r) => (r.ok ? r.json() : []))\n .catch(() => []),\n fetch(agentNativePath(\"/_agent-native/builder/status\"))\n .then((r) => (r.ok ? r.json() : null))\n .catch(() => null),\n ])\n .then(([enginesData, envKeys, builderStatus]) => {\n if (!enginesData?.engines) return;\n const configuredKeys = new Set(\n (envKeys as Array<{ key: string; configured: boolean }>)\n .filter((k) => k.configured)\n .map((k) => k.key),\n );\n const builderConnected = builderStatus?.configured === true;\n const currentEngineName: string | undefined =\n enginesData.current?.engine;\n const currentModel: string | undefined = enginesData.current?.model;\n\n const groups = buildChatModelGroups({\n engines: enginesData.engines,\n configuredKeys,\n builderConnected,\n currentEngineName,\n currentModel,\n });\n setAvailableModels(groups);\n setDefaultModel(currentModel ?? DEFAULT_MODEL);\n })\n .catch(() => {});\n }, []);\n\n useEffect(() => {\n refreshEngines();\n window.addEventListener(\"agent-engine:configured-changed\", refreshEngines);\n return () =>\n window.removeEventListener(\n \"agent-engine:configured-changed\",\n refreshEngines,\n );\n }, [refreshEngines]);\n\n // Parent-child thread mapping — persisted to localStorage.\n // Maps childThreadId → parentThreadId for sub-agent tabs.\n const PARENT_MAP_KEY = `agent-chat-parent-map${keyPrefix}`;\n const [parentMap, setParentMap] = useState<Record<string, string>>(() => {\n try {\n const saved = localStorage.getItem(PARENT_MAP_KEY);\n if (saved) return JSON.parse(saved);\n } catch {}\n return {};\n });\n const parentMapRef = useRef(parentMap);\n parentMapRef.current = parentMap;\n const dismissedSubAgentTabsRef = useRef<Set<string>>(new Set());\n\n // Persist parent map to localStorage\n useEffect(() => {\n try {\n localStorage.setItem(PARENT_MAP_KEY, JSON.stringify(parentMap));\n } catch {}\n }, [parentMap, PARENT_MAP_KEY]);\n\n // Sub-agent display names — persisted to localStorage.\n // Maps childThreadId → short name (e.g. \"Research\", \"Draft email\").\n const SUB_AGENT_NAMES_KEY = `agent-chat-sub-agent-names${keyPrefix}`;\n const [subAgentNames, setSubAgentNames] = useState<Record<string, string>>(\n () => {\n try {\n const saved = localStorage.getItem(SUB_AGENT_NAMES_KEY);\n if (saved) return JSON.parse(saved);\n } catch {}\n return {};\n },\n );\n const subAgentNamesRef = useRef(subAgentNames);\n subAgentNamesRef.current = subAgentNames;\n const [subAgentStatuses, setSubAgentStatuses] = useState<\n Record<string, AgentTeamRunStatus>\n >({});\n\n useEffect(() => {\n try {\n localStorage.setItem(SUB_AGENT_NAMES_KEY, JSON.stringify(subAgentNames));\n } catch {}\n }, [subAgentNames, SUB_AGENT_NAMES_KEY]);\n\n // Open tabs — persisted to localStorage so they survive refresh.\n // Per-scope: when scope changes (e.g. user navigates from Deck A to Deck\n // B), the tab bar reflects whichever tabs they had open for *that*\n // resource. We do not bleed deck A's tabs into deck B's view.\n const scopeKeyPart = scope ? `:scope:${scope.type}:${scope.id}` : \"\";\n const OPEN_TABS_KEY = `agent-chat-open-tabs${keyPrefix}${scopeKeyPart}`;\n const [openTabIds, setOpenTabIds] = useState<string[]>(() => {\n if (!restoreActiveThread && activeThreadId) {\n for (const id of [activeThreadId]) mountedTabsRef.current.add(id);\n return [activeThreadId];\n }\n try {\n const saved = localStorage.getItem(OPEN_TABS_KEY);\n if (saved) {\n const parsed = JSON.parse(saved);\n if (Array.isArray(parsed) && parsed.length > 0) {\n // Mark restored tabs as mounted\n for (const id of parsed) mountedTabsRef.current.add(id);\n return parsed;\n }\n }\n } catch {}\n return [];\n });\n const openTabIdsRef = useRef(openTabIds);\n openTabIdsRef.current = openTabIds;\n const initializedRef = useRef(false);\n\n // Rehydrate open tabs when the scope flips. Mirrors `persistedKeyRef` in\n // `useChatThreads`: on a scope change we need to read the new key BEFORE\n // the persistence effect writes the current (now-wrong) tab list under\n // that new key.\n const openTabsKeyRef = useRef(OPEN_TABS_KEY);\n useEffect(() => {\n if (openTabsKeyRef.current === OPEN_TABS_KEY) return;\n openTabsKeyRef.current = OPEN_TABS_KEY;\n initializedRef.current = false;\n if (!restoreActiveThread) {\n setOpenTabIds(activeThreadId ? [activeThreadId] : []);\n return;\n }\n try {\n const saved = localStorage.getItem(OPEN_TABS_KEY);\n if (saved) {\n const parsed = JSON.parse(saved);\n if (Array.isArray(parsed)) {\n for (const id of parsed) mountedTabsRef.current.add(id);\n setOpenTabIds(parsed);\n return;\n }\n }\n } catch {}\n setOpenTabIds([]);\n }, [OPEN_TABS_KEY, activeThreadId, restoreActiveThread]);\n\n // Look up the active thread's actual scope from the list — when the\n // user opens a chat from history that was scoped to a different\n // resource, the badge should advertise that thread's binding, not\n // necessarily the resource currently in the viewport. When the thread\n // and the live prop refer to the same resource, prefer the prop's\n // label so a rename or a deferred deck-title load shows up in the UI\n // without waiting on the next persistence cycle.\n const activeThreadScope = useMemo<ChatThreadScope | null>(() => {\n if (!activeThreadId) return null;\n const t = threads.find((x) => x.id === activeThreadId);\n const stored = t?.scope ?? null;\n if (!stored) return null;\n if (scope && stored.type === scope.type && stored.id === scope.id) {\n return { ...stored, label: scope.label || stored.label };\n }\n return stored;\n }, [threads, activeThreadId, scope?.type, scope?.id, scope?.label]);\n\n // Brief confirmation banner shown after detach. The chip itself disappears\n // the instant scope clears, which the user described as \"nothing different\n // happened.\" We hold the confirmation in the same slot for ~2s so the\n // detach is visually acknowledged and the user is pointed at History.\n const [detachConfirmType, setDetachConfirmType] = useState<string | null>(\n null,\n );\n const detachTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n useEffect(() => {\n return () => {\n if (detachTimerRef.current) clearTimeout(detachTimerRef.current);\n };\n }, []);\n const handleDetachActiveThread = useCallback(() => {\n if (!activeThreadId || !activeThreadScope) return;\n const type = activeThreadScope.type;\n setDetachConfirmType(type);\n if (detachTimerRef.current) clearTimeout(detachTimerRef.current);\n detachTimerRef.current = setTimeout(() => setDetachConfirmType(null), 2200);\n detachThread(activeThreadId);\n }, [activeThreadId, activeThreadScope, detachThread]);\n\n // Other chats scoped to the active thread's resource (excluding the active\n // thread itself). Sorted most-recent-first to match user expectation in the\n // chip popover and empty-state addon.\n const otherScopedThreads = useMemo<ChatThreadSummary[]>(() => {\n if (!activeThreadScope) return [];\n return threads\n .filter(\n (t) =>\n t.id !== activeThreadId &&\n t.scope?.type === activeThreadScope.type &&\n t.scope?.id === activeThreadScope.id,\n )\n .sort((a, b) => b.updatedAt - a.updatedAt);\n }, [threads, activeThreadId, activeThreadScope]);\n\n // Persist open tab IDs to localStorage (exclude sub-agent tabs — they're session-only)\n useEffect(() => {\n if (openTabsKeyRef.current !== OPEN_TABS_KEY) return;\n const mainTabs = openTabIds.filter((id) => !parentMap[id]);\n if (mainTabs.length > 0) {\n try {\n localStorage.setItem(OPEN_TABS_KEY, JSON.stringify(mainTabs));\n } catch {}\n }\n }, [openTabIds, parentMap, OPEN_TABS_KEY]);\n\n // Initialize open tabs once threads load — validate saved tabs still exist\n useEffect(() => {\n if (initializedRef.current || !activeThreadId || threads.length === 0)\n return;\n initializedRef.current = true;\n const threadIds = new Set(threads.map((t) => t.id));\n const threadMap = new Map(threads.map((t) => [t.id, t]));\n\n // Hide tabs that have had no activity for more than 12 hours. Stale tabs\n // are removed from the sidebar on load but remain accessible via history.\n const now = Date.now();\n const isStale = (id: string) => {\n const thread = threadMap.get(id);\n return thread\n ? now - thread.updatedAt > STALE_THREAD_THRESHOLD_MS\n : false;\n };\n\n // If the active thread is a sub-agent, switch to its parent or the most recent main thread\n if (parentMap[activeThreadId]) {\n const parent = parentMap[activeThreadId];\n if (parent && threadIds.has(parent)) {\n switchThread(parent);\n } else {\n // Fall back to most recent main thread\n const mainThread = threads.find((t) => !parentMap[t.id]);\n if (mainThread) switchThread(mainThread.id);\n }\n }\n\n setOpenTabIds((prev) => {\n // Filter out tabs that no longer exist, sub-agent tabs, or stale tabs (>12h inactive)\n const valid = prev.filter(\n (id) => threadIds.has(id) && !parentMap[id] && !isStale(id),\n );\n // Ensure active thread is included (only if it's not a sub-agent and not stale)\n if (\n !parentMap[activeThreadId] &&\n !valid.includes(activeThreadId) &&\n !isStale(activeThreadId)\n ) {\n valid.push(activeThreadId);\n }\n return valid;\n });\n\n // If active thread is stale, start fresh\n if (!parentMap[activeThreadId] && isStale(activeThreadId)) {\n createThread().then((id) => {\n if (id) writeThreadUrl(null);\n });\n }\n }, [\n activeThreadId,\n threads,\n parentMap,\n switchThread,\n createThread,\n writeThreadUrl,\n ]);\n\n // Ensure active thread is always in open tabs.\n // Use functional update to check inside the setter — avoids race with the\n // initialization effect that may have already added the ID in the same batch.\n //\n // Scoped navigation can reset openTabIds from a different localStorage key\n // without changing activeThreadId. Re-check after tab-list resets so the\n // sidebar cannot end up with a live active thread but no mounted chat.\n useEffect(() => {\n if (!activeThreadId || openTabIds.includes(activeThreadId)) return;\n if (parentMap[activeThreadId]) return;\n\n const activeThread = threads.find((thread) => thread.id === activeThreadId);\n if (\n activeThread &&\n Date.now() - activeThread.updatedAt > STALE_THREAD_THRESHOLD_MS\n ) {\n return;\n }\n\n setOpenTabIds((prev) =>\n prev.includes(activeThreadId) ? prev : [...prev, activeThreadId],\n );\n }, [activeThreadId, openTabIds, parentMap, threads]);\n\n // Ensure at least one tab is always open — auto-create if sidebar is empty.\n // Skipped when an active thread already exists (e.g. the hook generated an\n // optimistic id for a brand-new session); the activeThreadId effect above\n // adds it to openTabIds without spinning up a duplicate thread.\n const autoCreatingRef = useRef(false);\n useEffect(() => {\n if (isLoading || autoCreatingRef.current) return;\n if (openTabIds.length === 0 && !activeThreadId) {\n autoCreatingRef.current = true;\n createThread().then((id) => {\n autoCreatingRef.current = false;\n if (id) {\n newThreadIds.current.add(id);\n setOpenTabIds([id]);\n writeThreadUrl(null, { replace: true });\n }\n });\n }\n }, [isLoading, openTabIds, activeThreadId, createThread, writeThreadUrl]);\n\n useEffect(() => {\n let stopped = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n const runsUrl = `${apiUrl.replace(/\\/$/, \"\")}/runs/list?goalId=agent-team`;\n\n async function hydrateAgentTeamTabs() {\n try {\n const res = await fetch(runsUrl);\n if (res.ok) {\n const data = (await res.json()) as { runs?: AgentTeamRunSummary[] };\n const infos = Array.isArray(data.runs)\n ? data.runs\n .map(runToAgentTeamTabInfo)\n .filter((info): info is AgentTeamTabInfo => Boolean(info))\n : [];\n\n setSubAgentStatuses((prev) => {\n let changed = false;\n const next: Record<string, AgentTeamRunStatus> = {};\n for (const info of infos) {\n next[info.threadId] = info.status;\n if (prev[info.threadId] !== info.status) changed = true;\n }\n if (Object.keys(prev).length !== Object.keys(next).length) {\n changed = true;\n }\n return changed ? next : prev;\n });\n\n const openSet = new Set(openTabIdsRef.current);\n const candidates = infos.filter(\n (info) =>\n !dismissedSubAgentTabsRef.current.has(info.threadId) &&\n (openSet.has(info.parentThreadId) || openSet.has(info.threadId)),\n );\n\n if (candidates.length > 0) {\n const shouldRefreshThreads = candidates.some(\n (info) =>\n !openSet.has(info.threadId) && openSet.has(info.parentThreadId),\n );\n const candidateParents = new Map(\n candidates.map((info) => [info.threadId, info.parentThreadId]),\n );\n setParentMap((prev) => {\n let next = prev;\n for (const info of candidates) {\n if (next[info.threadId] === info.parentThreadId) continue;\n next =\n next === prev\n ? { ...prev, [info.threadId]: info.parentThreadId }\n : { ...next, [info.threadId]: info.parentThreadId };\n }\n return next;\n });\n setSubAgentNames((prev) => {\n let next = prev;\n for (const info of candidates) {\n if (!info.name || next[info.threadId] === info.name) continue;\n next =\n next === prev\n ? { ...prev, [info.threadId]: info.name }\n : { ...next, [info.threadId]: info.name };\n }\n return next;\n });\n\n setOpenTabIds((prev) => {\n let next = prev;\n for (const info of candidates) {\n if (next.includes(info.threadId)) continue;\n const parentIdx = next.indexOf(info.parentThreadId);\n if (parentIdx === -1) continue;\n if (next === prev) next = [...prev];\n let insertIdx = parentIdx + 1;\n while (insertIdx < next.length) {\n const siblingParent =\n parentMapRef.current[next[insertIdx]] ||\n candidateParents.get(next[insertIdx]);\n if (siblingParent !== info.parentThreadId) break;\n insertIdx++;\n }\n next.splice(insertIdx, 0, info.threadId);\n }\n return next;\n });\n if (shouldRefreshThreads) {\n refreshThreads();\n }\n }\n }\n } catch {\n // Best effort: task cards and manual history still work if this poll fails.\n } finally {\n if (!stopped) {\n timer = setTimeout(hydrateAgentTeamTabs, 3000);\n }\n }\n }\n\n hydrateAgentTeamTabs();\n return () => {\n stopped = true;\n if (timer) clearTimeout(timer);\n };\n }, [apiUrl, refreshThreads]);\n\n // Focus the composer when switching tabs\n useEffect(() => {\n if (!activeThreadId) return;\n // Small delay to ensure the tab is visible before focusing\n const t = setTimeout(() => {\n chatRefs.current.get(activeThreadId)?.focusComposer();\n }, 50);\n return () => clearTimeout(t);\n }, [activeThreadId]);\n\n // Ref callback: scroll the active tab into view in the overflow container.\n // Uses getBoundingClientRect for reliable positioning regardless of offsetParent.\n // A margin keeps the active tab from sitting flush against either container\n // edge — at the right edge it was landing directly under the +/history/menu\n // buttons, which visually clipped the tab label.\n const activeTabRefCb = useCallback((el: HTMLElement | null) => {\n if (!el) return;\n const container = el.parentElement;\n if (!container) return;\n const MARGIN = 24;\n requestAnimationFrame(() => {\n const containerRect = container.getBoundingClientRect();\n const tabRect = el.getBoundingClientRect();\n if (tabRect.left < containerRect.left + MARGIN) {\n container.scrollLeft += tabRect.left - containerRect.left - MARGIN;\n } else if (tabRect.right > containerRect.right - MARGIN) {\n container.scrollLeft += tabRect.right - containerRect.right + MARGIN;\n }\n });\n }, []);\n\n const [messageCounts, setMessageCounts] = useState<Record<string, number>>(\n () => Object.fromEntries(threads.map((t) => [t.id, t.messageCount ?? 0])),\n );\n\n // Sync message counts from threads when they load\n useEffect(() => {\n if (threads.length > 0) {\n setMessageCounts((prev) => {\n const next = { ...prev };\n for (const t of threads) {\n if (!(t.id in next)) {\n next[t.id] = t.messageCount ?? 0;\n }\n }\n return next;\n });\n }\n }, [threads]);\n\n // Listen for builder.submitChat postMessages\n useEffect(() => {\n const handler = (event: MessageEvent) => {\n if (!isTrustedFrameMessage(event)) return;\n if (event.data?.type === AGENT_CHAT_SET_CONTEXT_MESSAGE_TYPE) {\n const item = normalizeAgentChatContextItem(event.data.data);\n if (!item) return;\n const openSidebar = event.data.data?.openSidebar as boolean | undefined;\n if (openSidebar !== false) {\n window.dispatchEvent(new CustomEvent(\"agent-panel:open\"));\n }\n if (postMessageSubmissionsDisabled) return;\n const currentTabId = activeThreadIdRef.current;\n if (!currentTabId) return;\n // Focus defaults to true; a caller opts out with `focus: false` for\n // passive context (e.g. a canvas selection) so staging never steals\n // focus from an in-progress inline editor.\n const focus = (event.data.data?.focus as boolean | undefined) !== false;\n setContextInTab(currentTabId, item, { focus });\n return;\n }\n if (event.data?.type === AGENT_CHAT_REMOVE_CONTEXT_MESSAGE_TYPE) {\n const key =\n typeof event.data.data?.key === \"string\"\n ? event.data.data.key.trim()\n : \"\";\n if (!key) return;\n const openSidebar = event.data.data?.openSidebar as boolean | undefined;\n if (openSidebar === true) {\n window.dispatchEvent(new CustomEvent(\"agent-panel:open\"));\n }\n if (postMessageSubmissionsDisabled) return;\n const currentTabId = activeThreadIdRef.current;\n if (!currentTabId) return;\n removeContextInTab(currentTabId, key);\n return;\n }\n if (event.data?.type === AGENT_CHAT_CLEAR_CONTEXT_MESSAGE_TYPE) {\n const openSidebar = event.data.data?.openSidebar as boolean | undefined;\n if (openSidebar === true) {\n window.dispatchEvent(new CustomEvent(\"agent-panel:open\"));\n }\n if (postMessageSubmissionsDisabled) return;\n const currentTabId = activeThreadIdRef.current;\n if (!currentTabId) return;\n clearContextInTab(currentTabId);\n return;\n }\n const parsed = parseSubmitChatMessage(event);\n if (!parsed) return;\n // Dedup the live post against the cold-start replay; first one wins.\n if (!claimAgentChatSubmit(parsed.submitMessageId)) return;\n const {\n message,\n context,\n openSidebar,\n model,\n effort,\n newTab,\n background,\n submit,\n images,\n } = parsed;\n const requestedTabId = parsed.tabId;\n const requestMode =\n parsed.requestMode ?? requestModeFromExecMode(props.execMode);\n\n // Make sure the sidebar is visible to show the response, unless the\n // caller explicitly opted out or it's a background send.\n if (openSidebar !== false && !background) {\n window.dispatchEvent(new CustomEvent(\"agent-panel:open\"));\n }\n if (postMessageSubmissionsDisabled) return;\n\n // Plan mode is sent as request metadata by the chat adapter. Keep the\n // user-visible message clean so mode instructions never enter history.\n const fullMessage = context\n ? appendAgentChatContextToMessage(message, context)\n : message;\n\n const send: PendingSend = {\n message: fullMessage,\n images,\n submit,\n ...(background ? { trackInRunsTray: true } : {}),\n ...(requestMode ? { requestMode } : {}),\n };\n\n const sendToTab = (threadId: string) => {\n // If a model override was specified, apply it only if we recognize it\n if (model) {\n const matchedGroup = availableModels.find((g) =>\n g.models.includes(model),\n );\n if (matchedGroup) {\n const requestedEffort = isReasoningEffort(effort) ? effort : \"auto\";\n const effortOptions = getReasoningEffortOptionsForModel(model);\n const selectedEffort =\n requestedEffort === \"auto\" ||\n effortOptions.includes(requestedEffort)\n ? requestedEffort\n : \"auto\";\n threadModelRef.current.set(threadId, {\n model,\n engine: matchedGroup.engine,\n effort: selectedEffort,\n });\n bumpModelSelectionVersion();\n }\n }\n\n const ref = chatRefs.current.get(threadId);\n if (ref) {\n deliverPendingSend(ref, send);\n } else {\n pendingDeliveries.current.push({ threadId, send });\n }\n };\n\n if (newTab) {\n const previousTabId = activeThreadIdRef.current;\n createThread(requestedTabId).then((newId) => {\n if (newId) {\n newThreadIds.current.add(newId);\n if (background) {\n mountedTabsRef.current.add(newId);\n }\n setOpenTabIds((prev) =>\n prev.includes(newId) ? prev : [...prev, newId],\n );\n if (!background) {\n writeThreadUrl(newId);\n }\n sendToTab(newId);\n if (background && previousTabId) {\n switchThreadState(previousTabId);\n }\n }\n });\n } else {\n const currentTabId = activeThreadIdRef.current;\n if (currentTabId) {\n sendToTab(currentTabId);\n } else {\n // Cold start: no thread yet. Queue for the first active thread (the\n // bootstrap effect creates it) rather than racing a second create.\n pendingDeliveries.current.push({ threadId: null, send });\n }\n }\n };\n window.addEventListener(\"message\", handler);\n return () => window.removeEventListener(\"message\", handler);\n }, [\n availableModels,\n bumpModelSelectionVersion,\n clearContextInTab,\n createThread,\n postMessageSubmissionsDisabled,\n props.execMode,\n removeContextInTab,\n setContextInTab,\n switchThread,\n switchThreadState,\n writeThreadUrl,\n ]);\n\n // Replay submits posted before this lazy panel's listener attached. Dedup in\n // the handler keeps a live + replayed message single.\n useEffect(() => {\n const buffered = drainBufferedAgentChatSubmits();\n for (const data of buffered) {\n window.dispatchEvent(\n new MessageEvent(\"message\", {\n data: { type: \"agentNative.submitChat\", data },\n origin: window.location.origin,\n }),\n );\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Flush queued context items and sends once their thread's ref is mounted\n // (re-runs on ref mount via openTabIds and on cold-start target via\n // activeThreadId).\n useEffect(() => {\n for (const [tabId, items] of pendingContextItems.current) {\n const ref = chatRefs.current.get(tabId);\n if (!ref) continue;\n for (const item of items) ref.setComposerContextItem(item);\n pendingContextItems.current.delete(tabId);\n }\n\n if (pendingDeliveries.current.length === 0) return;\n const active = activeThreadIdRef.current;\n const remaining: PendingDelivery[] = [];\n for (const delivery of pendingDeliveries.current) {\n const threadId = delivery.threadId ?? active ?? null;\n const ref = threadId ? chatRefs.current.get(threadId) : null;\n if (threadId && ref) {\n const { send } = delivery;\n setTimeout(() => deliverPendingSend(ref, send), 50);\n } else {\n // Not ready — keep it, pinning the resolved threadId once known.\n remaining.push(threadId ? { threadId, send: delivery.send } : delivery);\n }\n }\n pendingDeliveries.current = remaining;\n }, [openTabIds, activeThreadId]);\n\n // Listen for chatRunning completion events\n useEffect(() => {\n const handler = (e: Event) => {\n const detail = (e as CustomEvent).detail;\n if (!detail) return;\n const { isRunning, tabId } = detail;\n if (!tabId) return;\n\n setRunningThreads((prev) => {\n const next = new Set(prev);\n if (isRunning) {\n next.add(tabId);\n } else {\n next.delete(tabId);\n }\n return next;\n });\n };\n window.addEventListener(\"agentNative.chatRunning\", handler);\n return () => window.removeEventListener(\"agentNative.chatRunning\", handler);\n }, []);\n\n const addTab = useCallback(async () => {\n const id = await createThread();\n if (id) {\n newThreadIds.current.add(id);\n writeThreadUrl(null);\n }\n return id;\n }, [createThread, writeThreadUrl]);\n\n const cleanupClosedTab = useCallback((tabId: string) => {\n if (parentMapRef.current[tabId]) {\n dismissedSubAgentTabsRef.current.add(tabId);\n }\n chatRefs.current.delete(tabId);\n pendingDeliveries.current = pendingDeliveries.current.filter(\n (d) => d.threadId !== tabId,\n );\n pendingContextItems.current.delete(tabId);\n newThreadIds.current.delete(tabId);\n threadModelRef.current.delete(tabId);\n // Clean up parent map and sub-agent names\n setParentMap((prev) => {\n if (!(tabId in prev)) return prev;\n const { [tabId]: _, ...rest } = prev;\n return rest;\n });\n setSubAgentNames((prev) => {\n if (!(tabId in prev)) return prev;\n const { [tabId]: _, ...rest } = prev;\n return rest;\n });\n setSubAgentStatuses((prev) => {\n if (!(tabId in prev)) return prev;\n const { [tabId]: _, ...rest } = prev;\n return rest;\n });\n }, []);\n\n const closeTab = useCallback(\n (tabId: string) => {\n setOpenTabIds((prev) => {\n if (prev.length <= 1) {\n // Last tab — create a new one and replace the old tab atomically\n createThread().then((newId) => {\n if (newId) {\n newThreadIds.current.add(newId);\n setOpenTabIds([newId]);\n writeThreadUrl(null);\n }\n });\n return prev; // Keep old tab until new one is ready\n }\n const next = prev.filter((id) => id !== tabId);\n if (tabId === activeThreadIdRef.current && next.length > 0) {\n const idx = prev.indexOf(tabId);\n switchThread(next[Math.min(idx, next.length - 1)]);\n }\n return next;\n });\n cleanupClosedTab(tabId);\n },\n [switchThread, createThread, cleanupClosedTab, writeThreadUrl],\n );\n\n const closeOtherTabs = useCallback(\n (tabId: string) => {\n for (const id of openTabIdsRef.current) {\n if (id !== tabId && parentMapRef.current[id]) {\n dismissedSubAgentTabsRef.current.add(id);\n }\n }\n setOpenTabIds([tabId]);\n if (activeThreadIdRef.current !== tabId) {\n switchThread(tabId);\n }\n // Clean up refs for closed tabs\n for (const key of chatRefs.current.keys()) {\n if (key !== tabId) {\n if (parentMapRef.current[key]) {\n dismissedSubAgentTabsRef.current.add(key);\n }\n chatRefs.current.delete(key);\n pendingDeliveries.current = pendingDeliveries.current.filter(\n (d) => d.threadId !== key,\n );\n pendingContextItems.current.delete(key);\n newThreadIds.current.delete(key);\n threadModelRef.current.delete(key);\n }\n }\n // Clean up parent map and sub-agent names — only keep entries for the surviving tab\n setParentMap((prev) => {\n if (tabId in prev) return { [tabId]: prev[tabId] };\n return {};\n });\n setSubAgentNames((prev) => {\n if (tabId in prev) return { [tabId]: prev[tabId] };\n return {};\n });\n setSubAgentStatuses((prev) => {\n if (tabId in prev) return { [tabId]: prev[tabId] };\n return {};\n });\n },\n [switchThread],\n );\n\n const closeAllTabs = useCallback(async () => {\n const id = await createThread();\n if (id) {\n newThreadIds.current.add(id);\n setOpenTabIds([id]);\n switchThreadState(id);\n writeThreadUrl(null);\n dismissedSubAgentTabsRef.current.clear();\n // Clean up all old refs\n chatRefs.current.clear();\n pendingDeliveries.current = [];\n pendingContextItems.current.clear();\n threadModelRef.current.clear();\n setParentMap({});\n setSubAgentNames({});\n setSubAgentStatuses({});\n }\n }, [createThread, switchThreadState, writeThreadUrl]);\n\n // Keyboard shortcuts dispatched from AgentPanel based on the active mode\n useEffect(() => {\n const handleCloseCurrent = () => {\n const id = activeThreadIdRef.current;\n if (id) closeTab(id);\n };\n const handleCloseAll = () => {\n void closeAllTabs();\n };\n const handleNewChat = () => {\n void addTab();\n };\n window.addEventListener(\"agent-chat:close-current-tab\", handleCloseCurrent);\n window.addEventListener(\"agent-chat:close-all-tabs\", handleCloseAll);\n window.addEventListener(\"agent-chat:new-chat\", handleNewChat);\n return () => {\n window.removeEventListener(\n \"agent-chat:close-current-tab\",\n handleCloseCurrent,\n );\n window.removeEventListener(\"agent-chat:close-all-tabs\", handleCloseAll);\n window.removeEventListener(\"agent-chat:new-chat\", handleNewChat);\n };\n }, [closeTab, closeAllTabs, addTab]);\n\n useEffect(() => {\n const handleOpenThread = (event: Event) => {\n const detail = (event as CustomEvent).detail as\n | { threadId?: unknown; newThread?: unknown; openRequestId?: unknown }\n | undefined;\n const threadId =\n typeof detail?.threadId === \"string\" ? detail.threadId : \"\";\n if (!detail || !threadId) return;\n if (!claimAgentChatOpenRequest(detail.openRequestId)) return;\n\n if (detail?.newThread === true) {\n newThreadIds.current.add(threadId);\n void createThread(threadId).then((createdId) => {\n if (!createdId) return;\n setOpenTabIds((prev) =>\n prev.includes(createdId) ? prev : [...prev, createdId],\n );\n writeThreadUrl(null);\n });\n return;\n }\n setOpenTabIds((prev) =>\n prev.includes(threadId) ? prev : [...prev, threadId],\n );\n switchThread(threadId);\n };\n\n window.addEventListener(\"agent-chat:open-thread\", handleOpenThread);\n return () =>\n window.removeEventListener(\"agent-chat:open-thread\", handleOpenThread);\n }, [createThread, switchThread, writeThreadUrl]);\n\n const clearActiveTab = useCallback(() => {\n const tabIdToClear = activeThreadIdRef.current;\n void addTab().then((newTabId) => {\n if (!tabIdToClear || !newTabId || tabIdToClear === newTabId) return;\n setOpenTabIds((prev) => {\n const next = prev.filter((id) => id !== tabIdToClear);\n return next.includes(newTabId) ? next : [...next, newTabId];\n });\n cleanupClosedTab(tabIdToClear);\n });\n }, [addTab, cleanupClosedTab]);\n\n const openFromHistory = useCallback(\n (threadId: string) => {\n if (!openTabIds.includes(threadId)) {\n setOpenTabIds((prev) => [...prev, threadId]);\n }\n switchThread(threadId);\n },\n [openTabIds, switchThread],\n );\n\n // Listen for agent-task-open events (from AgentTaskCard \"Open\" button)\n useEffect(() => {\n function handleOpenTask(e: Event) {\n const detail = (e as CustomEvent).detail;\n const threadId = detail?.threadId;\n if (!threadId) return;\n if (!claimAgentChatOpenRequest(detail.openRequestId)) return;\n dismissedSubAgentTabsRef.current.delete(threadId);\n // Prefer an explicit parent (RunsTray/background hydration knows it);\n // inline task cards fall back to the active orchestrator thread.\n const explicitParentId =\n typeof detail?.parentThreadId === \"string\"\n ? detail.parentThreadId.trim()\n : \"\";\n const parentId = explicitParentId || activeThreadIdRef.current;\n if (parentId && parentId !== threadId) {\n setParentMap((prev) =>\n prev[threadId] === parentId\n ? prev\n : { ...prev, [threadId]: parentId },\n );\n }\n // Store the sub-agent name/description for the tab label\n const name = detail.name || detail.description || \"\";\n if (name) {\n setSubAgentNames((prev) =>\n prev[threadId] === name ? prev : { ...prev, [threadId]: name },\n );\n }\n // Refresh thread list so the new sub-agent thread appears with its title\n refreshThreads();\n // Open the sub-agent thread as a tab — insert after parent for visual grouping\n if (!openTabIds.includes(threadId)) {\n setOpenTabIds((prev) => {\n if (parentId) {\n const parentIdx = prev.indexOf(parentId);\n if (parentIdx !== -1) {\n // Insert after the parent (and any existing children of that parent)\n const next = [...prev];\n let insertIdx = parentIdx + 1;\n // Skip past any existing children of the same parent\n while (\n insertIdx < next.length &&\n parentMap[next[insertIdx]] === parentId\n ) {\n insertIdx++;\n }\n next.splice(insertIdx, 0, threadId);\n return next;\n }\n }\n return [...prev, threadId];\n });\n }\n switchThread(threadId);\n }\n window.addEventListener(\"agent-task-open\", handleOpenTask);\n return () => window.removeEventListener(\"agent-task-open\", handleOpenTask);\n }, [openTabIds, switchThread, refreshThreads, parentMap]);\n\n // Replay thread/task opens requested before this lazy panel's listeners\n // attached. Live events claim their id; replay drains only unclaimed requests.\n useEffect(() => {\n const buffered = drainBufferedAgentChatOpenRequests();\n for (const request of buffered) {\n window.dispatchEvent(\n new CustomEvent(request.eventType, { detail: request.detail }),\n );\n }\n }, []);\n\n // Watch for agent-issued chat-command in application-state\n const lastChatCommandRef = useRef(0);\n useEffect(() => {\n let stopped = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n async function pollChatCommand() {\n if (stopped) return;\n try {\n const res = await fetch(\n agentNativePath(\"/_agent-native/application-state/chat-command\"),\n );\n if (res.ok) {\n const data = await res.json();\n if (\n data?.value?.command === \"open-thread\" &&\n data.value.threadId &&\n data.value.timestamp > lastChatCommandRef.current\n ) {\n lastChatCommandRef.current = data.value.timestamp;\n const threadId = data.value.threadId as string;\n // Open the thread as a tab and focus it\n if (!openTabIds.includes(threadId)) {\n setOpenTabIds((prev) => [...prev, threadId]);\n }\n switchThread(threadId);\n // Clear the command\n fetch(\n agentNativePath(\"/_agent-native/application-state/chat-command\"),\n {\n method: \"DELETE\",\n headers: { \"X-Agent-Native-CSRF\": \"1\" },\n },\n ).catch(() => {});\n }\n }\n } catch {}\n if (!stopped) {\n timer = setTimeout(pollChatCommand, 2000);\n }\n }\n\n pollChatCommand();\n return () => {\n stopped = true;\n if (timer) clearTimeout(timer);\n };\n }, [openTabIds, switchThread]);\n\n const handleGenerateTitle = useCallback(\n (threadId: string, message: string) => {\n generateTitle(threadId, message).then((title) => {\n if (title) {\n // Persist the generated title to the server\n saveThreadData(threadId, {\n threadData: \"\",\n title,\n preview: message.slice(0, 120),\n titleSource: \"generated\",\n });\n }\n });\n },\n [generateTitle, saveThreadData],\n );\n\n const handleSaveThread = useCallback(\n (\n threadId: string,\n data: {\n threadData: string;\n title: string;\n preview: string;\n messageCount: number;\n },\n ) => {\n saveThreadData(threadId, data);\n if (\n data.messageCount > 0 &&\n threadId === activeThreadIdRef.current &&\n urlThreadIdRef.current !== threadId\n ) {\n writeThreadUrl(threadId);\n }\n },\n [saveThreadData, writeThreadUrl],\n );\n\n // ─── Slash command handler ──────────────────────────────────────────\n const [helpVisible, setHelpVisible] = useState(false);\n\n const handleSlashCommand = useCallback(\n (command: string) => {\n switch (command) {\n case \"clear\":\n case \"new\":\n addTab();\n break;\n case \"history\":\n setShowHistory(true);\n break;\n case \"plan\":\n props.onExecModeChange?.(\"plan\");\n break;\n case \"act\":\n props.onExecModeChange?.(\"build\");\n break;\n case \"help\":\n setHelpVisible(true);\n break;\n }\n },\n [addTab, props.onExecModeChange],\n );\n\n const handleForkChat = useCallback(\n async (sourceThreadId: string) => {\n const sourceSnapshot =\n chatRefs.current.get(sourceThreadId)?.exportThreadSnapshot() ?? null;\n const forkedId = await forkThread(sourceThreadId, sourceSnapshot);\n if (!forkedId) return false;\n setOpenTabIds((prev) => {\n const idx = prev.indexOf(sourceThreadId);\n if (idx !== -1) {\n const next = [...prev];\n next.splice(idx + 1, 0, forkedId);\n return next;\n }\n return [...prev, forkedId];\n });\n switchThread(forkedId);\n return true;\n },\n [forkThread, switchThread],\n );\n\n // Build tabs from open thread IDs. During the first thread-list fetch,\n // `activeThreadId` is seeded synchronously so the chat can mount before\n // persisted open tabs have been reconciled.\n const visibleOpenTabIds =\n activeThreadId && !openTabIds.includes(activeThreadId)\n ? [...openTabIds, activeThreadId]\n : openTabIds;\n const threadMap = new Map(threads.map((t) => [t.id, t]));\n const tabs: ChatTab[] = visibleOpenTabIds\n .filter((id) => threadMap.has(id) || id === activeThreadId)\n .map((id) => {\n const t = threadMap.get(id);\n const agentTeamStatus = chatTabStatusFromAgentTeamStatus(\n subAgentStatuses[id],\n );\n return {\n id,\n label: t?.title || t?.preview?.slice(0, 30) || \"New chat\",\n status:\n agentTeamStatus ??\n (runningThreads.has(id)\n ? (\"running\" as const)\n : (messageCounts[id] ?? t?.messageCount ?? 0) > 0\n ? (\"completed\" as const)\n : (\"idle\" as const)),\n parentThreadId: parentMap[id],\n subAgentName: subAgentNames[id],\n };\n });\n\n // Include sub-agent tabs that aren't in threadMap yet (just created, not refreshed)\n for (const id of visibleOpenTabIds) {\n if (!tabs.some((t) => t.id === id)) {\n tabs.push({\n id,\n label:\n subAgentNames[id] || (parentMap[id] ? \"Sub-agent...\" : \"New chat\"),\n status:\n chatTabStatusFromAgentTeamStatus(subAgentStatuses[id]) ??\n (\"running\" as const),\n parentThreadId: parentMap[id],\n subAgentName: subAgentNames[id],\n });\n }\n }\n\n const headerProps: MultiTabAssistantChatHeaderProps = {\n tabs,\n activeTabId: activeThreadId ?? \"\",\n activeTabMessageCount: activeThreadId\n ? (messageCounts[activeThreadId] ?? 0)\n : 0,\n setActiveTabId: switchThread,\n addTab,\n closeTab,\n closeOtherTabs,\n closeAllTabs,\n clearActiveTab,\n showHistory,\n toggleHistory: () => setShowHistory((v) => !v),\n tabCount: visibleOpenTabIds.length,\n };\n\n // Wait for the first thread-list pass only when there is no synchronously\n // seeded active thread. Suggestion loading and thread-list reconciliation\n // should not block the chat shell from mounting.\n if (isLoading && !activeThreadId) {\n return (\n <ChatSkeleton\n header={renderHeader?.(headerProps)}\n headerOnly={contentHidden}\n />\n );\n }\n\n return (\n <div className=\"flex flex-1 flex-col h-full min-h-0 overflow-x-hidden\">\n {/* Tailwind group-hover/tab doesn't work in core package — inject directly */}\n <style\n dangerouslySetInnerHTML={{\n __html:\n \".agent-tab-close{opacity:0}.agent-tab:hover .agent-tab-close{opacity:1}\" +\n \".agent-tabs-scroll{scrollbar-width:none;-ms-overflow-style:none;}\" +\n \".agent-tabs-scroll::-webkit-scrollbar{display:none;}\",\n }}\n />\n {renderHeader\n ? renderHeader(headerProps)\n : showTabBar\n ? (() => {\n const activeTab = tabs.find((t) => t.id === activeThreadId);\n const focusParentId = activeTab?.parentThreadId || activeThreadId;\n const childTabs = tabs.filter(\n (t) => t.parentThreadId === focusParentId,\n );\n const hasSubTabs = childTabs.length > 0;\n const mainTabs = tabs.filter((t) => !t.parentThreadId);\n\n return (\n <>\n <div className=\"flex items-center px-1 py-1 border-b border-border shrink-0 gap-0.5\">\n <div className=\"agent-tabs-scroll flex items-center gap-0.5 min-w-0 overflow-x-auto flex-1\">\n {mainTabs.map((tab) => {\n const isActive =\n tab.id === activeThreadId ||\n (tab.id === focusParentId &&\n activeTab?.parentThreadId === tab.id);\n return (\n <div\n key={tab.id}\n ref={isActive ? activeTabRefCb : undefined}\n className={cn(\n \"agent-tab relative flex items-center rounded-md text-[11px] font-medium shrink-0 max-w-[130px]\",\n isActive\n ? \"bg-accent text-foreground ring-1 ring-inset ring-border/60 shadow-sm\"\n : \"text-muted-foreground hover:text-foreground hover:bg-accent/50\",\n )}\n >\n <button\n type=\"button\"\n onClick={() => switchThread(tab.id)}\n className=\"flex items-center gap-1 px-2.5 py-1.5 min-w-0 flex-1 text-start\"\n >\n <span className=\"truncate pe-1\">{tab.label}</span>\n {tab.status === \"running\" && (\n <span className=\"w-1.5 h-1.5 rounded-full bg-muted-foreground/50 shrink-0 animate-pulse\" />\n )}\n </button>\n <button\n type=\"button\"\n aria-label=\"Close tab\"\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n closeTab(tab.id);\n }}\n className=\"agent-tab-close flex items-center justify-end text-muted-foreground hover:!text-foreground\"\n style={{\n position: \"absolute\",\n right: 0,\n top: 0,\n bottom: 0,\n width: 28,\n paddingRight: 6,\n borderRadius: \"0 6px 6px 0\",\n background:\n \"linear-gradient(to right, transparent, hsl(var(--accent)) 40%)\",\n }}\n >\n <IconX size={12} />\n </button>\n </div>\n );\n })}\n </div>\n <TooltipProvider delayDuration={200}>\n <div className=\"flex items-center gap-px shrink-0 ms-auto\">\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={addTab}\n aria-label=\"New chat\"\n className=\"flex h-6 w-6 items-center justify-center rounded text-muted-foreground/60 hover:text-foreground hover:bg-accent/50\"\n >\n <IconPlus size={12} />\n </button>\n </TooltipTrigger>\n <TooltipContent>New chat</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={() => setShowHistory(!showHistory)}\n aria-label=\"All chats\"\n className={cn(\n \"flex h-6 w-6 items-center justify-center rounded text-muted-foreground/60 hover:text-foreground hover:bg-accent/50\",\n showHistory && \"bg-accent text-foreground\",\n )}\n >\n <IconHistory size={12} />\n </button>\n </TooltipTrigger>\n <TooltipContent>All chats</TooltipContent>\n </Tooltip>\n </div>\n </TooltipProvider>\n </div>\n {hasSubTabs && (\n <div className=\"flex items-center px-1 py-0.5 border-b border-border shrink-0 gap-0.5 bg-muted/30\">\n <div className=\"agent-tabs-scroll flex items-center gap-0.5 min-w-0 overflow-x-auto flex-1\">\n <button\n onClick={() => switchThread(focusParentId!)}\n className={cn(\n \"flex shrink-0 items-center gap-1 rounded-md px-2 py-1 text-[10px] font-medium cursor-pointer\",\n activeThreadId === focusParentId\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent hover:text-foreground\",\n )}\n >\n Main\n </button>\n {childTabs.map((tab) => (\n <div\n key={tab.id}\n ref={\n tab.id === activeThreadId\n ? activeTabRefCb\n : undefined\n }\n className={cn(\n \"agent-tab relative flex shrink-0 items-center rounded-md text-[10px] font-medium max-w-[130px]\",\n tab.id === activeThreadId\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent hover:text-foreground\",\n )}\n >\n <button\n type=\"button\"\n onClick={() => switchThread(tab.id)}\n className=\"flex items-center gap-1 px-2 py-1 min-w-0 flex-1 text-start\"\n >\n <span className=\"truncate pe-1\">\n {tab.subAgentName || tab.label}\n </span>\n {tab.status === \"running\" && (\n <span className=\"w-1 h-1 rounded-full bg-muted-foreground/50 shrink-0 animate-pulse\" />\n )}\n </button>\n <button\n type=\"button\"\n aria-label=\"Close tab\"\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n closeTab(tab.id);\n }}\n className=\"agent-tab-close flex items-center justify-end text-muted-foreground hover:!text-foreground\"\n style={{\n position: \"absolute\",\n right: 0,\n top: 0,\n bottom: 0,\n width: 24,\n paddingRight: 4,\n borderRadius: \"0 6px 6px 0\",\n background:\n \"linear-gradient(to right, transparent, hsl(var(--accent)) 40%)\",\n }}\n >\n <IconX size={12} />\n </button>\n </div>\n ))}\n </div>\n </div>\n )}\n </>\n );\n })()\n : null}\n\n {/* Chat content with optional overlay */}\n <div className=\"relative flex-1 flex flex-col min-h-0\">\n {renderOverlay ? renderOverlay(headerProps) : null}\n\n {/* History popover — rendered inside relative container so positioning works */}\n {showHistory && (\n <HistoryPopover\n threads={threads}\n openTabIds={new Set(openTabIds)}\n activeThreadId={activeThreadId}\n currentScope={scope}\n hasMoreThreads={hasMoreThreads}\n isLoadingMoreThreads={isLoadingMoreThreads}\n loadError={threadsLoadError}\n onSelect={openFromHistory}\n onClose={() => setShowHistory(false)}\n onLoadMore={loadMoreThreads}\n onSearch={searchThreads}\n />\n )}\n\n {/* Help popover — shown by /help slash command */}\n {helpVisible && <HelpPopover onClose={() => setHelpVisible(false)} />}\n\n {/* Render tabs that have been activated at least once, hide inactive ones to preserve state.\n Sub-agent tabs are only mounted when first focused — prevents stale restore from running\n while the component is display:none before the user switches to it. */}\n {[...new Set(visibleOpenTabIds)]\n .filter(\n (tabId) =>\n tabId === activeThreadId || mountedTabsRef.current.has(tabId),\n )\n .map((tabId) => {\n const modelSelection = resolveThreadModelSelection(tabId);\n const tabThread = threads.find((thread) => thread.id === tabId);\n const tabScope =\n tabThread?.scope ??\n (tabId === activeThreadId ? activeThreadScope : null);\n const tabDynamicSuggestions =\n tabId === activeThreadId && !contentHidden\n ? props.dynamicSuggestions\n : false;\n const scopeComposerSlot =\n showScopeBadge && tabId === activeThreadId && !contentHidden ? (\n tabScope && activeThreadId ? (\n <ScopeBadge\n scope={tabScope}\n currentScope={scope}\n onDetach={handleDetachActiveThread}\n otherScopedThreads={otherScopedThreads}\n activeThreadId={activeThreadId}\n openTabIds={new Set(openTabIds)}\n onSelectThread={openFromHistory}\n />\n ) : detachConfirmType ? (\n <DetachConfirmationBanner />\n ) : null\n ) : null;\n const composerSlot =\n scopeComposerSlot || props.composerSlot ? (\n <>\n {props.composerSlot}\n {scopeComposerSlot}\n </>\n ) : undefined;\n return (\n <div\n key={tabId}\n className=\"flex-1 min-h-0 flex-col\"\n style={{\n display:\n contentHidden || tabId !== activeThreadId ? \"none\" : \"flex\",\n }}\n >\n <RunStuckBanner\n threadId={tabId}\n apiUrl={apiUrl}\n autoRetry\n autoRetryOwnerId={browserTabId}\n onRetry={() => {\n const handle = chatRefs.current.get(tabId);\n handle?.sendRecoveryMessage(\n \"Continue from where you left off and finish my last request. Do not repeat completed work.\",\n \"continue\",\n );\n }}\n />\n <AssistantChat\n {...props}\n dynamicSuggestions={tabDynamicSuggestions}\n emptyStateText={\n tabScope?.label && tabId === activeThreadId\n ? `Ask about ${tabScope.label}`\n : props.emptyStateText\n }\n ref={(handle) => {\n if (handle) {\n chatRefs.current.set(tabId, handle);\n } else {\n chatRefs.current.delete(tabId);\n }\n }}\n threadId={tabId}\n tabId={tabId}\n browserTabId={browserTabId}\n contextScope={tabScope}\n isActiveComposer={tabId === activeThreadId}\n apiUrl={apiUrl}\n isNewThread={\n newThreadIds.current.has(tabId) || isNewThread(tabId)\n }\n onMessageCountChange={(count) =>\n setMessageCounts((prev) =>\n prev[tabId] === count\n ? prev\n : { ...prev, [tabId]: count },\n )\n }\n onSaveThread={handleSaveThread}\n onGenerateTitle={handleGenerateTitle}\n onSlashCommand={handleSlashCommand}\n selectedModel={modelSelection?.model}\n selectedEngine={modelSelection?.engine}\n selectedEffort={modelSelection?.effort ?? \"auto\"}\n composerSlot={composerSlot}\n defaultModel={defaultModel}\n availableModels={availableModels}\n onModelChange={handleModelChange}\n onEffortChange={handleEffortChange}\n onForkChat={() => handleForkChat(tabId)}\n // Sub-agent tabs are read-only: sending a new message from the\n // sub-agent tab would start a fresh run on that thread and kill\n // the in-flight team chunk. Disable the composer and show a\n // hint so users know to send via the orchestrator chat instead.\n composerDisabled={Boolean(parentMap[tabId])}\n composerDisabledPlaceholder={\n parentMap[tabId]\n ? \"Send messages to the orchestrator chat — this sub-agent runs automatically\"\n : undefined\n }\n />\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"MultiTabAssistantChat.js","sourceRoot":"","sources":["../../src/client/MultiTabAssistantChat.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n IconX,\n IconPlus,\n IconHistory,\n IconSearch,\n IconLink,\n IconLinkOff,\n IconCheck,\n} from \"@tabler/icons-react\";\nimport React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n useMemo,\n} from \"react\";\n\nimport { DEFAULT_MODEL } from \"../agent/default-model.js\";\nimport {\n getReasoningEffortOptionsForModel,\n isReasoningEffort,\n type ReasoningEffort,\n} from \"../shared/reasoning-effort.js\";\nimport {\n AGENT_CHAT_CLEAR_CONTEXT_MESSAGE_TYPE,\n AGENT_CHAT_REMOVE_CONTEXT_MESSAGE_TYPE,\n AGENT_CHAT_SET_CONTEXT_MESSAGE_TYPE,\n appendAgentChatContextToMessage,\n claimAgentChatOpenRequest,\n claimAgentChatSubmit,\n drainBufferedAgentChatOpenRequests,\n drainBufferedAgentChatSubmits,\n normalizeAgentChatContextItem,\n parseSubmitChatMessage,\n type AgentChatContextItem,\n} from \"./agent-chat.js\";\nimport { agentNativePath, appPath } from \"./api-path.js\";\nimport {\n AssistantChat,\n type AssistantChatProps,\n type AssistantChatHandle,\n} from \"./AssistantChat.js\";\nimport {\n buildChatModelGroups,\n type EngineModelGroup,\n} from \"./chat-model-groups.js\";\nimport {\n Popover,\n PopoverAnchor,\n PopoverContent,\n PopoverTrigger,\n} from \"./components/ui/popover.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"./components/ui/tooltip.js\";\nimport { isTrustedFrameMessage } from \"./frame.js\";\nimport { KeepTabOpenNotice } from \"./KeepTabOpenNotice.js\";\nimport { RunStuckBanner } from \"./RunStuckBanner.js\";\nimport { callAction } from \"./use-action.js\";\nimport {\n useChatThreads,\n type ChatThreadScope,\n type ChatThreadSummary,\n} from \"./use-chat-threads.js\";\nimport { cn } from \"./utils.js\";\n\ninterface ModelSelection {\n model: string;\n engine?: string;\n effort?: ReasoningEffort;\n}\n\ninterface PendingSend {\n message: string;\n images?: string[];\n submit: boolean;\n trackInRunsTray?: boolean;\n requestMode?: \"act\" | \"plan\";\n}\n\n/**\n * A send queued until its target thread is ready. `threadId: null` targets the\n * first thread to become active (cold start); a concrete id is a thread whose\n * chat ref hasn't mounted yet. Drained by the flush effect.\n */\ninterface PendingDelivery {\n threadId: string | null;\n send: PendingSend;\n}\n\n/** The single path that hands a queued send to a mounted chat ref. */\nfunction deliverPendingSend(ref: AssistantChatHandle, send: PendingSend): void {\n if (!send.submit) {\n ref.prefillMessage(send.message);\n return;\n }\n if (send.trackInRunsTray || send.requestMode) {\n ref.sendMessage(send.message, send.images, {\n ...(send.trackInRunsTray ? { trackInRunsTray: true } : {}),\n ...(send.requestMode ? { requestMode: send.requestMode } : {}),\n });\n } else {\n ref.sendMessage(send.message, send.images);\n }\n}\n\nconst MODEL_SELECTION_STORAGE_KEY = \"agent-native:chat-models:selection\";\n\nfunction readStoredModelSelection(key: string): ModelSelection | undefined {\n if (typeof window === \"undefined\") return undefined;\n try {\n const raw = window.localStorage.getItem(key);\n if (!raw) return undefined;\n const parsed = JSON.parse(raw) as Partial<ModelSelection>;\n if (typeof parsed.model !== \"string\" || !parsed.model.trim()) {\n return undefined;\n }\n const selection: ModelSelection = {\n model: parsed.model,\n effort: isReasoningEffort(parsed.effort) ? parsed.effort : \"auto\",\n };\n if (typeof parsed.engine === \"string\") selection.engine = parsed.engine;\n return selection;\n } catch {\n return undefined;\n }\n}\n\nfunction writeStoredModelSelection(key: string, selection: ModelSelection) {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(key, JSON.stringify(selection));\n } catch {}\n}\n\nfunction resolveModelSelection(\n selection: ModelSelection | undefined,\n groups: EngineModelGroup[],\n): ModelSelection | undefined {\n if (!selection?.model) return undefined;\n if (groups.length === 0) {\n const requestedEffort = selection.effort ?? \"auto\";\n const effortOptions = getReasoningEffortOptionsForModel(selection.model);\n return {\n model: selection.model,\n effort:\n requestedEffort === \"auto\" || effortOptions.includes(requestedEffort)\n ? requestedEffort\n : \"auto\",\n };\n }\n const preferredGroup = groups.find(\n (group) =>\n group.engine === selection.engine &&\n group.models.includes(selection.model),\n );\n const fallbackGroup = groups.find((group) =>\n group.models.includes(selection.model),\n );\n if (groups.length > 0 && !preferredGroup && !fallbackGroup) {\n return undefined;\n }\n const engine =\n preferredGroup?.engine ?? fallbackGroup?.engine ?? selection.engine;\n if (!engine && groups.length > 0) return undefined;\n\n const requestedEffort = selection.effort ?? \"auto\";\n const effortOptions = getReasoningEffortOptionsForModel(selection.model);\n const effort =\n requestedEffort === \"auto\" || effortOptions.includes(requestedEffort)\n ? requestedEffort\n : \"auto\";\n const resolved: ModelSelection = { model: selection.model, effort };\n if (engine) resolved.engine = engine;\n return resolved;\n}\n\n// ─── Skeleton Loader ─────────────────────────────────────────────────────────\n\nfunction ChatSkeleton({\n header,\n headerOnly = false,\n}: {\n header?: React.ReactNode;\n headerOnly?: boolean;\n}) {\n return (\n <div\n className={cn(\n \"flex flex-col min-h-0\",\n headerOnly ? \"shrink-0\" : \"flex-1 h-full\",\n )}\n >\n {header ?? (\n <div className=\"flex items-center px-1 py-1 border-b border-border shrink-0 gap-0.5\">\n <div className=\"h-[22px] w-20 rounded-md bg-muted animate-pulse\" />\n <div className=\"ms-auto flex gap-0.5\">\n <div className=\"h-[22px] w-[22px] rounded-md bg-muted animate-pulse\" />\n <div className=\"h-[22px] w-[22px] rounded-md bg-muted animate-pulse\" />\n </div>\n </div>\n )}\n {!headerOnly && (\n <div className=\"flex-1 flex flex-col gap-3 p-4\">\n <div className=\"flex justify-center py-8\">\n <div className=\"h-10 w-10 rounded-full bg-muted animate-pulse\" />\n </div>\n <div className=\"h-3 w-32 rounded bg-muted animate-pulse mx-auto\" />\n </div>\n )}\n </div>\n );\n}\n\n// ─── Scope Badge ─────────────────────────────────────────────────────────────\n\nfunction formatScopeType(type: string) {\n return type.replace(/[-_]+/g, \" \");\n}\n\nfunction indefiniteArticleFor(value: string) {\n return /^[aeiou]/i.test(value.trim()) ? \"an\" : \"a\";\n}\n\nfunction getScopeCopy(scope: ChatThreadScope, isCurrentScope: boolean) {\n const type = formatScopeType(scope.type);\n const fallbackObject = isCurrentScope\n ? `this ${type}`\n : `${indefiniteArticleFor(type)} ${type}`;\n const objectLabel = scope.label || fallbackObject;\n return {\n objectLabel,\n chipLabel:\n scope.label || (isCurrentScope ? `this ${type}` : `${type} context`),\n };\n}\n\n/**\n * Compact context tab above the composer. Click → popover with related chats\n * and the remove-context action. It stays attached to the chat field so scoped\n * context is visible right where the next message will be composed.\n */\nfunction ScopeBadge({\n scope,\n currentScope,\n onDetach,\n otherScopedThreads,\n activeThreadId,\n openTabIds,\n onSelectThread,\n}: {\n scope: ChatThreadScope;\n currentScope?: ChatThreadScope | null;\n onDetach: () => void;\n /** Other threads scoped to the same resource (excluding the active one),\n * pre-sorted most-recent-first. The chip popover lists these so the user\n * can hop between this resource's chats without opening the full history. */\n otherScopedThreads: ChatThreadSummary[];\n activeThreadId: string;\n openTabIds: Set<string>;\n onSelectThread: (id: string) => void;\n}) {\n const [open, setOpen] = useState(false);\n const isCurrentScope = Boolean(\n currentScope &&\n currentScope.type === scope.type &&\n currentScope.id === scope.id,\n );\n const hasDifferentCurrentScope = Boolean(currentScope && !isCurrentScope);\n const { objectLabel, chipLabel } = getScopeCopy(scope, isCurrentScope);\n const heading = `Using ${chipLabel}`;\n const detailSuffix = hasDifferentCurrentScope\n ? \"Start a new chat to use the current page.\"\n : isCurrentScope\n ? \"New chats here keep this context.\"\n : \"Start a new chat for a general conversation.\";\n const otherCount = otherScopedThreads.length;\n return (\n <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\">\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n 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\"\n aria-label={heading}\n >\n <IconLink size={11} className=\"shrink-0 opacity-70\" />\n <span className=\"min-w-0 truncate\">{heading}</span>\n {otherCount > 0 && (\n <span\n className=\"ms-0.5 shrink-0 rounded-full bg-muted px-1.5 py-px text-[10px] leading-none text-muted-foreground\"\n aria-label={`${otherCount} other chats for ${objectLabel}`}\n >\n +{otherCount}\n </span>\n )}\n </button>\n </PopoverTrigger>\n <PopoverContent align=\"center\" side=\"top\" className=\"w-72 p-0\">\n <p className=\"px-3 pt-2 pb-1.5 text-[11px] text-muted-foreground\">\n This chat can see{\" \"}\n <span className=\"text-foreground\">{objectLabel}</span>.{\" \"}\n {detailSuffix}\n </p>\n {otherCount > 0 && (\n <div className=\"border-t border-border\">\n <div className=\"px-3 pt-1.5 pb-1 text-[10px] uppercase tracking-wider text-muted-foreground/70\">\n Chats for {objectLabel}\n </div>\n <div className=\"max-h-56 overflow-y-auto pb-1\">\n {otherScopedThreads.map((thread) =>\n renderThreadRow(\n thread,\n activeThreadId,\n openTabIds,\n formatThreadTime,\n onSelectThread,\n () => setOpen(false),\n ),\n )}\n </div>\n </div>\n )}\n <div className=\"border-t border-border p-1\">\n <button\n type=\"button\"\n onClick={() => {\n setOpen(false);\n onDetach();\n }}\n className=\"flex w-full items-center gap-2 rounded px-2 py-1.5 text-xs text-foreground hover:bg-accent cursor-pointer\"\n >\n <IconLinkOff size={13} />\n <span>Remove context</span>\n </button>\n </div>\n </PopoverContent>\n </Popover>\n </div>\n );\n}\n\n/**\n * Thin confirmation banner shown briefly after detach. The chip itself\n * unmounts the moment scope clears on the active thread, so this banner\n * holds the visual feedback long enough for the user to register what\n * just happened and learn where the chat went (History popover).\n */\nfunction DetachConfirmationBanner() {\n return (\n <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\">\n <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\">\n <IconCheck size={11} className=\"shrink-0 opacity-80\" />\n <span className=\"min-w-0 truncate\">\n Context removed. Find this chat in History.\n </span>\n </span>\n </div>\n );\n}\n\n// ─── History Popover ─────────────────────────────────────────────────────────\n\nfunction formatThreadTime(ts: number): string {\n const d = new Date(ts);\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffDays = Math.floor(diffMs / 86400000);\n if (diffDays === 0)\n return d.toLocaleTimeString([], { hour: \"numeric\", minute: \"2-digit\" });\n if (diffDays === 1) return \"Yesterday\";\n if (diffDays < 7) return d.toLocaleDateString([], { weekday: \"short\" });\n return d.toLocaleDateString([], { month: \"short\", day: \"numeric\" });\n}\n\nfunction renderThreadRow(\n thread: ChatThreadSummary,\n activeThreadId: string | null,\n openTabIds: Set<string>,\n formatTime: (ts: number) => string,\n onSelect: (id: string) => void,\n onClose: () => void,\n) {\n const isActive = thread.id === activeThreadId;\n return (\n <button\n key={thread.id}\n onClick={() => {\n onSelect(thread.id);\n onClose();\n }}\n className={cn(\n \"w-full px-3 py-2 text-start hover:bg-accent/50 cursor-pointer\",\n isActive && \"bg-accent/30\",\n )}\n >\n <div className=\"flex items-baseline justify-between gap-2\">\n <span className=\"text-xs font-medium text-foreground truncate\">\n {thread.title || thread.preview || \"Chat\"}\n </span>\n <span className=\"text-[10px] text-muted-foreground shrink-0\">\n {isActive\n ? \"Active\"\n : openTabIds.has(thread.id)\n ? \"Open\"\n : formatTime(thread.updatedAt)}\n </span>\n </div>\n {thread.preview && thread.title !== thread.preview && (\n <div className=\"text-[11px] text-muted-foreground truncate mt-0.5\">\n {thread.preview}\n </div>\n )}\n {thread.scope?.label && (\n <div className=\"mt-0.5 text-[10px] text-muted-foreground/70 truncate\">\n {thread.scope.label}\n </div>\n )}\n </button>\n );\n}\n\nfunction HistoryPopover({\n threads,\n openTabIds,\n activeThreadId,\n currentScope,\n hasMoreThreads = false,\n isLoadingMoreThreads = false,\n loadError,\n onSelect,\n onClose,\n onLoadMore,\n onSearch,\n}: {\n threads: ChatThreadSummary[];\n openTabIds: Set<string>;\n activeThreadId: string | null;\n currentScope?: ChatThreadScope | null;\n hasMoreThreads?: boolean;\n isLoadingMoreThreads?: boolean;\n loadError?: string | null;\n onSelect: (id: string) => void;\n onClose: () => void;\n onLoadMore?: () => void;\n onSearch?: (query: string) => Promise<ChatThreadSummary[]>;\n}) {\n const [search, setSearch] = useState(\"\");\n const [searchResults, setSearchResults] = useState<\n ChatThreadSummary[] | null\n >(null);\n const [isSearching, setIsSearching] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const debounceRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n useEffect(() => {\n inputRef.current?.focus();\n }, []);\n\n // Debounced server-side search\n const searchIdRef = useRef(0);\n useEffect(() => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n const q = search.trim();\n if (!q) {\n searchIdRef.current++;\n setSearchResults(null);\n setIsSearching(false);\n return;\n }\n setIsSearching(true);\n const id = ++searchIdRef.current;\n debounceRef.current = setTimeout(async () => {\n if (onSearch) {\n const results = await onSearch(q);\n if (id !== searchIdRef.current) return;\n setSearchResults(results);\n } else {\n // Fallback to client-side filtering\n setSearchResults(null);\n }\n setIsSearching(false);\n }, 250);\n return () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n };\n }, [search, onSearch]);\n\n // Hide empty threads from the history list — except the currently-active\n // one. The active thread always belongs in the list so the user can see\n // they're in it (the previous filter dropped a brand-new chat the user\n // had just opened, making them think their chat had vanished).\n const visibleThreads = threads.filter(\n (t) => t.messageCount > 0 || t.id === activeThreadId,\n );\n\n const filtered = search.trim()\n ? (searchResults ?? visibleThreads).filter(\n (t) => t.messageCount > 0 || t.id === activeThreadId,\n )\n : visibleThreads;\n\n // When scope is set we split history into two sections so the user can\n // see \"this deck's chats\" first without losing access to general /\n // other-deck chats. Section labels intentionally use the current\n // resource type (deck/design/dashboard) instead of a generic phrase.\n const sectionedThreads = currentScope\n ? {\n scoped: filtered.filter(\n (t) =>\n t.scope?.type === currentScope.type &&\n t.scope?.id === currentScope.id,\n ),\n other: filtered.filter(\n (t) =>\n !t.scope ||\n t.scope.type !== currentScope.type ||\n t.scope.id !== currentScope.id,\n ),\n }\n : null;\n\n return (\n <Popover open onOpenChange={(open) => !open && onClose()}>\n <PopoverAnchor asChild>\n <span aria-hidden className=\"absolute end-2 top-0 h-px w-px\" />\n </PopoverAnchor>\n <PopoverContent\n align=\"end\"\n side=\"bottom\"\n sideOffset={0}\n onOpenAutoFocus={(event) => {\n event.preventDefault();\n inputRef.current?.focus();\n }}\n className=\"w-72 rounded-lg p-0\"\n >\n <div className=\"flex items-center gap-2 px-3 py-2 border-b border-border\">\n <IconSearch size={13} />\n <input\n ref={inputRef}\n type=\"text\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Search chats...\"\n className=\"flex-1 bg-transparent text-xs text-foreground placeholder:text-muted-foreground outline-none\"\n />\n </div>\n <div className=\"max-h-64 overflow-y-auto py-1\">\n {loadError && !search.trim() ? (\n <div className=\"px-3 py-4 text-xs text-amber-500 text-center\">\n {loadError}\n </div>\n ) : isSearching ? (\n <div className=\"px-3 py-4 text-xs text-muted-foreground text-center\">\n Searching...\n </div>\n ) : filtered.length === 0 ? (\n <div className=\"px-3 py-4 text-xs text-muted-foreground text-center\">\n {search ? \"No matching chats\" : \"No chats yet\"}\n </div>\n ) : sectionedThreads ? (\n <>\n {sectionedThreads.scoped.length > 0 && (\n <>\n <div className=\"px-3 pt-1.5 pb-1 text-[10px] uppercase tracking-wider text-muted-foreground/70\">\n This {currentScope!.type}\n </div>\n {sectionedThreads.scoped.map((thread) =>\n renderThreadRow(\n thread,\n activeThreadId,\n openTabIds,\n formatThreadTime,\n onSelect,\n onClose,\n ),\n )}\n </>\n )}\n {sectionedThreads.other.length > 0 && (\n <>\n <div className=\"px-3 pt-2 pb-1 text-[10px] uppercase tracking-wider text-muted-foreground/70\">\n All chats\n </div>\n {sectionedThreads.other.map((thread) =>\n renderThreadRow(\n thread,\n activeThreadId,\n openTabIds,\n formatThreadTime,\n onSelect,\n onClose,\n ),\n )}\n </>\n )}\n </>\n ) : (\n filtered.map((thread) =>\n renderThreadRow(\n thread,\n activeThreadId,\n openTabIds,\n formatThreadTime,\n onSelect,\n onClose,\n ),\n )\n )}\n {!search.trim() && hasMoreThreads && (\n <button\n type=\"button\"\n onClick={() => onLoadMore?.()}\n disabled={isLoadingMoreThreads}\n className=\"mx-1 mt-1 flex w-[calc(100%-0.5rem)] items-center justify-center rounded-md px-3 py-2 text-xs text-muted-foreground hover:bg-accent hover:text-foreground disabled:cursor-default disabled:opacity-60\"\n >\n {isLoadingMoreThreads ? \"Loading...\" : \"Load older chats\"}\n </button>\n )}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\n// ─── Help Popover ────────────────────────────────────────────────────────────\n\nfunction HelpPopover({ onClose }: { onClose: () => void }) {\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [onClose]);\n\n const commands = [\n {\n name: \"/clear\",\n description: \"Start a new chat (keeps current chat in history)\",\n },\n { name: \"/new\", description: \"Same as /clear\" },\n { name: \"/history\", description: \"Browse all chats\" },\n { name: \"/plan\", description: \"Switch to read-only planning\" },\n { name: \"/act\", description: \"Switch back to acting\" },\n { name: \"/help\", description: \"Show this list of commands\" },\n { name: \"@\", description: \"Mention files, agents, or resources\" },\n ];\n\n return (\n <>\n <div className=\"fixed inset-0 z-40\" onClick={onClose} />\n <div className=\"absolute end-2 top-0 z-50 w-72 rounded-lg border border-border bg-popover shadow-lg\">\n <div className=\"flex items-center justify-between px-3 py-2 border-b border-border\">\n <span className=\"text-xs font-medium text-foreground\">\n Available Commands\n </span>\n <button\n onClick={onClose}\n aria-label=\"Close help\"\n className=\"flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground\"\n >\n <IconX size={12} />\n </button>\n </div>\n <div className=\"py-1\">\n {commands.map((cmd) => (\n <div key={cmd.name} className=\"px-3 py-1.5\">\n <div className=\"text-xs font-medium text-foreground\">\n {cmd.name}\n </div>\n <div className=\"text-[11px] text-muted-foreground\">\n {cmd.description}\n </div>\n </div>\n ))}\n </div>\n </div>\n </>\n );\n}\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport interface ChatTab {\n id: string;\n label: string;\n status: \"idle\" | \"running\" | \"completed\";\n /** If this tab is a sub-agent, the parent thread ID */\n parentThreadId?: string;\n /** Short name for sub-agent tabs (e.g. \"Research\", \"Draft email\") */\n subAgentName?: string;\n}\n\ntype AgentTeamRunStatus =\n | \"queued\"\n | \"running\"\n | \"paused\"\n | \"needs-approval\"\n | \"completed\"\n | \"errored\"\n | \"unknown\";\n\ninterface AgentTeamRunSummary {\n title?: string;\n status?: AgentTeamRunStatus;\n sourceRecord?: {\n type?: string;\n threadId?: unknown;\n parentThreadId?: unknown;\n name?: unknown;\n };\n metadata?: Record<string, unknown>;\n}\n\ninterface AgentTeamTabInfo {\n threadId: string;\n parentThreadId: string;\n name: string;\n status: AgentTeamRunStatus;\n}\n\nfunction readString(value: unknown): string {\n return typeof value === \"string\" ? value.trim() : \"\";\n}\n\nfunction requestModeFromExecMode(\n value: AssistantChatProps[\"execMode\"],\n): \"act\" | \"plan\" | undefined {\n if (value === \"plan\") return \"plan\";\n if (value === \"build\") return \"act\";\n return undefined;\n}\n\nfunction isActiveAgentTeamStatus(status?: AgentTeamRunStatus): boolean {\n return (\n status === \"queued\" ||\n status === \"running\" ||\n status === \"paused\" ||\n status === \"needs-approval\"\n );\n}\n\nfunction chatTabStatusFromAgentTeamStatus(\n status?: AgentTeamRunStatus,\n): ChatTab[\"status\"] | undefined {\n if (!status) return undefined;\n return isActiveAgentTeamStatus(status) ? \"running\" : \"completed\";\n}\n\nconst STALE_THREAD_THRESHOLD_MS = 12 * 60 * 60 * 1000;\nconst DEFAULT_THREAD_URL_PARAM = \"thread\";\nconst THREAD_URL_CHANGED_EVENT = \"agent-chat:url-thread-changed\";\nconst hasOwn = Object.prototype.hasOwnProperty;\n\n// The history patch is installed once and shared via a ref count so that\n// multiple synced chats (or a remount) don't restore a stale `pushState`\n// reference and silently drop a wrapper installed by another instance.\nlet historyPatchRefCount = 0;\nlet restoreHistoryPatch: (() => void) | null = null;\n\nfunction installHistoryThreadUrlPatch(): () => void {\n if (typeof window === \"undefined\") return () => {};\n historyPatchRefCount += 1;\n if (historyPatchRefCount === 1) {\n const originalPushState = window.history.pushState;\n const originalReplaceState = window.history.replaceState;\n const dispatchUrlChange = () => {\n window.dispatchEvent(new Event(THREAD_URL_CHANGED_EVENT));\n };\n window.history.pushState = function pushState(...args) {\n const result = originalPushState.apply(this, args);\n dispatchUrlChange();\n return result;\n };\n window.history.replaceState = function replaceState(...args) {\n const result = originalReplaceState.apply(this, args);\n dispatchUrlChange();\n return result;\n };\n restoreHistoryPatch = () => {\n window.history.pushState = originalPushState;\n window.history.replaceState = originalReplaceState;\n };\n }\n return () => {\n historyPatchRefCount = Math.max(0, historyPatchRefCount - 1);\n if (historyPatchRefCount === 0) {\n restoreHistoryPatch?.();\n restoreHistoryPatch = null;\n }\n };\n}\n\nexport interface ChatThreadUrlSyncOptions {\n /** Query-string parameter used by the generic URL adapter. Default: `thread`. */\n paramName?: string;\n /**\n * Route-owned thread id. Pass `null` for the create route and a string for\n * thread routes like `/chat/:threadId`.\n */\n routeThreadId?: string | null;\n /** Build the URL path for a thread id, or for create mode when id is null. */\n getPath?: (threadId: string | null) => string;\n /** Optional router navigation callback used with `getPath`. */\n navigate?: (path: string, options?: { replace?: boolean }) => void;\n}\n\nfunction normalizeUrlThreadId(value: string | null | undefined): string | null {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n return trimmed || null;\n}\n\nfunction resolveThreadUrlSync(\n value: MultiTabAssistantChatProps[\"threadUrlSync\"],\n): {\n enabled: boolean;\n paramName: string;\n routeThreadId?: string | null;\n getPath?: (threadId: string | null) => string;\n navigate?: (path: string, options?: { replace?: boolean }) => void;\n} {\n if (!value) return { enabled: false, paramName: DEFAULT_THREAD_URL_PARAM };\n if (value === true) {\n return { enabled: true, paramName: DEFAULT_THREAD_URL_PARAM };\n }\n return {\n enabled: true,\n paramName: value.paramName?.trim() || DEFAULT_THREAD_URL_PARAM,\n ...(hasOwn.call(value, \"routeThreadId\")\n ? { routeThreadId: normalizeUrlThreadId(value.routeThreadId) }\n : {}),\n ...(value.getPath ? { getPath: value.getPath } : {}),\n ...(value.navigate ? { navigate: value.navigate } : {}),\n };\n}\n\nfunction readUrlThreadId(paramName: string): string | null {\n if (typeof window === \"undefined\") return null;\n try {\n const params = new URLSearchParams(window.location.search);\n return normalizeUrlThreadId(\n params.get(paramName) ??\n (paramName === DEFAULT_THREAD_URL_PARAM\n ? params.get(\"threadId\")\n : null),\n );\n } catch {\n return null;\n }\n}\n\nfunction runToAgentTeamTabInfo(\n run: AgentTeamRunSummary,\n): AgentTeamTabInfo | null {\n if (run.sourceRecord?.type && run.sourceRecord.type !== \"agent-team-task\") {\n return null;\n }\n const metadata = run.metadata ?? {};\n const threadId =\n readString(run.sourceRecord?.threadId) || readString(metadata.threadId);\n const parentThreadId =\n readString(run.sourceRecord?.parentThreadId) ||\n readString(metadata.parentThreadId);\n if (!threadId || !parentThreadId || threadId === parentThreadId) return null;\n const name =\n readString(run.sourceRecord?.name) ||\n readString(metadata.name) ||\n readString(run.title) ||\n \"Sub-agent\";\n return {\n threadId,\n parentThreadId,\n name,\n status: run.status ?? \"unknown\",\n };\n}\n\nexport interface MultiTabAssistantChatHeaderProps {\n tabs: ChatTab[];\n activeTabId: string;\n activeTabMessageCount: number;\n setActiveTabId: (tabId: string) => void;\n addTab: () => void;\n closeTab: (tabId: string) => void;\n closeOtherTabs: (tabId: string) => void;\n closeAllTabs: () => void;\n clearActiveTab: () => void;\n /** Open the history popover */\n showHistory?: boolean;\n toggleHistory?: () => void;\n /** Number of open tabs (useful for triggering scroll on tab count change) */\n tabCount: number;\n}\n\n// ─── Component ──────────────────────────────────────────────────────────────\n\nexport type MultiTabAssistantChatProps = Omit<\n AssistantChatProps,\n \"tabId\" | \"threadId\"\n> & {\n /** Show the tab bar. Default: true */\n showTabBar?: boolean;\n /** Optional custom single-row header renderer */\n renderHeader?: (props: MultiTabAssistantChatHeaderProps) => React.ReactNode;\n /** Optional overlay actions renderer for the active tab */\n renderOverlay?: (props: MultiTabAssistantChatHeaderProps) => React.ReactNode;\n /** Hide the chat content while keeping the header visible. Used when CLI/resources mode is active. */\n contentHidden?: boolean;\n /** Namespace for localStorage keys — used to isolate chat state per app in the frame. */\n storageKey?: string;\n /** Restore the previously active thread and open tabs from localStorage. */\n restoreActiveThread?: boolean;\n /** Stable browser tab id used for tab-scoped app-state context. */\n browserTabId?: string;\n /**\n * Keep the active thread in URL state. `true` uses the generic `?thread=id`\n * adapter; passing `routeThreadId` + `getPath` lets an app bind chats to\n * route params such as `/chat/:threadId`.\n */\n threadUrlSync?: boolean | ChatThreadUrlSyncOptions;\n /**\n * Bind new chats to a resource (deck, design, dashboard, etc.). When set,\n * new chats automatically inherit this scope and scoped chats tuck away when\n * the user leaves the resource. General chats remain visible across resource\n * navigation, and the user can detach a scoped chat via the scope chip above\n * the composer.\n */\n scope?: ChatThreadScope | null;\n /** Show the compact scope chip above the composer. Default: true. */\n showScopeBadge?: boolean;\n};\n\nexport function MultiTabAssistantChat({\n showTabBar = true,\n renderHeader,\n renderOverlay,\n contentHidden = false,\n apiUrl = agentNativePath(\"/_agent-native/agent-chat\"),\n storageKey,\n restoreActiveThread = true,\n browserTabId,\n threadUrlSync = false,\n scope = null,\n showScopeBadge = true,\n ...props\n}: MultiTabAssistantChatProps) {\n const {\n enabled: threadUrlSyncEnabled,\n paramName: threadUrlParamName,\n routeThreadId,\n getPath: getThreadPath,\n navigate: navigateThreadUrl,\n } = resolveThreadUrlSync(threadUrlSync);\n const threadRouteControlsActiveThread =\n threadUrlSyncEnabled &&\n threadUrlSync !== true &&\n typeof threadUrlSync === \"object\" &&\n hasOwn.call(threadUrlSync, \"routeThreadId\");\n const [urlThreadId, setUrlThreadId] = useState<string | null>(() =>\n threadUrlSyncEnabled\n ? threadRouteControlsActiveThread\n ? (routeThreadId ?? null)\n : readUrlThreadId(threadUrlParamName)\n : null,\n );\n const urlThreadIdRef = useRef(urlThreadId);\n urlThreadIdRef.current = urlThreadId;\n\n useEffect(() => {\n if (!threadUrlSyncEnabled || threadRouteControlsActiveThread) return;\n const update = () => setUrlThreadId(readUrlThreadId(threadUrlParamName));\n const uninstallHistoryPatch = installHistoryThreadUrlPatch();\n update();\n window.addEventListener(\"popstate\", update);\n window.addEventListener(THREAD_URL_CHANGED_EVENT, update);\n return () => {\n uninstallHistoryPatch();\n window.removeEventListener(\"popstate\", update);\n window.removeEventListener(THREAD_URL_CHANGED_EVENT, update);\n };\n }, [\n threadRouteControlsActiveThread,\n threadUrlParamName,\n threadUrlSyncEnabled,\n ]);\n\n useEffect(() => {\n if (!threadUrlSyncEnabled || !threadRouteControlsActiveThread) return;\n setUrlThreadId(routeThreadId ?? null);\n }, [routeThreadId, threadRouteControlsActiveThread, threadUrlSyncEnabled]);\n\n const writeThreadUrl = useCallback(\n (threadId: string | null, options: { replace?: boolean } = {}): void => {\n if (!threadUrlSyncEnabled || typeof window === \"undefined\") return;\n try {\n const normalizedThreadId = normalizeUrlThreadId(threadId);\n let next: string;\n if (getThreadPath) {\n next = getThreadPath(normalizedThreadId);\n } else {\n const url = new URL(window.location.href);\n if (normalizedThreadId) {\n url.searchParams.set(threadUrlParamName, normalizedThreadId);\n } else {\n url.searchParams.delete(threadUrlParamName);\n }\n if (threadUrlParamName !== \"threadId\") {\n url.searchParams.delete(\"threadId\");\n }\n next = `${url.pathname}${url.search}${url.hash}`;\n }\n const current = `${window.location.pathname}${window.location.search}${window.location.hash}`;\n if (next === current) {\n setUrlThreadId(normalizedThreadId);\n return;\n }\n if (getThreadPath && navigateThreadUrl) {\n navigateThreadUrl(next, { replace: options.replace === true });\n setUrlThreadId(normalizedThreadId);\n return;\n }\n const method = options.replace ? \"replaceState\" : \"pushState\";\n // `getThreadPath` returns a router-local path (no app basename). When we\n // fall back to the raw History API instead of a router navigate, resolve\n // the basename so deep-link reloads work in mounted apps.\n const historyTarget = getThreadPath ? appPath(next) : next;\n window.history[method](window.history.state, \"\", historyTarget);\n setUrlThreadId(normalizedThreadId);\n window.dispatchEvent(new Event(THREAD_URL_CHANGED_EVENT));\n const popstate =\n typeof PopStateEvent === \"function\"\n ? new PopStateEvent(\"popstate\", { state: window.history.state })\n : new Event(\"popstate\");\n window.dispatchEvent(popstate);\n } catch {}\n },\n [\n getThreadPath,\n navigateThreadUrl,\n threadUrlParamName,\n threadUrlSyncEnabled,\n ],\n );\n\n const {\n threads,\n activeThreadId,\n isLoading,\n createThread,\n switchThread: switchThreadState,\n detachThread,\n forkThread,\n saveThreadData,\n generateTitle,\n searchThreads,\n loadMoreThreads,\n refreshThreads,\n hasMoreThreads,\n isLoadingMoreThreads,\n threadsLoadError,\n isNewThread,\n } = useChatThreads(apiUrl, storageKey, scope, {\n restoreActiveThread,\n routeThreadId: threadUrlSyncEnabled ? urlThreadId : undefined,\n });\n\n const switchThread = useCallback(\n (threadId: string, options: { replace?: boolean } = {}) => {\n switchThreadState(threadId);\n writeThreadUrl(threadId, options);\n },\n [switchThreadState, writeThreadUrl],\n );\n\n // Namespace all localStorage keys by storageKey when provided (for per-app isolation in frame)\n const keyPrefix = storageKey ? `:${storageKey}` : \"\";\n const modelSelectionKey = `${MODEL_SELECTION_STORAGE_KEY}${keyPrefix}`;\n\n // Track which tabs have been focused at least once (lazy mount for sub-agent tabs)\n const mountedTabsRef = useRef<Set<string>>(new Set());\n const activeThreadIdRef = useRef(activeThreadId);\n activeThreadIdRef.current = activeThreadId;\n // Mark the active tab as mounted so it persists when switched away\n if (activeThreadId) mountedTabsRef.current.add(activeThreadId);\n const chatRefs = useRef<Map<string, AssistantChatHandle>>(new Map());\n // Sends queued until their target thread is ready (see PendingDelivery).\n const pendingDeliveries = useRef<PendingDelivery[]>([]);\n const pendingContextItems = useRef<Map<string, AgentChatContextItem[]>>(\n new Map(),\n );\n const [runningThreads, setRunningThreads] = useState<Set<string>>(new Set());\n const [showHistory, setShowHistory] = useState(false);\n const newThreadIds = useRef<Set<string>>(new Set());\n\n // ─── Model state ─────────────────────────────────────────────────────────\n const [availableModels, setAvailableModels] = useState<EngineModelGroup[]>(\n [],\n );\n const [defaultModel, setDefaultModel] = useState<string>(DEFAULT_MODEL);\n const threadModelRef = useRef<\n Map<string, { model: string; engine?: string; effort?: ReasoningEffort }>\n >(new Map());\n const [persistedModelSelection, setPersistedModelSelection] = useState<\n ModelSelection | undefined\n >(() => readStoredModelSelection(modelSelectionKey));\n const [modelSelectionVersion, setModelSelectionVersion] = useState(0);\n\n useEffect(() => {\n setPersistedModelSelection(readStoredModelSelection(modelSelectionKey));\n }, [modelSelectionKey]);\n\n const bumpModelSelectionVersion = useCallback(() => {\n setModelSelectionVersion((version) => version + 1);\n }, []);\n const postMessageSubmissionsDisabled = props.composerDisabled === true;\n\n const setContextInTab = useCallback(\n (\n threadId: string,\n item: AgentChatContextItem,\n options?: { focus?: boolean },\n ) => {\n const ref = chatRefs.current.get(threadId);\n if (ref) {\n ref.setComposerContextItem(item, options);\n return;\n }\n const existing = pendingContextItems.current.get(threadId) ?? [];\n const index = existing.findIndex((current) => current.key === item.key);\n const next =\n index === -1\n ? [...existing, item]\n : existing.map((current, currentIndex) =>\n currentIndex === index ? item : current,\n );\n pendingContextItems.current.set(threadId, next);\n },\n [],\n );\n\n const removeContextInTab = useCallback((threadId: string, key: string) => {\n const ref = chatRefs.current.get(threadId);\n if (ref) {\n ref.removeComposerContextItem(key);\n return;\n }\n const existing = pendingContextItems.current.get(threadId);\n if (!existing) return;\n const next = existing.filter((item) => item.key !== key);\n if (next.length === 0) {\n pendingContextItems.current.delete(threadId);\n } else {\n pendingContextItems.current.set(threadId, next);\n }\n }, []);\n\n const clearContextInTab = useCallback((threadId: string) => {\n const ref = chatRefs.current.get(threadId);\n if (ref) {\n ref.clearComposerContextItems();\n return;\n }\n pendingContextItems.current.delete(threadId);\n }, []);\n\n const resolveThreadModelSelection = useCallback(\n (threadId: string) =>\n resolveModelSelection(\n threadModelRef.current.get(threadId) ?? persistedModelSelection,\n availableModels,\n ),\n [availableModels, persistedModelSelection, modelSelectionVersion],\n );\n\n const persistModelSelection = useCallback(\n (selection: ModelSelection) => {\n setPersistedModelSelection(selection);\n writeStoredModelSelection(modelSelectionKey, selection);\n },\n [modelSelectionKey],\n );\n\n const handleModelChange = useCallback(\n (model: string, engine: string) => {\n const threadId = activeThreadIdRef.current;\n if (!threadId) return;\n const existing = threadModelRef.current.get(threadId);\n const existingEffort = existing?.effort ?? \"auto\";\n const effortOptions = getReasoningEffortOptionsForModel(model);\n const effort =\n existingEffort === \"auto\" || effortOptions.includes(existingEffort)\n ? existingEffort\n : \"auto\";\n const selection = { model, engine, effort };\n threadModelRef.current.set(threadId, selection);\n persistModelSelection(selection);\n bumpModelSelectionVersion();\n },\n [bumpModelSelectionVersion, persistModelSelection],\n );\n\n const handleEffortChange = useCallback(\n (effort: ReasoningEffort) => {\n const threadId = activeThreadIdRef.current;\n if (!threadId) return;\n const existing = resolveThreadModelSelection(threadId);\n const model = existing?.model ?? defaultModel;\n const engine =\n existing?.engine ??\n availableModels.find((group) => group.models.includes(model))?.engine ??\n availableModels[0]?.engine;\n const selection: ModelSelection = { model, effort };\n if (engine) selection.engine = engine;\n threadModelRef.current.set(threadId, selection);\n persistModelSelection(selection);\n bumpModelSelectionVersion();\n },\n [\n availableModels,\n bumpModelSelectionVersion,\n defaultModel,\n persistModelSelection,\n resolveThreadModelSelection,\n ],\n );\n\n const refreshEngines = useCallback(() => {\n Promise.all([\n callAction(\"manage-agent-engine\" as any, { action: \"list\" } as any).catch(\n () => null,\n ),\n fetch(agentNativePath(\"/_agent-native/env-status\"))\n .then((r) => (r.ok ? r.json() : []))\n .catch(() => []),\n fetch(agentNativePath(\"/_agent-native/builder/status\"))\n .then((r) => (r.ok ? r.json() : null))\n .catch(() => null),\n ])\n .then(([enginesData, envKeys, builderStatus]) => {\n if (!enginesData?.engines) return;\n const configuredKeys = new Set(\n (envKeys as Array<{ key: string; configured: boolean }>)\n .filter((k) => k.configured)\n .map((k) => k.key),\n );\n const builderConnected = builderStatus?.configured === true;\n const currentEngineName: string | undefined =\n enginesData.current?.engine;\n const currentModel: string | undefined = enginesData.current?.model;\n\n const groups = buildChatModelGroups({\n engines: enginesData.engines,\n configuredKeys,\n builderConnected,\n currentEngineName,\n currentModel,\n });\n setAvailableModels(groups);\n setDefaultModel(currentModel ?? DEFAULT_MODEL);\n })\n .catch(() => {});\n }, []);\n\n useEffect(() => {\n refreshEngines();\n window.addEventListener(\"agent-engine:configured-changed\", refreshEngines);\n return () =>\n window.removeEventListener(\n \"agent-engine:configured-changed\",\n refreshEngines,\n );\n }, [refreshEngines]);\n\n // Parent-child thread mapping — persisted to localStorage.\n // Maps childThreadId → parentThreadId for sub-agent tabs.\n const PARENT_MAP_KEY = `agent-chat-parent-map${keyPrefix}`;\n const [parentMap, setParentMap] = useState<Record<string, string>>(() => {\n try {\n const saved = localStorage.getItem(PARENT_MAP_KEY);\n if (saved) return JSON.parse(saved);\n } catch {}\n return {};\n });\n const parentMapRef = useRef(parentMap);\n parentMapRef.current = parentMap;\n const dismissedSubAgentTabsRef = useRef<Set<string>>(new Set());\n\n // Persist parent map to localStorage\n useEffect(() => {\n try {\n localStorage.setItem(PARENT_MAP_KEY, JSON.stringify(parentMap));\n } catch {}\n }, [parentMap, PARENT_MAP_KEY]);\n\n // Sub-agent display names — persisted to localStorage.\n // Maps childThreadId → short name (e.g. \"Research\", \"Draft email\").\n const SUB_AGENT_NAMES_KEY = `agent-chat-sub-agent-names${keyPrefix}`;\n const [subAgentNames, setSubAgentNames] = useState<Record<string, string>>(\n () => {\n try {\n const saved = localStorage.getItem(SUB_AGENT_NAMES_KEY);\n if (saved) return JSON.parse(saved);\n } catch {}\n return {};\n },\n );\n const subAgentNamesRef = useRef(subAgentNames);\n subAgentNamesRef.current = subAgentNames;\n const [subAgentStatuses, setSubAgentStatuses] = useState<\n Record<string, AgentTeamRunStatus>\n >({});\n\n useEffect(() => {\n try {\n localStorage.setItem(SUB_AGENT_NAMES_KEY, JSON.stringify(subAgentNames));\n } catch {}\n }, [subAgentNames, SUB_AGENT_NAMES_KEY]);\n\n // Open tabs — persisted to localStorage so they survive refresh.\n // Per-scope: when scope changes (e.g. user navigates from Deck A to Deck\n // B), the tab bar reflects whichever tabs they had open for *that*\n // resource. We do not bleed deck A's tabs into deck B's view.\n const scopeKeyPart = scope ? `:scope:${scope.type}:${scope.id}` : \"\";\n const OPEN_TABS_KEY = `agent-chat-open-tabs${keyPrefix}${scopeKeyPart}`;\n const [openTabIds, setOpenTabIds] = useState<string[]>(() => {\n if (!restoreActiveThread && activeThreadId) {\n for (const id of [activeThreadId]) mountedTabsRef.current.add(id);\n return [activeThreadId];\n }\n try {\n const saved = localStorage.getItem(OPEN_TABS_KEY);\n if (saved) {\n const parsed = JSON.parse(saved);\n if (Array.isArray(parsed) && parsed.length > 0) {\n // Mark restored tabs as mounted\n for (const id of parsed) mountedTabsRef.current.add(id);\n return parsed;\n }\n }\n } catch {}\n return [];\n });\n const openTabIdsRef = useRef(openTabIds);\n openTabIdsRef.current = openTabIds;\n const initializedRef = useRef(false);\n\n // Rehydrate open tabs when the scope flips. Mirrors `persistedKeyRef` in\n // `useChatThreads`: on a scope change we need to read the new key BEFORE\n // the persistence effect writes the current (now-wrong) tab list under\n // that new key.\n const openTabsKeyRef = useRef(OPEN_TABS_KEY);\n useEffect(() => {\n if (openTabsKeyRef.current === OPEN_TABS_KEY) return;\n openTabsKeyRef.current = OPEN_TABS_KEY;\n initializedRef.current = false;\n if (!restoreActiveThread) {\n setOpenTabIds(activeThreadId ? [activeThreadId] : []);\n return;\n }\n try {\n const saved = localStorage.getItem(OPEN_TABS_KEY);\n if (saved) {\n const parsed = JSON.parse(saved);\n if (Array.isArray(parsed)) {\n for (const id of parsed) mountedTabsRef.current.add(id);\n setOpenTabIds(parsed);\n return;\n }\n }\n } catch {}\n setOpenTabIds([]);\n }, [OPEN_TABS_KEY, activeThreadId, restoreActiveThread]);\n\n // Look up the active thread's actual scope from the list — when the\n // user opens a chat from history that was scoped to a different\n // resource, the badge should advertise that thread's binding, not\n // necessarily the resource currently in the viewport. When the thread\n // and the live prop refer to the same resource, prefer the prop's\n // label so a rename or a deferred deck-title load shows up in the UI\n // without waiting on the next persistence cycle.\n const activeThreadScope = useMemo<ChatThreadScope | null>(() => {\n if (!activeThreadId) return null;\n const t = threads.find((x) => x.id === activeThreadId);\n const stored = t?.scope ?? null;\n if (!stored) return null;\n if (scope && stored.type === scope.type && stored.id === scope.id) {\n return { ...stored, label: scope.label || stored.label };\n }\n return stored;\n }, [threads, activeThreadId, scope?.type, scope?.id, scope?.label]);\n\n // Brief confirmation banner shown after detach. The chip itself disappears\n // the instant scope clears, which the user described as \"nothing different\n // happened.\" We hold the confirmation in the same slot for ~2s so the\n // detach is visually acknowledged and the user is pointed at History.\n const [detachConfirmType, setDetachConfirmType] = useState<string | null>(\n null,\n );\n const detachTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n useEffect(() => {\n return () => {\n if (detachTimerRef.current) clearTimeout(detachTimerRef.current);\n };\n }, []);\n const handleDetachActiveThread = useCallback(() => {\n if (!activeThreadId || !activeThreadScope) return;\n const type = activeThreadScope.type;\n setDetachConfirmType(type);\n if (detachTimerRef.current) clearTimeout(detachTimerRef.current);\n detachTimerRef.current = setTimeout(() => setDetachConfirmType(null), 2200);\n detachThread(activeThreadId);\n }, [activeThreadId, activeThreadScope, detachThread]);\n\n // Other chats scoped to the active thread's resource (excluding the active\n // thread itself). Sorted most-recent-first to match user expectation in the\n // chip popover and empty-state addon.\n const otherScopedThreads = useMemo<ChatThreadSummary[]>(() => {\n if (!activeThreadScope) return [];\n return threads\n .filter(\n (t) =>\n t.id !== activeThreadId &&\n t.scope?.type === activeThreadScope.type &&\n t.scope?.id === activeThreadScope.id,\n )\n .sort((a, b) => b.updatedAt - a.updatedAt);\n }, [threads, activeThreadId, activeThreadScope]);\n\n // Persist open tab IDs to localStorage (exclude sub-agent tabs — they're session-only)\n useEffect(() => {\n if (openTabsKeyRef.current !== OPEN_TABS_KEY) return;\n const mainTabs = openTabIds.filter((id) => !parentMap[id]);\n if (mainTabs.length > 0) {\n try {\n localStorage.setItem(OPEN_TABS_KEY, JSON.stringify(mainTabs));\n } catch {}\n }\n }, [openTabIds, parentMap, OPEN_TABS_KEY]);\n\n // Initialize open tabs once threads load — validate saved tabs still exist\n useEffect(() => {\n if (initializedRef.current || !activeThreadId || threads.length === 0)\n return;\n initializedRef.current = true;\n const threadIds = new Set(threads.map((t) => t.id));\n const threadMap = new Map(threads.map((t) => [t.id, t]));\n\n // Hide tabs that have had no activity for more than 12 hours. Stale tabs\n // are removed from the sidebar on load but remain accessible via history.\n const now = Date.now();\n const isStale = (id: string) => {\n const thread = threadMap.get(id);\n return thread\n ? now - thread.updatedAt > STALE_THREAD_THRESHOLD_MS\n : false;\n };\n\n // If the active thread is a sub-agent, switch to its parent or the most recent main thread\n if (parentMap[activeThreadId]) {\n const parent = parentMap[activeThreadId];\n if (parent && threadIds.has(parent)) {\n switchThread(parent);\n } else {\n // Fall back to most recent main thread\n const mainThread = threads.find((t) => !parentMap[t.id]);\n if (mainThread) switchThread(mainThread.id);\n }\n }\n\n setOpenTabIds((prev) => {\n // Filter out tabs that no longer exist, sub-agent tabs, or stale tabs (>12h inactive)\n const valid = prev.filter(\n (id) => threadIds.has(id) && !parentMap[id] && !isStale(id),\n );\n // Ensure active thread is included (only if it's not a sub-agent and not stale)\n if (\n !parentMap[activeThreadId] &&\n !valid.includes(activeThreadId) &&\n !isStale(activeThreadId)\n ) {\n valid.push(activeThreadId);\n }\n return valid;\n });\n\n // If active thread is stale, start fresh\n if (!parentMap[activeThreadId] && isStale(activeThreadId)) {\n createThread().then((id) => {\n if (id) writeThreadUrl(null);\n });\n }\n }, [\n activeThreadId,\n threads,\n parentMap,\n switchThread,\n createThread,\n writeThreadUrl,\n ]);\n\n // Ensure active thread is always in open tabs.\n // Use functional update to check inside the setter — avoids race with the\n // initialization effect that may have already added the ID in the same batch.\n //\n // Scoped navigation can reset openTabIds from a different localStorage key\n // without changing activeThreadId. Re-check after tab-list resets so the\n // sidebar cannot end up with a live active thread but no mounted chat.\n useEffect(() => {\n if (!activeThreadId || openTabIds.includes(activeThreadId)) return;\n if (parentMap[activeThreadId]) return;\n\n const activeThread = threads.find((thread) => thread.id === activeThreadId);\n if (\n activeThread &&\n Date.now() - activeThread.updatedAt > STALE_THREAD_THRESHOLD_MS\n ) {\n return;\n }\n\n setOpenTabIds((prev) =>\n prev.includes(activeThreadId) ? prev : [...prev, activeThreadId],\n );\n }, [activeThreadId, openTabIds, parentMap, threads]);\n\n // Ensure at least one tab is always open — auto-create if sidebar is empty.\n // Skipped when an active thread already exists (e.g. the hook generated an\n // optimistic id for a brand-new session); the activeThreadId effect above\n // adds it to openTabIds without spinning up a duplicate thread.\n const autoCreatingRef = useRef(false);\n useEffect(() => {\n if (isLoading || autoCreatingRef.current) return;\n if (openTabIds.length === 0 && !activeThreadId) {\n autoCreatingRef.current = true;\n createThread().then((id) => {\n autoCreatingRef.current = false;\n if (id) {\n newThreadIds.current.add(id);\n setOpenTabIds([id]);\n writeThreadUrl(null, { replace: true });\n }\n });\n }\n }, [isLoading, openTabIds, activeThreadId, createThread, writeThreadUrl]);\n\n useEffect(() => {\n let stopped = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n const runsUrl = `${apiUrl.replace(/\\/$/, \"\")}/runs/list?goalId=agent-team`;\n\n async function hydrateAgentTeamTabs() {\n try {\n const res = await fetch(runsUrl);\n if (res.ok) {\n const data = (await res.json()) as { runs?: AgentTeamRunSummary[] };\n const infos = Array.isArray(data.runs)\n ? data.runs\n .map(runToAgentTeamTabInfo)\n .filter((info): info is AgentTeamTabInfo => Boolean(info))\n : [];\n\n setSubAgentStatuses((prev) => {\n let changed = false;\n const next: Record<string, AgentTeamRunStatus> = {};\n for (const info of infos) {\n next[info.threadId] = info.status;\n if (prev[info.threadId] !== info.status) changed = true;\n }\n if (Object.keys(prev).length !== Object.keys(next).length) {\n changed = true;\n }\n return changed ? next : prev;\n });\n\n const openSet = new Set(openTabIdsRef.current);\n const candidates = infos.filter(\n (info) =>\n !dismissedSubAgentTabsRef.current.has(info.threadId) &&\n (openSet.has(info.parentThreadId) || openSet.has(info.threadId)),\n );\n\n if (candidates.length > 0) {\n const shouldRefreshThreads = candidates.some(\n (info) =>\n !openSet.has(info.threadId) && openSet.has(info.parentThreadId),\n );\n const candidateParents = new Map(\n candidates.map((info) => [info.threadId, info.parentThreadId]),\n );\n setParentMap((prev) => {\n let next = prev;\n for (const info of candidates) {\n if (next[info.threadId] === info.parentThreadId) continue;\n next =\n next === prev\n ? { ...prev, [info.threadId]: info.parentThreadId }\n : { ...next, [info.threadId]: info.parentThreadId };\n }\n return next;\n });\n setSubAgentNames((prev) => {\n let next = prev;\n for (const info of candidates) {\n if (!info.name || next[info.threadId] === info.name) continue;\n next =\n next === prev\n ? { ...prev, [info.threadId]: info.name }\n : { ...next, [info.threadId]: info.name };\n }\n return next;\n });\n\n setOpenTabIds((prev) => {\n let next = prev;\n for (const info of candidates) {\n if (next.includes(info.threadId)) continue;\n const parentIdx = next.indexOf(info.parentThreadId);\n if (parentIdx === -1) continue;\n if (next === prev) next = [...prev];\n let insertIdx = parentIdx + 1;\n while (insertIdx < next.length) {\n const siblingParent =\n parentMapRef.current[next[insertIdx]] ||\n candidateParents.get(next[insertIdx]);\n if (siblingParent !== info.parentThreadId) break;\n insertIdx++;\n }\n next.splice(insertIdx, 0, info.threadId);\n }\n return next;\n });\n if (shouldRefreshThreads) {\n refreshThreads();\n }\n }\n }\n } catch {\n // Best effort: task cards and manual history still work if this poll fails.\n } finally {\n if (!stopped) {\n timer = setTimeout(hydrateAgentTeamTabs, 3000);\n }\n }\n }\n\n hydrateAgentTeamTabs();\n return () => {\n stopped = true;\n if (timer) clearTimeout(timer);\n };\n }, [apiUrl, refreshThreads]);\n\n // Focus the composer when switching tabs\n useEffect(() => {\n if (!activeThreadId) return;\n // Small delay to ensure the tab is visible before focusing\n const t = setTimeout(() => {\n chatRefs.current.get(activeThreadId)?.focusComposer();\n }, 50);\n return () => clearTimeout(t);\n }, [activeThreadId]);\n\n // Ref callback: scroll the active tab into view in the overflow container.\n // Uses getBoundingClientRect for reliable positioning regardless of offsetParent.\n // A margin keeps the active tab from sitting flush against either container\n // edge — at the right edge it was landing directly under the +/history/menu\n // buttons, which visually clipped the tab label.\n const activeTabRefCb = useCallback((el: HTMLElement | null) => {\n if (!el) return;\n const container = el.parentElement;\n if (!container) return;\n const MARGIN = 24;\n requestAnimationFrame(() => {\n const containerRect = container.getBoundingClientRect();\n const tabRect = el.getBoundingClientRect();\n if (tabRect.left < containerRect.left + MARGIN) {\n container.scrollLeft += tabRect.left - containerRect.left - MARGIN;\n } else if (tabRect.right > containerRect.right - MARGIN) {\n container.scrollLeft += tabRect.right - containerRect.right + MARGIN;\n }\n });\n }, []);\n\n const [messageCounts, setMessageCounts] = useState<Record<string, number>>(\n () => Object.fromEntries(threads.map((t) => [t.id, t.messageCount ?? 0])),\n );\n\n // Sync message counts from threads when they load\n useEffect(() => {\n if (threads.length > 0) {\n setMessageCounts((prev) => {\n const next = { ...prev };\n for (const t of threads) {\n if (!(t.id in next)) {\n next[t.id] = t.messageCount ?? 0;\n }\n }\n return next;\n });\n }\n }, [threads]);\n\n // Listen for builder.submitChat postMessages\n useEffect(() => {\n const handler = (event: MessageEvent) => {\n if (!isTrustedFrameMessage(event)) return;\n if (event.data?.type === AGENT_CHAT_SET_CONTEXT_MESSAGE_TYPE) {\n const item = normalizeAgentChatContextItem(event.data.data);\n if (!item) return;\n const openSidebar = event.data.data?.openSidebar as boolean | undefined;\n if (openSidebar !== false) {\n window.dispatchEvent(new CustomEvent(\"agent-panel:open\"));\n }\n if (postMessageSubmissionsDisabled) return;\n const currentTabId = activeThreadIdRef.current;\n if (!currentTabId) return;\n // Focus defaults to true; a caller opts out with `focus: false` for\n // passive context (e.g. a canvas selection) so staging never steals\n // focus from an in-progress inline editor.\n const focus = (event.data.data?.focus as boolean | undefined) !== false;\n setContextInTab(currentTabId, item, { focus });\n return;\n }\n if (event.data?.type === AGENT_CHAT_REMOVE_CONTEXT_MESSAGE_TYPE) {\n const key =\n typeof event.data.data?.key === \"string\"\n ? event.data.data.key.trim()\n : \"\";\n if (!key) return;\n const openSidebar = event.data.data?.openSidebar as boolean | undefined;\n if (openSidebar === true) {\n window.dispatchEvent(new CustomEvent(\"agent-panel:open\"));\n }\n if (postMessageSubmissionsDisabled) return;\n const currentTabId = activeThreadIdRef.current;\n if (!currentTabId) return;\n removeContextInTab(currentTabId, key);\n return;\n }\n if (event.data?.type === AGENT_CHAT_CLEAR_CONTEXT_MESSAGE_TYPE) {\n const openSidebar = event.data.data?.openSidebar as boolean | undefined;\n if (openSidebar === true) {\n window.dispatchEvent(new CustomEvent(\"agent-panel:open\"));\n }\n if (postMessageSubmissionsDisabled) return;\n const currentTabId = activeThreadIdRef.current;\n if (!currentTabId) return;\n clearContextInTab(currentTabId);\n return;\n }\n const parsed = parseSubmitChatMessage(event);\n if (!parsed) return;\n // Dedup the live post against the cold-start replay; first one wins.\n if (!claimAgentChatSubmit(parsed.submitMessageId)) return;\n const {\n message,\n context,\n openSidebar,\n model,\n effort,\n newTab,\n background,\n submit,\n images,\n } = parsed;\n const requestedTabId = parsed.tabId;\n const requestMode =\n parsed.requestMode ?? requestModeFromExecMode(props.execMode);\n\n // Make sure the sidebar is visible to show the response, unless the\n // caller explicitly opted out or it's a background send.\n if (openSidebar !== false && !background) {\n window.dispatchEvent(new CustomEvent(\"agent-panel:open\"));\n }\n if (postMessageSubmissionsDisabled) return;\n\n // Plan mode is sent as request metadata by the chat adapter. Keep the\n // user-visible message clean so mode instructions never enter history.\n const fullMessage = context\n ? appendAgentChatContextToMessage(message, context)\n : message;\n\n const send: PendingSend = {\n message: fullMessage,\n images,\n submit,\n ...(background ? { trackInRunsTray: true } : {}),\n ...(requestMode ? { requestMode } : {}),\n };\n\n const sendToTab = (threadId: string) => {\n // If a model override was specified, apply it only if we recognize it\n if (model) {\n const matchedGroup = availableModels.find((g) =>\n g.models.includes(model),\n );\n if (matchedGroup) {\n const requestedEffort = isReasoningEffort(effort) ? effort : \"auto\";\n const effortOptions = getReasoningEffortOptionsForModel(model);\n const selectedEffort =\n requestedEffort === \"auto\" ||\n effortOptions.includes(requestedEffort)\n ? requestedEffort\n : \"auto\";\n threadModelRef.current.set(threadId, {\n model,\n engine: matchedGroup.engine,\n effort: selectedEffort,\n });\n bumpModelSelectionVersion();\n }\n }\n\n const ref = chatRefs.current.get(threadId);\n if (ref) {\n deliverPendingSend(ref, send);\n } else {\n pendingDeliveries.current.push({ threadId, send });\n }\n };\n\n if (newTab) {\n const previousTabId = activeThreadIdRef.current;\n createThread(requestedTabId).then((newId) => {\n if (newId) {\n newThreadIds.current.add(newId);\n if (background) {\n mountedTabsRef.current.add(newId);\n }\n setOpenTabIds((prev) =>\n prev.includes(newId) ? prev : [...prev, newId],\n );\n if (!background) {\n writeThreadUrl(newId);\n }\n sendToTab(newId);\n if (background && previousTabId) {\n switchThreadState(previousTabId);\n }\n }\n });\n } else {\n const currentTabId = activeThreadIdRef.current;\n if (currentTabId) {\n sendToTab(currentTabId);\n } else {\n // Cold start: no thread yet. Queue for the first active thread (the\n // bootstrap effect creates it) rather than racing a second create.\n pendingDeliveries.current.push({ threadId: null, send });\n }\n }\n };\n window.addEventListener(\"message\", handler);\n return () => window.removeEventListener(\"message\", handler);\n }, [\n availableModels,\n bumpModelSelectionVersion,\n clearContextInTab,\n createThread,\n postMessageSubmissionsDisabled,\n props.execMode,\n removeContextInTab,\n setContextInTab,\n switchThread,\n switchThreadState,\n writeThreadUrl,\n ]);\n\n // Replay submits posted before this lazy panel's listener attached. Dedup in\n // the handler keeps a live + replayed message single.\n useEffect(() => {\n const buffered = drainBufferedAgentChatSubmits();\n for (const data of buffered) {\n window.dispatchEvent(\n new MessageEvent(\"message\", {\n data: { type: \"agentNative.submitChat\", data },\n origin: window.location.origin,\n }),\n );\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Flush queued context items and sends once their thread's ref is mounted\n // (re-runs on ref mount via openTabIds and on cold-start target via\n // activeThreadId).\n useEffect(() => {\n for (const [tabId, items] of pendingContextItems.current) {\n const ref = chatRefs.current.get(tabId);\n if (!ref) continue;\n for (const item of items) ref.setComposerContextItem(item);\n pendingContextItems.current.delete(tabId);\n }\n\n if (pendingDeliveries.current.length === 0) return;\n const active = activeThreadIdRef.current;\n const remaining: PendingDelivery[] = [];\n for (const delivery of pendingDeliveries.current) {\n const threadId = delivery.threadId ?? active ?? null;\n const ref = threadId ? chatRefs.current.get(threadId) : null;\n if (threadId && ref) {\n const { send } = delivery;\n setTimeout(() => deliverPendingSend(ref, send), 50);\n } else {\n // Not ready — keep it, pinning the resolved threadId once known.\n remaining.push(threadId ? { threadId, send: delivery.send } : delivery);\n }\n }\n pendingDeliveries.current = remaining;\n }, [openTabIds, activeThreadId]);\n\n // Listen for chatRunning completion events\n useEffect(() => {\n const handler = (e: Event) => {\n const detail = (e as CustomEvent).detail;\n if (!detail) return;\n const { isRunning, tabId } = detail;\n if (!tabId) return;\n\n setRunningThreads((prev) => {\n const next = new Set(prev);\n if (isRunning) {\n next.add(tabId);\n } else {\n next.delete(tabId);\n }\n return next;\n });\n };\n window.addEventListener(\"agentNative.chatRunning\", handler);\n return () => window.removeEventListener(\"agentNative.chatRunning\", handler);\n }, []);\n\n const addTab = useCallback(async () => {\n const id = await createThread();\n if (id) {\n newThreadIds.current.add(id);\n writeThreadUrl(null);\n }\n return id;\n }, [createThread, writeThreadUrl]);\n\n const cleanupClosedTab = useCallback((tabId: string) => {\n if (parentMapRef.current[tabId]) {\n dismissedSubAgentTabsRef.current.add(tabId);\n }\n chatRefs.current.delete(tabId);\n pendingDeliveries.current = pendingDeliveries.current.filter(\n (d) => d.threadId !== tabId,\n );\n pendingContextItems.current.delete(tabId);\n newThreadIds.current.delete(tabId);\n threadModelRef.current.delete(tabId);\n // Clean up parent map and sub-agent names\n setParentMap((prev) => {\n if (!(tabId in prev)) return prev;\n const { [tabId]: _, ...rest } = prev;\n return rest;\n });\n setSubAgentNames((prev) => {\n if (!(tabId in prev)) return prev;\n const { [tabId]: _, ...rest } = prev;\n return rest;\n });\n setSubAgentStatuses((prev) => {\n if (!(tabId in prev)) return prev;\n const { [tabId]: _, ...rest } = prev;\n return rest;\n });\n }, []);\n\n const closeTab = useCallback(\n (tabId: string) => {\n setOpenTabIds((prev) => {\n if (prev.length <= 1) {\n // Last tab — create a new one and replace the old tab atomically\n createThread().then((newId) => {\n if (newId) {\n newThreadIds.current.add(newId);\n setOpenTabIds([newId]);\n writeThreadUrl(null);\n }\n });\n return prev; // Keep old tab until new one is ready\n }\n const next = prev.filter((id) => id !== tabId);\n if (tabId === activeThreadIdRef.current && next.length > 0) {\n const idx = prev.indexOf(tabId);\n switchThread(next[Math.min(idx, next.length - 1)]);\n }\n return next;\n });\n cleanupClosedTab(tabId);\n },\n [switchThread, createThread, cleanupClosedTab, writeThreadUrl],\n );\n\n const closeOtherTabs = useCallback(\n (tabId: string) => {\n for (const id of openTabIdsRef.current) {\n if (id !== tabId && parentMapRef.current[id]) {\n dismissedSubAgentTabsRef.current.add(id);\n }\n }\n setOpenTabIds([tabId]);\n if (activeThreadIdRef.current !== tabId) {\n switchThread(tabId);\n }\n // Clean up refs for closed tabs\n for (const key of chatRefs.current.keys()) {\n if (key !== tabId) {\n if (parentMapRef.current[key]) {\n dismissedSubAgentTabsRef.current.add(key);\n }\n chatRefs.current.delete(key);\n pendingDeliveries.current = pendingDeliveries.current.filter(\n (d) => d.threadId !== key,\n );\n pendingContextItems.current.delete(key);\n newThreadIds.current.delete(key);\n threadModelRef.current.delete(key);\n }\n }\n // Clean up parent map and sub-agent names — only keep entries for the surviving tab\n setParentMap((prev) => {\n if (tabId in prev) return { [tabId]: prev[tabId] };\n return {};\n });\n setSubAgentNames((prev) => {\n if (tabId in prev) return { [tabId]: prev[tabId] };\n return {};\n });\n setSubAgentStatuses((prev) => {\n if (tabId in prev) return { [tabId]: prev[tabId] };\n return {};\n });\n },\n [switchThread],\n );\n\n const closeAllTabs = useCallback(async () => {\n const id = await createThread();\n if (id) {\n newThreadIds.current.add(id);\n setOpenTabIds([id]);\n switchThreadState(id);\n writeThreadUrl(null);\n dismissedSubAgentTabsRef.current.clear();\n // Clean up all old refs\n chatRefs.current.clear();\n pendingDeliveries.current = [];\n pendingContextItems.current.clear();\n threadModelRef.current.clear();\n setParentMap({});\n setSubAgentNames({});\n setSubAgentStatuses({});\n }\n }, [createThread, switchThreadState, writeThreadUrl]);\n\n // Keyboard shortcuts dispatched from AgentPanel based on the active mode\n useEffect(() => {\n const handleCloseCurrent = () => {\n const id = activeThreadIdRef.current;\n if (id) closeTab(id);\n };\n const handleCloseAll = () => {\n void closeAllTabs();\n };\n const handleNewChat = () => {\n void addTab();\n };\n window.addEventListener(\"agent-chat:close-current-tab\", handleCloseCurrent);\n window.addEventListener(\"agent-chat:close-all-tabs\", handleCloseAll);\n window.addEventListener(\"agent-chat:new-chat\", handleNewChat);\n return () => {\n window.removeEventListener(\n \"agent-chat:close-current-tab\",\n handleCloseCurrent,\n );\n window.removeEventListener(\"agent-chat:close-all-tabs\", handleCloseAll);\n window.removeEventListener(\"agent-chat:new-chat\", handleNewChat);\n };\n }, [closeTab, closeAllTabs, addTab]);\n\n useEffect(() => {\n const handleOpenThread = (event: Event) => {\n const detail = (event as CustomEvent).detail as\n | { threadId?: unknown; newThread?: unknown; openRequestId?: unknown }\n | undefined;\n const threadId =\n typeof detail?.threadId === \"string\" ? detail.threadId : \"\";\n if (!detail || !threadId) return;\n if (!claimAgentChatOpenRequest(detail.openRequestId)) return;\n\n if (detail?.newThread === true) {\n newThreadIds.current.add(threadId);\n void createThread(threadId).then((createdId) => {\n if (!createdId) return;\n setOpenTabIds((prev) =>\n prev.includes(createdId) ? prev : [...prev, createdId],\n );\n writeThreadUrl(null);\n });\n return;\n }\n setOpenTabIds((prev) =>\n prev.includes(threadId) ? prev : [...prev, threadId],\n );\n switchThread(threadId);\n };\n\n window.addEventListener(\"agent-chat:open-thread\", handleOpenThread);\n return () =>\n window.removeEventListener(\"agent-chat:open-thread\", handleOpenThread);\n }, [createThread, switchThread, writeThreadUrl]);\n\n const clearActiveTab = useCallback(() => {\n const tabIdToClear = activeThreadIdRef.current;\n void addTab().then((newTabId) => {\n if (!tabIdToClear || !newTabId || tabIdToClear === newTabId) return;\n setOpenTabIds((prev) => {\n const next = prev.filter((id) => id !== tabIdToClear);\n return next.includes(newTabId) ? next : [...next, newTabId];\n });\n cleanupClosedTab(tabIdToClear);\n });\n }, [addTab, cleanupClosedTab]);\n\n const openFromHistory = useCallback(\n (threadId: string) => {\n if (!openTabIds.includes(threadId)) {\n setOpenTabIds((prev) => [...prev, threadId]);\n }\n switchThread(threadId);\n },\n [openTabIds, switchThread],\n );\n\n // Listen for agent-task-open events (from AgentTaskCard \"Open\" button)\n useEffect(() => {\n function handleOpenTask(e: Event) {\n const detail = (e as CustomEvent).detail;\n const threadId = detail?.threadId;\n if (!threadId) return;\n if (!claimAgentChatOpenRequest(detail.openRequestId)) return;\n dismissedSubAgentTabsRef.current.delete(threadId);\n // Prefer an explicit parent (RunsTray/background hydration knows it);\n // inline task cards fall back to the active orchestrator thread.\n const explicitParentId =\n typeof detail?.parentThreadId === \"string\"\n ? detail.parentThreadId.trim()\n : \"\";\n const parentId = explicitParentId || activeThreadIdRef.current;\n if (parentId && parentId !== threadId) {\n setParentMap((prev) =>\n prev[threadId] === parentId\n ? prev\n : { ...prev, [threadId]: parentId },\n );\n }\n // Store the sub-agent name/description for the tab label\n const name = detail.name || detail.description || \"\";\n if (name) {\n setSubAgentNames((prev) =>\n prev[threadId] === name ? prev : { ...prev, [threadId]: name },\n );\n }\n // Refresh thread list so the new sub-agent thread appears with its title\n refreshThreads();\n // Open the sub-agent thread as a tab — insert after parent for visual grouping\n if (!openTabIds.includes(threadId)) {\n setOpenTabIds((prev) => {\n if (parentId) {\n const parentIdx = prev.indexOf(parentId);\n if (parentIdx !== -1) {\n // Insert after the parent (and any existing children of that parent)\n const next = [...prev];\n let insertIdx = parentIdx + 1;\n // Skip past any existing children of the same parent\n while (\n insertIdx < next.length &&\n parentMap[next[insertIdx]] === parentId\n ) {\n insertIdx++;\n }\n next.splice(insertIdx, 0, threadId);\n return next;\n }\n }\n return [...prev, threadId];\n });\n }\n switchThread(threadId);\n }\n window.addEventListener(\"agent-task-open\", handleOpenTask);\n return () => window.removeEventListener(\"agent-task-open\", handleOpenTask);\n }, [openTabIds, switchThread, refreshThreads, parentMap]);\n\n // Replay thread/task opens requested before this lazy panel's listeners\n // attached. Live events claim their id; replay drains only unclaimed requests.\n useEffect(() => {\n const buffered = drainBufferedAgentChatOpenRequests();\n for (const request of buffered) {\n window.dispatchEvent(\n new CustomEvent(request.eventType, { detail: request.detail }),\n );\n }\n }, []);\n\n // Watch for agent-issued chat-command in application-state\n const lastChatCommandRef = useRef(0);\n useEffect(() => {\n let stopped = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n async function pollChatCommand() {\n if (stopped) return;\n try {\n const res = await fetch(\n agentNativePath(\"/_agent-native/application-state/chat-command\"),\n );\n if (res.ok) {\n const data = await res.json();\n if (\n data?.value?.command === \"open-thread\" &&\n data.value.threadId &&\n data.value.timestamp > lastChatCommandRef.current\n ) {\n lastChatCommandRef.current = data.value.timestamp;\n const threadId = data.value.threadId as string;\n // Open the thread as a tab and focus it\n if (!openTabIds.includes(threadId)) {\n setOpenTabIds((prev) => [...prev, threadId]);\n }\n switchThread(threadId);\n // Clear the command\n fetch(\n agentNativePath(\"/_agent-native/application-state/chat-command\"),\n {\n method: \"DELETE\",\n headers: { \"X-Agent-Native-CSRF\": \"1\" },\n },\n ).catch(() => {});\n }\n }\n } catch {}\n if (!stopped) {\n timer = setTimeout(pollChatCommand, 2000);\n }\n }\n\n pollChatCommand();\n return () => {\n stopped = true;\n if (timer) clearTimeout(timer);\n };\n }, [openTabIds, switchThread]);\n\n const handleGenerateTitle = useCallback(\n (threadId: string, message: string) => {\n generateTitle(threadId, message).then((title) => {\n if (title) {\n // Persist the generated title to the server\n saveThreadData(threadId, {\n threadData: \"\",\n title,\n preview: message.slice(0, 120),\n titleSource: \"generated\",\n });\n }\n });\n },\n [generateTitle, saveThreadData],\n );\n\n const handleSaveThread = useCallback(\n (\n threadId: string,\n data: {\n threadData: string;\n title: string;\n preview: string;\n messageCount: number;\n },\n ) => {\n saveThreadData(threadId, data);\n if (\n data.messageCount > 0 &&\n threadId === activeThreadIdRef.current &&\n urlThreadIdRef.current !== threadId\n ) {\n writeThreadUrl(threadId);\n }\n },\n [saveThreadData, writeThreadUrl],\n );\n\n // ─── Slash command handler ──────────────────────────────────────────\n const [helpVisible, setHelpVisible] = useState(false);\n\n const handleSlashCommand = useCallback(\n (command: string) => {\n switch (command) {\n case \"clear\":\n case \"new\":\n addTab();\n break;\n case \"history\":\n setShowHistory(true);\n break;\n case \"plan\":\n props.onExecModeChange?.(\"plan\");\n break;\n case \"act\":\n props.onExecModeChange?.(\"build\");\n break;\n case \"help\":\n setHelpVisible(true);\n break;\n }\n },\n [addTab, props.onExecModeChange],\n );\n\n const handleForkChat = useCallback(\n async (sourceThreadId: string) => {\n const sourceSnapshot =\n chatRefs.current.get(sourceThreadId)?.exportThreadSnapshot() ?? null;\n const forkedId = await forkThread(sourceThreadId, sourceSnapshot);\n if (!forkedId) return false;\n setOpenTabIds((prev) => {\n const idx = prev.indexOf(sourceThreadId);\n if (idx !== -1) {\n const next = [...prev];\n next.splice(idx + 1, 0, forkedId);\n return next;\n }\n return [...prev, forkedId];\n });\n switchThread(forkedId);\n return true;\n },\n [forkThread, switchThread],\n );\n\n // Build tabs from open thread IDs. During the first thread-list fetch,\n // `activeThreadId` is seeded synchronously so the chat can mount before\n // persisted open tabs have been reconciled.\n const visibleOpenTabIds =\n activeThreadId && !openTabIds.includes(activeThreadId)\n ? [...openTabIds, activeThreadId]\n : openTabIds;\n const threadMap = new Map(threads.map((t) => [t.id, t]));\n const tabs: ChatTab[] = visibleOpenTabIds\n .filter((id) => threadMap.has(id) || id === activeThreadId)\n .map((id) => {\n const t = threadMap.get(id);\n const agentTeamStatus = chatTabStatusFromAgentTeamStatus(\n subAgentStatuses[id],\n );\n return {\n id,\n label: t?.title || t?.preview?.slice(0, 30) || \"New chat\",\n status:\n agentTeamStatus ??\n (runningThreads.has(id)\n ? (\"running\" as const)\n : (messageCounts[id] ?? t?.messageCount ?? 0) > 0\n ? (\"completed\" as const)\n : (\"idle\" as const)),\n parentThreadId: parentMap[id],\n subAgentName: subAgentNames[id],\n };\n });\n\n // Include sub-agent tabs that aren't in threadMap yet (just created, not refreshed)\n for (const id of visibleOpenTabIds) {\n if (!tabs.some((t) => t.id === id)) {\n tabs.push({\n id,\n label:\n subAgentNames[id] || (parentMap[id] ? \"Sub-agent...\" : \"New chat\"),\n status:\n chatTabStatusFromAgentTeamStatus(subAgentStatuses[id]) ??\n (\"running\" as const),\n parentThreadId: parentMap[id],\n subAgentName: subAgentNames[id],\n });\n }\n }\n\n const headerProps: MultiTabAssistantChatHeaderProps = {\n tabs,\n activeTabId: activeThreadId ?? \"\",\n activeTabMessageCount: activeThreadId\n ? (messageCounts[activeThreadId] ?? 0)\n : 0,\n setActiveTabId: switchThread,\n addTab,\n closeTab,\n closeOtherTabs,\n closeAllTabs,\n clearActiveTab,\n showHistory,\n toggleHistory: () => setShowHistory((v) => !v),\n tabCount: visibleOpenTabIds.length,\n };\n\n // Wait for the first thread-list pass only when there is no synchronously\n // seeded active thread. Suggestion loading and thread-list reconciliation\n // should not block the chat shell from mounting.\n if (isLoading && !activeThreadId) {\n return (\n <ChatSkeleton\n header={renderHeader?.(headerProps)}\n headerOnly={contentHidden}\n />\n );\n }\n\n return (\n <div className=\"flex flex-1 flex-col h-full min-h-0 overflow-x-hidden\">\n {/* Tailwind group-hover/tab doesn't work in core package — inject directly */}\n <style\n dangerouslySetInnerHTML={{\n __html:\n \".agent-tab-close{opacity:0}.agent-tab:hover .agent-tab-close{opacity:1}\" +\n \".agent-tabs-scroll{scrollbar-width:none;-ms-overflow-style:none;}\" +\n \".agent-tabs-scroll::-webkit-scrollbar{display:none;}\",\n }}\n />\n {renderHeader\n ? renderHeader(headerProps)\n : showTabBar\n ? (() => {\n const activeTab = tabs.find((t) => t.id === activeThreadId);\n const focusParentId = activeTab?.parentThreadId || activeThreadId;\n const childTabs = tabs.filter(\n (t) => t.parentThreadId === focusParentId,\n );\n const hasSubTabs = childTabs.length > 0;\n const mainTabs = tabs.filter((t) => !t.parentThreadId);\n\n return (\n <>\n <div className=\"flex items-center px-1 py-1 border-b border-border shrink-0 gap-0.5\">\n <div className=\"agent-tabs-scroll flex items-center gap-0.5 min-w-0 overflow-x-auto flex-1\">\n {mainTabs.map((tab) => {\n const isActive =\n tab.id === activeThreadId ||\n (tab.id === focusParentId &&\n activeTab?.parentThreadId === tab.id);\n return (\n <div\n key={tab.id}\n ref={isActive ? activeTabRefCb : undefined}\n className={cn(\n \"agent-tab relative flex items-center rounded-md text-[11px] font-medium shrink-0 max-w-[130px]\",\n isActive\n ? \"bg-accent text-foreground ring-1 ring-inset ring-border/60 shadow-sm\"\n : \"text-muted-foreground hover:text-foreground hover:bg-accent/50\",\n )}\n >\n <button\n type=\"button\"\n onClick={() => switchThread(tab.id)}\n className=\"flex items-center gap-1 px-2.5 py-1.5 min-w-0 flex-1 text-start\"\n >\n <span className=\"truncate pe-1\">{tab.label}</span>\n {tab.status === \"running\" && (\n <span className=\"w-1.5 h-1.5 rounded-full bg-muted-foreground/50 shrink-0 animate-pulse\" />\n )}\n </button>\n <button\n type=\"button\"\n aria-label=\"Close tab\"\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n closeTab(tab.id);\n }}\n className=\"agent-tab-close flex items-center justify-end text-muted-foreground hover:!text-foreground\"\n style={{\n position: \"absolute\",\n right: 0,\n top: 0,\n bottom: 0,\n width: 28,\n paddingRight: 6,\n borderRadius: \"0 6px 6px 0\",\n background:\n \"linear-gradient(to right, transparent, hsl(var(--accent)) 40%)\",\n }}\n >\n <IconX size={12} />\n </button>\n </div>\n );\n })}\n </div>\n <TooltipProvider delayDuration={200}>\n <div className=\"flex items-center gap-px shrink-0 ms-auto\">\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={addTab}\n aria-label=\"New chat\"\n className=\"flex h-6 w-6 items-center justify-center rounded text-muted-foreground/60 hover:text-foreground hover:bg-accent/50\"\n >\n <IconPlus size={12} />\n </button>\n </TooltipTrigger>\n <TooltipContent>New chat</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={() => setShowHistory(!showHistory)}\n aria-label=\"All chats\"\n className={cn(\n \"flex h-6 w-6 items-center justify-center rounded text-muted-foreground/60 hover:text-foreground hover:bg-accent/50\",\n showHistory && \"bg-accent text-foreground\",\n )}\n >\n <IconHistory size={12} />\n </button>\n </TooltipTrigger>\n <TooltipContent>All chats</TooltipContent>\n </Tooltip>\n </div>\n </TooltipProvider>\n </div>\n {hasSubTabs && (\n <div className=\"flex items-center px-1 py-0.5 border-b border-border shrink-0 gap-0.5 bg-muted/30\">\n <div className=\"agent-tabs-scroll flex items-center gap-0.5 min-w-0 overflow-x-auto flex-1\">\n <button\n onClick={() => switchThread(focusParentId!)}\n className={cn(\n \"flex shrink-0 items-center gap-1 rounded-md px-2 py-1 text-[10px] font-medium cursor-pointer\",\n activeThreadId === focusParentId\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent hover:text-foreground\",\n )}\n >\n Main\n </button>\n {childTabs.map((tab) => (\n <div\n key={tab.id}\n ref={\n tab.id === activeThreadId\n ? activeTabRefCb\n : undefined\n }\n className={cn(\n \"agent-tab relative flex shrink-0 items-center rounded-md text-[10px] font-medium max-w-[130px]\",\n tab.id === activeThreadId\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent hover:text-foreground\",\n )}\n >\n <button\n type=\"button\"\n onClick={() => switchThread(tab.id)}\n className=\"flex items-center gap-1 px-2 py-1 min-w-0 flex-1 text-start\"\n >\n <span className=\"truncate pe-1\">\n {tab.subAgentName || tab.label}\n </span>\n {tab.status === \"running\" && (\n <span className=\"w-1 h-1 rounded-full bg-muted-foreground/50 shrink-0 animate-pulse\" />\n )}\n </button>\n <button\n type=\"button\"\n aria-label=\"Close tab\"\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n closeTab(tab.id);\n }}\n className=\"agent-tab-close flex items-center justify-end text-muted-foreground hover:!text-foreground\"\n style={{\n position: \"absolute\",\n right: 0,\n top: 0,\n bottom: 0,\n width: 24,\n paddingRight: 4,\n borderRadius: \"0 6px 6px 0\",\n background:\n \"linear-gradient(to right, transparent, hsl(var(--accent)) 40%)\",\n }}\n >\n <IconX size={12} />\n </button>\n </div>\n ))}\n </div>\n </div>\n )}\n </>\n );\n })()\n : null}\n\n {/* Chat content with optional overlay */}\n <div className=\"relative flex-1 flex flex-col min-h-0\">\n {renderOverlay ? renderOverlay(headerProps) : null}\n\n {/* History popover — rendered inside relative container so positioning works */}\n {showHistory && (\n <HistoryPopover\n threads={threads}\n openTabIds={new Set(openTabIds)}\n activeThreadId={activeThreadId}\n currentScope={scope}\n hasMoreThreads={hasMoreThreads}\n isLoadingMoreThreads={isLoadingMoreThreads}\n loadError={threadsLoadError}\n onSelect={openFromHistory}\n onClose={() => setShowHistory(false)}\n onLoadMore={loadMoreThreads}\n onSearch={searchThreads}\n />\n )}\n\n {/* Help popover — shown by /help slash command */}\n {helpVisible && <HelpPopover onClose={() => setHelpVisible(false)} />}\n\n {/* Render tabs that have been activated at least once, hide inactive ones to preserve state.\n Sub-agent tabs are only mounted when first focused — prevents stale restore from running\n while the component is display:none before the user switches to it. */}\n {[...new Set(visibleOpenTabIds)]\n .filter(\n (tabId) =>\n tabId === activeThreadId || mountedTabsRef.current.has(tabId),\n )\n .map((tabId) => {\n const modelSelection = resolveThreadModelSelection(tabId);\n const tabThread = threads.find((thread) => thread.id === tabId);\n const tabScope =\n tabThread?.scope ??\n (tabId === activeThreadId ? activeThreadScope : null);\n const tabDynamicSuggestions =\n tabId === activeThreadId && !contentHidden\n ? props.dynamicSuggestions\n : false;\n const scopeComposerSlot =\n showScopeBadge && tabId === activeThreadId && !contentHidden ? (\n tabScope && activeThreadId ? (\n <ScopeBadge\n scope={tabScope}\n currentScope={scope}\n onDetach={handleDetachActiveThread}\n otherScopedThreads={otherScopedThreads}\n activeThreadId={activeThreadId}\n openTabIds={new Set(openTabIds)}\n onSelectThread={openFromHistory}\n />\n ) : detachConfirmType ? (\n <DetachConfirmationBanner />\n ) : null\n ) : null;\n const composerSlot =\n scopeComposerSlot || props.composerSlot ? (\n <>\n {props.composerSlot}\n {scopeComposerSlot}\n </>\n ) : undefined;\n return (\n <div\n key={tabId}\n className=\"flex-1 min-h-0 flex-col\"\n style={{\n display:\n contentHidden || tabId !== activeThreadId ? \"none\" : \"flex\",\n }}\n >\n <KeepTabOpenNotice\n threadId={tabId}\n enabled={tabId === activeThreadId}\n apiUrl={apiUrl}\n />\n <RunStuckBanner\n threadId={tabId}\n enabled={tabId === activeThreadId}\n apiUrl={apiUrl}\n autoRetry\n autoRetryOwnerId={browserTabId}\n onRetry={() => {\n const handle = chatRefs.current.get(tabId);\n handle?.sendRecoveryMessage(\n \"Continue from where you left off and finish my last request. Do not repeat completed work.\",\n \"continue\",\n );\n }}\n />\n <AssistantChat\n {...props}\n dynamicSuggestions={tabDynamicSuggestions}\n emptyStateText={\n tabScope?.label && tabId === activeThreadId\n ? `Ask about ${tabScope.label}`\n : props.emptyStateText\n }\n ref={(handle) => {\n if (handle) {\n chatRefs.current.set(tabId, handle);\n } else {\n chatRefs.current.delete(tabId);\n }\n }}\n threadId={tabId}\n tabId={tabId}\n browserTabId={browserTabId}\n contextScope={tabScope}\n isActiveComposer={tabId === activeThreadId}\n apiUrl={apiUrl}\n isNewThread={\n newThreadIds.current.has(tabId) || isNewThread(tabId)\n }\n onMessageCountChange={(count) =>\n setMessageCounts((prev) =>\n prev[tabId] === count\n ? prev\n : { ...prev, [tabId]: count },\n )\n }\n onSaveThread={handleSaveThread}\n onGenerateTitle={handleGenerateTitle}\n onSlashCommand={handleSlashCommand}\n selectedModel={modelSelection?.model}\n selectedEngine={modelSelection?.engine}\n selectedEffort={modelSelection?.effort ?? \"auto\"}\n composerSlot={composerSlot}\n defaultModel={defaultModel}\n availableModels={availableModels}\n onModelChange={handleModelChange}\n onEffortChange={handleEffortChange}\n onForkChat={() => handleForkChat(tabId)}\n // Sub-agent tabs are read-only: sending a new message from the\n // sub-agent tab would start a fresh run on that thread and kill\n // the in-flight team chunk. Disable the composer and show a\n // hint so users know to send via the orchestrator chat instead.\n composerDisabled={Boolean(parentMap[tabId])}\n composerDisabledPlaceholder={\n parentMap[tabId]\n ? \"Send messages to the orchestrator chat — this sub-agent runs automatically\"\n : undefined\n }\n />\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n"]}