@agent-native/core 0.117.1 → 0.117.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (347) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +10 -0
  3. package/corpus/core/package.json +2 -1
  4. package/corpus/core/src/cli/context-xray-local.ts +1 -1
  5. package/corpus/core/src/client/extensions/ExtensionViewer.tsx +4 -4
  6. package/corpus/core/src/client/extensions/ExtensionsSidebarSection.tsx +11 -11
  7. package/corpus/core/src/client/extensions/agent-native-extension-runtime.ts +1 -1
  8. package/corpus/core/src/client/extensions/delete-extension.ts +2 -2
  9. package/corpus/core/src/client/org/OrgSwitcher.tsx +25 -1
  10. package/corpus/core/src/client/settings/SettingsPanel.tsx +102 -10
  11. package/corpus/core/src/client/sharing/ShareButton.tsx +7 -6
  12. package/corpus/core/src/db/client.ts +13 -10
  13. package/corpus/core/src/extensions/actions.ts +13 -5
  14. package/corpus/core/src/extensions/local.ts +1 -0
  15. package/corpus/core/src/extensions/routes.ts +10 -5
  16. package/corpus/core/src/extensions/schema.ts +5 -0
  17. package/corpus/core/src/extensions/slots/store.ts +14 -4
  18. package/corpus/core/src/extensions/store.ts +55 -19
  19. package/corpus/core/src/extensions/theme.ts +1 -1
  20. package/corpus/core/src/file-upload/registry.ts +9 -0
  21. package/corpus/core/src/index.browser.ts +5 -0
  22. package/corpus/core/src/index.ts +1 -0
  23. package/corpus/core/src/localization/default-messages.ts +23 -6
  24. package/corpus/core/src/server/action-discovery.ts +8 -0
  25. package/corpus/core/src/server/better-auth-instance.ts +7 -2
  26. package/corpus/core/src/server/email-template.ts +18 -0
  27. package/corpus/core/src/server/email-templates.ts +3 -0
  28. package/corpus/core/src/server/email.ts +40 -4
  29. package/corpus/core/src/sharing/actions/share-resource.ts +1 -0
  30. package/corpus/core/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  31. package/corpus/core/src/templates/default/app/global.css +1 -1
  32. package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +6 -6
  33. package/corpus/core/src/templates/default/app/i18n/de-DE.ts +6 -6
  34. package/corpus/core/src/templates/default/app/i18n/en-US.ts +6 -6
  35. package/corpus/core/src/templates/default/app/i18n/es-ES.ts +6 -6
  36. package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +6 -6
  37. package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +6 -6
  38. package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +6 -6
  39. package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +6 -6
  40. package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +6 -6
  41. package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +7 -7
  42. package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +7 -7
  43. package/corpus/core/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  44. package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  45. package/corpus/core/src/user-profile/actions/get-user-profile.ts +16 -0
  46. package/corpus/core/src/user-profile/actions/update-user-profile.ts +24 -0
  47. package/corpus/core/src/user-profile/index.ts +5 -0
  48. package/corpus/core/src/user-profile/shared.ts +14 -0
  49. package/corpus/core/src/user-profile/store.ts +50 -0
  50. package/corpus/templates/analytics/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  51. package/corpus/templates/assets/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  52. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +2 -2
  53. package/corpus/templates/assets/app/global.css +1 -1
  54. package/corpus/templates/assets/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  55. package/corpus/templates/brain/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  56. package/corpus/templates/brain/app/global.css +2 -2
  57. package/corpus/templates/brain/app/lib/brain.ts +2 -2
  58. package/corpus/templates/brain/app/root.tsx +2 -2
  59. package/corpus/templates/brain/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  60. package/corpus/templates/calendar/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  61. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +6 -2
  62. package/corpus/templates/calendar/app/global.css +1 -1
  63. package/corpus/templates/calendar/app/root.tsx +2 -2
  64. package/corpus/templates/calendar/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  65. package/corpus/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  66. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +2 -2
  67. package/corpus/templates/chat/app/global.css +1 -1
  68. package/corpus/templates/chat/app/root.tsx +2 -2
  69. package/corpus/templates/chat/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  70. package/corpus/templates/clips/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  71. package/corpus/templates/clips/actions/export-to-brain.ts +1 -1
  72. package/corpus/templates/clips/actions/invite-member.ts +1 -0
  73. package/corpus/templates/clips/app/components/library/library-layout.tsx +2 -2
  74. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +20 -11
  75. package/corpus/templates/clips/app/global.css +1 -1
  76. package/corpus/templates/clips/app/root.tsx +7 -2
  77. package/corpus/templates/clips/app/routes/record.tsx +2 -88
  78. package/corpus/templates/clips/changelog/2026-07-22-builder-connected-recordings-start-resumable-upload-sessions.md +6 -0
  79. package/corpus/templates/clips/changelog/2026-07-22-clip-thumbnails-now-come-from-the-recording-instead-of-the-p.md +6 -0
  80. package/corpus/templates/clips/changelog/2026-07-22-clips-emails-now-render-the-agent-native-logo-in-gmail-and-o.md +6 -0
  81. package/corpus/templates/clips/changelog/2026-07-22-dismissed-zoom-and-teams-meeting-note-prompts-now-stay-dismi.md +6 -0
  82. package/corpus/templates/clips/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  83. package/corpus/templates/clips/changelog/2026-07-22-quieter-permissions-and-rewind-controls.md +6 -0
  84. package/corpus/templates/clips/desktop/src/app.tsx +86 -52
  85. package/corpus/templates/clips/desktop/src/lib/meeting-notification-dismissal.ts +31 -0
  86. package/corpus/templates/clips/desktop/src/lib/recorder.ts +4 -167
  87. package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +10 -1
  88. package/corpus/templates/clips/desktop/src/styles.css +98 -36
  89. package/corpus/templates/clips/desktop/src-tauri/src/adhoc_meetings_watcher.rs +67 -4
  90. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +1 -1
  91. package/corpus/templates/clips/desktop/src-tauri/src/meetings_watcher.rs +51 -0
  92. package/corpus/templates/clips/desktop/src-tauri/src/native_screen/custom_capture.rs +5 -1
  93. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +0 -189
  94. package/corpus/templates/clips/desktop/src-tauri/src/notifications.rs +62 -0
  95. package/corpus/templates/clips/server/plugins/db.ts +6 -2
  96. package/corpus/templates/content/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  97. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +3 -3
  98. package/corpus/templates/content/app/global.css +1 -1
  99. package/corpus/templates/content/app/root.tsx +2 -2
  100. package/corpus/templates/content/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  101. package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  102. package/corpus/templates/crm/app/global.css +1 -1
  103. package/corpus/templates/design/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  104. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +19 -1
  105. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +12 -1
  106. package/corpus/templates/design/app/components/design/EditPanel.tsx +177 -52
  107. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +179 -59
  108. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +74 -27
  109. package/corpus/templates/design/app/components/design/multi-screen/types.ts +2 -0
  110. package/corpus/templates/design/app/components/layout/Sidebar.tsx +2 -2
  111. package/corpus/templates/design/app/global.css +1 -1
  112. package/corpus/templates/design/app/hooks/use-navigation-state.ts +6 -5
  113. package/corpus/templates/design/app/root.tsx +2 -2
  114. package/corpus/templates/design/changelog/2026-07-22-design-owners-can-keep-editing-their-designs-after-switching.md +6 -0
  115. package/corpus/templates/design/changelog/2026-07-22-inspector-tabs-keep-their-text-labels-at-narrow-widths.md +6 -0
  116. package/corpus/templates/design/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  117. package/corpus/templates/design/changelog/2026-07-22-narrow-breakpoint-previews-keep-their-device-labels-readable.md +6 -0
  118. package/corpus/templates/design/changelog/2026-07-22-removed-the-draft-status-chip-from-the-design-editor.md +6 -0
  119. package/corpus/templates/design/changelog/2026-07-22-responsive-breakpoint-controls-stay-within-narrow-sidebars.md +6 -0
  120. package/corpus/templates/design/changelog/2026-07-22-responsive-peers-now-use-a-softer-selection-highlight-withou.md +6 -0
  121. package/corpus/templates/design/changelog/2026-07-22-rotate-from-context-menu.md +6 -0
  122. package/corpus/templates/design/changelog/2026-07-22-the-selection-outline-now-stays-attached-while-moving-screen.md +6 -0
  123. package/corpus/templates/design/changelog/2026-07-22-view-only-designs-now-support-figma-style-layer-inspection-w.md +6 -0
  124. package/corpus/templates/design/server/db/index.ts +4 -0
  125. package/corpus/templates/dispatch/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  126. package/corpus/templates/dispatch/app/dispatch-extensions.tsx +2 -2
  127. package/corpus/templates/dispatch/app/global.css +1 -1
  128. package/corpus/templates/dispatch/app/root.tsx +2 -2
  129. package/corpus/templates/dispatch/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  130. package/corpus/templates/forms/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  131. package/corpus/templates/forms/app/components/layout/Layout.tsx +1 -1
  132. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +3 -3
  133. package/corpus/templates/forms/app/global.css +1 -1
  134. package/corpus/templates/forms/app/hooks/use-forms.ts +55 -2
  135. package/corpus/templates/forms/app/i18n/en-US.ts +2 -0
  136. package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +3 -3
  137. package/corpus/templates/forms/app/pages/FormsListPage.tsx +23 -6
  138. package/corpus/templates/forms/app/root.tsx +2 -2
  139. package/corpus/templates/forms/changelog/2026-07-22-forms-now-archive-with-optimistic-feedback.md +6 -0
  140. package/corpus/templates/forms/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  141. package/corpus/templates/forms/server/plugins/agent-chat.ts +1 -1
  142. package/corpus/templates/macros/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  143. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +2 -2
  144. package/corpus/templates/macros/app/root.tsx +2 -2
  145. package/corpus/templates/macros/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  146. package/corpus/templates/mail/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  147. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +3 -3
  148. package/corpus/templates/mail/app/components/layout/CommandPalette.tsx +2 -2
  149. package/corpus/templates/mail/app/global.css +1 -1
  150. package/corpus/templates/mail/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  151. package/corpus/templates/plan/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  152. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +2 -2
  153. package/corpus/templates/plan/app/global.css +1 -1
  154. package/corpus/templates/plan/app/root.tsx +2 -2
  155. package/corpus/templates/plan/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  156. package/corpus/templates/slides/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  157. package/corpus/templates/slides/app/components/layout/Sidebar.tsx +2 -2
  158. package/corpus/templates/slides/app/root.tsx +2 -2
  159. package/corpus/templates/slides/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  160. package/corpus/templates/slides/changelog/2026-07-22-slides-no-longer-fail-intermittently-on-fresh-server-instances.md +6 -0
  161. package/corpus/templates/slides/changelog/2026-07-22-uploaded-screenshots-can-now-be-analyzed-and-recreated-as-ed.md +6 -0
  162. package/corpus/templates/slides/server/lib/chat-attachments.ts +7 -3
  163. package/corpus/templates/slides/server/plugins/db.ts +44 -17
  164. package/corpus/templates/tasks/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  165. package/corpus/templates/tasks/app/global.css +1 -1
  166. package/dist/cli/context-xray-local.js +1 -1
  167. package/dist/cli/context-xray-local.js.map +1 -1
  168. package/dist/client/extensions/ExtensionViewer.js +2 -2
  169. package/dist/client/extensions/ExtensionViewer.js.map +1 -1
  170. package/dist/client/extensions/ExtensionsSidebarSection.js +11 -11
  171. package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
  172. package/dist/client/extensions/agent-native-extension-runtime.js +1 -1
  173. package/dist/client/extensions/agent-native-extension-runtime.js.map +1 -1
  174. package/dist/client/extensions/delete-extension.d.ts +1 -1
  175. package/dist/client/extensions/delete-extension.d.ts.map +1 -1
  176. package/dist/client/extensions/delete-extension.js +1 -1
  177. package/dist/client/extensions/delete-extension.js.map +1 -1
  178. package/dist/client/org/OrgSwitcher.d.ts +3 -1
  179. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  180. package/dist/client/org/OrgSwitcher.js +12 -4
  181. package/dist/client/org/OrgSwitcher.js.map +1 -1
  182. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  183. package/dist/client/settings/SettingsPanel.js +37 -4
  184. package/dist/client/settings/SettingsPanel.js.map +1 -1
  185. package/dist/client/sharing/ShareButton.d.ts +3 -4
  186. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  187. package/dist/client/sharing/ShareButton.js +3 -2
  188. package/dist/client/sharing/ShareButton.js.map +1 -1
  189. package/dist/collab/awareness.d.ts +2 -2
  190. package/dist/collab/awareness.d.ts.map +1 -1
  191. package/dist/db/client.d.ts +7 -7
  192. package/dist/db/client.d.ts.map +1 -1
  193. package/dist/db/client.js +13 -10
  194. package/dist/db/client.js.map +1 -1
  195. package/dist/extensions/actions.d.ts.map +1 -1
  196. package/dist/extensions/actions.js +8 -5
  197. package/dist/extensions/actions.js.map +1 -1
  198. package/dist/extensions/local.d.ts.map +1 -1
  199. package/dist/extensions/local.js +1 -0
  200. package/dist/extensions/local.js.map +1 -1
  201. package/dist/extensions/routes.d.ts.map +1 -1
  202. package/dist/extensions/routes.js +9 -4
  203. package/dist/extensions/routes.js.map +1 -1
  204. package/dist/extensions/schema.d.ts +23 -2
  205. package/dist/extensions/schema.d.ts.map +1 -1
  206. package/dist/extensions/schema.js +5 -0
  207. package/dist/extensions/schema.js.map +1 -1
  208. package/dist/extensions/slots/store.d.ts +1 -1
  209. package/dist/extensions/slots/store.d.ts.map +1 -1
  210. package/dist/extensions/slots/store.js +4 -4
  211. package/dist/extensions/slots/store.js.map +1 -1
  212. package/dist/extensions/store.d.ts +1 -0
  213. package/dist/extensions/store.d.ts.map +1 -1
  214. package/dist/extensions/store.js +38 -21
  215. package/dist/extensions/store.js.map +1 -1
  216. package/dist/extensions/theme.js +1 -1
  217. package/dist/extensions/theme.js.map +1 -1
  218. package/dist/file-upload/registry.d.ts.map +1 -1
  219. package/dist/file-upload/registry.js +9 -0
  220. package/dist/file-upload/registry.js.map +1 -1
  221. package/dist/index.browser.d.ts +1 -0
  222. package/dist/index.browser.d.ts.map +1 -1
  223. package/dist/index.browser.js +1 -0
  224. package/dist/index.browser.js.map +1 -1
  225. package/dist/index.d.ts +1 -0
  226. package/dist/index.d.ts.map +1 -1
  227. package/dist/index.js +1 -0
  228. package/dist/index.js.map +1 -1
  229. package/dist/localization/default-messages.d.ts +16 -0
  230. package/dist/localization/default-messages.d.ts.map +1 -1
  231. package/dist/localization/default-messages.js +22 -6
  232. package/dist/localization/default-messages.js.map +1 -1
  233. package/dist/provider-api/actions/custom-provider-registration.d.ts +7 -7
  234. package/dist/provider-api/actions/provider-api.d.ts +11 -11
  235. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  236. package/dist/secrets/routes.d.ts +6 -6
  237. package/dist/server/action-discovery.d.ts.map +1 -1
  238. package/dist/server/action-discovery.js +8 -0
  239. package/dist/server/action-discovery.js.map +1 -1
  240. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  241. package/dist/server/better-auth-instance.d.ts +7 -2
  242. package/dist/server/better-auth-instance.d.ts.map +1 -1
  243. package/dist/server/better-auth-instance.js.map +1 -1
  244. package/dist/server/email-template.d.ts +3 -0
  245. package/dist/server/email-template.d.ts.map +1 -1
  246. package/dist/server/email-template.js +13 -0
  247. package/dist/server/email-template.js.map +1 -1
  248. package/dist/server/email-templates.d.ts.map +1 -1
  249. package/dist/server/email-templates.js +3 -0
  250. package/dist/server/email-templates.js.map +1 -1
  251. package/dist/server/email.d.ts.map +1 -1
  252. package/dist/server/email.js +27 -4
  253. package/dist/server/email.js.map +1 -1
  254. package/dist/sharing/actions/share-resource.js +1 -0
  255. package/dist/sharing/actions/share-resource.js.map +1 -1
  256. package/dist/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  257. package/dist/templates/chat/app/components/layout/Sidebar.tsx +2 -2
  258. package/dist/templates/chat/app/global.css +1 -1
  259. package/dist/templates/chat/app/root.tsx +2 -2
  260. package/dist/templates/chat/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  261. package/dist/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  262. package/dist/templates/default/app/global.css +1 -1
  263. package/dist/templates/default/app/i18n/ar-SA.ts +6 -6
  264. package/dist/templates/default/app/i18n/de-DE.ts +6 -6
  265. package/dist/templates/default/app/i18n/en-US.ts +6 -6
  266. package/dist/templates/default/app/i18n/es-ES.ts +6 -6
  267. package/dist/templates/default/app/i18n/fr-FR.ts +6 -6
  268. package/dist/templates/default/app/i18n/hi-IN.ts +6 -6
  269. package/dist/templates/default/app/i18n/ja-JP.ts +6 -6
  270. package/dist/templates/default/app/i18n/ko-KR.ts +6 -6
  271. package/dist/templates/default/app/i18n/pt-BR.ts +6 -6
  272. package/dist/templates/default/app/i18n/zh-CN.ts +7 -7
  273. package/dist/templates/default/app/i18n/zh-TW.ts +7 -7
  274. package/dist/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  275. package/dist/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  276. package/dist/user-profile/actions/get-user-profile.d.ts +4 -0
  277. package/dist/user-profile/actions/get-user-profile.d.ts.map +1 -0
  278. package/dist/user-profile/actions/get-user-profile.js +14 -0
  279. package/dist/user-profile/actions/get-user-profile.js.map +1 -0
  280. package/dist/user-profile/actions/update-user-profile.d.ts +6 -0
  281. package/dist/user-profile/actions/update-user-profile.d.ts.map +1 -0
  282. package/dist/user-profile/actions/update-user-profile.js +20 -0
  283. package/dist/user-profile/actions/update-user-profile.js.map +1 -0
  284. package/dist/user-profile/index.d.ts +2 -0
  285. package/dist/user-profile/index.d.ts.map +1 -0
  286. package/dist/user-profile/index.js +2 -0
  287. package/dist/user-profile/index.js.map +1 -0
  288. package/dist/user-profile/shared.d.ts +7 -0
  289. package/dist/user-profile/shared.d.ts.map +1 -0
  290. package/dist/user-profile/shared.js +6 -0
  291. package/dist/user-profile/shared.js.map +1 -0
  292. package/dist/user-profile/store.d.ts +4 -0
  293. package/dist/user-profile/store.d.ts.map +1 -0
  294. package/dist/user-profile/store.js +38 -0
  295. package/dist/user-profile/store.js.map +1 -0
  296. package/package.json +2 -1
  297. package/src/cli/context-xray-local.ts +1 -1
  298. package/src/client/extensions/ExtensionViewer.tsx +4 -4
  299. package/src/client/extensions/ExtensionsSidebarSection.tsx +11 -11
  300. package/src/client/extensions/agent-native-extension-runtime.ts +1 -1
  301. package/src/client/extensions/delete-extension.ts +2 -2
  302. package/src/client/org/OrgSwitcher.tsx +25 -1
  303. package/src/client/settings/SettingsPanel.tsx +102 -10
  304. package/src/client/sharing/ShareButton.tsx +7 -6
  305. package/src/db/client.ts +13 -10
  306. package/src/extensions/actions.ts +13 -5
  307. package/src/extensions/local.ts +1 -0
  308. package/src/extensions/routes.ts +10 -5
  309. package/src/extensions/schema.ts +5 -0
  310. package/src/extensions/slots/store.ts +14 -4
  311. package/src/extensions/store.ts +55 -19
  312. package/src/extensions/theme.ts +1 -1
  313. package/src/file-upload/registry.ts +9 -0
  314. package/src/index.browser.ts +5 -0
  315. package/src/index.ts +1 -0
  316. package/src/localization/default-messages.ts +23 -6
  317. package/src/server/action-discovery.ts +8 -0
  318. package/src/server/better-auth-instance.ts +7 -2
  319. package/src/server/email-template.ts +18 -0
  320. package/src/server/email-templates.ts +3 -0
  321. package/src/server/email.ts +40 -4
  322. package/src/sharing/actions/share-resource.ts +1 -0
  323. package/src/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  324. package/src/templates/chat/app/components/layout/Sidebar.tsx +2 -2
  325. package/src/templates/chat/app/global.css +1 -1
  326. package/src/templates/chat/app/root.tsx +2 -2
  327. package/src/templates/chat/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  328. package/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  329. package/src/templates/default/app/global.css +1 -1
  330. package/src/templates/default/app/i18n/ar-SA.ts +6 -6
  331. package/src/templates/default/app/i18n/de-DE.ts +6 -6
  332. package/src/templates/default/app/i18n/en-US.ts +6 -6
  333. package/src/templates/default/app/i18n/es-ES.ts +6 -6
  334. package/src/templates/default/app/i18n/fr-FR.ts +6 -6
  335. package/src/templates/default/app/i18n/hi-IN.ts +6 -6
  336. package/src/templates/default/app/i18n/ja-JP.ts +6 -6
  337. package/src/templates/default/app/i18n/ko-KR.ts +6 -6
  338. package/src/templates/default/app/i18n/pt-BR.ts +6 -6
  339. package/src/templates/default/app/i18n/zh-CN.ts +7 -7
  340. package/src/templates/default/app/i18n/zh-TW.ts +7 -7
  341. package/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  342. package/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  343. package/src/user-profile/actions/get-user-profile.ts +16 -0
  344. package/src/user-profile/actions/update-user-profile.ts +24 -0
  345. package/src/user-profile/index.ts +5 -0
  346. package/src/user-profile/shared.ts +14 -0
  347. package/src/user-profile/store.ts +50 -0
