@agent-native/core 0.107.2 → 0.109.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (502) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +24 -0
  3. package/corpus/core/docs/content/actions.mdx +48 -0
  4. package/corpus/core/docs/content/locales/ar-SA/actions.mdx +38 -0
  5. package/corpus/core/docs/content/locales/de-DE/actions.mdx +38 -0
  6. package/corpus/core/docs/content/locales/es-ES/actions.mdx +38 -0
  7. package/corpus/core/docs/content/locales/fr-FR/actions.mdx +38 -0
  8. package/corpus/core/docs/content/locales/hi-IN/actions.mdx +38 -0
  9. package/corpus/core/docs/content/locales/ja-JP/actions.mdx +38 -0
  10. package/corpus/core/docs/content/locales/ko-KR/actions.mdx +38 -0
  11. package/corpus/core/docs/content/locales/pt-BR/actions.mdx +38 -0
  12. package/corpus/core/docs/content/locales/zh-CN/actions.mdx +38 -0
  13. package/corpus/core/docs/content/locales/zh-TW/actions.mdx +38 -0
  14. package/corpus/core/package.json +5 -1
  15. package/corpus/core/src/a2a/client.ts +140 -17
  16. package/corpus/core/src/a2a/handlers.ts +60 -0
  17. package/corpus/core/src/a2a/index.ts +6 -1
  18. package/corpus/core/src/a2a/invoke.ts +68 -1
  19. package/corpus/core/src/a2a/server.ts +13 -1
  20. package/corpus/core/src/a2a/types.ts +16 -0
  21. package/corpus/core/src/a2a-claims.ts +52 -0
  22. package/corpus/core/src/action.ts +7 -2
  23. package/corpus/core/src/agent/production-agent.ts +10 -4
  24. package/corpus/core/src/audit/record.ts +6 -0
  25. package/corpus/core/src/client/AssistantChat.tsx +648 -603
  26. package/corpus/core/src/client/MultiTabAssistantChat.tsx +31 -4
  27. package/corpus/core/src/client/agent-chat-adapter.ts +23 -37
  28. package/corpus/core/src/client/agent-sidebar-state.ts +4 -0
  29. package/corpus/core/src/client/analytics.ts +84 -0
  30. package/corpus/core/src/client/chat/message-components.tsx +94 -22
  31. package/corpus/core/src/client/chat/tool-call-display.tsx +170 -47
  32. package/corpus/core/src/client/chat/use-agent-chat-lifecycle-tracking.ts +74 -0
  33. package/corpus/core/src/client/chat-thread-url.ts +11 -0
  34. package/corpus/core/src/client/error-capture.ts +12 -0
  35. package/corpus/core/src/client/extensions/ExtensionSlot.tsx +37 -1
  36. package/corpus/core/src/client/feature-flags/FeatureFlagsPanel.tsx +519 -0
  37. package/corpus/core/src/client/feature-flags/helpers.ts +77 -0
  38. package/corpus/core/src/client/feature-flags/index.ts +13 -0
  39. package/corpus/core/src/client/feature-flags/types.ts +29 -0
  40. package/corpus/core/src/client/feature-flags/use-feature-flag.ts +26 -0
  41. package/corpus/core/src/client/index.ts +13 -0
  42. package/corpus/core/src/client/route-chunk-recovery.ts +20 -8
  43. package/corpus/core/src/client/session-replay.ts +31 -0
  44. package/corpus/core/src/extensions/actions.ts +2 -14
  45. package/corpus/core/src/extensions/routes.ts +1 -1
  46. package/corpus/core/src/extensions/store.ts +1 -1
  47. package/corpus/core/src/feature-flags/a2a-action-route.ts +56 -0
  48. package/corpus/core/src/feature-flags/actions/get-feature-flags.ts +24 -0
  49. package/corpus/core/src/feature-flags/actions/list-feature-flags.ts +69 -0
  50. package/corpus/core/src/feature-flags/actions/set-feature-flag.ts +89 -0
  51. package/corpus/core/src/feature-flags/index.ts +21 -0
  52. package/corpus/core/src/feature-flags/permissions.ts +53 -0
  53. package/corpus/core/src/feature-flags/plugin.ts +44 -0
  54. package/corpus/core/src/feature-flags/registry.ts +96 -0
  55. package/corpus/core/src/feature-flags/store.ts +176 -0
  56. package/corpus/core/src/index.ts +15 -0
  57. package/corpus/core/src/localization/default-messages.ts +50 -0
  58. package/corpus/core/src/mcp/build-server.ts +2 -2
  59. package/corpus/core/src/progress/actions.ts +4 -2
  60. package/corpus/core/src/provider-api/index.ts +205 -105
  61. package/corpus/core/src/scripts/call-agent.ts +137 -17
  62. package/corpus/core/src/server/action-discovery.ts +12 -0
  63. package/corpus/core/src/server/action-routes.ts +47 -5
  64. package/corpus/core/src/server/agent-chat/action-filters-a2a.ts +40 -0
  65. package/corpus/core/src/server/agent-chat-plugin.ts +31 -0
  66. package/corpus/core/src/server/index.ts +1 -0
  67. package/corpus/core/src/settings/org-settings.ts +13 -0
  68. package/corpus/core/src/settings/store.ts +57 -0
  69. package/corpus/core/src/styles/agent-conversation.css +7 -0
  70. package/corpus/core/src/templates/default/.agents/skills/feature-flags/SKILL.md +169 -0
  71. package/corpus/core/src/templates/default/AGENTS.md +1 -0
  72. package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +20 -0
  73. package/corpus/core/src/templates/default/app/i18n/de-DE.ts +20 -0
  74. package/corpus/core/src/templates/default/app/i18n/en-US.ts +20 -0
  75. package/corpus/core/src/templates/default/app/i18n/es-ES.ts +20 -0
  76. package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +21 -0
  77. package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +19 -0
  78. package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +20 -0
  79. package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +19 -0
  80. package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +20 -0
  81. package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +19 -0
  82. package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +19 -0
  83. package/corpus/core/src/templates/headless/.agents/skills/feature-flags/SKILL.md +169 -0
  84. package/corpus/core/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +28 -0
  85. package/corpus/core/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +5 -0
  86. package/corpus/core/src/templates/workspace-core/.agents/skills/feature-flags/SKILL.md +169 -0
  87. package/corpus/core/src/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
  88. package/corpus/core/src/templates/workspace-core/AGENTS.md +1 -1
  89. package/corpus/core/src/templates/workspace-root/AGENTS.md +1 -1
  90. package/corpus/core/src/vite/action-types-plugin.ts +12 -0
  91. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +29 -10
  92. package/corpus/templates/analytics/.agents/skills/feature-flags/SKILL.md +169 -0
  93. package/corpus/templates/analytics/.agents/skills/gong/SKILL.md +54 -23
  94. package/corpus/templates/analytics/.builder/skills/apollo/SKILL.md +19 -41
  95. package/corpus/templates/analytics/.builder/skills/commonroom/SKILL.md +20 -35
  96. package/corpus/templates/analytics/.builder/skills/github/SKILL.md +23 -67
  97. package/corpus/templates/analytics/.builder/skills/pylon/SKILL.md +25 -43
  98. package/corpus/templates/analytics/AGENTS.md +37 -16
  99. package/corpus/templates/analytics/actions/account-deep-dive.ts +1 -0
  100. package/corpus/templates/analytics/actions/configure-gong-native-insights.ts +29 -0
  101. package/corpus/templates/analytics/actions/content-calendar-schema.ts +8 -4
  102. package/corpus/templates/analytics/actions/content-calendar.ts +12 -4
  103. package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +2 -1
  104. package/corpus/templates/analytics/actions/gong-calls.ts +113 -22
  105. package/corpus/templates/analytics/actions/gong-native-insights.ts +166 -0
  106. package/corpus/templates/analytics/actions/hubspot-deals.ts +190 -46
  107. package/corpus/templates/analytics/actions/list-workspace-feature-flags.ts +15 -0
  108. package/corpus/templates/analytics/actions/navigate.ts +2 -2
  109. package/corpus/templates/analytics/actions/pylon-issues.ts +123 -0
  110. package/corpus/templates/analytics/actions/set-workspace-feature-flag.ts +45 -0
  111. package/corpus/templates/analytics/actions/slack-messages.ts +179 -27
  112. package/corpus/templates/analytics/actions/view-screen.ts +13 -0
  113. package/corpus/templates/analytics/app/components/agents/FeatureFlagsFleetPanel.tsx +243 -0
  114. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +48 -152
  115. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +11 -3
  116. package/corpus/templates/analytics/app/components/ui/chart.tsx +1 -1
  117. package/corpus/templates/analytics/app/hooks/use-chart-tooltip-flip.ts +21 -6
  118. package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +3 -1
  119. package/corpus/templates/analytics/app/i18n/zh-TW.ts +30 -0
  120. package/corpus/templates/analytics/app/i18n-data.ts +385 -0
  121. package/corpus/templates/analytics/app/pages/Agents.tsx +22 -2
  122. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +181 -30
  123. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +6 -0
  124. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +4 -3
  125. package/corpus/templates/analytics/changelog/2026-07-17-dashboard-editors-can-add-shared-extensions-or-opt-into-per-.md +6 -0
  126. package/corpus/templates/analytics/changelog/2026-07-17-dashboard-extensions-show-a-loading-skeleton.md +6 -0
  127. package/corpus/templates/analytics/changelog/2026-07-17-errors-now-group-repeat-failures-consistently-and-keep-priva.md +6 -0
  128. package/corpus/templates/analytics/changelog/2026-07-17-gong-transcript-reviews-now-batch-bounded-call-windows-for-f.md +6 -0
  129. package/corpus/templates/analytics/changelog/2026-07-17-hubspot-deal-filters-now-run-in-hubspot-before-paging-result.md +6 -0
  130. package/corpus/templates/analytics/changelog/2026-07-17-manage-feature-flag-rollouts-across-your-organization-s-apps.md +6 -0
  131. package/corpus/templates/analytics/changelog/2026-07-17-notion-content-calendars-now-discover-the-matching-database-.md +6 -0
  132. package/corpus/templates/analytics/changelog/2026-07-17-pylon-dashboard-reads-now-use-the-paginated-issue-search-api.md +6 -0
  133. package/corpus/templates/analytics/changelog/2026-07-17-slack-reads-no-longer-join-channels-and-report-pagination-coverage.md +6 -0
  134. package/corpus/templates/analytics/server/handlers/notion.ts +14 -3
  135. package/corpus/templates/analytics/server/handlers/slack.ts +182 -29
  136. package/corpus/templates/analytics/server/lib/agent-chat-plan-mode.ts +2 -6
  137. package/corpus/templates/analytics/server/lib/analytics-connector-catalog.ts +6 -2
  138. package/corpus/templates/analytics/server/lib/db-admin-connections.ts +13 -5
  139. package/corpus/templates/analytics/server/lib/error-capture.ts +75 -8
  140. package/corpus/templates/analytics/server/lib/gong-native-policy.ts +72 -0
  141. package/corpus/templates/analytics/server/lib/gong.ts +54 -66
  142. package/corpus/templates/analytics/server/lib/hubspot.ts +40 -3
  143. package/corpus/templates/analytics/server/lib/notion.ts +83 -8
  144. package/corpus/templates/analytics/server/lib/real-data-actions.ts +4 -0
  145. package/corpus/templates/analytics/server/lib/slack.ts +242 -90
  146. package/corpus/templates/analytics/server/lib/workspace-feature-flags.ts +347 -0
  147. package/corpus/templates/analytics/server/plugins/agent-chat.ts +3 -3
  148. package/corpus/templates/analytics/server/routes/api/pylon/accounts.get.ts +42 -1
  149. package/corpus/templates/analytics/server/routes/api/pylon/issues.get.ts +71 -1
  150. package/corpus/templates/analytics/server/routes/api/test-connection.post.ts +44 -4
  151. package/corpus/templates/assets/.agents/skills/feature-flags/SKILL.md +169 -0
  152. package/corpus/templates/brain/.agents/skills/feature-flags/SKILL.md +169 -0
  153. package/corpus/templates/calendar/.agents/skills/feature-flags/SKILL.md +169 -0
  154. package/corpus/templates/chat/.agents/skills/feature-flags/SKILL.md +169 -0
  155. package/corpus/templates/clips/.agents/skills/feature-flags/SKILL.md +169 -0
  156. package/corpus/templates/clips/app/components/library/bulk-action-toolbar.tsx +19 -1
  157. package/corpus/templates/clips/app/components/library/create-folder-dialog.tsx +123 -0
  158. package/corpus/templates/clips/app/components/library/library-grid.tsx +42 -4
  159. package/corpus/templates/clips/app/components/library/recording-card.tsx +30 -0
  160. package/corpus/templates/clips/app/entry.client.tsx +6 -1
  161. package/corpus/templates/clips/app/i18n/ar-SA.ts +12 -1
  162. package/corpus/templates/clips/app/i18n/de-DE.ts +12 -1
  163. package/corpus/templates/clips/app/i18n/en-US.ts +12 -1
  164. package/corpus/templates/clips/app/i18n/es-ES.ts +11 -1
  165. package/corpus/templates/clips/app/i18n/fr-FR.ts +11 -1
  166. package/corpus/templates/clips/app/i18n/hi-IN.ts +10 -1
  167. package/corpus/templates/clips/app/i18n/ja-JP.ts +12 -1
  168. package/corpus/templates/clips/app/i18n/ko-KR.ts +11 -1
  169. package/corpus/templates/clips/app/i18n/pt-BR.ts +11 -1
  170. package/corpus/templates/clips/app/i18n/zh-CN.ts +11 -1
  171. package/corpus/templates/clips/app/i18n/zh-TW.ts +11 -1
  172. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +72 -1
  173. package/corpus/templates/clips/changelog/2026-07-17-choose-which-workspace-receives-new-clips-recordings-and-des.md +6 -0
  174. package/corpus/templates/clips/changelog/2026-07-17-create-folders-directly-from-the-move-menu.md +6 -0
  175. package/corpus/templates/clips/changelog/2026-07-17-failed-desktop-uploads-now-offer-a-direct-way-to-reopen-clip.md +6 -0
  176. package/corpus/templates/clips/desktop/src/app.tsx +1 -1
  177. package/corpus/templates/clips/server/plugins/feature-flags.ts +11 -0
  178. package/corpus/templates/clips/shared/feature-flags.ts +30 -37
  179. package/corpus/templates/content/.agents/skills/feature-flags/SKILL.md +169 -0
  180. package/corpus/templates/content/app/entry.client.tsx +6 -1
  181. package/corpus/templates/design/.agents/skills/feature-flags/SKILL.md +169 -0
  182. package/corpus/templates/design/AGENTS.md +5 -3
  183. package/corpus/templates/design/actions/add-fusion-screens.ts +4 -6
  184. package/corpus/templates/design/actions/apply-fusion-edits.ts +4 -6
  185. package/corpus/templates/design/actions/create-fusion-app.ts +5 -4
  186. package/corpus/templates/design/actions/deploy-fusion-app.ts +4 -3
  187. package/corpus/templates/design/actions/get-fusion-deploy-status.ts +4 -6
  188. package/corpus/templates/design/actions/list-fusion-edits.ts +4 -3
  189. package/corpus/templates/design/actions/push-fusion-app.ts +4 -6
  190. package/corpus/templates/design/actions/queue-fusion-edit.ts +4 -3
  191. package/corpus/templates/design/actions/send-fusion-message.ts +4 -6
  192. package/corpus/templates/design/actions/sync-fusion-app.ts +4 -3
  193. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +1 -1
  194. package/corpus/templates/design/app/pages/Index.tsx +8 -6
  195. package/corpus/templates/design/server/plugins/feature-flags.ts +5 -0
  196. package/corpus/templates/design/shared/full-app.ts +10 -7
  197. package/corpus/templates/dispatch/.agents/skills/feature-flags/SKILL.md +169 -0
  198. package/corpus/templates/dispatch/AGENTS.md +5 -0
  199. package/corpus/templates/dispatch/changelog/2026-07-17-apps-page-links-to-other-available-apps.md +6 -0
  200. package/corpus/templates/dispatch/changelog/2026-07-17-curated-template-remixes.md +6 -0
  201. package/corpus/templates/forms/.agents/skills/feature-flags/SKILL.md +169 -0
  202. package/corpus/templates/macros/.agents/skills/feature-flags/SKILL.md +169 -0
  203. package/corpus/templates/mail/.agents/skills/feature-flags/SKILL.md +169 -0
  204. package/corpus/templates/mail/app/entry.client.tsx +6 -1
  205. package/corpus/templates/plan/.agents/skills/feature-flags/SKILL.md +169 -0
  206. package/corpus/templates/slides/.agents/skills/feature-flags/SKILL.md +169 -0
  207. package/corpus/templates/slides/.agents/skills/slide-images/SKILL.md +11 -7
  208. package/corpus/templates/slides/.env.example +0 -1
  209. package/corpus/templates/slides/AGENTS.md +4 -0
  210. package/corpus/templates/slides/DEVELOPING.md +2 -2
  211. package/corpus/templates/slides/actions/index-design-system-with-builder.ts +1 -1
  212. package/corpus/templates/slides/actions/logo-config.ts +6 -7
  213. package/corpus/templates/slides/actions/search-images.ts +11 -39
  214. package/corpus/templates/slides/actions/search-logos.ts +5 -52
  215. package/corpus/templates/slides/app/components/editor/ImageSearchPanel.tsx +1 -1
  216. package/corpus/templates/slides/app/components/editor/LogoSearchPanel.tsx +16 -26
  217. package/corpus/templates/slides/app/entry.client.tsx +6 -1
  218. package/corpus/templates/slides/server/lib/media-search-providers.ts +216 -0
  219. package/corpus/templates/slides/server/register-secrets.ts +30 -0
  220. package/corpus/templates/tasks/.agents/skills/feature-flags/SKILL.md +169 -0
  221. package/dist/a2a/client.d.ts +38 -1
  222. package/dist/a2a/client.d.ts.map +1 -1
  223. package/dist/a2a/client.js +81 -12
  224. package/dist/a2a/client.js.map +1 -1
  225. package/dist/a2a/handlers.d.ts.map +1 -1
  226. package/dist/a2a/handlers.js +47 -0
  227. package/dist/a2a/handlers.js.map +1 -1
  228. package/dist/a2a/index.d.ts +4 -4
  229. package/dist/a2a/index.d.ts.map +1 -1
  230. package/dist/a2a/index.js +2 -2
  231. package/dist/a2a/index.js.map +1 -1
  232. package/dist/a2a/invoke.d.ts +26 -2
  233. package/dist/a2a/invoke.d.ts.map +1 -1
  234. package/dist/a2a/invoke.js +30 -1
  235. package/dist/a2a/invoke.js.map +1 -1
  236. package/dist/a2a/server.d.ts.map +1 -1
  237. package/dist/a2a/server.js +14 -1
  238. package/dist/a2a/server.js.map +1 -1
  239. package/dist/a2a/types.d.ts +12 -0
  240. package/dist/a2a/types.d.ts.map +1 -1
  241. package/dist/a2a/types.js.map +1 -1
  242. package/dist/a2a-claims.d.ts +10 -0
  243. package/dist/a2a-claims.d.ts.map +1 -0
  244. package/dist/a2a-claims.js +41 -0
  245. package/dist/a2a-claims.js.map +1 -0
  246. package/dist/action.d.ts +7 -2
  247. package/dist/action.d.ts.map +1 -1
  248. package/dist/action.js.map +1 -1
  249. package/dist/agent/production-agent.d.ts +5 -0
  250. package/dist/agent/production-agent.d.ts.map +1 -1
  251. package/dist/agent/production-agent.js +5 -3
  252. package/dist/agent/production-agent.js.map +1 -1
  253. package/dist/audit/record.d.ts +3 -0
  254. package/dist/audit/record.d.ts.map +1 -1
  255. package/dist/audit/record.js +3 -0
  256. package/dist/audit/record.js.map +1 -1
  257. package/dist/client/AssistantChat.d.ts +14 -1
  258. package/dist/client/AssistantChat.d.ts.map +1 -1
  259. package/dist/client/AssistantChat.js +158 -136
  260. package/dist/client/AssistantChat.js.map +1 -1
  261. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  262. package/dist/client/MultiTabAssistantChat.js +27 -4
  263. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  264. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  265. package/dist/client/agent-chat-adapter.js +21 -39
  266. package/dist/client/agent-chat-adapter.js.map +1 -1
  267. package/dist/client/agent-sidebar-state.d.ts +1 -0
  268. package/dist/client/agent-sidebar-state.d.ts.map +1 -1
  269. package/dist/client/agent-sidebar-state.js +4 -0
  270. package/dist/client/agent-sidebar-state.js.map +1 -1
  271. package/dist/client/analytics.d.ts +14 -0
  272. package/dist/client/analytics.d.ts.map +1 -1
  273. package/dist/client/analytics.js +67 -0
  274. package/dist/client/analytics.js.map +1 -1
  275. package/dist/client/chat/message-components.d.ts +8 -0
  276. package/dist/client/chat/message-components.d.ts.map +1 -1
  277. package/dist/client/chat/message-components.js +62 -19
  278. package/dist/client/chat/message-components.js.map +1 -1
  279. package/dist/client/chat/tool-call-display.d.ts +6 -0
  280. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  281. package/dist/client/chat/tool-call-display.js +83 -14
  282. package/dist/client/chat/tool-call-display.js.map +1 -1
  283. package/dist/client/chat/use-agent-chat-lifecycle-tracking.d.ts +8 -0
  284. package/dist/client/chat/use-agent-chat-lifecycle-tracking.d.ts.map +1 -0
  285. package/dist/client/chat/use-agent-chat-lifecycle-tracking.js +51 -0
  286. package/dist/client/chat/use-agent-chat-lifecycle-tracking.js.map +1 -0
  287. package/dist/client/chat-thread-url.d.ts +2 -0
  288. package/dist/client/chat-thread-url.d.ts.map +1 -0
  289. package/dist/client/chat-thread-url.js +12 -0
  290. package/dist/client/chat-thread-url.js.map +1 -0
  291. package/dist/client/error-capture.d.ts.map +1 -1
  292. package/dist/client/error-capture.js +7 -0
  293. package/dist/client/error-capture.js.map +1 -1
  294. package/dist/client/extensions/ExtensionSlot.d.ts +3 -1
  295. package/dist/client/extensions/ExtensionSlot.d.ts.map +1 -1
  296. package/dist/client/extensions/ExtensionSlot.js +28 -3
  297. package/dist/client/extensions/ExtensionSlot.js.map +1 -1
  298. package/dist/client/feature-flags/FeatureFlagsPanel.d.ts +10 -0
  299. package/dist/client/feature-flags/FeatureFlagsPanel.d.ts.map +1 -0
  300. package/dist/client/feature-flags/FeatureFlagsPanel.js +143 -0
  301. package/dist/client/feature-flags/FeatureFlagsPanel.js.map +1 -0
  302. package/dist/client/feature-flags/helpers.d.ts +16 -0
  303. package/dist/client/feature-flags/helpers.d.ts.map +1 -0
  304. package/dist/client/feature-flags/helpers.js +50 -0
  305. package/dist/client/feature-flags/helpers.js.map +1 -0
  306. package/dist/client/feature-flags/index.d.ts +5 -0
  307. package/dist/client/feature-flags/index.d.ts.map +1 -0
  308. package/dist/client/feature-flags/index.js +4 -0
  309. package/dist/client/feature-flags/index.js.map +1 -0
  310. package/dist/client/feature-flags/types.d.ts +27 -0
  311. package/dist/client/feature-flags/types.d.ts.map +1 -0
  312. package/dist/client/feature-flags/types.js +2 -0
  313. package/dist/client/feature-flags/types.js.map +1 -0
  314. package/dist/client/feature-flags/use-feature-flag.d.ts +8 -0
  315. package/dist/client/feature-flags/use-feature-flag.d.ts.map +1 -0
  316. package/dist/client/feature-flags/use-feature-flag.js +15 -0
  317. package/dist/client/feature-flags/use-feature-flag.js.map +1 -0
  318. package/dist/client/index.d.ts +2 -1
  319. package/dist/client/index.d.ts.map +1 -1
  320. package/dist/client/index.js +2 -1
  321. package/dist/client/index.js.map +1 -1
  322. package/dist/client/route-chunk-recovery.d.ts.map +1 -1
  323. package/dist/client/route-chunk-recovery.js +14 -9
  324. package/dist/client/route-chunk-recovery.js.map +1 -1
  325. package/dist/client/session-replay.d.ts +15 -0
  326. package/dist/client/session-replay.d.ts.map +1 -1
  327. package/dist/client/session-replay.js +20 -0
  328. package/dist/client/session-replay.js.map +1 -1
  329. package/dist/collab/struct-routes.d.ts +1 -1
  330. package/dist/extensions/actions.d.ts.map +1 -1
  331. package/dist/extensions/actions.js +2 -10
  332. package/dist/extensions/actions.js.map +1 -1
  333. package/dist/extensions/routes.d.ts.map +1 -1
  334. package/dist/extensions/routes.js +1 -1
  335. package/dist/extensions/routes.js.map +1 -1
  336. package/dist/extensions/store.js +1 -1
  337. package/dist/extensions/store.js.map +1 -1
  338. package/dist/feature-flags/a2a-action-route.d.ts +14 -0
  339. package/dist/feature-flags/a2a-action-route.d.ts.map +1 -0
  340. package/dist/feature-flags/a2a-action-route.js +50 -0
  341. package/dist/feature-flags/a2a-action-route.js.map +1 -0
  342. package/dist/feature-flags/actions/get-feature-flags.d.ts +3 -0
  343. package/dist/feature-flags/actions/get-feature-flags.d.ts.map +1 -0
  344. package/dist/feature-flags/actions/get-feature-flags.js +18 -0
  345. package/dist/feature-flags/actions/get-feature-flags.js.map +1 -0
  346. package/dist/feature-flags/actions/list-feature-flags.d.ts +28 -0
  347. package/dist/feature-flags/actions/list-feature-flags.d.ts.map +1 -0
  348. package/dist/feature-flags/actions/list-feature-flags.js +60 -0
  349. package/dist/feature-flags/actions/list-feature-flags.js.map +1 -0
  350. package/dist/feature-flags/actions/set-feature-flag.d.ts +26 -0
  351. package/dist/feature-flags/actions/set-feature-flag.d.ts.map +1 -0
  352. package/dist/feature-flags/actions/set-feature-flag.js +78 -0
  353. package/dist/feature-flags/actions/set-feature-flag.js.map +1 -0
  354. package/dist/feature-flags/index.d.ts +5 -0
  355. package/dist/feature-flags/index.d.ts.map +1 -0
  356. package/dist/feature-flags/index.js +5 -0
  357. package/dist/feature-flags/index.js.map +1 -0
  358. package/dist/feature-flags/permissions.d.ts +13 -0
  359. package/dist/feature-flags/permissions.d.ts.map +1 -0
  360. package/dist/feature-flags/permissions.js +37 -0
  361. package/dist/feature-flags/permissions.js.map +1 -0
  362. package/dist/feature-flags/plugin.d.ts +17 -0
  363. package/dist/feature-flags/plugin.d.ts.map +1 -0
  364. package/dist/feature-flags/plugin.js +29 -0
  365. package/dist/feature-flags/plugin.js.map +1 -0
  366. package/dist/feature-flags/registry.d.ts +23 -0
  367. package/dist/feature-flags/registry.d.ts.map +1 -0
  368. package/dist/feature-flags/registry.js +59 -0
  369. package/dist/feature-flags/registry.js.map +1 -0
  370. package/dist/feature-flags/store.d.ts +31 -0
  371. package/dist/feature-flags/store.d.ts.map +1 -0
  372. package/dist/feature-flags/store.js +124 -0
  373. package/dist/feature-flags/store.js.map +1 -0
  374. package/dist/index.d.ts +1 -0
  375. package/dist/index.d.ts.map +1 -1
  376. package/dist/index.js +1 -0
  377. package/dist/index.js.map +1 -1
  378. package/dist/localization/default-messages.d.ts +45 -0
  379. package/dist/localization/default-messages.d.ts.map +1 -1
  380. package/dist/localization/default-messages.js +45 -0
  381. package/dist/localization/default-messages.js.map +1 -1
  382. package/dist/mcp/build-server.d.ts +2 -0
  383. package/dist/mcp/build-server.d.ts.map +1 -1
  384. package/dist/mcp/build-server.js +2 -2
  385. package/dist/mcp/build-server.js.map +1 -1
  386. package/dist/notifications/routes.d.ts +2 -2
  387. package/dist/progress/actions.d.ts.map +1 -1
  388. package/dist/progress/actions.js +3 -2
  389. package/dist/progress/actions.js.map +1 -1
  390. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  391. package/dist/provider-api/index.d.ts.map +1 -1
  392. package/dist/provider-api/index.js +91 -8
  393. package/dist/provider-api/index.js.map +1 -1
  394. package/dist/resources/handlers.d.ts +3 -3
  395. package/dist/scripts/call-agent.d.ts.map +1 -1
  396. package/dist/scripts/call-agent.js +107 -16
  397. package/dist/scripts/call-agent.js.map +1 -1
  398. package/dist/server/action-discovery.d.ts.map +1 -1
  399. package/dist/server/action-discovery.js +12 -0
  400. package/dist/server/action-discovery.js.map +1 -1
  401. package/dist/server/action-routes.d.ts +3 -0
  402. package/dist/server/action-routes.d.ts.map +1 -1
  403. package/dist/server/action-routes.js +45 -5
  404. package/dist/server/action-routes.js.map +1 -1
  405. package/dist/server/agent-chat/action-filters-a2a.d.ts +6 -0
  406. package/dist/server/agent-chat/action-filters-a2a.d.ts.map +1 -1
  407. package/dist/server/agent-chat/action-filters-a2a.js +27 -0
  408. package/dist/server/agent-chat/action-filters-a2a.js.map +1 -1
  409. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  410. package/dist/server/agent-chat-plugin.js +27 -1
  411. package/dist/server/agent-chat-plugin.js.map +1 -1
  412. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  413. package/dist/server/index.d.ts +1 -0
  414. package/dist/server/index.d.ts.map +1 -1
  415. package/dist/server/index.js +1 -0
  416. package/dist/server/index.js.map +1 -1
  417. package/dist/server/transcribe-voice.d.ts +1 -1
  418. package/dist/settings/org-settings.d.ts +2 -0
  419. package/dist/settings/org-settings.d.ts.map +1 -1
  420. package/dist/settings/org-settings.js +5 -1
  421. package/dist/settings/org-settings.js.map +1 -1
  422. package/dist/settings/store.d.ts +8 -0
  423. package/dist/settings/store.d.ts.map +1 -1
  424. package/dist/settings/store.js +48 -0
  425. package/dist/settings/store.js.map +1 -1
  426. package/dist/styles/agent-conversation.css +7 -0
  427. package/dist/templates/chat/.agents/skills/feature-flags/SKILL.md +169 -0
  428. package/dist/templates/default/.agents/skills/feature-flags/SKILL.md +169 -0
  429. package/dist/templates/default/AGENTS.md +1 -0
  430. package/dist/templates/default/app/i18n/ar-SA.ts +20 -0
  431. package/dist/templates/default/app/i18n/de-DE.ts +20 -0
  432. package/dist/templates/default/app/i18n/en-US.ts +20 -0
  433. package/dist/templates/default/app/i18n/es-ES.ts +20 -0
  434. package/dist/templates/default/app/i18n/fr-FR.ts +21 -0
  435. package/dist/templates/default/app/i18n/hi-IN.ts +19 -0
  436. package/dist/templates/default/app/i18n/ja-JP.ts +20 -0
  437. package/dist/templates/default/app/i18n/ko-KR.ts +19 -0
  438. package/dist/templates/default/app/i18n/pt-BR.ts +20 -0
  439. package/dist/templates/default/app/i18n/zh-CN.ts +19 -0
  440. package/dist/templates/default/app/i18n/zh-TW.ts +19 -0
  441. package/dist/templates/headless/.agents/skills/feature-flags/SKILL.md +169 -0
  442. package/dist/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +28 -0
  443. package/dist/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +5 -0
  444. package/dist/templates/workspace-core/.agents/skills/feature-flags/SKILL.md +169 -0
  445. package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
  446. package/dist/templates/workspace-core/AGENTS.md +1 -1
  447. package/dist/templates/workspace-root/AGENTS.md +1 -1
  448. package/dist/vite/action-types-plugin.d.ts.map +1 -1
  449. package/dist/vite/action-types-plugin.js +12 -0
  450. package/dist/vite/action-types-plugin.js.map +1 -1
  451. package/docs/content/actions.mdx +48 -0
  452. package/docs/content/locales/ar-SA/actions.mdx +38 -0
  453. package/docs/content/locales/de-DE/actions.mdx +38 -0
  454. package/docs/content/locales/es-ES/actions.mdx +38 -0
  455. package/docs/content/locales/fr-FR/actions.mdx +38 -0
  456. package/docs/content/locales/hi-IN/actions.mdx +38 -0
  457. package/docs/content/locales/ja-JP/actions.mdx +38 -0
  458. package/docs/content/locales/ko-KR/actions.mdx +38 -0
  459. package/docs/content/locales/pt-BR/actions.mdx +38 -0
  460. package/docs/content/locales/zh-CN/actions.mdx +38 -0
  461. package/docs/content/locales/zh-TW/actions.mdx +38 -0
  462. package/package.json +5 -1
  463. package/src/templates/chat/.agents/skills/feature-flags/SKILL.md +169 -0
  464. package/src/templates/default/.agents/skills/feature-flags/SKILL.md +169 -0
  465. package/src/templates/default/AGENTS.md +1 -0
  466. package/src/templates/default/app/i18n/ar-SA.ts +20 -0
  467. package/src/templates/default/app/i18n/de-DE.ts +20 -0
  468. package/src/templates/default/app/i18n/en-US.ts +20 -0
  469. package/src/templates/default/app/i18n/es-ES.ts +20 -0
  470. package/src/templates/default/app/i18n/fr-FR.ts +21 -0
  471. package/src/templates/default/app/i18n/hi-IN.ts +19 -0
  472. package/src/templates/default/app/i18n/ja-JP.ts +20 -0
  473. package/src/templates/default/app/i18n/ko-KR.ts +19 -0
  474. package/src/templates/default/app/i18n/pt-BR.ts +20 -0
  475. package/src/templates/default/app/i18n/zh-CN.ts +19 -0
  476. package/src/templates/default/app/i18n/zh-TW.ts +19 -0
  477. package/src/templates/headless/.agents/skills/feature-flags/SKILL.md +169 -0
  478. package/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +28 -0
  479. package/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +5 -0
  480. package/src/templates/workspace-core/.agents/skills/feature-flags/SKILL.md +169 -0
  481. package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
  482. package/src/templates/workspace-core/AGENTS.md +1 -1
  483. package/src/templates/workspace-root/AGENTS.md +1 -1
  484. package/corpus/templates/analytics/server/handlers/github.ts +0 -200
  485. package/corpus/templates/analytics/server/handlers/pylon.ts +0 -43
  486. package/corpus/templates/analytics/server/lib/apollo.ts +0 -167
  487. package/corpus/templates/analytics/server/lib/commonroom.ts +0 -149
  488. package/corpus/templates/analytics/server/lib/github.ts +0 -660
  489. package/corpus/templates/analytics/server/lib/mixpanel.ts +0 -156
  490. package/corpus/templates/analytics/server/lib/posthog.ts +0 -194
  491. package/corpus/templates/analytics/server/lib/pylon.ts +0 -109
  492. package/corpus/templates/analytics/server/routes/api/github/graphql.post.ts +0 -1
  493. package/corpus/templates/analytics/server/routes/api/github/issue.get.ts +0 -1
  494. package/corpus/templates/analytics/server/routes/api/github/org-prs.get.ts +0 -1
  495. package/corpus/templates/analytics/server/routes/api/github/pr.get.ts +0 -1
  496. package/corpus/templates/analytics/server/routes/api/github/prs.get.ts +0 -1
  497. package/corpus/templates/analytics/server/routes/api/github/search.get.ts +0 -1
  498. package/corpus/templates/clips/actions/get-feature-flags.ts +0 -30
  499. package/corpus/templates/slides/actions/fetch-logos.ts +0 -90
  500. package/corpus/templates/slides/actions/image-search.ts +0 -64
  501. package/corpus/templates/slides/actions/import-github.ts +0 -182
  502. package/corpus/templates/slides/actions/logo-lookup.ts +0 -113
