@oxy.so/bloom 7.0.1 → 7.1.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 (517) hide show
  1. package/assets/character-runtime/README.md +55 -0
  2. package/assets/character-runtime/appearance-codec.mjs +149 -0
  3. package/assets/character-runtime/integrity.json +6 -0
  4. package/assets/character-runtime/legacy-engine.mjs +105 -0
  5. package/assets/character-runtime/legacy-geometry.mjs +166 -0
  6. package/assets/character-runtime/legacy-worker.mjs +85 -0
  7. package/assets/character-runtime/orbit-characters.data +0 -0
  8. package/assets/character-runtime/orbit-characters.mjs +30 -0
  9. package/assets/character-runtime/orbit-characters.wasm +0 -0
  10. package/assets/character-runtime/preparation-worker.mjs +19 -0
  11. package/assets/character-runtime/runtime.mjs +820 -0
  12. package/assets/character-runtime/thumbnails/eyes/crescent_inset.png +0 -0
  13. package/assets/character-runtime/thumbnails/eyes/dots.png +0 -0
  14. package/assets/character-runtime/thumbnails/eyes/double_highlights.png +0 -0
  15. package/assets/character-runtime/thumbnails/eyes/highlight_capsules.png +0 -0
  16. package/assets/character-runtime/thumbnails/eyes/oval.png +0 -0
  17. package/assets/character-runtime/thumbnails/eyes/round_inset.png +0 -0
  18. package/assets/character-runtime/thumbnails/eyes/sleepy_lids.png +0 -0
  19. package/assets/character-runtime/thumbnails/eyes/sparkle_capsules.png +0 -0
  20. package/assets/character-runtime/thumbnails/eyes/swept_lids.png +0 -0
  21. package/assets/character-runtime/thumbnails/shapes/capsule.png +0 -0
  22. package/assets/character-runtime/thumbnails/shapes/circle.png +0 -0
  23. package/assets/character-runtime/thumbnails/shapes/circle_two_ears.png +0 -0
  24. package/assets/character-runtime/thumbnails/shapes/four_lobed_butterfly.png +0 -0
  25. package/assets/character-runtime/thumbnails/shapes/heart.png +0 -0
  26. package/assets/character-runtime/thumbnails/shapes/rounded_cube.png +0 -0
  27. package/assets/character-runtime/thumbnails/shapes/rounded_diamond.png +0 -0
  28. package/assets/character-runtime/thumbnails/shapes/rounded_head_two_ears.png +0 -0
  29. package/assets/character-runtime/thumbnails/shapes/rounded_triangle.png +0 -0
  30. package/assets/character-runtime/thumbnails/shapes/six_lobed_flower.png +0 -0
  31. package/assets/character-runtime/thumbnails/shapes/twelve_scalloped_rosette.png +0 -0
  32. package/docs/adoption-matrix.mdx +9 -9
  33. package/docs/agent-avatar.mdx +35 -10
  34. package/docs/agent-creator.mdx +12 -4
  35. package/docs/multi-agent-chat.mdx +12 -0
  36. package/docs/project-board.mdx +3 -3
  37. package/lib/commonjs/agent-avatar/AgentAvatar.js +15 -203
  38. package/lib/commonjs/agent-avatar/AgentAvatar.js.map +1 -1
  39. package/lib/commonjs/agent-avatar/AgentAvatarProvider.js +64 -0
  40. package/lib/commonjs/agent-avatar/AgentAvatarProvider.js.map +1 -0
  41. package/lib/commonjs/agent-avatar/CharacterAvatar.js +211 -0
  42. package/lib/commonjs/agent-avatar/CharacterAvatar.js.map +1 -0
  43. package/lib/commonjs/agent-avatar/ProceduralAvatar.js +216 -0
  44. package/lib/commonjs/agent-avatar/ProceduralAvatar.js.map +1 -0
  45. package/lib/commonjs/agent-avatar/artwork.js +4 -3
  46. package/lib/commonjs/agent-avatar/artwork.js.map +1 -1
  47. package/lib/commonjs/agent-avatar/avatar-color.js +16 -0
  48. package/lib/commonjs/agent-avatar/avatar-color.js.map +1 -0
  49. package/lib/commonjs/agent-avatar/character-html.js +25 -0
  50. package/lib/commonjs/agent-avatar/character-html.js.map +1 -0
  51. package/lib/commonjs/agent-avatar/character-runtime-module.js +39 -0
  52. package/lib/commonjs/agent-avatar/character-runtime-module.js.map +1 -0
  53. package/lib/commonjs/agent-avatar/character-webview.js +18 -0
  54. package/lib/commonjs/agent-avatar/character-webview.js.map +1 -0
  55. package/lib/commonjs/agent-avatar/config-character.js +36 -0
  56. package/lib/commonjs/agent-avatar/config-character.js.map +1 -0
  57. package/lib/commonjs/agent-avatar/context.js +3 -1
  58. package/lib/commonjs/agent-avatar/context.js.map +1 -1
  59. package/lib/commonjs/agent-avatar/index.js +7 -0
  60. package/lib/commonjs/agent-avatar/index.js.map +1 -1
  61. package/lib/commonjs/agent-avatar/legacy-contours.js +57 -0
  62. package/lib/commonjs/agent-avatar/legacy-contours.js.map +1 -0
  63. package/lib/commonjs/agent-avatar/legacy-recipe.js +112 -0
  64. package/lib/commonjs/agent-avatar/legacy-recipe.js.map +1 -0
  65. package/lib/commonjs/agent-avatar/messages.js +2 -1
  66. package/lib/commonjs/agent-avatar/messages.js.map +1 -1
  67. package/lib/commonjs/agent-avatar/model.js +2 -0
  68. package/lib/commonjs/agent-avatar/model.js.map +1 -1
  69. package/lib/commonjs/agent-creator/AgentCreatorBase.js +245 -21
  70. package/lib/commonjs/agent-creator/AgentCreatorBase.js.map +1 -1
  71. package/lib/commonjs/agent-creator/CharacterControls.js +113 -0
  72. package/lib/commonjs/agent-creator/CharacterControls.js.map +1 -0
  73. package/lib/commonjs/agent-creator/EmotionPicker.js +51 -18
  74. package/lib/commonjs/agent-creator/EmotionPicker.js.map +1 -1
  75. package/lib/commonjs/agent-creator/ShapeArc.js +56 -26
  76. package/lib/commonjs/agent-creator/ShapeArc.js.map +1 -1
  77. package/lib/commonjs/agent-creator/ShapeSilhouette.js +62 -0
  78. package/lib/commonjs/agent-creator/ShapeSilhouette.js.map +1 -0
  79. package/lib/commonjs/agent-creator/constants.js +48 -1
  80. package/lib/commonjs/agent-creator/constants.js.map +1 -1
  81. package/lib/commonjs/agent-creator/messages.js +9 -0
  82. package/lib/commonjs/agent-creator/messages.js.map +1 -1
  83. package/lib/commonjs/agent-creator/shared.js +7 -10
  84. package/lib/commonjs/agent-creator/shared.js.map +1 -1
  85. package/lib/commonjs/agent-thinking/AgentThinking.js +4 -62
  86. package/lib/commonjs/agent-thinking/AgentThinking.js.map +1 -1
  87. package/lib/commonjs/agent-thinking/ThinkingLabel.js +77 -0
  88. package/lib/commonjs/agent-thinking/ThinkingLabel.js.map +1 -0
  89. package/lib/commonjs/chart-cards/TokensChartCard.js +20 -5
  90. package/lib/commonjs/chart-cards/TokensChartCard.js.map +1 -1
  91. package/lib/commonjs/locale/translations/ar.js +11 -1
  92. package/lib/commonjs/locale/translations/ar.js.map +1 -1
  93. package/lib/commonjs/locale/translations/bn.js +11 -1
  94. package/lib/commonjs/locale/translations/bn.js.map +1 -1
  95. package/lib/commonjs/locale/translations/ca.js +11 -1
  96. package/lib/commonjs/locale/translations/ca.js.map +1 -1
  97. package/lib/commonjs/locale/translations/de.js +11 -1
  98. package/lib/commonjs/locale/translations/de.js.map +1 -1
  99. package/lib/commonjs/locale/translations/es.js +11 -1
  100. package/lib/commonjs/locale/translations/es.js.map +1 -1
  101. package/lib/commonjs/locale/translations/fr.js +11 -1
  102. package/lib/commonjs/locale/translations/fr.js.map +1 -1
  103. package/lib/commonjs/locale/translations/hi.js +11 -1
  104. package/lib/commonjs/locale/translations/hi.js.map +1 -1
  105. package/lib/commonjs/locale/translations/id.js +11 -1
  106. package/lib/commonjs/locale/translations/id.js.map +1 -1
  107. package/lib/commonjs/locale/translations/it.js +11 -1
  108. package/lib/commonjs/locale/translations/it.js.map +1 -1
  109. package/lib/commonjs/locale/translations/ja.js +11 -1
  110. package/lib/commonjs/locale/translations/ja.js.map +1 -1
  111. package/lib/commonjs/locale/translations/pt.js +11 -1
  112. package/lib/commonjs/locale/translations/pt.js.map +1 -1
  113. package/lib/commonjs/locale/translations/ru.js +11 -1
  114. package/lib/commonjs/locale/translations/ru.js.map +1 -1
  115. package/lib/commonjs/locale/translations/tr.js +11 -1
  116. package/lib/commonjs/locale/translations/tr.js.map +1 -1
  117. package/lib/commonjs/locale/translations/zh.js +11 -1
  118. package/lib/commonjs/locale/translations/zh.js.map +1 -1
  119. package/lib/commonjs/multi-agent-chat/AvatarHandoff.js +2 -4
  120. package/lib/commonjs/multi-agent-chat/AvatarHandoff.js.map +1 -1
  121. package/lib/commonjs/multi-agent-chat/ChatAgentProfile.js +97 -0
  122. package/lib/commonjs/multi-agent-chat/ChatAgentProfile.js.map +1 -0
  123. package/lib/commonjs/multi-agent-chat/EditorRail.js +4 -0
  124. package/lib/commonjs/multi-agent-chat/EditorRail.js.map +1 -1
  125. package/lib/commonjs/multi-agent-chat/MultiAgentChatBase.js +89 -126
  126. package/lib/commonjs/multi-agent-chat/MultiAgentChatBase.js.map +1 -1
  127. package/lib/commonjs/multi-agent-chat/ReplyRow.js +8 -11
  128. package/lib/commonjs/multi-agent-chat/ReplyRow.js.map +1 -1
  129. package/lib/commonjs/multi-agent-chat/handoff.js +5 -5
  130. package/lib/commonjs/multi-agent-chat/handoff.js.map +1 -1
  131. package/lib/commonjs/project-board/CreateTicketDialog.js +33 -2
  132. package/lib/commonjs/project-board/CreateTicketDialog.js.map +1 -1
  133. package/lib/commonjs/project-board/ProjectBoardBase.js +137 -38
  134. package/lib/commonjs/project-board/ProjectBoardBase.js.map +1 -1
  135. package/lib/commonjs/project-board/TicketCornerGenieSurface.web.js +34 -28
  136. package/lib/commonjs/project-board/TicketCornerGenieSurface.web.js.map +1 -1
  137. package/lib/commonjs/project-board/TicketDetailDialog.js +6 -3
  138. package/lib/commonjs/project-board/TicketDetailDialog.js.map +1 -1
  139. package/lib/commonjs/project-board/TicketGenieSurface.js +17 -7
  140. package/lib/commonjs/project-board/TicketGenieSurface.js.map +1 -1
  141. package/lib/commonjs/project-board/TicketGenieSurface.web.js +1 -1
  142. package/lib/commonjs/project-board/TicketGenieSurface.web.js.map +1 -1
  143. package/lib/commonjs/project-board/TicketPresence.js +125 -0
  144. package/lib/commonjs/project-board/TicketPresence.js.map +1 -0
  145. package/lib/commonjs/project-board/TicketTokenChart.js +23 -0
  146. package/lib/commonjs/project-board/TicketTokenChart.js.map +1 -0
  147. package/lib/commonjs/project-board/context.js +3 -1
  148. package/lib/commonjs/project-board/context.js.map +1 -1
  149. package/lib/commonjs/search/Search.js +12 -3
  150. package/lib/commonjs/search/Search.js.map +1 -1
  151. package/lib/commonjs/sidebar/SidebarToolbar.js +28 -14
  152. package/lib/commonjs/sidebar/SidebarToolbar.js.map +1 -1
  153. package/lib/commonjs/text-field/TextField.js +13 -7
  154. package/lib/commonjs/text-field/TextField.js.map +1 -1
  155. package/lib/module/agent-avatar/AgentAvatar.js +16 -204
  156. package/lib/module/agent-avatar/AgentAvatar.js.map +1 -1
  157. package/lib/module/agent-avatar/AgentAvatarProvider.js +60 -0
  158. package/lib/module/agent-avatar/AgentAvatarProvider.js.map +1 -0
  159. package/lib/module/agent-avatar/CharacterAvatar.js +207 -0
  160. package/lib/module/agent-avatar/CharacterAvatar.js.map +1 -0
  161. package/lib/module/agent-avatar/ProceduralAvatar.js +212 -0
  162. package/lib/module/agent-avatar/ProceduralAvatar.js.map +1 -0
  163. package/lib/module/agent-avatar/artwork.js +3 -3
  164. package/lib/module/agent-avatar/artwork.js.map +1 -1
  165. package/lib/module/agent-avatar/avatar-color.js +12 -0
  166. package/lib/module/agent-avatar/avatar-color.js.map +1 -0
  167. package/lib/module/agent-avatar/character-html.js +19 -0
  168. package/lib/module/agent-avatar/character-html.js.map +1 -0
  169. package/lib/module/agent-avatar/character-runtime-module.js +35 -0
  170. package/lib/module/agent-avatar/character-runtime-module.js.map +1 -0
  171. package/lib/module/agent-avatar/character-webview.js +14 -0
  172. package/lib/module/agent-avatar/character-webview.js.map +1 -0
  173. package/lib/module/agent-avatar/config-character.js +32 -0
  174. package/lib/module/agent-avatar/config-character.js.map +1 -0
  175. package/lib/module/agent-avatar/context.js +2 -0
  176. package/lib/module/agent-avatar/context.js.map +1 -1
  177. package/lib/module/agent-avatar/index.js +1 -0
  178. package/lib/module/agent-avatar/index.js.map +1 -1
  179. package/lib/module/agent-avatar/legacy-contours.js +53 -0
  180. package/lib/module/agent-avatar/legacy-contours.js.map +1 -0
  181. package/lib/module/agent-avatar/legacy-recipe.js +104 -0
  182. package/lib/module/agent-avatar/legacy-recipe.js.map +1 -0
  183. package/lib/module/agent-avatar/messages.js +2 -1
  184. package/lib/module/agent-avatar/messages.js.map +1 -1
  185. package/lib/module/agent-avatar/model.js +2 -0
  186. package/lib/module/agent-avatar/model.js.map +1 -1
  187. package/lib/module/agent-creator/AgentCreatorBase.js +242 -18
  188. package/lib/module/agent-creator/AgentCreatorBase.js.map +1 -1
  189. package/lib/module/agent-creator/CharacterControls.js +110 -0
  190. package/lib/module/agent-creator/CharacterControls.js.map +1 -0
  191. package/lib/module/agent-creator/EmotionPicker.js +52 -19
  192. package/lib/module/agent-creator/EmotionPicker.js.map +1 -1
  193. package/lib/module/agent-creator/ShapeArc.js +58 -28
  194. package/lib/module/agent-creator/ShapeArc.js.map +1 -1
  195. package/lib/module/agent-creator/ShapeSilhouette.js +57 -0
  196. package/lib/module/agent-creator/ShapeSilhouette.js.map +1 -0
  197. package/lib/module/agent-creator/constants.js +47 -0
  198. package/lib/module/agent-creator/constants.js.map +1 -1
  199. package/lib/module/agent-creator/messages.js +9 -0
  200. package/lib/module/agent-creator/messages.js.map +1 -1
  201. package/lib/module/agent-creator/shared.js +1 -9
  202. package/lib/module/agent-creator/shared.js.map +1 -1
  203. package/lib/module/agent-thinking/AgentThinking.js +5 -63
  204. package/lib/module/agent-thinking/AgentThinking.js.map +1 -1
  205. package/lib/module/agent-thinking/ThinkingLabel.js +73 -0
  206. package/lib/module/agent-thinking/ThinkingLabel.js.map +1 -0
  207. package/lib/module/chart-cards/TokensChartCard.js +20 -5
  208. package/lib/module/chart-cards/TokensChartCard.js.map +1 -1
  209. package/lib/module/locale/translations/ar.js +11 -1
  210. package/lib/module/locale/translations/ar.js.map +1 -1
  211. package/lib/module/locale/translations/bn.js +11 -1
  212. package/lib/module/locale/translations/bn.js.map +1 -1
  213. package/lib/module/locale/translations/ca.js +11 -1
  214. package/lib/module/locale/translations/ca.js.map +1 -1
  215. package/lib/module/locale/translations/de.js +11 -1
  216. package/lib/module/locale/translations/de.js.map +1 -1
  217. package/lib/module/locale/translations/es.js +11 -1
  218. package/lib/module/locale/translations/es.js.map +1 -1
  219. package/lib/module/locale/translations/fr.js +11 -1
  220. package/lib/module/locale/translations/fr.js.map +1 -1
  221. package/lib/module/locale/translations/hi.js +11 -1
  222. package/lib/module/locale/translations/hi.js.map +1 -1
  223. package/lib/module/locale/translations/id.js +11 -1
  224. package/lib/module/locale/translations/id.js.map +1 -1
  225. package/lib/module/locale/translations/it.js +11 -1
  226. package/lib/module/locale/translations/it.js.map +1 -1
  227. package/lib/module/locale/translations/ja.js +11 -1
  228. package/lib/module/locale/translations/ja.js.map +1 -1
  229. package/lib/module/locale/translations/pt.js +11 -1
  230. package/lib/module/locale/translations/pt.js.map +1 -1
  231. package/lib/module/locale/translations/ru.js +11 -1
  232. package/lib/module/locale/translations/ru.js.map +1 -1
  233. package/lib/module/locale/translations/tr.js +11 -1
  234. package/lib/module/locale/translations/tr.js.map +1 -1
  235. package/lib/module/locale/translations/zh.js +11 -1
  236. package/lib/module/locale/translations/zh.js.map +1 -1
  237. package/lib/module/multi-agent-chat/AvatarHandoff.js +3 -5
  238. package/lib/module/multi-agent-chat/AvatarHandoff.js.map +1 -1
  239. package/lib/module/multi-agent-chat/ChatAgentProfile.js +94 -0
  240. package/lib/module/multi-agent-chat/ChatAgentProfile.js.map +1 -0
  241. package/lib/module/multi-agent-chat/EditorRail.js +4 -0
  242. package/lib/module/multi-agent-chat/EditorRail.js.map +1 -1
  243. package/lib/module/multi-agent-chat/MultiAgentChatBase.js +89 -126
  244. package/lib/module/multi-agent-chat/MultiAgentChatBase.js.map +1 -1
  245. package/lib/module/multi-agent-chat/ReplyRow.js +9 -12
  246. package/lib/module/multi-agent-chat/ReplyRow.js.map +1 -1
  247. package/lib/module/multi-agent-chat/handoff.js +4 -4
  248. package/lib/module/multi-agent-chat/handoff.js.map +1 -1
  249. package/lib/module/project-board/CreateTicketDialog.js +33 -2
  250. package/lib/module/project-board/CreateTicketDialog.js.map +1 -1
  251. package/lib/module/project-board/ProjectBoardBase.js +138 -39
  252. package/lib/module/project-board/ProjectBoardBase.js.map +1 -1
  253. package/lib/module/project-board/TicketCornerGenieSurface.web.js +35 -29
  254. package/lib/module/project-board/TicketCornerGenieSurface.web.js.map +1 -1
  255. package/lib/module/project-board/TicketDetailDialog.js +7 -4
  256. package/lib/module/project-board/TicketDetailDialog.js.map +1 -1
  257. package/lib/module/project-board/TicketGenieSurface.js +17 -7
  258. package/lib/module/project-board/TicketGenieSurface.js.map +1 -1
  259. package/lib/module/project-board/TicketGenieSurface.web.js +1 -1
  260. package/lib/module/project-board/TicketGenieSurface.web.js.map +1 -1
  261. package/lib/module/project-board/TicketPresence.js +119 -0
  262. package/lib/module/project-board/TicketPresence.js.map +1 -0
  263. package/lib/module/project-board/TicketTokenChart.js +20 -0
  264. package/lib/module/project-board/TicketTokenChart.js.map +1 -0
  265. package/lib/module/project-board/context.js +2 -0
  266. package/lib/module/project-board/context.js.map +1 -1
  267. package/lib/module/search/Search.js +12 -3
  268. package/lib/module/search/Search.js.map +1 -1
  269. package/lib/module/sidebar/SidebarToolbar.js +29 -15
  270. package/lib/module/sidebar/SidebarToolbar.js.map +1 -1
  271. package/lib/module/text-field/TextField.js +13 -7
  272. package/lib/module/text-field/TextField.js.map +1 -1
  273. package/lib/typescript/commonjs/agent-avatar/AgentAvatar.d.ts +2 -2
  274. package/lib/typescript/commonjs/agent-avatar/AgentAvatar.d.ts.map +1 -1
  275. package/lib/typescript/commonjs/agent-avatar/AgentAvatarProvider.d.ts +4 -0
  276. package/lib/typescript/commonjs/agent-avatar/AgentAvatarProvider.d.ts.map +1 -0
  277. package/lib/typescript/commonjs/agent-avatar/CharacterAvatar.d.ts +4 -0
  278. package/lib/typescript/commonjs/agent-avatar/CharacterAvatar.d.ts.map +1 -0
  279. package/lib/typescript/commonjs/agent-avatar/ProceduralAvatar.d.ts +6 -0
  280. package/lib/typescript/commonjs/agent-avatar/ProceduralAvatar.d.ts.map +1 -0
  281. package/lib/typescript/commonjs/agent-avatar/artwork.d.ts +2 -1
  282. package/lib/typescript/commonjs/agent-avatar/artwork.d.ts.map +1 -1
  283. package/lib/typescript/commonjs/agent-avatar/avatar-color.d.ts +3 -0
  284. package/lib/typescript/commonjs/agent-avatar/avatar-color.d.ts.map +1 -0
  285. package/lib/typescript/commonjs/agent-avatar/character-html.d.ts +4 -0
  286. package/lib/typescript/commonjs/agent-avatar/character-html.d.ts.map +1 -0
  287. package/lib/typescript/commonjs/agent-avatar/character-runtime-module.d.ts +2 -0
  288. package/lib/typescript/commonjs/agent-avatar/character-runtime-module.d.ts.map +1 -0
  289. package/lib/typescript/commonjs/agent-avatar/character-webview.d.ts +24 -0
  290. package/lib/typescript/commonjs/agent-avatar/character-webview.d.ts.map +1 -0
  291. package/lib/typescript/commonjs/agent-avatar/config-character.d.ts +11 -0
  292. package/lib/typescript/commonjs/agent-avatar/config-character.d.ts.map +1 -0
  293. package/lib/typescript/commonjs/agent-avatar/context.d.ts +12 -0
  294. package/lib/typescript/commonjs/agent-avatar/context.d.ts.map +1 -1
  295. package/lib/typescript/commonjs/agent-avatar/index.d.ts +3 -1
  296. package/lib/typescript/commonjs/agent-avatar/index.d.ts.map +1 -1
  297. package/lib/typescript/commonjs/agent-avatar/legacy-contours.d.ts +5 -0
  298. package/lib/typescript/commonjs/agent-avatar/legacy-contours.d.ts.map +1 -0
  299. package/lib/typescript/commonjs/agent-avatar/legacy-recipe.d.ts +40 -0
  300. package/lib/typescript/commonjs/agent-avatar/legacy-recipe.d.ts.map +1 -0
  301. package/lib/typescript/commonjs/agent-avatar/messages.d.ts +1 -0
  302. package/lib/typescript/commonjs/agent-avatar/messages.d.ts.map +1 -1
  303. package/lib/typescript/commonjs/agent-avatar/model.d.ts +3 -0
  304. package/lib/typescript/commonjs/agent-avatar/model.d.ts.map +1 -1
  305. package/lib/typescript/commonjs/agent-avatar/types.d.ts +10 -1
  306. package/lib/typescript/commonjs/agent-avatar/types.d.ts.map +1 -1
  307. package/lib/typescript/commonjs/agent-creator/AgentCreatorBase.d.ts.map +1 -1
  308. package/lib/typescript/commonjs/agent-creator/CharacterControls.d.ts +8 -0
  309. package/lib/typescript/commonjs/agent-creator/CharacterControls.d.ts.map +1 -0
  310. package/lib/typescript/commonjs/agent-creator/EmotionPicker.d.ts +12 -1
  311. package/lib/typescript/commonjs/agent-creator/EmotionPicker.d.ts.map +1 -1
  312. package/lib/typescript/commonjs/agent-creator/ShapeArc.d.ts +11 -2
  313. package/lib/typescript/commonjs/agent-creator/ShapeArc.d.ts.map +1 -1
  314. package/lib/typescript/commonjs/agent-creator/ShapeSilhouette.d.ts +6 -0
  315. package/lib/typescript/commonjs/agent-creator/ShapeSilhouette.d.ts.map +1 -0
  316. package/lib/typescript/commonjs/agent-creator/constants.d.ts +44 -0
  317. package/lib/typescript/commonjs/agent-creator/constants.d.ts.map +1 -1
  318. package/lib/typescript/commonjs/agent-creator/context.d.ts +9 -0
  319. package/lib/typescript/commonjs/agent-creator/context.d.ts.map +1 -1
  320. package/lib/typescript/commonjs/agent-creator/messages.d.ts +10 -0
  321. package/lib/typescript/commonjs/agent-creator/messages.d.ts.map +1 -1
  322. package/lib/typescript/commonjs/agent-creator/shared.d.ts +1 -1
  323. package/lib/typescript/commonjs/agent-creator/shared.d.ts.map +1 -1
  324. package/lib/typescript/commonjs/agent-thinking/AgentThinking.d.ts.map +1 -1
  325. package/lib/typescript/commonjs/agent-thinking/ThinkingLabel.d.ts +7 -0
  326. package/lib/typescript/commonjs/agent-thinking/ThinkingLabel.d.ts.map +1 -0
  327. package/lib/typescript/commonjs/chart-cards/TokensChartCard.d.ts +3 -1
  328. package/lib/typescript/commonjs/chart-cards/TokensChartCard.d.ts.map +1 -1
  329. package/lib/typescript/commonjs/locale/translations/ar.d.ts.map +1 -1
  330. package/lib/typescript/commonjs/locale/translations/bn.d.ts.map +1 -1
  331. package/lib/typescript/commonjs/locale/translations/ca.d.ts.map +1 -1
  332. package/lib/typescript/commonjs/locale/translations/de.d.ts.map +1 -1
  333. package/lib/typescript/commonjs/locale/translations/es.d.ts.map +1 -1
  334. package/lib/typescript/commonjs/locale/translations/fr.d.ts.map +1 -1
  335. package/lib/typescript/commonjs/locale/translations/hi.d.ts.map +1 -1
  336. package/lib/typescript/commonjs/locale/translations/id.d.ts.map +1 -1
  337. package/lib/typescript/commonjs/locale/translations/it.d.ts.map +1 -1
  338. package/lib/typescript/commonjs/locale/translations/ja.d.ts.map +1 -1
  339. package/lib/typescript/commonjs/locale/translations/pt.d.ts.map +1 -1
  340. package/lib/typescript/commonjs/locale/translations/ru.d.ts.map +1 -1
  341. package/lib/typescript/commonjs/locale/translations/tr.d.ts.map +1 -1
  342. package/lib/typescript/commonjs/locale/translations/zh.d.ts.map +1 -1
  343. package/lib/typescript/commonjs/multi-agent-chat/AvatarHandoff.d.ts.map +1 -1
  344. package/lib/typescript/commonjs/multi-agent-chat/ChatAgentProfile.d.ts +11 -0
  345. package/lib/typescript/commonjs/multi-agent-chat/ChatAgentProfile.d.ts.map +1 -0
  346. package/lib/typescript/commonjs/multi-agent-chat/EditorRail.d.ts.map +1 -1
  347. package/lib/typescript/commonjs/multi-agent-chat/MultiAgentChatBase.d.ts.map +1 -1
  348. package/lib/typescript/commonjs/multi-agent-chat/ReplyRow.d.ts.map +1 -1
  349. package/lib/typescript/commonjs/multi-agent-chat/handoff.d.ts +2 -2
  350. package/lib/typescript/commonjs/multi-agent-chat/handoff.d.ts.map +1 -1
  351. package/lib/typescript/commonjs/project-board/CreateTicketDialog.d.ts.map +1 -1
  352. package/lib/typescript/commonjs/project-board/ProjectBoardBase.d.ts.map +1 -1
  353. package/lib/typescript/commonjs/project-board/TicketCornerGenieSurface.web.d.ts.map +1 -1
  354. package/lib/typescript/commonjs/project-board/TicketDetailDialog.d.ts.map +1 -1
  355. package/lib/typescript/commonjs/project-board/TicketGenieSurface.d.ts.map +1 -1
  356. package/lib/typescript/commonjs/project-board/TicketPresence.d.ts +17 -0
  357. package/lib/typescript/commonjs/project-board/TicketPresence.d.ts.map +1 -0
  358. package/lib/typescript/commonjs/project-board/TicketTokenChart.d.ts +5 -0
  359. package/lib/typescript/commonjs/project-board/TicketTokenChart.d.ts.map +1 -0
  360. package/lib/typescript/commonjs/project-board/context.d.ts +2 -0
  361. package/lib/typescript/commonjs/project-board/context.d.ts.map +1 -1
  362. package/lib/typescript/commonjs/search/Search.d.ts.map +1 -1
  363. package/lib/typescript/commonjs/sidebar/SidebarToolbar.d.ts.map +1 -1
  364. package/lib/typescript/commonjs/text-field/TextField.d.ts.map +1 -1
  365. package/lib/typescript/module/agent-avatar/AgentAvatar.d.ts +2 -2
  366. package/lib/typescript/module/agent-avatar/AgentAvatar.d.ts.map +1 -1
  367. package/lib/typescript/module/agent-avatar/AgentAvatarProvider.d.ts +4 -0
  368. package/lib/typescript/module/agent-avatar/AgentAvatarProvider.d.ts.map +1 -0
  369. package/lib/typescript/module/agent-avatar/CharacterAvatar.d.ts +4 -0
  370. package/lib/typescript/module/agent-avatar/CharacterAvatar.d.ts.map +1 -0
  371. package/lib/typescript/module/agent-avatar/ProceduralAvatar.d.ts +6 -0
  372. package/lib/typescript/module/agent-avatar/ProceduralAvatar.d.ts.map +1 -0
  373. package/lib/typescript/module/agent-avatar/artwork.d.ts +2 -1
  374. package/lib/typescript/module/agent-avatar/artwork.d.ts.map +1 -1
  375. package/lib/typescript/module/agent-avatar/avatar-color.d.ts +3 -0
  376. package/lib/typescript/module/agent-avatar/avatar-color.d.ts.map +1 -0
  377. package/lib/typescript/module/agent-avatar/character-html.d.ts +4 -0
  378. package/lib/typescript/module/agent-avatar/character-html.d.ts.map +1 -0
  379. package/lib/typescript/module/agent-avatar/character-runtime-module.d.ts +2 -0
  380. package/lib/typescript/module/agent-avatar/character-runtime-module.d.ts.map +1 -0
  381. package/lib/typescript/module/agent-avatar/character-webview.d.ts +24 -0
  382. package/lib/typescript/module/agent-avatar/character-webview.d.ts.map +1 -0
  383. package/lib/typescript/module/agent-avatar/config-character.d.ts +11 -0
  384. package/lib/typescript/module/agent-avatar/config-character.d.ts.map +1 -0
  385. package/lib/typescript/module/agent-avatar/context.d.ts +12 -0
  386. package/lib/typescript/module/agent-avatar/context.d.ts.map +1 -1
  387. package/lib/typescript/module/agent-avatar/index.d.ts +3 -1
  388. package/lib/typescript/module/agent-avatar/index.d.ts.map +1 -1
  389. package/lib/typescript/module/agent-avatar/legacy-contours.d.ts +5 -0
  390. package/lib/typescript/module/agent-avatar/legacy-contours.d.ts.map +1 -0
  391. package/lib/typescript/module/agent-avatar/legacy-recipe.d.ts +40 -0
  392. package/lib/typescript/module/agent-avatar/legacy-recipe.d.ts.map +1 -0
  393. package/lib/typescript/module/agent-avatar/messages.d.ts +1 -0
  394. package/lib/typescript/module/agent-avatar/messages.d.ts.map +1 -1
  395. package/lib/typescript/module/agent-avatar/model.d.ts +3 -0
  396. package/lib/typescript/module/agent-avatar/model.d.ts.map +1 -1
  397. package/lib/typescript/module/agent-avatar/types.d.ts +10 -1
  398. package/lib/typescript/module/agent-avatar/types.d.ts.map +1 -1
  399. package/lib/typescript/module/agent-creator/AgentCreatorBase.d.ts.map +1 -1
  400. package/lib/typescript/module/agent-creator/CharacterControls.d.ts +8 -0
  401. package/lib/typescript/module/agent-creator/CharacterControls.d.ts.map +1 -0
  402. package/lib/typescript/module/agent-creator/EmotionPicker.d.ts +12 -1
  403. package/lib/typescript/module/agent-creator/EmotionPicker.d.ts.map +1 -1
  404. package/lib/typescript/module/agent-creator/ShapeArc.d.ts +11 -2
  405. package/lib/typescript/module/agent-creator/ShapeArc.d.ts.map +1 -1
  406. package/lib/typescript/module/agent-creator/ShapeSilhouette.d.ts +6 -0
  407. package/lib/typescript/module/agent-creator/ShapeSilhouette.d.ts.map +1 -0
  408. package/lib/typescript/module/agent-creator/constants.d.ts +44 -0
  409. package/lib/typescript/module/agent-creator/constants.d.ts.map +1 -1
  410. package/lib/typescript/module/agent-creator/context.d.ts +9 -0
  411. package/lib/typescript/module/agent-creator/context.d.ts.map +1 -1
  412. package/lib/typescript/module/agent-creator/messages.d.ts +10 -0
  413. package/lib/typescript/module/agent-creator/messages.d.ts.map +1 -1
  414. package/lib/typescript/module/agent-creator/shared.d.ts +1 -1
  415. package/lib/typescript/module/agent-creator/shared.d.ts.map +1 -1
  416. package/lib/typescript/module/agent-thinking/AgentThinking.d.ts.map +1 -1
  417. package/lib/typescript/module/agent-thinking/ThinkingLabel.d.ts +7 -0
  418. package/lib/typescript/module/agent-thinking/ThinkingLabel.d.ts.map +1 -0
  419. package/lib/typescript/module/chart-cards/TokensChartCard.d.ts +3 -1
  420. package/lib/typescript/module/chart-cards/TokensChartCard.d.ts.map +1 -1
  421. package/lib/typescript/module/locale/translations/ar.d.ts.map +1 -1
  422. package/lib/typescript/module/locale/translations/bn.d.ts.map +1 -1
  423. package/lib/typescript/module/locale/translations/ca.d.ts.map +1 -1
  424. package/lib/typescript/module/locale/translations/de.d.ts.map +1 -1
  425. package/lib/typescript/module/locale/translations/es.d.ts.map +1 -1
  426. package/lib/typescript/module/locale/translations/fr.d.ts.map +1 -1
  427. package/lib/typescript/module/locale/translations/hi.d.ts.map +1 -1
  428. package/lib/typescript/module/locale/translations/id.d.ts.map +1 -1
  429. package/lib/typescript/module/locale/translations/it.d.ts.map +1 -1
  430. package/lib/typescript/module/locale/translations/ja.d.ts.map +1 -1
  431. package/lib/typescript/module/locale/translations/pt.d.ts.map +1 -1
  432. package/lib/typescript/module/locale/translations/ru.d.ts.map +1 -1
  433. package/lib/typescript/module/locale/translations/tr.d.ts.map +1 -1
  434. package/lib/typescript/module/locale/translations/zh.d.ts.map +1 -1
  435. package/lib/typescript/module/multi-agent-chat/AvatarHandoff.d.ts.map +1 -1
  436. package/lib/typescript/module/multi-agent-chat/ChatAgentProfile.d.ts +11 -0
  437. package/lib/typescript/module/multi-agent-chat/ChatAgentProfile.d.ts.map +1 -0
  438. package/lib/typescript/module/multi-agent-chat/EditorRail.d.ts.map +1 -1
  439. package/lib/typescript/module/multi-agent-chat/MultiAgentChatBase.d.ts.map +1 -1
  440. package/lib/typescript/module/multi-agent-chat/ReplyRow.d.ts.map +1 -1
  441. package/lib/typescript/module/multi-agent-chat/handoff.d.ts +2 -2
  442. package/lib/typescript/module/multi-agent-chat/handoff.d.ts.map +1 -1
  443. package/lib/typescript/module/project-board/CreateTicketDialog.d.ts.map +1 -1
  444. package/lib/typescript/module/project-board/ProjectBoardBase.d.ts.map +1 -1
  445. package/lib/typescript/module/project-board/TicketCornerGenieSurface.web.d.ts.map +1 -1
  446. package/lib/typescript/module/project-board/TicketDetailDialog.d.ts.map +1 -1
  447. package/lib/typescript/module/project-board/TicketGenieSurface.d.ts.map +1 -1
  448. package/lib/typescript/module/project-board/TicketPresence.d.ts +17 -0
  449. package/lib/typescript/module/project-board/TicketPresence.d.ts.map +1 -0
  450. package/lib/typescript/module/project-board/TicketTokenChart.d.ts +5 -0
  451. package/lib/typescript/module/project-board/TicketTokenChart.d.ts.map +1 -0
  452. package/lib/typescript/module/project-board/context.d.ts +2 -0
  453. package/lib/typescript/module/project-board/context.d.ts.map +1 -1
  454. package/lib/typescript/module/search/Search.d.ts.map +1 -1
  455. package/lib/typescript/module/sidebar/SidebarToolbar.d.ts.map +1 -1
  456. package/lib/typescript/module/text-field/TextField.d.ts.map +1 -1
  457. package/package.json +8 -3
  458. package/src/agent-avatar/AgentAvatar.tsx +16 -296
  459. package/src/agent-avatar/AgentAvatarProvider.tsx +72 -0
  460. package/src/agent-avatar/CharacterAvatar.tsx +255 -0
  461. package/src/agent-avatar/ProceduralAvatar.tsx +303 -0
  462. package/src/agent-avatar/artwork.ts +3 -3
  463. package/src/agent-avatar/avatar-color.ts +17 -0
  464. package/src/agent-avatar/character-html.ts +21 -0
  465. package/src/agent-avatar/character-runtime-module.ts +37 -0
  466. package/src/agent-avatar/character-webview.ts +24 -0
  467. package/src/agent-avatar/config-character.ts +40 -0
  468. package/src/agent-avatar/context.ts +13 -0
  469. package/src/agent-avatar/index.ts +4 -1
  470. package/src/agent-avatar/legacy-contours.ts +76 -0
  471. package/src/agent-avatar/legacy-recipe.ts +123 -0
  472. package/src/agent-avatar/messages.ts +1 -0
  473. package/src/agent-avatar/model.ts +5 -0
  474. package/src/agent-avatar/types.ts +12 -1
  475. package/src/agent-creator/AgentCreatorBase.tsx +329 -38
  476. package/src/agent-creator/CharacterControls.tsx +146 -0
  477. package/src/agent-creator/EmotionPicker.tsx +43 -21
  478. package/src/agent-creator/ShapeArc.tsx +83 -29
  479. package/src/agent-creator/ShapeSilhouette.tsx +65 -0
  480. package/src/agent-creator/constants.ts +30 -0
  481. package/src/agent-creator/messages.ts +19 -0
  482. package/src/agent-creator/shared.ts +1 -15
  483. package/src/agent-thinking/AgentThinking.tsx +7 -70
  484. package/src/agent-thinking/ThinkingLabel.tsx +74 -0
  485. package/src/chart-cards/TokensChartCard.tsx +10 -6
  486. package/src/locale/translations/ar.ts +10 -1
  487. package/src/locale/translations/bn.ts +10 -1
  488. package/src/locale/translations/ca.ts +10 -1
  489. package/src/locale/translations/de.ts +10 -1
  490. package/src/locale/translations/es.ts +10 -1
  491. package/src/locale/translations/fr.ts +10 -1
  492. package/src/locale/translations/hi.ts +10 -1
  493. package/src/locale/translations/id.ts +10 -1
  494. package/src/locale/translations/it.ts +10 -1
  495. package/src/locale/translations/ja.ts +10 -1
  496. package/src/locale/translations/pt.ts +10 -1
  497. package/src/locale/translations/ru.ts +10 -1
  498. package/src/locale/translations/tr.ts +10 -1
  499. package/src/locale/translations/zh.ts +10 -1
  500. package/src/multi-agent-chat/AvatarHandoff.tsx +2 -5
  501. package/src/multi-agent-chat/ChatAgentProfile.tsx +116 -0
  502. package/src/multi-agent-chat/EditorRail.tsx +2 -0
  503. package/src/multi-agent-chat/MultiAgentChatBase.tsx +123 -175
  504. package/src/multi-agent-chat/ReplyRow.tsx +10 -9
  505. package/src/multi-agent-chat/handoff.ts +4 -4
  506. package/src/project-board/CreateTicketDialog.tsx +28 -4
  507. package/src/project-board/ProjectBoardBase.tsx +115 -21
  508. package/src/project-board/TicketCornerGenieSurface.web.tsx +11 -6
  509. package/src/project-board/TicketDetailDialog.tsx +5 -4
  510. package/src/project-board/TicketGenieSurface.tsx +9 -0
  511. package/src/project-board/TicketGenieSurface.web.tsx +1 -1
  512. package/src/project-board/TicketPresence.tsx +137 -0
  513. package/src/project-board/TicketTokenChart.tsx +14 -0
  514. package/src/project-board/context.ts +2 -0
  515. package/src/search/Search.tsx +6 -5
  516. package/src/sidebar/SidebarToolbar.tsx +27 -15
  517. package/src/text-field/TextField.tsx +12 -7
