@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
@@ -122,10 +122,11 @@ membership id when its native update status reports `update-available`.
122
122
  with captured errors, mint a temporary replay-context link, and inspect the
123
123
  timeline, page navigation, console diagnostics, failed network requests, and
124
124
  clicks when needed. The authenticated connector catalog is the fast fallback
125
- and exposes only bounded, user/org-scoped read actions for incident triage:
125
+ and exposes only bounded, user/org-scoped read actions. Incident triage uses:
126
126
  `list-session-recordings`, `get-session-replay-summary`,
127
127
  `get-session-replay-timeline`, `query-agent-native-analytics`,
128
- `list-error-issues`, and `get-error-issue`. Fetch the summary before the
128
+ `list-error-issues`, and `get-error-issue`. Cross-app Gong work also exposes
129
+ `account-deep-dive`, `gong-calls`, and `gong-native-insights`. Fetch the summary before the
129
130
  sanitized timeline; the timeline contains bounded page/click/error markers
130
131
  without raw replay events or storage references. Do not add replay blob or
131
132
  dashboard mutation actions to this catalog without an explicit security
@@ -137,8 +138,9 @@ membership id when its native update status reports `update-available`.
137
138
  issue id.
138
139
  - Analytics keeps its direct MCP surface explicitly curated, so external
139
140
  agents should use `ask_app` for multi-step investigation and changes. The
140
- six incident reads above are bounded, user/org-scoped fallback tools for
141
- callers that already know which lookup they need. Generic core
141
+ cataloged reads above are bounded, user/org-scoped fallback tools for callers
142
+ that already know which lookup they need. Sibling apps should invoke the exact
143
+ action directly when no Analytics reasoning loop is needed. Generic core
142
144
  `db-schema` / `db-query` remain in-app agent tools and are not exposed
143
145
  directly because broad SQL/schema access is too powerful to infer from
144
146
  read-only metadata. Writes remain `ask_app`-only. Use the explicit catalog
@@ -146,7 +148,18 @@ membership id when its native update status reports `update-available`.
146
148
  exposing an unannotated action.
147
149
  - `/agents` is the Analytics home for admin surfaces. The default Monitoring
148
150
  view embeds the shared observability dashboard for traces, conversations,
149
- evals, experiments, and feedback. `/agents?view=dashboards` shows the
151
+ evals, agent experiments, and feedback. `/agents?view=flags` is the
152
+ sole admin-only fleet feature-flag control plane. Call
153
+ `list-workspace-feature-flags` before changing a flag and preserve
154
+ each app's explicit state: `unsupported`, `unreachable`, `forbidden`, and
155
+ `unknown-legacy` are unknown states, never synonyms for off. Use
156
+ `set-workspace-feature-flag` for app-qualified changes; target apps remain the
157
+ source of truth and are resolved only through the trusted organization
158
+ directory. Treat only a versioned mutation response whose key, org scope, and
159
+ requested rules match as success. Flags are source-declared booleans; do not
160
+ create variants, metrics, exposure tracking, or per-app management panels.
161
+ Report a failed target mutation instead of claiming the rollout changed.
162
+ `/agents?view=dashboards` shows the
150
163
  admin-only dashboard usage audit; call `list-dashboard-usage-stats` when
151
164
  admins ask about dashboard created/modified dates, owners, last tracked
152
165
  modifier, views, engagements, saved views, or cleanup candidates. The
@@ -163,14 +176,17 @@ membership id when its native update status reports `update-available`.
163
176
  serialization traps. The script is constrained: only documented dashboard
164
177
  method calls with JSON-compatible arguments are parsed; variables, imports,
165
178
  loops, functions, network, filesystem, and DB access are not available.
166
- - Dashboard extension boxes use `chartType: "extension"` with
167
- `config.extensionSlotId`. The stable per-box slot is
168
- `analytics.dashboard.<dashboard-id>.panel.<panel-id>`. To add an extension,
169
- create/choose it, call `add-extension-slot-target` with that slot id, then
170
- `install-extension` with the same slot id. Installs are per-user; the
171
- dashboard panel remains shared. Slot-backed extensions receive dashboard id,
172
- name, description, current filters, and the panel id/title/slot id as context.
173
- `config.extensionId` is legacy direct embedding for existing dashboards.
179
+ - Dashboard extension boxes use `chartType: "extension"`. For ordinary requests
180
+ such as "put X in this dashboard," default to `config.extensionId`: the
181
+ author-selected extension is part of the shared dashboard, renders for every
182
+ viewer who can access it, and remains present in scheduled report captures.
183
+ Direct embeds receive dashboard id, name, description, current filters, and
184
+ panel context. Use `config.extensionSlotId` only when the user explicitly asks
185
+ for a personal/per-viewer widget slot. The stable per-box slot is
186
+ `analytics.dashboard.<dashboard-id>.panel.<panel-id>`; call
187
+ `add-extension-slot-target` and `install-extension` for it. Slot installs are
188
+ per-user, so different viewers can see different widgets and service-account
189
+ report captures may show the empty install affordance.
174
190
  - Dashboard saves keep bounded history in SQL. Use
