@agent-native/core 0.107.2 → 0.109.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (502) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +24 -0
  3. package/corpus/core/docs/content/actions.mdx +48 -0
  4. package/corpus/core/docs/content/locales/ar-SA/actions.mdx +38 -0
  5. package/corpus/core/docs/content/locales/de-DE/actions.mdx +38 -0
  6. package/corpus/core/docs/content/locales/es-ES/actions.mdx +38 -0
  7. package/corpus/core/docs/content/locales/fr-FR/actions.mdx +38 -0
  8. package/corpus/core/docs/content/locales/hi-IN/actions.mdx +38 -0
  9. package/corpus/core/docs/content/locales/ja-JP/actions.mdx +38 -0
  10. package/corpus/core/docs/content/locales/ko-KR/actions.mdx +38 -0
  11. package/corpus/core/docs/content/locales/pt-BR/actions.mdx +38 -0
  12. package/corpus/core/docs/content/locales/zh-CN/actions.mdx +38 -0
  13. package/corpus/core/docs/content/locales/zh-TW/actions.mdx +38 -0
  14. package/corpus/core/package.json +5 -1
  15. package/corpus/core/src/a2a/client.ts +140 -17
  16. package/corpus/core/src/a2a/handlers.ts +60 -0
  17. package/corpus/core/src/a2a/index.ts +6 -1
  18. package/corpus/core/src/a2a/invoke.ts +68 -1
  19. package/corpus/core/src/a2a/server.ts +13 -1
  20. package/corpus/core/src/a2a/types.ts +16 -0
  21. package/corpus/core/src/a2a-claims.ts +52 -0
  22. package/corpus/core/src/action.ts +7 -2
  23. package/corpus/core/src/agent/production-agent.ts +10 -4
  24. package/corpus/core/src/audit/record.ts +6 -0
  25. package/corpus/core/src/client/AssistantChat.tsx +648 -603
  26. package/corpus/core/src/client/MultiTabAssistantChat.tsx +31 -4
  27. package/corpus/core/src/client/agent-chat-adapter.ts +23 -37
  28. package/corpus/core/src/client/agent-sidebar-state.ts +4 -0
  29. package/corpus/core/src/client/analytics.ts +84 -0
  30. package/corpus/core/src/client/chat/message-components.tsx +94 -22
  31. package/corpus/core/src/client/chat/tool-call-display.tsx +170 -47
  32. package/corpus/core/src/client/chat/use-agent-chat-lifecycle-tracking.ts +74 -0
  33. package/corpus/core/src/client/chat-thread-url.ts +11 -0
  34. package/corpus/core/src/client/error-capture.ts +12 -0
  35. package/corpus/core/src/client/extensions/ExtensionSlot.tsx +37 -1
  36. package/corpus/core/src/client/feature-flags/FeatureFlagsPanel.tsx +519 -0
  37. package/corpus/core/src/client/feature-flags/helpers.ts +77 -0
  38. package/corpus/core/src/client/feature-flags/index.ts +13 -0
  39. package/corpus/core/src/client/feature-flags/types.ts +29 -0
  40. package/corpus/core/src/client/feature-flags/use-feature-flag.ts +26 -0
  41. package/corpus/core/src/client/index.ts +13 -0
  42. package/corpus/core/src/client/route-chunk-recovery.ts +20 -8
  43. package/corpus/core/src/client/session-replay.ts +31 -0
  44. package/corpus/core/src/extensions/actions.ts +2 -14
  45. package/corpus/core/src/extensions/routes.ts +1 -1
  46. package/corpus/core/src/extensions/store.ts +1 -1
  47. package/corpus/core/src/feature-flags/a2a-action-route.ts +56 -0
  48. package/corpus/core/src/feature-flags/actions/get-feature-flags.ts +24 -0
  49. package/corpus/core/src/feature-flags/actions/list-feature-flags.ts +69 -0
  50. package/corpus/core/src/feature-flags/actions/set-feature-flag.ts +89 -0
  51. package/corpus/core/src/feature-flags/index.ts +21 -0
  52. package/corpus/core/src/feature-flags/permissions.ts +53 -0
  53. package/corpus/core/src/feature-flags/plugin.ts +44 -0
  54. package/corpus/core/src/feature-flags/registry.ts +96 -0
  55. package/corpus/core/src/feature-flags/store.ts +176 -0
  56. package/corpus/core/src/index.ts +15 -0
  57. package/corpus/core/src/localization/default-messages.ts +50 -0
  58. package/corpus/core/src/mcp/build-server.ts +2 -2
  59. package/corpus/core/src/progress/actions.ts +4 -2
  60. package/corpus/core/src/provider-api/index.ts +205 -105
  61. package/corpus/core/src/scripts/call-agent.ts +137 -17
  62. package/corpus/core/src/server/action-discovery.ts +12 -0
  63. package/corpus/core/src/server/action-routes.ts +47 -5
  64. package/corpus/core/src/server/agent-chat/action-filters-a2a.ts +40 -0
  65. package/corpus/core/src/server/agent-chat-plugin.ts +31 -0
  66. package/corpus/core/src/server/index.ts +1 -0
  67. package/corpus/core/src/settings/org-settings.ts +13 -0
  68. package/corpus/core/src/settings/store.ts +57 -0
  69. package/corpus/core/src/styles/agent-conversation.css +7 -0
  70. package/corpus/core/src/templates/default/.agents/skills/feature-flags/SKILL.md +169 -0
  71. package/corpus/core/src/templates/default/AGENTS.md +1 -0
  72. package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +20 -0
  73. package/corpus/core/src/templates/default/app/i18n/de-DE.ts +20 -0
  74. package/corpus/core/src/templates/default/app/i18n/en-US.ts +20 -0
  75. package/corpus/core/src/templates/default/app/i18n/es-ES.ts +20 -0
  76. package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +21 -0
  77. package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +19 -0
  78. package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +20 -0
  79. package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +19 -0
  80. package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +20 -0
  81. package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +19 -0
  82. package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +19 -0
  83. package/corpus/core/src/templates/headless/.agents/skills/feature-flags/SKILL.md +169 -0
  84. package/corpus/core/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +28 -0
  85. package/corpus/core/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +5 -0
  86. package/corpus/core/src/templates/workspace-core/.agents/skills/feature-flags/SKILL.md +169 -0
  87. package/corpus/core/src/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
  88. package/corpus/core/src/templates/workspace-core/AGENTS.md +1 -1
  89. package/corpus/core/src/templates/workspace-root/AGENTS.md +1 -1
  90. package/corpus/core/src/vite/action-types-plugin.ts +12 -0
  91. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +29 -10
  92. package/corpus/templates/analytics/.agents/skills/feature-flags/SKILL.md +169 -0
  93. package/corpus/templates/analytics/.agents/skills/gong/SKILL.md +54 -23
  94. package/corpus/templates/analytics/.builder/skills/apollo/SKILL.md +19 -41
  95. package/corpus/templates/analytics/.builder/skills/commonroom/SKILL.md +20 -35
  96. package/corpus/templates/analytics/.builder/skills/github/SKILL.md +23 -67
  97. package/corpus/templates/analytics/.builder/skills/pylon/SKILL.md +25 -43
  98. package/corpus/templates/analytics/AGENTS.md +37 -16
  99. package/corpus/templates/analytics/actions/account-deep-dive.ts +1 -0
  100. package/corpus/templates/analytics/actions/configure-gong-native-insights.ts +29 -0
  101. package/corpus/templates/analytics/actions/content-calendar-schema.ts +8 -4
  102. package/corpus/templates/analytics/actions/content-calendar.ts +12 -4
  103. package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +2 -1
  104. package/corpus/templates/analytics/actions/gong-calls.ts +113 -22
  105. package/corpus/templates/analytics/actions/gong-native-insights.ts +166 -0
  106. package/corpus/templates/analytics/actions/hubspot-deals.ts +190 -46
  107. package/corpus/templates/analytics/actions/list-workspace-feature-flags.ts +15 -0
  108. package/corpus/templates/analytics/actions/navigate.ts +2 -2
  109. package/corpus/templates/analytics/actions/pylon-issues.ts +123 -0
  110. package/corpus/templates/analytics/actions/set-workspace-feature-flag.ts +45 -0
  111. package/corpus/templates/analytics/actions/slack-messages.ts +179 -27
  112. package/corpus/templates/analytics/actions/view-screen.ts +13 -0
  113. package/corpus/templates/analytics/app/components/agents/FeatureFlagsFleetPanel.tsx +243 -0
  114. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +48 -152
  115. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +11 -3
  116. package/corpus/templates/analytics/app/components/ui/chart.tsx +1 -1
  117. package/corpus/templates/analytics/app/hooks/use-chart-tooltip-flip.ts +21 -6
  118. package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +3 -1
  119. package/corpus/templates/analytics/app/i18n/zh-TW.ts +30 -0
  120. package/corpus/templates/analytics/app/i18n-data.ts +385 -0
  121. package/corpus/templates/analytics/app/pages/Agents.tsx +22 -2
  122. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +181 -30
  123. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +6 -0
  124. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +4 -3
  125. package/corpus/templates/analytics/changelog/2026-07-17-dashboard-editors-can-add-shared-extensions-or-opt-into-per-.md +6 -0
  126. package/corpus/templates/analytics/changelog/2026-07-17-dashboard-extensions-show-a-loading-skeleton.md +6 -0
  127. package/corpus/templates/analytics/changelog/2026-07-17-errors-now-group-repeat-failures-consistently-and-keep-priva.md +6 -0
  128. package/corpus/templates/analytics/changelog/2026-07-17-gong-transcript-reviews-now-batch-bounded-call-windows-for-f.md +6 -0
  129. package/corpus/templates/analytics/changelog/2026-07-17-hubspot-deal-filters-now-run-in-hubspot-before-paging-result.md +6 -0
  130. package/corpus/templates/analytics/changelog/2026-07-17-manage-feature-flag-rollouts-across-your-organization-s-apps.md +6 -0
  131. package/corpus/templates/analytics/changelog/2026-07-17-notion-content-calendars-now-discover-the-matching-database-.md +6 -0
  132. package/corpus/templates/analytics/changelog/2026-07-17-pylon-dashboard-reads-now-use-the-paginated-issue-search-api.md +6 -0
  133. package/corpus/templates/analytics/changelog/2026-07-17-slack-reads-no-longer-join-channels-and-report-pagination-coverage.md +6 -0
  134. package/corpus/templates/analytics/server/handlers/notion.ts +14 -3
  135. package/corpus/templates/analytics/server/handlers/slack.ts +182 -29
  136. package/corpus/templates/analytics/server/lib/agent-chat-plan-mode.ts +2 -6
  137. package/corpus/templates/analytics/server/lib/analytics-connector-catalog.ts +6 -2
  138. package/corpus/templates/analytics/server/lib/db-admin-connections.ts +13 -5
  139. package/corpus/templates/analytics/server/lib/error-capture.ts +75 -8
  140. package/corpus/templates/analytics/server/lib/gong-native-policy.ts +72 -0
  141. package/corpus/templates/analytics/server/lib/gong.ts +54 -66
  142. package/corpus/templates/analytics/server/lib/hubspot.ts +40 -3
  143. package/corpus/templates/analytics/server/lib/notion.ts +83 -8
  144. package/corpus/templates/analytics/server/lib/real-data-actions.ts +4 -0
  145. package/corpus/templates/analytics/server/lib/slack.ts +242 -90
  146. package/corpus/templates/analytics/server/lib/workspace-feature-flags.ts +347 -0
  147. package/corpus/templates/analytics/server/plugins/agent-chat.ts +3 -3
  148. package/corpus/templates/analytics/server/routes/api/pylon/accounts.get.ts +42 -1
  149. package/corpus/templates/analytics/server/routes/api/pylon/issues.get.ts +71 -1
  150. package/corpus/templates/analytics/server/routes/api/test-connection.post.ts +44 -4
  151. package/corpus/templates/assets/.agents/skills/feature-flags/SKILL.md +169 -0
  152. package/corpus/templates/brain/.agents/skills/feature-flags/SKILL.md +169 -0
  153. package/corpus/templates/calendar/.agents/skills/feature-flags/SKILL.md +169 -0
  154. package/corpus/templates/chat/.agents/skills/feature-flags/SKILL.md +169 -0
  155. package/corpus/templates/clips/.agents/skills/feature-flags/SKILL.md +169 -0
  156. package/corpus/templates/clips/app/components/library/bulk-action-toolbar.tsx +19 -1
  157. package/corpus/templates/clips/app/components/library/create-folder-dialog.tsx +123 -0
  158. package/corpus/templates/clips/app/components/library/library-grid.tsx +42 -4
  159. package/corpus/templates/clips/app/components/library/recording-card.tsx +30 -0
  160. package/corpus/templates/clips/app/entry.client.tsx +6 -1
  161. package/corpus/templates/clips/app/i18n/ar-SA.ts +12 -1
  162. package/corpus/templates/clips/app/i18n/de-DE.ts +12 -1
  163. package/corpus/templates/clips/app/i18n/en-US.ts +12 -1
  164. package/corpus/templates/clips/app/i18n/es-ES.ts +11 -1
  165. package/corpus/templates/clips/app/i18n/fr-FR.ts +11 -1
  166. package/corpus/templates/clips/app/i18n/hi-IN.ts +10 -1
  167. package/corpus/templates/clips/app/i18n/ja-JP.ts +12 -1
  168. package/corpus/templates/clips/app/i18n/ko-KR.ts +11 -1
  169. package/corpus/templates/clips/app/i18n/pt-BR.ts +11 -1
  170. package/corpus/templates/clips/app/i18n/zh-CN.ts +11 -1
  171. package/corpus/templates/clips/app/i18n/zh-TW.ts +11 -1
  172. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +72 -1
  173. package/corpus/templates/clips/changelog/2026-07-17-choose-which-workspace-receives-new-clips-recordings-and-des.md +6 -0
  174. package/corpus/templates/clips/changelog/2026-07-17-create-folders-directly-from-the-move-menu.md +6 -0
  175. package/corpus/templates/clips/changelog/2026-07-17-failed-desktop-uploads-now-offer-a-direct-way-to-reopen-clip.md +6 -0
  176. package/corpus/templates/clips/desktop/src/app.tsx +1 -1
  177. package/corpus/templates/clips/server/plugins/feature-flags.ts +11 -0
  178. package/corpus/templates/clips/shared/feature-flags.ts +30 -37
  179. package/corpus/templates/content/.agents/skills/feature-flags/SKILL.md +169 -0
  180. package/corpus/templates/content/app/entry.client.tsx +6 -1
  181. package/corpus/templates/design/.agents/skills/feature-flags/SKILL.md +169 -0
  182. package/corpus/templates/design/AGENTS.md +5 -3
  183. package/corpus/templates/design/actions/add-fusion-screens.ts +4 -6
  184. package/corpus/templates/design/actions/apply-fusion-edits.ts +4 -6
  185. package/corpus/templates/design/actions/create-fusion-app.ts +5 -4
  186. package/corpus/templates/design/actions/deploy-fusion-app.ts +4 -3
  187. package/corpus/templates/design/actions/get-fusion-deploy-status.ts +4 -6
  188. package/corpus/templates/design/actions/list-fusion-edits.ts +4 -3
  189. package/corpus/templates/design/actions/push-fusion-app.ts +4 -6
  190. package/corpus/templates/design/actions/queue-fusion-edit.ts +4 -3
  191. package/corpus/templates/design/actions/send-fusion-message.ts +4 -6
  192. package/corpus/templates/design/actions/sync-fusion-app.ts +4 -3
  193. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +1 -1
  194. package/corpus/templates/design/app/pages/Index.tsx +8 -6
  195. package/corpus/templates/design/server/plugins/feature-flags.ts +5 -0
  196. package/corpus/templates/design/shared/full-app.ts +10 -7
  197. package/corpus/templates/dispatch/.agents/skills/feature-flags/SKILL.md +169 -0
  198. package/corpus/templates/dispatch/AGENTS.md +5 -0
  199. package/corpus/templates/dispatch/changelog/2026-07-17-apps-page-links-to-other-available-apps.md +6 -0
  200. package/corpus/templates/dispatch/changelog/2026-07-17-curated-template-remixes.md +6 -0
  201. package/corpus/templates/forms/.agents/skills/feature-flags/SKILL.md +169 -0
  202. package/corpus/templates/macros/.agents/skills/feature-flags/SKILL.md +169 -0
  203. package/corpus/templates/mail/.agents/skills/feature-flags/SKILL.md +169 -0
  204. package/corpus/templates/mail/app/entry.client.tsx +6 -1
  205. package/corpus/templates/plan/.agents/skills/feature-flags/SKILL.md +169 -0
  206. package/corpus/templates/slides/.agents/skills/feature-flags/SKILL.md +169 -0
  207. package/corpus/templates/slides/.agents/skills/slide-images/SKILL.md +11 -7
  208. package/corpus/templates/slides/.env.example +0 -1
  209. package/corpus/templates/slides/AGENTS.md +4 -0
  210. package/corpus/templates/slides/DEVELOPING.md +2 -2
  211. package/corpus/templates/slides/actions/index-design-system-with-builder.ts +1 -1
  212. package/corpus/templates/slides/actions/logo-config.ts +6 -7
  213. package/corpus/templates/slides/actions/search-images.ts +11 -39
  214. package/corpus/templates/slides/actions/search-logos.ts +5 -52
  215. package/corpus/templates/slides/app/components/editor/ImageSearchPanel.tsx +1 -1
  216. package/corpus/templates/slides/app/components/editor/LogoSearchPanel.tsx +16 -26
  217. package/corpus/templates/slides/app/entry.client.tsx +6 -1
  218. package/corpus/templates/slides/server/lib/media-search-providers.ts +216 -0
  219. package/corpus/templates/slides/server/register-secrets.ts +30 -0
  220. package/corpus/templates/tasks/.agents/skills/feature-flags/SKILL.md +169 -0
  221. package/dist/a2a/client.d.ts +38 -1
  222. package/dist/a2a/client.d.ts.map +1 -1
  223. package/dist/a2a/client.js +81 -12
  224. package/dist/a2a/client.js.map +1 -1
  225. package/dist/a2a/handlers.d.ts.map +1 -1
  226. package/dist/a2a/handlers.js +47 -0
  227. package/dist/a2a/handlers.js.map +1 -1
  228. package/dist/a2a/index.d.ts +4 -4
  229. package/dist/a2a/index.d.ts.map +1 -1
  230. package/dist/a2a/index.js +2 -2
  231. package/dist/a2a/index.js.map +1 -1
  232. package/dist/a2a/invoke.d.ts +26 -2
  233. package/dist/a2a/invoke.d.ts.map +1 -1
  234. package/dist/a2a/invoke.js +30 -1
  235. package/dist/a2a/invoke.js.map +1 -1
  236. package/dist/a2a/server.d.ts.map +1 -1
  237. package/dist/a2a/server.js +14 -1
  238. package/dist/a2a/server.js.map +1 -1
  239. package/dist/a2a/types.d.ts +12 -0
  240. package/dist/a2a/types.d.ts.map +1 -1
  241. package/dist/a2a/types.js.map +1 -1
  242. package/dist/a2a-claims.d.ts +10 -0
  243. package/dist/a2a-claims.d.ts.map +1 -0
  244. package/dist/a2a-claims.js +41 -0
  245. package/dist/a2a-claims.js.map +1 -0
  246. package/dist/action.d.ts +7 -2
  247. package/dist/action.d.ts.map +1 -1
  248. package/dist/action.js.map +1 -1
  249. package/dist/agent/production-agent.d.ts +5 -0
  250. package/dist/agent/production-agent.d.ts.map +1 -1
  251. package/dist/agent/production-agent.js +5 -3
  252. package/dist/agent/production-agent.js.map +1 -1
  253. package/dist/audit/record.d.ts +3 -0
  254. package/dist/audit/record.d.ts.map +1 -1
  255. package/dist/audit/record.js +3 -0
  256. package/dist/audit/record.js.map +1 -1
  257. package/dist/client/AssistantChat.d.ts +14 -1
  258. package/dist/client/AssistantChat.d.ts.map +1 -1
  259. package/dist/client/AssistantChat.js +158 -136
  260. package/dist/client/AssistantChat.js.map +1 -1
  261. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  262. package/dist/client/MultiTabAssistantChat.js +27 -4
  263. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  264. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  265. package/dist/client/agent-chat-adapter.js +21 -39
  266. package/dist/client/agent-chat-adapter.js.map +1 -1
  267. package/dist/client/agent-sidebar-state.d.ts +1 -0
  268. package/dist/client/agent-sidebar-state.d.ts.map +1 -1
  269. package/dist/client/agent-sidebar-state.js +4 -0
  270. package/dist/client/agent-sidebar-state.js.map +1 -1
  271. package/dist/client/analytics.d.ts +14 -0
  272. package/dist/client/analytics.d.ts.map +1 -1
  273. package/dist/client/analytics.js +67 -0
  274. package/dist/client/analytics.js.map +1 -1
  275. package/dist/client/chat/message-components.d.ts +8 -0
  276. package/dist/client/chat/message-components.d.ts.map +1 -1
  277. package/dist/client/chat/message-components.js +62 -19
  278. package/dist/client/chat/message-components.js.map +1 -1
  279. package/dist/client/chat/tool-call-display.d.ts +6 -0
  280. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  281. package/dist/client/chat/tool-call-display.js +83 -14
  282. package/dist/client/chat/tool-call-display.js.map +1 -1
  283. package/dist/client/chat/use-agent-chat-lifecycle-tracking.d.ts +8 -0
  284. package/dist/client/chat/use-agent-chat-lifecycle-tracking.d.ts.map +1 -0
  285. package/dist/client/chat/use-agent-chat-lifecycle-tracking.js +51 -0
  286. package/dist/client/chat/use-agent-chat-lifecycle-tracking.js.map +1 -0
  287. package/dist/client/chat-thread-url.d.ts +2 -0
  288. package/dist/client/chat-thread-url.d.ts.map +1 -0
  289. package/dist/client/chat-thread-url.js +12 -0
  290. package/dist/client/chat-thread-url.js.map +1 -0
  291. package/dist/client/error-capture.d.ts.map +1 -1
  292. package/dist/client/error-capture.js +7 -0
  293. package/dist/client/error-capture.js.map +1 -1
  294. package/dist/client/extensions/ExtensionSlot.d.ts +3 -1
  295. package/dist/client/extensions/ExtensionSlot.d.ts.map +1 -1
  296. package/dist/client/extensions/ExtensionSlot.js +28 -3
  297. package/dist/client/extensions/ExtensionSlot.js.map +1 -1
  298. package/dist/client/feature-flags/FeatureFlagsPanel.d.ts +10 -0
  299. package/dist/client/feature-flags/FeatureFlagsPanel.d.ts.map +1 -0
  300. package/dist/client/feature-flags/FeatureFlagsPanel.js +143 -0
  301. package/dist/client/feature-flags/FeatureFlagsPanel.js.map +1 -0
  302. package/dist/client/feature-flags/helpers.d.ts +16 -0
  303. package/dist/client/feature-flags/helpers.d.ts.map +1 -0
  304. package/dist/client/feature-flags/helpers.js +50 -0
  305. package/dist/client/feature-flags/helpers.js.map +1 -0
  306. package/dist/client/feature-flags/index.d.ts +5 -0
  307. package/dist/client/feature-flags/index.d.ts.map +1 -0
  308. package/dist/client/feature-flags/index.js +4 -0
  309. package/dist/client/feature-flags/index.js.map +1 -0
  310. package/dist/client/feature-flags/types.d.ts +27 -0
  311. package/dist/client/feature-flags/types.d.ts.map +1 -0
  312. package/dist/client/feature-flags/types.js +2 -0
  313. package/dist/client/feature-flags/types.js.map +1 -0
  314. package/dist/client/feature-flags/use-feature-flag.d.ts +8 -0
  315. package/dist/client/feature-flags/use-feature-flag.d.ts.map +1 -0
  316. package/dist/client/feature-flags/use-feature-flag.js +15 -0
  317. package/dist/client/feature-flags/use-feature-flag.js.map +1 -0
  318. package/dist/client/index.d.ts +2 -1
  319. package/dist/client/index.d.ts.map +1 -1
  320. package/dist/client/index.js +2 -1
  321. package/dist/client/index.js.map +1 -1
  322. package/dist/client/route-chunk-recovery.d.ts.map +1 -1
  323. package/dist/client/route-chunk-recovery.js +14 -9
  324. package/dist/client/route-chunk-recovery.js.map +1 -1
  325. package/dist/client/session-replay.d.ts +15 -0
  326. package/dist/client/session-replay.d.ts.map +1 -1
  327. package/dist/client/session-replay.js +20 -0
  328. package/dist/client/session-replay.js.map +1 -1
  329. package/dist/collab/struct-routes.d.ts +1 -1
  330. package/dist/extensions/actions.d.ts.map +1 -1
  331. package/dist/extensions/actions.js +2 -10
  332. package/dist/extensions/actions.js.map +1 -1
  333. package/dist/extensions/routes.d.ts.map +1 -1
  334. package/dist/extensions/routes.js +1 -1
  335. package/dist/extensions/routes.js.map +1 -1
  336. package/dist/extensions/store.js +1 -1
  337. package/dist/extensions/store.js.map +1 -1
  338. package/dist/feature-flags/a2a-action-route.d.ts +14 -0
  339. package/dist/feature-flags/a2a-action-route.d.ts.map +1 -0
  340. package/dist/feature-flags/a2a-action-route.js +50 -0
  341. package/dist/feature-flags/a2a-action-route.js.map +1 -0
  342. package/dist/feature-flags/actions/get-feature-flags.d.ts +3 -0
  343. package/dist/feature-flags/actions/get-feature-flags.d.ts.map +1 -0
  344. package/dist/feature-flags/actions/get-feature-flags.js +18 -0
  345. package/dist/feature-flags/actions/get-feature-flags.js.map +1 -0
  346. package/dist/feature-flags/actions/list-feature-flags.d.ts +28 -0
  347. package/dist/feature-flags/actions/list-feature-flags.d.ts.map +1 -0
  348. package/dist/feature-flags/actions/list-feature-flags.js +60 -0
  349. package/dist/feature-flags/actions/list-feature-flags.js.map +1 -0
  350. package/dist/feature-flags/actions/set-feature-flag.d.ts +26 -0
  351. package/dist/feature-flags/actions/set-feature-flag.d.ts.map +1 -0
  352. package/dist/feature-flags/actions/set-feature-flag.js +78 -0
  353. package/dist/feature-flags/actions/set-feature-flag.js.map +1 -0
  354. package/dist/feature-flags/index.d.ts +5 -0
  355. package/dist/feature-flags/index.d.ts.map +1 -0
  356. package/dist/feature-flags/index.js +5 -0
  357. package/dist/feature-flags/index.js.map +1 -0
  358. package/dist/feature-flags/permissions.d.ts +13 -0
  359. package/dist/feature-flags/permissions.d.ts.map +1 -0
  360. package/dist/feature-flags/permissions.js +37 -0
  361. package/dist/feature-flags/permissions.js.map +1 -0
  362. package/dist/feature-flags/plugin.d.ts +17 -0
  363. package/dist/feature-flags/plugin.d.ts.map +1 -0
  364. package/dist/feature-flags/plugin.js +29 -0
  365. package/dist/feature-flags/plugin.js.map +1 -0
  366. package/dist/feature-flags/registry.d.ts +23 -0
  367. package/dist/feature-flags/registry.d.ts.map +1 -0
  368. package/dist/feature-flags/registry.js +59 -0
  369. package/dist/feature-flags/registry.js.map +1 -0
  370. package/dist/feature-flags/store.d.ts +31 -0
  371. package/dist/feature-flags/store.d.ts.map +1 -0
  372. package/dist/feature-flags/store.js +124 -0
  373. package/dist/feature-flags/store.js.map +1 -0
  374. package/dist/index.d.ts +1 -0
  375. package/dist/index.d.ts.map +1 -1
  376. package/dist/index.js +1 -0
  377. package/dist/index.js.map +1 -1
  378. package/dist/localization/default-messages.d.ts +45 -0
  379. package/dist/localization/default-messages.d.ts.map +1 -1
  380. package/dist/localization/default-messages.js +45 -0
  381. package/dist/localization/default-messages.js.map +1 -1
  382. package/dist/mcp/build-server.d.ts +2 -0
  383. package/dist/mcp/build-server.d.ts.map +1 -1
  384. package/dist/mcp/build-server.js +2 -2
  385. package/dist/mcp/build-server.js.map +1 -1
  386. package/dist/notifications/routes.d.ts +2 -2
  387. package/dist/progress/actions.d.ts.map +1 -1
  388. package/dist/progress/actions.js +3 -2
  389. package/dist/progress/actions.js.map +1 -1
  390. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  391. package/dist/provider-api/index.d.ts.map +1 -1
  392. package/dist/provider-api/index.js +91 -8
  393. package/dist/provider-api/index.js.map +1 -1
  394. package/dist/resources/handlers.d.ts +3 -3
  395. package/dist/scripts/call-agent.d.ts.map +1 -1
  396. package/dist/scripts/call-agent.js +107 -16
  397. package/dist/scripts/call-agent.js.map +1 -1
  398. package/dist/server/action-discovery.d.ts.map +1 -1
  399. package/dist/server/action-discovery.js +12 -0
  400. package/dist/server/action-discovery.js.map +1 -1
  401. package/dist/server/action-routes.d.ts +3 -0
  402. package/dist/server/action-routes.d.ts.map +1 -1
  403. package/dist/server/action-routes.js +45 -5
  404. package/dist/server/action-routes.js.map +1 -1
  405. package/dist/server/agent-chat/action-filters-a2a.d.ts +6 -0
  406. package/dist/server/agent-chat/action-filters-a2a.d.ts.map +1 -1
  407. package/dist/server/agent-chat/action-filters-a2a.js +27 -0
  408. package/dist/server/agent-chat/action-filters-a2a.js.map +1 -1
  409. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  410. package/dist/server/agent-chat-plugin.js +27 -1
  411. package/dist/server/agent-chat-plugin.js.map +1 -1
  412. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  413. package/dist/server/index.d.ts +1 -0
  414. package/dist/server/index.d.ts.map +1 -1
  415. package/dist/server/index.js +1 -0
  416. package/dist/server/index.js.map +1 -1
  417. package/dist/server/transcribe-voice.d.ts +1 -1
  418. package/dist/settings/org-settings.d.ts +2 -0
  419. package/dist/settings/org-settings.d.ts.map +1 -1
  420. package/dist/settings/org-settings.js +5 -1
  421. package/dist/settings/org-settings.js.map +1 -1
  422. package/dist/settings/store.d.ts +8 -0
  423. package/dist/settings/store.d.ts.map +1 -1
  424. package/dist/settings/store.js +48 -0
  425. package/dist/settings/store.js.map +1 -1
  426. package/dist/styles/agent-conversation.css +7 -0
  427. package/dist/templates/chat/.agents/skills/feature-flags/SKILL.md +169 -0
  428. package/dist/templates/default/.agents/skills/feature-flags/SKILL.md +169 -0
  429. package/dist/templates/default/AGENTS.md +1 -0
  430. package/dist/templates/default/app/i18n/ar-SA.ts +20 -0
  431. package/dist/templates/default/app/i18n/de-DE.ts +20 -0
  432. package/dist/templates/default/app/i18n/en-US.ts +20 -0
  433. package/dist/templates/default/app/i18n/es-ES.ts +20 -0
  434. package/dist/templates/default/app/i18n/fr-FR.ts +21 -0
  435. package/dist/templates/default/app/i18n/hi-IN.ts +19 -0
  436. package/dist/templates/default/app/i18n/ja-JP.ts +20 -0
  437. package/dist/templates/default/app/i18n/ko-KR.ts +19 -0
  438. package/dist/templates/default/app/i18n/pt-BR.ts +20 -0
  439. package/dist/templates/default/app/i18n/zh-CN.ts +19 -0
  440. package/dist/templates/default/app/i18n/zh-TW.ts +19 -0
  441. package/dist/templates/headless/.agents/skills/feature-flags/SKILL.md +169 -0
  442. package/dist/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +28 -0
  443. package/dist/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +5 -0
  444. package/dist/templates/workspace-core/.agents/skills/feature-flags/SKILL.md +169 -0
  445. package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
  446. package/dist/templates/workspace-core/AGENTS.md +1 -1
  447. package/dist/templates/workspace-root/AGENTS.md +1 -1
  448. package/dist/vite/action-types-plugin.d.ts.map +1 -1
  449. package/dist/vite/action-types-plugin.js +12 -0
  450. package/dist/vite/action-types-plugin.js.map +1 -1
  451. package/docs/content/actions.mdx +48 -0
  452. package/docs/content/locales/ar-SA/actions.mdx +38 -0
  453. package/docs/content/locales/de-DE/actions.mdx +38 -0
  454. package/docs/content/locales/es-ES/actions.mdx +38 -0
  455. package/docs/content/locales/fr-FR/actions.mdx +38 -0
  456. package/docs/content/locales/hi-IN/actions.mdx +38 -0
  457. package/docs/content/locales/ja-JP/actions.mdx +38 -0
  458. package/docs/content/locales/ko-KR/actions.mdx +38 -0
  459. package/docs/content/locales/pt-BR/actions.mdx +38 -0
  460. package/docs/content/locales/zh-CN/actions.mdx +38 -0
  461. package/docs/content/locales/zh-TW/actions.mdx +38 -0
  462. package/package.json +5 -1
  463. package/src/templates/chat/.agents/skills/feature-flags/SKILL.md +169 -0
  464. package/src/templates/default/.agents/skills/feature-flags/SKILL.md +169 -0
  465. package/src/templates/default/AGENTS.md +1 -0
  466. package/src/templates/default/app/i18n/ar-SA.ts +20 -0
  467. package/src/templates/default/app/i18n/de-DE.ts +20 -0
  468. package/src/templates/default/app/i18n/en-US.ts +20 -0
  469. package/src/templates/default/app/i18n/es-ES.ts +20 -0
  470. package/src/templates/default/app/i18n/fr-FR.ts +21 -0
  471. package/src/templates/default/app/i18n/hi-IN.ts +19 -0
  472. package/src/templates/default/app/i18n/ja-JP.ts +20 -0
  473. package/src/templates/default/app/i18n/ko-KR.ts +19 -0
  474. package/src/templates/default/app/i18n/pt-BR.ts +20 -0
  475. package/src/templates/default/app/i18n/zh-CN.ts +19 -0
  476. package/src/templates/default/app/i18n/zh-TW.ts +19 -0
  477. package/src/templates/headless/.agents/skills/feature-flags/SKILL.md +169 -0
  478. package/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +28 -0
  479. package/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +5 -0
  480. package/src/templates/workspace-core/.agents/skills/feature-flags/SKILL.md +169 -0
  481. package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
  482. package/src/templates/workspace-core/AGENTS.md +1 -1
  483. package/src/templates/workspace-root/AGENTS.md +1 -1
  484. package/corpus/templates/analytics/server/handlers/github.ts +0 -200
  485. package/corpus/templates/analytics/server/handlers/pylon.ts +0 -43
  486. package/corpus/templates/analytics/server/lib/apollo.ts +0 -167
  487. package/corpus/templates/analytics/server/lib/commonroom.ts +0 -149
  488. package/corpus/templates/analytics/server/lib/github.ts +0 -660
  489. package/corpus/templates/analytics/server/lib/mixpanel.ts +0 -156
  490. package/corpus/templates/analytics/server/lib/posthog.ts +0 -194
  491. package/corpus/templates/analytics/server/lib/pylon.ts +0 -109
  492. package/corpus/templates/analytics/server/routes/api/github/graphql.post.ts +0 -1
  493. package/corpus/templates/analytics/server/routes/api/github/issue.get.ts +0 -1
  494. package/corpus/templates/analytics/server/routes/api/github/org-prs.get.ts +0 -1
  495. package/corpus/templates/analytics/server/routes/api/github/pr.get.ts +0 -1
  496. package/corpus/templates/analytics/server/routes/api/github/prs.get.ts +0 -1
  497. package/corpus/templates/analytics/server/routes/api/github/search.get.ts +0 -1
  498. package/corpus/templates/clips/actions/get-feature-flags.ts +0 -30
  499. package/corpus/templates/slides/actions/fetch-logos.ts +0 -90
  500. package/corpus/templates/slides/actions/image-search.ts +0 -64
  501. package/corpus/templates/slides/actions/import-github.ts +0 -182
  502. package/corpus/templates/slides/actions/logo-lookup.ts +0 -113
