@agent-native/core 0.117.1 → 0.118.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (815) hide show
  1. package/corpus/README.md +3 -3
  2. package/corpus/core/CHANGELOG.md +40 -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 +2 -1
  6. package/corpus/core/src/a2a/types.ts +1 -0
  7. package/corpus/core/src/agent/types.ts +1 -1
  8. package/corpus/core/src/cli/context-xray-local.ts +1 -1
  9. package/corpus/core/src/client/AgentPanel.tsx +90 -107
  10. package/corpus/core/src/client/AssistantChat.tsx +30 -13
  11. package/corpus/core/src/client/CommandMenu.tsx +68 -178
  12. package/corpus/core/src/client/agent-chat-adapter.ts +3 -1
  13. package/corpus/core/src/client/app-providers.tsx +1 -1
  14. package/corpus/core/src/client/chat/message-components.tsx +116 -10
  15. package/corpus/core/src/client/chat/tool-call-display.tsx +26 -5
  16. package/corpus/core/src/client/chat/widgets/InlineExtensionWidget.tsx +14 -40
  17. package/corpus/core/src/client/components/ui/message-scroller.tsx +15 -1
  18. package/corpus/core/src/client/extensions/ExtensionViewer.tsx +4 -4
  19. package/corpus/core/src/client/extensions/ExtensionsSidebarSection.tsx +11 -11
  20. package/corpus/core/src/client/extensions/agent-native-extension-runtime.ts +1 -1
  21. package/corpus/core/src/client/extensions/delete-extension.ts +2 -2
  22. package/corpus/core/src/client/i18n.tsx +22 -0
  23. package/corpus/core/src/client/index.ts +17 -0
  24. package/corpus/core/src/client/org/OrgSwitcher.tsx +25 -1
  25. package/corpus/core/src/client/org/TeamPage.tsx +257 -153
  26. package/corpus/core/src/client/progress/RunsTray.tsx +89 -88
  27. package/corpus/core/src/client/resources/McpConnectionSuggestion.tsx +5 -2
  28. package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +34 -13
  29. package/corpus/core/src/client/resources/mcp-integration-catalog.ts +13 -0
  30. package/corpus/core/src/client/settings/DemoModeSection.tsx +6 -18
  31. package/corpus/core/src/client/settings/SecretsSection.tsx +97 -52
  32. package/corpus/core/src/client/settings/SettingsPanel.tsx +302 -254
  33. package/corpus/core/src/client/settings/SettingsTabsPage.tsx +23 -2
  34. package/corpus/core/src/client/settings/VoiceTranscriptionSection.tsx +7 -18
  35. package/corpus/core/src/client/settings/index.ts +7 -0
  36. package/corpus/core/src/client/settings/useSettingsPanelController.ts +155 -0
  37. package/corpus/core/src/client/setup-connections/BuilderConnectCard.tsx +116 -51
  38. package/corpus/core/src/client/setup-connections/index.ts +10 -0
  39. package/corpus/core/src/client/setup-connections/useBuilderConnectCardController.ts +82 -0
  40. package/corpus/core/src/client/sharing/ShareButton.tsx +71 -592
  41. package/corpus/core/src/client/sharing/ShareDialog.tsx +299 -633
  42. package/corpus/core/src/client/sharing/index.ts +42 -0
  43. package/corpus/core/src/client/sharing/share-controller-helpers.ts +318 -0
  44. package/corpus/core/src/client/sharing/useShareButtonController.ts +600 -0
  45. package/corpus/core/src/client/sharing/useShareDialogController.ts +559 -0
  46. package/corpus/core/src/client/sse-event-processor.ts +23 -0
  47. package/corpus/core/src/client/tool-display.ts +71 -0
  48. package/corpus/core/src/client/use-agent-engine-configured.ts +12 -19
  49. package/corpus/core/src/client/use-chat-threads.ts +33 -12
  50. package/corpus/core/src/db/client.ts +13 -10
  51. package/corpus/core/src/extensions/actions.ts +13 -5
  52. package/corpus/core/src/extensions/local.ts +1 -0
  53. package/corpus/core/src/extensions/routes.ts +10 -5
  54. package/corpus/core/src/extensions/schema.ts +5 -0
  55. package/corpus/core/src/extensions/slots/store.ts +14 -4
  56. package/corpus/core/src/extensions/store.ts +55 -19
  57. package/corpus/core/src/extensions/theme.ts +1 -1
  58. package/corpus/core/src/file-upload/registry.ts +9 -0
  59. package/corpus/core/src/index.browser.ts +5 -0
  60. package/corpus/core/src/index.ts +1 -0
  61. package/corpus/core/src/localization/default-messages.ts +28 -6
  62. package/corpus/core/src/mcp-client/oauth-routes.ts +16 -2
  63. package/corpus/core/src/scripts/call-agent.ts +5 -1
  64. package/corpus/core/src/server/action-discovery.ts +8 -0
  65. package/corpus/core/src/server/better-auth-instance.ts +7 -2
  66. package/corpus/core/src/server/email-template.ts +18 -0
  67. package/corpus/core/src/server/email-templates.ts +3 -0
  68. package/corpus/core/src/server/email.ts +40 -4
  69. package/corpus/core/src/server/realtime-voice.ts +1 -1
  70. package/corpus/core/src/sharing/actions/share-resource.ts +1 -0
  71. package/corpus/core/src/styles/agent-native.css +0 -24
  72. package/corpus/core/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  73. package/corpus/core/src/templates/default/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  74. package/corpus/core/src/templates/default/.agents/skills/frontend-design/SKILL.md +22 -2
  75. package/corpus/core/src/templates/default/.agents/skills/shadcn-ui/SKILL.md +28 -4
  76. package/corpus/core/src/templates/default/app/components/ui/toolkit-provider.tsx +10 -0
  77. package/corpus/core/src/templates/default/app/design-system.ts +3 -0
  78. package/corpus/core/src/templates/default/app/global.css +1 -1
  79. package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +6 -6
  80. package/corpus/core/src/templates/default/app/i18n/de-DE.ts +6 -6
  81. package/corpus/core/src/templates/default/app/i18n/en-US.ts +6 -6
  82. package/corpus/core/src/templates/default/app/i18n/es-ES.ts +6 -6
  83. package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +6 -6
  84. package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +6 -6
  85. package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +6 -6
  86. package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +6 -6
  87. package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +6 -6
  88. package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +7 -7
  89. package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +7 -7
  90. package/corpus/core/src/templates/default/app/root.tsx +5 -2
  91. package/corpus/core/src/templates/default/package.json +1 -0
  92. package/corpus/core/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  93. package/corpus/core/src/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  94. package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  95. package/corpus/core/src/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  96. package/corpus/core/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +22 -2
  97. package/corpus/core/src/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +28 -4
  98. package/corpus/core/src/user-profile/actions/get-user-profile.ts +16 -0
  99. package/corpus/core/src/user-profile/actions/update-user-profile.ts +24 -0
  100. package/corpus/core/src/user-profile/index.ts +5 -0
  101. package/corpus/core/src/user-profile/shared.ts +14 -0
  102. package/corpus/core/src/user-profile/store.ts +50 -0
  103. package/corpus/core/src/vite/client.ts +39 -0
  104. package/corpus/templates/analytics/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  105. package/corpus/templates/analytics/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  106. package/corpus/templates/analytics/.agents/skills/frontend-design/SKILL.md +22 -2
  107. package/corpus/templates/analytics/.agents/skills/shadcn-ui/SKILL.md +28 -4
  108. package/corpus/templates/analytics/app/components/ui/toolkit-provider.tsx +6 -1
  109. package/corpus/templates/analytics/app/design-system.ts +3 -0
  110. package/corpus/templates/assets/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  111. package/corpus/templates/assets/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  112. package/corpus/templates/assets/.agents/skills/frontend-design/SKILL.md +22 -2
  113. package/corpus/templates/assets/.agents/skills/shadcn-ui/SKILL.md +28 -4
  114. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +2 -2
  115. package/corpus/templates/assets/app/components/ui/alert.tsx +1 -0
  116. package/corpus/templates/assets/app/components/ui/toolkit-provider.tsx +6 -1
  117. package/corpus/templates/assets/app/design-system.ts +3 -0
  118. package/corpus/templates/assets/app/global.css +1 -1
  119. package/corpus/templates/assets/app/routes/brand-kits.$id_.presets.$presetId.tsx +26 -30
  120. package/corpus/templates/assets/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  121. package/corpus/templates/brain/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  122. package/corpus/templates/brain/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  123. package/corpus/templates/brain/.agents/skills/frontend-design/SKILL.md +22 -2
  124. package/corpus/templates/brain/.agents/skills/shadcn-ui/SKILL.md +28 -4
  125. package/corpus/templates/brain/app/components/ui/dialog.tsx +1 -0
  126. package/corpus/templates/brain/app/components/ui/toolkit-provider.tsx +6 -1
  127. package/corpus/templates/brain/app/design-system.ts +3 -0
  128. package/corpus/templates/brain/app/global.css +2 -2
  129. package/corpus/templates/brain/app/lib/brain.ts +2 -2
  130. package/corpus/templates/brain/app/root.tsx +2 -2
  131. package/corpus/templates/brain/app/routes/sources.tsx +8 -8
  132. package/corpus/templates/brain/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  133. package/corpus/templates/calendar/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  134. package/corpus/templates/calendar/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  135. package/corpus/templates/calendar/.agents/skills/frontend-design/SKILL.md +22 -2
  136. package/corpus/templates/calendar/.agents/skills/shadcn-ui/SKILL.md +28 -4
  137. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +6 -2
  138. package/corpus/templates/calendar/app/components/ui/toolkit-provider.tsx +6 -1
  139. package/corpus/templates/calendar/app/design-system.ts +3 -0
  140. package/corpus/templates/calendar/app/global.css +1 -1
  141. package/corpus/templates/calendar/app/root.tsx +2 -2
  142. package/corpus/templates/calendar/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  143. package/corpus/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  144. package/corpus/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  145. package/corpus/templates/chat/.agents/skills/frontend-design/SKILL.md +22 -2
  146. package/corpus/templates/chat/.agents/skills/shadcn-ui/SKILL.md +28 -4
  147. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +2 -2
  148. package/corpus/templates/chat/app/components/ui/toolkit-provider.tsx +6 -1
  149. package/corpus/templates/chat/app/design-system.ts +3 -0
  150. package/corpus/templates/chat/app/global.css +1 -1
  151. package/corpus/templates/chat/app/root.tsx +2 -2
  152. package/corpus/templates/chat/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  153. package/corpus/templates/clips/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  154. package/corpus/templates/clips/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  155. package/corpus/templates/clips/.agents/skills/frontend-design/SKILL.md +22 -2
  156. package/corpus/templates/clips/.agents/skills/shadcn-ui/SKILL.md +28 -4
  157. package/corpus/templates/clips/actions/export-to-brain.ts +1 -1
  158. package/corpus/templates/clips/actions/invite-member.ts +1 -0
  159. package/corpus/templates/clips/app/components/library/library-layout.tsx +2 -2
  160. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +20 -11
  161. package/corpus/templates/clips/app/components/ui/toolkit-provider.tsx +6 -1
  162. package/corpus/templates/clips/app/design-system.ts +3 -0
  163. package/corpus/templates/clips/app/global.css +1 -1
  164. package/corpus/templates/clips/app/root.tsx +7 -2
  165. package/corpus/templates/clips/app/routes/_app.library._index.tsx +1 -1
  166. package/corpus/templates/clips/app/routes/record.tsx +2 -88
  167. package/corpus/templates/clips/changelog/2026-07-22-builder-connected-recordings-start-resumable-upload-sessions.md +6 -0
  168. package/corpus/templates/clips/changelog/2026-07-22-clip-thumbnails-now-come-from-the-recording-instead-of-the-p.md +6 -0
  169. package/corpus/templates/clips/changelog/2026-07-22-clips-emails-now-render-the-agent-native-logo-in-gmail-and-o.md +6 -0
  170. package/corpus/templates/clips/changelog/2026-07-22-dismissed-zoom-and-teams-meeting-note-prompts-now-stay-dismi.md +6 -0
  171. package/corpus/templates/clips/changelog/2026-07-22-fixed-windows-recordings-aborting-during-the-countdown.md +6 -0
  172. package/corpus/templates/clips/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  173. package/corpus/templates/clips/changelog/2026-07-22-permissions-and-rewind-controls-are-now-grouped-with-clearer.md +6 -0
  174. package/corpus/templates/clips/changelog/2026-07-22-quieter-permissions-and-rewind-controls.md +6 -0
  175. package/corpus/templates/clips/changelog/2026-07-22-the-desktop-popover-opens-centered-under-the-menu-bar-icon-o.md +6 -0
  176. package/corpus/templates/clips/desktop/src/app.tsx +100 -62
  177. package/corpus/templates/clips/desktop/src/lib/meeting-notification-dismissal.ts +31 -0
  178. package/corpus/templates/clips/desktop/src/lib/recorder.ts +4 -167
  179. package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +10 -1
  180. package/corpus/templates/clips/desktop/src/styles.css +111 -36
  181. package/corpus/templates/clips/desktop/src-tauri/src/adhoc_meetings_watcher.rs +67 -4
  182. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +11 -2
  183. package/corpus/templates/clips/desktop/src-tauri/src/meetings_watcher.rs +51 -0
  184. package/corpus/templates/clips/desktop/src-tauri/src/native_screen/custom_capture.rs +5 -1
  185. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +0 -189
  186. package/corpus/templates/clips/desktop/src-tauri/src/notifications.rs +62 -0
  187. package/corpus/templates/clips/desktop/src-tauri/src/shortcuts.rs +37 -2
  188. package/corpus/templates/clips/desktop/src-tauri/src/tray.rs +18 -0
  189. package/corpus/templates/clips/server/plugins/db.ts +6 -2
  190. package/corpus/templates/content/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  191. package/corpus/templates/content/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  192. package/corpus/templates/content/.agents/skills/frontend-design/SKILL.md +22 -2
  193. package/corpus/templates/content/.agents/skills/shadcn-ui/SKILL.md +28 -4
  194. package/corpus/templates/content/app/components/editor/DocumentToolbar.tsx +41 -59
  195. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +41 -41
  196. package/corpus/templates/content/app/components/editor/database/GalleryView.tsx +2 -1
  197. package/corpus/templates/content/app/components/editor/database/ListView.tsx +2 -1
  198. package/corpus/templates/content/app/components/editor/database/TimelineView.tsx +9 -9
  199. package/corpus/templates/content/app/components/editor/database/sidebar.tsx +7 -7
  200. package/corpus/templates/content/app/components/editor/database-sources/BuilderSourceReviewDialog.tsx +11 -11
  201. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +3 -3
  202. package/corpus/templates/content/app/components/ui/checkbox.tsx +1 -0
  203. package/corpus/templates/content/app/components/ui/collapsible.tsx +1 -0
  204. package/corpus/templates/content/app/components/ui/toolkit-provider.tsx +6 -1
  205. package/corpus/templates/content/app/design-system.ts +3 -0
  206. package/corpus/templates/content/app/global.css +30 -4
  207. package/corpus/templates/content/app/root.tsx +2 -2
  208. package/corpus/templates/content/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  209. package/corpus/templates/content/changelog/2026-07-22-page-actions-are-grouped-into-the-three-dots-menu-for-a-clea.md +6 -0
  210. package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  211. package/corpus/templates/crm/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  212. package/corpus/templates/crm/app/components/crm/CreateCrmRecordDialog.tsx +10 -10
  213. package/corpus/templates/crm/app/components/crm/CrmDashboardPanel.tsx +1 -6
  214. package/corpus/templates/crm/app/components/crm/CrmSignalsPanel.tsx +3 -2
  215. package/corpus/templates/crm/app/components/crm/IntelligenceSettings.tsx +13 -12
  216. package/corpus/templates/crm/app/components/crm/RecordActions.tsx +17 -17
  217. package/corpus/templates/crm/app/components/crm/RecordGrid.tsx +8 -8
  218. package/corpus/templates/crm/app/components/crm/RecordWorkspace.tsx +3 -8
  219. package/corpus/templates/crm/app/components/crm/SavedViewDataProgram.tsx +2 -1
  220. package/corpus/templates/crm/app/components/crm/Surface.tsx +3 -2
  221. package/corpus/templates/crm/app/components/crm/WorkOverview.tsx +2 -2
  222. package/corpus/templates/crm/app/components/layout/CrmLayout.tsx +7 -7
  223. package/corpus/templates/crm/app/components/layout/CrmSidebar.tsx +1 -1
  224. package/corpus/templates/crm/app/components/ui/alert-dialog.tsx +1 -0
  225. package/corpus/templates/crm/app/components/ui/badge.tsx +1 -0
  226. package/corpus/templates/crm/app/components/ui/button.tsx +1 -0
  227. package/corpus/templates/crm/app/components/ui/card.tsx +1 -0
  228. package/corpus/templates/crm/app/components/ui/dialog.tsx +1 -0
  229. package/corpus/templates/crm/app/components/ui/input.tsx +1 -0
  230. package/corpus/templates/crm/app/components/ui/label.tsx +1 -0
  231. package/corpus/templates/crm/app/components/ui/select.tsx +1 -0
  232. package/corpus/templates/crm/app/components/ui/sheet.tsx +1 -0
  233. package/corpus/templates/crm/app/components/ui/skeleton.tsx +1 -0
  234. package/corpus/templates/crm/app/components/ui/switch.tsx +1 -0
  235. package/corpus/templates/crm/app/components/ui/table.tsx +1 -0
  236. package/corpus/templates/crm/app/components/ui/tabs.tsx +1 -0
  237. package/corpus/templates/crm/app/components/ui/textarea.tsx +1 -0
  238. package/corpus/templates/crm/app/components/ui/toolkit-provider.tsx +17 -0
  239. package/corpus/templates/crm/app/design-system.ts +3 -0
  240. package/corpus/templates/crm/app/global.css +1 -1
  241. package/corpus/templates/crm/app/root.tsx +9 -6
  242. package/corpus/templates/crm/app/routes/dashboard.tsx +1 -1
  243. package/corpus/templates/crm/app/routes/proposals.tsx +13 -13
  244. package/corpus/templates/crm/app/routes/setup.tsx +9 -9
  245. package/corpus/templates/crm/app/routes/tasks.tsx +14 -14
  246. package/corpus/templates/crm/app/routes/views.tsx +16 -16
  247. package/corpus/templates/design/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  248. package/corpus/templates/design/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  249. package/corpus/templates/design/.agents/skills/frontend-design/SKILL.md +22 -2
  250. package/corpus/templates/design/.agents/skills/shadcn-ui/SKILL.md +28 -4
  251. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +19 -1
  252. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +12 -1
  253. package/corpus/templates/design/app/components/design/EditPanel.tsx +177 -52
  254. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +179 -59
  255. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +74 -27
  256. package/corpus/templates/design/app/components/design/multi-screen/types.ts +2 -0
  257. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +8 -8
  258. package/corpus/templates/design/app/components/layout/Sidebar.tsx +2 -2
  259. package/corpus/templates/design/app/components/ui/command.tsx +1 -0
  260. package/corpus/templates/design/app/components/ui/toolkit-provider.tsx +6 -1
  261. package/corpus/templates/design/app/design-system.ts +3 -0
  262. package/corpus/templates/design/app/global.css +1 -1
  263. package/corpus/templates/design/app/hooks/use-navigation-state.ts +6 -5
  264. package/corpus/templates/design/app/root.tsx +2 -2
  265. package/corpus/templates/design/changelog/2026-07-22-design-owners-can-keep-editing-their-designs-after-switching.md +6 -0
  266. package/corpus/templates/design/changelog/2026-07-22-inspector-tabs-keep-their-text-labels-at-narrow-widths.md +6 -0
  267. package/corpus/templates/design/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  268. package/corpus/templates/design/changelog/2026-07-22-narrow-breakpoint-previews-keep-their-device-labels-readable.md +6 -0
  269. package/corpus/templates/design/changelog/2026-07-22-removed-the-draft-status-chip-from-the-design-editor.md +6 -0
  270. package/corpus/templates/design/changelog/2026-07-22-responsive-breakpoint-controls-stay-within-narrow-sidebars.md +6 -0
  271. package/corpus/templates/design/changelog/2026-07-22-responsive-peers-now-use-a-softer-selection-highlight-withou.md +6 -0
  272. package/corpus/templates/design/changelog/2026-07-22-rotate-from-context-menu.md +6 -0
  273. package/corpus/templates/design/changelog/2026-07-22-the-selection-outline-now-stays-attached-while-moving-screen.md +6 -0
  274. package/corpus/templates/design/changelog/2026-07-22-view-only-designs-now-support-figma-style-layer-inspection-w.md +6 -0
  275. package/corpus/templates/design/server/db/index.ts +4 -0
  276. package/corpus/templates/dispatch/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  277. package/corpus/templates/dispatch/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  278. package/corpus/templates/dispatch/.agents/skills/frontend-design/SKILL.md +22 -2
  279. package/corpus/templates/dispatch/.agents/skills/shadcn-ui/SKILL.md +28 -4
  280. package/corpus/templates/dispatch/app/components/ui/button.tsx +1 -0
  281. package/corpus/templates/dispatch/app/components/ui/toolkit-provider.tsx +17 -0
  282. package/corpus/templates/dispatch/app/design-system.ts +3 -0
  283. package/corpus/templates/dispatch/app/dispatch-extensions.tsx +2 -2
  284. package/corpus/templates/dispatch/app/global.css +1 -1
  285. package/corpus/templates/dispatch/app/root.tsx +12 -9
  286. package/corpus/templates/dispatch/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  287. package/corpus/templates/dispatch/package.json +1 -0
  288. package/corpus/templates/forms/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  289. package/corpus/templates/forms/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  290. package/corpus/templates/forms/.agents/skills/frontend-design/SKILL.md +22 -2
  291. package/corpus/templates/forms/.agents/skills/shadcn-ui/SKILL.md +28 -4
  292. package/corpus/templates/forms/app/components/layout/Layout.tsx +1 -1
  293. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +3 -3
  294. package/corpus/templates/forms/app/components/ui/toolkit-provider.tsx +6 -1
  295. package/corpus/templates/forms/app/design-system.ts +3 -0
  296. package/corpus/templates/forms/app/global.css +1 -1
  297. package/corpus/templates/forms/app/hooks/use-forms.ts +55 -2
  298. package/corpus/templates/forms/app/i18n/en-US.ts +2 -0
  299. package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +3 -3
  300. package/corpus/templates/forms/app/pages/FormsListPage.tsx +23 -6
  301. package/corpus/templates/forms/app/root.tsx +2 -2
  302. package/corpus/templates/forms/changelog/2026-07-22-forms-now-archive-with-optimistic-feedback.md +6 -0
  303. package/corpus/templates/forms/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  304. package/corpus/templates/forms/server/plugins/agent-chat.ts +1 -1
  305. package/corpus/templates/macros/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  306. package/corpus/templates/macros/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  307. package/corpus/templates/macros/.agents/skills/frontend-design/SKILL.md +22 -2
  308. package/corpus/templates/macros/.agents/skills/shadcn-ui/SKILL.md +28 -4
  309. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +2 -2
  310. package/corpus/templates/macros/app/components/ui/toolkit-provider.tsx +6 -1
  311. package/corpus/templates/macros/app/design-system.ts +3 -0
  312. package/corpus/templates/macros/app/root.tsx +2 -2
  313. package/corpus/templates/macros/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  314. package/corpus/templates/mail/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  315. package/corpus/templates/mail/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  316. package/corpus/templates/mail/.agents/skills/frontend-design/SKILL.md +22 -2
  317. package/corpus/templates/mail/.agents/skills/shadcn-ui/SKILL.md +28 -4
  318. package/corpus/templates/mail/app/components/email/EmailThread.tsx +134 -93
  319. package/corpus/templates/mail/app/components/email/email-iframe-document.ts +8 -2
  320. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +3 -3
  321. package/corpus/templates/mail/app/components/layout/CommandPalette.tsx +2 -2
  322. package/corpus/templates/mail/app/components/ui/textarea.tsx +1 -21
  323. package/corpus/templates/mail/app/components/ui/toolkit-provider.tsx +6 -1
  324. package/corpus/templates/mail/app/design-system.ts +3 -0
  325. package/corpus/templates/mail/app/global.css +1 -1
  326. package/corpus/templates/mail/changelog/2026-07-22-email-messages-no-longer-flash-with-an-unstyled-page-while-l.md +6 -0
  327. package/corpus/templates/mail/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  328. package/corpus/templates/plan/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  329. package/corpus/templates/plan/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  330. package/corpus/templates/plan/.agents/skills/frontend-design/SKILL.md +22 -2
  331. package/corpus/templates/plan/.agents/skills/shadcn-ui/SKILL.md +28 -4
  332. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +2 -2
  333. package/corpus/templates/plan/app/components/plan/PlanContentRenderer.tsx +1 -1
  334. package/corpus/templates/plan/app/components/ui/toolkit-provider.tsx +6 -1
  335. package/corpus/templates/plan/app/design-system.ts +3 -0
  336. package/corpus/templates/plan/app/global.css +1 -1
  337. package/corpus/templates/plan/app/root.tsx +2 -2
  338. package/corpus/templates/plan/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  339. package/corpus/templates/slides/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  340. package/corpus/templates/slides/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  341. package/corpus/templates/slides/.agents/skills/frontend-design/SKILL.md +22 -2
  342. package/corpus/templates/slides/.agents/skills/shadcn-ui/SKILL.md +28 -4
  343. package/corpus/templates/slides/app/components/layout/Sidebar.tsx +2 -2
  344. package/corpus/templates/slides/app/components/ui/toolkit-provider.tsx +6 -1
  345. package/corpus/templates/slides/app/design-system.ts +3 -0
  346. package/corpus/templates/slides/app/root.tsx +2 -2
  347. package/corpus/templates/slides/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  348. package/corpus/templates/slides/changelog/2026-07-22-slides-no-longer-fail-intermittently-on-fresh-server-instances.md +6 -0
  349. package/corpus/templates/slides/changelog/2026-07-22-uploaded-screenshots-can-now-be-analyzed-and-recreated-as-ed.md +6 -0
  350. package/corpus/templates/slides/server/lib/chat-attachments.ts +7 -3
  351. package/corpus/templates/slides/server/plugins/db.ts +44 -17
  352. package/corpus/templates/tasks/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  353. package/corpus/templates/tasks/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  354. package/corpus/templates/tasks/.agents/skills/frontend-design/SKILL.md +22 -2
  355. package/corpus/templates/tasks/.agents/skills/shadcn-ui/SKILL.md +28 -4
  356. package/corpus/templates/tasks/app/components/ui/toolkit-provider.tsx +17 -0
  357. package/corpus/templates/tasks/app/design-system.ts +3 -0
  358. package/corpus/templates/tasks/app/global.css +1 -1
  359. package/corpus/templates/tasks/app/root.tsx +5 -2
  360. package/corpus/toolkit/CHANGELOG.md +14 -0
  361. package/corpus/toolkit/agent-native.eject.json +71 -0
  362. package/corpus/toolkit/package.json +31 -1
  363. package/corpus/toolkit/src/chat-history/ChatHistoryRail.tsx +100 -39
  364. package/corpus/toolkit/src/chat-history/index.ts +9 -0
  365. package/corpus/toolkit/src/chat-history/useChatHistoryRailController.ts +76 -0
  366. package/corpus/toolkit/src/chat-history.css +2 -0
  367. package/corpus/toolkit/src/composer/ComposerPlusMenu.tsx +11 -8
  368. package/corpus/toolkit/src/composer/PromptComposer.tsx +27 -6
  369. package/corpus/toolkit/src/composer/useRealtimeVoiceMode.tsx +107 -22
  370. package/corpus/toolkit/src/conformance/__fixtures__/css-in-js-adapter.tsx +401 -0
  371. package/corpus/toolkit/src/conformance/index.ts +3 -0
  372. package/corpus/toolkit/src/conformance/runner.tsx +710 -0
  373. package/corpus/toolkit/src/conformance/types.ts +45 -0
  374. package/corpus/toolkit/src/conformance/version.ts +22 -0
  375. package/corpus/toolkit/src/design-system/components.tsx +146 -0
  376. package/corpus/toolkit/src/design-system/context.tsx +31 -0
  377. package/corpus/toolkit/src/design-system/default-adapter.tsx +915 -0
  378. package/corpus/toolkit/src/design-system/definition.ts +14 -0
  379. package/corpus/toolkit/src/design-system/error-boundary.tsx +37 -0
  380. package/corpus/toolkit/src/design-system/index.ts +7 -0
  381. package/corpus/toolkit/src/design-system/theme.ts +145 -0
  382. package/corpus/toolkit/src/design-system/types.ts +363 -0
  383. package/corpus/toolkit/src/provider.tsx +98 -5
  384. package/corpus/toolkit/src/ui/button.tsx +95 -6
  385. package/corpus/toolkit/src/ui/dialog.tsx +48 -23
  386. package/corpus/toolkit/src/ui/popover.tsx +16 -2
  387. package/corpus/toolkit/src/ui/select.tsx +7 -3
  388. package/corpus/toolkit/src/ui/sidebar.tsx +47 -48
  389. package/corpus/toolkit/src/ui/tooltip.tsx +7 -3
  390. package/dist/a2a/types.d.ts +1 -1
  391. package/dist/a2a/types.d.ts.map +1 -1
  392. package/dist/a2a/types.js.map +1 -1
  393. package/dist/agent/types.d.ts +1 -1
  394. package/dist/agent/types.d.ts.map +1 -1
  395. package/dist/agent/types.js.map +1 -1
  396. package/dist/cli/context-xray-local.js +1 -1
  397. package/dist/cli/context-xray-local.js.map +1 -1
  398. package/dist/client/AgentPanel.d.ts.map +1 -1
  399. package/dist/client/AgentPanel.js +14 -14
  400. package/dist/client/AgentPanel.js.map +1 -1
  401. package/dist/client/AssistantChat.d.ts.map +1 -1
  402. package/dist/client/AssistantChat.js +26 -15
  403. package/dist/client/AssistantChat.js.map +1 -1
  404. package/dist/client/CommandMenu.d.ts.map +1 -1
  405. package/dist/client/CommandMenu.js +18 -106
  406. package/dist/client/CommandMenu.js.map +1 -1
  407. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  408. package/dist/client/agent-chat-adapter.js +2 -1
  409. package/dist/client/agent-chat-adapter.js.map +1 -1
  410. package/dist/client/app-providers.d.ts.map +1 -1
  411. package/dist/client/app-providers.js +1 -1
  412. package/dist/client/app-providers.js.map +1 -1
  413. package/dist/client/chat/message-components.d.ts +9 -1
  414. package/dist/client/chat/message-components.d.ts.map +1 -1
  415. package/dist/client/chat/message-components.js +62 -7
  416. package/dist/client/chat/message-components.js.map +1 -1
  417. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  418. package/dist/client/chat/tool-call-display.js +20 -5
  419. package/dist/client/chat/tool-call-display.js.map +1 -1
  420. package/dist/client/chat/widgets/InlineExtensionWidget.d.ts.map +1 -1
  421. package/dist/client/chat/widgets/InlineExtensionWidget.js +9 -12
  422. package/dist/client/chat/widgets/InlineExtensionWidget.js.map +1 -1
  423. package/dist/client/components/ui/message-scroller.d.ts +1 -1
  424. package/dist/client/components/ui/message-scroller.d.ts.map +1 -1
  425. package/dist/client/components/ui/message-scroller.js +4 -3
  426. package/dist/client/components/ui/message-scroller.js.map +1 -1
  427. package/dist/client/extensions/ExtensionViewer.js +2 -2
  428. package/dist/client/extensions/ExtensionViewer.js.map +1 -1
  429. package/dist/client/extensions/ExtensionsSidebarSection.js +11 -11
  430. package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
  431. package/dist/client/extensions/agent-native-extension-runtime.js +1 -1
  432. package/dist/client/extensions/agent-native-extension-runtime.js.map +1 -1
  433. package/dist/client/extensions/delete-extension.d.ts +1 -1
  434. package/dist/client/extensions/delete-extension.d.ts.map +1 -1
  435. package/dist/client/extensions/delete-extension.js +1 -1
  436. package/dist/client/extensions/delete-extension.js.map +1 -1
  437. package/dist/client/i18n.d.ts.map +1 -1
  438. package/dist/client/i18n.js +9 -0
  439. package/dist/client/i18n.js.map +1 -1
  440. package/dist/client/index.d.ts +2 -2
  441. package/dist/client/index.d.ts.map +1 -1
  442. package/dist/client/index.js +2 -2
  443. package/dist/client/index.js.map +1 -1
  444. package/dist/client/org/OrgSwitcher.d.ts +3 -1
  445. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  446. package/dist/client/org/OrgSwitcher.js +12 -4
  447. package/dist/client/org/OrgSwitcher.js.map +1 -1
  448. package/dist/client/org/TeamPage.d.ts.map +1 -1
  449. package/dist/client/org/TeamPage.js +41 -33
  450. package/dist/client/org/TeamPage.js.map +1 -1
  451. package/dist/client/progress/RunsTray.d.ts.map +1 -1
  452. package/dist/client/progress/RunsTray.js +9 -10
  453. package/dist/client/progress/RunsTray.js.map +1 -1
  454. package/dist/client/resources/McpConnectionSuggestion.d.ts.map +1 -1
  455. package/dist/client/resources/McpConnectionSuggestion.js +5 -4
  456. package/dist/client/resources/McpConnectionSuggestion.js.map +1 -1
  457. package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
  458. package/dist/client/resources/McpIntegrationDialog.js +10 -8
  459. package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
  460. package/dist/client/resources/mcp-integration-catalog.d.ts +1 -0
  461. package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
  462. package/dist/client/resources/mcp-integration-catalog.js +13 -0
  463. package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
  464. package/dist/client/settings/DemoModeSection.d.ts.map +1 -1
  465. package/dist/client/settings/DemoModeSection.js +2 -5
  466. package/dist/client/settings/DemoModeSection.js.map +1 -1
  467. package/dist/client/settings/SecretsSection.d.ts.map +1 -1
  468. package/dist/client/settings/SecretsSection.js +18 -6
  469. package/dist/client/settings/SecretsSection.js.map +1 -1
  470. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  471. package/dist/client/settings/SettingsPanel.js +87 -119
  472. package/dist/client/settings/SettingsPanel.js.map +1 -1
  473. package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
  474. package/dist/client/settings/SettingsTabsPage.js +16 -1
  475. package/dist/client/settings/SettingsTabsPage.js.map +1 -1
  476. package/dist/client/settings/VoiceTranscriptionSection.d.ts.map +1 -1
  477. package/dist/client/settings/VoiceTranscriptionSection.js +2 -5
  478. package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
  479. package/dist/client/settings/index.d.ts +1 -0
  480. package/dist/client/settings/index.d.ts.map +1 -1
  481. package/dist/client/settings/index.js +1 -0
  482. package/dist/client/settings/index.js.map +1 -1
  483. package/dist/client/settings/useSettingsPanelController.d.ts +22 -0
  484. package/dist/client/settings/useSettingsPanelController.d.ts.map +1 -0
  485. package/dist/client/settings/useSettingsPanelController.js +103 -0
  486. package/dist/client/settings/useSettingsPanelController.js.map +1 -0
  487. package/dist/client/setup-connections/BuilderConnectCard.d.ts +14 -6
  488. package/dist/client/setup-connections/BuilderConnectCard.d.ts.map +1 -1
  489. package/dist/client/setup-connections/BuilderConnectCard.js +24 -16
  490. package/dist/client/setup-connections/BuilderConnectCard.js.map +1 -1
  491. package/dist/client/setup-connections/index.d.ts +2 -1
  492. package/dist/client/setup-connections/index.d.ts.map +1 -1
  493. package/dist/client/setup-connections/index.js +2 -1
  494. package/dist/client/setup-connections/index.js.map +1 -1
  495. package/dist/client/setup-connections/useBuilderConnectCardController.d.ts +34 -0
  496. package/dist/client/setup-connections/useBuilderConnectCardController.d.ts.map +1 -0
  497. package/dist/client/setup-connections/useBuilderConnectCardController.js +39 -0
  498. package/dist/client/setup-connections/useBuilderConnectCardController.js.map +1 -0
  499. package/dist/client/sharing/ShareButton.d.ts +5 -5
  500. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  501. package/dist/client/sharing/ShareButton.js +19 -464
  502. package/dist/client/sharing/ShareButton.js.map +1 -1
  503. package/dist/client/sharing/ShareDialog.d.ts +6 -6
  504. package/dist/client/sharing/ShareDialog.d.ts.map +1 -1
  505. package/dist/client/sharing/ShareDialog.js +69 -283
  506. package/dist/client/sharing/ShareDialog.js.map +1 -1
  507. package/dist/client/sharing/index.d.ts +3 -0
  508. package/dist/client/sharing/index.d.ts.map +1 -1
  509. package/dist/client/sharing/index.js +3 -0
  510. package/dist/client/sharing/index.js.map +1 -1
  511. package/dist/client/sharing/share-controller-helpers.d.ts +70 -0
  512. package/dist/client/sharing/share-controller-helpers.d.ts.map +1 -0
  513. package/dist/client/sharing/share-controller-helpers.js +224 -0
  514. package/dist/client/sharing/share-controller-helpers.js.map +1 -0
  515. package/dist/client/sharing/useShareButtonController.d.ts +91 -0
  516. package/dist/client/sharing/useShareButtonController.d.ts.map +1 -0
  517. package/dist/client/sharing/useShareButtonController.js +397 -0
  518. package/dist/client/sharing/useShareButtonController.js.map +1 -0
  519. package/dist/client/sharing/useShareDialogController.d.ts +109 -0
  520. package/dist/client/sharing/useShareDialogController.d.ts.map +1 -0
  521. package/dist/client/sharing/useShareDialogController.js +348 -0
  522. package/dist/client/sharing/useShareDialogController.js.map +1 -0
  523. package/dist/client/sse-event-processor.d.ts.map +1 -1
  524. package/dist/client/sse-event-processor.js +21 -0
  525. package/dist/client/sse-event-processor.js.map +1 -1
  526. package/dist/client/tool-display.d.ts +16 -0
  527. package/dist/client/tool-display.d.ts.map +1 -1
  528. package/dist/client/tool-display.js +52 -0
  529. package/dist/client/tool-display.js.map +1 -1
  530. package/dist/client/use-agent-engine-configured.d.ts +3 -2
  531. package/dist/client/use-agent-engine-configured.d.ts.map +1 -1
  532. package/dist/client/use-agent-engine-configured.js +7 -19
  533. package/dist/client/use-agent-engine-configured.js.map +1 -1
  534. package/dist/client/use-chat-threads.d.ts.map +1 -1
  535. package/dist/client/use-chat-threads.js +21 -8
  536. package/dist/client/use-chat-threads.js.map +1 -1
  537. package/dist/collab/awareness.d.ts +2 -2
  538. package/dist/collab/awareness.d.ts.map +1 -1
  539. package/dist/db/client.d.ts +7 -7
  540. package/dist/db/client.d.ts.map +1 -1
  541. package/dist/db/client.js +13 -10
  542. package/dist/db/client.js.map +1 -1
  543. package/dist/extensions/actions.d.ts.map +1 -1
  544. package/dist/extensions/actions.js +8 -5
  545. package/dist/extensions/actions.js.map +1 -1
  546. package/dist/extensions/local.d.ts.map +1 -1
  547. package/dist/extensions/local.js +1 -0
  548. package/dist/extensions/local.js.map +1 -1
  549. package/dist/extensions/routes.d.ts.map +1 -1
  550. package/dist/extensions/routes.js +9 -4
  551. package/dist/extensions/routes.js.map +1 -1
  552. package/dist/extensions/schema.d.ts +23 -2
  553. package/dist/extensions/schema.d.ts.map +1 -1
  554. package/dist/extensions/schema.js +5 -0
  555. package/dist/extensions/schema.js.map +1 -1
  556. package/dist/extensions/slots/store.d.ts +1 -1
  557. package/dist/extensions/slots/store.d.ts.map +1 -1
  558. package/dist/extensions/slots/store.js +4 -4
  559. package/dist/extensions/slots/store.js.map +1 -1
  560. package/dist/extensions/store.d.ts +1 -0
  561. package/dist/extensions/store.d.ts.map +1 -1
  562. package/dist/extensions/store.js +38 -21
  563. package/dist/extensions/store.js.map +1 -1
  564. package/dist/extensions/theme.js +1 -1
  565. package/dist/extensions/theme.js.map +1 -1
  566. package/dist/file-upload/registry.d.ts.map +1 -1
  567. package/dist/file-upload/registry.js +9 -0
  568. package/dist/file-upload/registry.js.map +1 -1
  569. package/dist/index.browser.d.ts +1 -0
  570. package/dist/index.browser.d.ts.map +1 -1
  571. package/dist/index.browser.js +1 -0
  572. package/dist/index.browser.js.map +1 -1
  573. package/dist/index.d.ts +1 -0
  574. package/dist/index.d.ts.map +1 -1
  575. package/dist/index.js +1 -0
  576. package/dist/index.js.map +1 -1
  577. package/dist/localization/default-messages.d.ts +20 -0
  578. package/dist/localization/default-messages.d.ts.map +1 -1
  579. package/dist/localization/default-messages.js +26 -6
  580. package/dist/localization/default-messages.js.map +1 -1
  581. package/dist/mcp-client/oauth-routes.d.ts +2 -0
  582. package/dist/mcp-client/oauth-routes.d.ts.map +1 -1
  583. package/dist/mcp-client/oauth-routes.js +12 -2
  584. package/dist/mcp-client/oauth-routes.js.map +1 -1
  585. package/dist/observability/routes.d.ts +3 -3
  586. package/dist/provider-api/actions/custom-provider-registration.d.ts +3 -3
  587. package/dist/provider-api/actions/provider-api.d.ts +11 -11
  588. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  589. package/dist/scripts/call-agent.d.ts.map +1 -1
  590. package/dist/scripts/call-agent.js +5 -1
  591. package/dist/scripts/call-agent.js.map +1 -1
  592. package/dist/secrets/routes.d.ts +6 -6
  593. package/dist/server/action-discovery.d.ts.map +1 -1
  594. package/dist/server/action-discovery.js +8 -0
  595. package/dist/server/action-discovery.js.map +1 -1
  596. package/dist/server/better-auth-instance.d.ts +7 -2
  597. package/dist/server/better-auth-instance.d.ts.map +1 -1
  598. package/dist/server/better-auth-instance.js.map +1 -1
  599. package/dist/server/email-template.d.ts +3 -0
  600. package/dist/server/email-template.d.ts.map +1 -1
  601. package/dist/server/email-template.js +13 -0
  602. package/dist/server/email-template.js.map +1 -1
  603. package/dist/server/email-templates.d.ts.map +1 -1
  604. package/dist/server/email-templates.js +3 -0
  605. package/dist/server/email-templates.js.map +1 -1
  606. package/dist/server/email.d.ts.map +1 -1
  607. package/dist/server/email.js +27 -4
  608. package/dist/server/email.js.map +1 -1
  609. package/dist/server/realtime-voice.js +1 -1
  610. package/dist/server/realtime-voice.js.map +1 -1
  611. package/dist/server/transcribe-voice.d.ts +1 -1
  612. package/dist/sharing/actions/share-resource.js +1 -0
  613. package/dist/sharing/actions/share-resource.js.map +1 -1
  614. package/dist/styles/agent-native.css +0 -24
  615. package/dist/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  616. package/dist/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  617. package/dist/templates/chat/.agents/skills/frontend-design/SKILL.md +22 -2
  618. package/dist/templates/chat/.agents/skills/shadcn-ui/SKILL.md +28 -4
  619. package/dist/templates/chat/app/components/layout/Sidebar.tsx +2 -2
  620. package/dist/templates/chat/app/components/ui/toolkit-provider.tsx +6 -1
  621. package/dist/templates/chat/app/design-system.ts +3 -0
  622. package/dist/templates/chat/app/global.css +1 -1
  623. package/dist/templates/chat/app/root.tsx +2 -2
  624. package/dist/templates/chat/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  625. package/dist/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  626. package/dist/templates/default/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  627. package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +22 -2
  628. package/dist/templates/default/.agents/skills/shadcn-ui/SKILL.md +28 -4
  629. package/dist/templates/default/app/components/ui/toolkit-provider.tsx +10 -0
  630. package/dist/templates/default/app/design-system.ts +3 -0
  631. package/dist/templates/default/app/global.css +1 -1
  632. package/dist/templates/default/app/i18n/ar-SA.ts +6 -6
  633. package/dist/templates/default/app/i18n/de-DE.ts +6 -6
  634. package/dist/templates/default/app/i18n/en-US.ts +6 -6
  635. package/dist/templates/default/app/i18n/es-ES.ts +6 -6
  636. package/dist/templates/default/app/i18n/fr-FR.ts +6 -6
  637. package/dist/templates/default/app/i18n/hi-IN.ts +6 -6
  638. package/dist/templates/default/app/i18n/ja-JP.ts +6 -6
  639. package/dist/templates/default/app/i18n/ko-KR.ts +6 -6
  640. package/dist/templates/default/app/i18n/pt-BR.ts +6 -6
  641. package/dist/templates/default/app/i18n/zh-CN.ts +7 -7
  642. package/dist/templates/default/app/i18n/zh-TW.ts +7 -7
  643. package/dist/templates/default/app/root.tsx +5 -2
  644. package/dist/templates/default/package.json +1 -0
  645. package/dist/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  646. package/dist/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  647. package/dist/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  648. package/dist/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  649. package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +22 -2
  650. package/dist/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +28 -4
  651. package/dist/user-profile/actions/get-user-profile.d.ts +4 -0
  652. package/dist/user-profile/actions/get-user-profile.d.ts.map +1 -0
  653. package/dist/user-profile/actions/get-user-profile.js +14 -0
  654. package/dist/user-profile/actions/get-user-profile.js.map +1 -0
  655. package/dist/user-profile/actions/update-user-profile.d.ts +6 -0
  656. package/dist/user-profile/actions/update-user-profile.d.ts.map +1 -0
  657. package/dist/user-profile/actions/update-user-profile.js +20 -0
  658. package/dist/user-profile/actions/update-user-profile.js.map +1 -0
  659. package/dist/user-profile/index.d.ts +2 -0
  660. package/dist/user-profile/index.d.ts.map +1 -0
  661. package/dist/user-profile/index.js +2 -0
  662. package/dist/user-profile/index.js.map +1 -0
  663. package/dist/user-profile/shared.d.ts +7 -0
  664. package/dist/user-profile/shared.d.ts.map +1 -0
  665. package/dist/user-profile/shared.js +6 -0
  666. package/dist/user-profile/shared.js.map +1 -0
  667. package/dist/user-profile/store.d.ts +4 -0
  668. package/dist/user-profile/store.d.ts.map +1 -0
  669. package/dist/user-profile/store.js +38 -0
  670. package/dist/user-profile/store.js.map +1 -0
  671. package/dist/vite/client.d.ts +3 -0
  672. package/dist/vite/client.d.ts.map +1 -1
  673. package/dist/vite/client.js +31 -0
  674. package/dist/vite/client.js.map +1 -1
  675. package/docs/content/custom-design-system.mdx +445 -0
  676. package/docs/content/toolkit-ui.mdx +16 -0
  677. package/package.json +3 -2
  678. package/src/a2a/types.ts +1 -0
  679. package/src/agent/types.ts +1 -1
  680. package/src/cli/context-xray-local.ts +1 -1
  681. package/src/client/AgentPanel.tsx +90 -107
  682. package/src/client/AssistantChat.tsx +30 -13
  683. package/src/client/CommandMenu.tsx +68 -178
  684. package/src/client/agent-chat-adapter.ts +3 -1
  685. package/src/client/app-providers.tsx +1 -1
  686. package/src/client/chat/message-components.tsx +116 -10
  687. package/src/client/chat/tool-call-display.tsx +26 -5
  688. package/src/client/chat/widgets/InlineExtensionWidget.tsx +14 -40
  689. package/src/client/components/ui/message-scroller.tsx +15 -1
  690. package/src/client/extensions/ExtensionViewer.tsx +4 -4
  691. package/src/client/extensions/ExtensionsSidebarSection.tsx +11 -11
  692. package/src/client/extensions/agent-native-extension-runtime.ts +1 -1
  693. package/src/client/extensions/delete-extension.ts +2 -2
  694. package/src/client/i18n.tsx +22 -0
  695. package/src/client/index.ts +17 -0
  696. package/src/client/org/OrgSwitcher.tsx +25 -1
  697. package/src/client/org/TeamPage.tsx +257 -153
  698. package/src/client/progress/RunsTray.tsx +89 -88
  699. package/src/client/resources/McpConnectionSuggestion.tsx +5 -2
  700. package/src/client/resources/McpIntegrationDialog.tsx +34 -13
  701. package/src/client/resources/mcp-integration-catalog.ts +13 -0
  702. package/src/client/settings/DemoModeSection.tsx +6 -18
  703. package/src/client/settings/SecretsSection.tsx +97 -52
  704. package/src/client/settings/SettingsPanel.tsx +302 -254
  705. package/src/client/settings/SettingsTabsPage.tsx +23 -2
  706. package/src/client/settings/VoiceTranscriptionSection.tsx +7 -18
  707. package/src/client/settings/index.ts +7 -0
  708. package/src/client/settings/useSettingsPanelController.ts +155 -0
  709. package/src/client/setup-connections/BuilderConnectCard.tsx +116 -51
  710. package/src/client/setup-connections/index.ts +10 -0
  711. package/src/client/setup-connections/useBuilderConnectCardController.ts +82 -0
  712. package/src/client/sharing/ShareButton.tsx +71 -592
  713. package/src/client/sharing/ShareDialog.tsx +299 -633
  714. package/src/client/sharing/index.ts +42 -0
  715. package/src/client/sharing/share-controller-helpers.ts +318 -0
  716. package/src/client/sharing/useShareButtonController.ts +600 -0
  717. package/src/client/sharing/useShareDialogController.ts +559 -0
  718. package/src/client/sse-event-processor.ts +23 -0
  719. package/src/client/tool-display.ts +71 -0
  720. package/src/client/use-agent-engine-configured.ts +12 -19
  721. package/src/client/use-chat-threads.ts +33 -12
  722. package/src/db/client.ts +13 -10
  723. package/src/extensions/actions.ts +13 -5
  724. package/src/extensions/local.ts +1 -0
  725. package/src/extensions/routes.ts +10 -5
  726. package/src/extensions/schema.ts +5 -0
  727. package/src/extensions/slots/store.ts +14 -4
  728. package/src/extensions/store.ts +55 -19
  729. package/src/extensions/theme.ts +1 -1
  730. package/src/file-upload/registry.ts +9 -0
  731. package/src/index.browser.ts +5 -0
  732. package/src/index.ts +1 -0
  733. package/src/localization/default-messages.ts +28 -6
  734. package/src/mcp-client/oauth-routes.ts +16 -2
  735. package/src/scripts/call-agent.ts +5 -1
  736. package/src/server/action-discovery.ts +8 -0
  737. package/src/server/better-auth-instance.ts +7 -2
  738. package/src/server/email-template.ts +18 -0
  739. package/src/server/email-templates.ts +3 -0
  740. package/src/server/email.ts +40 -4
  741. package/src/server/realtime-voice.ts +1 -1
  742. package/src/sharing/actions/share-resource.ts +1 -0
  743. package/src/styles/agent-native.css +0 -24
  744. package/src/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  745. package/src/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  746. package/src/templates/chat/.agents/skills/frontend-design/SKILL.md +22 -2
  747. package/src/templates/chat/.agents/skills/shadcn-ui/SKILL.md +28 -4
  748. package/src/templates/chat/app/components/layout/Sidebar.tsx +2 -2
  749. package/src/templates/chat/app/components/ui/toolkit-provider.tsx +6 -1
  750. package/src/templates/chat/app/design-system.ts +3 -0
  751. package/src/templates/chat/app/global.css +1 -1
  752. package/src/templates/chat/app/root.tsx +2 -2
  753. package/src/templates/chat/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  754. package/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  755. package/src/templates/default/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  756. package/src/templates/default/.agents/skills/frontend-design/SKILL.md +22 -2
  757. package/src/templates/default/.agents/skills/shadcn-ui/SKILL.md +28 -4
  758. package/src/templates/default/app/components/ui/toolkit-provider.tsx +10 -0
  759. package/src/templates/default/app/design-system.ts +3 -0
  760. package/src/templates/default/app/global.css +1 -1
  761. package/src/templates/default/app/i18n/ar-SA.ts +6 -6
  762. package/src/templates/default/app/i18n/de-DE.ts +6 -6
  763. package/src/templates/default/app/i18n/en-US.ts +6 -6
  764. package/src/templates/default/app/i18n/es-ES.ts +6 -6
  765. package/src/templates/default/app/i18n/fr-FR.ts +6 -6
  766. package/src/templates/default/app/i18n/hi-IN.ts +6 -6
  767. package/src/templates/default/app/i18n/ja-JP.ts +6 -6
  768. package/src/templates/default/app/i18n/ko-KR.ts +6 -6
  769. package/src/templates/default/app/i18n/pt-BR.ts +6 -6
  770. package/src/templates/default/app/i18n/zh-CN.ts +7 -7
  771. package/src/templates/default/app/i18n/zh-TW.ts +7 -7
  772. package/src/templates/default/app/root.tsx +5 -2
  773. package/src/templates/default/package.json +1 -0
  774. package/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  775. package/src/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  776. package/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  777. package/src/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  778. package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +22 -2
  779. package/src/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +28 -4
  780. package/src/user-profile/actions/get-user-profile.ts +16 -0
  781. package/src/user-profile/actions/update-user-profile.ts +24 -0
  782. package/src/user-profile/index.ts +5 -0
  783. package/src/user-profile/shared.ts +14 -0
  784. package/src/user-profile/store.ts +50 -0
  785. package/src/vite/client.ts +39 -0
  786. package/corpus/templates/analytics/app/components/ui/calendar.tsx +0 -70
  787. package/corpus/templates/analytics/app/components/ui/chart.tsx +0 -386
  788. package/corpus/templates/calendar/app/components/ui/sonner.tsx +0 -58
  789. package/corpus/templates/forms/app/components/ui/calendar.tsx +0 -214
  790. package/corpus/templates/forms/app/components/ui/chart.tsx +0 -379
  791. package/corpus/templates/forms/app/components/ui/command.tsx +0 -153
  792. package/corpus/templates/forms/app/components/ui/context-menu.tsx +0 -198
  793. package/corpus/templates/forms/app/components/ui/menubar.tsx +0 -254
  794. package/corpus/templates/macros/app/components/ui/menubar.tsx +0 -238
  795. package/corpus/templates/macros/app/components/ui/progress.tsx +0 -26
  796. package/corpus/templates/mail/app/components/ui/calendar.tsx +0 -211
  797. package/corpus/templates/mail/app/components/ui/chart.tsx +0 -379
  798. package/corpus/templates/mail/app/components/ui/command.tsx +0 -153
  799. package/corpus/templates/mail/app/components/ui/context-menu.tsx +0 -198
  800. package/corpus/templates/mail/app/components/ui/menubar.tsx +0 -254
  801. package/corpus/templates/tasks/app/components/ui/accordion.tsx +0 -56
  802. package/corpus/templates/tasks/app/components/ui/aspect-ratio.tsx +0 -5
  803. package/corpus/templates/tasks/app/components/ui/breadcrumb.tsx +0 -115
  804. package/corpus/templates/tasks/app/components/ui/calendar.tsx +0 -70
  805. package/corpus/templates/tasks/app/components/ui/carousel.tsx +0 -260
  806. package/corpus/templates/tasks/app/components/ui/chart.tsx +0 -379
  807. package/corpus/templates/tasks/app/components/ui/form.tsx +0 -177
  808. package/corpus/templates/tasks/app/components/ui/hover-card.tsx +0 -27
  809. package/corpus/templates/tasks/app/components/ui/input-otp.tsx +0 -69
  810. package/corpus/templates/tasks/app/components/ui/menubar.tsx +0 -254
  811. package/corpus/templates/tasks/app/components/ui/navigation-menu.tsx +0 -128
  812. package/corpus/templates/tasks/app/components/ui/pagination.tsx +0 -121
  813. package/corpus/templates/tasks/app/components/ui/resizable.tsx +0 -43
  814. package/corpus/templates/tasks/app/components/ui/sidebar.tsx +0 -782
  815. package/corpus/templates/tasks/app/components/ui/toggle.tsx +0 -43
