@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
@@ -79,12 +79,32 @@ const messages = {
79
79
  'Apps in the "{{workspace}}" workspace. Each app gets its own route under this workspace and shares its database, auth, and agent chat.',
80
80
  appsInWorkspace: "Apps in {{workspace}}",
81
81
  workspaceApps: "Aplicaciones de espacio de trabajo",
82
+ otherApps: "Otras aplicaciones",
83
+ otherAppsDescription: "Abre otras aplicaciones disponibles para ti.",
84
+ availableCount: "{{count}} disponibles",
82
85
  activeCount: "{{count}} active",
83
86
  hiddenCount: "{{count}} hidden",
84
87
  createApp: "Crear aplicación",
85
88
  templates: "Plantillas",
86
89
  checkingTemplates: "Comprobando plantillas disponibles",
87
90
  templatesAvailable: "{{count}} available to scaffold",
91
+ curatedTemplates: "Plantillas seleccionadas",
92
+ curatedTemplatesDescription:
93
+ "Empieza con una estructura de aplicación revisada y hazla tuya.",
94
+ remix: "Reutilizar",
95
+ remixTemplate: "Reutilizar {{name}}",
96
+ remixAppIdLabel: "Nuevo ID de aplicación",
97
+ remixStarted: "Se inició la reutilización de {{name}}",
98
+ viewLiveApp: "Ver aplicación en vivo",
99
+ alreadyInWorkspace: "Ya está en el espacio de trabajo",
100
+ remixAppIdDescription:
101
+ "Elige un ID seguro para URL para la nueva aplicación.",
102
+ integrationSetup: "Configuración de integración",
103
+ source: "Origen",
104
+ remixing: "Reutilizando…",
105
+ remixSuccess: "Se inició la reutilización de la plantilla.",
106
+ remixError: "No se pudo reutilizar esta plantilla",
107
+ appIdRequired: "El ID de aplicación es obligatorio.",
88
108
  hide: "Ocultar",
89
109
  show: "Show",
90
110
  hiddenApps: "Aplicaciones ocultas",
@@ -80,12 +80,33 @@ const messages = {
80
80
  'Apps in the "{{workspace}}" workspace. Each app gets its own route under this workspace and shares its database, auth, and agent chat.',
81
81
  appsInWorkspace: "Apps in {{workspace}}",
82
82
  workspaceApps: "Applications d'espace de travail",
83
+ otherApps: "Autres applications",
84
+ otherAppsDescription:
85
+ "Ouvrez les autres applications qui vous sont accessibles.",
86
+ availableCount: "{{count}} disponibles",
83
87
  activeCount: "{{count}} active",
84
88
  hiddenCount: "{{count}} hidden",
85
89
  createApp: "Créer une application",
86
90
  templates: "Modèles",
87
91
  checkingTemplates: "Vérification des modèles disponibles",
88
92
  templatesAvailable: "{{count}} available to scaffold",
93
+ curatedTemplates: "Modèles sélectionnés",
94
+ curatedTemplatesDescription:
95
+ "Partez d’une structure d’application vérifiée et personnalisez-la.",
96
+ remix: "Remixer",
97
+ remixTemplate: "Remixer {{name}}",
98
+ remixAppIdLabel: "Nouvel identifiant d’application",
99
+ remixStarted: "Remix de {{name}} lancé",
100
+ viewLiveApp: "Voir l’application en direct",
101
+ alreadyInWorkspace: "Déjà dans l’espace de travail",
102
+ remixAppIdDescription:
103
+ "Choisissez un identifiant compatible avec l’URL pour la nouvelle application.",
104
+ integrationSetup: "Configuration de l’intégration",
105
+ source: "Source",
106
+ remixing: "Remix en cours…",
107
+ remixSuccess: "Le remix du modèle a démarré.",
108
+ remixError: "Impossible de remixer ce modèle",
109
+ appIdRequired: "L’identifiant de l’application est requis.",
89
110
  hide: "Masquer",
90
111
  show: "Show",
91
112
  hiddenApps: "Applications cachées",
@@ -75,12 +75,31 @@ const messages = {
75
75
  'Apps in the "{{workspace}}" workspace. Each app gets its own route under this workspace and shares its database, auth, and agent chat.',
76
76
  appsInWorkspace: "Apps in {{workspace}}",
77
77
  workspaceApps: "कार्यक्षेत्र ऐप्स",
78
+ otherApps: "अन्य ऐप्स",
79
+ otherAppsDescription: "आपके लिए उपलब्ध अन्य ऐप्स खोलें।",
80
+ availableCount: "{{count}} उपलब्ध",
78
81
  activeCount: "{{count}} active",
79
82
  hiddenCount: "{{count}} hidden",
80
83
  createApp: "ऐप बनाएं",
81
84
  templates: "टेम्पलेट",
82
85
  checkingTemplates: "उपलब्ध टेम्प्लेट की जाँच करना",
83
86
  templatesAvailable: "{{count}} available to scaffold",
87
+ curatedTemplates: "चयनित टेम्पलेट",
88
+ curatedTemplatesDescription:
89
+ "समीक्षित ऐप संरचना से शुरू करें और इसे अपने अनुसार बनाएं।",
90
+ remix: "रीमिक्स",
91
+ remixTemplate: "{{name}} रीमिक्स करें",
92
+ remixAppIdLabel: "नया ऐप आईडी",
93
+ remixStarted: "{{name}} रीमिक्स शुरू हुआ",
94
+ viewLiveApp: "लाइव ऐप देखें",
95
+ alreadyInWorkspace: "वर्कस्पेस में पहले से मौजूद",
96
+ remixAppIdDescription: "नए वर्कस्पेस ऐप के लिए URL-सुरक्षित आईडी चुनें।",
97
+ integrationSetup: "इंटीग्रेशन सेटअप",
98
+ source: "स्रोत",
99
+ remixing: "रीमिक्स हो रहा है…",
100
+ remixSuccess: "टेम्पलेट रीमिक्स शुरू हुआ।",
101
+ remixError: "यह टेम्पलेट रीमिक्स नहीं हो सका",
102
+ appIdRequired: "ऐप आईडी आवश्यक है।",
84
103
  hide: "छिपाएं",
85
104
  show: "Show",
86
105
  hiddenApps: "छुपे हुए ऐप्स",
@@ -77,12 +77,32 @@ const messages = {
77
77
  'Apps in the "{{workspace}}" workspace. Each app gets its own route under this workspace and shares its database, auth, and agent chat.',
78
78
  appsInWorkspace: "Apps in {{workspace}}",
79
79
  workspaceApps: "ワークスペースアプリ",
80
+ otherApps: "その他のアプリ",
81
+ otherAppsDescription: "利用できるその他のアプリを開きます。",
82
+ availableCount: "{{count}}件利用可能",
80
83
  activeCount: "{{count}} active",
81
84
  hiddenCount: "{{count}} hidden",
82
85
  createApp: "アプリの作成",
83
86
  templates: "テンプレート",
84
87
  checkingTemplates: "利用可能なテンプレートを確認する",
85
88
  templatesAvailable: "{{count}} available to scaffold",
89
+ curatedTemplates: "厳選テンプレート",
90
+ curatedTemplatesDescription:
91
+ "レビュー済みのアプリ構成をベースに、自分用にカスタマイズできます。",
92
+ remix: "リミックス",
93
+ remixTemplate: "{{name}} をリミックス",
94
+ remixAppIdLabel: "新しいアプリ ID",
95
+ remixStarted: "{{name}} のリミックスを開始しました",
96
+ viewLiveApp: "ライブアプリを見る",
97
+ alreadyInWorkspace: "ワークスペースに追加済み",
98
+ remixAppIdDescription:
99
+ "新しいワークスペースアプリの URL セーフな ID を選択してください。",
100
+ integrationSetup: "連携の設定",
101
+ source: "提供元",
102
+ remixing: "リミックス中…",
103
+ remixSuccess: "テンプレートのリミックスを開始しました。",
104
+ remixError: "このテンプレートをリミックスできませんでした",
105
+ appIdRequired: "アプリ ID は必須です。",
86
106
  hide: "非表示",
87
107
  show: "Show",
88
108
  hiddenApps: "隠しアプリ",
@@ -76,12 +76,31 @@ const messages = {
76
76
  'Apps in the "{{workspace}}" workspace. Each app gets its own route under this workspace and shares its database, auth, and agent chat.',
77
77
  appsInWorkspace: "Apps in {{workspace}}",
78
78
  workspaceApps: "작업 공간 앱",
79
+ otherApps: "기타 앱",
80
+ otherAppsDescription: "사용할 수 있는 다른 앱을 엽니다.",
81
+ availableCount: "{{count}}개 사용 가능",
79
82
  activeCount: "{{count}} active",
80
83
  hiddenCount: "{{count}} hidden",
81
84
  createApp: "앱 만들기",
82
85
  templates: "템플릿",
83
86
  checkingTemplates: "사용 가능한 템플릿 확인 중",
84
87
  templatesAvailable: "{{count}} available to scaffold",
88
+ curatedTemplates: "엄선된 템플릿",
89
+ curatedTemplatesDescription:
90
+ "검토된 앱 구조에서 시작해 나만의 앱으로 만들어 보세요.",
91
+ remix: "리믹스",
92
+ remixTemplate: "{{name}} 리믹스",
93
+ remixAppIdLabel: "새 앱 ID",
94
+ remixStarted: "{{name}} 리믹스를 시작했습니다",
95
+ viewLiveApp: "라이브 앱 보기",
96
+ alreadyInWorkspace: "워크스페이스에 이미 있음",
97
+ remixAppIdDescription: "새 워크스페이스 앱의 URL 안전 ID를 선택하세요.",
98
+ integrationSetup: "연동 설정",
99
+ source: "소스",
100
+ remixing: "리믹스 중…",
101
+ remixSuccess: "템플릿 리믹스를 시작했습니다.",
102
+ remixError: "이 템플릿을 리믹스할 수 없습니다",
103
+ appIdRequired: "앱 ID가 필요합니다.",
85
104
  hide: "숨기기",
86
105
  show: "Show",
87
106
  hiddenApps: "숨겨진 앱",
@@ -80,12 +80,32 @@ const messages = {
80
80
  'Apps in the "{{workspace}}" workspace. Each app gets its own route under this workspace and shares its database, auth, and agent chat.',
81
81
  appsInWorkspace: "Apps in {{workspace}}",
82
82
  workspaceApps: "Aplicativos de espaço de trabalho",
83
+ otherApps: "Outros aplicativos",
84
+ otherAppsDescription: "Abra outros aplicativos disponíveis para você.",
85
+ availableCount: "{{count}} disponíveis",
83
86
  activeCount: "{{count}} active",
84
87
  hiddenCount: "{{count}} hidden",
85
88
  createApp: "Criar aplicativo",
86
89
  templates: "Modelos",
87
90
  checkingTemplates: "Verificando modelos disponíveis",
88
91
  templatesAvailable: "{{count}} available to scaffold",
92
+ curatedTemplates: "Modelos selecionados",
93
+ curatedTemplatesDescription:
94
+ "Comece com uma estrutura de app revisada e personalize-a.",
95
+ remix: "Remixar",
96
+ remixTemplate: "Remixar {{name}}",
97
+ remixAppIdLabel: "Novo ID do app",
98
+ remixStarted: "Remix de {{name}} iniciado",
99
+ viewLiveApp: "Ver app ao vivo",
100
+ alreadyInWorkspace: "Já está no workspace",
101
+ remixAppIdDescription:
102
+ "Escolha um ID seguro para URL para o novo app do workspace.",
103
+ integrationSetup: "Configuração da integração",
104
+ source: "Origem",
105
+ remixing: "Remixando…",
106
+ remixSuccess: "Remix do modelo iniciado.",
107
+ remixError: "Não foi possível remixar este modelo",
108
+ appIdRequired: "O ID do app é obrigatório.",
89
109
  hide: "Ocultar",
90
110
  show: "Show",
91
111
  hiddenApps: "Aplicativos ocultos",
@@ -73,12 +73,31 @@ const messages = {
73
73
  'Apps in the "{{workspace}}" workspace. Each app gets its own route under this workspace and shares its database, auth, and agent chat.',
74
74
  appsInWorkspace: "Apps in {{workspace}}",
75
75
  workspaceApps: "工作区应用程序",
76
+ otherApps: "其他应用",
77
+ otherAppsDescription: "打开你可以使用的其他应用。",
78
+ availableCount: "可用 {{count}} 个",
76
79
  activeCount: "{{count}} active",
77
80
  hiddenCount: "{{count}} hidden",
78
81
  createApp: "创建应用程序",
79
82
  templates: "模板",
80
83
  checkingTemplates: "检查可用模板",
81
84
  templatesAvailable: "{{count}} available to scaffold",
85
+ curatedTemplates: "精选模板",
86
+ curatedTemplatesDescription:
87
+ "从经过审核的应用结构开始,然后打造属于你的应用。",
88
+ remix: "再创作",
89
+ remixTemplate: "再创作 {{name}}",
90
+ remixAppIdLabel: "新应用 ID",
91
+ remixStarted: "已开始再创作 {{name}}",
92
+ viewLiveApp: "查看在线应用",
93
+ alreadyInWorkspace: "已在工作区中",
94
+ remixAppIdDescription: "为新的工作区应用选择一个 URL 安全的 ID。",
95
+ integrationSetup: "集成设置",
96
+ source: "来源",
97
+ remixing: "正在再创作…",
98
+ remixSuccess: "已开始再创作模板。",
99
+ remixError: "无法再创作此模板",
100
+ appIdRequired: "应用 ID 是必填项。",
82
101
  hide: "隐藏",
83
102
  show: "Show",
84
103
  hiddenApps: "隐藏的应用程序",
@@ -73,12 +73,31 @@ const messages = {
73
73
  "「{{workspace}}」工作區中的應用程式。每個應用程式都會在此工作區下取得自己的路由,並共用資料庫、驗證與代理聊天。",
74
74
  appsInWorkspace: "{{workspace}} 中的應用程式",
75
75
  workspaceApps: "工作區應用程式",
76
+ otherApps: "其他應用程式",
77
+ otherAppsDescription: "開啟你可以使用的其他應用程式。",
78
+ availableCount: "可用 {{count}} 個",
76
79
  activeCount: "{{count}} 個作用中",
77
80
  hiddenCount: "{{count}} 個已隱藏",
78
81
  createApp: "建立應用程式",
79
82
  templates: "範本",
80
83
  checkingTemplates: "檢查可用範本",
81
84
  templatesAvailable: "{{count}} 個可用於產生架構",
85
+ curatedTemplates: "精選範本",
86
+ curatedTemplatesDescription:
87
+ "從經過審核的應用程式結構開始,打造屬於你的應用程式。",
88
+ remix: "重新混搭",
89
+ remixTemplate: "重新混搭 {{name}}",
90
+ remixAppIdLabel: "新應用程式 ID",
91
+ remixStarted: "已開始重新混搭 {{name}}",
92
+ viewLiveApp: "查看線上應用程式",
93
+ alreadyInWorkspace: "已在工作區中",
94
+ remixAppIdDescription: "為新的工作區應用程式選擇 URL 安全的 ID。",
95
+ integrationSetup: "整合設定",
96
+ source: "來源",
97
+ remixing: "正在重新混搭…",
98
+ remixSuccess: "已開始重新混搭範本。",
99
+ remixError: "無法重新混搭此範本",
100
+ appIdRequired: "應用程式 ID 為必填項目。",
82
101
  hide: "隱藏",
83
102
  show: "Show",
84
103
  hiddenApps: "隱藏的應用程式",
@@ -117,6 +117,54 @@ const answer = await callAgent(
117
117
  // answer is a plain string
118
118
  ```
119
119
 
120
+ ### Fast bounded read: `invokeAgentAction()`
121
+
122
+ When the caller knows the exact receiver-owned read action and arguments, skip
123
+ the receiver's model loop:
124
+
125
+ ```ts
126
+ import { invokeAgentAction } from "@agent-native/core/a2a";
127
+
128
+ const { result } = await invokeAgentAction({
129
+ target: "analytics",
130
+ action: "gong-calls",
131
+ input: { company: "Acme", days: 90, includeTranscripts: true },
132
+ userEmail,
133
+ orgDomain,
134
+ orgSecret,
135
+ });
136
+ ```
137
+
138
+ The receiver still owns schema validation, credentials, access scoping, audit
139
+ attribution, and exposure policy. Direct invocation is available only for
140
+ cataloged, authenticated, explicitly exposed read-only actions that do not
141
+ require approval. Its JWT is audience-bound to the receiving app. Use normal
142
+ message delegation for planning, synthesis, multi-step work, or mutations.
143
+
144
+ Inside an agent loop, `call-agent` exposes the same path with `action` + `input`;
145
+ omit `message` and `taskId` in that mode.
146
+
147
+ ### Retry safety and trace linkage
148
+
149
+ `call-agent` automatically derives an owner-scoped idempotency key from the
150
+ originating turn, target, and exact message. If a retry reaches the receiver
151
+ after the caller timed out, asynchronous `message/send` returns the existing
152
+ active or completed task instead of starting a duplicate agent run. Failed and
153
+ canceled tasks release the key for an intentional retry; synchronous calls are
154
+ never deduplicated. Lower-level clients may pass an
155
+ `idempotencyKey` explicitly; keep it stable for the same logical submission and
156
+ change it when the work changes. Dedupe is scoped to the JWT-authenticated
157
+ owner and verified org, and keys are limited to 128 characters.
158
+
159
+ The caller also forwards bounded correlation metadata (`callerApp`,
160
+ `callerThreadId`, `parentRunId`, `parentTurnId`, and direct-read
161
+ `invocationId`). These fields
162
+ are telemetry hints only. Receivers must continue to derive identity,
163
+ ownership, org scope, access, and approval from the verified request context.
164
+ Delegated model loops emit `$ai_generation` with A2A/MCP lineage, while direct
165
+ reads emit the content-free `$a2a_read_invoke` event; neither event includes
166
+ action arguments or results.
167
+
120
168
  ### Advanced: `A2AClient` (full control)
121
169
 
122
170
  ```ts
@@ -178,6 +226,7 @@ cannot carry these grants.
178
226
  | ---------------- | -------------------------------- | ------------- |
179
227
  | `message/send` | Send a message, get a task back | Yes |
180
228
  | `message/stream` | Send a message, stream responses | Yes |
229
+ | `actions/invoke` | Invoke one exposed read action | Yes, JWT |
181
230
  | `tasks/get` | Get task status by ID | Yes |
182
231
  | `tasks/cancel` | Cancel a running task | Yes |
183
232
 
@@ -42,6 +42,11 @@ The main agent should discover available siblings before assuming capability:
42
42
  - In the agent loop, use `call-agent` with the sibling app id when another app
43
43
  owns the work or data. Never call the current app through `call-agent`; use
44
44
  local actions instead.
45
+ - When the exact sibling-owned read action and input are already known, use
46
+ `invokeAgentAction()` or `call-agent` with `action` + `input`. This preserves
47
+ the receiver's credentials and access checks while skipping its second model
48
+ loop. Use prompt-based `invokeAgent()` only when the sibling must reason,
49
+ synthesize, mutate, or perform a multi-step workflow.
45
50
 
46
51
  Send narrow prompts to siblings: name the exact question, relevant ids, date
47
52
  ranges, and expected output shape. Preserve returned ids and URLs verbatim.
@@ -285,7 +285,13 @@ LLM generation:
285
285
  - Agent Native Analytics shape: the same event lands in `analytics_events` with
286
286
  mirrored query-friendly properties such as `run_id`, `thread_id`,
287
287
  `cost_cents_x100`, `duration_ms`, `tool_calls`, `successful_tools`,
288
- `failed_tools`, and `status`.
288
+ `failed_tools`, and `status`. A content-free `tools` array includes at most
289
+ 50 tool names, start offsets, durations, statuses, and coarse error classes;
290
+ interrupted calls are finalized as errors, and failed runs still emit with
291
+ zero or known usage. `tools_truncated` marks longer runs while the rollup counts remain complete.
292
+ Delegated runs add `delegation_protocol`, `caller_app`, `a2a_task_id`, and
293
+ `parent_run_id` when available. `parent_turn_id` is separate because one
294
+ logical turn may span multiple concrete runs.
289
295
 
290
296
  Do not build a separate LLM-observability ingestion API unless there is a clear
291
297
  reason the tracking provider registry cannot express the use case. Keep prompt,
@@ -99,6 +99,19 @@ index the growing tables first.
99
99
  `await`s — each `await` is another round-trip.
100
100
  - Prefer **one composed endpoint** over several dependent calls.
101
101
 
102
+ For provider wrappers, inspect the upstream API before building a list-then-
103
+ enrich flow. Prefer the richest endpoint that can apply the real filters and
104
+ return the needed associations or participants in one paginated operation.
105
+ Cursor pagination is already serial; adding a serial detail/enrichment request
106
+ to every page doubles its critical path. Exhaustive records belong in corpus
107
+ recipes or data programs with explicit coverage, not one agent tool call per
108
+ page or item.
109
+
110
+ First-class provider actions should represent one stable conceptual operation.
111
+ Keep arbitrary endpoint, filter, and pagination access in the provider API
112
+ substrate; do not turn a convenience action into a capability ceiling or
113
+ duplicate the provider transport, auth, quota, and cache implementation.
114
+
102
115
  ## 4. Avoid client-side waterfalls
103
116
 
104
117
  - Don't gate query B on query A's result unless B truly needs it. Fire
@@ -141,7 +141,7 @@ Other framework-level baseline events:
141
141
  - `signup` from Better Auth user creation, with `auth_provider`, `auth_user_id`, and first-touch referral attribution (`referral_source`, `referrer_user`, `referral_medium`, `referral_campaign`, `utm_*`, `first_touch_path`, `landing_referrer` — see "Referral / viral attribution" above)
142
142
  - `builder connect clicked` and `builder connect popup blocked` from browser Connect Builder CTAs
143
143
  - `builder connect started`, `builder connect succeeded`, `builder connect failed`, `builder disconnect succeeded`, and `builder disconnect failed` from the Builder connection routes, with LLM connection context when resolvable
144
- - `$ai_generation` from instrumented agent loops, with PostHog AI Observability fields such as `$ai_trace_id`, `$ai_session_id`, `$ai_model`, `$ai_provider`, `$ai_input_tokens`, `$ai_output_tokens`, `$ai_latency`, `$ai_total_cost_usd`, and mirrored Agent Native query fields such as `run_id`, `thread_id`, `cost_cents_x100`, `duration_ms`, `tool_calls`, and `status`. Prompt, tool argument, and output content is not included by default.
144
+ - `$ai_generation` from instrumented agent loops, with PostHog AI Observability fields such as `$ai_trace_id`, `$ai_session_id`, `$ai_model`, `$ai_provider`, `$ai_input_tokens`, `$ai_output_tokens`, `$ai_latency`, `$ai_total_cost_usd`, and mirrored Agent Native query fields such as `run_id`, `thread_id`, `cost_cents_x100`, `duration_ms`, `tool_calls`, and `status`. A bounded `tools` array contains names, start offsets, durations, statuses, and coarse error classes only; interrupted tools and failed runs remain visible, and delegated runs include protocol/task/parent-run/parent-turn correlation. Prompt, tool argument, result, and output content is excluded.
145
145
 
146
146
  For new lifecycle events, call `track()` server-side when the server is the source of truth, and `trackEvent()` client-side only for browser interactions.
147
147
 
@@ -1,200 +0,0 @@
1
- import { readBody } from "@agent-native/core/server";
2
- import {
3
- defineEventHandler,
4
- getQuery,
5
- setResponseStatus,
6
- type H3Event,
7
- } from "h3";
8
-
9
- import {
10
- runApiHandlerWithContext,
11
- type CredentialContext,
12
- } from "../lib/credentials";
13
- import {
14
- searchPRs,
15
- searchIssues,
16
- getPR,
17
- getIssue,
18
- listPRs,
19
- searchOrgPRs,
20
- runGraphQL,
21
- } from "../lib/github";
22
- import { getGitHubAccessToken } from "../lib/github-oauth";
23
-
24
- async function requireGitHubAccess(event: H3Event, ctx: CredentialContext) {
25
- const { token } = await getGitHubAccessToken(ctx);
26
- if (token) return null;
27
- setResponseStatus(event, 200);
28
- return {
29
- error: "missing_api_key",
30
- key: "GITHUB_TOKEN",
31
- label: "GitHub",
32
- message: "Connect your GitHub account to query repositories.",
33
- settingsPath: "/data-sources",
34
- };
35
- }
36
-
37
- /** GET /api/github/search?q=...&type=pr|issue&limit=30 */
38
- export const handleGitHubSearch = defineEventHandler(async (event) => {
39
- return runApiHandlerWithContext(event, async (ctx) => {
40
- const missing = await requireGitHubAccess(event, ctx);
41
- if (missing) return missing;
42
- try {
43
- const { q, type: typeParam, limit: limitParam } = getQuery(event);
44
- if (!q) {
45
- setResponseStatus(event, 400);
46
- return { error: "q parameter is required" };
47
- }
48
-
49
- const type = (typeParam as string) === "issue" ? "issue" : "pr";
50
- const limit = limitParam ? parseInt(limitParam as string) : 30;
51
-
52
- if (type === "issue") {
53
- const issues = await searchIssues({ query: q as string, limit });
54
- return { issues, total: issues.length };
55
- } else {
56
- const prs = await searchPRs({ query: q as string, limit });
57
- return { prs, total: prs.length };
58
- }
59
- } catch (err: any) {
60
- console.error("GitHub search error:", err.message);
61
- setResponseStatus(event, 500);
62
- return { error: err.message };
63
- }
64
- });
65
- });
66
-
67
- /** GET /api/github/pr?owner=...&repo=...&number=... */
68
- export const handleGitHubPR = defineEventHandler(async (event) => {
69
- return runApiHandlerWithContext(event, async (ctx) => {
70
- const missing = await requireGitHubAccess(event, ctx);
71
- if (missing) return missing;
72
- try {
73
- const { owner, repo, number: numberParam } = getQuery(event);
74
- const number = parseInt(numberParam as string);
75
-
76
- if (!owner || !repo || isNaN(number)) {
77
- setResponseStatus(event, 400);
78
- return { error: "owner, repo, and number are required" };
79
- }
80
-
81
- const pr = await getPR(owner as string, repo as string, number);
82
- return pr;
83
- } catch (err: any) {
84
- console.error("GitHub PR error:", err.message);
85
- setResponseStatus(event, 500);
86
- return { error: err.message };
87
- }
88
- });
89
- });
90
-
91
- /** GET /api/github/issue?owner=...&repo=...&number=... */
92
- export const handleGitHubIssue = defineEventHandler(async (event) => {
93
- return runApiHandlerWithContext(event, async (ctx) => {
94
- const missing = await requireGitHubAccess(event, ctx);
95
- if (missing) return missing;
96
- try {
97
- const { owner, repo, number: numberParam } = getQuery(event);
98
- const number = parseInt(numberParam as string);
99
-
100
- if (!owner || !repo || isNaN(number)) {
101
- setResponseStatus(event, 400);
102
- return { error: "owner, repo, and number are required" };
103
- }
104
-
105
- const issue = await getIssue(owner as string, repo as string, number);
106
- return issue;
107
- } catch (err: any) {
108
- console.error("GitHub issue error:", err.message);
109
- setResponseStatus(event, 500);
110
- return { error: err.message };
111
- }
112
- });
113
- });
114
-
115
- /** GET /api/github/prs?owner=...&repo=...&state=open|closed|all&limit=30 */
116
- export const handleGitHubPRList = defineEventHandler(async (event) => {
117
- return runApiHandlerWithContext(event, async (ctx) => {
118
- const missing = await requireGitHubAccess(event, ctx);
119
- if (missing) return missing;
120
- try {
121
- const {
122
- owner,
123
- repo,
124
- state: stateParam,
125
- limit: limitParam,
126
- } = getQuery(event);
127
-
128
- if (!owner || !repo) {
129
- setResponseStatus(event, 400);
130
- return { error: "owner and repo are required" };
131
- }
132
-
133
- const state = (stateParam as "open" | "closed" | "all") ?? "open";
134
- const limit = limitParam ? parseInt(limitParam as string) : 30;
135
-
136
- const prs = await listPRs(owner as string, repo as string, {
137
- state,
138
- limit,
139
- });
140
- return { prs, total: prs.length };
141
- } catch (err: any) {
142
- console.error("GitHub PR list error:", err.message);
143
- setResponseStatus(event, 500);
144
- return { error: err.message };
145
- }
146
- });
147
- });
148
-
149
- /** GET /api/github/org-prs?org=...&q=...&state=OPEN|CLOSED|MERGED&limit=30 */
150
- export const handleGitHubOrgPRs = defineEventHandler(async (event) => {
151
- return runApiHandlerWithContext(event, async (ctx) => {
152
- const missing = await requireGitHubAccess(event, ctx);
153
- if (missing) return missing;
154
- try {
155
- const {
156
- org: orgParam,
157
- q: queryParam,
158
- state: stateParam,
159
- limit: limitParam,
160
- } = getQuery(event);
161
- const org = orgParam as string | undefined;
162
- if (!org) {
163
- setResponseStatus(event, 400);
164
- return { error: "org query parameter is required" };
165
- }
166
- const query = queryParam as string | undefined;
167
- const state = stateParam as "OPEN" | "CLOSED" | "MERGED" | undefined;
168
- const limit = limitParam ? parseInt(limitParam as string) : 30;
169
-
170
- const prs = await searchOrgPRs({ org, query, state, limit });
171
- return { prs, total: prs.length };
172
- } catch (err: any) {
173
- console.error("GitHub org PRs error:", err.message);
174
- setResponseStatus(event, 500);
175
- return { error: err.message };
176
- }
177
- });
178
- });
179
-
180
- /** POST /api/github/graphql body: { query, variables? } */
181
- export const handleGitHubGraphQL = defineEventHandler(async (event) => {
182
- return runApiHandlerWithContext(event, async (ctx) => {
183
- const missing = await requireGitHubAccess(event, ctx);
184
- if (missing) return missing;
185
- try {
186
- const { query, variables } = await readBody(event);
187
- if (!query) {
188
- setResponseStatus(event, 400);
189
- return { error: "query is required" };
190
- }
191
-
192
- const data = await runGraphQL(query, variables);
193
- return { data };
194
- } catch (err: any) {
195
- console.error("GitHub GraphQL error:", err.message);
196
- setResponseStatus(event, 500);
197
- return { error: err.message };
198
- }
199
- });
200
- });
@@ -1,43 +0,0 @@
1
- import { defineEventHandler, getQuery, setResponseStatus } from "h3";
2
-
3
- import {
4
- requireCredential,
5
- runApiHandlerWithContext,
6
- } from "../lib/credentials";
7
- import { getAccounts, getIssues } from "../lib/pylon";
8
-
9
- export const handlePylonIssues = defineEventHandler(async (event) => {
10
- return runApiHandlerWithContext(event, async () => {
11
- const missing = await requireCredential(event, "PYLON_API_KEY", "Pylon");
12
- if (missing) return missing;
13
- try {
14
- const { account_id, state, query } = getQuery(event);
15
- const issues = await getIssues({
16
- account_id: account_id as string | undefined,
17
- state: state as string | undefined,
18
- query: query as string | undefined,
19
- });
20
- return { issues, total: issues.length };
21
- } catch (err: any) {
22
- console.error("Pylon issues error:", err.message);
23
- setResponseStatus(event, 500);
24
- return { error: err.message };
25
- }
26
- });
27
- });
28
-
29
- export const handlePylonAccounts = defineEventHandler(async (event) => {
30
- return runApiHandlerWithContext(event, async () => {
31
- const missing = await requireCredential(event, "PYLON_API_KEY", "Pylon");
32
- if (missing) return missing;
33
- try {
34
- const { query } = getQuery(event);
35
- const accounts = await getAccounts(query as string | undefined);
36
- return { accounts, total: accounts.length };
37
- } catch (err: any) {
38
- console.error("Pylon accounts error:", err.message);
39
- setResponseStatus(event, 500);
40
- return { error: err.message };
41
- }
42
- });
43
- });