@dxos/plugin-script 0.8.4-main.dedc0f3 → 0.8.4-main.ead640a

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 (253) hide show
  1. package/dist/lib/browser/DeploymentDialog-65TWT6S5.mjs +13 -0
  2. package/dist/lib/browser/NotebookContainer-LVGRPFY3.mjs +683 -0
  3. package/dist/lib/browser/NotebookContainer-LVGRPFY3.mjs.map +7 -0
  4. package/dist/lib/browser/ScriptContainer-LRTRN7JW.mjs +149 -0
  5. package/dist/lib/browser/ScriptContainer-LRTRN7JW.mjs.map +7 -0
  6. package/dist/lib/browser/{app-graph-builder-IABOSTBK.mjs → app-graph-builder-DPYULSME.mjs} +8 -7
  7. package/dist/lib/browser/app-graph-builder-DPYULSME.mjs.map +7 -0
  8. package/dist/lib/browser/{blueprint-definition-AR7ITBCD.mjs → blueprint-definition-ET5KZ46I.mjs} +3 -3
  9. package/dist/lib/browser/{blueprint-definition-AR7ITBCD.mjs.map → blueprint-definition-ET5KZ46I.mjs.map} +1 -1
  10. package/dist/lib/browser/chunk-5CYLWXRH.mjs +89 -0
  11. package/dist/lib/browser/chunk-5CYLWXRH.mjs.map +7 -0
  12. package/dist/lib/browser/chunk-75LH4EUR.mjs +326 -0
  13. package/dist/lib/browser/chunk-75LH4EUR.mjs.map +7 -0
  14. package/dist/lib/browser/{chunk-6CAH7VIE.mjs → chunk-E7DXDICD.mjs} +18 -19
  15. package/dist/lib/browser/chunk-E7DXDICD.mjs.map +7 -0
  16. package/dist/lib/browser/{chunk-QYAREHGH.mjs → chunk-EZVXV6DA.mjs} +3 -5
  17. package/dist/lib/browser/chunk-EZVXV6DA.mjs.map +7 -0
  18. package/dist/lib/browser/{chunk-GZKWMME3.mjs → chunk-I3QSGUFJ.mjs} +122 -32
  19. package/dist/lib/browser/chunk-I3QSGUFJ.mjs.map +7 -0
  20. package/dist/lib/browser/{chunk-NXKU3BNX.mjs → chunk-JO2O7W6J.mjs} +39 -7
  21. package/dist/lib/browser/chunk-JO2O7W6J.mjs.map +7 -0
  22. package/dist/lib/browser/chunk-N6M34EUC.mjs +112 -0
  23. package/dist/lib/browser/chunk-N6M34EUC.mjs.map +7 -0
  24. package/dist/lib/browser/{chunk-YCZPTTFO.mjs → chunk-NM4WQS4F.mjs} +14 -14
  25. package/dist/lib/browser/chunk-NM4WQS4F.mjs.map +7 -0
  26. package/dist/lib/browser/{chunk-5TVBECWH.mjs → chunk-OKXN2N7M.mjs} +2 -2
  27. package/dist/lib/browser/chunk-ST3ACVUC.mjs +88 -0
  28. package/dist/lib/browser/chunk-ST3ACVUC.mjs.map +7 -0
  29. package/dist/lib/browser/{compiler-2HJH34GM.mjs → compiler-G2N2CG63.mjs} +5 -5
  30. package/dist/lib/browser/{compiler-2HJH34GM.mjs.map → compiler-G2N2CG63.mjs.map} +1 -1
  31. package/dist/lib/browser/index.mjs +107 -36
  32. package/dist/lib/browser/index.mjs.map +3 -3
  33. package/dist/lib/browser/{intent-resolver-F4YSRPJI.mjs → intent-resolver-JLU7DVLQ.mjs} +31 -15
  34. package/dist/lib/browser/intent-resolver-JLU7DVLQ.mjs.map +7 -0
  35. package/dist/lib/browser/meta.json +1 -1
  36. package/dist/lib/browser/{react-surface-BBHFU6MI.mjs → react-surface-76SDTUYG.mjs} +36 -13
  37. package/dist/lib/browser/react-surface-76SDTUYG.mjs.map +7 -0
  38. package/dist/lib/browser/{settings-KCTBK5TY.mjs → settings-ERFKVNUK.mjs} +9 -8
  39. package/dist/lib/browser/settings-ERFKVNUK.mjs.map +7 -0
  40. package/dist/lib/browser/templates/index.mjs +1 -1
  41. package/dist/lib/browser/types/index.mjs +7 -4
  42. package/dist/lib/node-esm/{DeploymentDialog-G6EHEPXN.mjs → DeploymentDialog-I63ZC2HH.mjs} +6 -5
  43. package/dist/lib/node-esm/NotebookContainer-QY5NJGJI.mjs +684 -0
  44. package/dist/lib/node-esm/NotebookContainer-QY5NJGJI.mjs.map +7 -0
  45. package/dist/lib/node-esm/ScriptContainer-SVXCSLNH.mjs +150 -0
  46. package/dist/lib/node-esm/ScriptContainer-SVXCSLNH.mjs.map +7 -0
  47. package/dist/lib/node-esm/{app-graph-builder-CQTTAYHP.mjs → app-graph-builder-UXJGHXSL.mjs} +8 -7
  48. package/dist/lib/node-esm/app-graph-builder-UXJGHXSL.mjs.map +7 -0
  49. package/dist/lib/node-esm/{blueprint-definition-TJY4TX6S.mjs → blueprint-definition-AIYFOT7Q.mjs} +3 -3
  50. package/dist/lib/node-esm/{blueprint-definition-TJY4TX6S.mjs.map → blueprint-definition-AIYFOT7Q.mjs.map} +1 -1
  51. package/dist/lib/node-esm/chunk-2GVTWESW.mjs +90 -0
  52. package/dist/lib/node-esm/chunk-2GVTWESW.mjs.map +7 -0
  53. package/dist/lib/node-esm/chunk-4X375PGY.mjs +90 -0
  54. package/dist/lib/node-esm/chunk-4X375PGY.mjs.map +7 -0
  55. package/dist/lib/node-esm/chunk-67OVZHI3.mjs +327 -0
  56. package/dist/lib/node-esm/chunk-67OVZHI3.mjs.map +7 -0
  57. package/dist/lib/node-esm/{chunk-ZA36GO4T.mjs → chunk-C2ORIPKH.mjs} +14 -14
  58. package/dist/lib/node-esm/chunk-C2ORIPKH.mjs.map +7 -0
  59. package/dist/lib/node-esm/{chunk-35M3CHYE.mjs → chunk-NUXZQQ6P.mjs} +2 -2
  60. package/dist/lib/node-esm/{chunk-AHXJ6NQU.mjs → chunk-OG2SIKHE.mjs} +3 -5
  61. package/dist/lib/node-esm/chunk-OG2SIKHE.mjs.map +7 -0
  62. package/dist/lib/node-esm/{chunk-HUHVIOL5.mjs → chunk-SMFPSKQT.mjs} +122 -32
  63. package/dist/lib/node-esm/chunk-SMFPSKQT.mjs.map +7 -0
  64. package/dist/lib/node-esm/chunk-VRSDE4CI.mjs +114 -0
  65. package/dist/lib/node-esm/chunk-VRSDE4CI.mjs.map +7 -0
  66. package/dist/lib/node-esm/{chunk-2GBESIHU.mjs → chunk-VZAFGLD7.mjs} +18 -19
  67. package/dist/lib/node-esm/chunk-VZAFGLD7.mjs.map +7 -0
  68. package/dist/lib/node-esm/{chunk-M642JUOZ.mjs → chunk-YW36TZ7K.mjs} +39 -7
  69. package/dist/lib/node-esm/chunk-YW36TZ7K.mjs.map +7 -0
  70. package/dist/lib/node-esm/{compiler-7SP27RA6.mjs → compiler-PLDAZ5GJ.mjs} +5 -5
  71. package/dist/lib/node-esm/{compiler-7SP27RA6.mjs.map → compiler-PLDAZ5GJ.mjs.map} +1 -1
  72. package/dist/lib/node-esm/index.mjs +107 -36
  73. package/dist/lib/node-esm/index.mjs.map +3 -3
  74. package/dist/lib/node-esm/{intent-resolver-CGQYRWWD.mjs → intent-resolver-SFGTIFOG.mjs} +31 -15
  75. package/dist/lib/node-esm/intent-resolver-SFGTIFOG.mjs.map +7 -0
  76. package/dist/lib/node-esm/meta.json +1 -1
  77. package/dist/lib/node-esm/{react-surface-UWIWPKZD.mjs → react-surface-SHEBNW4R.mjs} +36 -13
  78. package/dist/lib/node-esm/react-surface-SHEBNW4R.mjs.map +7 -0
  79. package/dist/lib/node-esm/{settings-DXZ334A3.mjs → settings-5TYXQ42N.mjs} +9 -8
  80. package/dist/lib/node-esm/settings-5TYXQ42N.mjs.map +7 -0
  81. package/dist/lib/node-esm/templates/index.mjs +1 -1
  82. package/dist/lib/node-esm/types/index.mjs +7 -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/intent-resolver.d.ts.map +1 -1
  87. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  88. package/dist/types/src/components/DeploymentDialog/DeploymentDialog.d.ts +1 -1
  89. package/dist/types/src/components/DeploymentDialog/DeploymentDialog.d.ts.map +1 -1
  90. package/dist/types/src/components/DeploymentDialog/DeploymentDialog.stories.d.ts +111 -5
  91. package/dist/types/src/components/DeploymentDialog/DeploymentDialog.stories.d.ts.map +1 -1
  92. package/dist/types/src/components/NotebookContainer.d.ts +10 -0
  93. package/dist/types/src/components/NotebookContainer.d.ts.map +1 -0
  94. package/dist/types/src/components/NotebookContainer.stories.d.ts +248 -0
  95. package/dist/types/src/components/NotebookContainer.stories.d.ts.map +1 -0
  96. package/dist/types/src/components/NotebookStack/NotebookCell.d.ts +14 -0
  97. package/dist/types/src/components/NotebookStack/NotebookCell.d.ts.map +1 -0
  98. package/dist/types/src/components/NotebookStack/NotebookMenu.d.ts +9 -0
  99. package/dist/types/src/components/NotebookStack/NotebookMenu.d.ts.map +1 -0
  100. package/dist/types/src/components/NotebookStack/NotebookStack.d.ts +14 -0
  101. package/dist/types/src/components/NotebookStack/NotebookStack.d.ts.map +1 -0
  102. package/dist/types/src/components/NotebookStack/NotebookStack.stories.d.ts +248 -0
  103. package/dist/types/src/components/NotebookStack/NotebookStack.stories.d.ts.map +1 -0
  104. package/dist/types/src/components/NotebookStack/index.d.ts +3 -0
  105. package/dist/types/src/components/NotebookStack/index.d.ts.map +1 -0
  106. package/dist/types/src/components/ScriptContainer.d.ts +2 -2
  107. package/dist/types/src/components/ScriptContainer.d.ts.map +1 -1
  108. package/dist/types/src/components/ScriptToolbar/ScriptToolbar.d.ts.map +1 -1
  109. package/dist/types/src/components/ScriptToolbar/ScriptToolbar.stories.d.ts +239 -1
  110. package/dist/types/src/components/ScriptToolbar/ScriptToolbar.stories.d.ts.map +1 -1
  111. package/dist/types/src/components/Settings/ScriptObjectSettings.d.ts.map +1 -1
  112. package/dist/types/src/components/Settings/ScriptPluginSettings.d.ts +2 -2
  113. package/dist/types/src/components/Settings/ScriptPluginSettings.d.ts.map +1 -1
  114. package/dist/types/src/components/TypescriptEditor/TypescriptEditor.d.ts +4 -2
  115. package/dist/types/src/components/TypescriptEditor/TypescriptEditor.d.ts.map +1 -1
  116. package/dist/types/src/components/TypescriptEditor/TypescriptEditor.stories.d.ts +3 -3
  117. package/dist/types/src/components/TypescriptEditor/TypescriptEditor.stories.d.ts.map +1 -1
  118. package/dist/types/src/components/index.d.ts +2 -0
  119. package/dist/types/src/components/index.d.ts.map +1 -1
  120. package/dist/types/src/events.d.ts.map +1 -1
  121. package/dist/types/src/hooks/deploy.d.ts +6 -6
  122. package/dist/types/src/hooks/deploy.d.ts.map +1 -1
  123. package/dist/types/src/hooks/template.d.ts.map +1 -1
  124. package/dist/types/src/index.d.ts +1 -0
  125. package/dist/types/src/index.d.ts.map +1 -1
  126. package/dist/types/src/meta.d.ts +0 -1
  127. package/dist/types/src/meta.d.ts.map +1 -1
  128. package/dist/types/src/notebook/eval.d.ts +13 -0
  129. package/dist/types/src/notebook/eval.d.ts.map +1 -0
  130. package/dist/types/src/notebook/index.d.ts +2 -0
  131. package/dist/types/src/notebook/index.d.ts.map +1 -0
  132. package/dist/types/src/notebook/notebook.d.ts +35 -0
  133. package/dist/types/src/notebook/notebook.d.ts.map +1 -0
  134. package/dist/types/src/notebook/notebook.test.d.ts +2 -0
  135. package/dist/types/src/notebook/notebook.test.d.ts.map +1 -0
  136. package/dist/types/src/notebook/vfs-parser.d.ts +74 -0
  137. package/dist/types/src/notebook/vfs-parser.d.ts.map +1 -0
  138. package/dist/types/src/notebook/vfs-parser.test.d.ts +2 -0
  139. package/dist/types/src/notebook/vfs-parser.test.d.ts.map +1 -0
  140. package/dist/types/src/templates/chess.d.ts.map +1 -1
  141. package/dist/types/src/templates/data-generator.d.ts.map +1 -1
  142. package/dist/types/src/templates/discord.d.ts.map +1 -1
  143. package/dist/types/src/templates/forex-effect.d.ts.map +1 -1
  144. package/dist/types/src/templates/forex.d.ts.map +1 -1
  145. package/dist/types/src/templates/gmail.d.ts.map +1 -1
  146. package/dist/types/src/templates/index.d.ts +43 -1
  147. package/dist/types/src/templates/index.d.ts.map +1 -1
  148. package/dist/types/src/templates/{echo.d.ts → ping.d.ts} +1 -1
  149. package/dist/types/src/templates/ping.d.ts.map +1 -0
  150. package/dist/types/src/testing/data.d.ts +19 -0
  151. package/dist/types/src/testing/data.d.ts.map +1 -0
  152. package/dist/types/src/testing/index.d.ts +2 -0
  153. package/dist/types/src/testing/index.d.ts.map +1 -0
  154. package/dist/types/src/translations.d.ts +27 -2
  155. package/dist/types/src/translations.d.ts.map +1 -1
  156. package/dist/types/src/types/actions.d.ts +66 -0
  157. package/dist/types/src/types/actions.d.ts.map +1 -0
  158. package/dist/types/src/types/index.d.ts +1 -0
  159. package/dist/types/src/types/index.d.ts.map +1 -1
  160. package/dist/types/src/types/schema.d.ts +54 -31
  161. package/dist/types/src/types/schema.d.ts.map +1 -1
  162. package/dist/types/src/util/functions.d.ts +5 -2
  163. package/dist/types/src/util/functions.d.ts.map +1 -1
  164. package/dist/types/tsconfig.tsbuildinfo +1 -1
  165. package/package.json +67 -63
  166. package/src/ScriptPlugin.tsx +93 -68
  167. package/src/capabilities/app-graph-builder.ts +4 -3
  168. package/src/capabilities/artifact-definition.ts +1 -1
  169. package/src/capabilities/intent-resolver.ts +14 -4
  170. package/src/capabilities/react-surface.tsx +17 -5
  171. package/src/capabilities/settings.ts +3 -3
  172. package/src/components/DeploymentDialog/DeploymentDialog.stories.tsx +6 -4
  173. package/src/components/DeploymentDialog/DeploymentDialog.tsx +11 -17
  174. package/src/components/NotebookContainer.stories.tsx +32 -0
  175. package/src/components/NotebookContainer.tsx +124 -0
  176. package/src/components/NotebookStack/NotebookCell.tsx +217 -0
  177. package/src/components/NotebookStack/NotebookMenu.tsx +47 -0
  178. package/src/components/NotebookStack/NotebookStack.stories.tsx +32 -0
  179. package/src/components/NotebookStack/NotebookStack.tsx +79 -0
  180. package/src/components/NotebookStack/index.ts +6 -0
  181. package/src/components/ScriptContainer.tsx +2 -2
  182. package/src/components/ScriptToolbar/ScriptToolbar.stories.tsx +17 -5
  183. package/src/components/ScriptToolbar/ScriptToolbar.tsx +21 -24
  184. package/src/components/Settings/ScriptObjectSettings.tsx +92 -8
  185. package/src/components/Settings/ScriptPluginSettings.tsx +4 -19
  186. package/src/components/TestPanel/TestPanel.tsx +5 -5
  187. package/src/components/TypescriptEditor/TypescriptEditor.stories.tsx +71 -16
  188. package/src/components/TypescriptEditor/TypescriptEditor.tsx +29 -24
  189. package/src/components/index.ts +3 -0
  190. package/src/events.ts +2 -2
  191. package/src/hooks/deploy.ts +8 -9
  192. package/src/hooks/format.ts +2 -2
  193. package/src/hooks/template.ts +4 -3
  194. package/src/hooks/useCreateAndDeployScriptTemplates.ts +3 -3
  195. package/src/index.ts +1 -0
  196. package/src/meta.ts +2 -4
  197. package/src/notebook/eval.ts +105 -0
  198. package/src/notebook/index.ts +5 -0
  199. package/src/notebook/notebook.test.ts +70 -0
  200. package/src/notebook/notebook.ts +183 -0
  201. package/src/notebook/vfs-parser.test.ts +149 -0
  202. package/src/notebook/vfs-parser.ts +451 -0
  203. package/src/templates/chess.ts +2 -0
  204. package/src/templates/data-generator.ts +2 -0
  205. package/src/templates/discord.ts +9 -1
  206. package/src/templates/forex-effect.ts +5 -1
  207. package/src/templates/forex.ts +2 -0
  208. package/src/templates/gmail.ts +21 -9
  209. package/src/templates/index.ts +6 -6
  210. package/src/testing/data.ts +47 -0
  211. package/src/testing/index.ts +5 -0
  212. package/src/translations.ts +30 -4
  213. package/src/types/actions.ts +53 -0
  214. package/src/types/index.ts +1 -0
  215. package/src/types/schema.ts +30 -19
  216. package/src/util/functions.ts +32 -3
  217. package/dist/lib/browser/DeploymentDialog-QZSTVNIS.mjs +0 -12
  218. package/dist/lib/browser/ScriptContainer-DNNA6XC6.mjs +0 -265
  219. package/dist/lib/browser/ScriptContainer-DNNA6XC6.mjs.map +0 -7
  220. package/dist/lib/browser/app-graph-builder-IABOSTBK.mjs.map +0 -7
  221. package/dist/lib/browser/chunk-6CAH7VIE.mjs.map +0 -7
  222. package/dist/lib/browser/chunk-GZKWMME3.mjs.map +0 -7
  223. package/dist/lib/browser/chunk-IS4OG2UW.mjs +0 -39
  224. package/dist/lib/browser/chunk-IS4OG2UW.mjs.map +0 -7
  225. package/dist/lib/browser/chunk-NXKU3BNX.mjs.map +0 -7
  226. package/dist/lib/browser/chunk-QYAREHGH.mjs.map +0 -7
  227. package/dist/lib/browser/chunk-RNGIQIEJ.mjs +0 -88
  228. package/dist/lib/browser/chunk-RNGIQIEJ.mjs.map +0 -7
  229. package/dist/lib/browser/chunk-YCZPTTFO.mjs.map +0 -7
  230. package/dist/lib/browser/intent-resolver-F4YSRPJI.mjs.map +0 -7
  231. package/dist/lib/browser/react-surface-BBHFU6MI.mjs.map +0 -7
  232. package/dist/lib/browser/settings-KCTBK5TY.mjs.map +0 -7
  233. package/dist/lib/node-esm/ScriptContainer-KPYZN2KY.mjs +0 -266
  234. package/dist/lib/node-esm/ScriptContainer-KPYZN2KY.mjs.map +0 -7
  235. package/dist/lib/node-esm/app-graph-builder-CQTTAYHP.mjs.map +0 -7
  236. package/dist/lib/node-esm/chunk-2GBESIHU.mjs.map +0 -7
  237. package/dist/lib/node-esm/chunk-AHXJ6NQU.mjs.map +0 -7
  238. package/dist/lib/node-esm/chunk-GWHLP5LM.mjs +0 -90
  239. package/dist/lib/node-esm/chunk-GWHLP5LM.mjs.map +0 -7
  240. package/dist/lib/node-esm/chunk-HUHVIOL5.mjs.map +0 -7
  241. package/dist/lib/node-esm/chunk-JIPFLBYA.mjs +0 -40
  242. package/dist/lib/node-esm/chunk-JIPFLBYA.mjs.map +0 -7
  243. package/dist/lib/node-esm/chunk-M642JUOZ.mjs.map +0 -7
  244. package/dist/lib/node-esm/chunk-ZA36GO4T.mjs.map +0 -7
  245. package/dist/lib/node-esm/intent-resolver-CGQYRWWD.mjs.map +0 -7
  246. package/dist/lib/node-esm/react-surface-UWIWPKZD.mjs.map +0 -7
  247. package/dist/lib/node-esm/settings-DXZ334A3.mjs.map +0 -7
  248. package/dist/types/src/templates/echo.d.ts.map +0 -1
  249. /package/dist/lib/browser/{DeploymentDialog-QZSTVNIS.mjs.map → DeploymentDialog-65TWT6S5.mjs.map} +0 -0
  250. /package/dist/lib/browser/{chunk-5TVBECWH.mjs.map → chunk-OKXN2N7M.mjs.map} +0 -0
  251. /package/dist/lib/node-esm/{DeploymentDialog-G6EHEPXN.mjs.map → DeploymentDialog-I63ZC2HH.mjs.map} +0 -0
  252. /package/dist/lib/node-esm/{chunk-35M3CHYE.mjs.map → chunk-NUXZQQ6P.mjs.map} +0 -0
  253. /package/src/templates/{echo.ts → ping.ts} +0 -0
