@agent-native/core 0.131.5 → 0.131.7

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 (350) hide show
  1. package/corpus/README.md +3 -3
  2. package/corpus/core/CHANGELOG.md +70 -0
  3. package/corpus/core/docs/content/agent-native-toolkit.mdx +13 -6
  4. package/corpus/core/docs/content/cloneable-saas.mdx +5 -5
  5. package/corpus/core/docs/content/creating-templates.mdx +9 -0
  6. package/corpus/core/docs/content/deployment.mdx +18 -12
  7. package/corpus/core/docs/content/doctor.mdx +8 -1
  8. package/corpus/core/docs/content/drop-in-agent.mdx +1 -1
  9. package/corpus/core/docs/content/extensions.mdx +18 -18
  10. package/corpus/core/docs/content/faq.mdx +4 -4
  11. package/corpus/core/docs/content/key-concepts.mdx +30 -21
  12. package/corpus/core/docs/content/security.mdx +2 -2
  13. package/corpus/core/docs/content/template-brain-developers.mdx +4 -1
  14. package/corpus/core/docs/content/template-mail-developers.mdx +4 -1
  15. package/corpus/core/docs/content/what-is-agent-native.mdx +6 -6
  16. package/corpus/core/package.json +1 -1
  17. package/corpus/core/src/a2a/client.ts +449 -66
  18. package/corpus/core/src/a2a/correlation.ts +31 -0
  19. package/corpus/core/src/a2a/invoke.ts +4 -2
  20. package/corpus/core/src/a2a/types.ts +4 -0
  21. package/corpus/core/src/action.ts +3 -0
  22. package/corpus/core/src/agent/action-continuation-guidance.ts +2 -1
  23. package/corpus/core/src/agent/engine/registry.ts +98 -6
  24. package/corpus/core/src/agent/production-agent.ts +151 -18
  25. package/corpus/core/src/agent/run-loop-with-resume.ts +190 -3
  26. package/corpus/core/src/agent/run-manager.ts +117 -41
  27. package/corpus/core/src/agent/thread-debug-history.ts +86 -0
  28. package/corpus/core/src/agent/types.ts +3 -1
  29. package/corpus/core/src/cli/create.ts +11 -1
  30. package/corpus/core/src/cli/templates-meta.ts +2 -2
  31. package/corpus/core/src/client/agent-chat-adapter.ts +91 -13
  32. package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +11 -9
  33. package/corpus/core/src/client/sse-event-processor.ts +17 -3
  34. package/corpus/core/src/db/client.ts +57 -17
  35. package/corpus/core/src/guards/no-env-credentials.ts +2 -0
  36. package/corpus/core/src/integrations/adapters/slack.ts +8 -3
  37. package/corpus/core/src/localization/default-messages.ts +44 -0
  38. package/corpus/core/src/observability/traces.ts +78 -5
  39. package/corpus/core/src/scripts/call-agent.ts +294 -11
  40. package/corpus/core/src/scripts/describe-workspace-apps.ts +2 -2
  41. package/corpus/core/src/secrets/crypto.ts +156 -35
  42. package/corpus/core/src/secrets/storage.ts +64 -26
  43. package/corpus/core/src/server/agent-capabilities.ts +1 -1
  44. package/corpus/core/src/server/agent-chat/action-filters-a2a.ts +113 -7
  45. package/corpus/core/src/server/agent-chat/context-tools.ts +2 -0
  46. package/corpus/core/src/server/agent-chat/plugin-options.ts +34 -1
  47. package/corpus/core/src/server/agent-chat/prompt-resources.ts +1 -1
  48. package/corpus/core/src/server/agent-chat-plugin.ts +91 -59
  49. package/corpus/core/src/templates/default/.agents/skills/secrets/SKILL.md +19 -7
  50. package/corpus/core/src/templates/headless/.agents/skills/secrets/SKILL.md +19 -7
  51. package/corpus/core/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +18 -7
  52. package/corpus/core/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +15 -14
  53. package/corpus/core/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +19 -7
  54. package/corpus/core/src/vite/client.ts +1 -0
  55. package/corpus/templates/analytics/.agents/skills/dashboard-ops/SKILL.md +5 -4
  56. package/corpus/templates/analytics/.agents/skills/gong/SKILL.md +6 -4
  57. package/corpus/templates/analytics/AGENTS.md +7 -4
  58. package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +4 -3
  59. package/corpus/templates/analytics/changelog/2026-07-30-delegated-analytics-questions-now-return-a-useful-current-me.md +6 -0
  60. package/corpus/templates/analytics/changelog/2026-07-30-scheduled-dashboard-emails-complete-every-panel-without-pool.md +6 -0
  61. package/corpus/templates/analytics/scripts/emit-netlify-dashboard-report-cron.ts +28 -1
  62. package/corpus/templates/analytics/server/jobs/dashboard-report.ts +18 -11
  63. package/corpus/templates/analytics/server/lib/analytics-connector-catalog.ts +4 -4
  64. package/corpus/templates/analytics/server/lib/canonical-first-party-dashboard-repair.ts +9 -5
  65. package/corpus/templates/analytics/server/lib/dashboard-panel-query.ts +6 -2
  66. package/corpus/templates/analytics/server/lib/dashboard-panel-source-resolver.ts +11 -4
  67. package/corpus/templates/analytics/server/lib/dashboard-report-render.ts +49 -31
  68. package/corpus/templates/analytics/server/lib/first-party-analytics.ts +16 -8
  69. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +9 -3
  70. package/corpus/templates/analytics/server/lib/production-serverless-runtime.ts +11 -0
  71. package/corpus/templates/analytics/server/lib/real-data-actions.ts +10 -0
  72. package/corpus/templates/analytics/server/plugins/agent-chat.ts +3 -2
  73. package/corpus/templates/analytics/server/plugins/analytics-alert-jobs.ts +2 -1
  74. package/corpus/templates/analytics/server/plugins/dashboard-report-jobs.ts +2 -1
  75. package/corpus/templates/analytics/server/plugins/uptime-monitor-jobs.ts +1 -12
  76. package/corpus/templates/brain/.agents/skills/brain/RUNBOOK.md +54 -6
  77. package/corpus/templates/brain/.agents/skills/brain/SKILL.md +20 -9
  78. package/corpus/templates/brain/.agents/skills/ingestion-and-connectors/SKILL.md +33 -1
  79. package/corpus/templates/brain/AGENTS.md +3 -1
  80. package/corpus/templates/brain/README.md +4 -1
  81. package/corpus/templates/brain/actions/_schemas.ts +30 -8
  82. package/corpus/templates/brain/actions/ask-brain.ts +124 -14
  83. package/corpus/templates/brain/actions/create-source.ts +18 -2
  84. package/corpus/templates/brain/actions/enqueue-captures-distillation.ts +8 -123
  85. package/corpus/templates/brain/actions/enqueue-distillation.ts +6 -127
  86. package/corpus/templates/brain/actions/import-capture.ts +17 -5
  87. package/corpus/templates/brain/actions/import-transcript.ts +17 -5
  88. package/corpus/templates/brain/actions/update-source.ts +25 -5
  89. package/corpus/templates/brain/app/components/layout/Sidebar.tsx +1 -1
  90. package/corpus/templates/brain/changelog/2026-07-30-blessed-resources-can-feed-cited-company-answers.md +6 -0
  91. package/corpus/templates/brain/changelog/2026-07-30-the-left-sidebar-no-longer-shows-a-blank-organization-placeh.md +6 -0
  92. package/corpus/templates/brain/server/lib/brain.ts +49 -19
  93. package/corpus/templates/brain/server/lib/distillation-queue.ts +147 -0
  94. package/corpus/templates/brain/server/lib/source-policy.ts +264 -0
  95. package/corpus/templates/brain/server/plugins/agent-chat.ts +3 -2
  96. package/corpus/templates/brain/server/routes/api/_agent-native/brain/ingest.post.ts +116 -19
  97. package/corpus/templates/clips/app/components/meetings/google-oauth-identity-notice.tsx +51 -0
  98. package/corpus/templates/clips/app/i18n/en-US.ts +4 -0
  99. package/corpus/templates/clips/app/routes/_app.meetings._index.tsx +3 -1
  100. package/corpus/templates/clips/changelog/2026-07-30-google-calendar-warning.md +6 -0
  101. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +72 -8
  102. package/corpus/templates/content/changelog/2026-07-30-the-slash-command-hint-now-stays-on-only-the-active-empty-li.md +6 -0
  103. package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +506 -11
  104. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +148 -17
  105. package/corpus/templates/design/app/components/design/canvas-interactions/design-canvas-interactions.ts +357 -0
  106. package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +7 -466
  107. package/corpus/templates/design/app/components/design/inspector/scrub-input-utils.ts +15 -311
  108. package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +19 -997
  109. package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +8 -1216
  110. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +31 -38
  111. package/corpus/templates/design/package.json +0 -1
  112. package/corpus/templates/dispatch/AGENTS.md +8 -0
  113. package/corpus/templates/dispatch/DEVELOPING.md +29 -0
  114. package/corpus/templates/dispatch/actions/view-screen.ts +34 -2
  115. package/corpus/templates/dispatch/app/i18n-data.ts +457 -0
  116. package/corpus/templates/dispatch/changelog/2026-07-30-delegated-dispatch-work-continues-reliably-in-the-background.md +6 -0
  117. package/corpus/templates/dispatch/changelog/2026-07-30-find-failed-runs-across-apps.md +6 -0
  118. package/corpus/templates/dispatch/netlify.toml +3 -0
  119. package/corpus/templates/plan/actions/get-visual-plan.ts +10 -6
  120. package/corpus/templates/plan/actions/patch-visual-plan-source.ts +117 -1
  121. package/corpus/templates/plan/actions/update-visual-plan.ts +56 -14
  122. package/corpus/templates/plan/app/pages/PlansPage.tsx +1 -1
  123. package/corpus/templates/plan/changelog/2026-07-30-plan-agents-recover-with-targeted-writes.md +6 -0
  124. package/corpus/templates/plan/shared/plan-content.ts +35 -0
  125. package/corpus/templates/slides/.agents/skills/analytics-data-for-decks/SKILL.md +8 -12
  126. package/corpus/templates/slides/AGENTS.md +4 -4
  127. package/corpus/templates/slides/actions/create-deck.ts +1 -1
  128. package/corpus/templates/slides/actions/duplicate-deck.ts +19 -4
  129. package/corpus/templates/slides/app/components/deck/DeckCard.tsx +2 -10
  130. package/corpus/templates/slides/app/components/deck/MermaidRenderer.tsx +12 -1
  131. package/corpus/templates/slides/app/components/deck/SlideRenderer.tsx +30 -13
  132. package/corpus/templates/slides/app/components/editor/DeckEditorSkeleton.tsx +35 -0
  133. package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +63 -56
  134. package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +21 -76
  135. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +1110 -292
  136. package/corpus/templates/slides/app/components/editor/SlideOverflowWarning.tsx +53 -0
  137. package/corpus/templates/slides/app/components/editor/SlideStyleInspector.tsx +235 -18
  138. package/corpus/templates/slides/app/components/editor/SpeakerNotesPanel.tsx +4 -1
  139. package/corpus/templates/slides/app/components/editor/canvas-interactions/index.ts +11 -0
  140. package/corpus/templates/slides/app/components/editor/canvas-interactions/slides-canvas-adapter.ts +129 -0
  141. package/corpus/templates/slides/app/components/editor/selection-overlay-measurement.ts +70 -0
  142. package/corpus/templates/slides/app/components/editor/slide-object-interactions.ts +519 -65
  143. package/corpus/templates/slides/app/components/visual-editor/CanvasCommentPins.tsx +36 -426
  144. package/corpus/templates/slides/app/components/visual-editor/DrawOverlay.tsx +19 -458
  145. package/corpus/templates/slides/app/context/DeckContext.tsx +179 -72
  146. package/corpus/templates/slides/app/global.css +105 -0
  147. package/corpus/templates/slides/app/i18n/en-US.ts +8 -0
  148. package/corpus/templates/slides/app/lib/deck-editor-loading.ts +26 -0
  149. package/corpus/templates/slides/app/lib/mermaid-blocks.ts +27 -0
  150. package/corpus/templates/slides/app/pages/DeckEditor.tsx +71 -38
  151. package/corpus/templates/slides/app/pages/Index.tsx +98 -41
  152. package/corpus/templates/slides/changelog/2026-07-30-deck-loading-no-longer-flashes-an-unavailable-message.md +6 -0
  153. package/corpus/templates/slides/changelog/2026-07-30-duplicating-a-deck-from-the-deck-list-now-opens-the-copy-imm.md +6 -0
  154. package/corpus/templates/slides/changelog/2026-07-30-layout-overflow-warning-is-readable-and-dismissible.md +6 -0
  155. package/corpus/templates/slides/changelog/2026-07-30-new-decks-now-start-with-an-empty-slide-list-when-no-slides-.md +6 -0
  156. package/corpus/templates/slides/changelog/2026-07-30-shared-canvas-annotations.md +6 -0
  157. package/corpus/templates/slides/changelog/2026-07-30-slide-objects-can-be-moved-as-a-group-copied-and-pasted-with.md +6 -0
  158. package/corpus/templates/slides/changelog/2026-07-30-slide-text-editing-and-object-controls-now-match-google-slides.md +6 -0
  159. package/corpus/templates/slides/changelog/2026-07-30-style-panel-now-scrolls-with-speaker-notes-open-shows-the-sl.md +6 -0
  160. package/corpus/templates/slides/changelog/2026-07-30-top-toolbar-controls-now-use-consistent-sizing-with-undo-and.md +6 -0
  161. package/corpus/templates/slides/netlify.toml +3 -1
  162. package/corpus/templates/slides/package.json +0 -1
  163. package/corpus/templates/slides/server/lib/chat-attachments.ts +18 -0
  164. package/corpus/templates/slides/server/plugins/agent-chat.ts +5 -0
  165. package/corpus/templates/slides/vite.config.ts +0 -1
  166. package/corpus/toolkit/CHANGELOG.md +13 -0
  167. package/corpus/toolkit/README.md +19 -0
  168. package/corpus/toolkit/agent-native.eject.json +38 -0
  169. package/corpus/toolkit/package.json +29 -1
  170. package/corpus/toolkit/src/canvas-annotations/CanvasCommentPins.tsx +861 -0
  171. package/corpus/toolkit/src/canvas-annotations/DrawOverlay.tsx +1233 -0
  172. package/corpus/toolkit/src/canvas-annotations/index.ts +15 -0
  173. package/corpus/toolkit/src/canvas-annotations/types.ts +14 -0
  174. package/corpus/toolkit/src/canvas-interactions/canvas-interactions.ts +933 -0
  175. package/corpus/toolkit/src/canvas-interactions/index.ts +67 -0
  176. package/corpus/toolkit/src/design-tweaks/scrub-input-utils.ts +311 -0
  177. package/corpus/toolkit/src/design-tweaks/scrub-input.tsx +491 -0
  178. package/corpus/toolkit/src/design-tweaks/visual-style-controls.tsx +26 -171
  179. package/corpus/toolkit/src/index.ts +1 -0
  180. package/dist/a2a/client.d.ts +23 -0
  181. package/dist/a2a/client.d.ts.map +1 -1
  182. package/dist/a2a/client.js +309 -44
  183. package/dist/a2a/client.js.map +1 -1
  184. package/dist/a2a/correlation.d.ts +1 -0
  185. package/dist/a2a/correlation.d.ts.map +1 -1
  186. package/dist/a2a/correlation.js +27 -0
  187. package/dist/a2a/correlation.js.map +1 -1
  188. package/dist/a2a/invoke.d.ts.map +1 -1
  189. package/dist/a2a/invoke.js +4 -2
  190. package/dist/a2a/invoke.js.map +1 -1
  191. package/dist/a2a/types.d.ts +4 -0
  192. package/dist/a2a/types.d.ts.map +1 -1
  193. package/dist/a2a/types.js.map +1 -1
  194. package/dist/action.d.ts +3 -0
  195. package/dist/action.d.ts.map +1 -1
  196. package/dist/action.js.map +1 -1
  197. package/dist/agent/action-continuation-guidance.d.ts.map +1 -1
  198. package/dist/agent/action-continuation-guidance.js +2 -1
  199. package/dist/agent/action-continuation-guidance.js.map +1 -1
  200. package/dist/agent/engine/registry.d.ts.map +1 -1
  201. package/dist/agent/engine/registry.js +82 -8
  202. package/dist/agent/engine/registry.js.map +1 -1
  203. package/dist/agent/production-agent.d.ts +40 -1
  204. package/dist/agent/production-agent.d.ts.map +1 -1
  205. package/dist/agent/production-agent.js +113 -15
  206. package/dist/agent/production-agent.js.map +1 -1
  207. package/dist/agent/run-loop-with-resume.d.ts +21 -0
  208. package/dist/agent/run-loop-with-resume.d.ts.map +1 -1
  209. package/dist/agent/run-loop-with-resume.js +163 -4
  210. package/dist/agent/run-loop-with-resume.js.map +1 -1
  211. package/dist/agent/run-manager.d.ts +16 -9
  212. package/dist/agent/run-manager.d.ts.map +1 -1
  213. package/dist/agent/run-manager.js +93 -42
  214. package/dist/agent/run-manager.js.map +1 -1
  215. package/dist/agent/thread-debug-history.d.ts +10 -0
  216. package/dist/agent/thread-debug-history.d.ts.map +1 -0
  217. package/dist/agent/thread-debug-history.js +68 -0
  218. package/dist/agent/thread-debug-history.js.map +1 -0
  219. package/dist/agent/types.d.ts +3 -1
  220. package/dist/agent/types.d.ts.map +1 -1
  221. package/dist/agent/types.js.map +1 -1
  222. package/dist/cli/create.d.ts.map +1 -1
  223. package/dist/cli/create.js +6 -1
  224. package/dist/cli/create.js.map +1 -1
  225. package/dist/cli/templates-meta.js +2 -2
  226. package/dist/cli/templates-meta.js.map +1 -1
  227. package/dist/client/agent-chat-adapter.d.ts +1 -1
  228. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  229. package/dist/client/agent-chat-adapter.js +76 -13
  230. package/dist/client/agent-chat-adapter.js.map +1 -1
  231. package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
  232. package/dist/client/resources/McpIntegrationDialog.js +1 -1
  233. package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
  234. package/dist/client/sse-event-processor.d.ts.map +1 -1
  235. package/dist/client/sse-event-processor.js +12 -3
  236. package/dist/client/sse-event-processor.js.map +1 -1
  237. package/dist/collab/routes.d.ts +1 -1
  238. package/dist/db/client.d.ts.map +1 -1
  239. package/dist/db/client.js +48 -17
  240. package/dist/db/client.js.map +1 -1
  241. package/dist/guards/no-env-credentials.d.ts.map +1 -1
  242. package/dist/guards/no-env-credentials.js +2 -0
  243. package/dist/guards/no-env-credentials.js.map +1 -1
  244. package/dist/integrations/adapters/slack.js +7 -3
  245. package/dist/integrations/adapters/slack.js.map +1 -1
  246. package/dist/localization/default-messages.d.ts +43 -0
  247. package/dist/localization/default-messages.d.ts.map +1 -1
  248. package/dist/localization/default-messages.js +43 -0
  249. package/dist/localization/default-messages.js.map +1 -1
  250. package/dist/observability/traces.d.ts +3 -1
  251. package/dist/observability/traces.d.ts.map +1 -1
  252. package/dist/observability/traces.js +73 -4
  253. package/dist/observability/traces.js.map +1 -1
  254. package/dist/progress/routes.d.ts +1 -1
  255. package/dist/provider-api/actions/custom-provider-registration.d.ts +12 -12
  256. package/dist/provider-api/actions/provider-api.d.ts +13 -13
  257. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  258. package/dist/scripts/call-agent.d.ts.map +1 -1
  259. package/dist/scripts/call-agent.js +237 -12
  260. package/dist/scripts/call-agent.js.map +1 -1
  261. package/dist/scripts/describe-workspace-apps.js +2 -2
  262. package/dist/scripts/describe-workspace-apps.js.map +1 -1
  263. package/dist/secrets/crypto.d.ts +36 -21
  264. package/dist/secrets/crypto.d.ts.map +1 -1
  265. package/dist/secrets/crypto.js +134 -33
  266. package/dist/secrets/crypto.js.map +1 -1
  267. package/dist/secrets/storage.d.ts +6 -6
  268. package/dist/secrets/storage.d.ts.map +1 -1
  269. package/dist/secrets/storage.js +43 -26
  270. package/dist/secrets/storage.js.map +1 -1
  271. package/dist/server/agent-capabilities.js +1 -1
  272. package/dist/server/agent-capabilities.js.map +1 -1
  273. package/dist/server/agent-chat/action-filters-a2a.d.ts +17 -3
  274. package/dist/server/agent-chat/action-filters-a2a.d.ts.map +1 -1
  275. package/dist/server/agent-chat/action-filters-a2a.js +94 -3
  276. package/dist/server/agent-chat/action-filters-a2a.js.map +1 -1
  277. package/dist/server/agent-chat/context-tools.d.ts.map +1 -1
  278. package/dist/server/agent-chat/context-tools.js +2 -0
  279. package/dist/server/agent-chat/context-tools.js.map +1 -1
  280. package/dist/server/agent-chat/plugin-options.d.ts +23 -0
  281. package/dist/server/agent-chat/plugin-options.d.ts.map +1 -1
  282. package/dist/server/agent-chat/plugin-options.js +4 -1
  283. package/dist/server/agent-chat/plugin-options.js.map +1 -1
  284. package/dist/server/agent-chat/prompt-resources.js +1 -1
  285. package/dist/server/agent-chat/prompt-resources.js.map +1 -1
  286. package/dist/server/agent-chat-plugin.d.ts +2 -1
  287. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  288. package/dist/server/agent-chat-plugin.js +79 -56
  289. package/dist/server/agent-chat-plugin.js.map +1 -1
  290. package/dist/server/realtime-token.d.ts +1 -1
  291. package/dist/templates/default/.agents/skills/secrets/SKILL.md +19 -7
  292. package/dist/templates/headless/.agents/skills/secrets/SKILL.md +19 -7
  293. package/dist/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +18 -7
  294. package/dist/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +15 -14
  295. package/dist/templates/workspace-core/.agents/skills/secrets/SKILL.md +19 -7
  296. package/dist/vite/client.d.ts.map +1 -1
  297. package/dist/vite/client.js +1 -0
  298. package/dist/vite/client.js.map +1 -1
  299. package/docs/content/agent-native-toolkit.mdx +13 -6
  300. package/docs/content/cloneable-saas.mdx +5 -5
  301. package/docs/content/creating-templates.mdx +9 -0
  302. package/docs/content/deployment.mdx +18 -12
  303. package/docs/content/doctor.mdx +8 -1
  304. package/docs/content/drop-in-agent.mdx +1 -1
  305. package/docs/content/extensions.mdx +18 -18
  306. package/docs/content/faq.mdx +4 -4
  307. package/docs/content/key-concepts.mdx +30 -21
  308. package/docs/content/security.mdx +2 -2
  309. package/docs/content/template-brain-developers.mdx +4 -1
  310. package/docs/content/template-mail-developers.mdx +4 -1
  311. package/docs/content/what-is-agent-native.mdx +6 -6
  312. package/package.json +3 -3
  313. package/src/a2a/client.ts +449 -66
  314. package/src/a2a/correlation.ts +31 -0
  315. package/src/a2a/invoke.ts +4 -2
  316. package/src/a2a/types.ts +4 -0
  317. package/src/action.ts +3 -0
  318. package/src/agent/action-continuation-guidance.ts +2 -1
  319. package/src/agent/engine/registry.ts +98 -6
  320. package/src/agent/production-agent.ts +151 -18
  321. package/src/agent/run-loop-with-resume.ts +190 -3
  322. package/src/agent/run-manager.ts +117 -41
  323. package/src/agent/thread-debug-history.ts +86 -0
  324. package/src/agent/types.ts +3 -1
  325. package/src/cli/create.ts +11 -1
  326. package/src/cli/templates-meta.ts +2 -2
  327. package/src/client/agent-chat-adapter.ts +91 -13
  328. package/src/client/resources/McpIntegrationDialog.tsx +11 -9
  329. package/src/client/sse-event-processor.ts +17 -3
  330. package/src/db/client.ts +57 -17
  331. package/src/guards/no-env-credentials.ts +2 -0
  332. package/src/integrations/adapters/slack.ts +8 -3
  333. package/src/localization/default-messages.ts +44 -0
  334. package/src/observability/traces.ts +78 -5
  335. package/src/scripts/call-agent.ts +294 -11
  336. package/src/scripts/describe-workspace-apps.ts +2 -2
  337. package/src/secrets/crypto.ts +156 -35
  338. package/src/secrets/storage.ts +64 -26
  339. package/src/server/agent-capabilities.ts +1 -1
  340. package/src/server/agent-chat/action-filters-a2a.ts +113 -7
  341. package/src/server/agent-chat/context-tools.ts +2 -0
  342. package/src/server/agent-chat/plugin-options.ts +34 -1
  343. package/src/server/agent-chat/prompt-resources.ts +1 -1
  344. package/src/server/agent-chat-plugin.ts +91 -59
  345. package/src/templates/default/.agents/skills/secrets/SKILL.md +19 -7
  346. package/src/templates/headless/.agents/skills/secrets/SKILL.md +19 -7
  347. package/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +18 -7
  348. package/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +15 -14
  349. package/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +19 -7
  350. package/src/vite/client.ts +1 -0
