@agent-native/core 0.108.0 → 0.109.1

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 (368) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +25 -0
  3. package/corpus/core/package.json +1 -1
  4. package/corpus/core/src/a2a/client.ts +162 -17
  5. package/corpus/core/src/a2a/correlation.ts +50 -0
  6. package/corpus/core/src/a2a/handlers.ts +200 -14
  7. package/corpus/core/src/a2a/index.ts +7 -1
  8. package/corpus/core/src/a2a/invoke.ts +77 -1
  9. package/corpus/core/src/a2a/server.ts +13 -1
  10. package/corpus/core/src/a2a/task-store.ts +146 -6
  11. package/corpus/core/src/a2a/types.ts +32 -0
  12. package/corpus/core/src/action.ts +5 -2
  13. package/corpus/core/src/agent/production-agent.ts +33 -4
  14. package/corpus/core/src/client/AssistantChat.tsx +648 -603
  15. package/corpus/core/src/client/MultiTabAssistantChat.tsx +31 -4
  16. package/corpus/core/src/client/agent-chat-adapter.ts +23 -37
  17. package/corpus/core/src/client/agent-sidebar-state.ts +4 -0
  18. package/corpus/core/src/client/analytics.ts +84 -0
  19. package/corpus/core/src/client/chat/message-components.tsx +94 -22
  20. package/corpus/core/src/client/chat/tool-call-display.tsx +170 -47
  21. package/corpus/core/src/client/chat/use-agent-chat-lifecycle-tracking.ts +74 -0
  22. package/corpus/core/src/client/chat-thread-url.ts +11 -0
  23. package/corpus/core/src/client/error-capture.ts +12 -0
  24. package/corpus/core/src/client/extensions/ExtensionSlot.tsx +37 -1
  25. package/corpus/core/src/client/index.ts +2 -0
  26. package/corpus/core/src/client/route-chunk-recovery.ts +20 -8
  27. package/corpus/core/src/client/session-replay.ts +31 -0
  28. package/corpus/core/src/client/use-run-stuck-detection.ts +27 -1
  29. package/corpus/core/src/db/client.ts +55 -0
  30. package/corpus/core/src/extensions/actions.ts +2 -14
  31. package/corpus/core/src/extensions/store.ts +1 -1
  32. package/corpus/core/src/localization/default-messages.ts +3 -0
  33. package/corpus/core/src/mcp/build-server.ts +2 -2
  34. package/corpus/core/src/observability/traces.ts +172 -19
  35. package/corpus/core/src/progress/actions.ts +4 -2
  36. package/corpus/core/src/provider-api/index.ts +205 -105
  37. package/corpus/core/src/scripts/call-agent.ts +190 -19
  38. package/corpus/core/src/server/agent-chat/action-filters-a2a.ts +112 -25
  39. package/corpus/core/src/server/agent-chat-plugin.ts +136 -4
  40. package/corpus/core/src/styles/agent-conversation.css +7 -0
  41. package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +20 -0
  42. package/corpus/core/src/templates/default/app/i18n/de-DE.ts +20 -0
  43. package/corpus/core/src/templates/default/app/i18n/en-US.ts +20 -0
  44. package/corpus/core/src/templates/default/app/i18n/es-ES.ts +20 -0
  45. package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +21 -0
  46. package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +19 -0
  47. package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +20 -0
  48. package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +19 -0
  49. package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +20 -0
  50. package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +19 -0
  51. package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +19 -0
  52. package/corpus/core/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +49 -0
  53. package/corpus/core/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +5 -0
  54. package/corpus/core/src/templates/workspace-core/.agents/skills/observability/SKILL.md +7 -1
  55. package/corpus/core/src/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
  56. package/corpus/core/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +1 -1
  57. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +29 -10
  58. package/corpus/templates/analytics/.agents/skills/gong/SKILL.md +54 -23
  59. package/corpus/templates/analytics/.builder/skills/apollo/SKILL.md +19 -41
  60. package/corpus/templates/analytics/.builder/skills/commonroom/SKILL.md +20 -35
  61. package/corpus/templates/analytics/.builder/skills/github/SKILL.md +23 -67
  62. package/corpus/templates/analytics/.builder/skills/pylon/SKILL.md +25 -43
  63. package/corpus/templates/analytics/AGENTS.md +22 -13
  64. package/corpus/templates/analytics/actions/account-deep-dive.ts +1 -0
  65. package/corpus/templates/analytics/actions/configure-gong-native-insights.ts +29 -0
  66. package/corpus/templates/analytics/actions/content-calendar-schema.ts +8 -4
  67. package/corpus/templates/analytics/actions/content-calendar.ts +12 -4
  68. package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +2 -1
  69. package/corpus/templates/analytics/actions/gong-calls.ts +113 -22
  70. package/corpus/templates/analytics/actions/gong-native-insights.ts +166 -0
  71. package/corpus/templates/analytics/actions/hubspot-deals.ts +190 -46
  72. package/corpus/templates/analytics/actions/pylon-issues.ts +123 -0
  73. package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +1 -1
  74. package/corpus/templates/analytics/actions/slack-messages.ts +179 -27
  75. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +48 -152
  76. package/corpus/templates/analytics/app/components/ui/chart.tsx +1 -1
  77. package/corpus/templates/analytics/app/hooks/use-chart-tooltip-flip.ts +21 -6
  78. package/corpus/templates/analytics/app/i18n/zh-TW.ts +13 -0
  79. package/corpus/templates/analytics/app/i18n-data.ts +134 -0
  80. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +181 -30
  81. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +6 -0
  82. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +4 -3
  83. package/corpus/templates/analytics/changelog/2026-07-17-analytics-now-includes-a-default-alert-for-spikes-in-stuck-agent-chats.md +6 -0
  84. package/corpus/templates/analytics/changelog/2026-07-17-dashboard-editors-can-add-shared-extensions-or-opt-into-per-.md +6 -0
  85. package/corpus/templates/analytics/changelog/2026-07-17-dashboard-extensions-show-a-loading-skeleton.md +6 -0
  86. package/corpus/templates/analytics/changelog/2026-07-17-errors-now-group-repeat-failures-consistently-and-keep-priva.md +6 -0
  87. package/corpus/templates/analytics/changelog/2026-07-17-gong-transcript-reviews-now-batch-bounded-call-windows-for-f.md +6 -0
  88. package/corpus/templates/analytics/changelog/2026-07-17-hubspot-deal-filters-now-run-in-hubspot-before-paging-result.md +6 -0
  89. package/corpus/templates/analytics/changelog/2026-07-17-notion-content-calendars-now-discover-the-matching-database-.md +6 -0
  90. package/corpus/templates/analytics/changelog/2026-07-17-pylon-dashboard-reads-now-use-the-paginated-issue-search-api.md +6 -0
  91. package/corpus/templates/analytics/changelog/2026-07-17-slack-reads-no-longer-join-channels-and-report-pagination-coverage.md +6 -0
  92. package/corpus/templates/analytics/docs/schemas/first-party-analytics.md +23 -14
  93. package/corpus/templates/analytics/docs/schemas/tracked-events.md +5 -1
  94. package/corpus/templates/analytics/server/handlers/notion.ts +14 -3
  95. package/corpus/templates/analytics/server/handlers/slack.ts +182 -29
  96. package/corpus/templates/analytics/server/jobs/analytics-alerts.ts +3 -3
  97. package/corpus/templates/analytics/server/lib/agent-chat-plan-mode.ts +2 -6
  98. package/corpus/templates/analytics/server/lib/analytics-alerts.ts +209 -87
  99. package/corpus/templates/analytics/server/lib/analytics-connector-catalog.ts +6 -2
  100. package/corpus/templates/analytics/server/lib/error-capture.ts +75 -8
  101. package/corpus/templates/analytics/server/lib/gong-native-policy.ts +72 -0
  102. package/corpus/templates/analytics/server/lib/gong.ts +54 -66
  103. package/corpus/templates/analytics/server/lib/hubspot.ts +40 -3
  104. package/corpus/templates/analytics/server/lib/notion.ts +83 -8
  105. package/corpus/templates/analytics/server/lib/real-data-actions.ts +4 -0
  106. package/corpus/templates/analytics/server/lib/slack.ts +242 -90
  107. package/corpus/templates/analytics/server/plugins/agent-chat.ts +3 -3
  108. package/corpus/templates/analytics/server/routes/api/pylon/accounts.get.ts +42 -1
  109. package/corpus/templates/analytics/server/routes/api/pylon/issues.get.ts +71 -1
  110. package/corpus/templates/analytics/server/routes/api/test-connection.post.ts +44 -4
  111. package/corpus/templates/clips/actions/finalize-recording.ts +541 -62
  112. package/corpus/templates/clips/app/components/library/bulk-action-toolbar.tsx +19 -1
  113. package/corpus/templates/clips/app/components/library/create-folder-dialog.tsx +123 -0
  114. package/corpus/templates/clips/app/components/library/library-grid.tsx +42 -4
  115. package/corpus/templates/clips/app/components/library/recording-card.tsx +30 -0
  116. package/corpus/templates/clips/app/components/player/playback-comment-overlay.tsx +17 -2
  117. package/corpus/templates/clips/app/components/player/video-player.tsx +14 -2
  118. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +2 -2
  119. package/corpus/templates/clips/app/entry.client.tsx +6 -1
  120. package/corpus/templates/clips/app/i18n/ar-SA.ts +12 -1
  121. package/corpus/templates/clips/app/i18n/de-DE.ts +12 -1
  122. package/corpus/templates/clips/app/i18n/en-US.ts +12 -1
  123. package/corpus/templates/clips/app/i18n/es-ES.ts +11 -1
  124. package/corpus/templates/clips/app/i18n/fr-FR.ts +11 -1
  125. package/corpus/templates/clips/app/i18n/hi-IN.ts +10 -1
  126. package/corpus/templates/clips/app/i18n/ja-JP.ts +12 -1
  127. package/corpus/templates/clips/app/i18n/ko-KR.ts +11 -1
  128. package/corpus/templates/clips/app/i18n/pt-BR.ts +11 -1
  129. package/corpus/templates/clips/app/i18n/zh-CN.ts +11 -1
  130. package/corpus/templates/clips/app/i18n/zh-TW.ts +11 -1
  131. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +72 -1
  132. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +1 -1
  133. package/corpus/templates/clips/app/routes/record.tsx +3 -3
  134. package/corpus/templates/clips/app/routes/share.$shareId.tsx +6 -3
  135. package/corpus/templates/clips/changelog/2026-07-17-choose-which-workspace-receives-new-clips-recordings-and-des.md +6 -0
  136. package/corpus/templates/clips/changelog/2026-07-17-clips-now-retries-storage-verification-in-the-background-ins.md +6 -0
  137. package/corpus/templates/clips/changelog/2026-07-17-create-folders-directly-from-the-move-menu.md +6 -0
  138. package/corpus/templates/clips/changelog/2026-07-17-failed-desktop-uploads-now-offer-a-direct-way-to-reopen-clip.md +6 -0
  139. package/corpus/templates/clips/changelog/2026-07-17-fixed-broken-thumbnail-icons-appearing-over-playable-clip-em.md +6 -0
  140. package/corpus/templates/clips/changelog/2026-07-17-playback-comments-stay-readable-at-faster-playback-speeds.md +6 -0
  141. package/corpus/templates/clips/chrome-extension/src/finalize-recovery.ts +3 -0
  142. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +3 -3
  143. package/corpus/templates/clips/desktop/src/app.tsx +19 -7
  144. package/corpus/templates/clips/desktop/src/lib/recorder.ts +111 -13
  145. package/corpus/templates/clips/desktop/src/lib/upload-verification.ts +16 -7
  146. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +2 -4
  147. package/corpus/templates/clips/desktop/src-tauri/src/native_screen/live_upload.rs +32 -15
  148. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +45 -18
  149. package/corpus/templates/clips/server/jobs/media-verification.ts +130 -0
  150. package/corpus/templates/clips/server/lib/builder-media-compression.ts +15 -0
  151. package/corpus/templates/clips/server/lib/media-verification-state.ts +38 -0
  152. package/corpus/templates/clips/server/lib/player-thumbnail-url.ts +31 -0
  153. package/corpus/templates/clips/server/lib/post-finalize-dispatch.ts +10 -3
  154. package/corpus/templates/clips/server/plugins/auth.ts +5 -5
  155. package/corpus/templates/clips/server/plugins/calendar-jobs.ts +2 -0
  156. package/corpus/templates/clips/server/routes/api/_agent-native-background/post-finalize-worker.post.ts +12 -2
  157. package/corpus/templates/clips/server/routes/api/public-recording.get.ts +6 -1
  158. package/corpus/templates/clips/server/routes/api/thumbnail/[recordingId].get.ts +340 -0
  159. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/abort.post.ts +24 -7
  160. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +91 -7
  161. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/status.get.ts +14 -0
  162. package/corpus/templates/clips/shared/finalize-recovery.ts +61 -2
  163. package/corpus/templates/clips/shared/share-meta.ts +1 -1
  164. package/corpus/templates/content/app/entry.client.tsx +6 -1
  165. package/corpus/templates/dispatch/AGENTS.md +5 -0
  166. package/corpus/templates/dispatch/changelog/2026-07-17-apps-page-links-to-other-available-apps.md +6 -0
  167. package/corpus/templates/dispatch/changelog/2026-07-17-curated-template-remixes.md +6 -0
  168. package/corpus/templates/mail/app/entry.client.tsx +6 -1
  169. package/corpus/templates/slides/.agents/skills/slide-images/SKILL.md +11 -7
  170. package/corpus/templates/slides/.env.example +0 -1
  171. package/corpus/templates/slides/AGENTS.md +4 -0
  172. package/corpus/templates/slides/DEVELOPING.md +2 -2
  173. package/corpus/templates/slides/actions/index-design-system-with-builder.ts +1 -1
  174. package/corpus/templates/slides/actions/logo-config.ts +6 -7
  175. package/corpus/templates/slides/actions/search-images.ts +11 -39
  176. package/corpus/templates/slides/actions/search-logos.ts +5 -52
  177. package/corpus/templates/slides/app/components/editor/ImageSearchPanel.tsx +1 -1
  178. package/corpus/templates/slides/app/components/editor/LogoSearchPanel.tsx +16 -26
  179. package/corpus/templates/slides/app/entry.client.tsx +6 -1
  180. package/corpus/templates/slides/server/lib/media-search-providers.ts +216 -0
  181. package/corpus/templates/slides/server/register-secrets.ts +30 -0
  182. package/dist/a2a/client.d.ts +47 -1
  183. package/dist/a2a/client.d.ts.map +1 -1
  184. package/dist/a2a/client.js +94 -12
  185. package/dist/a2a/client.js.map +1 -1
  186. package/dist/a2a/correlation.d.ts +10 -0
  187. package/dist/a2a/correlation.d.ts.map +1 -0
  188. package/dist/a2a/correlation.js +40 -0
  189. package/dist/a2a/correlation.js.map +1 -0
  190. package/dist/a2a/handlers.d.ts.map +1 -1
  191. package/dist/a2a/handlers.js +147 -15
  192. package/dist/a2a/handlers.js.map +1 -1
  193. package/dist/a2a/index.d.ts +4 -4
  194. package/dist/a2a/index.d.ts.map +1 -1
  195. package/dist/a2a/index.js +2 -2
  196. package/dist/a2a/index.js.map +1 -1
  197. package/dist/a2a/invoke.d.ts +29 -2
  198. package/dist/a2a/invoke.d.ts.map +1 -1
  199. package/dist/a2a/invoke.js +33 -1
  200. package/dist/a2a/invoke.js.map +1 -1
  201. package/dist/a2a/server.d.ts.map +1 -1
  202. package/dist/a2a/server.js +14 -1
  203. package/dist/a2a/server.js.map +1 -1
  204. package/dist/a2a/task-store.d.ts +12 -1
  205. package/dist/a2a/task-store.d.ts.map +1 -1
  206. package/dist/a2a/task-store.js +96 -6
  207. package/dist/a2a/task-store.js.map +1 -1
  208. package/dist/a2a/types.d.ts +27 -0
  209. package/dist/a2a/types.d.ts.map +1 -1
  210. package/dist/a2a/types.js.map +1 -1
  211. package/dist/action.d.ts +5 -2
  212. package/dist/action.d.ts.map +1 -1
  213. package/dist/action.js.map +1 -1
  214. package/dist/agent/production-agent.d.ts +14 -0
  215. package/dist/agent/production-agent.d.ts.map +1 -1
  216. package/dist/agent/production-agent.js +19 -3
  217. package/dist/agent/production-agent.js.map +1 -1
  218. package/dist/client/AssistantChat.d.ts +14 -1
  219. package/dist/client/AssistantChat.d.ts.map +1 -1
  220. package/dist/client/AssistantChat.js +158 -136
  221. package/dist/client/AssistantChat.js.map +1 -1
  222. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  223. package/dist/client/MultiTabAssistantChat.js +27 -4
  224. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  225. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  226. package/dist/client/agent-chat-adapter.js +21 -39
  227. package/dist/client/agent-chat-adapter.js.map +1 -1
  228. package/dist/client/agent-sidebar-state.d.ts +1 -0
  229. package/dist/client/agent-sidebar-state.d.ts.map +1 -1
  230. package/dist/client/agent-sidebar-state.js +4 -0
  231. package/dist/client/agent-sidebar-state.js.map +1 -1
  232. package/dist/client/analytics.d.ts +14 -0
  233. package/dist/client/analytics.d.ts.map +1 -1
  234. package/dist/client/analytics.js +67 -0
  235. package/dist/client/analytics.js.map +1 -1
  236. package/dist/client/chat/message-components.d.ts +8 -0
  237. package/dist/client/chat/message-components.d.ts.map +1 -1
  238. package/dist/client/chat/message-components.js +62 -19
  239. package/dist/client/chat/message-components.js.map +1 -1
  240. package/dist/client/chat/tool-call-display.d.ts +6 -0
  241. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  242. package/dist/client/chat/tool-call-display.js +83 -14
  243. package/dist/client/chat/tool-call-display.js.map +1 -1
  244. package/dist/client/chat/use-agent-chat-lifecycle-tracking.d.ts +8 -0
  245. package/dist/client/chat/use-agent-chat-lifecycle-tracking.d.ts.map +1 -0
  246. package/dist/client/chat/use-agent-chat-lifecycle-tracking.js +51 -0
  247. package/dist/client/chat/use-agent-chat-lifecycle-tracking.js.map +1 -0
  248. package/dist/client/chat-thread-url.d.ts +2 -0
  249. package/dist/client/chat-thread-url.d.ts.map +1 -0
  250. package/dist/client/chat-thread-url.js +12 -0
  251. package/dist/client/chat-thread-url.js.map +1 -0
  252. package/dist/client/error-capture.d.ts.map +1 -1
  253. package/dist/client/error-capture.js +7 -0
  254. package/dist/client/error-capture.js.map +1 -1
  255. package/dist/client/extensions/ExtensionSlot.d.ts +3 -1
  256. package/dist/client/extensions/ExtensionSlot.d.ts.map +1 -1
  257. package/dist/client/extensions/ExtensionSlot.js +28 -3
  258. package/dist/client/extensions/ExtensionSlot.js.map +1 -1
  259. package/dist/client/index.d.ts +1 -1
  260. package/dist/client/index.d.ts.map +1 -1
  261. package/dist/client/index.js +1 -1
  262. package/dist/client/index.js.map +1 -1
  263. package/dist/client/route-chunk-recovery.d.ts.map +1 -1
  264. package/dist/client/route-chunk-recovery.js +14 -9
  265. package/dist/client/route-chunk-recovery.js.map +1 -1
  266. package/dist/client/session-replay.d.ts +15 -0
  267. package/dist/client/session-replay.d.ts.map +1 -1
  268. package/dist/client/session-replay.js +20 -0
  269. package/dist/client/session-replay.js.map +1 -1
  270. package/dist/client/use-run-stuck-detection.d.ts.map +1 -1
  271. package/dist/client/use-run-stuck-detection.js +25 -1
  272. package/dist/client/use-run-stuck-detection.js.map +1 -1
  273. package/dist/db/client.d.ts +7 -0
  274. package/dist/db/client.d.ts.map +1 -1
  275. package/dist/db/client.js +33 -0
  276. package/dist/db/client.js.map +1 -1
  277. package/dist/extensions/actions.d.ts.map +1 -1
  278. package/dist/extensions/actions.js +2 -10
  279. package/dist/extensions/actions.js.map +1 -1
  280. package/dist/extensions/store.js +1 -1
  281. package/dist/extensions/store.js.map +1 -1
  282. package/dist/localization/default-messages.d.ts +3 -0
  283. package/dist/localization/default-messages.d.ts.map +1 -1
  284. package/dist/localization/default-messages.js +3 -0
  285. package/dist/localization/default-messages.js.map +1 -1
  286. package/dist/mcp/build-server.d.ts +2 -0
  287. package/dist/mcp/build-server.d.ts.map +1 -1
  288. package/dist/mcp/build-server.js +2 -2
  289. package/dist/mcp/build-server.js.map +1 -1
  290. package/dist/notifications/routes.d.ts +2 -2
  291. package/dist/observability/routes.d.ts +5 -5
  292. package/dist/observability/traces.d.ts +9 -0
  293. package/dist/observability/traces.d.ts.map +1 -1
  294. package/dist/observability/traces.js +137 -19
  295. package/dist/observability/traces.js.map +1 -1
  296. package/dist/progress/actions.d.ts.map +1 -1
  297. package/dist/progress/actions.js +3 -2
  298. package/dist/progress/actions.js.map +1 -1
  299. package/dist/progress/routes.d.ts +1 -1
  300. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  301. package/dist/provider-api/index.d.ts.map +1 -1
  302. package/dist/provider-api/index.js +91 -8
  303. package/dist/provider-api/index.js.map +1 -1
  304. package/dist/scripts/call-agent.d.ts.map +1 -1
  305. package/dist/scripts/call-agent.js +140 -17
  306. package/dist/scripts/call-agent.js.map +1 -1
  307. package/dist/secrets/routes.d.ts +9 -9
  308. package/dist/server/agent-chat/action-filters-a2a.d.ts +24 -2
  309. package/dist/server/agent-chat/action-filters-a2a.d.ts.map +1 -1
  310. package/dist/server/agent-chat/action-filters-a2a.js +62 -7
  311. package/dist/server/agent-chat/action-filters-a2a.js.map +1 -1
  312. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  313. package/dist/server/agent-chat-plugin.js +118 -5
  314. package/dist/server/agent-chat-plugin.js.map +1 -1
  315. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  316. package/dist/server/transcribe-voice.d.ts +1 -1
  317. package/dist/styles/agent-conversation.css +7 -0
  318. package/dist/templates/default/app/i18n/ar-SA.ts +20 -0
  319. package/dist/templates/default/app/i18n/de-DE.ts +20 -0
  320. package/dist/templates/default/app/i18n/en-US.ts +20 -0
  321. package/dist/templates/default/app/i18n/es-ES.ts +20 -0
  322. package/dist/templates/default/app/i18n/fr-FR.ts +21 -0
  323. package/dist/templates/default/app/i18n/hi-IN.ts +19 -0
  324. package/dist/templates/default/app/i18n/ja-JP.ts +20 -0
  325. package/dist/templates/default/app/i18n/ko-KR.ts +19 -0
  326. package/dist/templates/default/app/i18n/pt-BR.ts +20 -0
  327. package/dist/templates/default/app/i18n/zh-CN.ts +19 -0
  328. package/dist/templates/default/app/i18n/zh-TW.ts +19 -0
  329. package/dist/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +49 -0
  330. package/dist/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +5 -0
  331. package/dist/templates/workspace-core/.agents/skills/observability/SKILL.md +7 -1
  332. package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
  333. package/dist/templates/workspace-core/.agents/skills/tracking/SKILL.md +1 -1
  334. package/package.json +1 -1
  335. package/src/templates/default/app/i18n/ar-SA.ts +20 -0
  336. package/src/templates/default/app/i18n/de-DE.ts +20 -0
  337. package/src/templates/default/app/i18n/en-US.ts +20 -0
  338. package/src/templates/default/app/i18n/es-ES.ts +20 -0
  339. package/src/templates/default/app/i18n/fr-FR.ts +21 -0
  340. package/src/templates/default/app/i18n/hi-IN.ts +19 -0
  341. package/src/templates/default/app/i18n/ja-JP.ts +20 -0
  342. package/src/templates/default/app/i18n/ko-KR.ts +19 -0
  343. package/src/templates/default/app/i18n/pt-BR.ts +20 -0
  344. package/src/templates/default/app/i18n/zh-CN.ts +19 -0
  345. package/src/templates/default/app/i18n/zh-TW.ts +19 -0
  346. package/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +49 -0
  347. package/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +5 -0
  348. package/src/templates/workspace-core/.agents/skills/observability/SKILL.md +7 -1
  349. package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
  350. package/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +1 -1
  351. package/corpus/templates/analytics/server/handlers/github.ts +0 -200
  352. package/corpus/templates/analytics/server/handlers/pylon.ts +0 -43
  353. package/corpus/templates/analytics/server/lib/apollo.ts +0 -167
  354. package/corpus/templates/analytics/server/lib/commonroom.ts +0 -149
  355. package/corpus/templates/analytics/server/lib/github.ts +0 -660
  356. package/corpus/templates/analytics/server/lib/mixpanel.ts +0 -156
  357. package/corpus/templates/analytics/server/lib/posthog.ts +0 -194
  358. package/corpus/templates/analytics/server/lib/pylon.ts +0 -109
  359. package/corpus/templates/analytics/server/routes/api/github/graphql.post.ts +0 -1
  360. package/corpus/templates/analytics/server/routes/api/github/issue.get.ts +0 -1
  361. package/corpus/templates/analytics/server/routes/api/github/org-prs.get.ts +0 -1
  362. package/corpus/templates/analytics/server/routes/api/github/pr.get.ts +0 -1
  363. package/corpus/templates/analytics/server/routes/api/github/prs.get.ts +0 -1
  364. package/corpus/templates/analytics/server/routes/api/github/search.get.ts +0 -1
  365. package/corpus/templates/slides/actions/fetch-logos.ts +0 -90
  366. package/corpus/templates/slides/actions/image-search.ts +0 -64
  367. package/corpus/templates/slides/actions/import-github.ts +0 -182
  368. package/corpus/templates/slides/actions/logo-lookup.ts +0 -113
