@agent-native/core 0.90.2 → 0.90.3

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 (429) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +12 -0
  3. package/corpus/core/docs/content/agent-native-toolkit.mdx +87 -80
  4. package/corpus/core/docs/content/locales/ar-SA/agent-native-toolkit.mdx +89 -80
  5. package/corpus/core/docs/content/locales/de-DE/agent-native-toolkit.mdx +89 -80
  6. package/corpus/core/docs/content/locales/es-ES/agent-native-toolkit.mdx +89 -80
  7. package/corpus/core/docs/content/locales/fr-FR/agent-native-toolkit.mdx +89 -80
  8. package/corpus/core/docs/content/locales/hi-IN/agent-native-toolkit.mdx +89 -80
  9. package/corpus/core/docs/content/locales/ja-JP/agent-native-toolkit.mdx +89 -80
  10. package/corpus/core/docs/content/locales/ko-KR/agent-native-toolkit.mdx +89 -80
  11. package/corpus/core/docs/content/locales/pt-BR/agent-native-toolkit.mdx +89 -80
  12. package/corpus/core/docs/content/locales/zh-CN/agent-native-toolkit.mdx +89 -80
  13. package/corpus/core/docs/content/locales/zh-TW/agent-native-toolkit.mdx +89 -80
  14. package/corpus/core/docs/content/toolkit-agent-ux.mdx +43 -0
  15. package/corpus/core/docs/content/toolkit-app-adapters.mdx +9 -0
  16. package/corpus/core/docs/content/toolkit-collaboration-ui.mdx +12 -0
  17. package/corpus/core/docs/content/toolkit-collaboration.mdx +74 -0
  18. package/corpus/core/docs/content/toolkit-command-navigation.mdx +106 -0
  19. package/corpus/core/docs/content/toolkit-comments-review.mdx +98 -0
  20. package/corpus/core/docs/content/toolkit-history.mdx +95 -0
  21. package/corpus/core/docs/content/toolkit-observability.mdx +41 -0
  22. package/corpus/core/docs/content/toolkit-org-team.mdx +80 -0
  23. package/corpus/core/docs/content/toolkit-resources.mdx +57 -0
  24. package/corpus/core/docs/content/toolkit-settings.mdx +65 -0
  25. package/corpus/core/docs/content/toolkit-setup-connections.mdx +109 -0
  26. package/corpus/core/docs/content/toolkit-sharing-ui.mdx +18 -6
  27. package/corpus/core/docs/content/toolkit-sharing.mdx +81 -0
  28. package/corpus/core/docs/content/toolkit-shell-hooks.mdx +9 -0
  29. package/corpus/core/docs/content/toolkit-ui.mdx +9 -0
  30. package/corpus/core/package.json +35 -1
  31. package/corpus/core/src/agent/engine/ai-sdk-engine.ts +19 -1
  32. package/corpus/core/src/agent/engine/anthropic-engine.ts +25 -1
  33. package/corpus/core/src/agent/engine/registry.ts +23 -16
  34. package/corpus/core/src/agent/production-agent.ts +37 -6
  35. package/corpus/core/src/client/command-navigation/index.ts +15 -0
  36. package/corpus/core/src/client/comments-review/index.ts +1 -0
  37. package/corpus/core/src/client/history/VersionHistoryPanel.tsx +145 -0
  38. package/corpus/core/src/client/history/index.ts +18 -0
  39. package/corpus/core/src/client/history/use-history.ts +86 -0
  40. package/corpus/core/src/client/index.ts +76 -9
  41. package/corpus/core/src/client/org/OrgSwitcher.tsx +6 -6
  42. package/corpus/core/src/client/org/RequireActiveOrg.tsx +2 -2
  43. package/corpus/core/src/client/org/TeamPage.tsx +3 -3
  44. package/corpus/core/src/client/org/hooks.ts +32 -0
  45. package/corpus/core/src/client/org/index.ts +30 -1
  46. package/corpus/core/src/client/org-team/index.ts +1 -0
  47. package/corpus/core/src/client/review/ReviewStatusBadge.tsx +39 -0
  48. package/corpus/core/src/client/review/ReviewThreadPanel.tsx +278 -0
  49. package/corpus/core/src/client/review/index.ts +25 -0
  50. package/corpus/core/src/client/review/use-review.ts +114 -0
  51. package/corpus/core/src/client/settings/index.ts +11 -1
  52. package/corpus/core/src/client/setup-connections/BuilderConnectCard.tsx +94 -0
  53. package/corpus/core/src/client/setup-connections/ProviderReadinessBadge.tsx +73 -0
  54. package/corpus/core/src/client/setup-connections/SetupConnectionsPage.tsx +94 -0
  55. package/corpus/core/src/client/setup-connections/index.ts +46 -0
  56. package/corpus/core/src/client/sharing/ShareButton.tsx +20 -14
  57. package/corpus/core/src/client/sharing/ShareDialog.tsx +3 -3
  58. package/corpus/core/src/command-navigation/actions.ts +100 -0
  59. package/corpus/core/src/command-navigation/index.ts +12 -0
  60. package/corpus/core/src/comments-review/index.ts +1 -0
  61. package/corpus/core/src/file-upload/builder.ts +24 -3
  62. package/corpus/core/src/file-upload/types.ts +3 -1
  63. package/corpus/core/src/history/actions/create-resource-version.ts +89 -0
  64. package/corpus/core/src/history/actions/get-resource-version.ts +60 -0
  65. package/corpus/core/src/history/actions/list-resource-history.ts +53 -0
  66. package/corpus/core/src/history/actions/list-resource-versions.ts +43 -0
  67. package/corpus/core/src/history/actions/restore-resource-version.ts +96 -0
  68. package/corpus/core/src/history/index.ts +27 -0
  69. package/corpus/core/src/history/registry.ts +99 -0
  70. package/corpus/core/src/history/store.ts +348 -0
  71. package/corpus/core/src/history/types.ts +69 -0
  72. package/corpus/core/src/index.ts +10 -0
  73. package/corpus/core/src/navigation/index.ts +170 -0
  74. package/corpus/core/src/org/index.ts +8 -0
  75. package/corpus/core/src/org/permissions.ts +30 -0
  76. package/corpus/core/src/org-team/index.ts +1 -0
  77. package/corpus/core/src/private-blob/registry.ts +1 -0
  78. package/corpus/core/src/review/actions/consume-review-feedback.ts +38 -0
  79. package/corpus/core/src/review/actions/create-review-comment.ts +107 -0
  80. package/corpus/core/src/review/actions/delete-review-comment.ts +55 -0
  81. package/corpus/core/src/review/actions/get-review-feedback.ts +54 -0
  82. package/corpus/core/src/review/actions/list-review-comments.ts +53 -0
  83. package/corpus/core/src/review/actions/reply-review-comment.ts +107 -0
  84. package/corpus/core/src/review/actions/resolve-review-thread.ts +60 -0
  85. package/corpus/core/src/review/actions/set-review-status.ts +58 -0
  86. package/corpus/core/src/review/index.ts +36 -0
  87. package/corpus/core/src/review/mentions.ts +44 -0
  88. package/corpus/core/src/review/registry.ts +99 -0
  89. package/corpus/core/src/review/store.ts +687 -0
  90. package/corpus/core/src/review/types.ts +97 -0
  91. package/corpus/core/src/server/action-discovery.ts +54 -0
  92. package/corpus/core/src/server/agent-engine-api-key-route.ts +5 -0
  93. package/corpus/core/src/server/credential-provider.ts +108 -0
  94. package/corpus/core/src/setup-connections/index.ts +89 -0
  95. package/corpus/core/src/setup-connections/onboarding.ts +47 -0
  96. package/corpus/core/src/transcription/builder-transcription.ts +9 -2
  97. package/corpus/core/src/vite/action-types-plugin.ts +52 -0
  98. package/corpus/templates/analytics/app/components/layout/Layout.tsx +2 -1
  99. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +2 -2
  100. package/corpus/templates/analytics/app/global.css +22 -10
  101. package/corpus/templates/analytics/app/i18n/zh-TW.ts +6 -1
  102. package/corpus/templates/analytics/app/i18n-data.ts +81 -13
  103. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +2 -2
  104. package/corpus/templates/analytics/app/pages/analyses/AnalysisDetail.tsx +2 -2
  105. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +528 -108
  106. package/corpus/templates/analytics/app/pages/sessions/SessionDevToolsPanel.tsx +466 -183
  107. package/corpus/templates/analytics/changelog/2026-07-07-session-replays-load-sooner-show-clearer-activity-timelines-.md +6 -0
  108. package/corpus/templates/brain/app/routes/settings.tsx +2 -2
  109. package/corpus/templates/calendar/app/components/calendar/AttendeeAutocomplete.tsx +32 -6
  110. package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +120 -40
  111. package/corpus/templates/calendar/app/hooks/use-people.ts +55 -0
  112. package/corpus/templates/calendar/changelog/2026-07-07-guest-suggestions-now-find-coworkers-from-your-google-worksp.md +6 -0
  113. package/corpus/templates/calendar/changelog/2026-07-07-zoom-stays-selected-after-connecting-it-from-a-draft-event.md +6 -0
  114. package/corpus/templates/clips/actions/create-recording.ts +5 -1
  115. package/corpus/templates/clips/actions/finalize-recording.ts +140 -1
  116. package/corpus/templates/clips/actions/import-loom-recording.ts +1 -0
  117. package/corpus/templates/clips/actions/lib/ensure-seekable-video.ts +1 -0
  118. package/corpus/templates/clips/actions/request-transcript.ts +31 -0
  119. package/corpus/templates/clips/actions/set-thumbnail.ts +2 -0
  120. package/corpus/templates/clips/app/components/library/organization-switcher.tsx +2 -2
  121. package/corpus/templates/clips/app/components/player/scrubber-position.ts +9 -0
  122. package/corpus/templates/clips/app/components/player/scrubber.tsx +5 -2
  123. package/corpus/templates/clips/app/components/player/share-dialog.tsx +69 -41
  124. package/corpus/templates/clips/app/components/player/video-player.tsx +38 -1
  125. package/corpus/templates/clips/app/components/sharing/share-ui.tsx +3 -3
  126. package/corpus/templates/clips/app/components/sharing/slack-share-hint.tsx +9 -19
  127. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +9 -3
  128. package/corpus/templates/clips/app/routes/record.tsx +21 -12
  129. package/corpus/templates/clips/changelog/2026-07-02-recordings-now-wait-for-storage-media-to-serve-before-finishing.md +6 -0
  130. package/corpus/templates/clips/changelog/2026-07-07-a-pending-app-update-no-longer-blocks-screen-recording-updat.md +6 -0
  131. package/corpus/templates/clips/changelog/2026-07-07-chrome-extension-recordings-keep-audio-after-refreshing-tab.md +6 -0
  132. package/corpus/templates/clips/changelog/2026-07-07-clip-playback-progress-now-starts-and-finishes-at-the-right-times.md +6 -0
  133. package/corpus/templates/clips/changelog/2026-07-07-sharing-public-clips-now-stays-focused-on-the-normal-link-wi.md +6 -0
  134. package/corpus/templates/clips/chrome-extension/src/background.ts +18 -0
  135. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +23 -8
  136. package/corpus/templates/clips/desktop/src/app.tsx +40 -3
  137. package/corpus/templates/clips/desktop/src/hooks/useMediaDevices.ts +19 -7
  138. package/corpus/templates/clips/desktop/src/lib/permissions.ts +2 -0
  139. package/corpus/templates/clips/desktop/src/lib/updater.ts +25 -2
  140. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +7 -0
  141. package/corpus/templates/clips/server/routes/api/recordings/[recordingId]/thumbnail.post.ts +1 -0
  142. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/abort.post.ts +22 -5
  143. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +8 -0
  144. package/corpus/templates/clips/server/routes/api/video/[recordingId].get.ts +13 -6
  145. package/corpus/templates/clips/shared/finalize-recovery.ts +12 -0
  146. package/corpus/templates/content/actions/delete-document.ts +337 -52
  147. package/corpus/templates/content/changelog/2026-07-07-permanently-deleting-trashed-databases-now-finishes-reliably.md +6 -0
  148. package/corpus/templates/slides/app/pages/DeckEditor.tsx +2 -2
  149. package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
  150. package/dist/agent/engine/ai-sdk-engine.js +15 -1
  151. package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
  152. package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
  153. package/dist/agent/engine/anthropic-engine.js +20 -1
  154. package/dist/agent/engine/anthropic-engine.js.map +1 -1
  155. package/dist/agent/engine/registry.d.ts.map +1 -1
  156. package/dist/agent/engine/registry.js +22 -14
  157. package/dist/agent/engine/registry.js.map +1 -1
  158. package/dist/agent/production-agent.d.ts.map +1 -1
  159. package/dist/agent/production-agent.js +27 -7
  160. package/dist/agent/production-agent.js.map +1 -1
  161. package/dist/client/command-navigation/index.d.ts +4 -0
  162. package/dist/client/command-navigation/index.d.ts.map +1 -0
  163. package/dist/client/command-navigation/index.js +4 -0
  164. package/dist/client/command-navigation/index.js.map +1 -0
  165. package/dist/client/comments-review/index.d.ts +2 -0
  166. package/dist/client/comments-review/index.d.ts.map +1 -0
  167. package/dist/client/comments-review/index.js +2 -0
  168. package/dist/client/comments-review/index.js.map +1 -0
  169. package/dist/client/history/VersionHistoryPanel.d.ts +18 -0
  170. package/dist/client/history/VersionHistoryPanel.d.ts.map +1 -0
  171. package/dist/client/history/VersionHistoryPanel.js +24 -0
  172. package/dist/client/history/VersionHistoryPanel.js.map +1 -0
  173. package/dist/client/history/index.d.ts +3 -0
  174. package/dist/client/history/index.d.ts.map +1 -0
  175. package/dist/client/history/index.js +3 -0
  176. package/dist/client/history/index.js.map +1 -0
  177. package/dist/client/history/use-history.d.ts +46 -0
  178. package/dist/client/history/use-history.d.ts.map +1 -0
  179. package/dist/client/history/use-history.js +18 -0
  180. package/dist/client/history/use-history.js.map +1 -0
  181. package/dist/client/index.d.ts +6 -4
  182. package/dist/client/index.d.ts.map +1 -1
  183. package/dist/client/index.js +6 -4
  184. package/dist/client/index.js.map +1 -1
  185. package/dist/client/org/OrgSwitcher.js +5 -5
  186. package/dist/client/org/OrgSwitcher.js.map +1 -1
  187. package/dist/client/org/RequireActiveOrg.js +2 -2
  188. package/dist/client/org/RequireActiveOrg.js.map +1 -1
  189. package/dist/client/org/TeamPage.js +3 -3
  190. package/dist/client/org/TeamPage.js.map +1 -1
  191. package/dist/client/org/hooks.d.ts +12 -1
  192. package/dist/client/org/hooks.d.ts.map +1 -1
  193. package/dist/client/org/hooks.js +15 -0
  194. package/dist/client/org/hooks.js.map +1 -1
  195. package/dist/client/org/index.d.ts +4 -2
  196. package/dist/client/org/index.d.ts.map +1 -1
  197. package/dist/client/org/index.js +3 -1
  198. package/dist/client/org/index.js.map +1 -1
  199. package/dist/client/org-team/index.d.ts +2 -0
  200. package/dist/client/org-team/index.d.ts.map +1 -0
  201. package/dist/client/org-team/index.js +2 -0
  202. package/dist/client/org-team/index.js.map +1 -0
  203. package/dist/client/review/ReviewStatusBadge.d.ts +7 -0
  204. package/dist/client/review/ReviewStatusBadge.d.ts.map +1 -0
  205. package/dist/client/review/ReviewStatusBadge.js +19 -0
  206. package/dist/client/review/ReviewStatusBadge.js.map +1 -0
  207. package/dist/client/review/ReviewThreadPanel.d.ts +20 -0
  208. package/dist/client/review/ReviewThreadPanel.d.ts.map +1 -0
  209. package/dist/client/review/ReviewThreadPanel.js +84 -0
  210. package/dist/client/review/ReviewThreadPanel.js.map +1 -0
  211. package/dist/client/review/index.d.ts +4 -0
  212. package/dist/client/review/index.d.ts.map +1 -0
  213. package/dist/client/review/index.js +4 -0
  214. package/dist/client/review/index.js.map +1 -0
  215. package/dist/client/review/use-review.d.ts +68 -0
  216. package/dist/client/review/use-review.d.ts.map +1 -0
  217. package/dist/client/review/use-review.js +22 -0
  218. package/dist/client/review/use-review.js.map +1 -0
  219. package/dist/client/settings/index.d.ts +1 -1
  220. package/dist/client/settings/index.d.ts.map +1 -1
  221. package/dist/client/settings/index.js +1 -1
  222. package/dist/client/settings/index.js.map +1 -1
  223. package/dist/client/setup-connections/BuilderConnectCard.d.ts +9 -0
  224. package/dist/client/setup-connections/BuilderConnectCard.d.ts.map +1 -0
  225. package/dist/client/setup-connections/BuilderConnectCard.js +25 -0
  226. package/dist/client/setup-connections/BuilderConnectCard.js.map +1 -0
  227. package/dist/client/setup-connections/ProviderReadinessBadge.d.ts +8 -0
  228. package/dist/client/setup-connections/ProviderReadinessBadge.d.ts.map +1 -0
  229. package/dist/client/setup-connections/ProviderReadinessBadge.js +32 -0
  230. package/dist/client/setup-connections/ProviderReadinessBadge.js.map +1 -0
  231. package/dist/client/setup-connections/SetupConnectionsPage.d.ts +17 -0
  232. package/dist/client/setup-connections/SetupConnectionsPage.d.ts.map +1 -0
  233. package/dist/client/setup-connections/SetupConnectionsPage.js +10 -0
  234. package/dist/client/setup-connections/SetupConnectionsPage.js.map +1 -0
  235. package/dist/client/setup-connections/index.d.ts +7 -0
  236. package/dist/client/setup-connections/index.d.ts.map +1 -0
  237. package/dist/client/setup-connections/index.js +7 -0
  238. package/dist/client/setup-connections/index.js.map +1 -0
  239. package/dist/client/sharing/ShareButton.d.ts +4 -4
  240. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  241. package/dist/client/sharing/ShareButton.js +13 -7
  242. package/dist/client/sharing/ShareButton.js.map +1 -1
  243. package/dist/client/sharing/ShareDialog.js +3 -3
  244. package/dist/client/sharing/ShareDialog.js.map +1 -1
  245. package/dist/collab/struct-routes.d.ts +1 -1
  246. package/dist/command-navigation/actions.d.ts +25 -0
  247. package/dist/command-navigation/actions.d.ts.map +1 -0
  248. package/dist/command-navigation/actions.js +64 -0
  249. package/dist/command-navigation/actions.js.map +1 -0
  250. package/dist/command-navigation/index.d.ts +4 -0
  251. package/dist/command-navigation/index.d.ts.map +1 -0
  252. package/dist/command-navigation/index.js +4 -0
  253. package/dist/command-navigation/index.js.map +1 -0
  254. package/dist/comments-review/index.d.ts +2 -0
  255. package/dist/comments-review/index.d.ts.map +1 -0
  256. package/dist/comments-review/index.js +2 -0
  257. package/dist/comments-review/index.js.map +1 -0
  258. package/dist/file-upload/builder.d.ts.map +1 -1
  259. package/dist/file-upload/builder.js +18 -2
  260. package/dist/file-upload/builder.js.map +1 -1
  261. package/dist/file-upload/types.d.ts +3 -0
  262. package/dist/file-upload/types.d.ts.map +1 -1
  263. package/dist/file-upload/types.js.map +1 -1
  264. package/dist/history/actions/create-resource-version.d.ts +10 -0
  265. package/dist/history/actions/create-resource-version.d.ts.map +1 -0
  266. package/dist/history/actions/create-resource-version.js +65 -0
  267. package/dist/history/actions/create-resource-version.js.map +1 -0
  268. package/dist/history/actions/get-resource-version.d.ts +10 -0
  269. package/dist/history/actions/get-resource-version.d.ts.map +1 -0
  270. package/dist/history/actions/get-resource-version.js +38 -0
  271. package/dist/history/actions/get-resource-version.js.map +1 -0
  272. package/dist/history/actions/list-resource-history.d.ts +10 -0
  273. package/dist/history/actions/list-resource-history.d.ts.map +1 -0
  274. package/dist/history/actions/list-resource-history.js +45 -0
  275. package/dist/history/actions/list-resource-history.js.map +1 -0
  276. package/dist/history/actions/list-resource-versions.d.ts +10 -0
  277. package/dist/history/actions/list-resource-versions.d.ts.map +1 -0
  278. package/dist/history/actions/list-resource-versions.js +35 -0
  279. package/dist/history/actions/list-resource-versions.js.map +1 -0
  280. package/dist/history/actions/restore-resource-version.d.ts +11 -0
  281. package/dist/history/actions/restore-resource-version.d.ts.map +1 -0
  282. package/dist/history/actions/restore-resource-version.js +59 -0
  283. package/dist/history/actions/restore-resource-version.js.map +1 -0
  284. package/dist/history/index.d.ts +4 -0
  285. package/dist/history/index.d.ts.map +1 -0
  286. package/dist/history/index.js +3 -0
  287. package/dist/history/index.js.map +1 -0
  288. package/dist/history/registry.d.ts +10 -0
  289. package/dist/history/registry.d.ts.map +1 -0
  290. package/dist/history/registry.js +61 -0
  291. package/dist/history/registry.js.map +1 -0
  292. package/dist/history/store.d.ts +34 -0
  293. package/dist/history/store.d.ts.map +1 -0
  294. package/dist/history/store.js +265 -0
  295. package/dist/history/store.js.map +1 -0
  296. package/dist/history/types.d.ts +55 -0
  297. package/dist/history/types.d.ts.map +1 -0
  298. package/dist/history/types.js +2 -0
  299. package/dist/history/types.js.map +1 -0
  300. package/dist/index.d.ts +6 -0
  301. package/dist/index.d.ts.map +1 -1
  302. package/dist/index.js +6 -0
  303. package/dist/index.js.map +1 -1
  304. package/dist/navigation/index.d.ts +53 -0
  305. package/dist/navigation/index.d.ts.map +1 -0
  306. package/dist/navigation/index.js +105 -0
  307. package/dist/navigation/index.js.map +1 -0
  308. package/dist/org/index.d.ts +1 -0
  309. package/dist/org/index.d.ts.map +1 -1
  310. package/dist/org/index.js +1 -0
  311. package/dist/org/index.js.map +1 -1
  312. package/dist/org/permissions.d.ts +7 -0
  313. package/dist/org/permissions.d.ts.map +1 -0
  314. package/dist/org/permissions.js +21 -0
  315. package/dist/org/permissions.js.map +1 -0
  316. package/dist/org-team/index.d.ts +2 -0
  317. package/dist/org-team/index.d.ts.map +1 -0
  318. package/dist/org-team/index.js +2 -0
  319. package/dist/org-team/index.js.map +1 -0
  320. package/dist/private-blob/registry.d.ts.map +1 -1
  321. package/dist/private-blob/registry.js +1 -0
  322. package/dist/private-blob/registry.js.map +1 -1
  323. package/dist/resources/handlers.d.ts +2 -2
  324. package/dist/review/actions/consume-review-feedback.d.ts +9 -0
  325. package/dist/review/actions/consume-review-feedback.d.ts.map +1 -0
  326. package/dist/review/actions/consume-review-feedback.js +29 -0
  327. package/dist/review/actions/consume-review-feedback.js.map +1 -0
  328. package/dist/review/actions/create-review-comment.d.ts +18 -0
  329. package/dist/review/actions/create-review-comment.d.ts.map +1 -0
  330. package/dist/review/actions/create-review-comment.js +81 -0
  331. package/dist/review/actions/create-review-comment.js.map +1 -0
  332. package/dist/review/actions/delete-review-comment.d.ts +10 -0
  333. package/dist/review/actions/delete-review-comment.d.ts.map +1 -0
  334. package/dist/review/actions/delete-review-comment.js +45 -0
  335. package/dist/review/actions/delete-review-comment.js.map +1 -0
  336. package/dist/review/actions/get-review-feedback.d.ts +10 -0
  337. package/dist/review/actions/get-review-feedback.d.ts.map +1 -0
  338. package/dist/review/actions/get-review-feedback.js +45 -0
  339. package/dist/review/actions/get-review-feedback.js.map +1 -0
  340. package/dist/review/actions/list-review-comments.d.ts +13 -0
  341. package/dist/review/actions/list-review-comments.d.ts.map +1 -0
  342. package/dist/review/actions/list-review-comments.js +44 -0
  343. package/dist/review/actions/list-review-comments.js.map +1 -0
  344. package/dist/review/actions/reply-review-comment.d.ts +16 -0
  345. package/dist/review/actions/reply-review-comment.d.ts.map +1 -0
  346. package/dist/review/actions/reply-review-comment.js +84 -0
  347. package/dist/review/actions/reply-review-comment.js.map +1 -0
  348. package/dist/review/actions/resolve-review-thread.d.ts +11 -0
  349. package/dist/review/actions/resolve-review-thread.d.ts.map +1 -0
  350. package/dist/review/actions/resolve-review-thread.js +46 -0
  351. package/dist/review/actions/resolve-review-thread.js.map +1 -0
  352. package/dist/review/actions/set-review-status.d.ts +9 -0
  353. package/dist/review/actions/set-review-status.d.ts.map +1 -0
  354. package/dist/review/actions/set-review-status.js +43 -0
  355. package/dist/review/actions/set-review-status.js.map +1 -0
  356. package/dist/review/index.d.ts +5 -0
  357. package/dist/review/index.d.ts.map +1 -0
  358. package/dist/review/index.js +4 -0
  359. package/dist/review/index.js.map +1 -0
  360. package/dist/review/mentions.d.ts +4 -0
  361. package/dist/review/mentions.d.ts.map +1 -0
  362. package/dist/review/mentions.js +39 -0
  363. package/dist/review/mentions.js.map +1 -0
  364. package/dist/review/registry.d.ts +10 -0
  365. package/dist/review/registry.d.ts.map +1 -0
  366. package/dist/review/registry.js +61 -0
  367. package/dist/review/registry.js.map +1 -0
  368. package/dist/review/store.d.ts +63 -0
  369. package/dist/review/store.d.ts.map +1 -0
  370. package/dist/review/store.js +558 -0
  371. package/dist/review/store.js.map +1 -0
  372. package/dist/review/types.d.ts +77 -0
  373. package/dist/review/types.d.ts.map +1 -0
  374. package/dist/review/types.js +2 -0
  375. package/dist/review/types.js.map +1 -0
  376. package/dist/server/action-discovery.d.ts.map +1 -1
  377. package/dist/server/action-discovery.js +54 -0
  378. package/dist/server/action-discovery.js.map +1 -1
  379. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  380. package/dist/server/agent-engine-api-key-route.d.ts.map +1 -1
  381. package/dist/server/agent-engine-api-key-route.js +5 -0
  382. package/dist/server/agent-engine-api-key-route.js.map +1 -1
  383. package/dist/server/credential-provider.d.ts +26 -0
  384. package/dist/server/credential-provider.d.ts.map +1 -1
  385. package/dist/server/credential-provider.js +82 -0
  386. package/dist/server/credential-provider.js.map +1 -1
  387. package/dist/setup-connections/index.d.ts +6 -0
  388. package/dist/setup-connections/index.d.ts.map +1 -0
  389. package/dist/setup-connections/index.js +6 -0
  390. package/dist/setup-connections/index.js.map +1 -0
  391. package/dist/setup-connections/onboarding.d.ts +14 -0
  392. package/dist/setup-connections/onboarding.d.ts.map +1 -0
  393. package/dist/setup-connections/onboarding.js +23 -0
  394. package/dist/setup-connections/onboarding.js.map +1 -0
  395. package/dist/transcription/builder-transcription.d.ts +1 -0
  396. package/dist/transcription/builder-transcription.d.ts.map +1 -1
  397. package/dist/transcription/builder-transcription.js +5 -2
  398. package/dist/transcription/builder-transcription.js.map +1 -1
  399. package/dist/vite/action-types-plugin.d.ts.map +1 -1
  400. package/dist/vite/action-types-plugin.js +52 -0
  401. package/dist/vite/action-types-plugin.js.map +1 -1
  402. package/docs/content/agent-native-toolkit.mdx +87 -80
  403. package/docs/content/locales/ar-SA/agent-native-toolkit.mdx +89 -80
  404. package/docs/content/locales/de-DE/agent-native-toolkit.mdx +89 -80
  405. package/docs/content/locales/es-ES/agent-native-toolkit.mdx +89 -80
  406. package/docs/content/locales/fr-FR/agent-native-toolkit.mdx +89 -80
  407. package/docs/content/locales/hi-IN/agent-native-toolkit.mdx +89 -80
  408. package/docs/content/locales/ja-JP/agent-native-toolkit.mdx +89 -80
  409. package/docs/content/locales/ko-KR/agent-native-toolkit.mdx +89 -80
  410. package/docs/content/locales/pt-BR/agent-native-toolkit.mdx +89 -80
  411. package/docs/content/locales/zh-CN/agent-native-toolkit.mdx +89 -80
  412. package/docs/content/locales/zh-TW/agent-native-toolkit.mdx +89 -80
  413. package/docs/content/toolkit-agent-ux.mdx +43 -0
  414. package/docs/content/toolkit-app-adapters.mdx +9 -0
  415. package/docs/content/toolkit-collaboration-ui.mdx +12 -0
  416. package/docs/content/toolkit-collaboration.mdx +74 -0
  417. package/docs/content/toolkit-command-navigation.mdx +106 -0
  418. package/docs/content/toolkit-comments-review.mdx +98 -0
  419. package/docs/content/toolkit-history.mdx +95 -0
  420. package/docs/content/toolkit-observability.mdx +41 -0
  421. package/docs/content/toolkit-org-team.mdx +80 -0
  422. package/docs/content/toolkit-resources.mdx +57 -0
  423. package/docs/content/toolkit-settings.mdx +65 -0
  424. package/docs/content/toolkit-setup-connections.mdx +109 -0
  425. package/docs/content/toolkit-sharing-ui.mdx +18 -6
  426. package/docs/content/toolkit-sharing.mdx +81 -0
  427. package/docs/content/toolkit-shell-hooks.mdx +9 -0
  428. package/docs/content/toolkit-ui.mdx +9 -0
  429. package/package.json +36 -2