@@ -0,0 +1,116 @@
1
+ import { useState, type Ref } from 'react';
2
+ import { Platform, StyleSheet, type View } from 'react-native';
3
+ import { useReducedMotion } from 'react-native-reanimated';
4
+ import { AgentAvatar } from '../agent-avatar';
5
+ import { useMessages } from '../locale/messages';
6
+ import { StyledPressable, StyledView } from '../styles/styled-primitives';
7
+ import { useTheme } from '../theme/use-theme';
8
+ import { Text } from '../typography';
9
+ import type { Agent } from './data';
10
+ import { MULTI_AGENT_CHAT_MESSAGES, formatChatMessage } from './messages';
11
+
12
+ /** One profile target: animated artwork above an intrinsically sized name pill. */
13
+ export function ChatAgentProfile({
14
+ agents,
15
+ avatarRef,
16
+ expanded,
17
+ onPress,
18
+ }: {
19
+ agents: Agent[];
20
+ avatarRef?: Ref<View>;
21
+ expanded: boolean;
22
+ onPress: () => void;
23
+ }) {
24
+ const { messages } = useMessages(MULTI_AGENT_CHAT_MESSAGES);
25
+ const { colors } = useTheme();
26
+ const reduced = useReducedMotion();
27
+ const [pressed, setPressed] = useState(false);
28
+ const [hovered, setHovered] = useState(false);
29
+ const name =
30
+ agents.length === 1
31
+ ? agents[0]!.name
32
+ : agents
33
+ .slice(0, 3)
34
+ .map((agent) => agent.label || agent.name)
35
+ .join(' + ');
36
+ const label = name || messages.chooseYourTeammates;
37
+ return (
38
+ <StyledPressable
39
+ accessibilityRole="button"
40
+ accessibilityLabel={
41
+ agents.length === 1
42
+ ? formatChatMessage(messages.editAgent, agents[0]!.name)
43
+ : messages.editConversationAgents
44
+ }
45
+ aria-expanded={expanded}
46
+ onPress={onPress}
47
+ onPressIn={() => setPressed(true)}
48
+ onPressOut={() => setPressed(false)}
49
+ onHoverIn={() => setHovered(true)}
50
+ onHoverOut={() => setHovered(false)}
51
+ className={`group/chat-profile relative min-w-0 max-w-full select-none items-center outline-none ${Platform.OS === 'web' ? 'motion-safe:active:scale-95' : ''}`}
52
+ style={
53
+ Platform.OS === 'web'
54
+ ? undefined
55
+ : { transform: [{ scale: pressed && !reduced ? 0.95 : 1 }] }
56
+ }
57
+ testID="chat-agent-profile"
58
+ >
59
+ <StyledView
60
+ ref={avatarRef}
61
+ collapsable={false}
62
+ pointerEvents="none"
63
+ aria-hidden
64
+ className="relative z-10 -mb-0.5 size-14"
65
+ style={{ width: 56, height: 56, marginBottom: -2 }}
66
+ >
67
+ {agents.slice(0, 3).map((agent, index) => {
68
+ const single = agents.length === 1;
69
+ const size = single ? 56 : 36;
70
+ return (
71
+ <StyledView
72
+ key={agent.id}
73
+ style={{
74
+ position: 'absolute',
75
+ width: size,
76
+ height: size,
77
+ insetInlineStart: single
78
+ ? 0
79
+ : index === 1
80
+ ? 20
81
+ : index === 2
82
+ ? 10
83
+ : 0,
84
+ top: index === 2 ? 20 : 0,
85
+ }}
86
+ >
87
+ <AgentAvatar config={agent.avatar} size={size} />
88
+ </StyledView>
89
+ );
90
+ })}
91
+ </StyledView>
92
+ <StyledView
93
+ pointerEvents="none"
94
+ className="relative min-w-0 max-w-full items-center justify-center rounded-[14px] px-2.5 py-1"
95
+ >
96
+ <StyledView
97
+ className="absolute inset-0 rounded-[14px] group-focus-visible/chat-profile:ring-2 group-focus-visible/chat-profile:ring-border-focus-ring"
98
+ style={{
99
+ backgroundColor: hovered
100
+ ? colors.backgroundTertiary
101
+ : colors.backgroundSecondary,
102
+ borderWidth: StyleSheet.hairlineWidth,
103
+ borderColor: colors.border,
104
+ }}
105
+ />
106
+ <Text
107
+ numberOfLines={1}
108
+ className="max-w-full truncate text-[16px] leading-5 font-medium text-text-primary"
109
+ >
110
+ {label}
111
+ {agents.length > 3 ? ` +${agents.length - 3}` : ''}
112
+ </Text>
113
+ </StyledView>
114
+ </StyledPressable>
115
+ );
116
+ }
@@ -1,4 +1,5 @@
1
1
  import { useEffect, useRef, useState, type ReactNode } from 'react';
