@vendoai/ui 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (525) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +7 -0
  3. package/dist/chrome/activity-ledger.d.ts +14 -0
  4. package/dist/chrome/activity-ledger.d.ts.map +1 -0
  5. package/dist/chrome/activity-ledger.js +40 -0
  6. package/dist/chrome/activity-ledger.js.map +1 -0
  7. package/dist/chrome/activity-panel.d.ts +7 -0
  8. package/dist/chrome/activity-panel.d.ts.map +1 -0
  9. package/dist/chrome/activity-panel.js +27 -0
  10. package/dist/chrome/activity-panel.js.map +1 -0
  11. package/dist/chrome/activity-semantics.d.ts +42 -0
  12. package/dist/chrome/activity-semantics.d.ts.map +1 -0
  13. package/dist/chrome/activity-semantics.js +119 -0
  14. package/dist/chrome/activity-semantics.js.map +1 -0
  15. package/dist/chrome/approval-card.d.ts +22 -0
  16. package/dist/chrome/approval-card.d.ts.map +1 -0
  17. package/dist/chrome/approval-card.js +95 -0
  18. package/dist/chrome/approval-card.js.map +1 -0
  19. package/dist/chrome/approval-sheet.d.ts +23 -0
  20. package/dist/chrome/approval-sheet.d.ts.map +1 -0
  21. package/dist/chrome/approval-sheet.js +72 -0
  22. package/dist/chrome/approval-sheet.js.map +1 -0
  23. package/dist/chrome/automations-panel.d.ts +3 -0
  24. package/dist/chrome/automations-panel.d.ts.map +1 -0
  25. package/dist/chrome/automations-panel.js +305 -0
  26. package/dist/chrome/automations-panel.js.map +1 -0
  27. package/dist/chrome/build-beat.d.ts +70 -0
  28. package/dist/chrome/build-beat.d.ts.map +1 -0
  29. package/dist/chrome/build-beat.js +101 -0
  30. package/dist/chrome/build-beat.js.map +1 -0
  31. package/dist/chrome/chrome-css.d.ts +7 -0
  32. package/dist/chrome/chrome-css.d.ts.map +1 -0
  33. package/dist/chrome/chrome-css.js +2042 -0
  34. package/dist/chrome/chrome-css.js.map +1 -0
  35. package/dist/chrome/chrome-root.d.ts +13 -0
  36. package/dist/chrome/chrome-root.d.ts.map +1 -0
  37. package/dist/chrome/chrome-root.js +39 -0
  38. package/dist/chrome/chrome-root.js.map +1 -0
  39. package/dist/chrome/clipboard.d.ts +4 -0
  40. package/dist/chrome/clipboard.d.ts.map +1 -0
  41. package/dist/chrome/clipboard.js +49 -0
  42. package/dist/chrome/clipboard.js.map +1 -0
  43. package/dist/chrome/connect-card.d.ts +19 -0
  44. package/dist/chrome/connect-card.d.ts.map +1 -0
  45. package/dist/chrome/connect-card.js +57 -0
  46. package/dist/chrome/connect-card.js.map +1 -0
  47. package/dist/chrome/connect-dock.d.ts +25 -0
  48. package/dist/chrome/connect-dock.d.ts.map +1 -0
  49. package/dist/chrome/connect-dock.js +192 -0
  50. package/dist/chrome/connect-dock.js.map +1 -0
  51. package/dist/chrome/connected-accounts-panel.d.ts +14 -0
  52. package/dist/chrome/connected-accounts-panel.d.ts.map +1 -0
  53. package/dist/chrome/connected-accounts-panel.js +157 -0
  54. package/dist/chrome/connected-accounts-panel.js.map +1 -0
  55. package/dist/chrome/dev-mode.d.ts +5 -0
  56. package/dist/chrome/dev-mode.d.ts.map +1 -0
  57. package/dist/chrome/dev-mode.js +7 -0
  58. package/dist/chrome/dev-mode.js.map +1 -0
  59. package/dist/chrome/discoverability.d.ts +33 -0
  60. package/dist/chrome/discoverability.d.ts.map +1 -0
  61. package/dist/chrome/discoverability.js +63 -0
  62. package/dist/chrome/discoverability.js.map +1 -0
  63. package/dist/chrome/embeds.d.ts +21 -0
  64. package/dist/chrome/embeds.d.ts.map +1 -0
  65. package/dist/chrome/embeds.js +181 -0
  66. package/dist/chrome/embeds.js.map +1 -0
  67. package/dist/chrome/fluid-thinking.d.ts +15 -0
  68. package/dist/chrome/fluid-thinking.d.ts.map +1 -0
  69. package/dist/chrome/fluid-thinking.js +37 -0
  70. package/dist/chrome/fluid-thinking.js.map +1 -0
  71. package/dist/chrome/humanize.d.ts +46 -0
  72. package/dist/chrome/humanize.d.ts.map +1 -0
  73. package/dist/chrome/humanize.js +104 -0
  74. package/dist/chrome/humanize.js.map +1 -0
  75. package/dist/chrome/index.d.ts +39 -0
  76. package/dist/chrome/index.d.ts.map +1 -0
  77. package/dist/chrome/index.js +38 -0
  78. package/dist/chrome/index.js.map +1 -0
  79. package/dist/chrome/markdown.d.ts +23 -0
  80. package/dist/chrome/markdown.d.ts.map +1 -0
  81. package/dist/chrome/markdown.js +149 -0
  82. package/dist/chrome/markdown.js.map +1 -0
  83. package/dist/chrome/morph-toast.d.ts +43 -0
  84. package/dist/chrome/morph-toast.d.ts.map +1 -0
  85. package/dist/chrome/morph-toast.js +89 -0
  86. package/dist/chrome/morph-toast.js.map +1 -0
  87. package/dist/chrome/no-policy-notice.d.ts +8 -0
  88. package/dist/chrome/no-policy-notice.d.ts.map +1 -0
  89. package/dist/chrome/no-policy-notice.js +18 -0
  90. package/dist/chrome/no-policy-notice.js.map +1 -0
  91. package/dist/chrome/onest-font.gen.d.ts +10 -0
  92. package/dist/chrome/onest-font.gen.d.ts.map +1 -0
  93. package/dist/chrome/onest-font.gen.js +10 -0
  94. package/dist/chrome/onest-font.gen.js.map +1 -0
  95. package/dist/chrome/overlay-registry.d.ts +66 -0
  96. package/dist/chrome/overlay-registry.d.ts.map +1 -0
  97. package/dist/chrome/overlay-registry.js +103 -0
  98. package/dist/chrome/overlay-registry.js.map +1 -0
  99. package/dist/chrome/palette-hotkey.d.ts +42 -0
  100. package/dist/chrome/palette-hotkey.d.ts.map +1 -0
  101. package/dist/chrome/palette-hotkey.js +91 -0
  102. package/dist/chrome/palette-hotkey.js.map +1 -0
  103. package/dist/chrome/policy-notice-body.d.ts +3 -0
  104. package/dist/chrome/policy-notice-body.d.ts.map +1 -0
  105. package/dist/chrome/policy-notice-body.js +6 -0
  106. package/dist/chrome/policy-notice-body.js.map +1 -0
  107. package/dist/chrome/takeover-portal.d.ts +16 -0
  108. package/dist/chrome/takeover-portal.d.ts.map +1 -0
  109. package/dist/chrome/takeover-portal.js +21 -0
  110. package/dist/chrome/takeover-portal.js.map +1 -0
  111. package/dist/chrome/thread/attachments.d.ts +24 -0
  112. package/dist/chrome/thread/attachments.d.ts.map +1 -0
  113. package/dist/chrome/thread/attachments.js +50 -0
  114. package/dist/chrome/thread/attachments.js.map +1 -0
  115. package/dist/chrome/thread/composer.d.ts +63 -0
  116. package/dist/chrome/thread/composer.d.ts.map +1 -0
  117. package/dist/chrome/thread/composer.js +259 -0
  118. package/dist/chrome/thread/composer.js.map +1 -0
  119. package/dist/chrome/thread/index.d.ts +41 -0
  120. package/dist/chrome/thread/index.d.ts.map +1 -0
  121. package/dist/chrome/thread/index.js +258 -0
  122. package/dist/chrome/thread/index.js.map +1 -0
  123. package/dist/chrome/thread/message-data.d.ts +35 -0
  124. package/dist/chrome/thread/message-data.d.ts.map +1 -0
  125. package/dist/chrome/thread/message-data.js +127 -0
  126. package/dist/chrome/thread/message-data.js.map +1 -0
  127. package/dist/chrome/thread/message-list.d.ts +30 -0
  128. package/dist/chrome/thread/message-list.d.ts.map +1 -0
  129. package/dist/chrome/thread/message-list.js +11 -0
  130. package/dist/chrome/thread/message-list.js.map +1 -0
  131. package/dist/chrome/thread/message.d.ts +18 -0
  132. package/dist/chrome/thread/message.d.ts.map +1 -0
  133. package/dist/chrome/thread/message.js +57 -0
  134. package/dist/chrome/thread/message.js.map +1 -0
  135. package/dist/chrome/thread/parts.d.ts +53 -0
  136. package/dist/chrome/thread/parts.d.ts.map +1 -0
  137. package/dist/chrome/thread/parts.js +184 -0
  138. package/dist/chrome/thread/parts.js.map +1 -0
  139. package/dist/chrome/thread/scrolling.d.ts +26 -0
  140. package/dist/chrome/thread/scrolling.d.ts.map +1 -0
  141. package/dist/chrome/thread/scrolling.js +214 -0
  142. package/dist/chrome/thread/scrolling.js.map +1 -0
  143. package/dist/chrome/truncate.d.ts +12 -0
  144. package/dist/chrome/truncate.d.ts.map +1 -0
  145. package/dist/chrome/truncate.js +18 -0
  146. package/dist/chrome/truncate.js.map +1 -0
  147. package/dist/chrome/vendo-activities.d.ts +24 -0
  148. package/dist/chrome/vendo-activities.d.ts.map +1 -0
  149. package/dist/chrome/vendo-activities.js +38 -0
  150. package/dist/chrome/vendo-activities.js.map +1 -0
  151. package/dist/chrome/vendo-overlay.d.ts +63 -0
  152. package/dist/chrome/vendo-overlay.d.ts.map +1 -0
  153. package/dist/chrome/vendo-overlay.js +256 -0
  154. package/dist/chrome/vendo-overlay.js.map +1 -0
  155. package/dist/chrome/vendo-page.d.ts +3 -0
  156. package/dist/chrome/vendo-page.d.ts.map +1 -0
  157. package/dist/chrome/vendo-page.js +162 -0
  158. package/dist/chrome/vendo-page.js.map +1 -0
  159. package/dist/chrome/vendo-palette.d.ts +29 -0
  160. package/dist/chrome/vendo-palette.d.ts.map +1 -0
  161. package/dist/chrome/vendo-palette.js +95 -0
  162. package/dist/chrome/vendo-palette.js.map +1 -0
  163. package/dist/chrome/vendo-slot.d.ts +79 -0
  164. package/dist/chrome/vendo-slot.d.ts.map +1 -0
  165. package/dist/chrome/vendo-slot.js +153 -0
  166. package/dist/chrome/vendo-slot.js.map +1 -0
  167. package/dist/chrome/vendo-toasts.d.ts +40 -0
  168. package/dist/chrome/vendo-toasts.d.ts.map +1 -0
  169. package/dist/chrome/vendo-toasts.js +135 -0
  170. package/dist/chrome/vendo-toasts.js.map +1 -0
  171. package/dist/chrome/vendo-trigger.d.ts +24 -0
  172. package/dist/chrome/vendo-trigger.d.ts.map +1 -0
  173. package/dist/chrome/vendo-trigger.js +30 -0
  174. package/dist/chrome/vendo-trigger.js.map +1 -0
  175. package/dist/chrome/waiting-queue.d.ts +8 -0
  176. package/dist/chrome/waiting-queue.d.ts.map +1 -0
  177. package/dist/chrome/waiting-queue.js +21 -0
  178. package/dist/chrome/waiting-queue.js.map +1 -0
  179. package/dist/client-impl.d.ts +4 -0
  180. package/dist/client-impl.d.ts.map +1 -0
  181. package/dist/client-impl.js +160 -0
  182. package/dist/client-impl.js.map +1 -0
  183. package/dist/client.d.ts +136 -0
  184. package/dist/client.d.ts.map +1 -0
  185. package/dist/client.js +2 -0
  186. package/dist/client.js.map +1 -0
  187. package/dist/context.d.ts +97 -0
  188. package/dist/context.d.ts.map +1 -0
  189. package/dist/context.js +71 -0
  190. package/dist/context.js.map +1 -0
  191. package/dist/eject-templates/activities/index.tsx +113 -0
  192. package/dist/eject-templates/templates.json +29 -0
  193. package/dist/eject-templates/thread/attachments.tsx +69 -0
  194. package/dist/eject-templates/thread/composer.tsx +409 -0
  195. package/dist/eject-templates/thread/index.tsx +422 -0
  196. package/dist/eject-templates/thread/message-data.ts +151 -0
  197. package/dist/eject-templates/thread/message-list.tsx +123 -0
  198. package/dist/eject-templates/thread/message.tsx +149 -0
  199. package/dist/eject-templates/thread/parts.tsx +293 -0
  200. package/dist/eject-templates/thread/scrolling.ts +223 -0
  201. package/dist/embeds.d.ts +28 -0
  202. package/dist/embeds.d.ts.map +1 -0
  203. package/dist/embeds.js +2 -0
  204. package/dist/embeds.js.map +1 -0
  205. package/dist/hooks/index.d.ts +18 -0
  206. package/dist/hooks/index.d.ts.map +1 -0
  207. package/dist/hooks/index.js +19 -0
  208. package/dist/hooks/index.js.map +1 -0
  209. package/dist/hooks/scripted-transport.d.ts +44 -0
  210. package/dist/hooks/scripted-transport.d.ts.map +1 -0
  211. package/dist/hooks/scripted-transport.js +58 -0
  212. package/dist/hooks/scripted-transport.js.map +1 -0
  213. package/dist/hooks/use-activity.d.ts +17 -0
  214. package/dist/hooks/use-activity.d.ts.map +1 -0
  215. package/dist/hooks/use-activity.js +50 -0
  216. package/dist/hooks/use-activity.js.map +1 -0
  217. package/dist/hooks/use-app.d.ts +19 -0
  218. package/dist/hooks/use-app.d.ts.map +1 -0
  219. package/dist/hooks/use-app.js +66 -0
  220. package/dist/hooks/use-app.js.map +1 -0
  221. package/dist/hooks/use-approvals.d.ts +13 -0
  222. package/dist/hooks/use-approvals.d.ts.map +1 -0
  223. package/dist/hooks/use-approvals.js +14 -0
  224. package/dist/hooks/use-approvals.js.map +1 -0
  225. package/dist/hooks/use-apps.d.ts +17 -0
  226. package/dist/hooks/use-apps.d.ts.map +1 -0
  227. package/dist/hooks/use-apps.js +30 -0
  228. package/dist/hooks/use-apps.js.map +1 -0
  229. package/dist/hooks/use-automations.d.ts +25 -0
  230. package/dist/hooks/use-automations.d.ts.map +1 -0
  231. package/dist/hooks/use-automations.js +30 -0
  232. package/dist/hooks/use-automations.js.map +1 -0
  233. package/dist/hooks/use-connections.d.ts +12 -0
  234. package/dist/hooks/use-connections.d.ts.map +1 -0
  235. package/dist/hooks/use-connections.js +15 -0
  236. package/dist/hooks/use-connections.js.map +1 -0
  237. package/dist/hooks/use-connector-catalog.d.ts +8 -0
  238. package/dist/hooks/use-connector-catalog.d.ts.map +1 -0
  239. package/dist/hooks/use-connector-catalog.js +52 -0
  240. package/dist/hooks/use-connector-catalog.js.map +1 -0
  241. package/dist/hooks/use-grants.d.ts +13 -0
  242. package/dist/hooks/use-grants.d.ts.map +1 -0
  243. package/dist/hooks/use-grants.js +14 -0
  244. package/dist/hooks/use-grants.js.map +1 -0
  245. package/dist/hooks/use-mobile-takeover.d.ts +22 -0
  246. package/dist/hooks/use-mobile-takeover.d.ts.map +1 -0
  247. package/dist/hooks/use-mobile-takeover.js +66 -0
  248. package/dist/hooks/use-mobile-takeover.js.map +1 -0
  249. package/dist/hooks/use-resource.d.ts +21 -0
  250. package/dist/hooks/use-resource.d.ts.map +1 -0
  251. package/dist/hooks/use-resource.js +79 -0
  252. package/dist/hooks/use-resource.js.map +1 -0
  253. package/dist/hooks/use-slot-app.d.ts +19 -0
  254. package/dist/hooks/use-slot-app.d.ts.map +1 -0
  255. package/dist/hooks/use-slot-app.js +18 -0
  256. package/dist/hooks/use-slot-app.js.map +1 -0
  257. package/dist/hooks/use-threads.d.ts +16 -0
  258. package/dist/hooks/use-threads.d.ts.map +1 -0
  259. package/dist/hooks/use-threads.js +15 -0
  260. package/dist/hooks/use-threads.js.map +1 -0
  261. package/dist/hooks/use-vendo-overlay.d.ts +31 -0
  262. package/dist/hooks/use-vendo-overlay.d.ts.map +1 -0
  263. package/dist/hooks/use-vendo-overlay.js +23 -0
  264. package/dist/hooks/use-vendo-overlay.js.map +1 -0
  265. package/dist/hooks/use-vendo-status.d.ts +6 -0
  266. package/dist/hooks/use-vendo-status.d.ts.map +1 -0
  267. package/dist/hooks/use-vendo-status.js +28 -0
  268. package/dist/hooks/use-vendo-status.js.map +1 -0
  269. package/dist/hooks/use-vendo-thread.d.ts +39 -0
  270. package/dist/hooks/use-vendo-thread.d.ts.map +1 -0
  271. package/dist/hooks/use-vendo-thread.js +185 -0
  272. package/dist/hooks/use-vendo-thread.js.map +1 -0
  273. package/dist/index.d.ts +12 -0
  274. package/dist/index.d.ts.map +1 -0
  275. package/dist/index.js +12 -0
  276. package/dist/index.js.map +1 -0
  277. package/dist/kit/charts/bar.d.ts +16 -0
  278. package/dist/kit/charts/bar.d.ts.map +1 -0
  279. package/dist/kit/charts/bar.js +21 -0
  280. package/dist/kit/charts/bar.js.map +1 -0
  281. package/dist/kit/charts/donut.d.ts +16 -0
  282. package/dist/kit/charts/donut.d.ts.map +1 -0
  283. package/dist/kit/charts/donut.js +17 -0
  284. package/dist/kit/charts/donut.js.map +1 -0
  285. package/dist/kit/charts/line.d.ts +19 -0
  286. package/dist/kit/charts/line.d.ts.map +1 -0
  287. package/dist/kit/charts/line.js +21 -0
  288. package/dist/kit/charts/line.js.map +1 -0
  289. package/dist/kit/charts/progress.d.ts +12 -0
  290. package/dist/kit/charts/progress.d.ts.map +1 -0
  291. package/dist/kit/charts/progress.js +25 -0
  292. package/dist/kit/charts/progress.js.map +1 -0
  293. package/dist/kit/charts/sanitize.d.ts +24 -0
  294. package/dist/kit/charts/sanitize.d.ts.map +1 -0
  295. package/dist/kit/charts/sanitize.js +50 -0
  296. package/dist/kit/charts/sanitize.js.map +1 -0
  297. package/dist/kit/charts/sparkline.d.ts +11 -0
  298. package/dist/kit/charts/sparkline.d.ts.map +1 -0
  299. package/dist/kit/charts/sparkline.js +17 -0
  300. package/dist/kit/charts/sparkline.js.map +1 -0
  301. package/dist/kit/data/badge.d.ts +13 -0
  302. package/dist/kit/data/badge.d.ts.map +1 -0
  303. package/dist/kit/data/badge.js +12 -0
  304. package/dist/kit/data/badge.js.map +1 -0
  305. package/dist/kit/data/card-list.d.ts +23 -0
  306. package/dist/kit/data/card-list.d.ts.map +1 -0
  307. package/dist/kit/data/card-list.js +43 -0
  308. package/dist/kit/data/card-list.js.map +1 -0
  309. package/dist/kit/data/data-table.d.ts +32 -0
  310. package/dist/kit/data/data-table.d.ts.map +1 -0
  311. package/dist/kit/data/data-table.js +153 -0
  312. package/dist/kit/data/data-table.js.map +1 -0
  313. package/dist/kit/data/stat.d.ts +15 -0
  314. package/dist/kit/data/stat.d.ts.map +1 -0
  315. package/dist/kit/data/stat.js +28 -0
  316. package/dist/kit/data/stat.js.map +1 -0
  317. package/dist/kit/feedback/accordion.d.ts +15 -0
  318. package/dist/kit/feedback/accordion.d.ts.map +1 -0
  319. package/dist/kit/feedback/accordion.js +33 -0
  320. package/dist/kit/feedback/accordion.js.map +1 -0
  321. package/dist/kit/feedback/callout.d.ts +13 -0
  322. package/dist/kit/feedback/callout.d.ts.map +1 -0
  323. package/dist/kit/feedback/callout.js +24 -0
  324. package/dist/kit/feedback/callout.js.map +1 -0
  325. package/dist/kit/feedback/tabs.d.ts +14 -0
  326. package/dist/kit/feedback/tabs.d.ts.map +1 -0
  327. package/dist/kit/feedback/tabs.js +37 -0
  328. package/dist/kit/feedback/tabs.js.map +1 -0
  329. package/dist/kit/format.d.ts +60 -0
  330. package/dist/kit/format.d.ts.map +1 -0
  331. package/dist/kit/format.js +123 -0
  332. package/dist/kit/format.js.map +1 -0
  333. package/dist/kit/forms/button.d.ts +17 -0
  334. package/dist/kit/forms/button.d.ts.map +1 -0
  335. package/dist/kit/forms/button.js +33 -0
  336. package/dist/kit/forms/button.js.map +1 -0
  337. package/dist/kit/forms/checkbox.d.ts +9 -0
  338. package/dist/kit/forms/checkbox.d.ts.map +1 -0
  339. package/dist/kit/forms/checkbox.js +9 -0
  340. package/dist/kit/forms/checkbox.js.map +1 -0
  341. package/dist/kit/forms/date-picker.d.ts +13 -0
  342. package/dist/kit/forms/date-picker.d.ts.map +1 -0
  343. package/dist/kit/forms/date-picker.js +9 -0
  344. package/dist/kit/forms/date-picker.js.map +1 -0
  345. package/dist/kit/forms/disclaimer.d.ts +8 -0
  346. package/dist/kit/forms/disclaimer.d.ts.map +1 -0
  347. package/dist/kit/forms/disclaimer.js +20 -0
  348. package/dist/kit/forms/disclaimer.js.map +1 -0
  349. package/dist/kit/forms/field.d.ts +18 -0
  350. package/dist/kit/forms/field.d.ts.map +1 -0
  351. package/dist/kit/forms/field.js +19 -0
  352. package/dist/kit/forms/field.js.map +1 -0
  353. package/dist/kit/forms/form.d.ts +10 -0
  354. package/dist/kit/forms/form.d.ts.map +1 -0
  355. package/dist/kit/forms/form.js +9 -0
  356. package/dist/kit/forms/form.js.map +1 -0
  357. package/dist/kit/forms/input.d.ts +14 -0
  358. package/dist/kit/forms/input.d.ts.map +1 -0
  359. package/dist/kit/forms/input.js +9 -0
  360. package/dist/kit/forms/input.js.map +1 -0
  361. package/dist/kit/forms/select.d.ts +21 -0
  362. package/dist/kit/forms/select.d.ts.map +1 -0
  363. package/dist/kit/forms/select.js +35 -0
  364. package/dist/kit/forms/select.js.map +1 -0
  365. package/dist/kit/forms/textarea.d.ts +12 -0
  366. package/dist/kit/forms/textarea.d.ts.map +1 -0
  367. package/dist/kit/forms/textarea.js +9 -0
  368. package/dist/kit/forms/textarea.js.map +1 -0
  369. package/dist/kit/index.d.ts +42 -0
  370. package/dist/kit/index.d.ts.map +1 -0
  371. package/dist/kit/index.js +45 -0
  372. package/dist/kit/index.js.map +1 -0
  373. package/dist/kit/kit-prompt.d.ts +7 -0
  374. package/dist/kit/kit-prompt.d.ts.map +1 -0
  375. package/dist/kit/kit-prompt.js +7 -0
  376. package/dist/kit/kit-prompt.js.map +1 -0
  377. package/dist/kit/layout.d.ts +29 -0
  378. package/dist/kit/layout.d.ts.map +1 -0
  379. package/dist/kit/layout.js +64 -0
  380. package/dist/kit/layout.js.map +1 -0
  381. package/dist/kit/registry.d.ts +11 -0
  382. package/dist/kit/registry.d.ts.map +1 -0
  383. package/dist/kit/registry.js +34 -0
  384. package/dist/kit/registry.js.map +1 -0
  385. package/dist/kit/schema.d.ts +9 -0
  386. package/dist/kit/schema.d.ts.map +1 -0
  387. package/dist/kit/schema.js +9 -0
  388. package/dist/kit/schema.js.map +1 -0
  389. package/dist/kit/tokens.d.ts +33 -0
  390. package/dist/kit/tokens.d.ts.map +1 -0
  391. package/dist/kit/tokens.js +48 -0
  392. package/dist/kit/tokens.js.map +1 -0
  393. package/dist/kit/values.d.ts +55 -0
  394. package/dist/kit/values.d.ts.map +1 -0
  395. package/dist/kit/values.js +108 -0
  396. package/dist/kit/values.js.map +1 -0
  397. package/dist/theme.d.ts +25 -0
  398. package/dist/theme.d.ts.map +1 -0
  399. package/dist/theme.js +100 -0
  400. package/dist/theme.js.map +1 -0
  401. package/dist/tree/bindings.d.ts +4 -0
  402. package/dist/tree/bindings.d.ts.map +1 -0
  403. package/dist/tree/bindings.js +20 -0
  404. package/dist/tree/bindings.js.map +1 -0
  405. package/dist/tree/branded.d.ts +124 -0
  406. package/dist/tree/branded.d.ts.map +1 -0
  407. package/dist/tree/branded.js +319 -0
  408. package/dist/tree/branded.js.map +1 -0
  409. package/dist/tree/error-boundary.d.ts +22 -0
  410. package/dist/tree/error-boundary.d.ts.map +1 -0
  411. package/dist/tree/error-boundary.js +25 -0
  412. package/dist/tree/error-boundary.js.map +1 -0
  413. package/dist/tree/fluid-reveal.d.ts +22 -0
  414. package/dist/tree/fluid-reveal.d.ts.map +1 -0
  415. package/dist/tree/fluid-reveal.js +28 -0
  416. package/dist/tree/fluid-reveal.js.map +1 -0
  417. package/dist/tree/forming-skeleton.d.ts +14 -0
  418. package/dist/tree/forming-skeleton.d.ts.map +1 -0
  419. package/dist/tree/forming-skeleton.js +36 -0
  420. package/dist/tree/forming-skeleton.js.map +1 -0
  421. package/dist/tree/frames.d.ts +52 -0
  422. package/dist/tree/frames.d.ts.map +1 -0
  423. package/dist/tree/frames.js +143 -0
  424. package/dist/tree/frames.js.map +1 -0
  425. package/dist/tree/host-mount.d.ts +24 -0
  426. package/dist/tree/host-mount.d.ts.map +1 -0
  427. package/dist/tree/host-mount.js +0 -0
  428. package/dist/tree/host-mount.js.map +1 -0
  429. package/dist/tree/index.d.ts +9 -0
  430. package/dist/tree/index.d.ts.map +1 -0
  431. package/dist/tree/index.js +9 -0
  432. package/dist/tree/index.js.map +1 -0
  433. package/dist/tree/jail/JailedComponent.d.ts +41 -0
  434. package/dist/tree/jail/JailedComponent.d.ts.map +1 -0
  435. package/dist/tree/jail/JailedComponent.js +269 -0
  436. package/dist/tree/jail/JailedComponent.js.map +1 -0
  437. package/dist/tree/jail/runtime-bundle.gen.d.ts +3 -0
  438. package/dist/tree/jail/runtime-bundle.gen.d.ts.map +1 -0
  439. package/dist/tree/jail/runtime-bundle.gen.js +3 -0
  440. package/dist/tree/jail/runtime-bundle.gen.js.map +1 -0
  441. package/dist/tree/jail/runtime-entry.d.ts +18 -0
  442. package/dist/tree/jail/runtime-entry.d.ts.map +1 -0
  443. package/dist/tree/jail/runtime-entry.js +440 -0
  444. package/dist/tree/jail/runtime-entry.js.map +1 -0
  445. package/dist/tree/jail/viewport-css.d.ts +17 -0
  446. package/dist/tree/jail/viewport-css.d.ts.map +1 -0
  447. package/dist/tree/jail/viewport-css.js +32 -0
  448. package/dist/tree/jail/viewport-css.js.map +1 -0
  449. package/dist/tree/mcp-shim/entry.d.ts +2 -0
  450. package/dist/tree/mcp-shim/entry.d.ts.map +1 -0
  451. package/dist/tree/mcp-shim/entry.js +45 -0
  452. package/dist/tree/mcp-shim/entry.js.map +1 -0
  453. package/dist/tree/mcp-shim/http-open-card.d.ts +5 -0
  454. package/dist/tree/mcp-shim/http-open-card.d.ts.map +1 -0
  455. package/dist/tree/mcp-shim/http-open-card.js +61 -0
  456. package/dist/tree/mcp-shim/http-open-card.js.map +1 -0
  457. package/dist/tree/mcp-shim/shim-core.d.ts +58 -0
  458. package/dist/tree/mcp-shim/shim-core.d.ts.map +1 -0
  459. package/dist/tree/mcp-shim/shim-core.js +176 -0
  460. package/dist/tree/mcp-shim/shim-core.js.map +1 -0
  461. package/dist/tree/mcp-shim/theme.d.ts +8 -0
  462. package/dist/tree/mcp-shim/theme.d.ts.map +1 -0
  463. package/dist/tree/mcp-shim/theme.js +36 -0
  464. package/dist/tree/mcp-shim/theme.js.map +1 -0
  465. package/dist/tree/notice.d.ts +8 -0
  466. package/dist/tree/notice.d.ts.map +1 -0
  467. package/dist/tree/notice.js +30 -0
  468. package/dist/tree/notice.js.map +1 -0
  469. package/dist/tree/primitives.d.ts +30 -0
  470. package/dist/tree/primitives.d.ts.map +1 -0
  471. package/dist/tree/primitives.js +105 -0
  472. package/dist/tree/primitives.js.map +1 -0
  473. package/dist/tree/renderer-v2.d.ts +15 -0
  474. package/dist/tree/renderer-v2.d.ts.map +1 -0
  475. package/dist/tree/renderer-v2.js +71 -0
  476. package/dist/tree/renderer-v2.js.map +1 -0
  477. package/dist/tree/renderer.d.ts +77 -0
  478. package/dist/tree/renderer.d.ts.map +1 -0
  479. package/dist/tree/renderer.js +376 -0
  480. package/dist/tree/renderer.js.map +1 -0
  481. package/dist/voice/driver.d.ts +94 -0
  482. package/dist/voice/driver.d.ts.map +1 -0
  483. package/dist/voice/driver.js +2 -0
  484. package/dist/voice/driver.js.map +1 -0
  485. package/dist/voice/index.d.ts +7 -0
  486. package/dist/voice/index.d.ts.map +1 -0
  487. package/dist/voice/index.js +5 -0
  488. package/dist/voice/index.js.map +1 -0
  489. package/dist/voice/realtime-driver.d.ts +57 -0
  490. package/dist/voice/realtime-driver.d.ts.map +1 -0
  491. package/dist/voice/realtime-driver.js +592 -0
  492. package/dist/voice/realtime-driver.js.map +1 -0
  493. package/dist/voice/stage.d.ts +12 -0
  494. package/dist/voice/stage.d.ts.map +1 -0
  495. package/dist/voice/stage.js +259 -0
  496. package/dist/voice/stage.js.map +1 -0
  497. package/dist/voice/use-voice-approvals.d.ts +16 -0
  498. package/dist/voice/use-voice-approvals.d.ts.map +1 -0
  499. package/dist/voice/use-voice-approvals.js +77 -0
  500. package/dist/voice/use-voice-approvals.js.map +1 -0
  501. package/dist/voice/use-voice.d.ts +26 -0
  502. package/dist/voice/use-voice.d.ts.map +1 -0
  503. package/dist/voice/use-voice.js +201 -0
  504. package/dist/voice/use-voice.js.map +1 -0
  505. package/dist/voice/voice-act.d.ts +13 -0
  506. package/dist/voice/voice-act.d.ts.map +1 -0
  507. package/dist/voice/voice-act.js +301 -0
  508. package/dist/voice/voice-act.js.map +1 -0
  509. package/dist/voice/voice-blob.d.ts +17 -0
  510. package/dist/voice/voice-blob.d.ts.map +1 -0
  511. package/dist/voice/voice-blob.js +67 -0
  512. package/dist/voice/voice-blob.js.map +1 -0
  513. package/dist/voice/voice-consent.d.ts +17 -0
  514. package/dist/voice/voice-consent.d.ts.map +1 -0
  515. package/dist/voice/voice-consent.js +45 -0
  516. package/dist/voice/voice-consent.js.map +1 -0
  517. package/dist/voice/voice-drawer.d.ts +10 -0
  518. package/dist/voice/voice-drawer.d.ts.map +1 -0
  519. package/dist/voice/voice-drawer.js +22 -0
  520. package/dist/voice/voice-drawer.js.map +1 -0
  521. package/dist/wire-types.d.ts +238 -0
  522. package/dist/wire-types.d.ts.map +1 -0
  523. package/dist/wire-types.js +2 -0
  524. package/dist/wire-types.js.map +1 -0
  525. package/package.json +106 -0
