@dxos/plugin-script 0.8.4-main.c1de068 → 0.8.4-main.c4373fc

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 (271) hide show
  1. package/dist/lib/browser/DeploymentDialog-7FNPALCV.mjs +12 -0
  2. package/dist/lib/browser/NotebookContainer-ZSXYRRZB.mjs +578 -0
  3. package/dist/lib/browser/NotebookContainer-ZSXYRRZB.mjs.map +7 -0
  4. package/dist/lib/browser/ScriptContainer-24LLLTLB.mjs +149 -0
  5. package/dist/lib/browser/ScriptContainer-24LLLTLB.mjs.map +7 -0
  6. package/dist/lib/browser/{app-graph-builder-HLQ7K3BT.mjs → app-graph-builder-DPYULSME.mjs} +9 -8
  7. package/dist/lib/browser/app-graph-builder-DPYULSME.mjs.map +7 -0
  8. package/dist/lib/browser/blueprint-definition-ET5KZ46I.mjs +28 -0
  9. package/dist/lib/browser/blueprint-definition-ET5KZ46I.mjs.map +7 -0
  10. package/dist/lib/browser/{chunk-3U6DTUH3.mjs → chunk-DXWTBOND.mjs} +26 -27
  11. package/dist/lib/browser/chunk-DXWTBOND.mjs.map +7 -0
  12. package/dist/lib/browser/{chunk-FMDXKOP7.mjs → chunk-ETFBQURU.mjs} +71 -50
  13. package/dist/lib/browser/chunk-ETFBQURU.mjs.map +7 -0
  14. package/dist/lib/browser/{chunk-QYAREHGH.mjs → chunk-EZVXV6DA.mjs} +3 -5
  15. package/dist/lib/browser/chunk-EZVXV6DA.mjs.map +7 -0
  16. package/dist/lib/browser/chunk-I3THDIT5.mjs +90 -0
  17. package/dist/lib/browser/chunk-I3THDIT5.mjs.map +7 -0
  18. package/dist/lib/browser/chunk-N6M34EUC.mjs +112 -0
  19. package/dist/lib/browser/chunk-N6M34EUC.mjs.map +7 -0
  20. package/dist/lib/browser/{chunk-P4HQKUCP.mjs → chunk-NNYSARXK.mjs} +15 -15
  21. package/dist/lib/browser/chunk-NNYSARXK.mjs.map +7 -0
  22. package/dist/lib/browser/{chunk-5TVBECWH.mjs → chunk-OKXN2N7M.mjs} +2 -2
  23. package/dist/lib/browser/{chunk-FIM2MVNJ.mjs → chunk-SRSEZWDY.mjs} +159 -68
  24. package/dist/lib/browser/chunk-SRSEZWDY.mjs.map +7 -0
  25. package/dist/lib/browser/chunk-SWBZUZDX.mjs +80 -0
  26. package/dist/lib/browser/chunk-SWBZUZDX.mjs.map +7 -0
  27. package/dist/lib/browser/chunk-VFJJA4WR.mjs +88 -0
  28. package/dist/lib/browser/chunk-VFJJA4WR.mjs.map +7 -0
  29. package/dist/lib/browser/{compiler-CXCUA4UQ.mjs → compiler-G2N2CG63.mjs} +24 -8
  30. package/dist/lib/browser/compiler-G2N2CG63.mjs.map +7 -0
  31. package/dist/lib/browser/index.mjs +96 -39
  32. package/dist/lib/browser/index.mjs.map +3 -3
  33. package/dist/lib/browser/{intent-resolver-7B77IG3N.mjs → intent-resolver-FYZRLYNT.mjs} +30 -16
  34. package/dist/lib/browser/intent-resolver-FYZRLYNT.mjs.map +7 -0
  35. package/dist/lib/browser/meta.json +1 -1
  36. package/dist/lib/browser/{react-surface-FYYXZA7C.mjs → react-surface-CFRYAL2P.mjs} +36 -13
  37. package/dist/lib/browser/react-surface-CFRYAL2P.mjs.map +7 -0
  38. package/dist/lib/browser/{settings-KCTBK5TY.mjs → settings-L3HCZRBP.mjs} +8 -8
  39. package/dist/lib/browser/settings-L3HCZRBP.mjs.map +7 -0
  40. package/dist/lib/browser/templates/index.mjs +1 -1
  41. package/dist/lib/browser/types/index.mjs +6 -4
  42. package/dist/lib/node-esm/{DeploymentDialog-3KPRWFE7.mjs → DeploymentDialog-AKAGR37W.mjs} +5 -5
  43. package/dist/lib/node-esm/NotebookContainer-2O3N3XPE.mjs +579 -0
  44. package/dist/lib/node-esm/NotebookContainer-2O3N3XPE.mjs.map +7 -0
  45. package/dist/lib/node-esm/ScriptContainer-IKOB6FHQ.mjs +150 -0
  46. package/dist/lib/node-esm/ScriptContainer-IKOB6FHQ.mjs.map +7 -0
  47. package/dist/lib/node-esm/{app-graph-builder-7EYIHWH4.mjs → app-graph-builder-UXJGHXSL.mjs} +9 -8
  48. package/dist/lib/node-esm/app-graph-builder-UXJGHXSL.mjs.map +7 -0
  49. package/dist/lib/node-esm/blueprint-definition-AIYFOT7Q.mjs +30 -0
  50. package/dist/lib/node-esm/blueprint-definition-AIYFOT7Q.mjs.map +7 -0
  51. package/dist/lib/node-esm/{chunk-QKK3NDHW.mjs → chunk-5IKGUOMI.mjs} +15 -15
  52. package/dist/lib/node-esm/chunk-5IKGUOMI.mjs.map +7 -0
  53. package/dist/lib/node-esm/{chunk-RT43MACC.mjs → chunk-7MR2L4T3.mjs} +26 -27
  54. package/dist/lib/node-esm/chunk-7MR2L4T3.mjs.map +7 -0
  55. package/dist/lib/node-esm/chunk-C33FKUSC.mjs +91 -0
  56. package/dist/lib/node-esm/chunk-C33FKUSC.mjs.map +7 -0
  57. package/dist/lib/node-esm/{chunk-35M3CHYE.mjs → chunk-NUXZQQ6P.mjs} +2 -2
  58. package/dist/lib/node-esm/{chunk-AHXJ6NQU.mjs → chunk-OG2SIKHE.mjs} +3 -5
  59. package/dist/lib/node-esm/chunk-OG2SIKHE.mjs.map +7 -0
  60. package/dist/lib/node-esm/chunk-OQGBKNYU.mjs +90 -0
  61. package/dist/lib/node-esm/chunk-OQGBKNYU.mjs.map +7 -0
  62. package/dist/lib/node-esm/{chunk-7NMI4CEU.mjs → chunk-PMQ3D535.mjs} +159 -68
  63. package/dist/lib/node-esm/chunk-PMQ3D535.mjs.map +7 -0
  64. package/dist/lib/node-esm/{chunk-XJPK3IYI.mjs → chunk-U4CZGISN.mjs} +71 -50
  65. package/dist/lib/node-esm/chunk-U4CZGISN.mjs.map +7 -0
  66. package/dist/lib/node-esm/chunk-VRSDE4CI.mjs +114 -0
  67. package/dist/lib/node-esm/chunk-VRSDE4CI.mjs.map +7 -0
  68. package/dist/lib/node-esm/chunk-ZF5ULKED.mjs +81 -0
  69. package/dist/lib/node-esm/chunk-ZF5ULKED.mjs.map +7 -0
  70. package/dist/lib/node-esm/{compiler-EPFKQXPE.mjs → compiler-PLDAZ5GJ.mjs} +24 -8
  71. package/dist/lib/node-esm/compiler-PLDAZ5GJ.mjs.map +7 -0
  72. package/dist/lib/node-esm/index.mjs +96 -39
  73. package/dist/lib/node-esm/index.mjs.map +3 -3
  74. package/dist/lib/node-esm/{intent-resolver-FRZGS4TB.mjs → intent-resolver-6J3CFL5T.mjs} +30 -16
  75. package/dist/lib/node-esm/intent-resolver-6J3CFL5T.mjs.map +7 -0
  76. package/dist/lib/node-esm/meta.json +1 -1
  77. package/dist/lib/node-esm/{react-surface-V32NWHKN.mjs → react-surface-NPKEO7SA.mjs} +36 -13
  78. package/dist/lib/node-esm/react-surface-NPKEO7SA.mjs.map +7 -0
  79. package/dist/lib/node-esm/{settings-DXZ334A3.mjs → settings-YWGZP4EW.mjs} +8 -8
  80. package/dist/lib/node-esm/settings-YWGZP4EW.mjs.map +7 -0
  81. package/dist/lib/node-esm/templates/index.mjs +1 -1
  82. package/dist/lib/node-esm/types/index.mjs +6 -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 +1 -1
  86. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  87. package/dist/types/src/capabilities/artifact-definition.d.ts +1 -1
  88. package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
  89. package/dist/types/src/capabilities/blueprint-definition.d.ts +5 -0
  90. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
  91. package/dist/types/src/capabilities/compiler.d.ts +1 -1
  92. package/dist/types/src/capabilities/compiler.d.ts.map +1 -1
  93. package/dist/types/src/capabilities/index.d.ts +6 -6
  94. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  95. package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
  96. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  97. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  98. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  99. package/dist/types/src/capabilities/settings.d.ts +1 -1
  100. package/dist/types/src/compiler/compiler.d.ts.map +1 -1
  101. package/dist/types/src/components/DeploymentDialog/DeploymentDialog.d.ts +2 -2
  102. package/dist/types/src/components/DeploymentDialog/DeploymentDialog.d.ts.map +1 -1
  103. package/dist/types/src/components/DeploymentDialog/DeploymentDialog.stories.d.ts +225 -13
  104. package/dist/types/src/components/DeploymentDialog/DeploymentDialog.stories.d.ts.map +1 -1
  105. package/dist/types/src/components/DeploymentDialog/index.d.ts +1 -1
  106. package/dist/types/src/components/DeploymentDialog/index.d.ts.map +1 -1
  107. package/dist/types/src/components/FrameContainer/FrameContainer.d.ts.map +1 -1
  108. package/dist/types/src/components/NotebookContainer.d.ts +10 -0
  109. package/dist/types/src/components/NotebookContainer.d.ts.map +1 -0
  110. package/dist/types/src/components/NotebookContainer.stories.d.ts +231 -0
  111. package/dist/types/src/components/NotebookContainer.stories.d.ts.map +1 -0
  112. package/dist/types/src/components/NotebookStack/NotebookStack.d.ts +16 -0
  113. package/dist/types/src/components/NotebookStack/NotebookStack.d.ts.map +1 -0
  114. package/dist/types/src/components/NotebookStack/NotebookStack.stories.d.ts +231 -0
  115. package/dist/types/src/components/NotebookStack/NotebookStack.stories.d.ts.map +1 -0
  116. package/dist/types/src/components/NotebookStack/index.d.ts +2 -0
  117. package/dist/types/src/components/NotebookStack/index.d.ts.map +1 -0
  118. package/dist/types/src/components/ScriptContainer.d.ts +2 -2
  119. package/dist/types/src/components/ScriptContainer.d.ts.map +1 -1
  120. package/dist/types/src/components/ScriptToolbar/ScriptToolbar.d.ts.map +1 -1
  121. package/dist/types/src/components/ScriptToolbar/ScriptToolbar.stories.d.ts +227 -10
  122. package/dist/types/src/components/ScriptToolbar/ScriptToolbar.stories.d.ts.map +1 -1
  123. package/dist/types/src/components/Settings/ScriptObjectSettings.d.ts.map +1 -1
  124. package/dist/types/src/components/Settings/ScriptPluginSettings.d.ts +2 -2
  125. package/dist/types/src/components/Settings/ScriptPluginSettings.d.ts.map +1 -1
  126. package/dist/types/src/components/TestPanel/TestContainer.d.ts.map +1 -1
  127. package/dist/types/src/components/TypescriptEditor/TypescriptEditor.d.ts +4 -2
  128. package/dist/types/src/components/TypescriptEditor/TypescriptEditor.d.ts.map +1 -1
  129. package/dist/types/src/components/TypescriptEditor/TypescriptEditor.stories.d.ts +17 -4
  130. package/dist/types/src/components/TypescriptEditor/TypescriptEditor.stories.d.ts.map +1 -1
  131. package/dist/types/src/components/index.d.ts +3 -4
  132. package/dist/types/src/components/index.d.ts.map +1 -1
  133. package/dist/types/src/events.d.ts.map +1 -1
  134. package/dist/types/src/hooks/deploy.d.ts +11 -10
  135. package/dist/types/src/hooks/deploy.d.ts.map +1 -1
  136. package/dist/types/src/hooks/template.d.ts.map +1 -1
  137. package/dist/types/src/hooks/useCreateAndDeployScriptTemplates.d.ts.map +1 -1
  138. package/dist/types/src/index.d.ts +1 -0
  139. package/dist/types/src/index.d.ts.map +1 -1
  140. package/dist/types/src/meta.d.ts +0 -1
  141. package/dist/types/src/meta.d.ts.map +1 -1
  142. package/dist/types/src/notebook/index.d.ts +2 -0
  143. package/dist/types/src/notebook/index.d.ts.map +1 -0
  144. package/dist/types/src/notebook/notebook.d.ts +39 -0
  145. package/dist/types/src/notebook/notebook.d.ts.map +1 -0
  146. package/dist/types/src/notebook/notebook.test.d.ts +2 -0
  147. package/dist/types/src/notebook/notebook.test.d.ts.map +1 -0
  148. package/dist/types/src/notebook/vfs-parser.d.ts +74 -0
  149. package/dist/types/src/notebook/vfs-parser.d.ts.map +1 -0
  150. package/dist/types/src/notebook/vfs-parser.test.d.ts +2 -0
  151. package/dist/types/src/notebook/vfs-parser.test.d.ts.map +1 -0
  152. package/dist/types/src/templates/chess.d.ts.map +1 -1
  153. package/dist/types/src/templates/data-generator.d.ts.map +1 -1
  154. package/dist/types/src/templates/discord.d.ts.map +1 -1
  155. package/dist/types/src/templates/forex-effect.d.ts.map +1 -1
  156. package/dist/types/src/templates/forex.d.ts.map +1 -1
  157. package/dist/types/src/templates/gmail.d.ts.map +1 -1
  158. package/dist/types/src/testing/data.d.ts +10 -0
  159. package/dist/types/src/testing/data.d.ts.map +1 -0
  160. package/dist/types/src/testing/index.d.ts +2 -0
  161. package/dist/types/src/testing/index.d.ts.map +1 -0
  162. package/dist/types/src/translations.d.ts +21 -2
  163. package/dist/types/src/translations.d.ts.map +1 -1
  164. package/dist/types/src/types/actions.d.ts +58 -0
  165. package/dist/types/src/types/actions.d.ts.map +1 -0
  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/schema.d.ts +29 -32
  169. package/dist/types/src/types/schema.d.ts.map +1 -1
  170. package/dist/types/src/util/deploy.d.ts +3 -3
  171. package/dist/types/src/util/deploy.d.ts.map +1 -1
  172. package/dist/types/src/util/functions.d.ts +5 -2
  173. package/dist/types/src/util/functions.d.ts.map +1 -1
  174. package/dist/types/tsconfig.tsbuildinfo +1 -1
  175. package/package.json +73 -69
  176. package/src/ScriptPlugin.tsx +91 -69
  177. package/src/capabilities/app-graph-builder.ts +6 -5
  178. package/src/capabilities/artifact-definition.ts +8 -12
  179. package/src/capabilities/blueprint-definition.ts +30 -0
  180. package/src/capabilities/compiler.ts +2 -1
  181. package/src/capabilities/index.ts +1 -1
  182. package/src/capabilities/intent-resolver.ts +15 -8
  183. package/src/capabilities/react-surface.tsx +20 -7
  184. package/src/capabilities/settings.ts +3 -3
  185. package/src/compiler/compiler.ts +1 -1
  186. package/src/components/DeploymentDialog/DeploymentDialog.stories.tsx +34 -20
  187. package/src/components/DeploymentDialog/DeploymentDialog.tsx +16 -22
  188. package/src/components/DeploymentDialog/index.ts +1 -1
  189. package/src/components/FrameContainer/FrameContainer.tsx +3 -2
  190. package/src/components/NotebookContainer.stories.tsx +36 -0
  191. package/src/components/NotebookContainer.tsx +82 -0
  192. package/src/components/NotebookStack/NotebookStack.stories.tsx +36 -0
  193. package/src/components/NotebookStack/NotebookStack.tsx +113 -0
  194. package/src/components/NotebookStack/index.ts +5 -0
  195. package/src/components/ScriptContainer.tsx +4 -3
  196. package/src/components/ScriptToolbar/ScriptToolbar.stories.tsx +33 -17
  197. package/src/components/ScriptToolbar/ScriptToolbar.tsx +30 -23
  198. package/src/components/Settings/ScriptObjectSettings.tsx +111 -31
  199. package/src/components/Settings/ScriptPluginSettings.tsx +37 -47
  200. package/src/components/TestPanel/TestContainer.tsx +2 -1
  201. package/src/components/TestPanel/TestPanel.tsx +6 -6
  202. package/src/components/TypescriptEditor/TypescriptEditor.stories.tsx +84 -30
  203. package/src/components/TypescriptEditor/TypescriptEditor.tsx +32 -25
  204. package/src/components/index.ts +3 -0
  205. package/src/events.ts +2 -2
  206. package/src/hooks/deploy.ts +18 -19
  207. package/src/hooks/format.ts +2 -2
  208. package/src/hooks/template.ts +4 -3
  209. package/src/hooks/useCreateAndDeployScriptTemplates.ts +4 -3
  210. package/src/index.ts +1 -0
  211. package/src/meta.ts +2 -4
  212. package/src/notebook/index.ts +5 -0
  213. package/src/notebook/notebook.test.ts +38 -0
  214. package/src/notebook/notebook.ts +188 -0
  215. package/src/notebook/vfs-parser.test.ts +149 -0
  216. package/src/notebook/vfs-parser.ts +490 -0
  217. package/src/templates/chess.ts +3 -1
  218. package/src/templates/data-generator.ts +9 -3
  219. package/src/templates/discord.ts +12 -4
  220. package/src/templates/forex-effect.ts +7 -3
  221. package/src/templates/forex.ts +3 -1
  222. package/src/templates/gmail.ts +33 -62
  223. package/src/testing/data.ts +37 -0
  224. package/src/testing/index.ts +5 -0
  225. package/src/translations.ts +24 -4
  226. package/src/types/actions.ts +49 -0
  227. package/src/types/index.ts +1 -0
  228. package/src/types/schema.ts +24 -19
  229. package/src/util/deploy.ts +20 -33
  230. package/src/util/functions.ts +35 -6
  231. package/dist/lib/browser/DeploymentDialog-M4QIHTDR.mjs +0 -12
  232. package/dist/lib/browser/ScriptContainer-Z6SIGRRC.mjs +0 -262
  233. package/dist/lib/browser/ScriptContainer-Z6SIGRRC.mjs.map +0 -7
  234. package/dist/lib/browser/app-graph-builder-HLQ7K3BT.mjs.map +0 -7
  235. package/dist/lib/browser/artifact-definition-24Q3IHOU.mjs +0 -249
  236. package/dist/lib/browser/artifact-definition-24Q3IHOU.mjs.map +0 -7
  237. package/dist/lib/browser/chunk-3U6DTUH3.mjs.map +0 -7
  238. package/dist/lib/browser/chunk-FIM2MVNJ.mjs.map +0 -7
  239. package/dist/lib/browser/chunk-FMDXKOP7.mjs.map +0 -7
  240. package/dist/lib/browser/chunk-IS4OG2UW.mjs +0 -39
  241. package/dist/lib/browser/chunk-IS4OG2UW.mjs.map +0 -7
  242. package/dist/lib/browser/chunk-P4HQKUCP.mjs.map +0 -7
  243. package/dist/lib/browser/chunk-QYAREHGH.mjs.map +0 -7
  244. package/dist/lib/browser/chunk-R4R7VOFY.mjs +0 -88
  245. package/dist/lib/browser/chunk-R4R7VOFY.mjs.map +0 -7
  246. package/dist/lib/browser/compiler-CXCUA4UQ.mjs.map +0 -7
  247. package/dist/lib/browser/intent-resolver-7B77IG3N.mjs.map +0 -7
  248. package/dist/lib/browser/react-surface-FYYXZA7C.mjs.map +0 -7
  249. package/dist/lib/browser/settings-KCTBK5TY.mjs.map +0 -7
  250. package/dist/lib/node-esm/ScriptContainer-KPU75HHI.mjs +0 -263
  251. package/dist/lib/node-esm/ScriptContainer-KPU75HHI.mjs.map +0 -7
  252. package/dist/lib/node-esm/app-graph-builder-7EYIHWH4.mjs.map +0 -7
  253. package/dist/lib/node-esm/artifact-definition-WAJFALUI.mjs +0 -250
  254. package/dist/lib/node-esm/artifact-definition-WAJFALUI.mjs.map +0 -7
  255. package/dist/lib/node-esm/chunk-7NMI4CEU.mjs.map +0 -7
  256. package/dist/lib/node-esm/chunk-AHXJ6NQU.mjs.map +0 -7
  257. package/dist/lib/node-esm/chunk-F5GFJ3PY.mjs +0 -90
  258. package/dist/lib/node-esm/chunk-F5GFJ3PY.mjs.map +0 -7
  259. package/dist/lib/node-esm/chunk-JIPFLBYA.mjs +0 -40
  260. package/dist/lib/node-esm/chunk-JIPFLBYA.mjs.map +0 -7
  261. package/dist/lib/node-esm/chunk-QKK3NDHW.mjs.map +0 -7
  262. package/dist/lib/node-esm/chunk-RT43MACC.mjs.map +0 -7
  263. package/dist/lib/node-esm/chunk-XJPK3IYI.mjs.map +0 -7
  264. package/dist/lib/node-esm/compiler-EPFKQXPE.mjs.map +0 -7
  265. package/dist/lib/node-esm/intent-resolver-FRZGS4TB.mjs.map +0 -7
  266. package/dist/lib/node-esm/react-surface-V32NWHKN.mjs.map +0 -7
  267. package/dist/lib/node-esm/settings-DXZ334A3.mjs.map +0 -7
  268. /package/dist/lib/browser/{DeploymentDialog-M4QIHTDR.mjs.map → DeploymentDialog-7FNPALCV.mjs.map} +0 -0
  269. /package/dist/lib/browser/{chunk-5TVBECWH.mjs.map → chunk-OKXN2N7M.mjs.map} +0 -0
  270. /package/dist/lib/node-esm/{DeploymentDialog-3KPRWFE7.mjs.map → DeploymentDialog-AKAGR37W.mjs.map} +0 -0
  271. /package/dist/lib/node-esm/{chunk-35M3CHYE.mjs.map → chunk-NUXZQQ6P.mjs.map} +0 -0