@@ -2,12 +2,13 @@ import { defineAction } from "@agent-native/core";
2
2
  import { z } from "zod";
3
3
 
4
4
  import {
5
- getAllDeals,
6
5
  getDealPipelines,
7
6
  getDealOwners,
8
7
  getVisiblePipelines,
9
8
  searchHubSpotObjects,
10
9
  type Deal,
10
+ type HubSpotSearchFilter,
11
+ type HubSpotSearchFilterGroup,
11
12
  type Pipeline,
12
13
  } from "../server/lib/hubspot";
13
14
 
@@ -22,6 +23,7 @@ const StringListSchema = z.preprocess((value) => {
22
23
 
23
24
  const TextMatchSchema = z.enum(["token", "contains", "exact"]);
24
25
  const ClosedStatusSchema = z.enum(["any", "won", "lost", "closed", "open"]);
26
+ const HUBSPOT_SEARCH_RESULT_CAP = 10_000;
25
27
 
26
28
  function stageLookups(pipelines: Pipeline[]) {
27
29
  const stageLabels: Record<string, string> = {};
@@ -261,6 +263,102 @@ function hasStructuredFilters(filters: ReturnType<typeof buildFilterSummary>) {
261
263
  ].some((key) => key in filters);
262
264
  }
263
265
 
266
+ function buildHubSpotDealFilters(options: {
267
+ visiblePipelines: Pipeline[];
268
+ owners: Record<string, string>;
269
+ owner?: string;
270
+ product?: string;
271
+ productMatch: TextMatchMode;
272
+ pipeline?: string;
273
+ closedStatus: ClosedStatus;
274
+ closedDateFromMs: number | null;
275
+ closedDateToMs: number | null;
276
+ }): { filterGroups: HubSpotSearchFilterGroup[]; impossible: boolean } {
277
+ let pipelineIds = options.visiblePipelines.map((pipeline) => pipeline.id);
278
+ if (options.pipeline) {
279
+ const needle = options.pipeline.toLowerCase();
280
+ pipelineIds = options.visiblePipelines
281
+ .filter(
282
+ (pipeline) =>
283
+ pipeline.id.toLowerCase().includes(needle) ||
284
+ pipeline.label.toLowerCase().includes(needle),
285
+ )
286
+ .map((pipeline) => pipeline.id);
287
+ }
288
+ if (!pipelineIds.length) return { filterGroups: [], impossible: true };
289
+
290
+ const filters: HubSpotSearchFilter[] = [
291
+ { propertyName: "pipeline", operator: "IN", values: pipelineIds },
292
+ ];
293
+
294
+ if (options.owner) {
295
+ const needle = options.owner.toLowerCase();
296
+ const ownerIds = Object.entries(options.owners)
297
+ .filter(
298
+ ([id, name]) =>
299
+ id.toLowerCase() === needle || name.toLowerCase() === needle,
300
+ )
301
+ .map(([id]) => id);
302
+ if (!ownerIds.length) return { filterGroups: [], impossible: true };
303
+ filters.push({
304
+ propertyName: "hubspot_owner_id",
305
+ operator: "IN",
306
+ values: ownerIds,
307
+ });
308
+ }
309
+
310
+ if (options.product) {
311
+ filters.push({
312
+ propertyName: "products",
313
+ operator: options.productMatch === "exact" ? "EQ" : "CONTAINS_TOKEN",
314
+ value:
315
+ options.productMatch === "contains"
316
+ ? `*${options.product}*`
317
+ : options.product,
318
+ });
319
+ }
320
+
321
+ if (options.closedStatus !== "any") {
322
+ const lookups = stageLookups(options.visiblePipelines);
323
+ const wonIds = [...lookups.wonStageIds];
324
+ const lostIds = [...lookups.lostStageIds];
325
+ const closedIds = [...new Set([...wonIds, ...lostIds])];
326
+ const values =
327
+ options.closedStatus === "won"
328
+ ? wonIds
329
+ : options.closedStatus === "lost"
330
+ ? lostIds
331
+ : closedIds;
332
+ if (!values.length && options.closedStatus !== "open") {
333
+ return { filterGroups: [], impossible: true };
334
+ }
335
+ if (closedIds.length) {
336
+ filters.push({
337
+ propertyName: "dealstage",
338
+ operator: options.closedStatus === "open" ? "NOT_IN" : "IN",
339
+ values: options.closedStatus === "open" ? closedIds : values,
340
+ });
341
+ }
342
+ }
343
+
344
+ if (options.closedDateFromMs != null) {
345
+ filters.push({
346
+ propertyName: "closedate",
347
+ operator: "GTE",
348
+ value: String(options.closedDateFromMs),
349
+ });
350
+ }
351
+ if (options.closedDateToMs != null) {
352
+ filters.push({
353
+ propertyName: "closedate",
354
+ operator: "LTE",
355
+ value: String(options.closedDateToMs),
356
+ });
357
+ }
358
+
359
+ return { filterGroups: [{ filters }], impossible: false };
360
+ }
361
+
264
362
  function buildGuidance(options: {
265
363
  query: string | undefined;
266
364
  structuredFilters: boolean;
@@ -270,6 +368,7 @@ function buildGuidance(options: {
270
368
  returned: number;
271
369
  offset: number;
272
370
  limit: number;
371
+ searchCoverageLimited: boolean;
273
372
  }) {
274
373
  const guidance: string[] = [];
275
374
 
@@ -278,7 +377,9 @@ function buildGuidance(options: {
278
377
  "Used HubSpot full-text deal search for the query. Treat query matches as broad keyword/account matches, not proof that a specific property equals the query.",
279
378
  );
280
379
  } else {
281
- guidance.push("Loaded visible HubSpot deals before local filtering.");
380
+ guidance.push(
381
+ "Used HubSpot CRM search with provider-side pipeline and structured filters; the action did not scan the full deal corpus locally.",
382
+ );
282
383
  }
283
384
 
284
385
  if (options.structuredFilters) {
@@ -292,11 +393,26 @@ function buildGuidance(options: {
292
393
  }
293
394
 
294
395
  if (options.truncated) {
295
- const more = options.hasMore
296
- ? `Fetch the next page with offset ${options.offset + options.returned}.`
297
- : "This is the last page of the cohort.";
396
+ if (options.query) {
397
+ const more = options.hasMore
398
+ ? "Fetch the next page with the returned nextAfter cursor."
399
+ : "This query has no usable next cursor.";
400
+ guidance.push(
401
+ `Returned ${options.returned} of ${options.total} matching deals (limit ${options.limit}). This is a partial slice — do NOT treat it as the full cohort. ${more} Narrow the query or use provider-api-request with provider = hubspot and stageAs for a projected corpus.`,
402
+ );
403
+ } else {
404
+ const more = options.hasMore
405
+ ? `Fetch the next page with offset ${options.offset + options.returned}.`
406
+ : "This is the last page of the cohort.";
407
+ guidance.push(
408
+ `Returned ${options.returned} of ${options.total} matching deals (limit ${options.limit}, offset ${options.offset}). This is a partial slice — do NOT treat it as the full cohort. Use total for counts/aggregates. ${more} Narrow the filters or, for exhaustive cohort analysis, use provider-api-request with provider = hubspot and stageAs.`,
409
+ );
410
+ }
411
+ }
412
+
413
+ if (options.searchCoverageLimited) {
298
414
  guidance.push(
299
- `Returned ${options.returned} of ${options.total} matching deals (limit ${options.limit}, offset ${options.offset}). This is a partial slice do NOT treat it as the full cohort. Use total for counts/aggregates. ${more} Narrow the filters or, for exhaustive cohort analysis, use provider-api-request with provider = hubspot and stageAs.`,
415
+ "HubSpot search cannot page beyond 10,000 results for one query, so coverage is incomplete even if this page has no next cursor. Split the cohort into non-overlapping closed-date windows and combine the projected results; do not report an exhaustive count or absence claim from this query alone.",
300
416
  );
301
417
  }
302
418
 
@@ -308,7 +424,7 @@ export default defineAction({
308
424
  // reusable across continuation retries (no re-fetch on resume).
309
425
  readOnly: true,
310
426
  description:
311
- "Get HubSpot deals with normalized stage, pipeline, owner, forecast, and NBM fields. This is a bounded deal analytics shortcut, not the full HubSpot capability surface. Use query for a specific customer/deal/account deep dive. For cohorts like products field = Publish, closed-won, pipeline = New Business, or close date in a range, use the structured product, pipeline, closedStatus, closedDateFrom, and closedDateTo filters instead of query when the answer is the deal list itself. If the cohort feeds a cross-source join, transcript/message/ticket search, exhaustive absence check, or downstream code/corpus workflow, prefer provider-api-catalog/provider-api-request with provider = hubspot and stageAs so the cohort is available as a staged dataset. Both paths are bounded: at most limit deals are returned (default 25, max 100). The structured-filter path returns total as the true matched count and a truncated flag; page with offset (or narrow filters) instead of expecting the whole cohort in one call, since a full enriched cohort can be several MB and overruns extension and context budgets. For non-deal CRM records use hubspot-records; for arbitrary HubSpot endpoints, filters, associations, batch APIs, or payloads use provider-api-catalog/provider-api-docs/provider-api-request with provider = hubspot.",
427
+ "Get HubSpot deals with normalized stage, pipeline, owner, forecast, and NBM fields. This is a bounded deal analytics shortcut, not the full HubSpot capability surface. Use query for a specific customer/deal/account deep dive. For cohorts like products field = Publish, closed-won, pipeline = New Business, or close date in a range, use the structured product, pipeline, closedStatus, closedDateFrom, and closedDateTo filters instead of query when the answer is the deal list itself. If the cohort feeds a cross-source join, transcript/message/ticket search, exhaustive absence check, or downstream code/corpus workflow, prefer provider-api-catalog/provider-api-request with provider = hubspot and stageAs so the cohort is available as a staged dataset. Both paths are bounded: at most limit deals are returned (default 25, max 200). HubSpot search returns a total but no server-side aggregates and cannot page past 10,000 matches for one query; compute metrics on filtered/projected rows, and split larger cohorts into non-overlapping date windows while reporting coverage. The structured-filter path returns total as the matched count and a truncated flag; page with offset (or narrow filters) instead of expecting the whole cohort in one call, since a full enriched cohort can be several MB and overruns extension and context budgets. For non-deal CRM records use hubspot-records; for arbitrary HubSpot endpoints, filters, associations, batch APIs, or payloads use provider-api-catalog/provider-api-docs/provider-api-request with provider = hubspot.",
312
428
  schema: z.object({
313
429
  properties: StringListSchema.describe(
314
430
  "Optional comma-separated extra HubSpot deal property names to include.",
@@ -357,7 +473,7 @@ export default defineAction({
357
473
  .number()
358
474
  .int()
359
475
  .min(1)
360
- .max(100)
476
+ .max(200)
361
477
  .default(25)
362
478
  .describe(
363
479
  "Maximum deals to return. Applies to BOTH full-text query results and structured-filter cohorts. The structured-filter path returns at most this many enriched deals (use total for the true matched count and offset to page).",
@@ -366,6 +482,7 @@ export default defineAction({
366
482
  .number()
367
483
  .int()
368
484
  .min(0)
485
+ .max(HUBSPOT_SEARCH_RESULT_CAP - 1)
369
486
  .default(0)
370
487
  .describe(
371
488
  "Number of structured-filter results to skip before returning limit deals. Use for paging through a large cohort; ignored when query is provided.",
@@ -408,27 +525,57 @@ export default defineAction({
408
525
  );
409
526
  }
410
527
 
411
- const [dealResult, allPipelines, owners] = await Promise.all([
412
- trimmedQuery
413
- ? searchHubSpotObjects({
414
- objectType: "deals",
415
- query: trimmedQuery,
416
- properties,
417
- limit,
418
- after,
419
- })
420
- : getAllDeals(properties),
528
+ const [allPipelines, owners] = await Promise.all([
421
529
  getDealPipelines(),
422
530
  getDealOwners(),
423
531
  ]);
424
-
425
532
  const visiblePipelines = getVisiblePipelines(allPipelines);
426
533
  const visibleIds = new Set(visiblePipelines.map((p) => p.id));
427
534
  const lookups = stageLookups(visiblePipelines);
428
535
  const ownerFilter = owner?.trim().toLowerCase();
429
- const rawDeals = Array.isArray(dealResult)
430
- ? dealResult
431
- : dealResult.records.map(recordToDeal);
536
+ const providerFilters = buildHubSpotDealFilters({
537
+ visiblePipelines,
538
+ owners,
539
+ owner: trimmedOwner,
540
+ product: trimmedProduct,
541
+ productMatch,
542
+ pipeline: trimmedPipeline,
543
+ closedStatus,
544
+ closedDateFromMs: fromMs,
545
+ closedDateToMs: toMs,
546
+ });
547
+ const requestedAfter = trimmedQuery ? after : String(offset);
548
+ const numericAfter = requestedAfter
549
+ ? Number.parseInt(requestedAfter, 10)
550
+ : 0;
551
+ if (
552
+ requestedAfter &&
553
+ Number.isFinite(numericAfter) &&
554
+ numericAfter >= HUBSPOT_SEARCH_RESULT_CAP
555
+ ) {
556
+ throw new Error(
557
+ "HubSpot search cannot page beyond 10,000 results. Split the query into non-overlapping closed-date windows and report the combined coverage.",
558
+ );
559
+ }
560
+ const requestLimit = Number.isFinite(numericAfter)
561
+ ? Math.min(limit, HUBSPOT_SEARCH_RESULT_CAP - numericAfter)
562
+ : limit;
563
+ const dealResult = providerFilters.impossible
564
+ ? {
565
+ records: [],
566
+ total: 0,
567
+ nextAfter: null,
568
+ properties: properties ?? [],
569
+ }
570
+ : await searchHubSpotObjects({
571
+ objectType: "deals",
572
+ query: trimmedQuery,
573
+ filterGroups: providerFilters.filterGroups,
574
+ properties,
575
+ limit: requestLimit,
576
+ after: requestedAfter,
577
+ });
578
+ const rawDeals = dealResult.records.map(recordToDeal);
432
579
  const filters = buildFilterSummary({
433
580
  owner: trimmedOwner,
434
581
  query: trimmedQuery,
@@ -461,24 +608,21 @@ export default defineAction({
461
608
  return matchesDateRange(deal, fromMs, toMs);
462
609
  });
463
610
 
464
- // The full-text query path is already bounded by HubSpot's own `limit`.
465
- // EVERY non-query call (with or without structured filters) scans the whole
466
- // visible deal set, so bound the returned cohort here. This is deliberately
467
- // NOT gated on `structuredFilters`: the unfiltered `hubspot-deals({})` call
468
- // is the LARGEST payload of all (every visible deal), so it must be bounded
469
- // too a full enriched cohort can be multiple MB, which overruns the
470
- // extension iframe bridge and the agent context. We
471
- // keep `total` as the true matched count and signal partial slices via
472
- // `truncated` so callers never mistake a page for the full cohort.
473
- // `truncated` means "this response is only part of the cohort" (returned <
474
- // total) and stays true on the LAST page of a paginated read too; pagination
475
- // (is there a next page) is reported separately via `hasMore` / `nextOffset`.
476
- const matchedTotal = matchedDeals.length;
477
- const deals = trimmedQuery
478
- ? matchedDeals
479
- : matchedDeals.slice(offset, offset + limit);
480
- const truncated = !trimmedQuery && deals.length < matchedTotal;
481
- const hasMore = !trimmedQuery && offset + deals.length < matchedTotal;
611
+ // HubSpot applies the cohort filters and pagination before returning the
612
+ // page. Keep the local checks as a compatibility/correctness guard, but do
613
+ // not scan and slice the full deal corpus in this action.
614
+ const matchedTotal = dealResult.total;
615
+ const deals = matchedDeals;
616
+ const searchCoverageLimited = matchedTotal >= HUBSPOT_SEARCH_RESULT_CAP;
617
+ const nextCursor = dealResult.nextAfter
618
+ ? Number.parseInt(dealResult.nextAfter, 10)
619
+ : null;
620
+ const nextCursorWithinCap =
621
+ nextCursor == null ||
622
+ !Number.isFinite(nextCursor) ||
623
+ nextCursor < HUBSPOT_SEARCH_RESULT_CAP;
624
+ const hasMore = dealResult.nextAfter != null && nextCursorWithinCap;
625
+ const truncated = deals.length < matchedTotal || searchCoverageLimited;
482
626
 
483
627
  return {
484
628
  deals,
@@ -488,7 +632,10 @@ export default defineAction({
488
632
  count: deals.length,
489
633
  query: trimmedQuery || null,
490
634
  filters,
491
- nextAfter: Array.isArray(dealResult) ? null : dealResult.nextAfter,
635
+ nextAfter: hasMore ? dealResult.nextAfter : null,
636
+ searchResultCap: HUBSPOT_SEARCH_RESULT_CAP,
637
+ searchCoverageComplete: !searchCoverageLimited,
638
+ searchCoverageLimited,
492
639
  ...(trimmedQuery
493
640
  ? {}
494
641
  : {
@@ -507,12 +654,9 @@ export default defineAction({
507
654
  returned: deals.length,
508
655
  offset,
509
656
  limit,
657
+ searchCoverageLimited,
510
658
  }),
511
- ...(Array.isArray(dealResult)
512
- ? {}
513
- : {
514
- searchedProperties: dealResult.properties,
515
- }),
659
+ searchedProperties: dealResult.properties,
516
660
  };
517
661
  },
518
662
  });
@@ -0,0 +1,15 @@
1
+ import { defineAction } from "@agent-native/core/action";
2
+ import { z } from "zod";
3
+
4
+ import { requireAnalyticsAdminContext } from "../server/lib/db-admin-connections.js";
5
+ import { listWorkspaceFeatureFlags } from "../server/lib/workspace-feature-flags.js";
6
+
7
+ export default defineAction({
8
+ description:
9
+ "List feature-flag definitions across trusted organization apps. Non-ready apps are reported explicitly and never treated as off.",
10
+ schema: z.object({}),
11
+ http: { method: "GET" },
12
+ readOnly: true,
13
+ run: async (_args, ctx) =>
14
+ listWorkspaceFeatureFlags(await requireAnalyticsAdminContext(ctx)),
15
+ });
@@ -77,10 +77,10 @@ export default defineAction({
77
77
  .optional()
78
78
  .describe("Session recording id to open (used with view=sessions)"),
79
79
  agentsView: z
80
- .enum(["monitoring", "dashboards", "database"])
80
+ .enum(["monitoring", "dashboards", "database", "flags"])
81
81
  .optional()
82
82
  .describe(
83
- "Admin subview to open (monitoring, dashboard usage, or app databases)",
83
+ "Admin subview to open (monitoring, dashboard usage, app databases, or feature flags)",
84
84
  ),
85
85
  dbAdminConnectionId: z
86
86
  .string()
@@ -0,0 +1,123 @@
1
+ import { defineAction } from "@agent-native/core";
2
+ import { z } from "zod";
3
+
4
+ import { executeProviderApiRequest } from "../server/lib/provider-api";
5
+
6
+ const DAY_MS = 24 * 60 * 60 * 1_000;
7
+
8
+ export default defineAction({
9
+ description:
10
+ "Fetch a bounded Pylon issue corpus through Pylon's server-side search endpoint, or preserve the legacy account/accounts compatibility calls used by generated extensions. Agents should prefer provider-api-request or provider-corpus-job for ad hoc Pylon queries.",
11
+ schema: z.object({
12
+ account: z.string().optional(),
13
+ accounts: z.coerce.boolean().default(false),
14
+ query: z.string().optional(),
15
+ days: z.coerce
16
+ .number()
17
+ .int()
18
+ .min(1)
19
+ .max(730)
20
+ .default(371)
21
+ .describe("Created-at lookback window. Defaults to 53 weeks."),
22
+ pageSize: z.coerce.number().int().min(1).max(999).default(500),
23
+ maxPages: z.coerce.number().int().min(1).max(50).default(20),
24
+ }),
25
+ readOnly: true,
26
+ parallelSafe: true,
27
+ agentTool: false,
28
+ toolCallable: true,
29
+ http: { method: "POST" },
30
+ run: async ({ account, accounts, query, days, pageSize, maxPages }) => {
31
+ if (accounts) {
32
+ const response = (await executeProviderApiRequest({
33
+ provider: "pylon",
34
+ method: "GET",
35
+ path: "/accounts",
36
+ ...(query?.trim() ? { query: { query: query.trim() } } : {}),
37
+ })) as { response?: { json?: unknown } };
38
+ const body = response.response?.json;
39
+ const values = Array.isArray(body)
40
+ ? body
41
+ : body && typeof body === "object" && "data" in body
42
+ ? Array.isArray((body as { data?: unknown }).data)
43
+ ? (body as { data: unknown[] }).data
44
+ : []
45
+ : [];
46
+ return {
47
+ accounts: values,
48
+ total: values.length,
49
+ source: "pylon-accounts-compatibility",
50
+ };
51
+ }
52
+
53
+ if (account?.trim() || query?.trim()) {
54
+ const now = new Date();
55
+ const start = new Date(now.getTime() - 30 * DAY_MS);
56
+ const response = (await executeProviderApiRequest({
57
+ provider: "pylon",
58
+ method: "GET",
59
+ path: "/issues",
60
+ query: {
61
+ ...(account?.trim() ? { account_id: account.trim() } : {}),
62
+ ...(query?.trim() ? { query: query.trim() } : {}),
63
+ start_time: start.toISOString(),
64
+ end_time: now.toISOString(),
65
+ },
66
+ })) as { response?: { json?: unknown } };
67
+ const body = response.response?.json;
68
+ const values = Array.isArray(body)
69
+ ? body
70
+ : body && typeof body === "object" && "data" in body
71
+ ? Array.isArray((body as { data?: unknown }).data)
72
+ ? (body as { data: unknown[] }).data
73
+ : []
74
+ : [];
75
+ return {
76
+ issues: values,
77
+ total: values.length,
78
+ ...(account?.trim() ? { account: account.trim() } : {}),
79
+ source: "pylon-issues-compatibility",
80
+ };
81
+ }
82
+
83
+ const createdAfter = new Date(Date.now() - days * DAY_MS).toISOString();
84
+ const response = (await executeProviderApiRequest({
85
+ provider: "pylon",
86
+ method: "POST",
87
+ path: "/issues/search",
88
+ body: {
89
+ filter: {
90
+ field: "created_at",
91
+ operator: "time_is_after",
92
+ value: createdAfter,
93
+ },
94
+ limit: pageSize,
95
+ },
96
+ fetchAllPages: {
97
+ cursorPath: "pagination.cursor",
98
+ cursorBodyPath: "cursor",
99
+ itemsPath: "data",
100
+ maxPages,
101
+ },
102
+ })) as {
103
+ items?: unknown[];
104
+ pagesRead?: number;
105
+ totalItems?: number;
106
+ lastStatus?: number;
107
+ truncated?: boolean;
108
+ nextCursor?: string | null;
109
+ };
110
+ const issues = Array.isArray(response.items) ? response.items : [];
111
+ const pagesRead = Number(response.pagesRead ?? 0);
112
+ return {
113
+ issues,
114
+ total: Number(response.totalItems ?? issues.length),
115
+ pagesRead,
116
+ createdAfter,
117
+ coverageComplete: response.truncated !== true,
118
+ truncated: response.truncated === true,
119
+ nextCursor: response.nextCursor ?? null,
120
+ source: "pylon-issues-search",
121
+ };
122
+ },
123
+ });
@@ -0,0 +1,45 @@
1
+ import { defineAction } from "@agent-native/core/action";
2
+ import { z } from "zod";
3
+
4
+ import { requireAnalyticsAdminContext } from "../server/lib/db-admin-connections.js";
5
+ import { setWorkspaceFeatureFlag } from "../server/lib/workspace-feature-flags.js";
6
+
7
+ const rules = z.object({
8
+ mode: z.enum(["off", "on", "rules"]),
9
+ emails: z.array(z.string().email()).max(500).optional(),
10
+ orgIds: z.array(z.string().min(1).max(200)).max(500).optional(),
11
+ percentage: z.number().int().min(0).max(100).optional(),
12
+ });
13
+ const schema = z.discriminatedUnion("operation", [
14
+ z.object({
15
+ appId: z.string().min(1),
16
+ key: z.string().min(1),
17
+ operation: z.literal("enable-for-current-user"),
18
+ }),
19
+ z.object({
20
+ appId: z.string().min(1),
21
+ key: z.string().min(1),
22
+ operation: z.literal("off"),
23
+ }),
24
+ z.object({
25
+ appId: z.string().min(1),
26
+ key: z.string().min(1),
27
+ operation: z.literal("replace-rules"),
28
+ rules,
29
+ }),
30
+ ]);
31
+ export default defineAction({
32
+ description:
33
+ "Persist one feature-flag change on a trusted organization app. The app target is resolved only through the organization directory.",
34
+ schema,
35
+ agentInputSchema: z.object({
36
+ appId: z.string(),
37
+ key: z.string(),
38
+ operation: z.enum(["enable-for-current-user", "off", "replace-rules"]),
39
+ rules: rules.optional(),
40
+ }),
41
+ run: async (args, ctx) => {
42
+ const admin = await requireAnalyticsAdminContext(ctx);
43
+ return setWorkspaceFeatureFlag(admin, args);
44
+ },
45
+ });