@@ -0,0 +1,170 @@
1
+ import {
2
+ AGENT_NATIVE_OPEN_PATH,
3
+ withCollapsedAgentSidebarParam,
4
+ } from "../shared/agent-sidebar-url.js";
5
+
6
+ export const STANDARD_APP_ROUTES = {
7
+ home: "/",
8
+ settings: "/settings",
9
+ team: "/team",
10
+ } as const;
11
+
12
+ export const STANDARD_SETTINGS_TABS = {
13
+ general: "general",
14
+ agent: "agent",
15
+ providers: "providers",
16
+ connections: "connections",
17
+ secrets: "secrets",
18
+ team: "team",
19
+ usage: "usage",
20
+ language: "language",
21
+ whatsNew: "whats-new",
22
+ } as const;
23
+
24
+ export type StandardAppRouteId = keyof typeof STANDARD_APP_ROUTES;
25
+ export type StandardSettingsTabId =
26
+ (typeof STANDARD_SETTINGS_TABS)[keyof typeof STANDARD_SETTINGS_TABS];
27
+
28
+ export interface BuildStandardAppRouteOptions {
29
+ settingsTab?: StandardSettingsTabId | string | null;
30
+ teamInSettings?: boolean;
31
+ }
32
+
33
+ export interface BuildResourceRouteOptions {
34
+ basePath?: string;
35
+ }
36
+
37
+ export interface NavigationTarget {
38
+ app?: string;
39
+ view: string;
40
+ params?: Record<string, string | number | boolean | null | undefined>;
41
+ to?: string;
42
+ }
43
+
44
+ export interface NavigationLink extends NavigationTarget {
45
+ label: string;
46
+ url: string;
47
+ }
48
+
49
+ export type StandardOpenPathRoute =
50
+ | string
51
+ | ((params: Record<string, string>) => string | null | undefined);
52
+
53
+ export interface StandardOpenPathResolverOptions {
54
+ fallback?: StandardOpenPathRoute;
55
+ }
56
+
57
+ function normalizeLeadingPath(path: string): string {
58
+ const trimmed = path.trim();
59
+ if (!trimmed || trimmed === "/") return "/";
60
+ return `/${trimmed.replace(/^\/+/, "").replace(/\/+$/, "")}`;
61
+ }
62
+
63
+ function normalizeTabId(tab: string): string {
64
+ return tab
65
+ .trim()
66
+ .replace(/^#/, "")
67
+ .toLowerCase()
68
+ .replace(/['"]/g, "")
69
+ .replace(/[\s_]+/g, "-");
70
+ }
71
+
72
+ function pathSegment(value: string): string {
73
+ return encodeURIComponent(value.trim().replace(/^\/+|\/+$/g, ""));
74
+ }
75
+
76
+ function resolveOpenPathRoute(
77
+ route: StandardOpenPathRoute | undefined,
78
+ params: Record<string, string>,
79
+ ): string | null | undefined {
80
+ if (!route) return null;
81
+ return typeof route === "function" ? route(params) : route;
82
+ }
83
+
84
+ export function buildSettingsRoute(
85
+ tab?: StandardSettingsTabId | string | null,
86
+ basePath = STANDARD_APP_ROUTES.settings,
87
+ ): string {
88
+ const path = normalizeLeadingPath(basePath);
89
+ const normalizedTab = tab ? normalizeTabId(tab) : null;
90
+ if (!normalizedTab || normalizedTab === STANDARD_SETTINGS_TABS.general) {
91
+ return path;
92
+ }
93
+ return `${path}#${encodeURIComponent(normalizedTab)}`;
94
+ }
95
+
96
+ export function buildTeamRoute(
97
+ options: Pick<BuildStandardAppRouteOptions, "teamInSettings"> = {},
98
+ ): string {
99
+ return options.teamInSettings
100
+ ? buildSettingsRoute(STANDARD_SETTINGS_TABS.team)
101
+ : STANDARD_APP_ROUTES.team;
102
+ }
103
+
104
+ export function buildStandardAppRoute(
105
+ route: StandardAppRouteId,
106
+ options: BuildStandardAppRouteOptions = {},
107
+ ): string {
108
+ if (route === "settings") return buildSettingsRoute(options.settingsTab);
109
+ if (route === "team") return buildTeamRoute(options);
110
+ return STANDARD_APP_ROUTES[route];
111
+ }
112
+
113
+ export function buildResourceRoute(
114
+ collection: string,
115
+ resourceId: string,
116
+ options: BuildResourceRouteOptions = {},
117
+ ): string {
118
+ const base = normalizeLeadingPath(options.basePath ?? "/");
119
+ const collectionPath = collection
120
+ .split("/")
121
+ .map((segment) => pathSegment(segment))
122
+ .filter(Boolean)
123
+ .join("/");
124
+ if (!collectionPath) throw new Error("collection is required");
125
+ if (!resourceId.trim()) throw new Error("resourceId is required");
126
+ const prefix = base === "/" ? "" : base;
127
+ return `${prefix}/${collectionPath}/${pathSegment(resourceId)}`;
128
+ }
129
+
130
+ export function buildOpenRoutePath(input: NavigationTarget): string {
131
+ const sp = new URLSearchParams();
132
+ if (input.app) sp.set("app", input.app);
133
+ sp.set("view", input.view);
134
+ if (input.to) sp.set("to", input.to);
135
+ for (const [key, value] of Object.entries(input.params ?? {})) {
136
+ if (value === undefined || value === null || value === "") continue;
137
+ sp.set(key, String(value));
138
+ }
139
+ return withCollapsedAgentSidebarParam(`${AGENT_NATIVE_OPEN_PATH}?${sp}`);
140
+ }
141
+
142
+ export function buildOpenRouteLink(
143
+ input: NavigationTarget & { label?: string },
144
+ ): NavigationLink {
145
+ return {
146
+ ...input,
147
+ label: input.label ?? `Open ${input.view}`,
148
+ url: buildOpenRoutePath(input),
149
+ };
150
+ }
151
+
152
+ export function createStandardOpenPathResolver(
153
+ routes: Record<string, StandardOpenPathRoute>,
154
+ options: StandardOpenPathResolverOptions = {},
155
+ ) {
156
+ return (input: {
157
+ app?: string;
158
+ view?: string;
159
+ params: Record<string, string>;
160
+ }): string | null | undefined => {
161
+ void input.app;
162
+ if (!input.view)
163
+ return resolveOpenPathRoute(options.fallback, input.params);
164
+ return (
165
+ resolveOpenPathRoute(routes[input.view], input.params) ??
166
+ resolveOpenPathRoute(options.fallback, input.params) ??
167
+ `/${input.view}`
168
+ );
169
+ };
170
+ }
@@ -10,6 +10,14 @@ export type {
10
10
  OrgPendingInvitation,
11
11
  } from "./types.js";
12
12
 
13
+ export {
14
+ canInviteOrgMembers,
15
+ canManageOrg,
16
+ canManageOrgDomain,
17
+ orgRoleAtLeast,
18
+ orgRoleRank,
19
+ } from "./permissions.js";
20
+
13
21
  export {
14
22
  getOrgContext,
15
23
  getOrgDomain,
@@ -0,0 +1,30 @@
1
+ import type { OrgRole } from "./types.js";
2
+
3
+ const ORG_ROLE_RANK: Record<OrgRole, number> = {
4
+ member: 1,
5
+ admin: 2,
6
+ owner: 3,
7
+ };
8
+
9
+ export function orgRoleRank(role: OrgRole | null | undefined): number {
10
+ return role ? (ORG_ROLE_RANK[role] ?? 0) : 0;
11
+ }
12
+
13
+ export function orgRoleAtLeast(
14
+ role: OrgRole | null | undefined,
15
+ minimum: OrgRole,
16
+ ): boolean {
17
+ return orgRoleRank(role) >= orgRoleRank(minimum);
18
+ }
19
+
20
+ export function canManageOrg(role: OrgRole | null | undefined): boolean {
21
+ return orgRoleAtLeast(role, "admin");
22
+ }
23
+
24
+ export function canInviteOrgMembers(role: OrgRole | null | undefined): boolean {
25
+ return orgRoleAtLeast(role, "admin");
26
+ }
27
+
28
+ export function canManageOrgDomain(role: OrgRole | null | undefined): boolean {
29
+ return role === "owner";
30
+ }
@@ -0,0 +1 @@
1
+ export * from "../org/index.js";
@@ -125,6 +125,7 @@ async function putViaEncryptedPublicUpload(
125
125
  filename: input.filename ?? input.key ?? "private-blob.bin",
126
126
  mimeType: "application/octet-stream",
127
127
  ownerEmail: input.ownerEmail,
128
+ recordAsset: false,
128
129
  });
129
130
  if (!uploaded) return null;
130
131
 
@@ -0,0 +1,38 @@
1
+ import { z } from "zod";
2
+
3
+ import { defineAction } from "../../action.js";
4
+ import { assertReviewableResourceAccess } from "../registry.js";
5
+ import { consumeReviewFeedback } from "../store.js";
6
+ import type { ReviewResourceContext } from "../types.js";
7
+
8
+ const schema = z.object({
9
+ resourceType: z.string().min(1),
10
+ resourceId: z.string().min(1),
11
+ commentIds: z.array(z.string().min(1)).min(1),
12
+ });
13
+
14
+ export default defineAction({
15
+ description:
16
+ "Mark review feedback as consumed by the agent or reviewer workflow.",
17
+ schema,
18
+ run: async (args, ctx) => {
19
+ const actionCtx = ctx as ReviewResourceContext | undefined;
20
+ await assertReviewableResourceAccess(
21
+ args.resourceType,
22
+ args.resourceId,
23
+ actionCtx,
24
+ "editor",
25
+ );
26
+ await consumeReviewFeedback(args.commentIds, undefined, {
27
+ resourceType: args.resourceType,
28
+ resourceId: args.resourceId,
29
+ });
30
+ return { consumedCommentIds: args.commentIds };
31
+ },
32
+ audit: {
33
+ target: (args) => ({
34
+ type: args.resourceType,
35
+ id: args.resourceId,
36
+ }),
37
+ },
38
+ });
@@ -0,0 +1,107 @@
1
+ import { z } from "zod";
2
+
3
+ import { defineAction } from "../../action.js";
4
+ import { extractReviewMentions, normalizeReviewMentions } from "../mentions.js";
5
+ import {
6
+ assertReviewableResourceAccess,
7
+ normalizeReviewVisibility,
8
+ } from "../registry.js";
9
+ import { insertReviewComment } from "../store.js";
10
+ import type {
11
+ ReviewActorKind,
12
+ ReviewCommentKind,
13
+ ReviewResourceContext,
14
+ } from "../types.js";
15
+
16
+ const mentionSchema = z.object({
17
+ label: z.string().min(1),
18
+ email: z.string().email().nullable().optional(),
19
+ id: z.string().nullable().optional(),
20
+ });
21
+
22
+ const schema = z.object({
23
+ resourceType: z.string().min(1),
24
+ resourceId: z.string().min(1),
25
+ targetId: z.string().nullable().optional(),
26
+ kind: z
27
+ .enum([
28
+ "comment",
29
+ "annotation",
30
+ "correction",
31
+ "question",
32
+ "decision",
33
+ "review",
34
+ ])
35
+ .optional(),
36
+ anchor: z.unknown().nullable().optional(),
37
+ body: z.string().min(1),
38
+ authorName: z.string().nullable().optional(),
39
+ resolutionTarget: z.enum(["agent", "human"]).nullable().optional(),
40
+ mentions: z.array(mentionSchema).optional(),
41
+ metadata: z.record(z.string(), z.unknown()).optional(),
42
+ });
43
+
44
+ export default defineAction({
45
+ description:
46
+ "Create an inline comment, annotation, or review thread for a resource.",
47
+ schema,
48
+ run: async (args, ctx) => {
49
+ const actionCtx = ctx as ReviewResourceContext | undefined;
50
+ const access = await assertReviewableResourceAccess(
51
+ args.resourceType,
52
+ args.resourceId,
53
+ actionCtx,
54
+ "viewer",
55
+ );
56
+ const mentions = normalizeReviewMentions([
57
+ ...normalizeReviewMentions(args.mentions),
58
+ ...extractReviewMentions(args.body),
59
+ ]);
60
+ const resolutionTarget =
61
+ args.resolutionTarget ?? (mentions.length > 0 ? "human" : "agent");
62
+
63
+ return insertReviewComment({
64
+ resourceType: args.resourceType,
65
+ resourceId: args.resourceId,
66
+ targetId: args.targetId ?? null,
67
+ kind: (args.kind ?? "comment") as ReviewCommentKind,
68
+ anchor: args.anchor ?? null,
69
+ body: args.body,
70
+ authorEmail: actionCtx?.userEmail ?? null,
71
+ authorName: args.authorName ?? actionCtx?.userEmail ?? null,
72
+ createdBy: actorKindFromContext(actionCtx),
73
+ resolutionTarget,
74
+ mentions,
75
+ ownerEmail: access.ownerEmail ?? actionCtx?.userEmail ?? null,
76
+ orgId: access.orgId ?? actionCtx?.orgId ?? null,
77
+ visibility: normalizeReviewVisibility(access.visibility),
78
+ metadata: args.metadata,
79
+ });
80
+ },
81
+ audit: {
82
+ target: (args, result) => {
83
+ const comment = result as {
84
+ ownerEmail?: string | null;
85
+ orgId?: string | null;
86
+ visibility?: "private" | "org" | "public";
87
+ };
88
+ return {
89
+ type: args.resourceType,
90
+ id: args.resourceId,
91
+ ownerEmail: comment.ownerEmail,
92
+ orgId: comment.orgId,
93
+ visibility: comment.visibility,
94
+ };
95
+ },
96
+ },
97
+ });
98
+
99
+ function actorKindFromContext(
100
+ ctx: ReviewResourceContext | undefined,
101
+ ): ReviewActorKind {
102
+ const caller = typeof ctx?.caller === "string" ? ctx.caller : "";
103
+ if (caller === "agent" || caller === "tool") {
104
+ return "agent";
105
+ }
106
+ return ctx?.userEmail ? "human" : "system";
107
+ }
@@ -0,0 +1,55 @@
1
+ import { z } from "zod";
2
+
3
+ import { defineAction } from "../../action.js";
4
+ import { ForbiddenError } from "../../sharing/access.js";
5
+ import { roleSatisfies } from "../../sharing/schema.js";
6
+ import { resolveReviewableResourceAccess } from "../registry.js";
7
+ import { deleteReviewComment, getReviewCommentById } from "../store.js";
8
+ import type { ReviewResourceContext } from "../types.js";
9
+
10
+ const schema = z.object({
11
+ resourceType: z.string().min(1),
12
+ resourceId: z.string().min(1),
13
+ commentId: z.string().min(1),
14
+ });
15
+
16
+ export default defineAction({
17
+ description: "Soft-delete a review comment.",
18
+ schema,
19
+ run: async (args, ctx) => {
20
+ const actionCtx = ctx as ReviewResourceContext | undefined;
21
+ const scope = {
22
+ userEmail: actionCtx?.userEmail ?? null,
23
+ orgId: actionCtx?.orgId ?? null,
24
+ };
25
+ const access = await resolveReviewableResourceAccess(
26
+ args.resourceType,
27
+ args.resourceId,
28
+ actionCtx,
29
+ );
30
+ const comment = await getReviewCommentById(args.commentId, scope, {
31
+ bypassScope: Boolean(access),
32
+ });
33
+ if (
34
+ !comment ||
35
+ comment.resourceType !== args.resourceType ||
36
+ comment.resourceId !== args.resourceId
37
+ ) {
38
+ throw new Error("Review comment not found");
39
+ }
40
+ const isAuthor =
41
+ Boolean(actionCtx?.userEmail) &&
42
+ comment.authorEmail === actionCtx?.userEmail;
43
+ if (!isAuthor && (!access || !roleSatisfies(access.role, "editor"))) {
44
+ throw new ForbiddenError("Not allowed to delete this review comment");
45
+ }
46
+ await deleteReviewComment(comment.id, actionCtx?.userEmail ?? null);
47
+ return { commentId: comment.id, deleted: true };
48
+ },
49
+ audit: {
50
+ target: (args) => ({
51
+ type: args.resourceType,
52
+ id: args.resourceId,
53
+ }),
54
+ },
55
+ });
@@ -0,0 +1,54 @@
1
+ import { z } from "zod";
2
+
3
+ import { defineAction } from "../../action.js";
4
+ import { assertReviewableResourceAccess } from "../registry.js";
5
+ import { queryReviewComments } from "../store.js";
6
+ import type { ReviewResourceContext } from "../types.js";
7
+
8
+ const schema = z.object({
9
+ resourceType: z.string().min(1),
10
+ resourceId: z.string().min(1),
11
+ includeHumanTargeted: z.boolean().optional(),
12
+ limit: z.number().int().positive().max(500).optional(),
13
+ });
14
+
15
+ export default defineAction({
16
+ description:
17
+ "Get open review feedback that is ready for the agent to consider.",
18
+ schema,
19
+ http: { method: "GET" },
20
+ readOnly: true,
21
+ parallelSafe: true,
22
+ run: async (args, ctx) => {
23
+ const actionCtx = ctx as ReviewResourceContext | undefined;
24
+ await assertReviewableResourceAccess(
25
+ args.resourceType,
26
+ args.resourceId,
27
+ actionCtx,
28
+ "viewer",
29
+ );
30
+ const comments = await queryReviewComments({
31
+ resourceType: args.resourceType,
32
+ resourceId: args.resourceId,
33
+ scope: {
34
+ userEmail: actionCtx?.userEmail ?? null,
35
+ orgId: actionCtx?.orgId ?? null,
36
+ },
37
+ bypassScope: true,
38
+ includeResolved: false,
39
+ includeDeleted: false,
40
+ limit: args.limit,
41
+ });
42
+ return {
43
+ comments: comments.filter((comment) => {
44
+ if (comment.consumedAt) {
45
+ return false;
46
+ }
47
+ if (args.includeHumanTargeted) {
48
+ return true;
49
+ }
50
+ return comment.resolutionTarget !== "human";
51
+ }),
52
+ };
53
+ },
54
+ });
@@ -0,0 +1,53 @@
1
+ import { z } from "zod";
2
+
3
+ import { defineAction } from "../../action.js";
4
+ import { assertReviewableResourceAccess } from "../registry.js";
5
+ import { getReviewStatus, queryReviewComments } from "../store.js";
6
+ import type { ReviewResourceContext } from "../types.js";
7
+
8
+ const schema = z.object({
9
+ resourceType: z.string().min(1),
10
+ resourceId: z.string().min(1),
11
+ includeResolved: z.boolean().optional(),
12
+ includeDeleted: z.boolean().optional(),
13
+ targetId: z.string().nullable().optional(),
14
+ limit: z.number().int().positive().max(500).optional(),
15
+ });
16
+
17
+ export default defineAction({
18
+ description:
19
+ "List inline comments, annotations, and review threads for a resource.",
20
+ schema,
21
+ http: { method: "GET" },
22
+ readOnly: true,
23
+ parallelSafe: true,
24
+ run: async (args, ctx) => {
25
+ const actionCtx = ctx as ReviewResourceContext | undefined;
26
+ await assertReviewableResourceAccess(
27
+ args.resourceType,
28
+ args.resourceId,
29
+ actionCtx,
30
+ "viewer",
31
+ );
32
+ const scope = {
33
+ userEmail: actionCtx?.userEmail ?? null,
34
+ orgId: actionCtx?.orgId ?? null,
35
+ };
36
+ const [comments, reviewStatus] = await Promise.all([
37
+ queryReviewComments({
38
+ resourceType: args.resourceType,
39
+ resourceId: args.resourceId,
40
+ scope,
41
+ bypassScope: true,
42
+ includeResolved: args.includeResolved,
43
+ includeDeleted: args.includeDeleted,
44
+ targetId: args.targetId,
45
+ limit: args.limit,
46
+ }),
47
+ getReviewStatus(args.resourceType, args.resourceId, scope, {
48
+ bypassScope: true,
49
+ }),
50
+ ]);
51
+ return { comments, reviewStatus };
52
+ },
53
+ });
@@ -0,0 +1,107 @@
1
+ import { z } from "zod";
2
+
3
+ import { defineAction } from "../../action.js";
4
+ import { extractReviewMentions, normalizeReviewMentions } from "../mentions.js";
5
+ import {
6
+ assertReviewableResourceAccess,
7
+ normalizeReviewVisibility,
8
+ } from "../registry.js";
9
+ import { getReviewCommentById, insertReviewComment } from "../store.js";
10
+ import type { ReviewActorKind, ReviewResourceContext } from "../types.js";
11
+
12
+ const mentionSchema = z.object({
13
+ label: z.string().min(1),
14
+ email: z.string().email().nullable().optional(),
15
+ id: z.string().nullable().optional(),
16
+ });
17
+
18
+ const schema = z.object({
19
+ resourceType: z.string().min(1),
20
+ resourceId: z.string().min(1),
21
+ commentId: z.string().min(1),
22
+ body: z.string().min(1),
23
+ authorName: z.string().nullable().optional(),
24
+ resolutionTarget: z.enum(["agent", "human"]).nullable().optional(),
25
+ mentions: z.array(mentionSchema).optional(),
26
+ metadata: z.record(z.string(), z.unknown()).optional(),
27
+ });
28
+
29
+ export default defineAction({
30
+ description: "Reply to an existing review comment thread.",
31
+ schema,
32
+ run: async (args, ctx) => {
33
+ const actionCtx = ctx as ReviewResourceContext | undefined;
34
+ const scope = {
35
+ userEmail: actionCtx?.userEmail ?? null,
36
+ orgId: actionCtx?.orgId ?? null,
37
+ };
38
+ const access = await assertReviewableResourceAccess(
39
+ args.resourceType,
40
+ args.resourceId,
41
+ actionCtx,
42
+ "viewer",
43
+ );
44
+ const parent = await getReviewCommentById(args.commentId, scope, {
45
+ bypassScope: true,
46
+ });
47
+ if (
48
+ !parent ||
49
+ parent.resourceType !== args.resourceType ||
50
+ parent.resourceId !== args.resourceId
51
+ ) {
52
+ throw new Error("Review comment not found");
53
+ }
54
+ const mentions = normalizeReviewMentions([
55
+ ...normalizeReviewMentions(args.mentions),
56
+ ...extractReviewMentions(args.body),
57
+ ]);
58
+
59
+ return insertReviewComment({
60
+ resourceType: args.resourceType,
61
+ resourceId: args.resourceId,
62
+ threadId: parent.threadId,
63
+ parentCommentId: parent.id,
64
+ targetId: parent.targetId,
65
+ kind: parent.kind,
66
+ anchor: parent.anchor,
67
+ body: args.body,
68
+ authorEmail: actionCtx?.userEmail ?? null,
69
+ authorName: args.authorName ?? actionCtx?.userEmail ?? null,
70
+ createdBy: actorKindFromContext(actionCtx),
71
+ resolutionTarget:
72
+ args.resolutionTarget ??
73
+ (mentions.length > 0 ? "human" : parent.resolutionTarget),
74
+ mentions,
75
+ ownerEmail: access.ownerEmail ?? actionCtx?.userEmail ?? null,
76
+ orgId: access.orgId ?? actionCtx?.orgId ?? null,
77
+ visibility: normalizeReviewVisibility(access.visibility),
78
+ metadata: args.metadata,
79
+ });
80
+ },
81
+ audit: {
82
+ target: (args, result) => {
83
+ const comment = result as {
84
+ ownerEmail?: string | null;
85
+ orgId?: string | null;
86
+ visibility?: "private" | "org" | "public";
87
+ };
88
+ return {
89
+ type: args.resourceType,
90
+ id: args.resourceId,
91
+ ownerEmail: comment.ownerEmail,
92
+ orgId: comment.orgId,
93
+ visibility: comment.visibility,
94
+ };
95
+ },
96
+ },
97
+ });
98
+
99
+ function actorKindFromContext(
100
+ ctx: ReviewResourceContext | undefined,
101
+ ): ReviewActorKind {
102
+ const caller = typeof ctx?.caller === "string" ? ctx.caller : "";
103
+ if (caller === "agent" || caller === "tool") {
104
+ return "agent";
105
+ }
106
+ return ctx?.userEmail ? "human" : "system";
107
+ }