@dxos/plugin-automation 0.7.5-labs.5f04cf6 → 0.7.5-labs.8a82073

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 (289) hide show
  1. package/dist/lib/browser/AutomationPanel-CL2TWZT5.mjs +8 -0
  2. package/dist/lib/browser/AutomationPanel-CL2TWZT5.mjs.map +7 -0
  3. package/dist/lib/browser/ChatContainer-EJ3IWL7Y.mjs +12 -0
  4. package/dist/lib/browser/ChatContainer-EJ3IWL7Y.mjs.map +7 -0
  5. package/dist/lib/browser/{ai-client-6CRYUC6D.mjs → ai-client-UJLNYP7B.mjs} +4 -4
  6. package/dist/lib/browser/{ai-client-6CRYUC6D.mjs.map → ai-client-UJLNYP7B.mjs.map} +3 -3
  7. package/dist/lib/browser/{app-graph-builder-IJTTULDP.mjs → app-graph-builder-3H5TCRG4.mjs} +33 -2
  8. package/dist/lib/browser/{app-graph-builder-IJTTULDP.mjs.map → app-graph-builder-3H5TCRG4.mjs.map} +3 -3
  9. package/dist/lib/browser/chunk-43WRHV2L.mjs +150 -0
  10. package/dist/lib/browser/chunk-43WRHV2L.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-EKJVAFT2.mjs → chunk-4M74P6YW.mjs} +66 -8
  12. package/dist/lib/browser/{chunk-EKJVAFT2.mjs.map → chunk-4M74P6YW.mjs.map} +4 -4
  13. package/dist/lib/browser/chunk-6KJRL5KV.mjs +243 -0
  14. package/dist/lib/browser/chunk-6KJRL5KV.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-HZ4TA7HY.mjs → chunk-BQHXJZ4K.mjs} +2 -2
  16. package/dist/lib/browser/{chunk-HKX3D3ZP.mjs → chunk-DQ7ZSYJJ.mjs} +2 -2
  17. package/dist/lib/browser/{chunk-HKX3D3ZP.mjs.map → chunk-DQ7ZSYJJ.mjs.map} +2 -2
  18. package/dist/lib/browser/chunk-N4SSCQ7P.mjs +1602 -0
  19. package/dist/lib/browser/chunk-N4SSCQ7P.mjs.map +7 -0
  20. package/dist/lib/browser/index.mjs +52 -45
  21. package/dist/lib/browser/index.mjs.map +3 -3
  22. package/dist/lib/browser/intent-resolver-5YVZJFS3.mjs +29 -0
  23. package/dist/lib/browser/intent-resolver-5YVZJFS3.mjs.map +7 -0
  24. package/dist/lib/browser/meta.json +1 -1
  25. package/dist/lib/browser/{react-surface-IGMBLSV7.mjs → react-surface-RRTZFTKR.mjs} +24 -23
  26. package/dist/lib/browser/react-surface-RRTZFTKR.mjs.map +7 -0
  27. package/dist/lib/browser/types/index.mjs +10 -4
  28. package/dist/lib/node/AutomationPanel-BCEY3YXO.cjs +26 -0
  29. package/dist/lib/node/AutomationPanel-BCEY3YXO.cjs.map +7 -0
  30. package/dist/lib/node/ChatContainer-QUWFEBTI.cjs +33 -0
  31. package/dist/lib/node/ChatContainer-QUWFEBTI.cjs.map +7 -0
  32. package/dist/lib/node/{ai-client-A3RRU55B.cjs → ai-client-AOB6TLNW.cjs} +8 -8
  33. package/dist/lib/node/{ai-client-A3RRU55B.cjs.map → ai-client-AOB6TLNW.cjs.map} +3 -3
  34. package/dist/lib/node/{app-graph-builder-MF5M4QRS.cjs → app-graph-builder-CDEQJEHY.cjs} +43 -12
  35. package/dist/lib/node/{app-graph-builder-MF5M4QRS.cjs.map → app-graph-builder-CDEQJEHY.cjs.map} +3 -3
  36. package/dist/lib/node/{chunk-ZS5RZ7RM.cjs → chunk-AWZVJZ2I.cjs} +6 -6
  37. package/dist/lib/node/chunk-DKGNORZK.cjs +1586 -0
  38. package/dist/lib/node/chunk-DKGNORZK.cjs.map +7 -0
  39. package/dist/lib/node/{chunk-BUQOZA4N.cjs → chunk-H3RSMGJG.cjs} +87 -11
  40. package/dist/lib/node/chunk-H3RSMGJG.cjs.map +7 -0
  41. package/dist/lib/node/{AutomationPanel-RXJDVLCF.cjs → chunk-IPCNJYQL.cjs} +123 -9
  42. package/dist/lib/node/chunk-IPCNJYQL.cjs.map +7 -0
  43. package/dist/lib/node/{chunk-VEGLN4YN.cjs → chunk-LC6KNDPQ.cjs} +78 -26
  44. package/dist/lib/node/chunk-LC6KNDPQ.cjs.map +7 -0
  45. package/dist/lib/node/{chunk-5VF5JKUN.cjs → chunk-TQEDPRY5.cjs} +5 -5
  46. package/dist/lib/node/{chunk-5VF5JKUN.cjs.map → chunk-TQEDPRY5.cjs.map} +2 -2
  47. package/dist/lib/node/index.cjs +96 -88
  48. package/dist/lib/node/index.cjs.map +3 -3
  49. package/dist/lib/node/{intent-resolver-TBHYXBDI.cjs → intent-resolver-MJFZT5IU.cjs} +20 -15
  50. package/dist/lib/node/intent-resolver-MJFZT5IU.cjs.map +7 -0
  51. package/dist/lib/node/meta.json +1 -1
  52. package/dist/lib/node/{react-surface-BVUZMKYS.cjs → react-surface-BVZ63QP4.cjs} +25 -24
  53. package/dist/lib/node/react-surface-BVZ63QP4.cjs.map +7 -0
  54. package/dist/lib/node/types/index.cjs +15 -9
  55. package/dist/lib/node/types/index.cjs.map +2 -2
  56. package/dist/lib/node-esm/AutomationPanel-YTIZ74RI.mjs +9 -0
  57. package/dist/lib/node-esm/AutomationPanel-YTIZ74RI.mjs.map +7 -0
  58. package/dist/lib/node-esm/ChatContainer-QSMDZRDU.mjs +13 -0
  59. package/dist/lib/node-esm/ChatContainer-QSMDZRDU.mjs.map +7 -0
  60. package/dist/lib/node-esm/{ai-client-2GBZRHBA.mjs → ai-client-RUCCJ7JZ.mjs} +4 -4
  61. package/dist/lib/node-esm/{ai-client-2GBZRHBA.mjs.map → ai-client-RUCCJ7JZ.mjs.map} +3 -3
  62. package/dist/lib/node-esm/{app-graph-builder-5N7OK23B.mjs → app-graph-builder-GR3URVNX.mjs} +33 -2
  63. package/dist/lib/node-esm/{app-graph-builder-5N7OK23B.mjs.map → app-graph-builder-GR3URVNX.mjs.map} +3 -3
  64. package/dist/lib/node-esm/chunk-7JO77AAS.mjs +151 -0
  65. package/dist/lib/node-esm/chunk-7JO77AAS.mjs.map +7 -0
  66. package/dist/lib/node-esm/{chunk-5QUXIXNB.mjs → chunk-CQPQXIJP.mjs} +66 -8
  67. package/dist/lib/node-esm/{chunk-5QUXIXNB.mjs.map → chunk-CQPQXIJP.mjs.map} +4 -4
  68. package/dist/lib/node-esm/chunk-CZXU4CFK.mjs +244 -0
  69. package/dist/lib/node-esm/chunk-CZXU4CFK.mjs.map +7 -0
  70. package/dist/lib/node-esm/chunk-D7RARVTS.mjs +1603 -0
  71. package/dist/lib/node-esm/chunk-D7RARVTS.mjs.map +7 -0
  72. package/dist/lib/node-esm/{chunk-X3LPRWIL.mjs → chunk-JFHI22MF.mjs} +2 -2
  73. package/dist/lib/node-esm/{chunk-X3LPRWIL.mjs.map → chunk-JFHI22MF.mjs.map} +2 -2
  74. package/dist/lib/node-esm/{chunk-ISYLEDVU.mjs → chunk-LSSWQIQD.mjs} +2 -2
  75. package/dist/lib/node-esm/index.mjs +52 -45
  76. package/dist/lib/node-esm/index.mjs.map +3 -3
  77. package/dist/lib/node-esm/intent-resolver-FCKNRTKQ.mjs +30 -0
  78. package/dist/lib/node-esm/intent-resolver-FCKNRTKQ.mjs.map +7 -0
  79. package/dist/lib/node-esm/meta.json +1 -1
  80. package/dist/lib/node-esm/{react-surface-77S6XJOM.mjs → react-surface-Y5LQHUQN.mjs} +24 -23
  81. package/dist/lib/node-esm/react-surface-Y5LQHUQN.mjs.map +7 -0
  82. package/dist/lib/node-esm/types/index.mjs +10 -4
  83. package/dist/types/src/AutomationPlugin.d.ts.map +1 -1
  84. package/dist/types/src/artifacts.stories.d.ts +10 -24
  85. package/dist/types/src/artifacts.stories.d.ts.map +1 -1
  86. package/dist/types/src/capabilities/app-graph-builder.d.ts +22 -22
  87. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  88. package/dist/types/src/capabilities/index.d.ts +27 -27
  89. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  90. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  91. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  92. package/dist/types/src/components/Box/StatusLine.d.ts +11 -0
  93. package/dist/types/src/components/Box/StatusLine.d.ts.map +1 -0
  94. package/dist/types/src/components/Box/StatusLine.stories.d.ts +9 -0
  95. package/dist/types/src/components/Box/StatusLine.stories.d.ts.map +1 -0
  96. package/dist/types/src/components/Box/Tabbed.d.ts +15 -0
  97. package/dist/types/src/components/Box/Tabbed.d.ts.map +1 -0
  98. package/dist/types/src/components/Box/Tabbed.stories.d.ts +8 -0
  99. package/dist/types/src/components/Box/Tabbed.stories.d.ts.map +1 -0
  100. package/dist/types/src/components/Box/ToggleContainer.d.ts +13 -0
  101. package/dist/types/src/components/Box/ToggleContainer.d.ts.map +1 -0
  102. package/dist/types/src/components/Box/ToggleContainer.stories.d.ts +9 -0
  103. package/dist/types/src/components/Box/ToggleContainer.stories.d.ts.map +1 -0
  104. package/dist/types/src/components/Box/index.d.ts +4 -0
  105. package/dist/types/src/components/Box/index.d.ts.map +1 -0
  106. package/dist/types/src/components/ChatContainer/ChatContainer.d.ts +7 -0
  107. package/dist/types/src/components/ChatContainer/ChatContainer.d.ts.map +1 -0
  108. package/dist/types/src/components/ChatContainer/index.d.ts +4 -0
  109. package/dist/types/src/components/ChatContainer/index.d.ts.map +1 -0
  110. package/dist/types/src/components/MarkdownViewer/MarkdownViewer.d.ts +14 -0
  111. package/dist/types/src/components/MarkdownViewer/MarkdownViewer.d.ts.map +1 -0
  112. package/dist/types/src/components/MarkdownViewer/MarkdownViewer.stories.d.ts +8 -0
  113. package/dist/types/src/components/MarkdownViewer/MarkdownViewer.stories.d.ts.map +1 -0
  114. package/dist/types/src/components/MarkdownViewer/index.d.ts +2 -0
  115. package/dist/types/src/components/MarkdownViewer/index.d.ts.map +1 -0
  116. package/dist/types/src/components/Prompt/Prompt.d.ts +7 -0
  117. package/dist/types/src/components/Prompt/Prompt.d.ts.map +1 -0
  118. package/dist/types/src/components/Prompt/Prompt.stories.d.ts +8 -0
  119. package/dist/types/src/components/Prompt/Prompt.stories.d.ts.map +1 -0
  120. package/dist/types/src/components/Prompt/index.d.ts +2 -0
  121. package/dist/types/src/components/Prompt/index.d.ts.map +1 -0
  122. package/dist/types/src/components/Prompt/prompt-autocomplete.d.ts +20 -0
  123. package/dist/types/src/components/Prompt/prompt-autocomplete.d.ts.map +1 -0
  124. package/dist/types/src/components/ServiceRegistry/ServiceRegistry.d.ts +6 -0
  125. package/dist/types/src/components/ServiceRegistry/ServiceRegistry.d.ts.map +1 -0
  126. package/dist/types/src/components/ServiceRegistry/ServiceRegistry.stories.d.ts +8 -0
  127. package/dist/types/src/components/ServiceRegistry/ServiceRegistry.stories.d.ts.map +1 -0
  128. package/dist/types/src/components/ServiceRegistry/index.d.ts +2 -0
  129. package/dist/types/src/components/ServiceRegistry/index.d.ts.map +1 -0
  130. package/dist/types/src/components/Thread/Thread.d.ts +6 -9
  131. package/dist/types/src/components/Thread/Thread.d.ts.map +1 -1
  132. package/dist/types/src/components/Thread/Thread.stories.d.ts +3 -4
  133. package/dist/types/src/components/Thread/Thread.stories.d.ts.map +1 -1
  134. package/dist/types/src/components/Thread/ThreadMessage.d.ts +12 -0
  135. package/dist/types/src/components/Thread/ThreadMessage.d.ts.map +1 -0
  136. package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts.map +1 -1
  137. package/dist/types/src/components/index.d.ts +5 -2
  138. package/dist/types/src/components/index.d.ts.map +1 -1
  139. package/dist/types/src/hooks/index.d.ts +3 -0
  140. package/dist/types/src/hooks/index.d.ts.map +1 -1
  141. package/dist/types/src/hooks/processor.d.ts +39 -15
  142. package/dist/types/src/hooks/processor.d.ts.map +1 -1
  143. package/dist/types/src/hooks/useChatProcessor.d.ts +7 -0
  144. package/dist/types/src/hooks/useChatProcessor.d.ts.map +1 -0
  145. package/dist/types/src/hooks/useMessageQueue.d.ts +41 -0
  146. package/dist/types/src/hooks/useMessageQueue.d.ts.map +1 -0
  147. package/dist/types/src/hooks/useServices.d.ts +7 -0
  148. package/dist/types/src/hooks/useServices.d.ts.map +1 -0
  149. package/dist/types/src/meta.d.ts.map +1 -1
  150. package/dist/types/src/testing/index.d.ts +2 -1
  151. package/dist/types/src/testing/index.d.ts.map +1 -1
  152. package/dist/types/src/testing/{testing.d.ts → test-functions.d.ts} +1 -1
  153. package/dist/types/src/testing/test-functions.d.ts.map +1 -0
  154. package/dist/types/src/testing/test-services.d.ts +5 -0
  155. package/dist/types/src/testing/test-services.d.ts.map +1 -0
  156. package/dist/types/src/tools/function.d.ts +5 -0
  157. package/dist/types/src/tools/function.d.ts.map +1 -0
  158. package/dist/types/src/tools/index.d.ts +3 -0
  159. package/dist/types/src/tools/index.d.ts.map +1 -0
  160. package/dist/types/src/tools/openapi.d.ts +10 -0
  161. package/dist/types/src/tools/openapi.d.ts.map +1 -0
  162. package/dist/types/src/tools/openapi.test.d.ts +2 -0
  163. package/dist/types/src/tools/openapi.test.d.ts.map +1 -0
  164. package/dist/types/src/translations.d.ts +12 -6
  165. package/dist/types/src/translations.d.ts.map +1 -1
  166. package/dist/types/src/types/index.d.ts +1 -0
  167. package/dist/types/src/types/index.d.ts.map +1 -1
  168. package/dist/types/src/types/registry.d.ts +10 -0
  169. package/dist/types/src/types/registry.d.ts.map +1 -0
  170. package/dist/types/src/types/schema.d.ts +156 -7
  171. package/dist/types/src/types/schema.d.ts.map +1 -1
  172. package/dist/types/src/types/types.d.ts +2 -2
  173. package/dist/types/src/types/types.d.ts.map +1 -1
  174. package/dist/types/tsconfig.tsbuildinfo +1 -1
  175. package/package.json +56 -49
  176. package/src/AutomationPlugin.tsx +18 -26
  177. package/src/artifacts.stories.tsx +126 -65
  178. package/src/capabilities/ai-client.ts +1 -1
  179. package/src/capabilities/app-graph-builder.ts +31 -2
  180. package/src/capabilities/intent-resolver.ts +14 -9
  181. package/src/capabilities/react-surface.tsx +14 -12
  182. package/src/components/Box/StatusLine.stories.tsx +52 -0
  183. package/src/components/Box/StatusLine.tsx +76 -0
  184. package/src/components/Box/Tabbed.stories.tsx +51 -0
  185. package/src/components/Box/Tabbed.tsx +89 -0
  186. package/src/components/Box/ToggleContainer.stories.tsx +110 -0
  187. package/src/components/Box/ToggleContainer.tsx +108 -0
  188. package/src/components/Box/index.ts +7 -0
  189. package/src/components/ChatContainer/ChatContainer.tsx +52 -0
  190. package/src/components/ChatContainer/index.ts +8 -0
  191. package/src/components/MarkdownViewer/MarkdownViewer.stories.tsx +56 -0
  192. package/src/components/MarkdownViewer/MarkdownViewer.tsx +79 -0
  193. package/src/components/MarkdownViewer/index.ts +5 -0
  194. package/src/components/Prompt/Prompt.stories.tsx +50 -0
  195. package/src/components/Prompt/Prompt.tsx +36 -0
  196. package/src/components/Prompt/index.ts +5 -0
  197. package/src/components/Prompt/prompt-autocomplete.ts +200 -0
  198. package/src/components/PromptEditor/PromptEditor.stories.tsx +3 -3
  199. package/src/components/ServiceRegistry/ServiceRegistry.stories.tsx +49 -0
  200. package/src/components/ServiceRegistry/ServiceRegistry.tsx +75 -0
  201. package/src/components/ServiceRegistry/index.ts +5 -0
  202. package/src/components/Thread/Thread.stories.tsx +152 -97
  203. package/src/components/Thread/Thread.tsx +115 -108
  204. package/src/components/Thread/ThreadMessage.tsx +225 -0
  205. package/src/components/TriggerEditor/TriggerEditor.tsx +8 -5
  206. package/src/components/index.ts +4 -1
  207. package/src/hooks/index.ts +4 -0
  208. package/src/hooks/processor.ts +114 -65
  209. package/src/hooks/useChatProcessor.tsx +86 -0
  210. package/src/hooks/useMessageQueue.ts +23 -0
  211. package/src/hooks/useServices.ts +28 -0
  212. package/src/meta.ts +2 -1
  213. package/src/testing/index.ts +2 -1
  214. package/src/testing/test-services.ts +131 -0
  215. package/src/tools/function.ts +47 -0
  216. package/src/tools/index.ts +6 -0
  217. package/src/tools/openapi.test.ts +227 -0
  218. package/src/tools/openapi.ts +331 -0
  219. package/src/translations.ts +9 -6
  220. package/src/types/index.ts +1 -0
  221. package/src/types/registry.ts +26 -0
  222. package/src/types/schema.ts +90 -3
  223. package/src/types/types.ts +2 -2
  224. package/dist/lib/browser/AssistantPanel-KO6DZBTU.mjs +0 -340
  225. package/dist/lib/browser/AssistantPanel-KO6DZBTU.mjs.map +0 -7
  226. package/dist/lib/browser/AutomationPanel-BMLM533Z.mjs +0 -131
  227. package/dist/lib/browser/AutomationPanel-BMLM533Z.mjs.map +0 -7
  228. package/dist/lib/browser/ChatContainer-SIAJFRFF.mjs +0 -300
  229. package/dist/lib/browser/ChatContainer-SIAJFRFF.mjs.map +0 -7
  230. package/dist/lib/browser/chunk-C3VRGDR6.mjs +0 -75
  231. package/dist/lib/browser/chunk-C3VRGDR6.mjs.map +0 -7
  232. package/dist/lib/browser/chunk-JSNPW6JF.mjs +0 -14
  233. package/dist/lib/browser/chunk-JSNPW6JF.mjs.map +0 -7
  234. package/dist/lib/browser/chunk-KPSDH6XZ.mjs +0 -118
  235. package/dist/lib/browser/chunk-KPSDH6XZ.mjs.map +0 -7
  236. package/dist/lib/browser/chunk-YZF3SDZL.mjs +0 -139
  237. package/dist/lib/browser/chunk-YZF3SDZL.mjs.map +0 -7
  238. package/dist/lib/browser/intent-resolver-AHDQ3KQP.mjs +0 -24
  239. package/dist/lib/browser/intent-resolver-AHDQ3KQP.mjs.map +0 -7
  240. package/dist/lib/browser/react-surface-IGMBLSV7.mjs.map +0 -7
  241. package/dist/lib/node/AssistantPanel-PPFS2HKK.cjs +0 -360
  242. package/dist/lib/node/AssistantPanel-PPFS2HKK.cjs.map +0 -7
  243. package/dist/lib/node/AutomationPanel-RXJDVLCF.cjs.map +0 -7
  244. package/dist/lib/node/ChatContainer-GS2SC5OG.cjs +0 -318
  245. package/dist/lib/node/ChatContainer-GS2SC5OG.cjs.map +0 -7
  246. package/dist/lib/node/chunk-BUQOZA4N.cjs.map +0 -7
  247. package/dist/lib/node/chunk-DNLBVFR7.cjs +0 -147
  248. package/dist/lib/node/chunk-DNLBVFR7.cjs.map +0 -7
  249. package/dist/lib/node/chunk-TWDGP26W.cjs +0 -172
  250. package/dist/lib/node/chunk-TWDGP26W.cjs.map +0 -7
  251. package/dist/lib/node/chunk-VEGLN4YN.cjs.map +0 -7
  252. package/dist/lib/node/chunk-Z2YFE5SJ.cjs +0 -49
  253. package/dist/lib/node/chunk-Z2YFE5SJ.cjs.map +0 -7
  254. package/dist/lib/node/intent-resolver-TBHYXBDI.cjs.map +0 -7
  255. package/dist/lib/node/react-surface-BVUZMKYS.cjs.map +0 -7
  256. package/dist/lib/node-esm/AssistantPanel-XSSKKCJY.mjs +0 -341
  257. package/dist/lib/node-esm/AssistantPanel-XSSKKCJY.mjs.map +0 -7
  258. package/dist/lib/node-esm/AutomationPanel-GQZZ4UBI.mjs +0 -132
  259. package/dist/lib/node-esm/AutomationPanel-GQZZ4UBI.mjs.map +0 -7
  260. package/dist/lib/node-esm/ChatContainer-57ILGC3R.mjs +0 -301
  261. package/dist/lib/node-esm/ChatContainer-57ILGC3R.mjs.map +0 -7
  262. package/dist/lib/node-esm/chunk-ICHNUP5M.mjs +0 -119
  263. package/dist/lib/node-esm/chunk-ICHNUP5M.mjs.map +0 -7
  264. package/dist/lib/node-esm/chunk-JCYVS5GG.mjs +0 -76
  265. package/dist/lib/node-esm/chunk-JCYVS5GG.mjs.map +0 -7
  266. package/dist/lib/node-esm/chunk-L2B6VGMG.mjs +0 -16
  267. package/dist/lib/node-esm/chunk-L2B6VGMG.mjs.map +0 -7
  268. package/dist/lib/node-esm/chunk-U7HXYMPZ.mjs +0 -141
  269. package/dist/lib/node-esm/chunk-U7HXYMPZ.mjs.map +0 -7
  270. package/dist/lib/node-esm/intent-resolver-DPJJHFGK.mjs +0 -25
  271. package/dist/lib/node-esm/intent-resolver-DPJJHFGK.mjs.map +0 -7
  272. package/dist/lib/node-esm/react-surface-77S6XJOM.mjs.map +0 -7
  273. package/dist/types/src/components/AssistantPanel/AssistantPanel.d.ts +0 -8
  274. package/dist/types/src/components/AssistantPanel/AssistantPanel.d.ts.map +0 -1
  275. package/dist/types/src/components/AssistantPanel/index.d.ts +0 -3
  276. package/dist/types/src/components/AssistantPanel/index.d.ts.map +0 -1
  277. package/dist/types/src/components/AssistantPanel/system-instructions.d.ts +0 -6
  278. package/dist/types/src/components/AssistantPanel/system-instructions.d.ts.map +0 -1
  279. package/dist/types/src/components/ChatContainer.d.ts +0 -8
  280. package/dist/types/src/components/ChatContainer.d.ts.map +0 -1
  281. package/dist/types/src/testing/testing.d.ts.map +0 -1
  282. package/src/components/AssistantPanel/AssistantPanel.tsx +0 -232
  283. package/src/components/AssistantPanel/index.ts +0 -7
  284. package/src/components/AssistantPanel/system-instructions.ts +0 -166
  285. package/src/components/ChatContainer.tsx +0 -80
  286. /package/dist/lib/browser/{chunk-HZ4TA7HY.mjs.map → chunk-BQHXJZ4K.mjs.map} +0 -0
  287. /package/dist/lib/node/{chunk-ZS5RZ7RM.cjs.map → chunk-AWZVJZ2I.cjs.map} +0 -0
  288. /package/dist/lib/node-esm/{chunk-ISYLEDVU.mjs.map → chunk-LSSWQIQD.mjs.map} +0 -0
  289. /package/src/testing/{testing.ts → test-functions.ts} +0 -0
