@dxos/plugin-script 0.8.4-main.1f223c7 → 0.8.4-main.21d9917

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 (426) hide show
  1. package/dist/lib/browser/DeploymentDialog-GXNRUXF6.mjs +14 -0
  2. package/dist/lib/browser/NotebookContainer-4MM2VAQF.mjs +845 -0
  3. package/dist/lib/browser/NotebookContainer-4MM2VAQF.mjs.map +7 -0
  4. package/dist/lib/browser/ScriptContainer-X6GCYZZW.mjs +149 -0
  5. package/dist/lib/browser/ScriptContainer-X6GCYZZW.mjs.map +7 -0
  6. package/dist/lib/browser/app-graph-builder-7VO7AUI6.mjs +68 -0
  7. package/dist/lib/browser/app-graph-builder-7VO7AUI6.mjs.map +7 -0
  8. package/dist/lib/browser/blueprint-definition-OSOUYI7A.mjs +17 -0
  9. package/dist/lib/browser/blueprint-definition-OSOUYI7A.mjs.map +7 -0
  10. package/dist/lib/browser/blueprints/index.mjs +8 -0
  11. package/dist/lib/browser/chunk-3O2DQGCP.mjs +113 -0
  12. package/dist/lib/browser/chunk-3O2DQGCP.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-BTWHM6FH.mjs +270 -0
  14. package/dist/lib/browser/chunk-BTWHM6FH.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-F3QKSKSF.mjs +35 -0
  16. package/dist/lib/browser/chunk-F3QKSKSF.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-I7CSE6T3.mjs +110 -0
  18. package/dist/lib/browser/chunk-I7CSE6T3.mjs.map +7 -0
  19. package/dist/lib/browser/chunk-IQRLM6JK.mjs +137 -0
  20. package/dist/lib/browser/chunk-IQRLM6JK.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  22. package/dist/lib/browser/chunk-J5LGTIGS.mjs.map +7 -0
  23. package/dist/lib/browser/chunk-NWSK27QB.mjs +606 -0
  24. package/dist/lib/browser/chunk-NWSK27QB.mjs.map +7 -0
  25. package/dist/lib/browser/chunk-UX4GHJ5E.mjs +105 -0
  26. package/dist/lib/browser/chunk-UX4GHJ5E.mjs.map +7 -0
  27. package/dist/lib/browser/chunk-WX2NVNFQ.mjs +557 -0
  28. package/dist/lib/browser/chunk-WX2NVNFQ.mjs.map +7 -0
  29. package/dist/lib/browser/{chunk-QYAREHGH.mjs → chunk-WYR4QHPE.mjs} +8 -5
  30. package/dist/lib/browser/chunk-WYR4QHPE.mjs.map +7 -0
  31. package/dist/lib/browser/compiler-XRBFQFXO.mjs +161 -0
  32. package/dist/lib/browser/compiler-XRBFQFXO.mjs.map +7 -0
  33. package/dist/lib/browser/index.mjs +137 -103
  34. package/dist/lib/browser/index.mjs.map +4 -4
  35. package/dist/lib/browser/meta.json +1 -1
  36. package/dist/lib/browser/operation-resolver-MUNR376F.mjs +82 -0
  37. package/dist/lib/browser/operation-resolver-MUNR376F.mjs.map +7 -0
  38. package/dist/lib/browser/react-surface-5TEC66UY.mjs +139 -0
  39. package/dist/lib/browser/react-surface-5TEC66UY.mjs.map +7 -0
  40. package/dist/lib/browser/settings-R4WKREUJ.mjs +35 -0
  41. package/dist/lib/browser/settings-R4WKREUJ.mjs.map +7 -0
  42. package/dist/lib/browser/templates/index.mjs +2 -1
  43. package/dist/lib/browser/types/index.mjs +14 -6
  44. package/dist/lib/node-esm/DeploymentDialog-EVFV2VJT.mjs +15 -0
  45. package/dist/lib/node-esm/DeploymentDialog-EVFV2VJT.mjs.map +7 -0
  46. package/dist/lib/node-esm/NotebookContainer-QLW5ZYGS.mjs +846 -0
  47. package/dist/lib/node-esm/NotebookContainer-QLW5ZYGS.mjs.map +7 -0
  48. package/dist/lib/node-esm/ScriptContainer-3DZ3BMHW.mjs +150 -0
  49. package/dist/lib/node-esm/ScriptContainer-3DZ3BMHW.mjs.map +7 -0
  50. package/dist/lib/node-esm/app-graph-builder-NVE3EVBG.mjs +69 -0
  51. package/dist/lib/node-esm/app-graph-builder-NVE3EVBG.mjs.map +7 -0
  52. package/dist/lib/node-esm/blueprint-definition-NC7NNJGI.mjs +18 -0
  53. package/dist/lib/node-esm/blueprint-definition-NC7NNJGI.mjs.map +7 -0
  54. package/dist/lib/node-esm/blueprints/index.mjs +9 -0
  55. package/dist/lib/node-esm/blueprints/index.mjs.map +7 -0
  56. package/dist/lib/node-esm/chunk-4F5FJZ36.mjs +107 -0
  57. package/dist/lib/node-esm/chunk-4F5FJZ36.mjs.map +7 -0
  58. package/dist/lib/node-esm/{chunk-AHXJ6NQU.mjs → chunk-5HSJPAK7.mjs} +8 -5
  59. package/dist/lib/node-esm/chunk-5HSJPAK7.mjs.map +7 -0
  60. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  61. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  62. package/dist/lib/node-esm/chunk-KN6SQYUF.mjs +114 -0
  63. package/dist/lib/node-esm/chunk-KN6SQYUF.mjs.map +7 -0
  64. package/dist/lib/node-esm/chunk-MGWKULCD.mjs +558 -0
  65. package/dist/lib/node-esm/chunk-MGWKULCD.mjs.map +7 -0
  66. package/dist/lib/node-esm/chunk-SLU3KRV3.mjs +112 -0
  67. package/dist/lib/node-esm/chunk-SLU3KRV3.mjs.map +7 -0
  68. package/dist/lib/node-esm/chunk-VWOLKNMO.mjs +271 -0
  69. package/dist/lib/node-esm/chunk-VWOLKNMO.mjs.map +7 -0
  70. package/dist/lib/node-esm/chunk-Y3G5NCTP.mjs +36 -0
  71. package/dist/lib/node-esm/chunk-Y3G5NCTP.mjs.map +7 -0
  72. package/dist/lib/node-esm/chunk-YEWLTVBT.mjs +138 -0
  73. package/dist/lib/node-esm/chunk-YEWLTVBT.mjs.map +7 -0
  74. package/dist/lib/node-esm/chunk-ZQGHFNO3.mjs +607 -0
  75. package/dist/lib/node-esm/chunk-ZQGHFNO3.mjs.map +7 -0
  76. package/dist/lib/node-esm/compiler-ORJAXDN7.mjs +162 -0
  77. package/dist/lib/node-esm/compiler-ORJAXDN7.mjs.map +7 -0
  78. package/dist/lib/node-esm/index.mjs +137 -103
  79. package/dist/lib/node-esm/index.mjs.map +4 -4
  80. package/dist/lib/node-esm/meta.json +1 -1
  81. package/dist/lib/node-esm/operation-resolver-CLE4ZCC5.mjs +83 -0
  82. package/dist/lib/node-esm/operation-resolver-CLE4ZCC5.mjs.map +7 -0
  83. package/dist/lib/node-esm/react-surface-O3UDMKOQ.mjs +140 -0
  84. package/dist/lib/node-esm/react-surface-O3UDMKOQ.mjs.map +7 -0
  85. package/dist/lib/node-esm/settings-OFIMHU7K.mjs +36 -0
  86. package/dist/lib/node-esm/settings-OFIMHU7K.mjs.map +7 -0
  87. package/dist/lib/node-esm/templates/index.mjs +2 -1
  88. package/dist/lib/node-esm/types/index.mjs +14 -6
  89. package/dist/types/src/ScriptPlugin.d.ts +2 -1
  90. package/dist/types/src/ScriptPlugin.d.ts.map +1 -1
  91. package/dist/types/src/blueprints/index.d.ts +2 -0
  92. package/dist/types/src/blueprints/index.d.ts.map +1 -0
  93. package/dist/types/src/blueprints/script-blueprint.d.ts +22 -0
  94. package/dist/types/src/blueprints/script-blueprint.d.ts.map +1 -0
  95. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +6 -0
  96. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -0
  97. package/dist/types/src/capabilities/app-graph-builder/index.d.ts +3 -0
  98. package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +1 -0
  99. package/dist/types/src/capabilities/artifact-definition/artifact-definition.d.ts +12 -0
  100. package/dist/types/src/capabilities/artifact-definition/artifact-definition.d.ts.map +1 -0
  101. package/dist/types/src/capabilities/artifact-definition/index.d.ts +3 -0
  102. package/dist/types/src/capabilities/artifact-definition/index.d.ts.map +1 -0
  103. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts +9 -0
  104. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts.map +1 -0
  105. package/dist/types/src/capabilities/blueprint-definition/index.d.ts +3 -0
  106. package/dist/types/src/capabilities/blueprint-definition/index.d.ts.map +1 -0
  107. package/dist/types/src/capabilities/compiler/compiler.d.ts +6 -0
  108. package/dist/types/src/capabilities/compiler/compiler.d.ts.map +1 -0
  109. package/dist/types/src/capabilities/compiler/index.d.ts +3 -0
  110. package/dist/types/src/capabilities/compiler/index.d.ts.map +1 -0
  111. package/dist/types/src/capabilities/index.d.ts +6 -7
  112. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  113. package/dist/types/src/capabilities/operation-resolver/index.d.ts +3 -0
  114. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -0
  115. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +5 -0
  116. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -0
  117. package/dist/types/src/capabilities/react-surface/index.d.ts +3 -0
  118. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
  119. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +5 -0
  120. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
  121. package/dist/types/src/capabilities/settings/index.d.ts +7 -0
  122. package/dist/types/src/capabilities/settings/index.d.ts.map +1 -0
  123. package/dist/types/src/capabilities/settings/settings.d.ts +9 -0
  124. package/dist/types/src/capabilities/settings/settings.d.ts.map +1 -0
  125. package/dist/types/src/compiler/compiler.d.ts +1 -1
  126. package/dist/types/src/compiler/compiler.d.ts.map +1 -1
  127. package/dist/types/src/components/DeploymentDialog/DeploymentDialog.d.ts +3 -3
  128. package/dist/types/src/components/DeploymentDialog/DeploymentDialog.d.ts.map +1 -1
  129. package/dist/types/src/components/DeploymentDialog/DeploymentDialog.stories.d.ts +114 -10
  130. package/dist/types/src/components/DeploymentDialog/DeploymentDialog.stories.d.ts.map +1 -1
  131. package/dist/types/src/components/FrameContainer/FrameContainer.d.ts +1 -1
  132. package/dist/types/src/components/FrameContainer/FrameContainer.d.ts.map +1 -1
  133. package/dist/types/src/components/NotebookContainer.d.ts +8 -0
  134. package/dist/types/src/components/NotebookContainer.d.ts.map +1 -0
  135. package/dist/types/src/components/NotebookContainer.stories.d.ts +7 -0
  136. package/dist/types/src/components/NotebookContainer.stories.d.ts.map +1 -0
  137. package/dist/types/src/components/NotebookStack/NotebookCell.d.ts +15 -0
  138. package/dist/types/src/components/NotebookStack/NotebookCell.d.ts.map +1 -0
  139. package/dist/types/src/components/NotebookStack/NotebookMenu.d.ts +9 -0
  140. package/dist/types/src/components/NotebookStack/NotebookMenu.d.ts.map +1 -0
  141. package/dist/types/src/components/NotebookStack/NotebookStack.d.ts +14 -0
  142. package/dist/types/src/components/NotebookStack/NotebookStack.d.ts.map +1 -0
  143. package/dist/types/src/components/NotebookStack/NotebookStack.stories.d.ts +249 -0
  144. package/dist/types/src/components/NotebookStack/NotebookStack.stories.d.ts.map +1 -0
  145. package/dist/types/src/components/NotebookStack/index.d.ts +3 -0
  146. package/dist/types/src/components/NotebookStack/index.d.ts.map +1 -0
  147. package/dist/types/src/components/QueryEditor/QueryEditor.d.ts +5 -0
  148. package/dist/types/src/components/QueryEditor/QueryEditor.d.ts.map +1 -0
  149. package/dist/types/src/components/QueryEditor/QueryEditor.stories.d.ts +13 -0
  150. package/dist/types/src/components/QueryEditor/QueryEditor.stories.d.ts.map +1 -0
  151. package/dist/types/src/components/QueryEditor/index.d.ts +2 -0
  152. package/dist/types/src/components/QueryEditor/index.d.ts.map +1 -0
  153. package/dist/types/src/components/ScriptContainer.d.ts +7 -8
  154. package/dist/types/src/components/ScriptContainer.d.ts.map +1 -1
  155. package/dist/types/src/components/ScriptToolbar/ScriptToolbar.d.ts +7 -8
  156. package/dist/types/src/components/ScriptToolbar/ScriptToolbar.d.ts.map +1 -1
  157. package/dist/types/src/components/ScriptToolbar/ScriptToolbar.stories.d.ts +241 -2
  158. package/dist/types/src/components/ScriptToolbar/ScriptToolbar.stories.d.ts.map +1 -1
  159. package/dist/types/src/components/Settings/ScriptObjectSettings.d.ts +2 -2
  160. package/dist/types/src/components/Settings/ScriptObjectSettings.d.ts.map +1 -1
  161. package/dist/types/src/components/Settings/ScriptPluginSettings.d.ts +6 -4
  162. package/dist/types/src/components/Settings/ScriptPluginSettings.d.ts.map +1 -1
  163. package/dist/types/src/components/TestPanel/TestContainer.d.ts +3 -3
  164. package/dist/types/src/components/TestPanel/TestContainer.d.ts.map +1 -1
  165. package/dist/types/src/components/TestPanel/TestPanel.d.ts.map +1 -1
  166. package/dist/types/src/components/TypescriptEditor/TypescriptEditor.d.ts +5 -2
  167. package/dist/types/src/components/TypescriptEditor/TypescriptEditor.d.ts.map +1 -1
  168. package/dist/types/src/components/TypescriptEditor/TypescriptEditor.stories.d.ts +3 -3
  169. package/dist/types/src/components/TypescriptEditor/TypescriptEditor.stories.d.ts.map +1 -1
  170. package/dist/types/src/components/index.d.ts +3 -1
  171. package/dist/types/src/components/index.d.ts.map +1 -1
  172. package/dist/types/src/e2e/ai.test.d.ts +2 -0
  173. package/dist/types/src/e2e/ai.test.d.ts.map +1 -0
  174. package/dist/types/src/e2e/deploy.test.d.ts +2 -0
  175. package/dist/types/src/e2e/deploy.test.d.ts.map +1 -0
  176. package/dist/types/src/hooks/deploy.d.ts +16 -31
  177. package/dist/types/src/hooks/deploy.d.ts.map +1 -1
  178. package/dist/types/src/hooks/format.d.ts +4 -4
  179. package/dist/types/src/hooks/format.d.ts.map +1 -1
  180. package/dist/types/src/hooks/index.d.ts +1 -0
  181. package/dist/types/src/hooks/index.d.ts.map +1 -1
  182. package/dist/types/src/hooks/template.d.ts +6 -16
  183. package/dist/types/src/hooks/template.d.ts.map +1 -1
  184. package/dist/types/src/hooks/useCompiler.d.ts +7 -0
  185. package/dist/types/src/hooks/useCompiler.d.ts.map +1 -0
  186. package/dist/types/src/hooks/useCreateAndDeployScriptTemplates.d.ts.map +1 -1
  187. package/dist/types/src/hooks/useToolbarState.d.ts +8 -1
  188. package/dist/types/src/hooks/useToolbarState.d.ts.map +1 -1
  189. package/dist/types/src/index.d.ts +2 -1
  190. package/dist/types/src/index.d.ts.map +1 -1
  191. package/dist/types/src/meta.d.ts +2 -3
  192. package/dist/types/src/meta.d.ts.map +1 -1
  193. package/dist/types/src/notebook/compute-graph.d.ts +58 -0
  194. package/dist/types/src/notebook/compute-graph.d.ts.map +1 -0
  195. package/dist/types/src/notebook/compute-graph.test.d.ts +2 -0
  196. package/dist/types/src/notebook/compute-graph.test.d.ts.map +1 -0
  197. package/dist/types/src/notebook/eval.d.ts +13 -0
  198. package/dist/types/src/notebook/eval.d.ts.map +1 -0
  199. package/dist/types/src/notebook/index.d.ts +2 -0
  200. package/dist/types/src/notebook/index.d.ts.map +1 -0
  201. package/dist/types/src/notebook/vfs-parser.d.ts +74 -0
  202. package/dist/types/src/notebook/vfs-parser.d.ts.map +1 -0
  203. package/dist/types/src/notebook/vfs-parser.test.d.ts +2 -0
  204. package/dist/types/src/notebook/vfs-parser.test.d.ts.map +1 -0
  205. package/dist/types/src/templates/anthropic.d.ts +8 -0
  206. package/dist/types/src/templates/anthropic.d.ts.map +1 -0
  207. package/dist/types/src/templates/chess-bot.d.ts +16 -0
  208. package/dist/types/src/templates/chess-bot.d.ts.map +1 -0
  209. package/dist/types/src/templates/commentary.d.ts +16 -0
  210. package/dist/types/src/templates/commentary.d.ts.map +1 -0
  211. package/dist/types/src/templates/data-generator.d.ts.map +1 -1
  212. package/dist/types/src/templates/discord.d.ts.map +1 -1
  213. package/dist/types/src/templates/forex-effect.d.ts +4 -1
  214. package/dist/types/src/templates/forex-effect.d.ts.map +1 -1
  215. package/dist/types/src/templates/forex.d.ts +4 -1
  216. package/dist/types/src/templates/forex.d.ts.map +1 -1
  217. package/dist/types/src/templates/gmail.d.ts.map +1 -1
  218. package/dist/types/src/templates/index.d.ts +52 -1
  219. package/dist/types/src/templates/index.d.ts.map +1 -1
  220. package/dist/types/src/templates/ping.d.ts +3 -0
  221. package/dist/types/src/templates/ping.d.ts.map +1 -0
  222. package/dist/types/src/testing/data.d.ts +3 -0
  223. package/dist/types/src/testing/data.d.ts.map +1 -0
  224. package/dist/types/src/testing/index.d.ts +2 -0
  225. package/dist/types/src/testing/index.d.ts.map +1 -0
  226. package/dist/types/src/testing/simulator.test.d.ts +2 -0
  227. package/dist/types/src/testing/simulator.test.d.ts.map +1 -0
  228. package/dist/types/src/translations.d.ts +31 -5
  229. package/dist/types/src/translations.d.ts.map +1 -1
  230. package/dist/types/src/types/Notebook.d.ts +100 -0
  231. package/dist/types/src/types/Notebook.d.ts.map +1 -0
  232. package/dist/types/src/types/actions.d.ts +40 -0
  233. package/dist/types/src/types/actions.d.ts.map +1 -0
  234. package/dist/types/src/types/capabilities.d.ts +12 -0
  235. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  236. package/dist/types/src/types/events.d.ts +5 -0
  237. package/dist/types/src/types/events.d.ts.map +1 -0
  238. package/dist/types/src/types/index.d.ts +5 -1
  239. package/dist/types/src/types/index.d.ts.map +1 -1
  240. package/dist/types/src/types/types.d.ts +6 -0
  241. package/dist/types/src/types/types.d.ts.map +1 -0
  242. package/dist/types/src/util/deploy.d.ts +4 -4
  243. package/dist/types/src/util/deploy.d.ts.map +1 -1
  244. package/dist/types/src/util/functions.d.ts +6 -3
  245. package/dist/types/src/util/functions.d.ts.map +1 -1
  246. package/dist/types/tsconfig.tsbuildinfo +1 -1
  247. package/package.json +117 -82
  248. package/src/ScriptPlugin.tsx +55 -75
  249. package/src/blueprints/index.ts +5 -0
  250. package/src/blueprints/script-blueprint.ts +24 -0
  251. package/src/capabilities/app-graph-builder/app-graph-builder.ts +55 -0
  252. package/src/capabilities/app-graph-builder/index.ts +7 -0
  253. package/src/capabilities/{artifact-definition.ts → artifact-definition/artifact-definition.ts} +98 -96
  254. package/src/capabilities/artifact-definition/index.ts +7 -0
  255. package/src/capabilities/blueprint-definition/blueprint-definition.ts +23 -0
  256. package/src/capabilities/blueprint-definition/index.ts +7 -0
  257. package/src/capabilities/compiler/compiler.ts +103 -0
  258. package/src/capabilities/compiler/index.ts +7 -0
  259. package/src/capabilities/index.ts +6 -10
  260. package/src/capabilities/operation-resolver/index.ts +7 -0
  261. package/src/capabilities/operation-resolver/operation-resolver.ts +74 -0
  262. package/src/capabilities/react-surface/index.ts +7 -0
  263. package/src/capabilities/react-surface/react-surface.tsx +118 -0
  264. package/src/capabilities/settings/index.ts +7 -0
  265. package/src/capabilities/settings/settings.ts +32 -0
  266. package/src/compiler/compiler.ts +10 -3
  267. package/src/components/DeploymentDialog/DeploymentDialog.stories.tsx +37 -26
  268. package/src/components/DeploymentDialog/DeploymentDialog.tsx +41 -50
  269. package/src/components/FrameContainer/FrameContainer.tsx +6 -4
  270. package/src/components/NotebookContainer.stories.tsx +87 -0
  271. package/src/components/NotebookContainer.tsx +270 -0
  272. package/src/components/NotebookStack/NotebookCell.tsx +217 -0
  273. package/src/components/NotebookStack/NotebookMenu.tsx +47 -0
  274. package/src/components/NotebookStack/NotebookStack.stories.tsx +55 -0
  275. package/src/components/NotebookStack/NotebookStack.tsx +86 -0
  276. package/src/components/NotebookStack/index.ts +6 -0
  277. package/src/components/QueryEditor/QueryEditor.stories.tsx +100 -0
  278. package/src/components/QueryEditor/QueryEditor.tsx +47 -0
  279. package/src/components/QueryEditor/index.ts +5 -0
  280. package/src/components/ScriptContainer.tsx +50 -35
  281. package/src/components/ScriptToolbar/ScriptToolbar.stories.tsx +54 -19
  282. package/src/components/ScriptToolbar/ScriptToolbar.tsx +30 -36
  283. package/src/components/Settings/ScriptObjectSettings.tsx +136 -29
  284. package/src/components/Settings/ScriptPluginSettings.tsx +11 -21
  285. package/src/components/TestPanel/TestContainer.tsx +7 -7
  286. package/src/components/TestPanel/TestPanel.tsx +42 -19
  287. package/src/components/TypescriptEditor/TypescriptEditor.stories.tsx +77 -17
  288. package/src/components/TypescriptEditor/TypescriptEditor.tsx +81 -80
  289. package/src/components/index.ts +3 -0
  290. package/src/e2e/ai.test.ts +92 -0
  291. package/src/e2e/deploy.test.ts +64 -0
  292. package/src/hooks/deploy.ts +44 -37
  293. package/src/hooks/format.ts +9 -5
  294. package/src/hooks/index.ts +1 -0
  295. package/src/hooks/template.ts +20 -23
  296. package/src/hooks/useCompiler.ts +24 -0
  297. package/src/hooks/useCreateAndDeployScriptTemplates.ts +14 -16
  298. package/src/hooks/useToolbarState.ts +29 -5
  299. package/src/index.ts +2 -1
  300. package/src/meta.ts +9 -7
  301. package/src/notebook/compute-graph.test.ts +82 -0
  302. package/src/notebook/compute-graph.ts +230 -0
  303. package/src/notebook/eval.ts +105 -0
  304. package/src/notebook/index.ts +5 -0
  305. package/src/notebook/vfs-parser.test.ts +149 -0
  306. package/src/notebook/vfs-parser.ts +451 -0
  307. package/src/templates/anthropic.ts +42 -0
  308. package/src/templates/chess-bot.ts +58 -0
  309. package/src/templates/commentary.ts +232 -0
  310. package/src/templates/data-generator.ts +3 -1
  311. package/src/templates/discord.ts +9 -1
  312. package/src/templates/forex-effect.ts +24 -25
  313. package/src/templates/forex.ts +9 -6
  314. package/src/templates/gmail.ts +22 -11
  315. package/src/templates/index.ts +24 -11
  316. package/src/templates/ping.ts +17 -0
  317. package/src/testing/data.ts +72 -0
  318. package/src/testing/index.ts +5 -0
  319. package/src/testing/simulator.test.ts +40 -0
  320. package/src/translations.ts +34 -7
  321. package/src/types/Notebook.ts +41 -0
  322. package/src/types/actions.ts +45 -0
  323. package/src/types/capabilities.ts +17 -0
  324. package/src/types/events.ts +11 -0
  325. package/src/types/index.ts +5 -1
  326. package/src/types/types.ts +15 -0
  327. package/src/util/deploy.ts +30 -40
  328. package/src/util/functions.ts +56 -23
  329. package/src/vite-env.d.ts +2 -0
  330. package/dist/lib/browser/DeploymentDialog-QZSTVNIS.mjs +0 -12
  331. package/dist/lib/browser/ScriptContainer-DNNA6XC6.mjs +0 -265
  332. package/dist/lib/browser/ScriptContainer-DNNA6XC6.mjs.map +0 -7
  333. package/dist/lib/browser/app-graph-builder-IABOSTBK.mjs +0 -64
  334. package/dist/lib/browser/app-graph-builder-IABOSTBK.mjs.map +0 -7
  335. package/dist/lib/browser/blueprint-definition-AR7ITBCD.mjs +0 -28
  336. package/dist/lib/browser/blueprint-definition-AR7ITBCD.mjs.map +0 -7
  337. package/dist/lib/browser/chunk-5TVBECWH.mjs +0 -15
  338. package/dist/lib/browser/chunk-5TVBECWH.mjs.map +0 -7
  339. package/dist/lib/browser/chunk-6CAH7VIE.mjs +0 -283
  340. package/dist/lib/browser/chunk-6CAH7VIE.mjs.map +0 -7
  341. package/dist/lib/browser/chunk-GZKWMME3.mjs +0 -556
  342. package/dist/lib/browser/chunk-GZKWMME3.mjs.map +0 -7
  343. package/dist/lib/browser/chunk-IS4OG2UW.mjs +0 -39
  344. package/dist/lib/browser/chunk-IS4OG2UW.mjs.map +0 -7
  345. package/dist/lib/browser/chunk-NXKU3BNX.mjs +0 -222
  346. package/dist/lib/browser/chunk-NXKU3BNX.mjs.map +0 -7
  347. package/dist/lib/browser/chunk-QYAREHGH.mjs.map +0 -7
  348. package/dist/lib/browser/chunk-RNGIQIEJ.mjs +0 -88
  349. package/dist/lib/browser/chunk-RNGIQIEJ.mjs.map +0 -7
  350. package/dist/lib/browser/chunk-YCZPTTFO.mjs +0 -153
  351. package/dist/lib/browser/chunk-YCZPTTFO.mjs.map +0 -7
  352. package/dist/lib/browser/compiler-2HJH34GM.mjs +0 -98
  353. package/dist/lib/browser/compiler-2HJH34GM.mjs.map +0 -7
  354. package/dist/lib/browser/intent-resolver-F4YSRPJI.mjs +0 -89
  355. package/dist/lib/browser/intent-resolver-F4YSRPJI.mjs.map +0 -7
  356. package/dist/lib/browser/react-surface-BBHFU6MI.mjs +0 -104
  357. package/dist/lib/browser/react-surface-BBHFU6MI.mjs.map +0 -7
  358. package/dist/lib/browser/settings-KCTBK5TY.mjs +0 -24
  359. package/dist/lib/browser/settings-KCTBK5TY.mjs.map +0 -7
  360. package/dist/lib/node-esm/DeploymentDialog-G6EHEPXN.mjs +0 -13
  361. package/dist/lib/node-esm/ScriptContainer-KPYZN2KY.mjs +0 -266
  362. package/dist/lib/node-esm/ScriptContainer-KPYZN2KY.mjs.map +0 -7
  363. package/dist/lib/node-esm/app-graph-builder-CQTTAYHP.mjs +0 -65
  364. package/dist/lib/node-esm/app-graph-builder-CQTTAYHP.mjs.map +0 -7
  365. package/dist/lib/node-esm/blueprint-definition-TJY4TX6S.mjs +0 -30
  366. package/dist/lib/node-esm/blueprint-definition-TJY4TX6S.mjs.map +0 -7
  367. package/dist/lib/node-esm/chunk-2GBESIHU.mjs +0 -284
  368. package/dist/lib/node-esm/chunk-2GBESIHU.mjs.map +0 -7
  369. package/dist/lib/node-esm/chunk-35M3CHYE.mjs +0 -16
  370. package/dist/lib/node-esm/chunk-35M3CHYE.mjs.map +0 -7
  371. package/dist/lib/node-esm/chunk-AHXJ6NQU.mjs.map +0 -7
  372. package/dist/lib/node-esm/chunk-GWHLP5LM.mjs +0 -90
  373. package/dist/lib/node-esm/chunk-GWHLP5LM.mjs.map +0 -7
  374. package/dist/lib/node-esm/chunk-HUHVIOL5.mjs +0 -557
  375. package/dist/lib/node-esm/chunk-HUHVIOL5.mjs.map +0 -7
  376. package/dist/lib/node-esm/chunk-JIPFLBYA.mjs +0 -40
  377. package/dist/lib/node-esm/chunk-JIPFLBYA.mjs.map +0 -7
  378. package/dist/lib/node-esm/chunk-M642JUOZ.mjs +0 -223
  379. package/dist/lib/node-esm/chunk-M642JUOZ.mjs.map +0 -7
  380. package/dist/lib/node-esm/chunk-ZA36GO4T.mjs +0 -154
  381. package/dist/lib/node-esm/chunk-ZA36GO4T.mjs.map +0 -7
  382. package/dist/lib/node-esm/compiler-7SP27RA6.mjs +0 -99
  383. package/dist/lib/node-esm/compiler-7SP27RA6.mjs.map +0 -7
  384. package/dist/lib/node-esm/intent-resolver-CGQYRWWD.mjs +0 -90
  385. package/dist/lib/node-esm/intent-resolver-CGQYRWWD.mjs.map +0 -7
  386. package/dist/lib/node-esm/react-surface-UWIWPKZD.mjs +0 -105
  387. package/dist/lib/node-esm/react-surface-UWIWPKZD.mjs.map +0 -7
  388. package/dist/lib/node-esm/settings-DXZ334A3.mjs +0 -25
  389. package/dist/lib/node-esm/settings-DXZ334A3.mjs.map +0 -7
  390. package/dist/types/src/capabilities/app-graph-builder.d.ts +0 -4
  391. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +0 -1
  392. package/dist/types/src/capabilities/artifact-definition.d.ts +0 -11
  393. package/dist/types/src/capabilities/artifact-definition.d.ts.map +0 -1
  394. package/dist/types/src/capabilities/blueprint-definition.d.ts +0 -5
  395. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +0 -1
  396. package/dist/types/src/capabilities/capabilities.d.ts +0 -5
  397. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  398. package/dist/types/src/capabilities/compiler.d.ts +0 -4
  399. package/dist/types/src/capabilities/compiler.d.ts.map +0 -1
  400. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  401. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  402. package/dist/types/src/capabilities/react-surface.d.ts +0 -4
  403. package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
  404. package/dist/types/src/capabilities/settings.d.ts +0 -4
  405. package/dist/types/src/capabilities/settings.d.ts.map +0 -1
  406. package/dist/types/src/events.d.ts +0 -4
  407. package/dist/types/src/events.d.ts.map +0 -1
  408. package/dist/types/src/templates/chess.d.ts +0 -3
  409. package/dist/types/src/templates/chess.d.ts.map +0 -1
  410. package/dist/types/src/templates/echo.d.ts +0 -6
  411. package/dist/types/src/templates/echo.d.ts.map +0 -1
  412. package/dist/types/src/types/schema.d.ts +0 -38
  413. package/dist/types/src/types/schema.d.ts.map +0 -1
  414. package/src/capabilities/app-graph-builder.ts +0 -64
  415. package/src/capabilities/blueprint-definition.ts +0 -30
  416. package/src/capabilities/capabilities.ts +0 -12
  417. package/src/capabilities/compiler.ts +0 -34
  418. package/src/capabilities/intent-resolver.ts +0 -77
  419. package/src/capabilities/react-surface.tsx +0 -90
  420. package/src/capabilities/settings.ts +0 -21
  421. package/src/events.ts +0 -11
  422. package/src/templates/chess.ts +0 -47
  423. package/src/templates/echo.ts +0 -8
  424. package/src/types/schema.ts +0 -37
  425. /package/dist/lib/browser/{DeploymentDialog-QZSTVNIS.mjs.map → DeploymentDialog-GXNRUXF6.mjs.map} +0 -0
  426. /package/dist/lib/{node-esm/DeploymentDialog-G6EHEPXN.mjs.map → browser/blueprints/index.mjs.map} +0 -0
