@dxos/plugin-script 0.11.1 → 0.12.0-next-2800d0376abcc62d5544afdd744b16b2b960434e

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 (365) hide show
  1. package/PLUGIN.mdl +7 -7
  2. package/dist/lib/Notebook.mjs +33 -0
  3. package/dist/lib/Notebook.mjs.map +1 -0
  4. package/dist/lib/ScriptCapabilities.mjs +14 -0
  5. package/dist/lib/ScriptCapabilities.mjs.map +1 -0
  6. package/dist/lib/ScriptEvents.mjs +19 -0
  7. package/dist/lib/ScriptEvents.mjs.map +1 -0
  8. package/dist/lib/ScriptOperation.mjs +32 -0
  9. package/dist/lib/ScriptOperation.mjs.map +1 -0
  10. package/dist/lib/ScriptOperationHandlerSet.mjs +11 -0
  11. package/dist/lib/ScriptOperationHandlerSet.mjs.map +1 -0
  12. package/dist/lib/ScriptPlugin.mjs +13 -22
  13. package/dist/lib/ScriptPlugin.mjs.map +1 -1
  14. package/dist/lib/{chunk-skills.mjs → ScriptSkill.mjs} +11 -8
  15. package/dist/lib/ScriptSkill.mjs.map +1 -0
  16. package/dist/lib/Settings.mjs +14 -0
  17. package/dist/lib/Settings.mjs.map +1 -0
  18. package/dist/lib/capabilities.mjs +37 -9
  19. package/dist/lib/capabilities.mjs.map +1 -1
  20. package/dist/lib/capabilities.node.mjs +27 -0
  21. package/dist/lib/capabilities.node.mjs.map +1 -0
  22. package/dist/lib/capabilities.workerd.mjs +26 -0
  23. package/dist/lib/capabilities.workerd.mjs.map +1 -0
  24. package/dist/lib/chunk-DeploymentDialog.mjs +4 -3
  25. package/dist/lib/chunk-DeploymentDialog.mjs.map +1 -1
  26. package/dist/lib/chunk-NotebookArticle.mjs +29 -28
  27. package/dist/lib/chunk-NotebookArticle.mjs.map +1 -1
  28. package/dist/lib/chunk-ScriptArticle.mjs.map +1 -1
  29. package/dist/lib/chunk-ScriptProperties.mjs +24 -19
  30. package/dist/lib/chunk-ScriptProperties.mjs.map +1 -1
  31. package/dist/lib/chunk-ScriptSettings.mjs +1 -1
  32. package/dist/lib/chunk-ScriptSettings.mjs.map +1 -1
  33. package/dist/lib/chunk-TestContainer.mjs.map +1 -1
  34. package/dist/lib/chunk-app-graph-builder.mjs +8 -7
  35. package/dist/lib/chunk-app-graph-builder.mjs.map +1 -1
  36. package/dist/lib/chunk-compiler.mjs +1 -1
  37. package/dist/lib/chunk-compiler.mjs.map +1 -1
  38. package/dist/lib/chunk-compiler2.mjs +9 -9
  39. package/dist/lib/chunk-compiler2.mjs.map +1 -1
  40. package/dist/lib/chunk-create-object.mjs +13 -13
  41. package/dist/lib/chunk-create-object.mjs.map +1 -1
  42. package/dist/lib/chunk-create-script.mjs +4 -3
  43. package/dist/lib/chunk-create-script.mjs.map +1 -1
  44. package/dist/lib/chunk-create.mjs +3 -2
  45. package/dist/lib/chunk-create.mjs.map +1 -1
  46. package/dist/lib/chunk-delete.mjs +1 -1
  47. package/dist/lib/chunk-delete.mjs.map +1 -1
  48. package/dist/lib/chunk-deploy.mjs +2 -2
  49. package/dist/lib/chunk-deploy.mjs.map +1 -1
  50. package/dist/lib/chunk-functions.mjs +56 -45
  51. package/dist/lib/chunk-functions.mjs.map +1 -1
  52. package/dist/lib/chunk-inspect-invocations.mjs +1 -1
  53. package/dist/lib/chunk-inspect-invocations.mjs.map +1 -1
  54. package/dist/lib/chunk-install-function.mjs +1 -1
  55. package/dist/lib/chunk-install-function.mjs.map +1 -1
  56. package/dist/lib/chunk-invoke.mjs +1 -1
  57. package/dist/lib/chunk-invoke.mjs.map +1 -1
  58. package/dist/lib/chunk-operation-handler.mjs +4 -3
  59. package/dist/lib/chunk-operation-handler.mjs.map +1 -1
  60. package/dist/lib/chunk-query-deployed-functions.mjs +1 -1
  61. package/dist/lib/chunk-query-deployed-functions.mjs.map +1 -1
  62. package/dist/lib/chunk-react-surface.mjs +21 -16
  63. package/dist/lib/chunk-react-surface.mjs.map +1 -1
  64. package/dist/lib/chunk-read.mjs +1 -1
  65. package/dist/lib/chunk-read.mjs.map +1 -1
  66. package/dist/lib/chunk-rolldown-runtime.mjs +13 -0
  67. package/dist/lib/chunk-schema.mjs +11 -0
  68. package/dist/lib/chunk-schema.mjs.map +1 -0
  69. package/dist/lib/chunk-settings.mjs +4 -4
  70. package/dist/lib/chunk-settings.mjs.map +1 -1
  71. package/dist/lib/chunk-skill-definition.mjs +3 -3
  72. package/dist/lib/chunk-skill-definition.mjs.map +1 -1
  73. package/dist/lib/chunk-templates.mjs +12 -12
  74. package/dist/lib/chunk-templates.mjs.map +1 -1
  75. package/dist/lib/chunk-update.mjs +3 -2
  76. package/dist/lib/chunk-update.mjs.map +1 -1
  77. package/dist/lib/chunk-util.mjs +12 -12
  78. package/dist/lib/chunk-util.mjs.map +1 -1
  79. package/dist/lib/components.mjs +8 -6
  80. package/dist/lib/components.mjs.map +1 -1
  81. package/dist/lib/hooks.mjs +27 -30
  82. package/dist/lib/hooks.mjs.map +1 -1
  83. package/dist/lib/index.mjs +4 -4
  84. package/dist/lib/meta.mjs +32 -1
  85. package/dist/lib/meta.mjs.map +1 -0
  86. package/dist/lib/operations.mjs +2 -7
  87. package/dist/lib/plugin.mjs +6 -6
  88. package/dist/lib/plugin.mjs.map +1 -1
  89. package/dist/lib/skills.mjs +2 -2
  90. package/dist/lib/testing.mjs +6 -4
  91. package/dist/lib/testing.mjs.map +1 -1
  92. package/dist/lib/translations.mjs +3 -3
  93. package/dist/lib/translations.mjs.map +1 -1
  94. package/dist/lib/types.mjs +5 -1
  95. package/dist/types/src/ScriptPlugin.d.ts +36 -3
  96. package/dist/types/src/ScriptPlugin.d.ts.map +1 -1
  97. package/dist/types/src/capabilities/ScriptSurfaces.d.ts +4 -3
  98. package/dist/types/src/capabilities/ScriptSurfaces.d.ts.map +1 -1
  99. package/dist/types/src/capabilities/app-graph-builder.d.ts +2 -2
  100. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  101. package/dist/types/src/capabilities/compiler.d.ts +3 -2
  102. package/dist/types/src/capabilities/compiler.d.ts.map +1 -1
  103. package/dist/types/src/capabilities/create-object.d.ts +2 -2
  104. package/dist/types/src/capabilities/create-object.d.ts.map +1 -1
  105. package/dist/types/src/capabilities/gen/node.d.ts +12 -0
  106. package/dist/types/src/capabilities/gen/node.d.ts.map +1 -0
  107. package/dist/types/src/capabilities/gen/workerd.d.ts +12 -0
  108. package/dist/types/src/capabilities/gen/workerd.d.ts.map +1 -0
  109. package/dist/types/src/capabilities/index.d.ts +11 -9
  110. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  111. package/dist/types/src/capabilities/operation-handler.d.ts +2 -3
  112. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -1
  113. package/dist/types/src/capabilities/react-surface.d.ts +2 -2
  114. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  115. package/dist/types/src/capabilities/schema.d.ts +8 -0
  116. package/dist/types/src/capabilities/schema.d.ts.map +1 -0
  117. package/dist/types/src/capabilities/settings.d.ts +2 -2
  118. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  119. package/dist/types/src/capabilities/skill-definition.d.ts +2 -2
  120. package/dist/types/src/capabilities/skill-definition.d.ts.map +1 -1
  121. package/dist/types/src/compiler/compiler.d.ts +1 -1
  122. package/dist/types/src/compiler/compiler.d.ts.map +1 -1
  123. package/dist/types/src/components/NotebookStack/NotebookCell.d.ts +1 -1
  124. package/dist/types/src/components/NotebookStack/NotebookCell.d.ts.map +1 -1
  125. package/dist/types/src/components/NotebookStack/NotebookMenu.d.ts +1 -1
  126. package/dist/types/src/components/NotebookStack/NotebookMenu.d.ts.map +1 -1
  127. package/dist/types/src/components/NotebookStack/NotebookStack.d.ts +1 -1
  128. package/dist/types/src/components/NotebookStack/NotebookStack.d.ts.map +1 -1
  129. package/dist/types/src/components/NotebookStack/NotebookStack.stories.d.ts +2 -1
  130. package/dist/types/src/components/NotebookStack/NotebookStack.stories.d.ts.map +1 -1
  131. package/dist/types/src/components/QueryEditor/QueryEditor.d.ts.map +1 -1
  132. package/dist/types/src/components/QueryEditor/QueryEditor.stories.d.ts +4 -3
  133. package/dist/types/src/components/QueryEditor/QueryEditor.stories.d.ts.map +1 -1
  134. package/dist/types/src/components/ScriptToolbar/ScriptToolbar.d.ts +1 -1
  135. package/dist/types/src/components/ScriptToolbar/ScriptToolbar.d.ts.map +1 -1
  136. package/dist/types/src/components/ScriptToolbar/ScriptToolbar.stories.d.ts +2 -1
  137. package/dist/types/src/components/ScriptToolbar/ScriptToolbar.stories.d.ts.map +1 -1
  138. package/dist/types/src/components/TypescriptEditor/TypescriptEditor.stories.d.ts +2 -1
  139. package/dist/types/src/components/TypescriptEditor/TypescriptEditor.stories.d.ts.map +1 -1
  140. package/dist/types/src/containers/DeploymentDialog/DeploymentDialog.d.ts.map +1 -1
  141. package/dist/types/src/containers/DeploymentDialog/DeploymentDialog.stories.d.ts +2 -1
  142. package/dist/types/src/containers/DeploymentDialog/DeploymentDialog.stories.d.ts.map +1 -1
  143. package/dist/types/src/containers/NotebookArticle/NotebookArticle.d.ts +1 -1
  144. package/dist/types/src/containers/NotebookArticle/NotebookArticle.d.ts.map +1 -1
  145. package/dist/types/src/containers/ScriptArticle/ScriptArticle.d.ts +3 -3
  146. package/dist/types/src/containers/ScriptArticle/ScriptArticle.d.ts.map +1 -1
  147. package/dist/types/src/containers/ScriptArticle/ScriptArticle.stories.d.ts +5 -1
  148. package/dist/types/src/containers/ScriptArticle/ScriptArticle.stories.d.ts.map +1 -1
  149. package/dist/types/src/containers/ScriptProperties/FunctionBinding.d.ts +1 -1
  150. package/dist/types/src/containers/ScriptProperties/FunctionBinding.d.ts.map +1 -1
  151. package/dist/types/src/containers/ScriptProperties/FunctionPublishing.d.ts +1 -1
  152. package/dist/types/src/containers/ScriptProperties/FunctionPublishing.d.ts.map +1 -1
  153. package/dist/types/src/containers/ScriptProperties/ScriptProperties.d.ts +1 -1
  154. package/dist/types/src/containers/ScriptProperties/ScriptProperties.d.ts.map +1 -1
  155. package/dist/types/src/containers/ScriptProperties/ScriptProperties.stories.d.ts +2 -1
  156. package/dist/types/src/containers/ScriptProperties/ScriptProperties.stories.d.ts.map +1 -1
  157. package/dist/types/src/containers/ScriptProperties/SkillEditor.d.ts +1 -1
  158. package/dist/types/src/containers/ScriptProperties/SkillEditor.d.ts.map +1 -1
  159. package/dist/types/src/containers/ScriptSettings/ScriptSettings.stories.d.ts +2 -4
  160. package/dist/types/src/containers/ScriptSettings/ScriptSettings.stories.d.ts.map +1 -1
  161. package/dist/types/src/containers/TestContainer/TestContainer.d.ts +1 -1
  162. package/dist/types/src/containers/TestContainer/TestContainer.d.ts.map +1 -1
  163. package/dist/types/src/hooks/deploy.d.ts +6 -5
  164. package/dist/types/src/hooks/deploy.d.ts.map +1 -1
  165. package/dist/types/src/hooks/format.d.ts +1 -1
  166. package/dist/types/src/hooks/format.d.ts.map +1 -1
  167. package/dist/types/src/hooks/template.d.ts +1 -1
  168. package/dist/types/src/hooks/template.d.ts.map +1 -1
  169. package/dist/types/src/hooks/useCompiler.d.ts.map +1 -1
  170. package/dist/types/src/hooks/useCreateAndDeployScriptTemplates.d.ts +4 -4
  171. package/dist/types/src/hooks/useCreateAndDeployScriptTemplates.d.ts.map +1 -1
  172. package/dist/types/src/hooks/useToolbarState.d.ts +1 -1
  173. package/dist/types/src/hooks/useToolbarState.d.ts.map +1 -1
  174. package/dist/types/src/index.d.ts +3 -3
  175. package/dist/types/src/index.d.ts.map +1 -1
  176. package/dist/types/src/notebook/compute-graph.d.ts +4 -3
  177. package/dist/types/src/notebook/compute-graph.d.ts.map +1 -1
  178. package/dist/types/src/notebook/vfs-parser.d.ts +1 -1
  179. package/dist/types/src/notebook/vfs-parser.d.ts.map +1 -1
  180. package/dist/types/src/operations/ScriptOperationHandlerSet.d.ts +3 -0
  181. package/dist/types/src/operations/ScriptOperationHandlerSet.d.ts.map +1 -0
  182. package/dist/types/src/operations/create-script.d.ts +2 -2
  183. package/dist/types/src/operations/create-script.d.ts.map +1 -1
  184. package/dist/types/src/operations/index.d.ts +1 -2
  185. package/dist/types/src/operations/index.d.ts.map +1 -1
  186. package/dist/types/src/plugin.d.ts +2 -2
  187. package/dist/types/src/plugin.d.ts.map +1 -1
  188. package/dist/types/src/plugin.test.d.ts +2 -0
  189. package/dist/types/src/plugin.test.d.ts.map +1 -0
  190. package/dist/types/src/skills/ScriptSkill.d.ts +4 -0
  191. package/dist/types/src/skills/ScriptSkill.d.ts.map +1 -0
  192. package/dist/types/src/skills/functions/create.d.ts +1 -1
  193. package/dist/types/src/skills/functions/create.d.ts.map +1 -1
  194. package/dist/types/src/skills/functions/definitions.d.ts +1 -1
  195. package/dist/types/src/skills/functions/definitions.d.ts.map +1 -1
  196. package/dist/types/src/skills/functions/delete.d.ts +1 -1
  197. package/dist/types/src/skills/functions/delete.d.ts.map +1 -1
  198. package/dist/types/src/skills/functions/deploy.d.ts +1 -1
  199. package/dist/types/src/skills/functions/deploy.d.ts.map +1 -1
  200. package/dist/types/src/skills/functions/index.d.ts +1 -1
  201. package/dist/types/src/skills/functions/index.d.ts.map +1 -1
  202. package/dist/types/src/skills/functions/inspect-invocations.d.ts +1 -1
  203. package/dist/types/src/skills/functions/inspect-invocations.d.ts.map +1 -1
  204. package/dist/types/src/skills/functions/install-function.d.ts +1 -1
  205. package/dist/types/src/skills/functions/install-function.d.ts.map +1 -1
  206. package/dist/types/src/skills/functions/invoke.d.ts +1 -1
  207. package/dist/types/src/skills/functions/invoke.d.ts.map +1 -1
  208. package/dist/types/src/skills/functions/query-deployed-functions.d.ts +1 -1
  209. package/dist/types/src/skills/functions/query-deployed-functions.d.ts.map +1 -1
  210. package/dist/types/src/skills/functions/read.d.ts +1 -1
  211. package/dist/types/src/skills/functions/read.d.ts.map +1 -1
  212. package/dist/types/src/skills/functions/update.d.ts +1 -1
  213. package/dist/types/src/skills/functions/update.d.ts.map +1 -1
  214. package/dist/types/src/skills/index.d.ts +1 -1
  215. package/dist/types/src/skills/index.d.ts.map +1 -1
  216. package/dist/types/src/templates/anthropic.d.ts +1 -1
  217. package/dist/types/src/templates/anthropic.d.ts.map +1 -1
  218. package/dist/types/src/templates/chess-bot.d.ts +2 -2
  219. package/dist/types/src/templates/chess-bot.d.ts.map +1 -1
  220. package/dist/types/src/templates/commentary.d.ts +2 -2
  221. package/dist/types/src/templates/commentary.d.ts.map +1 -1
  222. package/dist/types/src/templates/email.d.ts +2 -2
  223. package/dist/types/src/templates/email.d.ts.map +1 -1
  224. package/dist/types/src/templates/forex-effect.d.ts +1 -1
  225. package/dist/types/src/templates/forex-effect.d.ts.map +1 -1
  226. package/dist/types/src/templates/forex.d.ts +1 -1
  227. package/dist/types/src/templates/forex.d.ts.map +1 -1
  228. package/dist/types/src/templates/index.d.ts +5 -5
  229. package/dist/types/src/templates/index.d.ts.map +1 -1
  230. package/dist/types/src/templates/ping.d.ts +1 -1
  231. package/dist/types/src/templates/ping.d.ts.map +1 -1
  232. package/dist/types/src/testing/test-script.d.ts +1 -1
  233. package/dist/types/src/testing/test-script.d.ts.map +1 -1
  234. package/dist/types/src/types/Notebook.d.ts +8 -8
  235. package/dist/types/src/types/Notebook.d.ts.map +1 -1
  236. package/dist/types/src/types/ScriptCapabilities.d.ts +4 -4
  237. package/dist/types/src/types/ScriptCapabilities.d.ts.map +1 -1
  238. package/dist/types/src/types/ScriptEvents.d.ts +7 -1
  239. package/dist/types/src/types/ScriptEvents.d.ts.map +1 -1
  240. package/dist/types/src/types/ScriptOperation.d.ts +7 -7
  241. package/dist/types/src/types/ScriptOperation.d.ts.map +1 -1
  242. package/dist/types/src/types/Settings.d.ts +3 -3
  243. package/dist/types/src/types/Settings.d.ts.map +1 -1
  244. package/dist/types/src/types/index.d.ts +1 -1
  245. package/dist/types/src/types/index.d.ts.map +1 -1
  246. package/dist/types/src/util/deploy.d.ts +5 -4
  247. package/dist/types/src/util/deploy.d.ts.map +1 -1
  248. package/dist/types/src/util/functions.d.ts +2 -1
  249. package/dist/types/src/util/functions.d.ts.map +1 -1
  250. package/dist/types/tsconfig.tsbuildinfo +1 -1
  251. package/dx.config.ts +1 -1
  252. package/package.json +138 -108
  253. package/src/ScriptPlugin.ts +15 -0
  254. package/src/capabilities/ScriptSurfaces.tsx +12 -13
  255. package/src/capabilities/app-graph-builder.ts +8 -7
  256. package/src/capabilities/compiler.ts +8 -8
  257. package/src/capabilities/create-object.ts +40 -32
  258. package/src/capabilities/gen/node.ts +51 -0
  259. package/src/capabilities/gen/workerd.ts +41 -0
  260. package/src/capabilities/index.ts +46 -11
  261. package/src/capabilities/operation-handler.ts +6 -5
  262. package/src/capabilities/react-surface.ts +4 -3
  263. package/src/capabilities/schema.ts +11 -0
  264. package/src/capabilities/settings.ts +4 -4
  265. package/src/capabilities/skill-definition.ts +3 -3
  266. package/src/compiler/compiler.ts +1 -1
  267. package/src/components/NotebookStack/NotebookCell.tsx +1 -1
  268. package/src/components/NotebookStack/NotebookMenu.tsx +1 -1
  269. package/src/components/NotebookStack/NotebookStack.stories.tsx +1 -1
  270. package/src/components/NotebookStack/NotebookStack.tsx +1 -1
  271. package/src/components/QueryEditor/QueryEditor.tsx +1 -1
  272. package/src/components/ScriptToolbar/ScriptToolbar.stories.tsx +4 -3
  273. package/src/components/ScriptToolbar/ScriptToolbar.tsx +5 -3
  274. package/src/containers/DeploymentDialog/DeploymentDialog.stories.tsx +1 -1
  275. package/src/containers/DeploymentDialog/DeploymentDialog.tsx +4 -4
  276. package/src/containers/NotebookArticle/NotebookArticle.stories.tsx +9 -9
  277. package/src/containers/NotebookArticle/NotebookArticle.tsx +6 -5
  278. package/src/containers/ScriptArticle/ScriptArticle.stories.tsx +7 -6
  279. package/src/containers/ScriptArticle/ScriptArticle.tsx +2 -2
  280. package/src/containers/ScriptProperties/FunctionBinding.tsx +5 -5
  281. package/src/containers/ScriptProperties/FunctionPublishing.tsx +16 -14
  282. package/src/containers/ScriptProperties/ScriptProperties.stories.tsx +7 -6
  283. package/src/containers/ScriptProperties/ScriptProperties.tsx +1 -1
  284. package/src/containers/ScriptProperties/SkillEditor.tsx +7 -6
  285. package/src/containers/TestContainer/TestContainer.tsx +1 -1
  286. package/src/e2e/ai.test.ts +1 -1
  287. package/src/e2e/deploy.test.ts +2 -2
  288. package/src/hooks/deploy.ts +12 -12
  289. package/src/hooks/format.ts +1 -1
  290. package/src/hooks/template.ts +1 -1
  291. package/src/hooks/useCompiler.ts +1 -2
  292. package/src/hooks/useCreateAndDeployScriptTemplates.ts +11 -12
  293. package/src/hooks/useToolbarState.ts +2 -2
  294. package/src/index.ts +3 -3
  295. package/src/meta.ts +1 -1
  296. package/src/notebook/compute-graph.test.ts +1 -1
  297. package/src/notebook/compute-graph.ts +4 -3
  298. package/src/notebook/vfs-parser.ts +1 -1
  299. package/src/operations/ScriptOperationHandlerSet.ts +12 -0
  300. package/src/operations/create-script.ts +4 -2
  301. package/src/operations/index.ts +1 -3
  302. package/src/{ScriptPlugin.test.ts → plugin.test.ts} +6 -10
  303. package/src/plugin.tsx +35 -0
  304. package/src/skills/{script-skill.ts → ScriptSkill.ts} +5 -9
  305. package/src/skills/functions/create.ts +3 -2
  306. package/src/skills/functions/definitions.ts +44 -44
  307. package/src/skills/functions/delete.ts +1 -1
  308. package/src/skills/functions/deploy.ts +2 -1
  309. package/src/skills/functions/index.ts +25 -12
  310. package/src/skills/functions/inspect-invocations.ts +1 -1
  311. package/src/skills/functions/install-function.ts +1 -1
  312. package/src/skills/functions/invoke.ts +1 -1
  313. package/src/skills/functions/query-deployed-functions.ts +1 -1
  314. package/src/skills/functions/read.ts +2 -1
  315. package/src/skills/functions/update.ts +2 -1
  316. package/src/skills/index.ts +1 -1
  317. package/src/templates/anthropic.ts +4 -5
  318. package/src/templates/chess-bot.ts +9 -8
  319. package/src/templates/commentary.ts +15 -13
  320. package/src/templates/forex-effect.ts +8 -8
  321. package/src/templates/forex.ts +4 -4
  322. package/src/templates/gmail.ts +25 -15
  323. package/src/templates/index.ts +5 -5
  324. package/src/templates/ping.ts +2 -2
  325. package/src/testing/test-notebook.ts +2 -2
  326. package/src/testing/test-script.ts +2 -1
  327. package/src/translations.ts +1 -1
  328. package/src/types/Notebook.ts +2 -2
  329. package/src/types/ScriptCapabilities.ts +4 -4
  330. package/src/types/ScriptEvents.ts +8 -1
  331. package/src/types/ScriptOperation.ts +13 -12
  332. package/src/types/Settings.ts +6 -7
  333. package/src/types/index.ts +2 -3
  334. package/src/util/deploy.ts +13 -13
  335. package/src/util/functions.ts +2 -1
  336. package/dist/lib/ScriptPlugin.node.mjs +0 -11
  337. package/dist/lib/ScriptPlugin.node.mjs.map +0 -1
  338. package/dist/lib/ScriptPlugin.workerd.mjs +0 -11
  339. package/dist/lib/ScriptPlugin.workerd.mjs.map +0 -1
  340. package/dist/lib/capabilities/node.mjs +0 -11
  341. package/dist/lib/capabilities/node.mjs.map +0 -1
  342. package/dist/lib/chunk-meta.mjs +0 -33
  343. package/dist/lib/chunk-meta.mjs.map +0 -1
  344. package/dist/lib/chunk-skills.mjs.map +0 -1
  345. package/dist/lib/chunk-types.mjs +0 -90
  346. package/dist/lib/chunk-types.mjs.map +0 -1
  347. package/dist/lib/operations.mjs.map +0 -1
  348. package/dist/types/src/ScriptPlugin.node.d.ts +0 -4
  349. package/dist/types/src/ScriptPlugin.node.d.ts.map +0 -1
  350. package/dist/types/src/ScriptPlugin.test.d.ts +0 -2
  351. package/dist/types/src/ScriptPlugin.test.d.ts.map +0 -1
  352. package/dist/types/src/ScriptPlugin.workerd.d.ts +0 -4
  353. package/dist/types/src/ScriptPlugin.workerd.d.ts.map +0 -1
  354. package/dist/types/src/capabilities/node.d.ts +0 -8
  355. package/dist/types/src/capabilities/node.d.ts.map +0 -1
  356. package/dist/types/src/skills/script-skill.d.ts +0 -4
  357. package/dist/types/src/skills/script-skill.d.ts.map +0 -1
  358. package/dist/types/src/types/types.d.ts +0 -2
  359. package/dist/types/src/types/types.d.ts.map +0 -1
  360. package/src/ScriptPlugin.node.ts +0 -21
  361. package/src/ScriptPlugin.tsx +0 -47
  362. package/src/ScriptPlugin.workerd.ts +0 -18
  363. package/src/capabilities/node.ts +0 -15
  364. package/src/plugin.ts +0 -11
  365. package/src/types/types.ts +0 -5