@@ -0,0 +1,35 @@
1
+ import { Skeleton } from "@/components/ui/skeleton";
2
+
3
+ export function DeckEditorSkeleton({ label }: { label: string }) {
4
+ return (
5
+ <div
6
+ className="flex h-full min-h-0 flex-1 flex-col overflow-hidden bg-background"
7
+ role="status"
8
+ aria-label={label}
9
+ data-testid="deck-editor-loading"
10
+ >
11
+ <div className="flex h-11 shrink-0 items-center gap-3 border-b border-border px-3">
12
+ <Skeleton className="size-8 rounded-md" />
13
+ <Skeleton className="h-5 w-36" />
14
+ <div className="ml-auto flex items-center gap-2">
15
+ <Skeleton className="h-8 w-20 rounded-md" />
16
+ <Skeleton className="size-8 rounded-md" />
17
+ <Skeleton className="size-8 rounded-md" />
18
+ </div>
19
+ </div>
20
+ <div className="flex min-h-0 flex-1">
21
+ <div className="hidden w-56 shrink-0 flex-col gap-4 border-r border-border p-4 sm:w-64 md:flex">
22
+ {[0, 1, 2].map((index) => (
23
+ <div key={index} className="flex gap-3">
24
+ <Skeleton className="h-4 w-4 shrink-0 rounded-sm" />
25
+ <Skeleton className="aspect-video flex-1 rounded-md" />
26
+ </div>
27
+ ))}
28
+ </div>
29
+ <div className="flex min-w-0 flex-1 items-center justify-center bg-muted/20 p-6">
30
+ <Skeleton className="aspect-video w-full max-w-4xl rounded-md shadow-sm" />
31
+ </div>
32
+ </div>
33
+ </div>
34
+ );
35
+ }
@@ -51,14 +51,14 @@ interface EditorSidebarProps {
51
51
  onDuplicateSlide: (id: string) => void;
52
52
  onDeleteSlide: (id: string) => void;
53
53
  onAddEmptySlide: () => void;
54
+ /** Viewer-role decks get thumbnails only: no add, duplicate, or delete. */
55
+ readOnly?: boolean;
54
56
  /** Presence map: slideId → list of users currently viewing that slide */
55
57
  slidePresence?: Map<string, CollabUser[]>;
56
58
  /** Lingering recent edits (e.g. agent edits) to highlight over thumbnails. */
57
59
  recentEdits?: AttributedRecentEdit[];
58
60
  /** Deck aspect ratio (defaults to 16:9 when omitted) */
59
61
  aspectRatio?: AspectRatio;
60
- /** True while a newly-created deck is being populated slide by slide. */
61
- deckGenerating?: boolean;
62
62
  }