2
+ import { Platform } from 'react-native';
2
3
  import Animated, {
3
4
  Easing,
4
5
  runOnJS,
@@ -47,6 +48,7 @@ export function EditorRail({
47
48
  );
48
49
  return (
49
50
  <AnimatedView
51
+ {...(Platform.OS === 'web' && !active ? { inert: true } : {})}
50
52
  pointerEvents={active ? 'auto' : 'none'}
51
53
  aria-hidden={!active}
52
54
  accessibilityElementsHidden={!active}
@@ -24,6 +24,7 @@ import { Text } from '../typography';
24
24
  import { AvatarHandoff } from './AvatarHandoff';
25
25
  import { ChatDialogFrame, SupportCopy } from './ChatDialogFrame';
26
26
  import { ChatSidebar } from './ChatSidebar';
27
+ import { ChatAgentProfile } from './ChatAgentProfile';
27
28
  import { useChatComponents } from './context';
28
29
  import {
29
30
  conversationFor,
@@ -70,55 +71,6 @@ type Panel =
70
71
  | 'support'
71
72
  | null;
72
73
 
73
- function AgentStack({
74
- agents,
75
- size = 40,
76
- nodes,
77
- }: {
78
- agents: Agent[];
79
- size?: number;
80
- nodes?: AvatarNodes;
81
- }) {
82
- return (
83
- <StyledView
84
- style={{ width: size, height: size }}
85
- accessibilityLabel={agents.map((a) => a.name).join(', ')}
86
- >
87
- {agents.slice(0, 3).map((agent, i) => (
88
- <StyledView
89
- key={agent.id}
90
- ref={(node: View | null) => {
91
- if (nodes) {
92
- if (node) nodes.set(agent.id, node);
93
- else nodes.delete(agent.id);
94
- }
95
- }}
96
- collapsable={false}
97
- style={{
98
- width: agents.length === 1 ? size : size * 0.65,
99
- height: agents.length === 1 ? size : size * 0.65,
100
- position: 'absolute',
101
- left:
102
- agents.length === 1
103
- ? 0
104
- : i === 1
105
- ? size * 0.4
106
- : i === 2
107
- ? size * 0.2
108
- : 0,
109
- top: i === 2 ? size * 0.4 : 0,
110
- }}
111
- >
112
- <AgentAvatar
113
- config={agent.avatar}
114
- size={agents.length === 1 ? size : size * 0.65}
115
- label={agent.name}
116
- />
117
- </StyledView>
118
- ))}
119
- </StyledView>
120
- );
121
- }
122
74
  /** Shared workspace implementation. Platform bindings select Bloom's existing surfaces only. */
123
75
  export function MultiAgentChatBase(props: MultiAgentChatProps) {
124
76
  const { messages } = useMessages(MULTI_AGENT_CHAT_MESSAGES);
@@ -136,7 +88,6 @@ export function MultiAgentChatBase(props: MultiAgentChatProps) {
136
88
  Dialog,
137
89
  ComposerPanel,
138
90
  AgentCreator,
139
- Surface,
140
91
  Dropdown: D,
141
92
  } = useChatComponents();
142
93
  const { colors } = useTheme();
@@ -145,7 +96,7 @@ export function MultiAgentChatBase(props: MultiAgentChatProps) {
145
96
  const root = useRef<View>(null),
146
97
  pickerAvatars = useRef<AvatarNodes>(new Map()),
147
98
  emptyAvatars = useRef<AvatarNodes>(new Map()),
148
- badgeRef = useRef<View>(null),
99
+ profileAvatarRef = useRef<View>(null),
149
100
  replyAvatars = useRef<AvatarNodes>(new Map());
150
101
  const [handoff, setHandoff] = useState<AvatarHandoffState | null>(null),
151
102
  [flightOrigin, setFlightOrigin] = useState<AvatarRect | null>(null);
@@ -170,7 +121,7 @@ export function MultiAgentChatBase(props: MultiAgentChatProps) {
170
121
  ? emptyAvatars.current.get(id)
171
122
  : id === handoff?.responderId
172
123
  ? replyAvatars.current.get(id)
173
- : (badgeRef.current ?? undefined),
124
+ : (profileAvatarRef.current ?? undefined),
174
125
  [handoff?.kind, handoff?.responderId],
175
126
  );
176
127
  const { width } = useWindowDimensions();
@@ -247,25 +198,28 @@ export function MultiAgentChatBase(props: MultiAgentChatProps) {
247
198
  setEditor({ ...agent, avatar: { ...agent.avatar } });
248
199
  if (compact) open('editor');
249
200
  };
250
- const saveAgent = (agent: Agent) => {
251
- setEditor(agent);
252
- update((s) => {
253
- const previous = s.agents.find((a) => a.id === agent.id);
254
- return {
255
- ...s,
256
- agents: previous
257
- ? s.agents.map((a) => (a.id === agent.id ? agent : a))
258
- : [...s.agents, agent],
259
- chats: s.chats.map((c) =>
260
- c.agentIds.length === 1 &&
261
- c.agentIds[0] === agent.id &&
262
- (c.title === previous?.name || c.title === previous?.label)
263
- ? { ...c, title: agent.name }
264
- : c,
265
- ),
266
- };
267
- });
268
- };
201
+ const saveAgent = useCallback(
202
+ (agent: Agent) => {
203
+ setEditor(agent);
204
+ update((s) => {
205
+ const previous = s.agents.find((a) => a.id === agent.id);
206
+ return {
207
+ ...s,
208
+ agents: previous
209
+ ? s.agents.map((a) => (a.id === agent.id ? agent : a))
210
+ : [...s.agents, agent],
211
+ chats: s.chats.map((c) =>
212
+ c.agentIds.length === 1 &&
213
+ c.agentIds[0] === agent.id &&
214
+ (c.title === previous?.name || c.title === previous?.label)
215
+ ? { ...c, title: agent.name }
216
+ : c,
217
+ ),
218
+ };
219
+ });
220
+ },
221
+ [update],
222
+ );
269
223
  const createAgent = () => {
270
224
  const agent = {
271
225
  id: chatId('agent'),
@@ -416,18 +370,22 @@ export function MultiAgentChatBase(props: MultiAgentChatProps) {
416
370
  follow.current = true;
417
371
  void replies.send(text, id, avatars.length ? 800 : 0, chat);
418
372
  };
419
- const editPanel = editor && (
420
- <AgentCreator
421
- agent={editor}
422
- onChange={saveAgent}
423
- voices={voices}
424
- onPreviewVoice={onPreviewVoice}
425
- onClose={() => {
426
- setEditor(null);
427
- if (panel === 'editor') close();
428
- }}
429
- style={{ flex: 1 }}
430
- />
373
+ const editPanel = useMemo(
374
+ () =>
375
+ editor && (
376
+ <AgentCreator
377
+ agent={editor}
378
+ onChange={saveAgent}
379
+ voices={voices}
380
+ onPreviewVoice={onPreviewVoice}
381
+ onClose={() => {
382
+ setEditor(null);
383
+ if (panel === 'editor') surface.close();
384
+ }}
385
+ style={{ flex: 1 }}
386
+ />
387
+ ),
388
+ [AgentCreator, editor, saveAgent, voices, onPreviewVoice, panel, surface],
431
389
  );
432
390
  const sortedChats = useMemo(
433
391
  () =>
@@ -441,7 +399,7 @@ export function MultiAgentChatBase(props: MultiAgentChatProps) {
441
399
  .includes(query.toLocaleLowerCase()),
442
400
  )
443
401
  .sort((a, b) => Number(!!b.pinned) - Number(!!a.pinned)),
444
- [workspace.chats, query],
402
+ [workspace.chats, workspace.agents, query],
445
403
  );
446
404
  const sidebar = (
447
405
  <ChatSidebar
@@ -580,114 +538,104 @@ export function MultiAgentChatBase(props: MultiAgentChatProps) {
580
538
  accessibilityLabel={messages.agentConversation}
581
539
  className="flex min-h-0 min-w-0 flex-1 flex-col rounded-3xl bg-background-secondary-default"
582
540
  >
583
- <StyledView className="flex h-[55px] shrink-0 items-start gap-2 px-3 pt-3 flex-row">
584
- {phone && (
585
- <IconButton
586
- icon={RiMenuLine}
587
- accessibilityLabel={messages.openConversations}
588
- size="sm"
589
- onPress={() => open('navigation')}
590
- />
591
- )}
592
- <StyledView className="flex min-w-0 flex-1 flex-row">
541
+ <StyledView className="relative h-[100px] shrink-0">
542
+ <StyledView
543
+ pointerEvents="box-none"
544
+ className="absolute inset-0 flex-row justify-center px-16 pt-1.5"
545
+ >
593
546
  <StyledView
594
- ref={badgeRef}
595
- collapsable={false}
596
- className="relative z-40 min-w-0 max-w-full rounded-full"
547
+ pointerEvents="box-none"
548
+ className="min-w-0 max-w-full items-center self-start"
597
549
  >
598
- <Surface
599
- fill={colors.backgroundSecondary}
600
- radius={999}
601
- style={{ position: 'absolute', inset: 0 }}
602
- pointerEvents="none"
603
- />
604
- <StyledPressable
605
- accessibilityRole="button"
606
- accessibilityLabel={
550
+ <ChatAgentProfile
551
+ agents={participants}
552
+ avatarRef={profileAvatarRef}
553
+ expanded={
607
554
  participants.length === 1
608
- ? formatChatMessage(
609
- messages.editAgent,
610
- participants[0]!.name,
611
- )
612
- : messages.editConversationAgents
555
+ ? editor?.id === participants[0]!.id
556
+ : panel === 'picker'
613
557
  }
614
558
  onPress={() =>
615
559
  participants.length === 1
616
560
  ? edit(participants[0]!)
617
561
  : chooseAgents(chat?.agentIds)
618
562
  }
619
- className="flex h-[31px] min-w-0 max-w-full items-center gap-2 rounded-full px-2 pe-3 text-body-2-medium text-text-secondary outline-none focus-visible:ring-2 focus-visible:ring-border-focus-ring flex-row"
620
- >
621
- <AgentStack agents={participants} size={20} />
622
- <Text
623
- numberOfLines={1}
624
- className="truncate text-body-2-medium text-text-secondary"
625
- >
626
- {participants.length === 1
627
- ? participants[0]!.name
628
- : participants
629
- .slice(0, 3)
630
- .map((a) => a.label || a.name)
631
- .join(' + ')}
632
- </Text>
633
- {participants.length > 3 && (
634
- <Text className="shrink-0">+{participants.length - 3}</Text>
635
- )}
636
- </StyledPressable>
563
+ />
637
564
  </StyledView>
638
565
  </StyledView>
639
- <StyledPressable
640
- accessibilityRole="button"
641
- accessibilityLabel={messages.copyConversation}
642
- onPress={() =>
643
- chat && void copy(transcript(chat), messages.conversationCopied)
644
- }
645
- className="rounded p-1 text-foreground-icon-secondary outline-none focus-visible:ring-2 focus-visible:ring-border-focus-ring"
566
+ {phone && (
567
+ <StyledView
568
+ style={{ position: 'absolute', top: 12, insetInlineStart: 12 }}
569
+ >
570
+ <IconButton
571
+ icon={RiMenuLine}
572
+ accessibilityLabel={messages.openConversations}
573
+ size="sm"
574
+ onPress={() => open('navigation')}
575
+ />
576
+ </StyledView>
577
+ )}
578
+ <StyledView
579
+ className="flex-row items-center gap-2"
580
+ style={{ position: 'absolute', top: 12, insetInlineEnd: 12 }}
646
581
  >
647
- <RiShare2Line width={16} height={16} fill={colors.textSecondary} />
648
- </StyledPressable>
649
- <D.DropdownMenu>
650
- <D.DropdownMenuTrigger asChild>
651
- <StyledPressable
652
- accessibilityRole="button"
653
- accessibilityLabel={messages.conversationOptions}
654
- className="rounded p-1 text-foreground-icon-secondary"
655
- >
656
- <RiMoreFill
657
- width={16}
658
- height={16}
659
- fill={colors.textSecondary}
660
- />
661
- </StyledPressable>
662
- </D.DropdownMenuTrigger>
663
- <D.DropdownMenuContent
664
- label={messages.conversationOptions}
665
- align="end"
666
- className="rounded-[14px] p-1"
667
- style={{ borderRadius: 14, padding: 4 }}
582
+ <StyledPressable
583
+ accessibilityRole="button"
584
+ accessibilityLabel={messages.copyConversation}
585
+ onPress={() =>
586
+ chat && void copy(transcript(chat), messages.conversationCopied)
587
+ }
588
+ className="rounded p-1 text-foreground-icon-secondary outline-none focus-visible:ring-2 focus-visible:ring-border-focus-ring"
668
589
  >
669
- <D.DropdownMenuLabel>
670
- {messages.inThisConversation}
671
- </D.DropdownMenuLabel>
672
- {participants.map((agent) => (
590
+ <RiShare2Line
591
+ width={16}
592
+ height={16}
593
+ fill={colors.textSecondary}
594
+ />
595
+ </StyledPressable>
596
+ <D.DropdownMenu>
597
+ <D.DropdownMenuTrigger asChild>
598
+ <StyledPressable
599
+ accessibilityRole="button"
600
+ accessibilityLabel={messages.conversationOptions}
601
+ className="rounded p-1 text-foreground-icon-secondary"
602
+ >
603
+ <RiMoreFill
604
+ width={16}
605
+ height={16}
606
+ fill={colors.textSecondary}
607
+ />
608
+ </StyledPressable>
609
+ </D.DropdownMenuTrigger>
610
+ <D.DropdownMenuContent
611
+ label={messages.conversationOptions}
612
+ align="end"
613
+ className="rounded-[14px] p-1"
614
+ style={{ borderRadius: 14, padding: 4 }}
615
+ >
616
+ <D.DropdownMenuLabel>
617
+ {messages.inThisConversation}
618
+ </D.DropdownMenuLabel>
619
+ {participants.map((agent) => (
620
+ <D.DropdownMenuItem
621
+ key={agent.id}
622
+ onPress={() => edit(agent)}
623
+ leading={<AgentAvatar config={agent.avatar} size={20} />}
624
+ className="px-2 py-1.5 text-body-medium"
625
+ >
626
+ {formatChatMessage(messages.editAgent, agent.name)}
627
+ </D.DropdownMenuItem>
628
+ ))}
673
629
  <D.DropdownMenuItem
674
- key={agent.id}
675
- onPress={() => edit(agent)}
676
- leading={<AgentAvatar config={agent.avatar} size={20} />}
630
+ onPress={() => chooseAgents(chat?.agentIds)}
631
+ leading={<RiGroupLine width={16} height={16} />}
677
632
  className="px-2 py-1.5 text-body-medium"
678
633
  >
679
- {formatChatMessage(messages.editAgent, agent.name)}
634
+ {messages.startAGroupChat}
680
635
  </D.DropdownMenuItem>
681
- ))}
682
- <D.DropdownMenuItem
683
- onPress={() => chooseAgents(chat?.agentIds)}
684
- leading={<RiGroupLine width={16} height={16} />}
685
- className="px-2 py-1.5 text-body-medium"
686
- >
687
- {messages.startAGroupChat}
688
- </D.DropdownMenuItem>
689
- </D.DropdownMenuContent>
690
- </D.DropdownMenu>
636
+ </D.DropdownMenuContent>
637
+ </D.DropdownMenu>
638
+ </StyledView>
691
639
  </StyledView>
692
640
  <ScrollSurface
693
641
  scrollRef={scroll}
@@ -8,12 +8,13 @@ import Animated, {
8
8
  withTiming,
9
9
  } from 'react-native-reanimated';
10
10
  import { AgentAvatar } from '../agent-avatar';
11
+ import { ThinkingLabel } from '../agent-thinking/ThinkingLabel';
11
12
  import { useTrackEvents } from '../agent-creator/use-track-events';
12
13
  import { useIsRtl } from '../hooks/use-is-rtl';
13
14
  import { useMessages } from '../locale/messages';
14
15
  import { StyledPressable, StyledView } from '../styles/styled-primitives';
15
16
  import { useTheme } from '../theme/use-theme';
16
- import { Text } from '../typography';
17
+ import { Text, TYPE_SCALE } from '../typography';
17
18
  import type { Agent } from './data';
18
19
  import type { AvatarNodes } from './handoff';
19
20
  import { MULTI_AGENT_CHAT_MESSAGES, formatChatMessage } from './messages';
@@ -83,7 +84,7 @@ export function ReplyHeader({
83
84
  : formatChatMessage(messages.editAgent, agent.name)
84
85
  }
85
86
  onPress={onEdit}
86
- className="my-1 min-w-0 flex-row items-center gap-1 rounded-lg"
87
+ className="my-1 min-w-0 flex-row items-center gap-1 rounded-lg text-start text-body-2-medium text-text-secondary outline-none focus-visible:ring-2 focus-visible:ring-border-focus-ring"
87
88
  >
88
89
  <AnimatedView
89
90
  ref={(node: View | null) => {
@@ -121,16 +122,16 @@ export function ReplyHeader({
121
122
  <AnimatedView
122
123
  aria-hidden={!thinking}
123
124
  role={thinking ? 'status' : undefined}
124
- style={[
125
- { position: 'absolute', insetInlineStart: 0, top: 0 },
126
- status,
127
- ]}
125
+ style={status}
128
126
  >
129
- <Text variant="body-2-medium" style={{ color: colors.textSecondary }}>
127
+ <ThinkingLabel variant="body-2-medium" color={colors.textSecondary}>
130
128
  {messages.thinking}
131
- </Text>
129
+ </ThinkingLabel>
132
130
  </AnimatedView>
133
- <AnimatedView aria-hidden={thinking} style={name}>
131
+ <AnimatedView
132
+ aria-hidden={thinking}
133
+ style={[{ marginTop: -TYPE_SCALE['body-2-medium'].lineHeight }, name]}
134
+ >
134
135
  <Text variant="body-2-medium" style={{ color: colors.textSecondary }}>
135
136
  {agent.name}
136
137
  </Text>
@@ -139,11 +139,11 @@ export function avatarFlightPoint(
139
139
  };
140
140
  }
141
141
 
142
- /** Non-answering agents merge into the badge at one 14px landing point. */
143
- export function badgeFlightTarget(badge: AvatarRect, rtl = false): AvatarRect {
142
+ /** Waiting agents merge into the center of the measured header artwork. */
143
+ export function profileFlightTarget(avatar: AvatarRect): AvatarRect {
144
144
  return {
145
- x: rtl ? badge.x + badge.width - 26 : badge.x + 12,
146
- y: badge.y + (badge.height - 14) / 2,
145
+ x: avatar.x + (avatar.width - 14) / 2,
146
+ y: avatar.y + (avatar.height - 14) / 2,
147
147
  width: 14,
148
148
  height: 14,
149
149
  };
@@ -1,5 +1,6 @@
1
- import { useRef, useState } from 'react';
2
- import type { TextInput } from 'react-native';
1
+ import { useRef, useState, type ComponentType, type ReactNode } from 'react';
2
+ import { Platform, ScrollView, useWindowDimensions, type ScrollViewProps, type TextInput } from 'react-native';
3
+ import { styled } from 'react-native-css';
3
4
  import { useDialogControl } from '../dialog/context';
4
5
  import { useMessages } from '../locale/messages';
5
6
  import { Switch } from '../switch';
@@ -34,6 +35,29 @@ const PRIORITY_STYLES = {
34
35
  High: 'bg-status-orange-background text-status-orange-text',
35
36
  Urgent: 'bg-status-rose-background text-status-rose-text',
36
37
  };
38
+ const ScrollBodyBase: ComponentType<Pick<ScrollViewProps, 'style' | 'contentContainerStyle'>> = ScrollView;
39
+ const StyledScrollView: ComponentType<ScrollViewProps> = styled(ScrollBodyBase, { className: 'style' });
40
+
41
+ function TicketFormBody({ children }: { children: ReactNode }) {
42
+ const { height } = useWindowDimensions();
43
+ if (Platform.OS === 'web') return (
44
+ <View className="max-h-[calc(100dvh-56px)] overflow-y-auto rounded-3xl bg-background-primary-default p-4 outline-none">
45
+ {children}
46
+ </View>
47
+ );
48
+ return (
49
+ <StyledScrollView
50
+ className="rounded-3xl bg-background-primary-default"
51
+ testID="project-board-create-scroll"
52
+ style={{ maxHeight: height - 56, flexGrow: 0, flexShrink: 1 }}
53
+ contentContainerStyle={{ padding: 16 }}
54
+ keyboardShouldPersistTaps="handled"
55
+ keyboardDismissMode="interactive"
56
+ >
57
+ {children}
58
+ </StyledScrollView>
59
+ );
60
+ }
37
61
  export function CreateTicketDialog({
38
62
  title: boardTitle,
39
63
  initialColumnId,
@@ -140,7 +164,7 @@ export function CreateTicketDialog({
140
164
  style={{ width: '100%' }}
141
165
  >
142
166
  <TicketGenieSurface>
143
- <View className="max-h-[calc(100dvh-56px)] overflow-y-auto rounded-3xl bg-background-primary-default p-4 outline-none">
167
+ <TicketFormBody>
144
168
  <View className="flex flex-col gap-12">
145
169
  <View className="flex flex-col gap-2.5">
146
170
  <View className="flex items-start justify-between gap-3">
@@ -365,7 +389,7 @@ export function CreateTicketDialog({
365
389
  </View>
366
390
  </View>
367
391
  </View>
368
- </View>
392
+ </TicketFormBody>
369
393
  </TicketGenieSurface>
370
394
  </View>
371
395
  </Dialog>