@agent-native/core 0.117.0 → 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 (357) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +16 -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/deploy/workspace-deploy.ts +14 -4
  14. package/corpus/core/src/extensions/actions.ts +13 -5
  15. package/corpus/core/src/extensions/local.ts +1 -0
  16. package/corpus/core/src/extensions/routes.ts +10 -5
  17. package/corpus/core/src/extensions/schema.ts +5 -0
  18. package/corpus/core/src/extensions/slots/store.ts +14 -4
  19. package/corpus/core/src/extensions/store.ts +55 -19
  20. package/corpus/core/src/extensions/theme.ts +1 -1
  21. package/corpus/core/src/file-upload/registry.ts +9 -0
  22. package/corpus/core/src/index.browser.ts +5 -0
  23. package/corpus/core/src/index.ts +1 -0
  24. package/corpus/core/src/localization/default-messages.ts +23 -6
  25. package/corpus/core/src/server/action-discovery.ts +8 -0
  26. package/corpus/core/src/server/better-auth-instance.ts +7 -2
  27. package/corpus/core/src/server/email-template.ts +18 -0
  28. package/corpus/core/src/server/email-templates.ts +3 -0
  29. package/corpus/core/src/server/email.ts +40 -4
  30. package/corpus/core/src/sharing/actions/share-resource.ts +1 -0
  31. package/corpus/core/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  32. package/corpus/core/src/templates/default/app/global.css +1 -1
  33. package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +6 -6
  34. package/corpus/core/src/templates/default/app/i18n/de-DE.ts +6 -6
  35. package/corpus/core/src/templates/default/app/i18n/en-US.ts +6 -6
  36. package/corpus/core/src/templates/default/app/i18n/es-ES.ts +6 -6
  37. package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +6 -6
  38. package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +6 -6
  39. package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +6 -6
  40. package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +6 -6
  41. package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +6 -6
  42. package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +7 -7
  43. package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +7 -7
  44. package/corpus/core/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  45. package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  46. package/corpus/core/src/user-profile/actions/get-user-profile.ts +16 -0
  47. package/corpus/core/src/user-profile/actions/update-user-profile.ts +24 -0
  48. package/corpus/core/src/user-profile/index.ts +5 -0
  49. package/corpus/core/src/user-profile/shared.ts +14 -0
  50. package/corpus/core/src/user-profile/store.ts +50 -0
  51. package/corpus/templates/analytics/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  52. package/corpus/templates/assets/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  53. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +2 -2
  54. package/corpus/templates/assets/app/global.css +1 -1
  55. package/corpus/templates/assets/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  56. package/corpus/templates/brain/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  57. package/corpus/templates/brain/app/global.css +2 -2
  58. package/corpus/templates/brain/app/lib/brain.ts +2 -2
  59. package/corpus/templates/brain/app/root.tsx +2 -2
  60. package/corpus/templates/brain/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  61. package/corpus/templates/calendar/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  62. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +6 -2
  63. package/corpus/templates/calendar/app/global.css +1 -1
  64. package/corpus/templates/calendar/app/root.tsx +2 -2
  65. package/corpus/templates/calendar/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  66. package/corpus/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  67. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +2 -2
  68. package/corpus/templates/chat/app/global.css +1 -1
  69. package/corpus/templates/chat/app/root.tsx +2 -2
  70. package/corpus/templates/chat/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  71. package/corpus/templates/clips/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  72. package/corpus/templates/clips/actions/export-to-brain.ts +1 -1
  73. package/corpus/templates/clips/actions/invite-member.ts +1 -0
  74. package/corpus/templates/clips/app/components/library/library-layout.tsx +2 -2
  75. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +20 -11
  76. package/corpus/templates/clips/app/global.css +1 -1
  77. package/corpus/templates/clips/app/root.tsx +7 -2
  78. package/corpus/templates/clips/app/routes/record.tsx +2 -88
  79. package/corpus/templates/clips/changelog/2026-07-22-builder-connected-recordings-start-resumable-upload-sessions.md +6 -0
  80. package/corpus/templates/clips/changelog/2026-07-22-clip-thumbnails-now-come-from-the-recording-instead-of-the-p.md +6 -0
  81. package/corpus/templates/clips/changelog/2026-07-22-clips-emails-now-render-the-agent-native-logo-in-gmail-and-o.md +6 -0
  82. package/corpus/templates/clips/changelog/2026-07-22-dismissed-zoom-and-teams-meeting-note-prompts-now-stay-dismi.md +6 -0
  83. package/corpus/templates/clips/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  84. package/corpus/templates/clips/changelog/2026-07-22-quieter-permissions-and-rewind-controls.md +6 -0
  85. package/corpus/templates/clips/desktop/src/app.tsx +86 -52
  86. package/corpus/templates/clips/desktop/src/lib/meeting-notification-dismissal.ts +31 -0
  87. package/corpus/templates/clips/desktop/src/lib/recorder.ts +4 -167
  88. package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +10 -1
  89. package/corpus/templates/clips/desktop/src/styles.css +98 -36
  90. package/corpus/templates/clips/desktop/src-tauri/src/adhoc_meetings_watcher.rs +67 -4
  91. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +1 -1
  92. package/corpus/templates/clips/desktop/src-tauri/src/meetings_watcher.rs +51 -0
  93. package/corpus/templates/clips/desktop/src-tauri/src/native_screen/custom_capture.rs +5 -1
  94. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +0 -189
  95. package/corpus/templates/clips/desktop/src-tauri/src/notifications.rs +62 -0
  96. package/corpus/templates/clips/server/plugins/db.ts +6 -2
  97. package/corpus/templates/content/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  98. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +3 -3
  99. package/corpus/templates/content/app/global.css +1 -1
  100. package/corpus/templates/content/app/root.tsx +2 -2
  101. package/corpus/templates/content/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  102. package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  103. package/corpus/templates/crm/app/global.css +1 -1
  104. package/corpus/templates/design/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  105. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +19 -1
  106. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +12 -1
  107. package/corpus/templates/design/app/components/design/EditPanel.tsx +177 -52
  108. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +179 -59
  109. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +74 -27
  110. package/corpus/templates/design/app/components/design/multi-screen/types.ts +2 -0
  111. package/corpus/templates/design/app/components/layout/Sidebar.tsx +2 -2
  112. package/corpus/templates/design/app/global.css +1 -1
  113. package/corpus/templates/design/app/hooks/use-navigation-state.ts +6 -5
  114. package/corpus/templates/design/app/root.tsx +2 -2
  115. package/corpus/templates/design/changelog/2026-07-22-design-owners-can-keep-editing-their-designs-after-switching.md +6 -0
  116. package/corpus/templates/design/changelog/2026-07-22-inspector-tabs-keep-their-text-labels-at-narrow-widths.md +6 -0
  117. package/corpus/templates/design/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  118. package/corpus/templates/design/changelog/2026-07-22-narrow-breakpoint-previews-keep-their-device-labels-readable.md +6 -0
  119. package/corpus/templates/design/changelog/2026-07-22-removed-the-draft-status-chip-from-the-design-editor.md +6 -0
  120. package/corpus/templates/design/changelog/2026-07-22-responsive-breakpoint-controls-stay-within-narrow-sidebars.md +6 -0
  121. package/corpus/templates/design/changelog/2026-07-22-responsive-peers-now-use-a-softer-selection-highlight-withou.md +6 -0
  122. package/corpus/templates/design/changelog/2026-07-22-rotate-from-context-menu.md +6 -0
  123. package/corpus/templates/design/changelog/2026-07-22-the-selection-outline-now-stays-attached-while-moving-screen.md +6 -0
  124. package/corpus/templates/design/changelog/2026-07-22-view-only-designs-now-support-figma-style-layer-inspection-w.md +6 -0
  125. package/corpus/templates/design/server/db/index.ts +4 -0
  126. package/corpus/templates/dispatch/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  127. package/corpus/templates/dispatch/app/dispatch-extensions.tsx +2 -2
  128. package/corpus/templates/dispatch/app/global.css +1 -1
  129. package/corpus/templates/dispatch/app/root.tsx +2 -2
  130. package/corpus/templates/dispatch/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  131. package/corpus/templates/forms/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  132. package/corpus/templates/forms/app/components/layout/Layout.tsx +1 -1
  133. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +3 -3
  134. package/corpus/templates/forms/app/global.css +1 -1
  135. package/corpus/templates/forms/app/hooks/use-forms.ts +55 -2
  136. package/corpus/templates/forms/app/i18n/en-US.ts +2 -0
  137. package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +3 -3
  138. package/corpus/templates/forms/app/pages/FormsListPage.tsx +23 -6
  139. package/corpus/templates/forms/app/root.tsx +2 -2
  140. package/corpus/templates/forms/changelog/2026-07-22-forms-now-archive-with-optimistic-feedback.md +6 -0
  141. package/corpus/templates/forms/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  142. package/corpus/templates/forms/server/plugins/agent-chat.ts +1 -1
  143. package/corpus/templates/macros/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  144. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +2 -2
  145. package/corpus/templates/macros/app/root.tsx +2 -2
  146. package/corpus/templates/macros/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  147. package/corpus/templates/mail/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  148. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +3 -3
  149. package/corpus/templates/mail/app/components/layout/CommandPalette.tsx +2 -2
  150. package/corpus/templates/mail/app/global.css +1 -1
  151. package/corpus/templates/mail/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  152. package/corpus/templates/plan/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  153. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +2 -2
  154. package/corpus/templates/plan/app/global.css +1 -1
  155. package/corpus/templates/plan/app/root.tsx +2 -2
  156. package/corpus/templates/plan/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  157. package/corpus/templates/slides/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  158. package/corpus/templates/slides/app/components/layout/Sidebar.tsx +2 -2
  159. package/corpus/templates/slides/app/root.tsx +2 -2
  160. package/corpus/templates/slides/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  161. package/corpus/templates/slides/changelog/2026-07-22-slides-no-longer-fail-intermittently-on-fresh-server-instances.md +6 -0
  162. package/corpus/templates/slides/changelog/2026-07-22-uploaded-screenshots-can-now-be-analyzed-and-recreated-as-ed.md +6 -0
  163. package/corpus/templates/slides/server/lib/chat-attachments.ts +7 -3
  164. package/corpus/templates/slides/server/plugins/db.ts +44 -17
  165. package/corpus/templates/tasks/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  166. package/corpus/templates/tasks/app/global.css +1 -1
  167. package/dist/cli/context-xray-local.js +1 -1
  168. package/dist/cli/context-xray-local.js.map +1 -1
  169. package/dist/client/extensions/ExtensionViewer.js +2 -2
  170. package/dist/client/extensions/ExtensionViewer.js.map +1 -1
  171. package/dist/client/extensions/ExtensionsSidebarSection.js +11 -11
  172. package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
  173. package/dist/client/extensions/agent-native-extension-runtime.js +1 -1
  174. package/dist/client/extensions/agent-native-extension-runtime.js.map +1 -1
  175. package/dist/client/extensions/delete-extension.d.ts +1 -1
  176. package/dist/client/extensions/delete-extension.d.ts.map +1 -1
  177. package/dist/client/extensions/delete-extension.js +1 -1
  178. package/dist/client/extensions/delete-extension.js.map +1 -1
  179. package/dist/client/org/OrgSwitcher.d.ts +3 -1
  180. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  181. package/dist/client/org/OrgSwitcher.js +12 -4
  182. package/dist/client/org/OrgSwitcher.js.map +1 -1
  183. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  184. package/dist/client/settings/SettingsPanel.js +37 -4
  185. package/dist/client/settings/SettingsPanel.js.map +1 -1
  186. package/dist/client/sharing/ShareButton.d.ts +3 -4
  187. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  188. package/dist/client/sharing/ShareButton.js +3 -2
  189. package/dist/client/sharing/ShareButton.js.map +1 -1
  190. package/dist/collab/awareness.d.ts +2 -2
  191. package/dist/collab/awareness.d.ts.map +1 -1
  192. package/dist/collab/routes.d.ts +1 -1
  193. package/dist/collab/struct-routes.d.ts +1 -1
  194. package/dist/db/client.d.ts +7 -7
  195. package/dist/db/client.d.ts.map +1 -1
  196. package/dist/db/client.js +13 -10
  197. package/dist/db/client.js.map +1 -1
  198. package/dist/deploy/workspace-deploy.js +14 -4
  199. package/dist/deploy/workspace-deploy.js.map +1 -1
  200. package/dist/extensions/actions.d.ts.map +1 -1
  201. package/dist/extensions/actions.js +8 -5
  202. package/dist/extensions/actions.js.map +1 -1
  203. package/dist/extensions/local.d.ts.map +1 -1
  204. package/dist/extensions/local.js +1 -0
  205. package/dist/extensions/local.js.map +1 -1
  206. package/dist/extensions/routes.d.ts.map +1 -1
  207. package/dist/extensions/routes.js +9 -4
  208. package/dist/extensions/routes.js.map +1 -1
  209. package/dist/extensions/schema.d.ts +23 -2
  210. package/dist/extensions/schema.d.ts.map +1 -1
  211. package/dist/extensions/schema.js +5 -0
  212. package/dist/extensions/schema.js.map +1 -1
  213. package/dist/extensions/slots/store.d.ts +1 -1
  214. package/dist/extensions/slots/store.d.ts.map +1 -1
  215. package/dist/extensions/slots/store.js +4 -4
  216. package/dist/extensions/slots/store.js.map +1 -1
  217. package/dist/extensions/store.d.ts +1 -0
  218. package/dist/extensions/store.d.ts.map +1 -1
  219. package/dist/extensions/store.js +38 -21
  220. package/dist/extensions/store.js.map +1 -1
  221. package/dist/extensions/theme.js +1 -1
  222. package/dist/extensions/theme.js.map +1 -1
  223. package/dist/file-upload/registry.d.ts.map +1 -1
  224. package/dist/file-upload/registry.js +9 -0
  225. package/dist/file-upload/registry.js.map +1 -1
  226. package/dist/index.browser.d.ts +1 -0
  227. package/dist/index.browser.d.ts.map +1 -1
  228. package/dist/index.browser.js +1 -0
  229. package/dist/index.browser.js.map +1 -1
  230. package/dist/index.d.ts +1 -0
  231. package/dist/index.d.ts.map +1 -1
  232. package/dist/index.js +1 -0
  233. package/dist/index.js.map +1 -1
  234. package/dist/localization/default-messages.d.ts +16 -0
  235. package/dist/localization/default-messages.d.ts.map +1 -1
  236. package/dist/localization/default-messages.js +22 -6
  237. package/dist/localization/default-messages.js.map +1 -1
  238. package/dist/notifications/routes.d.ts +2 -2
  239. package/dist/observability/routes.d.ts +5 -5
  240. package/dist/progress/routes.d.ts +1 -1
  241. package/dist/provider-api/actions/custom-provider-registration.d.ts +7 -7
  242. package/dist/provider-api/actions/provider-api.d.ts +11 -11
  243. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  244. package/dist/secrets/routes.d.ts +6 -6
  245. package/dist/server/action-discovery.d.ts.map +1 -1
  246. package/dist/server/action-discovery.js +8 -0
  247. package/dist/server/action-discovery.js.map +1 -1
  248. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  249. package/dist/server/better-auth-instance.d.ts +7 -2
  250. package/dist/server/better-auth-instance.d.ts.map +1 -1
  251. package/dist/server/better-auth-instance.js.map +1 -1
  252. package/dist/server/email-template.d.ts +3 -0
  253. package/dist/server/email-template.d.ts.map +1 -1
  254. package/dist/server/email-template.js +13 -0
  255. package/dist/server/email-template.js.map +1 -1
  256. package/dist/server/email-templates.d.ts.map +1 -1
  257. package/dist/server/email-templates.js +3 -0
  258. package/dist/server/email-templates.js.map +1 -1
  259. package/dist/server/email.d.ts.map +1 -1
  260. package/dist/server/email.js +27 -4
  261. package/dist/server/email.js.map +1 -1
  262. package/dist/server/transcribe-voice.d.ts +1 -1
  263. package/dist/sharing/actions/share-resource.js +1 -0
  264. package/dist/sharing/actions/share-resource.js.map +1 -1
  265. package/dist/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  266. package/dist/templates/chat/app/components/layout/Sidebar.tsx +2 -2
  267. package/dist/templates/chat/app/global.css +1 -1
  268. package/dist/templates/chat/app/root.tsx +2 -2
  269. package/dist/templates/chat/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  270. package/dist/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  271. package/dist/templates/default/app/global.css +1 -1
  272. package/dist/templates/default/app/i18n/ar-SA.ts +6 -6
  273. package/dist/templates/default/app/i18n/de-DE.ts +6 -6
  274. package/dist/templates/default/app/i18n/en-US.ts +6 -6
  275. package/dist/templates/default/app/i18n/es-ES.ts +6 -6
  276. package/dist/templates/default/app/i18n/fr-FR.ts +6 -6
  277. package/dist/templates/default/app/i18n/hi-IN.ts +6 -6
  278. package/dist/templates/default/app/i18n/ja-JP.ts +6 -6
  279. package/dist/templates/default/app/i18n/ko-KR.ts +6 -6
  280. package/dist/templates/default/app/i18n/pt-BR.ts +6 -6
  281. package/dist/templates/default/app/i18n/zh-CN.ts +7 -7
  282. package/dist/templates/default/app/i18n/zh-TW.ts +7 -7
  283. package/dist/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  284. package/dist/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  285. package/dist/user-profile/actions/get-user-profile.d.ts +4 -0
  286. package/dist/user-profile/actions/get-user-profile.d.ts.map +1 -0
  287. package/dist/user-profile/actions/get-user-profile.js +14 -0
  288. package/dist/user-profile/actions/get-user-profile.js.map +1 -0
  289. package/dist/user-profile/actions/update-user-profile.d.ts +6 -0
  290. package/dist/user-profile/actions/update-user-profile.d.ts.map +1 -0
  291. package/dist/user-profile/actions/update-user-profile.js +20 -0
  292. package/dist/user-profile/actions/update-user-profile.js.map +1 -0
  293. package/dist/user-profile/index.d.ts +2 -0
  294. package/dist/user-profile/index.d.ts.map +1 -0
  295. package/dist/user-profile/index.js +2 -0
  296. package/dist/user-profile/index.js.map +1 -0
  297. package/dist/user-profile/shared.d.ts +7 -0
  298. package/dist/user-profile/shared.d.ts.map +1 -0
  299. package/dist/user-profile/shared.js +6 -0
  300. package/dist/user-profile/shared.js.map +1 -0
  301. package/dist/user-profile/store.d.ts +4 -0
  302. package/dist/user-profile/store.d.ts.map +1 -0
  303. package/dist/user-profile/store.js +38 -0
  304. package/dist/user-profile/store.js.map +1 -0
  305. package/package.json +2 -1
  306. package/src/cli/context-xray-local.ts +1 -1
  307. package/src/client/extensions/ExtensionViewer.tsx +4 -4
  308. package/src/client/extensions/ExtensionsSidebarSection.tsx +11 -11
  309. package/src/client/extensions/agent-native-extension-runtime.ts +1 -1
  310. package/src/client/extensions/delete-extension.ts +2 -2
  311. package/src/client/org/OrgSwitcher.tsx +25 -1
  312. package/src/client/settings/SettingsPanel.tsx +102 -10
  313. package/src/client/sharing/ShareButton.tsx +7 -6
  314. package/src/db/client.ts +13 -10
  315. package/src/deploy/workspace-deploy.ts +14 -4
  316. package/src/extensions/actions.ts +13 -5
  317. package/src/extensions/local.ts +1 -0
  318. package/src/extensions/routes.ts +10 -5
  319. package/src/extensions/schema.ts +5 -0
  320. package/src/extensions/slots/store.ts +14 -4
  321. package/src/extensions/store.ts +55 -19
  322. package/src/extensions/theme.ts +1 -1
  323. package/src/file-upload/registry.ts +9 -0
  324. package/src/index.browser.ts +5 -0
  325. package/src/index.ts +1 -0
  326. package/src/localization/default-messages.ts +23 -6
  327. package/src/server/action-discovery.ts +8 -0
  328. package/src/server/better-auth-instance.ts +7 -2
  329. package/src/server/email-template.ts +18 -0
  330. package/src/server/email-templates.ts +3 -0
  331. package/src/server/email.ts +40 -4
  332. package/src/sharing/actions/share-resource.ts +1 -0
  333. package/src/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  334. package/src/templates/chat/app/components/layout/Sidebar.tsx +2 -2
  335. package/src/templates/chat/app/global.css +1 -1
  336. package/src/templates/chat/app/root.tsx +2 -2
  337. package/src/templates/chat/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  338. package/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  339. package/src/templates/default/app/global.css +1 -1
  340. package/src/templates/default/app/i18n/ar-SA.ts +6 -6
  341. package/src/templates/default/app/i18n/de-DE.ts +6 -6
  342. package/src/templates/default/app/i18n/en-US.ts +6 -6
  343. package/src/templates/default/app/i18n/es-ES.ts +6 -6
  344. package/src/templates/default/app/i18n/fr-FR.ts +6 -6
  345. package/src/templates/default/app/i18n/hi-IN.ts +6 -6
  346. package/src/templates/default/app/i18n/ja-JP.ts +6 -6
  347. package/src/templates/default/app/i18n/ko-KR.ts +6 -6
  348. package/src/templates/default/app/i18n/pt-BR.ts +6 -6
  349. package/src/templates/default/app/i18n/zh-CN.ts +7 -7
  350. package/src/templates/default/app/i18n/zh-TW.ts +7 -7
  351. package/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  352. package/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +6 -0
  353. package/src/user-profile/actions/get-user-profile.ts +16 -0
  354. package/src/user-profile/actions/update-user-profile.ts +24 -0
  355. package/src/user-profile/index.ts +5 -0
  356. package/src/user-profile/shared.ts +14 -0
  357. package/src/user-profile/store.ts +50 -0