@@ -3,17 +3,20 @@
3
3
  //
4
4
 
5
5
  import { Octokit } from '@octokit/core';
6
- import React, { type ChangeEvent, useCallback, useEffect, useState } from 'react';
6
+ import React, { type ChangeEvent, useCallback, useState } from 'react';
7
7
 
8
- import { createIntent, SettingsAction, useIntentDispatcher } from '@dxos/app-framework';
9
- import { FunctionType, type ScriptType, getInvocationUrl, getUserFunctionUrlInMetadata } from '@dxos/functions';
8
+ import { ToolId } from '@dxos/ai';
9
+ import { SettingsAction, createIntent, useIntentDispatcher } from '@dxos/app-framework';
10
+ import { Blueprint, Template } from '@dxos/blueprints';
11
+ import { FunctionType, type ScriptType, getInvocationUrl, getUserFunctionIdInMetadata } from '@dxos/functions';
10
12
  import { log } from '@dxos/log';
11
13
  import { useClient } from '@dxos/react-client';
12
- import { Filter, getMeta, getSpace, Ref, useQuery } from '@dxos/react-client/echo';
13
- import { Button, Clipboard, Input, useControlledState, useTranslation } from '@dxos/react-ui';
14
+ import { Filter, Ref, getMeta, getSpace, useQuery } from '@dxos/react-client/echo';
15
+ import { Button, Clipboard, Input, useAsyncEffect, useControlledState, useTranslation } from '@dxos/react-ui';
14
16
  import { DataType } from '@dxos/schema';
