@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
@@ -1,660 +0,0 @@
1
- // GitHub API client — REST v3 + GraphQL v4
2
- // Auth: GITHUB_TOKEN (personal access token or GitHub App token)
3
- // Mirrors patterns from server/lib/gong.ts
4
-
5
- import {
6
- requireRequestCredentialContext,
7
- scopedCredentialCacheKey,
8
- } from "./credentials-context";
9
- import { getGitHubAccessToken } from "./github-oauth";
10
-
11
- const REST_BASE = "https://api.github.com";
12
- const GRAPHQL_URL = "https://api.github.com/graphql";
13
-
14
- const cache = new Map<string, { data: unknown; ts: number }>();
15
- const CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes
16
- const MAX_CACHE = 200;
17
-
18
- async function getToken(): Promise<string> {
19
- const ctx = requireRequestCredentialContext("GITHUB_TOKEN");
20
- const { token } = await getGitHubAccessToken(ctx);
21
- if (!token) throw new Error("GitHub is not connected");
22
- return token;
23
- }
24
-
25
- async function getHeaders(accept?: string): Promise<Record<string, string>> {
26
- return {
27
- Authorization: `Bearer ${await getToken()}`,
28
- Accept: accept ?? "application/vnd.github+json",
29
- "X-GitHub-Api-Version": "2022-11-28",
30
- "Content-Type": "application/json",
31
- };
32
- }
33
-
34
- function cacheSet(key: string, data: unknown) {
35
- if (cache.size >= MAX_CACHE) {
36
- const oldest = cache.keys().next().value;
37
- if (oldest) cache.delete(oldest);
38
- }
39
- cache.set(key, { data, ts: Date.now() });
40
- }
41
-
42
- async function restGet<T>(
43
- path: string,
44
- cacheKey?: string,
45
- accept?: string,
46
- ): Promise<T> {
47
- const key = scopedCredentialCacheKey(cacheKey ?? path, "GITHUB_TOKEN");
48
- const cached = cache.get(key);
49
- if (cached && Date.now() - cached.ts < CACHE_TTL_MS) return cached.data as T;
50
-
51
- const res = await fetch(`${REST_BASE}${path}`, {
52
- headers: await getHeaders(accept),
53
- });
54
- if (!res.ok) {
55
- const text = await res.text();
56
- throw new Error(`GitHub REST error ${res.status}: ${text}`);
57
- }
58
- const data = await res.json();
59
- cacheSet(key, data);
60
- return data as T;
61
- }
62
-
63
- async function graphql<T>(
64
- query: string,
65
- variables?: Record<string, unknown>,
66
- ): Promise<T> {
67
- const body = JSON.stringify({ query, variables });
68
- const key = scopedCredentialCacheKey(
69
- `gql:${query}:${JSON.stringify(variables)}`,
70
- "GITHUB_TOKEN",
71
- );
72
- const cached = cache.get(key);
73
- if (cached && Date.now() - cached.ts < CACHE_TTL_MS) return cached.data as T;
74
-
75
- const res = await fetch(GRAPHQL_URL, {
76
- method: "POST",
77
- headers: await getHeaders(),
78
- body,
79
- });
80
- if (!res.ok) {
81
- const text = await res.text();
82
- throw new Error(`GitHub GraphQL error ${res.status}: ${text}`);
83
- }
84
- const json = await res.json();
85
- if (json.errors?.length) {
86
- throw new Error(`GitHub GraphQL errors: ${JSON.stringify(json.errors)}`);
87
- }
88
- cacheSet(key, json.data);
89
- return json.data as T;
90
- }
91
-
92
- // ─── Types ────────────────────────────────────────────────────────────────────
93
-
94
- export interface GitHubPR {
95
- number: number;
96
- title: string;
97
- state: "open" | "closed" | "merged";
98
- url: string;
99
- author: string;
100
- createdAt: string;
101
- updatedAt: string;
102
- mergedAt?: string;
103
- closedAt?: string;
104
- body?: string;
105
- labels: string[];
106
- reviewState?: string; // APPROVED | CHANGES_REQUESTED | REVIEW_REQUIRED | etc.
107
- draft: boolean;
108
- baseRef: string;
109
- headRef: string;
110
- repo: string;
111
- }
112
-
113
- export interface GitHubIssue {
114
- number: number;
115
- title: string;
116
- state: "open" | "closed";
117
- url: string;
118
- author: string;
119
- createdAt: string;
120
- updatedAt: string;
121
- closedAt?: string;
122
- body?: string;
123
- labels: string[];
124
- assignees: string[];
125
- repo: string;
126
- comments: number;
127
- }
128
-
129
- export interface GitHubPRDetail extends GitHubPR {
130
- commits: { sha: string; message: string; author: string; date: string }[];
131
- reviews: {
132
- author: string;
133
- state: string;
134
- submittedAt: string;
135
- body?: string;
136
- }[];
137
- files: {
138
- filename: string;
139
- status: string;
140
- additions: number;
141
- deletions: number;
142
- }[];
143
- comments: number;
144
- additions: number;
145
- deletions: number;
146
- }
147
-
148
- // ─── Search ───────────────────────────────────────────────────────────────────
149
-
150
- export interface SearchOptions {
151
- /** GitHub search query — all qualifiers supported (org:, repo:, author:, etc.) */
152
- query: string;
153
- /** "pr" | "issue" (default: "pr") */
154
- type?: "pr" | "issue";
155
- /** max results to return (default: 30, max: 100) */
156
- limit?: number;
157
- }
158
-
159
- interface RawSearchItem {
160
- number: number;
161
- title: string;
162
- state: string;
163
- html_url: string;
164
- user: { login: string };
165
- created_at: string;
166
- updated_at: string;
167
- merged_at?: string;
168
- closed_at?: string;
169
- body?: string;
170
- labels: { name: string }[];
171
- draft?: boolean;
172
- pull_request?: { merged_at?: string | null };
173
- assignees?: { login: string }[];
174
- comments?: number;
175
- repository_url?: string;
176
- }
177
-
178
- function repoNameFromUrl(url?: string): string {
179
- if (!url) return "";
180
- return url.replace("https://api.github.com/repos/", "");
181
- }
182
-
183
- export async function searchPRs(opts: SearchOptions): Promise<GitHubPR[]> {
184
- const limit = Math.min(opts.limit ?? 30, 100);
185
- const q =
186
- opts.type === "issue" ? `${opts.query} is:issue` : `${opts.query} is:pr`;
187
-
188
- const data = await restGet<{ items: RawSearchItem[] }>(
189
- `/search/issues?q=${encodeURIComponent(q)}&per_page=${limit}&sort=updated&order=desc`,
190
- `search:${q}:${limit}`,
191
- );
192
-
193
- return (data.items ?? []).map((item) => ({
194
- number: item.number,
195
- title: item.title,
196
- state: item.pull_request?.merged_at
197
- ? "merged"
198
- : (item.state as "open" | "closed"),
199
- url: item.html_url,
200
- author: item.user?.login ?? "",
201
- createdAt: item.created_at,
202
- updatedAt: item.updated_at,
203
- mergedAt: item.pull_request?.merged_at ?? item.merged_at,
204
- closedAt: item.closed_at ?? undefined,
205
- body: item.body ?? undefined,
206
- labels: item.labels.map((l) => l.name),
207
- draft: item.draft ?? false,
208
- baseRef: "",
209
- headRef: "",
210
- repo: repoNameFromUrl(item.repository_url),
211
- }));
212
- }
213
-
214
- export async function searchIssues(
215
- opts: SearchOptions,
216
- ): Promise<GitHubIssue[]> {
217
- const limit = Math.min(opts.limit ?? 30, 100);
218
- const q = `${opts.query} is:issue`;
219
-
220
- const data = await restGet<{ items: RawSearchItem[] }>(
221
- `/search/issues?q=${encodeURIComponent(q)}&per_page=${limit}&sort=updated&order=desc`,
222
- `search-issues:${q}:${limit}`,
223
- );
224
-
225
- return (data.items ?? []).map((item) => ({
226
- number: item.number,
227
- title: item.title,
228
- state: item.state as "open" | "closed",
229
- url: item.html_url,
230
- author: item.user?.login ?? "",
231
- createdAt: item.created_at,
232
- updatedAt: item.updated_at,
233
- closedAt: item.closed_at ?? undefined,
234
- body: item.body ?? undefined,
235
- labels: item.labels.map((l) => l.name),
236
- assignees: (item.assignees ?? []).map((a) => a.login),
237
- repo: repoNameFromUrl(item.repository_url),
238
- comments: item.comments ?? 0,
239
- }));
240
- }
241
-
242
- // ─── PR detail ────────────────────────────────────────────────────────────────
243
-
244
- export async function getPR(
245
- owner: string,
246
- repo: string,
247
- prNumber: number,
248
- ): Promise<GitHubPRDetail> {
249
- const [pr, commits, reviews, files] = await Promise.all([
250
- restGet<Record<string, unknown>>(
251
- `/repos/${owner}/${repo}/pulls/${prNumber}`,
252
- ),
253
- restGet<Record<string, unknown>[]>(
254
- `/repos/${owner}/${repo}/pulls/${prNumber}/commits`,
255
- ),
256
- restGet<Record<string, unknown>[]>(
257
- `/repos/${owner}/${repo}/pulls/${prNumber}/reviews`,
258
- ),
259
- restGet<Record<string, unknown>[]>(
260
- `/repos/${owner}/${repo}/pulls/${prNumber}/files`,
261
- ),
262
- ]);
263
-
264
- const state = pr.merged_at
265
- ? "merged"
266
- : pr.state === "closed"
267
- ? "closed"
268
- : "open";
269
-
270
- return {
271
- number: pr.number as number,
272
- title: pr.title as string,
273
- state,
274
- url: pr.html_url as string,
275
- author: (pr.user as { login: string })?.login ?? "",
276
- createdAt: pr.created_at as string,
277
- updatedAt: pr.updated_at as string,
278
- mergedAt: pr.merged_at as string | undefined,
279
- closedAt: pr.closed_at as string | undefined,
280
- body: pr.body as string | undefined,
281
- labels: ((pr.labels as { name: string }[]) ?? []).map((l) => l.name),
282
- draft: pr.draft as boolean,
283
- baseRef: (pr.base as { ref: string })?.ref ?? "",
284
- headRef: (pr.head as { ref: string })?.ref ?? "",
285
- repo: `${owner}/${repo}`,
286
- comments: (pr.comments as number) ?? 0,
287
- additions: (pr.additions as number) ?? 0,
288
- deletions: (pr.deletions as number) ?? 0,
289
- commits: commits.map((c: Record<string, unknown>) => ({
290
- sha: (c.sha as string).slice(0, 7),
291
- message: (
292
- ((c.commit as Record<string, unknown>)?.message as string) ?? ""
293
- ).split("\n")[0],
294
- author:
295
- ((c.commit as Record<string, unknown>)?.author as { name?: string })
296
- ?.name ??
297
- (c.author as { login?: string })?.login ??
298
- "",
299
- date:
300
- ((c.commit as Record<string, unknown>)?.author as { date?: string })
301
- ?.date ?? "",
302
- })),
303
- reviews: reviews.map((r: Record<string, unknown>) => ({
304
- author: (r.user as { login: string })?.login ?? "",
305
- state: r.state as string,
306
- submittedAt: r.submitted_at as string,
307
- body: r.body as string | undefined,
308
- })),
309
- files: files.map((f: Record<string, unknown>) => ({
310
- filename: f.filename as string,
311
- status: f.status as string,
312
- additions: f.additions as number,
313
- deletions: f.deletions as number,
314
- })),
315
- };
316
- }
317
-
318
- // ─── Issue detail ─────────────────────────────────────────────────────────────
319
-
320
- export async function getIssue(
321
- owner: string,
322
- repo: string,
323
- issueNumber: number,
324
- ): Promise<GitHubIssue> {
325
- const issue = await restGet<Record<string, unknown>>(
326
- `/repos/${owner}/${repo}/issues/${issueNumber}`,
327
- );
328
- return {
329
- number: issue.number as number,
330
- title: issue.title as string,
331
- state: issue.state as "open" | "closed",
332
- url: issue.html_url as string,
333
- author: (issue.user as { login: string })?.login ?? "",
334
- createdAt: issue.created_at as string,
335
- updatedAt: issue.updated_at as string,
336
- closedAt: issue.closed_at as string | undefined,
337
- body: issue.body as string | undefined,
338
- labels: ((issue.labels as { name: string }[]) ?? []).map((l) => l.name),
339
- assignees: ((issue.assignees as { login: string }[]) ?? []).map(
340
- (a) => a.login,
341
- ),
342
- repo: `${owner}/${repo}`,
343
- comments: (issue.comments as number) ?? 0,
344
- };
345
- }
346
-
347
- // ─── List repo PRs ────────────────────────────────────────────────────────────
348
-
349
- export async function listPRs(
350
- owner: string,
351
- repo: string,
352
- opts: { state?: "open" | "closed" | "all"; limit?: number } = {},
353
- ): Promise<GitHubPR[]> {
354
- const state = opts.state ?? "open";
355
- const limit = Math.min(opts.limit ?? 30, 100);
356
- const items = await restGet<Record<string, unknown>[]>(
357
- `/repos/${owner}/${repo}/pulls?state=${state}&per_page=${limit}&sort=updated&direction=desc`,
358
- `list-prs:${owner}/${repo}:${state}:${limit}`,
359
- );
360
-
361
- return items.map((pr) => ({
362
- number: pr.number as number,
363
- title: pr.title as string,
364
- state: pr.merged_at ? "merged" : (pr.state as "open" | "closed"),
365
- url: pr.html_url as string,
366
- author: (pr.user as { login: string })?.login ?? "",
367
- createdAt: pr.created_at as string,
368
- updatedAt: pr.updated_at as string,
369
- mergedAt: pr.merged_at as string | undefined,
370
- closedAt: pr.closed_at as string | undefined,
371
- body: pr.body as string | undefined,
372
- labels: ((pr.labels as { name: string }[]) ?? []).map((l) => l.name),
373
- draft: pr.draft as boolean,
374
- baseRef: (pr.base as { ref: string })?.ref ?? "",
375
- headRef: (pr.head as { ref: string })?.ref ?? "",
376
- repo: `${owner}/${repo}`,
377
- }));
378
- }
379
-
380
- // ─── GraphQL — arbitrary query ────────────────────────────────────────────────
381
-
382
- export async function runGraphQL<T = unknown>(
383
- query: string,
384
- variables?: Record<string, unknown>,
385
- ): Promise<T> {
386
- return graphql<T>(query, variables);
387
- }
388
-
389
- // ─── Org-wide PR search (via GraphQL) ────────────────────────────────────────
390
-
391
- export async function searchOrgPRs(opts: {
392
- org: string;
393
- query?: string;
394
- state?: "OPEN" | "CLOSED" | "MERGED";
395
- limit?: number;
396
- }): Promise<GitHubPR[]> {
397
- const { org, query = "", state, limit = 30 } = opts;
398
-
399
- // Build search string
400
- const stateQ = state ? ` is:${state.toLowerCase()}` : "";
401
- const q = `org:${org} is:pr ${query}${stateQ}`.trim();
402
-
403
- return searchPRs({ query: q, type: "pr", limit });
404
- }
405
-
406
- // ─── Repositories and code search ───────────────────────────────────────────
407
-
408
- export interface GitHubRepository {
409
- name: string;
410
- fullName: string;
411
- owner: string;
412
- private: boolean;
413
- fork: boolean;
414
- archived: boolean;
415
- defaultBranch: string;
416
- description?: string;
417
- language?: string;
418
- updatedAt: string;
419
- url: string;
420
- }
421
-
422
- export interface GitHubCodeSearchResult {
423
- repo: string;
424
- path: string;
425
- name: string;
426
- sha: string;
427
- url: string;
428
- score: number;
429
- textMatches: Array<{
430
- fragment: string;
431
- matches: Array<{ text: string; indices: [number, number] }>;
432
- }>;
433
- }
434
-
435
- export interface GitHubFileContent {
436
- repo: string;
437
- path: string;
438
- ref?: string;
439
- sha?: string;
440
- size?: number;
441
- encoding?: string;
442
- content?: string;
443
- truncated?: boolean;
444
- entries?: Array<{
445
- name: string;
446
- path: string;
447
- type: string;
448
- size?: number;
449
- sha?: string;
450
- url?: string;
451
- }>;
452
- }
453
-
454
- interface RawRepo {
455
- name: string;
456
- full_name: string;
457
- owner: { login: string };
458
- private: boolean;
459
- fork: boolean;
460
- archived: boolean;
461
- default_branch: string;
462
- description?: string | null;
463
- language?: string | null;
464
- updated_at: string;
465
- html_url: string;
466
- }
467
-
468
- interface RawCodeSearchItem {
469
- name: string;
470
- path: string;
471
- sha: string;
472
- html_url: string;
473
- score: number;
474
- repository: { full_name: string };
475
- text_matches?: Array<{
476
- fragment?: string;
477
- matches?: Array<{ text?: string; indices?: [number, number] }>;
478
- }>;
479
- }
480
-
481
- interface RawContentItem {
482
- type?: string;
483
- name?: string;
484
- path?: string;
485
- sha?: string;
486
- size?: number;
487
- html_url?: string;
488
- encoding?: string;
489
- content?: string;
490
- }
491
-
492
- function mapRepository(repo: RawRepo): GitHubRepository {
493
- return {
494
- name: repo.name,
495
- fullName: repo.full_name,
496
- owner: repo.owner?.login ?? repo.full_name.split("/")[0] ?? "",
497
- private: repo.private,
498
- fork: repo.fork,
499
- archived: repo.archived,
500
- defaultBranch: repo.default_branch,
501
- description: repo.description ?? undefined,
502
- language: repo.language ?? undefined,
503
- updatedAt: repo.updated_at,
504
- url: repo.html_url,
505
- };
506
- }
507
-
508
- function parseRepo(repo: string): { owner: string; name: string } {
509
- const [owner, name] = repo.split("/");
510
- if (!owner || !name || repo.split("/").length !== 2) {
511
- throw new Error("repo must be in owner/repo format");
512
- }
513
- return { owner, name };
514
- }
515
-
516
- function encodeRepoPath(path: string): string {
517
- return path
518
- .split("/")
519
- .filter(Boolean)
520
- .map((part) => encodeURIComponent(part))
521
- .join("/");
522
- }
523
-
524
- export async function listRepos(
525
- opts: {
526
- query?: string;
527
- visibility?: "all" | "public" | "private";
528
- limit?: number;
529
- } = {},
530
- ): Promise<GitHubRepository[]> {
531
- const limit = Math.min(opts.limit ?? 50, 100);
532
- const visibility = opts.visibility ?? "all";
533
- const data = await restGet<RawRepo[]>(
534
- `/user/repos?per_page=${limit}&sort=updated&direction=desc&visibility=${visibility}&affiliation=owner,collaborator,organization_member`,
535
- `repos:${visibility}:${limit}`,
536
- );
537
- const repos = data.map(mapRepository);
538
- const query = opts.query?.trim().toLowerCase();
539
- if (!query) return repos;
540
- return repos.filter((repo) => {
541
- return (
542
- repo.fullName.toLowerCase().includes(query) ||
543
- repo.name.toLowerCase().includes(query) ||
544
- (repo.description ?? "").toLowerCase().includes(query)
545
- );
546
- });
547
- }
548
-
549
- export async function getRepo(
550
- owner: string,
551
- repo: string,
552
- ): Promise<GitHubRepository> {
553
- return mapRepository(
554
- await restGet<RawRepo>(`/repos/${owner}/${repo}`, `repo:${owner}/${repo}`),
555
- );
556
- }
557
-
558
- export async function searchCode(opts: {
559
- query: string;
560
- repo?: string;
561
- org?: string;
562
- user?: string;
563
- path?: string;
564
- extension?: string;
565
- filename?: string;
566
- limit?: number;
567
- }): Promise<GitHubCodeSearchResult[]> {
568
- const limit = Math.min(opts.limit ?? 30, 100);
569
- const parts = [opts.query.trim()];
570
- if (!parts[0]) throw new Error("query is required");
571
- if (opts.repo) parts.push(`repo:${opts.repo}`);
572
- if (opts.org) parts.push(`org:${opts.org}`);
573
- if (opts.user) parts.push(`user:${opts.user}`);
574
- if (opts.path) parts.push(`path:${opts.path}`);
575
- if (opts.extension) parts.push(`extension:${opts.extension}`);
576
- if (opts.filename) parts.push(`filename:${opts.filename}`);
577
- const q = parts.join(" ");
578
- const data = await restGet<{ items: RawCodeSearchItem[] }>(
579
- `/search/code?q=${encodeURIComponent(q)}&per_page=${limit}`,
580
- `code:${q}:${limit}`,
581
- "application/vnd.github.text-match+json",
582
- );
583
-
584
- return (data.items ?? []).map((item) => ({
585
- repo: item.repository?.full_name ?? "",
586
- path: item.path,
587
- name: item.name,
588
- sha: item.sha,
589
- url: item.html_url,
590
- score: item.score,
591
- textMatches: (item.text_matches ?? []).map((match) => ({
592
- fragment: match.fragment ?? "",
593
- matches: (match.matches ?? []).map((m) => ({
594
- text: m.text ?? "",
595
- indices: m.indices ?? [0, 0],
596
- })),
597
- })),
598
- }));
599
- }
600
-
601
- export async function getFileContent(opts: {
602
- repo: string;
603
- path: string;
604
- ref?: string;
605
- maxBytes?: number;
606
- }): Promise<GitHubFileContent> {
607
- const { owner, name } = parseRepo(opts.repo);
608
- const encodedPath = encodeRepoPath(opts.path);
609
- const refQuery = opts.ref ? `?ref=${encodeURIComponent(opts.ref)}` : "";
610
- const data = await restGet<RawContentItem | RawContentItem[]>(
611
- `/repos/${owner}/${name}/contents/${encodedPath}${refQuery}`,
612
- `content:${opts.repo}:${opts.path}:${opts.ref ?? ""}`,
613
- );
614
-
615
- if (Array.isArray(data)) {
616
- return {
617
- repo: opts.repo,
618
- path: opts.path,
619
- ref: opts.ref,
620
- entries: data.map((entry) => ({
621
- name: entry.name ?? "",
622
- path: entry.path ?? "",
623
- type: entry.type ?? "",
624
- size: entry.size,
625
- sha: entry.sha,
626
- url: entry.html_url,
627
- })),
628
- };
629
- }
630
-
631
- if (data.type !== "file") {
632
- return {
633
- repo: opts.repo,
634
- path: opts.path,
635
- ref: opts.ref,
636
- sha: data.sha,
637
- size: data.size,
638
- encoding: data.encoding,
639
- };
640
- }
641
-
642
- const rawContent =
643
- data.encoding === "base64" && data.content
644
- ? Buffer.from(data.content.replace(/\s/g, ""), "base64").toString("utf8")
645
- : (data.content ?? "");
646
- const maxBytes = Math.min(opts.maxBytes ?? 80_000, 200_000);
647
- const truncated = Buffer.byteLength(rawContent, "utf8") > maxBytes;
648
- const content = truncated ? rawContent.slice(0, maxBytes) : rawContent;
649
-
650
- return {
651
- repo: opts.repo,
652
- path: opts.path,
653
- ref: opts.ref,
654
- sha: data.sha,
655
- size: data.size,
656
- encoding: data.encoding,
657
- content,
658
- truncated,
659
- };
660
- }