package/corpus/README.md CHANGED
@@ -28,6 +28,6 @@ rg -n "defineAction|useActionQuery" node_modules/@agent-native/core/corpus
28
28
 
29
29
  ## Generated Counts
30
30
 
31
- - core files: 1531
31
+ - core files: 1536
32
32
  - toolkit files: 145
33
- - template files: 6410
33
+ - template files: 6441
@@ -1,5 +1,15 @@
1
1
  # @agent-native/core
2
2
 
3
+ ## 0.117.2
4
+
5
+ ### Patch Changes
6
+
7
+ - bc91e11: Archive extensions without deleting their history, data, or sharing configuration.
8
+ - bc91e11: Add a shared editable user profile to settings and the workspace switcher.
9
+ - bc91e11: Render transactional email branding with a SendGrid-compatible inline logo and text fallback.
10
+ - bc91e11: Bound foreground serverless database pools to one connection and retry transient connection-exhaustion errors.
11
+ - bc91e11: Render the default Share trigger as a text-only button without a visibility icon.
12
+
3
13
  ## 0.117.1
4
14
 
5
15
  ### Patch Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/core",
3
- "version": "0.117.1",
3
+ "version": "0.117.2",
4
4
  "description": "Framework for agent-native application development — where AI agents and UI share SQL state, actions, and context",
