@dxos/plugin-script 0.8.4-main.5ea62a8 → 0.8.4-main.72ec0f3

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 (285) hide show
  1. package/dist/lib/browser/DeploymentDialog-MZX4T77L.mjs +14 -0
  2. package/dist/lib/browser/NotebookContainer-RTESC4OV.mjs +817 -0
  3. package/dist/lib/browser/NotebookContainer-RTESC4OV.mjs.map +7 -0
  4. package/dist/lib/browser/ScriptContainer-T2BAZDJ4.mjs +147 -0
  5. package/dist/lib/browser/ScriptContainer-T2BAZDJ4.mjs.map +7 -0
  6. package/dist/lib/browser/{app-graph-builder-IABOSTBK.mjs → app-graph-builder-2WR2ATTJ.mjs} +11 -9
  7. package/dist/lib/browser/app-graph-builder-2WR2ATTJ.mjs.map +7 -0
  8. package/dist/lib/browser/{blueprint-definition-AR7ITBCD.mjs → blueprint-definition-6PZWZM2Y.mjs} +5 -3
  9. package/dist/lib/{node-esm/blueprint-definition-TJY4TX6S.mjs.map → browser/blueprint-definition-6PZWZM2Y.mjs.map} +1 -1
  10. package/dist/lib/browser/chunk-2G2NA6DQ.mjs +88 -0
  11. package/dist/lib/browser/chunk-2G2NA6DQ.mjs.map +7 -0
  12. package/dist/lib/browser/{chunk-YCZPTTFO.mjs → chunk-3IJASGG5.mjs} +23 -21
  13. package/dist/lib/browser/chunk-3IJASGG5.mjs.map +7 -0
  14. package/dist/lib/browser/chunk-4M7U2WVT.mjs +304 -0
  15. package/dist/lib/browser/chunk-4M7U2WVT.mjs.map +7 -0
  16. package/dist/lib/browser/chunk-5JSNQYZZ.mjs +517 -0
  17. package/dist/lib/browser/chunk-5JSNQYZZ.mjs.map +7 -0
  18. package/dist/lib/browser/{chunk-QYAREHGH.mjs → chunk-EB6AXFXO.mjs} +8 -5
  19. package/dist/lib/browser/chunk-EB6AXFXO.mjs.map +7 -0
  20. package/dist/lib/browser/{chunk-TH7GXPE3.mjs → chunk-GAFCKEII.mjs} +145 -55
  21. package/dist/lib/browser/chunk-GAFCKEII.mjs.map +7 -0
  22. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  23. package/dist/lib/browser/chunk-LNNCD2H4.mjs +102 -0
  24. package/dist/lib/browser/chunk-LNNCD2H4.mjs.map +7 -0
  25. package/dist/lib/browser/chunk-M6KJPUJK.mjs +111 -0
  26. package/dist/lib/browser/chunk-M6KJPUJK.mjs.map +7 -0
  27. package/dist/lib/browser/{chunk-5TVBECWH.mjs → chunk-UOQ6NCH3.mjs} +2 -2
  28. package/dist/lib/browser/{compiler-2HJH34GM.mjs → compiler-4KHRSX7J.mjs} +13 -25
  29. package/dist/lib/browser/compiler-4KHRSX7J.mjs.map +7 -0
  30. package/dist/lib/browser/index.mjs +104 -41
  31. package/dist/lib/browser/index.mjs.map +3 -3
  32. package/dist/lib/browser/{intent-resolver-YMK5SXVC.mjs → intent-resolver-AFJ575VK.mjs} +38 -23
  33. package/dist/lib/browser/intent-resolver-AFJ575VK.mjs.map +7 -0
  34. package/dist/lib/browser/meta.json +1 -1
  35. package/dist/lib/browser/{react-surface-FEM5WWFH.mjs → react-surface-QEQ3QUQA.mjs} +45 -21
  36. package/dist/lib/browser/react-surface-QEQ3QUQA.mjs.map +7 -0
  37. package/dist/lib/browser/{settings-KCTBK5TY.mjs → settings-LNLSTZM4.mjs} +10 -8
  38. package/dist/lib/browser/settings-LNLSTZM4.mjs.map +7 -0
  39. package/dist/lib/browser/templates/index.mjs +2 -1
  40. package/dist/lib/browser/types/index.mjs +8 -4
  41. package/dist/lib/node-esm/DeploymentDialog-GL5AUWMR.mjs +15 -0
  42. package/dist/lib/node-esm/DeploymentDialog-GL5AUWMR.mjs.map +7 -0
  43. package/dist/lib/node-esm/NotebookContainer-SVD3A3D6.mjs +818 -0
  44. package/dist/lib/node-esm/NotebookContainer-SVD3A3D6.mjs.map +7 -0
  45. package/dist/lib/node-esm/ScriptContainer-2CE3H3JJ.mjs +148 -0
  46. package/dist/lib/node-esm/ScriptContainer-2CE3H3JJ.mjs.map +7 -0
  47. package/dist/lib/node-esm/{app-graph-builder-CQTTAYHP.mjs → app-graph-builder-NCVLUL5R.mjs} +11 -9
  48. package/dist/lib/node-esm/app-graph-builder-NCVLUL5R.mjs.map +7 -0
  49. package/dist/lib/node-esm/{blueprint-definition-TJY4TX6S.mjs → blueprint-definition-5R6YCSZZ.mjs} +4 -3
  50. package/dist/lib/{browser/blueprint-definition-AR7ITBCD.mjs.map → node-esm/blueprint-definition-5R6YCSZZ.mjs.map} +1 -1
  51. package/dist/lib/node-esm/{chunk-35M3CHYE.mjs → chunk-55JZVM6K.mjs} +2 -2
  52. package/dist/lib/node-esm/chunk-57JA6XL5.mjs +90 -0
  53. package/dist/lib/node-esm/chunk-57JA6XL5.mjs.map +7 -0
  54. package/dist/lib/node-esm/chunk-HDKR5WCD.mjs +113 -0
  55. package/dist/lib/node-esm/chunk-HDKR5WCD.mjs.map +7 -0
  56. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  57. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  58. package/dist/lib/node-esm/{chunk-AHXJ6NQU.mjs → chunk-IBV2DR36.mjs} +8 -5
  59. package/dist/lib/node-esm/chunk-IBV2DR36.mjs.map +7 -0
  60. package/dist/lib/node-esm/chunk-IQTBVH4L.mjs +518 -0
  61. package/dist/lib/node-esm/chunk-IQTBVH4L.mjs.map +7 -0
  62. package/dist/lib/node-esm/{chunk-6M2R2FQF.mjs → chunk-KJKZ4KNO.mjs} +145 -55
  63. package/dist/lib/node-esm/chunk-KJKZ4KNO.mjs.map +7 -0
  64. package/dist/lib/node-esm/chunk-NNHWLRHT.mjs +103 -0
  65. package/dist/lib/node-esm/chunk-NNHWLRHT.mjs.map +7 -0
  66. package/dist/lib/node-esm/{chunk-ZA36GO4T.mjs → chunk-RIE676OW.mjs} +23 -21
  67. package/dist/lib/node-esm/chunk-RIE676OW.mjs.map +7 -0
  68. package/dist/lib/node-esm/chunk-YRTA4EHU.mjs +305 -0
  69. package/dist/lib/node-esm/chunk-YRTA4EHU.mjs.map +7 -0
  70. package/dist/lib/node-esm/{compiler-7SP27RA6.mjs → compiler-DU5NQISX.mjs} +13 -25
  71. package/dist/lib/node-esm/compiler-DU5NQISX.mjs.map +7 -0
  72. package/dist/lib/node-esm/index.mjs +104 -41
  73. package/dist/lib/node-esm/index.mjs.map +3 -3
  74. package/dist/lib/node-esm/{intent-resolver-SKRDYQCZ.mjs → intent-resolver-A5VVK746.mjs} +38 -23
  75. package/dist/lib/node-esm/intent-resolver-A5VVK746.mjs.map +7 -0
  76. package/dist/lib/node-esm/meta.json +1 -1
  77. package/dist/lib/node-esm/{react-surface-AOKMDJR4.mjs → react-surface-U77YT7VF.mjs} +45 -21
  78. package/dist/lib/node-esm/react-surface-U77YT7VF.mjs.map +7 -0
  79. package/dist/lib/node-esm/{settings-DXZ334A3.mjs → settings-IUFMOCXY.mjs} +10 -8
  80. package/dist/lib/node-esm/settings-IUFMOCXY.mjs.map +7 -0
  81. package/dist/lib/node-esm/templates/index.mjs +2 -1
  82. package/dist/lib/node-esm/types/index.mjs +8 -4
  83. package/dist/types/src/ScriptPlugin.d.ts +1 -1
  84. package/dist/types/src/ScriptPlugin.d.ts.map +1 -1
  85. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  86. package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
  87. package/dist/types/src/capabilities/blueprint-definition.d.ts +1 -1
  88. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  89. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  90. package/dist/types/src/components/DeploymentDialog/DeploymentDialog.d.ts +3 -3
  91. package/dist/types/src/components/DeploymentDialog/DeploymentDialog.d.ts.map +1 -1
  92. package/dist/types/src/components/DeploymentDialog/DeploymentDialog.stories.d.ts +110 -7
  93. package/dist/types/src/components/DeploymentDialog/DeploymentDialog.stories.d.ts.map +1 -1
  94. package/dist/types/src/components/FrameContainer/FrameContainer.d.ts +1 -1
  95. package/dist/types/src/components/FrameContainer/FrameContainer.d.ts.map +1 -1
  96. package/dist/types/src/components/NotebookContainer.d.ts +10 -0
  97. package/dist/types/src/components/NotebookContainer.d.ts.map +1 -0
  98. package/dist/types/src/components/NotebookContainer.stories.d.ts +251 -0
  99. package/dist/types/src/components/NotebookContainer.stories.d.ts.map +1 -0
  100. package/dist/types/src/components/NotebookStack/NotebookCell.d.ts +15 -0
  101. package/dist/types/src/components/NotebookStack/NotebookCell.d.ts.map +1 -0
  102. package/dist/types/src/components/NotebookStack/NotebookMenu.d.ts +9 -0
  103. package/dist/types/src/components/NotebookStack/NotebookMenu.d.ts.map +1 -0
  104. package/dist/types/src/components/NotebookStack/NotebookStack.d.ts +14 -0
  105. package/dist/types/src/components/NotebookStack/NotebookStack.d.ts.map +1 -0
  106. package/dist/types/src/components/NotebookStack/NotebookStack.stories.d.ts +245 -0
  107. package/dist/types/src/components/NotebookStack/NotebookStack.stories.d.ts.map +1 -0
  108. package/dist/types/src/components/NotebookStack/index.d.ts +3 -0
  109. package/dist/types/src/components/NotebookStack/index.d.ts.map +1 -0
  110. package/dist/types/src/components/ScriptContainer.d.ts +4 -4
  111. package/dist/types/src/components/ScriptContainer.d.ts.map +1 -1
  112. package/dist/types/src/components/ScriptToolbar/ScriptToolbar.d.ts +5 -6
  113. package/dist/types/src/components/ScriptToolbar/ScriptToolbar.d.ts.map +1 -1
  114. package/dist/types/src/components/ScriptToolbar/ScriptToolbar.stories.d.ts +237 -2
  115. package/dist/types/src/components/ScriptToolbar/ScriptToolbar.stories.d.ts.map +1 -1
  116. package/dist/types/src/components/Settings/ScriptObjectSettings.d.ts +2 -2
  117. package/dist/types/src/components/Settings/ScriptObjectSettings.d.ts.map +1 -1
  118. package/dist/types/src/components/Settings/ScriptPluginSettings.d.ts +2 -2
  119. package/dist/types/src/components/Settings/ScriptPluginSettings.d.ts.map +1 -1
  120. package/dist/types/src/components/TestPanel/TestContainer.d.ts +2 -2
  121. package/dist/types/src/components/TestPanel/TestContainer.d.ts.map +1 -1
  122. package/dist/types/src/components/TestPanel/TestPanel.d.ts.map +1 -1
  123. package/dist/types/src/components/TypescriptEditor/TypescriptEditor.d.ts +4 -2
  124. package/dist/types/src/components/TypescriptEditor/TypescriptEditor.d.ts.map +1 -1
  125. package/dist/types/src/components/TypescriptEditor/TypescriptEditor.stories.d.ts +3 -3
  126. package/dist/types/src/components/TypescriptEditor/TypescriptEditor.stories.d.ts.map +1 -1
  127. package/dist/types/src/components/index.d.ts +2 -0
  128. package/dist/types/src/components/index.d.ts.map +1 -1
  129. package/dist/types/src/events.d.ts.map +1 -1
  130. package/dist/types/src/hooks/deploy.d.ts +13 -11
  131. package/dist/types/src/hooks/deploy.d.ts.map +1 -1
  132. package/dist/types/src/hooks/format.d.ts +2 -2
  133. package/dist/types/src/hooks/format.d.ts.map +1 -1
  134. package/dist/types/src/hooks/template.d.ts +4 -14
  135. package/dist/types/src/hooks/template.d.ts.map +1 -1
  136. package/dist/types/src/hooks/useCreateAndDeployScriptTemplates.d.ts.map +1 -1
  137. package/dist/types/src/index.d.ts +1 -0
  138. package/dist/types/src/index.d.ts.map +1 -1
  139. package/dist/types/src/meta.d.ts +0 -1
  140. package/dist/types/src/meta.d.ts.map +1 -1
  141. package/dist/types/src/notebook/compute-graph.d.ts +45 -0
  142. package/dist/types/src/notebook/compute-graph.d.ts.map +1 -0
  143. package/dist/types/src/notebook/compute-graph.test.d.ts +2 -0
  144. package/dist/types/src/notebook/compute-graph.test.d.ts.map +1 -0
  145. package/dist/types/src/notebook/eval.d.ts +13 -0
  146. package/dist/types/src/notebook/eval.d.ts.map +1 -0
  147. package/dist/types/src/notebook/index.d.ts +2 -0
  148. package/dist/types/src/notebook/index.d.ts.map +1 -0
  149. package/dist/types/src/notebook/vfs-parser.d.ts +74 -0
  150. package/dist/types/src/notebook/vfs-parser.d.ts.map +1 -0
  151. package/dist/types/src/notebook/vfs-parser.test.d.ts +2 -0
  152. package/dist/types/src/notebook/vfs-parser.test.d.ts.map +1 -0
  153. package/dist/types/src/templates/chess.d.ts.map +1 -1
  154. package/dist/types/src/templates/data-generator.d.ts.map +1 -1
  155. package/dist/types/src/templates/discord.d.ts.map +1 -1
  156. package/dist/types/src/templates/forex-effect.d.ts.map +1 -1
  157. package/dist/types/src/templates/forex.d.ts.map +1 -1
  158. package/dist/types/src/templates/gmail.d.ts.map +1 -1
  159. package/dist/types/src/templates/index.d.ts +43 -1
  160. package/dist/types/src/templates/index.d.ts.map +1 -1
  161. package/dist/types/src/templates/{echo.d.ts → ping.d.ts} +1 -1
  162. package/dist/types/src/templates/ping.d.ts.map +1 -0
  163. package/dist/types/src/testing/data.d.ts +3 -0
  164. package/dist/types/src/testing/data.d.ts.map +1 -0
  165. package/dist/types/src/testing/index.d.ts +2 -0
  166. package/dist/types/src/testing/index.d.ts.map +1 -0
  167. package/dist/types/src/translations.d.ts +29 -5
  168. package/dist/types/src/translations.d.ts.map +1 -1
  169. package/dist/types/src/types/Notebook.d.ts +31 -0
  170. package/dist/types/src/types/Notebook.d.ts.map +1 -0
  171. package/dist/types/src/types/actions.d.ts +54 -0
  172. package/dist/types/src/types/actions.d.ts.map +1 -0
  173. package/dist/types/src/types/index.d.ts +3 -1
  174. package/dist/types/src/types/index.d.ts.map +1 -1
  175. package/dist/types/src/types/types.d.ts +6 -0
  176. package/dist/types/src/types/types.d.ts.map +1 -0
  177. package/dist/types/src/util/deploy.d.ts +4 -4
  178. package/dist/types/src/util/deploy.d.ts.map +1 -1
  179. package/dist/types/src/util/functions.d.ts +6 -3
  180. package/dist/types/src/util/functions.d.ts.map +1 -1
  181. package/dist/types/tsconfig.tsbuildinfo +1 -1
  182. package/package.json +78 -69
  183. package/src/ScriptPlugin.tsx +88 -69
  184. package/src/capabilities/app-graph-builder.ts +10 -9
  185. package/src/capabilities/artifact-definition.ts +2 -3
  186. package/src/capabilities/compiler.ts +1 -1
  187. package/src/capabilities/intent-resolver.ts +20 -11
  188. package/src/capabilities/react-surface.tsx +30 -17
  189. package/src/capabilities/settings.ts +3 -3
  190. package/src/components/DeploymentDialog/DeploymentDialog.stories.tsx +13 -6
  191. package/src/components/DeploymentDialog/DeploymentDialog.tsx +41 -30
  192. package/src/components/FrameContainer/FrameContainer.tsx +2 -2
  193. package/src/components/NotebookContainer.stories.tsx +83 -0
  194. package/src/components/NotebookContainer.tsx +263 -0
  195. package/src/components/NotebookStack/NotebookCell.tsx +214 -0
  196. package/src/components/NotebookStack/NotebookMenu.tsx +47 -0
  197. package/src/components/NotebookStack/NotebookStack.stories.tsx +54 -0
  198. package/src/components/NotebookStack/NotebookStack.tsx +86 -0
  199. package/src/components/NotebookStack/index.ts +6 -0
  200. package/src/components/ScriptContainer.tsx +5 -5
  201. package/src/components/ScriptToolbar/ScriptToolbar.stories.tsx +22 -10
  202. package/src/components/ScriptToolbar/ScriptToolbar.tsx +30 -33
  203. package/src/components/Settings/ScriptObjectSettings.tsx +110 -15
  204. package/src/components/Settings/ScriptPluginSettings.tsx +4 -19
  205. package/src/components/TestPanel/TestContainer.tsx +2 -2
  206. package/src/components/TestPanel/TestPanel.tsx +42 -19
  207. package/src/components/TypescriptEditor/TypescriptEditor.stories.tsx +71 -16
  208. package/src/components/TypescriptEditor/TypescriptEditor.tsx +36 -35
  209. package/src/components/index.ts +3 -0
  210. package/src/events.ts +2 -2
  211. package/src/hooks/deploy.ts +14 -15
  212. package/src/hooks/format.ts +4 -4
  213. package/src/hooks/template.ts +6 -15
  214. package/src/hooks/useCreateAndDeployScriptTemplates.ts +10 -6
  215. package/src/index.ts +1 -0
  216. package/src/meta.ts +7 -5
  217. package/src/notebook/compute-graph.test.ts +70 -0
  218. package/src/notebook/compute-graph.ts +206 -0
  219. package/src/notebook/eval.ts +105 -0
  220. package/src/notebook/index.ts +5 -0
  221. package/src/notebook/vfs-parser.test.ts +149 -0
  222. package/src/notebook/vfs-parser.ts +451 -0
  223. package/src/templates/chess.ts +2 -0
  224. package/src/templates/data-generator.ts +2 -0
  225. package/src/templates/discord.ts +9 -1
  226. package/src/templates/forex-effect.ts +5 -1
  227. package/src/templates/forex.ts +2 -0
  228. package/src/templates/gmail.ts +22 -11
  229. package/src/templates/index.ts +6 -6
  230. package/src/testing/data.ts +72 -0
  231. package/src/testing/index.ts +5 -0
  232. package/src/translations.ts +32 -7
  233. package/src/types/Notebook.ts +41 -0
  234. package/src/types/actions.ts +53 -0
  235. package/src/types/index.ts +3 -1
  236. package/src/types/types.ts +15 -0
  237. package/src/util/deploy.ts +13 -17
  238. package/src/util/functions.ts +34 -4
  239. package/dist/lib/browser/DeploymentDialog-QZSTVNIS.mjs +0 -12
  240. package/dist/lib/browser/ScriptContainer-JUPCBUCP.mjs +0 -263
  241. package/dist/lib/browser/ScriptContainer-JUPCBUCP.mjs.map +0 -7
  242. package/dist/lib/browser/app-graph-builder-IABOSTBK.mjs.map +0 -7
  243. package/dist/lib/browser/chunk-6CAH7VIE.mjs +0 -283
  244. package/dist/lib/browser/chunk-6CAH7VIE.mjs.map +0 -7
  245. package/dist/lib/browser/chunk-IS4OG2UW.mjs +0 -39
  246. package/dist/lib/browser/chunk-IS4OG2UW.mjs.map +0 -7
  247. package/dist/lib/browser/chunk-NXKU3BNX.mjs +0 -222
  248. package/dist/lib/browser/chunk-NXKU3BNX.mjs.map +0 -7
  249. package/dist/lib/browser/chunk-QYAREHGH.mjs.map +0 -7
  250. package/dist/lib/browser/chunk-RNGIQIEJ.mjs +0 -88
  251. package/dist/lib/browser/chunk-RNGIQIEJ.mjs.map +0 -7
  252. package/dist/lib/browser/chunk-TH7GXPE3.mjs.map +0 -7
  253. package/dist/lib/browser/chunk-YCZPTTFO.mjs.map +0 -7
  254. package/dist/lib/browser/compiler-2HJH34GM.mjs.map +0 -7
  255. package/dist/lib/browser/intent-resolver-YMK5SXVC.mjs.map +0 -7
  256. package/dist/lib/browser/react-surface-FEM5WWFH.mjs.map +0 -7
  257. package/dist/lib/browser/settings-KCTBK5TY.mjs.map +0 -7
  258. package/dist/lib/node-esm/DeploymentDialog-G6EHEPXN.mjs +0 -13
  259. package/dist/lib/node-esm/ScriptContainer-UXZUDQF6.mjs +0 -264
  260. package/dist/lib/node-esm/ScriptContainer-UXZUDQF6.mjs.map +0 -7
  261. package/dist/lib/node-esm/app-graph-builder-CQTTAYHP.mjs.map +0 -7
  262. package/dist/lib/node-esm/chunk-2GBESIHU.mjs +0 -284
  263. package/dist/lib/node-esm/chunk-2GBESIHU.mjs.map +0 -7
  264. package/dist/lib/node-esm/chunk-6M2R2FQF.mjs.map +0 -7
  265. package/dist/lib/node-esm/chunk-AHXJ6NQU.mjs.map +0 -7
  266. package/dist/lib/node-esm/chunk-GWHLP5LM.mjs +0 -90
  267. package/dist/lib/node-esm/chunk-GWHLP5LM.mjs.map +0 -7
  268. package/dist/lib/node-esm/chunk-JIPFLBYA.mjs +0 -40
  269. package/dist/lib/node-esm/chunk-JIPFLBYA.mjs.map +0 -7
  270. package/dist/lib/node-esm/chunk-M642JUOZ.mjs +0 -223
  271. package/dist/lib/node-esm/chunk-M642JUOZ.mjs.map +0 -7
  272. package/dist/lib/node-esm/chunk-ZA36GO4T.mjs.map +0 -7
  273. package/dist/lib/node-esm/compiler-7SP27RA6.mjs.map +0 -7
  274. package/dist/lib/node-esm/intent-resolver-SKRDYQCZ.mjs.map +0 -7
  275. package/dist/lib/node-esm/react-surface-AOKMDJR4.mjs.map +0 -7
  276. package/dist/lib/node-esm/settings-DXZ334A3.mjs.map +0 -7
  277. package/dist/types/src/templates/echo.d.ts.map +0 -1
  278. package/dist/types/src/types/schema.d.ts +0 -38
  279. package/dist/types/src/types/schema.d.ts.map +0 -1
  280. package/src/types/schema.ts +0 -37
  281. /package/dist/lib/browser/{DeploymentDialog-QZSTVNIS.mjs.map → DeploymentDialog-MZX4T77L.mjs.map} +0 -0
  282. /package/dist/lib/{node-esm/DeploymentDialog-G6EHEPXN.mjs.map → browser/chunk-J5LGTIGS.mjs.map} +0 -0
  283. /package/dist/lib/browser/{chunk-5TVBECWH.mjs.map → chunk-UOQ6NCH3.mjs.map} +0 -0
  284. /package/dist/lib/node-esm/{chunk-35M3CHYE.mjs.map → chunk-55JZVM6K.mjs.map} +0 -0
  285. /package/src/templates/{echo.ts → ping.ts} +0 -0
