@jini-ai/chat 0.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 (444) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +109 -0
  3. package/dist/core/agentic/chat-capabilities.d.ts +19 -0
  4. package/dist/core/agentic/chat-capabilities.d.ts.map +1 -0
  5. package/dist/core/agentic/chat-capabilities.js +106 -0
  6. package/dist/core/agentic/chat-capabilities.js.map +1 -0
  7. package/dist/core/agentic/index.d.ts +22 -0
  8. package/dist/core/agentic/index.d.ts.map +1 -0
  9. package/dist/core/agentic/index.js +21 -0
  10. package/dist/core/agentic/index.js.map +1 -0
  11. package/dist/core/events.d.ts +84 -0
  12. package/dist/core/events.d.ts.map +1 -0
  13. package/dist/core/events.js +14 -0
  14. package/dist/core/events.js.map +1 -0
  15. package/dist/core/index.d.ts +40 -0
  16. package/dist/core/index.d.ts.map +1 -0
  17. package/dist/core/index.js +40 -0
  18. package/dist/core/index.js.map +1 -0
  19. package/dist/core/messages.d.ts +53 -0
  20. package/dist/core/messages.d.ts.map +1 -0
  21. package/dist/core/messages.js +16 -0
  22. package/dist/core/messages.js.map +1 -0
  23. package/dist/core/partial-json.d.ts +36 -0
  24. package/dist/core/partial-json.d.ts.map +1 -0
  25. package/dist/core/partial-json.js +119 -0
  26. package/dist/core/partial-json.js.map +1 -0
  27. package/dist/core/persistence/index.d.ts +11 -0
  28. package/dist/core/persistence/index.d.ts.map +1 -0
  29. package/dist/core/persistence/index.js +11 -0
  30. package/dist/core/persistence/index.js.map +1 -0
  31. package/dist/core/persistence/ports.d.ts +124 -0
  32. package/dist/core/persistence/ports.d.ts.map +1 -0
  33. package/dist/core/persistence/ports.js +2 -0
  34. package/dist/core/persistence/ports.js.map +1 -0
  35. package/dist/core/persistence/title.d.ts +35 -0
  36. package/dist/core/persistence/title.d.ts.map +1 -0
  37. package/dist/core/persistence/title.js +137 -0
  38. package/dist/core/persistence/title.js.map +1 -0
  39. package/dist/core/question-form/format.d.ts +27 -0
  40. package/dist/core/question-form/format.d.ts.map +1 -0
  41. package/dist/core/question-form/format.js +45 -0
  42. package/dist/core/question-form/format.js.map +1 -0
  43. package/dist/core/question-form/normalize.d.ts +30 -0
  44. package/dist/core/question-form/normalize.d.ts.map +1 -0
  45. package/dist/core/question-form/normalize.js +192 -0
  46. package/dist/core/question-form/normalize.js.map +1 -0
  47. package/dist/core/question-form/scan.d.ts +50 -0
  48. package/dist/core/question-form/scan.d.ts.map +1 -0
  49. package/dist/core/question-form/scan.js +404 -0
  50. package/dist/core/question-form/scan.js.map +1 -0
  51. package/dist/core/question-form/types.d.ts +83 -0
  52. package/dist/core/question-form/types.d.ts.map +1 -0
  53. package/dist/core/question-form/types.js +11 -0
  54. package/dist/core/question-form/types.js.map +1 -0
  55. package/dist/core/question-form.d.ts +39 -0
  56. package/dist/core/question-form.d.ts.map +1 -0
  57. package/dist/core/question-form.js +4 -0
  58. package/dist/core/question-form.js.map +1 -0
  59. package/dist/core/todos.d.ts +70 -0
  60. package/dist/core/todos.d.ts.map +1 -0
  61. package/dist/core/todos.js +175 -0
  62. package/dist/core/todos.js.map +1 -0
  63. package/dist/core/tool-events.d.ts +18 -0
  64. package/dist/core/tool-events.d.ts.map +1 -0
  65. package/dist/core/tool-events.js +36 -0
  66. package/dist/core/tool-events.js.map +1 -0
  67. package/dist/core/tools.d.ts +51 -0
  68. package/dist/core/tools.d.ts.map +1 -0
  69. package/dist/core/tools.js +41 -0
  70. package/dist/core/tools.js.map +1 -0
  71. package/dist/core/transcript.d.ts +81 -0
  72. package/dist/core/transcript.d.ts.map +1 -0
  73. package/dist/core/transcript.js +133 -0
  74. package/dist/core/transcript.js.map +1 -0
  75. package/dist/core/transport.d.ts +109 -0
  76. package/dist/core/transport.d.ts.map +1 -0
  77. package/dist/core/transport.js +2 -0
  78. package/dist/core/transport.js.map +1 -0
  79. package/dist/core/util/index.d.ts +16 -0
  80. package/dist/core/util/index.d.ts.map +1 -0
  81. package/dist/core/util/index.js +16 -0
  82. package/dist/core/util/index.js.map +1 -0
  83. package/dist/core/util/manifest.d.ts +39 -0
  84. package/dist/core/util/manifest.d.ts.map +1 -0
  85. package/dist/core/util/manifest.js +173 -0
  86. package/dist/core/util/manifest.js.map +1 -0
  87. package/dist/core/util/markdown-context.d.ts +47 -0
  88. package/dist/core/util/markdown-context.d.ts.map +1 -0
  89. package/dist/core/util/markdown-context.js +125 -0
  90. package/dist/core/util/markdown-context.js.map +1 -0
  91. package/dist/core/util/markup-attributes.d.ts +20 -0
  92. package/dist/core/util/markup-attributes.d.ts.map +1 -0
  93. package/dist/core/util/markup-attributes.js +33 -0
  94. package/dist/core/util/markup-attributes.js.map +1 -0
  95. package/dist/core/util/parser.d.ts +42 -0
  96. package/dist/core/util/parser.d.ts.map +1 -0
  97. package/dist/core/util/parser.js +238 -0
  98. package/dist/core/util/parser.js.map +1 -0
  99. package/dist/core/util/pointer.d.ts +28 -0
  100. package/dist/core/util/pointer.d.ts.map +1 -0
  101. package/dist/core/util/pointer.js +75 -0
  102. package/dist/core/util/pointer.js.map +1 -0
  103. package/dist/core/util/recover.d.ts +40 -0
  104. package/dist/core/util/recover.d.ts.map +1 -0
  105. package/dist/core/util/recover.js +117 -0
  106. package/dist/core/util/recover.js.map +1 -0
  107. package/dist/core/util/strip.d.ts +112 -0
  108. package/dist/core/util/strip.d.ts.map +1 -0
  109. package/dist/core/util/strip.js +333 -0
  110. package/dist/core/util/strip.js.map +1 -0
  111. package/dist/core/util/types.d.ts +31 -0
  112. package/dist/core/util/types.d.ts.map +1 -0
  113. package/dist/core/util/types.js +2 -0
  114. package/dist/core/util/types.js.map +1 -0
  115. package/dist/core/util/validate.d.ts +50 -0
  116. package/dist/core/util/validate.d.ts.map +1 -0
  117. package/dist/core/util/validate.js +202 -0
  118. package/dist/core/util/validate.js.map +1 -0
  119. package/dist/react/agent-bridge/frontend-session-bridge.d.ts +45 -0
  120. package/dist/react/agent-bridge/frontend-session-bridge.d.ts.map +1 -0
  121. package/dist/react/agent-bridge/frontend-session-bridge.js +214 -0
  122. package/dist/react/agent-bridge/frontend-session-bridge.js.map +1 -0
  123. package/dist/react/artifact-types.d.ts +61 -0
  124. package/dist/react/artifact-types.d.ts.map +1 -0
  125. package/dist/react/artifact-types.js +33 -0
  126. package/dist/react/artifact-types.js.map +1 -0
  127. package/dist/react/chat-pane.d.ts +21 -0
  128. package/dist/react/chat-pane.d.ts.map +1 -0
  129. package/dist/react/chat-pane.js +20 -0
  130. package/dist/react/chat-pane.js.map +1 -0
  131. package/dist/react/components/A2uiSurfaceCard.d.ts +35 -0
  132. package/dist/react/components/A2uiSurfaceCard.d.ts.map +1 -0
  133. package/dist/react/components/A2uiSurfaceCard.js +272 -0
  134. package/dist/react/components/A2uiSurfaceCard.js.map +1 -0
  135. package/dist/react/components/AttachmentTray.d.ts +6 -0
  136. package/dist/react/components/AttachmentTray.d.ts.map +1 -0
  137. package/dist/react/components/AttachmentTray.js +30 -0
  138. package/dist/react/components/AttachmentTray.js.map +1 -0
  139. package/dist/react/components/ChatFab.d.ts +8 -0
  140. package/dist/react/components/ChatFab.d.ts.map +1 -0
  141. package/dist/react/components/ChatFab.js +24 -0
  142. package/dist/react/components/ChatFab.js.map +1 -0
  143. package/dist/react/components/Composer.d.ts +34 -0
  144. package/dist/react/components/Composer.d.ts.map +1 -0
  145. package/dist/react/components/Composer.js +300 -0
  146. package/dist/react/components/Composer.js.map +1 -0
  147. package/dist/react/components/ComposerDiscovery.d.ts +46 -0
  148. package/dist/react/components/ComposerDiscovery.d.ts.map +1 -0
  149. package/dist/react/components/ComposerDiscovery.js +38 -0
  150. package/dist/react/components/ComposerDiscovery.js.map +1 -0
  151. package/dist/react/components/ConversationList.d.ts +31 -0
  152. package/dist/react/components/ConversationList.d.ts.map +1 -0
  153. package/dist/react/components/ConversationList.js +221 -0
  154. package/dist/react/components/ConversationList.js.map +1 -0
  155. package/dist/react/components/ExtEventErrorBoundary.d.ts +35 -0
  156. package/dist/react/components/ExtEventErrorBoundary.d.ts.map +1 -0
  157. package/dist/react/components/ExtEventErrorBoundary.js +38 -0
  158. package/dist/react/components/ExtEventErrorBoundary.js.map +1 -0
  159. package/dist/react/components/Icon.d.ts +17 -0
  160. package/dist/react/components/Icon.d.ts.map +1 -0
  161. package/dist/react/components/Icon.js +46 -0
  162. package/dist/react/components/Icon.js.map +1 -0
  163. package/dist/react/components/JiniChatProvider.d.ts +45 -0
  164. package/dist/react/components/JiniChatProvider.d.ts.map +1 -0
  165. package/dist/react/components/JiniChatProvider.js +44 -0
  166. package/dist/react/components/JiniChatProvider.js.map +1 -0
  167. package/dist/react/components/Markdown.d.ts +5 -0
  168. package/dist/react/components/Markdown.d.ts.map +1 -0
  169. package/dist/react/components/Markdown.js +390 -0
  170. package/dist/react/components/Markdown.js.map +1 -0
  171. package/dist/react/components/McpUiSurfaceCard.d.ts +51 -0
  172. package/dist/react/components/McpUiSurfaceCard.d.ts.map +1 -0
  173. package/dist/react/components/McpUiSurfaceCard.js +159 -0
  174. package/dist/react/components/McpUiSurfaceCard.js.map +1 -0
  175. package/dist/react/components/MessageList.d.ts +15 -0
  176. package/dist/react/components/MessageList.d.ts.map +1 -0
  177. package/dist/react/components/MessageList.js +81 -0
  178. package/dist/react/components/MessageList.js.map +1 -0
  179. package/dist/react/components/MessageRow.d.ts +60 -0
  180. package/dist/react/components/MessageRow.d.ts.map +1 -0
  181. package/dist/react/components/MessageRow.js +156 -0
  182. package/dist/react/components/MessageRow.js.map +1 -0
  183. package/dist/react/components/NextStepActions.d.ts +34 -0
  184. package/dist/react/components/NextStepActions.d.ts.map +1 -0
  185. package/dist/react/components/NextStepActions.js +9 -0
  186. package/dist/react/components/NextStepActions.js.map +1 -0
  187. package/dist/react/components/QuestionForm.d.ts +26 -0
  188. package/dist/react/components/QuestionForm.d.ts.map +1 -0
  189. package/dist/react/components/QuestionForm.js +238 -0
  190. package/dist/react/components/QuestionForm.js.map +1 -0
  191. package/dist/react/components/QuestionsPanel.d.ts +13 -0
  192. package/dist/react/components/QuestionsPanel.d.ts.map +1 -0
  193. package/dist/react/components/QuestionsPanel.js +33 -0
  194. package/dist/react/components/QuestionsPanel.js.map +1 -0
  195. package/dist/react/components/TodoCard.d.ts +8 -0
  196. package/dist/react/components/TodoCard.d.ts.map +1 -0
  197. package/dist/react/components/TodoCard.js +29 -0
  198. package/dist/react/components/TodoCard.js.map +1 -0
  199. package/dist/react/components/ToolCard.d.ts +22 -0
  200. package/dist/react/components/ToolCard.d.ts.map +1 -0
  201. package/dist/react/components/ToolCard.js +298 -0
  202. package/dist/react/components/ToolCard.js.map +1 -0
  203. package/dist/react/components/composer-discovery.d.ts +107 -0
  204. package/dist/react/components/composer-discovery.d.ts.map +1 -0
  205. package/dist/react/components/composer-discovery.js +176 -0
  206. package/dist/react/components/composer-discovery.js.map +1 -0
  207. package/dist/react/ext-event-renderer-registry.d.ts +51 -0
  208. package/dist/react/ext-event-renderer-registry.d.ts.map +1 -0
  209. package/dist/react/ext-event-renderer-registry.js +20 -0
  210. package/dist/react/ext-event-renderer-registry.js.map +1 -0
  211. package/dist/react/features/chat-pane/agent-tools.d.ts +14 -0
  212. package/dist/react/features/chat-pane/agent-tools.d.ts.map +1 -0
  213. package/dist/react/features/chat-pane/agent-tools.js +22 -0
  214. package/dist/react/features/chat-pane/agent-tools.js.map +1 -0
  215. package/dist/react/features/chat-pane/components/AgentRuntimePicker.d.ts +12 -0
  216. package/dist/react/features/chat-pane/components/AgentRuntimePicker.d.ts.map +1 -0
  217. package/dist/react/features/chat-pane/components/AgentRuntimePicker.js +106 -0
  218. package/dist/react/features/chat-pane/components/AgentRuntimePicker.js.map +1 -0
  219. package/dist/react/features/chat-pane/components/ChatPane.d.ts +10 -0
  220. package/dist/react/features/chat-pane/components/ChatPane.d.ts.map +1 -0
  221. package/dist/react/features/chat-pane/components/ChatPane.js +169 -0
  222. package/dist/react/features/chat-pane/components/ChatPane.js.map +1 -0
  223. package/dist/react/features/chat-pane/create-daemon-attachment-uploader.d.ts +21 -0
  224. package/dist/react/features/chat-pane/create-daemon-attachment-uploader.d.ts.map +1 -0
  225. package/dist/react/features/chat-pane/create-daemon-attachment-uploader.js +213 -0
  226. package/dist/react/features/chat-pane/create-daemon-attachment-uploader.js.map +1 -0
  227. package/dist/react/features/chat-pane/create-mcp-ui-tool-caller.d.ts +70 -0
  228. package/dist/react/features/chat-pane/create-mcp-ui-tool-caller.d.ts.map +1 -0
  229. package/dist/react/features/chat-pane/create-mcp-ui-tool-caller.js +76 -0
  230. package/dist/react/features/chat-pane/create-mcp-ui-tool-caller.js.map +1 -0
  231. package/dist/react/features/chat-pane/hooks/useAgentRuntimePicker.hooks.d.ts +133 -0
  232. package/dist/react/features/chat-pane/hooks/useAgentRuntimePicker.hooks.d.ts.map +1 -0
  233. package/dist/react/features/chat-pane/hooks/useAgentRuntimePicker.hooks.js +258 -0
  234. package/dist/react/features/chat-pane/hooks/useAgentRuntimePicker.hooks.js.map +1 -0
  235. package/dist/react/features/chat-pane/hooks/useChatPane.hooks.d.ts +66 -0
  236. package/dist/react/features/chat-pane/hooks/useChatPane.hooks.d.ts.map +1 -0
  237. package/dist/react/features/chat-pane/hooks/useChatPane.hooks.js +224 -0
  238. package/dist/react/features/chat-pane/hooks/useChatPane.hooks.js.map +1 -0
  239. package/dist/react/features/chat-pane/hooks/useChatPaneAgentControl.hooks.d.ts +38 -0
  240. package/dist/react/features/chat-pane/hooks/useChatPaneAgentControl.hooks.d.ts.map +1 -0
  241. package/dist/react/features/chat-pane/hooks/useChatPaneAgentControl.hooks.js +252 -0
  242. package/dist/react/features/chat-pane/hooks/useChatPaneAgentControl.hooks.js.map +1 -0
  243. package/dist/react/features/chat-pane/hooks/useChatPaneControlsHeight.hooks.d.ts +16 -0
  244. package/dist/react/features/chat-pane/hooks/useChatPaneControlsHeight.hooks.d.ts.map +1 -0
  245. package/dist/react/features/chat-pane/hooks/useChatPaneControlsHeight.hooks.js +59 -0
  246. package/dist/react/features/chat-pane/hooks/useChatPaneControlsHeight.hooks.js.map +1 -0
  247. package/dist/react/features/chat-pane/hooks/useChatPaneFileDrop.hooks.d.ts +26 -0
  248. package/dist/react/features/chat-pane/hooks/useChatPaneFileDrop.hooks.d.ts.map +1 -0
  249. package/dist/react/features/chat-pane/hooks/useChatPaneFileDrop.hooks.js +74 -0
  250. package/dist/react/features/chat-pane/hooks/useChatPaneFileDrop.hooks.js.map +1 -0
  251. package/dist/react/features/chat-pane/hooks/useChatPaneRuntimeInventory.hooks.d.ts +25 -0
  252. package/dist/react/features/chat-pane/hooks/useChatPaneRuntimeInventory.hooks.d.ts.map +1 -0
  253. package/dist/react/features/chat-pane/hooks/useChatPaneRuntimeInventory.hooks.js +88 -0
  254. package/dist/react/features/chat-pane/hooks/useChatPaneRuntimeInventory.hooks.js.map +1 -0
  255. package/dist/react/features/chat-pane/hooks/useChatPaneWorkingDirectory.hooks.d.ts +38 -0
  256. package/dist/react/features/chat-pane/hooks/useChatPaneWorkingDirectory.hooks.d.ts.map +1 -0
  257. package/dist/react/features/chat-pane/hooks/useChatPaneWorkingDirectory.hooks.js +184 -0
  258. package/dist/react/features/chat-pane/hooks/useChatPaneWorkingDirectory.hooks.js.map +1 -0
  259. package/dist/react/features/chat-pane/index.d.ts +12 -0
  260. package/dist/react/features/chat-pane/index.d.ts.map +1 -0
  261. package/dist/react/features/chat-pane/index.js +11 -0
  262. package/dist/react/features/chat-pane/index.js.map +1 -0
  263. package/dist/react/features/chat-pane/react/components/AgentRuntimePicker.d.ts +12 -0
  264. package/dist/react/features/chat-pane/react/components/AgentRuntimePicker.d.ts.map +1 -0
  265. package/dist/react/features/chat-pane/react/components/AgentRuntimePicker.js +102 -0
  266. package/dist/react/features/chat-pane/react/components/AgentRuntimePicker.js.map +1 -0
  267. package/dist/react/features/chat-pane/react/components/ChatPane.d.ts +10 -0
  268. package/dist/react/features/chat-pane/react/components/ChatPane.d.ts.map +1 -0
  269. package/dist/react/features/chat-pane/react/components/ChatPane.js +137 -0
  270. package/dist/react/features/chat-pane/react/components/ChatPane.js.map +1 -0
  271. package/dist/react/features/chat-pane/react/hooks/useAgentRuntimePicker.hooks.d.ts +133 -0
  272. package/dist/react/features/chat-pane/react/hooks/useAgentRuntimePicker.hooks.d.ts.map +1 -0
  273. package/dist/react/features/chat-pane/react/hooks/useAgentRuntimePicker.hooks.js +258 -0
  274. package/dist/react/features/chat-pane/react/hooks/useAgentRuntimePicker.hooks.js.map +1 -0
  275. package/dist/react/features/chat-pane/react/hooks/useChatPane.hooks.d.ts +66 -0
  276. package/dist/react/features/chat-pane/react/hooks/useChatPane.hooks.d.ts.map +1 -0
  277. package/dist/react/features/chat-pane/react/hooks/useChatPane.hooks.js +223 -0
  278. package/dist/react/features/chat-pane/react/hooks/useChatPane.hooks.js.map +1 -0
  279. package/dist/react/features/chat-pane/react/hooks/useChatPaneAgentControl.hooks.d.ts +38 -0
  280. package/dist/react/features/chat-pane/react/hooks/useChatPaneAgentControl.hooks.d.ts.map +1 -0
  281. package/dist/react/features/chat-pane/react/hooks/useChatPaneAgentControl.hooks.js +252 -0
  282. package/dist/react/features/chat-pane/react/hooks/useChatPaneAgentControl.hooks.js.map +1 -0
  283. package/dist/react/features/chat-pane/react/hooks/useChatPaneFileDrop.hooks.d.ts +26 -0
  284. package/dist/react/features/chat-pane/react/hooks/useChatPaneFileDrop.hooks.d.ts.map +1 -0
  285. package/dist/react/features/chat-pane/react/hooks/useChatPaneFileDrop.hooks.js +60 -0
  286. package/dist/react/features/chat-pane/react/hooks/useChatPaneFileDrop.hooks.js.map +1 -0
  287. package/dist/react/features/chat-pane/react/hooks/useChatPaneRuntimeInventory.hooks.d.ts +25 -0
  288. package/dist/react/features/chat-pane/react/hooks/useChatPaneRuntimeInventory.hooks.d.ts.map +1 -0
  289. package/dist/react/features/chat-pane/react/hooks/useChatPaneRuntimeInventory.hooks.js +83 -0
  290. package/dist/react/features/chat-pane/react/hooks/useChatPaneRuntimeInventory.hooks.js.map +1 -0
  291. package/dist/react/features/chat-pane/react/hooks/useChatPaneWorkingDirectory.hooks.d.ts +38 -0
  292. package/dist/react/features/chat-pane/react/hooks/useChatPaneWorkingDirectory.hooks.d.ts.map +1 -0
  293. package/dist/react/features/chat-pane/react/hooks/useChatPaneWorkingDirectory.hooks.js +184 -0
  294. package/dist/react/features/chat-pane/react/hooks/useChatPaneWorkingDirectory.hooks.js.map +1 -0
  295. package/dist/react/features/chat-pane/react/styles.d.ts +2 -0
  296. package/dist/react/features/chat-pane/react/styles.d.ts.map +1 -0
  297. package/dist/react/features/chat-pane/react/styles.js +863 -0
  298. package/dist/react/features/chat-pane/react/styles.js.map +1 -0
  299. package/dist/react/features/chat-pane/rules.d.ts +31 -0
  300. package/dist/react/features/chat-pane/rules.d.ts.map +1 -0
  301. package/dist/react/features/chat-pane/rules.js +81 -0
  302. package/dist/react/features/chat-pane/rules.js.map +1 -0
  303. package/dist/react/features/chat-pane/styles.d.ts +2 -0
  304. package/dist/react/features/chat-pane/styles.d.ts.map +1 -0
  305. package/dist/react/features/chat-pane/styles.js +1327 -0
  306. package/dist/react/features/chat-pane/styles.js.map +1 -0
  307. package/dist/react/features/chat-pane/types.d.ts +248 -0
  308. package/dist/react/features/chat-pane/types.d.ts.map +1 -0
  309. package/dist/react/features/chat-pane/types.js +2 -0
  310. package/dist/react/features/chat-pane/types.js.map +1 -0
  311. package/dist/react/features/model-picker/components/CredentialStatusBadge.d.ts +7 -0
  312. package/dist/react/features/model-picker/components/CredentialStatusBadge.d.ts.map +1 -0
  313. package/dist/react/features/model-picker/components/CredentialStatusBadge.js +20 -0
  314. package/dist/react/features/model-picker/components/CredentialStatusBadge.js.map +1 -0
  315. package/dist/react/features/model-picker/components/ModelPicker.d.ts +9 -0
  316. package/dist/react/features/model-picker/components/ModelPicker.d.ts.map +1 -0
  317. package/dist/react/features/model-picker/components/ModelPicker.js +34 -0
  318. package/dist/react/features/model-picker/components/ModelPicker.js.map +1 -0
  319. package/dist/react/features/model-picker/constants.d.ts +6 -0
  320. package/dist/react/features/model-picker/constants.d.ts.map +1 -0
  321. package/dist/react/features/model-picker/constants.js +9 -0
  322. package/dist/react/features/model-picker/constants.js.map +1 -0
  323. package/dist/react/features/model-picker/dependencies.d.ts +11 -0
  324. package/dist/react/features/model-picker/dependencies.d.ts.map +1 -0
  325. package/dist/react/features/model-picker/dependencies.js +10 -0
  326. package/dist/react/features/model-picker/dependencies.js.map +1 -0
  327. package/dist/react/features/model-picker/hooks/useModelPicker.hooks.d.ts +27 -0
  328. package/dist/react/features/model-picker/hooks/useModelPicker.hooks.d.ts.map +1 -0
  329. package/dist/react/features/model-picker/hooks/useModelPicker.hooks.js +62 -0
  330. package/dist/react/features/model-picker/hooks/useModelPicker.hooks.js.map +1 -0
  331. package/dist/react/features/model-picker/index.d.ts +32 -0
  332. package/dist/react/features/model-picker/index.d.ts.map +1 -0
  333. package/dist/react/features/model-picker/index.js +29 -0
  334. package/dist/react/features/model-picker/index.js.map +1 -0
  335. package/dist/react/features/model-picker/ports.d.ts +11 -0
  336. package/dist/react/features/model-picker/ports.d.ts.map +1 -0
  337. package/dist/react/features/model-picker/ports.js +2 -0
  338. package/dist/react/features/model-picker/ports.js.map +1 -0
  339. package/dist/react/features/model-picker/react/components/CredentialStatusBadge.d.ts +7 -0
  340. package/dist/react/features/model-picker/react/components/CredentialStatusBadge.d.ts.map +1 -0
  341. package/dist/react/features/model-picker/react/components/CredentialStatusBadge.js +20 -0
  342. package/dist/react/features/model-picker/react/components/CredentialStatusBadge.js.map +1 -0
  343. package/dist/react/features/model-picker/react/components/ModelPicker.d.ts +9 -0
  344. package/dist/react/features/model-picker/react/components/ModelPicker.d.ts.map +1 -0
  345. package/dist/react/features/model-picker/react/components/ModelPicker.js +34 -0
  346. package/dist/react/features/model-picker/react/components/ModelPicker.js.map +1 -0
  347. package/dist/react/features/model-picker/react/hooks/useModelPicker.hooks.d.ts +27 -0
  348. package/dist/react/features/model-picker/react/hooks/useModelPicker.hooks.d.ts.map +1 -0
  349. package/dist/react/features/model-picker/react/hooks/useModelPicker.hooks.js +62 -0
  350. package/dist/react/features/model-picker/react/hooks/useModelPicker.hooks.js.map +1 -0
  351. package/dist/react/features/model-picker/rules.d.ts +26 -0
  352. package/dist/react/features/model-picker/rules.d.ts.map +1 -0
  353. package/dist/react/features/model-picker/rules.js +84 -0
  354. package/dist/react/features/model-picker/rules.js.map +1 -0
  355. package/dist/react/features/model-picker/types.d.ts +38 -0
  356. package/dist/react/features/model-picker/types.d.ts.map +1 -0
  357. package/dist/react/features/model-picker/types.js +2 -0
  358. package/dist/react/features/model-picker/types.js.map +1 -0
  359. package/dist/react/hooks/composer-draft-cache.d.ts +65 -0
  360. package/dist/react/hooks/composer-draft-cache.d.ts.map +1 -0
  361. package/dist/react/hooks/composer-draft-cache.js +89 -0
  362. package/dist/react/hooks/composer-draft-cache.js.map +1 -0
  363. package/dist/react/hooks/context.d.ts +18 -0
  364. package/dist/react/hooks/context.d.ts.map +1 -0
  365. package/dist/react/hooks/context.js +60 -0
  366. package/dist/react/hooks/context.js.map +1 -0
  367. package/dist/react/hooks/testing/fake-transport.d.ts +34 -0
  368. package/dist/react/hooks/testing/fake-transport.d.ts.map +1 -0
  369. package/dist/react/hooks/testing/fake-transport.js +46 -0
  370. package/dist/react/hooks/testing/fake-transport.js.map +1 -0
  371. package/dist/react/hooks/useArtifactStream.d.ts +18 -0
  372. package/dist/react/hooks/useArtifactStream.d.ts.map +1 -0
  373. package/dist/react/hooks/useArtifactStream.js +55 -0
  374. package/dist/react/hooks/useArtifactStream.js.map +1 -0
  375. package/dist/react/hooks/useChatFabDrag.d.ts +25 -0
  376. package/dist/react/hooks/useChatFabDrag.d.ts.map +1 -0
  377. package/dist/react/hooks/useChatFabDrag.js +88 -0
  378. package/dist/react/hooks/useChatFabDrag.js.map +1 -0
  379. package/dist/react/hooks/useComposer.d.ts +48 -0
  380. package/dist/react/hooks/useComposer.d.ts.map +1 -0
  381. package/dist/react/hooks/useComposer.js +121 -0
  382. package/dist/react/hooks/useComposer.js.map +1 -0
  383. package/dist/react/hooks/useConversation.d.ts +34 -0
  384. package/dist/react/hooks/useConversation.d.ts.map +1 -0
  385. package/dist/react/hooks/useConversation.js +163 -0
  386. package/dist/react/hooks/useConversation.js.map +1 -0
  387. package/dist/react/hooks/useCopyToClipboard.d.ts +14 -0
  388. package/dist/react/hooks/useCopyToClipboard.d.ts.map +1 -0
  389. package/dist/react/hooks/useCopyToClipboard.js +98 -0
  390. package/dist/react/hooks/useCopyToClipboard.js.map +1 -0
  391. package/dist/react/hooks/useExtEventGroups.d.ts +7 -0
  392. package/dist/react/hooks/useExtEventGroups.d.ts.map +1 -0
  393. package/dist/react/hooks/useExtEventGroups.js +32 -0
  394. package/dist/react/hooks/useExtEventGroups.js.map +1 -0
  395. package/dist/react/hooks/useLatestOperation.d.ts +31 -0
  396. package/dist/react/hooks/useLatestOperation.d.ts.map +1 -0
  397. package/dist/react/hooks/useLatestOperation.js +74 -0
  398. package/dist/react/hooks/useLatestOperation.js.map +1 -0
  399. package/dist/react/hooks/usePinnedTodos.d.ts +15 -0
  400. package/dist/react/hooks/usePinnedTodos.d.ts.map +1 -0
  401. package/dist/react/hooks/usePinnedTodos.js +43 -0
  402. package/dist/react/hooks/usePinnedTodos.js.map +1 -0
  403. package/dist/react/hooks/useQuestionForms.d.ts +28 -0
  404. package/dist/react/hooks/useQuestionForms.d.ts.map +1 -0
  405. package/dist/react/hooks/useQuestionForms.js +113 -0
  406. package/dist/react/hooks/useQuestionForms.js.map +1 -0
  407. package/dist/react/hooks/useRunStream.d.ts +27 -0
  408. package/dist/react/hooks/useRunStream.d.ts.map +1 -0
  409. package/dist/react/hooks/useRunStream.js +180 -0
  410. package/dist/react/hooks/useRunStream.js.map +1 -0
  411. package/dist/react/hooks/useToolTimeline.d.ts +33 -0
  412. package/dist/react/hooks/useToolTimeline.d.ts.map +1 -0
  413. package/dist/react/hooks/useToolTimeline.js +47 -0
  414. package/dist/react/hooks/useToolTimeline.js.map +1 -0
  415. package/dist/react/index.d.ts +158 -0
  416. package/dist/react/index.d.ts.map +1 -0
  417. package/dist/react/index.js +118 -0
  418. package/dist/react/index.js.map +1 -0
  419. package/dist/react/message-blocks.d.ts +86 -0
  420. package/dist/react/message-blocks.d.ts.map +1 -0
  421. package/dist/react/message-blocks.js +78 -0
  422. package/dist/react/message-blocks.js.map +1 -0
  423. package/dist/react/poc-mcp-ui-official/PocMcpUiCard.d.ts +9 -0
  424. package/dist/react/poc-mcp-ui-official/PocMcpUiCard.d.ts.map +1 -0
  425. package/dist/react/poc-mcp-ui-official/PocMcpUiCard.js +29 -0
  426. package/dist/react/poc-mcp-ui-official/PocMcpUiCard.js.map +1 -0
  427. package/dist/react/poc-mcp-ui-official/create-poc-resource.d.ts +30 -0
  428. package/dist/react/poc-mcp-ui-official/create-poc-resource.d.ts.map +1 -0
  429. package/dist/react/poc-mcp-ui-official/create-poc-resource.js +44 -0
  430. package/dist/react/poc-mcp-ui-official/create-poc-resource.js.map +1 -0
  431. package/dist/react/slots.d.ts +215 -0
  432. package/dist/react/slots.d.ts.map +1 -0
  433. package/dist/react/slots.js +2 -0
  434. package/dist/react/slots.js.map +1 -0
  435. package/dist/react/styles/reference.css +298 -0
  436. package/dist/react/tool-renderer-registry.d.ts +41 -0
  437. package/dist/react/tool-renderer-registry.d.ts.map +1 -0
  438. package/dist/react/tool-renderer-registry.js +22 -0
  439. package/dist/react/tool-renderer-registry.js.map +1 -0
  440. package/dist/react/util/defined-props.d.ts +31 -0
  441. package/dist/react/util/defined-props.d.ts.map +1 -0
  442. package/dist/react/util/defined-props.js +28 -0
  443. package/dist/react/util/defined-props.js.map +1 -0
  444. package/package.json +99 -0
