@oxy.so/bloom 7.0.1 → 7.1.1

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 (519) 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/managed-avatar.mjs +258 -0
  8. package/assets/character-runtime/orbit-characters.data +0 -0
  9. package/assets/character-runtime/orbit-characters.mjs +30 -0
  10. package/assets/character-runtime/orbit-characters.wasm +0 -0
  11. package/assets/character-runtime/preparation-worker.mjs +19 -0
  12. package/assets/character-runtime/render-budget.mjs +144 -0
  13. package/assets/character-runtime/runtime.mjs +851 -0
  14. package/assets/character-runtime/thumbnails/eyes/crescent_inset.png +0 -0
  15. package/assets/character-runtime/thumbnails/eyes/dots.png +0 -0
  16. package/assets/character-runtime/thumbnails/eyes/double_highlights.png +0 -0
  17. package/assets/character-runtime/thumbnails/eyes/highlight_capsules.png +0 -0
  18. package/assets/character-runtime/thumbnails/eyes/oval.png +0 -0
  19. package/assets/character-runtime/thumbnails/eyes/round_inset.png +0 -0
  20. package/assets/character-runtime/thumbnails/eyes/sleepy_lids.png +0 -0
  21. package/assets/character-runtime/thumbnails/eyes/sparkle_capsules.png +0 -0
  22. package/assets/character-runtime/thumbnails/eyes/swept_lids.png +0 -0
  23. package/assets/character-runtime/thumbnails/shapes/capsule.png +0 -0
  24. package/assets/character-runtime/thumbnails/shapes/circle.png +0 -0
  25. package/assets/character-runtime/thumbnails/shapes/circle_two_ears.png +0 -0
  26. package/assets/character-runtime/thumbnails/shapes/four_lobed_butterfly.png +0 -0
  27. package/assets/character-runtime/thumbnails/shapes/heart.png +0 -0
  28. package/assets/character-runtime/thumbnails/shapes/rounded_cube.png +0 -0
  29. package/assets/character-runtime/thumbnails/shapes/rounded_diamond.png +0 -0
  30. package/assets/character-runtime/thumbnails/shapes/rounded_head_two_ears.png +0 -0
  31. package/assets/character-runtime/thumbnails/shapes/rounded_triangle.png +0 -0
  32. package/assets/character-runtime/thumbnails/shapes/six_lobed_flower.png +0 -0
  33. package/assets/character-runtime/thumbnails/shapes/twelve_scalloped_rosette.png +0 -0
  34. package/docs/adoption-matrix.mdx +9 -9
  35. package/docs/agent-avatar.mdx +44 -10
  36. package/docs/agent-creator.mdx +12 -4
  37. package/docs/multi-agent-chat.mdx +12 -0
  38. package/docs/project-board.mdx +3 -3
  39. package/lib/commonjs/agent-avatar/AgentAvatar.js +15 -203
  40. package/lib/commonjs/agent-avatar/AgentAvatar.js.map +1 -1
  41. package/lib/commonjs/agent-avatar/AgentAvatarProvider.js +69 -0
  42. package/lib/commonjs/agent-avatar/AgentAvatarProvider.js.map +1 -0
  43. package/lib/commonjs/agent-avatar/CharacterAvatar.js +212 -0
  44. package/lib/commonjs/agent-avatar/CharacterAvatar.js.map +1 -0
  45. package/lib/commonjs/agent-avatar/ProceduralAvatar.js +216 -0
  46. package/lib/commonjs/agent-avatar/ProceduralAvatar.js.map +1 -0
  47. package/lib/commonjs/agent-avatar/artwork.js +4 -3
  48. package/lib/commonjs/agent-avatar/artwork.js.map +1 -1
  49. package/lib/commonjs/agent-avatar/avatar-color.js +16 -0
  50. package/lib/commonjs/agent-avatar/avatar-color.js.map +1 -0
  51. package/lib/commonjs/agent-avatar/character-html.js +25 -0
  52. package/lib/commonjs/agent-avatar/character-html.js.map +1 -0
  53. package/lib/commonjs/agent-avatar/character-runtime-module.js +39 -0
  54. package/lib/commonjs/agent-avatar/character-runtime-module.js.map +1 -0
  55. package/lib/commonjs/agent-avatar/character-webview.js +18 -0
  56. package/lib/commonjs/agent-avatar/character-webview.js.map +1 -0
  57. package/lib/commonjs/agent-avatar/config-character.js +36 -0
  58. package/lib/commonjs/agent-avatar/config-character.js.map +1 -0
  59. package/lib/commonjs/agent-avatar/context.js +6 -1
  60. package/lib/commonjs/agent-avatar/context.js.map +1 -1
  61. package/lib/commonjs/agent-avatar/index.js +7 -0
  62. package/lib/commonjs/agent-avatar/index.js.map +1 -1
  63. package/lib/commonjs/agent-avatar/legacy-contours.js +57 -0
  64. package/lib/commonjs/agent-avatar/legacy-contours.js.map +1 -0
  65. package/lib/commonjs/agent-avatar/legacy-recipe.js +112 -0
  66. package/lib/commonjs/agent-avatar/legacy-recipe.js.map +1 -0
  67. package/lib/commonjs/agent-avatar/messages.js +2 -1
  68. package/lib/commonjs/agent-avatar/messages.js.map +1 -1
  69. package/lib/commonjs/agent-avatar/model.js +2 -0
  70. package/lib/commonjs/agent-avatar/model.js.map +1 -1
  71. package/lib/commonjs/agent-creator/AgentCreatorBase.js +251 -25
  72. package/lib/commonjs/agent-creator/AgentCreatorBase.js.map +1 -1
  73. package/lib/commonjs/agent-creator/CharacterControls.js +115 -0
  74. package/lib/commonjs/agent-creator/CharacterControls.js.map +1 -0
  75. package/lib/commonjs/agent-creator/EmotionPicker.js +51 -18
  76. package/lib/commonjs/agent-creator/EmotionPicker.js.map +1 -1
  77. package/lib/commonjs/agent-creator/ShapeArc.js +56 -26
  78. package/lib/commonjs/agent-creator/ShapeArc.js.map +1 -1
  79. package/lib/commonjs/agent-creator/ShapeSilhouette.js +62 -0
  80. package/lib/commonjs/agent-creator/ShapeSilhouette.js.map +1 -0
  81. package/lib/commonjs/agent-creator/constants.js +48 -1
  82. package/lib/commonjs/agent-creator/constants.js.map +1 -1
  83. package/lib/commonjs/agent-creator/messages.js +9 -0
  84. package/lib/commonjs/agent-creator/messages.js.map +1 -1
  85. package/lib/commonjs/agent-creator/shared.js +7 -10
  86. package/lib/commonjs/agent-creator/shared.js.map +1 -1
  87. package/lib/commonjs/agent-thinking/AgentThinking.js +4 -62
  88. package/lib/commonjs/agent-thinking/AgentThinking.js.map +1 -1
  89. package/lib/commonjs/agent-thinking/ThinkingLabel.js +77 -0
  90. package/lib/commonjs/agent-thinking/ThinkingLabel.js.map +1 -0
  91. package/lib/commonjs/chart-cards/TokensChartCard.js +20 -5
  92. package/lib/commonjs/chart-cards/TokensChartCard.js.map +1 -1
  93. package/lib/commonjs/locale/translations/ar.js +11 -1
  94. package/lib/commonjs/locale/translations/ar.js.map +1 -1
  95. package/lib/commonjs/locale/translations/bn.js +11 -1
  96. package/lib/commonjs/locale/translations/bn.js.map +1 -1
  97. package/lib/commonjs/locale/translations/ca.js +11 -1
  98. package/lib/commonjs/locale/translations/ca.js.map +1 -1
  99. package/lib/commonjs/locale/translations/de.js +11 -1
  100. package/lib/commonjs/locale/translations/de.js.map +1 -1
  101. package/lib/commonjs/locale/translations/es.js +11 -1
  102. package/lib/commonjs/locale/translations/es.js.map +1 -1
  103. package/lib/commonjs/locale/translations/fr.js +11 -1
  104. package/lib/commonjs/locale/translations/fr.js.map +1 -1
  105. package/lib/commonjs/locale/translations/hi.js +11 -1
  106. package/lib/commonjs/locale/translations/hi.js.map +1 -1
  107. package/lib/commonjs/locale/translations/id.js +11 -1
  108. package/lib/commonjs/locale/translations/id.js.map +1 -1
  109. package/lib/commonjs/locale/translations/it.js +11 -1
  110. package/lib/commonjs/locale/translations/it.js.map +1 -1
  111. package/lib/commonjs/locale/translations/ja.js +11 -1
  112. package/lib/commonjs/locale/translations/ja.js.map +1 -1
  113. package/lib/commonjs/locale/translations/pt.js +11 -1
  114. package/lib/commonjs/locale/translations/pt.js.map +1 -1
  115. package/lib/commonjs/locale/translations/ru.js +11 -1
  116. package/lib/commonjs/locale/translations/ru.js.map +1 -1
  117. package/lib/commonjs/locale/translations/tr.js +11 -1
  118. package/lib/commonjs/locale/translations/tr.js.map +1 -1
  119. package/lib/commonjs/locale/translations/zh.js +11 -1
  120. package/lib/commonjs/locale/translations/zh.js.map +1 -1
  121. package/lib/commonjs/multi-agent-chat/AvatarHandoff.js +2 -4
  122. package/lib/commonjs/multi-agent-chat/AvatarHandoff.js.map +1 -1
  123. package/lib/commonjs/multi-agent-chat/ChatAgentProfile.js +97 -0
  124. package/lib/commonjs/multi-agent-chat/ChatAgentProfile.js.map +1 -0
  125. package/lib/commonjs/multi-agent-chat/EditorRail.js +4 -0
  126. package/lib/commonjs/multi-agent-chat/EditorRail.js.map +1 -1
  127. package/lib/commonjs/multi-agent-chat/MultiAgentChatBase.js +89 -126
  128. package/lib/commonjs/multi-agent-chat/MultiAgentChatBase.js.map +1 -1
  129. package/lib/commonjs/multi-agent-chat/ReplyRow.js +8 -11
  130. package/lib/commonjs/multi-agent-chat/ReplyRow.js.map +1 -1
  131. package/lib/commonjs/multi-agent-chat/handoff.js +5 -5
  132. package/lib/commonjs/multi-agent-chat/handoff.js.map +1 -1
  133. package/lib/commonjs/project-board/CreateTicketDialog.js +33 -2
  134. package/lib/commonjs/project-board/CreateTicketDialog.js.map +1 -1
  135. package/lib/commonjs/project-board/ProjectBoardBase.js +137 -38
  136. package/lib/commonjs/project-board/ProjectBoardBase.js.map +1 -1
  137. package/lib/commonjs/project-board/TicketCornerGenieSurface.web.js +34 -28
  138. package/lib/commonjs/project-board/TicketCornerGenieSurface.web.js.map +1 -1
  139. package/lib/commonjs/project-board/TicketDetailDialog.js +6 -3
  140. package/lib/commonjs/project-board/TicketDetailDialog.js.map +1 -1
  141. package/lib/commonjs/project-board/TicketGenieSurface.js +17 -7
  142. package/lib/commonjs/project-board/TicketGenieSurface.js.map +1 -1
  143. package/lib/commonjs/project-board/TicketGenieSurface.web.js +1 -1
  144. package/lib/commonjs/project-board/TicketGenieSurface.web.js.map +1 -1
  145. package/lib/commonjs/project-board/TicketPresence.js +125 -0
  146. package/lib/commonjs/project-board/TicketPresence.js.map +1 -0
  147. package/lib/commonjs/project-board/TicketTokenChart.js +23 -0
  148. package/lib/commonjs/project-board/TicketTokenChart.js.map +1 -0
  149. package/lib/commonjs/project-board/context.js +3 -1
  150. package/lib/commonjs/project-board/context.js.map +1 -1
  151. package/lib/commonjs/search/Search.js +12 -3
  152. package/lib/commonjs/search/Search.js.map +1 -1
  153. package/lib/commonjs/sidebar/SidebarToolbar.js +28 -14
  154. package/lib/commonjs/sidebar/SidebarToolbar.js.map +1 -1
  155. package/lib/commonjs/text-field/TextField.js +13 -7
  156. package/lib/commonjs/text-field/TextField.js.map +1 -1
  157. package/lib/module/agent-avatar/AgentAvatar.js +16 -204
  158. package/lib/module/agent-avatar/AgentAvatar.js.map +1 -1
  159. package/lib/module/agent-avatar/AgentAvatarProvider.js +65 -0
  160. package/lib/module/agent-avatar/AgentAvatarProvider.js.map +1 -0
  161. package/lib/module/agent-avatar/CharacterAvatar.js +208 -0
  162. package/lib/module/agent-avatar/CharacterAvatar.js.map +1 -0
  163. package/lib/module/agent-avatar/ProceduralAvatar.js +212 -0
  164. package/lib/module/agent-avatar/ProceduralAvatar.js.map +1 -0
  165. package/lib/module/agent-avatar/artwork.js +3 -3
  166. package/lib/module/agent-avatar/artwork.js.map +1 -1
  167. package/lib/module/agent-avatar/avatar-color.js +12 -0
  168. package/lib/module/agent-avatar/avatar-color.js.map +1 -0
  169. package/lib/module/agent-avatar/character-html.js +19 -0
  170. package/lib/module/agent-avatar/character-html.js.map +1 -0
  171. package/lib/module/agent-avatar/character-runtime-module.js +35 -0
  172. package/lib/module/agent-avatar/character-runtime-module.js.map +1 -0
  173. package/lib/module/agent-avatar/character-webview.js +14 -0
  174. package/lib/module/agent-avatar/character-webview.js.map +1 -0
  175. package/lib/module/agent-avatar/config-character.js +32 -0
  176. package/lib/module/agent-avatar/config-character.js.map +1 -0
  177. package/lib/module/agent-avatar/context.js +5 -0
  178. package/lib/module/agent-avatar/context.js.map +1 -1
  179. package/lib/module/agent-avatar/index.js +1 -0
  180. package/lib/module/agent-avatar/index.js.map +1 -1
  181. package/lib/module/agent-avatar/legacy-contours.js +53 -0
  182. package/lib/module/agent-avatar/legacy-contours.js.map +1 -0
  183. package/lib/module/agent-avatar/legacy-recipe.js +104 -0
  184. package/lib/module/agent-avatar/legacy-recipe.js.map +1 -0
  185. package/lib/module/agent-avatar/messages.js +2 -1
  186. package/lib/module/agent-avatar/messages.js.map +1 -1
  187. package/lib/module/agent-avatar/model.js +2 -0
  188. package/lib/module/agent-avatar/model.js.map +1 -1
  189. package/lib/module/agent-creator/AgentCreatorBase.js +248 -22
  190. package/lib/module/agent-creator/AgentCreatorBase.js.map +1 -1
  191. package/lib/module/agent-creator/CharacterControls.js +112 -0
  192. package/lib/module/agent-creator/CharacterControls.js.map +1 -0
  193. package/lib/module/agent-creator/EmotionPicker.js +52 -19
  194. package/lib/module/agent-creator/EmotionPicker.js.map +1 -1
  195. package/lib/module/agent-creator/ShapeArc.js +58 -28
  196. package/lib/module/agent-creator/ShapeArc.js.map +1 -1
  197. package/lib/module/agent-creator/ShapeSilhouette.js +57 -0
  198. package/lib/module/agent-creator/ShapeSilhouette.js.map +1 -0
  199. package/lib/module/agent-creator/constants.js +47 -0
  200. package/lib/module/agent-creator/constants.js.map +1 -1
  201. package/lib/module/agent-creator/messages.js +9 -0
  202. package/lib/module/agent-creator/messages.js.map +1 -1
  203. package/lib/module/agent-creator/shared.js +1 -9
  204. package/lib/module/agent-creator/shared.js.map +1 -1
  205. package/lib/module/agent-thinking/AgentThinking.js +5 -63
  206. package/lib/module/agent-thinking/AgentThinking.js.map +1 -1
  207. package/lib/module/agent-thinking/ThinkingLabel.js +73 -0
  208. package/lib/module/agent-thinking/ThinkingLabel.js.map +1 -0
  209. package/lib/module/chart-cards/TokensChartCard.js +20 -5
  210. package/lib/module/chart-cards/TokensChartCard.js.map +1 -1
  211. package/lib/module/locale/translations/ar.js +11 -1
  212. package/lib/module/locale/translations/ar.js.map +1 -1
  213. package/lib/module/locale/translations/bn.js +11 -1
  214. package/lib/module/locale/translations/bn.js.map +1 -1
  215. package/lib/module/locale/translations/ca.js +11 -1
  216. package/lib/module/locale/translations/ca.js.map +1 -1
  217. package/lib/module/locale/translations/de.js +11 -1
  218. package/lib/module/locale/translations/de.js.map +1 -1
  219. package/lib/module/locale/translations/es.js +11 -1
  220. package/lib/module/locale/translations/es.js.map +1 -1
  221. package/lib/module/locale/translations/fr.js +11 -1
  222. package/lib/module/locale/translations/fr.js.map +1 -1
  223. package/lib/module/locale/translations/hi.js +11 -1
  224. package/lib/module/locale/translations/hi.js.map +1 -1
  225. package/lib/module/locale/translations/id.js +11 -1
  226. package/lib/module/locale/translations/id.js.map +1 -1
  227. package/lib/module/locale/translations/it.js +11 -1
  228. package/lib/module/locale/translations/it.js.map +1 -1
  229. package/lib/module/locale/translations/ja.js +11 -1
  230. package/lib/module/locale/translations/ja.js.map +1 -1
  231. package/lib/module/locale/translations/pt.js +11 -1
  232. package/lib/module/locale/translations/pt.js.map +1 -1
  233. package/lib/module/locale/translations/ru.js +11 -1
  234. package/lib/module/locale/translations/ru.js.map +1 -1
  235. package/lib/module/locale/translations/tr.js +11 -1
  236. package/lib/module/locale/translations/tr.js.map +1 -1
  237. package/lib/module/locale/translations/zh.js +11 -1
  238. package/lib/module/locale/translations/zh.js.map +1 -1
  239. package/lib/module/multi-agent-chat/AvatarHandoff.js +3 -5
  240. package/lib/module/multi-agent-chat/AvatarHandoff.js.map +1 -1
  241. package/lib/module/multi-agent-chat/ChatAgentProfile.js +94 -0
  242. package/lib/module/multi-agent-chat/ChatAgentProfile.js.map +1 -0
  243. package/lib/module/multi-agent-chat/EditorRail.js +4 -0
  244. package/lib/module/multi-agent-chat/EditorRail.js.map +1 -1
  245. package/lib/module/multi-agent-chat/MultiAgentChatBase.js +89 -126
  246. package/lib/module/multi-agent-chat/MultiAgentChatBase.js.map +1 -1
  247. package/lib/module/multi-agent-chat/ReplyRow.js +9 -12
  248. package/lib/module/multi-agent-chat/ReplyRow.js.map +1 -1
  249. package/lib/module/multi-agent-chat/handoff.js +4 -4
  250. package/lib/module/multi-agent-chat/handoff.js.map +1 -1
  251. package/lib/module/project-board/CreateTicketDialog.js +33 -2
  252. package/lib/module/project-board/CreateTicketDialog.js.map +1 -1
  253. package/lib/module/project-board/ProjectBoardBase.js +138 -39
  254. package/lib/module/project-board/ProjectBoardBase.js.map +1 -1
  255. package/lib/module/project-board/TicketCornerGenieSurface.web.js +35 -29
  256. package/lib/module/project-board/TicketCornerGenieSurface.web.js.map +1 -1
  257. package/lib/module/project-board/TicketDetailDialog.js +7 -4
  258. package/lib/module/project-board/TicketDetailDialog.js.map +1 -1
  259. package/lib/module/project-board/TicketGenieSurface.js +17 -7
  260. package/lib/module/project-board/TicketGenieSurface.js.map +1 -1
  261. package/lib/module/project-board/TicketGenieSurface.web.js +1 -1
  262. package/lib/module/project-board/TicketGenieSurface.web.js.map +1 -1
  263. package/lib/module/project-board/TicketPresence.js +119 -0
  264. package/lib/module/project-board/TicketPresence.js.map +1 -0
  265. package/lib/module/project-board/TicketTokenChart.js +20 -0
  266. package/lib/module/project-board/TicketTokenChart.js.map +1 -0
  267. package/lib/module/project-board/context.js +2 -0
  268. package/lib/module/project-board/context.js.map +1 -1
  269. package/lib/module/search/Search.js +12 -3
  270. package/lib/module/search/Search.js.map +1 -1
  271. package/lib/module/sidebar/SidebarToolbar.js +29 -15
  272. package/lib/module/sidebar/SidebarToolbar.js.map +1 -1
  273. package/lib/module/text-field/TextField.js +13 -7
  274. package/lib/module/text-field/TextField.js.map +1 -1
  275. package/lib/typescript/commonjs/agent-avatar/AgentAvatar.d.ts +2 -2
  276. package/lib/typescript/commonjs/agent-avatar/AgentAvatar.d.ts.map +1 -1
  277. package/lib/typescript/commonjs/agent-avatar/AgentAvatarProvider.d.ts +4 -0
  278. package/lib/typescript/commonjs/agent-avatar/AgentAvatarProvider.d.ts.map +1 -0
  279. package/lib/typescript/commonjs/agent-avatar/CharacterAvatar.d.ts +4 -0
  280. package/lib/typescript/commonjs/agent-avatar/CharacterAvatar.d.ts.map +1 -0
  281. package/lib/typescript/commonjs/agent-avatar/ProceduralAvatar.d.ts +6 -0
  282. package/lib/typescript/commonjs/agent-avatar/ProceduralAvatar.d.ts.map +1 -0
  283. package/lib/typescript/commonjs/agent-avatar/artwork.d.ts +2 -1
  284. package/lib/typescript/commonjs/agent-avatar/artwork.d.ts.map +1 -1
  285. package/lib/typescript/commonjs/agent-avatar/avatar-color.d.ts +3 -0
  286. package/lib/typescript/commonjs/agent-avatar/avatar-color.d.ts.map +1 -0
  287. package/lib/typescript/commonjs/agent-avatar/character-html.d.ts +4 -0
  288. package/lib/typescript/commonjs/agent-avatar/character-html.d.ts.map +1 -0
  289. package/lib/typescript/commonjs/agent-avatar/character-runtime-module.d.ts +2 -0
  290. package/lib/typescript/commonjs/agent-avatar/character-runtime-module.d.ts.map +1 -0
  291. package/lib/typescript/commonjs/agent-avatar/character-webview.d.ts +24 -0
  292. package/lib/typescript/commonjs/agent-avatar/character-webview.d.ts.map +1 -0
  293. package/lib/typescript/commonjs/agent-avatar/config-character.d.ts +11 -0
  294. package/lib/typescript/commonjs/agent-avatar/config-character.d.ts.map +1 -0
  295. package/lib/typescript/commonjs/agent-avatar/context.d.ts +15 -0
  296. package/lib/typescript/commonjs/agent-avatar/context.d.ts.map +1 -1
  297. package/lib/typescript/commonjs/agent-avatar/index.d.ts +3 -1
  298. package/lib/typescript/commonjs/agent-avatar/index.d.ts.map +1 -1
  299. package/lib/typescript/commonjs/agent-avatar/legacy-contours.d.ts +5 -0
  300. package/lib/typescript/commonjs/agent-avatar/legacy-contours.d.ts.map +1 -0
  301. package/lib/typescript/commonjs/agent-avatar/legacy-recipe.d.ts +40 -0
  302. package/lib/typescript/commonjs/agent-avatar/legacy-recipe.d.ts.map +1 -0
  303. package/lib/typescript/commonjs/agent-avatar/messages.d.ts +1 -0
  304. package/lib/typescript/commonjs/agent-avatar/messages.d.ts.map +1 -1
  305. package/lib/typescript/commonjs/agent-avatar/model.d.ts +3 -0
  306. package/lib/typescript/commonjs/agent-avatar/model.d.ts.map +1 -1
  307. package/lib/typescript/commonjs/agent-avatar/types.d.ts +10 -1
  308. package/lib/typescript/commonjs/agent-avatar/types.d.ts.map +1 -1
  309. package/lib/typescript/commonjs/agent-creator/AgentCreatorBase.d.ts.map +1 -1
  310. package/lib/typescript/commonjs/agent-creator/CharacterControls.d.ts +8 -0
  311. package/lib/typescript/commonjs/agent-creator/CharacterControls.d.ts.map +1 -0
  312. package/lib/typescript/commonjs/agent-creator/EmotionPicker.d.ts +12 -1
  313. package/lib/typescript/commonjs/agent-creator/EmotionPicker.d.ts.map +1 -1
  314. package/lib/typescript/commonjs/agent-creator/ShapeArc.d.ts +11 -2
  315. package/lib/typescript/commonjs/agent-creator/ShapeArc.d.ts.map +1 -1
  316. package/lib/typescript/commonjs/agent-creator/ShapeSilhouette.d.ts +6 -0
  317. package/lib/typescript/commonjs/agent-creator/ShapeSilhouette.d.ts.map +1 -0
  318. package/lib/typescript/commonjs/agent-creator/constants.d.ts +44 -0
  319. package/lib/typescript/commonjs/agent-creator/constants.d.ts.map +1 -1
  320. package/lib/typescript/commonjs/agent-creator/context.d.ts +9 -0
  321. package/lib/typescript/commonjs/agent-creator/context.d.ts.map +1 -1
  322. package/lib/typescript/commonjs/agent-creator/messages.d.ts +10 -0
  323. package/lib/typescript/commonjs/agent-creator/messages.d.ts.map +1 -1
  324. package/lib/typescript/commonjs/agent-creator/shared.d.ts +1 -1
  325. package/lib/typescript/commonjs/agent-creator/shared.d.ts.map +1 -1
  326. package/lib/typescript/commonjs/agent-thinking/AgentThinking.d.ts.map +1 -1
  327. package/lib/typescript/commonjs/agent-thinking/ThinkingLabel.d.ts +7 -0
  328. package/lib/typescript/commonjs/agent-thinking/ThinkingLabel.d.ts.map +1 -0
  329. package/lib/typescript/commonjs/chart-cards/TokensChartCard.d.ts +3 -1
  330. package/lib/typescript/commonjs/chart-cards/TokensChartCard.d.ts.map +1 -1
  331. package/lib/typescript/commonjs/locale/translations/ar.d.ts.map +1 -1
  332. package/lib/typescript/commonjs/locale/translations/bn.d.ts.map +1 -1
  333. package/lib/typescript/commonjs/locale/translations/ca.d.ts.map +1 -1
  334. package/lib/typescript/commonjs/locale/translations/de.d.ts.map +1 -1
  335. package/lib/typescript/commonjs/locale/translations/es.d.ts.map +1 -1
  336. package/lib/typescript/commonjs/locale/translations/fr.d.ts.map +1 -1
  337. package/lib/typescript/commonjs/locale/translations/hi.d.ts.map +1 -1
  338. package/lib/typescript/commonjs/locale/translations/id.d.ts.map +1 -1
  339. package/lib/typescript/commonjs/locale/translations/it.d.ts.map +1 -1
  340. package/lib/typescript/commonjs/locale/translations/ja.d.ts.map +1 -1
  341. package/lib/typescript/commonjs/locale/translations/pt.d.ts.map +1 -1
  342. package/lib/typescript/commonjs/locale/translations/ru.d.ts.map +1 -1
  343. package/lib/typescript/commonjs/locale/translations/tr.d.ts.map +1 -1
  344. package/lib/typescript/commonjs/locale/translations/zh.d.ts.map +1 -1
  345. package/lib/typescript/commonjs/multi-agent-chat/AvatarHandoff.d.ts.map +1 -1
  346. package/lib/typescript/commonjs/multi-agent-chat/ChatAgentProfile.d.ts +11 -0
  347. package/lib/typescript/commonjs/multi-agent-chat/ChatAgentProfile.d.ts.map +1 -0
  348. package/lib/typescript/commonjs/multi-agent-chat/EditorRail.d.ts.map +1 -1
  349. package/lib/typescript/commonjs/multi-agent-chat/MultiAgentChatBase.d.ts.map +1 -1
  350. package/lib/typescript/commonjs/multi-agent-chat/ReplyRow.d.ts.map +1 -1
  351. package/lib/typescript/commonjs/multi-agent-chat/handoff.d.ts +2 -2
  352. package/lib/typescript/commonjs/multi-agent-chat/handoff.d.ts.map +1 -1
  353. package/lib/typescript/commonjs/project-board/CreateTicketDialog.d.ts.map +1 -1
  354. package/lib/typescript/commonjs/project-board/ProjectBoardBase.d.ts.map +1 -1
  355. package/lib/typescript/commonjs/project-board/TicketCornerGenieSurface.web.d.ts.map +1 -1
  356. package/lib/typescript/commonjs/project-board/TicketDetailDialog.d.ts.map +1 -1
  357. package/lib/typescript/commonjs/project-board/TicketGenieSurface.d.ts.map +1 -1
  358. package/lib/typescript/commonjs/project-board/TicketPresence.d.ts +17 -0
  359. package/lib/typescript/commonjs/project-board/TicketPresence.d.ts.map +1 -0
  360. package/lib/typescript/commonjs/project-board/TicketTokenChart.d.ts +5 -0
  361. package/lib/typescript/commonjs/project-board/TicketTokenChart.d.ts.map +1 -0
  362. package/lib/typescript/commonjs/project-board/context.d.ts +2 -0
  363. package/lib/typescript/commonjs/project-board/context.d.ts.map +1 -1
  364. package/lib/typescript/commonjs/search/Search.d.ts.map +1 -1
  365. package/lib/typescript/commonjs/sidebar/SidebarToolbar.d.ts.map +1 -1
  366. package/lib/typescript/commonjs/text-field/TextField.d.ts.map +1 -1
  367. package/lib/typescript/module/agent-avatar/AgentAvatar.d.ts +2 -2
  368. package/lib/typescript/module/agent-avatar/AgentAvatar.d.ts.map +1 -1
  369. package/lib/typescript/module/agent-avatar/AgentAvatarProvider.d.ts +4 -0
  370. package/lib/typescript/module/agent-avatar/AgentAvatarProvider.d.ts.map +1 -0
  371. package/lib/typescript/module/agent-avatar/CharacterAvatar.d.ts +4 -0
  372. package/lib/typescript/module/agent-avatar/CharacterAvatar.d.ts.map +1 -0
  373. package/lib/typescript/module/agent-avatar/ProceduralAvatar.d.ts +6 -0
  374. package/lib/typescript/module/agent-avatar/ProceduralAvatar.d.ts.map +1 -0
  375. package/lib/typescript/module/agent-avatar/artwork.d.ts +2 -1
  376. package/lib/typescript/module/agent-avatar/artwork.d.ts.map +1 -1
  377. package/lib/typescript/module/agent-avatar/avatar-color.d.ts +3 -0
  378. package/lib/typescript/module/agent-avatar/avatar-color.d.ts.map +1 -0
  379. package/lib/typescript/module/agent-avatar/character-html.d.ts +4 -0
  380. package/lib/typescript/module/agent-avatar/character-html.d.ts.map +1 -0
  381. package/lib/typescript/module/agent-avatar/character-runtime-module.d.ts +2 -0
  382. package/lib/typescript/module/agent-avatar/character-runtime-module.d.ts.map +1 -0
  383. package/lib/typescript/module/agent-avatar/character-webview.d.ts +24 -0
  384. package/lib/typescript/module/agent-avatar/character-webview.d.ts.map +1 -0
  385. package/lib/typescript/module/agent-avatar/config-character.d.ts +11 -0
  386. package/lib/typescript/module/agent-avatar/config-character.d.ts.map +1 -0
  387. package/lib/typescript/module/agent-avatar/context.d.ts +15 -0
  388. package/lib/typescript/module/agent-avatar/context.d.ts.map +1 -1
  389. package/lib/typescript/module/agent-avatar/index.d.ts +3 -1
  390. package/lib/typescript/module/agent-avatar/index.d.ts.map +1 -1
  391. package/lib/typescript/module/agent-avatar/legacy-contours.d.ts +5 -0
  392. package/lib/typescript/module/agent-avatar/legacy-contours.d.ts.map +1 -0
  393. package/lib/typescript/module/agent-avatar/legacy-recipe.d.ts +40 -0
  394. package/lib/typescript/module/agent-avatar/legacy-recipe.d.ts.map +1 -0
  395. package/lib/typescript/module/agent-avatar/messages.d.ts +1 -0
  396. package/lib/typescript/module/agent-avatar/messages.d.ts.map +1 -1
  397. package/lib/typescript/module/agent-avatar/model.d.ts +3 -0
  398. package/lib/typescript/module/agent-avatar/model.d.ts.map +1 -1
  399. package/lib/typescript/module/agent-avatar/types.d.ts +10 -1
  400. package/lib/typescript/module/agent-avatar/types.d.ts.map +1 -1
  401. package/lib/typescript/module/agent-creator/AgentCreatorBase.d.ts.map +1 -1
  402. package/lib/typescript/module/agent-creator/CharacterControls.d.ts +8 -0
  403. package/lib/typescript/module/agent-creator/CharacterControls.d.ts.map +1 -0
  404. package/lib/typescript/module/agent-creator/EmotionPicker.d.ts +12 -1
  405. package/lib/typescript/module/agent-creator/EmotionPicker.d.ts.map +1 -1
  406. package/lib/typescript/module/agent-creator/ShapeArc.d.ts +11 -2
  407. package/lib/typescript/module/agent-creator/ShapeArc.d.ts.map +1 -1
  408. package/lib/typescript/module/agent-creator/ShapeSilhouette.d.ts +6 -0
  409. package/lib/typescript/module/agent-creator/ShapeSilhouette.d.ts.map +1 -0
  410. package/lib/typescript/module/agent-creator/constants.d.ts +44 -0
  411. package/lib/typescript/module/agent-creator/constants.d.ts.map +1 -1
  412. package/lib/typescript/module/agent-creator/context.d.ts +9 -0
  413. package/lib/typescript/module/agent-creator/context.d.ts.map +1 -1
  414. package/lib/typescript/module/agent-creator/messages.d.ts +10 -0
  415. package/lib/typescript/module/agent-creator/messages.d.ts.map +1 -1
  416. package/lib/typescript/module/agent-creator/shared.d.ts +1 -1
  417. package/lib/typescript/module/agent-creator/shared.d.ts.map +1 -1
  418. package/lib/typescript/module/agent-thinking/AgentThinking.d.ts.map +1 -1
  419. package/lib/typescript/module/agent-thinking/ThinkingLabel.d.ts +7 -0
  420. package/lib/typescript/module/agent-thinking/ThinkingLabel.d.ts.map +1 -0
  421. package/lib/typescript/module/chart-cards/TokensChartCard.d.ts +3 -1
  422. package/lib/typescript/module/chart-cards/TokensChartCard.d.ts.map +1 -1
  423. package/lib/typescript/module/locale/translations/ar.d.ts.map +1 -1
  424. package/lib/typescript/module/locale/translations/bn.d.ts.map +1 -1
  425. package/lib/typescript/module/locale/translations/ca.d.ts.map +1 -1
  426. package/lib/typescript/module/locale/translations/de.d.ts.map +1 -1
  427. package/lib/typescript/module/locale/translations/es.d.ts.map +1 -1
  428. package/lib/typescript/module/locale/translations/fr.d.ts.map +1 -1
  429. package/lib/typescript/module/locale/translations/hi.d.ts.map +1 -1
  430. package/lib/typescript/module/locale/translations/id.d.ts.map +1 -1
  431. package/lib/typescript/module/locale/translations/it.d.ts.map +1 -1
  432. package/lib/typescript/module/locale/translations/ja.d.ts.map +1 -1
  433. package/lib/typescript/module/locale/translations/pt.d.ts.map +1 -1
  434. package/lib/typescript/module/locale/translations/ru.d.ts.map +1 -1
  435. package/lib/typescript/module/locale/translations/tr.d.ts.map +1 -1
  436. package/lib/typescript/module/locale/translations/zh.d.ts.map +1 -1
  437. package/lib/typescript/module/multi-agent-chat/AvatarHandoff.d.ts.map +1 -1
  438. package/lib/typescript/module/multi-agent-chat/ChatAgentProfile.d.ts +11 -0
  439. package/lib/typescript/module/multi-agent-chat/ChatAgentProfile.d.ts.map +1 -0
  440. package/lib/typescript/module/multi-agent-chat/EditorRail.d.ts.map +1 -1
  441. package/lib/typescript/module/multi-agent-chat/MultiAgentChatBase.d.ts.map +1 -1
  442. package/lib/typescript/module/multi-agent-chat/ReplyRow.d.ts.map +1 -1
  443. package/lib/typescript/module/multi-agent-chat/handoff.d.ts +2 -2
  444. package/lib/typescript/module/multi-agent-chat/handoff.d.ts.map +1 -1
  445. package/lib/typescript/module/project-board/CreateTicketDialog.d.ts.map +1 -1
  446. package/lib/typescript/module/project-board/ProjectBoardBase.d.ts.map +1 -1
  447. package/lib/typescript/module/project-board/TicketCornerGenieSurface.web.d.ts.map +1 -1
  448. package/lib/typescript/module/project-board/TicketDetailDialog.d.ts.map +1 -1
  449. package/lib/typescript/module/project-board/TicketGenieSurface.d.ts.map +1 -1
  450. package/lib/typescript/module/project-board/TicketPresence.d.ts +17 -0
  451. package/lib/typescript/module/project-board/TicketPresence.d.ts.map +1 -0
  452. package/lib/typescript/module/project-board/TicketTokenChart.d.ts +5 -0
  453. package/lib/typescript/module/project-board/TicketTokenChart.d.ts.map +1 -0
  454. package/lib/typescript/module/project-board/context.d.ts +2 -0
  455. package/lib/typescript/module/project-board/context.d.ts.map +1 -1
  456. package/lib/typescript/module/search/Search.d.ts.map +1 -1
  457. package/lib/typescript/module/sidebar/SidebarToolbar.d.ts.map +1 -1
  458. package/lib/typescript/module/text-field/TextField.d.ts.map +1 -1
  459. package/package.json +8 -3
  460. package/src/agent-avatar/AgentAvatar.tsx +16 -296
  461. package/src/agent-avatar/AgentAvatarProvider.tsx +79 -0
  462. package/src/agent-avatar/CharacterAvatar.tsx +260 -0
  463. package/src/agent-avatar/ProceduralAvatar.tsx +303 -0
  464. package/src/agent-avatar/artwork.ts +3 -3
  465. package/src/agent-avatar/avatar-color.ts +17 -0
  466. package/src/agent-avatar/character-html.ts +21 -0
  467. package/src/agent-avatar/character-runtime-module.ts +37 -0
  468. package/src/agent-avatar/character-webview.ts +24 -0
  469. package/src/agent-avatar/config-character.ts +40 -0
  470. package/src/agent-avatar/context.ts +17 -0
  471. package/src/agent-avatar/index.ts +4 -1
  472. package/src/agent-avatar/legacy-contours.ts +76 -0
  473. package/src/agent-avatar/legacy-recipe.ts +123 -0
  474. package/src/agent-avatar/messages.ts +1 -0
  475. package/src/agent-avatar/model.ts +5 -0
  476. package/src/agent-avatar/types.ts +12 -1
  477. package/src/agent-creator/AgentCreatorBase.tsx +338 -39
  478. package/src/agent-creator/CharacterControls.tsx +150 -0
  479. package/src/agent-creator/EmotionPicker.tsx +43 -21
  480. package/src/agent-creator/ShapeArc.tsx +83 -29
  481. package/src/agent-creator/ShapeSilhouette.tsx +65 -0
  482. package/src/agent-creator/constants.ts +30 -0
  483. package/src/agent-creator/messages.ts +19 -0
  484. package/src/agent-creator/shared.ts +1 -15
  485. package/src/agent-thinking/AgentThinking.tsx +7 -70
  486. package/src/agent-thinking/ThinkingLabel.tsx +74 -0
  487. package/src/chart-cards/TokensChartCard.tsx +10 -6
  488. package/src/locale/translations/ar.ts +10 -1
  489. package/src/locale/translations/bn.ts +10 -1
  490. package/src/locale/translations/ca.ts +10 -1
  491. package/src/locale/translations/de.ts +10 -1
  492. package/src/locale/translations/es.ts +10 -1
  493. package/src/locale/translations/fr.ts +10 -1
  494. package/src/locale/translations/hi.ts +10 -1
  495. package/src/locale/translations/id.ts +10 -1
  496. package/src/locale/translations/it.ts +10 -1
  497. package/src/locale/translations/ja.ts +10 -1
  498. package/src/locale/translations/pt.ts +10 -1
  499. package/src/locale/translations/ru.ts +10 -1
  500. package/src/locale/translations/tr.ts +10 -1
  501. package/src/locale/translations/zh.ts +10 -1
  502. package/src/multi-agent-chat/AvatarHandoff.tsx +2 -5
  503. package/src/multi-agent-chat/ChatAgentProfile.tsx +116 -0
  504. package/src/multi-agent-chat/EditorRail.tsx +2 -0
  505. package/src/multi-agent-chat/MultiAgentChatBase.tsx +123 -175
  506. package/src/multi-agent-chat/ReplyRow.tsx +10 -9
  507. package/src/multi-agent-chat/handoff.ts +4 -4
  508. package/src/project-board/CreateTicketDialog.tsx +28 -4
  509. package/src/project-board/ProjectBoardBase.tsx +115 -21
  510. package/src/project-board/TicketCornerGenieSurface.web.tsx +11 -6
  511. package/src/project-board/TicketDetailDialog.tsx +5 -4
  512. package/src/project-board/TicketGenieSurface.tsx +9 -0
  513. package/src/project-board/TicketGenieSurface.web.tsx +1 -1
  514. package/src/project-board/TicketPresence.tsx +137 -0
  515. package/src/project-board/TicketTokenChart.tsx +14 -0
  516. package/src/project-board/context.ts +2 -0
  517. package/src/search/Search.tsx +6 -5
  518. package/src/sidebar/SidebarToolbar.tsx +27 -15
  519. package/src/text-field/TextField.tsx +12 -7
