@agent-native/core 0.149.1 → 0.149.3

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 (422) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/templates/analytics/.agents/skills/actions/SKILL.md +54 -488
  3. package/corpus/templates/analytics/.agents/skills/actions/references/action-fields.md +136 -0
  4. package/corpus/templates/analytics/.agents/skills/actions/references/examples.md +94 -0
  5. package/corpus/templates/analytics/.agents/skills/actions/references/provider-apis.md +95 -0
  6. package/corpus/templates/analytics/.agents/skills/create-skill/SKILL.md +9 -35
  7. package/corpus/templates/analytics/.agents/skills/creative-context/SKILL.md +4 -2
  8. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +2 -0
  9. package/corpus/templates/analytics/.agents/skills/frontend-design/SKILL.md +4 -5
  10. package/corpus/templates/analytics/.agents/skills/turn-into-app/SKILL.md +18 -31
  11. package/corpus/templates/analytics/AGENTS.md +25 -32
  12. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +150 -46
  13. package/corpus/templates/analytics/app/global.css +1 -1
  14. package/corpus/templates/analytics/app/i18n-data.ts +37 -0
  15. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +1 -1
  16. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +32 -0
  17. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +2 -0
  18. package/corpus/templates/analytics/changelog/2026-08-10-dashboard-tables-can-be-copied-and-sorted-by-multiple-column.md +6 -0
  19. package/corpus/templates/analytics/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
  20. package/corpus/templates/analytics/changelog/2026-08-11-full-page-chat-composers-stay-at-a-focused-750px-width.md +6 -0
  21. package/corpus/templates/assets/.agents/skills/actions/SKILL.md +54 -488
  22. package/corpus/templates/assets/.agents/skills/actions/references/action-fields.md +136 -0
  23. package/corpus/templates/assets/.agents/skills/actions/references/examples.md +94 -0
  24. package/corpus/templates/assets/.agents/skills/actions/references/provider-apis.md +95 -0
  25. package/corpus/templates/assets/.agents/skills/create-skill/SKILL.md +9 -35
  26. package/corpus/templates/assets/.agents/skills/creative-context/SKILL.md +4 -2
  27. package/corpus/templates/assets/.agents/skills/frontend-design/SKILL.md +4 -5
  28. package/corpus/templates/assets/.agents/skills/turn-into-app/SKILL.md +18 -31
  29. package/corpus/templates/assets/AGENTS.md +6 -9
  30. package/corpus/templates/assets/app/global.css +1 -1
  31. package/corpus/templates/assets/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
  32. package/corpus/templates/assets/changelog/2026-08-11-full-page-chat-composers-stay-at-a-focused-750px-width.md +6 -0
  33. package/corpus/templates/brain/.agents/skills/actions/SKILL.md +54 -488
  34. package/corpus/templates/brain/.agents/skills/actions/references/action-fields.md +136 -0
  35. package/corpus/templates/brain/.agents/skills/actions/references/examples.md +94 -0
  36. package/corpus/templates/brain/.agents/skills/actions/references/provider-apis.md +95 -0
  37. package/corpus/templates/brain/.agents/skills/create-skill/SKILL.md +9 -35
  38. package/corpus/templates/brain/.agents/skills/frontend-design/SKILL.md +4 -5
  39. package/corpus/templates/brain/.agents/skills/turn-into-app/SKILL.md +18 -31
  40. package/corpus/templates/brain/AGENTS.md +5 -12
  41. package/corpus/templates/brain/app/global.css +1 -1
  42. package/corpus/templates/brain/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
  43. package/corpus/templates/brain/changelog/2026-08-11-full-page-chat-composers-stay-at-a-focused-750px-width.md +6 -0
  44. package/corpus/templates/calendar/.agents/skills/actions/SKILL.md +54 -488
  45. package/corpus/templates/calendar/.agents/skills/actions/references/action-fields.md +136 -0
  46. package/corpus/templates/calendar/.agents/skills/actions/references/examples.md +94 -0
  47. package/corpus/templates/calendar/.agents/skills/actions/references/provider-apis.md +95 -0
  48. package/corpus/templates/calendar/.agents/skills/create-skill/SKILL.md +9 -35
  49. package/corpus/templates/calendar/.agents/skills/frontend-design/SKILL.md +4 -5
  50. package/corpus/templates/calendar/.agents/skills/turn-into-app/SKILL.md +18 -31
  51. package/corpus/templates/calendar/AGENTS.md +8 -9
  52. package/corpus/templates/chat/.agents/skills/actions/SKILL.md +54 -488
  53. package/corpus/templates/chat/.agents/skills/actions/references/action-fields.md +136 -0
  54. package/corpus/templates/chat/.agents/skills/actions/references/examples.md +94 -0
  55. package/corpus/templates/chat/.agents/skills/actions/references/provider-apis.md +95 -0
  56. package/corpus/templates/chat/.agents/skills/create-skill/SKILL.md +9 -35
  57. package/corpus/templates/chat/.agents/skills/frontend-design/SKILL.md +4 -5
  58. package/corpus/templates/chat/.agents/skills/turn-into-app/SKILL.md +18 -31
  59. package/corpus/templates/chat/AGENTS.md +32 -80
  60. package/corpus/templates/chat/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
  61. package/corpus/templates/clips/.agents/skills/actions/SKILL.md +54 -488
  62. package/corpus/templates/clips/.agents/skills/actions/references/action-fields.md +136 -0
  63. package/corpus/templates/clips/.agents/skills/actions/references/examples.md +94 -0
  64. package/corpus/templates/clips/.agents/skills/actions/references/provider-apis.md +95 -0
  65. package/corpus/templates/clips/.agents/skills/create-skill/SKILL.md +9 -35
  66. package/corpus/templates/clips/.agents/skills/frontend-design/SKILL.md +4 -5
  67. package/corpus/templates/clips/.agents/skills/turn-into-app/SKILL.md +18 -31
  68. package/corpus/templates/clips/AGENTS.md +25 -31
  69. package/corpus/templates/clips/changelog/2026-08-10-clips-desktop-sign-in-now-starts-with-magic-links-and-google.md +6 -0
  70. package/corpus/templates/clips/chrome-extension/src/overlay.css +1 -0
  71. package/corpus/templates/clips/desktop/src/app.tsx +274 -137
  72. package/corpus/templates/clips/desktop/src/styles.css +35 -0
  73. package/corpus/templates/content/.agents/skills/actions/SKILL.md +54 -488
  74. package/corpus/templates/content/.agents/skills/actions/references/action-fields.md +136 -0
  75. package/corpus/templates/content/.agents/skills/actions/references/examples.md +94 -0
  76. package/corpus/templates/content/.agents/skills/actions/references/provider-apis.md +95 -0
  77. package/corpus/templates/content/.agents/skills/create-skill/SKILL.md +9 -35
  78. package/corpus/templates/content/.agents/skills/creative-context/SKILL.md +4 -2
  79. package/corpus/templates/content/.agents/skills/frontend-design/SKILL.md +4 -5
  80. package/corpus/templates/content/.agents/skills/turn-into-app/SKILL.md +18 -31
  81. package/corpus/templates/content/AGENTS.md +5 -9
  82. package/corpus/templates/content/app/global.css +1 -0
  83. package/corpus/templates/crm/.agents/skills/turn-into-app/SKILL.md +18 -31
  84. package/corpus/templates/crm/AGENTS.md +7 -11
  85. package/corpus/templates/crm/app/global.css +1 -1
  86. package/corpus/templates/crm/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
  87. package/corpus/templates/crm/changelog/2026-08-11-full-page-chat-composers-stay-at-a-focused-750px-width.md +6 -0
  88. package/corpus/templates/design/.agents/skills/actions/SKILL.md +54 -488
  89. package/corpus/templates/design/.agents/skills/actions/references/action-fields.md +136 -0
  90. package/corpus/templates/design/.agents/skills/actions/references/examples.md +94 -0
  91. package/corpus/templates/design/.agents/skills/actions/references/provider-apis.md +95 -0
  92. package/corpus/templates/design/.agents/skills/create-skill/SKILL.md +9 -35
  93. package/corpus/templates/design/.agents/skills/creative-context/SKILL.md +4 -2
  94. package/corpus/templates/design/.agents/skills/frontend-design/SKILL.md +4 -5
  95. package/corpus/templates/design/.agents/skills/turn-into-app/SKILL.md +18 -31
  96. package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +70 -3
  97. package/corpus/templates/design/AGENTS.md +13 -21
  98. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +12 -0
  99. package/corpus/templates/design/app/components/design/LayersPanel.tsx +19 -2
  100. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +115 -7
  101. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +82 -7
  102. package/corpus/templates/design/app/components/design/design-trace.ts +120 -0
  103. package/corpus/templates/design/app/components/design/dnd-debug.ts +2 -1
  104. package/corpus/templates/design/app/components/design/edit-panel/position-layout-properties.tsx +40 -26
  105. package/corpus/templates/design/app/components/design/multi-screen/board-surface-html.ts +4 -1
  106. package/corpus/templates/design/app/components/design/multi-screen/frame-geometry.ts +12 -3
  107. package/corpus/templates/design/app/components/design/multi-screen/screen-content-cache.ts +4 -0
  108. package/corpus/templates/design/app/components/design/multi-screen/types.ts +7 -0
  109. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +3 -2
  110. package/corpus/templates/design/app/components/layout/Sidebar.tsx +2 -2
  111. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +3 -0
  112. package/corpus/templates/design/app/i18n-data.ts +1 -0
  113. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +5 -5
  114. package/corpus/templates/design/app/pages/DesignSystems.tsx +3 -2
  115. package/corpus/templates/design/app/pages/design-editor/canvas-primitive-insert.ts +100 -13
  116. package/corpus/templates/design/app/pages/design-editor/cross-screen-text-color.ts +1 -1
  117. package/corpus/templates/design/app/pages/design-editor/data-operations.ts +14 -0
  118. package/corpus/templates/design/changelog/2026-08-10-marquee-selecting-layers-far-down-a-tall-screen-now-selects-.md +6 -0
  119. package/corpus/templates/design/changelog/2026-08-10-the-frame-tool-draws-a-plain-frame-by-default-with-screen-av.md +6 -0
  120. package/corpus/templates/design/e2e/global-setup.ts +27 -32
  121. package/corpus/templates/design/playwright.config.ts +3 -5
  122. package/corpus/templates/design/shared/breakpoint-media.ts +9 -2
  123. package/corpus/templates/dispatch/.agents/skills/actions/SKILL.md +54 -488
  124. package/corpus/templates/dispatch/.agents/skills/actions/references/action-fields.md +136 -0
  125. package/corpus/templates/dispatch/.agents/skills/actions/references/examples.md +94 -0
  126. package/corpus/templates/dispatch/.agents/skills/actions/references/provider-apis.md +95 -0
  127. package/corpus/templates/dispatch/.agents/skills/create-skill/SKILL.md +9 -35
  128. package/corpus/templates/dispatch/.agents/skills/frontend-design/SKILL.md +4 -5
  129. package/corpus/templates/dispatch/.agents/skills/turn-into-app/SKILL.md +18 -31
  130. package/corpus/templates/dispatch/AGENTS.md +9 -16
  131. package/corpus/templates/dispatch/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
  132. package/corpus/templates/factory/.agents/skills/actions/SKILL.md +54 -488
  133. package/corpus/templates/factory/.agents/skills/actions/references/action-fields.md +136 -0
  134. package/corpus/templates/factory/.agents/skills/actions/references/examples.md +94 -0
  135. package/corpus/templates/factory/.agents/skills/actions/references/provider-apis.md +95 -0
  136. package/corpus/templates/factory/.agents/skills/create-skill/SKILL.md +9 -35
  137. package/corpus/templates/factory/.agents/skills/frontend-design/SKILL.md +4 -5
  138. package/corpus/templates/factory/.agents/skills/turn-into-app/SKILL.md +18 -31
  139. package/corpus/templates/factory/AGENTS.md +10 -24
  140. package/corpus/templates/factory/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
  141. package/corpus/templates/forms/.agents/skills/actions/SKILL.md +54 -488
  142. package/corpus/templates/forms/.agents/skills/actions/references/action-fields.md +136 -0
  143. package/corpus/templates/forms/.agents/skills/actions/references/examples.md +94 -0
  144. package/corpus/templates/forms/.agents/skills/actions/references/provider-apis.md +95 -0
  145. package/corpus/templates/forms/.agents/skills/create-skill/SKILL.md +9 -35
  146. package/corpus/templates/forms/.agents/skills/frontend-design/SKILL.md +4 -5
  147. package/corpus/templates/forms/.agents/skills/turn-into-app/SKILL.md +18 -31
  148. package/corpus/templates/forms/AGENTS.md +11 -17
  149. package/corpus/templates/forms/app/global.css +1 -0
  150. package/corpus/templates/forms/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
  151. package/corpus/templates/forms/changelog/2026-08-11-full-page-chat-composers-stay-at-a-focused-750px-width.md +6 -0
  152. package/corpus/templates/macros/.agents/skills/frontend-design/SKILL.md +4 -5
  153. package/corpus/templates/macros/.agents/skills/turn-into-app/SKILL.md +18 -31
  154. package/corpus/templates/macros/AGENTS.md +8 -8
  155. package/corpus/templates/mail/.agents/skills/actions/SKILL.md +54 -488
  156. package/corpus/templates/mail/.agents/skills/actions/references/action-fields.md +136 -0
  157. package/corpus/templates/mail/.agents/skills/actions/references/examples.md +94 -0
  158. package/corpus/templates/mail/.agents/skills/actions/references/provider-apis.md +95 -0
  159. package/corpus/templates/mail/.agents/skills/create-skill/SKILL.md +9 -35
  160. package/corpus/templates/mail/.agents/skills/frontend-design/SKILL.md +4 -5
  161. package/corpus/templates/mail/.agents/skills/turn-into-app/SKILL.md +18 -31
  162. package/corpus/templates/mail/AGENTS.md +5 -6
  163. package/corpus/templates/plan/.agents/skills/actions/SKILL.md +54 -488
  164. package/corpus/templates/plan/.agents/skills/actions/references/action-fields.md +136 -0
  165. package/corpus/templates/plan/.agents/skills/actions/references/examples.md +94 -0
  166. package/corpus/templates/plan/.agents/skills/actions/references/provider-apis.md +95 -0
  167. package/corpus/templates/plan/.agents/skills/create-skill/SKILL.md +9 -35
  168. package/corpus/templates/plan/.agents/skills/frontend-design/SKILL.md +4 -5
  169. package/corpus/templates/plan/.agents/skills/turn-into-app/SKILL.md +18 -31
  170. package/corpus/templates/plan/AGENTS.md +5 -14
  171. package/corpus/templates/plan/app/global.css +1 -0
  172. package/corpus/templates/plan/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
  173. package/corpus/templates/plan/changelog/2026-08-11-plan-no-longer-reloads-when-runtime-state-changes.md +6 -0
  174. package/corpus/templates/plan/server/ui-plan-html.ts +4 -1
  175. package/corpus/templates/plan/vite.config.ts +5 -0
  176. package/corpus/templates/slides/.agents/skills/actions/SKILL.md +54 -488
  177. package/corpus/templates/slides/.agents/skills/actions/references/action-fields.md +136 -0
  178. package/corpus/templates/slides/.agents/skills/actions/references/examples.md +94 -0
  179. package/corpus/templates/slides/.agents/skills/actions/references/provider-apis.md +95 -0
  180. package/corpus/templates/slides/.agents/skills/create-deck/SKILL.md +2 -2
  181. package/corpus/templates/slides/.agents/skills/create-skill/SKILL.md +9 -35
  182. package/corpus/templates/slides/.agents/skills/creative-context/SKILL.md +6 -3
  183. package/corpus/templates/slides/.agents/skills/deck-management/SKILL.md +6 -1
  184. package/corpus/templates/slides/.agents/skills/frontend-design/SKILL.md +4 -5
  185. package/corpus/templates/slides/.agents/skills/image-generation-via-a2a/SKILL.md +3 -2
  186. package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +3 -0
  187. package/corpus/templates/slides/.agents/skills/slide-images/SKILL.md +3 -3
  188. package/corpus/templates/slides/.agents/skills/turn-into-app/SKILL.md +18 -31
  189. package/corpus/templates/slides/AGENTS.md +33 -35
  190. package/corpus/templates/slides/actions/add-deck.ts +2 -0
  191. package/corpus/templates/slides/actions/add-slide.ts +15 -1
  192. package/corpus/templates/slides/actions/create-deck.ts +18 -6
  193. package/corpus/templates/slides/actions/get-deck-reference-context.ts +2 -2
  194. package/corpus/templates/slides/actions/get-deck.ts +83 -7
  195. package/corpus/templates/slides/actions/import-file.ts +2 -1
  196. package/corpus/templates/slides/actions/patch-deck.ts +165 -9
  197. package/corpus/templates/slides/actions/save-deck.ts +24 -1
  198. package/corpus/templates/slides/actions/update-slide.ts +1 -1
  199. package/corpus/templates/slides/app/components/comments/SlideCommentsPanel.tsx +2 -2
  200. package/corpus/templates/slides/app/components/deck/DeckCard.tsx +1 -23
  201. package/corpus/templates/slides/app/components/design-system/DesignSystemCard.tsx +2 -2
  202. package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +6 -6
  203. package/corpus/templates/slides/app/components/editor/AnimationsPanel.tsx +3 -3
  204. package/corpus/templates/slides/app/components/editor/DeckEditorSkeleton.tsx +4 -4
  205. package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +1 -1
  206. package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +432 -668
  207. package/corpus/templates/slides/app/components/editor/ExportMenu.tsx +296 -259
  208. package/corpus/templates/slides/app/components/editor/GeneratingSlidePreview.tsx +1 -1
  209. package/corpus/templates/slides/app/components/editor/GoogleDriveConnectionCta.tsx +13 -1
  210. package/corpus/templates/slides/app/components/editor/NewDeckReferenceStep.tsx +56 -174
  211. package/corpus/templates/slides/app/components/editor/PromptDialog.tsx +241 -116
  212. package/corpus/templates/slides/app/components/editor/SlideContextToolbar.tsx +1 -1
  213. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +42 -14
  214. package/corpus/templates/slides/app/components/editor/SpeakerNotesPanel.tsx +6 -12
  215. package/corpus/templates/slides/app/components/editor/editor-command-model.ts +35 -0
  216. package/corpus/templates/slides/app/components/layout/AgentWorkIndicator.tsx +1 -1
  217. package/corpus/templates/slides/app/components/layout/Layout.tsx +34 -35
  218. package/corpus/templates/slides/app/components/layout/Sidebar.tsx +8 -10
  219. package/corpus/templates/slides/app/components/layout/layout-route-policy.ts +2 -5
  220. package/corpus/templates/slides/app/components/onboarding/FirstDeckOnboardingFlow.tsx +45 -40
  221. package/corpus/templates/slides/app/components/presentation/PresentationView.tsx +63 -16
  222. package/corpus/templates/slides/app/context/DeckContext.tsx +2 -1
  223. package/corpus/templates/slides/app/global.css +76 -1
  224. package/corpus/templates/slides/app/hooks/use-generating-slide-preview.ts +25 -3
  225. package/corpus/templates/slides/app/i18n/en-US.ts +2 -0
  226. package/corpus/templates/slides/app/lib/create-deck-generation.ts +52 -23
  227. package/corpus/templates/slides/app/lib/recent-references.ts +23 -1
  228. package/corpus/templates/slides/app/lib/slide-animation-elements.ts +104 -3
  229. package/corpus/templates/slides/app/pages/DeckEditor.tsx +17 -33
  230. package/corpus/templates/slides/app/pages/DesignSystems.tsx +2 -2
  231. package/corpus/templates/slides/app/pages/Index.tsx +315 -151
  232. package/corpus/templates/slides/app/root.tsx +43 -0
  233. package/corpus/templates/slides/changelog/2026-08-10-ai-editing-avatar-badge.md +6 -0
  234. package/corpus/templates/slides/changelog/2026-08-10-generated-decks-keep-a-clear-human-readable-title.md +6 -0
  235. package/corpus/templates/slides/changelog/2026-08-10-new-deck-creation-now-shows-progress-opens-the-editor-direct.md +6 -0
  236. package/corpus/templates/slides/changelog/2026-08-10-presentation-reveals-now-follow-valid-targets.md +6 -0
  237. package/corpus/templates/slides/changelog/2026-08-10-slides-editing-controls-are-consolidated-into-one-focused-me.md +6 -0
  238. package/corpus/templates/slides/changelog/2026-08-10-slides-now-verify-and-restyle-every-imported-slide-in-one-pa.md +6 -0
  239. package/corpus/templates/slides/changelog/2026-08-10-slides-only-suggests-a-google-connection-for-relevant-reques.md +6 -0
  240. package/corpus/templates/slides/changelog/2026-08-10-the-google-slides-import-option-is-now-labeled-slides.md +6 -0
  241. package/corpus/templates/slides/changelog/2026-08-11-faster-slides-chat-deck-reads.md +6 -0
  242. package/corpus/templates/slides/changelog/2026-08-11-slides-chat-can-read-one-slide-without-loading-the-full-deck.md +6 -0
  243. package/corpus/templates/slides/changelog/2026-08-11-slides-clearly-indicate-when-an-ai-agent-is-editing-alongsid.md +6 -0
  244. package/corpus/templates/slides/package.json +1 -0
  245. package/corpus/templates/slides/server/lib/chat-attachments.ts +1 -1
  246. package/corpus/templates/slides/server/lib/validate-slide-animations.ts +163 -0
  247. package/corpus/templates/slides/server/plugins/agent-chat.ts +8 -5
  248. package/corpus/templates/slides/shared/api.ts +47 -15
  249. package/corpus/templates/slides/shared/deck-title.ts +135 -0
  250. package/corpus/templates/tasks/.agents/skills/actions/SKILL.md +54 -488
  251. package/corpus/templates/tasks/.agents/skills/actions/references/action-fields.md +136 -0
  252. package/corpus/templates/tasks/.agents/skills/actions/references/examples.md +94 -0
  253. package/corpus/templates/tasks/.agents/skills/actions/references/provider-apis.md +95 -0
  254. package/corpus/templates/tasks/.agents/skills/agent-watchdog/SKILL.md +1 -0
  255. package/corpus/templates/tasks/.agents/skills/create-skill/SKILL.md +9 -35
  256. package/corpus/templates/tasks/.agents/skills/efficient-fable/SKILL.md +1 -0
  257. package/corpus/templates/tasks/.agents/skills/efficient-frontier/SKILL.md +1 -0
  258. package/corpus/templates/tasks/.agents/skills/frontend-design/SKILL.md +4 -5
  259. package/corpus/templates/tasks/.agents/skills/plan-arbiter/SKILL.md +1 -0
  260. package/corpus/templates/tasks/.agents/skills/plow-ahead/SKILL.md +1 -0
  261. package/corpus/templates/tasks/.agents/skills/quick-recap/SKILL.md +1 -0
  262. package/corpus/templates/tasks/.agents/skills/read-the-damn-docs/SKILL.md +1 -0
  263. package/corpus/templates/tasks/.agents/skills/stay-within-limits/SKILL.md +1 -0
  264. package/corpus/templates/tasks/.agents/skills/turn-into-app/SKILL.md +18 -31
  265. package/corpus/templates/tasks/AGENTS.md +5 -20
  266. package/corpus/templates/tasks/app/components/tasks/TaskListRow.tsx +4 -1
  267. package/dist/agent/engine/ai-sdk-engine.js +1 -1
  268. package/dist/agent/production-agent.d.ts +21 -1
  269. package/dist/agent/production-agent.js +505 -355
  270. package/dist/agent/run-manager.js +156 -14
  271. package/dist/agent/run-store.d.ts +11 -10
  272. package/dist/agent/run-store.js +17 -13
  273. package/dist/agent/tool-approval-store.d.ts +18 -0
  274. package/dist/agent/tool-approval-store.js +122 -0
  275. package/dist/agent/types.d.ts +1 -1
  276. package/dist/cli/code-agent-executor.js +11 -2
  277. package/dist/client/AgentPanel.js +31 -6
  278. package/dist/client/AssistantChat.d.ts +9 -4
  279. package/dist/client/AssistantChat.js +221 -149
  280. package/dist/client/active-run-state.d.ts +9 -1
  281. package/dist/client/active-run-state.js +34 -3
  282. package/dist/client/agent-chat/index.d.ts +1 -1
  283. package/dist/client/agent-chat-adapter.d.ts +8 -0
  284. package/dist/client/agent-chat-adapter.js +125 -28
  285. package/dist/client/agent-chat.d.ts +1 -1
  286. package/dist/client/chat/markdown-renderer.js +14 -2
  287. package/dist/client/chat/message-components.d.ts +13 -3
  288. package/dist/client/chat/message-components.js +57 -52
  289. package/dist/client/chat/run-recovery.d.ts +1 -0
  290. package/dist/client/chat/run-recovery.js +8 -0
  291. package/dist/client/chat/tool-call-display.d.ts +5 -5
  292. package/dist/client/chat/tool-call-display.js +9 -212
  293. package/dist/client/chat-first/apps-rail.js +3 -3
  294. package/dist/client/chat-first/browser-pane.js +4 -1
  295. package/dist/client/chat-first/chat-history.d.ts +3 -1
  296. package/dist/client/chat-first/chat-history.js +7 -4
  297. package/dist/client/chat-first/surface-tabs.d.ts +1 -1
  298. package/dist/client/chat-first/surface-tabs.js +52 -41
  299. package/dist/client/chat-first/types.d.ts +3 -0
  300. package/dist/client/chat-first.d.ts +10 -0
  301. package/dist/client/chat-first.js +37 -2
  302. package/dist/client/components/ui/message-scroller.js +4 -1
  303. package/dist/client/i18n.js +3 -1
  304. package/dist/client/resources/McpConnectionSuggestion.js +9 -1
  305. package/dist/client/sse-event-processor.d.ts +4 -2
  306. package/dist/client/sse-event-processor.js +46 -6
  307. package/dist/client/use-chat-models.js +156 -80
  308. package/dist/client/use-run-stuck-detection.d.ts +2 -0
  309. package/dist/client/use-run-stuck-detection.js +85 -9
  310. package/dist/collab/awareness.d.ts +2 -2
  311. package/dist/collab/routes.d.ts +1 -1
  312. package/dist/collab/struct-routes.d.ts +1 -1
  313. package/dist/integrations/adapters/slack.d.ts +0 -4
  314. package/dist/integrations/adapters/slack.js +6 -30
  315. package/dist/integrations/catalog.js +1 -1
  316. package/dist/integrations/pending-tasks-store.d.ts +0 -8
  317. package/dist/integrations/pending-tasks-store.js +0 -21
  318. package/dist/integrations/slack-manifest.d.ts +2 -2
  319. package/dist/integrations/slack-manifest.js +0 -3
  320. package/dist/integrations/webhook-handler.js +1 -1
  321. package/dist/mcp/screen-memory-stdio.d.ts +7 -7
  322. package/dist/observability/routes.d.ts +3 -3
  323. package/dist/provider-api/actions/custom-provider-registration.d.ts +4 -4
  324. package/dist/provider-api/actions/provider-api.d.ts +8 -8
  325. package/dist/scripts/docs/source-search.js +2 -2
  326. package/dist/server/agent-chat/framework-prompts.js +7 -2
  327. package/dist/server/agent-chat/prompt-resources.js +2 -2
  328. package/dist/server/agent-chat/skill-frontmatter.d.ts +31 -2
  329. package/dist/server/agent-chat/skill-frontmatter.js +41 -15
  330. package/dist/server/agent-chat-plugin.js +3 -3
  331. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  332. package/dist/server/agents-bundle.d.ts +16 -19
  333. package/dist/server/agents-bundle.js +19 -35
  334. package/dist/server/auth.js +262 -31
  335. package/dist/server/better-auth-instance.d.ts +1 -0
  336. package/dist/server/better-auth-instance.js +17 -2
  337. package/dist/server/onboarding-html.js +56 -9
  338. package/dist/server/prompts/framework-core-compact.d.ts +6 -1
  339. package/dist/server/prompts/framework-core-compact.js +12 -9
  340. package/dist/server/prompts/framework-core.d.ts +6 -1
  341. package/dist/server/prompts/framework-core.js +11 -9
  342. package/dist/server/prompts/index.d.ts +1 -1
  343. package/dist/server/prompts/index.js +1 -1
  344. package/dist/server/prompts/shared-rules.d.ts +15 -11
  345. package/dist/server/prompts/shared-rules.js +17 -13
  346. package/dist/server/realtime-token.d.ts +1 -1
  347. package/dist/server/transcribe-voice.d.ts +1 -1
  348. package/dist/shared/reasoning-effort.d.ts +8 -8
  349. package/dist/shared/reasoning-effort.js +10 -10
  350. package/dist/shared/streaming-text-smoothing.js +41 -11
  351. package/dist/styles/agent-native.css +19 -32
  352. package/dist/templates/chat/.agents/skills/actions/SKILL.md +54 -488
  353. package/dist/templates/chat/.agents/skills/actions/references/action-fields.md +136 -0
  354. package/dist/templates/chat/.agents/skills/actions/references/examples.md +94 -0
  355. package/dist/templates/chat/.agents/skills/actions/references/provider-apis.md +95 -0
  356. package/dist/templates/chat/.agents/skills/create-skill/SKILL.md +9 -35
  357. package/dist/templates/chat/.agents/skills/frontend-design/SKILL.md +4 -5
  358. package/dist/templates/chat/.agents/skills/turn-into-app/SKILL.md +18 -31
  359. package/dist/templates/chat/AGENTS.md +32 -80
  360. package/dist/templates/chat/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
  361. package/dist/templates/default/.agents/skills/actions/SKILL.md +54 -488
  362. package/dist/templates/default/.agents/skills/actions/references/action-fields.md +136 -0
  363. package/dist/templates/default/.agents/skills/actions/references/examples.md +94 -0
  364. package/dist/templates/default/.agents/skills/actions/references/provider-apis.md +95 -0
  365. package/dist/templates/default/.agents/skills/create-skill/SKILL.md +9 -35
  366. package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +4 -5
  367. package/dist/templates/default/.agents/skills/turn-into-app/SKILL.md +18 -31
  368. package/dist/templates/headless/.agents/skills/actions/SKILL.md +54 -488
  369. package/dist/templates/headless/.agents/skills/actions/references/action-fields.md +136 -0
  370. package/dist/templates/headless/.agents/skills/actions/references/examples.md +94 -0
  371. package/dist/templates/headless/.agents/skills/actions/references/provider-apis.md +95 -0
  372. package/dist/templates/headless/.agents/skills/turn-into-app/SKILL.md +18 -31
  373. package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +54 -488
  374. package/dist/templates/workspace-core/.agents/skills/actions/references/action-fields.md +136 -0
  375. package/dist/templates/workspace-core/.agents/skills/actions/references/examples.md +94 -0
  376. package/dist/templates/workspace-core/.agents/skills/actions/references/provider-apis.md +95 -0
  377. package/dist/templates/workspace-core/.agents/skills/adding-workspace-apps/SKILL.md +1 -0
  378. package/dist/templates/workspace-core/.agents/skills/agent-page/SKILL.md +1 -0
  379. package/dist/templates/workspace-core/.agents/skills/create-skill/SKILL.md +9 -35
  380. package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +4 -5
  381. package/dist/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +21 -29
  382. package/dist/templates/workspace-core/.agents/skills/turn-into-app/SKILL.md +18 -31
  383. package/dist/templates/workspace-core/.agents/skills/workspace-conventions/SKILL.md +7 -17
  384. package/dist/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +3 -3
  385. package/dist/templates/workspace-core/AGENTS.md +7 -16
  386. package/docs/content/messaging.mdx +6 -7
  387. package/docs/content/template-chat.mdx +1 -1
  388. package/package.json +2 -2
  389. package/src/templates/chat/.agents/skills/actions/SKILL.md +54 -488
  390. package/src/templates/chat/.agents/skills/actions/references/action-fields.md +136 -0
  391. package/src/templates/chat/.agents/skills/actions/references/examples.md +94 -0
  392. package/src/templates/chat/.agents/skills/actions/references/provider-apis.md +95 -0
  393. package/src/templates/chat/.agents/skills/create-skill/SKILL.md +9 -35
  394. package/src/templates/chat/.agents/skills/frontend-design/SKILL.md +4 -5
  395. package/src/templates/chat/.agents/skills/turn-into-app/SKILL.md +18 -31
  396. package/src/templates/chat/AGENTS.md +32 -80
  397. package/src/templates/chat/changelog/2026-08-10-full-page-chat-now-uses-the-available-width-up-to-1000px-for.md +6 -0
  398. package/src/templates/default/.agents/skills/actions/SKILL.md +54 -488
  399. package/src/templates/default/.agents/skills/actions/references/action-fields.md +136 -0
  400. package/src/templates/default/.agents/skills/actions/references/examples.md +94 -0
  401. package/src/templates/default/.agents/skills/actions/references/provider-apis.md +95 -0
  402. package/src/templates/default/.agents/skills/create-skill/SKILL.md +9 -35
  403. package/src/templates/default/.agents/skills/frontend-design/SKILL.md +4 -5
  404. package/src/templates/default/.agents/skills/turn-into-app/SKILL.md +18 -31
  405. package/src/templates/headless/.agents/skills/actions/SKILL.md +54 -488
  406. package/src/templates/headless/.agents/skills/actions/references/action-fields.md +136 -0
  407. package/src/templates/headless/.agents/skills/actions/references/examples.md +94 -0
  408. package/src/templates/headless/.agents/skills/actions/references/provider-apis.md +95 -0
  409. package/src/templates/headless/.agents/skills/turn-into-app/SKILL.md +18 -31
  410. package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +54 -488
  411. package/src/templates/workspace-core/.agents/skills/actions/references/action-fields.md +136 -0
  412. package/src/templates/workspace-core/.agents/skills/actions/references/examples.md +94 -0
  413. package/src/templates/workspace-core/.agents/skills/actions/references/provider-apis.md +95 -0
  414. package/src/templates/workspace-core/.agents/skills/adding-workspace-apps/SKILL.md +1 -0
  415. package/src/templates/workspace-core/.agents/skills/agent-page/SKILL.md +1 -0
  416. package/src/templates/workspace-core/.agents/skills/create-skill/SKILL.md +9 -35
  417. package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +4 -5
  418. package/src/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +21 -29
  419. package/src/templates/workspace-core/.agents/skills/turn-into-app/SKILL.md +18 -31
  420. package/src/templates/workspace-core/.agents/skills/workspace-conventions/SKILL.md +7 -17
  421. package/src/templates/workspace-core/.agents/skills/writing-agent-instructions/SKILL.md +3 -3
  422. package/src/templates/workspace-core/AGENTS.md +7 -16