175
191
  `list-dashboard-revisions` to inspect undo points and
176
192
  `restore-dashboard-revision` to restore one instead of hand-editing history
@@ -196,7 +212,11 @@ membership id when its native update status reports `update-available`.
196
212
  `update-extension` blocks full-body replacement unless
197
213
  `allowFullReplacement: true` is explicit, and that flag is reserved for a
198
214
  user-requested broad rewrite or a complete replacement body supplied by the
199
- user. If a focused edit fails, do not retry unchanged arguments.
215
+ user. A request that combines a visual rewrite (for example compacting,
216
+ removing sections, renaming, or changing padding) with a data repair is still
217
+ a broad rewrite; after inspecting the current extension, set
218
+ `allowFullReplacement: true` for the complete replacement. If a focused edit
219
+ fails, do not retry unchanged arguments.
200
220
  - Use framework sharing and access helpers for dashboards, analyses, and saved
201
221
  resources.
202
222
  - Dashboard email reports live in SQL via the
@@ -256,8 +276,9 @@ membership id when its native update status reports `update-available`.
256
276
  replay, `view="monitoring"` with `monitoringView="uptime|errors"` (plus the
257
277
  `monitorId`, `statusPageId`, or `errorIssueId` deep links) for uptime checks,
258
278
  public status pages, or error triage, and `view="agents"` with
259
- `agentsView="dashboards|database"` plus optional `dbAdminConnectionId` for
260
- dashboard usage or connected app database admin.
279
+ `agentsView="dashboards|database|flags"` plus optional
280
+ `dbAdminConnectionId` for dashboard usage, connected app database admin,
281
+ or fleet feature flags.
261
282
  - Use `view-screen` when the active dashboard/chart context is unclear.
262
283
 
263
284
  ## Session Replay
@@ -377,6 +377,7 @@ export default defineAction({
377
377
  }),
378
378
  http: { method: "GET" },
379
379
  readOnly: true,