@@ -2,33 +2,39 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import React, { type KeyboardEventHandler, useCallback, useEffect, useRef, useState } from 'react';
5
+ import React, { type KeyboardEventHandler, useCallback, useMemo, useRef, useState } from 'react';
6
6
 
7
7
  import { type Message } from '@dxos/artifact';
8
- import { Icon, Input, useThemeContext, type ThemedClassName } from '@dxos/react-ui';
9
- import {
10
- createBasicExtensions,
11
- createMarkdownExtensions,
12
- createThemeExtensions,
13
- decorateMarkdown,
14
- useTextEditor,
15
- } from '@dxos/react-ui-editor';
16
- import { Ball } from '@dxos/react-ui-sfx';
17
- import { SyntaxHighlighter } from '@dxos/react-ui-syntax-highlighter';
8
+ import { IconButton, Input, useTranslation } from '@dxos/react-ui';
9
+ import { ScrollContainer, type ScrollController } from '@dxos/react-ui-components';
10
+ import { Spinner } from '@dxos/react-ui-sfx';
18
11
  import { mx } from '@dxos/react-ui-theme';
19
12
 
13
+ import { ThreadMessage, type ThreadMessageProps } from './ThreadMessage';
14
+ import { AUTOMATION_PLUGIN } from '../../meta';
15
+
20
16
  export type ThreadProps = {
21
- messages: Message[];
17
+ messages?: Message[];
22
18
  streaming?: boolean;
23
- onSubmit: (message: string) => void;
24
- };
19
+ onSubmit?: (message: string) => void;
20
+ onStop?: () => void;
21
+ } & Pick<ThreadMessageProps, 'collapse' | 'debug' | 'onSuggest' | 'onDelete'>;
25
22
 