@@ -6,7 +6,11 @@ import { agentNativePath } from "./api-path.js";
6
6
  const PROVIDER_ENV_VAR_SET = new Set(PROVIDER_ENV_VARS);
7
7
 
8
8
  /** `unknown` until the first check resolves, so callers don't flash the gate. */
9
- export type AgentEngineConfiguredState = "unknown" | "configured" | "missing";
9
+ export type AgentEngineConfiguredState =
10
+ | "unknown"
11
+ | "configured"
12
+ | "missing"
13
+ | "unavailable";
10
14
 
11
15
  export interface UseAgentEngineConfiguredResult {
12
16
  /** True once we know nothing can run the agent (no key / Builder / BYOK). */
@@ -30,7 +34,6 @@ export interface UseAgentEngineConfiguredOptions {
30
34
  }
31
35
 
32
36
  const DEFAULT_STATUS_CHECK_TIMEOUT_MS = 2500;
33
- const UNKNOWN_STATUS_RETRY_MS = 2000;
34
37
 
35
38
  async function fetchStatusJson(
36
39
  path: string,
@@ -108,11 +111,10 @@ export async function fetchAgentEngineConfiguredState(
108
111
  fetchStatusJson("/_agent-native/agent-engine/status", timeoutMs),
109
112
  ]);
110
113
 
111
- // All three failed — likely a flaky network; keep the caller in unknown.
112
- // Even an explicit missing-key stream event should not pin the composer into
113
- // setup without a fresh authoritative status response.
114
+ // All three failed — surface a retryable unavailable state instead of
115
+ // leaving the composer in an infinite checking loop.
114
116
  if (envKeys == null && builderStatus == null && engineStatus == null) {
115
- return "unknown";
117
+ return "unavailable";
116
118
  }
117
119
 
118
120
  const envKeysKnown = Array.isArray(envKeys);
@@ -138,7 +140,7 @@ export async function fetchAgentEngineConfiguredState(
138
140
  if (engineStatusKnown) return "missing";
139
141
 
140
142
  // Compatibility fallback for older hosts without the canonical route.
141
- return envKeysKnown && builderStatusKnown ? "missing" : "unknown";
143
+ return envKeysKnown && builderStatusKnown ? "missing" : "unavailable";
142
144
  }
143
145
 
144
146
  /**
@@ -146,7 +148,8 @@ export async function fetchAgentEngineConfiguredState(
146
148
  * composer and app prompt boxes. Checks the env-key / Builder / BYOK status
147
149
  * endpoints on mount, re-checks on `agent-engine:configured-changed`, and folds
148
150
  * in the adapter's `agent-chat:missing-api-key` signal. Pass `enabled = false`
149
- * to short-circuit to configured; flaky requests stay `unknown`.
151
+ * to short-circuit to configured; unavailable checks can be retried by firing
152
+ * `agent-engine:configured-changed`.
150
153
  */
151
154
  export function useAgentEngineConfigured(
152
155
  enabled = true,
@@ -156,25 +159,16 @@ export function useAgentEngineConfigured(
156
159
 
157
160
  useEffect(() => {
158
161
  let cancelled = false;
159
- let retryId: ReturnType<typeof setTimeout> | undefined;
160
162
  // Monotonic call counter: overlapping checks (mount + a
161
163
  // `agent-engine:configured-changed` fired right after a key is saved) can
162
164
  // resolve out of order; only the latest call may write state, or a slow
163
165
  // stale "missing" response would overwrite the fresh "configured" one.
164
166
  let requestSeq = 0;
165
167
  const check = async (options?: { missingFallback?: boolean }) => {
166
- if (retryId !== undefined) {
167
- clearTimeout(retryId);
168
- retryId = undefined;
169
- }
170
168
  const seq = ++requestSeq;
171
169
  const nextState = await fetchAgentEngineConfiguredState(enabled, options);
172
170
  if (cancelled || seq !== requestSeq) return;
173
- if (nextState === "unknown") {
174
- retryId = setTimeout(() => void check(), UNKNOWN_STATUS_RETRY_MS);
175
- return;
176
- }
177
- setState(nextState);
171
+ setState(nextState === "unknown" ? "unavailable" : nextState);
178
172
  };
179
173
  const onConfiguredChanged = () => {
180
174
  void check();
@@ -198,7 +192,6 @@ export function useAgentEngineConfigured(
198
192
  window.addEventListener("agent-chat:missing-api-key", onMissing);
199
193
  return () => {
200
194
  cancelled = true;
201
- if (retryId !== undefined) clearTimeout(retryId);
202
195
  window.removeEventListener(
203
196
  "agent-engine:configured-changed",
204
197
  onConfiguredChanged,
@@ -344,6 +344,24 @@ export function useChatThreads(
344
344
  const activeThreadIdRef = useRef(activeThreadId);
345
345
  activeThreadIdRef.current = activeThreadId;
346
346
 
347
+ const persistActiveThreadId = useCallback(
348
+ (id: string) => {
349
+ try {
350
+ const threadScope = readKnownThreadScope(id);
351
+ const targetKey =
352
+ threadScope === undefined
353
+ ? activeThreadKey
354
+ : activeThreadStorageKey(storageKey, threadScope);
355
+ localStorage.setItem(targetKey, id);
356
+ localStorage.setItem(
357
+ activeThreadSeenStorageKey(targetKey),
358
+ String(Date.now()),
359
+ );
360
+ } catch {}
361
+ },
362
+ [activeThreadKey, readKnownThreadScope, storageKey],
363
+ );
364
+
347
365
  // Persist active thread ID — and rehydrate on scope flips. When the user
348
366
  // navigates from deck A to deck B, `activeThreadKey` changes; we re-read B's
349
367
  // scoped thread only if the currently visible chat is itself scoped to a
@@ -388,6 +406,9 @@ export function useChatThreads(
388
406
  setActiveThreadId(nextActiveThreadId);
389
407
  return;
390
408
  }
409
+ if (!activeThreadId && !restoreActiveThread && !routeControlsActiveThread) {
410
+ return;
411
+ }
391
412
  try {
392
413
  if (routeControlsActiveThread && !routeThreadId) {
393
414
  localStorage.removeItem(activeThreadKey);
@@ -395,14 +416,7 @@ export function useChatThreads(
395
416
  return;
396
417
  }
397
418
  if (activeThreadId) {
398
- const threadScope = readKnownThreadScope(activeThreadId);
399
- if (threadScope === undefined) return;
400
- const targetKey = activeThreadStorageKey(storageKey, threadScope);
401
- localStorage.setItem(targetKey, activeThreadId);
402
- localStorage.setItem(
403
- activeThreadSeenStorageKey(targetKey),
404
- String(Date.now()),
405
- );
419
+ persistActiveThreadId(activeThreadId);
406
420
  } else {
407
421
  localStorage.removeItem(activeThreadKey);
408
422
  localStorage.removeItem(activeThreadSeenKey);
@@ -414,7 +428,9 @@ export function useChatThreads(
414
428
  activeThreadSeenKey,
415
429
  addOptimisticThread,
416
430
  autoCreate,
431
+ persistActiveThreadId,
417
432
  readKnownThreadScope,
433
+ restoreActiveThread,
418
434
  routeControlsActiveThread,
419
435
  routeThreadId,
420
436
  storageKey,
@@ -640,10 +656,11 @@ export function useChatThreads(
640
656
  const id = preferredId || createLocalThreadId();
641
657
  newlyCreatedRef.current.add(id);
642
658
  addOptimisticThread(id, scopeRef.current ?? null);
659
+ persistActiveThreadId(id);
643
660
  setActiveThreadId(id);
644
661
  return Promise.resolve(id);
645
662
  },
646
- [addOptimisticThread],
663
+ [addOptimisticThread, persistActiveThreadId],
647
664
  );
648
665
 
649
666
  useEffect(() => {
@@ -890,9 +907,13 @@ export function useChatThreads(
890
907
  [],
891
908
  );
892
909
 
893
- const switchThread = useCallback((id: string) => {
894
- setActiveThreadId(id);
895
- }, []);
910
+ const switchThread = useCallback(
911
+ (id: string) => {
912
+ persistActiveThreadId(id);
913
+ setActiveThreadId(id);
914
+ },
915
+ [persistActiveThreadId],
916
+ );
896
917
 
897
918
  const removeThread = useCallback(
898
919
  async (id: string) => {
@@ -649,6 +649,8 @@ const CONNECTION_ERROR_CODES = new Set([
649
649
  "ETIMEDOUT",
650
650
  "EPIPE",
651
651
  "ENOTFOUND",
652
+ "EMAXCONN",
653
+ "53300",
652
654
  "CONNECT_TIMEOUT",
653
655
  "CONNECTION_ENDED",
654
656
  "CONNECTION_DESTROYED",
@@ -672,7 +674,7 @@ export function isConnectionError(err: any): boolean {
672
674
  return true;
673
675
  }
674
676
  const msg = String(err.message || err.cause?.message || "");
675
- return /ECONNRESET|ETIMEDOUT|EPIPE|connection.*(closed|ended|terminated)|socket hang up|websocket/i.test(
677
+ return /ECONNRESET|ETIMEDOUT|EPIPE|EMAXCONN|too many connections|max client connections|remaining connection slots|connection.*(closed|ended|terminated)|socket hang up|websocket/i.test(
676
678
  msg,
677
679
  );
678
680
  }
@@ -699,6 +701,7 @@ export function isTransientDatabaseError(err: unknown): boolean {
699
701
  const code = String(error?.code ?? error?.cause?.code ?? "");
700
702
  if (
701
703
  code === "ECHECKOUTTIMEOUT" ||
704
+ code === "EMAXCONN" ||
702
705
  code === "53300" ||
703
706
  code === "57014" ||
704
707
  /^08/.test(code) ||
@@ -880,10 +883,10 @@ export function isServerlessRuntime(): boolean {
880
883
 
881
884
  /**
882
885
  * postgres.js pool options tuned per runtime. A serverless instance handles
883
- * one request at a time, so a tiny pool is enough but we cap at 2 (not 1)
884
- * so a single slow query or open transaction can't serialize every other
885
- * query in the same request. Total connections stay bounded to
886
- * concurrent-instance count instead of 10×. idle_timeout is shortened on
886
+ * one request at a time, so a single connection is enough. Keeping the
887
+ * foreground pool at 1 is important because each instance can also open an
888
+ * app and Better Auth pool; a max of 2 on each pool still exhausted Neon
889
+ * under a burst of warm instances. idle_timeout is shortened on
887
890
  * serverless so a thawed-but-idle instance releases its connections quickly.
888
891
  * Long-lived Node servers keep the normal pool for throughput.
889
892
  */
@@ -891,7 +894,7 @@ export function pgPoolOptions(url: string): Record<string, unknown> {
891
894
  const serverless = isServerlessRuntime();
892
895
  return {
893
896
  onnotice: () => {},
894
- max: serverless ? 2 : 10,
897
+ max: serverless ? 1 : 10,
895
898
  idle_timeout: serverless ? 20 : 240,
896
899
  max_lifetime: 60 * 30,
897
900
  connect_timeout: 10,
@@ -903,9 +906,9 @@ export function pgPoolOptions(url: string): Record<string, unknown> {
903
906
 
904
907
  /**
905
908
  * Connection cap for the @neondatabase/serverless `Pool`. Same instance
906
- * accumulation risk as postgres.js — a small pool (2) is enough on serverless
907
- * and keeps total connections bounded while still letting a second query
908
- * proceed when one connection is busy.
909
+ * accumulation risk as postgres.js — one connection is enough for a
910
+ * foreground serverless invocation and keeps the aggregate app/framework/auth
911
+ * budget bounded.
909
912
  */
910
913
  export function neonPoolMax(): number {
911
914
  if (!isServerlessRuntime()) return 10;
@@ -921,7 +924,7 @@ export function neonPoolMax(): number {
921
924
  // burst; keep the foreground serverless pool tiny to avoid "Max client
922
925
  // connections reached" across many warm instances.
923
926
  if (isBackgroundFunctionPoolContext()) return 8;
924
- return 2;
927
+ return 1;
925
928
  }
926
929
 
927
930
  /**
@@ -839,7 +839,11 @@ export function createExtensionActionEntries(): Record<string, ActionEntry> {
839
839
 
840
840
  await ensureExtensionsTables();
841
841
  const access = await resolveAccess("extension", extensionId);
842
- if (!access || access.role === "viewer")
842
+ if (
843
+ !access ||
844
+ (access.resource as ExtensionRow | undefined)?.archivedAt ||
845
+ access.role === "viewer"
846
+ )
843
847
  return `Error: editor access required for extension ${extensionId}.`;
844
848
 
845
849
  const userEmail = getRequestUserEmail()?.toLowerCase() ?? "";
@@ -942,7 +946,11 @@ export function createExtensionActionEntries(): Record<string, ActionEntry> {
942
946
 
943
947
  await ensureExtensionsTables();
944
948
  const access = await resolveAccess("extension", extensionId);
945
- if (!access) return `Error: no access to extension ${extensionId}.`;
949
+ if (
950
+ !access ||
951
+ (access.resource as ExtensionRow | undefined)?.archivedAt
952
+ )
953
+ return `Error: no access to extension ${extensionId}.`;
946
954
 
947
955
  const userEmail = getRequestUserEmail()?.toLowerCase() ?? "";
948
956
  const scope = args?.scope ?? "user";
@@ -1012,14 +1020,14 @@ export function createExtensionActionEntries(): Record<string, ActionEntry> {
1012
1020
  "delete-extension": {
1013
1021
  tool: {
1014
1022
  description:
1015
- "Permanently delete an extension everywhere it is shared. Requires owner/admin access. If the user only wants a shared extension removed from their own sidebar/list, use hide-extension instead.",
1023
+ "Archive an extension everywhere it is shared. Archiving is a soft delete: the extension and its history, data, sharing, and slot configuration are retained, but it disappears from normal lists. Requires owner/admin access. If the user only wants a shared extension removed from their own sidebar/list, use hide-extension instead.",
1016
1024
  parameters: {
1017
1025
  type: "object",
1018
1026
  properties: {
1019
1027
  id: {
1020
1028
  type: "string",
1021
1029
  description:
1022
- "Extension id to permanently delete. Use list-extensions first if you only know the display name.",
1030
+ "Extension id to archive. Use list-extensions first if you only know the display name.",
1023
1031
  },
1024
1032
  },
1025
1033
  required: ["id"],
@@ -1036,7 +1044,7 @@ export function createExtensionActionEntries(): Record<string, ActionEntry> {
1036
1044
  try {
1037
1045
  const ok = await deleteExtension(id);
1038
1046
  if (!ok) return `Error: extension not found: ${id}`;
1039
- return { ok: true, deleted: summarizeDeletedExtension(extension) };
1047
+ return { ok: true, archived: summarizeDeletedExtension(extension) };
1040
1048
  } catch (err: any) {
1041
1049
  return {
1042
1050
  ok: false,
@@ -322,6 +322,7 @@ async function readLocalExtensionFolder(options: {
322
322
  icon: typeof manifest.icon === "string" ? manifest.icon : null,
323
323
  createdAt,
324
324
  updatedAt,
325
+ archivedAt: null,
325
326
  hiddenAt: null,
326
327
  hiddenBy: null,
327
328
  ownerEmail: "local-files",
@@ -227,8 +227,8 @@ async function dispatch(
227
227
  }
228
228
 
229
229
  const access = await resolveAccess("extension", parts[0]);
230
- const extension = access?.resource;
231
- if (!extension) {
230
+ const extension = access?.resource as ExtensionRow | undefined;
231
+ if (!access || !extension || extension.archivedAt) {
232
232
  setResponseStatus(event, 404);
233
233
  return { error: "Extension not found" };
234
234
  }
@@ -317,11 +317,12 @@ async function dispatch(
317
317
  }
318
318
 
319
319
  const access = await resolveAccess("extension", parts[0]);
320
- if (!access) {
320
+ const extension = access?.resource as ExtensionRow | undefined;
321
+ if (!access || !extension || extension.archivedAt) {
321
322
  setResponseStatus(event, 404);
322
323
  return { error: "Extension not found" };
323
324
  }
324
- return extensionResponse(access.resource as ExtensionRow, access.role);
325
+ return extensionResponse(extension, access.role);
325
326
  }
326
327
 
327
328
  // POST /:id/hide — remove from the current user's Extensions list/sidebar
@@ -433,7 +434,7 @@ async function dispatch(
433
434
  setResponseStatus(event, 404);
434
435
  return { error: "Extension not found" };
435
436
  }
436
- return { ok: true };
437
+ return { ok: true, archived: true };
437
438
  }
438
439
 
439
440
  setResponseStatus(event, 404);
@@ -662,6 +663,10 @@ async function requireExtensionDataAccess(
662
663
  minRole: ShareRole,
663
664
  ): Promise<{ ok: true } | { ok: false; response: unknown }> {
664
665
  const access = await resolveAccess("extension", extensionId);
666
+ if (access?.resource && (access.resource as ExtensionRow).archivedAt) {
667
+ setResponseStatus(event, 404);
668
+ return { ok: false, response: { error: "Extension not found" } };
669
+ }
665
670
  if (access) {
666
671
  if (ROLE_RANK[access.role] < ROLE_RANK[minRole]) {
667
672
  setResponseStatus(event, 403);
@@ -27,6 +27,7 @@ export const extensions = table("tools", {
27
27
  icon: text("icon"),
28
28
  createdAt: text("created_at").notNull().default(now()),
29
29
  updatedAt: text("updated_at").notNull().default(now()),
30
+ archivedAt: text("archived_at"),
30
31
  hiddenAt: text("hidden_at"),
31
32
  hiddenBy: text("hidden_by"),
32
33
  ...ownableColumns(),
@@ -66,6 +67,7 @@ export const EXTENSIONS_CREATE_SQL = `CREATE TABLE IF NOT EXISTS tools (
66
67
  icon TEXT,
67
68
  created_at TEXT NOT NULL DEFAULT (datetime('now')),
68
69
  updated_at TEXT NOT NULL DEFAULT (datetime('now')),
70
+ archived_at TEXT,
69
71
  hidden_at TEXT,
70
72
  hidden_by TEXT,
71
73
  owner_email TEXT NOT NULL DEFAULT 'local@localhost',
@@ -81,6 +83,7 @@ export const EXTENSIONS_CREATE_SQL_PG = `CREATE TABLE IF NOT EXISTS tools (
81
83
  icon TEXT,
82
84
  created_at TEXT NOT NULL DEFAULT now(),
83
85
  updated_at TEXT NOT NULL DEFAULT now(),
86
+ archived_at TEXT,
84
87
  hidden_at TEXT,
85
88
  hidden_by TEXT,
86
89
  owner_email TEXT NOT NULL DEFAULT 'local@localhost',
@@ -162,6 +165,8 @@ export const EXTENSION_DATA_DROP_OLD_INDEX_SQL_PG = `DROP INDEX IF EXISTS tool_d
162
165
  export const EXTENSIONS_OWNER_INDEX_SQL = `CREATE INDEX IF NOT EXISTS tools_owner_idx ON tools (owner_email)`;
163
166
  export const EXTENSIONS_ORG_INDEX_SQL = `CREATE INDEX IF NOT EXISTS tools_org_idx ON tools (org_id)`;
164
167
  export const EXTENSIONS_UPDATED_INDEX_SQL = `CREATE INDEX IF NOT EXISTS tools_updated_at_idx ON tools (updated_at)`;
168
+ export const EXTENSIONS_ARCHIVED_AT_COLUMN_SQL = `ALTER TABLE tools ADD COLUMN IF NOT EXISTS archived_at TEXT`;
169
+ export const EXTENSIONS_ARCHIVED_AT_INDEX_SQL = `CREATE INDEX IF NOT EXISTS tools_archived_at_idx ON tools (archived_at)`;
165
170
 
166
171
  // Global (admin) hide: when set, the extension row is hidden from EVERYONE's
167
172
  // list, distinct from the per-user `tool_hidden_extensions` table. Additive
@@ -1,6 +1,6 @@
1
1
  import { randomUUID } from "node:crypto";
2
2
 
3
- import { and, eq, inArray, sql } from "drizzle-orm";
3
+ import { and, eq, inArray, isNull, sql } from "drizzle-orm";
4
4
 
5
5
  import { getDbExec, isPostgres } from "../../db/client.js";
6
6
  import { createGetDb } from "../../db/create-get-db.js";
@@ -203,7 +203,12 @@ export async function listExtensionsForSlot(slotId: string): Promise<
203
203
  icon: extensions.icon,
204
204
  })
205
205
  .from(extensions)
206
- .where(accessFilter(extensions, extensionShares));
206
+ .where(
207
+ and(
208
+ accessFilter(extensions, extensionShares),
209
+ isNull(extensions.archivedAt),
210
+ ),
211
+ );
207
212
  const localRows = (await listLocalExtensions())
208
213
  .filter((extension) => extension.source.slots.includes(slotId))
209
214
  .map((extension) => ({
@@ -397,7 +402,12 @@ export async function listSlotInstallsForUser(slotId: string): Promise<
397
402
  updatedAt: extensions.updatedAt,
398
403
  })
399
404
  .from(extensions)
400
- .where(accessFilter(extensions, extensionShares));
405
+ .where(
406
+ and(
407
+ accessFilter(extensions, extensionShares),
408
+ isNull(extensions.archivedAt),
409
+ ),
410
+ );
401
411
  const byId = new Map(accessible.map((t: any) => [t.id, t]));
402
412
 
403
413
  const sqlInstalls = (installs as ExtensionSlotInstallRow[])
@@ -419,7 +429,7 @@ export async function listSlotInstallsForUser(slotId: string): Promise<
419
429
  return [...localInstalls, ...sqlInstalls];
420
430
  }
421
431
 
422
- /** Delete every slot/install row referencing a extension. Called from deleteExtension. */
432
+ /** Delete every slot/install row referencing an extension for maintenance. */
423
433
  export async function cascadeDeleteExtensionSlots(
424
434
  extensionId: string,
425
435
  ): Promise<void> {
@@ -52,6 +52,8 @@ import {
52
52
  EXTENSIONS_OWNER_INDEX_SQL,
53
53
  EXTENSIONS_ORG_INDEX_SQL,
54
54
  EXTENSIONS_UPDATED_INDEX_SQL,
55
+ EXTENSIONS_ARCHIVED_AT_COLUMN_SQL,
56
+ EXTENSIONS_ARCHIVED_AT_INDEX_SQL,
55
57
  EXTENSIONS_HIDDEN_AT_COLUMN_SQL,
56
58
  EXTENSIONS_HIDDEN_BY_COLUMN_SQL,
57
59
  EXTENSIONS_HIDDEN_AT_INDEX_SQL,
@@ -103,6 +105,11 @@ export async function ensureExtensionsTables(): Promise<void> {
103
105
  "tools_updated_at_idx",
104
106
  EXTENSIONS_UPDATED_INDEX_SQL,
105
107
  );
108
+ await ensureExtensionsArchivedColumn(client, pg);
109
+ await ensureIndexExists(
110
+ "tools_archived_at_idx",
111
+ EXTENSIONS_ARCHIVED_AT_INDEX_SQL,
112
+ );
106
113
  await ensureExtensionsGlobalHideColumns(client, pg); // ADD COLUMN — guarded inside
107
114
  await ensureIndexExists(
108
115
  "tools_hidden_at_idx",
@@ -176,6 +183,10 @@ export async function ensureExtensionsTables(): Promise<void> {
176
183
  await retryOnDdlRace(() => client.execute(EXTENSIONS_OWNER_INDEX_SQL));
177
184
  await retryOnDdlRace(() => client.execute(EXTENSIONS_ORG_INDEX_SQL));
178
185
  await retryOnDdlRace(() => client.execute(EXTENSIONS_UPDATED_INDEX_SQL));
186
+ await ensureExtensionsArchivedColumn(client, pg);
187
+ await retryOnDdlRace(() =>
188
+ client.execute(EXTENSIONS_ARCHIVED_AT_INDEX_SQL),
189
+ );
179
190
  await ensureExtensionsGlobalHideColumns(client, pg);
180
191
  await retryOnDdlRace(() =>
181
192
  client.execute(EXTENSIONS_HIDDEN_AT_INDEX_SQL),
@@ -346,6 +357,31 @@ async function ensureExtensionsGlobalHideColumns(
346
357
  await addCol(EXTENSIONS_HIDDEN_BY_COLUMN_SQL, "hidden_by", "TEXT");
347
358
  }
348
359
 
360
+ async function ensureExtensionsArchivedColumn(
361
+ client: ReturnType<typeof getDbExec>,
362
+ pg: boolean,
363
+ ): Promise<void> {
364
+ if (pg) {
365
+ await ensureColumnExists(
366
+ "tools",
367
+ "archived_at",
368
+ EXTENSIONS_ARCHIVED_AT_COLUMN_SQL,
369
+ );
370
+ return;
371
+ }
372
+ await client
373
+ .execute("ALTER TABLE tools ADD COLUMN archived_at TEXT")
374
+ .catch((err: any) => {
375
+ if (
376
+ !String(err?.message ?? err)
377
+ .toLowerCase()
378
+ .includes("duplicate")
379
+ ) {
380
+ throw err;
381
+ }
382
+ });
383
+ }
384
+
349
385
  export function registerExtensionsShareable() {
350
386
  registerShareableResource({
351
387
  type: "extension",
@@ -373,6 +409,7 @@ export interface ExtensionRow {
373
409
  icon: string | null;
374
410
  createdAt: string;
375
411
  updatedAt: string;
412
+ archivedAt: string | null;
376
413
  hiddenAt: string | null;
377
414
  hiddenBy: string | null;
378
415
  ownerEmail: string;
@@ -881,9 +918,10 @@ export async function listExtensions(
881
918
  // on repeated `.where()` calls, so combine the access filter and the
882
919
  // global-hidden filter into one condition.
883
920
  const base = accessFilter(extensions, extensionShares);
921
+ const visible = and(base, isNull(extensions.archivedAt));
884
922
  const where = options.includeGloballyHidden
885
- ? base
886
- : and(base, isNull(extensions.hiddenAt));
923
+ ? visible
924
+ : and(visible, isNull(extensions.hiddenAt));
887
925
  const rows = (await db
888
926
  .select()
889
927
  .from(extensions)
@@ -899,7 +937,8 @@ export async function listExtensions(
899
937
  export async function getExtension(id: string): Promise<ExtensionRow | null> {
900
938
  await ensureExtensionsTables();
901
939
  const access = await resolveAccess("extension", id);
902
- return (access?.resource as ExtensionRow | undefined) ?? null;
940
+ const resource = access?.resource as ExtensionRow | undefined;
941
+ return resource?.archivedAt ? null : (resource ?? null);
903
942
  }
904
943
 
905
944
  export interface ListExtensionHistoryOptions {
@@ -983,7 +1022,7 @@ export async function restoreExtensionHistoryVersion(
983
1022
  .from(extensions)
984
1023
  .where(eq(extensions.id, id));
985
1024
  const existing = existingRows[0] as ExtensionRow | undefined;
986
- if (!existing) return null;
1025
+ if (!existing || existing.archivedAt) return null;
987
1026
 
988
1027
  await ensureExtensionHistoryBaseline(existing);
989
1028
  const target = await getPersistedHistoryEntry(id, version, true);
@@ -1045,6 +1084,7 @@ export async function createExtension(
1045
1084
  icon: data.icon ?? null,
1046
1085
  createdAt: now,
1047
1086
  updatedAt: now,
1087
+ archivedAt: null,
1048
1088
  hiddenAt: null,
1049
1089
  hiddenBy: null,
1050
1090
  ownerEmail: userEmail,
@@ -1098,6 +1138,7 @@ export async function findRecentDuplicateExtension(data: {
1098
1138
  eq(extensions.description, description),
1099
1139
  icon === null ? isNull(extensions.icon) : eq(extensions.icon, icon),
1100
1140
  gte(extensions.createdAt, fiveMinutesAgo),
1141
+ isNull(extensions.archivedAt),
1101
1142
  isNull(extensions.hiddenAt),
1102
1143
  ),
1103
1144
  )
@@ -1146,7 +1187,7 @@ export async function updateExtension(
1146
1187
  .from(extensions)
1147
1188
  .where(eq(extensions.id, id));
1148
1189
  const existing = existingRows[0] as ExtensionRow | undefined;
1149
- if (!existing) return null;
1190
+ if (!existing || existing.archivedAt) return null;
1150
1191
  await ensureExtensionHistoryBaseline(existing);
1151
1192
  await db.update(extensions).set(updates).where(eq(extensions.id, id));
1152
1193
  const rows = await db.select().from(extensions).where(eq(extensions.id, id));
@@ -1200,7 +1241,9 @@ export async function updateExtensionContent(
1200
1241
  .select()
1201
1242
  .from(extensions)
1202
1243
  .where(eq(extensions.id, id));
1203
- if (!existingRows[0]) return null;
1244
+ if (!existingRows[0] || (existingRows[0] as ExtensionRow).archivedAt) {
1245
+ return null;
1246
+ }
1204
1247
  const existing = existingRows[0] as ExtensionRow;
1205
1248
  const existingContent = existing.content;
1206
1249
  await ensureExtensionHistoryBaseline(existing);
@@ -1234,20 +1277,13 @@ export async function deleteExtension(id: string): Promise<boolean> {
1234
1277
  const rows = await db.select().from(extensions).where(eq(extensions.id, id));
1235
1278
  const row = rows[0] as ExtensionRow | undefined;
1236
1279
  if (!row) return false;
1280
+ if (row.archivedAt) return true;
1237
1281
  const targets = await extensionChangeTargetsForRow(row);
1238
- await db.delete(extensionShares).where(eq(extensionShares.resourceId, id));
1239
- await db.delete(extensionHides).where(eq(extensionHides.extensionId, id));
1240
- await getDbExec().execute({
1241
- sql: `DELETE FROM tool_data WHERE tool_id = ?`,
1242
- args: [id],
1243
- });
1244
- await getDbExec().execute({
1245
- sql: `DELETE FROM tool_history WHERE tool_id = ?`,
1246
- args: [id],
1247
- });
1248
- const { cascadeDeleteExtensionSlots } = await import("./slots/store.js");
1249
- await cascadeDeleteExtensionSlots(id);
1250
- await db.delete(extensions).where(eq(extensions.id, id));
1282
+ const archivedAt = new Date().toISOString();
1283
+ await db
1284
+ .update(extensions)
1285
+ .set({ archivedAt, updatedAt: archivedAt })
1286
+ .where(eq(extensions.id, id));
1251
1287
  await notifyExtensionChanged(targets);
1252
1288
  return true;
1253
1289
  }
@@ -92,7 +92,7 @@ export function getThemeVars(_isDark?: boolean): string {
92
92
  --muted-foreground: 240 5% 64.9%;
93
93
  --accent: 240 3.7% 15.9%;
94
94
  --accent-foreground: 0 0% 98%;
95
- --destructive: 0 62.8% 30.6%;
95
+ --destructive: 0 84% 60%;
96
96
  --destructive-foreground: 0 0% 98%;
97
97
  --border: 240 3.7% 15.9%;
98
98
  --input: 240 3.7% 15.9%;
@@ -69,6 +69,15 @@ export async function getActiveFileUploadProviderForRequest(): Promise<FileUploa
69
69
  if (builderFileUploadProvider.isConfigured()) {
70
70
  return builderFileUploadProvider;
71
71
  }
72
+ try {
73
+ const { resolveHasBuilderPrivateKey } =
74
+ await import("../server/credential-provider.js");
75
+ if (await resolveHasBuilderPrivateKey()) {
76
+ return builderFileUploadProvider;
77
+ }
78
+ } catch {
79
+ // Treat failed scoped credential lookups as unavailable.
80
+ }
72
81
  return null;
73
82
  }
74
83
 
@@ -100,6 +100,11 @@ export {
100
100
  type ActionMcpAppResourceConfig,
101
101
  type ActionMcpAppResourceMeta,
102
102
  } from "./action.js";
103
+ export {
104
+ normalizeUserProfileName,
105
+ USER_PROFILE_SETTING_KEY,
106
+ type UserProfile,
107
+ } from "./user-profile/index.js";
103
108
  export {
104
109
  ACTION_CHAT_UI_DATA_CHART_RENDERER,
105
110
  ACTION_CHAT_UI_DATA_INSIGHTS_RENDERER,
@@ -41,6 +41,7 @@ export {
41
41
  type ActionMcpAppResourceConfig,
42
42
  type ActionMcpAppResourceMeta,
43
43
  } from "./action.js";
44
+ export * from "./user-profile/index.js";
44
45
  export {
45
46
  embedApp,
46
47
  MCP_APP_REQUEST_ORIGIN_CSP_SOURCE,