@@ -1,299 +1,19 @@
1
- import {
2
- useContext,
3
- useEffect,
4
- useLayoutEffect,
5
- useRef,
6
- useState,
7
- } from 'react';
8
- import {
9
- AccessibilityInfo,
10
- AppState,
11
- PixelRatio,
12
- Platform,
13
- type View,
14
- } from 'react-native';
15
- import { useReducedMotion } from 'react-native-reanimated';
16
- import { useMessages } from '../locale/messages';
17
- import { StyledView } from '../styles/styled-primitives';
18
- import { drawAvatar } from './artwork';
19
- import { advanceAttention, createAttention } from './attention';
20
- import { advanceBlink, createBlink } from './blink';
21
- import { AvatarDrawingObserver } from './context';
22
- import { DrawingContext } from './drawing';
23
- import { ENTRANCE_SECONDS } from './entrance';
24
- import {
25
- easeFace,
26
- expressionRig,
27
- faceAtSize,
28
- gazeAngles,
29
- type FaceRig,
30
- } from './face';
31
- import { AGENT_AVATAR_MESSAGES } from './messages';
32
- import type { ShapeMorph } from './shape-morph';
33
- import { Drawing } from './SvgDrawing';
1
+ import { memo, useContext } from 'react';
2
+ import { CharacterAvatar } from './CharacterAvatar';
3
+ import { ProceduralAvatar } from './ProceduralAvatar';
4
+ import { CharacterRuntimeContext } from './context';
5
+ import { legacyRecipeUnsupported } from './legacy-recipe';
34
6
  import type { AgentAvatarProps } from './types';