5
5
  "homepage": "https://github.com/BuilderIO/agent-native#readme",
6
6
  "bugs": {
@@ -162,6 +162,7 @@
162
162
  },
163
163
  "./application-state": "./dist/application-state/index.js",
164
164
  "./settings": "./dist/settings/index.js",
165
+ "./user-profile": "./dist/user-profile/index.js",
165
166
  "./feature-flags": "./dist/feature-flags/index.js",
166
167
  "./feature-flags/registry": "./dist/feature-flags/registry.js",
167
168
  "./feature-flags/actions/get-feature-flags": "./dist/feature-flags/actions/get-feature-flags.js",
@@ -1933,7 +1933,7 @@ function renderHtml(sessions, args) {
1933
1933
  return "<!doctype html><html><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"><title>Context X-Ray</title><style>" +
1934
1934
  "@import url(\"https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap\");" +
1935
1935
  ":root{--background:0 0% 100%;--foreground:220 10% 10%;--card:0 0% 100%;--muted:220 10% 95%;--muted-foreground:220 5% 45%;--accent:220 10% 92%;--border:220 10% 90%;--ring:220 10% 55%;--destructive:0 84% 60%;--radius:.5rem;--shadow:0 1px 2px rgba(16,24,40,.06);}" +
1936
- "@media(prefers-color-scheme:dark){:root{--background:220 10% 7%;--foreground:220 8% 92%;--card:220 9% 9%;--muted:220 8% 15%;--muted-foreground:220 6% 64%;--accent:220 8% 17%;--border:220 8% 18%;--ring:220 8% 54%;--destructive:0 72% 51%;--shadow:none;}}" +
1936
+ "@media(prefers-color-scheme:dark){:root{--background:220 10% 7%;--foreground:220 8% 92%;--card:220 9% 9%;--muted:220 8% 15%;--muted-foreground:220 6% 64%;--accent:220 8% 17%;--border:220 8% 18%;--ring:220 8% 54%;--destructive:0 84% 60%;--shadow:none;}}" +
1937
1937
  "*{box-sizing:border-box}html{background:hsl(var(--background))}body{margin:0;background:hsl(var(--background));color:hsl(var(--foreground));font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;font-feature-settings:\"cv02\",\"cv03\",\"cv04\",\"cv11\";line-height:1.45}button{font:inherit;color:inherit}main{max-width:1180px;margin:0 auto;padding:20px 18px 44px}.topbar{border-bottom:1px solid hsl(var(--border));background:hsl(var(--background));position:sticky;top:0;z-index:10}.topbar-inner{max-width:1180px;margin:0 auto;padding:14px 18px;display:flex;align-items:center;justify-content:space-between;gap:16px}.title-row{display:flex;align-items:center;gap:9px}.logo-dot{width:10px;height:10px;border-radius:999px;background:#38bdf8;box-shadow:0 0 0 4px rgba(56,189,248,.12)}h1{font-size:20px;line-height:1.1;margin:0;font-weight:650;letter-spacing:0}h2{font-size:15px;line-height:1.2;margin:0;font-weight:650}h3{font-size:14px;line-height:1.3;margin:0;font-weight:600}p{margin:0}.muted,.eyebrow,.meta,.empty{color:hsl(var(--muted-foreground))}.eyebrow{text-transform:uppercase;letter-spacing:.08em;font-size:11px;font-weight:650}.meta{font-size:12px}.tabs{display:inline-flex;align-items:center;gap:2px;border:1px solid hsl(var(--border));background:hsl(var(--muted)/.35);border-radius:8px;padding:2px}.tab{border:0;background:transparent;border-radius:6px;padding:6px 10px;font-size:12px;line-height:1.1;cursor:pointer}.tab:hover{background:hsl(var(--accent)/.5)}.tab.active{background:hsl(var(--background));box-shadow:var(--shadow)}.stats{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;margin:18px 0}.card{background:hsl(var(--card));border:1px solid hsl(var(--border));border-radius:8px;padding:14px;box-shadow:var(--shadow)}.stat-value{display:block;font-size:28px;line-height:1.1;font-weight:700;margin-top:6px}.panel{display:none}.panel.active{display:block}.grid{display:grid;grid-template-columns:minmax(0,1.35fr) minmax(280px,.8fr);gap:14px;align-items:start}.grid.equal{grid-template-columns:repeat(2,minmax(0,1fr))}.section-head{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;margin-bottom:12px}.bar{display:flex;overflow:hidden;height:10px;border-radius:999px;background:hsl(var(--muted));margin:10px 0 12px}.bar span{display:block;min-width:2px}.table{width:100%;border-collapse:collapse;font-size:12px}.table th{text-align:left;color:hsl(var(--muted-foreground));font-weight:600;border-bottom:1px solid hsl(var(--border));padding:7px 8px}.table td{border-bottom:1px solid hsl(var(--border));padding:8px;vertical-align:top}.table th:last-child,.table td:last-child{text-align:right}.row-button{width:100%;display:grid;grid-template-columns:minmax(0,1fr) 74px 70px;gap:10px;align-items:center;text-align:left;border:1px solid transparent;background:transparent;border-radius:6px;padding:8px;cursor:pointer}.row-button:hover,.row-button.active{border-color:hsl(var(--border));background:hsl(var(--accent)/.35)}.row-title{font-size:13px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.row-meta{font-size:12px;color:hsl(var(--muted-foreground));text-align:right}.badge-list{display:flex;flex-wrap:wrap;gap:6px}.badge{display:inline-flex;align-items:center;gap:5px;border:1px solid hsl(var(--border));border-radius:999px;padding:3px 7px;font-size:11px;background:hsl(var(--background));max-width:100%}.badge .dot{width:7px;height:7px;border-radius:999px;flex:0 0 auto}.tips{margin:0;padding-left:20px}.tips li{margin:0 0 8px}.detail{min-height:228px}.detail-list{display:grid;gap:8px;margin-top:10px}.sample{border:1px solid hsl(var(--border));border-radius:8px;padding:10px;background:hsl(var(--muted)/.22)}.sample-top{display:flex;justify-content:space-between;gap:10px;margin-bottom:5px;font-size:11px;color:hsl(var(--muted-foreground))}.sample p{font-size:12px;color:hsl(var(--foreground));overflow-wrap:anywhere}.session-card{border:1px solid hsl(var(--border));border-radius:8px;background:hsl(var(--card));margin-bottom:10px;overflow:hidden}.session-card summary{list-style:none;display:flex;justify-content:space-between;gap:14px;cursor:pointer;padding:13px 14px}.session-card summary::-webkit-details-marker{display:none}.session-body{border-top:1px solid hsl(var(--border));padding:12px 14px}.session-title{font-size:13px;font-weight:650;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.session-path{font-size:12px;color:hsl(var(--muted-foreground));margin-top:3px;overflow-wrap:anywhere}.token-big{font-size:20px;font-weight:700;white-space:nowrap}.mini-label{margin:10px 0 6px;font-size:11px;text-transform:uppercase;letter-spacing:.08em;font-weight:650;color:hsl(var(--muted-foreground))}.footer{margin-top:20px;color:hsl(var(--muted-foreground));font-size:12px}.hidden{display:none!important}@media(max-width:840px){.topbar-inner{align-items:flex-start;flex-direction:column}.stats,.grid,.grid.equal{grid-template-columns:1fr}.tabs{width:100%;overflow:auto}.tab{white-space:nowrap}.row-button{grid-template-columns:minmax(0,1fr) 64px 58px}.session-card summary{align-items:flex-start;flex-direction:column}}" +
1938
1938
  "</style></head><body><header class=\"topbar\"><div class=\"topbar-inner\"><div><div class=\"title-row\"><span class=\"logo-dot\"></span><h1>Context X-Ray</h1></div><p class=\"meta\">Generated " + escapeHtml(report.generatedLabel) + " · mode=" + escapeHtml(report.mode) + " · source=" + escapeHtml(report.source) + " · since=" + escapeHtml(report.since) + "</p></div><nav class=\"tabs\" aria-label=\"Report views\"><button class=\"tab active\" data-tab=\"overview\">Overview</button><button class=\"tab\" data-tab=\"tools\">Tool Calls</button><button class=\"tab\" data-tab=\"mcp\">MCP</button><button class=\"tab\" data-tab=\"metadata\">Metadata</button><button class=\"tab\" data-tab=\"sessions\">Sessions</button></nav></div></header><main><section class=\"stats\" id=\"stats\"></section><section class=\"panel active\" id=\"panel-overview\"></section><section class=\"panel\" id=\"panel-tools\"></section><section class=\"panel\" id=\"panel-mcp\"></section><section class=\"panel\" id=\"panel-metadata\"></section><section class=\"panel\" id=\"panel-sessions\"></section><p class=\"footer\">Reads local transcript and MCP config files only. No transcript content is uploaded.</p></main><script type=\"application/json\" id=\"xray-data\">" + jsonScript(report) + "</script><script>" +
1939
1939
  "(function(){var report=JSON.parse(document.getElementById('xray-data').textContent);var cats=['user','assistant','tool_call','tool_output','reasoning','instructions','attachment','metadata','other'];var labels={user:'User asks',assistant:'Assistant text',tool_call:'Tool calls',tool_output:'Tool output',reasoning:'Reasoning',instructions:'Instructions/context',attachment:'Attachments',metadata:'Metadata',other:'Other'};var colors={user:'#8ba8ff',assistant:'#55b982',tool_call:'#f0a85b',tool_output:'#e06b73',reasoning:'#a77be8',instructions:'#6ac3d5',attachment:'#d6a85a',metadata:'#9aa3ad',other:'#c3c8ce'};function esc(v){return String(v||'').replace(/[&<>\"']/g,function(ch){return {'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'}[ch];});}function fmt(n){n=Number(n)||0;if(n>=1000000)return(n/1000000).toFixed(1)+'m';if(n>=1000)return(n/1000).toFixed(1)+'k';return String(n);}function tok(chars){chars=Number(chars)||0;return chars>0?Math.max(1,Math.ceil(chars/4)):0;}function pc(part,total){return total>0?Math.max(0,Math.min(100,(part/total)*100)):0;}function totalCounter(counter){return Object.keys(counter||{}).reduce(function(sum,key){return sum+(Number(counter[key])||0);},0);}function bar(counter){var total=totalCounter(counter);if(!total)return'<div class=\"bar\"></div>';return'<div class=\"bar\">'+cats.map(function(cat){var value=counter[cat]||0;if(!value)return'';return'<span title=\"'+esc(labels[cat])+'\" style=\"width:'+Math.max(1,pc(value,total)).toFixed(2)+'%;background:'+colors[cat]+'\"></span>';}).join('')+'</div>';}function metric(label,value){return'<article class=\"card\"><div class=\"eyebrow\">'+esc(label)+'</div><span class=\"stat-value\">'+esc(value)+'</span></article>';}function tableRows(entries,kind){if(!entries||!entries.length)return'<tr><td>None detected</td><td></td></tr>';return entries.map(function(entry){var value=entry[1];var shown=kind==='chars'?fmt(tok(value)):(kind==='tokens'?fmt(value):String(value));return'<tr><td>'+esc(entry[0])+'</td><td>'+esc(shown)+'</td></tr>';}).join('');}function toolToken(name){var found=(report.toolTokens||[]).filter(function(entry){return entry[0]===name;})[0];return found?found[1]:0;}function renderStats(){var counts=report.sourceCounts||{};document.getElementById('stats').innerHTML=metric('Sessions',report.sessionCount)+metric('Observed/estimated tokens',fmt(report.totalTokens))+metric('Codex',counts.codex||0)+metric('Claude',counts.claude||0);}function renderOverview(){var categoryTotal=totalCounter(report.categories);var categoryRows=cats.map(function(cat){var chars=(report.categories||{})[cat]||0;if(!chars)return'';return'<tr><td><span class=\"badge\"><span class=\"dot\" style=\"background:'+colors[cat]+'\"></span>'+esc(labels[cat])+'</span></td><td>'+fmt(tok(chars))+'</td><td>'+pc(chars,categoryTotal).toFixed(0)+'%</td></tr>';}).join('');document.getElementById('panel-overview').innerHTML='<div class=\"grid\"><section class=\"card\"><div class=\"section-head\"><div><h2>Where The Context Is Going</h2><p class=\"meta\">Approximate contribution by transcript bucket.</p></div></div>'+bar(report.categories)+'<table class=\"table\"><tbody>'+categoryRows+'</tbody></table></section><section class=\"card\"><div class=\"section-head\"><div><h2>Warnings And Optimizations</h2><p class=\"meta\">Promptable changes you control.</p></div></div><ol class=\"tips\">'+(report.recommendations||[]).map(function(tip){return'<li>'+esc(tip)+'</li>';}).join('')+'</ol></section></div><div class=\"grid equal\" style=\"margin-top:14px\"><section class=\"card\"><h2>Top Paths</h2><table class=\"table\"><tbody>'+tableRows(report.paths,'count')+'</tbody></table></section><section class=\"card\"><h2>Metadata Types</h2><table class=\"table\"><tbody>'+tableRows(report.metadata,'chars')+'</tbody></table></section></div>';}function renderTools(){var rows=(report.tools||[]).map(function(entry,index){var name=entry[0];var count=entry[1];return'<button class=\"row-button'+(index===0?' active':'')+'\" data-tool=\"'+esc(name)+'\"><span><span class=\"row-title\">'+esc(name)+'</span><span class=\"meta\">Click to inspect sampled calls</span></span><span class=\"row-meta\">x'+count+'</span><span class=\"row-meta\">'+fmt(toolToken(name))+' tok</span></button>';}).join('')||'<div class=\"empty\">No tool calls detected in these sessions.</div>';document.getElementById('panel-tools').innerHTML='<div class=\"grid\"><section class=\"card\"><div class=\"section-head\"><div><h2>Tool Calls</h2><p class=\"meta\">Calls are clickable; samples are capped so the report stays light.</p></div></div><div>'+rows+'</div></section><aside class=\"card detail\" id=\"tool-detail\"></aside></div>';Array.prototype.forEach.call(document.querySelectorAll('[data-tool]'),function(btn){btn.addEventListener('click',function(){Array.prototype.forEach.call(document.querySelectorAll('[data-tool]'),function(item){item.classList.remove('active');});btn.classList.add('active');renderToolDetail(btn.getAttribute('data-tool'));});});if((report.tools||[]).length)renderToolDetail(report.tools[0][0]);else document.getElementById('tool-detail').innerHTML='<h2>Tool Detail</h2><p class=\"empty\">Nothing to inspect yet.</p>';}function renderToolDetail(name){var events=(report.toolEvents||[]).filter(function(event){return event.tool===name;}).slice(0,30);document.getElementById('tool-detail').innerHTML='<div class=\"section-head\"><div><h2>'+esc(name)+'</h2><p class=\"meta\">'+events.length+' sampled call'+(events.length===1?'':'s')+'</p></div></div><div class=\"detail-list\">'+(events.map(function(event){return'<article class=\"sample\"><div class=\"sample-top\"><span>'+esc(event.source)+' · '+esc(event.sessionTitle||event.sessionId)+'</span><span>'+fmt(event.tokens||0)+' tok</span></div><p>'+esc(event.preview||'No preview captured.')+'</p></article>';}).join('')||'<p class=\"empty\">No sampled call payloads for this tool.</p>')+'</div>';}function renderMcp(){var servers=report.mcpServers||[];var usage=report.mcpUsage||[];var configured=servers.map(function(server){return'<button class=\"row-button\" data-mcp=\"'+esc(server.name)+'\"><span><span class=\"row-title\">'+esc(server.name)+'</span><span class=\"meta\">'+esc(server.source)+' · '+esc(server.target)+'</span></span><span class=\"row-meta\">config</span><span class=\"row-meta\"></span></button>';}).join('')||'<div class=\"empty\">No MCP server config found in the common local config files.</div>';var detected=usage.map(function(entry,index){return'<button class=\"row-button'+(!servers.length&&index===0?' active':'')+'\" data-mcp=\"'+esc(entry[0])+'\"><span><span class=\"row-title\">'+esc(entry[0])+'</span><span class=\"meta\">Detected from mcp__server__tool style names</span></span><span class=\"row-meta\">x'+entry[1]+'</span><span class=\"row-meta\"></span></button>';}).join('')||'<div class=\"empty\">No MCP-prefixed tool calls detected in the selected sessions.</div>';document.getElementById('panel-mcp').innerHTML='<div class=\"grid\"><section class=\"card\"><div class=\"section-head\"><div><h2>MCP Servers</h2><p class=\"meta\">Configured locally plus inferred calls from transcripts.</p></div></div><div class=\"mini-label\">Configured</div>'+configured+'<div class=\"mini-label\">Detected usage</div>'+detected+'</section><aside class=\"card detail\" id=\"mcp-detail\"></aside></div>';Array.prototype.forEach.call(document.querySelectorAll('[data-mcp]'),function(btn){btn.addEventListener('click',function(){Array.prototype.forEach.call(document.querySelectorAll('[data-mcp]'),function(item){item.classList.remove('active');});btn.classList.add('active');renderMcpDetail(btn.getAttribute('data-mcp'));});});if(usage.length)renderMcpDetail(usage[0][0]);else if(servers.length)renderMcpDetail(servers[0].name);else document.getElementById('mcp-detail').innerHTML='<h2>MCP Detail</h2><p class=\"empty\">Install or run sessions with MCP tools to see usage here.</p>';}function renderMcpDetail(name){var server=(report.mcpServers||[]).filter(function(item){return item.name===name;})[0];var tools=(report.mcpTools||[]).filter(function(entry){return entry[0].indexOf(name+' / ')===0;});var events=(report.toolEvents||[]).filter(function(event){return event.mcpServer===name;}).slice(0,25);document.getElementById('mcp-detail').innerHTML='<div class=\"section-head\"><div><h2>'+esc(name)+'</h2><p class=\"meta\">'+(server?esc(server.source+' · '+server.target):'Detected from tool call names')+'</p></div></div><div class=\"mini-label\">Tools</div><table class=\"table\"><tbody>'+tableRows(tools,'count')+'</tbody></table><div class=\"mini-label\">Sample calls</div><div class=\"detail-list\">'+(events.map(function(event){return'<article class=\"sample\"><div class=\"sample-top\"><span>'+esc(event.mcpTool||event.tool)+'</span><span>'+fmt(event.tokens||0)+' tok</span></div><p>'+esc(event.preview||'No preview captured.')+'</p></article>';}).join('')||'<p class=\"empty\">No sampled MCP calls for this server in the selected sessions.</p>')+'</div>';}function renderMetadata(){var rows=(report.metadata||[]).map(function(entry,index){return'<button class=\"row-button'+(index===0?' active':'')+'\" data-meta=\"'+esc(entry[0])+'\"><span><span class=\"row-title\">'+esc(entry[0])+'</span><span class=\"meta\">Click to inspect sampled records</span></span><span class=\"row-meta\">'+fmt(tok(entry[1]))+' tok</span><span class=\"row-meta\">'+fmt(entry[1])+' ch</span></button>';}).join('')||'<div class=\"empty\">No metadata-heavy records detected.</div>';document.getElementById('panel-metadata').innerHTML='<div class=\"grid\"><section class=\"card\"><div class=\"section-head\"><div><h2>Metadata</h2><p class=\"meta\">Breakdown by transcript record type.</p></div></div>'+rows+'</section><aside class=\"card detail\" id=\"metadata-detail\"></aside></div>';Array.prototype.forEach.call(document.querySelectorAll('[data-meta]'),function(btn){btn.addEventListener('click',function(){Array.prototype.forEach.call(document.querySelectorAll('[data-meta]'),function(item){item.classList.remove('active');});btn.classList.add('active');renderMetadataDetail(btn.getAttribute('data-meta'));});});if((report.metadata||[]).length)renderMetadataDetail(report.metadata[0][0]);else document.getElementById('metadata-detail').innerHTML='<h2>Metadata Detail</h2><p class=\"empty\">Nothing to inspect yet.</p>';}function renderMetadataDetail(type){var events=(report.metadataEvents||[]).filter(function(event){return event.type===type;}).slice(0,30);document.getElementById('metadata-detail').innerHTML='<div class=\"section-head\"><div><h2>'+esc(type)+'</h2><p class=\"meta\">'+events.length+' sampled record'+(events.length===1?'':'s')+'</p></div></div><div class=\"detail-list\">'+(events.map(function(event){return'<article class=\"sample\"><div class=\"sample-top\"><span>'+esc(event.source)+' · '+esc(event.sessionTitle||event.sessionId)+'</span><span>'+fmt(event.tokens||0)+' tok</span></div><p>'+esc(event.preview||'No preview captured.')+'</p></article>';}).join('')||'<p class=\"empty\">No sampled records for this metadata type.</p>')+'</div>';}function renderSessions(){document.getElementById('panel-sessions').innerHTML=(report.sessions||[]).map(function(session,index){var catRows=Object.keys(session.categories||{}).sort(function(a,b){return session.categories[b]-session.categories[a];}).map(function(cat){var chars=session.categories[cat];return'<tr><td>'+esc(labels[cat]||cat)+'</td><td>'+fmt(tok(chars))+'</td><td>'+pc(chars,session.totalChars||0).toFixed(0)+'%</td></tr>';}).join('');var tools=(session.tools?Object.keys(session.tools):[]).sort(function(a,b){return session.tools[b]-session.tools[a];}).slice(0,8).map(function(name){return'<span class=\"badge\">'+esc(name)+' x'+session.tools[name]+'</span>';}).join('')||'<span class=\"empty\">none detected</span>';var paths=(session.paths?Object.keys(session.paths):[]).sort(function(a,b){return session.paths[b]-session.paths[a];}).slice(0,8).map(function(name){return'<span class=\"badge\">'+esc(name)+' x'+session.paths[name]+'</span>';}).join('')||'<span class=\"empty\">none detected</span>';return'<details class=\"session-card\"'+(index===0?' open':'')+'><summary><span><span class=\"eyebrow\">'+esc(session.source)+' · '+esc(session.updatedAt||'unknown time')+'</span><span class=\"session-title\">'+esc(session.title||session.sessionId)+'</span><span class=\"session-path\">'+esc(session.cwd||session.path)+'</span></span><span class=\"token-big\">'+fmt(session.tokens)+'</span></summary><div class=\"session-body\">'+bar(session.categories)+'<div class=\"grid equal\"><div><div class=\"mini-label\">Buckets</div><table class=\"table\"><tbody>'+catRows+'</tbody></table></div><div><div class=\"mini-label\">Frequent tools</div><div class=\"badge-list\">'+tools+'</div><div class=\"mini-label\">Repeated paths</div><div class=\"badge-list\">'+paths+'</div></div></div></div></details>';}).join('')||'<section class=\"card\"><p class=\"empty\">No matching sessions found.</p></section>';}function activate(name){Array.prototype.forEach.call(document.querySelectorAll('.tab'),function(tab){tab.classList.toggle('active',tab.getAttribute('data-tab')===name);});Array.prototype.forEach.call(document.querySelectorAll('.panel'),function(panel){panel.classList.toggle('active',panel.id==='panel-'+name);});if(location.hash!=='#'+name)history.replaceState(null,'','#'+name);}Array.prototype.forEach.call(document.querySelectorAll('.tab'),function(tab){tab.addEventListener('click',function(){activate(tab.getAttribute('data-tab'));});});renderStats();renderOverview();renderTools();renderMcp();renderMetadata();renderSessions();var initial=(location.hash||'#overview').slice(1);if(document.getElementById('panel-'+initial))activate(initial);})();" +
@@ -1463,7 +1463,7 @@ function ToolMoreMenu({
1463
1463
  <span>
1464
1464
  {canDelete === false
1465
1465
  ? "Remove from my list..."
1466
- : "Delete extension..."}
1466
+ : "Archive extension..."}
1467
1467
  </span>
1468
1468
  </button>
1469
1469
  </div>
@@ -1472,11 +1472,11 @@ function ToolMoreMenu({
1472
1472
  ) : (
1473
1473
  <div className="flex flex-col gap-2 p-3">
1474
1474
  <p className="text-[12px]">
1475
- {canDelete === false ? "Remove " : "Delete "}
1475
+ {canDelete === false ? "Remove " : "Archive "}
1476
1476
  <span className="font-medium">{toolName}</span>?
1477
1477
  {canDelete === false
1478
1478
  ? " This hides it from your Extensions list without deleting it for anyone else."
1479
- : " This removes the extension everywhere, for everyone it's shared with."}
1479
+ : " This archives the extension everywhere, for everyone it's shared with."}
1480
1480
  </p>
1481
1481
  <div className="flex justify-end gap-1">
1482
1482
  <button
@@ -1491,7 +1491,7 @@ function ToolMoreMenu({
1491
1491
  onClick={deleteExtension}
1492
1492
  className="rounded-md bg-destructive px-2 py-1 text-[12px] text-destructive-foreground hover:bg-destructive/90 cursor-pointer"
1493
1493
  >
1494
- {canDelete === false ? "Remove" : "Delete"}
1494
+ {canDelete === false ? "Remove" : "Archive"}
1495
1495
  </button>
1496
1496
  </div>
1497
1497
  </div>
@@ -149,7 +149,7 @@ const EXTENSIONS_COPY: Record<LocaleCode, ExtensionsCopy> = {
149
149
  unhideForEveryone: "Unhide for everyone",
150
150
  hideFromEveryone: "Hide from everyone",
151
151
  removeFromMyList: "Remove from my list",
152
- delete: "Delete",
152
+ delete: "Archive",
153
153
  showLess: "show less",
154
154
  showMore: "show more",
155
155
  loadError: "Couldn't load extensions.",
@@ -182,7 +182,7 @@ const EXTENSIONS_COPY: Record<LocaleCode, ExtensionsCopy> = {
182
182
  unhideForEveryone: "对所有人取消隐藏",
183
183
  hideFromEveryone: "对所有人隐藏",
184
184
  removeFromMyList: "从我的列表中移除",
185
- delete: "删除",
185
+ delete: "归档",
186
186
  showLess: "收起",
187
187
  showMore: "显示更多",
188
188
  loadError: "无法加载扩展。",
@@ -216,7 +216,7 @@ const EXTENSIONS_COPY: Record<LocaleCode, ExtensionsCopy> = {
216
216
  unhideForEveryone: "對所有人取消隱藏",
217
217
  hideFromEveryone: "對所有人隱藏",
218
218
  removeFromMyList: "從我的清單移除",
219
- delete: "刪除",
219
+ delete: "封存",
220
220
  showLess: "顯示較少",
221
221
  showMore: "顯示更多",
222
222
  loadError: "無法載入擴充功能。",
@@ -250,7 +250,7 @@ const EXTENSIONS_COPY: Record<LocaleCode, ExtensionsCopy> = {
250
250
  unhideForEveryone: "Mostrar para todos",
251
251
  hideFromEveryone: "Ocultar para todos",
252
252
  removeFromMyList: "Quitar de mi lista",
253
- delete: "Eliminar",
253
+ delete: "Archivar",
254
254
  showLess: "mostrar menos",
255
255
  showMore: "mostrar más",
256
256
  loadError: "No se pudieron cargar las extensiones.",
@@ -284,7 +284,7 @@ const EXTENSIONS_COPY: Record<LocaleCode, ExtensionsCopy> = {
284
284
  unhideForEveryone: "Afficher pour tout le monde",
285
285
  hideFromEveryone: "Masquer pour tout le monde",
286
286
  removeFromMyList: "Retirer de ma liste",
287
- delete: "Supprimer",
287
+ delete: "Archiver",
288
288
  showLess: "afficher moins",
289
289
  showMore: "afficher plus",
290
290
  loadError: "Impossible de charger les extensions.",
@@ -318,7 +318,7 @@ const EXTENSIONS_COPY: Record<LocaleCode, ExtensionsCopy> = {
318
318
  unhideForEveryone: "Für alle einblenden",
319
319
  hideFromEveryone: "Für alle ausblenden",
320
320
  removeFromMyList: "Aus meiner Liste entfernen",
321
- delete: "Löschen",
321
+ delete: "Archivieren",
322
322
  showLess: "weniger anzeigen",
323
323
  showMore: "mehr anzeigen",
324
324
  loadError: "Erweiterungen konnten nicht geladen werden.",
@@ -352,7 +352,7 @@ const EXTENSIONS_COPY: Record<LocaleCode, ExtensionsCopy> = {
352
352
  unhideForEveryone: "全員に表示",
353
353
  hideFromEveryone: "全員に非表示",
354
354
  removeFromMyList: "自分のリストから削除",
355
- delete: "削除",
355
+ delete: "アーカイブ",
356
356
  showLess: "少なく表示",
357
357
  showMore: "さらに表示",
358
358
  loadError: "拡張機能を読み込めませんでした。",
@@ -386,7 +386,7 @@ const EXTENSIONS_COPY: Record<LocaleCode, ExtensionsCopy> = {
386
386
  unhideForEveryone: "모두에게 표시",
387
387
  hideFromEveryone: "모두에게 숨기기",
388
388
  removeFromMyList: "내 목록에서 제거",
389
- delete: "삭제",
389
+ delete: "보관",
390
390
  showLess: "덜 보기",
391
391
  showMore: "더 보기",
392
392
  loadError: "확장 프로그램을 불러올 수 없습니다.",
@@ -420,7 +420,7 @@ const EXTENSIONS_COPY: Record<LocaleCode, ExtensionsCopy> = {
420
420
  unhideForEveryone: "Mostrar para todos",
421
421
  hideFromEveryone: "Ocultar para todos",
422
422
  removeFromMyList: "Remover da minha lista",
423
- delete: "Excluir",
423
+ delete: "Arquivar",
424
424
  showLess: "mostrar menos",
425
425
  showMore: "mostrar mais",
426
426
  loadError: "Não foi possível carregar as extensões.",
@@ -454,7 +454,7 @@ const EXTENSIONS_COPY: Record<LocaleCode, ExtensionsCopy> = {
454
454
  unhideForEveryone: "सभी के लिए दिखाएं",
455
455
  hideFromEveryone: "सभी से छिपाएं",
456
456
  removeFromMyList: "मेरी सूची से हटाएं",
457
- delete: "हटाएं",
457
+ delete: "संग्रहित करें",
458
458
  showLess: "कम दिखाएं",
459
459
  showMore: "और दिखाएं",
460
460
  loadError: "एक्सटेंशन लोड नहीं हो सके।",
@@ -488,7 +488,7 @@ const EXTENSIONS_COPY: Record<LocaleCode, ExtensionsCopy> = {
488
488
  unhideForEveryone: "إظهار للجميع",
489
489
  hideFromEveryone: "إخفاء عن الجميع",
490
490
  removeFromMyList: "إزالة من قائمتي",
491
- delete: "حذف",
491
+ delete: "أرشفة",
492
492
  showLess: "إظهار أقل",
493
493
  showMore: "إظهار المزيد",
494
494
  loadError: "تعذر تحميل الإضافات.",
@@ -127,7 +127,7 @@ const defaultThemeCss = `
127
127
  --border: 217.2 32.6% 17.5%;
128
128
  --primary: 217.2 91.2% 59.8%;
129
129
  --primary-foreground: 222.2 47.4% 11.2%;
130
- --destructive: 0 62.8% 30.6%;
130
+ --destructive: 0 84% 60%;
131
131
  --destructive-foreground: 210 40% 98%;
132
132
  }
133
133
  html, body {
@@ -7,7 +7,7 @@ export interface ExtensionDeleteTarget {
7
7
  canDelete?: boolean | null;
8
8
  }
9
9
 
10
- export type ExtensionDeleteResult = { mode: "deleted" | "hidden" };
10
+ export type ExtensionDeleteResult = { mode: "archived" | "hidden" };
11
11
 
12
12
  async function readErrorMessage(
13
13
  res: Response,
@@ -55,7 +55,7 @@ export async function deleteOrHideExtension(
55
55
  agentNativePath(`/_agent-native/extensions/${extension.id}`),
56
56
  { method: "DELETE" },
57
57
  );
58
- if (res.ok) return { mode: "deleted" };
58
+ if (res.ok) return { mode: "archived" };
59
59
 
60
60
  if (res.status === 403) {
61
61
  return hideExtensionForCurrentUser(extension.id);
@@ -31,6 +31,7 @@ import {
31
31
  IconSettings,
32
32
  IconStack2,
33
33
  IconUser,
34
+ IconUserCircle,
34
35
  IconUserPlus,
35
36
  IconUsers,
36
37
  IconUsersGroup,
@@ -40,6 +41,8 @@ import { useState } from "react";
40
41
  import { useNavigate } from "react-router";
41
42
 
42
43
  import { agentNativePath } from "../api-path.js";
44
+ import { useT } from "../i18n.js";
45
+ import { useSession } from "../use-session.js";
43
46
  import {
44
47
  useOrg,
45
48
  useSwitchOrg,
@@ -68,6 +71,8 @@ export interface OrgSwitcherProps {
68
71
  * the in-sidebar settings panel.
69
72
  */
70
73
  settingsPath?: string | null;
74
+ /** Path to navigate to when the user clicks "Profile". Defaults to the shared Account settings section. */
75
+ profilePath?: string | null;
71
76
  }
72
77
 
73
78
  function personalLabelFromEmail(email: string | null | undefined): string {
@@ -100,6 +105,7 @@ const SWITCHER_BUTTON_CLASS =
100
105
  "flex w-full items-center gap-2 rounded-md border border-border/70 px-2.5 py-1.5 text-xs font-medium text-muted-foreground hover:bg-accent/50 hover:text-foreground focus:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-60 cursor-pointer";
101
106
 
102
107
  const DEFAULT_ORGANIZATION_SETTINGS_PATH = "/settings#organization";
108
+ const DEFAULT_PROFILE_PATH = "/settings#account";
103
109
 
104
110
  const APP_ICON_MAP: Record<string, typeof IconApps> = {
105
111
  Mail: IconMail,
@@ -307,8 +313,11 @@ export function OrgSwitcher({
307
313
  hideWhenSingle,
308
314
  reserveSpace,
309
315
  settingsPath = DEFAULT_ORGANIZATION_SETTINGS_PATH,
316
+ profilePath = DEFAULT_PROFILE_PATH,
310
317
  }: OrgSwitcherProps) {
311
318
  const { data: org, isLoading } = useOrg();
319
+ const { session } = useSession();
320
+ const t = useT();
312
321
  const switchOrg = useSwitchOrg();
313
322
  const createOrg = useCreateOrg();
314
323
  const inviteMember = useInviteMember();
@@ -377,7 +386,7 @@ export function OrgSwitcher({
377
386
  const canInvite =
378
387
  !!org.orgId && (org.role === "owner" || org.role === "admin");
379
388
 
380
- const personalLabel = personalLabelFromEmail(org.email);
389
+ const personalLabel = session?.name || personalLabelFromEmail(org.email);
381
390
  const inOrg = !!org.orgId;
382
391
  const buttonLabel = org.orgName ?? "Personal";
383
392
  const ButtonIcon = inOrg ? IconUsersGroup : IconUser;
@@ -546,6 +555,21 @@ export function OrgSwitcher({
546
555
  dispatchAllAppsHref={appLinks.dispatchAllAppsHref}
547
556
  onNavigate={() => setOpen(false)}
548
557
  />
558
+ {profilePath && (
559
+ <button
560
+ type="button"
561
+ onClick={() => {
562
+ setOpen(false);
563
+ navigate(profilePath);
564
+ }}
565
+ className={`${ITEM_CLASS} cursor-pointer`}
566
+ >
567
+ <IconUserCircle className="h-3.5 w-3.5 shrink-0 text-muted-foreground" />
568
+ <span className="flex-1 text-start">
569
+ {t("settings.profileMenuItem")}
570
+ </span>
571
+ </button>
572
+ )}
549
573
  {inOrg && (
550
574
  <button
551
575
  type="button"
@@ -37,6 +37,7 @@ import React, {
37
37
  } from "react";
38
38
 
39
39
  import { PROVIDER_ENV_PLACEHOLDERS } from "../../agent/engine/provider-env-vars.js";
40
+ import type { UserProfile } from "../../user-profile/shared.js";
40
41
  import { saveAgentEngineProviderSettings } from "../agent-engine-key.js";
41
42
  import { agentNativePath } from "../api-path.js";
42
43
  import { BuilderBMark } from "../builder-mark.js";
@@ -45,9 +46,14 @@ import {
45
46
  TooltipContent,
46
47
  TooltipTrigger,
47
48
  } from "../components/ui/tooltip.js";
49
+ import { useT } from "../i18n.js";
48
50
  import { TeamPage } from "../org/TeamPage.js";
49
51
  import { BuilderConnectCard } from "../setup-connections/BuilderConnectCard.js";
50
- import { callAction } from "../use-action.js";
52
+ import {
53
+ useActionMutation,
54
+ useActionQuery,
55
+ callAction,
56
+ } from "../use-action.js";
51
57
  import { uploadAvatar, useAvatarUrl } from "../use-avatar.js";
52
58
  import { useDevMode } from "../use-dev-mode.js";
53
59
  import { useSession } from "../use-session.js";
@@ -2458,21 +2464,40 @@ function AccountSectionInner({
2458
2464
  onToggle: () => void;
2459
2465
  }) {
2460
2466
  const isPage = useSettingsSurface() === "page";
2467
+ const t = useT();
2461
2468
  const { session, isLoading } = useSession();
2462
2469
  const email = session?.email;
2470
+ const profileQuery = useActionQuery<UserProfile>(
2471
+ "get-user-profile",
2472
+ undefined,
2473
+ { enabled: !!email },
2474
+ );
2475
+ const updateProfile = useActionMutation<UserProfile, { name: string }>(
2476
+ "update-user-profile",
2477
+ );
2463
2478
  const avatarUrl = useAvatarUrl(email);
2464
2479
  const fileInputRef = useRef<HTMLInputElement>(null);
2465
2480
  const [uploading, setUploading] = useState(false);
2466
2481
  const [status, setStatus] = useState<"idle" | "saved" | "error">("idle");
2467
-
2468
- const displayName = session?.name || email || "Signed out";
2469
- const initials = (session?.name || email || "?")
2482
+ const [name, setName] = useState("");
2483
+
2484
+ const displayName =
2485
+ profileQuery.data?.name ||
2486
+ session?.name ||
2487
+ email ||
2488
+ t("settings.profileSignedOut");
2489
+ const initials = (displayName || "?")
2470
2490
  .split(/[ @._-]+/)
2471
2491
  .filter(Boolean)
2472
2492
  .slice(0, 2)
2473
2493
  .map((part) => part[0]?.toUpperCase())
2474
2494
  .join("");
2475
2495
 
2496
+ useEffect(() => {
2497
+ const nextName = profileQuery.data?.name || session?.name;
2498
+ if (nextName) setName(nextName);
2499
+ }, [profileQuery.data?.name, session?.name]);
2500
+
2476
2501
  const handleAvatarChange = async (
2477
2502
  event: React.ChangeEvent<HTMLInputElement>,
2478
2503
  ) => {
@@ -2491,12 +2516,18 @@ function AccountSectionInner({
2491
2516
  }
2492
2517
  };
2493
2518
 
2519
+ const handleProfileSave = () => {
2520
+ const nextName = name.trim();
2521
+ if (!nextName || !email) return;
2522
+ updateProfile.mutate({ name: nextName });
2523
+ };
2524
+
2494
2525
  return (
2495
2526
  <SettingsSection
2496
2527
  id={settingsSectionDomId("account")}
2497
2528
  icon={<IconUserCircle size={14} />}
2498
- title="Account"
2499
- subtitle="Your profile photo and signed-in identity."
2529
+ title={t("settings.profileTitle")}
2530
+ subtitle={t("settings.profileDescription")}
2500
2531
  open={open}
2501
2532
  onToggle={onToggle}
2502
2533
  >
@@ -2524,7 +2555,7 @@ function AccountSectionInner({
2524
2555
  isPage ? "text-sm" : "text-[12px]",
2525
2556
  )}
2526
2557
  >
2527
- {isLoading ? "Loading..." : displayName}
2558
+ {isLoading ? t("settings.profileLoading") : displayName}
2528
2559
  </p>
2529
2560
  {email && (
2530
2561
  <p
@@ -2543,12 +2574,12 @@ function AccountSectionInner({
2543
2574
  subTextClass(isPage),
2544
2575
  )}
2545
2576
  >
2546
- Photo updated
2577
+ {t("settings.profilePhotoUpdated")}
2547
2578
  </p>
2548
2579
  )}
2549
2580
  {status === "error" && (
2550
2581
  <p className={cn("mt-1 text-destructive", subTextClass(isPage))}>
2551
- Could not update photo
2582
+ {t("settings.profilePhotoError")}
2552
2583
  </p>
2553
2584
  )}
2554
2585
  </div>
@@ -2568,9 +2599,70 @@ function AccountSectionInner({
2568
2599
  "shrink-0 justify-center",
2569
2600
  )}
2570
2601
  >
2571
- {uploading ? "Uploading..." : "Change photo"}
2602
+ {uploading
2603
+ ? t("settings.profileUploading")
2604
+ : t("settings.profileChangePhoto")}
2572
2605
  </button>
2573
2606
  </div>
2607
+ <form
2608
+ className="space-y-1.5"
2609
+ onSubmit={(event) => {
2610
+ event.preventDefault();
2611
+ handleProfileSave();
2612
+ }}
2613
+ >
2614
+ <label
2615
+ htmlFor="agent-native-profile-name"
2616
+ className={fieldLabelClass(isPage)}
2617
+ >
2618
+ {t("settings.profileNameLabel")}
2619
+ </label>
2620
+ <input
2621
+ id="agent-native-profile-name"
2622
+ type="text"
2623
+ value={name}
2624
+ onChange={(event) => {
2625
+ updateProfile.reset();
2626
+ setName(event.target.value);
2627
+ }}
2628
+ placeholder={t("settings.profileNamePlaceholder")}
2629
+ disabled={!email || profileQuery.isLoading || updateProfile.isPending}
2630
+ maxLength={120}
2631
+ className={textInputClass(isPage)}
2632
+ />
2633
+ <p className={cn("text-muted-foreground", noteTextClass(isPage))}>
2634
+ {t("settings.profileNameDescription")}
2635
+ </p>
2636
+ <div className="flex items-center justify-between gap-3 pt-1">
2637
+ <div className="min-h-4">
2638
+ {updateProfile.isSuccess && (
2639
+ <p className="text-green-600 dark:text-green-400">
2640
+ {t("settings.profileSaved")}
2641
+ </p>
2642
+ )}
2643
+ {updateProfile.error && (
2644
+ <p className="text-destructive">
2645
+ {t("settings.profileSaveError")}
2646
+ </p>
2647
+ )}
2648
+ </div>
2649
+ <button
2650
+ type="submit"
2651
+ disabled={
2652
+ !email ||
2653
+ profileQuery.isLoading ||
2654
+ updateProfile.isPending ||
2655
+ !name.trim() ||
2656
+ name.trim() === displayName
2657
+ }
2658
+ className={pillButtonClass(isPage, "solid")}
2659
+ >
2660
+ {updateProfile.isPending
2661
+ ? t("settings.profileSaving")
2662
+ : t("settings.profileSave")}
2663
+ </button>
2664
+ </div>
2665
+ </form>
2574
2666
  </SettingsSection>
2575
2667
  );
2576
2668
  }
@@ -46,11 +46,10 @@ export interface ShareButtonProps {
46
46
  /** @deprecated No longer affects rendering — trigger always says
47
47
  * "Share". Kept for callsite compatibility. */
48
48
  variant?: "compact" | "label";
49
- /** Optional trigger style. Defaults to the Google-Docs-style "Share" label
50
- * with a leading visibility icon. "label-icon" is kept for callsites that
51
- * want to explicitly opt into icon+label parity; "icon" is icon-only. */
49
+ /** Optional trigger style. Defaults to a text-only "Share" label.
50
+ * "label-icon" opts into an icon plus label; "icon" is icon-only. */
52
51
  trigger?: "label" | "icon" | "label-icon";
53
- /** @deprecated No longer affects rendering — triggers show visibility state. */
52
+ /** @deprecated No longer affects rendering — kept for callsite compatibility. */
54
53
  hideTriggerIcon?: boolean;
55
54
  /** Optional className applied to the trigger button. */
56
55
  triggerClassName?: string;
@@ -371,8 +370,10 @@ export function ShareButton(props: ShareButtonProps) {
371
370
  ? visibilityMeta(triggerVisibility, props.visibilityCopy)
372
371
  : null;
373
372
  const TriggerIcon = triggerMeta?.Icon ?? IconShare3;
374
- const triggerLabel = triggerMeta ? `Share (${triggerMeta.label})` : "Share";
375
373
  const iconOnly = props.trigger === "icon";
374
+ const showTriggerIcon = iconOnly || props.trigger === "label-icon";
375
+ const triggerLabel =
376
+ iconOnly && triggerMeta ? `Share (${triggerMeta.label})` : "Share";
376
377
 
377
378
  return (
378
379
  <Popover open={open} onOpenChange={handleOpenChange}>
@@ -386,7 +387,7 @@ export function ShareButton(props: ShareButtonProps) {
386
387
  aria-label={triggerLabel}
387
388
  title={triggerLabel}
388
389
  >
389
- <TriggerIcon size={16} strokeWidth={1.75} />
390
+ {showTriggerIcon && <TriggerIcon size={16} strokeWidth={1.75} />}
390
391
  {!iconOnly && <span>Share</span>}
391
392
  </button>
392
393
  </PopoverTrigger>
@@ -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
  /**