26
- export const Thread = ({ messages, streaming, onSubmit }: ThreadProps) => {
27
- const scrollRef = useRef<HTMLDivElement>(null);
28
- const scroll = () => scrollRef.current?.scrollTo({ top: scrollRef.current.scrollHeight, behavior: 'smooth' });
29
- const [text, setText] = useState('');
30
- useEffect(() => scroll(), [messages]);
23
+ // TODO(burdon): Factor out scroll logic.
24
+ export const Thread = ({
25
+ messages,
26
+ streaming,
27
+ collapse,
28
+ debug,
29
+ onSubmit,
30
+ onStop,
31
+ onSuggest,
32
+ onDelete,
33
+ }: ThreadProps) => {
34
+ const { t } = useTranslation(AUTOMATION_PLUGIN);
35
+ const scroller = useRef<ScrollController>(null);
31
36
 
37
+ const [text, setText] = useState('');
32
38
  const handleKeyDown = useCallback<KeyboardEventHandler<HTMLInputElement>>(
33
39
  (ev) => {
34
40
  switch (ev.key) {
@@ -36,12 +42,13 @@ export const Thread = ({ messages, streaming, onSubmit }: ThreadProps) => {
36
42
  setText('');
37
43
  break;
38
44
  }
45
+
39
46
  case 'Enter': {
40
47
  const value = text.trim();
41
48
  if (value.length > 0) {
42
- onSubmit(value);
49
+ scroller.current?.scrollToBottom();
50
+ onSubmit?.(value);
43
51
  setText('');
44
- scroll();
45
52
  }
46
53
  break;
47
54
  }
@@ -50,100 +57,100 @@ export const Thread = ({ messages, streaming, onSubmit }: ThreadProps) => {
50
57
  [text],
51
58
  );
52
59
 
53
- return (
54
- <div className='flex flex-col grow overflow-hidden'>
55
- <div
56
- ref={scrollRef}
57
- className='flex flex-col grow overflow-x-hidden overflow-y-scroll scrollbar-thin divide-y divide-separator'
58
- >
59
- {messages.map((message, i) => (
60
- <ThreadMessage key={i} classNames='px-4 py-2' message={message} />
61
- ))}
62
- </div>
63
-
64
- <div className='flex p-4 gap-3 items-center'>
65
- <Ball active={streaming} />
66
- <Input.Root>
67
- <Input.TextInput
68
- autoFocus
69
- classNames='px-2 bg-base rounded'
70
- placeholder='Ask a question...'
71
- value={text}
72
- onChange={(ev) => setText(ev.target.value)}
73
- onKeyDown={handleKeyDown}
74
- />
75
- </Input.Root>
76
- <Icon
77
- icon={'ph--spinner-gap--regular'}
78
- classNames={mx('animate-spin opacity-0 transition duration-500', streaming && 'opacity-100')}
79
- size={6}
80
- />
81
- </div>
82
- </div>
83
- );
84
- };
85
-
86
- export type ThreadMessageProps = ThemedClassName<{
87
- message: Message;
88
- }>;
60
+ /**
61
+ * Reduce message blocks into collections of messages that contain related contiguous blocks.
62
+ * For example, collapse all tool request/response pairs into a single message.
63
+ */
64
+ // TODO(dmaretskyi): This needs to be a separate type: `id` is not a valid ObjectId, this needs to accommodate messageId for deletion.
65
+ const { messages: lines = [] } = useMemo(() => {
66
+ if (!collapse) {
67
+ return { messages: messages ?? [] };
68
+ }
89
69
 
90
- export const ThreadMessage = ({ classNames, message }: ThreadMessageProps) => {
91
- if (typeof message !== 'object') {
92
- return <div className={mx(classNames)}>{message}</div>;
93
- }
70
+ return (messages ?? []).reduce<{ messages: Message[]; current?: Message }>(
71
+ ({ current, messages }, message) => {
72
+ let i = 0;
73
+ for (const block of message.content) {
74
+ switch (block.type) {
75
+ case 'tool_use':
76
+ case 'tool_result': {
77
+ if (current) {
78
+ current.content.push(block);
79
+ } else {
80
+ current = {
81
+ id: [message.id, i].join('_'),
82
+ role: message.role,
83
+ content: [block],
84
+ };
85
+ messages.push(current);
86
+ }
87
+ break;
88
+ }
94
89
 
95
- const { role, content = [] } = message;
96
- return (
97
- <div className={mx('flex', classNames, role === 'user' && 'justify-end')}>
98
- <div
99
- className={mx(
100
- 'block rounded-md p-1 px-2 bg-base overflow-hidden divide-y divid-separator',
101
- role === 'user' ? 'dark:bg-blue-800' : 'whitespace-pre-wrap',
102
- )}
103
- >
104
- {/* TODO(burdon): Use message ID for stable rendering. */}
105
- {content.map((item, idx) => {
106
- switch (item.type) {
107
90
  case 'text':
108
- return <Markdown key={idx} text={item.text.trim()} />;
109
- case 'json':
110
- return <Json key={idx} data={item.json} />;
111
- default:
112
- return <Json key={idx} data={item} />;
91
+ default: {
92
+ current = undefined;
93
+ messages.push({
94
+ id: [message.id, i].join('_'),
95
+ role: message.role,
96
+ content: [block],
97
+ });
98
+ break;
99
+ }
113
100
  }
114
- })}
115
- </div>
116
- </div>
117
- );
118
- };
119
101
 
120
- const Markdown = ({ text, classNames }: ThemedClassName<{ text: string }>) => {
121
- const { themeMode } = useThemeContext();
122
- const { parentRef, view } = useTextEditor(() => ({
123
- initialValue: text,
124
- extensions: [
125
- // TOOD(burdon): Optional line wrapping.
126
- createBasicExtensions({ lineWrapping: true, readonly: true }),
127
- createMarkdownExtensions(),
128
- createThemeExtensions({ themeMode }),
129
- decorateMarkdown(),
130
- ],
131
- }));
102
+ i++;
103
+ }
132
104
 
133
- useEffect(() => {
134
- view?.dispatch({
135
- // TODO(burdon): Append?
136
- changes: { from: 0, to: view.state.doc.length, insert: text },
137
- });
138
- }, [text]);
105
+ return { current, messages };
106
+ },
107
+ { messages: [] as Message[] },
108
+ );
109
+ }, [messages, collapse]);
139
110
 
140
- return <div ref={parentRef} className={mx('w-full overflow-hidden', classNames)} />;
141
- };
142
-
143
- const Json = ({ data, classNames }: ThemedClassName<{ data: any }>) => {
144
111
  return (
145
- <SyntaxHighlighter language='json' classNames='w-full overflow-hidden text-sm'>
146
- {JSON.stringify(data, null, 2)}
147
- </SyntaxHighlighter>
112
+ <div className='flex flex-col grow overflow-hidden'>
113
+ <ScrollContainer ref={scroller} classNames='py-2 gap-2 overflow-x-hidden'>
114
+ {lines.map((message) => (
115
+ <ThreadMessage
116
+ key={message.id}
117
+ classNames='px-4'
118
+ message={message}
119
+ collapse={collapse}
120
+ debug={debug}
121
+ onSuggest={onSuggest}
122
+ onDelete={onDelete}
123
+ />
124
+ ))}
125
+ </ScrollContainer>
126
+
127
+ {onSubmit && (
128
+ <div className='flex p-4 gap-3 items-center'>
129
+ <Spinner active={streaming} />
130
+ <Input.Root>
131
+ <Input.TextInput
132
+ autoFocus
133
+ classNames='px-2 baseSurface rounded'
134
+ placeholder={t('chat input placeholder')}
135
+ value={text}
136
+ onChange={(ev) => setText(ev.target.value)}
137
+ onKeyDown={handleKeyDown}
138
+ />
139
+ </Input.Root>
140
+ {onStop && (
141
+ <IconButton
142
+ disabled={!streaming}
143
+ classNames={mx('!p-1 !opacity-20 transition', streaming && '!opacity-80')}
144
+ variant='ghost'
145
+ size={5}
146
+ onClick={onStop}
147
+ icon='ph--x--regular'
148
+ label={t('chat stop')}
149
+ iconOnly
150
+ />
151
+ )}
152
+ </div>
153
+ )}
154
+ </div>
148
155
  );
149
156
  };
@@ -0,0 +1,225 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import React, { useEffect, useRef, useState, type FC } from 'react';
6
+
7
+ import { type MessageContentBlock, type Message } from '@dxos/artifact';
8
+ import { invariant } from '@dxos/invariant';
9
+ import { log } from '@dxos/log';
10
+ import { Button, ButtonGroup, Icon, type ThemedClassName } from '@dxos/react-ui';
11
+ import { Json } from '@dxos/react-ui-syntax-highlighter';
12
+ import { mx } from '@dxos/react-ui-theme';
13
+ import { safeParseJson } from '@dxos/util';
14
+
15
+ import { ToggleContainer, StatusLine, Tabs } from '../Box';
16
+ import { MarkdownViewer } from '../MarkdownViewer';
17
+
18
+ export type ThreadMessageProps = ThemedClassName<{
19
+ message: Message;
20
+ collapse?: boolean;
21
+ debug?: boolean;
22
+ onSuggest?: (text: string) => void;
23
+ onDelete?: (id: string) => void;
24
+ }>;
25
+
26
+ export const ThreadMessage: FC<ThreadMessageProps> = ({
27
+ classNames,
28
+ message,
29
+ collapse,
30
+ debug,
31
+ onSuggest,
32
+ onDelete,
33
+ }) => {
34
+ if (typeof message !== 'object') {
35
+ return <div className={mx(classNames)}>{message}</div>;
36
+ }
37
+
38
+ const { role, content = [] } = message;
39
+
40
+ // TODO(burdon): Factor out tool blocks.
41
+ const toolBlocks = content.filter((block) => block.type === 'tool_use' || block.type === 'tool_result');
42
+ if (collapse && toolBlocks.length > 0) {
43
+ let request: (MessageContentBlock & { type: 'tool_use' }) | undefined;
44
+ const items = toolBlocks.map((block) => {
45
+ switch (block.type) {
46
+ case 'tool_use': {
47
+ request = block;
48
+ // TODO(burdon): Get plugin name.
49
+ return { title: `Calling ${block.name}...`, block };
50
+ }
51
+
52
+ case 'tool_result': {
53
+ if (!request) {
54
+ log.warn('unexpected message', { block });
55
+ return { title: 'Error', block };
56
+ }
57
+
58
+ return { title: `Processed ${request.name}`, block };
59
+ }
60
+
61
+ default: {
62
+ request = undefined;
63
+ return { title: 'Error', block };
64
+ }
65
+ }
66
+ });
67
+
68
+ return (
69
+ <div className={mx('flex', classNames)}>
70
+ <div className='w-full p-1 px-2 overflow-hidden rounded-md bg-baseSurface'>
71
+ <TabbedContainer items={items} />
72
+ </div>
73
+ </div>
74
+ );
75
+ }
76
+
77
+ return (
78
+ <div className={mx('flex flex-col shrink-0 gap-2')}>
79
+ {debug && (
80
+ <div className='text-xs text-subdued'>
81
+ {message.id}{' '}
82
+ {onDelete && (
83
+ <span className='cursor-pointer underline' onClick={() => onDelete(message.id)}>
84
+ delete
85
+ </span>
86
+ )}
87
+ </div>
88
+ )}
89
+ {content.map((block, idx) => (
90
+ <div key={idx} className={mx('flex', classNames, block.type === 'text' && role === 'user' && 'justify-end')}>
91
+ <Block role={role} block={block} onSuggest={onSuggest ?? (() => {})} />
92
+ </div>
93
+ ))}
94
+ </div>
95
+ );
96
+ };
97
+
98
+ const Block = ({
99
+ block,
100
+ role,
101
+ onSuggest,
102
+ }: Pick<Message, 'role'> & { block: MessageContentBlock; onSuggest: (text: string) => void }) => {
103
+ const Component = componentMap[block.type] ?? componentMap.default;
104
+ return (
105
+ <div
106
+ className={mx(
107
+ 'p-1 px-2 overflow-hidden rounded-md',
108
+ (block.type !== 'text' || block.disposition) && 'w-full bg-baseSurface',
109
+ block.type === 'text' && role === 'user' && 'bg-primary-200 dark:bg-primary-500',
110
+ )}
111
+ >
112
+ <Component block={block} onSuggest={onSuggest} />
113
+ </div>
114
+ );
115
+ };
116
+
117
+ const titles: Record<string, string> = {
118
+ ['cot' as const]: 'Chain of thought',
119
+ ['artifact' as const]: 'Artifact',
120
+ ['tool_use' as const]: 'Tool request',
121
+ ['tool_result' as const]: 'Tool result',
122
+ };
123
+
124
+ type BlockComponent = FC<{ block: MessageContentBlock; onSuggest: (text: string) => void }>;
125
+
126
+ const componentMap: Record<string, BlockComponent> = {
127
+ text: ({ block }) => {
128
+ invariant(block.type === 'text');
129
+ const title = block.disposition ? titles[block.disposition] : undefined;
130
+ if (!title) {
131
+ return (
132
+ <MarkdownViewer content={block.text} classNames={[block.disposition === 'cot' && 'text-sm text-subdued']} />
133
+ );
134
+ }
135
+
136
+ return (
137
+ <ToggleContainer
138
+ title={title}
139
+ icon={
140
+ block.pending ? (
141
+ <Icon icon={'ph--circle-notch--regular'} classNames='text-subdued ml-2 animate-spin' size={4} />
142
+ ) : undefined
143
+ }
144
+ open={block.disposition === 'cot'}
145
+ >
146
+ <MarkdownViewer content={block.text} classNames={[block.disposition === 'cot' && 'text-sm text-subdued']} />
147
+ </ToggleContainer>
148
+ );
149
+ },
150
+
151
+ json: ({ block, onSuggest }) => {
152
+ invariant(block.type === 'json');
153
+
154
+ switch (block.disposition) {
155
+ case 'suggest': {
156
+ const { text = '' }: { text: string } = safeParseJson(block.json ?? '{}') ?? ({} as any);
157
+ return <Button onClick={() => onSuggest(text)}>{text}</Button>;
158
+ }
159
+
160
+ case 'select': {
161
+ const { options = [] }: { options: string[] } = safeParseJson(block.json ?? '{}') ?? ({} as any);
162
+ return (
163
+ <ButtonGroup>
164
+ {options.map((option) => (
165
+ <Button key={option} onClick={() => onSuggest(option)}>
166
+ {option}
167
+ </Button>
168
+ ))}
169
+ </ButtonGroup>
170
+ );
171
+ }
172
+
173
+ default: {
174
+ const title = block.disposition ? titles[block.disposition] : undefined;
175
+ return (
176
+ <ToggleContainer title={title ?? 'JSON'}>
177
+ <Json data={safeParseJson(block.json ?? block)} classNames='!p-1 text-xs' />
178
+ </ToggleContainer>
179
+ );
180
+ }
181
+ }
182
+ },
183
+
184
+ default: ({ block }) => {
185
+ let title = titles[block.type];
186
+ if (block.type === 'tool_use') {
187
+ title = `Tool [${block.name}]`; // TODO(burdon): Get label from tool.
188
+ }
189
+
190
+ return (
191
+ <ToggleContainer title={title ?? 'JSON'}>
192
+ <Json data={block} classNames='!p-1 text-xs' />
193
+ </ToggleContainer>
194
+ );
195
+ },
196
+ };
197
+
198
+ const TabbedContainer = ({ items }: { items: { title: string; block: any }[] }) => {
199
+ const lines = items.map((item) => item.title);
200
+ const tabsRef = useRef<HTMLDivElement>(null);
201
+ const [selected, setSelected] = useState(0);
202
+ const [open, setOpen] = useState(false);
203
+ useEffect(() => {
204
+ if (open) {
205
+ tabsRef.current?.focus();
206
+ }
207
+ }, [open]);
208
+
209
+ const handleSelect = (index: number) => {
210
+ if (index === selected) {
211
+ setOpen(false);
212
+ } else {
213
+ setSelected(index);
214
+ }
215
+ };
216
+
217
+ return (
218
+ <ToggleContainer title={<StatusLine lines={lines} autoAdvance />} open={open} onChangeOpen={setOpen}>
219
+ <div className='flex gap-2 w-full'>
220
+ <Tabs ref={tabsRef} length={items.length} selected={selected} onSelect={handleSelect} />
221
+ <Json data={items[selected].block} classNames='!p-1 text-xs' />
222
+ </div>
223
+ </ToggleContainer>
224
+ );
225
+ };
@@ -2,7 +2,7 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import React, { useState } from 'react';
5
+ import React, { useEffect, useState } from 'react';
6
6
 
7
7
  import { ComputeGraph } from '@dxos/conductor';
8
8
  import {
@@ -61,11 +61,9 @@ export const TriggerEditor = ({ space, trigger, onSave, onCancel }: TriggerEdito
61
61
  ),
62
62
  ['meta' as const]: (props) => {
63
63
  const meta = props.getValue()!;
64
-
64
+ useEffect(() => props.onValueChange('object', { ...meta }), []);
65
65
  const [newMetaFieldName, setNewMetaFieldName] = useState('');
66
66
 
67
- React.useEffect(() => props.onValueChange('object', { ...meta }), []);
68
-
69
67
  return (
70
68
  <>
71
69
  <div>{props.label}</div>
@@ -74,7 +72,12 @@ export const TriggerEditor = ({ space, trigger, onSave, onCancel }: TriggerEdito
74
72
  return (
75
73
  <div key={compositeKey} role='none' className='flex items-center mt-2 gap-1'>
76
74
  <div role='none' className='flex-1'>
77
- <TextInput {...props} type={'string'} label={key} />
75
+ <TextInput
76
+ {...props}
77
+ getValue={() => (props.getValue() as any)[key]}
78
+ type={'string'}
79
+ label={key}
80
+ />
78
81
  </div>
79
82
  <IconButton
80
83
  icon='ph--trash--regular'
@@ -4,10 +4,13 @@
4
4
 
5
5
  import { lazy } from 'react';
6
6
 
7
+ export * from './AutomationPanel';
8
+ export * from './ChatContainer';
9
+ export * from './MarkdownViewer';
7
10
  export * from './PromptEditor';
11
+ export * from './ServiceRegistry';
8
12
  export * from './Thread';
9
13
  export * from './TriggerEditor';
10
14
 
11
- export const AssistantPanel = lazy(() => import('./AssistantPanel'));
12
15
  export const AutomationPanel = lazy(() => import('./AutomationPanel'));
13
16
  export const ChatContainer = lazy(() => import('./ChatContainer'));
@@ -3,4 +3,8 @@
3
3
  //
4
4
 
5
5
  export * from './processor';
6
+
7
+ export * from './useChatProcessor';
6
8
  export * from './useLocalTriggerManager';
9
+ export * from './useMessageQueue';
10
+ export * from './useServices';