@@ -2,15 +2,16 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
8
6
  import React from 'react';
9
7
 
8
+ import { IntentPlugin } from '@dxos/app-framework';
9
+ import { withPluginManager } from '@dxos/app-framework/testing';
10
10
  import { Obj } from '@dxos/echo';
11
+ import { ClientPlugin } from '@dxos/plugin-client';
11
12
  import { Dialog } from '@dxos/react-ui';
12
- import { DataType } from '@dxos/schema';
13
- import { withLayout, withTheme } from '@dxos/storybook-utils';
13
+ import { withTheme } from '@dxos/react-ui/testing';
14
+ import { AccessToken } from '@dxos/types';
14
15
 
15
16
  import { translations } from '../../translations';
16
17
 
@@ -29,7 +30,13 @@ const meta = {
29
30
  component: DeploymentDialog,
30
31
  render: DefaultStory,
31
32
  parameters: { translations },
32
- decorators: [withTheme, withLayout()],
33
+ // TODO(wittjosiah): Try to write story which does not depend on plugin manager.
34
+ decorators: [
35
+ withTheme,
36
+ withPluginManager({
37
+ plugins: [IntentPlugin(), ClientPlugin({})],
38
+ }),
39
+ ],
33
40
  } satisfies Meta<typeof DefaultStory>;
