@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,300 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * @module Composer
4
+ *
5
+ * The dumb, presentational half of the composer: takes a `useComposer()`
6
+ * controller (headless state) plus a few UI-only props and renders the
7
+ * textarea/attachment-tray/send-button chrome. Slot extraction points
8
+ * (`ComposerPlusItem[]`, `leadingAccessories`, `footerAccessories`, the mention popover) are
9
+ * generalized from OD's `ChatComposer.tsx` decomposition
10
+ * (`ComposerPlusMenu`/`LibraryPicker`/`SessionModeToggle`-equivalent) per
11
+ * `ADS-memory/reports/jini-port/recon/r4b-webui-design.md` §2/§3 — this component renders
12
+ * the slots a host supplies; it does not itself know what a "library
13
+ * picker" or "session mode" is.
14
+ */
15
+ import { useEffect, useLayoutEffect, useRef, useState, } from 'react';
16
+ import { RemixIcon } from '@jini-ai/ui';
17
+ import { useT } from '../hooks/context.js';
18
+ import { AttachmentTray } from './AttachmentTray.js';
19
+ import { ComposerDiscoveryMenu, ComposerSlashMenu } from './ComposerDiscovery.js';
20
+ import { appendComposerDiscovery, composerDiscoveryMenuPosition, composerSlashMenuPosition, filterComposerDiscovery, parseComposerSlashQuery, replaceComposerSlashTrigger, resolveComposerSlashInvocation, resolveComposerSlashKeyAction, } from './composer-discovery.js';
21
+ function reportComposerHostEffectFailure(effectName, error) {
22
+ console.error(`[@jini-ai/chat] Composer ${effectName} host effect failed:`, error);
23
+ }
24
+ /**
25
+ * Invokes host code synchronously, then observes either its synchronous result or async failure.
26
+ *
27
+ * @param onResolved - Optional, called with the host's resolved (non-thrown/non-rejected) return
28
+ * value — never called after a synchronous throw or an async rejection. Added for
29
+ * `onDiscoverySelect`, whose {@link ComposerDiscoveryOutcome} return value the caller applies to
30
+ * the draft; the two other host effects this function backs (`plusMenuItems.onSelect`,
31
+ * `attachmentPicker.onFiles`) simply omit it, which reproduces their exact prior behavior.
32
+ */
33
+ function runComposerHostEffect(effectName, effect, onSettled, onResolved) {
34
+ let result;
35
+ try {
36
+ result = effect();
37
+ }
38
+ catch (error) {
39
+ reportComposerHostEffectFailure(effectName, error);
40
+ onSettled?.();
41
+ return;
42
+ }
43
+ const asynchronous = result !== undefined;
44
+ if (!asynchronous) {
45
+ onResolved?.(result);
46
+ onSettled?.();
47
+ }
48
+ void Promise.resolve(result)
49
+ .then((resolved) => {
50
+ if (asynchronous)
51
+ onResolved?.(resolved);
52
+ })
53
+ .catch((error) => {
54
+ reportComposerHostEffectFailure(effectName, error);
55
+ })
56
+ .finally(() => {
57
+ if (asynchronous)
58
+ onSettled?.();
59
+ });
60
+ }
61
+ /**
62
+ * Renders the controlled message composer and optional attachment picker.
63
+ *
64
+ * @complexity Time/space: O(n) in rendered attachments and supplied menu items.
65
+ * @overallScore 100/100
66
+ */
67
+ export function Composer({ composer, onSend, disabled = false, sendDisabled = false, placeholder, slots, attachmentPicker, running = false, onCancel, }) {
68
+ const t = useT();
69
+ const attachmentInputRef = useRef(null);
70
+ const textareaRef = useRef(null);
71
+ const discoveryEffectInFlightRef = useRef(false);
72
+ /**
73
+ * Mirrors `composer.draft` for the ONE place it must be read outside a render: inside
74
+ * `notifyDiscovery`'s `onResolved` callback, which can fire after arbitrarily many re-renders
75
+ * (nothing here disables the textarea while a host effect is in flight, so the user is free to
76
+ * keep typing). Reassigned every render rather than via an effect — an effect would lag one
77
+ * render behind the value it needs to be compared against at the exact moment the outcome
78
+ * settles.
79
+ */
80
+ const draftRef = useRef(composer.draft);
81
+ draftRef.current = composer.draft;
82
+ const [discoveryMenuOpen, setDiscoveryMenuOpen] = useState(false);
83
+ const [slashActiveIndex, setSlashActiveIndex] = useState(0);
84
+ const [dismissedSlashDraft, setDismissedSlashDraft] = useState(null);
85
+ const [discoveryMenuPosition, setDiscoveryMenuPosition] = useState();
86
+ const [slashMenuPosition, setSlashMenuPosition] = useState();
87
+ const resolvedPlaceholder = placeholder ?? t('Send a message…');
88
+ const discoveryGroups = slots?.discoveryGroups ?? [];
89
+ const hasDiscoveryItems = discoveryGroups.some((group) => group.items.length > 0);
90
+ const slashQuery = parseComposerSlashQuery(composer.draft);
91
+ const slashMatches = slashQuery === null ? [] : filterComposerDiscovery(discoveryGroups, slashQuery);
92
+ const slashOpen = slashMatches.length > 0 && dismissedSlashDraft !== composer.draft;
93
+ /**
94
+ * A bare "/" intentionally matches every item (`matchesFuzzyCommand`'s own doc) so the palette
95
+ * doubles as a browse-everything view — but with nothing typed yet, nothing on screen tells a
96
+ * first-time user that continuing to type narrows it, and a fuzzy substring match against full
97
+ * descriptions stays broad for the first character or two regardless (owner-reported "it doesn't
98
+ * narrow" — narrowing DOES fire on every keystroke, this is the one state where there's no visual
99
+ * cue that it will). Shown only here, not once the user has started typing a real query — at that
100
+ * point the shrinking list is its own feedback.
101
+ */
102
+ const showSlashFilterHint = slashQuery !== null && slashQuery.command === '' && slashQuery.argument === null;
103
+ function restoreComposerFocus() {
104
+ textareaRef.current?.focus();
105
+ }
106
+ /**
107
+ * Neither popover had any way to dismiss on an outside click — Escape worked (each already wires
108
+ * its own keydown), but clicking away left them open with no affordance to close (bug report:
109
+ * "no click-outside, owner is stuck once it opens"). `mousedown`, not `click`, so this settles
110
+ * before the "+" trigger button's own `onToggle` fires on the SAME click — that click's target is
111
+ * inside `.jini-composer-discovery` (the trigger lives there too), so it's correctly treated as
112
+ * "inside" and left for `onToggle` to handle, not fought over by two competing handlers.
113
+ *
114
+ * Scoped by DOM lookup (`closest`/`querySelector`) off `textareaRef`, not new refs threaded
115
+ * through `ComposerDiscovery.tsx`'s props — both popovers already carry stable classes/ids this
116
+ * component doesn't otherwise need direct handles to.
117
+ */
118
+ useEffect(() => {
119
+ if (!discoveryMenuOpen && !slashOpen)
120
+ return;
121
+ const composerRoot = textareaRef.current?.closest('.jini-composer');
122
+ if (!composerRoot)
123
+ return;
124
+ function handleOutsideMouseDown(event) {
125
+ const target = event.target;
126
+ if (!target)
127
+ return;
128
+ if (discoveryMenuOpen) {
129
+ const trigger = composerRoot.querySelector('.jini-composer-discovery');
130
+ if (!trigger?.contains(target))
131
+ setDiscoveryMenuOpen(false);
132
+ }
133
+ if (slashOpen) {
134
+ const menu = composerRoot.querySelector('#jini-composer-slash-menu');
135
+ const insideTextarea = textareaRef.current?.contains(target) ?? false;
136
+ if (!insideTextarea && !menu?.contains(target))
137
+ setDismissedSlashDraft(composer.draft);
138
+ }
139
+ }
140
+ document.addEventListener('mousedown', handleOutsideMouseDown);
141
+ return () => document.removeEventListener('mousedown', handleOutsideMouseDown);
142
+ }, [discoveryMenuOpen, slashOpen, composer.draft]);
143
+ /**
144
+ * Anchors the "+" menu and slash palette to `.jini-composer`'s live on-screen rect via
145
+ * `position: fixed` (see `composerDiscoveryMenuPosition`/`composerSlashMenuPosition`'s own doc
146
+ * in `composer-discovery.ts` for the ancestor-clipping bug this fixes). `useLayoutEffect`, not
147
+ * `useEffect`, so the measured position lands before the browser paints the just-opened popover
148
+ * — otherwise the very first frame would flash at the CSS default (`position: absolute`)
149
+ * position before snapping to the fixed one. Recomputed on scroll/resize while either popover is
150
+ * open, matching `useAgentRuntimePicker.hooks.ts`'s identical popover-tracking idiom: the
151
+ * composer's on-screen position can change under an open popover without it ever unmounting.
152
+ */
153
+ useLayoutEffect(() => {
154
+ if (!discoveryMenuOpen && !slashOpen)
155
+ return undefined;
156
+ const composerRoot = textareaRef.current?.closest('.jini-composer');
157
+ if (!composerRoot)
158
+ return undefined;
159
+ function update() {
160
+ const rect = composerRoot.getBoundingClientRect();
161
+ if (discoveryMenuOpen)
162
+ setDiscoveryMenuPosition(composerDiscoveryMenuPosition(rect));
163
+ if (slashOpen)
164
+ setSlashMenuPosition(composerSlashMenuPosition(rect));
165
+ }
166
+ update();
167
+ window.addEventListener('scroll', update, true);
168
+ window.addEventListener('resize', update);
169
+ return () => {
170
+ window.removeEventListener('scroll', update, true);
171
+ window.removeEventListener('resize', update);
172
+ };
173
+ }, [discoveryMenuOpen, slashOpen]);
174
+ /**
175
+ * `expectedDraft` is the draft as the user last saw it at the moment of selection — what the
176
+ * host's effect was computed against. `argument` is passed only for a resolved `'invoke'` on a
177
+ * `command`-bearing item (see `resolveComposerSlashInvocation`); omitted entirely for a plain
178
+ * macro item, matching `ComposerDiscoverySelection.argument`'s own "absent means no command
179
+ * grammar" contract.
180
+ *
181
+ * A `ComposerDiscoveryOutcome` the host returns replaces the draft — this is how a command whose
182
+ * effect is computed asynchronously (e.g. composing agent-directed instruction text) gets to
183
+ * write its result back, since nothing here can guess it in advance the way a plain item's own
184
+ * `insertText` can. But nothing disables the textarea while that effect is in flight, so the
185
+ * live draft (`draftRef.current`) may have moved on by the time it resolves. The outcome is
186
+ * applied only if the live draft still matches `expectedDraft` exactly; otherwise it is
187
+ * DISCARDED — silently overwriting keystrokes the user typed in the meantime would be worse than
188
+ * dropping a result they can reselect.
189
+ */
190
+ function notifyDiscovery(item, source, expectedDraft, argument) {
191
+ const onDiscoverySelect = slots?.onDiscoverySelect;
192
+ if (!onDiscoverySelect || discoveryEffectInFlightRef.current)
193
+ return;
194
+ discoveryEffectInFlightRef.current = true;
195
+ runComposerHostEffect('onDiscoverySelect', () => onDiscoverySelect({ item, source, ...(argument !== undefined ? { argument } : {}) }), () => {
196
+ discoveryEffectInFlightRef.current = false;
197
+ }, (outcome) => {
198
+ if (!outcome || typeof outcome !== 'object')
199
+ return;
200
+ const draft = outcome.draft;
201
+ if (draft === undefined)
202
+ return;
203
+ if (draftRef.current !== expectedDraft)
204
+ return;
205
+ composer.setDraft(draft);
206
+ });
207
+ }
208
+ function selectSlashItem(index) {
209
+ const match = slashMatches[index];
210
+ if (!match)
211
+ return;
212
+ const resolution = resolveComposerSlashInvocation(composer.draft, match.item);
213
+ if (!resolution)
214
+ return;
215
+ if (resolution.type === 'complete') {
216
+ // The command word is ambiguous or its argument is still missing — finish the trigger and
217
+ // keep the palette open for further typing. No host effect fires: nothing was invoked yet.
218
+ composer.setDraft(resolution.draft);
219
+ setDismissedSlashDraft(null);
220
+ restoreComposerFocus();
221
+ return;
222
+ }
223
+ let expectedDraft = composer.draft;
224
+ if (!match.item.command) {
225
+ expectedDraft = replaceComposerSlashTrigger(composer.draft, match.item.insertText ?? match.item.label);
226
+ composer.setDraft(expectedDraft);
227
+ }
228
+ setDismissedSlashDraft(null);
229
+ notifyDiscovery(match.item, 'slash', expectedDraft, resolution.argument);
230
+ restoreComposerFocus();
231
+ }
232
+ function selectPlusItem(item) {
233
+ const expectedDraft = item.insertText ? appendComposerDiscovery(composer.draft, item.insertText) : composer.draft;
234
+ if (item.insertText)
235
+ composer.setDraft(expectedDraft);
236
+ setDiscoveryMenuOpen(false);
237
+ notifyDiscovery(item, 'plus', expectedDraft);
238
+ restoreComposerFocus();
239
+ }
240
+ function handleKeyDown(event) {
241
+ if (event.nativeEvent.isComposing)
242
+ return;
243
+ if (slashOpen) {
244
+ const action = resolveComposerSlashKeyAction(event.key, event.shiftKey);
245
+ if (action.type !== 'none') {
246
+ event.preventDefault();
247
+ if (action.type === 'move') {
248
+ setSlashActiveIndex((current) => (current + action.offset + slashMatches.length) % slashMatches.length);
249
+ }
250
+ else if (action.type === 'select') {
251
+ selectSlashItem(Math.min(slashActiveIndex, slashMatches.length - 1));
252
+ }
253
+ else {
254
+ setDismissedSlashDraft(composer.draft);
255
+ }
256
+ return;
257
+ }
258
+ }
259
+ if (event.key !== 'Enter' || event.shiftKey)
260
+ return;
261
+ event.preventDefault();
262
+ if (!disabled && !sendDisabled && composer.canSubmit)
263
+ onSend();
264
+ }
265
+ function handleAttachmentChange(event) {
266
+ const files = Array.from(event.target.files ?? []);
267
+ event.target.value = '';
268
+ if (files.length > 0 && attachmentPicker) {
269
+ runComposerHostEffect('attachmentPicker.onFiles', () => attachmentPicker.onFiles(files));
270
+ }
271
+ }
272
+ /**
273
+ * A screenshot or a Finder-copied video pasted into the textarea previously vanished with no
274
+ * feedback: the browser's default paste has nothing to do with a `File` on the clipboard (it only
275
+ * inserts `text/plain`, which a file-only clipboard entry never carries), so the keystroke was a
276
+ * silent no-op — no chip, no `/api/attachments` call, nothing. This is the paste-side counterpart
277
+ * to `handleAttachmentChange` (the file-input path) and `useChatPaneFileDrop` (the drag-and-drop
278
+ * path); all three now reach `attachmentPicker.onFiles` the same way.
279
+ *
280
+ * `preventDefault` only when `files.length > 0` — an ordinary text paste (the overwhelmingly
281
+ * common case) is left to the browser's own default handling untouched.
282
+ */
283
+ function handleAttachmentPaste(event) {
284
+ if (!attachmentPicker)
285
+ return;
286
+ const files = Array.from(event.clipboardData?.files ?? []);
287
+ if (files.length === 0)
288
+ return;
289
+ event.preventDefault();
290
+ runComposerHostEffect('attachmentPicker.onFiles', () => attachmentPicker.onFiles(files));
291
+ }
292
+ return (_jsxs("div", { className: "jini-composer", children: [slots?.leadingAccessories ? _jsx("div", { className: "jini-composer-leading", children: slots.leadingAccessories }) : null, _jsx(AttachmentTray, { attachments: composer.attachments, onRemove: composer.removeAttachment }), _jsx("textarea", { ref: textareaRef, className: "jini-composer-input", value: composer.draft, placeholder: resolvedPlaceholder, disabled: disabled, onChange: (e) => {
293
+ composer.setDraft(e.target.value);
294
+ setSlashActiveIndex(0);
295
+ setDismissedSlashDraft(null);
296
+ }, onKeyDown: handleKeyDown, onPaste: handleAttachmentPaste, "aria-controls": slashOpen ? 'jini-composer-slash-menu' : undefined, "aria-expanded": slashOpen, "aria-activedescendant": slashOpen
297
+ ? `jini-composer-slash-option-${Math.min(slashActiveIndex, slashMatches.length - 1)}`
298
+ : undefined, rows: 3 }), slashOpen ? (_jsx(ComposerSlashMenu, { matches: slashMatches, activeIndex: Math.min(slashActiveIndex, slashMatches.length - 1), onSelect: (item) => selectSlashItem(slashMatches.findIndex((match) => match.item === item)), showFilterHint: showSlashFilterHint, style: slashMenuPosition, t: t })) : null, _jsxs("div", { className: "jini-composer-footer", children: [attachmentPicker && !hasDiscoveryItems ? (_jsxs("div", { className: "jini-composer-attachment-picker", children: [_jsx("input", { ref: attachmentInputRef, className: "jini-composer-file-input", "data-testid": "composer-attachment-input", type: "file", multiple: true, "aria-label": t('Attach files'), accept: attachmentPicker.accept, disabled: disabled || attachmentPicker.uploading, onChange: handleAttachmentChange }), _jsx("button", { type: "button", className: "jini-composer-attach", disabled: disabled || attachmentPicker.uploading, onClick: () => attachmentInputRef.current?.click(), title: t(attachmentPicker.uploading ? 'Attaching files…' : 'Attach files'), "aria-label": t(attachmentPicker.uploading ? 'Attaching files…' : 'Attach files'), children: _jsx(RemixIcon, { name: attachmentPicker.uploading ? 'refresh-line' : 'add-line', size: 20, ...(attachmentPicker.uploading ? { className: 'jini-composer-spinner' } : {}) }) })] })) : null, hasDiscoveryItems ? (_jsx(ComposerDiscoveryMenu, { groups: discoveryGroups, open: discoveryMenuOpen, disabled: disabled, ...(attachmentPicker ? { attachmentPicker } : {}), attachmentInputRef: attachmentInputRef, onToggle: () => setDiscoveryMenuOpen((open) => !open), onClose: () => setDiscoveryMenuOpen(false), onSelect: selectPlusItem, onAttachmentChange: handleAttachmentChange, style: discoveryMenuPosition, t: t })) : null, slots?.footerAccessories ? (_jsx("div", { className: "jini-composer-footer-accessories", children: slots.footerAccessories })) : null, slots?.plusMenuItems && slots.plusMenuItems.length > 0 ? (_jsx("div", { className: "jini-composer-plus-menu", children: slots.plusMenuItems.map((item) => (_jsxs("button", { type: "button", className: "jini-composer-plus-item", onClick: () => runComposerHostEffect('plusMenuItems.onSelect', () => item.onSelect()), title: t(item.label), children: [item.icon ?? null, _jsx("span", { children: t(item.label) })] }, item.id))) })) : null, running ? (_jsx("button", { type: "button", className: "jini-composer-send jini-composer-send--stop", onClick: onCancel, title: t('Stop run'), "aria-label": t('Stop run'), children: _jsx(RemixIcon, { name: "stop-fill", size: 14 }) })) : (_jsx("button", { type: "button", className: "jini-composer-send", disabled: disabled || sendDisabled || !composer.canSubmit, onClick: onSend, title: t('Send'), "aria-label": t('Send'), children: _jsx(RemixIcon, { name: "send-plane-2-line", size: 16 }) }))] })] }));
299
+ }
300
+ //# sourceMappingURL=Composer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Composer.js","sourceRoot":"","sources":["../../../src/react/components/Composer.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import type { ChangeEvent, CSSProperties, RefObject } from 'react';
2
+ import type { ComposerDiscoveryGroup, ComposerDiscoveryItem } from '../slots.js';
3
+ import type { ComposerDiscoveryMatch } from './composer-discovery.js';
4
+ interface AttachmentPicker {
5
+ onFiles: (files: File[]) => void | Promise<void>;
6
+ accept?: string;
7
+ uploading?: boolean;
8
+ }
9
+ export interface ComposerDiscoveryMenuProps {
10
+ groups: readonly ComposerDiscoveryGroup[];
11
+ open: boolean;
12
+ disabled: boolean;
13
+ attachmentPicker?: AttachmentPicker;
14
+ attachmentInputRef: RefObject<HTMLInputElement | null>;
15
+ onToggle: () => void;
16
+ onClose: () => void;
17
+ onSelect: (item: ComposerDiscoveryItem) => void;
18
+ onAttachmentChange: (event: ChangeEvent<HTMLInputElement>) => void;
19
+ t: (key: string) => string;
20
+ /** Viewport-fixed position computed by `Composer.tsx` (see `composerDiscoveryMenuPosition` in
21
+ * `composer-discovery.ts`) so the popover escapes any `overflow: hidden` ancestor between the
22
+ * composer and the page root. `undefined` for the one synchronous render before that
23
+ * measurement lands, during which the reference stylesheet's `position: absolute` default
24
+ * still applies — inline `style` always wins once it is set. */
25
+ style?: CSSProperties | undefined;
26
+ }
27
+ /** Generic grouped add-menu; the host owns all inventory labels and items. */
28
+ export declare function ComposerDiscoveryMenu(props: ComposerDiscoveryMenuProps): import("react").JSX.Element | null;
29
+ export interface ComposerSlashMenuProps {
30
+ matches: readonly ComposerDiscoveryMatch[];
31
+ activeIndex: number;
32
+ onSelect: (item: ComposerDiscoveryItem) => void;
33
+ /** True only for a bare "/" (see `Composer.tsx`'s own doc on `showSlashFilterHint`) — shows a
34
+ * one-line "keep typing to narrow" cue above the options, since that's the one state where
35
+ * nothing else on screen signals that typing filters the list. */
36
+ showFilterHint?: boolean;
37
+ t: (key: string) => string;
38
+ /** Viewport-fixed position computed by `Composer.tsx` (see `composerSlashMenuPosition` in
39
+ * `composer-discovery.ts`) — same escape-the-ancestor-clip mechanism as
40
+ * {@link ComposerDiscoveryMenuProps.style}. */
41
+ style?: CSSProperties | undefined;
42
+ }
43
+ /** Keyboard navigation is owned by Composer so focus stays in the textarea. */
44
+ export declare function ComposerSlashMenu(props: ComposerSlashMenuProps): import("react").JSX.Element | null;
45
+ export {};
46
+ //# sourceMappingURL=ComposerDiscovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ComposerDiscovery.d.ts","sourceRoot":"","sources":["../../../src/react/components/ComposerDiscovery.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEnE,OAAO,KAAK,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEtE,UAAU,gBAAgB;IACxB,OAAO,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAC1C,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,kBAAkB,EAAE,SAAS,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACvD,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,IAAI,EAAE,qBAAqB,KAAK,IAAI,CAAC;IAChD,kBAAkB,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IACnE,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3B;;;;qEAIiE;IACjE,KAAK,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;CACnC;AAED,8EAA8E;AAC9E,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,0BAA0B,sCA8FtE;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,CAAC,IAAI,EAAE,qBAAqB,KAAK,IAAI,CAAC;IAChD;;uEAEmE;IACnE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3B;;oDAEgD;IAChD,KAAK,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;CACnC;AAED,+EAA+E;AAC/E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,sCAuD9D"}
@@ -0,0 +1,38 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { RemixIcon } from '@jini-ai/ui';
3
+ /** Generic grouped add-menu; the host owns all inventory labels and items. */
4
+ export function ComposerDiscoveryMenu(props) {
5
+ const hasItems = props.groups.some((group) => group.items.length > 0);
6
+ if (!hasItems)
7
+ return null;
8
+ return (_jsxs("div", { className: "jini-composer-discovery", onKeyDown: (event) => {
9
+ if (event.key !== 'Escape' || !props.open)
10
+ return;
11
+ event.preventDefault();
12
+ props.onClose();
13
+ }, children: [props.attachmentPicker ? (_jsx("input", { ref: props.attachmentInputRef, className: "jini-composer-file-input", "data-testid": "composer-attachment-input", type: "file", multiple: true, "aria-label": props.t('Attach files'), accept: props.attachmentPicker.accept, disabled: props.disabled || props.attachmentPicker.uploading, onChange: props.onAttachmentChange })) : null, _jsx("button", { type: "button", className: "jini-composer-attach", disabled: props.disabled, onClick: props.onToggle, "aria-expanded": props.open, "aria-haspopup": "menu", title: props.t('Add context'), "aria-label": props.t('Add context'), children: _jsx(RemixIcon, { name: "add-line", size: 20 }) }), props.open ? (_jsxs("div", { className: "jini-composer-discovery-menu", style: props.style, role: "menu", "aria-label": props.t('Add context'), children: [props.attachmentPicker ? (_jsxs("div", { className: "jini-composer-discovery-group", role: "group", "aria-label": props.t('Files'), children: [_jsx("span", { className: "jini-composer-discovery-group-label", children: props.t('Files') }), _jsx("button", { type: "button", role: "menuitem", className: "jini-composer-discovery-item", disabled: props.disabled || props.attachmentPicker.uploading, onClick: () => {
14
+ props.onClose();
15
+ props.attachmentInputRef.current?.click();
16
+ }, children: props.t(props.attachmentPicker.uploading ? 'Attaching files…' : 'Attach files') })] })) : null, props.groups.map((group) => group.items.length > 0 ? (_jsxs("div", { className: "jini-composer-discovery-group", role: "group", "aria-label": props.t(group.label), children: [_jsx("span", { className: "jini-composer-discovery-group-label", children: props.t(group.label) }), group.items.map((item) => {
17
+ const description = item.description ? props.t(item.description) : undefined;
18
+ const descriptionId = description ? `jini-composer-discovery-desc-${item.id}` : undefined;
19
+ return (_jsxs("button", { type: "button", role: "menuitem", className: "jini-composer-discovery-item", "aria-describedby": descriptionId, onClick: () => props.onSelect(item), children: [_jsx("span", { children: props.t(item.label) }), description ? (_jsx("small", { id: descriptionId, className: "jini-composer-discovery-description", children: description })) : null] }, item.id));
20
+ })] }, group.id)) : null)] })) : null] }));
21
+ }
22
+ /** Keyboard navigation is owned by Composer so focus stays in the textarea. */
23
+ export function ComposerSlashMenu(props) {
24
+ if (props.matches.length === 0)
25
+ return null;
26
+ return (_jsxs("div", { id: "jini-composer-slash-menu", className: "jini-composer-slash-menu", style: props.style, role: "listbox", "aria-label": props.t('Composer commands'), children: [props.showFilterHint ? (
27
+ // `role="presentation"` opts this out of the listbox's own "children are options" ARIA
28
+ // expectation explicitly, rather than leaving an unmarked stray `<div>` for assistive tech
29
+ // to guess about — same escape hatch real combobox implementations use for a "no results"
30
+ // row. Reuses `.jini-composer-discovery-group-label`'s existing look (faint, small,
31
+ // uppercase) instead of introducing a new visual style for one hint line.
32
+ _jsx("div", { className: "jini-composer-discovery-group-label", role: "presentation", children: props.t('Keep typing to narrow the list') })) : null, props.matches.map((match, index) => {
33
+ const description = props.t(match.item.description ?? match.groupLabel);
34
+ const descriptionId = `jini-composer-slash-option-${index}-desc`;
35
+ return (_jsxs("button", { id: `jini-composer-slash-option-${index}`, type: "button", role: "option", "aria-selected": index === props.activeIndex, "aria-describedby": descriptionId, className: `jini-composer-discovery-item${index === props.activeIndex ? ' is-active' : ''}`, onMouseDown: (event) => event.preventDefault(), onClick: () => props.onSelect(match.item), children: [_jsxs("span", { children: [props.t(match.item.label), match.item.argument ? (_jsxs("code", { className: "jini-composer-slash-argument", children: [" ", match.item.argument.placeholder] })) : null, match.item.needsConfirmation ? (_jsxs("small", { className: "jini-composer-slash-confirm-badge", children: [" ", props.t('Confirm')] })) : null] }), _jsx("small", { id: descriptionId, className: "jini-composer-discovery-description", children: description })] }, `${match.groupId}:${match.item.id}`));
36
+ })] }));
37
+ }
38
+ //# sourceMappingURL=ComposerDiscovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ComposerDiscovery.js","sourceRoot":"","sources":["../../../src/react/components/ComposerDiscovery.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /** The minimum a row needs to render. Mirrors `@jini-ai/chat/core`'s `ChatConversation`. */
2
+ export interface ConversationListItem {
3
+ id: string;
4
+ title: string | null;
5
+ messageCount?: number;
6
+ updatedAt?: number;
7
+ }
8
+ export interface ConversationListProps {
9
+ conversations: ConversationListItem[];
10
+ activeConversationId: string | null;
11
+ onSelect: (id: string) => void;
12
+ onCreate: () => void | Promise<void>;
13
+ onDelete: (id: string) => void | Promise<void>;
14
+ onRename: (id: string, title: string) => void | Promise<void>;
15
+ /**
16
+ * Server-backed search. Omit for the built-in client filter.
17
+ *
18
+ * **Required once the list is paginated** — see this module's header.
19
+ */
20
+ onSearch?: (query: string) => Promise<ConversationListItem[]>;
21
+ /**
22
+ * Confirm before deleting. Defaults to `window.confirm`; pass a custom dialog, or
23
+ * `() => Promise.resolve(true)` to delete without asking.
24
+ */
25
+ confirmDelete?: (item: ConversationListItem) => boolean | Promise<boolean>;
26
+ /** Disables the "New" action — e.g. while the current conversation is still empty. */
27
+ createDisabled?: boolean;
28
+ emptyState?: React.ReactNode;
29
+ }
30
+ export declare function ConversationList({ conversations, activeConversationId, onSelect, onCreate, onDelete, onRename, onSearch, confirmDelete, createDisabled, emptyState, }: ConversationListProps): import("react").JSX.Element;
31
+ //# sourceMappingURL=ConversationList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConversationList.d.ts","sourceRoot":"","sources":["../../../src/react/components/ConversationList.tsx"],"names":[],"mappings":"AAmCA,4FAA4F;AAC5F,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,oBAAoB,EAAE,CAAC;IACtC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC9D;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3E,sFAAsF;IACtF,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC9B;AA+BD,wBAAgB,gBAAgB,CAAC,EAC/B,aAAa,EACb,oBAAoB,EACpB,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,cAAsB,EACtB,UAAU,GACX,EAAE,qBAAqB,+BA6QvB"}