17
+ import { kebabize } from '@dxos/util';
15
18
 
16
- import { SCRIPT_PLUGIN } from '../../meta';
19
+ import { meta } from '../../meta';
17
20
 
18
21
  export type ScriptObjectSettingsProps = {
19
22
  object: ScriptType;
@@ -23,13 +26,14 @@ export const ScriptObjectSettings = ({ object }: ScriptObjectSettingsProps) => {
23
26
  return (
24
27
  <>
25
28
  <Binding object={object} />
29
+ <BlueprintEditor object={object} />
26
30
  <Publishing object={object} />
27
31
  </>
28
32
  );
29
33
  };
30
34
 
31
35
  export const ScriptProperties = ({ object }: ScriptObjectSettingsProps) => {
32
- const { t } = useTranslation(SCRIPT_PLUGIN);
36
+ const { t } = useTranslation(meta.id);
33
37
  return (
34
38
  <Input.Root>
35
39
  <Input.Label>{t('description label')}</Input.Label>
@@ -44,16 +48,100 @@ export const ScriptProperties = ({ object }: ScriptObjectSettingsProps) => {
44
48
  );
45
49
  };
46
50
 
51
+ const BlueprintEditor = ({ object }: ScriptObjectSettingsProps) => {
52
+ const { t } = useTranslation(meta.id);
53
+ const space = getSpace(object);
54
+ const [fn] = useQuery(space, Filter.type(FunctionType, { source: Ref.make(object) }));
55
+ const blueprints = useQuery(space, Filter.type(Blueprint.Blueprint));
56
+
57
+ const [creating, setCreating] = useState(false);
58
+ const [instructions, setInstructions] = useState<string>(`You can run the script "${object.name ?? 'script'}".`);
59
+ const blueprintKey = `dxos.org/blueprint/${kebabize(object.name ?? 'script')}`;
60
+ const existingBlueprint = blueprints.find((bp) => bp.key === blueprintKey);
61
+
62
+ useAsyncEffect(async () => {
63
+ if (!existingBlueprint) {
64
+ return;
65
+ }
66
+ const source = await existingBlueprint.instructions.source.load();
67
+ setInstructions(source.content ?? '');
68
+ }, [existingBlueprint]);
69
+
70
+ const handleSave = useCallback(async () => {
71
+ if (!space) {
72
+ return;
73
+ }
74
+
75
+ setCreating(true);
76
+ try {
77
+ if (existingBlueprint) {
78
+ const text = await existingBlueprint.instructions.source.load();
79
+ text.content = instructions;
80
+ if (fn?.key) {
81
+ const toolId = ToolId.make(fn.key);
82
+ if (!existingBlueprint.tools?.includes(toolId)) {
83
+ existingBlueprint.tools = [...(existingBlueprint.tools ?? []), toolId];
84
+ }
85
+ }
86
+ } else if (fn?.key) {
87
+ space.db.add(
88
+ Blueprint.make({
89
+ key: blueprintKey,
90
+ name: object.name ?? 'Script',
91
+ instructions: Template.make({
92
+ source: instructions,
93
+ }),
94
+ tools: [ToolId.make(fn.key)],
95
+ }),
96
+ );
97
+ }
98
+ await space.db.flush();
99
+ } finally {
100
+ setCreating(false);
101
+ }
102
+ }, [space, existingBlueprint, fn, blueprintKey, object.name, instructions]);
103
+
104
+ return (
105
+ <div className='flex flex-col gap-4 mlb-cardSpacingBlock'>
106
+ <div>
107
+ <h2>{t('blueprint editor label', { default: 'Blueprint' })}</h2>
108
+ <p className='text-description text-sm'>
109
+ {t('blueprint editor description', { default: 'Create a blueprint that exposes this script as a tool.' })}
110
+ </p>
111
+ </div>
112
+ <Input.Root>
113
+ <div role='none' className='flex flex-col gap-1'>
114
+ <Input.Label>{t('blueprint instructions label', { default: 'Instructions' })}</Input.Label>
115
+ <Input.TextArea
116
+ placeholder={t('blueprint instructions placeholder', { default: 'Describe how this tool should be used.' })}
117
+ rows={6}
118
+ value={instructions}
119
+ onChange={(event) => setInstructions(event.target.value)}
120
+ classNames='resize-y'
121
+ />
122
+ </div>
123
+ </Input.Root>
124
+ <div className='flex justify-end gap-2'>
125
+ <Button disabled={(!existingBlueprint && !fn?.key) || creating} onClick={handleSave}>
126
+ {t(creating ? 'creating label' : 'create blueprint label', {
127
+ default: creating ? 'Creating…' : 'Create blueprint',
128
+ })}
129
+ </Button>
130
+ </div>
131
+ </div>
132
+ );
133
+ };
134
+
47
135
  const Binding = ({ object }: ScriptObjectSettingsProps) => {
48
- const { t } = useTranslation(SCRIPT_PLUGIN);
136
+ const { t } = useTranslation(meta.id);
49
137
  const client = useClient();
50
138
  const space = getSpace(object);
51
139
  const [fn] = useQuery(space, Filter.type(FunctionType, { source: Ref.make(object) }));
52
140
 
53
- const functionPath = fn && getUserFunctionUrlInMetadata(getMeta(fn));
141
+ const functionId = fn && getUserFunctionIdInMetadata(getMeta(fn));
54
142
  const functionUrl =
55
- functionPath &&
56
- getInvocationUrl(functionPath, client.config.values.runtime?.services?.edge?.url ?? '', {
143
+ functionId &&
144
+ getInvocationUrl(functionId, client.config.values.runtime?.services?.edge?.url ?? '', {
57
145
  spaceId: space?.id,
58
146
  });
59
147
 
@@ -109,14 +197,14 @@ const Binding = ({ object }: ScriptObjectSettingsProps) => {
109
197
 
110
198
  // TODO(burdon): Move to separate tab?
111
199
  const Publishing = ({ object }: ScriptObjectSettingsProps) => {
112
- const { t } = useTranslation(SCRIPT_PLUGIN);
200
+ const { t } = useTranslation(meta.id);
113
201
  const { dispatchPromise: dispatch } = useIntentDispatcher();
114
202
  const space = getSpace(object);
115
203
  const [githubToken] = useQuery(space, Filter.type(DataType.AccessToken, { source: 'github.com' }));
116
204
  const gistKey = getMeta(object).keys.find(({ source }) => source === 'github.com');
117
205
  const [gistUrl, setGistUrl] = useState<string | undefined>();
118
206
 
119
- useEffect(() => {
207
+ useAsyncEffect(async () => {
120
208
  const token = githubToken?.token;
121
209
  const gistId = gistKey?.id;
122
210
  if (!token || !gistId) {
@@ -124,20 +212,16 @@ const Publishing = ({ object }: ScriptObjectSettingsProps) => {
124
212
  return;
125
213
  }
126
214
 
127
- const timeout = setTimeout(async () => {
128
- try {
129
- const octokit = new Octokit({ auth: githubToken.token });
130
- const response = await octokit.request('GET /gists/{gist_id}', {
131
- gist_id: gistId,
132
- });
133
- setGistUrl(response.data.html_url);
134
- } catch (err) {
135
- log.catch(err);
136
- setGistUrl(undefined);
137
- }
138
- });
139
-
140
- return () => clearTimeout(timeout);
215
+ try {
216
+ const octokit = new Octokit({ auth: githubToken.token });
217
+ const response = await octokit.request('GET /gists/{gist_id}', {
218
+ gist_id: gistId,
219
+ });
220
+ setGistUrl(response.data.html_url);
221
+ } catch (err) {
222
+ log.catch(err);
223
+ setGistUrl(undefined);
224
+ }
141
225
  }, [githubToken, gistKey]);
142
226
 
143
227
  const handleOpenTokenManager = useCallback(
@@ -200,7 +284,3 @@ const Publishing = ({ object }: ScriptObjectSettingsProps) => {
200
284
  </div>
201
285
  );
202
286
  };
203
-
204
- // TODO(wittjosiah): Factor out.
205
- // From https://stackoverflow.com/a/67243723/2804332
206
- const kebabize = (str: string) => str.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? '-' : '') + $.toLowerCase());
@@ -4,68 +4,58 @@
4
4
 
5
5
  import React from 'react';
6
6
 
7
- import { type Credential } from '@dxos/protocols/proto/dxos/halo/credentials';
8
7
  import { useClient } from '@dxos/react-client';
9
8
  import { Button, Select, useTranslation } from '@dxos/react-ui';
10
9
  import { type EditorInputMode, EditorInputModes } from '@dxos/react-ui-editor';
11
- import { DeprecatedFormContainer, DeprecatedFormInput } from '@dxos/react-ui-form';
10
+ import { ControlGroup, ControlItemInput, ControlPage, ControlSection } from '@dxos/react-ui-form';
12
11
 
13
12
  import { meta } from '../../meta';
14
- import { type ScriptSettingsProps } from '../../types';
13
+ import { type ScriptSettings } from '../../types';
14
+ import { getAccessCredential } from '../../util';
15
15
 
16
- export const ScriptPluginSettings = ({ settings }: { settings: ScriptSettingsProps }) => {
16
+ export const ScriptPluginSettings = ({ settings }: { settings: ScriptSettings }) => {
17
17
  const { t } = useTranslation(meta.id);
18
18
  const client = useClient();
19
19
 
20
20
  // TODO(burdon): Check token.
21
21
  const handleAuthenticate = async () => {
22
22
  const { identityKey } = client.halo.identity.get()!;
23
- await client.halo.writeCredentials([
24
- {
25
- issuer: identityKey,
26
- issuanceDate: new Date(),
27
- subject: {
28
- id: identityKey,
29
- assertion: {
30
- '@type': 'dxos.halo.credentials.ServiceAccess',
31
- serverName: 'hub.dxos.network',
32
- serverKey: identityKey,
33
- identityKey,
34
- capabilities: ['composer:beta'],
35
- },
36
- },
37
- } satisfies Credential,
38
- ]);
23
+ await client.halo.writeCredentials([getAccessCredential(identityKey)]);
39
24
  };
40
25
 
41
26
  return (
42
- <DeprecatedFormContainer>
43
- {/* TODO(wittjosiah): Hide outside of dev environments. */}
44
- <DeprecatedFormInput label={t('authenticate action label')}>
45
- <Button onClick={handleAuthenticate}>{t('authenticate button label')}</Button>
46
- </DeprecatedFormInput>
27
+ <ControlPage>
28
+ <ControlSection title={t('settings title', { ns: meta.id })}>
29
+ <ControlGroup>
30
+ {/* TODO(wittjosiah): Hide outside of dev environments. */}
31
+ <ControlItemInput title={t('authenticate action label')}>
32
+ <Button onClick={handleAuthenticate}>{t('authenticate button label')}</Button>
33
+ </ControlItemInput>
47
34
 
48
- <DeprecatedFormInput label={t('editor input mode label')}>
49
- <Select.Root
50
- value={settings.editorInputMode ?? 'default'}
51
- onValueChange={(value) => {
52
- settings.editorInputMode = value as EditorInputMode;
53
- }}
54
- >
55
- <Select.TriggerButton placeholder={t('select editor input mode placeholder')} />
56
- <Select.Portal>
57
- <Select.Content>
58
- <Select.Viewport>
59
- {EditorInputModes.map((mode) => (
60
- <Select.Option key={mode} value={mode}>
61
- {t(`settings editor input mode ${mode} label`)}
62
- </Select.Option>
63
- ))}
64
- </Select.Viewport>
65
- </Select.Content>
66
- </Select.Portal>
67
- </Select.Root>
68
- </DeprecatedFormInput>
69
- </DeprecatedFormContainer>
35
+ <ControlItemInput title={t('editor input mode label')}>
36
+ <Select.Root
37
+ value={settings.editorInputMode ?? 'default'}
38
+ onValueChange={(value) => {
39
+ settings.editorInputMode = value as EditorInputMode;
40
+ }}
41
+ >
42
+ <Select.TriggerButton placeholder={t('select editor input mode placeholder')} />
43
+ <Select.Portal>
44
+ <Select.Content>
45
+ <Select.Viewport>
46
+ {EditorInputModes.map((mode) => (
47
+ <Select.Option key={mode} value={mode}>
48
+ {t(`settings editor input mode ${mode} label`)}
49
+ </Select.Option>
50
+ ))}
51
+ </Select.Viewport>
52
+ <Select.Arrow />
53
+ </Select.Content>
54
+ </Select.Portal>
55
+ </Select.Root>
56
+ </ControlItemInput>
57
+ </ControlGroup>
58
+ </ControlSection>
59
+ </ControlPage>
70
60
  );
71
61
  };
@@ -7,9 +7,10 @@ import React from 'react';
7
7
  import { type ScriptType } from '@dxos/functions';
8
8
  import { StackItem } from '@dxos/react-ui-stack';
9
9
 
10
- import { TestPanel } from './TestPanel';
11
10
  import { useDeployState, useToolbarState } from '../../hooks';
12
11
 
12
+ import { TestPanel } from './TestPanel';
13
+
13
14
  export type TestContainerProps = {
14
15
  role: string;
15
16
  script: ScriptType;
@@ -9,7 +9,7 @@ import { Avatar, Icon, Input, type ThemedClassName, Toolbar, useTranslation } fr
9
9
  import { SyntaxHighlighter } from '@dxos/react-ui-syntax-highlighter';
10
10
  import { errorText, mx } from '@dxos/react-ui-theme';
11
11
 
12
- import { SCRIPT_PLUGIN } from '../../meta';
12
+ import { meta } from '../../meta';
13
13
 
14
14
  type State = 'pending' | 'responding';
15
15
 
@@ -24,7 +24,7 @@ export type TestPanelProps = ThemedClassName<{
24
24
 
25
25
  // TODO(burdon): Need persistent history (currently lost when switching tabs)..
26
26
  export const TestPanel = ({ classNames, functionUrl }: TestPanelProps) => {
27
- const { t } = useTranslation(SCRIPT_PLUGIN);
27
+ const { t } = useTranslation(meta.id);
28
28
 
29
29
  const inputRef = useRef<HTMLInputElement>(null);
30
30
  const [input, setInput] = useState('');
@@ -41,7 +41,7 @@ export const TestPanel = ({ classNames, functionUrl }: TestPanelProps) => {
41
41
  }
42
42
  };
43
43
 
44
- const controller = useRef<AbortController>();
44
+ const controller = useRef<AbortController>(null);
45
45
  useEffect(() => {
46
46
  return () => {
47
47
  handleStop();
@@ -50,7 +50,7 @@ export const TestPanel = ({ classNames, functionUrl }: TestPanelProps) => {
50
50
 
51
51
  const handleStop = () => {
52
52
  controller.current?.abort('stop');
53
- controller.current = undefined;
53
+ controller.current = null;
54
54
  };
55
55
 
56
56
  const handleClear = () => {
@@ -62,7 +62,7 @@ export const TestPanel = ({ classNames, functionUrl }: TestPanelProps) => {
62
62
  };
63
63
 
64
64
  const handleResponse = ({ text, data, error }: { text?: string; data?: any; error?: Error } = {}) => {
65
- controller.current = undefined;
65
+ controller.current = null;
66
66
  setHistory((history) => [...history, { type: 'response', text, data, error } satisfies Message]);
67
67
  setResult('');
68
68
  setState(null);
@@ -237,7 +237,7 @@ const MessageItem = ({ classNames, message }: ThemedClassName<{ message: Message
237
237
  )}
238
238
 
239
239
  {data && (
240
- <SyntaxHighlighter language='json' className={mx(wrapper, 'px-8 py-2 text-xs')}>
240
+ <SyntaxHighlighter language='json' className={mx(wrapper, 'text-xs')}>
241
241
  {JSON.stringify(data, null, 2)}
242
242
  </SyntaxHighlighter>
243
243
  )}
@@ -2,43 +2,97 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React, { useCallback, useMemo, useState } from 'react';
6
7
 
7
- import { type Meta } from '@storybook/react-vite';
8
- import React, { useMemo } from 'react';
9
-
10
- import { createDocAccessor, createObject } from '@dxos/react-client/echo';
8
+ import { createDocAccessor } from '@dxos/react-client/echo';
9
+ import { createObject } from '@dxos/react-client/echo';
10
+ import { Toolbar } from '@dxos/react-ui';
11
+ import { withTheme } from '@dxos/react-ui/testing';
11
12
  import { createDataExtensions } from '@dxos/react-ui-editor';
12
- import { withTheme } from '@dxos/storybook-utils';
13
-
14
- import { TypescriptEditor } from './TypescriptEditor';
15
- import { templates } from '../../templates';
16
-
17
- // TODO(burdon): Features:
18
- // - language support for S
19
- // - hierarchical editor (DND)
20
- // - virtual document image rendering
21
- // - mobile rendering error
22
-
23
- // TODO(burdon): JSX.
24
- // TODO(burdon): Effect schema.
25
- // TODO(burdon): react-buddy for storybook?
26
-
27
- const DefaultStory = () => {
28
- const object = useMemo(() => createObject({ content: templates[0].source }), []);
29
- const initialValue = useMemo(() => object.content, [object]);
30
- const accessor = useMemo(() => createDocAccessor(object, ['content']), [object]);
31
- const extensions = useMemo(() => [createDataExtensions({ id: object.id, text: accessor })], [object.id, accessor]);
32
- return <TypescriptEditor id='test' initialValue={initialValue} extensions={extensions} />;
33
- };
13
+ import { StackItem } from '@dxos/react-ui-stack';
14
+ import { Json } from '@dxos/react-ui-syntax-highlighter';
15
+ import { trim } from '@dxos/util';
16
+
17
+ import { TypescriptEditor, type TypescriptEditorProps } from './TypescriptEditor';
18
+
19
+ const SCRIPT = trim`
20
+ x * 2
21
+ `;
22
+
23
+ const DefaultStory = (props: TypescriptEditorProps) => {
24
+ const object = useMemo(() => createObject({ content: SCRIPT }), []);
25
+ const [result, setResult] = useState<object | undefined>({});
26
+
27
+ // TODO(burdon): Make this work.
28
+ // const object = useMemo(() => DataType.makeText(templates[1].source), []);
29
+ // const script = useMemo(
30
+ // () =>
31
+ // Obj.make(ScriptType, {
32
+ // source: Ref.make(createObject({ content: templates[0].source })),
33
+ // }),
34
+ // [object],
35
+ // );
36
+
37
+ const extensions = useMemo(
38
+ () => [createDataExtensions({ id: object.id, text: createDocAccessor(object, ['content']) })],
39
+ [],
40
+ );
41
+
42
+ const handleRun = useCallback(async () => {
43
+ try {
44
+ const definitions: [string, any][] = [['x', 100]];
34
45
 
35
- export const Default = {};
46
+ // eslint-disable-next-line @typescript-eslint/no-implied-eval
47
+ const result = new Function(...definitions.map(([name]) => name), `return ${object.content.trim()}`)(
48
+ ...definitions.map(([, value]) => value),
49
+ );
36
50
 
37
- const meta: Meta = {
51
+ setResult({
52
+ timestamp: Date.now(),
53
+ result,
54
+ });
55
+ } catch (err) {
56
+ setResult({
57
+ timestamp: Date.now(),
58
+ error: String(err),
59
+ });
60
+ }
61
+ }, [object]);
62
+
63
+ return (
64
+ <StackItem.Content toolbar>
65
+ {/* <ScriptToolbar script={script} state={{}} /> */}
66
+ <Toolbar.Root>
67
+ <Toolbar.Button onClick={handleRun}>Run</Toolbar.Button>
68
+ </Toolbar.Root>
69
+ <div role='none' className='grid grid-rows-[1fr_min-content] bs-full overflow-hidden text-sm'>
70
+ <TypescriptEditor {...props} initialValue={object.content} extensions={extensions} />
71
+ <Json data={result} classNames='shrink-0 p-2 border-t border-subduedSeparator' />
72
+ </div>
73
+ </StackItem.Content>
74
+ );
75
+ };
76
+
77
+ const meta = {
38
78
  title: 'plugins/plugin-script/TypescriptEditor',
39
79
  component: TypescriptEditor,
40
80
  render: DefaultStory,
41
81
  decorators: [withTheme],
42
- };
82
+ parameters: {
83
+ layout: {
84
+ type: 'column',
85
+ className: 'is-prose',
86
+ },
87
+ },
88
+ } satisfies Meta<typeof DefaultStory>;
43
89
 
44
90
  export default meta;
91
+
92
+ type Story = StoryObj<typeof meta>;
93
+
94
+ export const Default: Story = {
95
+ args: {
96
+ id: 'test',
97
+ },
98
+ };
@@ -2,27 +2,27 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
+ import { autocompletion, completionKeymap } from '@codemirror/autocomplete';
5
6
  import { javascript } from '@codemirror/lang-javascript';
6
- import { defaultHighlightStyle } from '@codemirror/language';
7
+ import { HighlightStyle } from '@codemirror/language';
7
8
  import { lintKeymap } from '@codemirror/lint';
8
9
  import { Prec } from '@codemirror/state';
9
- import { oneDarkHighlightStyle } from '@codemirror/theme-one-dark';
10
10
  import { keymap } from '@codemirror/view';
11
11
  import { tags } from '@lezer/highlight';
12
12
  import { type VirtualTypeScriptEnvironment } from '@typescript/vfs';
13
13
  import { continueKeymap } from '@valtown/codemirror-continue';
14
- import { tsSync, tsFacet, tsLinter, tsAutocomplete, tsHover, type HoverInfo } from '@valtown/codemirror-ts';
14
+ import { type HoverInfo, tsAutocomplete, tsFacet, tsHover, tsLinter, tsSync } from '@valtown/codemirror-ts';
15
15
  import React from 'react';
16
16
 
17
- import { type ThemedClassName, type ThemeMode, useThemeContext } from '@dxos/react-ui';
17
+ import { Domino, type ThemeMode, type ThemedClassName, useThemeContext } from '@dxos/react-ui';
18
18
  import {
19
+ type BasicExtensionsOptions,
19
20
  type EditorInputMode,
20
21
  InputModeExtensions,
21
22
  type UseTextEditorProps,
22
- autocomplete,
23
23
  createBasicExtensions,
24
24
  createThemeExtensions,
25
- folding,
25
+ defaultStyles,
26
26
  useTextEditor,
27
27
  } from '@dxos/react-ui-editor';
28
28
  import { mx } from '@dxos/react-ui-theme';
@@ -31,18 +31,22 @@ import { isNonNullable } from '@dxos/util';
31
31
  export type TypescriptEditorProps = ThemedClassName<
32
32
  {
33
33
  id: string;
34
+ role?: string;
34
35
  inputMode?: EditorInputMode;
35
36
  toolbar?: boolean;
36
37
  env?: VirtualTypeScriptEnvironment;
38
+ options?: BasicExtensionsOptions;
37
39
  } & Pick<UseTextEditorProps, 'initialValue' | 'extensions' | 'scrollTo' | 'selection'>
38
40
  >;
39
41
 
40
42
  export const TypescriptEditor = ({
41
43
  classNames,
42
44
  id,
45
+ role = 'article',
43
46
  inputMode = 'vscode',
44
47
  toolbar,
45
48
  env,
49
+ options,
46
50
  initialValue,
47
51
  extensions,
48
52
  scrollTo,
@@ -63,19 +67,22 @@ export const TypescriptEditor = ({
63
67
  lineNumbers: true,
64
68
  lineWrapping: false,
65
69
  monospace: true,
66
- scrollPastEnd: true,
70
+ scrollPastEnd: role !== 'section',
71
+ search: true,
72
+ ...options,
67
73
  }),
68
74
  createThemeExtensions({ themeMode, syntaxHighlighting: true }),
69
75
  InputModeExtensions[inputMode],
70
- folding(),
76
+
77
+ javascript({ typescript: true }),
78
+ autocompletion({ override: env ? [tsAutocomplete()] : undefined }),
79
+
71
80
  // Continues block comments when pressing Enter.
72
81
  Prec.high(keymap.of(continueKeymap)),
82
+ keymap.of(completionKeymap),
83
+ keymap.of(lintKeymap),
73
84
 
74
- // TODO(burdon): Factor out.
75
- javascript({ typescript: true }),
76
85
  // https://github.com/val-town/codemirror-ts
77
- autocomplete({ override: env ? [tsAutocomplete()] : undefined }),
78
- keymap.of(lintKeymap),
79
86
  env && [
80
87
  tsFacet.of({ env, path: `/src/${id}.ts` }),
81
88
  tsSync(),
@@ -87,6 +94,7 @@ export const TypescriptEditor = ({
87
94
  [id, extensions, themeMode, inputMode, selection, scrollTo],
88
95
  );
89
96
 
97
+ // TODO(brudon): Use react-ui-editor's Editor component.
90
98
  return (
91
99
  <div
92
100
  ref={parentRef}
@@ -97,8 +105,9 @@ export const TypescriptEditor = ({
97
105
  );
98
106
  };
99
107
 
108
+ // TODO(burdon): Factor out (react-ui-editor).
100
109
  const createTooltipRenderer = (themeMode: ThemeMode) => {
101
- const theme = themeMode === 'dark' ? oneDarkHighlightStyle : defaultHighlightStyle;
110
+ const theme = HighlightStyle.define(themeMode === 'dark' ? defaultStyles.dark : defaultStyles.light);
102
111
 
103
112
  const classFromKind = (_kind: string) => {
104
113
  // E.g., localName, methodName, parameterName, etc.
@@ -117,18 +126,16 @@ const createTooltipRenderer = (themeMode: ThemeMode) => {
117
126
  };
118
127
 
119
128
  return (info: HoverInfo) => {
120
- const div = document.createElement('div');
121
- div.className = 'p-1 rounded border border-separator bg-baseSurface xs:max-w-80 max-w-lg';
122
-
123
- if (info.quickInfo?.displayParts) {
124
- for (const part of info.quickInfo.displayParts) {
125
- const span = div.appendChild(document.createElement('span'));
126
- span.className = classFromKind(part.kind);
127
- span.innerText = part.text;
128
- }
129
- }
130
-
131
- return { dom: div };
129
+ return {
130
+ dom: Domino.of('div')
131
+ .classNames('xs:max-is-80 max-is-lg p-1 bg-baseSurface rounded border border-separator')
132
+ .children(
133
+ ...(info.quickInfo?.displayParts?.map(({ kind, text }) =>
134
+ Domino.of('span').classNames(classFromKind(kind)).text(text),
135
+ ) ?? []),
136
+ )
137
+ .build(),
138
+ };
132
139
  };
133
140
  };
134
141
 
@@ -4,9 +4,12 @@
4
4
 
5
5
  import { lazy } from 'react';
6
6
 
7
+ export * from './NotebookStack';
7
8
  export * from './Settings';
8
9
  export * from './TestPanel';
10
+
9
11
  export { DEPLOYMENT_DIALOG } from './DeploymentDialog';
10
12
 
11
13
  export const ScriptContainer = lazy(() => import('./ScriptContainer'));
12
14
  export const DeploymentDialog = lazy(() => import('./DeploymentDialog'));
15
+ export const NotebookContainer = lazy(() => import('./NotebookContainer'));
package/src/events.ts CHANGED
@@ -4,8 +4,8 @@
4
4
 
5
5
  import { defineEvent } from '@dxos/app-framework';
6
6
 
7
- import { SCRIPT_PLUGIN } from './meta';
7
+ import { meta } from './meta';
8
8
 
9
9
  export namespace ScriptEvents {
10
- export const SetupCompiler = defineEvent(`${SCRIPT_PLUGIN}/event/setup-compiler`);
10
+ export const SetupCompiler = defineEvent(`${meta.id}/event/setup-compiler`);
11
11
  }