@@ -5,15 +5,18 @@
5
5
  import { Octokit } from '@octokit/core';
6
6
  import React, { type ChangeEvent, useCallback, useState } from 'react';
7
7
 
8
+ import { ToolId } from '@dxos/ai';
8
9
  import { SettingsAction, createIntent, useIntentDispatcher } from '@dxos/app-framework';
10
+ import { Blueprint, Template } from '@dxos/blueprints';
9
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
14
  import { Filter, Ref, getMeta, getSpace, useQuery } from '@dxos/react-client/echo';
13
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,8 +48,92 @@ 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) }));
@@ -109,7 +197,7 @@ 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' }));
@@ -196,7 +284,3 @@ const Publishing = ({ object }: ScriptObjectSettingsProps) => {
196
284
  </div>
197
285
  );
198
286
  };
199
-
200
- // TODO(wittjosiah): Factor out.
201
- // From https://stackoverflow.com/a/67243723/2804332
202
- const kebabize = (str: string) => str.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? '-' : '') + $.toLowerCase());
@@ -4,38 +4,23 @@
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
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 (
@@ -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);
@@ -2,36 +2,91 @@
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
- import React, { useMemo } from 'react';
6
+ import React, { useCallback, useMemo, useState } from 'react';
9
7
 
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 { withLayout, withTheme } from '@dxos/react-ui/testing';
11
12
  import { createDataExtensions } from '@dxos/react-ui-editor';
