@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,96 @@
1
+ import { z } from "zod";
2
+
3
+ import { defineAction } from "../../action.js";
4
+ import {
5
+ assertVersionedResourceAccess,
6
+ getVersionedResource,
7
+ } from "../registry.js";
8
+ import {
9
+ getResourceVersionById,
10
+ getResourceVersionByNumber,
11
+ } from "../store.js";
12
+ import type { VersionedResourceContext } from "../types.js";
13
+
14
+ const schema = z
15
+ .object({
16
+ id: z.string().optional(),
17
+ resourceType: z.string().min(1).optional(),
18
+ resourceId: z.string().min(1).optional(),
19
+ versionNumber: z.number().int().positive().optional(),
20
+ })
21
+ .refine(
22
+ (value) =>
23
+ value.id ||
24
+ (value.resourceType && value.resourceId && value.versionNumber),
25
+ {
26
+ message:
27
+ "Provide either id or resourceType, resourceId, and versionNumber",
28
+ },
29
+ );
30
+
31
+ export default defineAction({
32
+ description: "Restore a resource from a reusable version-history snapshot.",
33
+ schema,
34
+ run: async (args, ctx) => {
35
+ const actionCtx = ctx as VersionedResourceContext | undefined;
36
+ const scope = {
37
+ userEmail: actionCtx?.userEmail ?? null,
38
+ orgId: actionCtx?.orgId ?? null,
39
+ };
40
+ const version = args.id
41
+ ? await getResourceVersionById(args.id, scope, { bypassScope: true })
42
+ : await getResourceVersionByNumber(
43
+ args.resourceType!,
44
+ args.resourceId!,
45
+ args.versionNumber!,
46
+ scope,
47
+ { bypassScope: true },
48
+ );
49
+ if (!version) {
50
+ throw new Error("Resource version not found");
51
+ }
52
+
53
+ const access = await assertVersionedResourceAccess(
54
+ version.resourceType,
55
+ version.resourceId,
56
+ actionCtx,
57
+ "editor",
58
+ );
59
+ const registration = getVersionedResource(version.resourceType);
60
+ if (!registration?.restoreSnapshot) {
61
+ throw new Error(
62
+ `${version.resourceType} has no restoreSnapshot history handler registered`,
63
+ );
64
+ }
65
+
66
+ const result = await registration.restoreSnapshot({
67
+ resourceType: version.resourceType,
68
+ resourceId: version.resourceId,
69
+ ctx: actionCtx,
70
+ access,
71
+ version,
72
+ snapshot: version.snapshot,
73
+ });
74
+ return { version, result };
75
+ },
76
+ audit: {
77
+ target: (_args, result) => {
78
+ const restored = result as {
79
+ version: {
80
+ resourceType: string;
81
+ resourceId: string;
82
+ ownerEmail?: string | null;
83
+ orgId?: string | null;
84
+ visibility?: "private" | "org" | "public";
85
+ };
86
+ };
87
+ return {
88
+ type: restored.version.resourceType,
89
+ id: restored.version.resourceId,
90
+ ownerEmail: restored.version.ownerEmail,
91
+ orgId: restored.version.orgId,
92
+ visibility: restored.version.visibility,
93
+ };
94
+ },
95
+ },
96
+ });
@@ -0,0 +1,27 @@
1
+ export type {
2
+ HistoryActorKind,
3
+ HistoryResourceRole,
4
+ ResourceHistoryScope,
5
+ ResourceVersion,
6
+ VersionedResourceAccess,
7
+ VersionedResourceContext,
8
+ VersionedResourceRegistration,
9
+ VersionedResourceRestoreContext,
10
+ VersionedResourceSnapshotContext,
11
+ } from "./types.js";
12
+ export {
13
+ __resetVersionedResourcesForTests,
14
+ assertVersionedResourceAccess,
15
+ getVersionedResource,
16
+ listVersionedResources,
17
+ registerVersionedResource,
18
+ resolveVersionedResourceAccess,
19
+ } from "./registry.js";
20
+ export {
21
+ __resetHistoryInitForTests,
22
+ ensureResourceVersionsTable,
23
+ getResourceVersionById,
24
+ getResourceVersionByNumber,
25
+ insertResourceVersion,
26
+ queryResourceVersions,
27
+ } from "./store.js";
@@ -0,0 +1,99 @@
1
+ import { ForbiddenError, resolveAccess } from "../sharing/access.js";
2
+ import { getShareableResource } from "../sharing/registry.js";
3
+ import { roleSatisfies, type Visibility } from "../sharing/schema.js";
4
+ import type {
5
+ HistoryResourceRole,
6
+ VersionedResourceAccess,
7
+ VersionedResourceContext,
8
+ VersionedResourceRegistration,
9
+ } from "./types.js";
10
+
11
+ const registrations = new Map<string, VersionedResourceRegistration>();
12
+
13
+ export function registerVersionedResource(
14
+ registration: VersionedResourceRegistration,
15
+ ): void {
16
+ if (!registration.type.trim()) {
17
+ throw new Error(
18
+ "registerVersionedResource requires a non-empty resource type",
19
+ );
20
+ }
21
+ registrations.set(registration.type, registration);
22
+ }
23
+
24
+ export function getVersionedResource(
25
+ type: string,
26
+ ): VersionedResourceRegistration | undefined {
27
+ return registrations.get(type);
28
+ }
29
+
30
+ export function listVersionedResources(): VersionedResourceRegistration[] {
31
+ return Array.from(registrations.values());
32
+ }
33
+
34
+ export async function resolveVersionedResourceAccess(
35
+ resourceType: string,
36
+ resourceId: string,
37
+ ctx?: VersionedResourceContext,
38
+ ): Promise<VersionedResourceAccess | null> {
39
+ const registration = getVersionedResource(resourceType);
40
+ if (registration?.resolveAccess) {
41
+ return registration.resolveAccess(resourceId, ctx);
42
+ }
43
+
44
+ if (getShareableResource(resourceType)) {
45
+ const access = await resolveAccess(resourceType, resourceId);
46
+ if (!access) {
47
+ return null;
48
+ }
49
+ return {
50
+ role: access.role as HistoryResourceRole,
51
+ ownerEmail: access.resource.ownerEmail ?? null,
52
+ orgId: access.resource.orgId ?? null,
53
+ visibility: access.resource.visibility,
54
+ resource: access.resource,
55
+ };
56
+ }
57
+
58
+ const userEmail = ctx?.userEmail ?? null;
59
+ if (!userEmail) {
60
+ return null;
61
+ }
62
+ return {
63
+ role: "owner",
64
+ ownerEmail: userEmail,
65
+ orgId: ctx?.orgId ?? null,
66
+ visibility: "private",
67
+ };
68
+ }
69
+
70
+ export async function assertVersionedResourceAccess(
71
+ resourceType: string,
72
+ resourceId: string,
73
+ ctx: VersionedResourceContext | undefined,
74
+ minimumRole: HistoryResourceRole,
75
+ ): Promise<VersionedResourceAccess> {
76
+ const access = await resolveVersionedResourceAccess(
77
+ resourceType,
78
+ resourceId,
79
+ ctx,
80
+ );
81
+ if (!access || !roleSatisfies(access.role, minimumRole)) {
82
+ throw new ForbiddenError(
83
+ `Not allowed to access ${resourceType}:${resourceId}`,
84
+ );
85
+ }
86
+ return access;
87
+ }
88
+
89
+ export function normalizeHistoryVisibility(
90
+ visibility: Visibility | null | undefined,
91
+ ): Visibility {
92
+ return visibility === "org" || visibility === "public"
93
+ ? visibility
94
+ : "private";
95
+ }
96
+
97
+ export function __resetVersionedResourcesForTests(): void {
98
+ registrations.clear();
99
+ }
@@ -0,0 +1,348 @@
1
+ import { getDbExec, intType, isPostgres } from "../db/client.js";
2
+ import { ensureIndexExists, ensureTableExists } from "../db/ddl-guard.js";
3
+ import type { Visibility } from "../sharing/schema.js";
4
+ import type {
5
+ HistoryActorKind,
6
+ ResourceHistoryScope,
7
+ ResourceVersion,
8
+ } from "./types.js";
9
+
10
+ let historyTableInitPromise: Promise<void> | undefined;
11
+
12
+ export interface InsertResourceVersionInput {
13
+ resourceType: string;
14
+ resourceId: string;
15
+ createdBy?: string | null;
16
+ actorKind?: HistoryActorKind;
17
+ ownerEmail?: string | null;
18
+ orgId?: string | null;
19
+ visibility?: Visibility | null;
20
+ title?: string | null;
21
+ summary?: string | null;
22
+ snapshot: unknown;
23
+ metadata?: Record<string, unknown> | null;
24
+ }
25
+
26
+ export interface QueryResourceVersionsInput {
27
+ resourceType: string;
28
+ resourceId: string;
29
+ scope: ResourceHistoryScope;
30
+ bypassScope?: boolean;
31
+ limit?: number;
32
+ offset?: number;
33
+ }
34
+
35
+ export async function ensureResourceVersionsTable(): Promise<void> {
36
+ if (!historyTableInitPromise) {
37
+ historyTableInitPromise = (async () => {
38
+ const client = getDbExec();
39
+ const createSql = `CREATE TABLE IF NOT EXISTS agent_resource_versions (
40
+ id TEXT PRIMARY KEY,
41
+ resource_type TEXT NOT NULL,
42
+ resource_id TEXT NOT NULL,
43
+ version_number ${intType()} NOT NULL,
44
+ created_at TEXT NOT NULL,
45
+ created_by TEXT,
46
+ actor_kind TEXT NOT NULL DEFAULT 'human',
47
+ owner_email TEXT,
48
+ org_id TEXT,
49
+ visibility TEXT NOT NULL DEFAULT 'private',
50
+ title TEXT,
51
+ summary TEXT,
52
+ snapshot_json TEXT NOT NULL,
53
+ metadata_json TEXT
54
+ )`;
55
+ const indexes = [
56
+ `CREATE INDEX IF NOT EXISTS idx_agent_resource_versions_resource
57
+ ON agent_resource_versions (resource_type, resource_id, version_number)`,
58
+ `CREATE INDEX IF NOT EXISTS idx_agent_resource_versions_owner
59
+ ON agent_resource_versions (owner_email, created_at)`,
60
+ `CREATE INDEX IF NOT EXISTS idx_agent_resource_versions_org
61
+ ON agent_resource_versions (org_id, created_at)`,
62
+ ];
63
+
64
+ if (isPostgres()) {
65
+ await ensureTableExists("agent_resource_versions", createSql);
66
+ await ensureIndexExists(
67
+ "idx_agent_resource_versions_resource",
68
+ indexes[0],
69
+ );
70
+ await ensureIndexExists(
71
+ "idx_agent_resource_versions_owner",
72
+ indexes[1],
73
+ );
74
+ await ensureIndexExists("idx_agent_resource_versions_org", indexes[2]);
75
+ } else {
76
+ await client.execute(createSql);
77
+ for (const indexSql of indexes) {
78
+ await client.execute(indexSql);
79
+ }
80
+ }
81
+ })();
82
+ }
83
+
84
+ await historyTableInitPromise;
85
+ }
86
+
87
+ export async function insertResourceVersion(
88
+ input: InsertResourceVersionInput,
89
+ ): Promise<ResourceVersion> {
90
+ await ensureResourceVersionsTable();
91
+ const client = getDbExec();
92
+ const maxRows = await client.execute({
93
+ sql: `SELECT MAX(version_number) as max_version
94
+ FROM agent_resource_versions
95
+ WHERE resource_type = ? AND resource_id = ?`,
96
+ args: [input.resourceType, input.resourceId],
97
+ });
98
+ const versionNumber =
99
+ Number(
100
+ (maxRows.rows?.[0] as Record<string, unknown> | undefined)?.max_version ??
101
+ 0,
102
+ ) + 1;
103
+ const id = createVersionId();
104
+ const createdAt = new Date().toISOString();
105
+ const version: ResourceVersion = {
106
+ id,
107
+ resourceType: input.resourceType,
108
+ resourceId: input.resourceId,
109
+ versionNumber,
110
+ createdAt,
111
+ createdBy: input.createdBy ?? null,
112
+ actorKind: input.actorKind ?? "human",
113
+ ownerEmail: input.ownerEmail ?? input.createdBy ?? null,
114
+ orgId: input.orgId ?? null,
115
+ visibility:
116
+ input.visibility === "org" || input.visibility === "public"
117
+ ? input.visibility
118
+ : "private",
119
+ title: input.title ?? null,
120
+ summary: input.summary ?? null,
121
+ snapshot: input.snapshot,
122
+ metadata: input.metadata ?? null,
123
+ };
124
+
125
+ await client.execute({
126
+ sql: `INSERT INTO agent_resource_versions (
127
+ id,
128
+ resource_type,
129
+ resource_id,
130
+ version_number,
131
+ created_at,
132
+ created_by,
133
+ actor_kind,
134
+ owner_email,
135
+ org_id,
136
+ visibility,
137
+ title,
138
+ summary,
139
+ snapshot_json,
140
+ metadata_json
141
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
142
+ args: [
143
+ version.id,
144
+ version.resourceType,
145
+ version.resourceId,
146
+ version.versionNumber,
147
+ version.createdAt,
148
+ version.createdBy,
149
+ version.actorKind,
150
+ version.ownerEmail,
151
+ version.orgId,
152
+ version.visibility,
153
+ version.title,
154
+ version.summary,
155
+ JSON.stringify(version.snapshot),
156
+ stringifyOptionalJson(version.metadata),
157
+ ],
158
+ });
159
+
160
+ return version;
161
+ }
162
+
163
+ export async function queryResourceVersions(
164
+ input: QueryResourceVersionsInput,
165
+ ): Promise<ResourceVersion[]> {
166
+ await ensureResourceVersionsTable();
167
+ const client = getDbExec();
168
+ const { clause, params } = input.bypassScope
169
+ ? { clause: "1 = 1", params: [] as unknown[] }
170
+ : scopedResourceClause(input.scope);
171
+ const limit = clampLimit(input.limit);
172
+ const offset = Math.max(0, Math.floor(input.offset ?? 0));
173
+ const result = await client.execute({
174
+ sql: `SELECT ${listColumns()}
175
+ FROM agent_resource_versions
176
+ WHERE resource_type = ? AND resource_id = ? AND ${clause}
177
+ ORDER BY version_number DESC
178
+ LIMIT ? OFFSET ?`,
179
+ args: [input.resourceType, input.resourceId, ...params, limit, offset],
180
+ });
181
+ return (result.rows ?? []).map((row) => mapVersionRow(row, false));
182
+ }
183
+
184
+ export async function getResourceVersionById(
185
+ id: string,
186
+ scope: ResourceHistoryScope,
187
+ options: { bypassScope?: boolean } = {},
188
+ ): Promise<ResourceVersion | null> {
189
+ await ensureResourceVersionsTable();
190
+ const client = getDbExec();
191
+ const { clause, params } = options.bypassScope
192
+ ? { clause: "1 = 1", params: [] as unknown[] }
193
+ : scopedResourceClause(scope);
194
+ const result = await client.execute({
195
+ sql: `SELECT ${allColumns()}
196
+ FROM agent_resource_versions
197
+ WHERE id = ? AND ${clause}
198
+ LIMIT 1`,
199
+ args: [id, ...params],
200
+ });
201
+ const row = result.rows?.[0];
202
+ return row ? mapVersionRow(row, true) : null;
203
+ }
204
+
205
+ export async function getResourceVersionByNumber(
206
+ resourceType: string,
207
+ resourceId: string,
208
+ versionNumber: number,
209
+ scope: ResourceHistoryScope,
210
+ options: { bypassScope?: boolean } = {},
211
+ ): Promise<ResourceVersion | null> {
212
+ await ensureResourceVersionsTable();
213
+ const client = getDbExec();
214
+ const { clause, params } = options.bypassScope
215
+ ? { clause: "1 = 1", params: [] as unknown[] }
216
+ : scopedResourceClause(scope);
217
+ const result = await client.execute({
218
+ sql: `SELECT ${allColumns()}
219
+ FROM agent_resource_versions
220
+ WHERE resource_type = ?
221
+ AND resource_id = ?
222
+ AND version_number = ?
223
+ AND ${clause}
224
+ LIMIT 1`,
225
+ args: [resourceType, resourceId, versionNumber, ...params],
226
+ });
227
+ const row = result.rows?.[0];
228
+ return row ? mapVersionRow(row, true) : null;
229
+ }
230
+
231
+ export function __resetHistoryInitForTests(): void {
232
+ historyTableInitPromise = undefined;
233
+ }
234
+
235
+ function listColumns(): string {
236
+ return [
237
+ "id",
238
+ "resource_type",
239
+ "resource_id",
240
+ "version_number",
241
+ "created_at",
242
+ "created_by",
243
+ "actor_kind",
244
+ "owner_email",
245
+ "org_id",
246
+ "visibility",
247
+ "title",
248
+ "summary",
249
+ "metadata_json",
250
+ ].join(", ");
251
+ }
252
+
253
+ function allColumns(): string {
254
+ return `${listColumns()}, snapshot_json`;
255
+ }
256
+
257
+ function scopedResourceClause(scope: ResourceHistoryScope): {
258
+ clause: string;
259
+ params: unknown[];
260
+ } {
261
+ const parts: string[] = [];
262
+ const params: unknown[] = [];
263
+
264
+ if (scope.userEmail) {
265
+ parts.push("owner_email = ?");
266
+ params.push(scope.userEmail);
267
+ }
268
+ if (scope.orgId) {
269
+ parts.push("(visibility = 'org' AND org_id = ?)");
270
+ params.push(scope.orgId);
271
+ }
272
+ parts.push("visibility = 'public'");
273
+
274
+ if (parts.length === 0) {
275
+ return { clause: "visibility = 'public'", params: [] };
276
+ }
277
+
278
+ return { clause: `(${parts.join(" OR ")})`, params };
279
+ }
280
+
281
+ function mapVersionRow(
282
+ row: Record<string, unknown>,
283
+ includeSnapshot: boolean,
284
+ ): ResourceVersion {
285
+ const version: ResourceVersion = {
286
+ id: String(row.id),
287
+ resourceType: String(row.resource_type),
288
+ resourceId: String(row.resource_id),
289
+ versionNumber: Number(row.version_number),
290
+ createdAt: String(row.created_at),
291
+ createdBy: nullableString(row.created_by),
292
+ actorKind: normalizeActorKind(row.actor_kind),
293
+ ownerEmail: nullableString(row.owner_email),
294
+ orgId: nullableString(row.org_id),
295
+ visibility: normalizeVisibility(row.visibility),
296
+ title: nullableString(row.title),
297
+ summary: nullableString(row.summary),
298
+ metadata: parseOptionalJson(row.metadata_json),
299
+ };
300
+ if (includeSnapshot) {
301
+ version.snapshot = parseRequiredJson(row.snapshot_json);
302
+ }
303
+ return version;
304
+ }
305
+
306
+ function createVersionId(): string {
307
+ return `ver_${globalThis.crypto.randomUUID()}`;
308
+ }
309
+
310
+ function clampLimit(value: number | undefined): number {
311
+ if (!Number.isFinite(value)) {
312
+ return 50;
313
+ }
314
+ return Math.min(200, Math.max(1, Math.floor(value ?? 50)));
315
+ }
316
+
317
+ function nullableString(value: unknown): string | null {
318
+ return value === null || value === undefined ? null : String(value);
319
+ }
320
+
321
+ function normalizeVisibility(value: unknown): Visibility {
322
+ return value === "org" || value === "public" ? value : "private";
323
+ }
324
+
325
+ function normalizeActorKind(value: unknown): HistoryActorKind {
326
+ return value === "agent" || value === "system" ? value : "human";
327
+ }
328
+
329
+ function stringifyOptionalJson(value: unknown): string | null {
330
+ return value === null || value === undefined ? null : JSON.stringify(value);
331
+ }
332
+
333
+ function parseOptionalJson(value: unknown): Record<string, unknown> | null {
334
+ if (value === null || value === undefined || value === "") {
335
+ return null;
336
+ }
337
+ const parsed = parseRequiredJson(value);
338
+ return typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)
339
+ ? (parsed as Record<string, unknown>)
340
+ : null;
341
+ }
342
+
343
+ function parseRequiredJson(value: unknown): unknown {
344
+ if (typeof value !== "string") {
345
+ return value;
346
+ }
347
+ return JSON.parse(value);
348
+ }
@@ -0,0 +1,69 @@
1
+ import type { Visibility } from "../sharing/schema.js";
2
+
3
+ export type HistoryActorKind = "human" | "agent" | "system";
4
+ export type HistoryResourceRole = "viewer" | "editor" | "admin" | "owner";
5
+
6
+ export interface VersionedResourceAccess {
7
+ role: HistoryResourceRole;
8
+ ownerEmail?: string | null;
9
+ orgId?: string | null;
10
+ visibility?: Visibility | null;
11
+ resource?: unknown;
12
+ }
13
+
14
+ export interface VersionedResourceContext {
15
+ userEmail?: string | null;
16
+ orgId?: string | null;
17
+ caller?: string | null;
18
+ request?: unknown;
19
+ [key: string]: unknown;
20
+ }
21
+
22
+ export interface VersionedResourceSnapshotContext {
23
+ resourceType: string;
24
+ resourceId: string;
25
+ ctx?: VersionedResourceContext;
26
+ access?: VersionedResourceAccess;
27
+ }
28
+
29
+ export interface VersionedResourceRestoreContext extends VersionedResourceSnapshotContext {
30
+ version: ResourceVersion;
31
+ snapshot: unknown;
32
+ }
33
+
34
+ export interface VersionedResourceRegistration {
35
+ type: string;
36
+ displayName?: string;
37
+ resolveAccess?: (
38
+ resourceId: string,
39
+ ctx?: VersionedResourceContext,
40
+ ) => Promise<VersionedResourceAccess | null> | VersionedResourceAccess | null;
41
+ getSnapshot?: (
42
+ context: VersionedResourceSnapshotContext,
43
+ ) => Promise<unknown> | unknown;
44
+ restoreSnapshot?: (
45
+ context: VersionedResourceRestoreContext,
46
+ ) => Promise<unknown> | unknown;
47
+ }
48
+
49
+ export interface ResourceVersion {
50
+ id: string;
51
+ resourceType: string;
52
+ resourceId: string;
53
+ versionNumber: number;
54
+ createdAt: string;
55
+ createdBy: string | null;
56
+ actorKind: HistoryActorKind;
57
+ ownerEmail: string | null;
58
+ orgId: string | null;
59
+ visibility: Visibility;
60
+ title: string | null;
61
+ summary: string | null;
62
+ snapshot?: unknown;
63
+ metadata: Record<string, unknown> | null;
64
+ }
65
+
66
+ export interface ResourceHistoryScope {
67
+ userEmail?: string | null;
68
+ orgId?: string | null;
69
+ }
@@ -336,3 +336,13 @@ export {
336
336
  type SecretValidator,
337
337
  type SecretRef,
338
338
  } from "./secrets/index.js";
339
+
340
+ export * from "./history/index.js";
341
+ export * from "./review/index.js";
342
+ export * from "./org-team/index.js";
343
+ export * from "./navigation/index.js";
344
+ export * from "./command-navigation/index.js";
345
+ export {
346
+ registerWorkspaceConnectionOnboardingStep,
347
+ type RegisterWorkspaceConnectionOnboardingStepOptions,
348
+ } from "./setup-connections/index.js";