@dxos/plugin-automation 0.7.4 → 0.7.5-labs.401163d

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 (302) hide show
  1. package/dist/lib/browser/AutomationPanel-VW2XIUPU.mjs +8 -0
  2. package/dist/lib/browser/ChatContainer-OLRZNGWK.mjs +12 -0
  3. package/dist/lib/browser/ai-client-5CNY6JBF.mjs +22 -0
  4. package/dist/lib/browser/ai-client-5CNY6JBF.mjs.map +7 -0
  5. package/dist/lib/browser/app-graph-builder-6H7MDCXE.mjs +197 -0
  6. package/dist/lib/browser/app-graph-builder-6H7MDCXE.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-2H2EUYXL.mjs +15 -0
  8. package/dist/lib/browser/chunk-2H2EUYXL.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-ITG6CBKL.mjs +1602 -0
  10. package/dist/lib/browser/chunk-ITG6CBKL.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-MRBC5J4T.mjs +518 -0
  12. package/dist/lib/browser/chunk-MRBC5J4T.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-NQFZ6XRX.mjs +243 -0
  14. package/dist/lib/browser/chunk-NQFZ6XRX.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-Q4IMHYGH.mjs +150 -0
  16. package/dist/lib/browser/chunk-Q4IMHYGH.mjs.map +7 -0
  17. package/dist/lib/browser/{chunk-X5KMOH3I.mjs → chunk-R4JH4TLE.mjs} +6 -4
  18. package/dist/lib/browser/chunk-R4JH4TLE.mjs.map +7 -0
  19. package/dist/lib/browser/index.mjs +157 -252
  20. package/dist/lib/browser/index.mjs.map +4 -4
  21. package/dist/lib/browser/intent-resolver-BWAXKT27.mjs +29 -0
  22. package/dist/lib/browser/intent-resolver-BWAXKT27.mjs.map +7 -0
  23. package/dist/lib/browser/meta.json +1 -1
  24. package/dist/lib/browser/react-surface-O6SHIBCA.mjs +58 -0
  25. package/dist/lib/browser/react-surface-O6SHIBCA.mjs.map +7 -0
  26. package/dist/lib/browser/types/index.mjs +12 -3
  27. package/dist/lib/node/{meta.cjs → AutomationPanel-G6EDDYWW.cjs} +7 -11
  28. package/dist/lib/node/AutomationPanel-G6EDDYWW.cjs.map +7 -0
  29. package/dist/lib/node/ChatContainer-GRZDJIG5.cjs +33 -0
  30. package/dist/lib/node/ChatContainer-GRZDJIG5.cjs.map +7 -0
  31. package/dist/lib/node/ai-client-FKLPDELV.cjs +38 -0
  32. package/dist/lib/node/ai-client-FKLPDELV.cjs.map +7 -0
  33. package/dist/lib/node/app-graph-builder-7JMJLZIE.cjs +212 -0
  34. package/dist/lib/node/app-graph-builder-7JMJLZIE.cjs.map +7 -0
  35. package/dist/lib/node/chunk-CFBERLTN.cjs +1586 -0
  36. package/dist/lib/node/chunk-CFBERLTN.cjs.map +7 -0
  37. package/dist/lib/node/{chunk-DTJ7XVO2.cjs → chunk-EQYHOTGG.cjs} +11 -8
  38. package/dist/lib/node/chunk-EQYHOTGG.cjs.map +7 -0
  39. package/dist/lib/node/chunk-FQUY77HT.cjs +527 -0
  40. package/dist/lib/node/chunk-FQUY77HT.cjs.map +7 -0
  41. package/dist/lib/node/chunk-GB7245FH.cjs +173 -0
  42. package/dist/lib/node/chunk-GB7245FH.cjs.map +7 -0
  43. package/dist/lib/node/chunk-QXIHYOMF.cjs +267 -0
  44. package/dist/lib/node/chunk-QXIHYOMF.cjs.map +7 -0
  45. package/dist/lib/node/chunk-U5Z7LFWB.cjs +34 -0
  46. package/dist/lib/node/chunk-U5Z7LFWB.cjs.map +7 -0
  47. package/dist/lib/node/index.cjs +174 -282
  48. package/dist/lib/node/index.cjs.map +4 -4
  49. package/dist/lib/node/intent-resolver-C6OKFVEW.cjs +44 -0
  50. package/dist/lib/node/intent-resolver-C6OKFVEW.cjs.map +7 -0
  51. package/dist/lib/node/meta.json +1 -1
  52. package/dist/lib/node/react-surface-JT6SVCPK.cjs +76 -0
  53. package/dist/lib/node/react-surface-JT6SVCPK.cjs.map +7 -0
  54. package/dist/lib/node/types/index.cjs +16 -7
  55. package/dist/lib/node/types/index.cjs.map +2 -2
  56. package/dist/lib/node-esm/AutomationPanel-V3IWQAMO.mjs +9 -0
  57. package/dist/lib/node-esm/AutomationPanel-V3IWQAMO.mjs.map +7 -0
  58. package/dist/lib/node-esm/ChatContainer-ORVWQPJO.mjs +13 -0
  59. package/dist/lib/node-esm/ChatContainer-ORVWQPJO.mjs.map +7 -0
  60. package/dist/lib/node-esm/ai-client-XGNA6SJ5.mjs +23 -0
  61. package/dist/lib/node-esm/ai-client-XGNA6SJ5.mjs.map +7 -0
  62. package/dist/lib/node-esm/app-graph-builder-C6NUQGCU.mjs +198 -0
  63. package/dist/lib/node-esm/app-graph-builder-C6NUQGCU.mjs.map +7 -0
  64. package/dist/lib/node-esm/chunk-2OKJZ4ZW.mjs +519 -0
  65. package/dist/lib/node-esm/chunk-2OKJZ4ZW.mjs.map +7 -0
  66. package/dist/lib/node-esm/chunk-6HLBYDUI.mjs +244 -0
  67. package/dist/lib/node-esm/chunk-6HLBYDUI.mjs.map +7 -0
  68. package/dist/lib/node-esm/chunk-7VPT3OO3.mjs +1603 -0
  69. package/dist/lib/node-esm/chunk-7VPT3OO3.mjs.map +7 -0
  70. package/dist/lib/node-esm/chunk-DNCXRGAF.mjs +151 -0
  71. package/dist/lib/node-esm/chunk-DNCXRGAF.mjs.map +7 -0
  72. package/dist/lib/node-esm/{chunk-HNOBZHWK.mjs → chunk-EMVA6QUT.mjs} +6 -4
  73. package/dist/lib/node-esm/chunk-EMVA6QUT.mjs.map +7 -0
  74. package/dist/lib/node-esm/chunk-IJRTDSKN.mjs +16 -0
  75. package/dist/lib/node-esm/chunk-IJRTDSKN.mjs.map +7 -0
  76. package/dist/lib/node-esm/index.mjs +157 -252
  77. package/dist/lib/node-esm/index.mjs.map +4 -4
  78. package/dist/lib/node-esm/intent-resolver-DCP4ZDBA.mjs +30 -0
  79. package/dist/lib/node-esm/intent-resolver-DCP4ZDBA.mjs.map +7 -0
  80. package/dist/lib/node-esm/meta.json +1 -1
  81. package/dist/lib/node-esm/react-surface-DSVM33SA.mjs +59 -0
  82. package/dist/lib/node-esm/react-surface-DSVM33SA.mjs.map +7 -0
  83. package/dist/lib/node-esm/types/index.mjs +12 -3
  84. package/dist/types/src/AutomationPlugin.d.ts +1 -3
  85. package/dist/types/src/AutomationPlugin.d.ts.map +1 -1
  86. package/dist/types/src/artifacts.stories.d.ts +16 -0
  87. package/dist/types/src/artifacts.stories.d.ts.map +1 -0
  88. package/dist/types/src/capabilities/ai-client.d.ts +5 -0
  89. package/dist/types/src/capabilities/ai-client.d.ts.map +1 -0
  90. package/dist/types/src/capabilities/app-graph-builder.d.ts +181 -0
  91. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -0
  92. package/dist/types/src/capabilities/capabilities.d.ts +5 -0
  93. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -0
  94. package/dist/types/src/capabilities/index.d.ts +182 -0
  95. package/dist/types/src/capabilities/index.d.ts.map +1 -0
  96. package/dist/types/src/capabilities/intent-resolver.d.ts +4 -0
  97. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -0
  98. package/dist/types/src/capabilities/react-surface.d.ts +4 -0
  99. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
  100. package/dist/types/src/components/AmbientChatDialog/AmbientChatDialog.d.ts +3 -0
  101. package/dist/types/src/components/AmbientChatDialog/AmbientChatDialog.d.ts.map +1 -0
  102. package/dist/types/src/components/AmbientChatDialog/AmbientChatDialog.stories.d.ts +8 -0
  103. package/dist/types/src/components/AmbientChatDialog/AmbientChatDialog.stories.d.ts.map +1 -0
  104. package/dist/types/src/components/AmbientChatDialog/index.d.ts +2 -0
  105. package/dist/types/src/components/AmbientChatDialog/index.d.ts.map +1 -0
  106. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts +1 -1
  107. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts.map +1 -1
  108. package/dist/types/src/components/AutomationPanel/AutomationPanel.stories.d.ts.map +1 -1
  109. package/dist/types/src/components/Box/StatusLine.d.ts +11 -0
  110. package/dist/types/src/components/Box/StatusLine.d.ts.map +1 -0
  111. package/dist/types/src/components/Box/StatusLine.stories.d.ts +9 -0
  112. package/dist/types/src/components/Box/StatusLine.stories.d.ts.map +1 -0
  113. package/dist/types/src/components/Box/Tabbed.d.ts +15 -0
  114. package/dist/types/src/components/Box/Tabbed.d.ts.map +1 -0
  115. package/dist/types/src/components/Box/Tabbed.stories.d.ts +8 -0
  116. package/dist/types/src/components/Box/Tabbed.stories.d.ts.map +1 -0
  117. package/dist/types/src/components/Box/ToggleContainer.d.ts +13 -0
  118. package/dist/types/src/components/Box/ToggleContainer.d.ts.map +1 -0
  119. package/dist/types/src/components/Box/ToggleContainer.stories.d.ts +9 -0
  120. package/dist/types/src/components/Box/ToggleContainer.stories.d.ts.map +1 -0
  121. package/dist/types/src/components/Box/index.d.ts +4 -0
  122. package/dist/types/src/components/Box/index.d.ts.map +1 -0
  123. package/dist/types/src/components/ChatContainer/ChatContainer.d.ts +7 -0
  124. package/dist/types/src/components/ChatContainer/ChatContainer.d.ts.map +1 -0
  125. package/dist/types/src/components/ChatContainer/index.d.ts +4 -0
  126. package/dist/types/src/components/ChatContainer/index.d.ts.map +1 -0
  127. package/dist/types/src/components/MarkdownViewer/MarkdownViewer.d.ts +14 -0
  128. package/dist/types/src/components/MarkdownViewer/MarkdownViewer.d.ts.map +1 -0
  129. package/dist/types/src/components/MarkdownViewer/MarkdownViewer.stories.d.ts +8 -0
  130. package/dist/types/src/components/MarkdownViewer/MarkdownViewer.stories.d.ts.map +1 -0
  131. package/dist/types/src/components/MarkdownViewer/index.d.ts +2 -0
  132. package/dist/types/src/components/MarkdownViewer/index.d.ts.map +1 -0
  133. package/dist/types/src/components/Prompt/Prompt.d.ts +7 -0
  134. package/dist/types/src/components/Prompt/Prompt.d.ts.map +1 -0
  135. package/dist/types/src/components/Prompt/Prompt.stories.d.ts +8 -0
  136. package/dist/types/src/components/Prompt/Prompt.stories.d.ts.map +1 -0
  137. package/dist/types/src/components/Prompt/index.d.ts +2 -0
  138. package/dist/types/src/components/Prompt/index.d.ts.map +1 -0
  139. package/dist/types/src/components/Prompt/prompt-autocomplete.d.ts +20 -0
  140. package/dist/types/src/components/Prompt/prompt-autocomplete.d.ts.map +1 -0
  141. package/dist/types/src/components/ServiceRegistry/ServiceRegistry.d.ts +6 -0
  142. package/dist/types/src/components/ServiceRegistry/ServiceRegistry.d.ts.map +1 -0
  143. package/dist/types/src/components/ServiceRegistry/ServiceRegistry.stories.d.ts +8 -0
  144. package/dist/types/src/components/ServiceRegistry/ServiceRegistry.stories.d.ts.map +1 -0
  145. package/dist/types/src/components/ServiceRegistry/index.d.ts +2 -0
  146. package/dist/types/src/components/ServiceRegistry/index.d.ts.map +1 -0
  147. package/dist/types/src/components/Thread/Thread.d.ts +11 -0
  148. package/dist/types/src/components/Thread/Thread.d.ts.map +1 -0
  149. package/dist/types/src/components/Thread/Thread.stories.d.ts +11 -0
  150. package/dist/types/src/components/Thread/Thread.stories.d.ts.map +1 -0
  151. package/dist/types/src/components/Thread/ThreadMessage.d.ts +12 -0
  152. package/dist/types/src/components/Thread/ThreadMessage.d.ts.map +1 -0
  153. package/dist/types/src/components/Thread/index.d.ts +2 -0
  154. package/dist/types/src/components/Thread/index.d.ts.map +1 -0
  155. package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts +1 -2
  156. package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts.map +1 -1
  157. package/dist/types/src/components/TriggerEditor/TriggerEditor.stories.d.ts.map +1 -1
  158. package/dist/types/src/components/index.d.ts +13 -2
  159. package/dist/types/src/components/index.d.ts.map +1 -1
  160. package/dist/types/src/hooks/email.d.ts.map +1 -1
  161. package/dist/types/src/hooks/index.d.ts +4 -0
  162. package/dist/types/src/hooks/index.d.ts.map +1 -1
  163. package/dist/types/src/hooks/invocation-handler.d.ts.map +1 -1
  164. package/dist/types/src/hooks/processor.d.ts +70 -0
  165. package/dist/types/src/hooks/processor.d.ts.map +1 -0
  166. package/dist/types/src/hooks/processor.test.d.ts +2 -0
  167. package/dist/types/src/hooks/processor.test.d.ts.map +1 -0
  168. package/dist/types/src/hooks/useChatProcessor.d.ts +7 -0
  169. package/dist/types/src/hooks/useChatProcessor.d.ts.map +1 -0
  170. package/dist/types/src/hooks/useMessageQueue.d.ts +41 -0
  171. package/dist/types/src/hooks/useMessageQueue.d.ts.map +1 -0
  172. package/dist/types/src/hooks/useServices.d.ts +7 -0
  173. package/dist/types/src/hooks/useServices.d.ts.map +1 -0
  174. package/dist/types/src/index.d.ts +1 -2
  175. package/dist/types/src/index.d.ts.map +1 -1
  176. package/dist/types/src/meta.d.ts +2 -2
  177. package/dist/types/src/meta.d.ts.map +1 -1
  178. package/dist/types/src/testing/index.d.ts +2 -1
  179. package/dist/types/src/testing/index.d.ts.map +1 -1
  180. package/dist/types/src/testing/{testing.d.ts → test-functions.d.ts} +3 -1
  181. package/dist/types/src/testing/test-functions.d.ts.map +1 -0
  182. package/dist/types/src/testing/test-services.d.ts +5 -0
  183. package/dist/types/src/testing/test-services.d.ts.map +1 -0
  184. package/dist/types/src/tools/function.d.ts +5 -0
  185. package/dist/types/src/tools/function.d.ts.map +1 -0
  186. package/dist/types/src/tools/index.d.ts +3 -0
  187. package/dist/types/src/tools/index.d.ts.map +1 -0
  188. package/dist/types/src/tools/openapi.d.ts +10 -0
  189. package/dist/types/src/tools/openapi.d.ts.map +1 -0
  190. package/dist/types/src/tools/openapi.test.d.ts +2 -0
  191. package/dist/types/src/tools/openapi.test.d.ts.map +1 -0
  192. package/dist/types/src/translations.d.ts +84 -2
  193. package/dist/types/src/translations.d.ts.map +1 -1
  194. package/dist/types/src/types/index.d.ts +1 -0
  195. package/dist/types/src/types/index.d.ts.map +1 -1
  196. package/dist/types/src/types/registry.d.ts +10 -0
  197. package/dist/types/src/types/registry.d.ts.map +1 -0
  198. package/dist/types/src/types/schema.d.ts +189 -39
  199. package/dist/types/src/types/schema.d.ts.map +1 -1
  200. package/dist/types/src/types/types.d.ts +16 -5
  201. package/dist/types/src/types/types.d.ts.map +1 -1
  202. package/dist/types/tsconfig.tsbuildinfo +1 -0
  203. package/package.json +57 -48
  204. package/src/AutomationPlugin.tsx +77 -194
  205. package/src/artifacts.stories.tsx +241 -0
  206. package/src/capabilities/ai-client.ts +19 -0
  207. package/src/capabilities/app-graph-builder.ts +187 -0
  208. package/src/capabilities/capabilities.ts +12 -0
  209. package/src/capabilities/index.ts +12 -0
  210. package/src/capabilities/intent-resolver.ts +27 -0
  211. package/src/capabilities/react-surface.tsx +42 -0
  212. package/src/components/AmbientChatDialog/AmbientChatDialog.stories.tsx +44 -0
  213. package/src/components/AmbientChatDialog/AmbientChatDialog.tsx +63 -0
  214. package/src/components/AmbientChatDialog/index.ts +5 -0
  215. package/src/components/AutomationPanel/AutomationPanel.stories.tsx +1 -2
  216. package/src/components/AutomationPanel/AutomationPanel.tsx +61 -39
  217. package/src/components/Box/StatusLine.stories.tsx +52 -0
  218. package/src/components/Box/StatusLine.tsx +76 -0
  219. package/src/components/Box/Tabbed.stories.tsx +51 -0
  220. package/src/components/Box/Tabbed.tsx +89 -0
  221. package/src/components/Box/ToggleContainer.stories.tsx +110 -0
  222. package/src/components/Box/ToggleContainer.tsx +108 -0
  223. package/src/components/Box/index.ts +7 -0
  224. package/src/components/ChatContainer/ChatContainer.tsx +52 -0
  225. package/src/components/ChatContainer/index.ts +8 -0
  226. package/src/components/MarkdownViewer/MarkdownViewer.stories.tsx +56 -0
  227. package/src/components/MarkdownViewer/MarkdownViewer.tsx +79 -0
  228. package/src/components/MarkdownViewer/index.ts +5 -0
  229. package/src/components/Prompt/Prompt.stories.tsx +50 -0
  230. package/src/components/Prompt/Prompt.tsx +39 -0
  231. package/src/components/Prompt/index.ts +5 -0
  232. package/src/components/Prompt/prompt-autocomplete.ts +200 -0
  233. package/src/components/PromptEditor/PromptEditor.stories.tsx +6 -6
  234. package/src/components/PromptEditor/PromptEditor.tsx +3 -3
  235. package/src/components/ServiceRegistry/ServiceRegistry.stories.tsx +49 -0
  236. package/src/components/ServiceRegistry/ServiceRegistry.tsx +76 -0
  237. package/src/components/ServiceRegistry/index.ts +5 -0
  238. package/src/components/Thread/Thread.stories.tsx +197 -0
  239. package/src/components/Thread/Thread.tsx +156 -0
  240. package/src/components/Thread/ThreadMessage.tsx +225 -0
  241. package/src/components/Thread/index.ts +5 -0
  242. package/src/components/TriggerEditor/TriggerEditor.stories.tsx +1 -2
  243. package/src/components/TriggerEditor/TriggerEditor.tsx +86 -16
  244. package/src/components/index.ts +10 -1
  245. package/src/hooks/email.ts +2 -2
  246. package/src/hooks/index.ts +5 -0
  247. package/src/hooks/invocation-handler.ts +2 -2
  248. package/src/hooks/processor.test.ts +15 -0
  249. package/src/hooks/processor.ts +210 -0
  250. package/src/hooks/useChatProcessor.tsx +86 -0
  251. package/src/hooks/useMessageQueue.ts +23 -0
  252. package/src/hooks/useServices.ts +28 -0
  253. package/src/index.ts +1 -4
  254. package/src/meta.ts +5 -2
  255. package/src/testing/index.ts +2 -1
  256. package/src/testing/{testing.ts → test-functions.ts} +9 -2
  257. package/src/testing/test-services.ts +131 -0
  258. package/src/tools/function.ts +47 -0
  259. package/src/tools/index.ts +6 -0
  260. package/src/tools/openapi.test.ts +224 -0
  261. package/src/tools/openapi.ts +331 -0
  262. package/src/translations.ts +18 -2
  263. package/src/types/index.ts +1 -0
  264. package/src/types/registry.ts +26 -0
  265. package/src/types/schema.ts +96 -2
  266. package/src/types/types.ts +15 -21
  267. package/dist/lib/browser/AssistantPanel-N3QSALKY.mjs +0 -341
  268. package/dist/lib/browser/AssistantPanel-N3QSALKY.mjs.map +0 -7
  269. package/dist/lib/browser/AutomationPanel-AQMN2CQR.mjs +0 -153
  270. package/dist/lib/browser/AutomationPanel-AQMN2CQR.mjs.map +0 -7
  271. package/dist/lib/browser/chunk-7KB4UMXO.mjs +0 -49
  272. package/dist/lib/browser/chunk-7KB4UMXO.mjs.map +0 -7
  273. package/dist/lib/browser/chunk-X5KMOH3I.mjs.map +0 -7
  274. package/dist/lib/browser/meta.mjs +0 -9
  275. package/dist/lib/node/AssistantPanel-RIA4TI3B.cjs +0 -361
  276. package/dist/lib/node/AssistantPanel-RIA4TI3B.cjs.map +0 -7
  277. package/dist/lib/node/AutomationPanel-HZS5WKI5.cjs +0 -173
  278. package/dist/lib/node/AutomationPanel-HZS5WKI5.cjs.map +0 -7
  279. package/dist/lib/node/chunk-CUCUWUAF.cjs +0 -73
  280. package/dist/lib/node/chunk-CUCUWUAF.cjs.map +0 -7
  281. package/dist/lib/node/chunk-DTJ7XVO2.cjs.map +0 -7
  282. package/dist/lib/node/meta.cjs.map +0 -7
  283. package/dist/lib/node-esm/AssistantPanel-72YH43CH.mjs +0 -342
  284. package/dist/lib/node-esm/AssistantPanel-72YH43CH.mjs.map +0 -7
  285. package/dist/lib/node-esm/AutomationPanel-JUHOWQWW.mjs +0 -154
  286. package/dist/lib/node-esm/AutomationPanel-JUHOWQWW.mjs.map +0 -7
  287. package/dist/lib/node-esm/chunk-23LY7DYS.mjs +0 -51
  288. package/dist/lib/node-esm/chunk-23LY7DYS.mjs.map +0 -7
  289. package/dist/lib/node-esm/chunk-HNOBZHWK.mjs.map +0 -7
  290. package/dist/lib/node-esm/meta.mjs +0 -10
  291. package/dist/types/src/components/AssistantPanel/AssistantPanel.d.ts +0 -8
  292. package/dist/types/src/components/AssistantPanel/AssistantPanel.d.ts.map +0 -1
  293. package/dist/types/src/components/AssistantPanel/index.d.ts +0 -3
  294. package/dist/types/src/components/AssistantPanel/index.d.ts.map +0 -1
  295. package/dist/types/src/components/AssistantPanel/system-instructions.d.ts +0 -6
  296. package/dist/types/src/components/AssistantPanel/system-instructions.d.ts.map +0 -1
  297. package/dist/types/src/testing/testing.d.ts.map +0 -1
  298. package/src/components/AssistantPanel/AssistantPanel.tsx +0 -230
  299. package/src/components/AssistantPanel/index.ts +0 -7
  300. package/src/components/AssistantPanel/system-instructions.ts +0 -166
  301. /package/dist/lib/browser/{meta.mjs.map → AutomationPanel-VW2XIUPU.mjs.map} +0 -0
  302. /package/dist/lib/{node-esm/meta.mjs.map → browser/ChatContainer-OLRZNGWK.mjs.map} +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/types/schema.ts", "../../../src/types/types.ts"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { ref, S, TypedObject } from '@dxos/echo-schema';\n\n// TODO(burdon): Change to S.Literal (and discriminated union).\nexport enum ChainInputType {\n VALUE = 0,\n PASS_THROUGH = 1,\n RETRIEVER = 2,\n FUNCTION = 3,\n QUERY = 4,\n RESOLVER = 5,\n CONTEXT = 6,\n SCHEMA = 7,\n}\n\nexport const ChainInputSchema = S.mutable(\n S.Struct({\n name: S.String,\n type: S.optional(S.Enums(ChainInputType)),\n value: S.optional(S.String),\n }),\n);\n\nexport type ChainInput = S.Schema.Type<typeof ChainInputSchema>;\n\nexport class ChainPromptType extends TypedObject({ typename: 'dxos.org/type/ChainPrompt', version: '0.1.0' })({\n command: S.optional(S.String),\n template: S.String,\n inputs: S.optional(S.mutable(S.Array(ChainInputSchema))),\n}) {}\n\nexport class ChainType extends TypedObject({ typename: 'dxos.org/type/Chain', version: '0.1.0' })({\n name: S.optional(S.String),\n prompts: S.optional(S.mutable(S.Array(ref(ChainPromptType)))),\n}) {}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport type {\n GraphBuilderProvides,\n IntentResolverProvides,\n MetadataRecordsProvides,\n SurfaceProvides,\n TranslationsProvides,\n} from '@dxos/app-framework';\nimport { type PanelProvides } from '@dxos/plugin-deck/types';\nimport { type SchemaProvides } from '@dxos/plugin-space';\n\n// import { AUTOMATION_PLUGIN } from '../meta';\n\n// const AUTOMATION_ACTION = `${AUTOMATION_PLUGIN}/action`;\n\nexport enum AutomationAction {}\n\nexport type AutomationPluginProvides = SurfaceProvides &\n IntentResolverProvides &\n MetadataRecordsProvides &\n TranslationsProvides &\n GraphBuilderProvides &\n SchemaProvides &\n PanelProvides;\n"],
