@agent-native/core 0.117.2 → 0.118.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (776) hide show
  1. package/corpus/README.md +3 -3
  2. package/corpus/core/CHANGELOG.md +51 -0
  3. package/corpus/core/docs/content/custom-design-system.mdx +445 -0
  4. package/corpus/core/docs/content/toolkit-ui.mdx +16 -0
  5. package/corpus/core/package.json +1 -1
  6. package/corpus/core/src/a2a/client.ts +32 -10
  7. package/corpus/core/src/a2a/types.ts +1 -0
  8. package/corpus/core/src/agent/types.ts +1 -1
  9. package/corpus/core/src/cli/index.ts +18 -10
  10. package/corpus/core/src/cli/multi-frontier-runs.ts +5 -3
  11. package/corpus/core/src/cli/templates-meta.ts +0 -12
  12. package/corpus/core/src/cli/workspace-dev.ts +1 -1
  13. package/corpus/core/src/client/AgentPanel.tsx +99 -108
  14. package/corpus/core/src/client/AssistantChat.tsx +30 -13
  15. package/corpus/core/src/client/CommandMenu.tsx +68 -178
  16. package/corpus/core/src/client/RunStuckBanner.tsx +39 -47
  17. package/corpus/core/src/client/agent-chat-adapter.ts +3 -1
  18. package/corpus/core/src/client/app-providers.tsx +1 -1
  19. package/corpus/core/src/client/chat/action-chat-ui-surface.tsx +32 -0
  20. package/corpus/core/src/client/chat/message-components.tsx +169 -18
  21. package/corpus/core/src/client/chat/tool-call-display.tsx +50 -14
  22. package/corpus/core/src/client/chat/widgets/InlineExtensionWidget.tsx +13 -40
  23. package/corpus/core/src/client/chat/widgets/builtin-tool-renderers.tsx +7 -3
  24. package/corpus/core/src/client/components/ui/message-scroller.tsx +15 -1
  25. package/corpus/core/src/client/conversation/AgentConversation.tsx +12 -1
  26. package/corpus/core/src/client/error-capture.ts +2 -6
  27. package/corpus/core/src/client/i18n.tsx +22 -0
  28. package/corpus/core/src/client/index.ts +17 -0
  29. package/corpus/core/src/client/org/TeamPage.tsx +257 -153
  30. package/corpus/core/src/client/progress/RunsTray.tsx +89 -88
  31. package/corpus/core/src/client/resources/McpConnectionSuggestion.tsx +25 -16
  32. package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +34 -13
  33. package/corpus/core/src/client/resources/ResourcesPanel.tsx +5 -1
  34. package/corpus/core/src/client/resources/mcp-integration-catalog.ts +20 -17
  35. package/corpus/core/src/client/resources/mcp-integration-logos.ts +2 -2
  36. package/corpus/core/src/client/route-chunk-recovery.ts +5 -3
  37. package/corpus/core/src/client/session-replay.ts +3 -3
  38. package/corpus/core/src/client/settings/DemoModeSection.tsx +6 -18
  39. package/corpus/core/src/client/settings/SecretsSection.tsx +97 -52
  40. package/corpus/core/src/client/settings/SettingsPanel.tsx +217 -252
  41. package/corpus/core/src/client/settings/SettingsTabsPage.tsx +23 -2
  42. package/corpus/core/src/client/settings/VoiceTranscriptionSection.tsx +7 -18
  43. package/corpus/core/src/client/settings/index.ts +7 -0
  44. package/corpus/core/src/client/settings/useSettingsPanelController.ts +155 -0
  45. package/corpus/core/src/client/setup-connections/BuilderConnectCard.tsx +116 -51
  46. package/corpus/core/src/client/setup-connections/index.ts +10 -0
  47. package/corpus/core/src/client/setup-connections/useBuilderConnectCardController.ts +82 -0
  48. package/corpus/core/src/client/sharing/ShareButton.tsx +64 -586
  49. package/corpus/core/src/client/sharing/ShareDialog.tsx +299 -633
  50. package/corpus/core/src/client/sharing/index.ts +42 -0
  51. package/corpus/core/src/client/sharing/share-controller-helpers.ts +318 -0
  52. package/corpus/core/src/client/sharing/useShareButtonController.ts +600 -0
  53. package/corpus/core/src/client/sharing/useShareDialogController.ts +559 -0
  54. package/corpus/core/src/client/sse-event-processor.ts +23 -0
  55. package/corpus/core/src/client/tool-display.ts +71 -0
  56. package/corpus/core/src/client/transcription/use-live-transcription.ts +64 -45
  57. package/corpus/core/src/client/use-agent-engine-configured.ts +12 -19
  58. package/corpus/core/src/client/use-chat-threads.ts +33 -12
  59. package/corpus/core/src/deploy/build.ts +2 -1
  60. package/corpus/core/src/guards/db-tool-scoping.ts +1 -1
  61. package/corpus/core/src/integrations/adapters/slack.ts +84 -5
  62. package/corpus/core/src/integrations/index.ts +5 -1
  63. package/corpus/core/src/localization/default-messages.ts +6 -1
  64. package/corpus/core/src/mcp-client/oauth-routes.ts +61 -14
  65. package/corpus/core/src/scripts/call-agent.ts +5 -1
  66. package/corpus/core/src/server/realtime-voice.ts +5 -2
  67. package/corpus/core/src/styles/agent-native.css +0 -24
  68. package/corpus/core/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  69. package/corpus/core/src/templates/default/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  70. package/corpus/core/src/templates/default/.agents/skills/frontend-design/SKILL.md +22 -2
  71. package/corpus/core/src/templates/default/.agents/skills/shadcn-ui/SKILL.md +28 -4
  72. package/corpus/core/src/templates/default/app/components/ui/toolkit-provider.tsx +10 -0
  73. package/corpus/core/src/templates/default/app/design-system.ts +3 -0
  74. package/corpus/core/src/templates/default/app/root.tsx +5 -2
  75. package/corpus/core/src/templates/default/package.json +1 -0
  76. package/corpus/core/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  77. package/corpus/core/src/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  78. package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  79. package/corpus/core/src/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  80. package/corpus/core/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +22 -2
  81. package/corpus/core/src/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +28 -4
  82. package/corpus/core/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +7 -5
  83. package/corpus/core/src/terminal/cli-registry.ts +1 -1
  84. package/corpus/core/src/vite/client.ts +205 -1
  85. package/corpus/templates/analytics/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  86. package/corpus/templates/analytics/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  87. package/corpus/templates/analytics/.agents/skills/frontend-design/SKILL.md +22 -2
  88. package/corpus/templates/analytics/.agents/skills/shadcn-ui/SKILL.md +28 -4
  89. package/corpus/templates/analytics/app/components/ui/toolkit-provider.tsx +6 -1
  90. package/corpus/templates/analytics/app/design-system.ts +3 -0
  91. package/corpus/templates/analytics/app/hooks/use-dashboard-views.ts +13 -1
  92. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/ViewsMenu.tsx +10 -0
  93. package/corpus/templates/analytics/changelog/2026-07-22-show-a-useful-error-when-saving-a-dashboard-view-fails.md +6 -0
  94. package/corpus/templates/assets/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  95. package/corpus/templates/assets/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  96. package/corpus/templates/assets/.agents/skills/frontend-design/SKILL.md +22 -2
  97. package/corpus/templates/assets/.agents/skills/shadcn-ui/SKILL.md +28 -4
  98. package/corpus/templates/assets/app/components/ui/alert.tsx +1 -0
  99. package/corpus/templates/assets/app/components/ui/toolkit-provider.tsx +6 -1
  100. package/corpus/templates/assets/app/design-system.ts +3 -0
  101. package/corpus/templates/assets/app/routes/brand-kits.$id_.presets.$presetId.tsx +26 -30
  102. package/corpus/templates/brain/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  103. package/corpus/templates/brain/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  104. package/corpus/templates/brain/.agents/skills/frontend-design/SKILL.md +22 -2
  105. package/corpus/templates/brain/.agents/skills/shadcn-ui/SKILL.md +28 -4
  106. package/corpus/templates/brain/app/components/ui/dialog.tsx +1 -0
  107. package/corpus/templates/brain/app/components/ui/toolkit-provider.tsx +6 -1
  108. package/corpus/templates/brain/app/design-system.ts +3 -0
  109. package/corpus/templates/brain/app/routes/sources.tsx +189 -122
  110. package/corpus/templates/calendar/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  111. package/corpus/templates/calendar/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  112. package/corpus/templates/calendar/.agents/skills/frontend-design/SKILL.md +22 -2
  113. package/corpus/templates/calendar/.agents/skills/shadcn-ui/SKILL.md +28 -4
  114. package/corpus/templates/calendar/app/components/ui/toolkit-provider.tsx +6 -1
  115. package/corpus/templates/calendar/app/design-system.ts +3 -0
  116. package/corpus/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  117. package/corpus/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  118. package/corpus/templates/chat/.agents/skills/frontend-design/SKILL.md +22 -2
  119. package/corpus/templates/chat/.agents/skills/shadcn-ui/SKILL.md +28 -4
  120. package/corpus/templates/chat/app/components/ui/toolkit-provider.tsx +6 -1
  121. package/corpus/templates/chat/app/design-system.ts +3 -0
  122. package/corpus/templates/clips/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  123. package/corpus/templates/clips/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  124. package/corpus/templates/clips/.agents/skills/frontend-design/SKILL.md +22 -2
  125. package/corpus/templates/clips/.agents/skills/shadcn-ui/SKILL.md +28 -4
  126. package/corpus/templates/clips/AGENTS.md +8 -6
  127. package/corpus/templates/clips/actions/request-transcript.ts +90 -420
  128. package/corpus/templates/clips/actions/save-browser-transcript.ts +11 -28
  129. package/corpus/templates/clips/app/components/capture-install-options.tsx +5 -3
  130. package/corpus/templates/clips/app/components/player/transcript-panel.tsx +3 -136
  131. package/corpus/templates/clips/app/components/ui/toolkit-provider.tsx +6 -1
  132. package/corpus/templates/clips/app/design-system.ts +3 -0
  133. package/corpus/templates/clips/app/lib/capture-install-options.ts +15 -4
  134. package/corpus/templates/clips/app/routes/_app.library._index.tsx +1 -1
  135. package/corpus/templates/clips/app/routes/download.tsx +3 -2
  136. package/corpus/templates/clips/changelog/2026-07-22-fixed-an-intermittent-hydration-error-on-the-download-page.md +6 -0
  137. package/corpus/templates/clips/changelog/2026-07-22-fixed-transcript-generation-when-native-speech-capture-retur.md +6 -0
  138. package/corpus/templates/clips/changelog/2026-07-22-fixed-windows-recordings-aborting-during-the-countdown.md +6 -0
  139. package/corpus/templates/clips/changelog/2026-07-22-permissions-and-rewind-controls-are-now-grouped-with-clearer.md +6 -0
  140. package/corpus/templates/clips/changelog/2026-07-22-the-desktop-popover-opens-centered-under-the-menu-bar-icon-o.md +6 -0
  141. package/corpus/templates/clips/changelog/2026-07-22-transcript-generation-now-retries-with-backup-speech-recogni.md +6 -0
  142. package/corpus/templates/clips/desktop/src/app.tsx +86 -82
  143. package/corpus/templates/clips/desktop/src/styles.css +13 -0
  144. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +10 -1
  145. package/corpus/templates/clips/desktop/src-tauri/src/shortcuts.rs +37 -2
  146. package/corpus/templates/clips/desktop/src-tauri/src/tray.rs +18 -0
  147. package/corpus/templates/clips/server/lib/public-agent-context.ts +2 -2
  148. package/corpus/templates/clips/server/register-secrets.ts +7 -6
  149. package/corpus/templates/content/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  150. package/corpus/templates/content/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  151. package/corpus/templates/content/.agents/skills/frontend-design/SKILL.md +22 -2
  152. package/corpus/templates/content/.agents/skills/shadcn-ui/SKILL.md +28 -4
  153. package/corpus/templates/content/app/components/editor/DocumentToolbar.tsx +41 -59
  154. package/corpus/templates/content/app/components/editor/SlashCommandMenu.tsx +16 -84
  155. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +13 -7
  156. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +41 -41
  157. package/corpus/templates/content/app/components/editor/database/GalleryView.tsx +2 -1
  158. package/corpus/templates/content/app/components/editor/database/ListView.tsx +2 -1
  159. package/corpus/templates/content/app/components/editor/database/TimelineView.tsx +9 -9
  160. package/corpus/templates/content/app/components/editor/database/sidebar.tsx +7 -7
  161. package/corpus/templates/content/app/components/editor/database-sources/BuilderSourceReviewDialog.tsx +11 -11
  162. package/corpus/templates/content/app/components/editor/extensions/ImageBlock.tsx +2 -2
  163. package/corpus/templates/content/app/components/ui/checkbox.tsx +1 -0
  164. package/corpus/templates/content/app/components/ui/collapsible.tsx +1 -0
  165. package/corpus/templates/content/app/components/ui/toolkit-provider.tsx +6 -1
  166. package/corpus/templates/content/app/design-system.ts +3 -0
  167. package/corpus/templates/content/app/global.css +29 -3
  168. package/corpus/templates/content/app/i18n-data.ts +10 -0
  169. package/corpus/templates/content/changelog/2026-07-22-page-actions-are-grouped-into-the-three-dots-menu-for-a-clea.md +6 -0
  170. package/corpus/templates/design/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  171. package/corpus/templates/design/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  172. package/corpus/templates/design/.agents/skills/frontend-design/SKILL.md +22 -2
  173. package/corpus/templates/design/.agents/skills/shadcn-ui/SKILL.md +28 -4
  174. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +8 -8
  175. package/corpus/templates/design/app/components/ui/command.tsx +1 -0
  176. package/corpus/templates/design/app/components/ui/toolkit-provider.tsx +6 -1
  177. package/corpus/templates/design/app/design-system.ts +3 -0
  178. package/corpus/templates/design/server/lib/fig-file-decoder.ts +1 -0
  179. package/corpus/templates/dispatch/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  180. package/corpus/templates/dispatch/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  181. package/corpus/templates/dispatch/.agents/skills/frontend-design/SKILL.md +22 -2
  182. package/corpus/templates/dispatch/.agents/skills/shadcn-ui/SKILL.md +28 -4
  183. package/corpus/templates/dispatch/app/components/ui/button.tsx +1 -0
  184. package/corpus/templates/dispatch/app/components/ui/toolkit-provider.tsx +17 -0
  185. package/corpus/templates/dispatch/app/design-system.ts +3 -0
  186. package/corpus/templates/dispatch/app/root.tsx +10 -7
  187. package/corpus/templates/dispatch/package.json +1 -0
  188. package/corpus/templates/forms/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  189. package/corpus/templates/forms/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  190. package/corpus/templates/forms/.agents/skills/frontend-design/SKILL.md +22 -2
  191. package/corpus/templates/forms/.agents/skills/shadcn-ui/SKILL.md +28 -4
  192. package/corpus/templates/forms/app/components/ui/toolkit-provider.tsx +6 -1
  193. package/corpus/templates/forms/app/design-system.ts +3 -0
  194. package/corpus/templates/macros/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  195. package/corpus/templates/macros/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  196. package/corpus/templates/macros/.agents/skills/frontend-design/SKILL.md +22 -2
  197. package/corpus/templates/macros/.agents/skills/shadcn-ui/SKILL.md +28 -4
  198. package/corpus/templates/macros/app/components/ui/toolkit-provider.tsx +6 -1
  199. package/corpus/templates/macros/app/design-system.ts +3 -0
  200. package/corpus/templates/mail/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  201. package/corpus/templates/mail/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  202. package/corpus/templates/mail/.agents/skills/frontend-design/SKILL.md +22 -2
  203. package/corpus/templates/mail/.agents/skills/shadcn-ui/SKILL.md +28 -4
  204. package/corpus/templates/mail/app/components/email/EmailThread.tsx +134 -93
  205. package/corpus/templates/mail/app/components/email/email-iframe-document.ts +8 -2
  206. package/corpus/templates/mail/app/components/ui/textarea.tsx +1 -21
  207. package/corpus/templates/mail/app/components/ui/toolkit-provider.tsx +6 -1
  208. package/corpus/templates/mail/app/design-system.ts +3 -0
  209. package/corpus/templates/mail/changelog/2026-07-22-email-messages-no-longer-flash-with-an-unstyled-page-while-l.md +6 -0
  210. package/corpus/templates/plan/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  211. package/corpus/templates/plan/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  212. package/corpus/templates/plan/.agents/skills/frontend-design/SKILL.md +22 -2
  213. package/corpus/templates/plan/.agents/skills/shadcn-ui/SKILL.md +28 -4
  214. package/corpus/templates/plan/app/components/plan/PlanContentRenderer.tsx +1 -1
  215. package/corpus/templates/plan/app/components/ui/toolkit-provider.tsx +6 -1
  216. package/corpus/templates/plan/app/design-system.ts +3 -0
  217. package/corpus/templates/plan/app/entry.client.tsx +3 -0
  218. package/corpus/templates/plan/changelog/2026-07-22-recover-stale-pages-after-a-deployment-refresh-automatically.md +6 -0
  219. package/corpus/templates/slides/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  220. package/corpus/templates/slides/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  221. package/corpus/templates/slides/.agents/skills/frontend-design/SKILL.md +22 -2
  222. package/corpus/templates/slides/.agents/skills/shadcn-ui/SKILL.md +28 -4
  223. package/corpus/templates/slides/app/components/ui/toolkit-provider.tsx +6 -1
  224. package/corpus/templates/slides/app/design-system.ts +3 -0
  225. package/corpus/templates/slides/app/hooks/use-agent-generating.ts +10 -3
  226. package/corpus/templates/slides/app/pages/Index.tsx +1 -0
  227. package/corpus/templates/slides/changelog/2026-07-22-new-deck-prompts-now-open-in-their-own-visible-chat-thread.md +6 -0
  228. package/corpus/templates/tasks/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  229. package/corpus/templates/tasks/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  230. package/corpus/templates/tasks/.agents/skills/frontend-design/SKILL.md +22 -2
  231. package/corpus/templates/tasks/.agents/skills/shadcn-ui/SKILL.md +28 -4
  232. package/corpus/templates/tasks/app/components/ui/toolkit-provider.tsx +17 -0
  233. package/corpus/templates/tasks/app/design-system.ts +3 -0
  234. package/corpus/templates/tasks/app/root.tsx +5 -2
  235. package/corpus/toolkit/CHANGELOG.md +23 -0
  236. package/corpus/toolkit/agent-native.eject.json +71 -0
  237. package/corpus/toolkit/package.json +31 -1
  238. package/corpus/toolkit/src/chat-history/ChatHistoryRail.tsx +100 -39
  239. package/corpus/toolkit/src/chat-history/index.ts +9 -0
  240. package/corpus/toolkit/src/chat-history/useChatHistoryRailController.ts +76 -0
  241. package/corpus/toolkit/src/chat-history.css +2 -0
  242. package/corpus/toolkit/src/composer/ComposerPlusMenu.tsx +11 -8
  243. package/corpus/toolkit/src/composer/PromptComposer.tsx +32 -7
  244. package/corpus/toolkit/src/composer/RealtimeVoiceMode.tsx +119 -31
  245. package/corpus/toolkit/src/composer/useRealtimeVoiceMode.tsx +124 -9
  246. package/corpus/toolkit/src/conformance/__fixtures__/css-in-js-adapter.tsx +401 -0
  247. package/corpus/toolkit/src/conformance/index.ts +3 -0
  248. package/corpus/toolkit/src/conformance/runner.tsx +862 -0
  249. package/corpus/toolkit/src/conformance/types.ts +45 -0
  250. package/corpus/toolkit/src/conformance/version.ts +22 -0
  251. package/corpus/toolkit/src/design-system/components.tsx +146 -0
  252. package/corpus/toolkit/src/design-system/context.tsx +31 -0
  253. package/corpus/toolkit/src/design-system/default-adapter.tsx +915 -0
  254. package/corpus/toolkit/src/design-system/definition.ts +14 -0
  255. package/corpus/toolkit/src/design-system/error-boundary.tsx +37 -0
  256. package/corpus/toolkit/src/design-system/index.ts +7 -0
  257. package/corpus/toolkit/src/design-system/theme.ts +145 -0
  258. package/corpus/toolkit/src/design-system/types.ts +363 -0
  259. package/corpus/toolkit/src/editor/SharedRichEditor.tsx +13 -2
  260. package/corpus/toolkit/src/editor/SlashCommandMenu.tsx +20 -0
  261. package/corpus/toolkit/src/editor/index.ts +2 -0
  262. package/corpus/toolkit/src/provider.tsx +98 -5
  263. package/corpus/toolkit/src/styles.css +52 -23
  264. package/corpus/toolkit/src/ui/button.tsx +95 -6
  265. package/corpus/toolkit/src/ui/dialog.tsx +48 -23
  266. package/corpus/toolkit/src/ui/popover.tsx +16 -2
  267. package/corpus/toolkit/src/ui/select.tsx +7 -3
  268. package/corpus/toolkit/src/ui/sidebar.tsx +47 -48
  269. package/corpus/toolkit/src/ui/tooltip.tsx +7 -3
  270. package/dist/a2a/client.d.ts +3 -1
  271. package/dist/a2a/client.d.ts.map +1 -1
  272. package/dist/a2a/client.js +17 -12
  273. package/dist/a2a/client.js.map +1 -1
  274. package/dist/a2a/types.d.ts +1 -1
  275. package/dist/a2a/types.d.ts.map +1 -1
  276. package/dist/a2a/types.js.map +1 -1
  277. package/dist/agent/types.d.ts +1 -1
  278. package/dist/agent/types.d.ts.map +1 -1
  279. package/dist/agent/types.js.map +1 -1
  280. package/dist/cli/index.js +18 -8
  281. package/dist/cli/index.js.map +1 -1
  282. package/dist/cli/multi-frontier-runs.js +3 -3
  283. package/dist/cli/multi-frontier-runs.js.map +1 -1
  284. package/dist/cli/templates-meta.d.ts.map +1 -1
  285. package/dist/cli/templates-meta.js +0 -12
  286. package/dist/cli/templates-meta.js.map +1 -1
  287. package/dist/cli/workspace-dev.js +1 -1
  288. package/dist/cli/workspace-dev.js.map +1 -1
  289. package/dist/client/AgentPanel.d.ts.map +1 -1
  290. package/dist/client/AgentPanel.js +18 -15
  291. package/dist/client/AgentPanel.js.map +1 -1
  292. package/dist/client/AssistantChat.d.ts.map +1 -1
  293. package/dist/client/AssistantChat.js +26 -15
  294. package/dist/client/AssistantChat.js.map +1 -1
  295. package/dist/client/CommandMenu.d.ts.map +1 -1
  296. package/dist/client/CommandMenu.js +18 -106
  297. package/dist/client/CommandMenu.js.map +1 -1
  298. package/dist/client/RunStuckBanner.d.ts +3 -5
  299. package/dist/client/RunStuckBanner.d.ts.map +1 -1
  300. package/dist/client/RunStuckBanner.js +17 -18
  301. package/dist/client/RunStuckBanner.js.map +1 -1
  302. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  303. package/dist/client/agent-chat-adapter.js +2 -1
  304. package/dist/client/agent-chat-adapter.js.map +1 -1
  305. package/dist/client/app-providers.d.ts.map +1 -1
  306. package/dist/client/app-providers.js +1 -1
  307. package/dist/client/app-providers.js.map +1 -1
  308. package/dist/client/chat/action-chat-ui-surface.d.ts +8 -0
  309. package/dist/client/chat/action-chat-ui-surface.d.ts.map +1 -0
  310. package/dist/client/chat/action-chat-ui-surface.js +10 -0
  311. package/dist/client/chat/action-chat-ui-surface.js.map +1 -0
  312. package/dist/client/chat/message-components.d.ts +12 -1
  313. package/dist/client/chat/message-components.d.ts.map +1 -1
  314. package/dist/client/chat/message-components.js +102 -14
  315. package/dist/client/chat/message-components.js.map +1 -1
  316. package/dist/client/chat/tool-call-display.d.ts +3 -1
  317. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  318. package/dist/client/chat/tool-call-display.js +33 -14
  319. package/dist/client/chat/tool-call-display.js.map +1 -1
  320. package/dist/client/chat/widgets/InlineExtensionWidget.d.ts.map +1 -1
  321. package/dist/client/chat/widgets/InlineExtensionWidget.js +9 -12
  322. package/dist/client/chat/widgets/InlineExtensionWidget.js.map +1 -1
  323. package/dist/client/chat/widgets/builtin-tool-renderers.d.ts.map +1 -1
  324. package/dist/client/chat/widgets/builtin-tool-renderers.js +5 -3
  325. package/dist/client/chat/widgets/builtin-tool-renderers.js.map +1 -1
  326. package/dist/client/components/ui/message-scroller.d.ts +1 -1
  327. package/dist/client/components/ui/message-scroller.d.ts.map +1 -1
  328. package/dist/client/components/ui/message-scroller.js +4 -3
  329. package/dist/client/components/ui/message-scroller.js.map +1 -1
  330. package/dist/client/conversation/AgentConversation.d.ts.map +1 -1
  331. package/dist/client/conversation/AgentConversation.js +3 -2
  332. package/dist/client/conversation/AgentConversation.js.map +1 -1
  333. package/dist/client/error-capture.d.ts.map +1 -1
  334. package/dist/client/error-capture.js +2 -2
  335. package/dist/client/error-capture.js.map +1 -1
  336. package/dist/client/i18n.d.ts.map +1 -1
  337. package/dist/client/i18n.js +9 -0
  338. package/dist/client/i18n.js.map +1 -1
  339. package/dist/client/index.d.ts +2 -2
  340. package/dist/client/index.d.ts.map +1 -1
  341. package/dist/client/index.js +2 -2
  342. package/dist/client/index.js.map +1 -1
  343. package/dist/client/org/TeamPage.d.ts.map +1 -1
  344. package/dist/client/org/TeamPage.js +41 -33
  345. package/dist/client/org/TeamPage.js.map +1 -1
  346. package/dist/client/progress/RunsTray.d.ts.map +1 -1
  347. package/dist/client/progress/RunsTray.js +9 -10
  348. package/dist/client/progress/RunsTray.js.map +1 -1
  349. package/dist/client/resources/McpConnectionSuggestion.d.ts +1 -0
  350. package/dist/client/resources/McpConnectionSuggestion.d.ts.map +1 -1
  351. package/dist/client/resources/McpConnectionSuggestion.js +14 -12
  352. package/dist/client/resources/McpConnectionSuggestion.js.map +1 -1
  353. package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
  354. package/dist/client/resources/McpIntegrationDialog.js +10 -8
  355. package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
  356. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  357. package/dist/client/resources/ResourcesPanel.js +3 -1
  358. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  359. package/dist/client/resources/mcp-integration-catalog.d.ts +2 -0
  360. package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
  361. package/dist/client/resources/mcp-integration-catalog.js +17 -17
  362. package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
  363. package/dist/client/resources/mcp-integration-logos.js +2 -2
  364. package/dist/client/resources/mcp-integration-logos.js.map +1 -1
  365. package/dist/client/route-chunk-recovery.d.ts.map +1 -1
  366. package/dist/client/route-chunk-recovery.js +5 -3
  367. package/dist/client/route-chunk-recovery.js.map +1 -1
  368. package/dist/client/session-replay.js +3 -3
  369. package/dist/client/session-replay.js.map +1 -1
  370. package/dist/client/settings/DemoModeSection.d.ts.map +1 -1
  371. package/dist/client/settings/DemoModeSection.js +2 -5
  372. package/dist/client/settings/DemoModeSection.js.map +1 -1
  373. package/dist/client/settings/SecretsSection.d.ts.map +1 -1
  374. package/dist/client/settings/SecretsSection.js +18 -6
  375. package/dist/client/settings/SecretsSection.js.map +1 -1
  376. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  377. package/dist/client/settings/SettingsPanel.js +53 -118
  378. package/dist/client/settings/SettingsPanel.js.map +1 -1
  379. package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
  380. package/dist/client/settings/SettingsTabsPage.js +16 -1
  381. package/dist/client/settings/SettingsTabsPage.js.map +1 -1
  382. package/dist/client/settings/VoiceTranscriptionSection.d.ts.map +1 -1
  383. package/dist/client/settings/VoiceTranscriptionSection.js +2 -5
  384. package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
  385. package/dist/client/settings/index.d.ts +1 -0
  386. package/dist/client/settings/index.d.ts.map +1 -1
  387. package/dist/client/settings/index.js +1 -0
  388. package/dist/client/settings/index.js.map +1 -1
  389. package/dist/client/settings/useSettingsPanelController.d.ts +22 -0
  390. package/dist/client/settings/useSettingsPanelController.d.ts.map +1 -0
  391. package/dist/client/settings/useSettingsPanelController.js +103 -0
  392. package/dist/client/settings/useSettingsPanelController.js.map +1 -0
  393. package/dist/client/setup-connections/BuilderConnectCard.d.ts +14 -6
  394. package/dist/client/setup-connections/BuilderConnectCard.d.ts.map +1 -1
  395. package/dist/client/setup-connections/BuilderConnectCard.js +24 -16
  396. package/dist/client/setup-connections/BuilderConnectCard.js.map +1 -1
  397. package/dist/client/setup-connections/index.d.ts +2 -1
  398. package/dist/client/setup-connections/index.d.ts.map +1 -1
  399. package/dist/client/setup-connections/index.js +2 -1
  400. package/dist/client/setup-connections/index.js.map +1 -1
  401. package/dist/client/setup-connections/useBuilderConnectCardController.d.ts +34 -0
  402. package/dist/client/setup-connections/useBuilderConnectCardController.d.ts.map +1 -0
  403. package/dist/client/setup-connections/useBuilderConnectCardController.js +39 -0
  404. package/dist/client/setup-connections/useBuilderConnectCardController.js.map +1 -0
  405. package/dist/client/sharing/ShareButton.d.ts +2 -1
  406. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  407. package/dist/client/sharing/ShareButton.js +17 -463
  408. package/dist/client/sharing/ShareButton.js.map +1 -1
  409. package/dist/client/sharing/ShareDialog.d.ts +6 -6
  410. package/dist/client/sharing/ShareDialog.d.ts.map +1 -1
  411. package/dist/client/sharing/ShareDialog.js +69 -283
  412. package/dist/client/sharing/ShareDialog.js.map +1 -1
  413. package/dist/client/sharing/index.d.ts +3 -0
  414. package/dist/client/sharing/index.d.ts.map +1 -1
  415. package/dist/client/sharing/index.js +3 -0
  416. package/dist/client/sharing/index.js.map +1 -1
  417. package/dist/client/sharing/share-controller-helpers.d.ts +70 -0
  418. package/dist/client/sharing/share-controller-helpers.d.ts.map +1 -0
  419. package/dist/client/sharing/share-controller-helpers.js +224 -0
  420. package/dist/client/sharing/share-controller-helpers.js.map +1 -0
  421. package/dist/client/sharing/useShareButtonController.d.ts +91 -0
  422. package/dist/client/sharing/useShareButtonController.d.ts.map +1 -0
  423. package/dist/client/sharing/useShareButtonController.js +397 -0
  424. package/dist/client/sharing/useShareButtonController.js.map +1 -0
  425. package/dist/client/sharing/useShareDialogController.d.ts +109 -0
  426. package/dist/client/sharing/useShareDialogController.d.ts.map +1 -0
  427. package/dist/client/sharing/useShareDialogController.js +348 -0
  428. package/dist/client/sharing/useShareDialogController.js.map +1 -0
  429. package/dist/client/sse-event-processor.d.ts.map +1 -1
  430. package/dist/client/sse-event-processor.js +21 -0
  431. package/dist/client/sse-event-processor.js.map +1 -1
  432. package/dist/client/tool-display.d.ts +16 -0
  433. package/dist/client/tool-display.d.ts.map +1 -1
  434. package/dist/client/tool-display.js +52 -0
  435. package/dist/client/tool-display.js.map +1 -1
  436. package/dist/client/transcription/use-live-transcription.d.ts +3 -3
  437. package/dist/client/transcription/use-live-transcription.d.ts.map +1 -1
  438. package/dist/client/transcription/use-live-transcription.js +22 -11
  439. package/dist/client/transcription/use-live-transcription.js.map +1 -1
  440. package/dist/client/use-agent-engine-configured.d.ts +3 -2
  441. package/dist/client/use-agent-engine-configured.d.ts.map +1 -1
  442. package/dist/client/use-agent-engine-configured.js +7 -19
  443. package/dist/client/use-agent-engine-configured.js.map +1 -1
  444. package/dist/client/use-chat-threads.d.ts.map +1 -1
  445. package/dist/client/use-chat-threads.js +21 -8
  446. package/dist/client/use-chat-threads.js.map +1 -1
  447. package/dist/collab/routes.d.ts +1 -1
  448. package/dist/collab/struct-routes.d.ts +1 -1
  449. package/dist/deploy/build.d.ts.map +1 -1
  450. package/dist/deploy/build.js +1 -1
  451. package/dist/deploy/build.js.map +1 -1
  452. package/dist/guards/db-tool-scoping.js +1 -1
  453. package/dist/guards/db-tool-scoping.js.map +1 -1
  454. package/dist/integrations/adapters/slack.d.ts +1 -0
  455. package/dist/integrations/adapters/slack.d.ts.map +1 -1
  456. package/dist/integrations/adapters/slack.js +61 -5
  457. package/dist/integrations/adapters/slack.js.map +1 -1
  458. package/dist/integrations/index.d.ts +1 -1
  459. package/dist/integrations/index.d.ts.map +1 -1
  460. package/dist/integrations/index.js +1 -1
  461. package/dist/integrations/index.js.map +1 -1
  462. package/dist/localization/default-messages.d.ts +4 -0
  463. package/dist/localization/default-messages.d.ts.map +1 -1
  464. package/dist/localization/default-messages.js +5 -1
  465. package/dist/localization/default-messages.js.map +1 -1
  466. package/dist/mcp-client/oauth-routes.d.ts +5 -0
  467. package/dist/mcp-client/oauth-routes.d.ts.map +1 -1
  468. package/dist/mcp-client/oauth-routes.js +53 -14
  469. package/dist/mcp-client/oauth-routes.js.map +1 -1
  470. package/dist/notifications/routes.d.ts +2 -2
  471. package/dist/observability/routes.d.ts +1 -1
  472. package/dist/provider-api/actions/custom-provider-registration.d.ts +12 -12
  473. package/dist/provider-api/actions/provider-api.d.ts +11 -11
  474. package/dist/scripts/call-agent.d.ts.map +1 -1
  475. package/dist/scripts/call-agent.js +5 -1
  476. package/dist/scripts/call-agent.js.map +1 -1
  477. package/dist/secrets/routes.d.ts +6 -6
  478. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  479. package/dist/server/realtime-voice.d.ts.map +1 -1
  480. package/dist/server/realtime-voice.js +2 -2
  481. package/dist/server/realtime-voice.js.map +1 -1
  482. package/dist/styles/agent-native.css +0 -24
  483. package/dist/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  484. package/dist/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  485. package/dist/templates/chat/.agents/skills/frontend-design/SKILL.md +22 -2
  486. package/dist/templates/chat/.agents/skills/shadcn-ui/SKILL.md +28 -4
  487. package/dist/templates/chat/app/components/ui/toolkit-provider.tsx +6 -1
  488. package/dist/templates/chat/app/design-system.ts +3 -0
  489. package/dist/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  490. package/dist/templates/default/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  491. package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +22 -2
  492. package/dist/templates/default/.agents/skills/shadcn-ui/SKILL.md +28 -4
  493. package/dist/templates/default/app/components/ui/toolkit-provider.tsx +10 -0
  494. package/dist/templates/default/app/design-system.ts +3 -0
  495. package/dist/templates/default/app/root.tsx +5 -2
  496. package/dist/templates/default/package.json +1 -0
  497. package/dist/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  498. package/dist/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  499. package/dist/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  500. package/dist/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  501. package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +22 -2
  502. package/dist/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +28 -4
  503. package/dist/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +7 -5
  504. package/dist/terminal/cli-registry.js +1 -1
  505. package/dist/terminal/cli-registry.js.map +1 -1
  506. package/dist/vite/client.d.ts +11 -1
  507. package/dist/vite/client.d.ts.map +1 -1
  508. package/dist/vite/client.js +144 -2
  509. package/dist/vite/client.js.map +1 -1
  510. package/docs/content/custom-design-system.mdx +445 -0
  511. package/docs/content/toolkit-ui.mdx +16 -0
  512. package/package.json +2 -2
  513. package/src/a2a/client.ts +32 -10
  514. package/src/a2a/types.ts +1 -0
  515. package/src/agent/types.ts +1 -1
  516. package/src/cli/index.ts +18 -10
  517. package/src/cli/multi-frontier-runs.ts +5 -3
  518. package/src/cli/templates-meta.ts +0 -12
  519. package/src/cli/workspace-dev.ts +1 -1
  520. package/src/client/AgentPanel.tsx +99 -108
  521. package/src/client/AssistantChat.tsx +30 -13
  522. package/src/client/CommandMenu.tsx +68 -178
  523. package/src/client/RunStuckBanner.tsx +39 -47
  524. package/src/client/agent-chat-adapter.ts +3 -1
  525. package/src/client/app-providers.tsx +1 -1
  526. package/src/client/chat/action-chat-ui-surface.tsx +32 -0
  527. package/src/client/chat/message-components.tsx +169 -18
  528. package/src/client/chat/tool-call-display.tsx +50 -14
  529. package/src/client/chat/widgets/InlineExtensionWidget.tsx +13 -40
  530. package/src/client/chat/widgets/builtin-tool-renderers.tsx +7 -3
  531. package/src/client/components/ui/message-scroller.tsx +15 -1
  532. package/src/client/conversation/AgentConversation.tsx +12 -1
  533. package/src/client/error-capture.ts +2 -6
  534. package/src/client/i18n.tsx +22 -0
  535. package/src/client/index.ts +17 -0
  536. package/src/client/org/TeamPage.tsx +257 -153
  537. package/src/client/progress/RunsTray.tsx +89 -88
  538. package/src/client/resources/McpConnectionSuggestion.tsx +25 -16
  539. package/src/client/resources/McpIntegrationDialog.tsx +34 -13
  540. package/src/client/resources/ResourcesPanel.tsx +5 -1
  541. package/src/client/resources/mcp-integration-catalog.ts +20 -17
  542. package/src/client/resources/mcp-integration-logos.ts +2 -2
  543. package/src/client/route-chunk-recovery.ts +5 -3
  544. package/src/client/session-replay.ts +3 -3
  545. package/src/client/settings/DemoModeSection.tsx +6 -18
  546. package/src/client/settings/SecretsSection.tsx +97 -52
  547. package/src/client/settings/SettingsPanel.tsx +217 -252
  548. package/src/client/settings/SettingsTabsPage.tsx +23 -2
  549. package/src/client/settings/VoiceTranscriptionSection.tsx +7 -18
  550. package/src/client/settings/index.ts +7 -0
  551. package/src/client/settings/useSettingsPanelController.ts +155 -0
  552. package/src/client/setup-connections/BuilderConnectCard.tsx +116 -51
  553. package/src/client/setup-connections/index.ts +10 -0
  554. package/src/client/setup-connections/useBuilderConnectCardController.ts +82 -0
  555. package/src/client/sharing/ShareButton.tsx +64 -586
  556. package/src/client/sharing/ShareDialog.tsx +299 -633
  557. package/src/client/sharing/index.ts +42 -0
  558. package/src/client/sharing/share-controller-helpers.ts +318 -0
  559. package/src/client/sharing/useShareButtonController.ts +600 -0
  560. package/src/client/sharing/useShareDialogController.ts +559 -0
  561. package/src/client/sse-event-processor.ts +23 -0
  562. package/src/client/tool-display.ts +71 -0
  563. package/src/client/transcription/use-live-transcription.ts +64 -45
  564. package/src/client/use-agent-engine-configured.ts +12 -19
  565. package/src/client/use-chat-threads.ts +33 -12
  566. package/src/deploy/build.ts +2 -1
  567. package/src/guards/db-tool-scoping.ts +1 -1
  568. package/src/integrations/adapters/slack.ts +84 -5
  569. package/src/integrations/index.ts +5 -1
  570. package/src/localization/default-messages.ts +6 -1
  571. package/src/mcp-client/oauth-routes.ts +61 -14
  572. package/src/scripts/call-agent.ts +5 -1
  573. package/src/server/realtime-voice.ts +5 -2
  574. package/src/styles/agent-native.css +0 -24
  575. package/src/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  576. package/src/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  577. package/src/templates/chat/.agents/skills/frontend-design/SKILL.md +22 -2
  578. package/src/templates/chat/.agents/skills/shadcn-ui/SKILL.md +28 -4
  579. package/src/templates/chat/app/components/ui/toolkit-provider.tsx +6 -1
  580. package/src/templates/chat/app/design-system.ts +3 -0
  581. package/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  582. package/src/templates/default/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  583. package/src/templates/default/.agents/skills/frontend-design/SKILL.md +22 -2
  584. package/src/templates/default/.agents/skills/shadcn-ui/SKILL.md +28 -4
  585. package/src/templates/default/app/components/ui/toolkit-provider.tsx +10 -0
  586. package/src/templates/default/app/design-system.ts +3 -0
  587. package/src/templates/default/app/root.tsx +5 -2
  588. package/src/templates/default/package.json +1 -0
  589. package/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  590. package/src/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  591. package/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  592. package/src/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  593. package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +22 -2
  594. package/src/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +28 -4
  595. package/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +7 -5
  596. package/src/terminal/cli-registry.ts +1 -1
  597. package/src/vite/client.ts +205 -1
  598. package/corpus/templates/analytics/app/components/ui/calendar.tsx +0 -70
  599. package/corpus/templates/analytics/app/components/ui/chart.tsx +0 -386
  600. package/corpus/templates/calendar/app/components/ui/sonner.tsx +0 -58
  601. package/corpus/templates/crm/.agents/skills/agent-native-docs/SKILL.md +0 -115
  602. package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +0 -142
  603. package/corpus/templates/crm/.agents/skills/crm/SKILL.md +0 -128
  604. package/corpus/templates/crm/.agents/skills/customizing-agent-native/SKILL.md +0 -145
  605. package/corpus/templates/crm/.agents/skills/feature-flags/SKILL.md +0 -169
  606. package/corpus/templates/crm/.agents/skills/upgrade-agent-native/SKILL.md +0 -100
  607. package/corpus/templates/crm/.env.example +0 -5
  608. package/corpus/templates/crm/AGENTS.md +0 -120
  609. package/corpus/templates/crm/CHANGELOG.md +0 -1
  610. package/corpus/templates/crm/DEVELOPING.md +0 -66
  611. package/corpus/templates/crm/README.md +0 -106
  612. package/corpus/templates/crm/_gitignore +0 -12
  613. package/corpus/templates/crm/actions/_crm-action-utils.ts +0 -87
  614. package/corpus/templates/crm/actions/_crm-dashboard.ts +0 -69
  615. package/corpus/templates/crm/actions/_crm-data-program-actions.ts +0 -15
  616. package/corpus/templates/crm/actions/_crm-signal-utils.ts +0 -79
  617. package/corpus/templates/crm/actions/apply-crm-proposals.ts +0 -203
  618. package/corpus/templates/crm/actions/attach-call-evidence.ts +0 -170
  619. package/corpus/templates/crm/actions/configure-crm-connection.ts +0 -126
  620. package/corpus/templates/crm/actions/configure-native-crm.ts +0 -44
  621. package/corpus/templates/crm/actions/create-crm-record.ts +0 -148
  622. package/corpus/templates/crm/actions/create-crm-signal-tracker.ts +0 -58
  623. package/corpus/templates/crm/actions/delete-staged-dataset.ts +0 -14
  624. package/corpus/templates/crm/actions/get-crm-automation-recipe.ts +0 -36
  625. package/corpus/templates/crm/actions/get-crm-dashboard-panel.ts +0 -35
  626. package/corpus/templates/crm/actions/get-crm-dashboard.ts +0 -14
  627. package/corpus/templates/crm/actions/get-crm-overview.ts +0 -13
  628. package/corpus/templates/crm/actions/get-crm-pipeline-data.ts +0 -61
  629. package/corpus/templates/crm/actions/get-crm-record.ts +0 -75
  630. package/corpus/templates/crm/actions/install-crm-pipeline-dashboard.ts +0 -81
  631. package/corpus/templates/crm/actions/list-crm-dashboard-revisions.ts +0 -15
  632. package/corpus/templates/crm/actions/list-crm-dashboards.ts +0 -15
  633. package/corpus/templates/crm/actions/list-crm-proposals.ts +0 -31
  634. package/corpus/templates/crm/actions/list-crm-records.ts +0 -79
  635. package/corpus/templates/crm/actions/list-crm-saved-views.ts +0 -15
  636. package/corpus/templates/crm/actions/list-crm-signal-hits.ts +0 -43
  637. package/corpus/templates/crm/actions/list-crm-signal-trackers.ts +0 -32
  638. package/corpus/templates/crm/actions/list-crm-tasks.ts +0 -22
  639. package/corpus/templates/crm/actions/list-staged-datasets.ts +0 -14
  640. package/corpus/templates/crm/actions/list-workspace-connections.ts +0 -47
  641. package/corpus/templates/crm/actions/manage-crm-signal-tracker.ts +0 -87
  642. package/corpus/templates/crm/actions/manage-crm-task.ts +0 -132
  643. package/corpus/templates/crm/actions/navigate.ts +0 -63
  644. package/corpus/templates/crm/actions/provider-api-catalog.ts +0 -22
  645. package/corpus/templates/crm/actions/provider-api-docs.ts +0 -54
  646. package/corpus/templates/crm/actions/provider-api-request.ts +0 -92
  647. package/corpus/templates/crm/actions/query-staged-dataset.ts +0 -44
  648. package/corpus/templates/crm/actions/record-crm-call-insight.ts +0 -160
  649. package/corpus/templates/crm/actions/record-crm-smart-signal.ts +0 -150
  650. package/corpus/templates/crm/actions/restore-crm-dashboard-revision.ts +0 -23
  651. package/corpus/templates/crm/actions/review-crm-signal.ts +0 -31
  652. package/corpus/templates/crm/actions/run-crm-saved-view-program.ts +0 -103
  653. package/corpus/templates/crm/actions/run-crm-signal-trackers.ts +0 -275
  654. package/corpus/templates/crm/actions/run.ts +0 -7
  655. package/corpus/templates/crm/actions/save-crm-dashboard.ts +0 -51
  656. package/corpus/templates/crm/actions/save-crm-saved-view.ts +0 -119
  657. package/corpus/templates/crm/actions/sync-crm.ts +0 -146
  658. package/corpus/templates/crm/actions/update-crm-record.ts +0 -510
  659. package/corpus/templates/crm/actions/view-screen.ts +0 -218
  660. package/corpus/templates/crm/agent-native.app-skill.json +0 -58
  661. package/corpus/templates/crm/app/components/crm/CreateCrmRecordDialog.tsx +0 -158
  662. package/corpus/templates/crm/app/components/crm/CrmDashboardPanel.tsx +0 -83
  663. package/corpus/templates/crm/app/components/crm/CrmSignalsPanel.tsx +0 -225
  664. package/corpus/templates/crm/app/components/crm/IntelligenceSettings.tsx +0 -413
  665. package/corpus/templates/crm/app/components/crm/RecordActions.tsx +0 -510
  666. package/corpus/templates/crm/app/components/crm/RecordGrid.tsx +0 -134
  667. package/corpus/templates/crm/app/components/crm/RecordWorkspace.tsx +0 -367
  668. package/corpus/templates/crm/app/components/crm/SavedViewDataProgram.tsx +0 -92
  669. package/corpus/templates/crm/app/components/crm/Surface.tsx +0 -96
  670. package/corpus/templates/crm/app/components/crm/WorkOverview.tsx +0 -180
  671. package/corpus/templates/crm/app/components/layout/CrmLayout.tsx +0 -112
  672. package/corpus/templates/crm/app/components/layout/CrmSidebar.tsx +0 -84
  673. package/corpus/templates/crm/app/entry.client.tsx +0 -16
  674. package/corpus/templates/crm/app/entry.server.tsx +0 -10
  675. package/corpus/templates/crm/app/global.css +0 -167
  676. package/corpus/templates/crm/app/hooks/use-navigation-state.ts +0 -60
  677. package/corpus/templates/crm/app/i18n/en-US.ts +0 -89
  678. package/corpus/templates/crm/app/i18n/index.ts +0 -34
  679. package/corpus/templates/crm/app/lib/dashboard.ts +0 -13
  680. package/corpus/templates/crm/app/lib/navigation.ts +0 -54
  681. package/corpus/templates/crm/app/lib/tab-id.ts +0 -1
  682. package/corpus/templates/crm/app/lib/types.ts +0 -172
  683. package/corpus/templates/crm/app/lib/utils.ts +0 -1
  684. package/corpus/templates/crm/app/root.tsx +0 -88
  685. package/corpus/templates/crm/app/routes/_index.tsx +0 -26
  686. package/corpus/templates/crm/app/routes/accounts.tsx +0 -41
  687. package/corpus/templates/crm/app/routes/agent.tsx +0 -5
  688. package/corpus/templates/crm/app/routes/ask.tsx +0 -53
  689. package/corpus/templates/crm/app/routes/dashboard.tsx +0 -118
  690. package/corpus/templates/crm/app/routes/opportunities.tsx +0 -41
  691. package/corpus/templates/crm/app/routes/people.tsx +0 -41
  692. package/corpus/templates/crm/app/routes/proposals.tsx +0 -266
  693. package/corpus/templates/crm/app/routes/records.$recordId.tsx +0 -35
  694. package/corpus/templates/crm/app/routes/settings.tsx +0 -63
  695. package/corpus/templates/crm/app/routes/setup.tsx +0 -308
  696. package/corpus/templates/crm/app/routes/tasks.tsx +0 -252
  697. package/corpus/templates/crm/app/routes/views.tsx +0 -333
  698. package/corpus/templates/crm/app/routes.ts +0 -17
  699. package/corpus/templates/crm/app/vite-env.d.ts +0 -6
  700. package/corpus/templates/crm/changelog/2026-07-21-agent-native-crm.md +0 -6
  701. package/corpus/templates/crm/changelog/2026-07-21-clips-call-evidence-review-recipe.md +0 -6
  702. package/corpus/templates/crm/changelog/2026-07-21-crm-can-now-find-and-review-evidence-grounded-call-signals-w.md +0 -6
  703. package/corpus/templates/crm/changelog/2026-07-21-crm-can-now-manage-keyword-and-smart-call-signal-trackers-fr.md +0 -6
  704. package/corpus/templates/crm/changelog/2026-07-21-delegated-local-crm-automation.md +0 -6
  705. package/corpus/templates/crm/changelog/2026-07-21-native-sql.md +0 -6
  706. package/corpus/templates/crm/changelog/2026-07-21-pipeline-dashboard.md +0 -6
  707. package/corpus/templates/crm/changelog/2026-07-21-pipeline-dashboards-now-install-correctly-from-the-crm-actio.md +0 -6
  708. package/corpus/templates/crm/changelog/2026-07-21-salesforce-connection.md +0 -6
  709. package/corpus/templates/crm/changelog/2026-07-22-crm-field-validation-now-explains-which-fields-cannot-be-edi.md +0 -6
  710. package/corpus/templates/crm/changelog/2026-07-22-fixed-hubspot-contact-syncs-missing-records-updated-after-th.md +0 -6
  711. package/corpus/templates/crm/changelog/2026-07-22-fixed-pipeline-dashboard-panels-so-their-opportunity-data-lo.md +0 -6
  712. package/corpus/templates/crm/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +0 -6
  713. package/corpus/templates/crm/components.json +0 -20
  714. package/corpus/templates/crm/docs/architecture/crm-contract.md +0 -180
  715. package/corpus/templates/crm/learnings.defaults.md +0 -5
  716. package/corpus/templates/crm/package.json +0 -59
  717. package/corpus/templates/crm/public/favicon.svg +0 -1
  718. package/corpus/templates/crm/public/icon-180.svg +0 -1
  719. package/corpus/templates/crm/public/manifest.json +0 -11
  720. package/corpus/templates/crm/react-router.config.ts +0 -7
  721. package/corpus/templates/crm/server/crm/adapter.ts +0 -32
  722. package/corpus/templates/crm/server/crm/crm-field-firewall.ts +0 -64
  723. package/corpus/templates/crm/server/crm/crm-mirror.ts +0 -711
  724. package/corpus/templates/crm/server/crm/hubspot-adapter.ts +0 -1146
  725. package/corpus/templates/crm/server/crm/native-adapter.ts +0 -1715
  726. package/corpus/templates/crm/server/crm/read-through.ts +0 -207
  727. package/corpus/templates/crm/server/crm/salesforce-adapter.ts +0 -1255
  728. package/corpus/templates/crm/server/db/crm-store.ts +0 -1170
  729. package/corpus/templates/crm/server/db/index.ts +0 -169
  730. package/corpus/templates/crm/server/db/schema.ts +0 -441
  731. package/corpus/templates/crm/server/lib/intelligence/default-detectors.ts +0 -65
  732. package/corpus/templates/crm/server/lib/intelligence/evidence.ts +0 -105
  733. package/corpus/templates/crm/server/lib/intelligence/keyword-detector.ts +0 -100
  734. package/corpus/templates/crm/server/lib/intelligence/smart-detector.ts +0 -144
  735. package/corpus/templates/crm/server/lib/intelligence/summary.ts +0 -141
  736. package/corpus/templates/crm/server/lib/provider-api.ts +0 -64
  737. package/corpus/templates/crm/server/middleware/auth.ts +0 -4
  738. package/corpus/templates/crm/server/plugins/agent-chat.ts +0 -68
  739. package/corpus/templates/crm/server/plugins/auth.ts +0 -14
  740. package/corpus/templates/crm/server/plugins/core-routes.ts +0 -17
  741. package/corpus/templates/crm/server/plugins/db.ts +0 -454
  742. package/corpus/templates/crm/server/routes/[...page].get.ts +0 -5
  743. package/corpus/templates/crm/shared/crm-automation-recipes.ts +0 -132
  744. package/corpus/templates/crm/shared/crm-contract.ts +0 -254
  745. package/corpus/templates/crm/shared/crm-sales-config.ts +0 -63
  746. package/corpus/templates/crm/ssr-entry.ts +0 -11
  747. package/corpus/templates/crm/tsconfig.json +0 -24
  748. package/corpus/templates/crm/vite.config.ts +0 -15
  749. package/corpus/templates/crm/vitest.config.ts +0 -5
  750. package/corpus/templates/forms/app/components/ui/calendar.tsx +0 -214
  751. package/corpus/templates/forms/app/components/ui/chart.tsx +0 -379
  752. package/corpus/templates/forms/app/components/ui/command.tsx +0 -153
  753. package/corpus/templates/forms/app/components/ui/context-menu.tsx +0 -198
  754. package/corpus/templates/forms/app/components/ui/menubar.tsx +0 -254
  755. package/corpus/templates/macros/app/components/ui/menubar.tsx +0 -238
  756. package/corpus/templates/macros/app/components/ui/progress.tsx +0 -26
  757. package/corpus/templates/mail/app/components/ui/calendar.tsx +0 -211
  758. package/corpus/templates/mail/app/components/ui/chart.tsx +0 -379
  759. package/corpus/templates/mail/app/components/ui/command.tsx +0 -153
  760. package/corpus/templates/mail/app/components/ui/context-menu.tsx +0 -198
  761. package/corpus/templates/mail/app/components/ui/menubar.tsx +0 -254
  762. package/corpus/templates/tasks/app/components/ui/accordion.tsx +0 -56
  763. package/corpus/templates/tasks/app/components/ui/aspect-ratio.tsx +0 -5
  764. package/corpus/templates/tasks/app/components/ui/breadcrumb.tsx +0 -115
  765. package/corpus/templates/tasks/app/components/ui/calendar.tsx +0 -70
  766. package/corpus/templates/tasks/app/components/ui/carousel.tsx +0 -260
  767. package/corpus/templates/tasks/app/components/ui/chart.tsx +0 -379
  768. package/corpus/templates/tasks/app/components/ui/form.tsx +0 -177
  769. package/corpus/templates/tasks/app/components/ui/hover-card.tsx +0 -27
  770. package/corpus/templates/tasks/app/components/ui/input-otp.tsx +0 -69
  771. package/corpus/templates/tasks/app/components/ui/menubar.tsx +0 -254
  772. package/corpus/templates/tasks/app/components/ui/navigation-menu.tsx +0 -128
  773. package/corpus/templates/tasks/app/components/ui/pagination.tsx +0 -121
  774. package/corpus/templates/tasks/app/components/ui/resizable.tsx +0 -43
  775. package/corpus/templates/tasks/app/components/ui/sidebar.tsx +0 -782
  776. package/corpus/templates/tasks/app/components/ui/toggle.tsx +0 -43