@@ -19,14 +19,12 @@ import {
19
19
  useCallback,
20
20
  useContext,
21
21
  useEffect,
22
- useLayoutEffect,
23
22
  useMemo,
24
23
  useRef,
25
24
  useState,
26
25
  type CSSProperties,
27
26
  type ReactNode,
28
27
  } from "react";
29
- import { createPortal } from "react-dom";
30
28
  import { Link } from "react-router";
31
29
  import {
32
30
  Area,
@@ -61,6 +59,7 @@ import {
61
59
  SelectValue,
62
60
  } from "@/components/ui/select";
63
61
  import { Skeleton } from "@/components/ui/skeleton";
62
+ import { useChartTooltipFlip } from "@/hooks/use-chart-tooltip-flip";
64
63
 
65
64
  const PAGE_SIZE_OPTIONS = [10, 25, 50, 100];
66
65
  import { createDemoChartTrendRows } from "@/lib/demo-chart-trend";
@@ -90,11 +89,6 @@ const CHART_TOOLTIP_WRAPPER_STYLE: CSSProperties = {
90
89
  pointerEvents: "none",
91
90
  };
92
91
 
93
- const PORTAL_GUTTER_PADDING = 12;
94
- const PORTAL_CURSOR_OFFSET = 24;
95
- const useBrowserLayoutEffect =
96
- typeof window === "undefined" ? useEffect : useLayoutEffect;
97
-
98
92
  const CHART_TOOLTIP_PROPS = {
99
93
  allowEscapeViewBox: { x: true, y: true },
100
94
  wrapperStyle: CHART_TOOLTIP_WRAPPER_STYLE,
@@ -598,7 +592,7 @@ export function SeriesLegend({
598
592
  if (!shouldShowLegend(panel, keys.length)) return null;
599
593
 
600
594
  return (
601
- <div className="mt-2 min-h-16 max-h-16 overflow-y-auto overflow-x-hidden pr-1 text-[11px] leading-4 text-muted-foreground">
595
+ <div className="mt-1 max-h-16 overflow-y-auto overflow-x-hidden pr-1 text-[11px] leading-4 text-muted-foreground">
602
596
  <div className="flex flex-wrap gap-x-3 gap-y-1">
603
597
  {keys.map((key, i) => {
604
598
  const hidden = hiddenKeys?.has(key) ?? false;
@@ -612,7 +606,7 @@ export function SeriesLegend({
612
606
  >
613
607
  <PopoverAnchor asChild>
614
608
  <div
615
- className="inline-flex min-h-10 max-w-[14rem] items-center"
609
+ className="inline-flex min-h-6 max-w-[14rem] items-center"
616
610
  onPointerDown={(event) => {
617
611
  if (!hasLegendActions || event.pointerType === "mouse") {
618
612
  return;
@@ -648,7 +642,7 @@ export function SeriesLegend({
648
642
  }
649
643
  aria-haspopup={hasLegendActions ? "menu" : undefined}
650
644
  data-chart-legend-item={key}
651
- className={`inline-flex min-h-10 max-w-[14rem] min-w-0 items-center gap-1.5 rounded-md px-1.5 text-left transition-[opacity,color] touch-manipulation hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring ${
645
+ className={`inline-flex min-h-6 max-w-[14rem] min-w-0 items-center gap-1.5 rounded-md px-1.5 text-left transition-[opacity,color] touch-manipulation hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring ${
652
646
  hidden ? "opacity-35" : "opacity-100"
653
647
  } ${onToggleKey ? "cursor-pointer" : "cursor-default"}`}
654
648
  title={label}
@@ -680,18 +674,18 @@ export function SeriesLegend({
680
674
  align="center"
681
675
  sideOffset={8}
682
676
  collisionPadding={12}
683
- className="w-56 max-w-[calc(100vw-1.5rem)] rounded-lg p-1.5 shadow-lg"
677
+ className="w-auto max-w-[calc(100vw-1.5rem)] rounded-lg p-1 shadow-lg"
684
678
  onPointerEnter={clearCloseTimeout}
685
679
  onPointerLeave={scheduleCloseLegendActions}
686
680
  onFocusCapture={clearCloseTimeout}
687
681
  >
688
- <div className="flex w-full items-center gap-1">
682
+ <div className="flex items-center gap-0.5">
689
683
  {onFilterKey && (
690
684
  <button
691
685
  type="button"
692
686
  data-chart-legend-action="filter"
693
687
  aria-label={`${t("sqlDashboard.filterSeries")} ${label}`}
694
- className="min-h-11 min-w-0 flex-1 rounded-md px-3 py-2 text-xs font-medium whitespace-nowrap text-popover-foreground outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground"
688
+ className="min-h-8 rounded-md px-2.5 py-1 text-xs font-medium whitespace-nowrap text-popover-foreground outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground"
695
689
  onClick={() => {
696
690
  onFilterKey(key);
697
691
  setOpenKey(null);
@@ -706,7 +700,7 @@ export function SeriesLegend({
706
700
  data-chart-legend-action="hide"
707
701
  aria-label={`${t("sqlDashboard.hide")} ${label}`}
708
702
  disabled={hidden}
709
- className="min-h-11 min-w-0 flex-1 rounded-md px-3 py-2 text-xs font-medium whitespace-nowrap text-popover-foreground outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground disabled:pointer-events-none disabled:opacity-40"
703
+ className="min-h-8 rounded-md px-2.5 py-1 text-xs font-medium whitespace-nowrap text-popover-foreground outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground disabled:pointer-events-none disabled:opacity-40"
710
704
  onClick={() => {
711
705
  onToggleKey(key);
712
706
  setOpenKey(null);
@@ -886,9 +880,9 @@ function SqlChartLoadingSkeleton({ panel }: { panel: SqlPanel }) {
886
880
  <Skeleton
887
881
  className={`w-full ${fill ? "h-full min-h-[250px] flex-1" : "h-[250px]"}`}
888
882
  />
889
- <div className="mt-2 grid min-h-16 grid-cols-2 gap-x-3 gap-y-1 overflow-hidden pr-1 sm:grid-cols-3">
890
- {Array.from({ length: 6 }).map((_, index) => (
891
- <div key={index} className="flex items-center gap-1.5">
883
+ <div className="mt-1 flex min-h-6 flex-wrap gap-x-3 gap-y-1 overflow-hidden pr-1">
884
+ {Array.from({ length: 3 }).map((_, index) => (
885
+ <div key={index} className="flex min-h-6 items-center gap-1.5">
892
886
  <Skeleton className="h-2.5 w-3 shrink-0 rounded-sm" />
893
887
  <Skeleton className="h-3 w-20 min-w-0" />
894
888
  </div>
@@ -898,7 +892,7 @@ function SqlChartLoadingSkeleton({ panel }: { panel: SqlPanel }) {
898
892
  );
899
893
  }
900
894
 
901
- function ChartTooltip({
895
+ export function ChartTooltip({
902
896
  active,
903
897
  payload,
904
898
  label,
@@ -918,12 +912,7 @@ function ChartTooltip({
918
912
  seriesNameFormatter?: (value: string) => string;
919
913
  valueFormatter?: (value: number) => string;
920
914
  }) {
921
- const anchorRef = useRef<HTMLDivElement | null>(null);
922
- const portalRef = useRef<HTMLDivElement | null>(null);
923
- const [portalPosition, setPortalPosition] = useState<{
924
- left: number;
925
- top: number;
926
- } | null>(null);
915
+ const tooltipRef = useChartTooltipFlip<HTMLDivElement>(active);
927
916
  const items = useMemo(
928
917
  () =>
929
918
  sortTooltipPayloadItems(
@@ -932,11 +921,6 @@ function ChartTooltip({
932
921
  ),
933
922
  [payload],
934
923
  );
935
- const portalVisible = portalPosition !== null;
936
- const clearPortalPosition = useCallback(
937
- () => setPortalPosition((prev) => (prev === null ? prev : null)),
938
- [],
939
- );
940
924
 
941
925
  const labelText =
942
926
  label == null
@@ -945,96 +929,14 @@ function ChartTooltip({
945
929
  ? labelFormatter(String(label))
946
930
  : String(label);
947
931
 
948
- useBrowserLayoutEffect(() => {
949
- if (!active || items.length === 0 || typeof window === "undefined") {
950
- clearPortalPosition();
951
- return;
952
- }
953
-
954
- const anchor = anchorRef.current;
955
- const wrapper = anchor?.parentElement;
956
- if (!anchor || !wrapper) return;
957
-
958
- let frame = 0;
959
- const apply = () => {
960
- frame = 0;
961
- if (!(wrapper as HTMLElement).style.transform) return;
962
-
963
- const anchorRect = anchor.getBoundingClientRect();
964
- const portalRect = portalRef.current?.getBoundingClientRect();
965
- const width = portalRect?.width || anchorRect.width;
966
- const height = portalRect?.height || anchorRect.height;
967
- if (width === 0 || height === 0) return;
968
-
969
- const sidebar = document.querySelector(".agent-sidebar-panel");
970
- const sidebarRect = sidebar?.getBoundingClientRect();
971
- const rightLimit =
972
- sidebarRect && sidebarRect.width > 0 && sidebarRect.left > 0
973
- ? sidebarRect.left - PORTAL_GUTTER_PADDING
974
- : window.innerWidth - PORTAL_GUTTER_PADDING;
975
- const bottomLimit = window.innerHeight - PORTAL_GUTTER_PADDING;
976
-
977
- let left = anchorRect.left;
978
- let top = anchorRect.top;
979
-
980
- if (left + width > rightLimit) {
981
- left = anchorRect.left - width - PORTAL_CURSOR_OFFSET;
982
- }
983
- left = Math.max(
984
- PORTAL_GUTTER_PADDING,
985
- Math.min(left, rightLimit - width),
986
- );
987
-
988
- if (top + height > bottomLimit) {
989
- top = bottomLimit - height;
990
- }
991
- top = Math.max(PORTAL_GUTTER_PADDING, top);
992
-
993
- setPortalPosition((prev) =>
994
- prev &&
995
- Math.abs(prev.left - left) < 0.5 &&
996
- Math.abs(prev.top - top) < 0.5
997
- ? prev
998
- : { left, top },
999
- );
1000
- };
1001
-
1002
- const schedule = () => {
1003
- if (frame) return;
1004
- frame = window.requestAnimationFrame(apply);
1005
- };
1006
-
1007
- schedule();
1008
-
1009
- const mutationObserver = new MutationObserver(schedule);
1010
- mutationObserver.observe(wrapper, {
1011
- attributes: true,
1012
- attributeFilter: ["style", "class"],
1013
- });
1014
-
1015
- const resizeObserver =
1016
- typeof ResizeObserver === "undefined"
1017
- ? null
1018
- : new ResizeObserver(schedule);
1019
- resizeObserver?.observe(anchor);
1020
- if (portalRef.current) resizeObserver?.observe(portalRef.current);
1021
-
1022
- window.addEventListener("resize", schedule);
1023
- window.addEventListener("scroll", schedule, true);
1024
-
1025
- return () => {
1026
- if (frame) window.cancelAnimationFrame(frame);
1027
- mutationObserver.disconnect();
1028
- resizeObserver?.disconnect();
1029
- window.removeEventListener("resize", schedule);
1030
- window.removeEventListener("scroll", schedule, true);
1031
- };
1032
- }, [active, clearPortalPosition, items.length, portalVisible]);
1033
-
1034
932
  if (!active || items.length === 0) return null;
1035
933
 
1036
934
  const tooltip = (
1037
- <div className="min-w-40 max-w-[280px] rounded-md border border-border bg-card px-3 py-2 text-xs text-foreground shadow-lg">
935
+ <div
936
+ ref={tooltipRef}
937
+ role="tooltip"
938
+ className="min-w-40 max-w-[280px] rounded-md border border-border bg-card px-3 py-2 text-xs text-foreground shadow-lg"
939
+ >
1038
940
  {labelText && (
1039
941
  <div className="mb-1.5 truncate font-medium text-foreground">
1040
942
  {labelText}
@@ -1068,31 +970,7 @@ function ChartTooltip({
1068
970
  </div>
1069
971
  );
1070
972
 
1071
- return (
1072
- <>
1073
- <div ref={anchorRef} aria-hidden="true" className="invisible">
1074
- {tooltip}
1075
- </div>
1076
- {portalPosition && typeof document !== "undefined"
1077
- ? createPortal(
1078
- <div
1079
- ref={portalRef}
1080
- role="tooltip"
1081
- style={{
1082
- position: "fixed",
1083
- left: portalPosition.left,
1084
- top: portalPosition.top,
1085
- zIndex: 1000,
1086
- pointerEvents: "none",
1087
- }}
1088
- >
1089
- {tooltip}
1090
- </div>,
1091
- document.body,
1092
- )
1093
- : null}
1094
- </>
1095
- );
973
+ return tooltip;
1096
974
  }
1097
975
 
1098
976
  function detectKeys(
@@ -1434,16 +1312,33 @@ function DashboardExtensionPanel({
1434
1312
  // dashboard report screenshots don't capture a blank extension panel.
1435
1313
  const [ready, setReady] = useState(false);
1436
1314
  const [unavailable, setUnavailable] = useState(false);
1315
+ const loadingSkeleton = !ready ? (
1316
+ <Skeleton
1317
+ data-dashboard-extension-loading="true"
1318
+ className="absolute inset-0 z-10 h-full min-h-[180px] w-full rounded-md"
1319
+ aria-hidden="true"
1320
+ />
1321
+ ) : null;
1437
1322
 
1438
1323
  if (slotId) {
1439
1324
  return (
1440
- <ExtensionSlot
1441
- id={slotId}
1442
- context={context}
1443
- showEmptyAffordance
1444
- className="min-h-[120px] w-full"
1445
- toolClassName="w-full"
1446
- />
1325
+ <div
1326
+ className="relative min-h-[180px] w-full"
1327
+ aria-busy={!ready}
1328
+ data-dashboard-report-loading={ready ? undefined : "true"}
1329
+ >
1330
+ {loadingSkeleton}
1331
+ <div className={ready ? "opacity-100" : "opacity-0"}>
1332
+ <ExtensionSlot
1333
+ id={slotId}
1334
+ context={context}
1335
+ showEmptyAffordance
1336
+ onReady={() => setReady(true)}
1337
+ className="min-h-[120px] w-full"
1338
+ toolClassName="w-full"
1339
+ />
1340
+ </div>
1341
+ </div>
1447
1342
  );
1448
1343
  }
1449
1344
 
@@ -1462,15 +1357,16 @@ function DashboardExtensionPanel({
1462
1357
 
1463
1358
  return (
1464
1359
  <div
1465
- className="w-full"
1360
+ className="relative min-h-[180px] w-full"
1361
+ aria-busy={!ready}
1466
1362
  data-dashboard-report-loading={ready ? undefined : "true"}
1467
1363
  >
1364
+ {loadingSkeleton}
1468
1365
  <EmbeddedExtension
1469
1366
  extensionId={extensionId!}
1470
1367
  slotId={`dashboard-panel-${panelId}`}
1471
- className="w-full"
1472
- // Intentional for v1: extension panels are standalone widgets and do not
1473
- // receive the dashboard's filters/variables/date range as `context`.
1368
+ context={context}
1369
+ className={ready ? "w-full opacity-100" : "w-full opacity-0"}
1474
1370
  initialHeight={180}
1475
1371
  onReady={() => setReady(true)}
1476
1372
  onUnavailable={() => {
@@ -95,16 +95,20 @@ const defaultTools = [
95
95
  "agent monitoring",
96
96
  "observability",
97
97
  "evals",
98
- "experiments",
99
98
  "feedback",
100
99
  "database",
101
100
  "db admin",
102
101
  "dashboard usage",
103
102
  "dashboard audit",
104
- "ab testing",
105
103
  "llm",
106
104
  ],
107
105
  },
106
+ {
107
+ id: "feature-flags",
108
+ nameKey: "agents.featureFlags",
109
+ href: "/agents?view=flags",
110
+ keywords: ["flags", "rollout", "release", "targeting"],
111
+ },
108
112
  {
109
113
  id: "explorer",
110
114
  nameKey: "commandPalette.toolExplorer",
@@ -565,7 +569,11 @@ export function CommandPalette() {
565
569
 
566
570
  <CommandGroup key="tools" heading={t("commandPalette.groupTools")}>
567
571
  {defaultTools
568
- .filter((tool) => tool.id !== "agents" || canManageOrg)
572
+ .filter((tool) =>
573
+ ["agents", "feature-flags"].includes(tool.id)
574
+ ? canManageOrg
575
+ : true,
576
+ )
569
577
  .map((tool) => (
570
578
  <CommandItem
571
579
  key={`tool-${tool.id}`}
@@ -136,7 +136,7 @@ const ChartTooltipContent = React.forwardRef<
136
136
  ref,
137
137
  ) => {
138
138
  const { config } = useChart();
139
- const flipRef = useChartTooltipFlip<HTMLDivElement>();
139
+ const flipRef = useChartTooltipFlip<HTMLDivElement>(active);
140
140
  const setRefs = React.useCallback(
141
141
  (node: HTMLDivElement | null) => {
142
142
  flipRef.current = node;
@@ -1,6 +1,6 @@
1
1
  import { useEffect, useRef } from "react";
2
2
 
3
- const RIGHT_GUTTER_PADDING = 12;
3
+ const VIEWPORT_GUTTER_PADDING = 12;
4
4
  const FLIP_CURSOR_OFFSET = 24;
5
5
 
6
6
  /**
@@ -10,10 +10,11 @@ const FLIP_CURSOR_OFFSET = 24;
10
10
  * `transform` (cursor moves) and translate the content left when its right
11
11
  * edge would land inside `.agent-sidebar-panel`.
12
12
  */
13
- export function useChartTooltipFlip<T extends HTMLElement>() {
13
+ export function useChartTooltipFlip<T extends HTMLElement>(active = true) {
14
14
  const ref = useRef<T | null>(null);
15
15
 
16
16
  useEffect(() => {
17
+ if (!active) return;
17
18
  const el = ref.current;
18
19
  if (!el) return;
19
20
  const wrapper = el.parentElement;
@@ -32,11 +33,25 @@ export function useChartTooltipFlip<T extends HTMLElement>() {
32
33
  sidebarRect && sidebarRect.width > 0 && sidebarRect.left > 0
33
34
  ? sidebarRect.left
34
35
  : window.innerWidth;
35
- const limit = gutterLeft - RIGHT_GUTTER_PADDING;
36
+ const rightLimit = gutterLeft - VIEWPORT_GUTTER_PADDING;
37
+ const bottomLimit = window.innerHeight - VIEWPORT_GUTTER_PADDING;
38
+ let translateX = 0;
39
+ let translateY = 0;
36
40
 
37
- if (rect.right > limit) {
38
- node.style.transform = `translateX(-${rect.width + FLIP_CURSOR_OFFSET}px)`;
41
+ if (rect.right > rightLimit) {
42
+ translateX = -(rect.width + FLIP_CURSOR_OFFSET);
39
43
  }
44
+ if (rect.bottom > bottomLimit) {
45
+ translateY = bottomLimit - rect.bottom;
46
+ } else if (rect.top < VIEWPORT_GUTTER_PADDING) {
47
+ translateY = VIEWPORT_GUTTER_PADDING - rect.top;
48
+ }
49
+
50
+ const transforms = [
51
+ translateX ? `translateX(${translateX}px)` : "",
52
+ translateY ? `translateY(${translateY}px)` : "",
53
+ ].filter(Boolean);
54
+ node.style.transform = transforms.join(" ");
40
55
  };
41
56
 
42
57
  apply();
@@ -46,7 +61,7 @@ export function useChartTooltipFlip<T extends HTMLElement>() {
46
61
  attributeFilter: ["style"],
47
62
  });
48
63
  return () => observer.disconnect();
49
- }, []);
64
+ }, [active]);
50
65
 
51
66
  return ref;
52
67
  }
@@ -129,7 +129,9 @@ export function useNavigationState() {
129
129
  if (cmd.view === "sessions") return "/sessions";
130
130
  if (
131
131
  cmd.view === "agents" &&
132
- (cmd.agentsView === "database" || cmd.agentsView === "dashboards")
132
+ (cmd.agentsView === "database" ||
133
+ cmd.agentsView === "dashboards" ||
134
+ cmd.agentsView === "flags")
133
135
  ) {
134
136
  const params = new URLSearchParams({ view: cmd.agentsView });
135
137
  if (cmd.agentsView === "database" && cmd.dbAdminConnectionId) {
@@ -484,12 +484,25 @@ const messages = {
484
484
  chartTypePie: "餡餅",
485
485
  chartTypeMetric: "公制",
486
486
  chartTypeTable: "桌子",
487
+ chartTypeExtension: "擴充功能",
487
488
  failedToSavePanel: "儲存面板失敗",
488
489
  failedToFormatSql: "格式化 SQL 失敗",
489
490
  title: "標題",
490
491
  titlePlaceholder: "例如每週註冊人數",
491
492
  chartType: "圖表型別",
492
493
  source: "來源",
494
+ extensionDisplay: "擴充功能顯示方式",
495
+ sharedExtension: "共用擴充功能",
496
+ perViewerSlot: "每位檢視者的插槽",
497
+ extension: "擴充功能",
498
+ loadingExtensions: "正在載入擴充功能...",
499
+ selectExtension: "選取擴充功能",
500
+ noExtensions: "沒有可見的擴充功能。請先建立或共用一個。",
501
+ sharedExtensionHelp:
502
+ "選取的擴充功能會與此儀表板共用,並顯示在排程報告中。檢視者仍需具備該擴充功能的存取權。",
503
+ slotIdOptional: "插槽 ID(選填)",
504
+ perViewerSlotHelp:
505
+ "每位檢視者各自安裝擴充功能。排程報告可能會顯示空插槽。留空即可產生穩定的 ID。",
493
506
  sectionColumns: "剖面列",
494
507
  format: "格式",
495
508
  filterInterpolation: "使用 {{example}} 插值濾波器值。",
@@ -698,6 +711,23 @@ const messages = {
698
711
  deleteConnectionTitle: "刪除資料庫連線?",
699
712
  deleteConnectionDescription:
700
713
  "這會從 Analytics 移除 {{name}} 並刪除儲存的連線密鑰。目標應用程式資料庫不會被修改。",
714
+ featureFlags: "功能旗標",
715
+ featureFlagsDescription: "檢視已註冊應用程式旗標,並進行可回復的發布調整。",
716
+ reloadFlags: "重新載入功能旗標",
717
+ loading: "載入中",
718
+ flagsUnavailable: "功能旗標無法使用",
719
+ flagsUnreachable: "無法連線到工作區目錄。連線可用後請重試。",
720
+ flagsEmpty: "沒有應用程式回報功能旗標",
721
+ flagsEmptyDetail: "連線的應用程式準備就緒後,已註冊旗標會顯示在這裡。",
722
+ flagsNotReady: "此應用程式為 {{status}},不會假定旗標已關閉。",
723
+ noFlagDefinitions: "此應用程式沒有已註冊的旗標定義。",
724
+ noFlagDescription: "未提供說明。",
725
+ selected: "已選取",
726
+ openFlag: "開啟功能旗標",
727
+ confirm: "確認",
728
+ name: "名稱",
729
+ appId: "應用程式 ID",
730
+ flagKey: "功能旗標",
701
731
  },
702
732
  providerCorpusNotifier: {
703
733
  completed: "提供者語料庫作業已完成",