5
- "mappings": ";;;AAIA,SAASA,KAAKC,GAAGC,mBAAmB;;UAGxBC,iBAAAA;;;;;;;;;GAAAA,mBAAAA,iBAAAA,CAAAA,EAAAA;AAWL,IAAMC,mBAAmBC,EAAEC,QAChCD,EAAEE,OAAO;EACPC,MAAMH,EAAEI;EACRC,MAAML,EAAEM,SAASN,EAAEO,MAAMT,cAAAA,CAAAA;EACzBU,OAAOR,EAAEM,SAASN,EAAEI,MAAM;AAC5B,CAAA,CAAA;AAKK,IAAMK,kBAAN,cAA8BC,YAAY;EAAEC,UAAU;EAA6BC,SAAS;AAAQ,CAAA,EAAG;EAC5GC,SAASb,EAAEM,SAASN,EAAEI,MAAM;EAC5BU,UAAUd,EAAEI;EACZW,QAAQf,EAAEM,SAASN,EAAEC,QAAQD,EAAEgB,MAAMjB,gBAAAA,CAAAA,CAAAA;AACvC,CAAA,EAAA;AAAI;AAEG,IAAMkB,YAAN,cAAwBP,YAAY;EAAEC,UAAU;EAAuBC,SAAS;AAAQ,CAAA,EAAG;EAChGT,MAAMH,EAAEM,SAASN,EAAEI,MAAM;EACzBc,SAASlB,EAAEM,SAASN,EAAEC,QAAQD,EAAEgB,MAAMG,IAAIV,eAAAA,CAAAA,CAAAA,CAAAA;AAC5C,CAAA,EAAA;AAAI;;;;0BCnBQW,mBAAAA;AAAAA,GAAAA,qBAAAA,mBAAAA,CAAAA,EAAAA;",
6
- "names": ["ref", "S", "TypedObject", "ChainInputType", "ChainInputSchema", "S", "mutable", "Struct", "name", "String", "type", "optional", "Enums", "value", "ChainPromptType", "TypedObject", "typename", "version", "command", "template", "inputs", "Array", "ChainType", "prompts", "ref", "AutomationAction"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/meta.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type PluginMeta } from '@dxos/app-framework';\n\nexport const AUTOMATION_PLUGIN = 'dxos.org/plugin/automation';\n\nexport default {\n id: AUTOMATION_PLUGIN,\n name: 'Automation',\n description: 'Automation workflows.',\n icon: 'ph--magic-wand--regular',\n source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/experimental/plugin-automation',\n tags: ['experimental'],\n} satisfies PluginMeta;\n"],
5
- "mappings": ";;;AAMO,IAAMA,oBAAoB;AAEjC,IAAA,eAAe;EACbC,IAAID;EACJE,MAAM;EACNC,aAAa;EACbC,MAAM;EACNC,QAAQ;EACRC,MAAM;IAAC;;AACT;",
6
- "names": ["AUTOMATION_PLUGIN", "id", "name", "description", "icon", "source", "tags"]
7
- }
@@ -1,10 +0,0 @@
1
- import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
- import {
3
- AUTOMATION_PLUGIN,
4
- meta_default
5
- } from "./chunk-HNOBZHWK.mjs";
6
- export {
7
- AUTOMATION_PLUGIN,
8
- meta_default as default
9
- };
10
- //# sourceMappingURL=meta.mjs.map
@@ -1,8 +0,0 @@
1
- import React from 'react';
2
- import type { ReactiveEchoObject } from '@dxos/echo-db';
3
- import { type ThemedClassName } from '@dxos/react-ui';
4
- export type AssistantPanelProps = ThemedClassName<{
5
- subject?: ReactiveEchoObject<any>;
6
- }>;
7
- export declare const AssistantPanel: ({ subject, classNames }: AssistantPanelProps) => React.JSX.Element;
8
- //# sourceMappingURL=AssistantPanel.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AssistantPanel.d.ts","sourceRoot":"","sources":["../../../../../src/components/AssistantPanel/AssistantPanel.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAG3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAGxD,OAAO,EAAe,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAUnE,MAAM,MAAM,mBAAmB,GAAG,eAAe,CAAC;IAChD,OAAO,CAAC,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC;CACnC,CAAC,CAAC;AAEH,eAAO,MAAM,cAAc,4BAA6B,mBAAmB,sBA2I1E,CAAC"}
@@ -1,3 +0,0 @@
1
- import { AssistantPanel } from './AssistantPanel';
2
- export default AssistantPanel;
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/AssistantPanel/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,eAAe,cAAc,CAAC"}
@@ -1,6 +0,0 @@
1
- import type { ReactiveEchoObject } from '@dxos/echo-db';
2
- export type ThreadContext = {
3
- subject?: ReactiveEchoObject<any>;
4
- };
5
- export declare const createSystemInstructions: (context: ThreadContext) => Promise<string>;
6
- //# sourceMappingURL=system-instructions.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"system-instructions.d.ts","sourceRoot":"","sources":["../../../../../src/components/AssistantPanel/system-instructions.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAMxD,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,CAAC,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC;CACnC,CAAC;AAEF,eAAO,MAAM,wBAAwB,YAAmB,aAAa,KAAG,OAAO,CAAC,MAAM,CAyBrF,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../../../src/testing/testing.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,SAAS;;;;;;;;;;IA2BrB,CAAC"}
@@ -1,230 +0,0 @@
1
- //
2
- // Copyright 2024 DXOS.org
3
- //
4
-
5
- /* eslint-disable no-console */
6
-
7
- import React, { useEffect, useRef, useState } from 'react';
8
-
9
- import { type AIServiceClient, AIServiceClientImpl, ObjectId, type Message } from '@dxos/assistant';
10
- import type { ReactiveEchoObject } from '@dxos/echo-db';
11
- import { SpaceId } from '@dxos/keys';
12
- import { useClient, useConfig } from '@dxos/react-client';
13
- import { ContextMenu, type ThemedClassName } from '@dxos/react-ui';
14
- import { Icon, Input, Toolbar, useTranslation } from '@dxos/react-ui';
15
- import { SyntaxHighlighter } from '@dxos/react-ui-syntax-highlighter';
16
- import { mx } from '@dxos/react-ui-theme';
17
-
18
- import { createSystemInstructions } from './system-instructions';
19
- import { AUTOMATION_PLUGIN } from '../../meta';
20
-
21
- const PROPERTIES_ASSISTANT_KEY = 'dxos.assistant.beta.properties';
22
-
23
- export type AssistantPanelProps = ThemedClassName<{
24
- subject?: ReactiveEchoObject<any>;
25
- }>;
26
-
27
- export const AssistantPanel = ({ subject, classNames }: AssistantPanelProps) => {
28
- const { t } = useTranslation(AUTOMATION_PLUGIN);
29
- const config = useConfig();
30
- const client = useClient();
31
- const aiClient = useRef<AIServiceClient>();
32
- const [contextSpaceId, setContextSpaceId] = useState<SpaceId | undefined>();
33
- const [threadId, setThreadId] = useState<ObjectId | undefined>();
34
- const [history, setHistory] = useState<Message[]>([]);
35
- const [input, setInput] = useState('');
36
-
37
- useEffect(() => {
38
- if (!aiClient.current) {
39
- const endpoint = config.values.runtime?.services?.ai?.server;
40
- if (!endpoint) {
41
- throw new Error('AI service endpoint is not configured');
42
- }
43
- aiClient.current = new AIServiceClientImpl({
44
- endpoint,
45
- });
46
- }
47
-
48
- queueMicrotask(async () => {
49
- const properties = client.spaces.default.properties;
50
-
51
- properties[PROPERTIES_ASSISTANT_KEY] ??= {};
52
- properties[PROPERTIES_ASSISTANT_KEY].contextSpaceId ??= SpaceId.random();
53
- properties[PROPERTIES_ASSISTANT_KEY].threadId ??= ObjectId.random();
54
-
55
- const contextSpaceId = properties[PROPERTIES_ASSISTANT_KEY].contextSpaceId;
56
- const threadId = properties[PROPERTIES_ASSISTANT_KEY].threadId;
57
-
58
- setContextSpaceId(contextSpaceId);
59
- setThreadId(threadId);
60
-
61
- const messages = await aiClient.current!.getMessagesInThread(contextSpaceId, threadId);
62
- setHistory(messages);
63
- });
64
- }, []);
65
-
66
- const handleRequest = async (input: string) => {
67
- if (input === '') {
68
- return;
69
- }
70
-
71
- setInput('');
72
-
73
- // TODO(dmaretskyi): Can we call `create(Message, { ... })` here?
74
- const userMessage: Message = {
75
- id: ObjectId.random(),
76
- spaceId: contextSpaceId!,
77
- threadId: threadId!,
78
- role: 'user',
79
- content: [{ type: 'text', text: input }],
80
- };
81
- await aiClient.current!.insertMessages([userMessage]);
82
- setHistory([...history, userMessage]);
83
-
84
- const generationStream = await aiClient.current!.generate({
85
- model: '@anthropic/claude-3-5-sonnet-20241022',
86
- spaceId: contextSpaceId!,
87
- threadId: threadId!,
88
- tools: [],
89
- systemPrompt: await getSystemPrompt(),
90
- });
91
-
92
- const historyBefore = [...history, userMessage];
93
- for await (const _event of generationStream) {
94
- setHistory([...historyBefore, ...generationStream.accumulatedMessages]);
95
- }
96
-
97
- await aiClient.current!.insertMessages(await generationStream.complete());
98
- };
99
-
100
- const getSystemPrompt = async () => {
101
- return createSystemInstructions({ subject });
102
- };
103
-
104
- const clearThread = async () => {
105
- const properties = client.spaces.default.properties;
106
-
107
- properties[PROPERTIES_ASSISTANT_KEY] ??= {};
108
- // properties[PROPERTIES_ASSISTANT_KEY].contextSpaceId ??= SpaceId.random();
109
- properties[PROPERTIES_ASSISTANT_KEY].threadId = ObjectId.random();
110
-
111
- // const contextSpaceId = properties[PROPERTIES_ASSISTANT_KEY].contextSpaceId;
112
- const threadId = properties[PROPERTIES_ASSISTANT_KEY].threadId;
113
-
114
- // setContextSpaceId(contextSpaceId);
115
- setThreadId(threadId);
116
-
117
- const messages = await aiClient.current!.getMessagesInThread(contextSpaceId!, threadId);
118
- setHistory(messages);
119
- };
120
-
121
- // TODO(burdon): Factor out with script plugin.
122
- return (
123
- <div className={mx('flex flex-col h-full overflow-hidden', classNames)}>
124
- {history.length > 0 && (
125
- <div className='flex flex-col gap-6 h-full p-2 overflow-x-hidden overflow-y-auto'>
126
- {history.map((message) => (
127
- <MessageItem key={message.id} message={message} />
128
- ))}
129
- </div>
130
- )}
131
-
132
- <Toolbar.Root classNames='p-1'>
133
- <Input.Root>
134
- <Input.TextInput
135
- autoFocus
136
- placeholder={t('ask me anything')}
137
- value={input}
138
- onChange={(ev) => setInput(ev.target.value)}
139
- onKeyDown={(ev) => ev.key === 'Enter' && handleRequest(input)}
140
- />
141
- </Input.Root>
142
- <ContextMenu.Root>
143
- <ContextMenu.Trigger asChild>
144
- <Toolbar.Button onClick={() => handleRequest(input)}>
145
- <Icon icon='ph--play--regular' size={4} />
146
- </Toolbar.Button>
147
- </ContextMenu.Trigger>
148
- <ContextMenu.Portal>
149
- <ContextMenu.Content classNames='z-[31]'>
150
- <ContextMenu.Viewport>
151
- <ContextMenu.Item onClick={clearThread}>Clear thread</ContextMenu.Item>
152
- <ContextMenu.Item onClick={async () => console.log(await getSystemPrompt())}>
153
- Print instructions to console
154
- </ContextMenu.Item>
155
- </ContextMenu.Viewport>
156
- </ContextMenu.Content>
157
- </ContextMenu.Portal>
158
- </ContextMenu.Root>
159
-
160
- {/* <Toolbar.Button onClick={() => (state ? handleStop() : handleClear())}>
161
- <Icon icon={state ? 'ph--stop--regular' : 'ph--trash--regular'} size={4} />
162
- </Toolbar.Button> */}
163
- </Toolbar.Root>
164
- </div>
165
- );
166
- };
167
-
168
- const MessageItem = ({ classNames, message }: ThemedClassName<{ message: Message }>) => {
169
- const { id: _, role, content } = message;
170
- const styleContainer = 'flex flex-col overflow-x-hidden overflow-y-auto rounded-md gap-2 divide-y divide-separator';
171
-
172
- return (
173
- <div className={mx('flex', role === 'user' ? 'ml-[1rem] justify-end' : 'mr-[1rem]', classNames)}>
174
- {content.map((content, i) => {
175
- switch (content.type) {
176
- case 'text': {
177
- const { cot, message } = parseMessage(content.text);
178
- return (
179
- <div
180
- key={i}
181
- role='none'
182
- className={mx(
183
- styleContainer,
184
- role === 'user' ? 'bg-primary-400 dark:bg-primary-600' : 'bg-hoverSurface',
185
- )}
186
- >
187
- {cot && <div className='p-2 whitespace-pre-wrap text-xs text-subdued'>{cot}</div>}
188
- <div className='p-2 whitespace-pre-wrap'>{message}</div>
189
- </div>
190
- );
191
- }
192
-
193
- case 'tool_use': {
194
- return (
195
- <div key={i} className={mx(styleContainer, 'text-xs')}>
196
- <div>
197
- <span className='p-2 text-primary'>Tool use</span>: {content.name} {content.id}
198
- </div>
199
- <SyntaxHighlighter language='json'>{content.inputJson}</SyntaxHighlighter>
200
- </div>
201
- );
202
- }
203
-
204
- case 'tool_result': {
205
- return (
206
- <div key={i} className={mx(styleContainer, 'text-xs', content.isError && 'text-error')}>
207
- <div>
208
- <span className='p-2 text-primary'>Tool result</span>: {content.toolUseId}
209
- </div>
210
- <SyntaxHighlighter language='json'>{content.content}</SyntaxHighlighter>
211
- </div>
212
- );
213
- }
214
- }
215
-
216
- return null;
217
- })}
218
- </div>
219
- );
220
- };
221
-
222
- // TODO(burdon): Move to server-side parsing.
223
- const parseMessage = (text: string): { cot?: string; message: string } => {
224
- const regex = /<cot>([\s\S]*?)<\/cot>\s*([\s\S]*)/;
225
- const match = text.match(regex);
226
- return {
227
- cot: match?.[1].trim(),
228
- message: match?.[2] ?? text ?? '\u00D8',
229
- };
230
- };
@@ -1,7 +0,0 @@
1
- //
2
- // Copyright 2024 DXOS.org
3
- //
4
-
5
- import { AssistantPanel } from './AssistantPanel';
6
-
7
- export default AssistantPanel;
@@ -1,166 +0,0 @@
1
- //
2
- // Copyright 2024 DXOS.org
3
- //
4
-
5
- import { asyncTimeout } from '@dxos/async';
6
- import type { ReactiveEchoObject } from '@dxos/echo-db';
7
- import { getTypename } from '@dxos/echo-schema';
8
- import { log } from '@dxos/log';
9
- import { Filter, getSpace, ResultFormat } from '@dxos/react-client/echo';
10
-
11
- // TODO(burdon): Move into assistant-protocol.
12
- export type ThreadContext = {
13
- subject?: ReactiveEchoObject<any>;
14
- };
15
-
16
- export const createSystemInstructions = async (context: ThreadContext): Promise<string> => {
17
- let instructions = `
18
- <instructions>
19
- Before replying always think step-by-step on how to proceed.
20
- Print your thoughts inside <cot> tags.
21
-
22
- <example>
23
- <cot>To answer the question I need to ...</cot>
24
- </example>
25
- </instructions>
26
-
27
- <current_time>${new Date().toLocaleString()}</current_time>
28
- `;
29
-
30
- if (context.subject) {
31
- instructions += `
32
- <user_attention>
33
- The user is currently interacting with an object in Composer application:
34
-
35
- ${await formatContextObject(context.subject)}
36
- </user_attention>
37
- `;
38
- }
39
-
40
- return looseFormatXml(instructions);
41
- };
42
-
43
- const formatContextObject = async (object: ReactiveEchoObject<any>): Promise<string> => {
44
- let data;
45
- try {
46
- data = await asyncTimeout(preprocessContextObject(object), CONTEXT_OBJECT_QUERY_TIMEOUT);
47
- } catch (err: any) {
48
- log.error('Failed to preprocess context object:', { err });
49
- data = object;
50
- }
51
-
52
- if (typeof data === 'string') {
53
- return data;
54
- } else {
55
- return `
56
- <object>
57
- <type>${getTypename(object)}</type>
58
- <id>${object.id}</id>
59
- ${formatObjectAsXMLTags(data)}
60
- </object>
61
- `;
62
- }
63
- };
64
-
65
- const preprocessContextObject = async (object: ReactiveEchoObject<any>): Promise<Record<string, any> | string> => {
66
- const space = getSpace(object);
67
- if (!space) {
68
- return { ...object };
69
- }
70
-
71
- // TODO(dmaretskyi): Serialize based on schema annotations.
72
- switch (getTypename(object)) {
73
- // TODO(dmaretskyi): Reference types somehow without plugin-automation depending on other plugins.
74
- case 'dxos.org/type/Document': {
75
- const data = space.db
76
- .query({ id: object.id }, { format: ResultFormat.Plain, include: { content: true } })
77
- .first() ?? { content: { content: '' } };
78
-
79
- return {
80
- ...data,
81
- threads: undefined,
82
- };
83
- }
84
-
85
- case 'dxos.org/type/Table': {
86
- // TODO(dmaretskyi): Load references.
87
- const schema = object.view ? space?.db.schemaRegistry.getSchema(object.view.query.type) : undefined;
88
- const { objects: rows } =
89
- (schema &&
90
- (await space.db
91
- .query(Filter.schema(schema), { format: ResultFormat.Plain, limit: TABLE_ROWS_LIMIT })
92
- .run())) ??
93
- {};
94
-
95
- // TODO(dmaretskyi): Format table schema.
96
- return `
97
- <object>
98
- <id>${object.id}</id>
99
- <type>${getTypename(object)}</type>
100
- ${formatObjectAsXMLTags(object)}
101
-
102
- <rows>
103
- <!-- Limited to first ${TABLE_ROWS_LIMIT} rows. -->
104
- ${rows
105
- ?.map(
106
- (row: any) => `<row>
107
- ${formatObjectAsXMLTags(row)}
108
- </row>`,
109
- )
110
- .join('\n')}
111
- </rows>
112
-
113
- `;
114
- }
115
-
116
- default:
117
- return { ...object };
118
- }
119
- };
120
-
121
- const formatObjectAsXMLTags = (object: any, depth = 1): string => {
122
- return Object.entries(object)
123
- .filter(([key, value]) => ['string', 'number', 'boolean', 'object'].includes(typeof value))
124
- .map(([key, value]) => {
125
- if (typeof value === 'object' && value !== null) {
126
- if (depth === 0) {
127
- return '';
128
- } else {
129
- return `<${key}>
130
- ${formatObjectAsXMLTags(value, depth - 1)}
131
- </${key}>`;
132
- }
133
- }
134
-
135
- return `<${key}>${value}</${key}>`;
136
- })
137
- .join('\n');
138
- };
139
-
140
- const CONTEXT_OBJECT_QUERY_TIMEOUT = 5_000;
141
-
142
- const TABLE_ROWS_LIMIT = 10;
143
-
144
- /**
145
- * Formats XML indentation for instructions so they are easier to read during debugging.
146
- */
147
- const looseFormatXml = (xml: string): string => {
148
- let currentIndent = 0;
149
-
150
- return xml
151
- .split('\n')
152
- .map((line) => {
153
- if (line.match(RE_CLOSE_TAG_LINE)) {
154
- currentIndent--;
155
- }
156
- const indent = currentIndent;
157
- if (line.match(RE_OPEN_TAG_LINE)) {
158
- currentIndent++;
159
- }
160
- return ' '.repeat(indent * 2) + line.trimStart();
161
- })
162
- .join('\n');
163
- };
164
-
165
- const RE_OPEN_TAG_LINE = /^[ ]*<[a-zA-Z0-9\-_]+>[ ]*$/;
166
- const RE_CLOSE_TAG_LINE = /^[ ]*<\/[a-zA-Z0-9\-_]+>[ ]*$/;