@@ -1 +1 @@
1
- {"version":3,"file":"use-chat-threads.js","sourceRoot":"","sources":["../../src/client/use-chat-threads.ts"],"names":[],"mappings":"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","sourcesContent":["import { useState, useEffect, useCallback, useRef, useMemo } from \"react\";\n\nimport { agentNativePath } from \"./api-path.js\";\n\nexport interface ChatThreadScope {\n type: string;\n id: string;\n label?: string;\n /** Composer context key used by ambient resource context adapters. */\n contextKey?: string;\n}\n\nexport interface ChatThreadSummary {\n id: string;\n title: string;\n preview: string;\n messageCount: number;\n createdAt: number;\n updatedAt: number;\n scope: ChatThreadScope | null;\n pinnedAt?: number | null;\n archivedAt?: number | null;\n}\n\nexport interface ChatThreadData {\n id: string;\n ownerEmail: string;\n title: string;\n preview: string;\n threadData: string;\n messageCount: number;\n createdAt: number;\n updatedAt: number;\n scope: ChatThreadScope | null;\n pinnedAt?: number | null;\n archivedAt?: number | null;\n}\n\nexport interface ChatThreadSnapshot {\n threadData: string;\n title: string;\n preview: string;\n messageCount: number;\n}\n\nexport interface ChatThreadShareState {\n enabled: boolean;\n createdAt: number | null;\n updatedAt: number | null;\n revokedAt: number | null;\n}\n\nexport interface ChatThreadShareLink extends ChatThreadShareState {\n token?: string;\n url: string;\n}\n\ntype ThreadTitleSource = \"generated\" | \"extracted\";\n\ninterface ForkSnapshotWithScope extends ChatThreadSnapshot {\n scope: ChatThreadScope | null;\n}\n\nexport interface UseChatThreadsOptions {\n /** Create an optimistic empty thread on mount when no active thread exists. */\n autoCreate?: boolean;\n /** Restore the active thread from localStorage. Defaults to true. */\n restoreActiveThread?: boolean;\n /**\n * Route-owned active thread. `undefined` preserves the legacy localStorage\n * source of truth; a string opens that thread; `null` means the URL is in\n * create/new-chat mode.\n */\n routeThreadId?: string | null;\n}\n\nconst ACTIVE_THREAD_KEY = \"agent-chat-active-thread\";\nconst THREADS_UPDATED_EVENT = \"agent-chat:threads-updated\";\nconst THREADS_PAGE_SIZE = 50;\n\nfunction emitThreadsUpdated() {\n if (typeof window === \"undefined\") return;\n window.dispatchEvent(new CustomEvent(THREADS_UPDATED_EVENT));\n}\n\nfunction sortThreadSummaries(\n threads: ChatThreadSummary[],\n): ChatThreadSummary[] {\n return [...threads].sort((a, b) => {\n const aPinnedAt = a.pinnedAt ?? null;\n const bPinnedAt = b.pinnedAt ?? null;\n if (aPinnedAt !== null || bPinnedAt !== null) {\n if (aPinnedAt === null) return 1;\n if (bPinnedAt === null) return -1;\n if (aPinnedAt !== bPinnedAt) return bPinnedAt - aPinnedAt;\n }\n return b.updatedAt - a.updatedAt;\n });\n}\n\nfunction scopeKeySegment(scope?: ChatThreadScope | null): string {\n if (!scope) return \"\";\n return `:scope:${scope.type}:${scope.id}`;\n}\n\nfunction activeThreadStorageKey(\n storageKey?: string,\n scope?: ChatThreadScope | null,\n): string {\n const scopePart = scopeKeySegment(scope);\n return storageKey\n ? `${ACTIVE_THREAD_KEY}:${storageKey}${scopePart}`\n : `${ACTIVE_THREAD_KEY}${scopePart}`;\n}\n\nfunction activeThreadSeenStorageKey(activeThreadKey: string): string {\n return `${activeThreadKey}:seen`;\n}\n\nfunction createLocalThreadId(): string {\n if (typeof crypto !== \"undefined\" && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n return `thread-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction normalizeThreadId(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 scopesMatch(\n a?: ChatThreadScope | null,\n b?: ChatThreadScope | null,\n): boolean {\n if (!a || !b) return false;\n return a.type === b.type && a.id === b.id;\n}\n\nfunction threadCanStayVisibleInScope(\n threadScope: ChatThreadScope | null,\n currentScope?: ChatThreadScope | null,\n): boolean {\n if (!threadScope) return true;\n return scopesMatch(threadScope, currentScope);\n}\n\nfunction nextThreadTitle(\n currentTitle: string | undefined,\n incomingTitle: string,\n incomingPreview: string,\n source: ThreadTitleSource = \"extracted\",\n options: { preserveUserTitle?: boolean } = {},\n): string {\n if (options.preserveUserTitle && currentTitle) return currentTitle;\n if (source === \"generated\") return incomingTitle;\n if (!currentTitle) return incomingTitle;\n if (!incomingTitle) return currentTitle;\n if (currentTitle !== incomingTitle && currentTitle !== incomingPreview) {\n return currentTitle;\n }\n return incomingTitle;\n}\n\nexport function useChatThreads(\n apiUrl = agentNativePath(\"/_agent-native/agent-chat\"),\n storageKey?: string,\n scope?: ChatThreadScope | null,\n options?: UseChatThreadsOptions,\n) {\n const autoCreate = options?.autoCreate !== false;\n const restoreActiveThread = options?.restoreActiveThread !== false;\n const routeControlsActiveThread = options?.routeThreadId !== undefined;\n const routeThreadId = normalizeThreadId(options?.routeThreadId);\n // Each (storageKey, scope) pair gets its own active-thread localStorage key\n // for chats that belong to a resource. General chats keep using the unscoped\n // key even while the user is looking at a resource, so clicking into a deck,\n // design, form, etc. doesn't make a global conversation vanish.\n const activeThreadKey = useMemo(() => {\n return activeThreadStorageKey(storageKey, scope);\n }, [storageKey, scope?.type, scope?.id]);\n // Companion key recording when the saved active thread was last live in\n // this client. A revived orphan tab (id in localStorage but not on the\n // server and not created this session) must keep its real last-seen time\n // so the 12h stale-tab cleanup can age it out — stamping it `Date.now()`\n // on every mount (the old behaviour) reset the clock forever, so\n // abandoned empty tabs never got pruned.\n const activeThreadSeenKey = useMemo(\n () => activeThreadSeenStorageKey(activeThreadKey),\n [activeThreadKey],\n );\n const initialActiveThreadRef = useRef<{\n id: string | null;\n isNew: boolean;\n } | null>(null);\n if (initialActiveThreadRef.current === null) {\n let id: string | null = null;\n let isNew = false;\n if (typeof window !== \"undefined\") {\n if (routeControlsActiveThread) {\n id = routeThreadId;\n } else {\n try {\n id = restoreActiveThread\n ? localStorage.getItem(activeThreadKey)\n : null;\n } catch {\n id = null;\n }\n }\n if (!id && autoCreate) {\n id = createLocalThreadId();\n isNew = true;\n }\n }\n initialActiveThreadRef.current = { id, isNew };\n }\n\n const [threads, setThreads] = useState<ChatThreadSummary[]>([]);\n const [hasMoreThreads, setHasMoreThreads] = useState(false);\n const [isLoadingMoreThreads, setIsLoadingMoreThreads] = useState(false);\n const [threadsLoadError, setThreadsLoadError] = useState<string | null>(null);\n const nextThreadsOffsetRef = useRef(0);\n const threadsRef = useRef<ChatThreadSummary[]>(threads);\n threadsRef.current = threads;\n\n // IDs we generated client-side this session — consumers use this to know\n // whether to skip the per-thread restore skeleton, and we use it to\n // protect the optimistic-only thread from being yanked out of local\n // state when the server's threads list (which never sees it) loads.\n const newlyCreatedRef = useRef<Set<string>>(\n initialActiveThreadRef.current.isNew && initialActiveThreadRef.current.id\n ? new Set([initialActiveThreadRef.current.id])\n : new Set(),\n );\n const optimisticThreadScopesRef = useRef<Map<string, ChatThreadScope | null>>(\n new Map(),\n );\n const pendingPinnedAtRef = useRef<Map<string, number | null>>(new Map());\n const pendingArchivedAtRef = useRef<Map<string, number | null>>(new Map());\n const userRenamedThreadIdsRef = useRef<Set<string>>(new Set());\n const userRenamedClearTimersRef = useRef<\n Map<string, ReturnType<typeof setTimeout>>\n >(new Map());\n\n const clearUserRenamedThread = useCallback((threadId: string) => {\n const timer = userRenamedClearTimersRef.current.get(threadId);\n if (timer) {\n clearTimeout(timer);\n userRenamedClearTimersRef.current.delete(threadId);\n }\n userRenamedThreadIdsRef.current.delete(threadId);\n }, []);\n\n const markUserRenamedThread = useCallback((threadId: string) => {\n userRenamedThreadIdsRef.current.add(threadId);\n const existingTimer = userRenamedClearTimersRef.current.get(threadId);\n if (existingTimer) clearTimeout(existingTimer);\n const timer = setTimeout(() => {\n userRenamedClearTimersRef.current.delete(threadId);\n userRenamedThreadIdsRef.current.delete(threadId);\n }, 30_000);\n userRenamedClearTimersRef.current.set(threadId, timer);\n }, []);\n\n useEffect(() => {\n return () => {\n for (const timer of userRenamedClearTimersRef.current.values()) {\n clearTimeout(timer);\n }\n userRenamedClearTimersRef.current.clear();\n userRenamedThreadIdsRef.current.clear();\n };\n }, []);\n\n // Latest scope as a ref so `createThread` (a useCallback that we don't\n // want to depend on scope identity) reads the current value at call\n // time. The scope a new chat inherits is the one in effect when the +\n // button is clicked, not when the hook first mounted.\n const scopeRef = useRef<ChatThreadScope | null | undefined>(scope);\n scopeRef.current = scope;\n\n const readKnownThreadScope = useCallback(\n (id: string): ChatThreadScope | null | undefined => {\n const thread = threadsRef.current.find((t) => t.id === id);\n if (thread) return thread.scope ?? null;\n if (optimisticThreadScopesRef.current.has(id)) {\n return optimisticThreadScopesRef.current.get(id) ?? null;\n }\n return undefined;\n },\n [],\n );\n\n // Add a client-generated thread to the local list optimistically.\n //\n // Critically, this does NOT `POST /threads` to the server — that path was\n // creating an empty row in `chat_threads` (message_count=0, no\n // agent_runs) on every page mount and every \"+\" click. The server\n // already creates the row idempotently the moment the user actually\n // sends their first message (`persistSubmittedUserMessage` →\n // `createThread`), so the client doesn't need to pre-create it. This\n // makes the threads table reflect real conversations only.\n const addOptimisticThread = useCallback(\n (\n id: string,\n threadScope: ChatThreadScope | null,\n // When reviving a tab the user left open in a prior session, pass the\n // persisted last-seen time so the 12h stale-tab cleanup can still age\n // it out. Omit for genuinely new tabs (defaults to now).\n seedAt?: number,\n ) => {\n const stamp =\n typeof seedAt === \"number\" && Number.isFinite(seedAt)\n ? seedAt\n : Date.now();\n const optimistic: ChatThreadSummary = {\n id,\n title: \"\",\n preview: \"\",\n messageCount: 0,\n createdAt: stamp,\n updatedAt: stamp,\n scope: threadScope,\n };\n optimisticThreadScopesRef.current.set(id, threadScope);\n setThreads((prev) =>\n prev.some((t) => t.id === id) ? prev : [optimistic, ...prev],\n );\n },\n [],\n );\n\n // Seed the active thread synchronously so the chat shell can paint\n // immediately. This may restore the saved id or create a local-only fresh id,\n // depending on options. Creating a local id is safe: no row is POSTed here,\n // so empty page loads do not create ghost `chat_threads` rows.\n const [activeThreadId, setActiveThreadId] = useState<string | null>(\n initialActiveThreadRef.current.id,\n );\n const [isLoading, setIsLoading] = useState(true);\n const fetchedRef = useRef(false);\n const activeThreadIdRef = useRef(activeThreadId);\n activeThreadIdRef.current = activeThreadId;\n\n // Persist active thread ID — and rehydrate on scope flips. When the user\n // navigates from deck A to deck B, `activeThreadKey` changes; we re-read B's\n // scoped thread only if the currently visible chat is itself scoped to a\n // different resource. Unscoped chats are global and stay visible.\n const persistedKeyRef = useRef(activeThreadKey);\n useEffect(() => {\n if (persistedKeyRef.current !== activeThreadKey) {\n if (routeControlsActiveThread) {\n persistedKeyRef.current = activeThreadKey;\n return;\n }\n const currentId = activeThreadIdRef.current;\n if (currentId) {\n const currentThreadScope = readKnownThreadScope(currentId);\n // Thread metadata not yet loaded from the server — we can't tell\n // whether the visible chat is general (stays) or scoped-elsewhere\n // (swaps). Defer until `threads` resolves and this effect re-runs;\n // we intentionally do NOT update `persistedKeyRef` so the next\n // render gets another shot. Without this guard, navigating into a\n // resource before `GET /threads` resolves silently dropped the\n // active general chat the user was just in.\n if (currentThreadScope === undefined) {\n return;\n }\n if (threadCanStayVisibleInScope(currentThreadScope, scopeRef.current)) {\n persistedKeyRef.current = activeThreadKey;\n return;\n }\n }\n persistedKeyRef.current = activeThreadKey;\n let nextActiveThreadId: string | null = null;\n try {\n nextActiveThreadId = localStorage.getItem(activeThreadKey);\n } catch {\n nextActiveThreadId = null;\n }\n if (!nextActiveThreadId && autoCreate) {\n nextActiveThreadId = createLocalThreadId();\n newlyCreatedRef.current.add(nextActiveThreadId);\n addOptimisticThread(nextActiveThreadId, scopeRef.current ?? null);\n }\n setActiveThreadId(nextActiveThreadId);\n return;\n }\n try {\n if (routeControlsActiveThread && !routeThreadId) {\n localStorage.removeItem(activeThreadKey);\n localStorage.removeItem(activeThreadSeenKey);\n return;\n }\n if (activeThreadId) {\n const threadScope = readKnownThreadScope(activeThreadId);\n if (threadScope === undefined) return;\n const targetKey = activeThreadStorageKey(storageKey, threadScope);\n localStorage.setItem(targetKey, activeThreadId);\n localStorage.setItem(\n activeThreadSeenStorageKey(targetKey),\n String(Date.now()),\n );\n } else {\n localStorage.removeItem(activeThreadKey);\n localStorage.removeItem(activeThreadSeenKey);\n }\n } catch {}\n }, [\n activeThreadId,\n activeThreadKey,\n activeThreadSeenKey,\n addOptimisticThread,\n autoCreate,\n readKnownThreadScope,\n routeControlsActiveThread,\n routeThreadId,\n storageKey,\n threads,\n ]);\n\n const fetchThreads = useCallback(\n async (options?: { append?: boolean }) => {\n try {\n const offset = options?.append ? nextThreadsOffsetRef.current : 0;\n const res = await fetch(\n offset > 0\n ? `${apiUrl}/threads?offset=${offset}`\n : `${apiUrl}/threads`,\n );\n if (!res.ok) {\n if (!options?.append) {\n setThreadsLoadError(\"Could not load chat history.\");\n }\n return;\n }\n const data = await res.json();\n setThreadsLoadError(null);\n const loaded = (data.threads ?? []) as ChatThreadSummary[];\n if (!options?.append) {\n nextThreadsOffsetRef.current = loaded.length;\n } else {\n nextThreadsOffsetRef.current += loaded.length;\n }\n setHasMoreThreads(loaded.length >= THREADS_PAGE_SIZE);\n setThreads((prev) => {\n const loadedIds = new Set(loaded.map((t) => t.id));\n // Preserve any optimistic threads we've created this session that\n // haven't shown up in the server list yet — the server only learns\n // about a thread when the user actually sends a message and the\n // agent run's `persistSubmittedUserMessage` writes the row.\n //\n // Archived threads are excluded here too: the server list omits\n // archived threads by default, so a thread we archived this same\n // session would otherwise look identical to a not-yet-synced\n // optimistic thread (created this session, missing from `loaded`)\n // and get preserved forever instead of disappearing once archived.\n const optimisticOnly = prev.filter(\n (t) =>\n newlyCreatedRef.current.has(t.id) &&\n !loadedIds.has(t.id) &&\n !t.archivedAt,\n );\n // Reconcile each server thread against our local copy. If the local\n // copy has a newer updatedAt or higher messageCount, keep those\n // fields — the server probably hasn't observed the user's latest\n // send yet, and naively replacing makes the recent-chats list\n // visibly jump back to older timestamps right after a send.\n const merged = loaded.map((server) => {\n const local = prev.find((t) => t.id === server.id);\n if (!local) return server;\n const next = { ...server };\n if (local.updatedAt > server.updatedAt) {\n next.updatedAt = local.updatedAt;\n }\n if (userRenamedThreadIdsRef.current.has(server.id) && local.title) {\n next.title = local.title;\n }\n if (pendingPinnedAtRef.current.has(server.id)) {\n next.pinnedAt = pendingPinnedAtRef.current.get(server.id) ?? null;\n }\n if (pendingArchivedAtRef.current.has(server.id)) {\n next.archivedAt =\n pendingArchivedAtRef.current.get(server.id) ?? null;\n }\n if (local.messageCount > server.messageCount) {\n next.messageCount = local.messageCount;\n if (local.preview) next.preview = local.preview;\n if (local.title) next.title = local.title;\n }\n // Preserve optimistic scope: when the server creates the row\n // on first message it does so without scope, and the next PUT\n // (saveThreadData) writes the local scope back. In the brief\n // window between those, the server list returns scope: null\n // while the user is clearly working inside a deck — keep the\n // local value so the tab bar doesn't blink unscoped.\n if (local.scope && !server.scope) {\n next.scope = local.scope;\n }\n return next;\n });\n if (options?.append) {\n const existingIds = new Set(prev.map((t) => t.id));\n return sortThreadSummaries([\n ...prev,\n ...merged.filter((t) => !existingIds.has(t.id)),\n ]);\n }\n return [...optimisticOnly, ...merged];\n });\n return data.threads as ChatThreadSummary[];\n } catch {\n if (!options?.append) {\n setThreadsLoadError(\"Could not load chat history.\");\n }\n return undefined;\n }\n },\n [apiUrl],\n );\n\n const loadMoreThreads = useCallback(async (): Promise<void> => {\n if (isLoadingMoreThreads || !hasMoreThreads) return;\n setIsLoadingMoreThreads(true);\n try {\n await fetchThreads({ append: true });\n } finally {\n setIsLoadingMoreThreads(false);\n }\n }, [fetchThreads, hasMoreThreads, isLoadingMoreThreads]);\n\n // Initial load: load threads from server, then reconcile against the\n // saved active thread.\n //\n // - savedId in loadedThreads → keep it (user's last conversation).\n // - savedId in newlyCreatedRef (we just created it this session) → keep\n // it; the server hasn't seen it yet because there's no POST anymore,\n // the row gets written when the user sends a message.\n // - savedId is set but neither on the server nor newly created here →\n // it's an empty tab the user left open. A never-messaged tab is never\n // POSTed (that was the 127-ghost-threads problem), and the only record\n // that it's a deliberately-open tab — newlyCreatedRef — is wiped by the\n // reload. So on refresh we can't tell it apart from a stale ghost.\n // Keep it exactly as the user left it: re-register it as an optimistic\n // empty tab rather than resurrecting an unrelated old conversation. The\n // composer is fully functional with this id (the server writes the row\n // on first message, same as any new tab), so there's no 404 to avoid.\n // This is what makes \"the state you left is the state you see on\n // refresh\" hold — stale (>12h) tabs are still cleared downstream.\n // - No savedId → synthesize a fresh local id (no POST; server creates the\n // row on first message). The server may contain chats from another\n // branch, preview, or project that shares the same user/database, so\n // auto-opening the latest server thread here leaks unrelated context into\n // a fresh surface. Existing threads remain available in History.\n useEffect(() => {\n if (fetchedRef.current) return;\n fetchedRef.current = true;\n\n (async () => {\n setIsLoading(true);\n const loadedThreads = await fetchThreads();\n const savedId = activeThreadIdRef.current;\n if (loadedThreads === undefined) {\n // Thread-list fetch failed. Do not reclassify a saved id as a new\n // optimistic tab; AssistantChat should still get a chance to restore\n // the specific saved thread via /threads/:id.\n setIsLoading(false);\n return;\n }\n const loadedHasSavedId = Boolean(\n savedId && loadedThreads.some((t) => t.id === savedId),\n );\n const savedIdCameFromRoute =\n Boolean(savedId) &&\n routeControlsActiveThread &&\n routeThreadId === savedId;\n\n if (\n savedId &&\n newlyCreatedRef.current.has(savedId) &&\n !loadedHasSavedId\n ) {\n addOptimisticThread(savedId, scopeRef.current ?? null);\n } else if (savedId && savedIdCameFromRoute && !loadedHasSavedId) {\n // A deep link may point to a thread that is not in the current list\n // response. Keep it route-owned so AssistantChat can restore it via\n // /threads/:id instead of reclassifying it as a new empty tab.\n setActiveThreadId(savedId);\n } else if (\n savedId &&\n !newlyCreatedRef.current.has(savedId) &&\n !loadedHasSavedId\n ) {\n // The tab the user left open isn't a server thread and we didn't\n // create it this session (newlyCreatedRef was wiped by the\n // reload). Treat it as the empty tab it is — keep its id and\n // surface it as an optimistic thread so the tab bar restores it\n // verbatim instead of yanking in the most-recent old chat.\n newlyCreatedRef.current.add(savedId);\n // Seed from the persisted last-seen time (not now) so a tab the\n // user abandoned >12h ago is correctly recognized as stale and\n // pruned by the downstream cleanup instead of living forever.\n let seenAt: number | undefined;\n try {\n const raw = localStorage.getItem(activeThreadSeenKey);\n const parsed = raw ? Number.parseInt(raw, 10) : NaN;\n if (Number.isFinite(parsed)) seenAt = parsed;\n } catch {\n // localStorage unavailable — fall back to now (current behaviour).\n }\n addOptimisticThread(savedId, scopeRef.current ?? null, seenAt);\n // activeThreadId already === savedId from the localStorage\n // initializer; nothing else to set.\n } else if (!savedId && autoCreate) {\n // Brand new surface — synthesize a local id so the composer has a\n // target. No POST: the server creates the row on first send.\n const id = createLocalThreadId();\n newlyCreatedRef.current.add(id);\n addOptimisticThread(id, scopeRef.current ?? null);\n setActiveThreadId(id);\n }\n setIsLoading(false);\n })();\n }, [\n fetchThreads,\n addOptimisticThread,\n autoCreate,\n routeControlsActiveThread,\n routeThreadId,\n ]);\n\n const createThread = useCallback(\n (preferredId?: string): Promise<string | null> => {\n // Generate ID client-side for instant UI response. No POST — the\n // server creates the row when the user actually sends a message,\n // which prevents accumulation of empty thread rows when the user\n // clicks \"+\" but never chats.\n const id = preferredId || createLocalThreadId();\n newlyCreatedRef.current.add(id);\n addOptimisticThread(id, scopeRef.current ?? null);\n setActiveThreadId(id);\n return Promise.resolve(id);\n },\n [addOptimisticThread],\n );\n\n useEffect(() => {\n if (!routeControlsActiveThread) return;\n if (routeThreadId) {\n if (activeThreadIdRef.current !== routeThreadId) {\n setActiveThreadId(routeThreadId);\n }\n return;\n }\n\n const currentId = activeThreadIdRef.current;\n const currentThread = currentId\n ? threadsRef.current.find((thread) => thread.id === currentId)\n : undefined;\n const currentIsUnsavedNewThread =\n currentId !== null &&\n newlyCreatedRef.current.has(currentId) &&\n (currentThread?.messageCount ?? 0) === 0;\n if (currentIsUnsavedNewThread) return;\n\n if (!autoCreate) {\n if (currentId !== null) setActiveThreadId(null);\n return;\n }\n\n const id = createLocalThreadId();\n newlyCreatedRef.current.add(id);\n addOptimisticThread(id, scopeRef.current ?? null);\n setActiveThreadId(id);\n }, [\n addOptimisticThread,\n autoCreate,\n routeControlsActiveThread,\n routeThreadId,\n ]);\n\n // Drop a thread's scope so it becomes a general (cross-resource) chat.\n // This is the \"Detach from <deck>\" escape hatch in the UI. The PUT\n // also bumps the thread's updatedAt so it surfaces in the All Chats\n // list right away.\n const detachThread = useCallback(\n async (threadId: string): Promise<void> => {\n try {\n const res = await fetch(\n `${apiUrl}/threads/${encodeURIComponent(threadId)}`,\n {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ scope: null }),\n },\n );\n if (!res.ok) {\n // Server rejected the detach (403/404/500) — resync from the\n // server instead of applying a scope change that didn't happen.\n await fetchThreads();\n return;\n }\n setThreads((prev) =>\n prev.map((t) => (t.id === threadId ? { ...t, scope: null } : t)),\n );\n optimisticThreadScopesRef.current.set(threadId, null);\n emitThreadsUpdated();\n } catch {\n await fetchThreads().catch(() => {});\n }\n },\n [apiUrl, fetchThreads],\n );\n\n const pinThread = useCallback(\n async (threadId: string, pinned: boolean): Promise<boolean> => {\n const previousPinnedAt =\n threadsRef.current.find((t) => t.id === threadId)?.pinnedAt ?? null;\n const previousUpdatedAt =\n threadsRef.current.find((t) => t.id === threadId)?.updatedAt ?? null;\n const now = Date.now();\n const pinnedAt = pinned ? now : null;\n pendingPinnedAtRef.current.set(threadId, pinnedAt);\n const rollback = () => {\n if (pendingPinnedAtRef.current.get(threadId) !== pinnedAt) return;\n pendingPinnedAtRef.current.delete(threadId);\n setThreads((prev) =>\n prev.map((t) =>\n t.id === threadId\n ? {\n ...t,\n pinnedAt: previousPinnedAt,\n updatedAt: previousUpdatedAt ?? t.updatedAt,\n }\n : t,\n ),\n );\n };\n setThreads((prev) =>\n prev.map((t) => (t.id === threadId ? { ...t, pinnedAt } : t)),\n );\n try {\n const res = await fetch(\n `${apiUrl}/threads/${encodeURIComponent(threadId)}/pin`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ pinned }),\n },\n );\n if (!res.ok) {\n rollback();\n await fetchThreads();\n return false;\n }\n if (pendingPinnedAtRef.current.get(threadId) === pinnedAt) {\n pendingPinnedAtRef.current.delete(threadId);\n }\n emitThreadsUpdated();\n return true;\n } catch {\n rollback();\n await fetchThreads();\n return false;\n }\n },\n [apiUrl, fetchThreads],\n );\n\n const archiveThread = useCallback(\n async (threadId: string): Promise<boolean> => {\n const previousArchivedAt =\n threadsRef.current.find((t) => t.id === threadId)?.archivedAt ?? null;\n const previousUpdatedAt =\n threadsRef.current.find((t) => t.id === threadId)?.updatedAt ?? null;\n const previousActiveThreadId = activeThreadIdRef.current;\n const archivedAt = Date.now();\n pendingArchivedAtRef.current.set(threadId, archivedAt);\n const rollback = () => {\n if (pendingArchivedAtRef.current.get(threadId) !== archivedAt) return;\n pendingArchivedAtRef.current.delete(threadId);\n setThreads((prev) =>\n prev.map((t) =>\n t.id === threadId\n ? {\n ...t,\n archivedAt: previousArchivedAt,\n updatedAt: previousUpdatedAt ?? t.updatedAt,\n }\n : t,\n ),\n );\n if (\n previousActiveThreadId === threadId &&\n activeThreadIdRef.current === null\n ) {\n setActiveThreadId(threadId);\n }\n };\n setThreads((prev) =>\n prev.map((t) => (t.id === threadId ? { ...t, archivedAt } : t)),\n );\n try {\n const res = await fetch(\n `${apiUrl}/threads/${encodeURIComponent(threadId)}/archive`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ archived: true }),\n },\n );\n if (!res.ok) {\n rollback();\n await fetchThreads();\n return false;\n }\n if (pendingArchivedAtRef.current.get(threadId) === archivedAt) {\n pendingArchivedAtRef.current.delete(threadId);\n }\n if (threadId === activeThreadIdRef.current) {\n setActiveThreadId(null);\n }\n emitThreadsUpdated();\n return true;\n } catch {\n rollback();\n await fetchThreads();\n return false;\n }\n },\n [apiUrl, fetchThreads],\n );\n\n const renameThread = useCallback(\n async (threadId: string, title: string): Promise<boolean> => {\n const nextTitle = title.replace(/\\s+/g, \" \").trim().slice(0, 160);\n if (!nextTitle) return false;\n\n const previousTitle = threadsRef.current.find(\n (t) => t.id === threadId,\n )?.title;\n const rollback = () => {\n const currentTitle = threadsRef.current.find(\n (t) => t.id === threadId,\n )?.title;\n if (currentTitle !== nextTitle) return;\n clearUserRenamedThread(threadId);\n if (previousTitle !== undefined) {\n setThreads((prev) =>\n prev.map((t) =>\n t.id === threadId ? { ...t, title: previousTitle } : t,\n ),\n );\n }\n };\n markUserRenamedThread(threadId);\n setThreads((prev) =>\n prev.map((t) => (t.id === threadId ? { ...t, title: nextTitle } : t)),\n );\n\n try {\n const res = await fetch(\n `${apiUrl}/threads/${encodeURIComponent(threadId)}/rename`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ title: nextTitle }),\n },\n );\n if (!res.ok) {\n rollback();\n await fetchThreads();\n return false;\n }\n emitThreadsUpdated();\n return true;\n } catch {\n rollback();\n await fetchThreads();\n return false;\n }\n },\n [apiUrl, clearUserRenamedThread, fetchThreads, markUserRenamedThread],\n );\n\n const isNewThread = useCallback(\n (id: string) => newlyCreatedRef.current.has(id),\n [],\n );\n\n const switchThread = useCallback((id: string) => {\n setActiveThreadId(id);\n }, []);\n\n const removeThread = useCallback(\n async (id: string) => {\n try {\n await fetch(`${apiUrl}/threads/${encodeURIComponent(id)}`, {\n method: \"DELETE\",\n });\n emitThreadsUpdated();\n } catch {}\n clearUserRenamedThread(id);\n optimisticThreadScopesRef.current.delete(id);\n setThreads((prev) => prev.filter((t) => t.id !== id));\n if (id === activeThreadIdRef.current) {\n // Switch to the next available thread, or create a new one if the\n // list is now empty. Computed outside the setThreads updater so the\n // updater stays pure (StrictMode double-invokes updaters, which would\n // otherwise create duplicate optimistic threads on the empty branch).\n const remaining = threadsRef.current.filter((t) => t.id !== id);\n if (remaining.length > 0) {\n setActiveThreadId(remaining[0].id);\n } else {\n createThread();\n }\n }\n },\n [apiUrl, clearUserRenamedThread, createThread],\n );\n\n // Ref to look up the latest scope of a known thread inside\n // saveThreadData without making the callback re-create on every\n // setThreads. The thread's scope is owned by createThread /\n // detachThread / fetchThreads — saveThreadData just mirrors it on\n // every save so the server eventually catches up after\n // persistSubmittedUserMessage creates the row sans scope.\n const saveThreadData = useCallback(\n async (\n id: string,\n data: {\n threadData: string;\n title: string;\n preview: string;\n messageCount?: number;\n titleSource?: ThreadTitleSource;\n },\n ) => {\n try {\n const { titleSource, ...threadDataPayload } = data;\n const localThread = threadsRef.current.find((t) => t.id === id);\n const localScope = localThread?.scope ?? null;\n const preserveUserTitle = userRenamedThreadIdsRef.current.has(id);\n const title = nextThreadTitle(\n localThread?.title,\n data.title,\n data.preview,\n titleSource,\n { preserveUserTitle },\n );\n const payload = {\n ...threadDataPayload,\n title,\n scope: localScope,\n };\n let response = await fetch(\n `${apiUrl}/threads/${encodeURIComponent(id)}`,\n {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n },\n );\n // A passive realtime-voice transcript can be the first content in a\n // client-created thread, so no agent run has created its SQL row yet.\n // Materialize that row idempotently and retry the same full save.\n if (response.status === 404) {\n const created = await fetch(`${apiUrl}/threads`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ id, title, scope: localScope }),\n });\n if (!created.ok) return;\n response = await fetch(\n `${apiUrl}/threads/${encodeURIComponent(id)}`,\n {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n },\n );\n }\n if (!response.ok) return;\n emitThreadsUpdated();\n // Update local thread list metadata. If the thread isn't in our\n // local list yet (an optimistic-only thread that the server just\n // created via persistSubmittedUserMessage), add it so HistoryPopover\n // can show it once it has messages.\n setThreads((prev) => {\n const exists = prev.some((t) => t.id === id);\n if (exists) {\n return sortThreadSummaries(\n prev.map((t) =>\n t.id === id\n ? {\n ...t,\n title: nextThreadTitle(\n t.title,\n data.title,\n data.preview,\n titleSource,\n {\n preserveUserTitle:\n userRenamedThreadIdsRef.current.has(id),\n },\n ),\n preview: data.preview,\n ...(data.messageCount != null && {\n messageCount: data.messageCount,\n }),\n updatedAt: Date.now(),\n }\n : t,\n ),\n );\n }\n const now = Date.now();\n return sortThreadSummaries([\n {\n id,\n title,\n preview: data.preview,\n messageCount: data.messageCount ?? 0,\n createdAt: now,\n updatedAt: now,\n scope: scopeRef.current ?? null,\n },\n ...prev,\n ]);\n });\n } catch {}\n },\n [apiUrl],\n );\n\n const generateTitle = useCallback(\n async (threadId: string, message: string): Promise<string | null> => {\n try {\n const res = await fetch(`${apiUrl}/generate-title`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ message }),\n });\n if (!res.ok) return null;\n const data = await res.json();\n const title = data.title;\n if (!title) return null;\n if (userRenamedThreadIdsRef.current.has(threadId)) return null;\n // Update the title in local state\n setThreads((prev) =>\n prev.map((t) => (t.id === threadId ? { ...t, title } : t)),\n );\n return title;\n } catch {\n return null;\n }\n },\n [apiUrl],\n );\n\n const forkThread = useCallback(\n async (\n sourceId: string,\n sourceSnapshot?: ChatThreadSnapshot | null,\n ): Promise<string | null> => {\n const id = createLocalThreadId();\n const fallbackForkFromSnapshot = async (\n source: ForkSnapshotWithScope,\n ): Promise<ChatThreadSummary | null> => {\n const title = source.title ? `${source.title} (fork)` : \"\";\n const createdAt = Date.now();\n const createRes = await fetch(`${apiUrl}/threads`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n id,\n title,\n ...(source.scope ? { scope: source.scope } : {}),\n }),\n });\n if (!createRes.ok) return null;\n\n const saveRes = await fetch(\n `${apiUrl}/threads/${encodeURIComponent(id)}`,\n {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n threadData: source.threadData,\n title,\n preview: source.preview,\n messageCount: source.messageCount,\n scope: source.scope,\n }),\n },\n );\n if (!saveRes.ok) return null;\n\n return {\n id,\n title,\n preview: source.preview,\n messageCount: source.messageCount,\n createdAt,\n updatedAt: Date.now(),\n scope: source.scope,\n };\n };\n\n try {\n const localScope =\n threadsRef.current.find((t) => t.id === sourceId)?.scope ?? null;\n const source =\n sourceSnapshot && sourceSnapshot.messageCount > 0\n ? { ...sourceSnapshot, scope: localScope }\n : undefined;\n const res = await fetch(\n `${apiUrl}/threads/${encodeURIComponent(sourceId)}/fork`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ id, ...(source ? { source } : {}) }),\n },\n );\n let thread: ChatThreadSummary | null = null;\n if (!res.ok) {\n // Surface failures so a click on the Fork button isn't a silent\n // no-op when the source thread can't be found or auth has lapsed.\n console.error(\n `[chat] fork failed for ${sourceId}: ${res.status} ${res.statusText}`,\n );\n if (source && (res.status === 404 || res.status === 405)) {\n thread = await fallbackForkFromSnapshot(source);\n }\n if (!thread) return null;\n } else {\n thread = await res.json();\n }\n // thread is non-null: the null branch returned early above (line 935)\n // and the else branch always assigns it.\n const t = thread!;\n setThreads((prev) => [\n {\n id: t.id,\n title: t.title,\n preview: t.preview,\n messageCount: t.messageCount,\n createdAt: t.createdAt,\n updatedAt: t.updatedAt,\n scope: t.scope ?? null,\n },\n ...prev,\n ]);\n emitThreadsUpdated();\n return t.id;\n } catch (err) {\n console.error(`[chat] fork threw for ${sourceId}:`, err);\n return null;\n }\n },\n [apiUrl],\n );\n\n const searchThreads = useCallback(\n async (query: string): Promise<ChatThreadSummary[]> => {\n try {\n const res = await fetch(\n `${apiUrl}/threads?q=${encodeURIComponent(query)}`,\n );\n if (!res.ok) return [];\n const data = await res.json();\n return data.threads ?? [];\n } catch {\n return [];\n }\n },\n [apiUrl],\n );\n\n const getThreadShareState = useCallback(\n async (threadId: string): Promise<ChatThreadShareState | null> => {\n try {\n const res = await fetch(\n `${apiUrl}/threads/${encodeURIComponent(threadId)}/share`,\n );\n if (!res.ok) return null;\n const data = await res.json();\n return data.share ?? null;\n } catch {\n return null;\n }\n },\n [apiUrl],\n );\n\n const createThreadShareLink = useCallback(\n async (threadId: string): Promise<ChatThreadShareLink | null> => {\n try {\n const res = await fetch(\n `${apiUrl}/threads/${encodeURIComponent(threadId)}/share`,\n { method: \"POST\" },\n );\n if (!res.ok) return null;\n const data = await res.json();\n if (!data.share || typeof data.url !== \"string\") return null;\n return { ...data.share, url: data.url };\n } catch {\n return null;\n }\n },\n [apiUrl],\n );\n\n const revokeThreadShareLink = useCallback(\n async (threadId: string): Promise<ChatThreadShareState | null> => {\n try {\n const res = await fetch(\n `${apiUrl}/threads/${encodeURIComponent(threadId)}/share`,\n { method: \"DELETE\" },\n );\n if (!res.ok) return null;\n const data = await res.json();\n return data.share ?? null;\n } catch {\n return null;\n }\n },\n [apiUrl],\n );\n\n const refreshThreads = useCallback(() => {\n fetchThreads();\n }, [fetchThreads]);\n\n return {\n threads,\n activeThreadId,\n isLoading,\n createThread,\n switchThread,\n deleteThread: removeThread,\n detachThread,\n pinThread,\n archiveThread,\n renameThread,\n forkThread,\n saveThreadData,\n generateTitle,\n searchThreads,\n loadMoreThreads,\n getThreadShareState,\n createThreadShareLink,\n revokeThreadShareLink,\n refreshThreads,\n hasMoreThreads,\n isLoadingMoreThreads,\n threadsLoadError,\n isNewThread,\n };\n}\n"]}
1
+ {"version":3,"file":"use-chat-threads.js","sourceRoot":"","sources":["../../src/client/use-chat-threads.ts"],"names":[],"mappings":"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","sourcesContent":["import { useState, useEffect, useCallback, useRef, useMemo } from \"react\";\n\nimport { agentNativePath } from \"./api-path.js\";\n\nexport interface ChatThreadScope {\n type: string;\n id: string;\n label?: string;\n /** Composer context key used by ambient resource context adapters. */\n contextKey?: string;\n}\n\nexport interface ChatThreadSummary {\n id: string;\n title: string;\n preview: string;\n messageCount: number;\n createdAt: number;\n updatedAt: number;\n scope: ChatThreadScope | null;\n pinnedAt?: number | null;\n archivedAt?: number | null;\n}\n\nexport interface ChatThreadData {\n id: string;\n ownerEmail: string;\n title: string;\n preview: string;\n threadData: string;\n messageCount: number;\n createdAt: number;\n updatedAt: number;\n scope: ChatThreadScope | null;\n pinnedAt?: number | null;\n archivedAt?: number | null;\n}\n\nexport interface ChatThreadSnapshot {\n threadData: string;\n title: string;\n preview: string;\n messageCount: number;\n}\n\nexport interface ChatThreadShareState {\n enabled: boolean;\n createdAt: number | null;\n updatedAt: number | null;\n revokedAt: number | null;\n}\n\nexport interface ChatThreadShareLink extends ChatThreadShareState {\n token?: string;\n url: string;\n}\n\ntype ThreadTitleSource = \"generated\" | \"extracted\";\n\ninterface ForkSnapshotWithScope extends ChatThreadSnapshot {\n scope: ChatThreadScope | null;\n}\n\nexport interface UseChatThreadsOptions {\n /** Create an optimistic empty thread on mount when no active thread exists. */\n autoCreate?: boolean;\n /** Restore the active thread from localStorage. Defaults to true. */\n restoreActiveThread?: boolean;\n /**\n * Route-owned active thread. `undefined` preserves the legacy localStorage\n * source of truth; a string opens that thread; `null` means the URL is in\n * create/new-chat mode.\n */\n routeThreadId?: string | null;\n}\n\nconst ACTIVE_THREAD_KEY = \"agent-chat-active-thread\";\nconst THREADS_UPDATED_EVENT = \"agent-chat:threads-updated\";\nconst THREADS_PAGE_SIZE = 50;\n\nfunction emitThreadsUpdated() {\n if (typeof window === \"undefined\") return;\n window.dispatchEvent(new CustomEvent(THREADS_UPDATED_EVENT));\n}\n\nfunction sortThreadSummaries(\n threads: ChatThreadSummary[],\n): ChatThreadSummary[] {\n return [...threads].sort((a, b) => {\n const aPinnedAt = a.pinnedAt ?? null;\n const bPinnedAt = b.pinnedAt ?? null;\n if (aPinnedAt !== null || bPinnedAt !== null) {\n if (aPinnedAt === null) return 1;\n if (bPinnedAt === null) return -1;\n if (aPinnedAt !== bPinnedAt) return bPinnedAt - aPinnedAt;\n }\n return b.updatedAt - a.updatedAt;\n });\n}\n\nfunction scopeKeySegment(scope?: ChatThreadScope | null): string {\n if (!scope) return \"\";\n return `:scope:${scope.type}:${scope.id}`;\n}\n\nfunction activeThreadStorageKey(\n storageKey?: string,\n scope?: ChatThreadScope | null,\n): string {\n const scopePart = scopeKeySegment(scope);\n return storageKey\n ? `${ACTIVE_THREAD_KEY}:${storageKey}${scopePart}`\n : `${ACTIVE_THREAD_KEY}${scopePart}`;\n}\n\nfunction activeThreadSeenStorageKey(activeThreadKey: string): string {\n return `${activeThreadKey}:seen`;\n}\n\nfunction createLocalThreadId(): string {\n if (typeof crypto !== \"undefined\" && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n return `thread-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction normalizeThreadId(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 scopesMatch(\n a?: ChatThreadScope | null,\n b?: ChatThreadScope | null,\n): boolean {\n if (!a || !b) return false;\n return a.type === b.type && a.id === b.id;\n}\n\nfunction threadCanStayVisibleInScope(\n threadScope: ChatThreadScope | null,\n currentScope?: ChatThreadScope | null,\n): boolean {\n if (!threadScope) return true;\n return scopesMatch(threadScope, currentScope);\n}\n\nfunction nextThreadTitle(\n currentTitle: string | undefined,\n incomingTitle: string,\n incomingPreview: string,\n source: ThreadTitleSource = \"extracted\",\n options: { preserveUserTitle?: boolean } = {},\n): string {\n if (options.preserveUserTitle && currentTitle) return currentTitle;\n if (source === \"generated\") return incomingTitle;\n if (!currentTitle) return incomingTitle;\n if (!incomingTitle) return currentTitle;\n if (currentTitle !== incomingTitle && currentTitle !== incomingPreview) {\n return currentTitle;\n }\n return incomingTitle;\n}\n\nexport function useChatThreads(\n apiUrl = agentNativePath(\"/_agent-native/agent-chat\"),\n storageKey?: string,\n scope?: ChatThreadScope | null,\n options?: UseChatThreadsOptions,\n) {\n const autoCreate = options?.autoCreate !== false;\n const restoreActiveThread = options?.restoreActiveThread !== false;\n const routeControlsActiveThread = options?.routeThreadId !== undefined;\n const routeThreadId = normalizeThreadId(options?.routeThreadId);\n // Each (storageKey, scope) pair gets its own active-thread localStorage key\n // for chats that belong to a resource. General chats keep using the unscoped\n // key even while the user is looking at a resource, so clicking into a deck,\n // design, form, etc. doesn't make a global conversation vanish.\n const activeThreadKey = useMemo(() => {\n return activeThreadStorageKey(storageKey, scope);\n }, [storageKey, scope?.type, scope?.id]);\n // Companion key recording when the saved active thread was last live in\n // this client. A revived orphan tab (id in localStorage but not on the\n // server and not created this session) must keep its real last-seen time\n // so the 12h stale-tab cleanup can age it out — stamping it `Date.now()`\n // on every mount (the old behaviour) reset the clock forever, so\n // abandoned empty tabs never got pruned.\n const activeThreadSeenKey = useMemo(\n () => activeThreadSeenStorageKey(activeThreadKey),\n [activeThreadKey],\n );\n const initialActiveThreadRef = useRef<{\n id: string | null;\n isNew: boolean;\n } | null>(null);\n if (initialActiveThreadRef.current === null) {\n let id: string | null = null;\n let isNew = false;\n if (typeof window !== \"undefined\") {\n if (routeControlsActiveThread) {\n id = routeThreadId;\n } else {\n try {\n id = restoreActiveThread\n ? localStorage.getItem(activeThreadKey)\n : null;\n } catch {\n id = null;\n }\n }\n if (!id && autoCreate) {\n id = createLocalThreadId();\n isNew = true;\n }\n }\n initialActiveThreadRef.current = { id, isNew };\n }\n\n const [threads, setThreads] = useState<ChatThreadSummary[]>([]);\n const [hasMoreThreads, setHasMoreThreads] = useState(false);\n const [isLoadingMoreThreads, setIsLoadingMoreThreads] = useState(false);\n const [threadsLoadError, setThreadsLoadError] = useState<string | null>(null);\n const nextThreadsOffsetRef = useRef(0);\n const threadsRef = useRef<ChatThreadSummary[]>(threads);\n threadsRef.current = threads;\n\n // IDs we generated client-side this session — consumers use this to know\n // whether to skip the per-thread restore skeleton, and we use it to\n // protect the optimistic-only thread from being yanked out of local\n // state when the server's threads list (which never sees it) loads.\n const newlyCreatedRef = useRef<Set<string>>(\n initialActiveThreadRef.current.isNew && initialActiveThreadRef.current.id\n ? new Set([initialActiveThreadRef.current.id])\n : new Set(),\n );\n const optimisticThreadScopesRef = useRef<Map<string, ChatThreadScope | null>>(\n new Map(),\n );\n const pendingPinnedAtRef = useRef<Map<string, number | null>>(new Map());\n const pendingArchivedAtRef = useRef<Map<string, number | null>>(new Map());\n const userRenamedThreadIdsRef = useRef<Set<string>>(new Set());\n const userRenamedClearTimersRef = useRef<\n Map<string, ReturnType<typeof setTimeout>>\n >(new Map());\n\n const clearUserRenamedThread = useCallback((threadId: string) => {\n const timer = userRenamedClearTimersRef.current.get(threadId);\n if (timer) {\n clearTimeout(timer);\n userRenamedClearTimersRef.current.delete(threadId);\n }\n userRenamedThreadIdsRef.current.delete(threadId);\n }, []);\n\n const markUserRenamedThread = useCallback((threadId: string) => {\n userRenamedThreadIdsRef.current.add(threadId);\n const existingTimer = userRenamedClearTimersRef.current.get(threadId);\n if (existingTimer) clearTimeout(existingTimer);\n const timer = setTimeout(() => {\n userRenamedClearTimersRef.current.delete(threadId);\n userRenamedThreadIdsRef.current.delete(threadId);\n }, 30_000);\n userRenamedClearTimersRef.current.set(threadId, timer);\n }, []);\n\n useEffect(() => {\n return () => {\n for (const timer of userRenamedClearTimersRef.current.values()) {\n clearTimeout(timer);\n }\n userRenamedClearTimersRef.current.clear();\n userRenamedThreadIdsRef.current.clear();\n };\n }, []);\n\n // Latest scope as a ref so `createThread` (a useCallback that we don't\n // want to depend on scope identity) reads the current value at call\n // time. The scope a new chat inherits is the one in effect when the +\n // button is clicked, not when the hook first mounted.\n const scopeRef = useRef<ChatThreadScope | null | undefined>(scope);\n scopeRef.current = scope;\n\n const readKnownThreadScope = useCallback(\n (id: string): ChatThreadScope | null | undefined => {\n const thread = threadsRef.current.find((t) => t.id === id);\n if (thread) return thread.scope ?? null;\n if (optimisticThreadScopesRef.current.has(id)) {\n return optimisticThreadScopesRef.current.get(id) ?? null;\n }\n return undefined;\n },\n [],\n );\n\n // Add a client-generated thread to the local list optimistically.\n //\n // Critically, this does NOT `POST /threads` to the server — that path was\n // creating an empty row in `chat_threads` (message_count=0, no\n // agent_runs) on every page mount and every \"+\" click. The server\n // already creates the row idempotently the moment the user actually\n // sends their first message (`persistSubmittedUserMessage` →\n // `createThread`), so the client doesn't need to pre-create it. This\n // makes the threads table reflect real conversations only.\n const addOptimisticThread = useCallback(\n (\n id: string,\n threadScope: ChatThreadScope | null,\n // When reviving a tab the user left open in a prior session, pass the\n // persisted last-seen time so the 12h stale-tab cleanup can still age\n // it out. Omit for genuinely new tabs (defaults to now).\n seedAt?: number,\n ) => {\n const stamp =\n typeof seedAt === \"number\" && Number.isFinite(seedAt)\n ? seedAt\n : Date.now();\n const optimistic: ChatThreadSummary = {\n id,\n title: \"\",\n preview: \"\",\n messageCount: 0,\n createdAt: stamp,\n updatedAt: stamp,\n scope: threadScope,\n };\n optimisticThreadScopesRef.current.set(id, threadScope);\n setThreads((prev) =>\n prev.some((t) => t.id === id) ? prev : [optimistic, ...prev],\n );\n },\n [],\n );\n\n // Seed the active thread synchronously so the chat shell can paint\n // immediately. This may restore the saved id or create a local-only fresh id,\n // depending on options. Creating a local id is safe: no row is POSTed here,\n // so empty page loads do not create ghost `chat_threads` rows.\n const [activeThreadId, setActiveThreadId] = useState<string | null>(\n initialActiveThreadRef.current.id,\n );\n const [isLoading, setIsLoading] = useState(true);\n const fetchedRef = useRef(false);\n const activeThreadIdRef = useRef(activeThreadId);\n activeThreadIdRef.current = activeThreadId;\n\n const persistActiveThreadId = useCallback(\n (id: string) => {\n try {\n const threadScope = readKnownThreadScope(id);\n const targetKey =\n threadScope === undefined\n ? activeThreadKey\n : activeThreadStorageKey(storageKey, threadScope);\n localStorage.setItem(targetKey, id);\n localStorage.setItem(\n activeThreadSeenStorageKey(targetKey),\n String(Date.now()),\n );\n } catch {}\n },\n [activeThreadKey, readKnownThreadScope, storageKey],\n );\n\n // Persist active thread ID — and rehydrate on scope flips. When the user\n // navigates from deck A to deck B, `activeThreadKey` changes; we re-read B's\n // scoped thread only if the currently visible chat is itself scoped to a\n // different resource. Unscoped chats are global and stay visible.\n const persistedKeyRef = useRef(activeThreadKey);\n useEffect(() => {\n if (persistedKeyRef.current !== activeThreadKey) {\n if (routeControlsActiveThread) {\n persistedKeyRef.current = activeThreadKey;\n return;\n }\n const currentId = activeThreadIdRef.current;\n if (currentId) {\n const currentThreadScope = readKnownThreadScope(currentId);\n // Thread metadata not yet loaded from the server — we can't tell\n // whether the visible chat is general (stays) or scoped-elsewhere\n // (swaps). Defer until `threads` resolves and this effect re-runs;\n // we intentionally do NOT update `persistedKeyRef` so the next\n // render gets another shot. Without this guard, navigating into a\n // resource before `GET /threads` resolves silently dropped the\n // active general chat the user was just in.\n if (currentThreadScope === undefined) {\n return;\n }\n if (threadCanStayVisibleInScope(currentThreadScope, scopeRef.current)) {\n persistedKeyRef.current = activeThreadKey;\n return;\n }\n }\n persistedKeyRef.current = activeThreadKey;\n let nextActiveThreadId: string | null = null;\n try {\n nextActiveThreadId = localStorage.getItem(activeThreadKey);\n } catch {\n nextActiveThreadId = null;\n }\n if (!nextActiveThreadId && autoCreate) {\n nextActiveThreadId = createLocalThreadId();\n newlyCreatedRef.current.add(nextActiveThreadId);\n addOptimisticThread(nextActiveThreadId, scopeRef.current ?? null);\n }\n setActiveThreadId(nextActiveThreadId);\n return;\n }\n if (!activeThreadId && !restoreActiveThread && !routeControlsActiveThread) {\n return;\n }\n try {\n if (routeControlsActiveThread && !routeThreadId) {\n localStorage.removeItem(activeThreadKey);\n localStorage.removeItem(activeThreadSeenKey);\n return;\n }\n if (activeThreadId) {\n persistActiveThreadId(activeThreadId);\n } else {\n localStorage.removeItem(activeThreadKey);\n localStorage.removeItem(activeThreadSeenKey);\n }\n } catch {}\n }, [\n activeThreadId,\n activeThreadKey,\n activeThreadSeenKey,\n addOptimisticThread,\n autoCreate,\n persistActiveThreadId,\n readKnownThreadScope,\n restoreActiveThread,\n routeControlsActiveThread,\n routeThreadId,\n storageKey,\n threads,\n ]);\n\n const fetchThreads = useCallback(\n async (options?: { append?: boolean }) => {\n try {\n const offset = options?.append ? nextThreadsOffsetRef.current : 0;\n const res = await fetch(\n offset > 0\n ? `${apiUrl}/threads?offset=${offset}`\n : `${apiUrl}/threads`,\n );\n if (!res.ok) {\n if (!options?.append) {\n setThreadsLoadError(\"Could not load chat history.\");\n }\n return;\n }\n const data = await res.json();\n setThreadsLoadError(null);\n const loaded = (data.threads ?? []) as ChatThreadSummary[];\n if (!options?.append) {\n nextThreadsOffsetRef.current = loaded.length;\n } else {\n nextThreadsOffsetRef.current += loaded.length;\n }\n setHasMoreThreads(loaded.length >= THREADS_PAGE_SIZE);\n setThreads((prev) => {\n const loadedIds = new Set(loaded.map((t) => t.id));\n // Preserve any optimistic threads we've created this session that\n // haven't shown up in the server list yet — the server only learns\n // about a thread when the user actually sends a message and the\n // agent run's `persistSubmittedUserMessage` writes the row.\n //\n // Archived threads are excluded here too: the server list omits\n // archived threads by default, so a thread we archived this same\n // session would otherwise look identical to a not-yet-synced\n // optimistic thread (created this session, missing from `loaded`)\n // and get preserved forever instead of disappearing once archived.\n const optimisticOnly = prev.filter(\n (t) =>\n newlyCreatedRef.current.has(t.id) &&\n !loadedIds.has(t.id) &&\n !t.archivedAt,\n );\n // Reconcile each server thread against our local copy. If the local\n // copy has a newer updatedAt or higher messageCount, keep those\n // fields — the server probably hasn't observed the user's latest\n // send yet, and naively replacing makes the recent-chats list\n // visibly jump back to older timestamps right after a send.\n const merged = loaded.map((server) => {\n const local = prev.find((t) => t.id === server.id);\n if (!local) return server;\n const next = { ...server };\n if (local.updatedAt > server.updatedAt) {\n next.updatedAt = local.updatedAt;\n }\n if (userRenamedThreadIdsRef.current.has(server.id) && local.title) {\n next.title = local.title;\n }\n if (pendingPinnedAtRef.current.has(server.id)) {\n next.pinnedAt = pendingPinnedAtRef.current.get(server.id) ?? null;\n }\n if (pendingArchivedAtRef.current.has(server.id)) {\n next.archivedAt =\n pendingArchivedAtRef.current.get(server.id) ?? null;\n }\n if (local.messageCount > server.messageCount) {\n next.messageCount = local.messageCount;\n if (local.preview) next.preview = local.preview;\n if (local.title) next.title = local.title;\n }\n // Preserve optimistic scope: when the server creates the row\n // on first message it does so without scope, and the next PUT\n // (saveThreadData) writes the local scope back. In the brief\n // window between those, the server list returns scope: null\n // while the user is clearly working inside a deck — keep the\n // local value so the tab bar doesn't blink unscoped.\n if (local.scope && !server.scope) {\n next.scope = local.scope;\n }\n return next;\n });\n if (options?.append) {\n const existingIds = new Set(prev.map((t) => t.id));\n return sortThreadSummaries([\n ...prev,\n ...merged.filter((t) => !existingIds.has(t.id)),\n ]);\n }\n return [...optimisticOnly, ...merged];\n });\n return data.threads as ChatThreadSummary[];\n } catch {\n if (!options?.append) {\n setThreadsLoadError(\"Could not load chat history.\");\n }\n return undefined;\n }\n },\n [apiUrl],\n );\n\n const loadMoreThreads = useCallback(async (): Promise<void> => {\n if (isLoadingMoreThreads || !hasMoreThreads) return;\n setIsLoadingMoreThreads(true);\n try {\n await fetchThreads({ append: true });\n } finally {\n setIsLoadingMoreThreads(false);\n }\n }, [fetchThreads, hasMoreThreads, isLoadingMoreThreads]);\n\n // Initial load: load threads from server, then reconcile against the\n // saved active thread.\n //\n // - savedId in loadedThreads → keep it (user's last conversation).\n // - savedId in newlyCreatedRef (we just created it this session) → keep\n // it; the server hasn't seen it yet because there's no POST anymore,\n // the row gets written when the user sends a message.\n // - savedId is set but neither on the server nor newly created here →\n // it's an empty tab the user left open. A never-messaged tab is never\n // POSTed (that was the 127-ghost-threads problem), and the only record\n // that it's a deliberately-open tab — newlyCreatedRef — is wiped by the\n // reload. So on refresh we can't tell it apart from a stale ghost.\n // Keep it exactly as the user left it: re-register it as an optimistic\n // empty tab rather than resurrecting an unrelated old conversation. The\n // composer is fully functional with this id (the server writes the row\n // on first message, same as any new tab), so there's no 404 to avoid.\n // This is what makes \"the state you left is the state you see on\n // refresh\" hold — stale (>12h) tabs are still cleared downstream.\n // - No savedId → synthesize a fresh local id (no POST; server creates the\n // row on first message). The server may contain chats from another\n // branch, preview, or project that shares the same user/database, so\n // auto-opening the latest server thread here leaks unrelated context into\n // a fresh surface. Existing threads remain available in History.\n useEffect(() => {\n if (fetchedRef.current) return;\n fetchedRef.current = true;\n\n (async () => {\n setIsLoading(true);\n const loadedThreads = await fetchThreads();\n const savedId = activeThreadIdRef.current;\n if (loadedThreads === undefined) {\n // Thread-list fetch failed. Do not reclassify a saved id as a new\n // optimistic tab; AssistantChat should still get a chance to restore\n // the specific saved thread via /threads/:id.\n setIsLoading(false);\n return;\n }\n const loadedHasSavedId = Boolean(\n savedId && loadedThreads.some((t) => t.id === savedId),\n );\n const savedIdCameFromRoute =\n Boolean(savedId) &&\n routeControlsActiveThread &&\n routeThreadId === savedId;\n\n if (\n savedId &&\n newlyCreatedRef.current.has(savedId) &&\n !loadedHasSavedId\n ) {\n addOptimisticThread(savedId, scopeRef.current ?? null);\n } else if (savedId && savedIdCameFromRoute && !loadedHasSavedId) {\n // A deep link may point to a thread that is not in the current list\n // response. Keep it route-owned so AssistantChat can restore it via\n // /threads/:id instead of reclassifying it as a new empty tab.\n setActiveThreadId(savedId);\n } else if (\n savedId &&\n !newlyCreatedRef.current.has(savedId) &&\n !loadedHasSavedId\n ) {\n // The tab the user left open isn't a server thread and we didn't\n // create it this session (newlyCreatedRef was wiped by the\n // reload). Treat it as the empty tab it is — keep its id and\n // surface it as an optimistic thread so the tab bar restores it\n // verbatim instead of yanking in the most-recent old chat.\n newlyCreatedRef.current.add(savedId);\n // Seed from the persisted last-seen time (not now) so a tab the\n // user abandoned >12h ago is correctly recognized as stale and\n // pruned by the downstream cleanup instead of living forever.\n let seenAt: number | undefined;\n try {\n const raw = localStorage.getItem(activeThreadSeenKey);\n const parsed = raw ? Number.parseInt(raw, 10) : NaN;\n if (Number.isFinite(parsed)) seenAt = parsed;\n } catch {\n // localStorage unavailable — fall back to now (current behaviour).\n }\n addOptimisticThread(savedId, scopeRef.current ?? null, seenAt);\n // activeThreadId already === savedId from the localStorage\n // initializer; nothing else to set.\n } else if (!savedId && autoCreate) {\n // Brand new surface — synthesize a local id so the composer has a\n // target. No POST: the server creates the row on first send.\n const id = createLocalThreadId();\n newlyCreatedRef.current.add(id);\n addOptimisticThread(id, scopeRef.current ?? null);\n setActiveThreadId(id);\n }\n setIsLoading(false);\n })();\n }, [\n fetchThreads,\n addOptimisticThread,\n autoCreate,\n routeControlsActiveThread,\n routeThreadId,\n ]);\n\n const createThread = useCallback(\n (preferredId?: string): Promise<string | null> => {\n // Generate ID client-side for instant UI response. No POST — the\n // server creates the row when the user actually sends a message,\n // which prevents accumulation of empty thread rows when the user\n // clicks \"+\" but never chats.\n const id = preferredId || createLocalThreadId();\n newlyCreatedRef.current.add(id);\n addOptimisticThread(id, scopeRef.current ?? null);\n persistActiveThreadId(id);\n setActiveThreadId(id);\n return Promise.resolve(id);\n },\n [addOptimisticThread, persistActiveThreadId],\n );\n\n useEffect(() => {\n if (!routeControlsActiveThread) return;\n if (routeThreadId) {\n if (activeThreadIdRef.current !== routeThreadId) {\n setActiveThreadId(routeThreadId);\n }\n return;\n }\n\n const currentId = activeThreadIdRef.current;\n const currentThread = currentId\n ? threadsRef.current.find((thread) => thread.id === currentId)\n : undefined;\n const currentIsUnsavedNewThread =\n currentId !== null &&\n newlyCreatedRef.current.has(currentId) &&\n (currentThread?.messageCount ?? 0) === 0;\n if (currentIsUnsavedNewThread) return;\n\n if (!autoCreate) {\n if (currentId !== null) setActiveThreadId(null);\n return;\n }\n\n const id = createLocalThreadId();\n newlyCreatedRef.current.add(id);\n addOptimisticThread(id, scopeRef.current ?? null);\n setActiveThreadId(id);\n }, [\n addOptimisticThread,\n autoCreate,\n routeControlsActiveThread,\n routeThreadId,\n ]);\n\n // Drop a thread's scope so it becomes a general (cross-resource) chat.\n // This is the \"Detach from <deck>\" escape hatch in the UI. The PUT\n // also bumps the thread's updatedAt so it surfaces in the All Chats\n // list right away.\n const detachThread = useCallback(\n async (threadId: string): Promise<void> => {\n try {\n const res = await fetch(\n `${apiUrl}/threads/${encodeURIComponent(threadId)}`,\n {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ scope: null }),\n },\n );\n if (!res.ok) {\n // Server rejected the detach (403/404/500) — resync from the\n // server instead of applying a scope change that didn't happen.\n await fetchThreads();\n return;\n }\n setThreads((prev) =>\n prev.map((t) => (t.id === threadId ? { ...t, scope: null } : t)),\n );\n optimisticThreadScopesRef.current.set(threadId, null);\n emitThreadsUpdated();\n } catch {\n await fetchThreads().catch(() => {});\n }\n },\n [apiUrl, fetchThreads],\n );\n\n const pinThread = useCallback(\n async (threadId: string, pinned: boolean): Promise<boolean> => {\n const previousPinnedAt =\n threadsRef.current.find((t) => t.id === threadId)?.pinnedAt ?? null;\n const previousUpdatedAt =\n threadsRef.current.find((t) => t.id === threadId)?.updatedAt ?? null;\n const now = Date.now();\n const pinnedAt = pinned ? now : null;\n pendingPinnedAtRef.current.set(threadId, pinnedAt);\n const rollback = () => {\n if (pendingPinnedAtRef.current.get(threadId) !== pinnedAt) return;\n pendingPinnedAtRef.current.delete(threadId);\n setThreads((prev) =>\n prev.map((t) =>\n t.id === threadId\n ? {\n ...t,\n pinnedAt: previousPinnedAt,\n updatedAt: previousUpdatedAt ?? t.updatedAt,\n }\n : t,\n ),\n );\n };\n setThreads((prev) =>\n prev.map((t) => (t.id === threadId ? { ...t, pinnedAt } : t)),\n );\n try {\n const res = await fetch(\n `${apiUrl}/threads/${encodeURIComponent(threadId)}/pin`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ pinned }),\n },\n );\n if (!res.ok) {\n rollback();\n await fetchThreads();\n return false;\n }\n if (pendingPinnedAtRef.current.get(threadId) === pinnedAt) {\n pendingPinnedAtRef.current.delete(threadId);\n }\n emitThreadsUpdated();\n return true;\n } catch {\n rollback();\n await fetchThreads();\n return false;\n }\n },\n [apiUrl, fetchThreads],\n );\n\n const archiveThread = useCallback(\n async (threadId: string): Promise<boolean> => {\n const previousArchivedAt =\n threadsRef.current.find((t) => t.id === threadId)?.archivedAt ?? null;\n const previousUpdatedAt =\n threadsRef.current.find((t) => t.id === threadId)?.updatedAt ?? null;\n const previousActiveThreadId = activeThreadIdRef.current;\n const archivedAt = Date.now();\n pendingArchivedAtRef.current.set(threadId, archivedAt);\n const rollback = () => {\n if (pendingArchivedAtRef.current.get(threadId) !== archivedAt) return;\n pendingArchivedAtRef.current.delete(threadId);\n setThreads((prev) =>\n prev.map((t) =>\n t.id === threadId\n ? {\n ...t,\n archivedAt: previousArchivedAt,\n updatedAt: previousUpdatedAt ?? t.updatedAt,\n }\n : t,\n ),\n );\n if (\n previousActiveThreadId === threadId &&\n activeThreadIdRef.current === null\n ) {\n setActiveThreadId(threadId);\n }\n };\n setThreads((prev) =>\n prev.map((t) => (t.id === threadId ? { ...t, archivedAt } : t)),\n );\n try {\n const res = await fetch(\n `${apiUrl}/threads/${encodeURIComponent(threadId)}/archive`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ archived: true }),\n },\n );\n if (!res.ok) {\n rollback();\n await fetchThreads();\n return false;\n }\n if (pendingArchivedAtRef.current.get(threadId) === archivedAt) {\n pendingArchivedAtRef.current.delete(threadId);\n }\n if (threadId === activeThreadIdRef.current) {\n setActiveThreadId(null);\n }\n emitThreadsUpdated();\n return true;\n } catch {\n rollback();\n await fetchThreads();\n return false;\n }\n },\n [apiUrl, fetchThreads],\n );\n\n const renameThread = useCallback(\n async (threadId: string, title: string): Promise<boolean> => {\n const nextTitle = title.replace(/\\s+/g, \" \").trim().slice(0, 160);\n if (!nextTitle) return false;\n\n const previousTitle = threadsRef.current.find(\n (t) => t.id === threadId,\n )?.title;\n const rollback = () => {\n const currentTitle = threadsRef.current.find(\n (t) => t.id === threadId,\n )?.title;\n if (currentTitle !== nextTitle) return;\n clearUserRenamedThread(threadId);\n if (previousTitle !== undefined) {\n setThreads((prev) =>\n prev.map((t) =>\n t.id === threadId ? { ...t, title: previousTitle } : t,\n ),\n );\n }\n };\n markUserRenamedThread(threadId);\n setThreads((prev) =>\n prev.map((t) => (t.id === threadId ? { ...t, title: nextTitle } : t)),\n );\n\n try {\n const res = await fetch(\n `${apiUrl}/threads/${encodeURIComponent(threadId)}/rename`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ title: nextTitle }),\n },\n );\n if (!res.ok) {\n rollback();\n await fetchThreads();\n return false;\n }\n emitThreadsUpdated();\n return true;\n } catch {\n rollback();\n await fetchThreads();\n return false;\n }\n },\n [apiUrl, clearUserRenamedThread, fetchThreads, markUserRenamedThread],\n );\n\n const isNewThread = useCallback(\n (id: string) => newlyCreatedRef.current.has(id),\n [],\n );\n\n const switchThread = useCallback(\n (id: string) => {\n persistActiveThreadId(id);\n setActiveThreadId(id);\n },\n [persistActiveThreadId],\n );\n\n const removeThread = useCallback(\n async (id: string) => {\n try {\n await fetch(`${apiUrl}/threads/${encodeURIComponent(id)}`, {\n method: \"DELETE\",\n });\n emitThreadsUpdated();\n } catch {}\n clearUserRenamedThread(id);\n optimisticThreadScopesRef.current.delete(id);\n setThreads((prev) => prev.filter((t) => t.id !== id));\n if (id === activeThreadIdRef.current) {\n // Switch to the next available thread, or create a new one if the\n // list is now empty. Computed outside the setThreads updater so the\n // updater stays pure (StrictMode double-invokes updaters, which would\n // otherwise create duplicate optimistic threads on the empty branch).\n const remaining = threadsRef.current.filter((t) => t.id !== id);\n if (remaining.length > 0) {\n setActiveThreadId(remaining[0].id);\n } else {\n createThread();\n }\n }\n },\n [apiUrl, clearUserRenamedThread, createThread],\n );\n\n // Ref to look up the latest scope of a known thread inside\n // saveThreadData without making the callback re-create on every\n // setThreads. The thread's scope is owned by createThread /\n // detachThread / fetchThreads — saveThreadData just mirrors it on\n // every save so the server eventually catches up after\n // persistSubmittedUserMessage creates the row sans scope.\n const saveThreadData = useCallback(\n async (\n id: string,\n data: {\n threadData: string;\n title: string;\n preview: string;\n messageCount?: number;\n titleSource?: ThreadTitleSource;\n },\n ) => {\n try {\n const { titleSource, ...threadDataPayload } = data;\n const localThread = threadsRef.current.find((t) => t.id === id);\n const localScope = localThread?.scope ?? null;\n const preserveUserTitle = userRenamedThreadIdsRef.current.has(id);\n const title = nextThreadTitle(\n localThread?.title,\n data.title,\n data.preview,\n titleSource,\n { preserveUserTitle },\n );\n const payload = {\n ...threadDataPayload,\n title,\n scope: localScope,\n };\n let response = await fetch(\n `${apiUrl}/threads/${encodeURIComponent(id)}`,\n {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n },\n );\n // A passive realtime-voice transcript can be the first content in a\n // client-created thread, so no agent run has created its SQL row yet.\n // Materialize that row idempotently and retry the same full save.\n if (response.status === 404) {\n const created = await fetch(`${apiUrl}/threads`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ id, title, scope: localScope }),\n });\n if (!created.ok) return;\n response = await fetch(\n `${apiUrl}/threads/${encodeURIComponent(id)}`,\n {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n },\n );\n }\n if (!response.ok) return;\n emitThreadsUpdated();\n // Update local thread list metadata. If the thread isn't in our\n // local list yet (an optimistic-only thread that the server just\n // created via persistSubmittedUserMessage), add it so HistoryPopover\n // can show it once it has messages.\n setThreads((prev) => {\n const exists = prev.some((t) => t.id === id);\n if (exists) {\n return sortThreadSummaries(\n prev.map((t) =>\n t.id === id\n ? {\n ...t,\n title: nextThreadTitle(\n t.title,\n data.title,\n data.preview,\n titleSource,\n {\n preserveUserTitle:\n userRenamedThreadIdsRef.current.has(id),\n },\n ),\n preview: data.preview,\n ...(data.messageCount != null && {\n messageCount: data.messageCount,\n }),\n updatedAt: Date.now(),\n }\n : t,\n ),\n );\n }\n const now = Date.now();\n return sortThreadSummaries([\n {\n id,\n title,\n preview: data.preview,\n messageCount: data.messageCount ?? 0,\n createdAt: now,\n updatedAt: now,\n scope: scopeRef.current ?? null,\n },\n ...prev,\n ]);\n });\n } catch {}\n },\n [apiUrl],\n );\n\n const generateTitle = useCallback(\n async (threadId: string, message: string): Promise<string | null> => {\n try {\n const res = await fetch(`${apiUrl}/generate-title`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ message }),\n });\n if (!res.ok) return null;\n const data = await res.json();\n const title = data.title;\n if (!title) return null;\n if (userRenamedThreadIdsRef.current.has(threadId)) return null;\n // Update the title in local state\n setThreads((prev) =>\n prev.map((t) => (t.id === threadId ? { ...t, title } : t)),\n );\n return title;\n } catch {\n return null;\n }\n },\n [apiUrl],\n );\n\n const forkThread = useCallback(\n async (\n sourceId: string,\n sourceSnapshot?: ChatThreadSnapshot | null,\n ): Promise<string | null> => {\n const id = createLocalThreadId();\n const fallbackForkFromSnapshot = async (\n source: ForkSnapshotWithScope,\n ): Promise<ChatThreadSummary | null> => {\n const title = source.title ? `${source.title} (fork)` : \"\";\n const createdAt = Date.now();\n const createRes = await fetch(`${apiUrl}/threads`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n id,\n title,\n ...(source.scope ? { scope: source.scope } : {}),\n }),\n });\n if (!createRes.ok) return null;\n\n const saveRes = await fetch(\n `${apiUrl}/threads/${encodeURIComponent(id)}`,\n {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n threadData: source.threadData,\n title,\n preview: source.preview,\n messageCount: source.messageCount,\n scope: source.scope,\n }),\n },\n );\n if (!saveRes.ok) return null;\n\n return {\n id,\n title,\n preview: source.preview,\n messageCount: source.messageCount,\n createdAt,\n updatedAt: Date.now(),\n scope: source.scope,\n };\n };\n\n try {\n const localScope =\n threadsRef.current.find((t) => t.id === sourceId)?.scope ?? null;\n const source =\n sourceSnapshot && sourceSnapshot.messageCount > 0\n ? { ...sourceSnapshot, scope: localScope }\n : undefined;\n const res = await fetch(\n `${apiUrl}/threads/${encodeURIComponent(sourceId)}/fork`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ id, ...(source ? { source } : {}) }),\n },\n );\n let thread: ChatThreadSummary | null = null;\n if (!res.ok) {\n // Surface failures so a click on the Fork button isn't a silent\n // no-op when the source thread can't be found or auth has lapsed.\n console.error(\n `[chat] fork failed for ${sourceId}: ${res.status} ${res.statusText}`,\n );\n if (source && (res.status === 404 || res.status === 405)) {\n thread = await fallbackForkFromSnapshot(source);\n }\n if (!thread) return null;\n } else {\n thread = await res.json();\n }\n // thread is non-null: the null branch returned early above (line 935)\n // and the else branch always assigns it.\n const t = thread!;\n setThreads((prev) => [\n {\n id: t.id,\n title: t.title,\n preview: t.preview,\n messageCount: t.messageCount,\n createdAt: t.createdAt,\n updatedAt: t.updatedAt,\n scope: t.scope ?? null,\n },\n ...prev,\n ]);\n emitThreadsUpdated();\n return t.id;\n } catch (err) {\n console.error(`[chat] fork threw for ${sourceId}:`, err);\n return null;\n }\n },\n [apiUrl],\n );\n\n const searchThreads = useCallback(\n async (query: string): Promise<ChatThreadSummary[]> => {\n try {\n const res = await fetch(\n `${apiUrl}/threads?q=${encodeURIComponent(query)}`,\n );\n if (!res.ok) return [];\n const data = await res.json();\n return data.threads ?? [];\n } catch {\n return [];\n }\n },\n [apiUrl],\n );\n\n const getThreadShareState = useCallback(\n async (threadId: string): Promise<ChatThreadShareState | null> => {\n try {\n const res = await fetch(\n `${apiUrl}/threads/${encodeURIComponent(threadId)}/share`,\n );\n if (!res.ok) return null;\n const data = await res.json();\n return data.share ?? null;\n } catch {\n return null;\n }\n },\n [apiUrl],\n );\n\n const createThreadShareLink = useCallback(\n async (threadId: string): Promise<ChatThreadShareLink | null> => {\n try {\n const res = await fetch(\n `${apiUrl}/threads/${encodeURIComponent(threadId)}/share`,\n { method: \"POST\" },\n );\n if (!res.ok) return null;\n const data = await res.json();\n if (!data.share || typeof data.url !== \"string\") return null;\n return { ...data.share, url: data.url };\n } catch {\n return null;\n }\n },\n [apiUrl],\n );\n\n const revokeThreadShareLink = useCallback(\n async (threadId: string): Promise<ChatThreadShareState | null> => {\n try {\n const res = await fetch(\n `${apiUrl}/threads/${encodeURIComponent(threadId)}/share`,\n { method: \"DELETE\" },\n );\n if (!res.ok) return null;\n const data = await res.json();\n return data.share ?? null;\n } catch {\n return null;\n }\n },\n [apiUrl],\n );\n\n const refreshThreads = useCallback(() => {\n fetchThreads();\n }, [fetchThreads]);\n\n return {\n threads,\n activeThreadId,\n isLoading,\n createThread,\n switchThread,\n deleteThread: removeThread,\n detachThread,\n pinThread,\n archiveThread,\n renameThread,\n forkThread,\n saveThreadData,\n generateTitle,\n searchThreads,\n loadMoreThreads,\n getThreadShareState,\n createThreadShareLink,\n revokeThreadShareLink,\n refreshThreads,\n hasMoreThreads,\n isLoadingMoreThreads,\n threadsLoadError,\n isNewThread,\n };\n}\n"]}
@@ -26,8 +26,8 @@ export declare const getCollabState: import("h3").EventHandlerWithFetch<import("
26
26
  * Body: { update: string (base64), requestSource?: string }
27
27
  */
28
28
  export declare const postCollabUpdate: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
29
- error: string;
30
29
  ok?: undefined;
30
+ error: string;
31
31
  } | {
32
32
  error?: undefined;
33
33
  ok: boolean;
@@ -13,8 +13,8 @@
13
13
  * Body: { json: any, fieldName?: string, type?: "map"|"array", requestSource?: string }
14
14
  */
15
15
  export declare const postCollabJson: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
16
- error: string;
17
16
  ok?: undefined;
17
+ error: string;
18
18
  } | {
19
19
  error?: undefined;
20
20
  ok: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/deploy/build.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/deploy/build.ts"],"names":[],"mappings":"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"}
@@ -1475,7 +1475,7 @@ async function buildCloudflarePages() {
1475
1475
  // files. Both import sites degrade gracefully when the runtime import
1476
1476
  // fails: context-xray token counts fall back to char/4 estimates and the
1477
1477
  // OG image route falls back to SVG.
1478
- const heavyClientExternals = CLOUDFLARE_WORKER_ESBUILD_EXTERNALS.filter((p) => !Object.hasOwn(CLOUDFLARE_WORKER_STUB_MODULES, p)).map((p) => `--external:${p}`);
1478
+ const heavyClientExternals = CLOUDFLARE_WORKER_ESBUILD_EXTERNALS.filter((p) => !Object.prototype.hasOwnProperty.call(CLOUDFLARE_WORKER_STUB_MODULES, p)).map((p) => `--external:${p}`);
1479
1479
  execFileSync(esbuildBin, [
1480
1480
  tmpEntry,
1481
1481
  "--bundle",