@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,1327 @@
1
+ export const CHAT_PANE_STYLES = `
2
+ .jini-chat-pane {
3
+ --jini-chat-bg: #faf9f7;
4
+ --jini-chat-panel: #fdfcfa;
5
+ --jini-chat-text: #1a1916;
6
+ --jini-chat-text-strong: #0d0c0a;
7
+ --jini-chat-muted: #74716b;
8
+ --jini-chat-faint: #b3b0a8;
9
+ --jini-chat-border: #e1e5eb;
10
+ --jini-chat-border-strong: #c9d0da;
11
+ --jini-chat-border-soft: #edf0f4;
12
+ --jini-chat-subtle: #f4f5f7;
13
+ --jini-chat-accent: #c96442;
14
+ --jini-chat-accent-soft: #fbeee5;
15
+ --bg-panel: var(--jini-chat-panel);
16
+ --bg-subtle: var(--jini-chat-subtle);
17
+ --border: var(--jini-chat-border);
18
+ --border-strong: var(--jini-chat-border-strong);
19
+ --text: var(--jini-chat-text);
20
+ --text-strong: var(--jini-chat-text-strong);
21
+ --text-muted: var(--jini-chat-muted);
22
+ --danger: #e5484d;
23
+ --radius: 8px;
24
+ --radius-lg: 12px;
25
+ position: relative;
26
+ display: grid;
27
+ grid-template-rows: auto minmax(0, 1fr) auto;
28
+ min-width: 0;
29
+ min-height: 0;
30
+ height: 100%;
31
+ overflow: hidden;
32
+ color: var(--jini-chat-text);
33
+ background: var(--jini-chat-bg);
34
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Microsoft YaHei UI", "Noto Sans", Roboto, "Helvetica Neue", Arial, sans-serif;
35
+ font-size: 13.5px;
36
+ line-height: 1.5;
37
+ -webkit-font-smoothing: antialiased;
38
+ -moz-osx-font-smoothing: grayscale;
39
+ }
40
+ .jini-chat-pane button,
41
+ .jini-runtime-popover button,
42
+ .jini-runtime-popover select {
43
+ font: inherit;
44
+ }
45
+ .jini-chat-pane__header {
46
+ display: flex;
47
+ align-items: center;
48
+ justify-content: space-between;
49
+ min-height: 74px;
50
+ padding: 18px 22px 14px;
51
+ border-bottom: 1px solid var(--jini-chat-border-soft);
52
+ }
53
+ .jini-chat-pane__heading { min-width: 0; }
54
+ .jini-chat-pane__eyebrow {
55
+ display: block;
56
+ margin-bottom: 4px;
57
+ color: var(--jini-chat-muted);
58
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
59
+ font-size: 10px;
60
+ letter-spacing: .1em;
61
+ text-transform: uppercase;
62
+ }
63
+ .jini-chat-pane__title {
64
+ overflow: hidden;
65
+ margin: 0;
66
+ font-size: 21px;
67
+ font-weight: 650;
68
+ letter-spacing: -.025em;
69
+ text-overflow: ellipsis;
70
+ white-space: nowrap;
71
+ }
72
+ .jini-chat-pane__new-thread {
73
+ padding: 8px 12px;
74
+ color: var(--jini-chat-muted);
75
+ background: var(--jini-chat-panel);
76
+ border: 1px solid var(--jini-chat-border);
77
+ border-radius: 8px;
78
+ cursor: pointer;
79
+ }
80
+ .jini-chat-pane__body {
81
+ position: relative;
82
+ min-height: 0;
83
+ overflow: hidden;
84
+ }
85
+ .jini-chat-pane .jini-message-list {
86
+ height: 100%;
87
+ overflow-y: auto;
88
+ /*
89
+ * .jini-chat-pane__controls is an absolutely-positioned overlay (not a flex/grid sibling that
90
+ * pushes this list up), so its real height has to be reserved here instead. This used to be a
91
+ * flat 240px guess -- and had already gone stale once before that: it started at 170px, a live
92
+ * render outgrew it (composer + footer + working-directory row alone measured 179.75px, clipping
93
+ * the last message's tail under the overlay), and 240px was chosen as a margin above THAT
94
+ * measurement, not a value anything keeps in sync. useChatPaneControlsHeight now measures the
95
+ * overlay's real height live via ResizeObserver and publishes it as
96
+ * --jini-chat-controls-height on the pane root, so this reservation tracks the composer's
97
+ * actual content (an attachment tray, a wrapped multi-line draft, a taller runtime-picker
98
+ * popover) instead of a number that is only ever correct until the next thing that grows it.
99
+ * 240px survives as the fallback for the rare environment without ResizeObserver (SSR; a test
100
+ * harness that never polyfills it) -- everywhere else, the calc() wins.
101
+ */
102
+ padding: 20px 22px calc(var(--jini-chat-controls-height, 240px) + 24px);
103
+ scrollbar-width: thin;
104
+ }
105
+ .jini-chat-pane .jini-message {
106
+ margin-bottom: 20px;
107
+ color: var(--jini-chat-text);
108
+ font-size: 14px;
109
+ line-height: 1.62;
110
+ }
111
+ /*
112
+ * Bubble on the content, not the row: MessageRow.tsx renders attachments as siblings of
113
+ * .jini-message-content inside .jini-message-user, each with their own chip styling -- bubbling
114
+ * the whole row would nest one background box inside another. This replaces a dead rule this file
115
+ * shipped with (.jini-message-row[data-role="user"] / .jini-message-row.user): MessageRow.tsx
116
+ * has never rendered a jini-message-row class or a data-role attribute, and a user message's
117
+ * root class is jini-message-user, not bare "user" -- the selector never matched anything real.
118
+ */
119
+ .jini-chat-pane .jini-message-user .jini-message-content {
120
+ margin-left: auto;
121
+ padding: 10px 13px;
122
+ width: fit-content;
123
+ max-width: 88%;
124
+ background: var(--jini-chat-subtle);
125
+ border-radius: 12px 12px 3px 12px;
126
+ }
127
+ .jini-chat-pane .jini-message-user .jini-message-attachments {
128
+ display: flex;
129
+ flex-wrap: wrap;
130
+ gap: 6px;
131
+ justify-content: flex-end;
132
+ margin-bottom: 4px;
133
+ }
134
+ .jini-chat-pane .jini-message-user .jini-message-attachment-chip {
135
+ font-size: 11px;
136
+ color: var(--jini-chat-muted);
137
+ background: var(--jini-chat-subtle);
138
+ border: 1px solid var(--jini-chat-border);
139
+ border-radius: 999px;
140
+ padding: 3px 10px;
141
+ }
142
+ .jini-chat-pane .jini-message-agent {
143
+ font-size: 11px;
144
+ font-weight: 700;
145
+ letter-spacing: .02em;
146
+ text-transform: uppercase;
147
+ color: var(--jini-chat-faint);
148
+ margin-bottom: 4px;
149
+ }
150
+ .jini-chat-pane .jini-message-error { color: var(--danger); font-size: 13px; }
151
+ .jini-chat-pane .jini-message-pending { color: var(--jini-chat-muted); font-size: 13px; font-style: italic; }
152
+ /*
153
+ * Per-message action row (MessageRow.tsx's 'CopyMessageButton', Icon.tsx's 'copy' glyph): quiet,
154
+ * icon-only, always present rather than a hover-only reveal, so keyboard and touch users get the
155
+ * same access a mouse hover would give. The assistant variant carries a thin left rail (its own
156
+ * left border) to read as attached to the turn above it without repeating that message's own
157
+ * chrome; the user variant skips the rail and instead mirrors its bubble's own right alignment.
158
+ * Copy is the only live button today — 'jini-message-actions--assistant' is an intentional
159
+ * extension seam, not the finished row; see that row's own call-site comment in MessageRow.tsx.
160
+ */
161
+ .jini-chat-pane .jini-message-actions {
162
+ display: flex;
163
+ align-items: center;
164
+ gap: 2px;
165
+ margin-top: 6px;
166
+ }
167
+ .jini-chat-pane .jini-message-actions--assistant {
168
+ padding-left: 8px;
169
+ border-left: 2px solid var(--jini-chat-border-soft);
170
+ }
171
+ .jini-chat-pane .jini-message-actions--user { justify-content: flex-end; }
172
+ .jini-chat-pane .jini-message-action-btn {
173
+ display: inline-flex;
174
+ align-items: center;
175
+ justify-content: center;
176
+ width: 24px;
177
+ height: 24px;
178
+ padding: 0;
179
+ color: var(--jini-chat-faint);
180
+ background: none;
181
+ border: 0;
182
+ border-radius: 6px;
183
+ cursor: pointer;
184
+ }
185
+ .jini-chat-pane .jini-message-action-btn:hover { color: var(--jini-chat-muted); background: var(--jini-chat-subtle); }
186
+ .jini-chat-pane .jini-message-action-btn:focus-visible { outline: 2px solid var(--jini-chat-accent); outline-offset: 1px; }
187
+ /* Visually hidden but present in the DOM (never display:none) so the polite live region beside
188
+ each copy button still gets announced — same clip-rect technique this package already uses for
189
+ its other visually-hidden-but-functional controls. */
190
+ .jini-chat-pane .jini-message-copy-status {
191
+ position: absolute;
192
+ width: 1px;
193
+ height: 1px;
194
+ overflow: hidden;
195
+ clip: rect(0, 0, 0, 0);
196
+ white-space: nowrap;
197
+ }
198
+ .jini-chat-pane__controls {
199
+ position: absolute;
200
+ right: 0;
201
+ bottom: 0;
202
+ left: 0;
203
+ z-index: 4;
204
+ padding: 0 16px 14px;
205
+ background: linear-gradient(to bottom, transparent, var(--jini-chat-bg) 22px);
206
+ }
207
+ .jini-chat-pane__suggestions {
208
+ display: flex;
209
+ gap: 8px;
210
+ margin: 0 2px 8px;
211
+ overflow-x: auto;
212
+ }
213
+ .jini-chat-pane__suggestion {
214
+ flex: 0 0 auto;
215
+ max-width: 290px;
216
+ overflow: hidden;
217
+ padding: 7px 11px;
218
+ color: var(--jini-chat-muted);
219
+ background: color-mix(in srgb, var(--jini-chat-panel) 92%, transparent);
220
+ border: 1px solid var(--jini-chat-border);
221
+ border-radius: 999px;
222
+ font-size: 11px;
223
+ text-overflow: ellipsis;
224
+ white-space: nowrap;
225
+ cursor: pointer;
226
+ }
227
+ .jini-chat-pane__error {
228
+ margin: 0 2px 8px;
229
+ padding: 8px 10px;
230
+ color: #8c2f20;
231
+ background: #fff1ed;
232
+ border: 1px solid #f2c8bb;
233
+ border-radius: 8px;
234
+ font-size: 12px;
235
+ }
236
+ .jini-chat-pane__status {
237
+ margin: 0 2px 8px;
238
+ padding: 8px 10px;
239
+ color: var(--jini-chat-muted);
240
+ background: var(--jini-chat-subtle);
241
+ border: 1px solid var(--jini-chat-border);
242
+ border-radius: 8px;
243
+ font-size: 12px;
244
+ }
245
+ .jini-chat-pane__drop-target {
246
+ position: relative;
247
+ margin: -8px -8px -8px;
248
+ padding: 6px;
249
+ border: 2px dashed transparent;
250
+ border-radius: 16px;
251
+ transition:
252
+ background-color .14s ease,
253
+ border-color .14s ease,
254
+ box-shadow .14s ease;
255
+ }
256
+ .jini-chat-pane__drop-target.is-dragging-files {
257
+ background: color-mix(in srgb, var(--jini-chat-accent-soft) 72%, transparent);
258
+ border-color: var(--jini-chat-accent);
259
+ box-shadow: 0 0 0 1px color-mix(in srgb, var(--jini-chat-accent) 15%, transparent);
260
+ }
261
+ .jini-chat-pane__drop-target.is-dragging-files .jini-composer {
262
+ background: color-mix(in srgb, var(--jini-chat-accent-soft) 58%, var(--jini-chat-panel));
263
+ border-color: color-mix(in srgb, var(--jini-chat-accent) 68%, var(--jini-chat-border));
264
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--jini-chat-accent) 10%, transparent);
265
+ }
266
+ .jini-chat-pane__drop-announcement {
267
+ position: absolute;
268
+ width: 1px;
269
+ height: 1px;
270
+ overflow: hidden;
271
+ clip: rect(0, 0, 0, 0);
272
+ white-space: nowrap;
273
+ clip-path: inset(50%);
274
+ }
275
+ .jini-chat-pane .jini-composer {
276
+ position: relative;
277
+ overflow: visible;
278
+ padding: 0;
279
+ background: var(--jini-chat-subtle);
280
+ border: 1px solid var(--jini-chat-border);
281
+ border-radius: 12px;
282
+ box-shadow: none;
283
+ transition: border-color .16s ease, box-shadow .16s ease;
284
+ }
285
+ .jini-chat-pane .jini-composer:focus-within {
286
+ background: var(--jini-chat-panel);
287
+ border-color: color-mix(in srgb, var(--jini-chat-accent) 22%, var(--jini-chat-border-strong));
288
+ box-shadow: 0 1px 2px rgba(26, 25, 22, .06), 0 0 0 1px rgba(201, 100, 66, .06);
289
+ }
290
+ /*
291
+ * Pinned-context zone: whatever a host pins above the composer input (selected plugins, MCP
292
+ * servers, or anything a future host adds -- see 'leadingAccessories''s own doc in 'slots.ts').
293
+ * 'Composer.tsx' only mounts this element when 'slots.leadingAccessories' is a truthy prop value,
294
+ * but a host that always supplies a TRAY COMPONENT rather than conditionally supplying the prop
295
+ * itself (one that internally renders 'null' when nothing is pinned) still leaves an empty node
296
+ * behind -- ':empty' below is what actually collapses THAT case to zero height and zero seam,
297
+ * mirroring '.jini-attachment-tray:empty' a few rules down, which solves the identical problem for
298
+ * the real file-attachment tray.
299
+ *
300
+ * Collapsed (nothing pinned): zero height, zero padding, invisible (0-width) seam -- no reserved
301
+ * space, matching the owner's "if nil, it doesn't animate" requirement exactly, since there is
302
+ * nothing here to animate.
303
+ *
304
+ * Populated: grows to a single fixed-height row via 'max-height' (not 'height: auto', which can't
305
+ * transition) and gains a hairline seam using the SAME border/token '.jini-composer-footer' below
306
+ * already uses one zone down -- reads as one more zone of the same control, not a new floating
307
+ * box. The transition runs both directions, so removing the last pinned item gets a matching exit,
308
+ * not an instant cut.
309
+ *
310
+ * 'overflow-x: auto' turns this into a single scrollable row instead of the wrap-and-grow a naive
311
+ * flex row would do with six or more items; '> *' keeps any direct host child (a single tray
312
+ * wrapper, a bare row of buttons, anything) from shrinking to fit, so overflow -- not internal
313
+ * wrapping -- is what kicks in once content is wider than the zone.
314
+ *
315
+ * The "more content" cue is a real shadow/vignette, not a plain alpha fade -- an alpha fade toward
316
+ * this zone's own background was tried first and rejected on review: the chip and the zone
317
+ * background are already close in luminance, so fading a chip's OWN pixels toward transparent read
318
+ * as "something is clipped/broken", not "swipe for more", at a glance with no hover. The four-layer
319
+ * 'background' below is the standard scroll-shadow technique instead: a real 'color-mix'-tinted
320
+ * vignette (darkens in a light theme, lightens in a dark one, since it's mixed from the theme's OWN
321
+ * text color rather than a fixed hex) drawn at each edge -- but each 'scroll'-attached shadow layer
322
+ * is covered by a same-edge 'local'-attached solid-to-transparent layer that scrolls WITH the
323
+ * content, so the shadow is only ever visible on the edges that still have more to reveal: at rest
324
+ * (scrolled to the start) the left shadow is hidden and the right one shows; scroll all the way to
325
+ * the true end and the right shadow hides too. Verified live (not just by reading the technique):
326
+ * scrolling this element from 0 to its max scrollLeft measurably fades the right cover's computed
327
+ * background-position across the full track and the shadow disappears exactly at the end.
328
+ */
329
+ .jini-chat-pane .jini-composer-leading {
330
+ display: flex;
331
+ align-items: center;
332
+ overflow-x: auto;
333
+ overflow-y: hidden;
334
+ max-height: 0;
335
+ padding: 0 12px;
336
+ border-bottom: 0 solid var(--jini-chat-border-soft);
337
+ opacity: 0;
338
+ scrollbar-width: thin;
339
+ transition:
340
+ max-height .22s cubic-bezier(.3, .1, .25, 1),
341
+ padding .22s cubic-bezier(.3, .1, .25, 1),
342
+ border-bottom-width .22s ease,
343
+ opacity .16s ease;
344
+ background-color: var(--jini-chat-subtle);
345
+ background-repeat: no-repeat;
346
+ background-attachment: local, local, scroll, scroll;
347
+ background-position: 0 0, 100% 0, 0 0, 100% 0;
348
+ background-size: 26px 100%, 26px 100%, 20px 100%, 20px 100%;
349
+ background-image:
350
+ linear-gradient(to right, var(--jini-chat-subtle), transparent),
351
+ linear-gradient(to left, var(--jini-chat-subtle), transparent),
352
+ linear-gradient(to right, color-mix(in srgb, var(--jini-chat-text) 30%, transparent), transparent),
353
+ linear-gradient(to left, color-mix(in srgb, var(--jini-chat-text) 30%, transparent), transparent);
354
+ }
355
+ .jini-chat-pane .jini-composer-leading:not(:empty) {
356
+ max-height: 64px;
357
+ padding: 10px 12px;
358
+ border-bottom-width: 1px;
359
+ opacity: 1;
360
+ }
361
+ .jini-chat-pane .jini-composer-leading > * {
362
+ flex: none;
363
+ min-width: max-content;
364
+ }
365
+ @media (prefers-reduced-motion: reduce) {
366
+ .jini-chat-pane .jini-composer-leading { transition: none; }
367
+ }
368
+ .jini-chat-pane .jini-attachment-tray {
369
+ display: flex;
370
+ flex-wrap: wrap;
371
+ gap: 6px;
372
+ max-height: 88px;
373
+ overflow-y: auto;
374
+ padding: 8px 10px 0;
375
+ scrollbar-width: thin;
376
+ }
377
+ .jini-chat-pane .jini-attachment-tray:empty { display: none; }
378
+ /*
379
+ * The sanctioned reuse path (see '.jini-composer-leading''s own doc above and 'AttachmentTray''s
380
+ * module doc): a host nesting Jini's own tray/chip classes inside the pinned-context zone to match
381
+ * the real attachment tray's look. Un-does the wrap-and-grow rule directly above -- meant for that
382
+ * tray's OWN use one zone down, where wrapping onto a second line is fine -- so the OUTER zone's
383
+ * single scroll axis is the one that wins here instead. The real file-attachment tray is
384
+ * unaffected: it always renders as this zone's sibling ('Composer.tsx'), never its descendant.
385
+ */
386
+ .jini-chat-pane .jini-composer-leading .jini-attachment-tray {
387
+ flex-wrap: nowrap;
388
+ max-height: none;
389
+ overflow: visible;
390
+ padding: 0;
391
+ }
392
+ .jini-chat-pane .jini-attachment-chip {
393
+ display: inline-flex;
394
+ align-items: center;
395
+ box-sizing: border-box;
396
+ min-width: 0;
397
+ max-width: min(100%, 290px);
398
+ height: 36px;
399
+ padding: 3px 4px 3px 5px;
400
+ color: var(--jini-chat-text);
401
+ background: color-mix(in srgb, var(--jini-chat-panel) 88%, var(--jini-chat-subtle));
402
+ border: 1px solid var(--jini-chat-border);
403
+ border-radius: 9px;
404
+ box-shadow: 0 1px 1px rgba(13, 12, 10, .025);
405
+ animation: jini-chat-chip-in .16s ease both;
406
+ }
407
+ @keyframes jini-chat-chip-in {
408
+ from { opacity: 0; transform: translateY(3px) scale(.94); }
409
+ to { opacity: 1; transform: none; }
410
+ }
411
+ @media (prefers-reduced-motion: reduce) {
412
+ .jini-chat-pane .jini-attachment-chip { animation: none; }
413
+ }
414
+ .jini-chat-pane .jini-attachment-chip-body {
415
+ display: flex;
416
+ align-items: center;
417
+ min-width: 0;
418
+ gap: 7px;
419
+ }
420
+ .jini-chat-pane .jini-attachment-chip-icon {
421
+ display: grid;
422
+ flex: 0 0 auto;
423
+ place-items: center;
424
+ width: 26px;
425
+ height: 26px;
426
+ color: var(--jini-chat-muted);
427
+ background: var(--jini-chat-subtle);
428
+ border-radius: 7px;
429
+ }
430
+ .jini-chat-pane .jini-attachment-chip-icon.is-image {
431
+ color: var(--jini-chat-accent);
432
+ background: var(--jini-chat-accent-soft);
433
+ }
434
+ .jini-chat-pane .jini-attachment-chip-copy {
435
+ display: flex;
436
+ min-width: 0;
437
+ flex-direction: column;
438
+ line-height: 1.15;
439
+ }
440
+ .jini-chat-pane .jini-attachment-chip-name {
441
+ overflow: hidden;
442
+ font-size: 11.5px;
443
+ font-weight: 550;
444
+ text-overflow: ellipsis;
445
+ white-space: nowrap;
446
+ }
447
+ .jini-chat-pane .jini-attachment-chip-size {
448
+ color: var(--jini-chat-muted);
449
+ font-size: 9.5px;
450
+ }
451
+ .jini-chat-pane .jini-attachment-remove {
452
+ display: grid;
453
+ flex: 0 0 auto;
454
+ place-items: center;
455
+ width: 25px;
456
+ height: 25px;
457
+ margin-left: 4px;
458
+ padding: 0;
459
+ color: var(--jini-chat-muted);
460
+ background: transparent;
461
+ border: 0;
462
+ border-radius: 7px;
463
+ cursor: pointer;
464
+ }
465
+ .jini-chat-pane .jini-attachment-remove:hover,
466
+ .jini-chat-pane .jini-attachment-remove:focus-visible {
467
+ color: var(--jini-chat-text-strong);
468
+ background: var(--jini-chat-subtle);
469
+ outline: none;
470
+ }
471
+ .jini-chat-pane .jini-composer-input {
472
+ display: block;
473
+ box-sizing: border-box;
474
+ width: 100%;
475
+ min-height: 92px;
476
+ resize: none;
477
+ padding: 12px 14px 8px;
478
+ color: var(--jini-chat-text);
479
+ background: transparent;
480
+ border: 0;
481
+ outline: 0;
482
+ font-size: 13.5px;
483
+ line-height: 1.6;
484
+ }
485
+ .jini-chat-pane .jini-composer-input::placeholder { color: var(--jini-chat-faint); }
486
+ .jini-chat-pane .jini-composer-footer {
487
+ display: flex;
488
+ align-items: center;
489
+ justify-content: space-between;
490
+ min-height: 42px;
491
+ gap: 6px;
492
+ padding: 6px 8px 8px;
493
+ border-top: 1px solid var(--jini-chat-border-soft);
494
+ }
495
+ .jini-chat-pane .jini-composer-attachment-picker { display: inline-flex; }
496
+ /* NOT 'position: relative' — the discovery popover (below) anchors off '.jini-composer' itself
497
+ (the nearest positioned ancestor once this wrapper opts out), not off this small trigger-button
498
+ wrapper. Anchoring to the wrapper put the popover's bottom edge at the wrapper's own top edge —
499
+ inside the footer, just below the textarea — so any popover taller than a couple of rows grew
500
+ upward straight over the textarea and blocked clicks into it (reproduced live: Playwright's own
501
+ click on the textarea failed with "intercepts pointer events" while the popover was open). */
502
+ .jini-chat-pane .jini-composer-discovery { display: inline-flex; }
503
+ .jini-chat-pane .jini-composer-discovery-menu,
504
+ .jini-chat-pane .jini-composer-slash-menu {
505
+ position: absolute;
506
+ z-index: 8;
507
+ display: flex;
508
+ flex-direction: column;
509
+ gap: 4px;
510
+ max-height: 280px;
511
+ overflow-y: auto;
512
+ padding: 8px;
513
+ color: var(--jini-chat-text);
514
+ background: var(--jini-chat-panel);
515
+ border: 1px solid var(--jini-chat-border);
516
+ border-radius: 10px;
517
+ box-shadow: 0 12px 30px rgb(0 0 0 / 14%);
518
+ }
519
+ /* Both anchor off '.jini-composer' ('bottom: calc(100% + 6px)' = fully above the textarea AND the
520
+ footer, not just above the trigger button) so the popover floats as a clean detached card instead
521
+ of overlapping the input it sits next to. */
522
+ .jini-chat-pane .jini-composer-discovery-menu {
523
+ inset-inline-start: 8px;
524
+ bottom: calc(100% + 6px);
525
+ width: min(280px, calc(100vw - 32px));
526
+ }
527
+ .jini-chat-pane .jini-composer-slash-menu {
528
+ inset-inline: 8px;
529
+ bottom: calc(100% + 6px);
530
+ }
531
+ .jini-chat-pane .jini-composer-discovery-group { display: flex; flex-direction: column; gap: 2px; }
532
+ .jini-chat-pane .jini-composer-discovery-group-label {
533
+ padding: 6px 8px 2px;
534
+ color: var(--jini-chat-faint);
535
+ font-size: 10px;
536
+ font-weight: 700;
537
+ letter-spacing: .08em;
538
+ text-transform: uppercase;
539
+ }
540
+ .jini-chat-pane .jini-composer-discovery-item {
541
+ display: flex;
542
+ flex-direction: column;
543
+ align-items: flex-start;
544
+ gap: 2px;
545
+ width: 100%;
546
+ padding: 7px 8px;
547
+ color: inherit;
548
+ text-align: start;
549
+ background: transparent;
550
+ border: 0;
551
+ border-radius: 7px;
552
+ cursor: pointer;
553
+ }
554
+ .jini-chat-pane .jini-composer-discovery-item:hover {
555
+ background: var(--jini-chat-panel);
556
+ }
557
+ .jini-chat-pane .jini-composer-discovery-item.is-active {
558
+ color: var(--jini-chat-text-strong);
559
+ background: var(--jini-chat-accent-soft);
560
+ outline: 1px solid var(--jini-chat-accent);
561
+ outline-offset: -1px;
562
+ box-shadow: inset 3px 0 0 var(--jini-chat-accent);
563
+ }
564
+ .jini-chat-pane .jini-composer-discovery-item small { color: var(--jini-chat-muted); }
565
+ /* The full description used to print under every row unconditionally, which is why the palette
566
+ grew to dozens of multi-line rows on a bare "/" — kept in the accessibility tree at rest (never
567
+ 'display: none', which most screen readers drop from that tree) so 'aria-describedby' keeps
568
+ resolving whether or not anything is hovering.
569
+ FIXED (was: opacity-only toggle, THEN an absolutely-positioned overlay) — two owner-reported
570
+ bugs in sequence on the same element:
571
+ 1. 'opacity: 0' alone hides a box visually but does not remove it from layout, so an
572
+ absolutely-positioned tooltip sized to its full natural content height (routinely 50-260px
573
+ for a real description) still counted toward its scrolling ancestor's scrollable overflow
574
+ region while invisible ('scrollHeight' measured 501px against a 242px 'clientHeight' for a
575
+ 6-row list), leaving a blank scrollable gap after the last real row. Fixed by collapsing the
576
+ box itself at rest ('max-height: 0; overflow: hidden;'), not just hiding it — carried
577
+ forward below.
578
+ 2. That fix still left this 'position: absolute; top: 100%' of its own row (formerly anchored
579
+ via 'position: relative' on '.jini-composer-discovery-item' above, now removed — nothing
580
+ anchors off it anymore): 'z-index' only controls paint order, not which box a box is
581
+ confined to, so on hover/focus the expanded tooltip painted directly over whichever row
582
+ happened to sit below it in the SAME scrollable list (owner report: hovering "UI/UX Design
583
+ (Skill)" covered the "/mcp" entry beneath it — not a stacking-order problem, a containment
584
+ one). Fixed by dropping 'position: absolute' entirely: this is now a normal in-flow child of
585
+ the row's own 'flex-direction: column' box, still collapsed to negligible size at rest via
586
+ 'max-height: 0; overflow: hidden;', but on hover/focus it grows the ROW's own height instead
587
+ of floating a detached box over the next row — the popover's flex column (and every row
588
+ below) gets pushed down to make room, so it can never occlude a sibling item. This also
589
+ retires the panel-styled "floating card" look (background/border/shadow): an in-flow caption
590
+ reads correctly with the row's own muted small-text convention above, and dropping it removes
591
+ the last reason this needed its own stacking context. 'pointer-events: none' is kept for
592
+ parity even though nothing sits under it to protect anymore. */
593
+ .jini-chat-pane .jini-composer-discovery-description {
594
+ width: 100%;
595
+ max-height: 0;
596
+ padding: 0;
597
+ overflow: hidden;
598
+ color: var(--jini-chat-muted);
599
+ font-size: 12px;
600
+ font-weight: 400;
601
+ line-height: 1.4;
602
+ white-space: normal;
603
+ opacity: 0;
604
+ pointer-events: none;
605
+ transition: opacity .12s ease;
606
+ }
607
+ .jini-chat-pane .jini-composer-discovery-item:hover .jini-composer-discovery-description,
608
+ .jini-chat-pane .jini-composer-discovery-item:focus-visible .jini-composer-discovery-description {
609
+ max-height: none;
610
+ padding-top: 2px;
611
+ overflow: visible;
612
+ opacity: 1;
613
+ }
614
+ /* '<code>'/'<small>' both default to the browser's UA styling (monospace at an unrelated size)
615
+ with nothing here overriding it — computed font-SIZE happened to already match the row label
616
+ (13.5px), so the visible mismatch is font-FAMILY: raw monospace next to the label's sans-serif
617
+ stack reads as a different, larger type scale even at equal size. Inheriting the row's own font
618
+ puts both on one consistent scale. */
619
+ .jini-chat-pane .jini-composer-slash-argument,
620
+ .jini-chat-pane .jini-composer-slash-confirm-badge {
621
+ font-family: inherit;
622
+ font-size: inherit;
623
+ font-weight: 400;
624
+ color: var(--jini-chat-muted);
625
+ }
626
+ .jini-chat-pane .jini-composer-file-input {
627
+ position: absolute;
628
+ width: 1px;
629
+ height: 1px;
630
+ overflow: hidden;
631
+ clip: rect(0, 0, 0, 0);
632
+ white-space: nowrap;
633
+ clip-path: inset(50%);
634
+ }
635
+ .jini-chat-pane .jini-composer-attach {
636
+ display: inline-flex;
637
+ align-items: center;
638
+ justify-content: center;
639
+ width: 32px;
640
+ height: 32px;
641
+ padding: 0;
642
+ color: var(--jini-chat-muted);
643
+ background: transparent;
644
+ border: 1px solid transparent;
645
+ border-radius: 8px;
646
+ cursor: pointer;
647
+ }
648
+ .jini-chat-pane .jini-composer-attach:hover:not(:disabled) {
649
+ color: var(--jini-chat-text);
650
+ background: var(--jini-chat-panel);
651
+ border-color: var(--jini-chat-border);
652
+ }
653
+ .jini-chat-pane .jini-composer-attach:disabled { opacity: .45; cursor: default; }
654
+ .jini-composer-spinner,
655
+ .jini-runtime-spinner { animation: jini-chat-spin .8s linear infinite; }
656
+ @keyframes jini-chat-spin { to { transform: rotate(360deg); } }
657
+ .jini-chat-pane .jini-composer-footer-accessories {
658
+ display: flex;
659
+ margin-left: auto;
660
+ min-width: 0;
661
+ }
662
+ .jini-chat-pane .jini-composer-send {
663
+ display: grid;
664
+ place-items: center;
665
+ width: 32px;
666
+ height: 32px;
667
+ padding: 0;
668
+ color: white;
669
+ background: var(--jini-chat-text-strong);
670
+ border: 0;
671
+ border-radius: 8px;
672
+ cursor: pointer;
673
+ }
674
+ .jini-chat-pane .jini-composer-send:disabled {
675
+ color: #aaa59e;
676
+ background: #ece8e2;
677
+ cursor: default;
678
+ }
679
+ .jini-chat-pane__workdir {
680
+ display: flex;
681
+ align-items: center;
682
+ gap: 7px;
683
+ min-width: 0;
684
+ padding: 5px 4px 0;
685
+ color: var(--jini-chat-muted);
686
+ font-size: 13px;
687
+ }
688
+ .jini-chat-pane__workdir code {
689
+ overflow: hidden;
690
+ text-overflow: ellipsis;
691
+ white-space: nowrap;
692
+ }
693
+ .jini-chat-pane .jini-working-dir-picker {
694
+ position: relative;
695
+ display: inline-flex;
696
+ align-items: flex-start;
697
+ }
698
+ .jini-chat-pane .jini-working-dir-trigger-row {
699
+ display: inline-flex;
700
+ align-items: center;
701
+ gap: 2px;
702
+ }
703
+ .jini-chat-pane .jini-working-dir-trigger {
704
+ appearance: none;
705
+ display: inline-flex;
706
+ align-items: center;
707
+ gap: 6px;
708
+ padding: 4px 6px;
709
+ color: var(--jini-chat-muted);
710
+ background: transparent;
711
+ border: 0;
712
+ border-radius: 8px;
713
+ font: inherit;
714
+ font-size: 13px;
715
+ cursor: pointer;
716
+ }
717
+ .jini-chat-pane .jini-working-dir-trigger:hover,
718
+ .jini-chat-pane .jini-working-dir-trigger:focus-visible {
719
+ color: var(--jini-chat-text-strong);
720
+ background: var(--jini-chat-subtle);
721
+ outline: none;
722
+ }
723
+ .jini-chat-pane .jini-working-dir-trigger.invalid { color: var(--danger); }
724
+ .jini-chat-pane .jini-working-dir-trigger-icon { flex: 0 0 auto; opacity: .75; }
725
+ .jini-chat-pane .jini-working-dir-trigger.invalid .jini-working-dir-trigger-icon {
726
+ color: var(--danger);
727
+ opacity: 1;
728
+ }
729
+ .jini-chat-pane .jini-working-dir-trigger-label {
730
+ max-width: 240px;
731
+ overflow: hidden;
732
+ text-overflow: ellipsis;
733
+ white-space: nowrap;
734
+ }
735
+ .jini-chat-pane .jini-working-dir-trigger-chevron { flex: 0 0 auto; opacity: .55; }
736
+ .jini-chat-pane .jini-working-dir-panel,
737
+ .jini-chat-pane .jini-working-dir-flyout {
738
+ position: absolute;
739
+ z-index: 90;
740
+ display: flex;
741
+ flex-direction: column;
742
+ min-width: 210px;
743
+ padding: 5px;
744
+ background: var(--jini-chat-panel);
745
+ border: 1px solid var(--jini-chat-border-strong);
746
+ border-radius: 12px;
747
+ box-shadow: 0 1px 2px rgba(0, 0, 0, .04), 0 10px 28px -10px rgba(0, 0, 0, .18);
748
+ }
749
+ .jini-chat-pane .jini-working-dir-panel {
750
+ top: calc(100% + 6px);
751
+ left: 0;
752
+ }
753
+ .jini-chat-pane .jini-working-dir-panel.up {
754
+ top: auto;
755
+ bottom: calc(100% + 6px);
756
+ }
757
+ .jini-chat-pane .jini-working-dir-item {
758
+ appearance: none;
759
+ display: flex;
760
+ align-items: center;
761
+ gap: 9px;
762
+ width: 100%;
763
+ min-height: 32px;
764
+ padding: 0 9px;
765
+ color: var(--jini-chat-text-strong);
766
+ background: transparent;
767
+ border: 0;
768
+ border-radius: 8px;
769
+ font: inherit;
770
+ font-size: 13px;
771
+ text-align: left;
772
+ cursor: pointer;
773
+ }
774
+ .jini-chat-pane .jini-working-dir-item:hover,
775
+ .jini-chat-pane .jini-working-dir-item:focus-visible,
776
+ .jini-chat-pane .jini-working-dir-recent-item:hover,
777
+ .jini-chat-pane .jini-working-dir-recent-item:focus-visible {
778
+ background: var(--jini-chat-subtle);
779
+ outline: none;
780
+ }
781
+ .jini-chat-pane .jini-working-dir-item-icon { flex: 0 0 auto; opacity: .8; }
782
+ .jini-chat-pane .jini-working-dir-item > span {
783
+ flex: 1 1 auto;
784
+ min-width: 0;
785
+ overflow: hidden;
786
+ text-overflow: ellipsis;
787
+ white-space: nowrap;
788
+ }
789
+ .jini-chat-pane .jini-working-dir-item-chevron { margin-left: auto; opacity: .55; }
790
+ .jini-chat-pane .jini-working-dir-submenu-row { position: relative; }
791
+ .jini-chat-pane .jini-working-dir-flyout {
792
+ top: -5px;
793
+ left: 100%;
794
+ z-index: 91;
795
+ min-width: 220px;
796
+ max-width: 320px;
797
+ margin-left: 4px;
798
+ }
799
+ .jini-chat-pane .jini-working-dir-flyout.up { top: auto; bottom: -5px; }
800
+ .jini-chat-pane .jini-working-dir-flyout::before {
801
+ position: absolute;
802
+ top: 0;
803
+ left: -8px;
804
+ width: 8px;
805
+ height: 100%;
806
+ content: "";
807
+ }
808
+ .jini-chat-pane .jini-working-dir-recent-item {
809
+ appearance: none;
810
+ display: grid;
811
+ grid-template-rows: auto auto;
812
+ grid-template-columns: auto 1fr;
813
+ align-items: center;
814
+ width: 100%;
815
+ min-height: 36px;
816
+ padding: 4px 9px;
817
+ color: var(--jini-chat-text-strong);
818
+ background: transparent;
819
+ border: 0;
820
+ border-radius: 8px;
821
+ font: inherit;
822
+ text-align: left;
823
+ cursor: pointer;
824
+ column-gap: 9px;
825
+ }
826
+ .jini-chat-pane .jini-working-dir-recent-item .jini-working-dir-item-icon {
827
+ grid-row: 1 / span 2;
828
+ }
829
+ .jini-chat-pane .jini-working-dir-recent-name,
830
+ .jini-chat-pane .jini-working-dir-recent-path {
831
+ grid-column: 2;
832
+ overflow: hidden;
833
+ text-overflow: ellipsis;
834
+ white-space: nowrap;
835
+ }
836
+ .jini-chat-pane .jini-working-dir-recent-name { font-size: 13px; }
837
+ .jini-chat-pane .jini-working-dir-recent-path {
838
+ color: var(--jini-chat-muted);
839
+ font-size: 11px;
840
+ opacity: .7;
841
+ }
842
+ .jini-chat-pane .jini-working-dir-empty {
843
+ padding: 8px 10px;
844
+ color: var(--jini-chat-muted);
845
+ font-size: 12px;
846
+ white-space: nowrap;
847
+ opacity: .7;
848
+ }
849
+ .jini-runtime-picker { position: relative; }
850
+ .jini-runtime-trigger {
851
+ display: inline-grid;
852
+ grid-template-columns: 24px 14px;
853
+ align-items: center;
854
+ gap: 7px;
855
+ height: 32px;
856
+ min-width: 0;
857
+ padding: 3px 7px 3px 5px;
858
+ color: var(--jini-chat-text);
859
+ background: transparent;
860
+ border: 0;
861
+ border-radius: 8px;
862
+ cursor: pointer;
863
+ }
864
+ .jini-runtime-trigger:hover { background: var(--jini-chat-subtle); }
865
+ .jini-runtime-trigger__copy { display: none; }
866
+ .jini-runtime-trigger__copy strong {
867
+ overflow: hidden;
868
+ max-width: 122px;
869
+ font-size: 11px;
870
+ font-weight: 650;
871
+ text-overflow: ellipsis;
872
+ white-space: nowrap;
873
+ }
874
+ .jini-runtime-trigger__copy small {
875
+ overflow: hidden;
876
+ max-width: 122px;
877
+ color: var(--jini-chat-muted);
878
+ font-size: 9px;
879
+ text-overflow: ellipsis;
880
+ white-space: nowrap;
881
+ }
882
+ .jini-runtime-trigger__chevron { color: var(--jini-chat-muted); font-size: 12px; }
883
+ .jini-runtime-agent-icon.agent-icon { flex: 0 0 auto; object-fit: contain; }
884
+ .jini-runtime-agent-icon.agent-icon-mono {
885
+ display: inline-block;
886
+ background-color: currentColor;
887
+ -webkit-mask-repeat: no-repeat;
888
+ mask-repeat: no-repeat;
889
+ -webkit-mask-position: center;
890
+ mask-position: center;
891
+ -webkit-mask-size: contain;
892
+ mask-size: contain;
893
+ }
894
+ .jini-runtime-agent-icon.agent-icon-fallback {
895
+ display: inline-flex;
896
+ align-items: center;
897
+ justify-content: center;
898
+ color: #74716b;
899
+ background: #f4f5f7;
900
+ border: 1px solid #e1e5eb;
901
+ border-radius: 6px;
902
+ font-weight: 700;
903
+ }
904
+ .jini-runtime-popover {
905
+ --jini-chat-panel: #fdfcfa;
906
+ --jini-chat-text: #1a1916;
907
+ --jini-chat-text-strong: #0d0c0a;
908
+ --jini-chat-muted: #74716b;
909
+ --jini-chat-faint: #b3b0a8;
910
+ --jini-chat-border: #e1e5eb;
911
+ --jini-chat-border-soft: #edf0f4;
912
+ --jini-chat-subtle: #f4f5f7;
913
+ box-sizing: border-box;
914
+ padding: 8px;
915
+ color: var(--jini-chat-text);
916
+ background: var(--jini-chat-panel);
917
+ border: 1px solid var(--jini-chat-border);
918
+ border-radius: 12px;
919
+ box-shadow: 0 18px 46px rgba(13, 12, 10, .15), 0 2px 8px rgba(13, 12, 10, .06);
920
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Microsoft YaHei UI", "Noto Sans", Roboto, "Helvetica Neue", Arial, sans-serif;
921
+ font-size: 13.5px;
922
+ line-height: 1.5;
923
+ -webkit-font-smoothing: antialiased;
924
+ }
925
+ .jini-runtime-popover__head {
926
+ display: flex;
927
+ flex-direction: column;
928
+ gap: 3px;
929
+ padding: 10px 12px 12px;
930
+ border-bottom: 1px solid var(--jini-chat-border-soft);
931
+ }
932
+ .jini-runtime-popover__head strong { color: var(--jini-chat-text-strong); font-size: 14px; font-weight: 650; }
933
+ .jini-runtime-popover__head span { color: var(--jini-chat-muted); font-size: 12px; }
934
+ .jini-runtime-mode,
935
+ .jini-runtime-agent,
936
+ .jini-runtime-rescan {
937
+ display: flex;
938
+ align-items: center;
939
+ gap: 11px;
940
+ box-sizing: border-box;
941
+ width: 100%;
942
+ min-height: 40px;
943
+ padding: 8px 11px;
944
+ color: var(--jini-chat-text);
945
+ background: transparent;
946
+ border: 0;
947
+ border-radius: 8px;
948
+ text-align: left;
949
+ cursor: pointer;
950
+ }
951
+ .jini-runtime-mode:hover,
952
+ .jini-runtime-agent:hover:not(:disabled),
953
+ .jini-runtime-rescan:hover:not(:disabled) { background: var(--jini-chat-subtle); }
954
+ .jini-runtime-mode.is-active { font-weight: 650; }
955
+ .jini-runtime-mode:disabled,
956
+ .jini-runtime-agent:disabled,
957
+ .jini-runtime-rescan:disabled { color: var(--jini-chat-faint); cursor: default; }
958
+ .jini-runtime-mode__meta,
959
+ .jini-runtime-agent__status {
960
+ margin-left: auto;
961
+ color: var(--jini-chat-muted);
962
+ font-size: 12px;
963
+ white-space: nowrap;
964
+ }
965
+ .jini-runtime-check { flex: 0 0 auto; color: var(--jini-chat-text); }
966
+ .jini-runtime-section-label {
967
+ padding: 12px 11px 5px;
968
+ color: var(--jini-chat-faint);
969
+ font-size: 11px;
970
+ font-weight: 650;
971
+ letter-spacing: .08em;
972
+ text-transform: uppercase;
973
+ }
974
+ .jini-runtime-agent.is-active { background: transparent; }
975
+ .jini-runtime-agent__copy {
976
+ display: flex;
977
+ flex: 1;
978
+ flex-direction: column;
979
+ min-width: 0;
980
+ }
981
+ .jini-runtime-agent__copy strong { font-size: 13.5px; font-weight: 500; }
982
+ .jini-runtime-agent__copy small {
983
+ overflow: hidden;
984
+ color: #8b857e;
985
+ font-size: 10px;
986
+ text-overflow: ellipsis;
987
+ white-space: nowrap;
988
+ }
989
+ .jini-runtime-empty { padding: 10px 11px; color: var(--jini-chat-muted); font-size: 12px; }
990
+ .jini-runtime-models {
991
+ display: flex;
992
+ flex-direction: column;
993
+ gap: 9px;
994
+ margin-top: 5px;
995
+ padding: 10px 11px 8px;
996
+ border-top: 1px dashed var(--jini-chat-border);
997
+ }
998
+ .jini-runtime-select {
999
+ display: flex;
1000
+ flex-direction: column;
1001
+ gap: 5px;
1002
+ color: var(--jini-chat-muted);
1003
+ font-size: 13px;
1004
+ }
1005
+ .jini-runtime-select select {
1006
+ box-sizing: border-box;
1007
+ width: 100%;
1008
+ min-height: 40px;
1009
+ padding: 7px 10px;
1010
+ color: var(--jini-chat-text);
1011
+ background: var(--jini-chat-panel);
1012
+ border: 1px solid var(--jini-chat-border);
1013
+ border-radius: 8px;
1014
+ }
1015
+ /*
1016
+ * The BYOK model, rendered as a value rather than a control — see RuntimeByokDetails for why it
1017
+ * is not a disabled select. It occupies the same box the sibling selects do so the row still
1018
+ * reads as part of the same list, but carries no border: a bordered box with no affordance is
1019
+ * exactly the "looks editable, isn't" shape the plain text exists to avoid.
1020
+ */
1021
+ /*
1022
+ * The BYOK model list, which CustomSelect portals to document.body. runtimePopoverPosition puts
1023
+ * the runtime popover at z-index 1000; the shared .jini-select-menu default is 60, which is right
1024
+ * everywhere else and puts this menu behind the very popover that opened it. One above the
1025
+ * popover, not far above: it must clear its own surface and nothing else.
1026
+ */
1027
+ .jini-select-menu.jini-runtime-model-menu {
1028
+ z-index: 1001;
1029
+ }
1030
+ .jini-runtime-byok-model strong {
1031
+ box-sizing: border-box;
1032
+ display: flex;
1033
+ align-items: center;
1034
+ min-height: 40px;
1035
+ padding: 7px 10px;
1036
+ color: var(--jini-chat-text);
1037
+ font-weight: 600;
1038
+ word-break: break-all;
1039
+ }
1040
+ /*
1041
+ * Tool-call cards (ToolCard.tsx) and the per-turn usage summary (MessageRow.tsx) ship no CSS of
1042
+ * their own — see this file's own header note on why the package supplies a default theme at all.
1043
+ * Collapsed by default (.op-card-head is the only always-visible part), so a run with a dozen tool
1044
+ * calls reads as a dozen one-line rows, not a page of raw JSON.
1045
+ */
1046
+ .jini-chat-pane .jini-message-tools {
1047
+ display: flex;
1048
+ flex-direction: column;
1049
+ gap: 6px;
1050
+ width: 100%;
1051
+ }
1052
+ .jini-chat-pane .op-card {
1053
+ border: 1px solid var(--jini-chat-border);
1054
+ border-radius: var(--radius);
1055
+ background: var(--jini-chat-subtle);
1056
+ overflow: hidden;
1057
+ font-size: 13px;
1058
+ }
1059
+ .jini-chat-pane .op-card-head {
1060
+ display: flex;
1061
+ align-items: center;
1062
+ gap: 8px;
1063
+ width: 100%;
1064
+ padding: 7px 10px;
1065
+ background: none;
1066
+ border: 0;
1067
+ font: inherit;
1068
+ text-align: left;
1069
+ cursor: pointer;
1070
+ color: inherit;
1071
+ }
1072
+ .jini-chat-pane .op-status { display: inline-flex; flex-shrink: 0; }
1073
+ .jini-chat-pane .op-status-ok { color: #4e875f; }
1074
+ .jini-chat-pane .op-status-error { color: var(--danger); }
1075
+ .jini-chat-pane .op-status-running { color: var(--jini-chat-accent); }
1076
+ .jini-chat-pane .op-title { font-weight: 600; flex-shrink: 0; }
1077
+ .jini-chat-pane .shimmer-text { opacity: .6; }
1078
+ .jini-chat-pane .op-meta {
1079
+ color: var(--jini-chat-muted);
1080
+ overflow: hidden;
1081
+ text-overflow: ellipsis;
1082
+ white-space: nowrap;
1083
+ flex: 1;
1084
+ min-width: 0;
1085
+ }
1086
+ .jini-chat-pane .op-expand-chev { flex-shrink: 0; color: var(--jini-chat-faint); }
1087
+ /* Collapsed by default: 0 max-height clips the inner content, no display:none — keeps the height
1088
+ transition instead of an instant jump cut. */
1089
+ .jini-chat-pane .accordion-collapsible { max-height: 0; overflow: hidden; transition: max-height .15s ease; }
1090
+ .jini-chat-pane .accordion-collapsible.open { max-height: 480px; overflow-y: auto; }
1091
+ .jini-chat-pane .accordion-collapsible-inner { padding: 0 10px 10px; }
1092
+ .jini-chat-pane .op-card-detail { display: flex; flex-direction: column; gap: 6px; }
1093
+ .jini-chat-pane .op-path,
1094
+ .jini-chat-pane .op-command,
1095
+ .jini-chat-pane .op-output {
1096
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
1097
+ font-size: 12px;
1098
+ background: var(--jini-chat-panel);
1099
+ border: 1px solid var(--jini-chat-border);
1100
+ border-radius: 6px;
1101
+ padding: 6px 8px;
1102
+ margin: 0;
1103
+ white-space: pre-wrap;
1104
+ word-break: break-word;
1105
+ }
1106
+ .jini-chat-pane .op-open {
1107
+ border: 1px solid var(--jini-chat-border-strong);
1108
+ border-radius: 6px;
1109
+ background: var(--jini-chat-panel);
1110
+ padding: 2px 8px;
1111
+ font-size: 11px;
1112
+ cursor: pointer;
1113
+ }
1114
+ /* The "Done · 6m 29s · 2612 out · $0.4028" line — real numbers from the run's own kind:'usage' event. */
1115
+ .jini-chat-pane .jini-message-usage {
1116
+ display: flex;
1117
+ align-items: center;
1118
+ gap: 6px;
1119
+ font-size: 11px;
1120
+ color: var(--jini-chat-muted);
1121
+ margin-top: 2px;
1122
+ }
1123
+ .jini-chat-pane .jini-message-usage-dot { font-size: 8px; color: #4e875f; }
1124
+ /*
1125
+ * Fenced code block ('Markdown.tsx''s 'renderBlock' case 'code') and inline 'code' span visual
1126
+ * treatment — previously entirely unstyled (bare UA-default '<pre><code>', no background, border,
1127
+ * or padding; a downstream admin host's own stylesheet already flagged this gap in a note next to
1128
+ * its unrelated horizontal-scroll fix for the same element). Lives HERE, in the package's own
1129
+ * injected default theme, rather than in a host's stylesheet: a host CAN already remap the exact
1130
+ * '--jini-chat-*' custom properties this rule reads (one such host's '.admin-chat-dock .jini-chat-
1131
+ * pane' block already does, for every other rule in this file), so putting the fix here makes every
1132
+ * Jini host look correct by default AND lets a host match its own palette for free, with no new
1133
+ * host-side override rule needed at all — the reverse (host-only CSS) would leave every other
1134
+ * embedder of '@jini-ai/chat' with the same unstyled '<pre>' this fix exists to correct.
1135
+ * 'max-width'/'overflow-x' here duplicate (harmlessly) a narrower fix that same host's own
1136
+ * '.jini-message-content pre' rule already carries for its own fixed-width dock specifically — this
1137
+ * package cannot assume every host has that rule, so a real host-agnostic default belongs here too.
1138
+ * NOTE: this comment avoids backtick quoting on purpose — this whole stylesheet lives inside a JS
1139
+ * template literal, so a literal backtick here would terminate the string, not just this comment.
1140
+ */
1141
+ .jini-chat-pane .jini-message-content pre {
1142
+ margin: 6px 0;
1143
+ max-width: 100%;
1144
+ overflow-x: auto;
1145
+ padding: 10px 12px;
1146
+ background: var(--jini-chat-subtle);
1147
+ border: 1px solid var(--jini-chat-border);
1148
+ border-radius: 8px;
1149
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
1150
+ font-size: 12.5px;
1151
+ line-height: 1.5;
1152
+ }
1153
+ .jini-chat-pane .jini-message-content pre code {
1154
+ padding: 0;
1155
+ background: none;
1156
+ border: 0;
1157
+ color: inherit;
1158
+ font: inherit;
1159
+ }
1160
+ .jini-chat-pane .jini-message-content :not(pre) > code {
1161
+ padding: .15em .4em;
1162
+ background: var(--jini-chat-subtle);
1163
+ border: 1px solid var(--jini-chat-border);
1164
+ border-radius: 4px;
1165
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
1166
+ font-size: .9em;
1167
+ }
1168
+ /*
1169
+ * Copy affordance for a fenced code block ('Markdown.tsx''s 'CodeBlock'/'CopyCodeButton'). The
1170
+ * button lives in its own toolbar row fused to the TOP of the '<pre>' below, not overlaid on top
1171
+ * of the code itself — an overlay would sit over whatever text happens to render at that corner,
1172
+ * and '<pre>' already carries its own horizontal scrollbar along its own bottom edge, so a row
1173
+ * above it can never collide with that scrollbar either. '.jini-md-code-block' takes over the
1174
+ * '<pre>' rule's own top/bottom margin above so the two don't stack, and the toolbar/pre pair
1175
+ * share one rounded box (toolbar keeps the top corners, '<pre>' below loses them) instead of two
1176
+ * separately-bordered boxes stacked on each other.
1177
+ */
1178
+ .jini-chat-pane .jini-message-content .jini-md-code-block {
1179
+ margin: 6px 0;
1180
+ }
1181
+ .jini-chat-pane .jini-message-content .jini-md-code-block pre {
1182
+ margin: 0;
1183
+ border-top: 0;
1184
+ border-top-left-radius: 0;
1185
+ border-top-right-radius: 0;
1186
+ }
1187
+ .jini-chat-pane .jini-md-code-toolbar {
1188
+ display: flex;
1189
+ justify-content: flex-end;
1190
+ padding: 3px;
1191
+ background: var(--jini-chat-subtle);
1192
+ border: 1px solid var(--jini-chat-border);
1193
+ border-bottom: 0;
1194
+ border-radius: 8px 8px 0 0;
1195
+ }
1196
+ .jini-chat-pane .jini-md-code-copy {
1197
+ display: inline-flex;
1198
+ align-items: center;
1199
+ justify-content: center;
1200
+ width: 22px;
1201
+ height: 22px;
1202
+ padding: 0;
1203
+ color: var(--jini-chat-faint);
1204
+ background: none;
1205
+ border: 0;
1206
+ border-radius: 6px;
1207
+ cursor: pointer;
1208
+ }
1209
+ .jini-chat-pane .jini-md-code-copy:hover { color: var(--jini-chat-muted); background: var(--jini-chat-border); }
1210
+ .jini-chat-pane .jini-md-code-copy:focus-visible { outline: 2px solid var(--jini-chat-accent); outline-offset: 1px; }
1211
+ /* Visually hidden but present in the DOM (never display:none) so this polite live region still
1212
+ gets announced — same clip-rect technique 'jini-message-copy-status' above already uses. */
1213
+ .jini-chat-pane .jini-md-code-copy-status {
1214
+ position: absolute;
1215
+ width: 1px;
1216
+ height: 1px;
1217
+ overflow: hidden;
1218
+ clip: rect(0, 0, 0, 0);
1219
+ white-space: nowrap;
1220
+ }
1221
+ /*
1222
+ * GFM pipe tables ('Markdown.tsx''s 'TableBlock') — same reasoning as the code-block rules directly
1223
+ * above for living in the package's own default theme rather than a host stylesheet. '.jini-md-
1224
+ * table-wrap' gets its own horizontal scrollbar so a wide table scrolls internally instead of
1225
+ * dragging '.jini-message-list' sideways with it (the exact failure mode that same downstream host's
1226
+ * stylesheet documents for the code-block case — the same fix shape applies here). The "Expand
1227
+ * table" button only renders ('TableBlock''s own logic) once the table has genuinely overflowed
1228
+ * that wrap.
1229
+ */
1230
+ .jini-md-table-wrap {
1231
+ max-width: 100%;
1232
+ overflow-x: auto;
1233
+ }
1234
+ .jini-md-table {
1235
+ border-collapse: collapse;
1236
+ font-size: 12.5px;
1237
+ }
1238
+ /*
1239
+ * 'min-width' here, not on '.jini-md-table' itself, and picked per column rather than as one flat
1240
+ * table-wide number -- a flat table minimum sized for a typical 2-column table would leave a
1241
+ * 5-column table crushed just as badly as before (same failure this comment's neighbor above
1242
+ * describes), while one sized for 5 columns would force pointless overflow on a simple 2-column
1243
+ * table. Per-cell 'min-width' scales the effective table floor with the real column count instead.
1244
+ * 130px was picked empirically, not guessed: measured (real Chromium, not jsdom -- 'scrollWidth'/
1245
+ * 'clientWidth' are unimplemented there) against this package's narrowest known real host, an
1246
+ * admin chat dock fixed at 380px wide ('admin-chat-dock' in that host's own stylesheet), which
1247
+ * nets out to roughly 238px of usable width once that dock's own message-list padding, the 80%
1248
+ * message-bubble cap, and this content's own padding are all applied. Below 120px per column the
1249
+ * table still fits inside those 238px and never overflows -- the exact bug this fix exists to
1250
+ * correct. 130px was chosen just above that measured 120px crossover (a small margin so it clears
1251
+ * reliably rather than sitting exactly on the boundary) and reads as a genuinely defensible per-
1252
+ * column floor on its own terms too: with this rule's own 6px/10px cell padding subtracted, it
1253
+ * leaves about 110px of text room, roughly 14-16 characters per wrapped line at this rule's 12.5px
1254
+ * font -- enough that a table cell wraps in short phrases instead of one word per line, which is
1255
+ * the readability floor this fix is actually chasing. One real consequence, verified rather than
1256
+ * hand-waved: at this width, ANY 2-column table in that narrow dock now overflows and gets the
1257
+ * "Expand table" affordance, including ones with short cell content -- there is no per-cell
1258
+ * min-width value that can overflow a long-prose 2-column table without also overflowing a short
1259
+ * one at the same column count, because the browser's own auto-layout table-width algorithm sizes
1260
+ * the table to the greater of its container's width and the sum of each column's own minimum --
1261
+ * content length past that minimum only changes how much a column wraps internally, never whether
1262
+ * the table exceeds its wrap. Accepted here: in a surface already this narrow, showing "Expand
1263
+ * table" a little more eagerly is the better failure mode than silently crushing a table's own
1264
+ * content illegibly, which is the state this whole rule exists to fix.
1265
+ */
1266
+ .jini-md-table th,
1267
+ .jini-md-table td {
1268
+ padding: 6px 10px;
1269
+ min-width: 130px;
1270
+ border: 1px solid var(--jini-chat-border);
1271
+ text-align: left;
1272
+ }
1273
+ .jini-md-table th {
1274
+ background: var(--jini-chat-subtle);
1275
+ color: var(--jini-chat-text-strong);
1276
+ font-weight: 650;
1277
+ }
1278
+ .jini-md-table-expand {
1279
+ margin-top: 4px;
1280
+ padding: 4px 10px;
1281
+ color: var(--jini-chat-muted);
1282
+ background: var(--jini-chat-panel);
1283
+ border: 1px solid var(--jini-chat-border);
1284
+ border-radius: 999px;
1285
+ font-size: 11px;
1286
+ cursor: pointer;
1287
+ }
1288
+ .jini-md-table-expand:hover { color: var(--jini-chat-text-strong); }
1289
+ .jini-md-table-modal {
1290
+ max-width: min(90vw, 900px);
1291
+ max-height: 80vh;
1292
+ overflow: auto;
1293
+ padding: 20px;
1294
+ color: var(--jini-chat-text);
1295
+ background: var(--jini-chat-panel);
1296
+ border: 1px solid var(--jini-chat-border);
1297
+ border-radius: 12px;
1298
+ box-shadow: 0 18px 46px rgba(13, 12, 10, .15), 0 2px 8px rgba(13, 12, 10, .06);
1299
+ }
1300
+ .jini-md-table-modal::backdrop {
1301
+ background: rgba(0, 0, 0, .4);
1302
+ }
1303
+ .jini-md-table-modal-close {
1304
+ position: absolute;
1305
+ top: 10px;
1306
+ right: 10px;
1307
+ width: 28px;
1308
+ height: 28px;
1309
+ color: var(--jini-chat-muted);
1310
+ background: transparent;
1311
+ border: 0;
1312
+ border-radius: 6px;
1313
+ font-size: 16px;
1314
+ line-height: 1;
1315
+ cursor: pointer;
1316
+ }
1317
+ .jini-md-table-modal-close:hover {
1318
+ color: var(--jini-chat-text-strong);
1319
+ background: var(--jini-chat-subtle);
1320
+ }
1321
+ @media (max-width: 560px) {
1322
+ .jini-chat-pane__header { padding-inline: 16px; }
1323
+ .jini-chat-pane .jini-message-list { padding-inline: 16px; }
1324
+ .jini-chat-pane__controls { padding-inline: 10px; }
1325
+ }
1326
+ `;
1327
+ //# sourceMappingURL=styles.js.map