@@ -7,49 +7,31 @@ description: >
7
7
 
8
8
  # Pylon Integration (Support)
9
9
 
10
- ## Connection
11
-
12
- - **Base URL**: `https://api.usepylon.com`
13
- - **Auth**: `Authorization: Bearer $PYLON_API_KEY`
14
- - **Env vars**: `PYLON_API_KEY`
15
- - **Caching**: 10-minute in-memory cache, max 120 entries
16
-
17
- ## Server Lib & API Routes
18
-
19
- - **File**: `server/lib/pylon.ts`
20
-
21
- ### Exported Functions
22
-
23
- | Function | Description |
24
- | --------------------- | ------------------------------------ |
25
- | `getAccounts(query?)` | List/search accounts |
26
- | `getAccount(id)` | Get single account |
27
- | `getIssues(params?)` | List issues (30-day window enforced) |
28
- | `getContacts(query?)` | Search contacts |
29
-
30
- ### API Routes
31
-
32
- | Route | Description |
33
- | ------------------------- | -------------------- |
34
- | `GET /api/pylon/issues` | List support tickets |
35
- | `GET /api/pylon/accounts` | List accounts |
36
-
37
- ## Script Usage
38
-
39
- ```bash
40
- # Open support tickets for a customer
41
- pnpm action pylon-issues --account="Example Corp" --state=open
42
-
43
- # All issues
44
- pnpm action pylon-issues --query=search_term
45
-
46
- # List accounts
47
- pnpm action pylon-issues --accounts
48
- ```
10
+ Pylon access uses the shared provider API runtime. Do not add a separate Pylon
11
+ client. `/api/pylon/issues` remains only as a thin compatibility route for an
12
+ existing dashboard and delegates to the same action/provider runtime.
13
+
14
+ ## Access Paths
15
+
16
+ - Use `provider-api-catalog`, `provider-api-docs`, and
17
+ `provider-api-request` with provider `pylon` for bounded account, contact,
18
+ and issue queries.
19
+ - Use a data program with `providerFetchAll("pylon", ...)` for reusable joins,
20
+ exhaustive support-ticket analysis, or dashboard sources. Existing risk
21
+ meeting programs demonstrate the HubSpot-to-Pylon domain join.
22
+ - Stage large responses and reduce them with `query-staged-dataset` or
23
+ `run-code` before returning results to chat.
24
+ - For issue corpora, prefer `POST /issues/search` with the created-at filter and
25
+ body cursor. The older `GET /issues` endpoint has a 30-day window and should
26
+ not be used for broad dashboard coverage.
27
+
28
+ Authentication is resolved from the current viewer's scoped Pylon credential
29
+ through the shared provider runtime.
49
30
 