@@ -592,7 +592,12 @@ function usesPrometheusPresentation(panel: SqlPanel): boolean {
592
592
  return panel.source === "prometheus" || panel.source === "demo";
593
593
  }
594
594
 
595
- function formatSeriesLabelForPanel(panel: SqlPanel, value: string): string {
595
+ export function formatSeriesLabelForPanel(
596
+ panel: SqlPanel,
597
+ value: string,
598
+ ): string {
599
+ const alias = panel.config?.seriesLabels?.[value]?.trim();
600
+ if (alias) return alias;
596
601
  return usesPrometheusPresentation(panel) ? formatSeriesLabel(value) : value;
597
602
  }
598
603
 
@@ -1241,6 +1246,7 @@ interface SqlChartProps {
1241
1246
  loadData?: boolean;
1242
1247
  reportScreenshot?: boolean;
1243
1248
  onExportCsvChange?: (handler: (() => void) | null) => void;
1249
+ onCopyTableChange?: (handler: (() => Promise<void>) | null) => void;
1244
1250
  /** Dashboard/panel state sent to slot-backed extension boxes. */
1245
1251
  extensionContext?: Record<string, unknown> | null;
1246
1252
  }
@@ -1251,6 +1257,7 @@ export function SqlChart({
1251
1257
  loadData = true,
1252
1258
  reportScreenshot = false,
1253
1259
  onExportCsvChange,
1260
+ onCopyTableChange,
1254
1261
  extensionContext,
1255
1262
  }: SqlChartProps) {
1256
1263
  const t = useT();
@@ -1426,6 +1433,7 @@ export function SqlChart({
1426
1433
  rows={rows}
1427
1434
  panel={panel}
1428
1435
  onExportCsvChange={onExportCsvChange}
1436
+ onCopyTableChange={onCopyTableChange}
1429
1437
  />,
1430
1438
  );
1431
1439
  }
@@ -1605,21 +1613,68 @@ function MetricRenderer({
1605
1613
  );
1606
1614
  }
1607
1615
 
1608
- function formatCell(value: unknown, format: ColumnFormat | undefined): string {
1616
+ function numericTableValue(value: unknown): number | null {
1617
+ if (typeof value === "number") return Number.isFinite(value) ? value : null;
1618
+ if (typeof value !== "string" || value.trim() === "") return null;
1619
+ const numeric = Number(value);
1620
+ return Number.isFinite(numeric) ? numeric : null;
1621
+ }
1622
+
1623
+ export type TableSort = {
1624
+ key: string;
1625
+ direction: "asc" | "desc";
1626
+ };
1627
+
1628
+ export function sortTableRows(
1629
+ rows: Record<string, unknown>[],
1630
+ sorts: TableSort[],
1631
+ ): Record<string, unknown>[] {
1632
+ if (sorts.length === 0) return rows;
1633
+
1634
+ return rows
1635
+ .map((row, index) => ({ row, index }))
1636
+ .sort((a, b) => {
1637
+ for (const sort of sorts) {
1638
+ const av = a.row[sort.key];
1639
+ const bv = b.row[sort.key];
1640
+ if (av == null && bv == null) continue;
1641
+ if (av == null) return 1;
1642
+ if (bv == null) return -1;
1643
+
1644
+ const an = numericTableValue(av);
1645
+ const bn = numericTableValue(bv);
1646
+ const comparison =
1647
+ an !== null && bn !== null
1648
+ ? an - bn
1649
+ : String(av).localeCompare(String(bv));
1650
+ if (comparison !== 0) {
1651
+ return sort.direction === "asc" ? comparison : -comparison;
1652
+ }
1653
+ }
1654
+ return a.index - b.index;
1655
+ })
1656
+ .map(({ row }) => row);
1657
+ }
1658
+
1659
+ export function formatCell(
1660
+ value: unknown,
1661
+ format: ColumnFormat | undefined,
1662
+ ): string {
1609
1663
  if (value == null) return "";
1610
- if (format === "number" && typeof value === "number") {
1611
- return value.toLocaleString();
1664
+ const numeric = numericTableValue(value);
1665
+ if (format === "number" && numeric !== null) {
1666
+ return numeric.toLocaleString();
1612
1667
  }
1613
- if (format === "currency" && typeof value === "number") {
1614
- return `$${value.toLocaleString()}`;
1668
+ if (format === "currency" && numeric !== null) {
1669
+ return `$${numeric.toLocaleString()}`;
1615
1670
  }
1616
- if (format === "percent" && typeof value === "number") {
1617
- const pct = value <= 1 && value >= -1 ? value * 100 : value;
1671
+ if (format === "percent" && numeric !== null) {
1672
+ const pct = numeric <= 1 && numeric >= -1 ? numeric * 100 : numeric;
1618
1673
  return `${pct.toFixed(2)}%`;
1619
1674
  }
1620
- if (format === "delta" && typeof value === "number") {
1621
- const sign = value > 0 ? "+" : "";
1622
- return `${sign}${value.toFixed(1)}%`;
1675
+ if (format === "delta" && numeric !== null) {
1676
+ const sign = numeric > 0 ? "+" : "";
1677
+ return `${sign}${numeric.toFixed(1)}%`;
1623
1678
  }
1624
1679
  if (format === "date") {
1625
1680
  const d = new Date(String(value));
@@ -1634,6 +1689,23 @@ function formatCell(value: unknown, format: ColumnFormat | undefined): string {
1634
1689
  return String(value);
1635
1690
  }
1636
1691
 
1692
+ function clipboardCell(value: string): string {
1693
+ return value.replace(/[\t\r\n]+/g, " ");
1694
+ }
1695
+
1696
+ export function buildTableClipboardText(
1697
+ columns: TableColumnConfig[],
1698
+ rows: Record<string, unknown>[],
1699
+ ): string {
1700
+ const tableRows = [
1701
+ columns.map((col) => col.label ?? col.key),
1702
+ ...rows.map((row) =>
1703
+ columns.map((col) => formatCell(row[col.key], col.format)),
1704
+ ),
1705
+ ];
1706
+ return tableRows.map((row) => row.map(clipboardCell).join("\t")).join("\n");
1707
+ }
1708
+
1637
1709
  export function safeDashboardLinkHref(value: unknown): string | null {
1638
1710
  if (typeof value !== "string") return null;
1639
1711
  const href = value.trim();
@@ -1653,13 +1725,14 @@ export function safeDashboardLinkHref(value: unknown): string | null {
1653
1725
  }
1654
1726
 
1655
1727
  function renderDeltaCell(value: unknown): ReactNode {
1656
- if (value == null || typeof value !== "number" || Number.isNaN(value)) {
1728
+ const numeric = numericTableValue(value);
1729
+ if (numeric === null) {
1657
1730
  return <span className="text-muted-foreground">-</span>;
1658
1731
  }
1659
- const sign = value > 0 ? "+" : "";
1660
- const text = `${sign}${value.toFixed(1)}%`;
1661
- const isPositive = value > 0;
1662
- const isNegative = value < 0;
1732
+ const sign = numeric > 0 ? "+" : "";
1733
+ const text = `${sign}${numeric.toFixed(1)}%`;
1734
+ const isPositive = numeric > 0;
1735
+ const isNegative = numeric < 0;
1663
1736
  const colorClass = isPositive
1664
1737
  ? "text-emerald-500"
1665
1738
  : isNegative
@@ -1670,7 +1743,7 @@ function renderDeltaCell(value: unknown): ReactNode {
1670
1743
  : isNegative
1671
1744
  ? IconTrendingDown
1672
1745
  : null;
1673
- const critical = Math.abs(value) > 30;
1746
+ const critical = Math.abs(numeric) > 30;
1674
1747
  return (
1675
1748
  <span
1676
1749
  className={`inline-flex items-center justify-end gap-1 ${colorClass}`}
@@ -1715,10 +1788,12 @@ function TableRenderer({
1715
1788
  rows,
1716
1789
  panel,
1717
1790
  onExportCsvChange,
1791
+ onCopyTableChange,
1718
1792
  }: {
1719
1793
  rows: Record<string, unknown>[];
1720
1794
  panel: SqlPanel;
1721
1795
  onExportCsvChange?: (handler: (() => void) | null) => void;
1796
+ onCopyTableChange?: (handler: (() => Promise<void>) | null) => void;
1722
1797
  }) {
1723
1798
  const t = useT();
1724
1799
  const config = panel.config;
@@ -1744,39 +1819,40 @@ function TableRenderer({
1744
1819
  return limit != null && rows.length > limit ? rows.slice(0, limit) : rows;
1745
1820
  }, [rows, config?.limit]);
1746
1821
 
1747
- const [sortKey, setSortKey] = useState<string | null>(null);
1748
- const [sortDir, setSortDir] = useState<"asc" | "desc">("desc");
1822
+ const [sortColumns, setSortColumns] = useState<TableSort[]>([]);
1749
1823
  const [page, setPage] = useState(0);
1750
1824
  const [pageSize, setPageSize] = useState(10);
1751
1825
 
1752
1826
  const sortedRows = useMemo(() => {
1753
- if (!sortable || !sortKey) return limitedRows;
1754
- const sorted = [...limitedRows].sort((a, b) => {
1755
- const av = a[sortKey];
1756
- const bv = b[sortKey];
1757
- if (av == null && bv == null) return 0;
1758
- if (av == null) return 1;
1759
- if (bv == null) return -1;
1760
- if (typeof av === "number" && typeof bv === "number") {
1761
- return av - bv;
1762
- }
1763
- return String(av).localeCompare(String(bv));
1764
- });
1765
- if (sortDir === "desc") sorted.reverse();
1766
- return sorted;
1767
- }, [limitedRows, sortKey, sortDir, sortable]);
1827
+ return sortable ? sortTableRows(limitedRows, sortColumns) : limitedRows;
1828
+ }, [limitedRows, sortColumns, sortable]);
1768
1829
 
1769
1830
  const pageCount = Math.ceil(sortedRows.length / pageSize);
1770
1831
  const displayRows = sortedRows.slice(page * pageSize, (page + 1) * pageSize);
1771
1832
 
1772
- const handleHeaderClick = (key: string) => {
1833
+ const handleHeaderClick = (key: string, shiftKey: boolean) => {
1773
1834
  if (!sortable) return;
1774
- if (sortKey === key) {
1775
- setSortDir(sortDir === "asc" ? "desc" : "asc");
1776
- } else {
1777
- setSortKey(key);
1778
- setSortDir("desc");
1779
- }
1835
+ setSortColumns((current) => {
1836
+ const index = current.findIndex((sort) => sort.key === key);
1837
+ if (!shiftKey) {
1838
+ const existing = index >= 0 ? current[index] : undefined;
1839
+ return [
1840
+ {
1841
+ key,
1842
+ direction: existing?.direction === "desc" ? "asc" : "desc",
1843
+ },
1844
+ ];
1845
+ }
1846
+ if (index < 0) return [...current, { key, direction: "desc" }];
1847
+ return current.map((sort, sortIndex) =>
1848
+ sortIndex === index
1849
+ ? {
1850
+ ...sort,
1851
+ direction: sort.direction === "desc" ? "asc" : "desc",
1852
+ }
1853
+ : sort,
1854
+ );
1855
+ });
1780
1856
  setPage(0);
1781
1857
  };
1782
1858
 
@@ -1801,10 +1877,23 @@ function TableRenderer({
1801
1877
  URL.revokeObjectURL(url);
1802
1878
  }, [columns, panel.id, sortedRows]);
1803
1879
 
1880
+ const handleCopyTable = useCallback(async () => {
1881
+ if (!navigator.clipboard?.writeText) {
1882
+ throw new Error("Clipboard unavailable");
1883
+ }
1884
+ await navigator.clipboard.writeText(
1885
+ buildTableClipboardText(columns, sortedRows),
1886
+ );
1887
+ }, [columns, sortedRows]);
1888
+
1804
1889
  useEffect(() => {
1805
1890
  onExportCsvChange?.(handleExportCsv);
1806
- return () => onExportCsvChange?.(null);
1807
- }, [handleExportCsv, onExportCsvChange]);
1891
+ onCopyTableChange?.(handleCopyTable);
1892
+ return () => {
1893
+ onExportCsvChange?.(null);
1894
+ onCopyTableChange?.(null);
1895
+ };
1896
+ }, [handleCopyTable, handleExportCsv, onCopyTableChange, onExportCsvChange]);
1808
1897
 
1809
1898
  return (
1810
1899
  <div className={`space-y-1 ${TABLE_PANEL_MIN_HEIGHT_CLASS}`}>
@@ -1814,22 +1903,37 @@ function TableRenderer({
1814
1903
  <tr className="border-b border-border">
1815
1904
  {columns.map((col) => {
1816
1905
  const label = col.label ?? col.key;
1817
- const isSorted = sortKey === col.key;
1906
+ const sort = sortColumns.find((item) => item.key === col.key);
1907
+ const isSorted = sort !== undefined;
1818
1908
  return (
1819
1909
  <th
1820
1910
  key={col.key}
1911
+ aria-sort={
1912
+ sort
1913
+ ? sort.direction === "asc"
1914
+ ? "ascending"
1915
+ : "descending"
1916
+ : "none"
1917
+ }
1821
1918
  className={`text-left py-1.5 px-2 font-medium text-muted-foreground whitespace-nowrap ${
1822
1919
  sortable
1823
1920
  ? "cursor-pointer select-none hover:text-foreground"
1824
1921
  : ""
1825
1922
  }`}
1826
- onClick={() => handleHeaderClick(col.key)}
1923
+ onClick={(event) =>
1924
+ handleHeaderClick(col.key, event.shiftKey)
1925
+ }
1926
+ title={
1927
+ sortable
1928
+ ? t("sqlDashboard.multiColumnSortHelp")
1929
+ : undefined
1930
+ }
1827
1931
  >
1828
1932
  <span className="inline-flex items-center gap-1">
1829
1933
  {label}
1830
1934
  {sortable &&
1831
1935
  (isSorted ? (
1832
- sortDir === "asc" ? (
1936
+ sort?.direction === "asc" ? (
1833
1937
  <IconSortAscending className="h-3 w-3" />
1834
1938
  ) : (
1835
1939
  <IconSortDescending className="h-3 w-3" />
@@ -235,7 +235,7 @@
235
235
  [data-agent-empty-state="centered"]
236
236
  .agent-plan-mode-callout {
237
237
  width: 100%;
238
- max-width: min(684px, 90%);
238
+ max-width: min(750px, 100%);
239
239
  padding: 0;
240
240
  }
241
241
 
@@ -673,6 +673,8 @@ const enUS = {
673
673
  refresh: "Refresh",
674
674
  refreshing: "Refreshing...",
675
675
  downloadCsv: "Download CSV",
676
+ copyTable: "Copy table",
677
+ multiColumnSortHelp: "Click to sort. Shift-click to add another sort.",
676
678
  exportToGoogleSheets: "Export to Google Sheets",
677
679
  exportingToGoogleSheets: "Exporting to Google Sheets...",
678
680
  googleSheetsExported: "Exported to Google Sheets",
@@ -688,6 +690,7 @@ const enUS = {
688
690
  copied: "Copied",
689
691
  copy: "Copy",
690
692
  couldNotCopySql: "Couldn't copy SQL",
693
+ couldNotCopyTable: "Couldn't copy table",
691
694
  failedToFormatSql: "Failed to format SQL",
692
695
  close: "Close",
693
696
  save: "Save",
@@ -7142,6 +7145,7 @@ const translatedAnalyticsDebtTranslations = {
7142
7145
  copyResolvedSql: "复制解析 SQL",
7143
7146
  copySql: "复制 SQL",
7144
7147
  couldNotCopySql: "无法复制 SQL",
7148
+ couldNotCopyTable: "无法复制表格",
7145
7149
  dashboardActions: "仪表板详细信息和操作",
7146
7150
  deletePanelTitle: "删除面板?",
7147
7151
  deletePermanentlyTitle: "永久删除?",
@@ -7154,6 +7158,8 @@ const translatedAnalyticsDebtTranslations = {
7154
7158
  discardChanges: "放弃更改",
7155
7159
  dismissDemoIntro: "关闭演示介绍",
7156
7160
  downloadCsv: "下载CSV",
7161
+ copyTable: "复制表格",
7162
+ multiColumnSortHelp: "点击排序。按住 Shift 点击可添加另一个排序。",
7157
7163
  exportToGoogleSheets: "导出到 Google Sheets",
7158
7164
  exportingToGoogleSheets: "正在导出到 Google Sheets...",
7159
7165
  googleSheetsExported: "已导出到 Google Sheets",
@@ -7382,6 +7388,7 @@ const translatedAnalyticsDebtTranslations = {
7382
7388
  copyResolvedSql: "Copia resuelta SQL",
7383
7389
  copySql: "Copiar SQL",
7384
7390
  couldNotCopySql: "No se pudo copiar SQL",
7391
+ couldNotCopyTable: "No se pudo copiar la tabla",
7385
7392
  dashboardActions: "Detalles y acciones del panel",
7386
7393
  deletePanelTitle: "¿Eliminar panel?",
7387
7394
  deletePermanentlyTitle: "¿Eliminar permanentemente?",
@@ -7394,6 +7401,9 @@ const translatedAnalyticsDebtTranslations = {
7394
7401
  discardChanges: "Descartar cambios",
7395
7402
  dismissDemoIntro: "Descartar la introducción de la demostración",
7396
7403
  downloadCsv: "Descargar CSV",
7404
+ copyTable: "Copiar tabla",
7405
+ multiColumnSortHelp:
7406
+ "Haz clic para ordenar. Mantén pulsada la tecla Mayús y haz clic para añadir otro orden.",
7397
7407
  exportToGoogleSheets: "Exportar a Google Sheets",
7398
7408
  exportingToGoogleSheets: "Exportando a Google Sheets...",
7399
7409
  googleSheetsExported: "Exportado a Google Sheets",
@@ -7628,6 +7638,7 @@ const translatedAnalyticsDebtTranslations = {
7628
7638
  copyResolvedSql: "Copie résolue SQL",
7629
7639
  copySql: "Copier SQL",
7630
7640
  couldNotCopySql: "Impossible de copier SQL",
7641
+ couldNotCopyTable: "Impossible de copier le tableau",
7631
7642
  dashboardActions: "Détails et actions du tableau de bord",
7632
7643
  deletePanelTitle: "Supprimer le panneau ?",
7633
7644
  deletePermanentlyTitle: "Supprimer définitivement ?",
@@ -7640,6 +7651,9 @@ const translatedAnalyticsDebtTranslations = {
7640
7651
  discardChanges: "Ignorer les modifications",
7641
7652
  dismissDemoIntro: "Ignorer l'intro de la démo",
7642
7653
  downloadCsv: "Télécharger CSV",
7654
+ copyTable: "Copier le tableau",
7655
+ multiColumnSortHelp:
7656
+ "Cliquez pour trier. Maj-cliquez pour ajouter un autre tri.",
7643
7657
  exportToGoogleSheets: "Exporter vers Google Sheets",
7644
7658
  exportingToGoogleSheets: "Exportation vers Google Sheets...",
7645
7659
  googleSheetsExported: "Exporté vers Google Sheets",
@@ -7876,6 +7890,7 @@ const translatedAnalyticsDebtTranslations = {
7876
7890
  copyResolvedSql: "Kopieren Sie SQL aufgelöst",
7877
7891
  copySql: "Kopieren Sie SQL",
7878
7892
  couldNotCopySql: "SQL konnte nicht kopiert werden",
7893
+ couldNotCopyTable: "Tabelle konnte nicht kopiert werden",
7879
7894
  dashboardActions: "Dashboard-Details und Aktionen",
7880
7895
  deletePanelTitle: "Panel löschen?",
7881
7896
  deletePermanentlyTitle: "Endgültig löschen?",
@@ -7888,6 +7903,9 @@ const translatedAnalyticsDebtTranslations = {
7888
7903
  discardChanges: "Änderungen verwerfen",
7889
7904
  dismissDemoIntro: "Demo-Intro schließen",
7890
7905
  downloadCsv: "Laden Sie CSV herunter",
7906
+ copyTable: "Tabelle kopieren",
7907
+ multiColumnSortHelp:
7908
+ "Zum Sortieren klicken. Mit Umschalt-Klick eine weitere Sortierung hinzufügen.",
7891
7909
  exportToGoogleSheets: "Nach Google Sheets exportieren",
7892
7910
  exportingToGoogleSheets: "Export nach Google Sheets...",
7893
7911
  googleSheetsExported: "Nach Google Sheets exportiert",
@@ -8117,6 +8135,7 @@ const translatedAnalyticsDebtTranslations = {
8117
8135
  copyResolvedSql: "解決された SQL をコピーします",
8118
8136
  copySql: "SQLをコピーする",
8119
8137
  couldNotCopySql: "SQLをコピーできませんでした",
8138
+ couldNotCopyTable: "テーブルをコピーできませんでした",
8120
8139
  dashboardActions: "ダッシュボードの詳細とアクション",
8121
8140
  deletePanelTitle: "パネルを削除しますか?",
8122
8141
  deletePermanentlyTitle: "永久に削除しますか?",
@@ -8129,6 +8148,9 @@ const translatedAnalyticsDebtTranslations = {
8129
8148
  discardChanges: "変更を破棄する",
8130
8149
  dismissDemoIntro: "デモのイントロを閉じる",
8131
8150
  downloadCsv: "CSVをダウンロード",
8151
+ copyTable: "テーブルをコピー",
8152
+ multiColumnSortHelp:
8153
+ "クリックして並べ替え。Shiftキーを押しながらクリックすると別の並べ替えを追加できます。",
8132
8154
  exportToGoogleSheets: "Google スプレッドシートにエクスポート",
8133
8155
  exportingToGoogleSheets: "Google スプレッドシートにエクスポート中...",
8134
8156
  googleSheetsExported: "Google スプレッドシートにエクスポートしました",
@@ -8357,6 +8379,7 @@ const translatedAnalyticsDebtTranslations = {
8357
8379
  copyResolvedSql: "해결된 SQL 복사",
8358
8380
  copySql: "SQL 복사",
8359
8381
  couldNotCopySql: "SQL을 복사할 수 없습니다.",
8382
+ couldNotCopyTable: "표를 복사할 수 없습니다.",
8360
8383
  dashboardActions: "대시보드 세부정보 및 작업",
8361
8384
  deletePanelTitle: "패널을 삭제하시겠습니까?",
8362
8385
  deletePermanentlyTitle: "영구적으로 삭제하시겠습니까?",
@@ -8369,6 +8392,9 @@ const translatedAnalyticsDebtTranslations = {
8369
8392
  discardChanges: "변경사항 취소",
8370
8393
  dismissDemoIntro: "데모 소개 닫기",
8371
8394
  downloadCsv: "CSV 다운로드",
8395
+ copyTable: "표 복사",
8396
+ multiColumnSortHelp:
8397
+ "클릭하여 정렬합니다. Shift 키를 누른 채 클릭하면 다른 정렬을 추가합니다.",
8372
8398
  exportToGoogleSheets: "Google Sheets로 내보내기",
8373
8399
  exportingToGoogleSheets: "Google Sheets로 내보내는 중...",
8374
8400
  googleSheetsExported: "Google Sheets로 내보냈습니다",
@@ -8601,6 +8627,7 @@ const translatedAnalyticsDebtTranslations = {
8601
8627
  copyResolvedSql: "Cópia resolvida SQL",
8602
8628
  copySql: "Copie SQL",
8603
8629
  couldNotCopySql: "Não foi possível copiar SQL",
8630
+ couldNotCopyTable: "Não foi possível copiar a tabela",
8604
8631
  dashboardActions: "Detalhes e ações do painel",
8605
8632
  deletePanelTitle: "Excluir painel?",
8606
8633
  deletePermanentlyTitle: "Excluir permanentemente?",
@@ -8613,6 +8640,9 @@ const translatedAnalyticsDebtTranslations = {
8613
8640
  discardChanges: "Descartar alterações",
8614
8641
  dismissDemoIntro: "Ignorar introdução da demonstração",
8615
8642
  downloadCsv: "Baixar CSV",
8643
+ copyTable: "Copiar tabela",
8644
+ multiColumnSortHelp:
8645
+ "Clique para ordenar. Shift-clique para adicionar outra ordenação.",
8616
8646
  exportToGoogleSheets: "Exportar para o Google Sheets",
8617
8647
  exportingToGoogleSheets: "Exportando para o Google Sheets...",
8618
8648
  googleSheetsExported: "Exportado para o Google Sheets",
@@ -8842,6 +8872,7 @@ const translatedAnalyticsDebtTranslations = {
8842
8872
  copyResolvedSql: "प्रतिलिपि हल की गई SQL",
8843
8873
  copySql: "SQL कॉपी करें",
8844
8874
  couldNotCopySql: "SQL की प्रतिलिपि नहीं बनाई जा सकी",
8875
+ couldNotCopyTable: "तालिका कॉपी नहीं की जा सकी",
8845
8876
  dashboardActions: "डैशबोर्ड विवरण और क्रियाएँ",
8846
8877
  deletePanelTitle: "पैनल हटाएं?",
8847
8878
  deletePermanentlyTitle: "स्थायी रूप से हटाएँ?",
@@ -8854,6 +8885,9 @@ const translatedAnalyticsDebtTranslations = {
8854
8885
  discardChanges: "परिवर्तन त्यागें",
8855
8886
  dismissDemoIntro: "डेमो परिचय ख़ारिज करें",
8856
8887
  downloadCsv: "CSV डाउनलोड करें",
8888
+ copyTable: "तालिका कॉपी करें",
8889
+ multiColumnSortHelp:
8890
+ "क्रमित करने के लिए क्लिक करें। एक और क्रम जोड़ने के लिए Shift-क्लिक करें।",
8857
8891
  exportToGoogleSheets: "Google Sheets में निर्यात करें",
8858
8892
  exportingToGoogleSheets: "Google Sheets में निर्यात किया जा रहा है...",
8859
8893
  googleSheetsExported: "Google Sheets में निर्यात किया गया",
@@ -9081,6 +9115,7 @@ const translatedAnalyticsDebtTranslations = {
9081
9115
  copyResolvedSql: "تم حل النسخة SQL",
9082
9116
  copySql: "انسخ SQL",
9083
9117
  couldNotCopySql: "لا يمكن نسخ SQL",
9118
+ couldNotCopyTable: "تعذر نسخ الجدول",
9084
9119
  dashboardActions: "تفاصيل وإجراءات لوحة التحكم",
9085
9120
  deletePanelTitle: "هل تريد حذف اللوحة؟",
9086
9121
  deletePermanentlyTitle: "هل تريد الحذف نهائيًا؟",
@@ -9093,6 +9128,8 @@ const translatedAnalyticsDebtTranslations = {
9093
9128
  discardChanges: "تجاهل التغييرات",
9094
9129
  dismissDemoIntro: "رفض المقدمة التجريبية",
9095
9130
  downloadCsv: "تحميل CSV",
9131
+ copyTable: "نسخ الجدول",
9132
+ multiColumnSortHelp: "انقر للفرز. انقر مع الضغط على Shift لإضافة فرز آخر.",
9096
9133
  exportToGoogleSheets: "تصدير إلى Google Sheets",
9097
9134
  exportingToGoogleSheets: "جارٍ التصدير إلى Google Sheets...",
9098
9135
  googleSheetsExported: "تم التصدير إلى Google Sheets",
@@ -404,7 +404,7 @@ function PanelEditorContent({
404
404
  `For prometheus panels, sql is a JSON descriptor: {"promql":"rate(http_requests_total[5m])","mode":"range","range":"1h","step":"30s"}. mode defaults to "range"; range defaults to "1h"; step is auto if omitted. Returned rows have shape {timestamp, series, value} — set config.xKey="timestamp", config.yKey="value", and a single series in config.yKeys for clean charting. ` +
405
405
  `For program panels (arbitrary provider data joins/cohorts not expressible in the other sources), first save-data-program (or reuse an existing one via list-data-programs), then set sql to a JSON descriptor: {"programId":"<id>","params":{...}}. See the data-programs skill for the emit(rows, schema) contract and the Risk Meeting worked example. ` +
406
406
  `Native dashboard panels and Data Programs come first. Add an extension panel only when the user explicitly asks for a genuinely bespoke, one-off Custom Block for this dashboard and native panels cannot represent it faithfully. For a reusable/native capability call connect-builder instead. New agent-authored Custom Blocks use config.extensionId plus config.customBlock={authoredBy:"agent",intent:"one-off",scope:"dashboard",nativeGapReason:"custom-visualization"|"custom-interaction"|"custom-layout"|"other"}; never put prompt/customer text in that metadata. Use config.extensionSlotId only when the user explicitly asks for a personal/per-viewer slot; slot installs are per-user and automated report identities may have no install. ` +
407
- `Config is optional: { xKey, yKey, yKeys, yFormatter ('number'|'currency'|'percent'), rightYKeys, rightYFormatter, description, columns, pivot, limit, color, colors, stacked, legend, valueLabels }. For funnel panels, use config.xKey for the stage label, config.yKey for the non-negative count/value, and keep the SQL ORDER BY in the intended funnel order. ` +
407
+ `Config is optional: { xKey, yKey, yKeys, yFormatter ('number'|'currency'|'percent'), rightYKeys, rightYFormatter, seriesLabels (exact series key -> display label), description, columns, pivot, limit, color, colors, stacked, legend, valueLabels }. For funnel panels, use config.xKey for the stage label, config.yKey for the non-negative count/value, and keep the SQL ORDER BY in the intended funnel order. ` +
408
408
  `For line/area/bar series that share an x-axis but not a unit (a count next to a rate), put the smaller-unit series on a second y-axis with config.rightYKeys (a subset of yKeys) and an optional config.rightYFormatter — do not build an extension for a dual-axis chart. Use heatmap, callout, and section panels when their native contracts fit; do not create a Custom Block for a supported native panel. ` +
409
409
  `Chart legends render automatically; set config.legend=false only when the user explicitly asks to hide the legend. ` +
410
410
  `Use \`get-sql-dashboard.layout.groups[].rows[].rowNumber/panelIds\` to identify and verify visible rows. ` +
@@ -11,6 +11,7 @@ import {
11
11
  IconTrash,
12
12
  IconCode,
13
13
  IconDownload,
14
+ IconCopy,
14
15
  IconMessageCircle,
15
16
  IconBrandGoogle,
16
17
  IconArrowUpRight,
@@ -148,6 +149,9 @@ export function SqlChartCard({
148
149
  const [expanded, setExpanded] = useState(false);
149
150
  const [extRefreshKey, setExtRefreshKey] = useState(0);
150
151
  const [exportCsv, setExportCsv] = useState<(() => void) | null>(null);
152
+ const [copyTable, setCopyTable] = useState<(() => Promise<void>) | null>(
153
+ null,
154
+ );
151
155
  const [shouldLoadData, setShouldLoadData] = useState(
152
156
  eagerLoad ||
153
157
  panel.chartType === "section" ||
@@ -172,6 +176,23 @@ export function SqlChartCard({
172
176
  setExportCsv(handler ? () => handler : null);
173
177
  }, []);
174
178
 
179
+ const handleCopyTableChange = useCallback(
180
+ (handler: (() => Promise<void>) | null) => {
181
+ setCopyTable(handler ? () => handler : null);
182
+ },
183
+ [],
184
+ );
185
+
186
+ const handleCopyTable = useCallback(async () => {
187
+ if (!copyTable) return;
188
+ try {
189
+ await copyTable();
190
+ toast.success(t("sqlDashboard.copied"));
191
+ } catch {
192
+ toast.error(t("sqlDashboard.couldNotCopyTable"));
193
+ }
194
+ }, [copyTable, t]);
195
+
175
196
  const handleRefresh = useCallback(() => {
176
197
  setShouldLoadData(true);
177
198
  void queryClient.invalidateQueries({
@@ -288,6 +309,7 @@ export function SqlChartCard({
288
309
 
289
310
  useEffect(() => {
290
311
  setExportCsv(null);
312
+ setCopyTable(null);
291
313
  }, [panel.id]);
292
314
 
293
315
  useEffect(() => {
@@ -649,6 +671,15 @@ export function SqlChartCard({
649
671
  {t("sqlDashboard.downloadCsv")}
650
672
  </DropdownMenuItem>
651
673
  )}
674
+ {panel.chartType === "table" && (
675
+ <DropdownMenuItem
676
+ disabled={!copyTable}
677
+ onSelect={() => void handleCopyTable()}
678
+ >
679
+ <IconCopy className="h-4 w-4 mr-2" />
680
+ {t("sqlDashboard.copyTable")}
681
+ </DropdownMenuItem>
682
+ )}
652
683
  {panel.chartType === "table" && dashboardId ? (
653
684
  <DropdownMenuItem
654
685
  disabled={exportToGoogleSheets.isPending}
@@ -705,6 +736,7 @@ export function SqlChartCard({
705
736
  loadData={shouldLoadData}
706
737
  reportScreenshot={reportScreenshot}
707
738
  onExportCsvChange={handleExportCsvChange}
739
+ onCopyTableChange={handleCopyTableChange}
708
740
  extensionContext={extensionContext}
709
741
  />
710
742
  </CardContent>
@@ -93,6 +93,8 @@ export interface SqlPanelConfig {
93
93
  rightYKeys?: string[];
94
94
  /** Value formatter for the right axis. Falls back to `yFormatter`. */
95
95
  rightYFormatter?: "number" | "currency" | "percent";
96
+ /** Optional display labels for exact series keys, e.g. {"evt_signup_completed_v2":"Signups"}. */
97
+ seriesLabels?: Record<string, string>;
96
98
  description?: string;
97
99
  pivot?: PivotConfig;
98
100
  /** Stack bar/area series on top of each other instead of side-by-side / overlapping. */
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-08-10
4
+ ---
5
+
6
+ Dashboard tables can be copied and sorted by multiple columns
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-08-10
4
+ ---
5
+
6
+ Full-page chat now uses the available width up to 1000px for more comfortable prompts and responses.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-08-11
4
+ ---
5
+
6
+ Full-page chat composers stay at a focused 750px width.