@agent-native/core 0.108.0 → 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 (302) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +18 -0
  3. package/corpus/core/package.json +1 -1
  4. package/corpus/core/src/a2a/client.ts +140 -17
  5. package/corpus/core/src/a2a/handlers.ts +60 -0
  6. package/corpus/core/src/a2a/index.ts +6 -1
  7. package/corpus/core/src/a2a/invoke.ts +68 -1
  8. package/corpus/core/src/a2a/server.ts +13 -1
  9. package/corpus/core/src/a2a/types.ts +16 -0
  10. package/corpus/core/src/action.ts +3 -2
  11. package/corpus/core/src/agent/production-agent.ts +10 -4
  12. package/corpus/core/src/client/AssistantChat.tsx +648 -603
  13. package/corpus/core/src/client/MultiTabAssistantChat.tsx +31 -4
  14. package/corpus/core/src/client/agent-chat-adapter.ts +23 -37
  15. package/corpus/core/src/client/agent-sidebar-state.ts +4 -0
  16. package/corpus/core/src/client/analytics.ts +84 -0
  17. package/corpus/core/src/client/chat/message-components.tsx +94 -22
  18. package/corpus/core/src/client/chat/tool-call-display.tsx +170 -47
  19. package/corpus/core/src/client/chat/use-agent-chat-lifecycle-tracking.ts +74 -0
  20. package/corpus/core/src/client/chat-thread-url.ts +11 -0
  21. package/corpus/core/src/client/error-capture.ts +12 -0
  22. package/corpus/core/src/client/extensions/ExtensionSlot.tsx +37 -1
  23. package/corpus/core/src/client/index.ts +2 -0
  24. package/corpus/core/src/client/route-chunk-recovery.ts +20 -8
  25. package/corpus/core/src/client/session-replay.ts +31 -0
  26. package/corpus/core/src/extensions/actions.ts +2 -14
  27. package/corpus/core/src/extensions/store.ts +1 -1
  28. package/corpus/core/src/localization/default-messages.ts +3 -0
  29. package/corpus/core/src/mcp/build-server.ts +2 -2
  30. package/corpus/core/src/progress/actions.ts +4 -2
  31. package/corpus/core/src/provider-api/index.ts +205 -105
  32. package/corpus/core/src/scripts/call-agent.ts +137 -17
  33. package/corpus/core/src/server/agent-chat/action-filters-a2a.ts +40 -0
  34. package/corpus/core/src/server/agent-chat-plugin.ts +31 -0
  35. package/corpus/core/src/styles/agent-conversation.css +7 -0
  36. package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +20 -0
  37. package/corpus/core/src/templates/default/app/i18n/de-DE.ts +20 -0
  38. package/corpus/core/src/templates/default/app/i18n/en-US.ts +20 -0
  39. package/corpus/core/src/templates/default/app/i18n/es-ES.ts +20 -0
  40. package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +21 -0
  41. package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +19 -0
  42. package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +20 -0
  43. package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +19 -0
  44. package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +20 -0
  45. package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +19 -0
  46. package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +19 -0
  47. package/corpus/core/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +28 -0
  48. package/corpus/core/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +5 -0
  49. package/corpus/core/src/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
  50. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +29 -10
  51. package/corpus/templates/analytics/.agents/skills/gong/SKILL.md +54 -23
  52. package/corpus/templates/analytics/.builder/skills/apollo/SKILL.md +19 -41
  53. package/corpus/templates/analytics/.builder/skills/commonroom/SKILL.md +20 -35
  54. package/corpus/templates/analytics/.builder/skills/github/SKILL.md +23 -67
  55. package/corpus/templates/analytics/.builder/skills/pylon/SKILL.md +25 -43
  56. package/corpus/templates/analytics/AGENTS.md +22 -13
  57. package/corpus/templates/analytics/actions/account-deep-dive.ts +1 -0
  58. package/corpus/templates/analytics/actions/configure-gong-native-insights.ts +29 -0
  59. package/corpus/templates/analytics/actions/content-calendar-schema.ts +8 -4
  60. package/corpus/templates/analytics/actions/content-calendar.ts +12 -4
  61. package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +2 -1
  62. package/corpus/templates/analytics/actions/gong-calls.ts +113 -22
  63. package/corpus/templates/analytics/actions/gong-native-insights.ts +166 -0
  64. package/corpus/templates/analytics/actions/hubspot-deals.ts +190 -46
  65. package/corpus/templates/analytics/actions/pylon-issues.ts +123 -0
  66. package/corpus/templates/analytics/actions/slack-messages.ts +179 -27
  67. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +48 -152
  68. package/corpus/templates/analytics/app/components/ui/chart.tsx +1 -1
  69. package/corpus/templates/analytics/app/hooks/use-chart-tooltip-flip.ts +21 -6
  70. package/corpus/templates/analytics/app/i18n/zh-TW.ts +13 -0
  71. package/corpus/templates/analytics/app/i18n-data.ts +134 -0
  72. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +181 -30
  73. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +6 -0
  74. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +4 -3
  75. package/corpus/templates/analytics/changelog/2026-07-17-dashboard-editors-can-add-shared-extensions-or-opt-into-per-.md +6 -0
  76. package/corpus/templates/analytics/changelog/2026-07-17-dashboard-extensions-show-a-loading-skeleton.md +6 -0
  77. package/corpus/templates/analytics/changelog/2026-07-17-errors-now-group-repeat-failures-consistently-and-keep-priva.md +6 -0
  78. package/corpus/templates/analytics/changelog/2026-07-17-gong-transcript-reviews-now-batch-bounded-call-windows-for-f.md +6 -0
  79. package/corpus/templates/analytics/changelog/2026-07-17-hubspot-deal-filters-now-run-in-hubspot-before-paging-result.md +6 -0
  80. package/corpus/templates/analytics/changelog/2026-07-17-notion-content-calendars-now-discover-the-matching-database-.md +6 -0
  81. package/corpus/templates/analytics/changelog/2026-07-17-pylon-dashboard-reads-now-use-the-paginated-issue-search-api.md +6 -0
  82. package/corpus/templates/analytics/changelog/2026-07-17-slack-reads-no-longer-join-channels-and-report-pagination-coverage.md +6 -0
  83. package/corpus/templates/analytics/server/handlers/notion.ts +14 -3
  84. package/corpus/templates/analytics/server/handlers/slack.ts +182 -29
  85. package/corpus/templates/analytics/server/lib/agent-chat-plan-mode.ts +2 -6
  86. package/corpus/templates/analytics/server/lib/analytics-connector-catalog.ts +6 -2
  87. package/corpus/templates/analytics/server/lib/error-capture.ts +75 -8
  88. package/corpus/templates/analytics/server/lib/gong-native-policy.ts +72 -0
  89. package/corpus/templates/analytics/server/lib/gong.ts +54 -66
  90. package/corpus/templates/analytics/server/lib/hubspot.ts +40 -3
  91. package/corpus/templates/analytics/server/lib/notion.ts +83 -8
  92. package/corpus/templates/analytics/server/lib/real-data-actions.ts +4 -0
  93. package/corpus/templates/analytics/server/lib/slack.ts +242 -90
  94. package/corpus/templates/analytics/server/plugins/agent-chat.ts +3 -3
  95. package/corpus/templates/analytics/server/routes/api/pylon/accounts.get.ts +42 -1
  96. package/corpus/templates/analytics/server/routes/api/pylon/issues.get.ts +71 -1
  97. package/corpus/templates/analytics/server/routes/api/test-connection.post.ts +44 -4
  98. package/corpus/templates/clips/app/components/library/bulk-action-toolbar.tsx +19 -1
  99. package/corpus/templates/clips/app/components/library/create-folder-dialog.tsx +123 -0
  100. package/corpus/templates/clips/app/components/library/library-grid.tsx +42 -4
  101. package/corpus/templates/clips/app/components/library/recording-card.tsx +30 -0
  102. package/corpus/templates/clips/app/entry.client.tsx +6 -1
  103. package/corpus/templates/clips/app/i18n/ar-SA.ts +12 -1
  104. package/corpus/templates/clips/app/i18n/de-DE.ts +12 -1
  105. package/corpus/templates/clips/app/i18n/en-US.ts +12 -1
  106. package/corpus/templates/clips/app/i18n/es-ES.ts +11 -1
  107. package/corpus/templates/clips/app/i18n/fr-FR.ts +11 -1
  108. package/corpus/templates/clips/app/i18n/hi-IN.ts +10 -1
  109. package/corpus/templates/clips/app/i18n/ja-JP.ts +12 -1
  110. package/corpus/templates/clips/app/i18n/ko-KR.ts +11 -1
  111. package/corpus/templates/clips/app/i18n/pt-BR.ts +11 -1
  112. package/corpus/templates/clips/app/i18n/zh-CN.ts +11 -1
  113. package/corpus/templates/clips/app/i18n/zh-TW.ts +11 -1
  114. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +72 -1
  115. package/corpus/templates/clips/changelog/2026-07-17-choose-which-workspace-receives-new-clips-recordings-and-des.md +6 -0
  116. package/corpus/templates/clips/changelog/2026-07-17-create-folders-directly-from-the-move-menu.md +6 -0
  117. package/corpus/templates/clips/changelog/2026-07-17-failed-desktop-uploads-now-offer-a-direct-way-to-reopen-clip.md +6 -0
  118. package/corpus/templates/clips/desktop/src/app.tsx +1 -1
  119. package/corpus/templates/content/app/entry.client.tsx +6 -1
  120. package/corpus/templates/dispatch/AGENTS.md +5 -0
  121. package/corpus/templates/dispatch/changelog/2026-07-17-apps-page-links-to-other-available-apps.md +6 -0
  122. package/corpus/templates/dispatch/changelog/2026-07-17-curated-template-remixes.md +6 -0
  123. package/corpus/templates/mail/app/entry.client.tsx +6 -1
  124. package/corpus/templates/slides/.agents/skills/slide-images/SKILL.md +11 -7
  125. package/corpus/templates/slides/.env.example +0 -1
  126. package/corpus/templates/slides/AGENTS.md +4 -0
  127. package/corpus/templates/slides/DEVELOPING.md +2 -2
  128. package/corpus/templates/slides/actions/index-design-system-with-builder.ts +1 -1
  129. package/corpus/templates/slides/actions/logo-config.ts +6 -7
  130. package/corpus/templates/slides/actions/search-images.ts +11 -39
  131. package/corpus/templates/slides/actions/search-logos.ts +5 -52
  132. package/corpus/templates/slides/app/components/editor/ImageSearchPanel.tsx +1 -1
  133. package/corpus/templates/slides/app/components/editor/LogoSearchPanel.tsx +16 -26
  134. package/corpus/templates/slides/app/entry.client.tsx +6 -1
  135. package/corpus/templates/slides/server/lib/media-search-providers.ts +216 -0
  136. package/corpus/templates/slides/server/register-secrets.ts +30 -0
  137. package/dist/a2a/client.d.ts +38 -1
  138. package/dist/a2a/client.d.ts.map +1 -1
  139. package/dist/a2a/client.js +81 -12
  140. package/dist/a2a/client.js.map +1 -1
  141. package/dist/a2a/handlers.d.ts.map +1 -1
  142. package/dist/a2a/handlers.js +47 -0
  143. package/dist/a2a/handlers.js.map +1 -1
  144. package/dist/a2a/index.d.ts +4 -4
  145. package/dist/a2a/index.d.ts.map +1 -1
  146. package/dist/a2a/index.js +2 -2
  147. package/dist/a2a/index.js.map +1 -1
  148. package/dist/a2a/invoke.d.ts +26 -2
  149. package/dist/a2a/invoke.d.ts.map +1 -1
  150. package/dist/a2a/invoke.js +30 -1
  151. package/dist/a2a/invoke.js.map +1 -1
  152. package/dist/a2a/server.d.ts.map +1 -1
  153. package/dist/a2a/server.js +14 -1
  154. package/dist/a2a/server.js.map +1 -1
  155. package/dist/a2a/types.d.ts +12 -0
  156. package/dist/a2a/types.d.ts.map +1 -1
  157. package/dist/a2a/types.js.map +1 -1
  158. package/dist/action.d.ts +3 -2
  159. package/dist/action.d.ts.map +1 -1
  160. package/dist/action.js.map +1 -1
  161. package/dist/agent/production-agent.d.ts +5 -0
  162. package/dist/agent/production-agent.d.ts.map +1 -1
  163. package/dist/agent/production-agent.js +5 -3
  164. package/dist/agent/production-agent.js.map +1 -1
  165. package/dist/client/AssistantChat.d.ts +14 -1
  166. package/dist/client/AssistantChat.d.ts.map +1 -1
  167. package/dist/client/AssistantChat.js +158 -136
  168. package/dist/client/AssistantChat.js.map +1 -1
  169. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  170. package/dist/client/MultiTabAssistantChat.js +27 -4
  171. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  172. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  173. package/dist/client/agent-chat-adapter.js +21 -39
  174. package/dist/client/agent-chat-adapter.js.map +1 -1
  175. package/dist/client/agent-sidebar-state.d.ts +1 -0
  176. package/dist/client/agent-sidebar-state.d.ts.map +1 -1
  177. package/dist/client/agent-sidebar-state.js +4 -0
  178. package/dist/client/agent-sidebar-state.js.map +1 -1
  179. package/dist/client/analytics.d.ts +14 -0
  180. package/dist/client/analytics.d.ts.map +1 -1
  181. package/dist/client/analytics.js +67 -0
  182. package/dist/client/analytics.js.map +1 -1
  183. package/dist/client/chat/message-components.d.ts +8 -0
  184. package/dist/client/chat/message-components.d.ts.map +1 -1
  185. package/dist/client/chat/message-components.js +62 -19
  186. package/dist/client/chat/message-components.js.map +1 -1
  187. package/dist/client/chat/tool-call-display.d.ts +6 -0
  188. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  189. package/dist/client/chat/tool-call-display.js +83 -14
  190. package/dist/client/chat/tool-call-display.js.map +1 -1
  191. package/dist/client/chat/use-agent-chat-lifecycle-tracking.d.ts +8 -0
  192. package/dist/client/chat/use-agent-chat-lifecycle-tracking.d.ts.map +1 -0
  193. package/dist/client/chat/use-agent-chat-lifecycle-tracking.js +51 -0
  194. package/dist/client/chat/use-agent-chat-lifecycle-tracking.js.map +1 -0
  195. package/dist/client/chat-thread-url.d.ts +2 -0
  196. package/dist/client/chat-thread-url.d.ts.map +1 -0
  197. package/dist/client/chat-thread-url.js +12 -0
  198. package/dist/client/chat-thread-url.js.map +1 -0
  199. package/dist/client/error-capture.d.ts.map +1 -1
  200. package/dist/client/error-capture.js +7 -0
  201. package/dist/client/error-capture.js.map +1 -1
  202. package/dist/client/extensions/ExtensionSlot.d.ts +3 -1
  203. package/dist/client/extensions/ExtensionSlot.d.ts.map +1 -1
  204. package/dist/client/extensions/ExtensionSlot.js +28 -3
  205. package/dist/client/extensions/ExtensionSlot.js.map +1 -1
  206. package/dist/client/index.d.ts +1 -1
  207. package/dist/client/index.d.ts.map +1 -1
  208. package/dist/client/index.js +1 -1
  209. package/dist/client/index.js.map +1 -1
  210. package/dist/client/route-chunk-recovery.d.ts.map +1 -1
  211. package/dist/client/route-chunk-recovery.js +14 -9
  212. package/dist/client/route-chunk-recovery.js.map +1 -1
  213. package/dist/client/session-replay.d.ts +15 -0
  214. package/dist/client/session-replay.d.ts.map +1 -1
  215. package/dist/client/session-replay.js +20 -0
  216. package/dist/client/session-replay.js.map +1 -1
  217. package/dist/collab/routes.d.ts +1 -1
  218. package/dist/collab/struct-routes.d.ts +1 -1
  219. package/dist/extensions/actions.d.ts.map +1 -1
  220. package/dist/extensions/actions.js +2 -10
  221. package/dist/extensions/actions.js.map +1 -1
  222. package/dist/extensions/store.js +1 -1
  223. package/dist/extensions/store.js.map +1 -1
  224. package/dist/localization/default-messages.d.ts +3 -0
  225. package/dist/localization/default-messages.d.ts.map +1 -1
  226. package/dist/localization/default-messages.js +3 -0
  227. package/dist/localization/default-messages.js.map +1 -1
  228. package/dist/mcp/build-server.d.ts +2 -0
  229. package/dist/mcp/build-server.d.ts.map +1 -1
  230. package/dist/mcp/build-server.js +2 -2
  231. package/dist/mcp/build-server.js.map +1 -1
  232. package/dist/notifications/routes.d.ts +2 -2
  233. package/dist/observability/routes.d.ts +1 -1
  234. package/dist/progress/actions.d.ts.map +1 -1
  235. package/dist/progress/actions.js +3 -2
  236. package/dist/progress/actions.js.map +1 -1
  237. package/dist/progress/routes.d.ts +1 -1
  238. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  239. package/dist/provider-api/index.d.ts.map +1 -1
  240. package/dist/provider-api/index.js +91 -8
  241. package/dist/provider-api/index.js.map +1 -1
  242. package/dist/resources/handlers.d.ts +2 -2
  243. package/dist/scripts/call-agent.d.ts.map +1 -1
  244. package/dist/scripts/call-agent.js +107 -16
  245. package/dist/scripts/call-agent.js.map +1 -1
  246. package/dist/server/agent-chat/action-filters-a2a.d.ts +6 -0
  247. package/dist/server/agent-chat/action-filters-a2a.d.ts.map +1 -1
  248. package/dist/server/agent-chat/action-filters-a2a.js +27 -0
  249. package/dist/server/agent-chat/action-filters-a2a.js.map +1 -1
  250. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  251. package/dist/server/agent-chat-plugin.js +27 -1
  252. package/dist/server/agent-chat-plugin.js.map +1 -1
  253. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  254. package/dist/server/transcribe-voice.d.ts +1 -1
  255. package/dist/styles/agent-conversation.css +7 -0
  256. package/dist/templates/default/app/i18n/ar-SA.ts +20 -0
  257. package/dist/templates/default/app/i18n/de-DE.ts +20 -0
  258. package/dist/templates/default/app/i18n/en-US.ts +20 -0
  259. package/dist/templates/default/app/i18n/es-ES.ts +20 -0
  260. package/dist/templates/default/app/i18n/fr-FR.ts +21 -0
  261. package/dist/templates/default/app/i18n/hi-IN.ts +19 -0
  262. package/dist/templates/default/app/i18n/ja-JP.ts +20 -0
  263. package/dist/templates/default/app/i18n/ko-KR.ts +19 -0
  264. package/dist/templates/default/app/i18n/pt-BR.ts +20 -0
  265. package/dist/templates/default/app/i18n/zh-CN.ts +19 -0
  266. package/dist/templates/default/app/i18n/zh-TW.ts +19 -0
  267. package/dist/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +28 -0
  268. package/dist/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +5 -0
  269. package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
  270. package/package.json +1 -1
  271. package/src/templates/default/app/i18n/ar-SA.ts +20 -0
  272. package/src/templates/default/app/i18n/de-DE.ts +20 -0
  273. package/src/templates/default/app/i18n/en-US.ts +20 -0
  274. package/src/templates/default/app/i18n/es-ES.ts +20 -0
  275. package/src/templates/default/app/i18n/fr-FR.ts +21 -0
  276. package/src/templates/default/app/i18n/hi-IN.ts +19 -0
  277. package/src/templates/default/app/i18n/ja-JP.ts +20 -0
  278. package/src/templates/default/app/i18n/ko-KR.ts +19 -0
  279. package/src/templates/default/app/i18n/pt-BR.ts +20 -0
  280. package/src/templates/default/app/i18n/zh-CN.ts +19 -0
  281. package/src/templates/default/app/i18n/zh-TW.ts +19 -0
  282. package/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +28 -0
  283. package/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +5 -0
  284. package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
  285. package/corpus/templates/analytics/server/handlers/github.ts +0 -200
  286. package/corpus/templates/analytics/server/handlers/pylon.ts +0 -43
  287. package/corpus/templates/analytics/server/lib/apollo.ts +0 -167
  288. package/corpus/templates/analytics/server/lib/commonroom.ts +0 -149
  289. package/corpus/templates/analytics/server/lib/github.ts +0 -660
  290. package/corpus/templates/analytics/server/lib/mixpanel.ts +0 -156
  291. package/corpus/templates/analytics/server/lib/posthog.ts +0 -194
  292. package/corpus/templates/analytics/server/lib/pylon.ts +0 -109
  293. package/corpus/templates/analytics/server/routes/api/github/graphql.post.ts +0 -1
  294. package/corpus/templates/analytics/server/routes/api/github/issue.get.ts +0 -1
  295. package/corpus/templates/analytics/server/routes/api/github/org-prs.get.ts +0 -1
  296. package/corpus/templates/analytics/server/routes/api/github/pr.get.ts +0 -1
  297. package/corpus/templates/analytics/server/routes/api/github/prs.get.ts +0 -1
  298. package/corpus/templates/analytics/server/routes/api/github/search.get.ts +0 -1
  299. package/corpus/templates/slides/actions/fetch-logos.ts +0 -90
  300. package/corpus/templates/slides/actions/image-search.ts +0 -64
  301. package/corpus/templates/slides/actions/import-github.ts +0 -182
  302. package/corpus/templates/slides/actions/logo-lookup.ts +0 -113
@@ -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
+ });