@@ -0,0 +1,15 @@
1
+ import type { ChatMessage } from '../../core/index.js';
2
+ import { type MessageRowProps } from './MessageRow.js';
3
+ export interface MessageListProps extends Pick<MessageRowProps, 'projectFileNames' | 'onRequestOpenFile' | 'renderAttachment'> {
4
+ messages: ChatMessage[];
5
+ isStreaming?: boolean;
6
+ /** Mirrors `useConversation().scrollIntent` — when `true`, this component scrolls to the bottom on mount/update. */
7
+ scrollIntent?: boolean;
8
+ /** Called once the auto-scroll has run, mirroring `useConversation().acknowledgeScroll`. */
9
+ onScrolled?: () => void;
10
+ activeQuestionFormMessageId?: string | null;
11
+ questionFormSubmittedAnswersByMessageId?: Record<string, Record<string, string | string[]>>;
12
+ onQuestionFormSubmit?: (messageId: string, text: string, answers: Record<string, string | string[]>) => void;
13
+ }
14
+ export declare function MessageList({ messages, isStreaming, scrollIntent, onScrolled, activeQuestionFormMessageId, questionFormSubmittedAnswersByMessageId, onQuestionFormSubmit, projectFileNames, onRequestOpenFile, renderAttachment, }: MessageListProps): import("react").JSX.Element;
15
+ //# sourceMappingURL=MessageList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageList.d.ts","sourceRoot":"","sources":["../../../src/react/components/MessageList.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEnE,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,eAAe,EAAE,kBAAkB,GAAG,mBAAmB,GAAG,kBAAkB,CAAC;IAC5H,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,oHAAoH;IACpH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,4FAA4F;IAC5F,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,2BAA2B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,uCAAuC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;IAC5F,oBAAoB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC;CAC9G;AAUD,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,WAAmB,EACnB,YAAoB,EACpB,UAAU,EACV,2BAAkC,EAClC,uCAAuC,EACvC,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,GACjB,EAAE,gBAAgB,+BAgFlB"}
@@ -0,0 +1,81 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * @module MessageList
4
+ *
5
+ * Renders a conversation's messages via `<MessageRow>`, and — matching
6
+ * `useConversation`'s `scrollIntent` flag (see
7
+ * `ADS-memory/reports/jini-port/recon/r4b-webui-design.md` §4: "message array, optimistic
8
+ * user message, scroll-intent flag") — auto-scrolls to the newest content
9
+ * whenever `scrollIntent` is true, calling `onScrolled` once it has. Pure
10
+ * DOM scroll-anchoring via a ref lives here (a presentational component),
11
+ * not in the headless `useConversation` hook, per that hook's own
12
+ * "transport-agnostic hooks never touch DOM" contract.
13
+ */
14
+ import { useEffect, useRef } from 'react';
15
+ import { isTerminalRunStatus } from '../../core/index.js';
16
+ import { MessageRow } from './MessageRow.js';
17
+ /** Slack, in px, for treating "close enough to the bottom" as "at the bottom" — a fractional
18
+ * scrollHeight/clientHeight rounding difference should not by itself stop the sticky-follow below. */
19
+ const AT_BOTTOM_THRESHOLD_PX = 4;
20
+ function isScrolledToBottom(el) {
21
+ return el.scrollHeight - el.scrollTop - el.clientHeight <= AT_BOTTOM_THRESHOLD_PX;
22
+ }
23
+ export function MessageList({ messages, isStreaming = false, scrollIntent = false, onScrolled, activeQuestionFormMessageId = null, questionFormSubmittedAnswersByMessageId, onQuestionFormSubmit, projectFileNames, onRequestOpenFile, renderAttachment, }) {
24
+ const containerRef = useRef(null);
25
+ // Whether the transcript was scrolled to its bottom as of the last user scroll or programmatic
26
+ // scroll-to-bottom — read by the ResizeObserver effect below, which only ever sees the DOM AFTER a
27
+ // resize already happened and so cannot recompute "was this at the bottom" from current values.
28
+ // Starts true: a freshly mounted pane opens on the latest turn, same as scrollIntent's own default.
29
+ const stickToBottomRef = useRef(true);
30
+ useEffect(() => {
31
+ if (!scrollIntent)
32
+ return;
33
+ const el = containerRef.current;
34
+ // Gated on `stickToBottomRef`, same as the ResizeObserver effect below: `scrollIntent` turns
35
+ // true on EVERY streamed event (tool-call chatter included, not just a finished reply — see
36
+ // `useConversation.applyRunToAssistantMessage`), so scrolling unconditionally here yanked a user
37
+ // who had deliberately scrolled up to read history back to the bottom on the very next chunk
38
+ // (owner-reported, 2026-08-30). `stickToBottomRef` already reflects the user's own last scroll
39
+ // gesture via the `onScroll` handler below, captured BEFORE this content change, so it is safe
40
+ // to trust here.
41
+ if (el && stickToBottomRef.current) {
42
+ el.scrollTop = el.scrollHeight;
43
+ }
44
+ onScrolled?.();
45
+ // eslint-disable-next-line react-hooks/exhaustive-deps
46
+ }, [scrollIntent, messages]);
47
+ // Re-sticks to the bottom when a message ROW grows after mount with no accompanying `messages`
48
+ // change — the exact case an embedded MCP-UI/A2UI surface hits: it mounts at an initial guessed
49
+ // height (`preferredFrameSize` or `DEFAULT_INITIAL_HEIGHT`), then reports its real, often much
50
+ // taller content height asynchronously via `ui/notifications/size-changed`, entirely inside that
51
+ // surface's own React state (`McpUiHost`). The effect above never re-runs for that, so without this
52
+ // a surface which grows after the one-shot scroll leaves its own action buttons — or, once it
53
+ // resolves, the assistant's next reply — below the stale "bottom" with nothing to bring them back
54
+ // into view. Observes each direct child (one per message row) rather than the scroll container
55
+ // itself: the container's own box is held fixed by its flex/overflow layout, so only its CONTENT
56
+ // grows, which `ResizeObserver` only reports for the element whose box is actually changing.
57
+ // Re-created per `messages` change so a newly mounted row is observed too. Gated on
58
+ // `stickToBottomRef` so a human who scrolled up to read history is never yanked back down by an
59
+ // unrelated row resizing elsewhere in the transcript.
60
+ useEffect(() => {
61
+ const el = containerRef.current;
62
+ if (!el || typeof ResizeObserver !== 'function')
63
+ return;
64
+ const observer = new ResizeObserver(() => {
65
+ if (!stickToBottomRef.current)
66
+ return;
67
+ el.scrollTop = el.scrollHeight;
68
+ });
69
+ for (const child of Array.from(el.children))
70
+ observer.observe(child);
71
+ return () => observer.disconnect();
72
+ }, [messages]);
73
+ return (_jsx("div", { className: "jini-message-list", ref: containerRef, onScroll: (event) => {
74
+ stickToBottomRef.current = isScrolledToBottom(event.currentTarget);
75
+ }, "data-agent-element": "chat-transcript", "data-agent-role": "list", "data-agent-label": "The conversation transcript, oldest message first", children: messages.map((message) => {
76
+ const isLast = message.id === messages[messages.length - 1]?.id;
77
+ const runStreaming = isLast && isStreaming && !isTerminalRunStatus(message.runStatus);
78
+ return (_jsx(MessageRow, { message: message, runStreaming: runStreaming, runSucceeded: message.runStatus === 'succeeded', questionFormInteractive: message.id === activeQuestionFormMessageId, ...(questionFormSubmittedAnswersByMessageId?.[message.id] !== undefined ? { questionFormSubmittedAnswers: questionFormSubmittedAnswersByMessageId[message.id] } : {}), ...(onQuestionFormSubmit !== undefined ? { onQuestionFormSubmit: (text, answers) => onQuestionFormSubmit(message.id, text, answers) } : {}), ...(projectFileNames !== undefined ? { projectFileNames } : {}), ...(onRequestOpenFile !== undefined ? { onRequestOpenFile } : {}), ...(renderAttachment !== undefined ? { renderAttachment } : {}) }, message.id));
79
+ }) }));
80
+ }
81
+ //# sourceMappingURL=MessageList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageList.js","sourceRoot":"","sources":["../../../src/react/components/MessageList.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * @module MessageRow
3
+ *
4
+ * Renders one `ChatMessage` — a dumb, props-in/JSX-out composition of this
5
+ * package's own leaves (`<Markdown>`, `<ToolCard>` via `useToolTimeline`,
6
+ * `<QuestionForm>` via `splitOnQuestionForms`). Unlike `ToolCard`/
7
+ * `QuestionForm`/`TodoCard`/`NextStepActions`, this component is NOT a
8
+ * direct port of an OD file: the two source branches this package was built
9
+ * from (`refactor/web-chat-pane-slice`, `refactor/web-chat-composer-slice-pr`)
10
+ * decompose `ChatPane.tsx`/`ChatComposer.tsx`, not `AssistantMessage.tsx`
11
+ * (3,317 lines) — that god-component's own vertical-slice extraction is a
12
+ * separate, not-yet-dispatched task (see
13
+ * `ADS-memory/reports/jini-port/recon/r4b-webui-design.md` §3's suggested "AssistantMessage
14
+ * first" ordering, which this task's sources don't cover). This is
15
+ * therefore a fresh, reasonable v1 composition of the already-ported leaves,
16
+ * not a byte-for-byte port — text and question-forms interleave in original
17
+ * order (via `splitOnQuestionForms`).
18
+ *
19
+ * Tool cards now interleave too (`../message-blocks.js`), which they did not in
20
+ * v1. That original deferral fused the text on either side of a tool call into
21
+ * one run — a message read as `"I'll look for a tool that changes the
22
+ * language.Done — the language is now English."`, two thoughts from before and
23
+ * after the call joined mid-sentence, with every card pooled at the bottom.
24
+ * `AssistantMessage.tsx`'s richer derivations (`deriveFileOps`/
25
+ * `stripTodoToolGroups`/etc.) remain a TODO for that god-component's own
26
+ * extraction task; plain ordering did not need to wait for them.
27
+ *
28
+ * `interleaveMessageBlocks` returns `null` when it cannot prove the
29
+ * reconstruction is lossless, and this component then renders exactly the flat
30
+ * layout it always did. Both paths are live, so the fallback is not dead code —
31
+ * see that module's header for the conditions.
32
+ *
33
+ * Both message roles also carry a per-message copy affordance
34
+ * (`CopyMessageButton` below), rendered inside a `.jini-message-actions` row.
35
+ * Assistant rows render that row as an extension seam: `branch`/thumbs-up/
36
+ * thumbs-down are meant to join `copy` there later, as siblings in the same
37
+ * row, once their backends (conversation branching, feedback storage) exist
38
+ * — see the seam comment at that row's call site. Copy always copies the raw
39
+ * markdown *source* — `message.content` (user) or `visibleContent`
40
+ * (assistant, post `stripArtifact`) — never a flattened read of the rendered
41
+ * DOM, so a table, fence, or `**bold**` marker survives the round trip.
42
+ */
43
+ import React, { type ReactNode } from 'react';
44
+ import type { ChatAttachment, ChatMessage } from '../../core/index.js';
45
+ export interface MessageRowProps {
46
+ message: ChatMessage;
47
+ /** Whether this message's own run is still streaming. */
48
+ runStreaming?: boolean;
49
+ runSucceeded?: boolean;
50
+ /** Whether this message's question-form (if any) is still the active/answerable one. */
51
+ questionFormInteractive?: boolean;
52
+ questionFormSubmittedAnswers?: Record<string, string | string[]>;
53
+ onQuestionFormSubmit?: (text: string, answers: Record<string, string | string[]>) => void;
54
+ projectFileNames?: Set<string>;
55
+ onRequestOpenFile?: (name: string) => void;
56
+ /** Host-supplied renderer for a `ChatAttachment` chip. Falls back to a plain filename chip. */
57
+ renderAttachment?: (attachment: ChatAttachment) => ReactNode;
58
+ }
59
+ export declare function MessageRow({ message, runStreaming, runSucceeded, questionFormInteractive, questionFormSubmittedAnswers, onQuestionFormSubmit, projectFileNames, onRequestOpenFile, renderAttachment, }: MessageRowProps): React.JSX.Element;
60
+ //# sourceMappingURL=MessageRow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageRow.d.ts","sourceRoot":"","sources":["../../../src/react/components/MessageRow.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,OAAO,KAAK,EAAE,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,KAAK,EAAc,cAAc,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAcnF,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,WAAW,CAAC;IACrB,yDAAyD;IACzD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,wFAAwF;IACxF,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,4BAA4B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IACjE,oBAAoB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC;IAC1F,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,+FAA+F;IAC/F,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,cAAc,KAAK,SAAS,CAAC;CAC9D;AAoFD,wBAAgB,UAAU,CAAC,EACzB,OAAO,EACP,YAAoB,EACpB,YAAoB,EACpB,uBAA+B,EAC/B,4BAA4B,EAC5B,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,GACjB,EAAE,eAAe,qBAmKjB"}
@@ -0,0 +1,156 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ /**
3
+ * @module MessageRow
4
+ *
5
+ * Renders one `ChatMessage` — a dumb, props-in/JSX-out composition of this
6
+ * package's own leaves (`<Markdown>`, `<ToolCard>` via `useToolTimeline`,
7
+ * `<QuestionForm>` via `splitOnQuestionForms`). Unlike `ToolCard`/
8
+ * `QuestionForm`/`TodoCard`/`NextStepActions`, this component is NOT a
9
+ * direct port of an OD file: the two source branches this package was built
10
+ * from (`refactor/web-chat-pane-slice`, `refactor/web-chat-composer-slice-pr`)
11
+ * decompose `ChatPane.tsx`/`ChatComposer.tsx`, not `AssistantMessage.tsx`
12
+ * (3,317 lines) — that god-component's own vertical-slice extraction is a
13
+ * separate, not-yet-dispatched task (see
14
+ * `ADS-memory/reports/jini-port/recon/r4b-webui-design.md` §3's suggested "AssistantMessage
15
+ * first" ordering, which this task's sources don't cover). This is
16
+ * therefore a fresh, reasonable v1 composition of the already-ported leaves,
17
+ * not a byte-for-byte port — text and question-forms interleave in original
18
+ * order (via `splitOnQuestionForms`).
19
+ *
20
+ * Tool cards now interleave too (`../message-blocks.js`), which they did not in
21
+ * v1. That original deferral fused the text on either side of a tool call into
22
+ * one run — a message read as `"I'll look for a tool that changes the
23
+ * language.Done — the language is now English."`, two thoughts from before and
24
+ * after the call joined mid-sentence, with every card pooled at the bottom.
25
+ * `AssistantMessage.tsx`'s richer derivations (`deriveFileOps`/
26
+ * `stripTodoToolGroups`/etc.) remain a TODO for that god-component's own
27
+ * extraction task; plain ordering did not need to wait for them.
28
+ *
29
+ * `interleaveMessageBlocks` returns `null` when it cannot prove the
30
+ * reconstruction is lossless, and this component then renders exactly the flat
31
+ * layout it always did. Both paths are live, so the fallback is not dead code —
32
+ * see that module's header for the conditions.
33
+ *
34
+ * Both message roles also carry a per-message copy affordance
35
+ * (`CopyMessageButton` below), rendered inside a `.jini-message-actions` row.
36
+ * Assistant rows render that row as an extension seam: `branch`/thumbs-up/
37
+ * thumbs-down are meant to join `copy` there later, as siblings in the same
38
+ * row, once their backends (conversation branching, feedback storage) exist
39
+ * — see the seam comment at that row's call site. Copy always copies the raw
40
+ * markdown *source* — `message.content` (user) or `visibleContent`
41
+ * (assistant, post `stripArtifact`) — never a flattened read of the rendered
42
+ * DOM, so a table, fence, or `**bold**` marker survives the round trip.
43
+ */
44
+ import React, {} from 'react';
45
+ import { splitOnQuestionForms, stripArtifact } from '../../core/index.js';
46
+ import { useToolTimeline } from '../hooks/useToolTimeline.js';
47
+ import { useExtEventGroups } from '../hooks/useExtEventGroups.js';
48
+ import { useCopyToClipboard } from '../hooks/useCopyToClipboard.js';
49
+ import { interleaveMessageBlocks } from '../message-blocks.js';
50
+ import { useT } from '../hooks/context.js';
51
+ import { getExtEventRenderer } from '../ext-event-renderer-registry.js';
52
+ import { ExtEventErrorBoundary } from './ExtEventErrorBoundary.js';
53
+ import { Icon } from './Icon.js';
54
+ import { Markdown } from './Markdown.js';
55
+ import { ToolCard } from './ToolCard.js';
56
+ import { QuestionForm } from './QuestionForm.js';
57
+ function formatDuration(ms) {
58
+ const totalSeconds = Math.round(ms / 1000);
59
+ const minutes = Math.floor(totalSeconds / 60);
60
+ const seconds = totalSeconds % 60;
61
+ return minutes > 0 ? `${minutes}m ${seconds}s` : `${seconds}s`;
62
+ }
63
+ /**
64
+ * True while an assistant message is still fully pending — no visible text
65
+ * and no tool rows have arrived yet. Shared by the "Thinking…" placeholder
66
+ * and the action row's own visibility below, since the two are mutually
67
+ * exclusive by construction: a message with nothing to show yet has nothing
68
+ * worth a copy/branch/feedback row either. Pulled out of `MessageRow` itself
69
+ * (rather than inlined at each call site, as it was before this row existed)
70
+ * so the condition is asserted once instead of duplicated.
71
+ * @param message - The message being rendered.
72
+ * @param visibleContent - `message.content` with any `<artifact>` block stripped.
73
+ * @param toolRowCount - `useToolTimeline(...).rows.length` for this message.
74
+ * @complexity O(1) — three comparisons, no loops or recursion.
75
+ */
76
+ function isPendingWithNoContent(message, visibleContent, toolRowCount) {
77
+ return message.runStatus === 'running' && !visibleContent.trim() && toolRowCount === 0;
78
+ }
79
+ /** One "Done · 6m 29s · 2612 out · $0.4028" summary line, from the run's own `kind:'usage'` event — never estimated client-side. Renders only the fields the event actually carries, so a transport that supplies partial usage data degrades gracefully instead of showing fabricated zeros. */
80
+ function UsageSummary({ usage }) {
81
+ const t = useT();
82
+ const parts = [];
83
+ if (usage.durationMs !== undefined)
84
+ parts.push(formatDuration(usage.durationMs));
85
+ if (usage.outputTokens !== undefined)
86
+ parts.push(t('{n} out', { n: usage.outputTokens }));
87
+ if (usage.costUsd !== undefined)
88
+ parts.push(`$${usage.costUsd.toFixed(4)}`);
89
+ if (parts.length === 0)
90
+ return null;
91
+ return (_jsxs("div", { className: "jini-message-usage", children: [_jsx("span", { className: "jini-message-usage-dot", "aria-hidden": true, children: "\u25CF" }), t('Done'), " \u00B7 ", parts.join(' · ')] }));
92
+ }
93
+ /**
94
+ * Quiet, icon-only copy affordance shared by the user- and assistant-message
95
+ * action rows below. Delegates the actual clipboard write (and its
96
+ * secure-context fallback) to `useCopyToClipboard`; this component only owns
97
+ * the icon swap and the accessible announcement of the transient state.
98
+ * @param props.text - Exact string to copy, verbatim.
99
+ * @param props.label - Idle accessible name (already translated by the caller).
100
+ * @complexity O(1) — one child hook call, no branching beyond the copied-state read.
101
+ */
102
+ function CopyMessageButton({ text, label }) {
103
+ const t = useT();
104
+ const { copied, copy } = useCopyToClipboard();
105
+ return (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", className: "jini-message-action-btn", "aria-label": copied ? t('Copied') : label, onClick: () => {
106
+ void copy(text);
107
+ }, children: _jsx(Icon, { name: copied ? 'check' : 'copy' }) }), _jsx("span", { className: "jini-message-copy-status", "aria-live": "polite", children: copied ? t('Copied to clipboard') : '' })] }));
108
+ }
109
+ export function MessageRow({ message, runStreaming = false, runSucceeded = false, questionFormInteractive = false, questionFormSubmittedAnswers, onQuestionFormSubmit, projectFileNames, onRequestOpenFile, renderAttachment, }) {
110
+ const t = useT();
111
+ const timeline = useToolTimeline(message.events, { runStreaming, runSucceeded });
112
+ const extGroups = useExtEventGroups(message.events);
113
+ if (message.role === 'user') {
114
+ return (_jsxs("div", { className: "jini-message jini-message-user", "data-message-id": message.id, "data-agent-element": `chat-message-${message.id}`, "data-agent-role": "region", "data-agent-label": "A message from the user", children: [message.attachments && message.attachments.length > 0 ? (_jsx("div", { className: "jini-message-attachments", children: message.attachments.map((a) => (_jsx("span", { className: "jini-message-attachment-chip", children: renderAttachment ? renderAttachment(a) : a.name }, a.path))) })) : null, _jsx("div", { className: "jini-message-content", children: message.content }), _jsx("div", { className: "jini-message-actions jini-message-actions--user", children: _jsx(CopyMessageButton, { text: message.content, label: t('Copy message') }) })] }));
115
+ }
116
+ const visibleContent = stripArtifact(message.content);
117
+ const segments = splitOnQuestionForms(visibleContent);
118
+ const usageEvent = message.events?.filter((ev) => ev.kind === 'usage').pop();
119
+ // Interleaving is skipped outright when an artifact was stripped. `stripArtifact` operates on the
120
+ // whole string and trims, so the surviving text no longer lines up with the per-run offsets the
121
+ // event walk produces, and an artifact block could legitimately span a tool call. Rather than
122
+ // reason about partial overlaps, an artifact-bearing message keeps the flat layout — those
123
+ // messages are dominated by the artifact panel anyway, so the ordering matters least there.
124
+ const blocks = visibleContent === message.content ? interleaveMessageBlocks(message.events, message.content, timeline.rows) : null;
125
+ const pending = isPendingWithNoContent(message, visibleContent, timeline.rows.length);
126
+ const renderToolCard = (row) => (_jsx(ToolCard, { use: row.use, result: row.result, runStreaming: runStreaming, runSucceeded: runSucceeded, ...(projectFileNames !== undefined ? { projectFileNames } : {}), ...(onRequestOpenFile !== undefined ? { onRequestOpenFile } : {}) }, row.id));
127
+ const renderExtGroup = (group) => {
128
+ const renderer = getExtEventRenderer(group.name);
129
+ if (!renderer)
130
+ return null;
131
+ const node = renderer({ name: group.name, events: group.events, runStreaming, runSucceeded, runId: message.runId });
132
+ if (!node)
133
+ return null;
134
+ return (
135
+ // `key` includes the event count so a group that failed on an earlier, shorter event list
136
+ // gets a fresh boundary instance (not the still-tripped one) once a new event actually
137
+ // arrives for it, instead of staying tombstoned for the message's whole lifetime.
138
+ _jsx(ExtEventErrorBoundary, { name: group.name, children: _jsx("div", { children: node }) }, `${group.name}:${group.events.length}`));
139
+ };
140
+ const renderTextSegments = (text, keyPrefix) => splitOnQuestionForms(text).map((segment, i) => segment.kind === 'text' ? (segment.text.trim() ? (_jsx("div", { className: "jini-message-content", children: _jsx(Markdown, { children: segment.text }) }, `${keyPrefix}-${i}`)) : null) : (_jsx(QuestionForm, { form: segment.form, interactive: questionFormInteractive, ...(questionFormSubmittedAnswers !== undefined ? { submittedAnswers: questionFormSubmittedAnswers } : {}), ...(onQuestionFormSubmit !== undefined ? { onSubmit: onQuestionFormSubmit } : {}) }, `${keyPrefix}-${i}`)));
141
+ return (_jsxs("div", { className: "jini-message jini-message-assistant", "data-message-id": message.id, "data-run-status": message.runStatus, "data-agent-element": `chat-message-${message.id}`, "data-agent-role": "region", "data-agent-label": "A reply from the assistant", children: [message.agentName ? _jsx("div", { className: "jini-message-agent", children: message.agentName }) : null, blocks
142
+ ? blocks.map((block) => {
143
+ if (block.kind === 'text') {
144
+ return _jsx(React.Fragment, { children: renderTextSegments(block.text, block.key) }, block.key);
145
+ }
146
+ if (block.kind === 'tools') {
147
+ return (_jsx("div", { className: "jini-message-tools", children: block.rows.map(renderToolCard) }, block.key));
148
+ }
149
+ const group = extGroups.find((g) => g.name === block.name);
150
+ if (!group)
151
+ return null;
152
+ return (_jsx("div", { className: "jini-message-ext-events", children: renderExtGroup(group) }, block.key));
153
+ })
154
+ : (_jsxs(_Fragment, { children: [segments.map((segment, i) => segment.kind === 'text' ? (segment.text.trim() ? (_jsx("div", { className: "jini-message-content", children: _jsx(Markdown, { children: segment.text }) }, i)) : null) : (_jsx(QuestionForm, { form: segment.form, interactive: questionFormInteractive, ...(questionFormSubmittedAnswers !== undefined ? { submittedAnswers: questionFormSubmittedAnswers } : {}), ...(onQuestionFormSubmit !== undefined ? { onSubmit: onQuestionFormSubmit } : {}) }, i))), timeline.rows.length > 0 ? (_jsx("div", { className: "jini-message-tools", children: timeline.rows.map(renderToolCard) })) : null, extGroups.length > 0 ? _jsx("div", { className: "jini-message-ext-events", children: extGroups.map(renderExtGroup) }) : null] })), usageEvent ? _jsx(UsageSummary, { usage: usageEvent }) : null, message.runStatus === 'failed' ? _jsx("div", { className: "jini-message-error", children: t('This turn failed.') }) : null, !pending ? (_jsx("div", { className: "jini-message-actions jini-message-actions--assistant", children: _jsx(CopyMessageButton, { text: visibleContent, label: t('Copy message') }) })) : null, pending ? (_jsx("div", { className: "jini-message-pending", "aria-live": "polite", children: t('Thinking…') })) : null] }));
155
+ }
156
+ //# sourceMappingURL=MessageRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageRow.js","sourceRoot":"","sources":["../../../src/react/components/MessageRow.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * @module NextStepActions
3
+ *
4
+ * A generic row of "what next" suggestion buttons rendered after a
5
+ * completed assistant turn. Heavily pruned from OD's
6
+ * `components/NextStepActions.tsx` (1,069 lines) per
7
+ * `ADS-memory/reports/jini-port/recon/r4b-webui-design.md` §1's explicit directive for
8
+ * this file ("prune OD actions"): the OD original hardcodes ~20 product-
9
+ * specific prompt catalogs (design-system refine/audit, brand-extraction
10
+ * continue/AI-optimize, plan-generate-from-doc, project-continue, ...), a
11
+ * design-toolbox action registry, and PostHog click tracking. None of that
12
+ * is generic — every OD prompt catalog is a host concern now: a host
13
+ * supplies its own `NextStepAction[]` (e.g. OD's adapter in
14
+ * `foundry/integrations/open-design/` re-hosts its exact prompt catalogs against
15
+ * this same component). className/structure kept close to the original's
16
+ * action-row shape; every user-facing string wrapped in `useT()`.
17
+ */
18
+ import type { ReactNode } from 'react';
19
+ export interface NextStepAction {
20
+ id: string;
21
+ label: string;
22
+ description?: string;
23
+ icon?: ReactNode;
24
+ /** Disables the action and swaps its label for `busyLabel` while a host-tracked operation for this action is in flight. */
25
+ busy?: boolean;
26
+ busyLabel?: string;
27
+ disabled?: boolean;
28
+ }
29
+ export interface NextStepActionsProps {
30
+ actions: NextStepAction[];
31
+ onSelect: (actionId: string) => void;
32
+ }
33
+ export declare function NextStepActions({ actions, onSelect }: NextStepActionsProps): import("react").JSX.Element | null;
34
+ //# sourceMappingURL=NextStepActions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NextStepActions.d.ts","sourceRoot":"","sources":["../../../src/react/components/NextStepActions.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,2HAA2H;IAC3H,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAED,wBAAgB,eAAe,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,oBAAoB,sCAoB1E"}
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useT } from '../hooks/context.js';
3
+ export function NextStepActions({ actions, onSelect }) {
4
+ const t = useT();
5
+ if (actions.length === 0)
6
+ return null;
7
+ return (_jsx("div", { className: "next-step-actions", children: actions.map((action) => (_jsxs("button", { type: "button", className: "next-step-action", disabled: action.disabled || action.busy, onClick: () => onSelect(action.id), children: [action.icon ? (_jsx("span", { className: "next-step-action-icon", "aria-hidden": true, children: action.icon })) : null, _jsxs("span", { className: "next-step-action-body", children: [_jsx("span", { className: "next-step-action-title", children: action.busy && action.busyLabel ? t(action.busyLabel) : t(action.label) }), action.description ? _jsx("span", { className: "next-step-action-desc", children: t(action.description) }) : null] })] }, action.id))) }));
8
+ }
9
+ //# sourceMappingURL=NextStepActions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NextStepActions.js","sourceRoot":"","sources":["../../../src/react/components/NextStepActions.tsx"],"names":[],"mappings":";AAkBA,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAkB3C,MAAM,UAAU,eAAe,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAwB;IACzE,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;IACjB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,OAAO,CACL,cAAK,SAAS,EAAC,mBAAmB,YAC/B,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CACvB,kBAAwB,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,kBAAkB,EAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,aAC5I,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CACb,eAAM,SAAS,EAAC,uBAAuB,iCACpC,MAAM,CAAC,IAAI,GACP,CACR,CAAC,CAAC,CAAC,IAAI,EACR,gBAAM,SAAS,EAAC,uBAAuB,aACrC,eAAM,SAAS,EAAC,wBAAwB,YAAE,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAQ,EACxH,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,eAAM,SAAS,EAAC,uBAAuB,YAAE,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,GAAQ,CAAC,CAAC,CAAC,IAAI,IAC9F,KATI,MAAM,CAAC,EAAE,CAUb,CACV,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { QuestionForm as QuestionFormType } from '../../core/index.js';
2
+ export interface QuestionFormFileSubmission {
3
+ questionId: string;
4
+ questionLabel: string;
5
+ files: File[];
6
+ }
7
+ export interface QuestionFormHandle {
8
+ submit: () => void;
9
+ /** Submit with no answers — every question is optional, so this records each as "(skipped)" and moves on. */
10
+ skipAll: () => void;
11
+ }
12
+ export interface QuestionFormProps {
13
+ form: QuestionFormType;
14
+ /** Whether the user can still submit answers — the host disables this once the turn is no longer the most recent one. */
15
+ interactive: boolean;
16
+ submittedAnswers?: Record<string, string | string[]>;
17
+ /** When a host's own Continue button owns the submit, hide this form's footer button and report ready-state via `onReadyChange`. */
18
+ hideInternalSubmit?: boolean;
19
+ draftAnswers?: Record<string, string | string[]>;
20
+ onReadyChange?: (ready: boolean) => void;
21
+ onDraftChange?: (answers: Record<string, string | string[]>) => void;
22
+ onAnswerChange?: (questionId: string, value: string | string[]) => void;
23
+ onSubmit?: (text: string, answers: Record<string, string | string[]>, files?: QuestionFormFileSubmission[]) => void;
24
+ }
25
+ export declare const QuestionForm: import("react").ForwardRefExoticComponent<QuestionFormProps & import("react").RefAttributes<QuestionFormHandle>>;
26
+ //# sourceMappingURL=QuestionForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QuestionForm.d.ts","sourceRoot":"","sources":["../../../src/react/components/QuestionForm.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAA6B,YAAY,IAAI,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAIvG,MAAM,WAAW,0BAA0B;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,IAAI,EAAE,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,6GAA6G;IAC7G,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,gBAAgB,CAAC;IACvB,yHAAyH;IACzH,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IACrD,oIAAoI;IACpI,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IACjD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC;IACrE,cAAc,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,IAAI,CAAC;IACxE,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,0BAA0B,EAAE,KAAK,IAAI,CAAC;CACrH;AAED,eAAO,MAAM,YAAY,kHA4PvB,CAAC"}