12
- import { withTheme } from '@dxos/storybook-utils';
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>({});
13
26
 
14
- import { templates } from '../../templates';
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
+ // );
15
36
 
16
- import { TypescriptEditor } from './TypescriptEditor';
37
+ const extensions = useMemo(
38
+ () => [createDataExtensions({ id: object.id, text: createDocAccessor(object, ['content']) })],
39
+ [],
40
+ );
17
41
 
18
- const DefaultStory = () => {
19
- const object = useMemo(() => createObject({ content: templates[0].source }), []);
20
- const initialValue = useMemo(() => object.content, [object]);
21
- const accessor = useMemo(() => createDocAccessor(object, ['content']), [object]);
22
- const extensions = useMemo(() => [createDataExtensions({ id: object.id, text: accessor })], [object.id, accessor]);
23
- return <TypescriptEditor id='test' initialValue={initialValue} extensions={extensions} />;
42
+ const handleRun = useCallback(async () => {
43
+ try {
44
+ const definitions: [string, any][] = [['x', 100]];
45
+
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
+ );
50
+
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
+ );
24
75
  };
25
76
 
26
77
  const meta = {
27
78
  title: 'plugins/plugin-script/TypescriptEditor',
28
- component: TypescriptEditor as any,
79
+ component: TypescriptEditor,
29
80
  render: DefaultStory,
30
- decorators: [withTheme],
81
+ decorators: [withTheme, withLayout({ container: 'column', classNames: 'is-prose' })],
31
82
  } satisfies Meta<typeof DefaultStory>;
32
83
 
33
84
  export default meta;
34
85
 
35
86
  type Story = StoryObj<typeof meta>;
36
87
 
37
- export const Default: Story = {};
88
+ export const Default: Story = {
89
+ args: {
90
+ id: 'test',
91
+ },
92
+ };
@@ -4,10 +4,9 @@
4
4
 
5
5
  import { autocompletion, completionKeymap } from '@codemirror/autocomplete';
6
6
  import { javascript } from '@codemirror/lang-javascript';
7
- import { defaultHighlightStyle } from '@codemirror/language';
7
+ import { HighlightStyle } from '@codemirror/language';
8
8
  import { lintKeymap } from '@codemirror/lint';
9
9
  import { Prec } from '@codemirror/state';
10
- import { oneDarkHighlightStyle } from '@codemirror/theme-one-dark';
11
10
  import { keymap } from '@codemirror/view';
12
11
  import { tags } from '@lezer/highlight';
13
12
  import { type VirtualTypeScriptEnvironment } from '@typescript/vfs';
@@ -15,14 +14,15 @@ import { continueKeymap } from '@valtown/codemirror-continue';
15
14
  import { type HoverInfo, tsAutocomplete, tsFacet, tsHover, tsLinter, tsSync } from '@valtown/codemirror-ts';
16
15
  import React from 'react';
17
16
 
18
- import { type ThemeMode, type ThemedClassName, useThemeContext } from '@dxos/react-ui';
17
+ import { Domino, type ThemeMode, type ThemedClassName, useThemeContext } from '@dxos/react-ui';
19
18
  import {
19
+ type BasicExtensionsOptions,
20
20
  type EditorInputMode,
21
21
  InputModeExtensions,
22
22
  type UseTextEditorProps,
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,21 +67,22 @@ export const TypescriptEditor = ({
63
67
  lineNumbers: true,
64
68
  lineWrapping: false,
65
69
  monospace: true,
66
- scrollPastEnd: true,
70
+ scrollPastEnd: role !== 'section',
67
71
  search: true,
72
+ ...options,
68
73
  }),
69
74
  createThemeExtensions({ themeMode, syntaxHighlighting: true }),
70
75
  InputModeExtensions[inputMode],
71
- folding(),
72
- // Continues block comments when pressing Enter.
73
- Prec.high(keymap.of(continueKeymap)),
74
76
 
75
- // TODO(burdon): Factor out.
76
77
  javascript({ typescript: true }),
77
- // https://github.com/val-town/codemirror-ts
78
- keymap.of(completionKeymap),
79
78
  autocompletion({ override: env ? [tsAutocomplete()] : undefined }),
79
+
80
+ // Continues block comments when pressing Enter.
81
+ Prec.high(keymap.of(continueKeymap)),
82
+ keymap.of(completionKeymap),
80
83
  keymap.of(lintKeymap),
84
+
85
+ // https://github.com/val-town/codemirror-ts
81
86
  env && [
82
87
  tsFacet.of({ env, path: `/src/${id}.ts` }),
83
88
  tsSync(),
@@ -89,6 +94,7 @@ export const TypescriptEditor = ({
89
94
  [id, extensions, themeMode, inputMode, selection, scrollTo],
90
95
  );
91
96
 
97
+ // TODO(brudon): Use react-ui-editor's Editor component.
92
98
  return (
93
99
  <div
94
100
  ref={parentRef}
@@ -99,8 +105,9 @@ export const TypescriptEditor = ({
99
105
  );
100
106
  };
101
107
 
108
+ // TODO(burdon): Factor out (react-ui-editor).
102
109
  const createTooltipRenderer = (themeMode: ThemeMode) => {
103
- const theme = themeMode === 'dark' ? oneDarkHighlightStyle : defaultHighlightStyle;
110
+ const theme = HighlightStyle.define(themeMode === 'dark' ? defaultStyles.dark : defaultStyles.light);
104
111
 
105
112
  const classFromKind = (_kind: string) => {
106
113
  // E.g., localName, methodName, parameterName, etc.
@@ -119,18 +126,16 @@ const createTooltipRenderer = (themeMode: ThemeMode) => {
119
126
  };
120
127
 
121
128
  return (info: HoverInfo) => {
122
- const div = document.createElement('div');
123
- div.className = 'p-1 rounded border border-separator bg-baseSurface xs:max-w-80 max-w-lg';
124
-
125
- if (info.quickInfo?.displayParts) {
126
- for (const part of info.quickInfo.displayParts) {
127
- const span = div.appendChild(document.createElement('span'));
128
- span.className = classFromKind(part.kind);
129
- span.innerText = part.text;
130
- }
131
- }
132
-
133
- 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
+ };
134
139
  };
135
140
  };
136
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
  }
@@ -12,7 +12,7 @@ import { type TFunction } from '@dxos/react-ui';
12
12
  import { createMenuAction } from '@dxos/react-ui-menu';
13
13
  import { errorMessageColors } from '@dxos/react-ui-theme';
14
14
 
15
- import { SCRIPT_PLUGIN } from '../meta';
15
+ import { meta } from '../meta';
16
16
  import { deployScript, getFunctionUrl, isScriptDeployed } from '../util';
17
17
 
18
18
  export type DeployActionProperties = { type: 'deploy' } | { type: 'copy' };
@@ -37,7 +37,7 @@ export type CreateDeployOptions = {
37
37
  export const createDeploy = ({ state, script, space, fn, client, existingFunctionId, t }: CreateDeployOptions) => {
38
38
  // TODO(wittjosiah): Should this be an action?
39
39
  const errorItem = createMenuAction('error', () => {}, {
40
- label: state.error ?? ['no error label', { ns: SCRIPT_PLUGIN }],
40
+ label: state.error ?? ['no error label', { ns: meta.id }],
41
41
  icon: 'ph--warning-circle--regular',
42
42
  hidden: !state.error,
43
43
  classNames: state.error && errorMessageColors,
@@ -64,7 +64,7 @@ export const createDeploy = ({ state, script, space, fn, client, existingFunctio
64
64
  },
65
65
  {
66
66
  type: 'deploy',
67
- label: [state.deploying ? 'pending label' : 'deploy label', { ns: SCRIPT_PLUGIN }],
67
+ label: [state.deploying ? 'publishing label' : 'deploy label', { ns: meta.id }],
68
68
  icon: state.deploying ? 'ph--spinner-gap--regular' : 'ph--cloud-arrow-up--regular',
69
69
  disabled: state.deploying,
70
70
  classNames: state.deploying ? '[&_svg]:animate-spin' : '',
@@ -74,14 +74,13 @@ export const createDeploy = ({ state, script, space, fn, client, existingFunctio
74
74
  const copyAction = createMenuAction<DeployActionProperties>(
75
75
  'copy',
76
76
  async () => {
77
- if (!state.functionUrl) {
78
- return;
77
+ if (state.functionUrl) {
78
+ await navigator.clipboard.writeText(state.functionUrl);
79
79
  }
80
- await navigator.clipboard.writeText(state.functionUrl);
81
80
  },
82
81
  {
83
82
  type: 'copy',
84
- label: ['copy link label', { ns: SCRIPT_PLUGIN }],
83
+ label: ['copy link label', { ns: meta.id }],
85
84
  icon: 'ph--link--regular',
86
85
  disabled: !state.functionUrl,
87
86
  },
@@ -117,9 +116,9 @@ export const useDeployState = ({ state, script }: { state: Partial<DeployState>;
117
116
  };
118
117
 
119
118
  export const useDeployDeps = ({ script }: { script: ScriptType }) => {
119
+ const client = useClient();
120
120
  const space = getSpace(script);
121
121
  const [fn] = useQuery(space, Query.type(FunctionType, { source: Ref.make(script) }));
122
- const client = useClient();
123
122
  const existingFunctionId = useMemo(() => fn && getUserFunctionIdInMetadata(getMeta(fn)), [fn]);
124
- return { space, fn, client, existingFunctionId };
123
+ return { client, space, fn, existingFunctionId };
125
124
  };
@@ -10,7 +10,7 @@ import { type ScriptType } from '@dxos/functions';
10
10
  import { log } from '@dxos/log';
11
11
  import { createMenuAction } from '@dxos/react-ui-menu';
12
12
 
13
- import { SCRIPT_PLUGIN } from '../meta';
13
+ import { meta } from '../meta';
14
14
 
15
15
  export type FormatActionProperties = { type: 'format' };
16
16
 
@@ -35,7 +35,7 @@ export const createFormat = (script: ScriptType) => {
35
35
  }
36
36
  },
37
37
  {
38
- label: ['format label', { ns: SCRIPT_PLUGIN }],
38
+ label: ['format label', { ns: meta.id }],
39
39
  icon: 'ph--magic-wand--regular',
40
40
  },
41
41
  );
@@ -6,14 +6,15 @@ import { Obj } from '@dxos/echo';
6
6
  import { FUNCTIONS_PRESET_META_KEY, type ScriptType } from '@dxos/functions';
7
7
  import { createMenuAction, createMenuItemGroup } from '@dxos/react-ui-menu';
8
8
 
9
- import { SCRIPT_PLUGIN } from '../meta';
9
+ import { meta } from '../meta';
10
10
  import { templates } from '../templates';
11
11
 
12
12
  export type TemplateActionProperties = { type: 'template'; value: string };
13
13
 
14
14
  const createTemplateSelectGroup = () => {
15
+ // TODO(burdon): This should not be in the toolbar (move to create Object dialog).
15
16
  return createMenuItemGroup('template-select', {
16
- label: ['template select group label', { ns: SCRIPT_PLUGIN }],
17
+ label: ['template select group label', { ns: meta.id }],
17
18
  variant: 'dropdownMenu',
18
19
  });
19
20
  };
@@ -30,7 +31,7 @@ const createTemplateSelectActions = (script: ScriptType) => {
30
31
  if (oldPresetIndex >= 0) {
31
32
  metaKeys.splice(oldPresetIndex, 1);
32
33
  }
33
- if (template.presetId) {
34
+ if ('presetId' in template) {
34
35
  metaKeys.push({ source: FUNCTIONS_PRESET_META_KEY, id: template.presetId });
35
36
  }
36
37
  },
@@ -2,7 +2,7 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { pipe } from 'effect/Function';
5
+ import * as Function from 'effect/Function';
6
6
  import { useCallback, useState } from 'react';
7
7
 
8
8
  import { chain, createIntent, useIntentDispatcher } from '@dxos/app-framework';
@@ -40,8 +40,8 @@ export const useCreateAndDeployScriptTemplates = (space: Space | undefined, scri
40
40
  const deploymentResults = await Promise.all(
41
41
  scriptTemplates.map(async (template) => {
42
42
  const result = await dispatch(
43
- pipe(
44
- createIntent(ScriptAction.Create, { space, initialTemplateId: template.id }),
43
+ Function.pipe(
44
+ createIntent(ScriptAction.CreateScript, { space, initialTemplateId: template.id as any }),
45
45
  chain(SpaceAction.AddObject, { target: space }),
46
46
  ),
47
47
  );
package/src/index.ts CHANGED
@@ -5,5 +5,6 @@
5
5
  export { ScriptCapabilities } from './capabilities';
6
6
  export * from './components';
7
7
  export * from './meta';
8
+ export * from './util';
8
9
 
9
10
  export * from './ScriptPlugin';
package/src/meta.ts CHANGED
@@ -4,13 +4,11 @@
4
4
 
5
5
  import { type PluginMeta } from '@dxos/app-framework';
6
6
 
7
- export const SCRIPT_PLUGIN = 'dxos.org/plugin/script';
8
-
9
7
  export const meta: PluginMeta = {
10
- id: SCRIPT_PLUGIN,
8
+ id: 'dxos.org/plugin/script',
11
9
  name: 'Scripts',
12
10
  description:
13
- 'Scripts in Composer allow you to deploy custom functions that run on the edge. These functions can be referenced by your AI agent and called inside of cells in any Sheet. Use scripts to interact with API’s or external data inside of Composer.',
11
+ 'Scripts enable you to deploy custom functions that run on the edge. These functions can be referenced by your AI agent and called inside of cells in any Sheet. Use scripts to interact with API’s or external data inside of Composer.',
14
12
  icon: 'ph--code--regular',
15
13
  source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-explorer',
16
14
  tags: ['labs'],