380
+ publicAgent: { expose: true, readOnly: true, requiresAuth: true },
380
381
  run: async (args) => {
381
382
  const trimmedQuery = args.query.trim();
382
383
  const gaps: string[] = [];
@@ -0,0 +1,29 @@
1
+ import { defineAction } from "@agent-native/core";
2
+ import { z } from "zod";
3
+
4
+ import { writeGongNativeInsightsPolicy } from "../server/lib/gong-native-policy";
5
+
6
+ export default defineAction({
7
+ description:
8
+ "Enable or disable paid Gong native semantic operations for the current workspace. Enabling this permits individually authorized gong-native-insights calls to consume Gong credits; it does not send a Gong request by itself. Disable it to fail closed for every semantic request while keeping raw Gong evidence actions available.",
9
+ schema: z.object({
10
+ enabled: z
11
+ .boolean()
12
+ .describe(
13
+ "Whether this workspace may make paid Gong native semantic requests.",
14
+ ),
15
+ }),
16
+ http: { method: "POST" },
17
+ needsApproval: true,
18
+ toolCallable: false,
19
+ run: async ({ enabled }) => {
20
+ const policy = await writeGongNativeInsightsPolicy(enabled);
21
+ return {
22
+ ...policy,
23
+ creditRequests: 0,
24
+ guidance: enabled
25
+ ? "Gong native semantic requests are enabled for this scope. Each request still requires allowCreditRequest=true and independently consumes Gong credits."
26
+ : "Gong native semantic requests are disabled. Use gong-calls or the provider corpus evidence path.",
27
+ };
28
+ },
29
+ });
@@ -4,10 +4,14 @@ import { z } from "zod";
4
4
  import { getContentCalendarSchema } from "../server/lib/notion";
5
5
 
6
6
  export default defineAction({
7
- description: "Get the Notion content calendar database schema.",
8
- schema: z.object({}),
7
+ description:
8
+ "Get a Notion content calendar database schema. Pass databaseId when discovery would be ambiguous.",
9
+ schema: z.object({
10
+ databaseId: z.string().optional(),
11
+ }),
9
12
  http: { method: "GET" },
10
- run: async () => {
11
- return await getContentCalendarSchema();
13
+ readOnly: true,
14
+ run: async ({ databaseId }) => {
15
+ return await getContentCalendarSchema(databaseId);
12
16
  },
13
17
  });
@@ -7,11 +7,19 @@ export default defineAction({
7
7
  // Read-only provider query: safe to call from run-code `appAction` and
8
8
  // reusable across continuation retries (no re-fetch on resume).
9
9
  readOnly: true,
10
- description: "Get all entries from the Notion content calendar.",
11
- schema: z.object({}),
10
+ description:
11
+ "Get all entries from a Notion content calendar. Pass databaseId when a workspace has multiple matching databases; otherwise the action discovers the uniquely matching database by schema.",
12
+ schema: z.object({
13
+ databaseId: z
14
+ .string()
15
+ .optional()
16
+ .describe(
17
+ "Optional Notion database ID. Omit to discover a unique database with Topic, Status, and Publish Date properties.",
18
+ ),
19
+ }),
12
20
  http: { method: "GET" },
13
- run: async () => {
14
- const entries = await getContentCalendar();
21
+ run: async ({ databaseId }) => {
22
+ const entries = await getContentCalendar(databaseId);
15
23
  return { entries, total: Array.isArray(entries) ? entries.length : 0 };
16
24
  },
17
25
  });
@@ -132,7 +132,8 @@ export const DASHBOARD_MUTATION_EXAMPLES = [
132
132
  `dashboard.insertPanel({"id":"new-kpi","title":"New KPI","source":"first-party","chartType":"metric","width":1,"config":{"timeScope":"dashboard"},"sql":"SELECT COUNT(*) AS value FROM analytics_events WHERE event_date >= '{{dateStart}}' AND event_date < '{{dateEnd}}'"}).atTop();`,
133
133
  `dashboard.insertPanel({"id":"new-chart","title":"New Chart","source":"first-party","chartType":"line","width":1,"config":{"timeScope":"dashboard"},"sql":"SELECT event_date AS date, COUNT(*) AS value FROM analytics_events WHERE event_date >= '{{dateStart}}' AND event_date < '{{dateEnd}}' GROUP BY event_date ORDER BY event_date"}).nextTo("retention-over-time");`,
134
134
  `dashboard.insertPanel({"id":"row-chart","title":"Row Chart","source":"first-party","chartType":"bar","width":1,"config":{"timeScope":"dashboard"},"sql":"SELECT event_name AS name, COUNT(*) AS value FROM analytics_events WHERE event_date >= '{{dateStart}}' AND event_date < '{{dateEnd}}' GROUP BY event_name"}).atRow(2);`,
135
- 'dashboard.insertPanel({"id":"pipeline-widget","title":"Pipeline Widget","chartType":"extension","width":3,"config":{"extensionSlotId":"analytics.dashboard.<dashboard-id>.panel.pipeline-widget"}}).atBottom();',
135
+ 'dashboard.insertPanel({"id":"pipeline-widget","title":"Pipeline Widget","chartType":"extension","width":3,"config":{"extensionId":"<extension-id>"}}).atBottom();',
136
+ 'dashboard.insertPanel({"id":"personal-widget-slot","title":"Personal Widget Slot","chartType":"extension","width":3,"config":{"extensionSlotId":"analytics.dashboard.<dashboard-id>.panel.personal-widget-slot"}}).atBottom();',
136
137
  ] as const;
137
138
 
138
139
  export type DashboardMutationOperation =
@@ -20,10 +20,12 @@ const DEFAULT_GONG_TRANSCRIPT_LIMIT = 3;
20
20
  const MAX_GONG_TRANSCRIPT_LIMIT = 50;
21
21
  const DEFAULT_TRANSCRIPT_MAX_CHARS = 8_000;
22
22
  const MAX_TRANSCRIPT_MAX_CHARS = 100_000;
23
+ const MAX_AGGREGATE_TRANSCRIPT_CHARS = 60_000;
23
24
  const DEFAULT_TRANSCRIPT_SCAN_LIMIT = 50;
24
25
  const MAX_TRANSCRIPT_SCAN_LIMIT = 200;
25
26
  const DEFAULT_TRANSCRIPT_SEARCH_MAX_CHARS = MAX_TRANSCRIPT_MAX_CHARS;
26
27
  const TRANSCRIPT_BATCH_SIZE = 20;
28
+ const TRANSCRIPT_BATCH_CONCURRENCY = 3;
27
29
  const MAX_TRANSCRIPT_MATCHES_PER_CALL = 5;
28
30
  const MATCH_SNIPPET_RADIUS = 240;
29
31
 
@@ -74,6 +76,20 @@ function normalizeBoundedInt(
74
76
  return Math.max(min, Math.min(max, Math.floor(value!)));
75
77
  }
76
78
 
79
+ function boundedTranscriptExcerptChars(
80
+ requestedChars: number,
81
+ transcriptCount: number,
82
+ ): number {
83
+ if (transcriptCount <= 0) return requestedChars;
84
+ return Math.min(
85
+ requestedChars,
86
+ Math.max(
87
+ 1_000,
88
+ Math.floor(MAX_AGGREGATE_TRANSCRIPT_CHARS / transcriptCount),
89
+ ),
90
+ );
91
+ }
92
+
77
93
  function asRecord(value: unknown): Record<string, unknown> | null {
78
94
  return value && typeof value === "object"
79
95
  ? (value as Record<string, unknown>)
@@ -218,6 +234,36 @@ async function fetchTranscriptBatch(calls: GongCall[]): Promise<{
218
234
  }
219
235
  }
220
236
 
237
+ async function fetchTranscriptBatches(calls: GongCall[]): Promise<
238
+ Array<{
239
+ calls: GongCall[];
240
+ result: Awaited<ReturnType<typeof fetchTranscriptBatch>>;
241
+ }>
242
+ > {
243
+ const batches = chunkCalls(calls, TRANSCRIPT_BATCH_SIZE);
244
+ const results: Array<{
245
+ calls: GongCall[];
246
+ result: Awaited<ReturnType<typeof fetchTranscriptBatch>>;
247
+ }> = [];
248
+ for (
249
+ let index = 0;
250
+ index < batches.length;
251
+ index += TRANSCRIPT_BATCH_CONCURRENCY
252
+ ) {
253
+ results.push(
254
+ ...(await Promise.all(
255
+ batches
256
+ .slice(index, index + TRANSCRIPT_BATCH_CONCURRENCY)
257
+ .map(async (batch) => ({
258
+ calls: batch,
259
+ result: await fetchTranscriptBatch(batch),
260
+ })),
261
+ )),
262
+ );
263
+ }
264
+ return results;
265
+ }
266
+
221
267
  async function searchTranscriptEvidence(
222
268
  calls: GongCall[],
223
269
  query: string,
@@ -234,8 +280,10 @@ async function searchTranscriptEvidence(
234
280
  let truncatedTranscripts = 0;
235
281
  const callsToScan = calls.slice(0, scanLimit);
236
282
 
237
- for (const batch of chunkCalls(callsToScan, TRANSCRIPT_BATCH_SIZE)) {
238
- const batchResult = await fetchTranscriptBatch(batch);
283
+ for (const {
284
+ calls: batch,
285
+ result: batchResult,
286
+ } of await fetchTranscriptBatches(callsToScan)) {
239
287
  errors.push(...batchResult.errors);
240
288
 
241
289
  for (const call of batch) {
@@ -374,8 +422,10 @@ async function loadTranscriptEvidence(
374
422
  ): Promise<TranscriptEvidence[]> {
375
423
  const evidence: TranscriptEvidence[] = [];
376
424
  const callsToLoad = calls.slice(0, limit);
377
- for (const batch of chunkCalls(callsToLoad, TRANSCRIPT_BATCH_SIZE)) {
378
- const batchResult = await fetchTranscriptBatch(batch);
425
+ for (const {
426
+ calls: batch,
427
+ result: batchResult,
428
+ } of await fetchTranscriptBatches(callsToLoad)) {
379
429
  const errorByCallId = new Map(
380
430
  batchResult.errors.map((error) => [error.callId, error.error]),
381
431
  );
@@ -411,19 +461,31 @@ async function loadTranscriptEvidence(
411
461
  * ISO string for the Gong window filters. Returns undefined for empty/invalid
412
462
  * input so the caller falls back to the `days` window.
413
463
  */
414
- function normalizeGongDate(value: string | undefined): string | undefined {
464
+ function normalizeGongDate(
465
+ value: string | undefined,
466
+ boundary: "start" | "end" = "start",
467
+ ): string | undefined {
415
468
  if (!value || typeof value !== "string") return undefined;
416
- const ms = Date.parse(value.trim());
469
+ const normalized = value.trim();
470
+ const dateOnly = /^\d{4}-\d{2}-\d{2}$/.test(normalized);
471
+ const ms = Date.parse(dateOnly ? `${normalized}T00:00:00.000Z` : normalized);
417
472
  if (Number.isNaN(ms)) return undefined;
418
- return new Date(ms).toISOString();
473
+ const date = new Date(ms);
474
+ if (dateOnly && boundary === "end") date.setUTCDate(date.getUTCDate() + 1);
475
+ return date.toISOString();
419
476
  }
420
477
 
421
478
  export default defineAction({
422
479
  // Read-only provider query: safe to call from run-code `appAction` and
423
480
  // reusable across continuation retries (no re-fetch on resume).
424
481
  readOnly: true,
482
+ publicAgent: { expose: true, readOnly: true, requiresAuth: true },
483
+ // A bounded multi-call transcript review is intentionally larger than the
484
+ // shared 50K tool default. One batched result avoids 10+ one-call-at-a-time
485
+ // model round trips while still staying well below the model context limit.
486
+ maxResultChars: 100_000,
425
487
  description:
426
- "Query Gong sales calls, transcripts, and users. Pass --users for user list, --transcript for one transcript, --company to search by company/domain/person/email. For bounded account-level transcript mention/search questions, set transcriptQuery to search matching transcripts server-side and return coverage counts plus snippets instead of large transcript blobs. For deal, customer, objection, next-step, or deep-dive analysis, set includeTranscripts=true only when you need broad qualitative context rather than a specific term search. For complete account/cohort coverage (call counts, broad cohorts, or when 'no calls mention X' must be defensible), use provider-api-catalog(provider='gong') and provider-corpus-job mode='batch-search' against /calls/transcript after call-id discovery; this action can still enumerate a bounded account/company window with exhaustive=true via after/before.",
488
+ "Query Gong sales calls, transcripts, and users. Pass --users for user list, --transcript for one transcript, --company to search by company/domain/person/email. For bounded account-level transcript mention/search questions, set transcriptQuery to search matching transcripts server-side and return coverage counts plus snippets instead of large transcript blobs. For deal, customer, objection, next-step, or deep-dive analysis, set includeTranscripts=true only when you need broad qualitative context rather than a specific term search. For an 'all calls' transcript review in a bounded account/date window, use exhaustive=true with after/before and includeTranscripts=true; the action batches transcript retrieval and reports complete/partial coverage instead of forcing one tool call per transcript. For very broad cohorts or defensible absence searches, use provider-api-catalog(provider='gong') and provider-corpus-job mode='batch-search' against /calls/transcript after call-id discovery.",
427
489
  schema: z.object({
428
490
  users: cliBoolean.optional().describe("Set to true to list Gong users"),
429
491
  transcript: z.string().optional().describe("Call ID to get transcript"),
@@ -470,7 +532,7 @@ export default defineAction({
470
532
  .max(MAX_TRANSCRIPT_MAX_CHARS)
471
533
  .optional()
472
534
  .describe(
473
- "Maximum transcript characters to return per call (default 8000, max 100000). Use the default for analysis; raise it only when the user asks for more quoted detail.",
535
+ "Maximum transcript characters to return per call (default 8000, max 100000). Batched results also share a 60000-character aggregate excerpt budget. Use the default for analysis; raise it only when the user asks for more quoted detail.",
474
536
  ),
475
537
  transcriptQuery: z
476
538
  .string()
@@ -490,7 +552,7 @@ export default defineAction({
490
552
  exhaustive: cliBoolean
491
553
  .optional()
492
554
  .describe(
493
- "Return EVERY matching call in the window instead of stopping at `limit` — use this for complete cohort/account coverage when 'how many' or absence matters (e.g. scanning all of an account's calls). Returns call metadata only (transcripts are never auto-loaded in this mode, so it stays fast and avoids context bloat); then pull transcripts deliberately with `--transcript=<callId>` or a run-code scan. Always bound it with `after`/`before` or a small `days`: an unbounded exhaustive scan pages the whole Gong org and can hit the function timeout.",
555
+ "Return EVERY matching call in the window instead of stopping at `limit` — use this for complete cohort/account coverage when 'how many' or absence matters. By default this is metadata-only. With includeTranscripts=true, transcripts are fetched in batches up to transcriptLimit (all matched calls by default when there are 50 or fewer) and explicit coverage is returned. Always bound it with after/before or a small days window: an unbounded exhaustive scan pages the whole Gong org and can hit the function timeout.",
494
556
  ),
495
557
  after: z
496
558
  .string()
@@ -532,21 +594,21 @@ export default defineAction({
532
594
  );
533
595
  const exhaustive = Boolean(args.exhaustive);
534
596
  const fromDateTime = normalizeGongDate(args.after);
535
- const toDateTime = normalizeGongDate(args.before);
597
+ const toDateTime = normalizeGongDate(args.before, "end");
536
598
  const result = await searchCalls(args.company, days, limit, {
537
599
  exhaustive,
538
600
  ...(fromDateTime ? { fromDateTime } : {}),
539
601
  ...(toDateTime ? { toDateTime } : {}),
540
602
  });
541
- // Exhaustive mode is a metadata-only discovery pass: never auto-load
542
- // transcripts (that would bloat context and risk the function timeout).
543
- // The agent pulls transcripts deliberately afterward (--transcript or a
544
- // run-code scan over result.calls).
545
- const shouldLoadTranscripts =
546
- Boolean(args.includeTranscripts) && !exhaustive;
603
+ const shouldLoadTranscripts = Boolean(args.includeTranscripts);
547
604
  const transcriptLimit = normalizeBoundedInt(
548
605
  args.transcriptLimit,
549
- DEFAULT_GONG_TRANSCRIPT_LIMIT,
606
+ exhaustive
607
+ ? Math.max(
608
+ 1,
609
+ Math.min(result.calls.length, MAX_GONG_TRANSCRIPT_LIMIT),
610
+ )
611
+ : DEFAULT_GONG_TRANSCRIPT_LIMIT,
550
612
  1,
551
613
  MAX_GONG_TRANSCRIPT_LIMIT,
552
614
  );
@@ -557,6 +619,10 @@ export default defineAction({
557
619
  1_000,
558
620
  MAX_TRANSCRIPT_MAX_CHARS,
559
621
  );
622
+ const boundedTranscriptExcerptMaxChars = boundedTranscriptExcerptChars(
623
+ transcriptExcerptMaxChars,
624
+ Math.min(transcriptLimit, result.calls.length),
625
+ );
560
626
  const transcriptSearchMaxChars = normalizeBoundedInt(
561
627
  args.transcriptMaxChars,
562
628
  transcriptQuery
@@ -583,9 +649,16 @@ export default defineAction({
583
649
  ? await loadTranscriptEvidence(
584
650
  result.calls,
585
651
  transcriptLimit,
586
- transcriptExcerptMaxChars,
652
+ boundedTranscriptExcerptMaxChars,
587
653
  )
588
654
  : undefined;
655
+ const transcriptErrors =
656
+ transcripts?.filter((transcript) => Boolean(transcript.error)) ?? [];
657
+ const transcriptCoverageComplete = Boolean(
658
+ transcripts &&
659
+ transcripts.length >= result.calls.length &&
660
+ transcriptErrors.length === 0,
661
+ );
589
662
 
590
663
  return {
591
664
  ...result,
@@ -611,15 +684,29 @@ export default defineAction({
611
684
  }
612
685
  : {}),
613
686
  ...(transcripts ? { transcripts } : {}),
687
+ ...(transcripts
688
+ ? {
689
+ transcriptCoverage: {
690
+ availableCalls: result.calls.length,
691
+ inspectedCalls: transcripts.length,
692
+ successfulCalls: transcripts.length - transcriptErrors.length,
693
+ errorCount: transcriptErrors.length,
694
+ coverageComplete: transcriptCoverageComplete,
695
+ scanLimited: transcripts.length < result.calls.length,
696
+ },
697
+ }
698
+ : {}),
614
699
  guidance: [
615
700
  transcriptSearch
616
701
  ? `Transcript search inspected ${transcriptSearch.inspectedCalls} of ${result.calls.length} matching call(s) for "${transcriptQuery}" and found ${transcriptSearch.matches.length} matching call(s). Use coverageComplete/errors before making absence claims; increase transcriptScanLimit or narrow the window if coverage is incomplete.`
617
702
  : "",
618
703
  exhaustive
619
- ? `Exhaustive discovery: returned all ${result.calls.length} matching call(s) in the window (metadata only). To search transcript content for a term, pull transcripts with --transcript=<callId> or a run-code scan over these call IDs — do not conclude a term is absent from metadata alone.`
704
+ ? shouldLoadTranscripts
705
+ ? `Exhaustive discovery returned all ${result.calls.length} matching call(s) in the bounded window before loading transcripts.`
706
+ : `Exhaustive discovery: returned all ${result.calls.length} matching call(s) in the window (metadata only). Set includeTranscripts=true to fetch the bounded set in batches, or use a provider-corpus job for a broader transcript search.`
620
707
  : callLimitGuidance(result.limit, result.truncated),
621
708
  shouldLoadTranscripts
622
- ? `Loaded transcript excerpts for ${transcripts?.length ?? 0} matching call(s). Ground qualitative claims in the transcript text and cite the inspected call count.`
709
+ ? `Loaded transcript excerpts for ${transcripts?.length ?? 0} of ${result.calls.length} matching call(s) in batches (${transcriptCoverageComplete ? "complete coverage" : "partial coverage"}). Ground qualitative claims in the transcript text and cite transcriptCoverage; do not fetch these calls again one at a time.`
623
710
  : exhaustive
624
711
  ? ""
625
712
  : "For deep-dive or qualitative analysis, call this action again with includeTranscripts=true before drawing conclusions from call content.",
@@ -651,6 +738,10 @@ export default defineAction({
651
738
  1_000,
652
739
  MAX_TRANSCRIPT_MAX_CHARS,
653
740
  );
741
+ const boundedTranscriptExcerptMaxChars = boundedTranscriptExcerptChars(
742
+ transcriptExcerptMaxChars,
743
+ Math.min(transcriptLimit, limited.calls.length),
744
+ );
654
745
  const transcriptSearchMaxChars = normalizeBoundedInt(
655
746
  args.transcriptMaxChars,
656
747
  transcriptQuery
@@ -677,7 +768,7 @@ export default defineAction({
677
768
  ? await loadTranscriptEvidence(
678
769
  limited.calls,
679
770
  transcriptLimit,
680
- transcriptExcerptMaxChars,
771
+ boundedTranscriptExcerptMaxChars,
681
772
  )
682
773
  : undefined;
683
774
 
@@ -0,0 +1,166 @@
1
+ import { defineAction } from "@agent-native/core";
2
+ import {
3
+ callMcpTool,
4
+ listVisibleMcpTools,
5
+ type AppMcpTool,
6
+ } from "@agent-native/core/mcp-client";
7
+ import { z } from "zod";
8
+
9
+ import { readGongNativeInsightsPolicy } from "../server/lib/gong-native-policy";
10
+
11
+ const GONG_NATIVE_OPERATIONS = [
12
+ "ask_account",
13
+ "ask_deal",
14
+ "generate_brief",
15
+ ] as const;
16
+
17
+ type GongNativeOperation = (typeof GONG_NATIVE_OPERATIONS)[number];
18
+
19
+ function operationName(value: string): string {
20
+ return value.trim().toLowerCase().replace(/-/g, "_");
21
+ }
22
+
23
+ function gongNativeTools(tools: AppMcpTool[]): AppMcpTool[] {
24
+ const names = new Set<string>(GONG_NATIVE_OPERATIONS);
25
+ return tools.filter((tool) => names.has(operationName(tool.name)));
26
+ }
27
+
28
+ function selectTool(
29
+ tools: AppMcpTool[],
30
+ operation: GongNativeOperation,
31
+ ): AppMcpTool | null {
32
+ const matches = tools.filter(
33
+ (tool) => operationName(tool.name) === operation,
34
+ );
35
+ if (matches.length === 1) return matches[0];
36
+ const gongNamed = matches.filter((tool) => /gong/i.test(tool.serverId));
37
+ return gongNamed.length === 1 ? gongNamed[0] : null;
38
+ }
39
+
40
+ export default defineAction({
41
+ description:
42
+ "Use Gong's official MCP semantic operations for one bounded qualitative synthesis request. Omit operation to inspect the connected schemas without spending Gong credits. Paid calls fail closed unless configure-gong-native-insights has enabled them for this workspace and this invocation sets allowCreditRequest=true. With operation, pass one consolidated arguments object; each invocation independently consumes Gong credits. Use this only for themes, risks, summaries, and deck narrative. For transcripts, quotes, counts, source records, or absence/exhaustive claims use gong-calls or the provider corpus evidence path instead.",
43
+ schema: z.object({
44
+ operation: z
45
+ .enum(GONG_NATIVE_OPERATIONS)
46
+ .optional()
47
+ .describe(
48
+ "Official Gong MCP operation. Omit to list the currently connected operation schemas without calling Gong AI.",
49
+ ),
50
+ allowCreditRequest: z
51
+ .boolean()
52
+ .default(false)
53
+ .describe(
54
+ "Explicitly authorize this one Gong semantic request. Leave false while inspecting schemas or when the workspace should not spend Gong credits.",
55
+ ),
56
+ arguments: z
57
+ .record(z.string(), z.unknown())
58
+ .default({})
59
+ .describe(
60
+ "Arguments passed unchanged to the connected Gong MCP operation. Consolidate related questions into one request and narrow the entity/date scope.",
61
+ ),
62
+ }),
63
+ readOnly: true,
64
+ parallelSafe: true,
65
+ needsApproval: ({ operation, allowCreditRequest }) =>
66
+ Boolean(operation && allowCreditRequest),
67
+ publicAgent: { expose: true, readOnly: true, requiresAuth: true },
68
+ http: false,
69
+ run: async ({ operation, allowCreditRequest, arguments: args }) => {
70
+ const tools = gongNativeTools(await listVisibleMcpTools());
71
+ if (!operation) {
72
+ return {
73
+ connected: tools.length > 0,
74
+ creditRequests: 0,
75
+ creditUnit: "request",
76
+ evidenceMode: "provider-synthesis",
77
+ rawEvidenceAvailable: false,
78
+ operations: tools.map((tool) => ({
79
+ operation: operationName(tool.name),
80
+ serverId: tool.serverId,
81
+ description: tool.description,
82
+ inputSchema: tool.inputSchema,
83
+ })),
84
+ evidenceFallbackAction: "gong-calls",
85
+ guidance:
86
+ tools.length > 0
87
+ ? "Choose one operation and make one consolidated, narrowly scoped request. Inspecting this catalog did not call Gong AI or consume a Gong credit request."
88
+ : "No official Gong semantic MCP operations are connected in this request scope. Use gong-calls for bounded evidence, or connect Gong MCP before using the synthesis path.",
89
+ };
90
+ }
91
+
92
+ if (!allowCreditRequest) {
93
+ return {
94
+ connected: tools.length > 0,
95
+ operation,
96
+ blocked: true,
97
+ creditRequests: 0,
98
+ creditUnit: "request",
99
+ evidenceMode: "provider-synthesis",
100
+ rawEvidenceAvailable: false,
101
+ evidenceFallbackAction: "gong-calls",
102
+ guidance:
103
+ "This Gong semantic request was not sent. Set allowCreditRequest=true only after choosing one consolidated, narrowly scoped request; use gong-calls for evidence retrieval without Gong AI synthesis.",
104
+ };
105
+ }
106
+
107
+ const policy = await readGongNativeInsightsPolicy();
108
+ if (!policy.enabled) {
109
+ return {
110
+ connected: tools.length > 0,
111
+ operation,
112
+ blocked: true,
113
+ blockedBy: "workspace-policy",
114
+ policy,
115
+ creditRequests: 0,
116
+ creditUnit: "request",
117
+ evidenceMode: "provider-synthesis",
118
+ rawEvidenceAvailable: false,
119
+ evidenceFallbackAction: "gong-calls",
120
+ guidance:
121
+ "This Gong semantic request was not sent because paid native insights are disabled for this workspace. An authorized user can enable them with configure-gong-native-insights; use gong-calls for evidence retrieval in the meantime.",
122
+ };
123
+ }
124
+
125
+ const tool = selectTool(tools, operation);
126
+ if (!tool) {
127
+ return {
128
+ connected: tools.length > 0,
129
+ operation,
130
+ creditRequests: 0,
131
+ creditUnit: "request",
132
+ evidenceMode: "provider-synthesis",
133
+ rawEvidenceAvailable: false,
134
+ error:
135
+ tools.length === 0
136
+ ? "No official Gong semantic MCP operations are connected in this request scope."
137
+ : `The ${operation} operation is missing or ambiguous across connected MCP servers.`,
138
+ availableOperations: tools.map((candidate) => ({
139
+ operation: operationName(candidate.name),
140
+ serverId: candidate.serverId,
141
+ })),
142
+ evidenceFallbackAction: "gong-calls",
143
+ };
144
+ }
145
+
146
+ const startedAt = Date.now();
147
+ const result = await callMcpTool(tool.serverId, tool.name, args);
148
+ return {
149
+ connected: true,
150
+ source: "gong-native-mcp",
151
+ operation,
152
+ creditRequests: 1,
153
+ creditUnit: "request",
154
+ durationMs: Date.now() - startedAt,
155
+ evidenceMode: "provider-synthesis",
156
+ synthesisOnly: true,
157
+ rawEvidenceAvailable: false,
158
+ coverageComplete: false,
159
+ coverageUnknown: true,
160
+ result,
161
+ evidenceFallbackAction: "gong-calls",
162
+ guidance:
163
+ "Treat this as Gong-generated qualitative synthesis, not transcript evidence. Do not use it for verbatim quotes, exact counts, source-record claims, or proof of absence; route those to gong-calls or the provider corpus evidence path.",
164
+ };
165
+ },
166
+ });