63
63
 
64
64
  /** Extract the slide id from a `{kind:"paths",paths:["slides.<id>"]}` edit. */
@@ -183,6 +183,7 @@ function SortableSlideThumb({
183
183
  registerButtonRef,
184
184
  presenceUsers = [],
185
185
  aspectRatio,
186
+ readOnly = false,
186
187
  }: {
187
188
  slide: Slide;
188
189
  index: number;
@@ -190,6 +191,7 @@ function SortableSlideThumb({
190
191
  onSelect: () => void;
191
192
  onDuplicate: () => void;
192
193
  onDelete: () => void;
194
+ readOnly?: boolean;
193
195
  registerButtonRef: (slideId: string, node: HTMLButtonElement | null) => void;
194
196
  presenceUsers?: CollabUser[];
195
197
  aspectRatio?: AspectRatio;
@@ -204,6 +206,7 @@ function SortableSlideThumb({
204
206
  isDragging,
205
207
  } = useSortable({
206
208
  id: slide.id,
209
+ disabled: readOnly,
207
210
  });
208
211
 
209
212
  const style = {
@@ -270,38 +273,40 @@ function SortableSlideThumb({
270
273
  </button>
271
274
 
272
275
  {/* Actions - always visible on touch devices */}
273
- <div className="absolute top-2 right-2 flex gap-0.5 sm:opacity-0 sm:group-hover:opacity-100">
274
- <Tooltip>
275
- <TooltipTrigger asChild>
276
- <button
277
- onClick={(e) => {
278
- e.stopPropagation();
279
- onDuplicate();
280
- }}
281
- className="p-1.5 rounded bg-black/60 backdrop-blur-sm border border-white/10 hover:bg-black/80"
282
- aria-label={t("editorSidebar.duplicateSlide")}
283
- >
284
- <IconCopy className="w-3 h-3 text-white/60" />
285
- </button>
286
- </TooltipTrigger>
287
- <TooltipContent>{t("editorSidebar.duplicate")}</TooltipContent>
288
- </Tooltip>
289
- <Tooltip>
290
- <TooltipTrigger asChild>
291
- <button
292
- onClick={(e) => {
293
- e.stopPropagation();
294
- onDelete();
295
- }}
296
- className="p-1.5 rounded bg-black/60 backdrop-blur-sm border border-white/10 hover:bg-red-900/80"
297
- aria-label={t("editorSidebar.deleteSlide")}
298
- >
299
- <IconTrash className="w-3 h-3 text-white/60" />
300
- </button>
301
- </TooltipTrigger>
302
- <TooltipContent>{t("editorSidebar.delete")}</TooltipContent>
303
- </Tooltip>
304
- </div>
276
+ {!readOnly && (
277
+ <div className="absolute top-2 right-2 flex gap-0.5 sm:opacity-0 sm:group-hover:opacity-100">
278
+ <Tooltip>
279
+ <TooltipTrigger asChild>
280
+ <button
281
+ onClick={(e) => {
282
+ e.stopPropagation();
283
+ onDuplicate();
284
+ }}
285
+ className="p-1.5 rounded bg-black/60 backdrop-blur-sm border border-white/10 hover:bg-black/80"
286
+ aria-label={t("editorSidebar.duplicateSlide")}
287
+ >
288
+ <IconCopy className="w-3 h-3 text-white/60" />
289
+ </button>
290
+ </TooltipTrigger>
291
+ <TooltipContent>{t("editorSidebar.duplicate")}</TooltipContent>
292
+ </Tooltip>
293
+ <Tooltip>
294
+ <TooltipTrigger asChild>
295
+ <button
296
+ onClick={(e) => {
297
+ e.stopPropagation();
298
+ onDelete();
299
+ }}
300
+ className="p-1.5 rounded bg-black/60 backdrop-blur-sm border border-white/10 hover:bg-red-900/80"
301
+ aria-label={t("editorSidebar.deleteSlide")}
302
+ >
303
+ <IconTrash className="w-3 h-3 text-white/60" />
304
+ </button>
305
+ </TooltipTrigger>
306
+ <TooltipContent>{t("editorSidebar.delete")}</TooltipContent>
307
+ </Tooltip>
308
+ </div>
309
+ )}
305
310
  </div>
306
311
  );
307
312
  }
@@ -550,10 +555,10 @@ export default function EditorSidebar({
550
555
  onDuplicateSlide,
551
556
  onDeleteSlide,
552
557
  onAddEmptySlide,
558
+ readOnly = false,
553
559
  slidePresence,
554
560
  recentEdits,
555
561
  aspectRatio,
556
- deckGenerating = false,
557
562
  }: EditorSidebarProps) {
558
563
  const t = useT();
559
564
  const activeIndex = slides.findIndex((s) => s.id === activeSlideId);
@@ -577,7 +582,6 @@ export default function EditorSidebar({
577
582
  [],
578
583
  );
579
584
  const { generating, submit: agentSubmit } = useAgentGenerating();
580
- const showGeneratingSlide = deckGenerating || addSlideGenerating;
581
585
 
582
586
  const registerSlideButton = useCallback(
583
587
  (slideId: string, node: HTMLButtonElement | null) => {
@@ -638,7 +642,7 @@ export default function EditorSidebar({
638
642
  <span className="text-xs font-medium text-muted-foreground uppercase tracking-wider">
639
643
  {t("editorSidebar.slides")}
640
644
  </span>
641
- {showGeneratingSlide ? (
645
+ {readOnly ? null : addSlideGenerating ? (
642
646
  <IconLoader2 className="w-4 h-4 text-muted-foreground animate-spin" />
643
647
  ) : (
644
648
  <Tooltip>
@@ -674,13 +678,14 @@ export default function EditorSidebar({
674
678
  onSelect={() => onSelectSlide(slide.id)}
675
679
  onDuplicate={() => onDuplicateSlide(slide.id)}
676
680
  onDelete={() => onDeleteSlide(slide.id)}
681
+ readOnly={readOnly}
677
682
  registerButtonRef={registerSlideButton}
678
683
  presenceUsers={slidePresence?.get(slide.id) ?? []}
679
684
  aspectRatio={aspectRatio}
680
685
  />
681
686
  ))}
682
687
  </SortableContext>
683
- {showGeneratingSlide && (
688
+ {addSlideGenerating && (
684
689
  <GeneratingSlideSkeleton
685
690
  index={slides.length}
686
691
  aspectRatio={aspectRatio}
@@ -697,24 +702,26 @@ export default function EditorSidebar({
697
702
  )}
698
703
  </div>
699
704
 
700
- <AddSlidePopover
701
- open={addOpen}
702
- onOpenChange={setAddOpen}
703
- anchorRef={headerAddRef}
704
- deckId={deckId}
705
- deckTitle={deckTitle}
706
- activeSlideId={activeSlideId}
707
- slideCount={slides.length}
708
- activeSlideIndex={activeIndex >= 0 ? activeIndex : 0}
709
- agentSubmit={(msg, ctx) => {
710
- setAddSlideGenerating(true);
711
- agentSubmit(msg, ctx);
712
- }}
713
- onDuplicateCurrent={
714
- activeSlideId ? () => onDuplicateSlide(activeSlideId) : undefined
715
- }
716
- onAddEmpty={onAddEmptySlide}
717
- />
705
+ {!readOnly && (
706
+ <AddSlidePopover
707
+ open={addOpen}
708
+ onOpenChange={setAddOpen}
709
+ anchorRef={headerAddRef}
710
+ deckId={deckId}
711
+ deckTitle={deckTitle}
712
+ activeSlideId={activeSlideId}
713
+ slideCount={slides.length}
714
+ activeSlideIndex={activeIndex >= 0 ? activeIndex : 0}
715
+ agentSubmit={(msg, ctx) => {
716
+ setAddSlideGenerating(true);
717
+ agentSubmit(msg, ctx);
718
+ }}
719
+ onDuplicateCurrent={
720
+ activeSlideId ? () => onDuplicateSlide(activeSlideId) : undefined
721
+ }
722
+ onAddEmpty={onAddEmptySlide}
723
+ />
724
+ )}
718
725
  </div>
719
726
  );
720
727
  }
@@ -17,8 +17,6 @@ import {
17
17
  IconLayoutSidebar,
18
18
  IconPhoto,
19
19
  IconHistory,
20
- IconArrowBackUp,
21
- IconArrowForwardUp,
22
20
  IconFolderOpen,
23
21
  IconSettings,
24
22
  IconSchema,
@@ -67,7 +65,6 @@ import {
67
65
  } from "@/lib/aspect-ratios";
68
66
  import type { GoogleSlidesExportResult } from "@/lib/export-google-slides-client";
69
67
  import { parseUploadResponse } from "@/lib/upload-response";
70
- import { shortcutLabel } from "@/lib/utils";
71
68
 
72
69
  import { ExportMenu } from "./ExportMenu";
73
70
  interface EditorToolbarProps {
@@ -90,10 +87,6 @@ interface EditorToolbarProps {
90
87
  historyOpen: boolean;
91
88
  onShowHistory: () => void;
92
89
  historyButtonRef: React.RefObject<HTMLButtonElement | null>;
93
- onUndo: () => void;
94
- onRedo: () => void;
95
- canUndo: boolean;
96
- canRedo: boolean;
97
90
  currentSlide?: Slide;
98
91
  onUpdateSlide?: (updates: Partial<Omit<Slide, "id">>) => void;
99
92
  /** Active users on the current slide (from collab awareness) */
@@ -171,6 +164,8 @@ const backgroundOptions = [
171
164
  ];
172
165
 
173
166
  const HEX_COLOR_PATTERN = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i;
167
+ const TOOLBAR_ICON_BUTTON_CLASS =
168
+ "inline-flex size-8 flex-shrink-0 items-center justify-center rounded-md transition-colors";
174
169
 
175
170
  /** Native <input type="color"> only accepts 3/6-digit hex — fall back to
176
171
  * black for gradients or other raw CSS values so the picker still opens. */
@@ -247,10 +242,6 @@ export default function EditorToolbar({
247
242
  assetsButtonRef,
248
243
  onShowHistory,
249
244
  historyButtonRef,
250
- onUndo,
251
- onRedo,
252
- canUndo,
253
- canRedo,
254
245
  currentSlide,
255
246
  onUpdateSlide,
256
247
  activeUsers,
@@ -426,10 +417,10 @@ export default function EditorToolbar({
426
417
  <TooltipTrigger asChild>
427
418
  <Link
428
419
  to="/"
429
- className="p-2.5 sm:p-1.5 rounded-md hover:bg-accent transition-colors flex-shrink-0"
420
+ className={`${TOOLBAR_ICON_BUTTON_CLASS} hover:bg-accent`}
430
421
  aria-label={t("editorToolbar.backToDecks")}
431
422
  >
432
- <IconArrowLeft className="w-4 h-4 text-muted-foreground" />
423
+ <IconArrowLeft className="size-4 text-muted-foreground" />
433
424
  </Link>
434
425
  </TooltipTrigger>
435
426
  <TooltipContent>{t("editorToolbar.backToDecks")}</TooltipContent>
@@ -440,12 +431,12 @@ export default function EditorToolbar({
440
431
  <TooltipTrigger asChild>
441
432
  <button
442
433
  onClick={onToggleSidebar}
443
- className={`md:hidden p-2.5 sm:p-1.5 rounded-md hover:bg-accent transition-colors flex-shrink-0 ${
434
+ className={`${TOOLBAR_ICON_BUTTON_CLASS} md:hidden hover:bg-accent ${
444
435
  sidebarOpen ? "text-muted-foreground" : "text-muted-foreground/70"
445
436
  }`}
446
437
  aria-label={t("editorToolbar.toggleSlideList")}
447
438
  >
448
- <IconLayoutSidebar className="w-4 h-4" />
439
+ <IconLayoutSidebar className="size-4" />
449
440
  </button>
450
441
  </TooltipTrigger>
451
442
  <TooltipContent>{t("editorToolbar.toggleSlideList")}</TooltipContent>
@@ -486,14 +477,14 @@ export default function EditorToolbar({
486
477
  closeAll();
487
478
  setLayoutOpen(!layoutOpen);
488
479
  }}
489
- className={`flex items-center gap-1 p-2.5 sm:px-2 sm:py-1.5 rounded-md text-xs transition-colors flex-shrink-0 ${
480
+ className={`${TOOLBAR_ICON_BUTTON_CLASS} ${
490
481
  layoutOpen
491
482
  ? "text-foreground/90 bg-accent"
492
483
  : "text-muted-foreground hover:text-foreground/70 hover:bg-accent"
493
484
  }`}
494
485
  aria-label={t("editorToolbar.slideSettings")}
495
486
  >
496
- <IconSettings className="w-3.5 h-3.5" />
487
+ <IconSettings className="size-4" />
497
488
  </button>
498
489
  </TooltipTrigger>
499
490
  <TooltipContent>{t("editorToolbar.slideSettings")}</TooltipContent>
@@ -665,7 +656,7 @@ graph TD
665
656
  console.error("Mermaid to Excalidraw failed:", err);
666
657
  }
667
658
  }}
668
- className="flex items-center gap-2 w-full px-3 py-1.5 text-xs text-[#00E5FF]/80 hover:text-[#00E5FF] hover:bg-accent/50 transition-colors"
659
+ className="flex items-center gap-2 w-full px-3 py-1.5 text-xs text-[hsl(var(--accent-cyan))]/80 hover:text-[hsl(var(--accent-cyan))] hover:bg-accent/50 transition-colors"
669
660
  >
670
661
  <IconTransform className="w-3 h-3" />
671
662
  {t("editorToolbar.convertMermaidToExcalidraw")}
@@ -719,8 +710,8 @@ graph TD
719
710
  {/* Aspect Ratio section (deck-level) */}
720
711
  {onSetAspectRatio && (
721
712
  <>
722
- <div className="mx-2 my-1.5 border-t border-white/[0.06]" />
723
- <div className="px-3 py-1.5 text-[10px] font-medium text-white/30 uppercase tracking-wider">
713
+ <div className="mx-2 my-1.5 border-t border-border" />
714
+ <div className="px-3 py-1.5 text-[10px] font-medium text-muted-foreground/70 uppercase tracking-wider">
724
715
  {t("editorToolbar.aspectRatio")}
725
716
  </div>
726
717
  <div className="px-3 pb-2.5 grid grid-cols-4 gap-1">
@@ -734,7 +725,7 @@ graph TD
734
725
  className={`px-1.5 py-1 rounded text-[10px] font-medium border ${
735
726
  active
736
727
  ? "bg-[#609FF8]/20 text-[#609FF8] border-[#609FF8]/30"
737
- : "text-white/40 hover:text-white/70 hover:bg-white/[0.04] border-transparent"
728
+ : "text-muted-foreground hover:text-foreground hover:bg-accent/50 border-transparent"
738
729
  }`}
739
730
  >
740
731
  {r}
@@ -764,7 +755,7 @@ graph TD
764
755
  aria-label={t("editorToolbar.addTextBox")}
765
756
  aria-pressed={textBoxMode}
766
757
  aria-keyshortcuts="T"
767
- className={`flex-shrink-0 rounded p-1.5 ${
758
+ className={`${TOOLBAR_ICON_BUTTON_CLASS} ${
768
759
  textBoxMode
769
760
  ? "bg-accent text-foreground"
770
761
  : "text-muted-foreground hover:bg-accent hover:text-foreground/70"
@@ -796,14 +787,14 @@ graph TD
796
787
  <TooltipTrigger asChild>
797
788
  <DropdownMenuTrigger asChild>
798
789
  <button
799
- className={`relative p-1.5 rounded cursor-pointer flex-shrink-0 ${
790
+ className={`${TOOLBAR_ICON_BUTTON_CLASS} relative cursor-pointer ${
800
791
  anyToolActive || toolsOpen
801
792
  ? "bg-accent text-foreground"
802
793
  : "text-muted-foreground hover:text-foreground/70 hover:bg-accent"
803
794
  }`}
804
795
  aria-label={t("editorToolbar.slideTools")}
805
796
  >
806
- <IconTool className="w-4 h-4" />
797
+ <IconTool className="size-4" />
807
798
  {anyToolActive && !toolsOpen && (
808
799
  <span className="absolute top-1 right-1 w-1.5 h-1.5 rounded-full bg-[#609FF8]" />
809
800
  )}
@@ -869,52 +860,6 @@ graph TD
869
860
  </DropdownMenu>
870
861
  )}
871
862
 
872
- {/* Edit-only cluster — undo/redo */}
873
- {canEdit && (
874
- <>
875
- {/* Separator */}
876
- <div className="hidden h-5 w-px flex-shrink-0 bg-border/70 sm:block" />
877
-
878
- {/* Undo/Redo */}
879
- <div className="flex items-center flex-shrink-0">
880
- <Tooltip>
881
- <TooltipTrigger asChild>
882
- <button
883
- onClick={onUndo}
884
- disabled={!canUndo}
885
- className="p-2.5 sm:p-1.5 rounded-md hover:bg-accent disabled:opacity-20 transition-colors"
886
- aria-label={t("editorToolbar.undo")}
887
- >
888
- <IconArrowBackUp className="w-3.5 h-3.5 text-muted-foreground" />
889
- </button>
890
- </TooltipTrigger>
891
- <TooltipContent>
892
- {t("editorToolbar.undoWithShortcut", {
893
- shortcut: shortcutLabel("cmd+z"),
894
- })}
895
- </TooltipContent>
896
- </Tooltip>
897
- <Tooltip>
898
- <TooltipTrigger asChild>
899
- <button
900
- onClick={onRedo}
901
- disabled={!canRedo}
902
- className="p-2.5 sm:p-1.5 rounded-md hover:bg-accent disabled:opacity-20 transition-colors"
903
- aria-label={t("editorToolbar.redo")}
904
- >
905
- <IconArrowForwardUp className="w-3.5 h-3.5 text-muted-foreground" />
906
- </button>
907
- </TooltipTrigger>
908
- <TooltipContent>
909
- {t("editorToolbar.redoWithShortcut", {
910
- shortcut: shortcutLabel("cmd+shift+z"),
911
- })}
912
- </TooltipContent>
913
- </Tooltip>
914
- </div>
915
- </>
916
- )}
917
-
918
863
  {/* Save status — subtle "Saving…" / "Saved" / offline pill. Renders
919
864
  nothing when idle. Only meaningful for editors. */}
920
865
  {canEdit && (
@@ -941,14 +886,14 @@ graph TD
941
886
  <button
942
887
  onClick={onToggleStyle}
943
888
  data-slide-style-trigger="true"
944
- className={`relative flex-shrink-0 rounded-md p-2.5 transition-colors sm:p-1.5 ${
889
+ className={`${TOOLBAR_ICON_BUTTON_CLASS} relative ${
945
890
  styleOpen
946
891
  ? "bg-accent text-foreground"
947
892
  : "text-muted-foreground hover:bg-accent hover:text-foreground/70"
948
893
  }`}
949
894
  aria-label={t("styleInspector.title")}
950
895
  >
951
- <IconPalette className="h-3.5 w-3.5" />
896
+ <IconPalette className="size-4" />
952
897
  </button>
953
898
  </TooltipTrigger>
954
899
  <TooltipContent>{t("styleInspector.title")}</TooltipContent>
@@ -961,14 +906,14 @@ graph TD
961
906
  <TooltipTrigger asChild>
962
907
  <button
963
908
  onClick={onToggleComments}
964
- className={`relative p-2.5 sm:p-1.5 rounded-md transition-colors flex-shrink-0 ${
909
+ className={`${TOOLBAR_ICON_BUTTON_CLASS} relative ${
965
910
  commentsOpen
966
911
  ? "text-foreground bg-accent"
967
912
  : "text-muted-foreground hover:text-foreground/70 hover:bg-accent"
968
913
  }`}
969
914
  aria-label={t("editorToolbar.comments")}
970
915
  >
971
- <IconMessage className="w-3.5 h-3.5" />
916
+ <IconMessage className="size-4" />
972
917
  {unresolvedCommentCount > 0 && (
973
918
  <span className="absolute -top-0.5 -right-0.5 w-3.5 h-3.5 rounded-full bg-[#609FF8] text-[8px] font-bold text-black flex items-center justify-center leading-none">
974
919
  {unresolvedCommentCount > 9 ? "9+" : unresolvedCommentCount}
@@ -1053,10 +998,10 @@ graph TD
1053
998
  <DropdownMenuTrigger asChild>
1054
999
  <button
1055
1000
  ref={historyButtonRef}
1056
- className="p-2.5 sm:p-1.5 rounded-md hover:bg-accent transition-colors flex-shrink-0 text-muted-foreground hover:text-foreground/70 cursor-pointer"
1001
+ className={`${TOOLBAR_ICON_BUTTON_CLASS} cursor-pointer text-muted-foreground hover:bg-accent hover:text-foreground/70`}
1057
1002
  aria-label={t("editorToolbar.more")}
1058
1003
  >
1059
- <IconDotsVertical className="w-4 h-4" />
1004
+ <IconDotsVertical className="size-4" />
1060
1005
  </button>
1061
1006
  </DropdownMenuTrigger>
1062
1007
  </TooltipTrigger>