@@ -1,20 +1,22 @@
1
- import { Instructions, Operation, Skill } from "@dxos/compute";
1
+ import { meta } from "#meta";
2
+ import * as Skill from "@dxos/compute/Skill";
2
3
  import { isNonNullable, trim } from "@dxos/util";
4
+ import * as Operation from "@dxos/compute/Operation";
3
5
  import { Filter, Obj, Query, Ref } from "@dxos/echo";
4
- import { Graph } from "@dxos/plugin-explorer";
5
- import { Text, ViewModel } from "@dxos/schema";
6
- import { meta } from "#meta";
7
6
  import { log } from "@dxos/log";
8
7
  import { useCallback, useContext, useMemo, useState } from "react";
9
8
  import { DropdownMenu, IconButton, Panel, Toolbar, useTranslation } from "@dxos/react-ui";
10
9
  import { jsx, jsxs } from "react/jsx-runtime";
11
10
  import { useSpaceCallback } from "@dxos/app-framework/ui";
12
11
  import { invariant } from "@dxos/invariant";
13
- import ts from "typescript";
12
+ import ts from "@typescript/typescript6";
14
13
  import { createSystem, createVirtualTypeScriptEnvironment } from "@typescript/vfs";
15
- import { Atom } from "@effect-atom/atom";
14
+ import * as Atom from "effect/unstable/reactivity/Atom";
15
+ import * as Instructions from "@dxos/compute/Instructions";
16
+ import { Text, ViewModel } from "@dxos/schema";
17
+ import * as Graph from "@dxos/plugin-explorer/Graph";
16
18
  import * as Effect from "effect/Effect";
17
- import { RegistryContext } from "@effect-atom/atom-react";
19
+ import { RegistryContext } from "@effect/atom-react/RegistryContext";
18
20
  import * as Cause from "effect/Cause";
19
21
  import * as Exit from "effect/Exit";
20
22
  import { RunInstructions } from "@dxos/assistant-toolkit";
@@ -330,7 +332,8 @@ var VirtualTypeScriptParser = class {
330
332
  allFiles.forEach(({ filename, content }) => {
331
333
  fileMap.set(filename, content);
332
334
  });
333
- return createVirtualTypeScriptEnvironment(createSystem(fileMap), allFiles.map(({ filename }) => filename), ts, this.compilerOptions);
335
+ const system = createSystem(fileMap);
336
+ return createVirtualTypeScriptEnvironment(system, allFiles.map(({ filename }) => filename), ts, this.compilerOptions);
334
337
  }
335
338
  };
336
339
  //#endregion
@@ -412,7 +415,7 @@ var ComputeGraph = class {
412
415
  log.error("no expression for cell", { cellId }, {
413
416
  "~LogMeta": "~LogMeta",
414
417
  F: __dxlog_file$1,
415
- L: 105,
418
+ L: 106,
416
419
  S: this
417
420
  });
418
421
  continue;
@@ -422,7 +425,7 @@ var ComputeGraph = class {
422
425
  log.error("no source for cell", { cellId }, {
423
426
  "~LogMeta": "~LogMeta",
424
427
  F: __dxlog_file$1,
425
- L: 111,
428
+ L: 112,
426
429
  S: this
427
430
  });
428
431
  continue;
@@ -448,7 +451,7 @@ var ComputeGraph = class {
448
451
  }, {
449
452
  "~LogMeta": "~LogMeta",
450
453
  F: __dxlog_file$1,
451
- L: 147,
454
+ L: 148,
452
455
  S: this
453
456
  });
454
457
  }