@@ -106,6 +106,7 @@ export type CanvasContextMenuAction =
106
106
  | "copy-as-code"
107
107
  | "copy-as-svg"
108
108
  | "copy-as-png"
109
+ | "rotate-clockwise"
109
110
  | "flip-horizontal"
110
111
  | "flip-vertical"
111
112
  | "toggle-ui"
@@ -176,6 +177,7 @@ export interface CanvasContextMenuLabels {
176
177
  copyAsCode: string;
177
178
  copyAsSvg: string;
178
179
  copyAsPng: string;
180
+ rotateClockwise: string;
179
181
  flipHorizontal: string;
180
182
  flipVertical: string;
181
183
  toggleUiShow: string;
@@ -219,6 +221,7 @@ export interface CanvasContextMenuShortcuts {
219
221
  copyAsCode: string;
220
222
  copyAsSvg: string;
221
223
  copyAsPng: string;
224
+ rotateClockwise: string;
222
225
  flipHorizontal: string;
223
226
  flipVertical: string;
224
227
  toggleUi: string;
@@ -296,6 +299,7 @@ export interface CanvasContextMenuProps {
296
299
  canCopyAsCode?: boolean;
297
300
  canCopyAsSvg?: boolean;
298
301
  canCopyAsPng?: boolean;
302
+ canRotateClockwise?: boolean;
299
303
  canFlipHorizontal?: boolean;
300
304
  canFlipVertical?: boolean;
301
305
  canToggleUi?: boolean;
@@ -356,6 +360,7 @@ export interface CanvasContextMenuProps {
356
360
  onCopyAsCode?: CanvasContextMenuActionHandler;
357
361
  onCopyAsSvg?: CanvasContextMenuActionHandler;
358
362
  onCopyAsPng?: CanvasContextMenuActionHandler;
363
+ onRotateClockwise?: CanvasContextMenuActionHandler;
359
364
  onFlipHorizontal?: CanvasContextMenuActionHandler;
360
365
  onFlipVertical?: CanvasContextMenuActionHandler;
361
366
  onToggleUi?: CanvasContextMenuActionHandler;
@@ -409,6 +414,7 @@ const DEFAULT_LABELS: CanvasContextMenuLabels = {
409
414
  copyAsCode: "Copy as code",
410
415
  copyAsSvg: "Copy as SVG",
411
416
  copyAsPng: "Copy as PNG",
417
+ rotateClockwise: "Rotate 90° clockwise",
412
418
  flipHorizontal: "Flip horizontal",
413
419
  flipVertical: "Flip vertical",
414
420
  toggleUiShow: "Show UI",
@@ -452,6 +458,7 @@ const DEFAULT_SHORTCUTS: CanvasContextMenuShortcuts = {
452
458
  copyAsCode: "",
453
459
  copyAsSvg: "",
454
460
  copyAsPng: "⇧⌘C",
461
+ rotateClockwise: "",
455
462
  flipHorizontal: "⇧H",
456
463
  flipVertical: "⇧V",
457
464
  toggleUi: "⌘\\",
@@ -464,7 +471,7 @@ type ActionCallbackMap = Partial<
464
471
 
465
472
  // design-editor menu chrome: compact, dark-border, subtle shadow, no animation jitter
466
473
  const MENU_CONTENT_CLASS =
467
- "w-52 min-w-[200px] rounded-[6px] border border-[var(--design-editor-control-border)] bg-[var(--design-editor-panel-bg)] py-[3px] px-[3px] text-[12px] text-foreground shadow-[0_4px_16px_rgba(0,0,0,0.16),0_0_0_0.5px_rgba(0,0,0,0.08)] outline-none";
474
+ "w-52 min-w-[200px] rounded-[6px] border border-[var(--design-editor-control-border)] bg-[var(--design-editor-panel-bg)] py-[3px] px-[3px] text-[12px] text-foreground shadow-[0_4px_16px_rgba(0,0,0,0.16),0_0_0_0.5px_rgba(0,0,0,0.08)] outline-none data-[state=open]:!animate-none data-[state=closed]:!animate-none";
468
475
  // design row height ~28px, full-width highlight on hover, no icon gap waste
469
476
  const MENU_ITEM_CLASS =
470
477
  "flex h-7 cursor-default select-none items-center rounded-[4px] px-2 py-0 text-[12px] leading-none gap-0 focus:bg-[var(--design-editor-selection-color)] focus:text-white data-[disabled]:pointer-events-none data-[disabled]:opacity-35";
@@ -525,6 +532,7 @@ export const CanvasContextMenu = forwardRef<
525
532
  canCopyAsCode = selectedCount > 0,
526
533
  canCopyAsSvg = selectedCount > 0,
527
534
  canCopyAsPng = selectedCount > 0,
535
+ canRotateClockwise = false,
528
536
  canFlipHorizontal = selectedCount > 0,
529
537
  canFlipVertical = selectedCount > 0,
530
538
  canToggleUi = true,
@@ -565,6 +573,7 @@ export const CanvasContextMenu = forwardRef<
565
573
  onCopyAsCode,
566
574
  onCopyAsSvg,
567
575
  onCopyAsPng,
576
+ onRotateClockwise,
568
577
  onFlipHorizontal,
569
578
  onFlipVertical,
570
579
  onToggleUi,
@@ -650,6 +659,7 @@ export const CanvasContextMenu = forwardRef<
650
659
  "copy-as-code": onCopyAsCode,
651
660
  "copy-as-svg": onCopyAsSvg,
652
661
  "copy-as-png": onCopyAsPng,
662
+ "rotate-clockwise": onRotateClockwise,
653
663
  "flip-horizontal": onFlipHorizontal,
654
664
  "flip-vertical": onFlipVertical,
655
665
  "toggle-ui": onToggleUi,
@@ -665,6 +675,7 @@ export const CanvasContextMenu = forwardRef<
665
675
  onCopyAsCode,
666
676
  onCopyAsPng,
667
677
  onCopyAsSvg,
678
+ onRotateClockwise,
668
679
  onCopyProps,
669
680
  onCreateComponent,
670
681
  onReprompt,
@@ -1073,6 +1084,13 @@ export const CanvasContextMenu = forwardRef<
1073
1084
  <CanvasMenuSeparator />
1074
1085
 
1075
1086
  <ContextMenuGroup>
1087
+ <CanvasMenuItem
1088
+ hidden={isHiddenAction("rotate-clockwise")}
1089
+ disabled={!canRun("rotate-clockwise", canRotateClockwise)}
1090
+ label={labels.rotateClockwise}
1091
+ shortcut={shortcuts.rotateClockwise}
1092
+ onSelect={(event) => runAction("rotate-clockwise", event)}
1093
+ />
1076
1094
  <CanvasMenuItem
1077
1095
  hidden={isHiddenAction("flip-horizontal")}
1078
1096
  disabled={!canRun("flip-horizontal", canFlipHorizontal)}
@@ -533,6 +533,8 @@ interface DesignCanvasProps {
533
533
  selectedSelector?: string | null;
534
534
  selectedSelectorCandidates?: string[];
535
535
  selectedSelectorGroups?: string[][];
536
+ /** Visual treatment for selection mirrors in responsive peer previews. */
537
+ passiveSelectionStyle?: "default" | "soft";
536
538
  hoveredSelector?: string | null;
537
539
  hoveredSelectorCandidates?: string[];
538
540
  lockedSelectors?: string[];
@@ -1058,6 +1060,7 @@ export function DesignCanvas({
1058
1060
  selectedSelector,
1059
1061
  selectedSelectorCandidates = [],
1060
1062
  selectedSelectorGroups = [],
1063
+ passiveSelectionStyle = "default",
1061
1064
  hoveredSelector,
1062
1065
  hoveredSelectorCandidates = [],
1063
1066
  lockedSelectors = [],
@@ -2969,6 +2972,7 @@ export function DesignCanvas({
2969
2972
  {
2970
2973
  type: "select-elements",
2971
2974
  selectorGroups: selectedSelectorGroups,
2975
+ passiveSelectionStyle,
2972
2976
  },
2973
2977
  "*",
2974
2978
  );
@@ -2978,8 +2982,14 @@ export function DesignCanvas({
2978
2982
  type: "hover-element",
2979
2983
  selector: hoveredSelector,
2980
2984
  selectorCandidates: hoveredSelectorCandidates,
2985
+ hoverStyle: passiveSelectionStyle,
2981
2986
  }
2982
- : { type: "hover-element", selector: "", selectorCandidates: [] },
2987
+ : {
2988
+ type: "hover-element",
2989
+ selector: "",
2990
+ selectorCandidates: [],
2991
+ hoverStyle: passiveSelectionStyle,
2992
+ },
2983
2993
  "*",
2984
2994
  );
2985
2995
  // Re-send motion tracks so the preview bridge is ready after a reload.
@@ -3038,6 +3048,7 @@ export function DesignCanvas({
3038
3048
  selectedSelector,
3039
3049
  selectedSelectorCandidates,
3040
3050
  selectedSelectorGroups,
3051
+ passiveSelectionStyle,
3041
3052
  shaderFillPreview,
3042
3053
  spacePanActive,
3043
3054
  statePreviewTarget,
@@ -28,7 +28,6 @@ import {
28
28
  type InteractionState,
29
29
  } from "@shared/interaction-states";
30
30
  import {
31
- IconAdjustmentsHorizontal,
32
31
  IconAlignCenter,
33
32
  IconAlignJustified,
34
33
  IconAlignLeft,
@@ -44,7 +43,6 @@ import {
44
43
  IconBorderCorners,
45
44
  IconBorderRadius,
46
45
  IconBorderStyle,
47
- IconBrush,
48
46
  IconCheck,
49
47
  IconChevronDown,
50
48
  IconChevronRight,
@@ -74,7 +72,6 @@ import {
74
72
  IconLink,
75
73
  IconLinkOff,
76
74
  IconMinus,
77
- IconMessageCircle,
78
75
  IconPerspective,
79
76
  IconPhoto,
80
77
  IconPlus,
@@ -399,7 +396,7 @@ export function mergeOptimisticInteractionStateStyles(
399
396
  return { ...(persisted ?? {}), ...(pending ?? {}) };
400
397
  }
401
398
 
402
- export type InspectorTab = "design" | "tweaks" | "comments";
399
+ export type InspectorTab = "design" | "tweaks" | "comments" | "code";
403
400
 
404
401
  interface EditPanelProps {
405
402
  selectedElement: ElementInfo | null;
@@ -409,6 +406,8 @@ interface EditPanelProps {
409
406
  zoom?: number;
410
407
  headerTrailing?: ReactNode;
411
408
  width?: number;
409
+ /** Viewer mode exposes inspection and comments, never editing controls. */
410
+ readOnly?: boolean;
412
411
  activeTab?: InspectorTab;
413
412
  onActiveTabChange?: (tab: InspectorTab) => void;
414
413
  tweaks?: TweakDefinition[];
@@ -933,6 +932,130 @@ function InspectCodePopover({ data }: { data: InspectCodeData }) {
933
932
  );
934
933
  }
935
934
 
935
+ function CodeInspectPanel({
936
+ data,
937
+ element,
938
+ screen,
939
+ }: {
940
+ data?: InspectCodeData;
941
+ element: ElementInfo | null;
942
+ screen: ScreenGeometrySelection | null | undefined;
943
+ }) {
944
+ const [copied, setCopied] = useState(false);
945
+ const snippet = data
946
+ ? (elementHtmlPreview(data) ??
947
+ data.sourceLocation?.snippet ??
948
+ data.html?.trim() ??
949
+ null)
950
+ : null;
951
+ const bounds = element?.boundingRect ?? screen;
952
+ const measurements = bounds
953
+ ? [
954
+ ["X", bounds.x],
955
+ ["Y", bounds.y],
956
+ ["W", bounds.width],
957
+ ["H", bounds.height],
958
+ ]
959
+ : [];
960
+ const styles = element
961
+ ? [
962
+ ["Display", element.computedStyles.display],
963
+ ["Position", element.computedStyles.position],
964
+ ["Font", element.computedStyles.fontSize],
965
+ ["Color", element.computedStyles.color],
966
+ ].filter(([, value]) => value)
967
+ : [];
968
+
969
+ const handleCopy = () => {
970
+ if (!snippet) return;
971
+ void navigator.clipboard
972
+ ?.writeText(snippet)
973
+ .then(() => {
974
+ setCopied(true);
975
+ window.setTimeout(() => setCopied(false), 1200);
976
+ })
977
+ .catch(() => {});
978
+ };
979
+
980
+ return (
981
+ <div className="design-inspector-scroll min-h-0 flex-1 overflow-y-auto overscroll-contain">
982
+ <div className="flex h-10 items-center justify-between gap-2 border-b border-border/90 px-3">
983
+ <div className="flex min-w-0 items-center gap-1.5">
984
+ <IconCode className="size-3.5 text-muted-foreground" />
985
+ <h3 className="truncate text-[13px] font-semibold text-foreground">
986
+ {"Code & measurements" /* i18n-ignore design inspector heading */}
987
+ </h3>
988
+ </div>
989
+ <Button
990
+ type="button"
991
+ variant="ghost"
992
+ size="sm"
993
+ className="h-6 px-2 text-[10px]"
994
+ onClick={handleCopy}
995
+ disabled={!snippet}
996
+ >
997
+ {
998
+ copied
999
+ ? "Copied" /* i18n-ignore design inspector action */
1000
+ : "Copy" /* i18n-ignore design inspector action */
1001
+ }
1002
+ </Button>
1003
+ </div>
1004
+
1005
+ {measurements.length > 0 ? (
1006
+ <PanelSection
1007
+ title={"Measurements" /* i18n-ignore design inspector section */}
1008
+ >
1009
+ <div className="grid grid-cols-2 gap-2">
1010
+ {measurements.map(([label, value]) => (
1011
+ <div
1012
+ key={label}
1013
+ className="flex items-center justify-between rounded border border-border/70 bg-[var(--design-editor-control-bg)] px-2 py-1.5 text-[11px]"
1014
+ >
1015
+ <span className="text-muted-foreground">{label}</span>
1016
+ <span className="font-mono text-foreground">
1017
+ {Math.round(Number(value))}px
1018
+ </span>
1019
+ </div>
1020
+ ))}
1021
+ </div>
1022
+ </PanelSection>
1023
+ ) : null}
1024
+
1025
+ {styles.length > 0 ? (
1026
+ <PanelSection
1027
+ title={"Computed styles" /* i18n-ignore design inspector section */}
1028
+ >
1029
+ <div className="space-y-1 text-[11px]">
1030
+ {styles.map(([label, value]) => (
1031
+ <div key={label} className="flex justify-between gap-3">
1032
+ <span className="text-muted-foreground">{label}</span>
1033
+ <span className="max-w-[65%] truncate font-mono text-foreground">
1034
+ {value}
1035
+ </span>
1036
+ </div>
1037
+ ))}
1038
+ </div>
1039
+ </PanelSection>
1040
+ ) : null}
1041
+
1042
+ <PanelSection title={"Code" /* i18n-ignore design inspector section */}>
1043
+ {snippet ? (
1044
+ <pre className="max-h-80 overflow-auto rounded bg-[var(--design-editor-control-bg)] p-2 font-mono text-[10px] leading-relaxed text-foreground">
1045
+ <code>{highlightedHtml(snippet)}</code>
1046
+ </pre>
1047
+ ) : (
1048
+ <p className="text-[11px] leading-4 text-muted-foreground">
1049
+ {
1050
+ "Select a layer to inspect its code and measurements." /* i18n-ignore design inspector empty */
1051
+ }
1052
+ </p>
1053
+ )}
1054
+ </PanelSection>
1055
+ </div>
1056
+ );
1057
+ }
1058
+
936
1059
  function elementTypeIcon(element: ElementInfo) {
937
1060
  if (elementIsComponentSelection(element)) return IconComponents;
938
1061
  const tag = normalizedElementTagName(element.tagName);
@@ -1099,16 +1222,16 @@ function ScreenGeometryProperties({
1099
1222
 
1100
1223
  function InspectorTabsHeader({
1101
1224
  activeTab,
1225
+ readOnly,
1102
1226
  onActiveTabChange,
1103
1227
  trailing,
1104
1228
  commentsCount = 0,
1105
- compact = false,
1106
1229
  }: {
1107
1230
  activeTab: InspectorTab;
1231
+ readOnly: boolean;
1108
1232
  onActiveTabChange: (tab: InspectorTab) => void;
1109
1233
  trailing?: ReactNode;
1110
1234
  commentsCount?: number;
1111
- compact?: boolean;
1112
1235
  }) {
1113
1236
  const t = useT();
1114
1237
 
@@ -1120,20 +1243,15 @@ function InspectorTabsHeader({
1120
1243
  className="min-w-0"
1121
1244
  >
1122
1245
  <TabsList className="h-7 max-w-full justify-start gap-0.5 overflow-hidden rounded-none bg-transparent p-0">
1123
- <TabsTrigger
1124
- value="design"
1125
- aria-label={t("navigation.brand")}
1126
- className={cn(
1127
- "h-6 rounded-md !text-[11px] font-semibold text-muted-foreground shadow-none transition-colors hover:text-foreground data-[state=active]:bg-[var(--design-editor-panel-raised-bg)] data-[state=active]:text-foreground data-[state=active]:shadow-none",
1128
- compact ? "w-7 px-0" : "px-1.5",
1129
- )}
1130
- >
1131
- {compact ? (
1132
- <IconBrush className="size-3.5" />
1133
- ) : (
1134
- t("navigation.brand")
1135
- )}
1136
- </TabsTrigger>
1246
+ {!readOnly ? (
1247
+ <TabsTrigger
1248
+ value="design"
1249
+ aria-label={t("navigation.brand")}
1250
+ className="h-6 rounded-md px-1.5 !text-[11px] font-semibold text-muted-foreground shadow-none transition-colors hover:text-foreground data-[state=active]:bg-[var(--design-editor-panel-raised-bg)] data-[state=active]:text-foreground data-[state=active]:shadow-none"
1251
+ >
1252
+ {t("navigation.brand")}
1253
+ </TabsTrigger>
1254
+ ) : null}
1137
1255
  <TabsTrigger
1138
1256
  value="comments"
1139
1257
  aria-label={
@@ -1141,43 +1259,37 @@ function InspectorTabsHeader({
1141
1259
  ? t("review.commentsTab", { count: commentsCount })
1142
1260
  : t("review.comments")
1143
1261
  }
1144
- className={cn(
1145
- "group h-6 min-w-0 rounded-md !text-[11px] font-semibold text-muted-foreground shadow-none transition-colors hover:text-foreground data-[state=active]:bg-[var(--design-editor-panel-raised-bg)] data-[state=active]:text-foreground data-[state=active]:shadow-none",
1146
- compact ? "w-auto gap-0.5 px-1" : "gap-1 px-1.5",
1147
- )}
1262
+ className="group h-6 min-w-0 rounded-md gap-1 px-1.5 !text-[11px] font-semibold text-muted-foreground shadow-none transition-colors hover:text-foreground data-[state=active]:bg-[var(--design-editor-panel-raised-bg)] data-[state=active]:text-foreground data-[state=active]:shadow-none"
1148
1263
  >
1149
- {compact ? (
1150
- <IconMessageCircle className="size-3.5" />
1151
- ) : (
1152
- <span className="truncate">{t("review.comments")}</span>
1153
- )}
1264
+ <span className="truncate">{t("review.comments")}</span>
1154
1265
  {commentsCount > 0 ? (
1155
1266
  <span
1156
1267
  className={cn(
1157
1268
  "flex shrink-0 items-center justify-center rounded-full bg-muted tabular-nums text-muted-foreground group-data-[state=active]:bg-background",
1158
- compact
1159
- ? "h-3.5 min-w-3.5 px-0.5 text-[8px]"
1160
- : "h-4 min-w-4 px-1 text-[9px]",
1269
+ "h-4 min-w-4 px-1 text-[9px]",
1161
1270
  )}
1162
1271
  >
1163
1272
  {commentsCount > 99 ? "99+" : commentsCount}
1164
1273
  </span>
1165
1274
  ) : null}
1166
1275
  </TabsTrigger>
1167
- <TabsTrigger
1168
- value="tweaks"
1169
- aria-label={t("designEditor.tweaks")}
1170
- className={cn(
1171
- "h-6 rounded-md !text-[11px] font-semibold text-muted-foreground shadow-none transition-colors hover:text-foreground data-[state=active]:bg-[var(--design-editor-panel-raised-bg)] data-[state=active]:text-foreground data-[state=active]:shadow-none",
1172
- compact ? "w-7 px-0" : "px-1.5",
1173
- )}
1174
- >
1175
- {compact ? (
1176
- <IconAdjustmentsHorizontal className="size-3.5" />
1177
- ) : (
1178
- t("designEditor.tweaks")
1179
- )}
1180
- </TabsTrigger>
1276
+ {!readOnly ? (
1277
+ <TabsTrigger
1278
+ value="tweaks"
1279
+ aria-label={t("designEditor.tweaks")}
1280
+ className="h-6 rounded-md px-1.5 !text-[11px] font-semibold text-muted-foreground shadow-none transition-colors hover:text-foreground data-[state=active]:bg-[var(--design-editor-panel-raised-bg)] data-[state=active]:text-foreground data-[state=active]:shadow-none"
1281
+ >
1282
+ {t("designEditor.tweaks")}
1283
+ </TabsTrigger>
1284
+ ) : (
1285
+ <TabsTrigger
1286
+ value="code"
1287
+ aria-label={"Code" /* i18n-ignore design inspector tab */}
1288
+ className="h-6 rounded-md px-1.5 !text-[11px] font-semibold text-muted-foreground shadow-none transition-colors hover:text-foreground data-[state=active]:bg-[var(--design-editor-panel-raised-bg)] data-[state=active]:text-foreground data-[state=active]:shadow-none"
1289
+ >
1290
+ {"Code" /* i18n-ignore design inspector tab */}
1291
+ </TabsTrigger>
1292
+ )}
1181
1293
  </TabsList>
1182
1294
  </Tabs>
1183
1295
  {trailing ? <div className="shrink-0">{trailing}</div> : null}
@@ -1410,6 +1522,7 @@ export const EditPanel = memo(function EditPanel({
1410
1522
  pageStyles = {},
1411
1523
  headerTrailing,
1412
1524
  width = 256,
1525
+ readOnly = false,
1413
1526
  activeTab = "design",
1414
1527
  onActiveTabChange,
1415
1528
  tweaks = [],
@@ -1770,10 +1883,16 @@ export const EditPanel = memo(function EditPanel({
1770
1883
  const userScrollIntentRef = useRef(false);
1771
1884
  const scrollTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
1772
1885
 
1886
+ const resolvedActiveTab: InspectorTab =
1887
+ readOnly && (activeTab === "design" || activeTab === "tweaks")
1888
+ ? "code"
1889
+ : activeTab;
1890
+
1773
1891
  // Frame presets belong to the Design inspector. Keep Comments and Tweaks
1774
1892
  // visible when the Frame tool remains armed while another tab is active.
1775
1893
  const showFramePresets =
1776
- activeTab === "design" &&
1894
+ !readOnly &&
1895
+ resolvedActiveTab === "design" &&
1777
1896
  activeTool === "frame" &&
1778
1897
  Boolean(onCreateScreenFromPreset);
1779
1898
 
@@ -1787,18 +1906,18 @@ export const EditPanel = memo(function EditPanel({
1787
1906
  style={{ width }}
1788
1907
  >
1789
1908
  <InspectorTabsHeader
1790
- activeTab={activeTab}
1909
+ activeTab={resolvedActiveTab}
1910
+ readOnly={readOnly}
1791
1911
  onActiveTabChange={handleActiveTabChange}
1792
1912
  trailing={headerTrailing}
1793
1913
  commentsCount={reviewCommentsCount}
1794
- compact={width < 280}
1795
1914
  />
1796
1915
 
1797
1916
  {showFramePresets ? (
1798
1917
  <FramePresetsPanel
1799
1918
  onPick={(preset) => onCreateScreenFromPreset?.(preset)}
1800
1919
  />
1801
- ) : activeTab === "design" ? (
1920
+ ) : resolvedActiveTab === "design" ? (
1802
1921
  <>
1803
1922
  <SelectionHeader
1804
1923
  element={inspectorElement}
@@ -2090,7 +2209,7 @@ export const EditPanel = memo(function EditPanel({
2090
2209
  ) : null}
2091
2210
  </div>
2092
2211
  </>
2093
- ) : activeTab === "tweaks" ? (
2212
+ ) : resolvedActiveTab === "tweaks" ? (
2094
2213
  <div className="flex min-h-0 flex-1 flex-col overflow-hidden">
2095
2214
  <div className="flex h-10 shrink-0 items-center justify-between gap-2 border-b border-border/90 px-3">
2096
2215
  <h3 className="min-w-0 flex-1 truncate text-[13px] font-semibold text-foreground">
@@ -2127,7 +2246,13 @@ export const EditPanel = memo(function EditPanel({
2127
2246
  />
2128
2247
  </div>
2129
2248
  </div>
2130
- ) : activeTab === "comments" && reviewCommentsPanelProps ? (
2249
+ ) : resolvedActiveTab === "code" ? (
2250
+ <CodeInspectPanel
2251
+ data={inspectCode}
2252
+ element={inspectorElement}
2253
+ screen={selectedScreenGeometry}
2254
+ />
2255
+ ) : resolvedActiveTab === "comments" && reviewCommentsPanelProps ? (
2131
2256
  <ReviewCommentsPanel {...reviewCommentsPanelProps} />
2132
2257
  ) : null}
2133
2258
  </div>