@@ -0,0 +1,270 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { RegistryContext } from '@effect-atom/atom-react';
6
+ import * as Cause from 'effect/Cause';
7
+ import * as Effect from 'effect/Effect';
8
+ import * as Exit from 'effect/Exit';
9
+ import React, { useCallback, useContext, useMemo, useState } from 'react';
10
+
11
+ import { type SurfaceComponentProps } from '@dxos/app-framework/react';
12
+ import { Agent } from '@dxos/assistant-toolkit';
13
+ import { Blueprint, Prompt } from '@dxos/blueprints';
14
+ import { Filter, Obj, Query, Ref } from '@dxos/echo';
15
+ import { QueryBuilder } from '@dxos/echo-query';
16
+ import { type FunctionDefinition, FunctionInvocationService, TracingService } from '@dxos/functions';
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 { DropdownMenu, IconButton, Toolbar, useTranslation } from '@dxos/react-ui';
22
+ import { useAttention } from '@dxos/react-ui-attention';
23
+ import { Layout } from '@dxos/react-ui-mosaic';
24
+ import { Text, View } from '@dxos/schema';
25
+ import { isNonNullable } from '@dxos/util';
26
+
27
+ import { meta } from '../meta';
28
+ import { ComputeGraph } from '../notebook';
29
+ import { type Notebook } from '../types';
30
+
31
+ import { NotebookMenu, NotebookStack, type NotebookStackProps } from './NotebookStack';
32
+ import { type TypescriptEditorProps } from './TypescriptEditor';
33
+
34
+ const INCLUDE_BLUEPRINTS = ['dxos.org/blueprint/assistant', 'dxos.org/blueprint/markdown'];
35
+
36
+ // TODO(burdon): Support calling named deployed functions (as with sheet).
37
+
38
+ export type NotebookContainerProps = SurfaceComponentProps<Notebook.Notebook, Pick<TypescriptEditorProps, 'env'>>;
39
+
40
+ export const NotebookContainer = ({ role, subject: notebook, env }: NotebookContainerProps) => {
41
+ const { t } = useTranslation(meta.id);
42
+ const registry = useContext(RegistryContext);
43
+ const db = notebook && Obj.getDatabase(notebook);
44
+ const attendableId = notebook ? Obj.getDXN(notebook).toString() : '';
45
+ const { hasAttention } = useAttention(attendableId);
46
+
47
+ // TODO(burdon): Consolidate execution and state (with graph).
48
+ // Generalize ComputeGraph evaluation function (using effects).
49
+ const graph = useMemo(() => notebook && new ComputeGraph(notebook, registry), [notebook, registry]);
50
+
51
+ const [queryValues, setQueryValues] = useState<Record<string, any>>({});
52
+ const handleExecQueries = useCallback(async () => {
53
+ invariant(db);
54
+
55
+ const builder = new QueryBuilder();
56
+ for (const cell of notebook?.cells ?? []) {
57
+ if (cell.type === 'query') {
58
+ if (cell.source?.target) {
59
+ const source = cell.source.target.content;
60
+ const { name, filter } = builder.build(source);
61
+ if (filter) {
62
+ const ast = Query.select(filter).ast;
63
+ const graph = cell.graph?.target;
64
+ if (!graph) {
65
+ const { view } = await View.makeFromDatabase({ db });
66
+ const newGraph = Graph.make({ query: { ast }, view });
67
+ Obj.change(notebook!, (n) => {
68
+ const c = n.cells.find((c) => c.id === cell.id);
69
+ if (c) {
70
+ c.graph = Ref.make(newGraph);
71
+ c.name = name;
72
+ }
73
+ });
74
+ } else {
75
+ Obj.change(graph, () => {
76
+ graph.query.ast = ast;
77
+ });
78
+ }
79
+ }
80
+ }
81
+
82
+ if (cell.name && cell.graph?.target) {
83
+ const graph = Obj.getSnapshot(cell.graph?.target);
84
+ const query = Query.fromAst(graph.query.ast);
85
+ const objects = await db.query(query).run();
86
+ const objectIds = objects?.map((obj) => obj.id);
87
+ setQueryValues((prev) => ({ ...prev, [cell.name!]: objectIds }));
88
+ }
89
+ }
90
+ }
91
+ }, [db, notebook, graph]);
92
+
93
+ const [promptResults, setPromptResults] = useState<Record<string, string>>({});
94
+ const handleExecPrompts = useComputeRuntimeCallback(
95
+ db?.spaceId,
96
+ Effect.fnUntraced(function* () {
97
+ invariant(graph);
98
+
99
+ const prompts =
100
+ notebook?.cells
101
+ .filter((cell) => cell.type === 'prompt')
102
+ .map((cell) => cell.prompt)
103
+ .filter(isNonNullable) ?? [];
104
+
105
+ for (const prompt of prompts) {
106
+ yield* runPrompt({
107
+ prompt,
108
+ input: { ...queryValues, ...graph.getValuesByName() },
109
+ onResult: (result) =>
110
+ setPromptResults((prev) => ({
111
+ ...prev,
112
+ [prompt.dxn.toString()]: result,
113
+ })),
114
+ });
115
+ }
116
+ }),
117
+ [notebook, graph, queryValues],
118
+ );
119
+
120
+ // TODO(burdon): Cache values in context (preserve when switched).
121
+ const handleCompute = useCallback(async () => {
122
+ // TODO(burdon): Generalize executors (dependencies).
123
+ await graph?.evaluate();
124
+ await handleExecQueries();
125
+ await handleExecPrompts();
126
+ }, [graph, handleExecQueries, handleExecPrompts]);
127
+
128
+ const handleRearrange = useCallback<NonNullable<NotebookStackProps['onRearrange']>>(
129
+ (source, target) => {
130
+ invariant(notebook);
131
+ const from = notebook.cells.findIndex((cell) => cell.id === source.id);
132
+ const to = notebook.cells.findIndex((cell) => cell.id === target.id);
133
+ if (from != null && to != null) {
134
+ Obj.change(notebook, (n) => {
135
+ const cell = n.cells.splice(from, 1)[0];
136
+ if (cell) {
137
+ n.cells.splice(to, 0, cell);
138
+ }
139
+ });
140
+ }
141
+ },
142
+ [notebook],
143
+ );
144
+
145
+ const handleCellInsert = useCallback<NonNullable<NotebookStackProps['onCellInsert']>>(
146
+ async (type, after) => {
147
+ invariant(notebook);
148
+ const cell: Notebook.Cell = { id: crypto.randomUUID(), type };
149
+ switch (type) {
150
+ case 'markdown':
151
+ case 'script':
152
+ case 'query': {
153
+ cell.source = Ref.make(Text.make());
154
+ break;
155
+ }
156
+
157
+ case 'prompt': {
158
+ if (db) {
159
+ const objects = await db.query(Query.select(Filter.type(Blueprint.Blueprint))).run();
160
+ const blueprints = objects
161
+ .filter((blueprint) => INCLUDE_BLUEPRINTS.includes(blueprint.key))
162
+ .map((blueprint) => Ref.make(blueprint));
163
+ cell.prompt = Ref.make(Prompt.make({ instructions: '', blueprints }));
164
+ }
165
+ break;
166
+ }
167
+ }
168
+
169
+ const idx = after ? notebook.cells.findIndex((cell) => cell.id === after) : notebook.cells.length;
170
+ Obj.change(notebook, (n) => {
171
+ n.cells.splice(idx, 0, cell);
172
+ });
173
+ },
174
+ [db, notebook],
175
+ );
176
+
177
+ const handleCellDelete = useCallback<NonNullable<NotebookStackProps['onCellDelete']>>(
178
+ (id) => {
179
+ invariant(notebook);
180
+ const idx = notebook.cells.findIndex((cell) => cell.id === id);
181
+ if (idx !== -1) {
182
+ Obj.change(notebook, (n) => {
183
+ n.cells.splice(idx, 1);
184
+ });
185
+ }
186
+ },
187
+ [notebook],
188
+ );
189
+
190
+ return (
191
+ <Layout.Main role={role} toolbar>
192
+ <Toolbar.Root disabled={!hasAttention} textBlockWidth>
193
+ <DropdownMenu.Root>
194
+ <DropdownMenu.Trigger asChild>
195
+ <IconButton icon='ph--plus--regular' iconOnly label={t('notebook cell insert label')} />
196
+ </DropdownMenu.Trigger>
197
+ <NotebookMenu onCellInsert={handleCellInsert} />
198
+ </DropdownMenu.Root>
199
+ <Toolbar.IconButton
200
+ icon='ph--play--fill'
201
+ iconOnly
202
+ label={t('compute label')}
203
+ classNames='text-green-500'
204
+ onClick={handleCompute}
205
+ />
206
+ </Toolbar.Root>
207
+ <div role='none' className='flex bs-full overflow-hidden -mis-[1px] -mie-[1px]'>
208
+ <NotebookStack
209
+ classNames='container-max-width border-l border-r border-subduedSeparator'
210
+ db={db}
211
+ notebook={notebook}
212
+ graph={graph}
213
+ env={env}
214
+ promptResults={promptResults}
215
+ onRearrange={handleRearrange}
216
+ onCellInsert={handleCellInsert}
217
+ onCellDelete={handleCellDelete}
218
+ />
219
+ </div>
220
+ </Layout.Main>
221
+ );
222
+ };
223
+
224
+ export default NotebookContainer;
225
+
226
+ // TODO(wittjosiah): Factor out. Copied from PromptArticle in plugin-assistant.
227
+ const runPrompt = Effect.fn(function* ({
228
+ prompt,
229
+ input,
230
+ onResult,
231
+ }: {
232
+ prompt: Ref.Ref<Prompt.Prompt>;
233
+ input: Record<string, any>;
234
+ onResult: (result: string) => void;
235
+ }) {
236
+ const inputData: FunctionDefinition.Input<typeof Agent.prompt> = {
237
+ prompt,
238
+ input,
239
+ };
240
+ const tracer = yield* TracingService;
241
+ const trace = yield* tracer.traceInvocationStart({
242
+ target: undefined,
243
+ payload: {
244
+ data: {},
245
+ },
246
+ });
247
+
248
+ // Invoke the function.
249
+ const result = yield* FunctionInvocationService.invokeFunction(Agent.prompt, inputData).pipe(
250
+ Effect.provide(trace.invocationTraceQueue ? TracingService.layerInvocation(trace) : TracingService.layerNoop),
251
+ Effect.exit,
252
+ );
253
+
254
+ Exit.match(result, {
255
+ onFailure: (cause) => {
256
+ const error = Cause.prettyErrors(cause)[0];
257
+ log.error(error.message, error.cause ?? error.stack);
258
+ onResult(error.message);
259
+ },
260
+ onSuccess: (result: any) => {
261
+ onResult(result.note);
262
+ },
263
+ });
264
+
265
+ yield* tracer.traceInvocationEnd({
266
+ trace,
267
+ // TODO(dmaretskyi): Might miss errors.
268
+ exception: Exit.isFailure(result) ? Cause.prettyErrors(result.cause)[0] : undefined,
269
+ });
270
+ });
@@ -0,0 +1,217 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import React, { useCallback, useMemo } from 'react';
6
+
7
+ import { Surface } from '@dxos/app-framework/react';
8
+ import { type Database, Obj } from '@dxos/echo';
9
+ import { createDocAccessor } from '@dxos/echo-db';
10
+ import { invariant } from '@dxos/invariant';
11
+ import { TemplateEditor } from '@dxos/plugin-assistant';
12
+ import { useThemeContext, useTranslation } from '@dxos/react-ui';
13
+ import { QueryEditor, type QueryEditorProps } from '@dxos/react-ui-components';
14
+ import { EditorContent, type EditorContentProps } from '@dxos/react-ui-editor';
15
+ import {
16
+ type BasicExtensionsOptions,
17
+ createBasicExtensions,
18
+ createDataExtensions,
19
+ createMarkdownExtensions,
20
+ createThemeExtensions,
21
+ decorateMarkdown,
22
+ } from '@dxos/ui-editor';
23
+ import { mx } from '@dxos/ui-theme';
24
+ import { isNonNullable } from '@dxos/util';
25
+
26
+ import { meta } from '../../meta';
27
+ import { type ComputeGraph } from '../../notebook';
28
+ import { type Notebook } from '../../types';
29
+ import { TypescriptEditor, type TypescriptEditorProps } from '../TypescriptEditor';
30
+
31
+ import { type NotebookMenuProps } from './NotebookMenu';
32
+
33
+ const editorStyles = 'p-2 pis-3';
34
+ const valueStyles = 'p-1 pis-3';
35
+
36
+ export type NotebookCellProps = {
37
+ db?: Database.Database;
38
+ graph?: ComputeGraph;
39
+ dragging?: boolean;
40
+ cell: Notebook.Cell;
41
+ promptResults?: Record<string, string>;
42
+ } & (Pick<NotebookMenuProps, 'onCellInsert' | 'onCellDelete'> & Pick<TypescriptEditorProps, 'env'>);
43
+
44
+ // TODO(burdon): Show evaluation errors.
45
+ export const NotebookCell = ({ db, graph, dragging, cell, promptResults, env }: NotebookCellProps) => {
46
+ const { t } = useTranslation(meta.id);
47
+
48
+ const extensions = useMemo(() => {
49
+ return cell.source?.target
50
+ ? [
51
+ createDataExtensions({
52
+ id: cell.id,
53
+ text: createDocAccessor(cell.source.target, ['content']),
54
+ }),
55
+ ].filter(isNonNullable)
56
+ : [];
57
+ }, [cell.source?.target]);
58
+
59
+ const explorerGraph = cell.graph?.target;
60
+
61
+ const handleQueryChange = useCallback<NonNullable<QueryEditorProps['onChange']>>(
62
+ (value: string) => {
63
+ invariant(cell.source?.target);
64
+ Obj.change(cell.source.target, (s) => {
65
+ s.content = value;
66
+ });
67
+ },
68
+ [cell],
69
+ );
70
+
71
+ switch (cell.type) {
72
+ case 'markdown':
73
+ if (!cell.source?.target) {
74
+ return null;
75
+ }
76
+
77
+ return (
78
+ <NotebookTextEditor
79
+ id={cell.id}
80
+ classNames={editorStyles}
81
+ initialValue={cell.source.target.content}
82
+ extensions={extensions}
83
+ />
84
+ );
85
+
86
+ case 'script':
87
+ if (!cell.source?.target) {
88
+ return null;
89
+ }
90
+
91
+ return (
92
+ <>
93
+ <TypescriptEditor
94
+ id={cell.id}
95
+ role='section'
96
+ classNames={editorStyles}
97
+ initialValue={cell.source.target.content}
98
+ extensions={extensions}
99
+ env={env}
100
+ options={{
101
+ placeholder: t('notebook cell placeholder'),
102
+ highlightActiveLine: false,
103
+ lineNumbers: false,
104
+ }}
105
+ />
106
+ <NotebookCellValue cell={cell} graph={graph} />
107
+ </>
108
+ );
109
+
110
+ case 'query':
111
+ if (!cell.source?.target) {
112
+ return null;
113
+ }
114
+
115
+ // TODO(burdon): Remove app-framework deps (via render prop).
116
+ return (
117
+ <div
118
+ className={mx('bs-full overflow-hidden grid', explorerGraph && !dragging && 'grid-rows-[min-content_1fr]')}
119
+ >
120
+ <QueryEditor
121
+ id={cell.id}
122
+ classNames={[editorStyles, 'border-be border-subduedSeparator']}
123
+ db={db}
124
+ value={cell.source.target.content}
125
+ onChange={handleQueryChange}
126
+ />
127
+ {explorerGraph && !dragging && <Surface role='section' limit={1} data={{ subject: explorerGraph }} />}
128
+ </div>
129
+ );
130
+
131
+ // TODO(burdon): Use streaming response from Chat.
132
+ case 'prompt':
133
+ if (!cell.prompt?.target) {
134
+ return null;
135
+ }
136
+
137
+ return (
138
+ <>
139
+ <TemplateEditor
140
+ id={cell.id}
141
+ template={cell.prompt.target.instructions}
142
+ lineNumbers={false}
143
+ classNames={editorStyles}
144
+ />
145
+ <NotebookPromptResult cell={cell} promptResults={promptResults} />
146
+ </>
147
+ );
148
+
149
+ default:
150
+ return null;
151
+ }
152
+ };
153
+
154
+ const NotebookCellValue = ({ cell, graph }: NotebookCellProps) => {
155
+ const name = graph?.getExpressions()[cell.id]?.name;
156
+ const value = graph?.getValue(cell.id);
157
+ if (value == null) {
158
+ return null;
159
+ }
160
+
161
+ return (
162
+ <div
163
+ className={mx(
164
+ 'flex is-full bg-groupSurface border-bs border-subduedSeparator text-description font-mono',
165
+ valueStyles,
166
+ )}
167
+ >
168
+ {name && (
169
+ <>
170
+ <span className='text-successText'>{name}</span>
171
+ <span className='text-description'>&nbsp;=&nbsp;</span>
172
+ </>
173
+ )}
174
+ <span>{value}</span>
175
+ </div>
176
+ );
177
+ };
178
+
179
+ const NotebookPromptResult = ({ cell, promptResults }: NotebookCellProps) => {
180
+ if (!cell.prompt) {
181
+ return null;
182
+ }
183
+
184
+ const value = promptResults?.[cell.prompt.dxn.toString()];
185
+ if (value == null) {
186
+ return null;
187
+ }
188
+
189
+ return (
190
+ <div className={mx('flex is-full bg-groupSurface text-description border-bs border-subduedSeparator', valueStyles)}>
191
+ <NotebookTextEditor readOnly value={value} />
192
+ </div>
193
+ );
194
+ };
195
+
196
+ const NotebookTextEditor = ({
197
+ extensions: extensionsProp,
198
+ readOnly,
199
+ ...props
200
+ }: EditorContentProps & Pick<BasicExtensionsOptions, 'readOnly'>) => {
201
+ const { t } = useTranslation(meta.id);
202
+ const { themeMode } = useThemeContext();
203
+ const extensions = useMemo(() => {
204
+ return [
205
+ createBasicExtensions({
206
+ placeholder: t('notebook markdown placeholder'),
207
+ readOnly,
208
+ }),
209
+ createThemeExtensions({ themeMode, syntaxHighlighting: true }),
210
+ createMarkdownExtensions(),
211
+ decorateMarkdown(),
212
+ extensionsProp,
213
+ ].filter(isNonNullable);
214
+ }, [extensionsProp]);
215
+
216
+ return <EditorContent {...props} extensions={extensions} selectionEnd />;
217
+ };
@@ -0,0 +1,47 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import React from 'react';
6
+
7
+ import { DropdownMenu, useTranslation } from '@dxos/react-ui';
8
+
9
+ import { meta } from '../../meta';
10
+ import { type Notebook } from '../../types';
11
+
12
+ export type NotebookMenuProps = {
13
+ cell?: Notebook.Cell;
14
+ onCellInsert?: (type: Notebook.CellType, after: string | undefined) => void;
15
+ onCellDelete?: (id: string) => void;
16
+ };
17
+
18
+ // TODO(burdon): Better way to organize menu?
19
+ export const NotebookMenu = ({ cell, onCellInsert, onCellDelete }: NotebookMenuProps) => {
20
+ const { t } = useTranslation(meta.id);
21
+ return (
22
+ <DropdownMenu.Portal>
23
+ <DropdownMenu.Content>
24
+ <DropdownMenu.Viewport>
25
+ <DropdownMenu.Item onClick={() => onCellInsert?.('script', cell?.id)}>
26
+ {t('notebook cell insert script label')}
27
+ </DropdownMenu.Item>
28
+ <DropdownMenu.Item onClick={() => onCellInsert?.('prompt', cell?.id)}>
29
+ {t('notebook cell insert prompt label')}
30
+ </DropdownMenu.Item>
31
+ <DropdownMenu.Item onClick={() => onCellInsert?.('query', cell?.id)}>
32
+ {t('notebook cell insert query label')}
33
+ </DropdownMenu.Item>
34
+ <DropdownMenu.Item onClick={() => onCellInsert?.('markdown', cell?.id)}>
35
+ {t('notebook cell insert markdown label')}
36
+ </DropdownMenu.Item>
37
+ {cell && onCellDelete && (
38
+ <DropdownMenu.Item onClick={() => onCellDelete?.(cell.id)}>
39
+ {t('notebook cell delete label')}
40
+ </DropdownMenu.Item>
41
+ )}
42
+ </DropdownMenu.Viewport>
43
+ <DropdownMenu.Arrow />
44
+ </DropdownMenu.Content>
45
+ </DropdownMenu.Portal>
46
+ );
47
+ };
@@ -0,0 +1,55 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import * as Effect from 'effect/Effect';
7
+ import React, { useMemo } from 'react';
8
+
9
+ import { withPluginManager } from '@dxos/app-framework/testing';
10
+ import { AutomationPlugin } from '@dxos/plugin-automation';
11
+ import { ClientPlugin } from '@dxos/plugin-client';
12
+ import { corePlugins } from '@dxos/plugin-testing';
13
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
14
+
15
+ import { createNotebook } from '../../testing';
16
+ import { translations } from '../../translations';
17
+
18
+ import { NotebookStack } from './NotebookStack';
19
+
20
+ // TODO(wittjosiah): ECHO objects don't work when passed via Storybook args.
21
+ const NotebookStackStory = () => {
22
+ const notebook = useMemo(() => createNotebook(), []);
23
+ return <NotebookStack notebook={notebook} />;
24
+ };
25
+
26
+ const meta = {
27
+ title: 'plugins/plugin-script/NotebookStack',
28
+ component: NotebookStackStory,
29
+ decorators: [
30
+ withTheme,
31
+ withLayout({ layout: 'column', classNames: 'is-proseMaxWidth' }),
32
+ withPluginManager({
33
+ plugins: [
34
+ ...corePlugins(),
35
+ ClientPlugin({
36
+ onClientInitialized: ({ client }) =>
37
+ Effect.gen(function* () {
38
+ yield* Effect.promise(() => client.halo.createIdentity());
39
+ yield* Effect.promise(() => client.spaces.waitUntilReady());
40
+ }),
41
+ }),
42
+ AutomationPlugin(),
43
+ ],
44
+ }),
45
+ ],
46
+ parameters: {
47
+ translations,
48
+ },
49
+ } satisfies Meta<typeof NotebookStackStory>;
50
+
51
+ export default meta;
52
+
53
+ type Story = StoryObj<typeof meta>;
54
+
55
+ export const Default: Story = {};
@@ -0,0 +1,86 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import React from 'react';
6
+
7
+ import { DropdownMenu, IconButton, type ThemedClassName, useTranslation } from '@dxos/react-ui';
8
+ import { Stack, StackItem, type StackProps } from '@dxos/react-ui-stack';
9
+
10
+ import { meta } from '../../meta';
11
+ import { type Notebook } from '../../types';
12
+ import { type TypescriptEditorProps } from '../TypescriptEditor';
13
+
14
+ import { NotebookCell, type NotebookCellProps } from './NotebookCell';
15
+ import { NotebookMenu } from './NotebookMenu';
16
+
17
+ const minSectionHeight = 'min-bs-[16rem]';
18
+
19
+ export type NotebookStackProps = ThemedClassName<
20
+ {
21
+ notebook?: Notebook.Notebook;
22
+ onRearrange?: StackProps['onRearrange'];
23
+ } & (Pick<NotebookSectionProps, 'db' | 'graph' | 'promptResults' | 'onCellInsert' | 'onCellDelete'> &
24
+ Pick<TypescriptEditorProps, 'env'>)
25
+ >;
26
+
27
+ // TODO(burdon): Option for narrow rail (with compact buttons that align with first button in toolbar).
28
+ export const NotebookStack = ({ classNames, notebook, onRearrange, ...props }: NotebookStackProps) => {
29
+ return (
30
+ <Stack classNames={classNames} orientation='vertical' size='contain' rail onRearrange={onRearrange}>
31
+ {notebook?.cells.map((cell, i) => (
32
+ <NotebookSection key={i} cell={cell} {...props} />
33
+ ))}
34
+ </Stack>
35
+ );
36
+ };
37
+
38
+ type NotebookSectionProps = NotebookCellProps;
39
+
40
+ const NotebookSection = ({
41
+ cell,
42
+ db,
43
+ env,
44
+ promptResults,
45
+ onCellInsert,
46
+ onCellDelete,
47
+ ...props
48
+ }: NotebookSectionProps) => {
49
+ const { t } = useTranslation(meta.id);
50
+ const resizable = cell.type === 'query';
51
+
52
+ return (
53
+ <StackItem.Root role='section' item={cell} draggable classNames={resizable && minSectionHeight}>
54
+ <StackItem.Heading classNames='bs-full p-1 justify-between attention-surface'>
55
+ <StackItem.DragHandle asChild>
56
+ <IconButton variant='ghost' icon='ph--dots-six-vertical--regular' iconOnly label='Drag handle' />
57
+ </StackItem.DragHandle>
58
+ <DropdownMenu.Root>
59
+ <DropdownMenu.Trigger asChild>
60
+ <IconButton
61
+ variant='ghost'
62
+ icon='ph--dots-three--regular'
63
+ iconOnly
64
+ label={t('notebook cell insert label')}
65
+ />
66
+ </DropdownMenu.Trigger>
67
+ <NotebookMenu cell={cell} onCellInsert={onCellInsert} onCellDelete={onCellDelete} />
68
+ </DropdownMenu.Root>
69
+ {resizable && <StackItem.ResizeHandle />}
70
+ </StackItem.Heading>
71
+
72
+ {/* TODO(burdon): Move drag preview to outer stack (uniformly). */}
73
+ <StackItem.DragPreview>
74
+ {({ item: cell }) => (
75
+ <StackItem.Content classNames='overflow-visible bg-groupSurface border border-subduedSeparator'>
76
+ <NotebookCell db={db} cell={cell} env={env} dragging />
77
+ </StackItem.Content>
78
+ )}
79
+ </StackItem.DragPreview>
80
+
81
+ <StackItem.Content classNames='overflow-visible'>
82
+ <NotebookCell db={db} cell={cell} env={env} promptResults={promptResults} {...props} />
83
+ </StackItem.Content>
84
+ </StackItem.Root>
85
+ );
86
+ };
@@ -0,0 +1,6 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './NotebookMenu';
6
+ export * from './NotebookStack';