@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,278 @@
1
+ import {
2
+ IconMessageCircle,
3
+ IconPlus,
4
+ IconSend,
5
+ IconTrash,
6
+ IconCircleCheck,
7
+ } from "@tabler/icons-react";
8
+ import { useMemo, useState } from "react";
9
+
10
+ import type { ReviewComment } from "../../review/types.js";
11
+ import { cn } from "../utils.js";
12
+ import { ReviewStatusBadge } from "./ReviewStatusBadge.js";
13
+ import {
14
+ useCreateReviewComment,
15
+ useDeleteReviewComment,
16
+ useReplyReviewComment,
17
+ useResolveReviewThread,
18
+ useReviewComments,
19
+ } from "./use-review.js";
20
+
21
+ export interface ReviewThread {
22
+ root: ReviewComment;
23
+ replies: ReviewComment[];
24
+ }
25
+
26
+ export interface ReviewThreadPanelProps {
27
+ resourceType: string;
28
+ resourceId: string;
29
+ targetId?: string | null;
30
+ title?: string;
31
+ className?: string;
32
+ includeResolved?: boolean;
33
+ showComposer?: boolean;
34
+ placeholder?: string;
35
+ emptyState?: string;
36
+ onSelectThread?: (thread: ReviewThread) => void;
37
+ }
38
+
39
+ export function ReviewThreadPanel({
40
+ resourceType,
41
+ resourceId,
42
+ targetId,
43
+ title = "Review",
44
+ className,
45
+ includeResolved = true,
46
+ showComposer = true,
47
+ placeholder = "Add a comment...",
48
+ emptyState = "No review comments yet.",
49
+ onSelectThread,
50
+ }: ReviewThreadPanelProps) {
51
+ const [draft, setDraft] = useState("");
52
+ const [replyDrafts, setReplyDrafts] = useState<Record<string, string>>({});
53
+ const comments = useReviewComments({
54
+ resourceType,
55
+ resourceId,
56
+ targetId,
57
+ includeResolved,
58
+ });
59
+ const createComment = useCreateReviewComment();
60
+ const replyComment = useReplyReviewComment();
61
+ const resolveThread = useResolveReviewThread();
62
+ const deleteComment = useDeleteReviewComment();
63
+ const threads = useMemo(
64
+ () => buildReviewThreads(comments.data?.comments ?? []),
65
+ [comments.data?.comments],
66
+ );
67
+
68
+ return (
69
+ <section
70
+ className={cn(
71
+ "rounded-lg border border-border bg-card text-card-foreground",
72
+ className,
73
+ )}
74
+ >
75
+ <div className="flex items-center justify-between gap-3 border-b border-border px-4 py-3">
76
+ <div className="flex items-center gap-2">
77
+ <IconMessageCircle className="h-4 w-4 text-muted-foreground" />
78
+ <h2 className="text-sm font-medium">{title}</h2>
79
+ </div>
80
+ <ReviewStatusBadge status={comments.data?.reviewStatus?.status} />
81
+ </div>
82
+
83
+ {showComposer ? (
84
+ <form
85
+ className="border-b border-border p-3"
86
+ onSubmit={(event) => {
87
+ event.preventDefault();
88
+ const body = draft.trim();
89
+ if (!body) return;
90
+ createComment.mutate(
91
+ { resourceType, resourceId, targetId, body },
92
+ { onSuccess: () => setDraft("") },
93
+ );
94
+ }}
95
+ >
96
+ <textarea
97
+ value={draft}
98
+ onChange={(event) => setDraft(event.currentTarget.value)}
99
+ placeholder={placeholder}
100
+ className="min-h-20 w-full resize-y rounded-md border border-input bg-background px-3 py-2 text-sm outline-none focus:ring-2 focus:ring-ring"
101
+ />
102
+ <div className="mt-2 flex justify-end">
103
+ <button
104
+ type="submit"
105
+ disabled={!draft.trim() || createComment.isPending}
106
+ className="inline-flex h-8 items-center gap-1.5 rounded-md bg-primary px-3 text-xs font-medium text-primary-foreground hover:bg-primary/90 disabled:cursor-not-allowed disabled:opacity-50"
107
+ >
108
+ <IconPlus className="h-3.5 w-3.5" />
109
+ Comment
110
+ </button>
111
+ </div>
112
+ </form>
113
+ ) : null}
114
+
115
+ <div className="divide-y divide-border">
116
+ {comments.isLoading ? (
117
+ <div className="px-4 py-6 text-sm text-muted-foreground">
118
+ Loading comments...
119
+ </div>
120
+ ) : threads.length ? (
121
+ threads.map((thread) => (
122
+ <article
123
+ key={thread.root.threadId}
124
+ className="px-4 py-3"
125
+ onClick={() => onSelectThread?.(thread)}
126
+ >
127
+ <CommentBubble comment={thread.root} />
128
+ {thread.replies.length ? (
129
+ <div className="mt-3 space-y-3 border-l border-border pl-4">
130
+ {thread.replies.map((reply) => (
131
+ <CommentBubble key={reply.id} comment={reply} compact />
132
+ ))}
133
+ </div>
134
+ ) : null}
135
+ <form
136
+ className="mt-3 flex gap-2"
137
+ onSubmit={(event) => {
138
+ event.preventDefault();
139
+ const body = replyDrafts[thread.root.id]?.trim();
140
+ if (!body) return;
141
+ replyComment.mutate(
142
+ {
143
+ resourceType,
144
+ resourceId,
145
+ commentId: thread.root.id,
146
+ body,
147
+ },
148
+ {
149
+ onSuccess: () =>
150
+ setReplyDrafts((current) => ({
151
+ ...current,
152
+ [thread.root.id]: "",
153
+ })),
154
+ },
155
+ );
156
+ }}
157
+ >
158
+ <input
159
+ value={replyDrafts[thread.root.id] ?? ""}
160
+ onChange={(event) =>
161
+ setReplyDrafts((current) => ({
162
+ ...current,
163
+ [thread.root.id]: event.currentTarget.value,
164
+ }))
165
+ }
166
+ placeholder="Reply..."
167
+ className="h-8 min-w-0 flex-1 rounded-md border border-input bg-background px-3 text-sm outline-none focus:ring-2 focus:ring-ring"
168
+ />
169
+ <button
170
+ type="submit"
171
+ disabled={
172
+ !replyDrafts[thread.root.id]?.trim() ||
173
+ replyComment.isPending
174
+ }
175
+ className="inline-flex h-8 w-8 items-center justify-center rounded-md border border-input hover:bg-accent disabled:cursor-not-allowed disabled:opacity-50"
176
+ aria-label="Reply"
177
+ >
178
+ <IconSend className="h-3.5 w-3.5" />
179
+ </button>
180
+ {thread.root.status !== "resolved" ? (
181
+ <button
182
+ type="button"
183
+ className="inline-flex h-8 w-8 items-center justify-center rounded-md border border-input hover:bg-accent"
184
+ aria-label="Resolve thread"
185
+ onClick={() =>
186
+ resolveThread.mutate({
187
+ resourceType,
188
+ resourceId,
189
+ threadId: thread.root.threadId,
190
+ })
191
+ }
192
+ >
193
+ <IconCircleCheck className="h-3.5 w-3.5" />
194
+ </button>
195
+ ) : null}
196
+ <button
197
+ type="button"
198
+ className="inline-flex h-8 w-8 items-center justify-center rounded-md border border-input text-muted-foreground hover:bg-accent"
199
+ aria-label="Delete comment"
200
+ onClick={() =>
201
+ deleteComment.mutate({
202
+ resourceType,
203
+ resourceId,
204
+ commentId: thread.root.id,
205
+ })
206
+ }
207
+ >
208
+ <IconTrash className="h-3.5 w-3.5" />
209
+ </button>
210
+ </form>
211
+ </article>
212
+ ))
213
+ ) : (
214
+ <div className="px-4 py-6 text-sm text-muted-foreground">
215
+ {emptyState}
216
+ </div>
217
+ )}
218
+ </div>
219
+ </section>
220
+ );
221
+ }
222
+
223
+ export function buildReviewThreads(comments: ReviewComment[]): ReviewThread[] {
224
+ const roots: ReviewComment[] = [];
225
+ const replies = new Map<string, ReviewComment[]>();
226
+
227
+ for (const comment of comments) {
228
+ if (!comment.parentCommentId || comment.parentCommentId === comment.id) {
229
+ roots.push(comment);
230
+ continue;
231
+ }
232
+ const list = replies.get(comment.threadId) ?? [];
233
+ list.push(comment);
234
+ replies.set(comment.threadId, list);
235
+ }
236
+
237
+ return roots.map((root) => ({
238
+ root,
239
+ replies: replies.get(root.threadId) ?? [],
240
+ }));
241
+ }
242
+
243
+ function CommentBubble({
244
+ comment,
245
+ compact = false,
246
+ }: {
247
+ comment: ReviewComment;
248
+ compact?: boolean;
249
+ }) {
250
+ return (
251
+ <div className={compact ? "text-sm" : ""}>
252
+ <div className="flex flex-wrap items-center gap-2">
253
+ <span className="text-sm font-medium">
254
+ {comment.authorName ?? comment.authorEmail ?? "Reviewer"}
255
+ </span>
256
+ <span className="text-xs text-muted-foreground">
257
+ {formatCommentDate(comment.createdAt)}
258
+ </span>
259
+ {comment.status === "resolved" ? (
260
+ <span className="rounded-full bg-emerald-50 px-2 py-0.5 text-xs text-emerald-700">
261
+ Resolved
262
+ </span>
263
+ ) : null}
264
+ </div>
265
+ <p className="mt-1 whitespace-pre-wrap text-sm text-foreground">
266
+ {comment.body}
267
+ </p>
268
+ </div>
269
+ );
270
+ }
271
+
272
+ function formatCommentDate(value: string): string {
273
+ const date = new Date(value);
274
+ if (Number.isNaN(date.getTime())) {
275
+ return value;
276
+ }
277
+ return date.toLocaleString();
278
+ }
@@ -0,0 +1,25 @@
1
+ export {
2
+ ReviewStatusBadge,
3
+ type ReviewStatusBadgeProps,
4
+ } from "./ReviewStatusBadge.js";
5
+ export {
6
+ ReviewThreadPanel,
7
+ buildReviewThreads,
8
+ type ReviewThread,
9
+ type ReviewThreadPanelProps,
10
+ } from "./ReviewThreadPanel.js";
11
+ export {
12
+ useCreateReviewComment,
13
+ useDeleteReviewComment,
14
+ useReplyReviewComment,
15
+ useResolveReviewThread,
16
+ useReviewComments,
17
+ useSetReviewStatus,
18
+ type CreateReviewCommentInput,
19
+ type DeleteReviewCommentInput,
20
+ type ListReviewCommentsParams,
21
+ type ListReviewCommentsResult,
22
+ type ReplyReviewCommentInput,
23
+ type ResolveReviewThreadInput,
24
+ type SetReviewStatusInput,
25
+ } from "./use-review.js";
@@ -0,0 +1,114 @@
1
+ import type {
2
+ ReviewComment,
3
+ ReviewCommentKind,
4
+ ReviewMention,
5
+ ReviewResolutionTarget,
6
+ ReviewStatus,
7
+ ReviewStatusEntry,
8
+ } from "../../review/types.js";
9
+ import { useActionMutation, useActionQuery } from "../use-action.js";
10
+
11
+ export interface ListReviewCommentsParams {
12
+ resourceType: string;
13
+ resourceId: string;
14
+ includeResolved?: boolean;
15
+ includeDeleted?: boolean;
16
+ targetId?: string | null;
17
+ limit?: number;
18
+ }
19
+
20
+ export interface ListReviewCommentsResult {
21
+ comments: ReviewComment[];
22
+ reviewStatus: ReviewStatusEntry | null;
23
+ }
24
+
25
+ export interface CreateReviewCommentInput {
26
+ resourceType: string;
27
+ resourceId: string;
28
+ targetId?: string | null;
29
+ kind?: ReviewCommentKind;
30
+ anchor?: unknown | null;
31
+ body: string;
32
+ authorName?: string | null;
33
+ resolutionTarget?: ReviewResolutionTarget | null;
34
+ mentions?: ReviewMention[];
35
+ metadata?: Record<string, unknown>;
36
+ }
37
+
38
+ export interface ReplyReviewCommentInput {
39
+ resourceType: string;
40
+ resourceId: string;
41
+ commentId: string;
42
+ body: string;
43
+ authorName?: string | null;
44
+ resolutionTarget?: ReviewResolutionTarget | null;
45
+ mentions?: ReviewMention[];
46
+ metadata?: Record<string, unknown>;
47
+ }
48
+
49
+ export interface ResolveReviewThreadInput {
50
+ resourceType: string;
51
+ resourceId: string;
52
+ threadId?: string;
53
+ commentId?: string;
54
+ }
55
+
56
+ export interface DeleteReviewCommentInput {
57
+ resourceType: string;
58
+ resourceId: string;
59
+ commentId: string;
60
+ }
61
+
62
+ export interface SetReviewStatusInput {
63
+ resourceType: string;
64
+ resourceId: string;
65
+ status: ReviewStatus;
66
+ note?: string | null;
67
+ metadata?: Record<string, unknown>;
68
+ }
69
+
70
+ export function useReviewComments(
71
+ params: ListReviewCommentsParams,
72
+ options?: { enabled?: boolean },
73
+ ) {
74
+ return useActionQuery<ListReviewCommentsResult>(
75
+ "list-review-comments",
76
+ params,
77
+ {
78
+ enabled:
79
+ options?.enabled ?? Boolean(params.resourceType && params.resourceId),
80
+ },
81
+ );
82
+ }
83
+
84
+ export function useCreateReviewComment() {
85
+ return useActionMutation<ReviewComment, CreateReviewCommentInput>(
86
+ "create-review-comment",
87
+ );
88
+ }
89
+
90
+ export function useReplyReviewComment() {
91
+ return useActionMutation<ReviewComment, ReplyReviewCommentInput>(
92
+ "reply-review-comment",
93
+ );
94
+ }
95
+
96
+ export function useResolveReviewThread() {
97
+ return useActionMutation<
98
+ { threadId: string; resolved: true },
99
+ ResolveReviewThreadInput
100
+ >("resolve-review-thread");
101
+ }
102
+
103
+ export function useDeleteReviewComment() {
104
+ return useActionMutation<
105
+ { commentId: string; deleted: true },
106
+ DeleteReviewCommentInput
107
+ >("delete-review-comment");
108
+ }
109
+
110
+ export function useSetReviewStatus() {
111
+ return useActionMutation<ReviewStatusEntry, SetReviewStatusInput>(
112
+ "set-review-status",
113
+ );
114
+ }
@@ -8,5 +8,15 @@ export {
8
8
  type SettingsTabItem,
9
9
  type SettingsTabsPageProps,
10
10
  } from "./SettingsTabsPage.js";