@@ -525,7 +528,7 @@ var NotebookArticle = ({ role, subject: notebook, attendableId, env }) => {
525
528
  invariant(db, void 0, {
526
529
  "~LogMeta": "~LogMeta",
527
530
  F: __dxlog_file,
528
- L: 51,
531
+ L: 52,
529
532
  S: void 0,
530
533
  A: ["db", ""]
531
534
  });
@@ -575,7 +578,7 @@ var NotebookArticle = ({ role, subject: notebook, attendableId, env }) => {
575
578
  invariant(graph, void 0, {
576
579
  "~LogMeta": "~LogMeta",
577
580
  F: __dxlog_file,
578
- L: 96,
581
+ L: 97,
579
582
  S: this,
580
583
  A: ["graph", ""]
581
584
  });
@@ -609,7 +612,7 @@ var NotebookArticle = ({ role, subject: notebook, attendableId, env }) => {
609
612
  invariant(notebook, void 0, {
610
613
  "~LogMeta": "~LogMeta",
611
614
  F: __dxlog_file,
612
- L: 129,
615
+ L: 130,
613
616
  S: void 0,
614
617
  A: ["notebook", ""]
615
618
  });
@@ -623,18 +626,16 @@ var NotebookArticle = ({ role, subject: notebook, attendableId, env }) => {
623
626
  case "query":
624
627
  cell.source = Ref.make(Text.make());
625
628
  break;
626
- case "prompt":
627
- if (db) {
628
- const skills = (await db.query(Query.select(Filter.type(Skill.Skill))).run()).filter((skill) => {
629
- const key = Obj.getMeta(skill).key;
630
- return key !== void 0 && INCLUDE_SKILLS.includes(key);
631
- }).map((skill) => Ref.make(skill));
632
- cell.prompt = Ref.make(Instructions.make({
633
- text: "",
634
- skills
635
- }));
636
- }
637
- break;
629
+ case "prompt": if (db) {
630
+ const skills = (await db.query(Query.select(Filter.type(Skill.Skill))).run()).filter((skill) => {
631
+ const key = Obj.getMeta(skill).key;
632
+ return key !== void 0 && INCLUDE_SKILLS.includes(key);
633
+ }).map((skill) => Ref.make(skill));
634
+ cell.prompt = Ref.make(Instructions.make({
635
+ text: "",
636
+ skills
637
+ }));
638
+ }
638
639
  }
639
640
  const idx = after ? notebook.cells.findIndex((cell) => cell.id === after) : notebook.cells.length;
640
641
  Obj.update(notebook, (notebook) => {
@@ -645,7 +646,7 @@ var NotebookArticle = ({ role, subject: notebook, attendableId, env }) => {
645
646
  invariant(notebook, void 0, {
646
647
  "~LogMeta": "~LogMeta",
647
648
  F: __dxlog_file,
648
- L: 164,
649
+ L: 165,
649
650
  S: void 0,
650
651
  A: ["notebook", ""]
651
652
  });
@@ -702,7 +703,7 @@ var runPrompt = Effect.fn(function* ({ instructions, input, onResult }) {
702
703
  log.error(error.message, error.cause ?? error.stack, {
703
704
  "~LogMeta": "~LogMeta",
704
705
  F: __dxlog_file,
705
- L: 226,
706
+ L: 227,
706
707
  S: this
707
708
  });
708
709
  onResult(error.message);
@@ -1 +1 @@
1
- {"version":3,"file":"chunk-NotebookArticle.mjs","names":[],"sources":["../../src/notebook/eval.ts","../../src/notebook/vfs-parser.ts","../../src/notebook/compute-graph.ts","../../src/containers/NotebookArticle/NotebookArticle.tsx"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport { trim } from '@dxos/util';\n\n/**\n * Evaluate the script (with dependencies as arguments).\n */\nexport const evalScript = async (code: string, deps: Record<string, any> = {}) => {\n // Create a sandboxed environment that blocks access to window and document.\n const sandbox = {\n ...deps,\n\n // Block access to global objects.\n console: undefined,\n document: undefined,\n global: undefined,\n globalThis: undefined,\n self: undefined,\n window: undefined,\n\n // Allow some safe globals.\n Array,\n Boolean,\n Date,\n Error,\n JSON,\n Map,\n Math,\n Number,\n Object,\n Promise,\n RegExp,\n Set,\n String,\n\n // Functions.\n isFinite,\n isNaN,\n parseFloat,\n parseInt,\n\n // Note: undefined and null are not included as they are keywords, not variables.\n };\n\n // Create function with all sandbox keys as parameters.\n const sandboxKeys = Object.keys(sandbox);\n const sandboxValues = Object.values(sandbox);\n\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n const fn = new Function(\n ...sandboxKeys,\n trim`\n 'use strict';\n return ${code};\n `,\n );\n\n return fn(...sandboxValues);\n};\n\n/**\n * Globals.\n */\nexport const builtIns = new Set([\n // Types.\n 'Array',\n 'Date',\n 'Error',\n 'JSON',\n 'Map',\n 'Math',\n 'Number',\n 'Object',\n 'Promise',\n 'RegExp',\n 'Set',\n 'String',\n\n // Functions.\n 'isFinite',\n 'isNaN',\n 'parseFloat',\n 'parseInt',\n]);\n\n/**\n * Default system definitions.\n */\nexport const systemDefinitions = trim`\n interface Array<T> { length: number; [n: number]: T; }\n interface Boolean {}\n interface Function {}\n interface IArguments {}\n interface Number {}\n interface Object {}\n interface RegExp {}\n interface String { length: number; }\n\n interface CallableFunction extends Function {}\n interface NewableFunction extends Function {}\n\n declare var console: { log(...args: any[]): void };\n`;\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport { createSystem, createVirtualTypeScriptEnvironment } from '@typescript/vfs';\nimport ts from 'typescript';\n\nimport { invariant } from '@dxos/invariant';\n\nimport { builtIns, systemDefinitions } from './eval';\n\n/**\n * Default system definitions.\n */\nconst systemFiles: VirtualFile[] = [\n {\n filename: '/lib.d.ts',\n content: systemDefinitions,\n },\n];\n\nexport type ParsedExpression = {\n name?: string;\n type?: 'function' | 'variable' | 'class' | 'interface';\n value?: any;\n valueType?: string;\n parameters?: Array<{ name: string; type: string }>;\n returnType?: string;\n references?: string[];\n};\n\nexport type VirtualFile = {\n filename: string;\n content: string;\n};\n\n/**\n * TypeScript parser using Virtual File System for browser compatibility.\n * This provides full TypeScript analysis including type information.\n */\nexport class VirtualTypeScriptParser {\n protected compilerOptions: ts.CompilerOptions = {\n target: ts.ScriptTarget.ES2020,\n module: ts.ModuleKind.ESNext,\n moduleResolution: ts.ModuleResolutionKind.Bundler,\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n forceConsistentCasingInfilenames: true,\n jsx: ts.JsxEmit.React,\n noLib: true, // Don't automatically include default lib files.\n };\n\n /**\n * Parse a single expression or statement.\n */\n parseExpression(input: string): ParsedExpression {\n invariant(input.trim() !== '', 'input must not be empty');\n const files: VirtualFile[] = [{ filename: '/temp.ts', content: input }];\n const analysis = this.analyzeFiles(files);\n\n // If no declarations found, check for standalone expression references.\n if (analysis.length === 0) {\n const sourcefilename = '/temp.ts';\n const env = this.createEnvironment([{ filename: sourcefilename, content: input }]);\n const sourceFile = env.getSourceFile(sourcefilename);\n const typeChecker = env.languageService.getProgram()?.getTypeChecker();\n\n if (sourceFile && typeChecker) {\n // Check for assignment expressions.\n const assignmentInfo = this.findAssignmentExpression(sourceFile, typeChecker);\n if (assignmentInfo) {\n return assignmentInfo;\n }\n\n const references = this.findAllReferences(sourceFile, typeChecker);\n return { references };\n }\n }\n\n return analysis[0];\n }\n\n /**\n * Analyze multiple files with full type information.\n */\n analyzeFiles(files: VirtualFile[]): ParsedExpression[] {\n const env = this.createEnvironment(files);\n const results: ParsedExpression[] = [];\n const typeChecker = env.languageService.getProgram()?.getTypeChecker();\n\n // Analyze each file.\n files.forEach((file) => {\n const sourceFile = env.getSourceFile(file.filename);\n if (!sourceFile || !typeChecker) {\n return;\n }\n\n const fileResults = this.analyzeSourceFile(sourceFile, typeChecker);\n results.push(...fileResults);\n });\n\n return results;\n }\n\n /**\n * Analyze a source file with type information.\n */\n protected analyzeSourceFile(sourceFile: ts.SourceFile, typeChecker: ts.TypeChecker): ParsedExpression[] {\n const results: ParsedExpression[] = [];\n\n const visit = (node: ts.Node) => {\n // Function declarations.\n if (ts.isFunctionDeclaration(node) && node.name) {\n const symbol = typeChecker.getSymbolAtLocation(node.name);\n const type = symbol && typeChecker.getTypeOfSymbolAtLocation(symbol, node);\n const signature = type && typeChecker.getSignaturesOfType(type, ts.SignatureKind.Call)[0];\n\n results.push({\n name: node.name.text,\n type: 'function',\n parameters: this.extractParameters(signature, typeChecker),\n returnType: signature ? typeChecker.typeToString(signature.getReturnType()) : 'any',\n references: this.findReferences(node, sourceFile, typeChecker),\n });\n }\n\n // Variable declarations.\n else if (ts.isVariableStatement(node)) {\n node.declarationList.declarations.forEach((declaration) => {\n if (ts.isIdentifier(declaration.name)) {\n const symbol = typeChecker.getSymbolAtLocation(declaration.name);\n const type = symbol && typeChecker.getTypeOfSymbolAtLocation(symbol, declaration);\n\n let kind: 'function' | 'variable' = 'variable';\n let parameters: Array<{ name: string; type: string }> | undefined;\n let returnType: string | undefined;\n let value: any;\n\n // Get the type string.\n const typeString = type ? typeChecker.typeToString(type) : 'any';\n\n // Check if it's a function.\n if (declaration.initializer) {\n if (ts.isArrowFunction(declaration.initializer) || ts.isFunctionExpression(declaration.initializer)) {\n kind = 'function';\n const funcType = typeChecker.getTypeAtLocation(declaration.initializer);\n const signature = typeChecker.getSignaturesOfType(funcType, ts.SignatureKind.Call)[0];\n if (signature) {\n parameters = this.extractParameters(signature, typeChecker);\n returnType = typeChecker.typeToString(signature.getReturnType());\n }\n } else {\n // Extract literal values\n if (ts.isNumericLiteral(declaration.initializer)) {\n value = Number(declaration.initializer.text);\n } else if (ts.isStringLiteral(declaration.initializer)) {\n value = declaration.initializer.text;\n }\n }\n }\n\n // Find references in the initializer only.\n const refs = declaration.initializer\n ? this.findReferences(declaration.initializer, sourceFile, typeChecker)\n : [];\n\n results.push({\n name: declaration.name.text,\n type: kind,\n valueType: typeString,\n value,\n parameters,\n returnType,\n references: refs,\n });\n }\n });\n }\n\n // Class declarations.\n else if (ts.isClassDeclaration(node) && node.name) {\n results.push({\n name: node.name.text,\n type: 'class',\n references: this.findReferences(node, sourceFile, typeChecker),\n });\n }\n\n // Interface declarations.\n else if (ts.isInterfaceDeclaration(node)) {\n results.push({\n name: node.name.text,\n type: 'interface',\n references: this.findReferences(node, sourceFile, typeChecker),\n });\n }\n\n ts.forEachChild(node, visit);\n };\n\n visit(sourceFile);\n return results;\n }\n\n /**\n * Extract parameter information from a signature.\n */\n private extractParameters(\n signature: ts.Signature | undefined,\n typeChecker: ts.TypeChecker,\n ): Array<{ name: string; type: string }> {\n if (!signature) {\n return [];\n }\n\n return signature.parameters.map((param) => ({\n name: param.getName(),\n type: typeChecker.typeToString(typeChecker.getTypeOfSymbolAtLocation(param, param.valueDeclaration!)),\n }));\n }\n\n /**\n * Find all references to variables used in a node.\n */\n private findReferences(node: ts.Node, _sourceFile: ts.SourceFile, _typeChecker: ts.TypeChecker): string[] {\n const references = new Set<string>();\n const localSymbols = new Set<string>();\n\n // First, collect local symbols (parameters, local variables).\n const collectLocalSymbols = (node: ts.Node) => {\n if (ts.isFunctionDeclaration(node) || ts.isArrowFunction(node) || ts.isFunctionExpression(node)) {\n node.parameters.forEach((param) => {\n if (ts.isIdentifier(param.name)) {\n localSymbols.add(param.name.text);\n }\n });\n }\n\n if (ts.isVariableDeclaration(node) && ts.isIdentifier(node.name)) {\n localSymbols.add(node.name.text);\n }\n\n ts.forEachChild(node, collectLocalSymbols);\n };\n\n collectLocalSymbols(node);\n\n // Then find all identifier references.\n const findRefs = (node: ts.Node) => {\n if (ts.isIdentifier(node)) {\n // Skip if it's a local symbol.\n if (!localSymbols.has(node.text)) {\n // Check if it's a reference (not a declaration).\n const parent = node.parent;\n const isDeclaration =\n (ts.isVariableDeclaration(parent) && parent.name === node) ||\n (ts.isFunctionDeclaration(parent) && parent.name === node) ||\n (ts.isParameter(parent) && parent.name === node);\n\n if (!isDeclaration && !this.isBuiltIn(node.text)) {\n references.add(node.text);\n }\n }\n }\n ts.forEachChild(node, findRefs);\n };\n\n findRefs(node);\n return Array.from(references);\n }\n\n /**\n * Check if a name is a built-in global.\n */\n protected isBuiltIn(name: string): boolean {\n return builtIns.has(name);\n }\n\n /**\n * Find assignment expressions in a source file.\n */\n private findAssignmentExpression(sourceFile: ts.SourceFile, typeChecker: ts.TypeChecker): ParsedExpression | null {\n let result: ParsedExpression | null = null;\n\n const visit = (node: ts.Node) => {\n if (ts.isExpressionStatement(node) && ts.isBinaryExpression(node.expression)) {\n const expr = node.expression;\n if (expr.operatorToken.kind === ts.SyntaxKind.EqualsToken && ts.isIdentifier(expr.left)) {\n const type = typeChecker.getTypeAtLocation(expr.right);\n const typeString = typeChecker.typeToString(type);\n\n // Get the literal value if it's a literal.\n let value: any;\n if (ts.isNumericLiteral(expr.right)) {\n value = Number(expr.right.text);\n } else if (ts.isStringLiteral(expr.right)) {\n value = expr.right.text;\n }\n\n // Find references in the right-hand side.\n const references = this.findReferences(expr.right, sourceFile, typeChecker);\n\n result = {\n name: expr.left.text,\n type: 'variable',\n valueType: typeString,\n value,\n references,\n };\n }\n }\n if (!result) {\n ts.forEachChild(node, visit);\n }\n };\n\n visit(sourceFile);\n return result;\n }\n\n /**\n * Find all identifier references in a source file.\n */\n protected findAllReferences(sourceFile: ts.SourceFile, _typeChecker: ts.TypeChecker): string[] {\n const references = new Set<string>();\n\n const visit = (node: ts.Node) => {\n if (ts.isIdentifier(node)) {\n // Skip if it's a declaration.\n const parent = node.parent;\n const isDeclaration =\n (ts.isVariableDeclaration(parent) && parent.name === node) ||\n (ts.isFunctionDeclaration(parent) && parent.name === node) ||\n (ts.isParameter(parent) && parent.name === node);\n\n // Skip if it's the left-hand side of an assignment.\n const isAssignmentTarget =\n ts.isBinaryExpression(parent) &&\n parent.operatorToken.kind === ts.SyntaxKind.EqualsToken &&\n parent.left === node;\n\n if (!isDeclaration && !isAssignmentTarget && !this.isBuiltIn(node.text)) {\n references.add(node.text);\n }\n }\n ts.forEachChild(node, visit);\n };\n\n visit(sourceFile);\n return Array.from(references);\n }\n\n protected createEnvironment(files: VirtualFile[]) {\n const allFiles = [...systemFiles, ...files];\n\n const fileMap = new Map<string, string>();\n allFiles.forEach(({ filename, content }) => {\n fileMap.set(filename, content);\n });\n\n const system = createSystem(fileMap);\n return createVirtualTypeScriptEnvironment(\n system,\n allFiles.map(({ filename }) => filename),\n ts,\n this.compilerOptions,\n );\n }\n}\n\n/**\n * Notebook-specific parser with dependency analysis.\n */\nexport class NotebookVirtualParser extends VirtualTypeScriptParser {\n /**\n * Analyze notebook cells with full type checking.\n */\n analyzeNotebook(cells: Array<{ id: string; code: string }>) {\n // Create cumulative environment where each cell can see previous cells.\n const cumulativeCode: string[] = [];\n const cellAnalysis: Map<\n string,\n {\n exports: ParsedExpression[];\n imports: string[];\n errors: ts.Diagnostic[];\n }\n > = new Map();\n\n cells.forEach((cell) => {\n // Create files for all cells up to current.\n const files: VirtualFile[] = [];\n\n // Add previous cells as context.\n if (cumulativeCode.length > 0) {\n files.push({\n filename: '/context.ts',\n content: cumulativeCode.join('\\n'),\n });\n }\n\n // Add current cell.\n const filename = `/cell/${cell.id}.ts`;\n files.push({\n filename,\n content: cell.code,\n });\n\n // Create environment.\n const env = this.createEnvironment(files);\n\n // Get diagnostics (errors).\n const diagnostics = env.languageService.getSemanticDiagnostics(filename);\n\n // Analyze current cell.\n const sourceFile = env.getSourceFile(filename);\n const typeChecker = env.languageService.getProgram()?.getTypeChecker();\n\n if (sourceFile && typeChecker) {\n const exports = this.analyzeSourceFile(sourceFile, typeChecker);\n\n // Find all references in the current cell.\n const allRefs = new Set<string>();\n exports.forEach((exp) => {\n exp.references?.forEach((ref) => allRefs.add(ref));\n });\n\n // Also check for references not in exports (e.g., console.log(y)).\n const additionalRefs = this.findAllReferences(sourceFile, typeChecker);\n additionalRefs.forEach((ref) => allRefs.add(ref));\n\n // Determine which references are imports from previous cells.\n const previousExports = new Set<string>();\n for (const [_prevCellId, prevAnalysis] of cellAnalysis) {\n prevAnalysis.exports.forEach((exp) => {\n if (exp.name) {\n previousExports.add(exp.name);\n }\n });\n }\n\n const imports = Array.from(allRefs).filter((ref) => previousExports.has(ref));\n\n cellAnalysis.set(cell.id, {\n exports,\n imports,\n errors: diagnostics,\n });\n }\n\n // Add current cell code to cumulative.\n cumulativeCode.push(cell.code);\n });\n\n return cellAnalysis;\n }\n}\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport { Atom, type Registry } from '@effect-atom/atom';\n\nimport { log } from '@dxos/log';\n\nimport { type Notebook } from '#types';\n\nimport { evalScript } from './eval';\nimport { type ParsedExpression, VirtualTypeScriptParser } from './vfs-parser';\n\n/**\n * Compute graph that evaluates the notebook cells.\n */\n// TODO(burdon): Reconcile with @dxos/conductor.\nexport class ComputeGraph {\n private readonly _parser = new VirtualTypeScriptParser();\n\n private _expressionsAtom = Atom.make<Record<string, ParsedExpression>>({});\n private _valuesByCellIdAtom = Atom.make<Record<string, any>>({});\n private _valuesByNameAtom = Atom.make<Record<string, any>>({});\n\n constructor(\n private readonly _notebook: Notebook.Notebook,\n private readonly _registry: Registry.Registry,\n ) {}\n\n /**\n * Atom for parsed expressions by cell ID.\n */\n get expressions(): Atom.Atom<Record<string, ParsedExpression>> {\n return this._expressionsAtom;\n }\n\n /**\n * Get current expressions by cell ID.\n */\n getExpressions(): Record<string, ParsedExpression> {\n return this._registry.get(this._expressionsAtom);\n }\n\n /**\n * Atom for computed values by cell ID.\n */\n get values(): Atom.Atom<Record<string, any>> {\n return this._valuesByCellIdAtom;\n }\n\n /**\n * Get computed values by cell ID.\n */\n getValues(): Record<string, any> {\n return this._registry.get(this._valuesByCellIdAtom);\n }\n\n /**\n * Atom for computed values by name.\n */\n get valuesByName(): Atom.Atom<Record<string, any>> {\n return this._valuesByNameAtom;\n }\n\n /**\n * Get current values by name.\n */\n getValuesByName(): Record<string, any> {\n return this._registry.get(this._valuesByNameAtom);\n }\n\n /**\n * Get computed value by cell ID.\n */\n getValue(cellId: string): any {\n return this._registry.get(this._valuesByCellIdAtom)[cellId];\n }\n\n /**\n * Compute values.\n */\n async evaluate() {\n // Parse expressions.\n const { expressions, dependencyGraph } = this.parse();\n this._registry.set(this._valuesByCellIdAtom, {});\n this._registry.set(this._valuesByNameAtom, {});\n\n // Create a map of cell IDs to expressions for easy lookup.\n const cellExpressions = new Map<string, ParsedExpression>();\n Object.entries(expressions).forEach(([id, expr]) => {\n cellExpressions.set(id, expr);\n });\n\n // Topological sort to determine evaluation order.\n const evaluationOrder = this.topologicalSort(Object.keys(expressions), dependencyGraph);\n\n // Values by reference name.\n const valuesByName: Record<string, any> = {};\n const valuesByCellId: Record<string, any> = {};\n\n // Evaluate cells in dependency order.\n for (const cellId of evaluationOrder) {\n const expr = cellExpressions.get(cellId);\n if (!expr) {\n log.error('no expression for cell', { cellId });\n continue;\n }\n\n const cellSource = this._notebook.cells.find((cell) => cell.id === cellId)?.source?.target?.content;\n if (!cellSource) {\n log.error('no source for cell', { cellId });\n continue;\n }\n\n try {\n // For assignments or declarations, evaluate and store the value.\n if (expr.name && expr.value !== undefined) {\n // If the parser extracted a literal value, use it directly.\n valuesByName[expr.name] = expr.value;\n valuesByCellId[cellId] = expr.value;\n } else if (expr.name) {\n // For non-literal assignments, we need to evaluate the expression.\n // The parser identifies it's an assignment, so we can extract the RHS.\n const equalIndex = cellSource.indexOf('=');\n if (equalIndex !== -1) {\n // Find the actual assignment operator (not in strings or other contexts).\n let rhs = cellSource.substring(equalIndex + 1).trim();\n\n // Handle semicolon at the end.\n if (rhs.endsWith(';')) {\n rhs = rhs.slice(0, -1).trim();\n }\n\n const result = await this.eval(rhs, valuesByName);\n valuesByName[expr.name] = result;\n if (typeof result !== 'function') {\n valuesByCellId[cellId] = result;\n }\n }\n } else {\n // For expressions without assignment, just evaluate.\n const result = await this.eval(cellSource, valuesByName);\n valuesByCellId[cellId] = result;\n }\n } catch (error) {\n // TODO(burdon): Set error state.\n log.error('error evaluating cell', { cellId, error });\n }\n }\n\n this._registry.set(this._valuesByCellIdAtom, valuesByCellId);\n this._registry.set(this._valuesByNameAtom, valuesByName);\n return valuesByCellId;\n }\n\n private async eval(source: string, values: Record<string, any>) {\n return evalScript(source, values);\n }\n\n /**\n * Parse expressions.\n */\n parse() {\n const expressions = this._notebook.cells\n .filter((cell) => cell.type === 'script')\n .reduce<Record<string, ParsedExpression>>((acc, cell) => {\n const text = cell.source?.target?.content.trim();\n if (text) {\n const parsed = this._parser.parseExpression(text);\n acc[cell.id] = parsed;\n }\n\n return acc;\n }, {});\n\n // Build dependency graph.\n const dependencyGraph = this.buildDependencyGraph(expressions);\n this._registry.set(this._expressionsAtom, expressions);\n return { expressions, dependencyGraph };\n }\n\n private topologicalSort(nodes: string[], dependencies: Record<string, string[]>): string[] {\n const visited = new Set<string>();\n const result: string[] = [];\n\n const visit = (node: string) => {\n if (visited.has(node)) {\n return;\n }\n\n visited.add(node);\n\n // Visit dependencies first.\n const deps = dependencies[node] || [];\n deps.forEach((dep) => visit(dep));\n result.push(node);\n };\n\n // Visit all nodes.\n nodes.forEach((node) => visit(node));\n return result;\n }\n\n private buildDependencyGraph(expressions: Record<string, ParsedExpression>): Record<string, string[]> {\n // Create a map of variable names to their cell IDs.\n const nameToCellId = new Map<string, string>();\n Object.entries(expressions).forEach(([id, expr]) => {\n if (expr.name) {\n nameToCellId.set(expr.name, id);\n }\n });\n\n // Build the dependency graph using cell IDs.\n const graph: Record<string, string[]> = {};\n Object.entries(expressions).forEach(([id, expr]) => {\n if (expr.references && expr.references.length > 0) {\n // Map variable references to cell IDs.\n const dependencyCellIds = expr.references\n .map((ref) => nameToCellId.get(ref))\n .filter((cellId): cellId is string => cellId !== undefined && cellId !== id);\n\n if (dependencyCellIds.length > 0) {\n graph[id] = dependencyCellIds;\n }\n }\n });\n\n return graph;\n }\n}\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport { RegistryContext } from '@effect-atom/atom-react';\nimport * as Cause from 'effect/Cause';\nimport * as Effect from 'effect/Effect';\nimport * as Exit from 'effect/Exit';\nimport type * as Types from 'effect/Types';\nimport React, { useCallback, useContext, useMemo, useState } from 'react';\n\nimport { useSpaceCallback } from '@dxos/app-framework/ui';\nimport { type AppSurface } from '@dxos/app-toolkit/ui';\nimport { RunInstructions } from '@dxos/assistant-toolkit';\nimport { Instructions, Skill } from '@dxos/compute';\nimport { Operation } from '@dxos/compute';\nimport { Filter, Obj, Query, Ref } from '@dxos/echo';\nimport { QueryBuilder } from '@dxos/echo-query';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { Graph } from '@dxos/plugin-explorer';\nimport { DropdownMenu, IconButton, Panel, Toolbar, useTranslation } from '@dxos/react-ui';\nimport { useAttention } from '@dxos/react-ui-attention';\nimport { Text, ViewModel } from '@dxos/schema';\nimport { isNonNullable } from '@dxos/util';\n\nimport { NotebookMenu, NotebookStack, type NotebookStackProps, type TypescriptEditorProps } from '#components';\nimport { meta } from '#meta';\nimport { type Notebook } from '#types';\n\nimport { ComputeGraph } from '../../notebook';\n\nconst INCLUDE_SKILLS = ['org.dxos.skill.assistant', 'org.dxos.skill.database', 'org.dxos.skill.markdown'];\n\n// TODO(burdon): Support calling named deployed functions (as with sheet).\n\nexport type NotebookArticleProps = AppSurface.ObjectArticleProps<Notebook.Notebook, Pick<TypescriptEditorProps, 'env'>>;\n\nexport const NotebookArticle = ({ role, subject: notebook, attendableId, env }: NotebookArticleProps) => {\n const { t } = useTranslation(meta.profile.key);\n const registry = useContext(RegistryContext);\n const db = notebook ? Obj.getDatabase(notebook) : undefined;\n const { hasAttention } = useAttention(attendableId);\n\n // TODO(burdon): Consolidate execution and state (with graph).\n // Generalize ComputeGraph evaluation function (using effects).\n const graph = useMemo(() => notebook && new ComputeGraph(notebook, registry), [notebook, registry]);\n\n const [queryValues, setQueryValues] = useState<Record<string, any>>({});\n const handleExecQueries = useCallback(async () => {\n invariant(db);\n\n const builder = new QueryBuilder();\n for (const cell of notebook?.cells ?? []) {\n if (cell.type === 'query') {\n if (cell.source?.target) {\n const source = cell.source.target.content;\n const { name, filter } = builder.build(source);\n if (filter) {\n const ast = Query.select(filter).ast;\n const graph = cell.graph?.target;\n if (!graph) {\n const { view } = await ViewModel.makeFromDatabase({ db });\n const newGraph = Graph.make({ query: { ast }, view });\n Obj.update(notebook!, (obj) => {\n const c = obj.cells.find((c) => c.id === cell.id);\n if (c) {\n c.graph = Ref.make(newGraph);\n c.name = name;\n }\n });\n } else {\n Obj.update(graph, (graph) => {\n graph.query.ast = ast as Obj.Mutable<typeof ast>;\n });\n }\n }\n }\n\n if (cell.name && cell.graph?.target) {\n const graph = Obj.getSnapshot(cell.graph?.target);\n const query = Query.fromAst(graph.query.ast);\n const objects = await db.query(query).run();\n const objectIds = objects?.map((obj) => obj.id);\n setQueryValues((prev) => ({ ...prev, [cell.name!]: objectIds }));\n }\n }\n }\n }, [db, notebook, graph]);\n\n const [promptResults, setPromptResults] = useState<Record<string, string>>({});\n const handleExecPrompts = useSpaceCallback(\n db?.spaceId,\n [] as const,\n Effect.fnUntraced(function* () {\n invariant(graph);\n\n const allInstructions =\n notebook?.cells\n .filter((cell) => cell.type === 'prompt')\n .map((cell) => cell.prompt)\n .filter(isNonNullable) ?? [];\n\n for (const instructions of allInstructions) {\n yield* runPrompt({\n instructions,\n input: { ...queryValues, ...graph.getValuesByName() },\n onResult: (result) =>\n setPromptResults((prev) => ({\n ...prev,\n [instructions.uri]: result,\n })),\n });\n }\n }),\n [notebook, graph, queryValues],\n );\n\n // TODO(burdon): Cache values in context (preserve when switched).\n const handleCompute = useCallback(async () => {\n // TODO(burdon): Generalize executors (dependencies).\n await graph?.evaluate();\n await handleExecQueries();\n await handleExecPrompts();\n }, [graph, handleExecQueries, handleExecPrompts]);\n\n const handleCellInsert = useCallback<NonNullable<NotebookStackProps['onCellInsert']>>(\n async (type, after) => {\n invariant(notebook);\n const cell: Types.Mutable<Notebook.Cell> = { id: crypto.randomUUID(), type };\n switch (type) {\n case 'markdown':\n case 'script':\n case 'query': {\n cell.source = Ref.make(Text.make());\n break;\n }\n\n case 'prompt': {\n if (db) {\n const objects = await db.query(Query.select(Filter.type(Skill.Skill))).run();\n const skills = objects\n .filter((skill) => {\n const key = Obj.getMeta(skill).key;\n return key !== undefined && INCLUDE_SKILLS.includes(key);\n })\n .map((skill) => Ref.make(skill));\n cell.prompt = Ref.make(Instructions.make({ text: '', skills }));\n }\n break;\n }\n }\n\n const idx = after ? notebook.cells.findIndex((cell) => cell.id === after) : notebook.cells.length;\n Obj.update(notebook, (notebook) => {\n notebook.cells.splice(idx, 0, cell);\n });\n },\n [db, notebook],\n );\n\n const handleCellDelete = useCallback<NonNullable<NotebookStackProps['onCellDelete']>>(\n (id) => {\n invariant(notebook);\n const idx = notebook.cells.findIndex((cell) => cell.id === id);\n if (idx !== -1) {\n Obj.update(notebook, (notebook) => {\n notebook.cells.splice(idx, 1);\n });\n }\n },\n [notebook],\n );\n\n return (\n <Panel.Root role={role} classNames='dx-document'>\n <Panel.Toolbar asChild>\n <Toolbar.Root disabled={!hasAttention}>\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <IconButton icon='ph--plus--regular' iconOnly label={t('notebook-cell-insert.label')} />\n </DropdownMenu.Trigger>\n <NotebookMenu onCellInsert={handleCellInsert} />\n </DropdownMenu.Root>\n <Toolbar.IconButton\n icon='ph--play--fill'\n iconOnly\n label={t('compute.label')}\n classNames='text-success-text'\n onClick={handleCompute}\n />\n </Toolbar.Root>\n </Panel.Toolbar>\n <Panel.Content asChild>\n <NotebookStack\n db={db}\n notebook={notebook}\n graph={graph}\n env={env}\n promptResults={promptResults}\n onCellInsert={handleCellInsert}\n onCellDelete={handleCellDelete}\n />\n </Panel.Content>\n </Panel.Root>\n );\n};\n\n// TODO(wittjosiah): Factor out. Copied from PromptArticle in plugin-assistant.\nconst runPrompt = Effect.fn(function* ({\n instructions,\n input,\n onResult,\n}: {\n instructions: Ref.Ref<Instructions.Instructions>;\n input: Record<string, any>;\n onResult: (result: string) => void;\n}) {\n const inputData: Operation.Definition.Input<typeof RunInstructions> = { instructions, input };\n // Invoke the function.\n const result = yield* Operation.invoke(RunInstructions, inputData).pipe(Effect.orDie, Effect.exit);\n\n Exit.match(result, {\n onFailure: (cause) => {\n const error = Cause.prettyErrors(cause)[0];\n log.error(error.message, error.cause ?? error.stack);\n onResult(error.message);\n },\n onSuccess: (result: any) => {\n onResult(result.note);\n },\n });\n});\n\nNotebookArticle.displayName = 'NotebookArticle';\n"],"mappings":"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"}
1
+ {"version":3,"file":"chunk-NotebookArticle.mjs","names":[],"sources":["../../src/notebook/eval.ts","../../src/notebook/vfs-parser.ts","../../src/notebook/compute-graph.ts","../../src/containers/NotebookArticle/NotebookArticle.tsx"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport { trim } from '@dxos/util';\n\n/**\n * Evaluate the script (with dependencies as arguments).\n */\nexport const evalScript = async (code: string, deps: Record<string, any> = {}) => {\n // Create a sandboxed environment that blocks access to window and document.\n const sandbox = {\n ...deps,\n\n // Block access to global objects.\n console: undefined,\n document: undefined,\n global: undefined,\n globalThis: undefined,\n self: undefined,\n window: undefined,\n\n // Allow some safe globals.\n Array,\n Boolean,\n Date,\n Error,\n JSON,\n Map,\n Math,\n Number,\n Object,\n Promise,\n RegExp,\n Set,\n String,\n\n // Functions.\n isFinite,\n isNaN,\n parseFloat,\n parseInt,\n\n // Note: undefined and null are not included as they are keywords, not variables.\n };\n\n // Create function with all sandbox keys as parameters.\n const sandboxKeys = Object.keys(sandbox);\n const sandboxValues = Object.values(sandbox);\n\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n const fn = new Function(\n ...sandboxKeys,\n trim`\n 'use strict';\n return ${code};\n `,\n );\n\n return fn(...sandboxValues);\n};\n\n/**\n * Globals.\n */\nexport const builtIns = new Set([\n // Types.\n 'Array',\n 'Date',\n 'Error',\n 'JSON',\n 'Map',\n 'Math',\n 'Number',\n 'Object',\n 'Promise',\n 'RegExp',\n 'Set',\n 'String',\n\n // Functions.\n 'isFinite',\n 'isNaN',\n 'parseFloat',\n 'parseInt',\n]);\n\n/**\n * Default system definitions.\n */\nexport const systemDefinitions = trim`\n interface Array<T> { length: number; [n: number]: T; }\n interface Boolean {}\n interface Function {}\n interface IArguments {}\n interface Number {}\n interface Object {}\n interface RegExp {}\n interface String { length: number; }\n\n interface CallableFunction extends Function {}\n interface NewableFunction extends Function {}\n\n declare var console: { log(...args: any[]): void };\n`;\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport ts from '@typescript/typescript6';\nimport { createSystem, createVirtualTypeScriptEnvironment } from '@typescript/vfs';\n\nimport { invariant } from '@dxos/invariant';\n\nimport { builtIns, systemDefinitions } from './eval';\n\n/**\n * Default system definitions.\n */\nconst systemFiles: VirtualFile[] = [\n {\n filename: '/lib.d.ts',\n content: systemDefinitions,\n },\n];\n\nexport type ParsedExpression = {\n name?: string;\n type?: 'function' | 'variable' | 'class' | 'interface';\n value?: any;\n valueType?: string;\n parameters?: Array<{ name: string; type: string }>;\n returnType?: string;\n references?: string[];\n};\n\nexport type VirtualFile = {\n filename: string;\n content: string;\n};\n\n/**\n * TypeScript parser using Virtual File System for browser compatibility.\n * This provides full TypeScript analysis including type information.\n */\nexport class VirtualTypeScriptParser {\n protected compilerOptions: ts.CompilerOptions = {\n target: ts.ScriptTarget.ES2020,\n module: ts.ModuleKind.ESNext,\n moduleResolution: ts.ModuleResolutionKind.Bundler,\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n forceConsistentCasingInfilenames: true,\n jsx: ts.JsxEmit.React,\n noLib: true, // Don't automatically include default lib files.\n };\n\n /**\n * Parse a single expression or statement.\n */\n parseExpression(input: string): ParsedExpression {\n invariant(input.trim() !== '', 'input must not be empty');\n const files: VirtualFile[] = [{ filename: '/temp.ts', content: input }];\n const analysis = this.analyzeFiles(files);\n\n // If no declarations found, check for standalone expression references.\n if (analysis.length === 0) {\n const sourcefilename = '/temp.ts';\n const env = this.createEnvironment([{ filename: sourcefilename, content: input }]);\n const sourceFile = env.getSourceFile(sourcefilename);\n const typeChecker = env.languageService.getProgram()?.getTypeChecker();\n\n if (sourceFile && typeChecker) {\n // Check for assignment expressions.\n const assignmentInfo = this.findAssignmentExpression(sourceFile, typeChecker);\n if (assignmentInfo) {\n return assignmentInfo;\n }\n\n const references = this.findAllReferences(sourceFile, typeChecker);\n return { references };\n }\n }\n\n return analysis[0];\n }\n\n /**\n * Analyze multiple files with full type information.\n */\n analyzeFiles(files: VirtualFile[]): ParsedExpression[] {\n const env = this.createEnvironment(files);\n const results: ParsedExpression[] = [];\n const typeChecker = env.languageService.getProgram()?.getTypeChecker();\n\n // Analyze each file.\n files.forEach((file) => {\n const sourceFile = env.getSourceFile(file.filename);\n if (!sourceFile || !typeChecker) {\n return;\n }\n\n const fileResults = this.analyzeSourceFile(sourceFile, typeChecker);\n results.push(...fileResults);\n });\n\n return results;\n }\n\n /**\n * Analyze a source file with type information.\n */\n protected analyzeSourceFile(sourceFile: ts.SourceFile, typeChecker: ts.TypeChecker): ParsedExpression[] {\n const results: ParsedExpression[] = [];\n\n const visit = (node: ts.Node) => {\n // Function declarations.\n if (ts.isFunctionDeclaration(node) && node.name) {\n const symbol = typeChecker.getSymbolAtLocation(node.name);\n const type = symbol && typeChecker.getTypeOfSymbolAtLocation(symbol, node);\n const signature = type && typeChecker.getSignaturesOfType(type, ts.SignatureKind.Call)[0];\n\n results.push({\n name: node.name.text,\n type: 'function',\n parameters: this.extractParameters(signature, typeChecker),\n returnType: signature ? typeChecker.typeToString(signature.getReturnType()) : 'any',\n references: this.findReferences(node, sourceFile, typeChecker),\n });\n }\n\n // Variable declarations.\n else if (ts.isVariableStatement(node)) {\n node.declarationList.declarations.forEach((declaration) => {\n if (ts.isIdentifier(declaration.name)) {\n const symbol = typeChecker.getSymbolAtLocation(declaration.name);\n const type = symbol && typeChecker.getTypeOfSymbolAtLocation(symbol, declaration);\n\n let kind: 'function' | 'variable' = 'variable';\n let parameters: Array<{ name: string; type: string }> | undefined;\n let returnType: string | undefined;\n let value: any;\n\n // Get the type string.\n const typeString = type ? typeChecker.typeToString(type) : 'any';\n\n // Check if it's a function.\n if (declaration.initializer) {\n if (ts.isArrowFunction(declaration.initializer) || ts.isFunctionExpression(declaration.initializer)) {\n kind = 'function';\n const funcType = typeChecker.getTypeAtLocation(declaration.initializer);\n const signature = typeChecker.getSignaturesOfType(funcType, ts.SignatureKind.Call)[0];\n if (signature) {\n parameters = this.extractParameters(signature, typeChecker);\n returnType = typeChecker.typeToString(signature.getReturnType());\n }\n } else {\n // Extract literal values\n if (ts.isNumericLiteral(declaration.initializer)) {\n value = Number(declaration.initializer.text);\n } else if (ts.isStringLiteral(declaration.initializer)) {\n value = declaration.initializer.text;\n }\n }\n }\n\n // Find references in the initializer only.\n const refs = declaration.initializer\n ? this.findReferences(declaration.initializer, sourceFile, typeChecker)\n : [];\n\n results.push({\n name: declaration.name.text,\n type: kind,\n valueType: typeString,\n value,\n parameters,\n returnType,\n references: refs,\n });\n }\n });\n }\n\n // Class declarations.\n else if (ts.isClassDeclaration(node) && node.name) {\n results.push({\n name: node.name.text,\n type: 'class',\n references: this.findReferences(node, sourceFile, typeChecker),\n });\n }\n\n // Interface declarations.\n else if (ts.isInterfaceDeclaration(node)) {\n results.push({\n name: node.name.text,\n type: 'interface',\n references: this.findReferences(node, sourceFile, typeChecker),\n });\n }\n\n ts.forEachChild(node, visit);\n };\n\n visit(sourceFile);\n return results;\n }\n\n /**\n * Extract parameter information from a signature.\n */\n private extractParameters(\n signature: ts.Signature | undefined,\n typeChecker: ts.TypeChecker,\n ): Array<{ name: string; type: string }> {\n if (!signature) {\n return [];\n }\n\n return signature.parameters.map((param) => ({\n name: param.getName(),\n type: typeChecker.typeToString(typeChecker.getTypeOfSymbolAtLocation(param, param.valueDeclaration!)),\n }));\n }\n\n /**\n * Find all references to variables used in a node.\n */\n private findReferences(node: ts.Node, _sourceFile: ts.SourceFile, _typeChecker: ts.TypeChecker): string[] {\n const references = new Set<string>();\n const localSymbols = new Set<string>();\n\n // First, collect local symbols (parameters, local variables).\n const collectLocalSymbols = (node: ts.Node) => {\n if (ts.isFunctionDeclaration(node) || ts.isArrowFunction(node) || ts.isFunctionExpression(node)) {\n node.parameters.forEach((param) => {\n if (ts.isIdentifier(param.name)) {\n localSymbols.add(param.name.text);\n }\n });\n }\n\n if (ts.isVariableDeclaration(node) && ts.isIdentifier(node.name)) {\n localSymbols.add(node.name.text);\n }\n\n ts.forEachChild(node, collectLocalSymbols);\n };\n\n collectLocalSymbols(node);\n\n // Then find all identifier references.\n const findRefs = (node: ts.Node) => {\n if (ts.isIdentifier(node)) {\n // Skip if it's a local symbol.\n if (!localSymbols.has(node.text)) {\n // Check if it's a reference (not a declaration).\n const parent = node.parent;\n const isDeclaration =\n (ts.isVariableDeclaration(parent) && parent.name === node) ||\n (ts.isFunctionDeclaration(parent) && parent.name === node) ||\n (ts.isParameter(parent) && parent.name === node);\n\n if (!isDeclaration && !this.isBuiltIn(node.text)) {\n references.add(node.text);\n }\n }\n }\n ts.forEachChild(node, findRefs);\n };\n\n findRefs(node);\n return Array.from(references);\n }\n\n /**\n * Check if a name is a built-in global.\n */\n protected isBuiltIn(name: string): boolean {\n return builtIns.has(name);\n }\n\n /**\n * Find assignment expressions in a source file.\n */\n private findAssignmentExpression(sourceFile: ts.SourceFile, typeChecker: ts.TypeChecker): ParsedExpression | null {\n let result: ParsedExpression | null = null;\n\n const visit = (node: ts.Node) => {\n if (ts.isExpressionStatement(node) && ts.isBinaryExpression(node.expression)) {\n const expr = node.expression;\n if (expr.operatorToken.kind === ts.SyntaxKind.EqualsToken && ts.isIdentifier(expr.left)) {\n const type = typeChecker.getTypeAtLocation(expr.right);\n const typeString = typeChecker.typeToString(type);\n\n // Get the literal value if it's a literal.\n let value: any;\n if (ts.isNumericLiteral(expr.right)) {\n value = Number(expr.right.text);\n } else if (ts.isStringLiteral(expr.right)) {\n value = expr.right.text;\n }\n\n // Find references in the right-hand side.\n const references = this.findReferences(expr.right, sourceFile, typeChecker);\n\n result = {\n name: expr.left.text,\n type: 'variable',\n valueType: typeString,\n value,\n references,\n };\n }\n }\n if (!result) {\n ts.forEachChild(node, visit);\n }\n };\n\n visit(sourceFile);\n return result;\n }\n\n /**\n * Find all identifier references in a source file.\n */\n protected findAllReferences(sourceFile: ts.SourceFile, _typeChecker: ts.TypeChecker): string[] {\n const references = new Set<string>();\n\n const visit = (node: ts.Node) => {\n if (ts.isIdentifier(node)) {\n // Skip if it's a declaration.\n const parent = node.parent;\n const isDeclaration =\n (ts.isVariableDeclaration(parent) && parent.name === node) ||\n (ts.isFunctionDeclaration(parent) && parent.name === node) ||\n (ts.isParameter(parent) && parent.name === node);\n\n // Skip if it's the left-hand side of an assignment.\n const isAssignmentTarget =\n ts.isBinaryExpression(parent) &&\n parent.operatorToken.kind === ts.SyntaxKind.EqualsToken &&\n parent.left === node;\n\n if (!isDeclaration && !isAssignmentTarget && !this.isBuiltIn(node.text)) {\n references.add(node.text);\n }\n }\n ts.forEachChild(node, visit);\n };\n\n visit(sourceFile);\n return Array.from(references);\n }\n\n protected createEnvironment(files: VirtualFile[]) {\n const allFiles = [...systemFiles, ...files];\n\n const fileMap = new Map<string, string>();\n allFiles.forEach(({ filename, content }) => {\n fileMap.set(filename, content);\n });\n\n const system = createSystem(fileMap);\n return createVirtualTypeScriptEnvironment(\n system,\n allFiles.map(({ filename }) => filename),\n ts,\n this.compilerOptions,\n );\n }\n}\n\n/**\n * Notebook-specific parser with dependency analysis.\n */\nexport class NotebookVirtualParser extends VirtualTypeScriptParser {\n /**\n * Analyze notebook cells with full type checking.\n */\n analyzeNotebook(cells: Array<{ id: string; code: string }>) {\n // Create cumulative environment where each cell can see previous cells.\n const cumulativeCode: string[] = [];\n const cellAnalysis: Map<\n string,\n {\n exports: ParsedExpression[];\n imports: string[];\n errors: ts.Diagnostic[];\n }\n > = new Map();\n\n cells.forEach((cell) => {\n // Create files for all cells up to current.\n const files: VirtualFile[] = [];\n\n // Add previous cells as context.\n if (cumulativeCode.length > 0) {\n files.push({\n filename: '/context.ts',\n content: cumulativeCode.join('\\n'),\n });\n }\n\n // Add current cell.\n const filename = `/cell/${cell.id}.ts`;\n files.push({\n filename,\n content: cell.code,\n });\n\n // Create environment.\n const env = this.createEnvironment(files);\n\n // Get diagnostics (errors).\n const diagnostics = env.languageService.getSemanticDiagnostics(filename);\n\n // Analyze current cell.\n const sourceFile = env.getSourceFile(filename);\n const typeChecker = env.languageService.getProgram()?.getTypeChecker();\n\n if (sourceFile && typeChecker) {\n const exports = this.analyzeSourceFile(sourceFile, typeChecker);\n\n // Find all references in the current cell.\n const allRefs = new Set<string>();\n exports.forEach((exp) => {\n exp.references?.forEach((ref) => allRefs.add(ref));\n });\n\n // Also check for references not in exports (e.g., console.log(y)).\n const additionalRefs = this.findAllReferences(sourceFile, typeChecker);\n additionalRefs.forEach((ref) => allRefs.add(ref));\n\n // Determine which references are imports from previous cells.\n const previousExports = new Set<string>();\n for (const [_prevCellId, prevAnalysis] of cellAnalysis) {\n prevAnalysis.exports.forEach((exp) => {\n if (exp.name) {\n previousExports.add(exp.name);\n }\n });\n }\n\n const imports = Array.from(allRefs).filter((ref) => previousExports.has(ref));\n\n cellAnalysis.set(cell.id, {\n exports,\n imports,\n errors: diagnostics,\n });\n }\n\n // Add current cell code to cumulative.\n cumulativeCode.push(cell.code);\n });\n\n return cellAnalysis;\n }\n}\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Atom from 'effect/unstable/reactivity/Atom';\nimport type * as Registry from 'effect/unstable/reactivity/AtomRegistry';\n\nimport { log } from '@dxos/log';\n\nimport { Notebook } from '#types';\n\nimport { evalScript } from './eval';\nimport { type ParsedExpression, VirtualTypeScriptParser } from './vfs-parser';\n\n/**\n * Compute graph that evaluates the notebook cells.\n */\n// TODO(burdon): Reconcile with @dxos/conductor.\nexport class ComputeGraph {\n private readonly _parser = new VirtualTypeScriptParser();\n\n private _expressionsAtom = Atom.make<Record<string, ParsedExpression>>({});\n private _valuesByCellIdAtom = Atom.make<Record<string, any>>({});\n private _valuesByNameAtom = Atom.make<Record<string, any>>({});\n\n constructor(\n private readonly _notebook: Notebook.Notebook,\n private readonly _registry: Registry.AtomRegistry,\n ) {}\n\n /**\n * Atom for parsed expressions by cell ID.\n */\n get expressions(): Atom.Atom<Record<string, ParsedExpression>> {\n return this._expressionsAtom;\n }\n\n /**\n * Get current expressions by cell ID.\n */\n getExpressions(): Record<string, ParsedExpression> {\n return this._registry.get(this._expressionsAtom);\n }\n\n /**\n * Atom for computed values by cell ID.\n */\n get values(): Atom.Atom<Record<string, any>> {\n return this._valuesByCellIdAtom;\n }\n\n /**\n * Get computed values by cell ID.\n */\n getValues(): Record<string, any> {\n return this._registry.get(this._valuesByCellIdAtom);\n }\n\n /**\n * Atom for computed values by name.\n */\n get valuesByName(): Atom.Atom<Record<string, any>> {\n return this._valuesByNameAtom;\n }\n\n /**\n * Get current values by name.\n */\n getValuesByName(): Record<string, any> {\n return this._registry.get(this._valuesByNameAtom);\n }\n\n /**\n * Get computed value by cell ID.\n */\n getValue(cellId: string): any {\n return this._registry.get(this._valuesByCellIdAtom)[cellId];\n }\n\n /**\n * Compute values.\n */\n async evaluate() {\n // Parse expressions.\n const { expressions, dependencyGraph } = this.parse();\n this._registry.set(this._valuesByCellIdAtom, {});\n this._registry.set(this._valuesByNameAtom, {});\n\n // Create a map of cell IDs to expressions for easy lookup.\n const cellExpressions = new Map<string, ParsedExpression>();\n Object.entries(expressions).forEach(([id, expr]) => {\n cellExpressions.set(id, expr);\n });\n\n // Topological sort to determine evaluation order.\n const evaluationOrder = this.topologicalSort(Object.keys(expressions), dependencyGraph);\n\n // Values by reference name.\n const valuesByName: Record<string, any> = {};\n const valuesByCellId: Record<string, any> = {};\n\n // Evaluate cells in dependency order.\n for (const cellId of evaluationOrder) {\n const expr = cellExpressions.get(cellId);\n if (!expr) {\n log.error('no expression for cell', { cellId });\n continue;\n }\n\n const cellSource = this._notebook.cells.find((cell) => cell.id === cellId)?.source?.target?.content;\n if (!cellSource) {\n log.error('no source for cell', { cellId });\n continue;\n }\n\n try {\n // For assignments or declarations, evaluate and store the value.\n if (expr.name && expr.value !== undefined) {\n // If the parser extracted a literal value, use it directly.\n valuesByName[expr.name] = expr.value;\n valuesByCellId[cellId] = expr.value;\n } else if (expr.name) {\n // For non-literal assignments, we need to evaluate the expression.\n // The parser identifies it's an assignment, so we can extract the RHS.\n const equalIndex = cellSource.indexOf('=');\n if (equalIndex !== -1) {\n // Find the actual assignment operator (not in strings or other contexts).\n let rhs = cellSource.substring(equalIndex + 1).trim();\n\n // Handle semicolon at the end.\n if (rhs.endsWith(';')) {\n rhs = rhs.slice(0, -1).trim();\n }\n\n const result = await this.eval(rhs, valuesByName);\n valuesByName[expr.name] = result;\n if (typeof result !== 'function') {\n valuesByCellId[cellId] = result;\n }\n }\n } else {\n // For expressions without assignment, just evaluate.\n const result = await this.eval(cellSource, valuesByName);\n valuesByCellId[cellId] = result;\n }\n } catch (error) {\n // TODO(burdon): Set error state.\n log.error('error evaluating cell', { cellId, error });\n }\n }\n\n this._registry.set(this._valuesByCellIdAtom, valuesByCellId);\n this._registry.set(this._valuesByNameAtom, valuesByName);\n return valuesByCellId;\n }\n\n private async eval(source: string, values: Record<string, any>) {\n return evalScript(source, values);\n }\n\n /**\n * Parse expressions.\n */\n parse() {\n const expressions = this._notebook.cells\n .filter((cell) => cell.type === 'script')\n .reduce<Record<string, ParsedExpression>>((acc, cell) => {\n const text = cell.source?.target?.content.trim();\n if (text) {\n const parsed = this._parser.parseExpression(text);\n acc[cell.id] = parsed;\n }\n\n return acc;\n }, {});\n\n // Build dependency graph.\n const dependencyGraph = this.buildDependencyGraph(expressions);\n this._registry.set(this._expressionsAtom, expressions);\n return { expressions, dependencyGraph };\n }\n\n private topologicalSort(nodes: string[], dependencies: Record<string, string[]>): string[] {\n const visited = new Set<string>();\n const result: string[] = [];\n\n const visit = (node: string) => {\n if (visited.has(node)) {\n return;\n }\n\n visited.add(node);\n\n // Visit dependencies first.\n const deps = dependencies[node] || [];\n deps.forEach((dep) => visit(dep));\n result.push(node);\n };\n\n // Visit all nodes.\n nodes.forEach((node) => visit(node));\n return result;\n }\n\n private buildDependencyGraph(expressions: Record<string, ParsedExpression>): Record<string, string[]> {\n // Create a map of variable names to their cell IDs.\n const nameToCellId = new Map<string, string>();\n Object.entries(expressions).forEach(([id, expr]) => {\n if (expr.name) {\n nameToCellId.set(expr.name, id);\n }\n });\n\n // Build the dependency graph using cell IDs.\n const graph: Record<string, string[]> = {};\n Object.entries(expressions).forEach(([id, expr]) => {\n if (expr.references && expr.references.length > 0) {\n // Map variable references to cell IDs.\n const dependencyCellIds = expr.references\n .map((ref) => nameToCellId.get(ref))\n .filter((cellId): cellId is string => cellId !== undefined && cellId !== id);\n\n if (dependencyCellIds.length > 0) {\n graph[id] = dependencyCellIds;\n }\n }\n });\n\n return graph;\n }\n}\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport { RegistryContext } from '@effect/atom-react/RegistryContext';\nimport * as Cause from 'effect/Cause';\nimport * as Effect from 'effect/Effect';\nimport * as Exit from 'effect/Exit';\nimport type * as Types from 'effect/Types';\nimport React, { useCallback, useContext, useMemo, useState } from 'react';\n\nimport { useSpaceCallback } from '@dxos/app-framework/ui';\nimport { type AppSurface } from '@dxos/app-toolkit/ui';\nimport { RunInstructions } from '@dxos/assistant-toolkit';\nimport * as Instructions from '@dxos/compute/Instructions';\nimport * as Operation from '@dxos/compute/Operation';\nimport * as Skill from '@dxos/compute/Skill';\nimport { Filter, Obj, Query, Ref } from '@dxos/echo';\nimport { QueryBuilder } from '@dxos/echo-query';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport * as Graph from '@dxos/plugin-explorer/Graph';\nimport { DropdownMenu, IconButton, Panel, Toolbar, useTranslation } from '@dxos/react-ui';\nimport { useAttention } from '@dxos/react-ui-attention';\nimport { Text, ViewModel } from '@dxos/schema';\nimport { isNonNullable } from '@dxos/util';\n\nimport { NotebookMenu, NotebookStack, type NotebookStackProps, type TypescriptEditorProps } from '#components';\nimport { meta } from '#meta';\nimport { Notebook } from '#types';\n\nimport { ComputeGraph } from '../../notebook';\n\nconst INCLUDE_SKILLS = ['org.dxos.skill.assistant', 'org.dxos.skill.database', 'org.dxos.skill.markdown'];\n\n// TODO(burdon): Support calling named deployed functions (as with sheet).\n\nexport type NotebookArticleProps = AppSurface.ObjectArticleProps<Notebook.Notebook, Pick<TypescriptEditorProps, 'env'>>;\n\nexport const NotebookArticle = ({ role, subject: notebook, attendableId, env }: NotebookArticleProps) => {\n const { t } = useTranslation(meta.profile.key);\n const registry = useContext(RegistryContext);\n const db = notebook ? Obj.getDatabase(notebook) : undefined;\n const { hasAttention } = useAttention(attendableId);\n\n // TODO(burdon): Consolidate execution and state (with graph).\n // Generalize ComputeGraph evaluation function (using effects).\n const graph = useMemo(() => notebook && new ComputeGraph(notebook, registry), [notebook, registry]);\n\n const [queryValues, setQueryValues] = useState<Record<string, any>>({});\n const handleExecQueries = useCallback(async () => {\n invariant(db);\n\n const builder = new QueryBuilder();\n for (const cell of notebook?.cells ?? []) {\n if (cell.type === 'query') {\n if (cell.source?.target) {\n const source = cell.source.target.content;\n const { name, filter } = builder.build(source);\n if (filter) {\n const ast = Query.select(filter).ast;\n const graph = cell.graph?.target;\n if (!graph) {\n const { view } = await ViewModel.makeFromDatabase({ db });\n const newGraph = Graph.make({ query: { ast }, view });\n Obj.update(notebook!, (obj) => {\n const c = obj.cells.find((c) => c.id === cell.id);\n if (c) {\n c.graph = Ref.make(newGraph);\n c.name = name;\n }\n });\n } else {\n Obj.update(graph, (graph) => {\n graph.query.ast = ast as Obj.Mutable<typeof ast>;\n });\n }\n }\n }\n\n if (cell.name && cell.graph?.target) {\n const graph = Obj.getSnapshot(cell.graph?.target);\n const query = Query.fromAst(graph.query.ast);\n const objects = await db.query(query).run();\n const objectIds = objects?.map((obj) => obj.id);\n setQueryValues((prev) => ({ ...prev, [cell.name!]: objectIds }));\n }\n }\n }\n }, [db, notebook, graph]);\n\n const [promptResults, setPromptResults] = useState<Record<string, string>>({});\n const handleExecPrompts = useSpaceCallback(\n db?.spaceId,\n [] as const,\n Effect.fnUntraced(function* () {\n invariant(graph);\n\n const allInstructions =\n notebook?.cells\n .filter((cell) => cell.type === 'prompt')\n .map((cell) => cell.prompt)\n .filter(isNonNullable) ?? [];\n\n for (const instructions of allInstructions) {\n yield* runPrompt({\n instructions,\n input: { ...queryValues, ...graph.getValuesByName() },\n onResult: (result) =>\n setPromptResults((prev) => ({\n ...prev,\n [instructions.uri]: result,\n })),\n });\n }\n }),\n [notebook, graph, queryValues],\n );\n\n // TODO(burdon): Cache values in context (preserve when switched).\n const handleCompute = useCallback(async () => {\n // TODO(burdon): Generalize executors (dependencies).\n await graph?.evaluate();\n await handleExecQueries();\n await handleExecPrompts();\n }, [graph, handleExecQueries, handleExecPrompts]);\n\n const handleCellInsert = useCallback<NonNullable<NotebookStackProps['onCellInsert']>>(\n async (type, after) => {\n invariant(notebook);\n const cell: Types.Mutable<Notebook.Cell> = { id: crypto.randomUUID(), type };\n switch (type) {\n case 'markdown':\n case 'script':\n case 'query': {\n cell.source = Ref.make(Text.make());\n break;\n }\n\n case 'prompt': {\n if (db) {\n const objects = await db.query(Query.select(Filter.type(Skill.Skill))).run();\n const skills = objects\n .filter((skill) => {\n const key = Obj.getMeta(skill).key;\n return key !== undefined && INCLUDE_SKILLS.includes(key);\n })\n .map((skill) => Ref.make(skill));\n cell.prompt = Ref.make(Instructions.make({ text: '', skills }));\n }\n break;\n }\n }\n\n const idx = after ? notebook.cells.findIndex((cell) => cell.id === after) : notebook.cells.length;\n Obj.update(notebook, (notebook) => {\n notebook.cells.splice(idx, 0, cell);\n });\n },\n [db, notebook],\n );\n\n const handleCellDelete = useCallback<NonNullable<NotebookStackProps['onCellDelete']>>(\n (id) => {\n invariant(notebook);\n const idx = notebook.cells.findIndex((cell) => cell.id === id);\n if (idx !== -1) {\n Obj.update(notebook, (notebook) => {\n notebook.cells.splice(idx, 1);\n });\n }\n },\n [notebook],\n );\n\n return (\n <Panel.Root role={role} classNames='dx-document'>\n <Panel.Toolbar asChild>\n <Toolbar.Root disabled={!hasAttention}>\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <IconButton icon='ph--plus--regular' iconOnly label={t('notebook-cell-insert.label')} />\n </DropdownMenu.Trigger>\n <NotebookMenu onCellInsert={handleCellInsert} />\n </DropdownMenu.Root>\n <Toolbar.IconButton\n icon='ph--play--fill'\n iconOnly\n label={t('compute.label')}\n classNames='text-success-text'\n onClick={handleCompute}\n />\n </Toolbar.Root>\n </Panel.Toolbar>\n <Panel.Content asChild>\n <NotebookStack\n db={db}\n notebook={notebook}\n graph={graph}\n env={env}\n promptResults={promptResults}\n onCellInsert={handleCellInsert}\n onCellDelete={handleCellDelete}\n />\n </Panel.Content>\n </Panel.Root>\n );\n};\n\n// TODO(wittjosiah): Factor out. Copied from PromptArticle in plugin-assistant.\nconst runPrompt = Effect.fn(function* ({\n instructions,\n input,\n onResult,\n}: {\n instructions: Ref.Ref<Instructions.Instructions>;\n input: Record<string, any>;\n onResult: (result: string) => void;\n}) {\n const inputData: Operation.Definition.Input<typeof RunInstructions> = { instructions, input };\n // Invoke the function.\n const result = yield* Operation.invoke(RunInstructions, inputData).pipe(Effect.orDie, Effect.exit);\n\n Exit.match(result, {\n onFailure: (cause) => {\n const error = Cause.prettyErrors(cause)[0];\n log.error(error.message, error.cause ?? error.stack);\n onResult(error.message);\n },\n onSuccess: (result: any) => {\n onResult(result.note);\n },\n });\n});\n\nNotebookArticle.displayName = 'NotebookArticle';\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"chunk-ScriptArticle.mjs","names":[],"sources":["../../src/containers/ScriptArticle/ScriptArticle.tsx"],"sourcesContent":["//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useMemo } from 'react';\n\nimport { type AppSurface } from '@dxos/app-toolkit/ui';\nimport { type Script } from '@dxos/compute';\nimport { Obj } from '@dxos/echo';\nimport { Doc } from '@dxos/echo-doc';\nimport { useIdentity } from '@dxos/halo-react';\nimport { getSpace } from '@dxos/react-client/echo';\nimport { Panel } from '@dxos/react-ui';\nimport { createDataExtensions, editorClassNames, listener } from '@dxos/ui-editor';\n\nimport { ScriptToolbar, TypescriptEditor, type TypescriptEditorProps } from '#components';\nimport { useDeployState, useToolbarState } from '#hooks';\nimport { type Settings } from '#types';\n\nexport type ScriptEditorProps = AppSurface.ObjectArticleProps<\n Script.Script,\n {\n settings?: Settings.Settings;\n } & Pick<TypescriptEditorProps, 'env'>\n>;\n\nexport const ScriptArticle = ({\n role,\n attendableId,\n subject: script,\n settings = { editorInputMode: 'vscode' },\n env,\n}: ScriptEditorProps) => {\n const identity = useIdentity();\n const space = getSpace(script);\n const state = useToolbarState();\n useDeployState({ script, state });\n\n const extensions = useMemo(() => {\n if (!script.source.target) {\n return [];\n }\n\n return [\n createDataExtensions({\n id: script.id,\n text: Doc.createAccessor(script.source.target, ['content']),\n messenger: space,\n identity,\n }),\n listener({\n onChange: ({ text }) => {\n if (script.source.target?.content !== text) {\n Obj.update(script, (script) => {\n script.changed = true;\n });\n }\n },\n }),\n ];\n }, [identity, space, script, script.source.target]);\n\n if (!extensions.length) {\n return null;\n }\n\n return (\n <Panel.Root role={role}>\n <Panel.Toolbar asChild>\n <ScriptToolbar script={script} attendableId={attendableId} state={state} role={role} />\n </Panel.Toolbar>\n <Panel.Content asChild>\n <TypescriptEditor\n classNames={editorClassNames(role)}\n id={script.id}\n env={env}\n initialValue={script.source?.target?.content}\n extensions={extensions}\n inputMode={settings.editorInputMode}\n toolbar\n />\n </Panel.Content>\n </Panel.Root>\n );\n};\n\nScriptArticle.displayName = 'ScriptArticle';\n"],"mappings":";;;;;;;;;;;AA0BA,IAAa,iBAAiB,EAC5B,MACA,cACA,SAAS,QACT,WAAW,EAAE,iBAAiB,SAAS,GACvC,UACuB;CACvB,MAAM,WAAW,YAAY;CAC7B,MAAM,QAAQ,SAAS,MAAM;CAC7B,MAAM,QAAQ,gBAAgB;CAC9B,eAAe;EAAE;EAAQ;CAAM,CAAC;CAEhC,MAAM,aAAa,cAAc;EAC/B,IAAI,CAAC,OAAO,OAAO,QACjB,OAAO,CAAC;EAGV,OAAO,CACL,qBAAqB;GACnB,IAAI,OAAO;GACX,MAAM,IAAI,eAAe,OAAO,OAAO,QAAQ,CAAC,SAAS,CAAC;GAC1D,WAAW;GACX;EACF,CAAC,GACD,SAAS,EACP,WAAW,EAAE,WAAW;GACtB,IAAI,OAAO,OAAO,QAAQ,YAAY,MACpC,IAAI,OAAO,SAAS,WAAW;IAC7B,OAAO,UAAU;GACnB,CAAC;EAEL,EACF,CAAC,CACH;CACF,GAAG;EAAC;EAAU;EAAO;EAAQ,OAAO,OAAO;CAAM,CAAC;CAElD,IAAI,CAAC,WAAW,QACd,OAAO;CAGT,OACE,qBAAC,MAAM,MAAP;EAAkB;YAAlB,CACE,oBAAC,MAAM,SAAP;GAAe,SAAA;aACb,oBAAC,eAAD;IAAuB;IAAsB;IAAqB;IAAa;GAAO,CAAA;EACzE,CAAA,GACf,oBAAC,MAAM,SAAP;GAAe,SAAA;aACb,oBAAC,kBAAD;IACE,YAAY,iBAAiB,IAAI;IACjC,IAAI,OAAO;IACN;IACL,cAAc,OAAO,QAAQ,QAAQ;IACzB;IACZ,WAAW,SAAS;IACpB,SAAA;GACD,CAAA;EACY,CAAA,CACL;;AAEhB;AAEA,cAAc,cAAc"}
1
+ {"version":3,"file":"chunk-ScriptArticle.mjs","names":[],"sources":["../../src/containers/ScriptArticle/ScriptArticle.tsx"],"sourcesContent":["//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useMemo } from 'react';\n\nimport { type AppSurface } from '@dxos/app-toolkit/ui';\nimport type * as Script from '@dxos/compute/Script';\nimport { Obj } from '@dxos/echo';\nimport { Doc } from '@dxos/echo-doc';\nimport { useIdentity } from '@dxos/halo-react';\nimport { getSpace } from '@dxos/react-client/echo';\nimport { Panel } from '@dxos/react-ui';\nimport { createDataExtensions, editorClassNames, listener } from '@dxos/ui-editor';\n\nimport { ScriptToolbar, TypescriptEditor, type TypescriptEditorProps } from '#components';\nimport { useDeployState, useToolbarState } from '#hooks';\nimport { Settings } from '#types';\n\nexport type ScriptEditorProps = AppSurface.ObjectArticleProps<\n Script.Script,\n {\n settings?: Settings.Settings;\n } & Pick<TypescriptEditorProps, 'env'>\n>;\n\nexport const ScriptArticle = ({\n role,\n attendableId,\n subject: script,\n settings = { editorInputMode: 'vscode' },\n env,\n}: ScriptEditorProps) => {\n const identity = useIdentity();\n const space = getSpace(script);\n const state = useToolbarState();\n useDeployState({ script, state });\n\n const extensions = useMemo(() => {\n if (!script.source.target) {\n return [];\n }\n\n return [\n createDataExtensions({\n id: script.id,\n text: Doc.createAccessor(script.source.target, ['content']),\n messenger: space,\n identity,\n }),\n listener({\n onChange: ({ text }) => {\n if (script.source.target?.content !== text) {\n Obj.update(script, (script) => {\n script.changed = true;\n });\n }\n },\n }),\n ];\n }, [identity, space, script, script.source.target]);\n\n if (!extensions.length) {\n return null;\n }\n\n return (\n <Panel.Root role={role}>\n <Panel.Toolbar asChild>\n <ScriptToolbar script={script} attendableId={attendableId} state={state} role={role} />\n </Panel.Toolbar>\n <Panel.Content asChild>\n <TypescriptEditor\n classNames={editorClassNames(role)}\n id={script.id}\n env={env}\n initialValue={script.source?.target?.content}\n extensions={extensions}\n inputMode={settings.editorInputMode}\n toolbar\n />\n </Panel.Content>\n </Panel.Root>\n );\n};\n\nScriptArticle.displayName = 'ScriptArticle';\n"],"mappings":";;;;;;;;;;;AA0BA,IAAa,iBAAiB,EAC5B,MACA,cACA,SAAS,QACT,WAAW,EAAE,iBAAiB,SAAS,GACvC,UACuB;CACvB,MAAM,WAAW,YAAY;CAC7B,MAAM,QAAQ,SAAS,MAAM;CAC7B,MAAM,QAAQ,gBAAgB;CAC9B,eAAe;EAAE;EAAQ;CAAM,CAAC;CAEhC,MAAM,aAAa,cAAc;EAC/B,IAAI,CAAC,OAAO,OAAO,QACjB,OAAO,CAAC;EAGV,OAAO,CACL,qBAAqB;GACnB,IAAI,OAAO;GACX,MAAM,IAAI,eAAe,OAAO,OAAO,QAAQ,CAAC,SAAS,CAAC;GAC1D,WAAW;GACX;EACF,CAAC,GACD,SAAS,EACP,WAAW,EAAE,WAAW;GACtB,IAAI,OAAO,OAAO,QAAQ,YAAY,MACpC,IAAI,OAAO,SAAS,WAAW;IAC7B,OAAO,UAAU;GACnB,CAAC;EAEL,EACF,CAAC,CACH;CACF,GAAG;EAAC;EAAU;EAAO;EAAQ,OAAO,OAAO;CAAM,CAAC;CAElD,IAAI,CAAC,WAAW,QACd,OAAO;CAGT,OACE,qBAAC,MAAM,MAAP;EAAkB;EAAlB,UAAA,CACE,oBAAC,MAAM,SAAP;GAAe,SAAA;GACb,UAAA,oBAAC,eAAD;IAAuB;IAAsB;IAAqB;IAAa;GAAO,CAAA;EACzE,CAAA,GACf,oBAAC,MAAM,SAAP;GAAe,SAAA;GACb,UAAA,oBAAC,kBAAD;IACE,YAAY,iBAAiB,IAAI;IACjC,IAAI,OAAO;IACN;IACL,cAAc,OAAO,QAAQ,QAAQ;IACzB;IACZ,WAAW,SAAS;IACpB,SAAA;GACD,CAAA;EACY,CAAA,CACL;;AAEhB;AAEA,cAAc,cAAc"}
@@ -1,18 +1,20 @@
1
- import { Operation, Skill, Template } from "@dxos/compute";
1
+ import { meta } from "#meta";
2
+ import * as Skill from "@dxos/compute/Skill";
3
+ import * as Template from "@dxos/compute/Template";
2
4
  import { kebabize } from "@dxos/util";
5
+ import * as Operation from "@dxos/compute/Operation";
3
6
  import { Filter, Obj, Ref } from "@dxos/echo";
4
- import { meta } from "#meta";
5
7
  import { getInvocationUrl, getUserFunctionIdInMetadata } from "@dxos/compute-runtime";
6
8
  import { log } from "@dxos/log";
7
- import { SettingsOperation } from "@dxos/app-toolkit";
8
9
  import { useCallback, useState } from "react";
9
- import { Button, Clipboard, Input, Message, useAsyncEffect, useControlledState, useTranslation } from "@dxos/react-ui";
10
+ import { Banner, Button, Clipboard, Flex, Input, useAsyncEffect, useControlledState, useTranslation } from "@dxos/react-ui";
10
11
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
11
12
  import { useOperationInvoker } from "@dxos/app-framework/ui";
12
13
  import { useQuery } from "@dxos/echo-react";
13
14
  import { useClient } from "@dxos/react-client";
14
15
  import { Form } from "@dxos/react-ui-form";
15
16
  import { Octokit } from "@octokit/core";
17
+ import * as SettingsOperation from "@dxos/app-toolkit/SettingsOperation";
16
18
  import { AccessToken } from "@dxos/link";
17
19
  import { ToolId } from "@dxos/ai";
18
20
  //#region src/containers/ScriptProperties/FunctionBinding.tsx
@@ -31,8 +33,8 @@ var FunctionBinding = ({ object }) => {
31
33
  });
32
34
  }, [fn, binding]);
33
35
  if (!fn) return null;
34
- return /* @__PURE__ */ jsxs("div", {
35
- className: "flex flex-col",
36
+ return /* @__PURE__ */ jsxs(Flex, {
37
+ column: true,
36
38
  children: [
37
39
  /* @__PURE__ */ jsx(Form.Section, { title: t("remote-function-settings.heading") }),
38
40
  functionUrl && /* @__PURE__ */ jsxs(Input.Root, { children: [
@@ -64,7 +66,8 @@ var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-script/src/containers
64
66
  var FunctionPublishing = ({ object }) => {
65
67
  const { t } = useTranslation(meta.profile.key);
66
68
  const { invokePromise } = useOperationInvoker();
67
- const [githubToken] = useQuery(Obj.getDatabase(object), Filter.type(AccessToken.AccessToken, { source: "github.com" }));
69
+ const db = Obj.getDatabase(object);
70
+ const [githubToken] = useQuery(db, Filter.type(AccessToken.AccessToken, { source: "github.com" }));
68
71
  const gistKey = Obj.getMeta(object).keys.find(({ source }) => source === "github.com");
69
72
  const [gistUrl, setGistUrl] = useState();
70
73
  useAsyncEffect(async () => {
@@ -116,28 +119,30 @@ var FunctionPublishing = ({ object }) => {
116
119
  setPublishing(false);
117
120
  }
118
121
  }, [object, githubToken]);
119
- return /* @__PURE__ */ jsxs("div", {
120
- className: "flex flex-col",
122
+ return /* @__PURE__ */ jsxs(Flex, {
123
+ column: true,
121
124
  children: [
122
125
  /* @__PURE__ */ jsx(Form.Section, {
123
126
  title: t("script-publish-settings.label"),
124
127
  description: t("script-publish-settings.description")
125
128
  }),
126
- !githubToken && /* @__PURE__ */ jsxs("div", {
127
- className: "flex flex-col py-form-gap",
128
- children: [/* @__PURE__ */ jsx(Message.Root, {
129
+ !githubToken && /* @__PURE__ */ jsxs(Flex, {
130
+ column: true,
131
+ classNames: "py-form-gap",
132
+ children: [/* @__PURE__ */ jsx(Banner.Root, {
129
133
  valence: "info",
130
- children: /* @__PURE__ */ jsx(Message.Title, { children: t("no-github-token.label") })
131
- }), /* @__PURE__ */ jsx("div", {
132
- className: "flex pt-form-gap",
134
+ children: /* @__PURE__ */ jsx(Banner.Content, { children: /* @__PURE__ */ jsx(Banner.Title, { children: t("no-github-token.label") }) })
135
+ }), /* @__PURE__ */ jsx(Flex, {
136
+ classNames: "pt-form-gap",
133
137
  children: /* @__PURE__ */ jsx(Button, {
134
138
  onClick: handleOpenTokenManager,
135
139
  children: t("open-token-manager.label")
136
140
  })
137
141
  })]
138
142
  }),
139
- githubToken && /* @__PURE__ */ jsxs("div", {
140
- className: "flex justify-end gap-2",
143
+ githubToken && /* @__PURE__ */ jsxs(Flex, {
144
+ gap: "sm",
145
+ justify: "end",
141
146
  children: [gistUrl && /* @__PURE__ */ jsx(Clipboard.IconButton, { value: gistUrl }), /* @__PURE__ */ jsx(Button, {
142
147
  disabled: publishing,
143
148
  onClick: handlePublish,
@@ -198,8 +203,8 @@ var SkillEditor = ({ object }) => {
198
203
  object.name,
199
204
  instructions
200
205
  ]);
201
- return /* @__PURE__ */ jsxs("div", {
202
- className: "flex flex-col",
206
+ return /* @__PURE__ */ jsxs(Flex, {
207
+ column: true,
203
208
  children: [
204
209
  /* @__PURE__ */ jsx(Form.Section, {
205
210
  title: t("skill-editor.label"),
@@ -1 +1 @@
1
- {"version":3,"file":"chunk-ScriptProperties.mjs","names":[],"sources":["../../src/containers/ScriptProperties/FunctionBinding.tsx","../../src/containers/ScriptProperties/FunctionPublishing.tsx","../../src/containers/ScriptProperties/SkillEditor.tsx","../../src/containers/ScriptProperties/ScriptProperties.tsx"],"sourcesContent":["//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { type ChangeEvent, useCallback } from 'react';\n\nimport { type Script } from '@dxos/compute';\nimport { Operation } from '@dxos/compute';\nimport { getUserFunctionIdInMetadata } from '@dxos/compute-runtime';\nimport { getInvocationUrl } from '@dxos/compute-runtime';\nimport { Filter, Obj, Ref } from '@dxos/echo';\nimport { useQuery } from '@dxos/echo-react';\nimport { useClient } from '@dxos/react-client';\nimport { Clipboard, Input, useControlledState, useTranslation } from '@dxos/react-ui';\nimport { Form } from '@dxos/react-ui-form';\n\nimport { meta } from '#meta';\n\nexport type FunctionBindingProps = { object: Script.Script };\n\nexport const FunctionBinding = ({ object }: FunctionBindingProps) => {\n const { t } = useTranslation(meta.profile.key);\n const client = useClient();\n const db = Obj.getDatabase(object);\n\n const [fn] = useQuery(db, Filter.type(Operation.PersistentOperation, { source: Ref.make(object) }));\n const functionId = fn && getUserFunctionIdInMetadata(Obj.getMeta(fn));\n const functionUrl =\n functionId &&\n getInvocationUrl(functionId, client.config.values.runtime?.services?.edge?.url ?? '', {\n spaceId: db?.spaceId,\n });\n\n const [binding, setBinding] = useControlledState(fn?.binding ?? '');\n const handleBindingChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => setBinding(event.target.value),\n [setBinding],\n );\n\n const handleBindingBlur = useCallback(() => {\n if (fn) {\n Obj.update(fn, (fn) => {\n fn.binding = binding;\n });\n }\n }, [fn, binding]);\n\n if (!fn) {\n return null;\n }\n\n return (\n <div className='flex flex-col'>\n <Form.Section title={t('remote-function-settings.heading')} />\n\n {functionUrl && (\n <Input.Root>\n <Input.Label>{t('function-url.label')}</Input.Label>\n <Input.TextInput\n disabled\n value={functionUrl}\n onChange={(event) => {\n Obj.update(fn, (fn) => {\n fn.name = event.target.value;\n });\n }}\n />\n <Clipboard.IconButton value={functionUrl} />\n </Input.Root>\n )}\n\n <Input.Root>\n <Input.Label>{t('function-binding.label')}</Input.Label>\n <Input.TextInput\n placeholder={t('function-binding.placeholder')}\n value={binding}\n onChange={handleBindingChange}\n onBlur={handleBindingBlur}\n />\n </Input.Root>\n </div>\n );\n};\n\nFunctionBinding.displayName = 'FunctionBinding';\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport { Octokit } from '@octokit/core';\nimport React, { useCallback, useState } from 'react';\n\nimport { useOperationInvoker } from '@dxos/app-framework/ui';\nimport { SettingsOperation } from '@dxos/app-toolkit';\nimport { type Script } from '@dxos/compute';\nimport { Filter, Obj } from '@dxos/echo';\nimport { useQuery } from '@dxos/echo-react';\nimport { AccessToken } from '@dxos/link';\nimport { log } from '@dxos/log';\nimport { Button, Clipboard, Message, useAsyncEffect, useTranslation } from '@dxos/react-ui';\nimport { Form } from '@dxos/react-ui-form';\nimport { kebabize } from '@dxos/util';\n\nimport { meta } from '#meta';\n\nexport type FunctionPublishingProps = { object: Script.Script };\n\n// TODO(burdon): Move to separate tab?\nexport const FunctionPublishing = ({ object }: FunctionPublishingProps) => {\n const { t } = useTranslation(meta.profile.key);\n const { invokePromise } = useOperationInvoker();\n const db = Obj.getDatabase(object);\n\n const [githubToken] = useQuery(db, Filter.type(AccessToken.AccessToken, { source: 'github.com' }));\n const gistKey = Obj.getMeta(object).keys.find(({ source }) => source === 'github.com');\n const [gistUrl, setGistUrl] = useState<string | undefined>();\n\n useAsyncEffect(async () => {\n const token = githubToken?.token;\n const gistId = gistKey?.id;\n if (!token || !gistId) {\n setGistUrl(undefined);\n return;\n }\n\n try {\n const octokit = new Octokit({ auth: githubToken.token });\n const response = await octokit.request('GET /gists/{gist_id}', {\n gist_id: gistId,\n });\n setGistUrl(response.data.html_url);\n } catch (err) {\n log.catch(err);\n setGistUrl(undefined);\n }\n }, [githubToken, gistKey]);\n\n const handleOpenTokenManager = useCallback(\n () =>\n invokePromise(SettingsOperation.Open, {\n plugin: 'org.dxos.plugin.token-manager',\n }),\n [invokePromise],\n );\n\n const [publishing, setPublishing] = useState(false);\n const handlePublish = useCallback(async () => {\n setPublishing(true);\n const octokit = new Octokit({ auth: githubToken.token });\n const source = await object.source.load();\n const filename = object.name ? kebabize(object.name) : 'composer-script';\n const files = { [`${filename}.ts`]: { content: source.content } };\n\n try {\n // TODO(wittjosiah): Factor out to intent.\n const meta = Obj.getMeta(object);\n const githubKey = meta.keys.find(({ source }) => source === 'github.com');\n const gistId = githubKey?.id;\n if (gistId) {\n await octokit.request('PATCH /gists/{gist_id}', {\n gist_id: gistId,\n files,\n });\n } else {\n const response = await octokit.request('POST /gists', {\n public: true,\n files,\n });\n const gistId = response.data.id;\n if (gistId) {\n Obj.update(object, (object) => {\n Obj.getMeta(object).keys.push({ source: 'github.com', id: gistId });\n });\n }\n }\n } finally {\n setPublishing(false);\n }\n }, [object, githubToken]);\n\n return (\n <div className='flex flex-col'>\n <Form.Section title={t('script-publish-settings.label')} description={t('script-publish-settings.description')} />\n\n {!githubToken && (\n <div className='flex flex-col py-form-gap'>\n <Message.Root valence='info'>\n <Message.Title>{t('no-github-token.label')}</Message.Title>\n </Message.Root>\n <div className='flex pt-form-gap'>\n <Button onClick={handleOpenTokenManager}>{t('open-token-manager.label')}</Button>\n </div>\n </div>\n )}\n\n {githubToken && (\n <div className='flex justify-end gap-2'>\n {gistUrl && <Clipboard.IconButton value={gistUrl} />}\n <Button disabled={publishing} onClick={handlePublish}>\n {t('publish.label')}\n </Button>\n </div>\n )}\n </div>\n );\n};\n\nFunctionPublishing.displayName = 'FunctionPublishing';\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useCallback, useState } from 'react';\n\nimport { ToolId } from '@dxos/ai';\nimport { Skill, Template } from '@dxos/compute';\nimport { type Script } from '@dxos/compute';\nimport { Operation } from '@dxos/compute';\nimport { Filter, Obj, Ref } from '@dxos/echo';\nimport { useQuery } from '@dxos/echo-react';\nimport { Button, Input, useAsyncEffect, useTranslation } from '@dxos/react-ui';\nimport { Form } from '@dxos/react-ui-form';\nimport { kebabize } from '@dxos/util';\n\nimport { meta } from '#meta';\n\nexport type SkillEditorProps = { object: Script.Script };\n\nexport const SkillEditor = ({ object }: SkillEditorProps) => {\n const { t } = useTranslation(meta.profile.key);\n const db = Obj.getDatabase(object);\n const [fn] = useQuery(db, Filter.type(Operation.PersistentOperation, { source: Ref.make(object) }));\n const skills = useQuery(db, Filter.type(Skill.Skill));\n\n const [creating, setCreating] = useState(false);\n // TODO(burdon): Remove?\n const [instructions, setInstructions] = useState<string>(`You can run the script \"${object.name ?? 'script'}\".`);\n const skillKey = `org.dxos.skill.${kebabize(object.name ?? 'script')}`;\n const existingSkill = skills.find((bp) => Obj.getMeta(bp).key === skillKey);\n const fnKey = fn ? Obj.getMeta(fn).key : undefined;\n\n useAsyncEffect(async () => {\n if (!existingSkill) {\n return;\n }\n\n const source = await existingSkill.instructions.source.load();\n setInstructions(source.content ?? '');\n }, [existingSkill]);\n\n const handleSave = useCallback(async () => {\n if (!db) {\n return;\n }\n\n setCreating(true);\n try {\n if (existingSkill) {\n const text = await existingSkill.instructions.source.load();\n Obj.update(text, (text) => {\n text.content = instructions;\n });\n\n if (fnKey) {\n const toolId = ToolId.make(fnKey);\n if (!existingSkill.tools?.includes(toolId)) {\n Obj.update(existingSkill, (existingSkill) => {\n existingSkill.tools = [...(existingSkill.tools ?? []), toolId];\n });\n }\n }\n } else if (fnKey) {\n db.add(\n Skill.make({\n key: skillKey,\n name: object.name ?? 'Script',\n instructions: Template.make({ source: instructions }),\n tools: [ToolId.make(fnKey)],\n }),\n );\n }\n await db.flush();\n } finally {\n setCreating(false);\n }\n }, [db, existingSkill, fnKey, skillKey, object.name, instructions]);\n\n return (\n <div className='flex flex-col'>\n <Form.Section title={t('skill-editor.label')} description={t('skill-editor.description')} />\n\n <Input.Root>\n <Input.Label>{t('skill-instructions.label')}</Input.Label>\n <Input.TextArea\n placeholder={t('skill-instructions.placeholder')}\n rows={6}\n value={instructions}\n onChange={(event) => setInstructions(event.target.value)}\n classNames='resize-y'\n />\n </Input.Root>\n\n <div className='pt-2'>\n <Button disabled={(!existingSkill && !fnKey) || creating} onClick={handleSave}>\n {t(existingSkill ? 'update-skill.label' : 'create-skill.label')}\n </Button>\n </div>\n </div>\n );\n};\n\nSkillEditor.displayName = 'SkillEditor';\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type AppSurface } from '@dxos/app-toolkit/ui';\nimport { type Script } from '@dxos/compute';\nimport { Form } from '@dxos/react-ui-form';\n\nimport { FunctionBinding } from './FunctionBinding';\nimport { FunctionPublishing } from './FunctionPublishing';\nimport { SkillEditor } from './SkillEditor';\n\nexport type ScriptPropertiesProps = AppSurface.ObjectPropertiesProps<Script.Script>;\n\nexport const ScriptProperties = ({ subject: object }: ScriptPropertiesProps) => {\n return (\n <>\n <Form.Section>\n <FunctionBinding object={object} />\n </Form.Section>\n <Form.Section>\n <SkillEditor object={object} />\n </Form.Section>\n <Form.Section>\n <FunctionPublishing object={object} />\n </Form.Section>\n </>\n );\n};\n\nScriptProperties.displayName = 'ScriptProperties';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAoBA,IAAa,mBAAmB,EAAE,aAAmC;CACnE,MAAM,EAAE,MAAM,eAAe,KAAK,QAAQ,GAAG;CAC7C,MAAM,SAAS,UAAU;CACzB,MAAM,KAAK,IAAI,YAAY,MAAM;CAEjC,MAAM,CAAC,MAAM,SAAS,IAAI,OAAO,KAAK,UAAU,qBAAqB,EAAE,QAAQ,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC;CAClG,MAAM,aAAa,MAAM,4BAA4B,IAAI,QAAQ,EAAE,CAAC;CACpE,MAAM,cACJ,cACA,iBAAiB,YAAY,OAAO,OAAO,OAAO,SAAS,UAAU,MAAM,OAAO,IAAI,EACpF,SAAS,IAAI,QACf,CAAC;CAEH,MAAM,CAAC,SAAS,cAAc,mBAAmB,IAAI,WAAW,EAAE;CAClE,MAAM,sBAAsB,aACzB,UAAyC,WAAW,MAAM,OAAO,KAAK,GACvE,CAAC,UAAU,CACb;CAEA,MAAM,oBAAoB,kBAAkB;EAC1C,IAAI,IACF,IAAI,OAAO,KAAK,OAAO;GACrB,GAAG,UAAU;EACf,CAAC;CAEL,GAAG,CAAC,IAAI,OAAO,CAAC;CAEhB,IAAI,CAAC,IACH,OAAO;CAGT,OACE,qBAAC,OAAD;EAAK,WAAU;YAAf;GACE,oBAAC,KAAK,SAAN,EAAc,OAAO,EAAE,kCAAkC,EAAI,CAAA;GAE5D,eACC,qBAAC,MAAM,MAAP,EAAA,UAAA;IACE,oBAAC,MAAM,OAAP,EAAA,UAAc,EAAE,oBAAoB,EAAe,CAAA;IACnD,oBAAC,MAAM,WAAP;KACE,UAAA;KACA,OAAO;KACP,WAAW,UAAU;MACnB,IAAI,OAAO,KAAK,OAAO;OACrB,GAAG,OAAO,MAAM,OAAO;MACzB,CAAC;KACH;IACD,CAAA;IACD,oBAAC,UAAU,YAAX,EAAsB,OAAO,YAAc,CAAA;GACjC,EAAA,CAAA;GAGd,qBAAC,MAAM,MAAP,EAAA,UAAA,CACE,oBAAC,MAAM,OAAP,EAAA,UAAc,EAAE,wBAAwB,EAAe,CAAA,GACvD,oBAAC,MAAM,WAAP;IACE,aAAa,EAAE,8BAA8B;IAC7C,OAAO;IACP,UAAU;IACV,QAAQ;GACT,CAAA,CACS,EAAA,CAAA;EACT;;AAET;AAEA,gBAAgB,cAAc;;;;AC7D9B,IAAa,sBAAsB,EAAE,aAAsC;CACzE,MAAM,EAAE,MAAM,eAAe,KAAK,QAAQ,GAAG;CAC7C,MAAM,EAAE,kBAAkB,oBAAoB;CAG9C,MAAM,CAAC,eAAe,SAFX,IAAI,YAAY,MAEI,GAAI,OAAO,KAAK,YAAY,aAAa,EAAE,QAAQ,aAAa,CAAC,CAAC;CACjG,MAAM,UAAU,IAAI,QAAQ,MAAM,CAAC,CAAC,KAAK,MAAM,EAAE,aAAa,WAAW,YAAY;CACrF,MAAM,CAAC,SAAS,cAAc,SAA6B;CAE3D,eAAe,YAAY;EACzB,MAAM,QAAQ,aAAa;EAC3B,MAAM,SAAS,SAAS;EACxB,IAAI,CAAC,SAAS,CAAC,QAAQ;GACrB,WAAW,KAAA,CAAS;GACpB;EACF;EAEA,IAAI;GAEF,MAAM,WAAW,MAAM,IADH,QAAQ,EAAE,MAAM,YAAY,MAAM,CAC/B,CAAA,CAAQ,QAAQ,wBAAwB,EAC7D,SAAS,OACX,CAAC;GACD,WAAW,SAAS,KAAK,QAAQ;EACnC,SAAS,KAAK;GACZ,IAAI,MAAM,KAAE,KAAA,GAAA;IAAA,YAAA;IAAA,GAAA;IAAA,GAAA;IAAA,GAAA,KAAA;GAAA,CAAC;GACb,WAAW,KAAA,CAAS;EACtB;CACF,GAAG,CAAC,aAAa,OAAO,CAAC;CAEzB,MAAM,yBAAyB,kBAE3B,cAAc,kBAAkB,MAAM,EACpC,QAAQ,gCACV,CAAC,GACH,CAAC,aAAa,CAChB;CAEA,MAAM,CAAC,YAAY,iBAAiB,SAAS,KAAK;CAClD,MAAM,gBAAgB,YAAY,YAAY;EAC5C,cAAc,IAAI;EAClB,MAAM,UAAU,IAAI,QAAQ,EAAE,MAAM,YAAY,MAAM,CAAC;EACvD,MAAM,SAAS,MAAM,OAAO,OAAO,KAAK;EAExC,MAAM,QAAQ,GAAG,GADA,OAAO,OAAO,SAAS,OAAO,IAAI,IAAI,kBAC1B,OAAO,EAAE,SAAS,OAAO,QAAQ,EAAE;EAEhE,IAAI;GAIF,MAAM,SAFO,IAAI,QAAQ,MACP,CAAA,CAAK,KAAK,MAAM,EAAE,aAAa,WAAW,YAC7C,CAAA,EAAW;GAC1B,IAAI,QACF,MAAM,QAAQ,QAAQ,0BAA0B;IAC9C,SAAS;IACT;GACF,CAAC;QACI;IAKL,MAAM,UAAS,MAJQ,QAAQ,QAAQ,eAAe;KACpD,QAAQ;KACR;IACF,CAAC,EAAA,CACuB,KAAK;IAC7B,IAAI,QACF,IAAI,OAAO,SAAS,WAAW;KAC7B,IAAI,QAAQ,MAAM,CAAC,CAAC,KAAK,KAAK;MAAE,QAAQ;MAAc,IAAI;KAAO,CAAC;IACpE,CAAC;GAEL;EACF,UAAU;GACR,cAAc,KAAK;EACrB;CACF,GAAG,CAAC,QAAQ,WAAW,CAAC;CAExB,OACE,qBAAC,OAAD;EAAK,WAAU;YAAf;GACE,oBAAC,KAAK,SAAN;IAAc,OAAO,EAAE,+BAA+B;IAAG,aAAa,EAAE,qCAAqC;GAAI,CAAA;GAEhH,CAAC,eACA,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,oBAAC,QAAQ,MAAT;KAAc,SAAQ;eACpB,oBAAC,QAAQ,OAAT,EAAA,UAAgB,EAAE,uBAAuB,EAAiB,CAAA;IAC9C,CAAA,GACd,oBAAC,OAAD;KAAK,WAAU;eACb,oBAAC,QAAD;MAAQ,SAAS;gBAAyB,EAAE,0BAA0B;KAAU,CAAA;IAC7E,CAAA,CACF;;GAGN,eACC,qBAAC,OAAD;IAAK,WAAU;cAAf,CACG,WAAW,oBAAC,UAAU,YAAX,EAAsB,OAAO,QAAU,CAAA,GACnD,oBAAC,QAAD;KAAQ,UAAU;KAAY,SAAS;eACpC,EAAE,eAAe;IACZ,CAAA,CACL;;EAEJ;;AAET;AAEA,mBAAmB,cAAc;;;ACtGjC,IAAa,eAAe,EAAE,aAA+B;CAC3D,MAAM,EAAE,MAAM,eAAe,KAAK,QAAQ,GAAG;CAC7C,MAAM,KAAK,IAAI,YAAY,MAAM;CACjC,MAAM,CAAC,MAAM,SAAS,IAAI,OAAO,KAAK,UAAU,qBAAqB,EAAE,QAAQ,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC;CAClG,MAAM,SAAS,SAAS,IAAI,OAAO,KAAK,MAAM,KAAK,CAAC;CAEpD,MAAM,CAAC,UAAU,eAAe,SAAS,KAAK;CAE9C,MAAM,CAAC,cAAc,mBAAmB,SAAiB,2BAA2B,OAAO,QAAQ,SAAS,GAAG;CAC/G,MAAM,WAAW,kBAAkB,SAAS,OAAO,QAAQ,QAAQ;CACnE,MAAM,gBAAgB,OAAO,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC,CAAC,QAAQ,QAAQ;CAC1E,MAAM,QAAQ,KAAK,IAAI,QAAQ,EAAE,CAAC,CAAC,MAAM,KAAA;CAEzC,eAAe,YAAY;EACzB,IAAI,CAAC,eACH;EAGF,MAAM,SAAS,MAAM,cAAc,aAAa,OAAO,KAAK;EAC5D,gBAAgB,OAAO,WAAW,EAAE;CACtC,GAAG,CAAC,aAAa,CAAC;CAElB,MAAM,aAAa,YAAY,YAAY;EACzC,IAAI,CAAC,IACH;EAGF,YAAY,IAAI;EAChB,IAAI;GACF,IAAI,eAAe;IACjB,MAAM,OAAO,MAAM,cAAc,aAAa,OAAO,KAAK;IAC1D,IAAI,OAAO,OAAO,SAAS;KACzB,KAAK,UAAU;IACjB,CAAC;IAED,IAAI,OAAO;KACT,MAAM,SAAS,OAAO,KAAK,KAAK;KAChC,IAAI,CAAC,cAAc,OAAO,SAAS,MAAM,GACvC,IAAI,OAAO,gBAAgB,kBAAkB;MAC3C,cAAc,QAAQ,CAAC,GAAI,cAAc,SAAS,CAAC,GAAI,MAAM;KAC/D,CAAC;IAEL;GACF,OAAO,IAAI,OACT,GAAG,IACD,MAAM,KAAK;IACT,KAAK;IACL,MAAM,OAAO,QAAQ;IACrB,cAAc,SAAS,KAAK,EAAE,QAAQ,aAAa,CAAC;IACpD,OAAO,CAAC,OAAO,KAAK,KAAK,CAAC;GAC5B,CAAC,CACH;GAEF,MAAM,GAAG,MAAM;EACjB,UAAU;GACR,YAAY,KAAK;EACnB;CACF,GAAG;EAAC;EAAI;EAAe;EAAO;EAAU,OAAO;EAAM;CAAY,CAAC;CAElE,OACE,qBAAC,OAAD;EAAK,WAAU;YAAf;GACE,oBAAC,KAAK,SAAN;IAAc,OAAO,EAAE,oBAAoB;IAAG,aAAa,EAAE,0BAA0B;GAAI,CAAA;GAE3F,qBAAC,MAAM,MAAP,EAAA,UAAA,CACE,oBAAC,MAAM,OAAP,EAAA,UAAc,EAAE,0BAA0B,EAAe,CAAA,GACzD,oBAAC,MAAM,UAAP;IACE,aAAa,EAAE,gCAAgC;IAC/C,MAAM;IACN,OAAO;IACP,WAAW,UAAU,gBAAgB,MAAM,OAAO,KAAK;IACvD,YAAW;GACZ,CAAA,CACS,EAAA,CAAA;GAEZ,oBAAC,OAAD;IAAK,WAAU;cACb,oBAAC,QAAD;KAAQ,UAAW,CAAC,iBAAiB,CAAC,SAAU;KAAU,SAAS;eAChE,EAAE,gBAAgB,uBAAuB,oBAAoB;IACxD,CAAA;GACL,CAAA;EACF;;AAET;AAEA,YAAY,cAAc;;;ACvF1B,IAAa,oBAAoB,EAAE,SAAS,aAAoC;CAC9E,OACE,qBAAA,UAAA,EAAA,UAAA;EACE,oBAAC,KAAK,SAAN,EAAA,UACE,oBAAC,iBAAD,EAAyB,OAAS,CAAA,EACtB,CAAA;EACd,oBAAC,KAAK,SAAN,EAAA,UACE,oBAAC,aAAD,EAAqB,OAAS,CAAA,EAClB,CAAA;EACd,oBAAC,KAAK,SAAN,EAAA,UACE,oBAAC,oBAAD,EAA4B,OAAS,CAAA,EACzB,CAAA;CACd,EAAA,CAAA;AAEN;AAEA,iBAAiB,cAAc"}
1
+ {"version":3,"file":"chunk-ScriptProperties.mjs","names":[],"sources":["../../src/containers/ScriptProperties/FunctionBinding.tsx","../../src/containers/ScriptProperties/FunctionPublishing.tsx","../../src/containers/ScriptProperties/SkillEditor.tsx","../../src/containers/ScriptProperties/ScriptProperties.tsx"],"sourcesContent":["//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { type ChangeEvent, useCallback } from 'react';\n\nimport { getUserFunctionIdInMetadata } from '@dxos/compute-runtime';\nimport { getInvocationUrl } from '@dxos/compute-runtime';\nimport * as Operation from '@dxos/compute/Operation';\nimport type * as Script from '@dxos/compute/Script';\nimport { Filter, Obj, Ref } from '@dxos/echo';\nimport { useQuery } from '@dxos/echo-react';\nimport { useClient } from '@dxos/react-client';\nimport { Clipboard, Flex, Input, useControlledState, useTranslation } from '@dxos/react-ui';\nimport { Form } from '@dxos/react-ui-form';\n\nimport { meta } from '#meta';\n\nexport type FunctionBindingProps = { object: Script.Script };\n\nexport const FunctionBinding = ({ object }: FunctionBindingProps) => {\n const { t } = useTranslation(meta.profile.key);\n const client = useClient();\n const db = Obj.getDatabase(object);\n\n const [fn] = useQuery(db, Filter.type(Operation.PersistentOperation, { source: Ref.make(object) }));\n const functionId = fn && getUserFunctionIdInMetadata(Obj.getMeta(fn));\n const functionUrl =\n functionId &&\n getInvocationUrl(functionId, client.config.values.runtime?.services?.edge?.url ?? '', {\n spaceId: db?.spaceId,\n });\n\n const [binding, setBinding] = useControlledState(fn?.binding ?? '');\n const handleBindingChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => setBinding(event.target.value),\n [setBinding],\n );\n\n const handleBindingBlur = useCallback(() => {\n if (fn) {\n Obj.update(fn, (fn) => {\n fn.binding = binding;\n });\n }\n }, [fn, binding]);\n\n if (!fn) {\n return null;\n }\n\n return (\n <Flex column>\n <Form.Section title={t('remote-function-settings.heading')} />\n\n {functionUrl && (\n <Input.Root>\n <Input.Label>{t('function-url.label')}</Input.Label>\n <Input.TextInput\n disabled\n value={functionUrl}\n onChange={(event) => {\n Obj.update(fn, (fn) => {\n fn.name = event.target.value;\n });\n }}\n />\n <Clipboard.IconButton value={functionUrl} />\n </Input.Root>\n )}\n\n <Input.Root>\n <Input.Label>{t('function-binding.label')}</Input.Label>\n <Input.TextInput\n placeholder={t('function-binding.placeholder')}\n value={binding}\n onChange={handleBindingChange}\n onBlur={handleBindingBlur}\n />\n </Input.Root>\n </Flex>\n );\n};\n\nFunctionBinding.displayName = 'FunctionBinding';\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport { Octokit } from '@octokit/core';\nimport React, { useCallback, useState } from 'react';\n\nimport { useOperationInvoker } from '@dxos/app-framework/ui';\nimport * as SettingsOperation from '@dxos/app-toolkit/SettingsOperation';\nimport type * as Script from '@dxos/compute/Script';\nimport { Filter, Obj } from '@dxos/echo';\nimport { useQuery } from '@dxos/echo-react';\nimport { AccessToken } from '@dxos/link';\nimport { log } from '@dxos/log';\nimport { Banner, Button, Clipboard, Flex, useAsyncEffect, useTranslation } from '@dxos/react-ui';\nimport { Form } from '@dxos/react-ui-form';\nimport { kebabize } from '@dxos/util';\n\nimport { meta } from '#meta';\n\nexport type FunctionPublishingProps = { object: Script.Script };\n\n// TODO(burdon): Move to separate tab?\nexport const FunctionPublishing = ({ object }: FunctionPublishingProps) => {\n const { t } = useTranslation(meta.profile.key);\n const { invokePromise } = useOperationInvoker();\n const db = Obj.getDatabase(object);\n\n const [githubToken] = useQuery(db, Filter.type(AccessToken.AccessToken, { source: 'github.com' }));\n const gistKey = Obj.getMeta(object).keys.find(({ source }) => source === 'github.com');\n const [gistUrl, setGistUrl] = useState<string | undefined>();\n\n useAsyncEffect(async () => {\n const token = githubToken?.token;\n const gistId = gistKey?.id;\n if (!token || !gistId) {\n setGistUrl(undefined);\n return;\n }\n\n try {\n const octokit = new Octokit({ auth: githubToken.token });\n const response = await octokit.request('GET /gists/{gist_id}', {\n gist_id: gistId,\n });\n setGistUrl(response.data.html_url);\n } catch (err) {\n log.catch(err);\n setGistUrl(undefined);\n }\n }, [githubToken, gistKey]);\n\n const handleOpenTokenManager = useCallback(\n () =>\n invokePromise(SettingsOperation.Open, {\n plugin: 'org.dxos.plugin.token-manager',\n }),\n [invokePromise],\n );\n\n const [publishing, setPublishing] = useState(false);\n const handlePublish = useCallback(async () => {\n setPublishing(true);\n const octokit = new Octokit({ auth: githubToken.token });\n const source = await object.source.load();\n const filename = object.name ? kebabize(object.name) : 'composer-script';\n const files = { [`${filename}.ts`]: { content: source.content } };\n\n try {\n // TODO(wittjosiah): Factor out to intent.\n const meta = Obj.getMeta(object);\n const githubKey = meta.keys.find(({ source }) => source === 'github.com');\n const gistId = githubKey?.id;\n if (gistId) {\n await octokit.request('PATCH /gists/{gist_id}', {\n gist_id: gistId,\n files,\n });\n } else {\n const response = await octokit.request('POST /gists', {\n public: true,\n files,\n });\n const gistId = response.data.id;\n if (gistId) {\n Obj.update(object, (object) => {\n Obj.getMeta(object).keys.push({ source: 'github.com', id: gistId });\n });\n }\n }\n } finally {\n setPublishing(false);\n }\n }, [object, githubToken]);\n\n return (\n <Flex column>\n <Form.Section title={t('script-publish-settings.label')} description={t('script-publish-settings.description')} />\n\n {!githubToken && (\n <Flex column classNames='py-form-gap'>\n <Banner.Root valence='info'>\n <Banner.Content>\n <Banner.Title>{t('no-github-token.label')}</Banner.Title>\n </Banner.Content>\n </Banner.Root>\n <Flex classNames='pt-form-gap'>\n <Button onClick={handleOpenTokenManager}>{t('open-token-manager.label')}</Button>\n </Flex>\n </Flex>\n )}\n\n {githubToken && (\n <Flex gap='sm' justify='end'>\n {gistUrl && <Clipboard.IconButton value={gistUrl} />}\n <Button disabled={publishing} onClick={handlePublish}>\n {t('publish.label')}\n </Button>\n </Flex>\n )}\n </Flex>\n );\n};\n\nFunctionPublishing.displayName = 'FunctionPublishing';\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useCallback, useState } from 'react';\n\nimport { ToolId } from '@dxos/ai';\nimport * as Operation from '@dxos/compute/Operation';\nimport type * as Script from '@dxos/compute/Script';\nimport * as Skill from '@dxos/compute/Skill';\nimport * as Template from '@dxos/compute/Template';\nimport { Filter, Obj, Ref } from '@dxos/echo';\nimport { useQuery } from '@dxos/echo-react';\nimport { Button, Flex, Input, useAsyncEffect, useTranslation } from '@dxos/react-ui';\nimport { Form } from '@dxos/react-ui-form';\nimport { kebabize } from '@dxos/util';\n\nimport { meta } from '#meta';\n\nexport type SkillEditorProps = { object: Script.Script };\n\nexport const SkillEditor = ({ object }: SkillEditorProps) => {\n const { t } = useTranslation(meta.profile.key);\n const db = Obj.getDatabase(object);\n const [fn] = useQuery(db, Filter.type(Operation.PersistentOperation, { source: Ref.make(object) }));\n const skills = useQuery(db, Filter.type(Skill.Skill));\n\n const [creating, setCreating] = useState(false);\n // TODO(burdon): Remove?\n const [instructions, setInstructions] = useState<string>(`You can run the script \"${object.name ?? 'script'}\".`);\n const skillKey = `org.dxos.skill.${kebabize(object.name ?? 'script')}`;\n const existingSkill = skills.find((bp) => Obj.getMeta(bp).key === skillKey);\n const fnKey = fn ? Obj.getMeta(fn).key : undefined;\n\n useAsyncEffect(async () => {\n if (!existingSkill) {\n return;\n }\n\n const source = await existingSkill.instructions.source.load();\n setInstructions(source.content ?? '');\n }, [existingSkill]);\n\n const handleSave = useCallback(async () => {\n if (!db) {\n return;\n }\n\n setCreating(true);\n try {\n if (existingSkill) {\n const text = await existingSkill.instructions.source.load();\n Obj.update(text, (text) => {\n text.content = instructions;\n });\n\n if (fnKey) {\n const toolId = ToolId.make(fnKey);\n if (!existingSkill.tools?.includes(toolId)) {\n Obj.update(existingSkill, (existingSkill) => {\n existingSkill.tools = [...(existingSkill.tools ?? []), toolId];\n });\n }\n }\n } else if (fnKey) {\n db.add(\n Skill.make({\n key: skillKey,\n name: object.name ?? 'Script',\n instructions: Template.make({ source: instructions }),\n tools: [ToolId.make(fnKey)],\n }),\n );\n }\n await db.flush();\n } finally {\n setCreating(false);\n }\n }, [db, existingSkill, fnKey, skillKey, object.name, instructions]);\n\n return (\n <Flex column>\n <Form.Section title={t('skill-editor.label')} description={t('skill-editor.description')} />\n\n <Input.Root>\n <Input.Label>{t('skill-instructions.label')}</Input.Label>\n <Input.TextArea\n placeholder={t('skill-instructions.placeholder')}\n rows={6}\n value={instructions}\n onChange={(event) => setInstructions(event.target.value)}\n classNames='resize-y'\n />\n </Input.Root>\n\n <div className='pt-2'>\n <Button disabled={(!existingSkill && !fnKey) || creating} onClick={handleSave}>\n {t(existingSkill ? 'update-skill.label' : 'create-skill.label')}\n </Button>\n </div>\n </Flex>\n );\n};\n\nSkillEditor.displayName = 'SkillEditor';\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type AppSurface } from '@dxos/app-toolkit/ui';\nimport type * as Script from '@dxos/compute/Script';\nimport { Form } from '@dxos/react-ui-form';\n\nimport { FunctionBinding } from './FunctionBinding';\nimport { FunctionPublishing } from './FunctionPublishing';\nimport { SkillEditor } from './SkillEditor';\n\nexport type ScriptPropertiesProps = AppSurface.ObjectPropertiesProps<Script.Script>;\n\nexport const ScriptProperties = ({ subject: object }: ScriptPropertiesProps) => {\n return (\n <>\n <Form.Section>\n <FunctionBinding object={object} />\n </Form.Section>\n <Form.Section>\n <SkillEditor object={object} />\n </Form.Section>\n <Form.Section>\n <FunctionPublishing object={object} />\n </Form.Section>\n </>\n );\n};\n\nScriptProperties.displayName = 'ScriptProperties';\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { meta } from "#meta";
2
1
  import { Settings } from "#types";
2
+ import { meta } from "#meta";
3
3
  import "react";
4
4
  import { Button, useTranslation } from "@dxos/react-ui";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -1 +1 @@
1
- {"version":3,"file":"chunk-ScriptSettings.mjs","names":[],"sources":["../../src/containers/ScriptSettings/ScriptSettings.tsx"],"sourcesContent":["//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type AppSurface } from '@dxos/app-toolkit/ui';\nimport { Button, useTranslation } from '@dxos/react-ui';\nimport { Form } from '@dxos/react-ui-form';\n\nimport { meta } from '#meta';\nimport { Settings } from '#types';\n\nexport type ScriptSettingsProps = AppSurface.SettingsProps<\n Settings.Settings,\n {\n onAuthenticate?: () => void;\n }\n>;\n\nexport const ScriptSettings = ({ settings, onSettingsChange, onAuthenticate }: ScriptSettingsProps) => {\n const { t } = useTranslation(meta.profile.key);\n\n return (\n <Form.Root\n schema={Settings.Settings}\n values={settings}\n variant='settings'\n readonly={!onSettingsChange}\n onValuesChanged={(values) => onSettingsChange?.((current) => ({ ...current, ...values }))}\n >\n <Form.Viewport scroll>\n <Form.Content>\n <Form.Section title={meta.profile.name ?? meta.profile.key}>\n {/* TODO(wittjosiah): Hide outside of dev environments. */}\n <Form.Row label={t('authenticate-action.label')} description={t('authenticate-action.description')}>\n <Button disabled={!onSettingsChange} onClick={onAuthenticate}>\n {t('authenticate-button.label')}\n </Button>\n </Form.Row>\n <Form.FieldSet />\n </Form.Section>\n </Form.Content>\n </Form.Viewport>\n </Form.Root>\n );\n};\n\nScriptSettings.displayName = 'ScriptSettings';\n"],"mappings":";;;;;;;AAoBA,IAAa,kBAAkB,EAAE,UAAU,kBAAkB,qBAA0C;CACrG,MAAM,EAAE,MAAM,eAAe,KAAK,QAAQ,GAAG;CAE7C,OACE,oBAAC,KAAK,MAAN;EACE,QAAQ,SAAS;EACjB,QAAQ;EACR,SAAQ;EACR,UAAU,CAAC;EACX,kBAAkB,WAAW,oBAAoB,aAAa;GAAE,GAAG;GAAS,GAAG;EAAO,EAAE;YAExF,oBAAC,KAAK,UAAN;GAAe,QAAA;aACb,oBAAC,KAAK,SAAN,EAAA,UACE,qBAAC,KAAK,SAAN;IAAc,OAAO,KAAK,QAAQ,QAAQ,KAAK,QAAQ;cAAvD,CAEE,oBAAC,KAAK,KAAN;KAAU,OAAO,EAAE,2BAA2B;KAAG,aAAa,EAAE,iCAAiC;eAC/F,oBAAC,QAAD;MAAQ,UAAU,CAAC;MAAkB,SAAS;gBAC3C,EAAE,2BAA2B;KACxB,CAAA;IACA,CAAA,GACV,oBAAC,KAAK,UAAN,CAAgB,CAAA,CACJ;MACF,CAAA;EACD,CAAA;CACN,CAAA;AAEf;AAEA,eAAe,cAAc"}
1
+ {"version":3,"file":"chunk-ScriptSettings.mjs","names":[],"sources":["../../src/containers/ScriptSettings/ScriptSettings.tsx"],"sourcesContent":["//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type AppSurface } from '@dxos/app-toolkit/ui';\nimport { Button, useTranslation } from '@dxos/react-ui';\nimport { Form } from '@dxos/react-ui-form';\n\nimport { meta } from '#meta';\nimport { Settings } from '#types';\n\nexport type ScriptSettingsProps = AppSurface.SettingsProps<\n Settings.Settings,\n {\n onAuthenticate?: () => void;\n }\n>;\n\nexport const ScriptSettings = ({ settings, onSettingsChange, onAuthenticate }: ScriptSettingsProps) => {\n const { t } = useTranslation(meta.profile.key);\n\n return (\n <Form.Root\n schema={Settings.Settings}\n values={settings}\n variant='settings'\n readonly={!onSettingsChange}\n onValuesChanged={(values) => onSettingsChange?.((current) => ({ ...current, ...values }))}\n >\n <Form.Viewport scroll>\n <Form.Content>\n <Form.Section title={meta.profile.name ?? meta.profile.key}>\n {/* TODO(wittjosiah): Hide outside of dev environments. */}\n <Form.Row label={t('authenticate-action.label')} description={t('authenticate-action.description')}>\n <Button disabled={!onSettingsChange} onClick={onAuthenticate}>\n {t('authenticate-button.label')}\n </Button>\n </Form.Row>\n <Form.FieldSet />\n </Form.Section>\n </Form.Content>\n </Form.Viewport>\n </Form.Root>\n );\n};\n\nScriptSettings.displayName = 'ScriptSettings';\n"],"mappings":";;;;;;;AAoBA,IAAa,kBAAkB,EAAE,UAAU,kBAAkB,qBAA0C;CACrG,MAAM,EAAE,MAAM,eAAe,KAAK,QAAQ,GAAG;CAE7C,OACE,oBAAC,KAAK,MAAN;EACE,QAAQ,SAAS;EACjB,QAAQ;EACR,SAAQ;EACR,UAAU,CAAC;EACX,kBAAkB,WAAW,oBAAoB,aAAa;GAAE,GAAG;GAAS,GAAG;EAAO,EAAE;EAExF,UAAA,oBAAC,KAAK,UAAN;GAAe,QAAA;GACb,UAAA,oBAAC,KAAK,SAAN,EAAA,UACE,qBAAC,KAAK,SAAN;IAAc,OAAO,KAAK,QAAQ,QAAQ,KAAK,QAAQ;IAAvD,UAAA,CAEE,oBAAC,KAAK,KAAN;KAAU,OAAO,EAAE,2BAA2B;KAAG,aAAa,EAAE,iCAAiC;KAC/F,UAAA,oBAAC,QAAD;MAAQ,UAAU,CAAC;MAAkB,SAAS;MAC3C,UAAA,EAAE,2BAA2B;KACxB,CAAA;IACA,CAAA,GACV,oBAAC,KAAK,UAAN,CAAgB,CAAA,CACJ;GACF,CAAA,EAAA,CAAA;EACD,CAAA;CACN,CAAA;AAEf;AAEA,eAAe,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"chunk-TestContainer.mjs","names":[],"sources":["../../src/containers/TestContainer/TestContainer.tsx"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useMemo } from 'react';\n\nimport { type Script } from '@dxos/compute';\nimport { Context } from '@dxos/context';\nimport { Obj } from '@dxos/echo';\nimport { FunctionsServiceClient } from '@dxos/edge-compute';\nimport { Panel } from '@dxos/react-ui';\n\nimport { TestPanel } from '#components';\nimport { useDeployDeps } from '#hooks';\n\nexport type TestContainerProps = {\n role: string;\n script: Script.Script;\n};\n\nexport const TestContainer = ({ role, script }: TestContainerProps) => {\n const { client, fn, existingFunctionId } = useDeployDeps({ script });\n const spaceId = Obj.getDatabase(script)?.spaceId;\n\n const functionsClient = useMemo(() => FunctionsServiceClient.fromClient(client), [client]);\n\n const handleInvoke = useCallback(\n async (input: unknown) => {\n if (!fn) {\n throw new Error('Function not deployed');\n }\n return functionsClient.invoke(Context.default(), fn, input, { spaceId });\n },\n [fn, functionsClient, spaceId],\n );\n\n return (\n <Panel.Root role={role} classNames='dx-document'>\n <Panel.Content asChild>\n <TestPanel onInvoke={existingFunctionId ? handleInvoke : undefined} />\n </Panel.Content>\n </Panel.Root>\n );\n};\n\nTestContainer.displayName = 'TestContainer';\n"],"mappings":";;;;;;;;;;AAoBA,IAAa,iBAAiB,EAAE,MAAM,aAAiC;CACrE,MAAM,EAAE,QAAQ,IAAI,uBAAuB,cAAc,EAAE,OAAO,CAAC;CACnE,MAAM,UAAU,IAAI,YAAY,MAAM,CAAC,EAAE;CAEzC,MAAM,kBAAkB,cAAc,uBAAuB,WAAW,MAAM,GAAG,CAAC,MAAM,CAAC;CAEzF,MAAM,eAAe,YACnB,OAAO,UAAmB;EACxB,IAAI,CAAC,IACH,MAAM,IAAI,MAAM,uBAAuB;EAEzC,OAAO,gBAAgB,OAAO,QAAQ,QAAO,KAAA,GAAA;GAAA,YAAA;GAAA,GAAA;GAAA,GAAA;EAAA,CAAC,GAAG,IAAI,OAAO,EAAE,QAAQ,CAAC;CACzE,GACA;EAAC;EAAI;EAAiB;CAAO,CAC/B;CAEA,OACE,oBAAC,MAAM,MAAP;EAAkB;EAAM,YAAW;YACjC,oBAAC,MAAM,SAAP;GAAe,SAAA;aACb,oBAAC,WAAD,EAAW,UAAU,qBAAqB,eAAe,KAAA,EAAY,CAAA;EACxD,CAAA;CACL,CAAA;AAEhB;AAEA,cAAc,cAAc"}
1
+ {"version":3,"file":"chunk-TestContainer.mjs","names":[],"sources":["../../src/containers/TestContainer/TestContainer.tsx"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useMemo } from 'react';\n\nimport type * as Script from '@dxos/compute/Script';\nimport { Context } from '@dxos/context';\nimport { Obj } from '@dxos/echo';\nimport { FunctionsServiceClient } from '@dxos/edge-compute';\nimport { Panel } from '@dxos/react-ui';\n\nimport { TestPanel } from '#components';\nimport { useDeployDeps } from '#hooks';\n\nexport type TestContainerProps = {\n role: string;\n script: Script.Script;\n};\n\nexport const TestContainer = ({ role, script }: TestContainerProps) => {\n const { client, fn, existingFunctionId } = useDeployDeps({ script });\n const spaceId = Obj.getDatabase(script)?.spaceId;\n\n const functionsClient = useMemo(() => FunctionsServiceClient.fromClient(client), [client]);\n\n const handleInvoke = useCallback(\n async (input: unknown) => {\n if (!fn) {\n throw new Error('Function not deployed');\n }\n return functionsClient.invoke(Context.default(), fn, input, { spaceId });\n },\n [fn, functionsClient, spaceId],\n );\n\n return (\n <Panel.Root role={role} classNames='dx-document'>\n <Panel.Content asChild>\n <TestPanel onInvoke={existingFunctionId ? handleInvoke : undefined} />\n </Panel.Content>\n </Panel.Root>\n );\n};\n\nTestContainer.displayName = 'TestContainer';\n"],"mappings":";;;;;;;;;;AAoBA,IAAa,iBAAiB,EAAE,MAAM,aAAiC;CACrE,MAAM,EAAE,QAAQ,IAAI,uBAAuB,cAAc,EAAE,OAAO,CAAC;CACnE,MAAM,UAAU,IAAI,YAAY,MAAM,CAAC,EAAE;CAEzC,MAAM,kBAAkB,cAAc,uBAAuB,WAAW,MAAM,GAAG,CAAC,MAAM,CAAC;CAEzF,MAAM,eAAe,YACnB,OAAO,UAAmB;EACxB,IAAI,CAAC,IACH,MAAM,IAAI,MAAM,uBAAuB;EAEzC,OAAO,gBAAgB,OAAO,QAAQ,QAAO,KAAA,GAAA;GAAA,YAAA;GAAA,GAAA;GAAA,GAAA;EAAA,CAAC,GAAG,IAAI,OAAO,EAAE,QAAQ,CAAC;CACzE,GACA;EAAC;EAAI;EAAiB;CAAO,CAC/B;CAEA,OACE,oBAAC,MAAM,MAAP;EAAkB;EAAM,YAAW;EACjC,UAAA,oBAAC,MAAM,SAAP;GAAe,SAAA;GACb,UAAA,oBAAC,WAAD,EAAW,UAAU,qBAAqB,eAAe,KAAA,EAAY,CAAA;EACxD,CAAA;CACL,CAAA;AAEhB;AAEA,cAAc,cAAc"}