35
- import { advanceWander, createWander } from './wander';
36
- import { WORKING_SECONDS } from './working';
37
7
 
38
- const TAU = Math.PI * 2;
39
- const randomSeed = () => {
40
- if (globalThis.crypto?.getRandomValues)
41
- return globalThis.crypto.getRandomValues(new Uint32Array(1))[0]!;
42
- return Math.floor(Math.random() * 4294967296) >>> 0;
43
- };
44
-
45
- /** Animated procedural artwork; shared geometry, face rig and materials across platforms. */
46
- export function AgentAvatar({
47
- config,
48
- size = 64,
49
- paused = false,
50
- label,
51
- locale,
52
- entranceKey,
53
- workingKey,
54
- workingCycles = 1,
55
- className,
56
- style,
57
- accessibilityLabel,
58
- testID,
59
- }: AgentAvatarProps) {
60
- const { messages } = useMessages(AGENT_AVATAR_MESSAGES, locale);
61
- const initialReduced = useReducedMotion();
62
- const [reduced, setReduced] = useState(initialReduced);
63
- useEffect(() => {
64
- const subscription = AccessibilityInfo.addEventListener(
65
- 'reduceMotionChanged',
66
- setReduced,
67
- );
68
- const media =
69
- Platform.OS === 'web' && typeof matchMedia !== 'undefined'
70
- ? matchMedia('(prefers-reduced-motion: reduce)')
71
- : undefined;
72
- const change = () => setReduced(media!.matches);
73
- media?.addEventListener('change', change);
74
- if (media) change();
75
- return () => {
76
- subscription?.remove?.();
77
- media?.removeEventListener('change', change);
78
- };
79
- }, []);
80
- const backingSize = Math.round(size * Math.min(PixelRatio.get() || 1, 2));
81
- const root = useRef<View>(null);
82
- const randomized = useRef(false);
83
- const state = useRef<{
84
- phase: number;
85
- blink: ReturnType<typeof createBlink>;
86
- wander: ReturnType<typeof createWander>;
87
- attention: ReturnType<typeof createAttention>;
88
- shapeMorph: ShapeMorph;
89
- expression?: FaceRig;
90
- face?: FaceRig;
91
- velocity: Partial<FaceRig>;
92
- gaze?: [number, number];
93
- entrance: { key?: number; elapsed: number };
94
- working: { key?: number; elapsed: number };
95
- } | null>(null);
96
- if (!state.current) {
97
- const seed = config.seed >>> 0;
98
- state.current = {
99
- phase: (seed / 4294967296) * TAU,
100
- blink: createBlink(seed),
101
- wander: createWander(seed ^ config.seed, config.family === 'fold'),
102
- attention: createAttention(seed ^ config.seed),
103
- shapeMorph: { started: 0, active: false },
104
- velocity: {},
105
- entrance: { elapsed: ENTRANCE_SECONDS },
106
- working: { elapsed: WORKING_SECONDS },
107
- };
108
- }
109
- const renderDrawing = () => {
110
- const context = new DrawingContext(),
111
- s = state.current!;
112
- const appearance = faceAtSize(config, size),
113
- target = expressionRig(appearance);
114
- drawAvatar(
115
- context,
116
- appearance,
117
- s.phase,
118
- s.face ?? target,
119
- s.gaze ?? gazeAngles(appearance, s.phase, target),
120
- size,
121
- s.entrance.elapsed,
122
- s.working.elapsed,
123
- undefined,
124
- Math.max(1, Math.floor(workingCycles)),
125
- backingSize,
126
- );
127
- return context;
128
- };
129
- const [drawing, setDrawing] = useState(renderDrawing);
130
- const observeDrawing = useContext(AvatarDrawingObserver);
131
- useLayoutEffect(() => {
132
- observeDrawing?.(drawing);
133
- }, [observeDrawing, drawing]);
134
- useEffect(() => {
135
- const s = state.current!,
136
- cycles = Math.max(1, Math.floor(workingCycles));
137
- if (!randomized.current) {
138
- s.wander = createWander(
139
- randomSeed() ^ config.seed,
140
- config.family === 'fold',
141
- );
142
- const seed = randomSeed();
143
- s.phase = (seed / 4294967296) * TAU;
144
- s.blink = createBlink(seed);
145
- s.attention = createAttention(randomSeed() ^ config.seed);
146
- randomized.current = true;
147
- }
148
- const duration = WORKING_SECONDS * cycles,
149
- appearance = faceAtSize(config, size),
150
- target = expressionRig(appearance);
151
- if (s.entrance.key !== entranceKey)
152
- s.entrance = {
153
- key: entranceKey,
154
- elapsed: entranceKey === undefined || paused ? ENTRANCE_SECONDS : 0,
155
- };
156
- if (s.working.key !== workingKey) {
157
- s.working = {
158
- key: workingKey,
159
- elapsed: workingKey === undefined || paused ? duration : 0,
160
- };
161
- if (workingKey !== undefined) s.entrance.elapsed = ENTRANCE_SECONDS;
162
- }
163
- if (config.idle || workingKey === undefined) s.working.elapsed = duration;
164
- s.expression ??= s.face ?? target;
165
- s.face ??= target;
166
- s.gaze ??= gazeAngles(appearance, s.phase, target, s.wander.point);
167
- const frozen = paused || reduced || config.motion === 0;
168
- if (reduced || config.motion === 0) {
169
- s.entrance.elapsed = ENTRANCE_SECONDS;
170
- s.working.elapsed = duration;
171
- }
172
- if (frozen) {
173
- s.shapeMorph = { started: 0, active: false };
174
- s.face = target;
175
- s.expression = target;
176
- s.velocity = {};
177
- if (!paused || config.lookAt !== 'wander')
178
- s.gaze = gazeAngles(appearance, s.phase, target, s.wander.point);
179
- }
180
- const draw = () => {
181
- const context = new DrawingContext();
182
- drawAvatar(
183
- context,
184
- appearance,
185
- s.phase,
186
- s.face!,
187
- s.gaze!,
188
- size,
189
- s.entrance.elapsed,
190
- s.working.elapsed,
191
- frozen ? undefined : s.shapeMorph,
192
- cycles,
193
- backingSize,
194
- );
195
- setDrawing(context);
196
- };
197
- let frame = 0,
198
- last = 0,
199
- visible = true,
200
- active = AppState.currentState !== 'background',
201
- transitioning = true;
202
- const tick = (now: number) => {
203
- if (!last) last = now;
204
- if (now - last >= (transitioning ? 16 : 32)) {
205
- if (visible && active) {
206
- const milliseconds = Math.min(now - last, 64),
207
- seconds = milliseconds / 1000;
208
- s.entrance.elapsed = Math.min(
209
- ENTRANCE_SECONDS,
210
- s.entrance.elapsed + seconds,
211
- );
212
- s.working.elapsed = Math.min(duration, s.working.elapsed + seconds);
213
- const base = easeFace(
214
- s.expression ?? target,
215
- target,
216
- s.velocity,
217
- seconds,
218
- );
219
- s.expression = base;
220
- transitioning =
221
- (Object.keys(target) as (keyof FaceRig)[]).some(
222
- (key) => base[key] !== target[key],
223
- ) || s.shapeMorph.active;
224
- s.face =
225
- config.family === 'fold' || base.smile > 0.2
226
- ? advanceAttention(
227
- s.attention,
228
- (seconds * 8) / config.duration,
229
- base,
230
- appearance,
231
- )
232
- : base;
233
- s.face.blink = config.idle ? 1 : advanceBlink(s.blink, seconds);
234
- transitioning ||= s.blink.blinking;
235
- s.phase = (s.phase + (seconds * TAU) / config.duration) % TAU;
236
- if (!config.idle && config.lookAt === 'wander')
237
- advanceWander(
238
- s.wander,
239
- (seconds * 8) / config.duration,
240
- config.family === 'fold',
241
- );
242
- const aim = gazeAngles(appearance, s.phase, s.face, s.wander.point),
243
- ease = 1 - Math.exp(-milliseconds / 85);
244
- s.gaze = [
245
- s.gaze![0] + (aim[0] - s.gaze![0]) * ease,
246
- s.gaze![1] + (aim[1] - s.gaze![1]) * ease,
247
- ];
248
- draw();
249
- }
250
- last = now;
251
- }
252
- frame = requestAnimationFrame(tick);
253
- };
254
- const subscription = AppState.addEventListener('change', (next) => {
255
- active = next === 'active';
256
- last = 0;
257
- });
258
- let observer: IntersectionObserver | undefined;
259
- if (
260
- Platform.OS === 'web' &&
261
- typeof IntersectionObserver !== 'undefined' &&
262
- root.current instanceof Element
263
- ) {
264
- observer = new IntersectionObserver((entries) => {
265
- visible = entries[0]?.isIntersecting ?? true;
266
- });
267
- observer.observe(root.current);
268
- }
269
- draw();
270
- if (!frozen) frame = requestAnimationFrame(tick);
271
- return () => {
272
- cancelAnimationFrame(frame);
273
- subscription?.remove?.();
274
- observer?.disconnect();
275
- };
276
- }, [
277
- config,
278
- size,
279
- backingSize,
280
- paused,
281
- reduced,
282
- entranceKey,
283
- workingKey,
284
- workingCycles,
285
- ]);
286
- return (
287
- <StyledView
288
- ref={root}
289
- className={className}
290
- style={[{ width: size, height: size, maxWidth: '100%' }, style]}
291
- accessible
292
- accessibilityRole="image"
293
- accessibilityLabel={accessibilityLabel ?? label ?? messages.label}
294
- testID={testID}
295
- >
296
- <Drawing context={drawing} size={size} />
297
- </StyledView>
8
+ /** Both catalogs use the recovered engine when their recipe is supported. */
9
+ export const AgentAvatar = memo(function AgentAvatar(props: AgentAvatarProps) {
10
+ const { runtimeUrl } = useContext(CharacterRuntimeContext);
11
+ const beta =
12
+ props.config.character && props.config.character.preset !== 'bloom';
13
+ const legacy = runtimeUrl && !legacyRecipeUnsupported(props.config);
14
+ return beta || legacy ? (
15
+ <CharacterAvatar key={beta ? 'character' : 'legacy'} {...props} />
16
+ ) : (
17
+ <ProceduralAvatar {...props} />
298
18
  );
299
- }
19
+ });
@@ -0,0 +1,79 @@
1
+ import { useMemo, useState, useCallback, useEffect, useRef } from 'react';
2
+ import type { AgentAvatarProviderProps } from './types';
3
+ import {
4
+ type CharacterCapabilities,
5
+ CharacterRuntimeContext,
6
+ CharacterCapabilitiesContext,
7
+ } from './context';
8
+
9
+ const EMPTY_CAPABILITIES: ReadonlyMap<string, CharacterCapabilities> =
10
+ new Map();
11
+ function sameRecord<T>(left: Record<string, T>, right: Record<string, T>) {
12
+ const keys = Object.keys(left);
13
+ return (
14
+ keys.length === Object.keys(right).length &&
15
+ keys.every((key) => left[key] === right[key])
16
+ );
17
+ }
18
+
19
+ /** Enables the optional character engine without fetching it until an avatar needs it. */
20
+ export function AgentAvatarProvider({
21
+ runtimeUrl,
22
+ children,
23
+ }: AgentAvatarProviderProps) {
24
+ const [cache, setCapabilities] = useState(() => ({
25
+ runtimeUrl,
26
+ entries: EMPTY_CAPABILITIES,
27
+ }));
28
+ const activeRuntime = useRef(runtimeUrl);
29
+ activeRuntime.current = runtimeUrl;
30
+ // An old module's catalog cannot describe the newly selected runtime, even
31
+ // for the same saved recipe. Hide its cache during the first changed render.
32
+ const capabilitiesByKey =
33
+ cache.runtimeUrl === runtimeUrl ? cache.entries : EMPTY_CAPABILITIES;
34
+ useEffect(() => {
35
+ setCapabilities((previous) =>
36
+ previous.runtimeUrl === runtimeUrl
37
+ ? previous
38
+ : { runtimeUrl, entries: EMPTY_CAPABILITIES },
39
+ );
40
+ }, [runtimeUrl]);
41
+ const reportCapabilities = useCallback(
42
+ (next: CharacterCapabilities) => {
43
+ // A disposed renderer can finish preparing after its runtime was replaced.
44
+ if (activeRuntime.current !== runtimeUrl) return;
45
+ setCapabilities((previous) => {
46
+ if (activeRuntime.current !== runtimeUrl) return previous;
47
+ const prior =
48
+ previous.runtimeUrl === runtimeUrl
49
+ ? previous.entries
50
+ : EMPTY_CAPABILITIES;
51
+ const known = prior.get(next.key);
52
+ if (
53
+ known &&
54
+ sameRecord(known.available, next.available) &&
55
+ sameRecord(known.selected, next.selected)
56
+ )
57
+ return previous;
58
+ const entries = new Map(prior);
59
+ entries.delete(next.key);
60
+ entries.set(next.key, next);
61
+ if (entries.size > 64) entries.delete(entries.keys().next().value!);
62
+ return { runtimeUrl, entries };
63
+ });
64
+ },
65
+ [runtimeUrl],
66
+ );
67
+ const value = useMemo(
68
+ () => ({ runtimeUrl, reportCapabilities }),
69
+ [runtimeUrl, reportCapabilities],
70
+ );
71
+ const catalog = useMemo(() => ({ capabilitiesByKey }), [capabilitiesByKey]);
72
+ return (
73
+ <CharacterRuntimeContext.Provider value={value}>
74
+ <CharacterCapabilitiesContext.Provider value={catalog}>
75
+ {children}
76
+ </CharacterCapabilitiesContext.Provider>
77
+ </CharacterRuntimeContext.Provider>
78
+ );
79
+ }
@@ -0,0 +1,260 @@
1
+ import { useContext, useEffect, useMemo, useRef, useState } from 'react';
2
+ import { AccessibilityInfo, AppState, Platform, type View } from 'react-native';
3
+ import { useReducedMotion } from 'react-native-reanimated';
4
+ import { useMessages } from '../locale/messages';
5
+ import { StyledView } from '../styles/styled-primitives';
6
+ import { Text } from '../typography';
7
+ import { type CharacterCapabilities, CharacterRuntimeContext } from './context';
8
+ import { characterHtml, scriptJson } from './character-html';
9
+ import { loadCharacterRuntime } from './character-runtime-module';
10
+ import {
11
+ characterWebView,
12
+ type CharacterWebViewHandle,
13
+ } from './character-webview';
14
+ import { legacyRecipe } from './legacy-recipe';
15
+ import { AGENT_AVATAR_MESSAGES } from './messages';
16
+ import type { AgentAvatarProps } from './types';
17
+
18
+ type RenderProps = Pick<
19
+ AgentAvatarProps,
20
+ | 'config'
21
+ | 'paused'
22
+ | 'portrait'
23
+ | 'workingKey'
24
+ | 'workingCycles'
25
+ | 'interactive'
26
+ | 'reactionKey'
27
+ | 'entranceKey'
28
+ > & { reduced: boolean; legacy?: ReturnType<typeof legacyRecipe> };
29
+ type Controller = { update(props: RenderProps): void; dispose(): void };
30
+ type RuntimeModule = {
31
+ createAvatar(
32
+ canvas: HTMLCanvasElement,
33
+ props: RenderProps,
34
+ callbacks: {
35
+ onError(): void;
36
+ onCapabilities?(value: CharacterCapabilities): void;
37
+ },
38
+ ): Promise<Controller>;
39
+ };
40
+ function WebCharacter({
41
+ runtimeUrl,
42
+ value,
43
+ onError,
44
+ }: {
45
+ runtimeUrl: string;
46
+ value: RenderProps;
47
+ onError(): void;
48
+ }) {
49
+ const { reportCapabilities } = useContext(CharacterRuntimeContext);
50
+ const report = useRef(reportCapabilities);
51
+ report.current = reportCapabilities;
52
+ const host = useRef<View>(null),
53
+ controller = useRef<Controller | null>(null);
54
+ const latest = useRef(value);
55
+ latest.current = value;
56
+ const fail = useRef(onError);
57
+ fail.current = onError;
58
+ useEffect(() => {
59
+ const element = host.current as unknown as HTMLElement;
60
+ if (!element || typeof document === 'undefined') return;
61
+ let stopped = false,
62
+ started = false;
63
+ const canvas = document.createElement('canvas');
64
+ canvas.setAttribute('aria-hidden', 'true');
65
+ Object.assign(canvas.style, {
66
+ width: '100%',
67
+ height: '100%',
68
+ display: 'block',
69
+ touchAction: 'none',
70
+ });
71
+ element.appendChild(canvas);
72
+ const start = async () => {
73
+ if (started || stopped) return;
74
+ started = true;
75
+ try {
76
+ const module = await loadCharacterRuntime<RuntimeModule>(runtimeUrl);
77
+ if (stopped) return;
78
+ const instance = await module.createAvatar(canvas, latest.current, {
79
+ onError: () => fail.current(),
80
+ onCapabilities: (info) => report.current?.(info),
81
+ });
82
+ if (stopped) instance.dispose();
83
+ else {
84
+ controller.current = instance;
85
+ instance.update(latest.current);
86
+ }
87
+ } catch {
88
+ if (!stopped) fail.current();
89
+ }
90
+ };
91
+ const observer = new IntersectionObserver((entries) => {
92
+ if (entries.some((entry) => entry.isIntersecting)) void start();
93
+ });
94
+ observer.observe(element);
95
+ return () => {
96
+ stopped = true;
97
+ observer.disconnect();
98
+ controller.current?.dispose();
99
+ controller.current = null;
100
+ canvas.remove();
101
+ };
102
+ }, [runtimeUrl]);
103
+ useEffect(() => {
104
+ try {
105
+ controller.current?.update(value);
106
+ } catch {
107
+ onError();
108
+ }
109
+ }, [value, onError]);
110
+ return <StyledView ref={host} style={{ flex: 1 }} />;
111
+ }
112
+ function NativeCharacter({
113
+ runtimeUrl,
114
+ value,
115
+ onError,
116
+ }: {
117
+ runtimeUrl: string;
118
+ value: RenderProps;
119
+ onError(): void;
120
+ }) {
121
+ const { reportCapabilities } = useContext(CharacterRuntimeContext);
122
+ const WebView = characterWebView();
123
+ const ref = useRef<CharacterWebViewHandle>(null);
124
+ const initial = useRef(value);
125
+ const source = useMemo(
126
+ () => ({
127
+ html: characterHtml(runtimeUrl, initial.current),
128
+ baseUrl: runtimeUrl,
129
+ }),
130
+ [runtimeUrl],
131
+ );
132
+ useEffect(() => {
133
+ if (!WebView) onError();
134
+ }, [WebView, onError]);
135
+ const send = () =>
136
+ ref.current?.injectJavaScript(
137
+ `window.updateCharacter?.(${scriptJson(value)}); true;`,
138
+ );
139
+ useEffect(send, [value]);
140
+ if (!WebView) return null;
141
+ return (
142
+ <WebView
143
+ ref={ref}
144
+ source={source}
145
+ style={{ flex: 1, backgroundColor: 'transparent' }}
146
+ scrollEnabled={false}
147
+ javaScriptEnabled
148
+ originWhitelist={['*']}
149
+ onMessage={(event) => {
150
+ if (event.nativeEvent.data.startsWith('capabilities:')) {
151
+ try {
152
+ reportCapabilities?.(JSON.parse(event.nativeEvent.data.slice(13)));
153
+ } catch {
154
+ onError();
155
+ }
156
+ } else if (event.nativeEvent.data === 'error') onError();
157
+ else if (event.nativeEvent.data === 'loaded') send();
158
+ }}
159
+ />
160
+ );
161
+ }
162
+
163
+ /** Optional binary-backed renderer; the application supplies the hosted runtime URL. */
164
+ export function CharacterAvatar(props: AgentAvatarProps) {
165
+ const { runtimeUrl } = useContext(CharacterRuntimeContext);
166
+ const { messages } = useMessages(AGENT_AVATAR_MESSAGES, props.locale);
167
+ const initialReduced = useReducedMotion();
168
+ const [reduced, setReduced] = useState(initialReduced);
169
+ const [active, setActive] = useState(AppState.currentState !== 'background');
170
+ const [failed, setFailed] = useState(false);
171
+ const {
172
+ config,
173
+ paused,
174
+ portrait,
175
+ workingKey,
176
+ reactionKey,
177
+ entranceKey,
178
+ workingCycles,
179
+ interactive,
180
+ size = 64,
181
+ } = props;
182
+ useEffect(() => {
183
+ const motion = AccessibilityInfo.addEventListener(
184
+ 'reduceMotionChanged',
185
+ setReduced,
186
+ );
187
+ const state = AppState.addEventListener('change', (next) =>
188
+ setActive(next === 'active'),
189
+ );
190
+ const media =
191
+ Platform.OS === 'web'
192
+ ? window.matchMedia('(prefers-reduced-motion: reduce)')
193
+ : undefined;
194
+ const change = () => setReduced(media!.matches);
195
+ media?.addEventListener('change', change);
196
+ if (media) change();
197
+ return () => {
198
+ motion?.remove?.();
199
+ state?.remove?.();
200
+ media?.removeEventListener('change', change);
201
+ };
202
+ }, []);
203
+ useEffect(() => setFailed(false), [runtimeUrl, config.character]);
204
+ const legacy = useMemo(
205
+ () =>
206
+ !config.character || config.character.preset === 'bloom'
207
+ ? legacyRecipe(config)
208
+ : undefined,
209
+ [config],
210
+ );
211
+ const value = useMemo(
212
+ () => ({
213
+ config,
214
+ legacy,
215
+ paused: paused || !active,
216
+ portrait,
217
+ workingKey,
218
+ reactionKey,
219
+ entranceKey,
220
+ workingCycles,
221
+ interactive,
222
+ reduced,
223
+ }),
224
+ [
225
+ config,
226
+ legacy,
227
+ paused,
228
+ portrait,
229
+ active,
230
+ workingKey,
231
+ reactionKey,
232
+ entranceKey,
233
+ workingCycles,
234
+ interactive,
235
+ reduced,
236
+ ],
237
+ );
238
+ const fail = useMemo(() => () => setFailed(true), []);
239
+ const Renderer = Platform.OS === 'web' ? WebCharacter : NativeCharacter;
240
+ return (
241
+ <StyledView
242
+ className={props.className}
243
+ style={[{ width: size, height: size }, props.style]}
244
+ accessible
245
+ accessibilityRole="image"
246
+ accessibilityLabel={
247
+ props.accessibilityLabel ?? props.label ?? messages.label
248
+ }
249
+ testID={props.testID}
250
+ >
251
+ {runtimeUrl && !failed ? (
252
+ <Renderer runtimeUrl={runtimeUrl} value={value} onError={fail} />
253
+ ) : (
254
+ <Text numberOfLines={2} style={{ fontSize: 10 }}>
255
+ {messages.unavailable}
256
+ </Text>
257
+ )}
258
+ </StyledView>
259
+ );
260
+ }