11
- export { useBuilderStatus } from "./useBuilderStatus.js";
11
+ export {
12
+ openBuilderConnectPopup,
13
+ useBuilderConnectFlow,
14
+ useBuilderStatus,
15
+ withBuilderConnectTrackingParams,
16
+ type BuilderConnectFlow,
17
+ type BuilderConnectFlowOptions,
18
+ type BuilderConnectStartOptions,
19
+ type BuilderStatus,
20
+ type OpenBuilderConnectPopupOptions,
21
+ } from "./useBuilderStatus.js";
12
22
  export { SecretsSection, type SecretsSectionProps } from "./SecretsSection.js";
@@ -0,0 +1,94 @@
1
+ import { IconCheck, IconLoader2, IconPlugConnected } from "@tabler/icons-react";
2
+
3
+ import { useBuilderConnectFlow } from "../settings/useBuilderStatus.js";
4
+ import { cn } from "../utils.js";
5
+
6
+ export interface BuilderConnectCardProps {
7
+ title?: string;
8
+ description?: string;
9
+ trackingSource?: string;
10
+ className?: string;
11
+ onConnected?: (orgName: string | null) => void;
12
+ }
13
+
14
+ export function BuilderConnectCard({
15
+ title = "Builder connect",
16
+ description = "Connect Builder for managed model access, browser automation, and workspace identity.",
17
+ trackingSource = "setup_connections_page",
18
+ className,
19
+ onConnected,
20
+ }: BuilderConnectCardProps) {
21
+ const flow = useBuilderConnectFlow({
22
+ trackingSource,
23
+ onConnected: ({ orgName }) => onConnected?.(orgName),
24
+ });
25
+
26
+ const connectedLabel = flow.orgName
27
+ ? `Connected to ${flow.orgName}`
28
+ : "Connected";
29
+ const statusLabel = !flow.hasFetchedStatus
30
+ ? "Checking"
31
+ : flow.configured
32
+ ? connectedLabel
33
+ : flow.builderEnabled
34
+ ? "Ready to connect"
35
+ : "Project not configured";
36
+
37
+ return (
38
+ <section
39
+ className={cn(
40
+ "rounded-lg border border-border bg-background p-4 shadow-sm",
41
+ className,
42
+ )}
43
+ >
44
+ <div className="flex items-start gap-3">
45
+ <span
46
+ className={cn(
47
+ "mt-0.5 flex size-8 shrink-0 items-center justify-center rounded-md border",
48
+ flow.configured
49
+ ? "border-emerald-500/30 bg-emerald-500/10 text-emerald-600"
50
+ : "border-border bg-muted text-muted-foreground",
51
+ )}
52
+ >
53
+ {flow.configured ? (
54
+ <IconCheck className="size-4" />
55
+ ) : (
56
+ <IconPlugConnected className="size-4" />
57
+ )}
58
+ </span>
59
+ <div className="min-w-0 flex-1">
60
+ <div className="flex flex-wrap items-center gap-2">
61
+ <h2 className="text-sm font-semibold text-foreground">{title}</h2>
62
+ <span className="rounded-md border border-border bg-muted px-1.5 py-0.5 text-[11px] font-medium text-muted-foreground">
63
+ {statusLabel}
64
+ </span>
65
+ </div>
66
+ <p className="mt-1 text-sm leading-5 text-muted-foreground">
67
+ {description}
68
+ </p>
69
+ {flow.error ? (
70
+ <p className="mt-2 text-xs text-destructive">{flow.error}</p>
71
+ ) : null}
72
+ {!flow.configured ? (
73
+ <button
74
+ type="button"
75
+ onClick={() => flow.start()}
76
+ disabled={
77
+ flow.connecting ||
78
+ (!flow.builderEnabled && flow.hasFetchedStatus)
79
+ }
80
+ className="mt-3 inline-flex h-8 items-center gap-2 rounded-md border border-border bg-foreground px-3 text-xs font-medium text-background transition-colors hover:bg-foreground/90 disabled:cursor-not-allowed disabled:opacity-60"
81
+ >
82
+ {flow.connecting ? (
83
+ <IconLoader2 className="size-3.5 animate-spin" />
84
+ ) : (
85
+ <IconPlugConnected className="size-3.5" />
86
+ )}
87
+ Connect Builder
88
+ </button>
89
+ ) : null}
90
+ </div>
91
+ </div>
92
+ </section>
93
+ );
94
+ }
@@ -0,0 +1,73 @@
1
+ import {
2
+ IconAlertCircle,
3
+ IconCheck,
4
+ IconClock,
5
+ IconKey,
6
+ } from "@tabler/icons-react";
7
+
8
+ import type { WorkspaceConnectionProviderReadinessStatus } from "../../workspace-connections/index.js";
9
+ import { cn } from "../utils.js";
10
+
11
+ const STATUS_LABELS: Record<
12
+ WorkspaceConnectionProviderReadinessStatus,
13
+ string
14
+ > = {
15
+ ready: "Ready",
16
+ checking: "Checking",
17
+ needs_credentials: "Needs credentials",
18
+ needs_attention: "Needs attention",
19
+ disabled: "Disabled",
20
+ not_configured: "Not configured",
21
+ };
22
+
23
+ const STATUS_STYLES: Record<
24
+ WorkspaceConnectionProviderReadinessStatus,
25
+ string
26
+ > = {
27
+ ready:
28
+ "border-emerald-500/30 bg-emerald-500/10 text-emerald-700 dark:text-emerald-300",
29
+ checking:
30
+ "border-blue-500/30 bg-blue-500/10 text-blue-700 dark:text-blue-300",
31
+ needs_credentials:
32
+ "border-amber-500/30 bg-amber-500/10 text-amber-700 dark:text-amber-300",
33
+ needs_attention:
34
+ "border-red-500/30 bg-red-500/10 text-red-700 dark:text-red-300",
35
+ disabled: "border-border bg-muted text-muted-foreground",
36
+ not_configured: "border-border bg-muted text-muted-foreground",
37
+ };
38
+
39
+ function StatusIcon({
40
+ status,
41
+ }: {
42
+ status: WorkspaceConnectionProviderReadinessStatus;
43
+ }) {
44
+ if (status === "ready") return <IconCheck className="size-3.5" />;
45
+ if (status === "checking") return <IconClock className="size-3.5" />;
46
+ if (status === "needs_credentials") return <IconKey className="size-3.5" />;
47
+ return <IconAlertCircle className="size-3.5" />;
48
+ }
49
+
50
+ export interface ProviderReadinessBadgeProps {
51
+ status: WorkspaceConnectionProviderReadinessStatus;
52
+ label?: string;
53
+ className?: string;
54
+ }
55
+
56
+ export function ProviderReadinessBadge({
57
+ status,
58
+ label,
59
+ className,
60
+ }: ProviderReadinessBadgeProps) {
61
+ return (
62
+ <span
63
+ className={cn(
64
+ "inline-flex min-h-6 items-center gap-1.5 rounded-md border px-2 text-xs font-medium",
65
+ STATUS_STYLES[status],
66
+ className,
67
+ )}
68
+ >
69
+ <StatusIcon status={status} />
70
+ {label ?? STATUS_LABELS[status]}
71
+ </span>
72
+ );
73
+ }
@@ -0,0 +1,94 @@
1
+ import type { ReactNode } from "react";
2
+
3
+ import { IntegrationsPanel } from "../integrations/IntegrationsPanel.js";
4
+ import { OnboardingPanel } from "../onboarding/OnboardingPanel.js";
5
+ import { SecretsSection } from "../settings/SecretsSection.js";
6
+ import { cn } from "../utils.js";
7
+ import { BuilderConnectCard } from "./BuilderConnectCard.js";
8
+
9
+ export interface SetupConnectionsPageProps {
10
+ title?: string;
11
+ description?: string;
12
+ onboardingTitle?: string;
13
+ focusSecretKey?: string;
14
+ providerReadiness?: ReactNode;
15
+ workspaceConnections?: ReactNode;
16
+ children?: ReactNode;
17
+ showOnboarding?: boolean;
18
+ showBuilderConnect?: boolean;
19
+ showSecrets?: boolean;
20
+ showIntegrations?: boolean;
21
+ className?: string;
22
+ }
23
+
24
+ export function SetupConnectionsPage({
25
+ title = "Setup & connections",
26
+ description = "Manage setup status, Builder connect, app secrets, and workspace connections from one standard surface.",
27
+ onboardingTitle = "Setup checklist",
28
+ focusSecretKey,
29
+ providerReadiness,
30
+ workspaceConnections,
31
+ children,
32
+ showOnboarding = true,
33
+ showBuilderConnect = true,
34
+ showSecrets = true,
35
+ showIntegrations = false,
36
+ className,
37
+ }: SetupConnectionsPageProps) {
38
+ return (
39
+ <div className={cn("min-h-full bg-background p-4 sm:p-6", className)}>
40
+ <div className="mx-auto flex w-full max-w-6xl flex-col gap-5">
41
+ <header className="space-y-1">
42
+ <h1 className="text-2xl font-semibold tracking-normal text-foreground">
43
+ {title}
44
+ </h1>
45
+ <p className="max-w-3xl text-sm leading-6 text-muted-foreground">
46
+ {description}
47
+ </p>
48
+ </header>
49
+
50
+ <div className="grid gap-4 lg:grid-cols-[minmax(0,1fr)_360px]">
51
+ <main className="flex min-w-0 flex-col gap-4">
52
+ {showOnboarding ? (
53
+ <OnboardingPanel title={onboardingTitle} />
54
+ ) : null}
55
+ {workspaceConnections ? (
56
+ <section className="rounded-lg border border-border bg-background p-4 shadow-sm">
57
+ {workspaceConnections}
58
+ </section>
59
+ ) : null}
60
+ {providerReadiness ? (
61
+ <section className="rounded-lg border border-border bg-background p-4 shadow-sm">
62
+ {providerReadiness}
63
+ </section>
64
+ ) : null}
65
+ {children}
66
+ </main>
67
+
68
+ <aside className="flex min-w-0 flex-col gap-4">
69
+ {showBuilderConnect ? <BuilderConnectCard /> : null}
70
+ {showSecrets ? (
71
+ <section className="rounded-lg border border-border bg-background p-4 shadow-sm">
72
+ <div className="mb-3">
73
+ <h2 className="text-sm font-semibold text-foreground">
74
+ Secrets
75
+ </h2>
76
+ <p className="mt-1 text-xs leading-5 text-muted-foreground">
77
+ Registered keys and OAuth credentials are stored in the
78
+ scoped secrets store.
79
+ </p>
80
+ </div>
81
+ <SecretsSection focusKey={focusSecretKey} />
82
+ </section>
83
+ ) : null}
84
+ {showIntegrations ? (
85
+ <section className="rounded-lg border border-border bg-background p-4 shadow-sm">
86
+ <IntegrationsPanel />
87
+ </section>
88
+ ) : null}
89
+ </aside>
90
+ </div>
91
+ </div>
92
+ </div>
93
+ );
94
+ }