34
41
 
35
42
  export default meta;
@@ -38,7 +45,7 @@ type Story = StoryObj<typeof meta>;
38
45
 
39
46
  export const Default: Story = {
40
47
  args: {
41
- accessToken: Obj.make(DataType.AccessToken, {
48
+ accessToken: Obj.make(AccessToken.AccessToken, {
42
49
  source: 'example.com',
43
50
  token: 'example-token',
44
51
  }),
@@ -4,16 +4,17 @@
4
4
 
5
5
  import React, { useEffect, useMemo } from 'react';
6
6
 
7
- import { LayoutAction, createIntent, useIntentDispatcher } from '@dxos/app-framework';
7
+ import { LayoutAction, createIntent } from '@dxos/app-framework';
8
+ import { useIntentDispatcher } from '@dxos/app-framework/react';
8
9
  import { getSpace } from '@dxos/react-client/echo';
9
- import { Button, Dialog, Icon, useTranslation } from '@dxos/react-ui';
10
- import { type DataType } from '@dxos/schema';
10
+ import { Button, Dialog, IconButton, useTranslation } from '@dxos/react-ui';
11
+ import { type AccessToken } from '@dxos/types';
11
12
 
12
- import { useCreateAndDeployScriptTemplates } from '../../hooks/useCreateAndDeployScriptTemplates';
13
- import { SCRIPT_PLUGIN } from '../../meta';
13
+ import { useCreateAndDeployScriptTemplates } from '../../hooks';
14
+ import { meta } from '../../meta';
14
15
  import { type Template } from '../../templates';
15
16
 
16
- export const DEPLOYMENT_DIALOG = `${SCRIPT_PLUGIN}/deployment/dialog`;
17
+ export const DEPLOYMENT_DIALOG = `${meta.id}/deployment/dialog`;
17
18
 
18
19
  // TODO(ZaymonFC):
19
20
  // - Show activity and feedback to the user.
@@ -21,12 +22,12 @@ export const DEPLOYMENT_DIALOG = `${SCRIPT_PLUGIN}/deployment/dialog`;
21
22
  // - Pending / onError states.
22
23
 
23
24
  export type DeploymentDialogProps = {
24
- accessToken: DataType.AccessToken;
25
+ accessToken: AccessToken.AccessToken;
25
26
  scriptTemplates: Template[];
26
27
  };
27
28
 
28
29
  export const DeploymentDialog = ({ accessToken, scriptTemplates }: DeploymentDialogProps) => {
29
- const { t } = useTranslation(SCRIPT_PLUGIN);
30
+ const { t } = useTranslation(meta.id);
30
31
  const space = useMemo(() => getSpace(accessToken), [accessToken]);
31
32
 
32
33
  // TODO(ZaymonFC): Thinking further. All of this should get moved to intents to run async in the background.
@@ -41,35 +42,39 @@ export const DeploymentDialog = ({ accessToken, scriptTemplates }: DeploymentDia
41
42
  createIntent(LayoutAction.AddToast, {
42
43
  part: 'toast',
43
44
  subject: {
44
- id: `${SCRIPT_PLUGIN}/deployment-success`,
45
+ id: `${meta.id}/deployment-success`,
45
46
  icon: 'ph--check--regular',
46
47
  duration: Infinity,
47
- title: ['script deployment toast label', { ns: SCRIPT_PLUGIN, count: scriptTemplates.length }],
48
- description: ['script deployment toast description', { ns: SCRIPT_PLUGIN, count: scriptTemplates.length }],
49
- closeLabel: ['script deployment toast close label', { ns: SCRIPT_PLUGIN, count: scriptTemplates.length }],
48
+ title: ['script deployment toast label', { ns: meta.id, count: scriptTemplates.length }],
49
+ description: ['script deployment toast description', { ns: meta.id, count: scriptTemplates.length }],
50
+ closeLabel: ['script deployment toast close label', { ns: meta.id, count: scriptTemplates.length }],
50
51
  },
51
52
  }),
52
53
  );
53
- void dispatch(createIntent(LayoutAction.UpdateDialog, { part: 'dialog', options: { state: false } }));
54
+ void dispatch(
55
+ createIntent(LayoutAction.UpdateDialog, {
56
+ part: 'dialog',
57
+ options: { state: false },
58
+ }),
59
+ );
54
60
  }
55
61
  if (status === 'error') {
56
- void dispatch(createIntent(LayoutAction.UpdateDialog, { part: 'dialog', options: { state: false } }));
62
+ void dispatch(
63
+ createIntent(LayoutAction.UpdateDialog, {
64
+ part: 'dialog',
65
+ options: { state: false },
66
+ }),
67
+ );
57
68
  void dispatch(
58
69
  createIntent(LayoutAction.AddToast, {
59
70
  part: 'toast',
60
71
  subject: {
61
- id: `${SCRIPT_PLUGIN}/deployment-error`,
72
+ id: `${meta.id}/deployment-error`,
62
73
  icon: 'ph--warning--regular',
63
74
  duration: Infinity,
64
- title: ['script deployment error toast label', { ns: SCRIPT_PLUGIN, count: scriptTemplates.length }],
65
- description: [
66
- 'script deployment error toast description',
67
- { ns: SCRIPT_PLUGIN, count: scriptTemplates.length },
68
- ],
69
- closeLabel: [
70
- 'script deployment error toast close label',
71
- { ns: SCRIPT_PLUGIN, count: scriptTemplates.length },
72
- ],
75
+ title: ['script deployment error toast label', { ns: meta.id, count: scriptTemplates.length }],
76
+ description: ['script deployment error toast description', { ns: meta.id, count: scriptTemplates.length }],
77
+ closeLabel: ['script deployment error toast close label', { ns: meta.id, count: scriptTemplates.length }],
73
78
  },
74
79
  }),
75
80
  );
@@ -81,14 +86,16 @@ export const DeploymentDialog = ({ accessToken, scriptTemplates }: DeploymentDia
81
86
  <div className='flex justify-between items-center'>
82
87
  <Dialog.Title>{t('deployment dialog title')}</Dialog.Title>
83
88
  <Dialog.Close asChild>
84
- <Button density='fine' variant='ghost'>
85
- <Icon icon='ph--x--regular' size={4} />
86
- </Button>
89
+ <IconButton icon='ph--x--regular' size={4} label='Close' iconOnly density='fine' variant='ghost' />
87
90
  </Dialog.Close>
88
91
  </div>
89
92
  <div role='none' className='plb-4'>
90
93
  {/* TODO: Implement deployment logic and UI. */}
91
- <p>{t('deployment dialog scripts found message', { count: scriptTemplates.length })}</p>
94
+ <p>
95
+ {t('deployment dialog scripts found message', {
96
+ count: scriptTemplates.length,
97
+ })}
98
+ </p>
92
99
  <ul className='pbs-2'>
93
100
  {scriptTemplates.map((template) => {
94
101
  return <li key={template.id}>{template.name}</li>;
@@ -98,8 +105,12 @@ export const DeploymentDialog = ({ accessToken, scriptTemplates }: DeploymentDia
98
105
  <div role='none' className='flex flex-row-reverse gap-1'>
99
106
  <Button variant='primary' onClick={handleCreateAndDeployScripts} disabled={status === 'pending'}>
100
107
  {status === 'pending'
101
- ? t('deployment dialog deploy functions pending button label', { count: scriptTemplates.length })
102
- : t('deployment dialog deploy functions button label', { count: scriptTemplates.length })}
108
+ ? t('deployment dialog deploy functions pending button label', {
109
+ count: scriptTemplates.length,
110
+ })
111
+ : t('deployment dialog deploy functions button label', {
112
+ count: scriptTemplates.length,
113
+ })}
103
114
  </Button>
104
115
  <Dialog.Close asChild disabled={status === 'pending'}>
105
116
  <Button disabled={status === 'pending'}>{t('deployment dialog skip button label')}</Button>
@@ -5,7 +5,7 @@
5
5
  import React, { useEffect, useRef } from 'react';
6
6
 
7
7
  import { clientServiceBundle } from '@dxos/client-protocol';
8
- import { type BundleResult } from '@dxos/functions/bundler';
8
+ import { type BundleResult } from '@dxos/functions-runtime/bundler';
9
9
  import { invariant } from '@dxos/invariant';
10
10
  import { log } from '@dxos/log';
11
11
  import { useClient } from '@dxos/react-client';
@@ -60,7 +60,7 @@ export const FrameContainer = ({ containerUrl, result, debug = true }: FrameCont
60
60
  <div
61
61
  className={mx(
62
62
  baseSurface,
63
- 'flex absolute right-2 bottom-2 w-[30rem] h-[200px] ring rounded',
63
+ 'flex absolute right-2 bottom-2 is-[30rem] bs-[200px] ring rounded',
64
64
  'z-20 overflow-x-hidden overflow-y-auto',
65
65
  )}
66
66
  >
@@ -0,0 +1,83 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React from 'react';
7
+
8
+ import { SERVICES_CONFIG } from '@dxos/ai/testing';
9
+ import { IntentPlugin, SettingsPlugin } from '@dxos/app-framework';
10
+ import { withPluginManager } from '@dxos/app-framework/testing';
11
+ import { Agent } from '@dxos/assistant-toolkit';
12
+ import { Filter } from '@dxos/echo';
13
+ import { Function, serializeFunction } from '@dxos/functions';
14
+ import { AssistantPlugin } from '@dxos/plugin-assistant';
15
+ import { AutomationPlugin } from '@dxos/plugin-automation';
16
+ import { ClientPlugin } from '@dxos/plugin-client';
17
+ import { ExplorerPlugin } from '@dxos/plugin-explorer';
18
+ import { Markdown, MarkdownPlugin } from '@dxos/plugin-markdown';
19
+ import { SpacePlugin } from '@dxos/plugin-space';
20
+ import { Config, useClient } from '@dxos/react-client';
21
+ import { useQuery } from '@dxos/react-client/echo';
22
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
23
+ import { DataTypes } from '@dxos/schema';
24
+
25
+ import { createNotebook } from '../testing';
26
+ import { translations } from '../translations';
27
+ import { Notebook } from '../types';
28
+
29
+ import { NotebookContainer } from './NotebookContainer';
30
+
31
+ const meta = {
32
+ title: 'plugins/plugin-script/NotebookContainer',
33
+ component: NotebookContainer,
34
+ render: (args) => {
35
+ const client = useClient();
36
+ const space = client.spaces.default;
37
+ const notebooks = useQuery(space?.db, Filter.type(Notebook.Notebook));
38
+ return <NotebookContainer {...args} notebook={notebooks[0]} />;
39
+ },
40
+ decorators: [
41
+ withTheme,
42
+ withLayout({ container: 'column', classNames: 'is-prose' }),
43
+ withPluginManager({
44
+ plugins: [
45
+ ClientPlugin({
46
+ // TODO(wittjosiah): ComputeRuntime requires edge to be configured or it will throw.
47
+ config: new Config({
48
+ runtime: {
49
+ services: SERVICES_CONFIG.REMOTE,
50
+ },
51
+ }),
52
+ types: [...DataTypes, Notebook.Notebook, Function.Function, Markdown.Document],
53
+ onClientInitialized: async ({ client }) => {
54
+ await client.halo.createIdentity();
55
+ await client.spaces.waitUntilReady();
56
+ const space = client.spaces.default;
57
+ await space.waitUntilReady();
58
+
59
+ space.db.add(createNotebook());
60
+ space.db.add(Markdown.make({ content: '# Hello World' }));
61
+ space.db.add(serializeFunction(Agent.prompt));
62
+ },
63
+ }),
64
+ SpacePlugin({}),
65
+ SettingsPlugin(),
66
+ IntentPlugin(),
67
+ AssistantPlugin(),
68
+ AutomationPlugin(),
69
+ ExplorerPlugin(),
70
+ MarkdownPlugin(),
71
+ ],
72
+ }),
73
+ ],
74
+ parameters: {
75
+ translations,
76
+ },
77
+ } satisfies Meta<typeof NotebookContainer>;
78
+
79
+ export default meta;
80
+
81
+ type Story = StoryObj<typeof meta>;
82
+
83
+ export const Default: Story = {};
@@ -0,0 +1,263 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Cause from 'effect/Cause';
6
+ import * as Effect from 'effect/Effect';
7
+ import * as Exit from 'effect/Exit';
8
+ import React, { useCallback, useMemo, useState } from 'react';
9
+
10
+ import { Agent } from '@dxos/assistant-toolkit';
11
+ import { Blueprint, Prompt } from '@dxos/blueprints';
12
+ import { Filter, Obj, Query, Ref } from '@dxos/echo';
13
+ import { QueryBuilder } from '@dxos/echo-query';
14
+ import { type FunctionDefinition, FunctionInvocationService } from '@dxos/functions';
15
+ import { InvocationTracer } from '@dxos/functions-runtime';
16
+ import { TracingServiceExt } from '@dxos/functions-runtime';
17
+ import { invariant } from '@dxos/invariant';
18
+ import { log } from '@dxos/log';
19
+ import { useComputeRuntimeCallback } from '@dxos/plugin-automation';
20
+ import { Graph } from '@dxos/plugin-explorer/types';
21
+ import { getSpace } from '@dxos/react-client/echo';
22
+ import { DropdownMenu, IconButton, Toolbar, useTranslation } from '@dxos/react-ui';
23
+ import { useAttention } from '@dxos/react-ui-attention';
24
+ import { StackItem } from '@dxos/react-ui-stack';
25
+ import { Text } from '@dxos/schema';
26
+ import { isNonNullable } from '@dxos/util';
27
+
28
+ import { meta } from '../meta';
29
+ import { ComputeGraph } from '../notebook';
30
+ import { type Notebook } from '../types';
31
+
32
+ import { NotebookMenu, NotebookStack, type NotebookStackProps } from './NotebookStack';
33
+ import { type TypescriptEditorProps } from './TypescriptEditor';
34
+
35
+ const INCLUDE_BLUEPRINTS = ['dxos.org/blueprint/assistant', 'dxos.org/blueprint/markdown'];
36
+
37
+ // TODO(burdon): Support calling named deployed functions (as with sheet).
38
+
39
+ export type NotebookContainerProps = {
40
+ role?: string;
41
+ notebook?: Notebook.Notebook;
42
+ } & Pick<TypescriptEditorProps, 'env'>;
43
+
44
+ export const NotebookContainer = ({ notebook, env }: NotebookContainerProps) => {
45
+ const { t } = useTranslation(meta.id);
46
+ const space = getSpace(notebook);
47
+ const attendableId = notebook ? Obj.getDXN(notebook).toString() : '';
48
+ const { hasAttention } = useAttention(attendableId);
49
+
50
+ // TODO(burdon): Consolidate execution and state (with graph).
51
+ // Generalize ComputeGraph evaluation function (using effects).
52
+ const graph = useMemo(() => notebook && new ComputeGraph(notebook), [notebook]);
53
+
54
+ const [queryValues, setQueryValues] = useState<Record<string, any>>({});
55
+ const handleExecQueries = useCallback(async () => {
56
+ invariant(space);
57
+
58
+ const builder = new QueryBuilder();
59
+ for (const cell of notebook?.cells ?? []) {
60
+ if (cell.type === 'query') {
61
+ if (cell.source?.target) {
62
+ const source = cell.source.target.content;
63
+ const { name, filter } = builder.build(source);
64
+ if (filter) {
65
+ const ast = Query.select(filter).ast;
66
+ const view = cell.view?.target;
67
+ if (!view) {
68
+ const graph = Graph.make({ query: { ast } });
69
+ const { view } = await Graph.makeView({
70
+ space,
71
+ presentation: graph,
72
+ });
73
+ cell.view = Ref.make(view);
74
+ cell.name = name;
75
+ } else {
76
+ view.query.ast = ast;
77
+ }
78
+ }
79
+ }
80
+
81
+ if (cell.name && cell.view?.target) {
82
+ const view = Obj.getSnapshot(cell.view?.target);
83
+ const query = Query.fromAst(view.query.ast);
84
+ const result = await space?.db.query(query).run();
85
+ const objectIds = result?.objects?.map((obj) => obj.id);
86
+ setQueryValues((prev) => ({ ...prev, [cell.name!]: objectIds }));
87
+ }
88
+ }
89
+ }
90
+ }, [space, notebook, graph]);
91
+
92
+ const [promptResults, setPromptResults] = useState<Record<string, string>>({});
93
+ const handleExecPrompts = useComputeRuntimeCallback(
94
+ space,
95
+ Effect.fnUntraced(function* () {
96
+ invariant(graph);
97
+
98
+ const prompts =
99
+ notebook?.cells
100
+ .filter((cell) => cell.type === 'prompt')
101
+ .map((cell) => cell.prompt)
102
+ .filter(isNonNullable) ?? [];
103
+
104
+ for (const prompt of prompts) {
105
+ yield* runPrompt({
106
+ prompt,
107
+ input: { ...queryValues, ...graph.valuesByName.value },
108
+ onResult: (result) =>
109
+ setPromptResults((prev) => ({
110
+ ...prev,
111
+ [prompt.dxn.toString()]: result,
112
+ })),
113
+ });
114
+ }
115
+ }),
116
+ [notebook, graph, queryValues],
117
+ );
118
+
119
+ // TODO(burdon): Cache values in context (preserve when switched).
120
+ const handleCompute = useCallback(async () => {
121
+ // TODO(burdon): Generalize executors (dependencies).
122
+ await graph?.evaluate();
123
+ await handleExecQueries();
124
+ await handleExecPrompts();
125
+ }, [graph, handleExecQueries, handleExecPrompts]);
126
+
127
+ const handleRearrange = useCallback<NonNullable<NotebookStackProps['onRearrange']>>(
128
+ (source, target) => {
129
+ invariant(notebook);
130
+ const from = notebook.cells.findIndex((cell) => cell.id === source.id);
131
+ const to = notebook.cells.findIndex((cell) => cell.id === target.id);
132
+ if (from != null && to != null) {
133
+ const cell = notebook.cells.splice(from, 1)[0];
134
+ if (cell) {
135
+ notebook.cells.splice(to, 0, cell);
136
+ }
137
+ }
138
+ },
139
+ [notebook],
140
+ );
141
+
142
+ const handleCellInsert = useCallback<NonNullable<NotebookStackProps['onCellInsert']>>(
143
+ async (type, after) => {
144
+ invariant(notebook);
145
+ const cell: Notebook.Cell = { id: crypto.randomUUID(), type };
146
+ switch (type) {
147
+ case 'markdown':
148
+ case 'script':
149
+ case 'query': {
150
+ cell.source = Ref.make(Text.make());
151
+ break;
152
+ }
153
+
154
+ case 'prompt': {
155
+ if (space) {
156
+ const result = await space.db.query(Query.select(Filter.type(Blueprint.Blueprint))).run();
157
+ const blueprints = result.objects
158
+ .filter((blueprint) => INCLUDE_BLUEPRINTS.includes(blueprint.key))
159
+ .map((blueprint) => Ref.make(blueprint));
160
+ cell.prompt = Ref.make(Prompt.make({ instructions: '', blueprints }));
161
+ }
162
+ break;
163
+ }
164
+ }
165
+
166
+ const idx = after ? notebook.cells.findIndex((cell) => cell.id === after) : notebook.cells.length;
167
+ notebook.cells.splice(idx, 0, cell);
168
+ },
169
+ [space, notebook],
170
+ );
171
+
172
+ const handleCellDelete = useCallback<NonNullable<NotebookStackProps['onCellDelete']>>(
173
+ (id) => {
174
+ invariant(notebook);
175
+ const idx = notebook.cells.findIndex((cell) => cell.id === id);
176
+ if (idx !== -1) {
177
+ notebook.cells.splice(idx, 1);
178
+ }
179
+ },
180
+ [notebook],
181
+ );
182
+
183
+ return (
184
+ <StackItem.Content toolbar>
185
+ <Toolbar.Root disabled={!hasAttention} textBlockWidth>
186
+ <DropdownMenu.Root>
187
+ <DropdownMenu.Trigger asChild>
188
+ <IconButton icon='ph--plus--regular' iconOnly label={t('notebook cell insert label')} />
189
+ </DropdownMenu.Trigger>
190
+ <NotebookMenu onCellInsert={handleCellInsert} />
191
+ </DropdownMenu.Root>
192
+ <Toolbar.IconButton
193
+ icon='ph--play--fill'
194
+ iconOnly
195
+ label={t('compute label')}
196
+ classNames='text-green-500'
197
+ onClick={handleCompute}
198
+ />
199
+ </Toolbar.Root>
200
+ <div role='none' className='flex bs-full overflow-hidden -mis-[1px] -mie-[1px]'>
201
+ <NotebookStack
202
+ classNames='container-max-width border-l border-r border-subduedSeparator'
203
+ space={space}
204
+ notebook={notebook}
205
+ graph={graph}
206
+ env={env}
207
+ promptResults={promptResults}
208
+ onRearrange={handleRearrange}
209
+ onCellInsert={handleCellInsert}
210
+ onCellDelete={handleCellDelete}
211
+ />
212
+ </div>
213
+ </StackItem.Content>
214
+ );
215
+ };
216
+
217
+ export default NotebookContainer;
218
+
219
+ // TODO(wittjosiah): Factor out. Copied from PromptArticle in plugin-assistant.
220
+ const runPrompt = Effect.fn(function* ({
221
+ prompt,
222
+ input,
223
+ onResult,
224
+ }: {
225
+ prompt: Ref.Ref<Prompt.Prompt>;
226
+ input: Record<string, any>;
227
+ onResult: (result: string) => void;
228
+ }) {
229
+ const inputData: FunctionDefinition.Input<typeof Agent.prompt> = {
230
+ prompt,
231
+ input,
232
+ };
233
+ const tracer = yield* InvocationTracer;
234
+ const trace = yield* tracer.traceInvocationStart({
235
+ target: undefined,
236
+ payload: {
237
+ data: {},
238
+ },
239
+ });
240
+
241
+ // Invoke the function.
242
+ const result = yield* FunctionInvocationService.invokeFunction(Agent.prompt, inputData).pipe(
243
+ Effect.provide(TracingServiceExt.layerQueue(trace.invocationTraceQueue)),
244
+ Effect.exit,
245
+ );
246
+
247
+ Exit.match(result, {
248
+ onFailure: (cause) => {
249
+ const error = Cause.prettyErrors(cause)[0];
250
+ log.error(error.message, error.cause ?? error.stack);
251
+ onResult(error.message);
252
+ },
253
+ onSuccess: (result: any) => {
254
+ onResult(result.note);
255
+ },
256
+ });
257
+
258
+ yield* tracer.traceInvocationEnd({
259
+ trace,
260
+ // TODO(dmaretskyi): Might miss errors.
261
+ exception: Exit.isFailure(result) ? Cause.prettyErrors(result.cause)[0] : undefined,
262
+ });
263
+ });