50
31
  ## Key Patterns & Gotchas
51
32
 
52
- - `getIssues` enforces a max 30-day window via `start_time` and `end_time` query params (API requirement)
53
- - API returns `{ data: ... }` wrappers or raw arrays — code handles both defensively
54
- - Pylon API exists in this analytics app (`code/`) but the secrets `pylon.api_key` and `pylon.api_secret` referenced elsewhere are in secrets manager, not env vars
55
- - No Pylon data in BigQuery must query the API directly
33
+ - Confirm the current endpoint, time-window, filter, and cursor contract with
34
+ `provider-api-docs`; do not impose a fixed lookback window in a wrapper.
35
+ - Report inspected issue/account counts, pagination coverage, failed pages, and
36
+ truncation. A sampled response cannot support an exhaustive absence claim.
37
+ - Query Pylon directly unless the user explicitly asks for a warehouse copy.
@@ -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
@@ -174,14 +176,17 @@ membership id when its native update status reports `update-available`.
174
176
  serialization traps. The script is constrained: only documented dashboard
175
177
  method calls with JSON-compatible arguments are parsed; variables, imports,
176
178
  loops, functions, network, filesystem, and DB access are not available.
177
- - Dashboard extension boxes use `chartType: "extension"` with
178
- `config.extensionSlotId`. The stable per-box slot is
179
- `analytics.dashboard.<dashboard-id>.panel.<panel-id>`. To add an extension,
180
- create/choose it, call `add-extension-slot-target` with that slot id, then
181
- `install-extension` with the same slot id. Installs are per-user; the
182
- dashboard panel remains shared. Slot-backed extensions receive dashboard id,
183
- name, description, current filters, and the panel id/title/slot id as context.
184
- `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.
185
190
  - Dashboard saves keep bounded history in SQL. Use
186
191
  `list-dashboard-revisions` to inspect undo points and
187
192
  `restore-dashboard-revision` to restore one instead of hand-editing history
@@ -207,7 +212,11 @@ membership id when its native update status reports `update-available`.
207
212
  `update-extension` blocks full-body replacement unless
208
213
  `allowFullReplacement: true` is explicit, and that flag is reserved for a
209
214
  user-requested broad rewrite or a complete replacement body supplied by the
210
- 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.
211
220
  - Use framework sharing and access helpers for dashboards, analyses, and saved
212
221
  resources.
213
222
  - Dashboard email reports live in SQL via the
@@ -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