@@ -0,0 +1,258 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { isToolUIPart } from "ai";
3
+ import { useEffect, useMemo, useRef, useState } from "react";
4
+ import { useVendoDiscoverability, useVendoGreeting } from "../../context.js";
5
+ import { useVendoThread } from "../../hooks/use-vendo-thread.js";
6
+ import { StatusRibbon } from "../build-beat.js";
7
+ import { ChromeRoot } from "../chrome-root.js";
8
+ import { defaultVendoGreeting, hasSeen, markSeen } from "../discoverability.js";
9
+ import { MorphToast } from "../morph-toast.js";
10
+ import { Composer, dragHasFiles, useComposer } from "./composer.js";
11
+ import { MessageList } from "./message-list.js";
12
+ import { useMessageWindow, useStickToBottom } from "./scrolling.js";
13
+ import { approvalByCall, riskByCall, userText } from "./message-data.js";
14
+ /** 08-ui §4 — conversation chrome over the headless thread transport. */
15
+ export function VendoThread({ threadId, greeting = "What can I help you build?", suggestions = [], onVoice, onThreadId, discoverability, firstRunGreeting, composerAccessory, }) {
16
+ const thread = useVendoThread(threadId);
17
+ // ui-usage-dx §6 — greeting-as-tutorial: the user's FIRST-ever conversation
18
+ // open (fresh thread only — an adopted thread with history is not a first
19
+ // open and does not burn the flag) renders the agent-voiced intro + starter
20
+ // chips locally. Presentation-only: nothing here touches the transport or
21
+ // the transcript; chips prefill the composer and never send.
22
+ const providerDial = useVendoDiscoverability();
23
+ const dial = discoverability ?? providerDial;
24
+ const contextGreeting = useVendoGreeting();
25
+ const tutorial = firstRunGreeting ?? contextGreeting ?? defaultVendoGreeting;
26
+ const [tutorialActive, setTutorialActive] = useState(false);
27
+ // Arming is REACTIVE, not mount-only: surfaces that don't remount their
28
+ // thread (VendoPage flips threadId props on one instance) become eligible
29
+ // later — e.g. when the page's dial gate opens on an explicit "New
30
+ // conversation". Burned on first showing (not on interaction) — a reload
31
+ // mid-look never replays it, per the once-per-user-ever rule.
32
+ const messageCount = thread.messages.length;
33
+ useEffect(() => {
34
+ if (tutorialActive || dial === "quiet" || threadId !== undefined)
35
+ return;
36
+ if (messageCount > 0 || hasSeen("greeting"))
37
+ return;
38
+ markSeen("greeting");
39
+ setTutorialActive(true);
40
+ }, [tutorialActive, dial, threadId, messageCount]);
41
+ // Once the landing is left (a turn exists, or the surface switches to a
42
+ // stored thread), the tutorial is done for good on this instance too — the
43
+ // burned flag keeps every later landing plain.
44
+ useEffect(() => {
45
+ if (tutorialActive && (messageCount > 0 || threadId !== undefined))
46
+ setTutorialActive(false);
47
+ }, [tutorialActive, messageCount, threadId]);
48
+ // ENG-222 — surface the effective (possibly server-minted) thread id upward.
49
+ const reportedThreadId = thread.threadId;
50
+ useEffect(() => {
51
+ if (reportedThreadId !== undefined)
52
+ onThreadId?.(reportedThreadId);
53
+ }, [reportedThreadId, onThreadId]);
54
+ const busy = thread.status === "submitted" || thread.status === "streaming";
55
+ // busy is a content-revision signal for the scroll hook: turn-actions mount
56
+ // below the last turn when a stream settles, which changes the list height.
57
+ const scroll = useStickToBottom(thread.messages, threadId, busy);
58
+ const approvalCardRefs = useRef(new Map());
59
+ const [morph, setMorph] = useState(null);
60
+ // A build's approval lands below a tall generated view — off-screen — so it
61
+ // would sit unnoticed until the reader scrolls. When a NEW approval appears,
62
+ // bring it into view (and re-stick), so consent is never something you have
63
+ // to go hunting for.
64
+ const seenApprovalsRef = useRef(new Set());
65
+ useEffect(() => {
66
+ const pending = thread.messages
67
+ .flatMap(message => message.parts)
68
+ .filter(part => isToolUIPart(part) && part.state === "approval-requested")
69
+ .map(part => part.approval?.id)
70
+ .filter((id) => typeof id === "string");
71
+ const fresh = pending.find(id => !seenApprovalsRef.current.has(id));
72
+ seenApprovalsRef.current = new Set(pending);
73
+ if (fresh === undefined)
74
+ return;
75
+ const timer = setTimeout(() => {
76
+ const card = approvalCardRefs.current.get(fresh)?.querySelector(".fl-approval");
77
+ // block: "end", not "center": a sibling surface sharing this pane's
78
+ // flex column (VendoStage docked below the thread, Maple's /vendo tab)
79
+ // can leave the list shorter than the card itself at a short viewport
80
+ // height — centering then crops evenly off BOTH edges, hiding the
81
+ // card's own Approve/Decline row behind whatever renders next in flow
82
+ // with no way to reach it. Bottom-aligning always leaves the action
83
+ // row — the part the reader actually needs — as the last thing in
84
+ // view, consistent with the list's own stick-to-bottom behavior.
85
+ if (card)
86
+ card.scrollIntoView({ behavior: "smooth", block: "end" });
87
+ else
88
+ scroll.jumpToLatest();
89
+ }, 80);
90
+ return () => clearTimeout(timer);
91
+ }, [thread.messages, scroll]);
92
+ const messageWindow = useMessageWindow(thread.messages, scroll.listRef, threadId);
93
+ // ENG-218 — entrance-animation gating on restore. The .fl-item-in rise runs
94
+ // when an article first mounts; a reopened long thread mounts them all at once
95
+ // → a stampede on first paint. We record every message id present when the
96
+ // thread is first shown (and after each switch) as "restored" and suppress
97
+ // the entrance on those; only turns that arrive AFTER restore (streamed
98
+ // replies, sends) animate. A ref, not state — read during render, no re-render.
99
+ const restoredIdsRef = useRef({ key: undefined, ids: new Set() });
100
+ if (restoredIdsRef.current.key !== threadId) {
101
+ restoredIdsRef.current = { key: threadId, ids: new Set(thread.messages.map(message => message.id)) };
102
+ }
103
+ else if (restoredIdsRef.current.ids.size === 0 && thread.messages.length > 0) {
104
+ // First non-empty render after an async history load (mount → list/get):
105
+ // that whole batch is a restore, not new arrivals.
106
+ restoredIdsRef.current.ids = new Set(thread.messages.map(message => message.id));
107
+ }
108
+ const isRestored = (id) => restoredIdsRef.current.ids.has(id);
109
+ const composerApi = useComposer({ busy, sendMessage: message => thread.sendMessage(message) });
110
+ const { setDraft, setQueued, textareaRef, send } = composerApi;
111
+ const risks = useMemo(() => riskByCall(thread.messages), [thread.messages]);
112
+ const guardApprovals = useMemo(() => approvalByCall(thread.messages), [thread.messages]);
113
+ const landing = thread.messages.length === 0;
114
+ const activeAssistant = thread.messages.at(-1)?.role === "assistant" ? thread.messages.at(-1) : undefined;
115
+ const assistantHasVisibleText = activeAssistant?.parts.some(part => part.type === "text" && part.text.trim().length > 0) ?? false;
116
+ // ENG-217 — the three streaming moments each get exactly ONE affordance:
117
+ // before the first chunk the generating skeleton holds the floor; a streamed
118
+ // turn whose text is still empty shows the lone caret (renderPart); once
119
+ // text flows the trailing caret rides .fl-md--streaming. FluidThinking
120
+ // covers the remaining gap (tool phases with no text yet).
121
+ const awaitingFirstChunk = busy && (activeAssistant === undefined || activeAssistant.parts.length === 0);
122
+ const lastPart = activeAssistant?.parts.at(-1);
123
+ const caretShowing = busy && lastPart?.type === "text" && lastPart.state === "streaming"
124
+ && lastPart.text.trim().length === 0;
125
+ // Once ANY build beat exists in the active turn, the checklist is the
126
+ // progress voice — the thinking indicator between beats reads as two
127
+ // indicators fighting.
128
+ const hasBeats = activeAssistant?.parts.some(part => isToolUIPart(part)) ?? false;
129
+ const working = busy && !assistantHasVisibleText && !awaitingFirstChunk && !caretShowing && !hasBeats;
130
+ // ENG-215 — edit the last user turn: drop it (and anything after) from the
131
+ // transcript and refill the composer, so re-sending amends rather than
132
+ // duplicates. Only meaningful when idle.
133
+ const lastUserIndex = (() => {
134
+ for (let index = thread.messages.length - 1; index >= 0; index -= 1) {
135
+ if (thread.messages[index]?.role === "user")
136
+ return index;
137
+ }
138
+ return -1;
139
+ })();
140
+ // Turn actions attach by id, not list index: the map below renders a windowed
141
+ // slice (ENG-218), so positional indices no longer line up with thread.messages.
142
+ const lastUserId = lastUserIndex >= 0 ? thread.messages[lastUserIndex]?.id : undefined;
143
+ const editLast = () => {
144
+ if (busy || lastUserIndex < 0)
145
+ return;
146
+ const message = thread.messages[lastUserIndex];
147
+ if (!message)
148
+ return;
149
+ thread.setMessages(thread.messages.slice(0, lastUserIndex));
150
+ setQueued(null);
151
+ setDraft(userText(message));
152
+ requestAnimationFrame(() => textareaRef.current?.focus());
153
+ };
154
+ // ENG-215 — regenerate the last assistant turn (re-issues from the preserved
155
+ // user message; no duplication). Only when idle and an assistant turn exists.
156
+ const lastAssistantIndex = (() => {
157
+ for (let index = thread.messages.length - 1; index >= 0; index -= 1) {
158
+ if (thread.messages[index]?.role === "assistant")
159
+ return index;
160
+ }
161
+ return -1;
162
+ })();
163
+ const lastAssistantId = lastAssistantIndex >= 0 ? thread.messages[lastAssistantIndex]?.id : undefined;
164
+ const regenerateLast = () => {
165
+ if (busy || lastAssistantIndex < 0)
166
+ return;
167
+ void thread.regenerate();
168
+ };
169
+ // ENG-214 — a broken turn (failed send, mid-stream drop, any thread.error)
170
+ // surfaces VISIBLY in the thread, not only through the hidden status span.
171
+ // The copy stays friendly — raw transport errors are announced to assistive
172
+ // tech below but never printed to end users. Retry regenerates the failed
173
+ // turn from the preserved user message (no duplication).
174
+ const errorBanner = thread.error ? (_jsxs("div", { className: "fl-error", children: [_jsx("span", { children: "Something went wrong and the response didn\u2019t finish." }), _jsx("button", { type: "button", className: "fl-error-retry", onClick: () => {
175
+ // Nothing to re-issue (sends append the user turn before any request
176
+ // fires, so this is a defensive rail): degrade to dismissing the
177
+ // error instead of letting regenerate() throw on an empty thread.
178
+ if (thread.messages.length === 0) {
179
+ thread.clearError();
180
+ return;
181
+ }
182
+ void thread.regenerate();
183
+ }, children: "Retry" })] })) : null;
184
+ const composer = (_jsx(Composer, { composer: composerApi, busy: busy, status: thread.status, errorMessage: thread.status === "error" && thread.error ? thread.error.message : undefined, onStop: () => void thread.stop(), onVoice: onVoice }));
185
+ const approvals = thread.messages.flatMap(message => message.parts).filter(isToolUIPart).filter(part => part.state === "approval-requested");
186
+ // Lane pick C1 — the live status ribbon: while the turn works through tool
187
+ // calls (and no text has started flowing), the ACTIVE call narrates above
188
+ // the composer — label · elapsed · step N of M. The transcript stays
189
+ // beat-free (parts.tsx renders only errored calls). Once text streams the
190
+ // ribbon yields the floor to the caret choreography.
191
+ const activeToolParts = (activeAssistant?.parts ?? []).filter(isToolUIPart);
192
+ const liveToolPart = [...activeToolParts].reverse()
193
+ .find(part => part.state !== "output-available" && part.state !== "output-error");
194
+ // A turn parked on an approval is not "busy" (the stream yielded), but the
195
+ // pause still narrates: the ribbon holds "— waiting for your approval" while
196
+ // the card sits in the transcript.
197
+ const awaitingApprovalPart = activeToolParts.find(part => part.state === "approval-requested");
198
+ const activeToolPart = busy && !assistantHasVisibleText
199
+ ? liveToolPart ?? (activeToolParts.length > 0 && !caretShowing ? activeToolParts.at(-1) : undefined)
200
+ : awaitingApprovalPart;
201
+ const ribbon = activeToolPart ? (_jsx(StatusRibbon, { part: activeToolPart, stepIndex: activeToolParts.indexOf(activeToolPart) + 1, stepTotal: activeToolParts.length, risk: risks.get(activeToolPart.toolCallId) ?? "read" })) : null;
202
+ // Lane pick 2E — the WHOLE thread surface is the drop target (the composer
203
+ // bar no longer owns drag): a huge, overshoot-proof zone with a centered
204
+ // card naming what will happen. Depth counter as before (child crossings).
205
+ const { dragDepth, setDragDepth, setFiles } = composerApi;
206
+ const dropProps = {
207
+ onDragEnter: (event) => {
208
+ if (!dragHasFiles(event))
209
+ return;
210
+ event.preventDefault();
211
+ setDragDepth(depth => depth + 1);
212
+ },
213
+ onDragOver: (event) => {
214
+ if (dragHasFiles(event))
215
+ event.preventDefault();
216
+ },
217
+ onDragLeave: (event) => {
218
+ if (dragHasFiles(event))
219
+ setDragDepth(depth => Math.max(0, depth - 1));
220
+ },
221
+ onDrop: (event) => {
222
+ if (!dragHasFiles(event))
223
+ return;
224
+ event.preventDefault();
225
+ setDragDepth(0);
226
+ const dropped = Array.from(event.dataTransfer.files);
227
+ if (dropped.length > 0)
228
+ setFiles(current => [...current, ...dropped]);
229
+ },
230
+ };
231
+ const dropOverlay = dragDepth > 0 ? (_jsx("div", { className: "fl-drop fl-drop--thread", children: _jsxs("div", { className: "fl-drop-card", children: [_jsx("svg", { width: "26", height: "26", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.8", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: _jsx("path", { d: "m21.44 11.05-9.19 9.19a6 6 0 0 1-8.49-8.49l8.57-8.57A4 4 0 1 1 18 8.84l-8.59 8.57a2 2 0 0 1-2.83-2.83l8.49-8.48" }) }), "Drop files to attach to your message"] }) })) : null;
232
+ if (landing) {
233
+ return (_jsx(ChromeRoot, { children: _jsxs("div", { className: "fl-thread", role: "region", "aria-label": "Vendo conversation", ...dropProps, children: [dropOverlay, _jsxs("div", { className: "fl-landing", children: [tutorialActive ? (
234
+ // The one-time tutorial replaces the headline (and the host's
235
+ // send-on-tap suggestion chips — two chip rows with different
236
+ // behaviors would read as one). Chips PREFILL, never send.
237
+ _jsxs("div", { className: "fl-greeting", role: "group", "aria-label": "Getting started", children: [_jsx("p", { className: "fl-greeting-intro", children: tutorial.intro }), _jsx("div", { className: "fl-chips fl-greeting-chips", children: tutorial.prompts.slice(0, 3).map((text, i) => (_jsx("button", { type: "button", className: "fl-chip", onClick: () => {
238
+ setDraft(text);
239
+ requestAnimationFrame(() => textareaRef.current?.focus());
240
+ }, children: text }, `${i}-${text}`))) })] })) : (_jsx("h1", { className: "fl-greet", children: greeting })), errorBanner, composerAccessory, _jsx("div", { className: "fl-landing-composer", children: composer }), !tutorialActive && suggestions.length > 0 ? (
241
+ // Lane pick 4B — object suggestions render as two-line starter
242
+ // cards (title + concrete outcome, optional host icon); plain
243
+ // strings keep the pill chip. A MIXED array renders both
244
+ // containers (cards grid, then a chips row) so string entries
245
+ // never stretch as grid cells (AI-review catch). Both send on
246
+ // tap, unchanged.
247
+ _jsxs(_Fragment, { children: [suggestions.some(s => typeof s !== "string") ? (_jsx("div", { className: "fl-cards", children: suggestions.flatMap((suggestion, i) => {
248
+ if (typeof suggestion === "string")
249
+ return [];
250
+ const prompt = suggestion.prompt ?? suggestion.title;
251
+ return [(_jsxs("button", { type: "button", className: "fl-card", onClick: () => send(prompt), children: [suggestion.icon, _jsx("b", { children: suggestion.title }), _jsx("span", { children: suggestion.description })] }, `${i}-${suggestion.title}`))];
252
+ }) })) : null, suggestions.some(s => typeof s === "string") ? (_jsx("div", { className: "fl-chips", children: suggestions.flatMap((text, i) => (typeof text === "string"
253
+ ? [_jsx("button", { type: "button", className: "fl-chip", onClick: () => send(text), children: text }, `${i}-${text}`)]
254
+ : [])) })) : null] })) : null] })] }) }));
255
+ }
256
+ return (_jsxs(ChromeRoot, { children: [_jsxs("div", { className: "fl-thread", role: "region", "aria-label": "Vendo conversation", ...dropProps, children: [dropOverlay, _jsx(MessageList, { scroll: scroll, messageWindow: messageWindow, busy: busy, risks: risks, isRestored: isRestored, activeAssistantId: activeAssistant?.id, lastUserId: lastUserId, lastAssistantId: lastAssistantId, onEditLast: editLast, onRegenerateLast: regenerateLast, approvals: approvals, guardApprovals: guardApprovals, cardRefs: approvalCardRefs, respond: response => thread.addToolApprovalResponse(response), onMorph: setMorph, messages: thread.messages, sendMessage: message => thread.sendMessage(message), awaitingFirstChunk: awaitingFirstChunk, working: working }), errorBanner, composerAccessory, ribbon, composer] }), morph ? _jsx(MorphToast, { ...morph, onDone: () => setMorph(null) }) : null] }));
257
+ }
258
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/chrome/thread/index.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { ApprovalRequest, RiskLabel } from "@vendoai/core";
2
+ import { type UIMessage } from "ai";
3
+ export declare function partData(part: UIMessage["parts"][number]): unknown;
4
+ export declare const SYNTHESIZED_CREATED_AT = "1970-01-01T00:00:00.000Z";
5
+ export declare function riskByCall(messages: UIMessage[]): Map<string, RiskLabel>;
6
+ /** Guard approval metadata by tool call — carried in the data-vendo-approval
7
+ part beside the native ai-SDK approval (whose own id is transport-local). */
8
+ export declare function approvalByCall(messages: UIMessage[]): Map<string, {
9
+ approvalId?: string;
10
+ invalidatedGrant?: ApprovalRequest["invalidatedGrant"];
11
+ }>;
12
+ export declare function toolName(part: Extract<UIMessage["parts"][number], {
13
+ toolCallId: string;
14
+ }>): string;
15
+ /** The app-boundary title: the payload's `name`, else its first heading Text node. */
16
+ export declare function appTitle(payload: unknown): string | undefined;
17
+ /** ENG-216 — collapse runs of consecutive identical tool chips (e.g. eight
18
+ `host_listClientDocuments` calls) into one entry carrying a count. The
19
+ latest part in the run is kept so the chip icon reflects the final state. */
20
+ export declare function collapseToolRuns(parts: UIMessage["parts"]): {
21
+ part: UIMessage["parts"][number];
22
+ index: number;
23
+ count: number;
24
+ }[];
25
+ /** The plain text a user turn carried, joined across its text parts — the seed
26
+ for "edit last message" (ENG-215). */
27
+ export declare function userText(message: UIMessage): string;
28
+ /** What "copy this turn" yields for an assistant message: its text parts (the
29
+ markdown source), blank-line separated — tool beats and views don't copy. */
30
+ export declare function assistantText(message: UIMessage): string;
31
+ /** ENG-216 — the in-thread approval preview is built client-side (the wire part
32
+ carries no descriptor), so format args as readable `Label: value` lines
33
+ instead of the raw JSON with literal \n escapes end users were reading. */
34
+ export declare function preview(input: unknown): string;
35
+ //# sourceMappingURL=message-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-data.d.ts","sourceRoot":"","sources":["../../../src/chrome/thread/message-data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAgB,KAAK,SAAS,EAAE,MAAM,IAAI,CAAC;AAIlD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,GAAG,OAAO,CAElE;AAOD,eAAO,MAAM,sBAAsB,6BAA6B,CAAC;AAEjE,wBAAgB,UAAU,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAYxE;AAED;gFACgF;AAChF,wBAAgB,cAAc,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,eAAe,CAAC,kBAAkB,CAAC,CAAC;CACxD,CAAC,CAwBD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,EAAE;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,MAAM,CAElG;AAED,sFAAsF;AACtF,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAW7D;AAcD;;gFAEgF;AAChF,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,GACxB;IAAE,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,CAiBtE;AAED;yCACyC;AACzC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,SAAS,GAAG,MAAM,CAKnD;AAED;gFACgF;AAChF,wBAAgB,aAAa,CAAC,OAAO,EAAE,SAAS,GAAG,MAAM,CAKxD;AAED;;8EAE8E;AAC9E,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAS9C"}
@@ -0,0 +1,127 @@
1
+ import { isToolUIPart } from "ai";
2
+ import { previewArgs } from "../humanize.js";
3
+ import { LONG_TEXT_CAP, truncateHead } from "../truncate.js";
4
+ export function partData(part) {
5
+ return "data" in part ? part.data : part;
6
+ }
7
+ // ENG-216 — a stable placeholder for the in-thread synthesized ApprovalRequest's
8
+ // required `createdAt`. The wire approval part carries no timestamp; this value
9
+ // is never displayed (the card hides the context byline in-thread) and a fixed
10
+ // constant replaces the former per-render `new Date()` that churned on every
11
+ // re-render and broke deterministic tests.
12
+ export const SYNTHESIZED_CREATED_AT = "1970-01-01T00:00:00.000Z";
13
+ export function riskByCall(messages) {
14
+ const risks = new Map();
15
+ for (const message of messages) {
16
+ for (const part of message.parts) {
17
+ if (part.type !== "data-vendo-approval")
18
+ continue;
19
+ const data = partData(part);
20
+ if (typeof data.toolCallId === "string" && ["read", "write", "destructive"].includes(String(data.risk))) {
21
+ risks.set(data.toolCallId, data.risk);
22
+ }
23
+ }
24
+ }
25
+ return risks;
26
+ }
27
+ /** Guard approval metadata by tool call — carried in the data-vendo-approval
28
+ part beside the native ai-SDK approval (whose own id is transport-local). */
29
+ export function approvalByCall(messages) {
30
+ const approvals = new Map();
31
+ for (const message of messages) {
32
+ for (const part of message.parts) {
33
+ if (part.type !== "data-vendo-approval")
34
+ continue;
35
+ const data = partData(part);
36
+ if (typeof data.toolCallId !== "string")
37
+ continue;
38
+ approvals.set(data.toolCallId, {
39
+ ...(typeof data.approvalId === "string" ? { approvalId: data.approvalId } : {}),
40
+ ...(typeof data.invalidatedGrant?.id === "string"
41
+ && typeof data.invalidatedGrant.grantedAt === "string"
42
+ ? { invalidatedGrant: data.invalidatedGrant }
43
+ : {}),
44
+ });
45
+ }
46
+ }
47
+ return approvals;
48
+ }
49
+ export function toolName(part) {
50
+ return part.type === "dynamic-tool" && "toolName" in part ? part.toolName : part.type.replace(/^tool-/, "");
51
+ }
52
+ /** The app-boundary title: the payload's `name`, else its first heading Text node. */
53
+ export function appTitle(payload) {
54
+ const named = payload.name;
55
+ if (typeof named === "string" && named.trim())
56
+ return named;
57
+ const nodes = payload.nodes;
58
+ if (!Array.isArray(nodes))
59
+ return undefined;
60
+ for (const node of nodes) {
61
+ if (node.component === "Text" && node.props?.variant === "heading" && typeof node.props.text === "string") {
62
+ return node.props.text;
63
+ }
64
+ }
65
+ return undefined;
66
+ }
67
+ /** A stable signature for a tool part — same tool + same input = the same call. */
68
+ function toolSignature(part) {
69
+ const input = "input" in part ? part.input : undefined;
70
+ let serialized;
71
+ try {
72
+ serialized = JSON.stringify(input);
73
+ }
74
+ catch {
75
+ serialized = String(input);
76
+ }
77
+ return `${toolName(part)}::${serialized}`;
78
+ }
79
+ /** ENG-216 — collapse runs of consecutive identical tool chips (e.g. eight
80
+ `host_listClientDocuments` calls) into one entry carrying a count. The
81
+ latest part in the run is kept so the chip icon reflects the final state. */
82
+ export function collapseToolRuns(parts) {
83
+ const items = [];
84
+ parts.forEach((part, index) => {
85
+ const previous = items.at(-1);
86
+ if (isToolUIPart(part)
87
+ && previous !== undefined
88
+ && isToolUIPart(previous.part)
89
+ && toolSignature(previous.part) === toolSignature(part)) {
90
+ previous.count += 1;
91
+ previous.part = part;
92
+ return;
93
+ }
94
+ items.push({ part, index, count: 1 });
95
+ });
96
+ return items;
97
+ }
98
+ /** The plain text a user turn carried, joined across its text parts — the seed
99
+ for "edit last message" (ENG-215). */
100
+ export function userText(message) {
101
+ return message.parts
102
+ .filter((part) => part.type === "text")
103
+ .map(part => part.text)
104
+ .join("");
105
+ }
106
+ /** What "copy this turn" yields for an assistant message: its text parts (the
107
+ markdown source), blank-line separated — tool beats and views don't copy. */
108
+ export function assistantText(message) {
109
+ return message.parts
110
+ .filter((part) => part.type === "text")
111
+ .map(part => part.text)
112
+ .join("\n\n");
113
+ }
114
+ /** ENG-216 — the in-thread approval preview is built client-side (the wire part
115
+ carries no descriptor), so format args as readable `Label: value` lines
116
+ instead of the raw JSON with literal \n escapes end users were reading. */
117
+ export function preview(input) {
118
+ // ENG-216 — readable `Label: value` lines instead of raw JSON. ENG-218 — then
119
+ // bound the result before it reaches the DOM: a huge argument blob (dumped
120
+ // rows, base64) otherwise renders unbounded inside the approval card's <pre>,
121
+ // blowing up layout and the node count.
122
+ const formatted = previewArgs(input);
123
+ return formatted.length > LONG_TEXT_CAP
124
+ ? `${truncateHead(formatted)}\n… (${(formatted.length / 1000).toFixed(0)}k chars, truncated)`
125
+ : formatted;
126
+ }
127
+ //# sourceMappingURL=message-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-data.js","sourceRoot":"","sources":["../../../src/chrome/thread/message-data.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { RiskLabel } from "@vendoai/core";
2
+ import type { UIMessage } from "ai";
3
+ import type { ComponentProps } from "react";
4
+ import { ThreadApprovals, ThreadConnectRequests } from "./parts.js";
5
+ import type { useMessageWindow, useStickToBottom } from "./scrolling.js";
6
+ /** The transcript pane: the windowed message list (ENG-218), parked approval
7
+ and connect cards, the ENG-217 streaming indicators, and the jump-to-latest
8
+ affordance (ENG-213). Pure presentation over the thread-level state. */
9
+ export declare function MessageList({ scroll, messageWindow, busy, risks, isRestored, activeAssistantId, lastUserId, lastAssistantId, onEditLast, onRegenerateLast, approvals, guardApprovals, cardRefs, respond, onMorph, messages, sendMessage, awaitingFirstChunk, working, }: {
10
+ scroll: ReturnType<typeof useStickToBottom>;
11
+ messageWindow: ReturnType<typeof useMessageWindow>;
12
+ busy: boolean;
13
+ risks: Map<string, RiskLabel>;
14
+ isRestored: (id: string) => boolean;
15
+ activeAssistantId?: string | undefined;
16
+ lastUserId?: string | undefined;
17
+ lastAssistantId?: string | undefined;
18
+ onEditLast: () => void;
19
+ onRegenerateLast: () => void;
20
+ approvals: ComponentProps<typeof ThreadApprovals>["approvals"];
21
+ guardApprovals: ComponentProps<typeof ThreadApprovals>["guardApprovals"];
22
+ cardRefs: ComponentProps<typeof ThreadApprovals>["cardRefs"];
23
+ respond: ComponentProps<typeof ThreadApprovals>["respond"];
24
+ onMorph: ComponentProps<typeof ThreadApprovals>["onMorph"];
25
+ messages: UIMessage[];
26
+ sendMessage: ComponentProps<typeof ThreadConnectRequests>["sendMessage"];
27
+ awaitingFirstChunk: boolean;
28
+ working: boolean;
29
+ }): import("react").JSX.Element;
30
+ //# sourceMappingURL=message-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-list.d.ts","sourceRoot":"","sources":["../../../src/chrome/thread/message-list.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAG5C,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEzE;;2EAE2E;AAC3E,wBAAgB,WAAW,CAAC,EAC1B,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAC9C,iBAAiB,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,gBAAgB,EAC5E,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EACrD,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE,OAAO,GACnD,EAAE;IACD,MAAM,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;IAC5C,aAAa,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;IACnD,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC9B,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IACpC,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,SAAS,EAAE,cAAc,CAAC,OAAO,eAAe,CAAC,CAAC,WAAW,CAAC,CAAC;IAC/D,cAAc,EAAE,cAAc,CAAC,OAAO,eAAe,CAAC,CAAC,gBAAgB,CAAC,CAAC;IACzE,QAAQ,EAAE,cAAc,CAAC,OAAO,eAAe,CAAC,CAAC,UAAU,CAAC,CAAC;IAC7D,OAAO,EAAE,cAAc,CAAC,OAAO,eAAe,CAAC,CAAC,SAAS,CAAC,CAAC;IAC3D,OAAO,EAAE,cAAc,CAAC,OAAO,eAAe,CAAC,CAAC,SAAS,CAAC,CAAC;IAC3D,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,WAAW,EAAE,cAAc,CAAC,OAAO,qBAAqB,CAAC,CAAC,aAAa,CAAC,CAAC;IACzE,kBAAkB,EAAE,OAAO,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;CAClB,+BAiFA"}
@@ -0,0 +1,11 @@
1
+ import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { FluidThinking } from "../fluid-thinking.js";
3
+ import { ThreadMessage } from "./message.js";
4
+ import { ThreadApprovals, ThreadConnectRequests } from "./parts.js";
5
+ /** The transcript pane: the windowed message list (ENG-218), parked approval
6
+ and connect cards, the ENG-217 streaming indicators, and the jump-to-latest
7
+ affordance (ENG-213). Pure presentation over the thread-level state. */
8
+ export function MessageList({ scroll, messageWindow, busy, risks, isRestored, activeAssistantId, lastUserId, lastAssistantId, onEditLast, onRegenerateLast, approvals, guardApprovals, cardRefs, respond, onMorph, messages, sendMessage, awaitingFirstChunk, working, }) {
9
+ return (_jsxs("div", { className: "fl-msglist-wrap", children: [_jsxs("div", { className: "fl-msglist", role: "log", "aria-label": "Conversation messages", "aria-live": "polite", "aria-busy": busy, ref: scroll.listRef, onScroll: () => { scroll.onScroll(); messageWindow.onNearTop(); }, children: [messageWindow.hasOlder ? (_jsxs("button", { type: "button", className: "fl-load-older", onClick: messageWindow.loadOlder, children: ["Show ", messageWindow.olderCount, " earlier message", messageWindow.olderCount === 1 ? "" : "s"] })) : null, messageWindow.windowed.map(message => (_jsx(ThreadMessage, { message: message, restored: isRestored(message.id), risks: risks, busy: busy, activeAssistantId: activeAssistantId, lastUserId: lastUserId, lastAssistantId: lastAssistantId, onEditLast: onEditLast, onRegenerateLast: onRegenerateLast }, message.id))), _jsx(ThreadApprovals, { approvals: approvals, risks: risks, guardApprovals: guardApprovals, cardRefs: cardRefs, respond: respond, onMorph: onMorph }), _jsx(ThreadConnectRequests, { messages: messages, sendMessage: sendMessage }), awaitingFirstChunk ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "fl-generating", children: [_jsx("span", { className: "fl-pulse", "aria-hidden": "true" }), "Generating\u2026"] }), _jsxs("div", { className: "fl-skeleton", "aria-hidden": "true", children: [_jsx("div", { className: "fl-skeleton-bar" }), _jsx("div", { className: "fl-skeleton-bar" }), _jsx("div", { className: "fl-skeleton-bar" })] })] })) : null, working ? _jsx(FluidThinking, { label: "Working" }) : null] }), scroll.showJump ? (_jsxs("button", { type: "button", className: "fl-newbar", "aria-label": `Jump to latest — ${scroll.unseenCount === 1 ? "1 new reply" : `${scroll.unseenCount} new replies`}`, onClick: scroll.jumpToLatest, children: [_jsxs("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: [_jsx("path", { d: "M12 5v14" }), _jsx("path", { d: "m19 12-7 7-7-7" })] }), scroll.unseenCount === 1 ? "1 new reply" : `${scroll.unseenCount} new replies`, scroll.snippet ? _jsx("small", { children: scroll.snippet }) : null] })) : null] }));
10
+ }
11
+ //# sourceMappingURL=message-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-list.js","sourceRoot":"","sources":["../../../src/chrome/thread/message-list.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { RiskLabel } from "@vendoai/core";
2
+ import { type UIMessage } from "ai";
3
+ /** One turn in the transcript: the user attachments beside the bubble
4
+ (ENG-225), the article with its stream parts, and the settled-turn
5
+ actions (Copy always; Edit on the last user turn, Regenerate on the
6
+ last assistant turn — ENG-215). */
7
+ export declare function ThreadMessage({ message, restored, risks, busy, activeAssistantId, lastUserId, lastAssistantId, onEditLast, onRegenerateLast }: {
8
+ message: UIMessage;
9
+ restored: boolean;
10
+ risks: Map<string, RiskLabel>;
11
+ busy: boolean;
12
+ activeAssistantId?: string | undefined;
13
+ lastUserId?: string | undefined;
14
+ lastAssistantId?: string | undefined;
15
+ onEditLast: () => void;
16
+ onRegenerateLast: () => void;
17
+ }): import("react").JSX.Element;
18
+ //# sourceMappingURL=message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../../src/chrome/thread/message.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAgB,KAAK,SAAS,EAAE,MAAM,IAAI,CAAC;AAyDlD;;;sCAGsC;AACtC,wBAAgB,aAAa,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,gBAAgB,EAAE,EAAE;IAC9I,OAAO,EAAE,SAAS,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,gBAAgB,EAAE,MAAM,IAAI,CAAC;CAC9B,+BAuEA"}
@@ -0,0 +1,57 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { isToolUIPart } from "ai";
3
+ import { Fragment } from "react";
4
+ import { useVendoContext } from "../../context.js";
5
+ import { useCopyFeedback } from "../clipboard.js";
6
+ import { toolTitle } from "../humanize.js";
7
+ import { SentAttachment } from "./attachments.js";
8
+ import { assistantText, collapseToolRuns, toolName, userText } from "./message-data.js";
9
+ import { ThreadPart } from "./parts.js";
10
+ /** Lane pick 8C — the settled turn's quiet sources row: every completed tool
11
+ call the turn drew on, as informational chips ("what did it read?"). The
12
+ full mechanical record stays in the Activity panel; these are the in-place
13
+ scent. Only read-risk calls qualify — writes are actions, not sources. */
14
+ function TurnSources({ message, risks }) {
15
+ const { tools } = useVendoContext();
16
+ // Identical repeated calls collapse to one chip with a ×N count — the same
17
+ // ENG-216 run-collapse identity (name + args) the old beat stack used.
18
+ const sources = collapseToolRuns(message.parts).filter(({ part }) => isToolUIPart(part) && part.state === "output-available"
19
+ && (risks.get(part.toolCallId) ?? "read") === "read");
20
+ if (sources.length === 0)
21
+ return null;
22
+ return (_jsx("div", { className: "fl-sources", "aria-label": "Sources", children: sources.map(({ part, count }) => {
23
+ const toolPart = part;
24
+ const name = toolName(toolPart);
25
+ return (_jsxs("span", { className: "fl-source", title: "Recorded in Activity", children: [_jsx("i", { "aria-hidden": "true" }), toolTitle(name, tools[name]), count > 1 ? _jsxs("span", { className: "fl-source-count", "aria-label": `repeated ${count} times`, children: ["\u00D7", count] }) : null] }, toolPart.toolCallId));
26
+ }) }));
27
+ }
28
+ /** ENG-225 — the copy turn action (.fl-turn-actions design). */
29
+ function CopyTurnButton({ text }) {
30
+ const [copied, copy] = useCopyFeedback();
31
+ return (_jsxs("button", { type: "button", className: "fl-turn-btn", "aria-label": "Copy message", onClick: () => copy(text), children: [copied ? (_jsx("svg", { width: "13", height: "13", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: _jsx("path", { d: "M20 6 9 17l-5-5" }) })) : (_jsxs("svg", { width: "13", height: "13", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: [_jsx("rect", { width: "13", height: "13", x: "9", y: "9", rx: "2" }), _jsx("path", { d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" })] })), copied ? "Copied" : "Copy"] }));
32
+ }
33
+ /** One turn in the transcript: the user attachments beside the bubble
34
+ (ENG-225), the article with its stream parts, and the settled-turn
35
+ actions (Copy always; Edit on the last user turn, Regenerate on the
36
+ last assistant turn — ENG-215). */
37
+ export function ThreadMessage({ message, restored, risks, busy, activeAssistantId, lastUserId, lastAssistantId, onEditLast, onRegenerateLast }) {
38
+ // ENG-225 — a user turn's attachments render BESIDE the bubble
39
+ // (the designed .fl-turn-user-att block), not inside it; a
40
+ // files-only send has no bubble at all.
41
+ const sentFiles = message.role === "user"
42
+ ? message.parts.filter((part) => part.type === "file")
43
+ : [];
44
+ const bubbleText = message.role === "user" ? userText(message) : assistantText(message);
45
+ const skipBubble = message.role === "user" && bubbleText.length === 0
46
+ && message.parts.every(part => part.type === "file");
47
+ // ENG-225 — every settled turn carries a Copy action (hover-
48
+ // revealed, see chrome-css); Edit stays on the last user turn and
49
+ // Regenerate on the last assistant turn (ENG-215). The actively
50
+ // streaming turn gets no actions — its text is still arriving.
51
+ const streamingTurn = busy && message.role === "assistant" && message.id === activeAssistantId;
52
+ const showEdit = !busy && message.role === "user" && message.id === lastUserId;
53
+ const showRegenerate = !busy && message.role === "assistant" && message.id === lastAssistantId;
54
+ const showActions = !streamingTurn && (bubbleText.length > 0 || showEdit || showRegenerate);
55
+ return (_jsxs(Fragment, { children: [sentFiles.length > 0 ? (_jsx("div", { className: `fl-turn-user-att${restored ? " fl-no-entrance" : ""}`, children: sentFiles.map((part, index) => _jsx(SentAttachment, { part: part }, index)) })) : null, skipBubble ? null : (_jsxs("article", { className: `${message.role === "user" ? "fl-turn-user" : "fl-turn-assistant"}${restored ? " fl-no-entrance" : ""}`, "data-role": message.role, "aria-label": `${message.role} message`, children: [collapseToolRuns(message.parts).map(({ part, index, count }) => (_jsx(ThreadPart, { part: part, partKey: `${message.id}-${index}`, role: message.role, restored: restored, count: count, risks: risks }, `${message.id}-${index}`))), !streamingTurn && message.role === "assistant" ? (_jsx(TurnSources, { message: message, risks: risks })) : null, showActions ? (_jsxs("div", { className: "fl-turn-actions", children: [bubbleText.length > 0 ? _jsx(CopyTurnButton, { text: bubbleText }) : null, showEdit ? (_jsxs("button", { type: "button", className: "fl-turn-btn", "aria-label": "Edit message", onClick: onEditLast, children: [_jsxs("svg", { width: "13", height: "13", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: [_jsx("path", { d: "M12 20h9" }), _jsx("path", { d: "M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4Z" })] }), "Edit"] })) : null, showRegenerate ? (_jsxs("button", { type: "button", className: "fl-turn-btn", "aria-label": "Regenerate", onClick: onRegenerateLast, children: [_jsxs("svg", { width: "13", height: "13", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: [_jsx("path", { d: "M3 12a9 9 0 0 1 15-6.7L21 8" }), _jsx("path", { d: "M21 3v5h-5" }), _jsx("path", { d: "M21 12a9 9 0 0 1-15 6.7L3 16" }), _jsx("path", { d: "M3 21v-5h5" })] }), "Regenerate"] })) : null] })) : null] }))] }));
56
+ }
57
+ //# sourceMappingURL=message.js.map