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

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 (233) hide show
  1. package/dist/lib/browser/DeploymentDialog-QZSTVNIS.mjs +12 -0
  2. package/dist/lib/browser/{ScriptContainer-RSN52NH7.mjs → ScriptContainer-DNNA6XC6.mjs} +20 -16
  3. package/dist/lib/browser/ScriptContainer-DNNA6XC6.mjs.map +7 -0
  4. package/dist/lib/browser/{app-graph-builder-5Z3MUX4N.mjs → app-graph-builder-IABOSTBK.mjs} +4 -4
  5. package/dist/lib/{node-esm/app-graph-builder-IOOUTHV2.mjs.map → browser/app-graph-builder-IABOSTBK.mjs.map} +3 -3
  6. package/dist/lib/browser/blueprint-definition-AR7ITBCD.mjs +28 -0
  7. package/dist/lib/browser/blueprint-definition-AR7ITBCD.mjs.map +7 -0
  8. package/dist/lib/browser/{chunk-YSQMXTYO.mjs → chunk-5TVBECWH.mjs} +3 -3
  9. package/dist/lib/browser/chunk-6CAH7VIE.mjs +283 -0
  10. package/dist/lib/browser/chunk-6CAH7VIE.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-3JLR2SHJ.mjs → chunk-GZKWMME3.mjs} +52 -53
  12. package/dist/lib/browser/chunk-GZKWMME3.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-WB3X5Z7Q.mjs → chunk-IS4OG2UW.mjs} +5 -6
  14. package/dist/lib/browser/chunk-IS4OG2UW.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-QJH7I2UV.mjs → chunk-NXKU3BNX.mjs} +40 -51
  16. package/dist/lib/browser/chunk-NXKU3BNX.mjs.map +7 -0
  17. package/dist/lib/browser/{chunk-6ZHHWU6S.mjs → chunk-QYAREHGH.mjs} +2 -2
  18. package/dist/lib/browser/chunk-RNGIQIEJ.mjs +88 -0
  19. package/dist/lib/browser/chunk-RNGIQIEJ.mjs.map +7 -0
  20. package/dist/lib/browser/{chunk-LA66DQGU.mjs → chunk-YCZPTTFO.mjs} +6 -6
  21. package/dist/lib/browser/chunk-YCZPTTFO.mjs.map +7 -0
  22. package/dist/lib/browser/{compiler-W4BYJYTL.mjs → compiler-2HJH34GM.mjs} +26 -10
  23. package/dist/lib/browser/compiler-2HJH34GM.mjs.map +7 -0
  24. package/dist/lib/browser/index.mjs +34 -31
  25. package/dist/lib/browser/index.mjs.map +3 -3
  26. package/dist/lib/browser/{intent-resolver-JOJNH4UX.mjs → intent-resolver-F4YSRPJI.mjs} +11 -12
  27. package/dist/lib/browser/intent-resolver-F4YSRPJI.mjs.map +7 -0
  28. package/dist/lib/browser/meta.json +1 -1
  29. package/dist/lib/browser/{react-surface-7BKUWL2U.mjs → react-surface-BBHFU6MI.mjs} +13 -14
  30. package/dist/lib/browser/react-surface-BBHFU6MI.mjs.map +7 -0
  31. package/dist/lib/browser/{settings-Z22D6JVJ.mjs → settings-KCTBK5TY.mjs} +4 -4
  32. package/dist/lib/browser/templates/index.mjs +9 -0
  33. package/dist/lib/browser/types/index.mjs +10 -0
  34. package/dist/lib/node-esm/{DeploymentDialog-IA4CH6WZ.mjs → DeploymentDialog-G6EHEPXN.mjs} +5 -5
  35. package/dist/lib/node-esm/{ScriptContainer-4IOOIPBF.mjs → ScriptContainer-KPYZN2KY.mjs} +20 -16
  36. package/dist/lib/node-esm/ScriptContainer-KPYZN2KY.mjs.map +7 -0
  37. package/dist/lib/node-esm/{app-graph-builder-IOOUTHV2.mjs → app-graph-builder-CQTTAYHP.mjs} +4 -4
  38. package/dist/lib/{browser/app-graph-builder-5Z3MUX4N.mjs.map → node-esm/app-graph-builder-CQTTAYHP.mjs.map} +3 -3
  39. package/dist/lib/node-esm/blueprint-definition-TJY4TX6S.mjs +30 -0
  40. package/dist/lib/node-esm/blueprint-definition-TJY4TX6S.mjs.map +7 -0
  41. package/dist/lib/node-esm/chunk-2GBESIHU.mjs +284 -0
  42. package/dist/lib/node-esm/chunk-2GBESIHU.mjs.map +7 -0
  43. package/dist/lib/node-esm/{chunk-2KJYPUQD.mjs → chunk-35M3CHYE.mjs} +3 -3
  44. package/dist/lib/node-esm/{chunk-AEB5TPEW.mjs → chunk-AHXJ6NQU.mjs} +2 -2
  45. package/dist/lib/node-esm/chunk-GWHLP5LM.mjs +90 -0
  46. package/dist/lib/node-esm/chunk-GWHLP5LM.mjs.map +7 -0
  47. package/dist/lib/node-esm/{chunk-B4TP3LSZ.mjs → chunk-HUHVIOL5.mjs} +52 -53
  48. package/dist/lib/node-esm/chunk-HUHVIOL5.mjs.map +7 -0
  49. package/dist/lib/node-esm/{chunk-UESZKXLR.mjs → chunk-JIPFLBYA.mjs} +5 -6
  50. package/dist/lib/node-esm/chunk-JIPFLBYA.mjs.map +7 -0
  51. package/dist/lib/node-esm/{chunk-MJJQBUOL.mjs → chunk-M642JUOZ.mjs} +40 -51
  52. package/dist/lib/node-esm/chunk-M642JUOZ.mjs.map +7 -0
  53. package/dist/lib/node-esm/{chunk-T7XDCUTF.mjs → chunk-ZA36GO4T.mjs} +6 -6
  54. package/dist/lib/node-esm/chunk-ZA36GO4T.mjs.map +7 -0
  55. package/dist/lib/node-esm/{compiler-7PQ4D43R.mjs → compiler-7SP27RA6.mjs} +26 -10
  56. package/dist/lib/node-esm/compiler-7SP27RA6.mjs.map +7 -0
  57. package/dist/lib/node-esm/index.mjs +34 -31
  58. package/dist/lib/node-esm/index.mjs.map +3 -3
  59. package/dist/lib/node-esm/{intent-resolver-HTM5PSRZ.mjs → intent-resolver-CGQYRWWD.mjs} +11 -12
  60. package/dist/lib/{browser/intent-resolver-JOJNH4UX.mjs.map → node-esm/intent-resolver-CGQYRWWD.mjs.map} +3 -3
  61. package/dist/lib/node-esm/meta.json +1 -1
  62. package/dist/lib/node-esm/{react-surface-6UO64YOS.mjs → react-surface-UWIWPKZD.mjs} +13 -14
  63. package/dist/lib/node-esm/react-surface-UWIWPKZD.mjs.map +7 -0
  64. package/dist/lib/node-esm/{settings-KZEGCDYX.mjs → settings-DXZ334A3.mjs} +4 -4
  65. package/dist/lib/node-esm/templates/index.mjs +10 -0
  66. package/dist/lib/node-esm/templates/index.mjs.map +7 -0
  67. package/dist/lib/node-esm/{types.mjs → types/index.mjs} +3 -6
  68. package/dist/lib/node-esm/types/index.mjs.map +7 -0
  69. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
  70. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  71. package/dist/types/src/capabilities/artifact-definition.d.ts +1 -1
  72. package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
  73. package/dist/types/src/capabilities/blueprint-definition.d.ts +5 -0
  74. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
  75. package/dist/types/src/capabilities/compiler.d.ts +1 -1
  76. package/dist/types/src/capabilities/compiler.d.ts.map +1 -1
  77. package/dist/types/src/capabilities/index.d.ts +6 -6
  78. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  79. package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
  80. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  81. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  82. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  83. package/dist/types/src/capabilities/settings.d.ts +1 -1
  84. package/dist/types/src/compiler/compiler.d.ts.map +1 -1
  85. package/dist/types/src/components/DeploymentDialog/DeploymentDialog.d.ts +1 -1
  86. package/dist/types/src/components/DeploymentDialog/DeploymentDialog.d.ts.map +1 -1
  87. package/dist/types/src/components/DeploymentDialog/DeploymentDialog.stories.d.ts +139 -12
  88. package/dist/types/src/components/DeploymentDialog/DeploymentDialog.stories.d.ts.map +1 -1
  89. package/dist/types/src/components/DeploymentDialog/index.d.ts +1 -1
  90. package/dist/types/src/components/DeploymentDialog/index.d.ts.map +1 -1
  91. package/dist/types/src/components/FrameContainer/FrameContainer.d.ts.map +1 -1
  92. package/dist/types/src/components/ScriptContainer.d.ts +3 -3
  93. package/dist/types/src/components/ScriptContainer.d.ts.map +1 -1
  94. package/dist/types/src/components/ScriptToolbar/ScriptToolbar.d.ts.map +1 -1
  95. package/dist/types/src/components/ScriptToolbar/ScriptToolbar.stories.d.ts +7 -10
  96. package/dist/types/src/components/ScriptToolbar/ScriptToolbar.stories.d.ts.map +1 -1
  97. package/dist/types/src/components/Settings/ScriptObjectSettings.d.ts.map +1 -1
  98. package/dist/types/src/components/Settings/ScriptPluginSettings.d.ts.map +1 -1
  99. package/dist/types/src/components/TestPanel/TestContainer.d.ts +4 -3
  100. package/dist/types/src/components/TestPanel/TestContainer.d.ts.map +1 -1
  101. package/dist/types/src/components/TypescriptEditor/TypescriptEditor.d.ts.map +1 -1
  102. package/dist/types/src/components/TypescriptEditor/TypescriptEditor.stories.d.ts +10 -3
  103. package/dist/types/src/components/TypescriptEditor/TypescriptEditor.stories.d.ts.map +1 -1
  104. package/dist/types/src/components/index.d.ts +1 -4
  105. package/dist/types/src/components/index.d.ts.map +1 -1
  106. package/dist/types/src/hooks/deploy.d.ts +4 -3
  107. package/dist/types/src/hooks/deploy.d.ts.map +1 -1
  108. package/dist/types/src/hooks/template.d.ts.map +1 -1
  109. package/dist/types/src/hooks/useCreateAndDeployScriptTemplates.d.ts.map +1 -1
  110. package/dist/types/src/templates/data-generator.d.ts.map +1 -1
  111. package/dist/types/src/templates/index.d.ts +2 -0
  112. package/dist/types/src/templates/index.d.ts.map +1 -1
  113. package/dist/types/src/translations.d.ts +68 -176
  114. package/dist/types/src/translations.d.ts.map +1 -1
  115. package/dist/types/src/types/index.d.ts +2 -0
  116. package/dist/types/src/types/index.d.ts.map +1 -0
  117. package/dist/types/src/{types.d.ts → types/schema.d.ts} +3 -5
  118. package/dist/types/src/types/schema.d.ts.map +1 -0
  119. package/dist/types/src/util/deploy.d.ts +3 -3
  120. package/dist/types/src/util/deploy.d.ts.map +1 -1
  121. package/dist/types/src/util/functions.d.ts.map +1 -1
  122. package/dist/types/tsconfig.tsbuildinfo +1 -1
  123. package/package.json +79 -70
  124. package/src/ScriptPlugin.tsx +7 -7
  125. package/src/capabilities/app-graph-builder.ts +2 -2
  126. package/src/capabilities/artifact-definition.ts +9 -12
  127. package/src/capabilities/blueprint-definition.ts +30 -0
  128. package/src/capabilities/compiler.ts +2 -1
  129. package/src/capabilities/index.ts +1 -1
  130. package/src/capabilities/intent-resolver.ts +2 -5
  131. package/src/capabilities/react-surface.tsx +6 -5
  132. package/src/compiler/compiler.ts +1 -1
  133. package/src/components/DeploymentDialog/DeploymentDialog.stories.tsx +29 -17
  134. package/src/components/DeploymentDialog/DeploymentDialog.tsx +5 -5
  135. package/src/components/DeploymentDialog/index.ts +1 -1
  136. package/src/components/FrameContainer/FrameContainer.tsx +3 -2
  137. package/src/components/FrameContainer/frame.tsx +1 -1
  138. package/src/components/ScriptContainer.tsx +6 -4
  139. package/src/components/ScriptToolbar/ScriptToolbar.stories.tsx +19 -14
  140. package/src/components/ScriptToolbar/ScriptToolbar.tsx +14 -4
  141. package/src/components/Settings/ScriptObjectSettings.tsx +19 -23
  142. package/src/components/Settings/ScriptPluginSettings.tsx +33 -28
  143. package/src/components/TestPanel/TestContainer.tsx +9 -3
  144. package/src/components/TestPanel/TestPanel.tsx +1 -1
  145. package/src/components/TypescriptEditor/TypescriptEditor.stories.tsx +9 -16
  146. package/src/components/TypescriptEditor/TypescriptEditor.tsx +6 -4
  147. package/src/hooks/deploy.ts +11 -11
  148. package/src/hooks/template.ts +3 -3
  149. package/src/hooks/useCreateAndDeployScriptTemplates.ts +1 -0
  150. package/src/templates/chess.ts +1 -1
  151. package/src/templates/data-generator.ts +8 -4
  152. package/src/templates/discord.ts +4 -4
  153. package/src/templates/email.ts +2 -2
  154. package/src/templates/forex-effect.ts +3 -3
  155. package/src/templates/forex.ts +1 -1
  156. package/src/templates/gmail.ts +14 -55
  157. package/src/templates/index.ts +2 -0
  158. package/src/translations.ts +9 -6
  159. package/src/types/index.ts +5 -0
  160. package/src/{types.ts → types/schema.ts} +2 -7
  161. package/src/util/deploy.ts +20 -33
  162. package/src/util/functions.ts +4 -4
  163. package/dist/lib/browser/DeploymentDialog-RPPPWEEL.mjs +0 -12
  164. package/dist/lib/browser/ScriptContainer-RSN52NH7.mjs.map +0 -7
  165. package/dist/lib/browser/artifact-definition-A4TBQL75.mjs +0 -249
  166. package/dist/lib/browser/artifact-definition-A4TBQL75.mjs.map +0 -7
  167. package/dist/lib/browser/chunk-3FU4QZVP.mjs +0 -364
  168. package/dist/lib/browser/chunk-3FU4QZVP.mjs.map +0 -7
  169. package/dist/lib/browser/chunk-3JLR2SHJ.mjs.map +0 -7
  170. package/dist/lib/browser/chunk-LA66DQGU.mjs.map +0 -7
  171. package/dist/lib/browser/chunk-QJH7I2UV.mjs.map +0 -7
  172. package/dist/lib/browser/chunk-WB3X5Z7Q.mjs.map +0 -7
  173. package/dist/lib/browser/compiler-W4BYJYTL.mjs.map +0 -7
  174. package/dist/lib/browser/react-surface-7BKUWL2U.mjs.map +0 -7
  175. package/dist/lib/browser/types.mjs +0 -13
  176. package/dist/lib/node/DeploymentDialog-C3EEYGRH.cjs +0 -33
  177. package/dist/lib/node/DeploymentDialog-C3EEYGRH.cjs.map +0 -7
  178. package/dist/lib/node/ScriptContainer-CAC7AISY.cjs +0 -278
  179. package/dist/lib/node/ScriptContainer-CAC7AISY.cjs.map +0 -7
  180. package/dist/lib/node/app-graph-builder-25OOTBW4.cjs +0 -80
  181. package/dist/lib/node/app-graph-builder-25OOTBW4.cjs.map +0 -7
  182. package/dist/lib/node/artifact-definition-QKZI6PTO.cjs +0 -265
  183. package/dist/lib/node/artifact-definition-QKZI6PTO.cjs.map +0 -7
  184. package/dist/lib/node/chunk-AU2FOE26.cjs +0 -369
  185. package/dist/lib/node/chunk-AU2FOE26.cjs.map +0 -7
  186. package/dist/lib/node/chunk-BUOBOT3V.cjs +0 -179
  187. package/dist/lib/node/chunk-BUOBOT3V.cjs.map +0 -7
  188. package/dist/lib/node/chunk-HCRW6T3G.cjs +0 -60
  189. package/dist/lib/node/chunk-HCRW6T3G.cjs.map +0 -7
  190. package/dist/lib/node/chunk-OSBMUJ4T.cjs +0 -580
  191. package/dist/lib/node/chunk-OSBMUJ4T.cjs.map +0 -7
  192. package/dist/lib/node/chunk-QG2X6J74.cjs +0 -52
  193. package/dist/lib/node/chunk-QG2X6J74.cjs.map +0 -7
  194. package/dist/lib/node/chunk-YO5W2IPQ.cjs +0 -251
  195. package/dist/lib/node/chunk-YO5W2IPQ.cjs.map +0 -7
  196. package/dist/lib/node/chunk-ZEV3VARQ.cjs +0 -34
  197. package/dist/lib/node/chunk-ZEV3VARQ.cjs.map +0 -7
  198. package/dist/lib/node/compiler-TFSJRLL4.cjs +0 -104
  199. package/dist/lib/node/compiler-TFSJRLL4.cjs.map +0 -7
  200. package/dist/lib/node/index.cjs +0 -225
  201. package/dist/lib/node/index.cjs.map +0 -7
  202. package/dist/lib/node/intent-resolver-BQ2NKEM7.cjs +0 -100
  203. package/dist/lib/node/intent-resolver-BQ2NKEM7.cjs.map +0 -7
  204. package/dist/lib/node/meta.json +0 -1
  205. package/dist/lib/node/react-surface-EUKPDFU3.cjs +0 -120
  206. package/dist/lib/node/react-surface-EUKPDFU3.cjs.map +0 -7
  207. package/dist/lib/node/settings-WO53FLYZ.cjs +0 -38
  208. package/dist/lib/node/settings-WO53FLYZ.cjs.map +0 -7
  209. package/dist/lib/node/types.cjs +0 -34
  210. package/dist/lib/node/types.cjs.map +0 -7
  211. package/dist/lib/node-esm/ScriptContainer-4IOOIPBF.mjs.map +0 -7
  212. package/dist/lib/node-esm/artifact-definition-4XRYAP54.mjs +0 -250
  213. package/dist/lib/node-esm/artifact-definition-4XRYAP54.mjs.map +0 -7
  214. package/dist/lib/node-esm/chunk-B4TP3LSZ.mjs.map +0 -7
  215. package/dist/lib/node-esm/chunk-MJJQBUOL.mjs.map +0 -7
  216. package/dist/lib/node-esm/chunk-T7XDCUTF.mjs.map +0 -7
  217. package/dist/lib/node-esm/chunk-UESZKXLR.mjs.map +0 -7
  218. package/dist/lib/node-esm/chunk-W2DAXWHA.mjs +0 -365
  219. package/dist/lib/node-esm/chunk-W2DAXWHA.mjs.map +0 -7
  220. package/dist/lib/node-esm/compiler-7PQ4D43R.mjs.map +0 -7
  221. package/dist/lib/node-esm/intent-resolver-HTM5PSRZ.mjs.map +0 -7
  222. package/dist/lib/node-esm/react-surface-6UO64YOS.mjs.map +0 -7
  223. package/dist/types/src/types.d.ts.map +0 -1
  224. /package/dist/lib/browser/{DeploymentDialog-RPPPWEEL.mjs.map → DeploymentDialog-QZSTVNIS.mjs.map} +0 -0
  225. /package/dist/lib/browser/{chunk-YSQMXTYO.mjs.map → chunk-5TVBECWH.mjs.map} +0 -0
  226. /package/dist/lib/browser/{chunk-6ZHHWU6S.mjs.map → chunk-QYAREHGH.mjs.map} +0 -0
  227. /package/dist/lib/browser/{settings-Z22D6JVJ.mjs.map → settings-KCTBK5TY.mjs.map} +0 -0
  228. /package/dist/lib/browser/{types.mjs.map → templates/index.mjs.map} +0 -0
  229. /package/dist/lib/{node-esm/DeploymentDialog-IA4CH6WZ.mjs.map → browser/types/index.mjs.map} +0 -0
  230. /package/dist/lib/node-esm/{types.mjs.map → DeploymentDialog-G6EHEPXN.mjs.map} +0 -0
  231. /package/dist/lib/node-esm/{chunk-2KJYPUQD.mjs.map → chunk-35M3CHYE.mjs.map} +0 -0
  232. /package/dist/lib/node-esm/{chunk-AEB5TPEW.mjs.map → chunk-AHXJ6NQU.mjs.map} +0 -0
  233. /package/dist/lib/node-esm/{settings-KZEGCDYX.mjs.map → settings-DXZ334A3.mjs.map} +0 -0
@@ -0,0 +1,90 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+
3
+ // raw-loader:./chat.ts?raw
4
+ var chat_default = "//\n// Copyright 2024 DXOS.org\n//\n\n// @ts-ignore\nimport { transformServerSentEvents } from 'https://esm.sh/@dxos/script-toolbox?bundle=false';\n\n/**\n * Chatbot that answers questions based on the context data.\n */\nexport default async ({ data: { bodyText }, context: { space, ai } }: any) => {\n let parsedRequest: any;\n try {\n parsedRequest = JSON.parse(bodyText);\n } catch (err) {\n const answer = await ai.run('@cf/meta/llama-3.1-8b-instruct', {\n stream: true,\n prompt: `\n Using only the context data below to answer the user's question.\n If you cannot answer the question from the provided content, then reply with \"I don't know.\"\n\n CONTEXT:\n ${await getContext({ space })}\n\n QUESTION:\n ${bodyText}\n `,\n });\n return new Response(transformServerSentEvents(answer));\n }\n\n const promptId = parsedRequest.trigger.promptId;\n const promptObject = await space.crud.query({ id: promptId }).first();\n\n if (parsedRequest.data.objects.length !== 1) {\n return new Response('Message batches not supported.');\n }\n\n const messageId = parsedRequest.data.objects[0];\n let message;\n try {\n message = await space.crud.query({ id: messageId }).first();\n } catch (err) {\n return new Response('Message not replicated yet.', { status: 409 });\n }\n\n if (message.text.includes('--------')) {\n return new Response('Message was already processed.');\n }\n\n let prompt = promptObject.template;\n for (const input of promptObject.inputs) {\n let value: string | null = null;\n if (input.type === TemplateInputType.VALUE) {\n value = String(input.value);\n } else if (input.type === TemplateInputType.RETRIEVER) {\n value = await getContext({ space });\n } else if (input.type === TemplateInputType.PASS_THROUGH) {\n value = message.text;\n }\n if (value) {\n prompt = prompt.replaceAll(`{${input.name}}`, value);\n }\n }\n\n const answer = await ai.run('@cf/meta/llama-3.1-8b-instruct', {\n stream: false,\n prompt,\n });\n const response = { response: answer.response, prompt, message };\n const textWithAnswer = message.text + '\\n--------\\n\\n' + answer.response;\n await space.crud.update({ id: messageId }, { text: textWithAnswer });\n\n return new Response(JSON.stringify(response));\n};\n\nconst getContext = async ({ space }: any) => {\n let context = '';\n const { objects: docs } = await space.crud.query({ __typename: 'dxos.org/type/Document' }).run();\n for (const doc of docs) {\n const { content } = await space.crud.query({ id: doc.content }).first();\n context += content + '\\n\\n';\n }\n return context;\n};\n\nenum TemplateInputType {\n VALUE = 0,\n PASS_THROUGH = 1,\n RETRIEVER = 2,\n FUNCTION = 3,\n QUERY = 4,\n RESOLVER = 5,\n CONTEXT = 6,\n SCHEMA = 7,\n}\n";
5
+
6
+ // raw-loader:./chess.ts?raw
7
+ var chess_default = "//\n// Copyright 2025 DXOS.org\n//\n\n// @ts-ignore\nimport { S, defineFunction } from 'dxos:functions';\n// @ts-ignore\nimport { Chess } from 'https://esm.sh/chess.js@0.13.1?bundle=false';\n\nexport default defineFunction({\n description: 'Plays a random move in a chess game.',\n\n inputSchema: S.Struct({\n changedObjectId: S.String.annotations({\n description: 'The objects to play the game on.',\n }),\n player: S.optional(S.Literal('w', 'b')).annotations({\n description: 'The player to play the game as.',\n }),\n }),\n\n outputSchema: S.Struct({\n state: S.String.annotations({\n description: 'The state of the game as an ASCII art board.',\n }),\n }),\n\n handler: async ({ data: { changedObjectId, player = 'b' }, context: { space } }: any) => {\n const { pgn } = await space.db.query({ id: changedObjectId }).first();\n const game = new Chess();\n game.load_pgn(pgn);\n if (game.turn() !== player) {\n return new Response('Invalid turn', { status: 409 });\n }\n\n const moves = game.moves();\n const move = moves[Math.floor(Math.random() * moves.length)];\n if (!move) {\n return new Response('No legal moves', { status: 406 });\n }\n\n game.move(move);\n const newPgn = game.pgn();\n await space.db.update({ id: changedObjectId }, { pgn: newPgn, fen: game.fen() });\n return { state: game.ascii() };\n },\n});\n";
8
+
9
+ // raw-loader:./data-generator.ts?raw
10
+ var data_generator_default = "//\n// Copyright 2025 DXOS.org\n//\n\n// @ts-ignore\nimport { Expando, S, create, defineFunction } from 'dxos:functions';\n// @ts-ignore\nimport { randText } from 'https://esm.sh/@ngneat/falso@7.1.1?bundle=false';\n\nexport default defineFunction({\n inputSchema: S.Struct({\n documentAmount: S.optional(S.Number),\n textSize: S.optional(S.Number),\n mutationAmount: S.optional(S.Number),\n waitAfterCreation: S.optional(S.Number),\n }),\n\n outputSchema: S.Struct({}),\n\n handler: async ({\n data: { documentAmount = 1, textSize = 10, mutationAmount = 0, waitAfterCreation = 10_000 },\n context: { space },\n }: any) => {\n await space.db.graph.schemaRegistry.addSchema([Expando]);\n const result: Record<string, any> = {};\n const objects: Expando[] = [];\n\n // Create objects.\n for (let i = 0; i < documentAmount; i++) {\n const obj = space.db.add(\n create(Expando, {\n name: 'scriptGenerated',\n content: randText({ charCount: textSize }),\n }),\n );\n objects.push(obj);\n const objectResult: any = {};\n // Mutate the object.\n for (let i = 0; i < mutationAmount; i++) {\n obj.content = randText({ charCount: textSize });\n }\n objectResult.mutations = mutationAmount;\n objectResult.contentLength = obj.content.length;\n result[obj.id] = objectResult;\n }\n\n // Flush and wait for data to propagate.\n await space.db.flush();\n await new Promise((resolve) => setTimeout(resolve, waitAfterCreation));\n return { createdObjects: objects.length };\n },\n});\n";
11
+
12
+ // raw-loader:./discord.ts?raw
13
+ var discord_default = "//\n// Copyright 2025 DXOS.org\n//\n\n// @ts-ignore\nimport { DXN, EchoObject, Filter, ObjectId, S, create, defineFunction } from 'dxos:functions';\n// @ts-ignore\nimport { FetchHttpClient } from 'https://esm.sh/@effect/platform@0.89.0?deps=effect@3.17.0&bundle=false';\nimport {\n DiscordConfig,\n DiscordREST,\n DiscordRESTMemoryLive,\n // @ts-ignore\n} from 'https://esm.sh/dfx@0.113.0?deps=effect@3.17.0&bundle=false';\n// @ts-ignore\nimport { Config, Effect, Redacted, Ref } from 'https://esm.sh/effect@3.17.0?bundle=false';\n\nconst MessageSchema = S.Struct({\n id: ObjectId,\n foreignId: S.Any, // bigint?\n from: S.String,\n created: S.String,\n content: S.String,\n}).pipe(\n EchoObject({\n typename: 'example.com/type/Message',\n version: '0.1.0',\n }),\n);\n\nconst DEFAULT_AFTER = 1704067200; // 2024-01-01\n\nconst generateSnowflake = (unixTimestamp: number): bigint => {\n const discordEpoch = 1420070400000n; // Discord Epoch (ms)\n return (BigInt(unixTimestamp * 1000) - discordEpoch) << 22n;\n};\n\nexport default defineFunction({\n inputSchema: S.Struct({\n // TODO(wittjosiah): Remove. This is used to provide a terminal for a cron trigger.\n tick: S.optional(S.String),\n channelId: S.String,\n after: S.optional(S.Number),\n pageSize: S.optional(S.Number),\n queueId: S.String,\n }),\n\n outputSchema: S.Struct({\n newMessages: S.Number,\n }),\n\n handler: ({ data: { channelId, queueId, after = DEFAULT_AFTER, pageSize = 5 }, context: { space } }: any) =>\n Effect.gen(function* () {\n const { token } = yield* Effect.tryPromise({\n try: () => space.db.query(Filter.typename('dxos.org/type/AccessToken', { source: 'discord.com' })).first(),\n catch: (e: any) => e,\n });\n const { objects } = yield* Effect.tryPromise({\n try: () => space.queues.queryQueue(DXN.parse(queueId)),\n catch: (e: any) => e,\n });\n const backfill = objects.length === 0;\n const newMessages = yield* Ref.make(0);\n const lastMessage = yield* Ref.make(objects.at(-1));\n\n const enqueueMessages = Effect.gen(function* () {\n const rest = yield* DiscordREST;\n\n while (true) {\n const last = yield* Ref.get(lastMessage);\n const options = {\n after: backfill && !last ? `${generateSnowflake(after)}` : last?.foreignId,\n limit: pageSize,\n };\n const messages = yield* rest.getChannelMessages(channelId, options).pipe((res: any) => res.json);\n const queueMessages = messages\n .map((message: any) =>\n create(MessageSchema, {\n id: ObjectId.random(),\n foreignId: message.id,\n from: message.author.username,\n created: message.timestamp,\n content: message.content,\n }),\n )\n .toReversed();\n if (queueMessages.length > 0) {\n yield* Effect.tryPromise({\n try: () => space.queues.insertIntoQueue(DXN.parse(queueId), queueMessages),\n catch: (e: any) => e,\n });\n yield* Ref.update(newMessages, (n: any) => n + queueMessages.length);\n yield* Ref.update(lastMessage, (m: any) => queueMessages.at(-1));\n }\n if (messages.length < pageSize) {\n break;\n }\n }\n }).pipe(\n Effect.provide(DiscordRESTMemoryLive),\n Effect.provide(\n DiscordConfig.layerConfig({\n token: Config.succeed(Redacted.make(token)),\n }),\n ),\n Effect.provide(FetchHttpClient.layer),\n );\n\n yield* enqueueMessages;\n return { newMessages: yield* Ref.get(newMessages) };\n }),\n});\n";
14
+
15
+ // raw-loader:./echo.ts?raw
16
+ var echo_default = "//\n// Copyright 2024 DXOS.org\n//\n\n/**\n * Echos the request data.\n */\nexport default async ({ data }: any) => data;\n";
17
+
18
+ // raw-loader:./email.ts?raw
19
+ var email_default = "//\n// Copyright 2024 DXOS.org\n//\n\n/**\n * Appends a message to the end of a Document configured through a trigger.\n * Trigger must have a targetDocumentId field set in Meta.\n */\nexport default async ({ data: { bodyText }, context: { space } }: any) => {\n const { email, targetDocumentId: documentId } = JSON.parse(bodyText) as RequestPayload;\n\n const document = await space.db.query({ id: documentId }).first();\n\n const contentId = document.content['/'].split(':')[3];\n const documentContent = await space.db.query({ id: contentId }).first();\n const modifiedContent = [\n documentContent.content,\n '',\n '---',\n `**From:** ${email.from}`,\n `**Subject:** ${email.subject}`,\n `**Date:** ${email.created}`,\n '',\n email.body,\n ].join('\\n');\n\n await space.db.update({ id: contentId }, { content: modifiedContent });\n\n return new Response(JSON.stringify({ success: true }));\n};\n\ntype RequestPayload = {\n email: { from: string; subject: string; created: string; body: string };\n targetDocumentId: string;\n};\n";
20
+
21
+ // raw-loader:./forex-effect.ts?raw
22
+ var forex_effect_default = "//\n// Copyright 2025 DXOS.org\n//\n\n// @ts-ignore\nimport { S, defineFunction } from 'dxos:functions';\nimport {\n FetchHttpClient,\n HttpClient,\n HttpClientRequest,\n // @ts-ignore\n} from 'https://esm.sh/@effect/platform@0.89.0?deps=effect@3.17.0&bundle=false';\n// @ts-ignore\nimport { Effect, Schedule } from 'https://esm.sh/effect@3.17.0?bundle=false';\n\nexport default defineFunction({\n description: 'Returns the exchange rate between two currencies.',\n\n inputSchema: S.Struct({\n from: S.String.annotations({ description: 'The source currency' }),\n to: S.String.annotations({ description: 'The target currency' }),\n }),\n\n outputSchema: S.String.annotations({ description: 'The exchange rate between the two currencies' }),\n\n handler: async ({ data: { from, to } }: any) =>\n Effect.gen(function* () {\n const res = yield* HttpClientRequest.get(`https://free.ratesdb.com/v1/rates?from=${from}&to=${to}`).pipe(\n HttpClient.execute,\n Effect.flatMap((res: any) => res.json),\n Effect.timeout('1 second'),\n Effect.retry(Schedule.exponential(1_000).pipe(Schedule.compose(Schedule.recurs(3)))),\n Effect.scoped,\n );\n\n return res.data.rates[to].toString();\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n});\n";
23
+
24
+ // raw-loader:./forex.ts?raw
25
+ var forex_default = "//\n// Copyright 2025 DXOS.org\n//\n\n// @ts-ignore\nimport { S, defineFunction } from 'dxos:functions';\n\nexport default defineFunction({\n description: 'Returns the exchange rate between two currencies.',\n\n inputSchema: S.Struct({\n from: S.String.annotations({ description: 'The source currency' }),\n to: S.String.annotations({ description: 'The target currency' }),\n }),\n\n handler: async ({ data: { from, to } }: any) => {\n const res = await fetch(`https://free.ratesdb.com/v1/rates?from=${from}&to=${to}`);\n const {\n data: { rates },\n } = await res.json();\n\n return rates[to].toString();\n },\n});\n";
26
+
27
+ // raw-loader:./gmail.ts?raw
28
+ var gmail_default = "//\n// Copyright 2025 DXOS.org\n//\n\n// @ts-ignore\nimport { EchoObject, Filter, ObjectId, S, create, defineFunction } from 'dxos:functions';\n// @ts-ignore\nimport {\n FetchHttpClient,\n HttpClient,\n HttpClientRequest,\n // @ts-ignore\n} from 'https://esm.sh/@effect/platform@0.89.0?deps=effect@3.17.0&bundle=false';\n// @ts-ignore\nimport { format, subDays } from 'https://esm.sh/date-fns@3.3.1?bundle=false';\n// @ts-ignore\nimport { Chunk, Effect, Ref, Schedule, Stream, pipe } from 'https://esm.sh/effect@3.17.0?bundle=false';\n\nexport default defineFunction({\n inputSchema: S.Struct({\n mailboxId: S.String,\n userId: S.optional(S.String).pipe(S.withDecodingDefault(() => 'me')),\n after: S.optional(S.Union(S.Number, S.String)).pipe(\n S.withDecodingDefault(() => format(subDays(new Date(), 30), 'yyyy-MM-dd')),\n ),\n pageSize: S.optional(S.Number).pipe(S.withDecodingDefault(() => 100)),\n // TODO(wittjosiah): Remove. This is used to provide a terminal for a cron trigger.\n tick: S.optional(S.String),\n }),\n\n outputSchema: S.Struct({\n newMessages: S.Number,\n }),\n\n handler: ({ context: { space }, data: { mailboxId, userId, after, pageSize } }: any) =>\n Effect.gen(function* () {\n const { token } = yield* Effect.tryPromise({\n try: () => space.db.query(Filter.typename('dxos.org/type/AccessToken', { source: 'gmail.com' })).first(),\n catch: (e: any) => e,\n });\n\n // NOTE: Google API bundles size is v. large and caused runtime issues.\n const makeRequest = (url: string) =>\n pipe(\n url,\n HttpClientRequest.get,\n HttpClientRequest.setHeaders({ Authorization: `Bearer ${token}`, Accept: 'application/json' }),\n HttpClient.execute,\n Effect.flatMap((res: any) => res.json),\n Effect.timeout('1 second'),\n Effect.retry(Schedule.exponential(1000).pipe(Schedule.compose(Schedule.recurs(3)))),\n Effect.scoped,\n );\n\n const listMessages = (userId: string, q: string, pageSize: number, pageToken: string | null) =>\n makeRequest(getUrl(userId, undefined, { q, pageSize, pageToken }));\n\n const getMessage = (userId: string, messageId: string) => makeRequest(getUrl(userId, messageId));\n\n const mailbox = yield* Effect.tryPromise({\n try: () => space.db.query({ id: mailboxId }).first(),\n catch: (e: any) => e,\n });\n const { objects } = yield* Effect.tryPromise({\n try: () => space.queues.queryQueue(mailbox.queue.dxn),\n catch: (e: any) => e,\n });\n const newMessages = yield* Ref.make([]);\n const nextPage = yield* Ref.make(null);\n\n do {\n const last = objects.at(-1);\n const q = last\n ? `in:inbox after:${Math.floor(new Date(last.created).getTime() / 1000)}`\n : `in:inbox after:${after}`;\n const pageToken = yield* Ref.get(nextPage);\n const { messages, nextPageToken } = yield* listMessages(userId, q, pageSize, pageToken);\n yield* Ref.update(nextPage, () => nextPageToken);\n for (const message of messages) {\n const messageDetails = yield* getMessage(userId, message.id);\n const created = new Date(parseInt(messageDetails.internalDate)).toISOString();\n const from = messageDetails.payload.headers.find((h: any) => h.name === 'From');\n const sender = from && parseEmailString(from.value);\n // TODO(wittjosiah): Improve parsing of email contents.\n const content =\n messageDetails.payload.body?.data ??\n messageDetails.payload.parts?.find((p: any) => p.mimeType === 'text/plain')?.body.data;\n // Skip the message if content or sender is missing.\n // Skip the message if it's the same as the last message.\n // TODO(wittjosiah): This comparison should be done via foreignId probably.\n if (!content || !sender || created === last?.created) {\n continue;\n }\n const subject = messageDetails.payload.headers.find((h: any) => h.name === 'Subject')?.value;\n const object = create(MessageType, {\n id: ObjectId.random(),\n created,\n sender,\n blocks: [\n {\n _tag: 'text',\n text: Buffer.from(content, 'base64').toString('utf-8'),\n },\n ],\n properties: {\n subject,\n threadId: message.threadId,\n },\n });\n // TODO(wittjosiah): Set foreignId in object meta.\n yield* Ref.update(newMessages, (n: any) => [object, ...n]);\n }\n } while (yield* Ref.get(nextPage));\n\n const queueMessages = yield* Ref.get(newMessages);\n if (queueMessages.length > 0) {\n yield* pipe(\n queueMessages,\n Stream.fromIterable,\n Stream.grouped(10),\n Stream.flatMap((batch: any) =>\n Effect.tryPromise({\n try: () => space.queues.insertIntoQueue(mailbox.queue.dxn, Chunk.toReadonlyArray(batch)),\n catch: (e: any) => e,\n }),\n ),\n Stream.runDrain,\n );\n }\n\n return { newMessages: queueMessages.length };\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n});\n\nconst getUrl = (userId: string, messageId?: string, params?: Record<string, any>) => {\n const api = new URL(\n [`https://gmail.googleapis.com/gmail/v1/users/${userId}/messages`, messageId].filter(Boolean).join('/'),\n );\n Object.entries(params ?? {})\n .filter(([_, value]) => value != null)\n .forEach(([key, value]) => api.searchParams.set(key, value));\n return api.toString();\n};\n\n/**\n * Parses an email string in the format \"Name <email@example.com>\" into separate name and email components.\n */\nconst parseEmailString = (emailString: string): { name?: string; email: string } | undefined => {\n const match = emailString.match(/^([^<]+?)\\s*<([^>]+@[^>]+)>$/);\n if (match) {\n const [, name, email] = match;\n return {\n name: name.trim(),\n email: email.trim(),\n };\n }\n\n return undefined;\n};\n\n//\n// Schemas\n// TODO(wittjosiah): These schemas should be imported from @dxos/schema.\n//\n\nconst ActorRoles = ['user', 'assistant'] as const;\nconst ActorRole = S.Literal(...ActorRoles);\ntype ActorRole = S.Schema.Type<typeof ActorRole>;\n\nconst ActorSchema = S.Struct({\n identityKey: S.optional(S.String),\n email: S.optional(S.String),\n name: S.optional(S.String),\n role: S.optional(ActorRole),\n});\n\nconst Base = S.Struct({\n pending: S.optional(S.Boolean),\n});\ntype Base = S.Schema.Type<typeof Base>;\nconst Text = S.TaggedStruct('text', {\n mimeType: S.optional(S.String),\n text: S.String,\n ...Base.fields,\n}).pipe(S.mutable);\ninterface Text extends S.Schema.Type<typeof Text> {}\n\nconst MessageType = S.Struct({\n id: ObjectId,\n created: S.String.annotations({\n description: 'ISO date string when the message was sent.',\n }),\n sender: ActorSchema.annotations({\n description: 'Identity of the message sender.',\n }),\n blocks: S.Array(Text).annotations({\n description: 'Contents of the message.',\n }),\n properties: S.optional(\n S.mutable(\n S.Record({ key: S.String, value: S.Any }).annotations({\n description: 'Custom properties for specific message types (e.g. attention context, email subject, etc.).',\n }),\n ),\n ),\n}).pipe(\n EchoObject({\n typename: 'dxos.org/type/Message',\n version: '0.2.0',\n }),\n);\ntype MessageType = S.Schema.Type<typeof MessageType>;\n";
29
+
30
+ // src/templates/index.ts
31
+ var removeHeader = (str) => str.split("\n").slice(4).join("\n");
32
+ var templates = [
33
+ {
34
+ id: "dxos.org/script/echo",
35
+ name: "Echo",
36
+ source: removeHeader(echo_default)
37
+ },
38
+ {
39
+ id: "dxos.org/script/forex",
40
+ name: "Forex",
41
+ source: removeHeader(forex_default)
42
+ },
43
+ {
44
+ id: "dxos.org/script/forex-effect",
45
+ name: "Forex (Effect)",
46
+ source: removeHeader(forex_effect_default)
47
+ },
48
+ {
49
+ id: "dxos.org/script/gpt",
50
+ name: "Gpt",
51
+ source: removeHeader(chat_default),
52
+ presetId: "dxos.org/function/gpt"
53
+ },
54
+ {
55
+ id: "dxos.org/script/chess",
56
+ name: "Chess",
57
+ source: removeHeader(chess_default),
58
+ presetId: "dxos.org/function/chess"
59
+ },
60
+ {
61
+ id: "dxos.org/script/email",
62
+ name: "Email",
63
+ source: removeHeader(email_default),
64
+ presetId: "dxos.org/function/email"
65
+ },
66
+ {
67
+ id: "dxos.org/script/discord",
68
+ name: "Discord",
69
+ source: removeHeader(discord_default),
70
+ presetId: "dxos.org/function/discord"
71
+ },
72
+ {
73
+ id: "dxos.org/script/gmail",
74
+ name: "Gmail",
75
+ source: removeHeader(gmail_default),
76
+ presetId: "dxos.org/function/gmail"
77
+ },
78
+ {
79
+ id: "dxos.org/script/data-generator",
80
+ name: "Data Generator",
81
+ source: removeHeader(data_generator_default),
82
+ presetId: "dxos.org/function/data-generator"
83
+ }
84
+ ];
85
+
86
+ export {
87
+ data_generator_default,
88
+ templates
89
+ };
90
+ //# sourceMappingURL=chunk-GWHLP5LM.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["raw-loader:./chat.ts?raw", "raw-loader:./chess.ts?raw", "raw-loader:./data-generator.ts?raw", "raw-loader:./discord.ts?raw", "raw-loader:./echo.ts?raw", "raw-loader:./email.ts?raw", "raw-loader:./forex-effect.ts?raw", "raw-loader:./forex.ts?raw", "raw-loader:./gmail.ts?raw", "../../../src/templates/index.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\n// @ts-ignore\nimport { transformServerSentEvents } from 'https://esm.sh/@dxos/script-toolbox?bundle=false';\n\n/**\n * Chatbot that answers questions based on the context data.\n */\nexport default async ({ data: { bodyText }, context: { space, ai } }: any) => {\n let parsedRequest: any;\n try {\n parsedRequest = JSON.parse(bodyText);\n } catch (err) {\n const answer = await ai.run('@cf/meta/llama-3.1-8b-instruct', {\n stream: true,\n prompt: `\n Using only the context data below to answer the user's question.\n If you cannot answer the question from the provided content, then reply with \"I don't know.\"\n\n CONTEXT:\n ${await getContext({ space })}\n\n QUESTION:\n ${bodyText}\n `,\n });\n return new Response(transformServerSentEvents(answer));\n }\n\n const promptId = parsedRequest.trigger.promptId;\n const promptObject = await space.crud.query({ id: promptId }).first();\n\n if (parsedRequest.data.objects.length !== 1) {\n return new Response('Message batches not supported.');\n }\n\n const messageId = parsedRequest.data.objects[0];\n let message;\n try {\n message = await space.crud.query({ id: messageId }).first();\n } catch (err) {\n return new Response('Message not replicated yet.', { status: 409 });\n }\n\n if (message.text.includes('--------')) {\n return new Response('Message was already processed.');\n }\n\n let prompt = promptObject.template;\n for (const input of promptObject.inputs) {\n let value: string | null = null;\n if (input.type === TemplateInputType.VALUE) {\n value = String(input.value);\n } else if (input.type === TemplateInputType.RETRIEVER) {\n value = await getContext({ space });\n } else if (input.type === TemplateInputType.PASS_THROUGH) {\n value = message.text;\n }\n if (value) {\n prompt = prompt.replaceAll(`{${input.name}}`, value);\n }\n }\n\n const answer = await ai.run('@cf/meta/llama-3.1-8b-instruct', {\n stream: false,\n prompt,\n });\n const response = { response: answer.response, prompt, message };\n const textWithAnswer = message.text + '\\n--------\\n\\n' + answer.response;\n await space.crud.update({ id: messageId }, { text: textWithAnswer });\n\n return new Response(JSON.stringify(response));\n};\n\nconst getContext = async ({ space }: any) => {\n let context = '';\n const { objects: docs } = await space.crud.query({ __typename: 'dxos.org/type/Document' }).run();\n for (const doc of docs) {\n const { content } = await space.crud.query({ id: doc.content }).first();\n context += content + '\\n\\n';\n }\n return context;\n};\n\nenum TemplateInputType {\n VALUE = 0,\n PASS_THROUGH = 1,\n RETRIEVER = 2,\n FUNCTION = 3,\n QUERY = 4,\n RESOLVER = 5,\n CONTEXT = 6,\n SCHEMA = 7,\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\n// @ts-ignore\nimport { S, defineFunction } from 'dxos:functions';\n// @ts-ignore\nimport { Chess } from 'https://esm.sh/chess.js@0.13.1?bundle=false';\n\nexport default defineFunction({\n description: 'Plays a random move in a chess game.',\n\n inputSchema: S.Struct({\n changedObjectId: S.String.annotations({\n description: 'The objects to play the game on.',\n }),\n player: S.optional(S.Literal('w', 'b')).annotations({\n description: 'The player to play the game as.',\n }),\n }),\n\n outputSchema: S.Struct({\n state: S.String.annotations({\n description: 'The state of the game as an ASCII art board.',\n }),\n }),\n\n handler: async ({ data: { changedObjectId, player = 'b' }, context: { space } }: any) => {\n const { pgn } = await space.db.query({ id: changedObjectId }).first();\n const game = new Chess();\n game.load_pgn(pgn);\n if (game.turn() !== player) {\n return new Response('Invalid turn', { status: 409 });\n }\n\n const moves = game.moves();\n const move = moves[Math.floor(Math.random() * moves.length)];\n if (!move) {\n return new Response('No legal moves', { status: 406 });\n }\n\n game.move(move);\n const newPgn = game.pgn();\n await space.db.update({ id: changedObjectId }, { pgn: newPgn, fen: game.fen() });\n return { state: game.ascii() };\n },\n});\n", "//\n// Copyright 2025 DXOS.org\n//\n\n// @ts-ignore\nimport { Expando, S, create, defineFunction } from 'dxos:functions';\n// @ts-ignore\nimport { randText } from 'https://esm.sh/@ngneat/falso@7.1.1?bundle=false';\n\nexport default defineFunction({\n inputSchema: S.Struct({\n documentAmount: S.optional(S.Number),\n textSize: S.optional(S.Number),\n mutationAmount: S.optional(S.Number),\n waitAfterCreation: S.optional(S.Number),\n }),\n\n outputSchema: S.Struct({}),\n\n handler: async ({\n data: { documentAmount = 1, textSize = 10, mutationAmount = 0, waitAfterCreation = 10_000 },\n context: { space },\n }: any) => {\n await space.db.graph.schemaRegistry.addSchema([Expando]);\n const result: Record<string, any> = {};\n const objects: Expando[] = [];\n\n // Create objects.\n for (let i = 0; i < documentAmount; i++) {\n const obj = space.db.add(\n create(Expando, {\n name: 'scriptGenerated',\n content: randText({ charCount: textSize }),\n }),\n );\n objects.push(obj);\n const objectResult: any = {};\n // Mutate the object.\n for (let i = 0; i < mutationAmount; i++) {\n obj.content = randText({ charCount: textSize });\n }\n objectResult.mutations = mutationAmount;\n objectResult.contentLength = obj.content.length;\n result[obj.id] = objectResult;\n }\n\n // Flush and wait for data to propagate.\n await space.db.flush();\n await new Promise((resolve) => setTimeout(resolve, waitAfterCreation));\n return { createdObjects: objects.length };\n },\n});\n", "//\n// Copyright 2025 DXOS.org\n//\n\n// @ts-ignore\nimport { DXN, EchoObject, Filter, ObjectId, S, create, defineFunction } from 'dxos:functions';\n// @ts-ignore\nimport { FetchHttpClient } from 'https://esm.sh/@effect/platform@0.89.0?deps=effect@3.17.0&bundle=false';\nimport {\n DiscordConfig,\n DiscordREST,\n DiscordRESTMemoryLive,\n // @ts-ignore\n} from 'https://esm.sh/dfx@0.113.0?deps=effect@3.17.0&bundle=false';\n// @ts-ignore\nimport { Config, Effect, Redacted, Ref } from 'https://esm.sh/effect@3.17.0?bundle=false';\n\nconst MessageSchema = S.Struct({\n id: ObjectId,\n foreignId: S.Any, // bigint?\n from: S.String,\n created: S.String,\n content: S.String,\n}).pipe(\n EchoObject({\n typename: 'example.com/type/Message',\n version: '0.1.0',\n }),\n);\n\nconst DEFAULT_AFTER = 1704067200; // 2024-01-01\n\nconst generateSnowflake = (unixTimestamp: number): bigint => {\n const discordEpoch = 1420070400000n; // Discord Epoch (ms)\n return (BigInt(unixTimestamp * 1000) - discordEpoch) << 22n;\n};\n\nexport default defineFunction({\n inputSchema: S.Struct({\n // TODO(wittjosiah): Remove. This is used to provide a terminal for a cron trigger.\n tick: S.optional(S.String),\n channelId: S.String,\n after: S.optional(S.Number),\n pageSize: S.optional(S.Number),\n queueId: S.String,\n }),\n\n outputSchema: S.Struct({\n newMessages: S.Number,\n }),\n\n handler: ({ data: { channelId, queueId, after = DEFAULT_AFTER, pageSize = 5 }, context: { space } }: any) =>\n Effect.gen(function* () {\n const { token } = yield* Effect.tryPromise({\n try: () => space.db.query(Filter.typename('dxos.org/type/AccessToken', { source: 'discord.com' })).first(),\n catch: (e: any) => e,\n });\n const { objects } = yield* Effect.tryPromise({\n try: () => space.queues.queryQueue(DXN.parse(queueId)),\n catch: (e: any) => e,\n });\n const backfill = objects.length === 0;\n const newMessages = yield* Ref.make(0);\n const lastMessage = yield* Ref.make(objects.at(-1));\n\n const enqueueMessages = Effect.gen(function* () {\n const rest = yield* DiscordREST;\n\n while (true) {\n const last = yield* Ref.get(lastMessage);\n const options = {\n after: backfill && !last ? `${generateSnowflake(after)}` : last?.foreignId,\n limit: pageSize,\n };\n const messages = yield* rest.getChannelMessages(channelId, options).pipe((res: any) => res.json);\n const queueMessages = messages\n .map((message: any) =>\n create(MessageSchema, {\n id: ObjectId.random(),\n foreignId: message.id,\n from: message.author.username,\n created: message.timestamp,\n content: message.content,\n }),\n )\n .toReversed();\n if (queueMessages.length > 0) {\n yield* Effect.tryPromise({\n try: () => space.queues.insertIntoQueue(DXN.parse(queueId), queueMessages),\n catch: (e: any) => e,\n });\n yield* Ref.update(newMessages, (n: any) => n + queueMessages.length);\n yield* Ref.update(lastMessage, (m: any) => queueMessages.at(-1));\n }\n if (messages.length < pageSize) {\n break;\n }\n }\n }).pipe(\n Effect.provide(DiscordRESTMemoryLive),\n Effect.provide(\n DiscordConfig.layerConfig({\n token: Config.succeed(Redacted.make(token)),\n }),\n ),\n Effect.provide(FetchHttpClient.layer),\n );\n\n yield* enqueueMessages;\n return { newMessages: yield* Ref.get(newMessages) };\n }),\n});\n", "//\n// Copyright 2024 DXOS.org\n//\n\n/**\n * Echos the request data.\n */\nexport default async ({ data }: any) => data;\n", "//\n// Copyright 2024 DXOS.org\n//\n\n/**\n * Appends a message to the end of a Document configured through a trigger.\n * Trigger must have a targetDocumentId field set in Meta.\n */\nexport default async ({ data: { bodyText }, context: { space } }: any) => {\n const { email, targetDocumentId: documentId } = JSON.parse(bodyText) as RequestPayload;\n\n const document = await space.db.query({ id: documentId }).first();\n\n const contentId = document.content['/'].split(':')[3];\n const documentContent = await space.db.query({ id: contentId }).first();\n const modifiedContent = [\n documentContent.content,\n '',\n '---',\n `**From:** ${email.from}`,\n `**Subject:** ${email.subject}`,\n `**Date:** ${email.created}`,\n '',\n email.body,\n ].join('\\n');\n\n await space.db.update({ id: contentId }, { content: modifiedContent });\n\n return new Response(JSON.stringify({ success: true }));\n};\n\ntype RequestPayload = {\n email: { from: string; subject: string; created: string; body: string };\n targetDocumentId: string;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\n// @ts-ignore\nimport { S, defineFunction } from 'dxos:functions';\nimport {\n FetchHttpClient,\n HttpClient,\n HttpClientRequest,\n // @ts-ignore\n} from 'https://esm.sh/@effect/platform@0.89.0?deps=effect@3.17.0&bundle=false';\n// @ts-ignore\nimport { Effect, Schedule } from 'https://esm.sh/effect@3.17.0?bundle=false';\n\nexport default defineFunction({\n description: 'Returns the exchange rate between two currencies.',\n\n inputSchema: S.Struct({\n from: S.String.annotations({ description: 'The source currency' }),\n to: S.String.annotations({ description: 'The target currency' }),\n }),\n\n outputSchema: S.String.annotations({ description: 'The exchange rate between the two currencies' }),\n\n handler: async ({ data: { from, to } }: any) =>\n Effect.gen(function* () {\n const res = yield* HttpClientRequest.get(`https://free.ratesdb.com/v1/rates?from=${from}&to=${to}`).pipe(\n HttpClient.execute,\n Effect.flatMap((res: any) => res.json),\n Effect.timeout('1 second'),\n Effect.retry(Schedule.exponential(1_000).pipe(Schedule.compose(Schedule.recurs(3)))),\n Effect.scoped,\n );\n\n return res.data.rates[to].toString();\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n});\n", "//\n// Copyright 2025 DXOS.org\n//\n\n// @ts-ignore\nimport { S, defineFunction } from 'dxos:functions';\n\nexport default defineFunction({\n description: 'Returns the exchange rate between two currencies.',\n\n inputSchema: S.Struct({\n from: S.String.annotations({ description: 'The source currency' }),\n to: S.String.annotations({ description: 'The target currency' }),\n }),\n\n handler: async ({ data: { from, to } }: any) => {\n const res = await fetch(`https://free.ratesdb.com/v1/rates?from=${from}&to=${to}`);\n const {\n data: { rates },\n } = await res.json();\n\n return rates[to].toString();\n },\n});\n", "//\n// Copyright 2025 DXOS.org\n//\n\n// @ts-ignore\nimport { EchoObject, Filter, ObjectId, S, create, defineFunction } from 'dxos:functions';\n// @ts-ignore\nimport {\n FetchHttpClient,\n HttpClient,\n HttpClientRequest,\n // @ts-ignore\n} from 'https://esm.sh/@effect/platform@0.89.0?deps=effect@3.17.0&bundle=false';\n// @ts-ignore\nimport { format, subDays } from 'https://esm.sh/date-fns@3.3.1?bundle=false';\n// @ts-ignore\nimport { Chunk, Effect, Ref, Schedule, Stream, pipe } from 'https://esm.sh/effect@3.17.0?bundle=false';\n\nexport default defineFunction({\n inputSchema: S.Struct({\n mailboxId: S.String,\n userId: S.optional(S.String).pipe(S.withDecodingDefault(() => 'me')),\n after: S.optional(S.Union(S.Number, S.String)).pipe(\n S.withDecodingDefault(() => format(subDays(new Date(), 30), 'yyyy-MM-dd')),\n ),\n pageSize: S.optional(S.Number).pipe(S.withDecodingDefault(() => 100)),\n // TODO(wittjosiah): Remove. This is used to provide a terminal for a cron trigger.\n tick: S.optional(S.String),\n }),\n\n outputSchema: S.Struct({\n newMessages: S.Number,\n }),\n\n handler: ({ context: { space }, data: { mailboxId, userId, after, pageSize } }: any) =>\n Effect.gen(function* () {\n const { token } = yield* Effect.tryPromise({\n try: () => space.db.query(Filter.typename('dxos.org/type/AccessToken', { source: 'gmail.com' })).first(),\n catch: (e: any) => e,\n });\n\n // NOTE: Google API bundles size is v. large and caused runtime issues.\n const makeRequest = (url: string) =>\n pipe(\n url,\n HttpClientRequest.get,\n HttpClientRequest.setHeaders({ Authorization: `Bearer ${token}`, Accept: 'application/json' }),\n HttpClient.execute,\n Effect.flatMap((res: any) => res.json),\n Effect.timeout('1 second'),\n Effect.retry(Schedule.exponential(1000).pipe(Schedule.compose(Schedule.recurs(3)))),\n Effect.scoped,\n );\n\n const listMessages = (userId: string, q: string, pageSize: number, pageToken: string | null) =>\n makeRequest(getUrl(userId, undefined, { q, pageSize, pageToken }));\n\n const getMessage = (userId: string, messageId: string) => makeRequest(getUrl(userId, messageId));\n\n const mailbox = yield* Effect.tryPromise({\n try: () => space.db.query({ id: mailboxId }).first(),\n catch: (e: any) => e,\n });\n const { objects } = yield* Effect.tryPromise({\n try: () => space.queues.queryQueue(mailbox.queue.dxn),\n catch: (e: any) => e,\n });\n const newMessages = yield* Ref.make([]);\n const nextPage = yield* Ref.make(null);\n\n do {\n const last = objects.at(-1);\n const q = last\n ? `in:inbox after:${Math.floor(new Date(last.created).getTime() / 1000)}`\n : `in:inbox after:${after}`;\n const pageToken = yield* Ref.get(nextPage);\n const { messages, nextPageToken } = yield* listMessages(userId, q, pageSize, pageToken);\n yield* Ref.update(nextPage, () => nextPageToken);\n for (const message of messages) {\n const messageDetails = yield* getMessage(userId, message.id);\n const created = new Date(parseInt(messageDetails.internalDate)).toISOString();\n const from = messageDetails.payload.headers.find((h: any) => h.name === 'From');\n const sender = from && parseEmailString(from.value);\n // TODO(wittjosiah): Improve parsing of email contents.\n const content =\n messageDetails.payload.body?.data ??\n messageDetails.payload.parts?.find((p: any) => p.mimeType === 'text/plain')?.body.data;\n // Skip the message if content or sender is missing.\n // Skip the message if it's the same as the last message.\n // TODO(wittjosiah): This comparison should be done via foreignId probably.\n if (!content || !sender || created === last?.created) {\n continue;\n }\n const subject = messageDetails.payload.headers.find((h: any) => h.name === 'Subject')?.value;\n const object = create(MessageType, {\n id: ObjectId.random(),\n created,\n sender,\n blocks: [\n {\n _tag: 'text',\n text: Buffer.from(content, 'base64').toString('utf-8'),\n },\n ],\n properties: {\n subject,\n threadId: message.threadId,\n },\n });\n // TODO(wittjosiah): Set foreignId in object meta.\n yield* Ref.update(newMessages, (n: any) => [object, ...n]);\n }\n } while (yield* Ref.get(nextPage));\n\n const queueMessages = yield* Ref.get(newMessages);\n if (queueMessages.length > 0) {\n yield* pipe(\n queueMessages,\n Stream.fromIterable,\n Stream.grouped(10),\n Stream.flatMap((batch: any) =>\n Effect.tryPromise({\n try: () => space.queues.insertIntoQueue(mailbox.queue.dxn, Chunk.toReadonlyArray(batch)),\n catch: (e: any) => e,\n }),\n ),\n Stream.runDrain,\n );\n }\n\n return { newMessages: queueMessages.length };\n }).pipe(Effect.provide(FetchHttpClient.layer)),\n});\n\nconst getUrl = (userId: string, messageId?: string, params?: Record<string, any>) => {\n const api = new URL(\n [`https://gmail.googleapis.com/gmail/v1/users/${userId}/messages`, messageId].filter(Boolean).join('/'),\n );\n Object.entries(params ?? {})\n .filter(([_, value]) => value != null)\n .forEach(([key, value]) => api.searchParams.set(key, value));\n return api.toString();\n};\n\n/**\n * Parses an email string in the format \"Name <email@example.com>\" into separate name and email components.\n */\nconst parseEmailString = (emailString: string): { name?: string; email: string } | undefined => {\n const match = emailString.match(/^([^<]+?)\\s*<([^>]+@[^>]+)>$/);\n if (match) {\n const [, name, email] = match;\n return {\n name: name.trim(),\n email: email.trim(),\n };\n }\n\n return undefined;\n};\n\n//\n// Schemas\n// TODO(wittjosiah): These schemas should be imported from @dxos/schema.\n//\n\nconst ActorRoles = ['user', 'assistant'] as const;\nconst ActorRole = S.Literal(...ActorRoles);\ntype ActorRole = S.Schema.Type<typeof ActorRole>;\n\nconst ActorSchema = S.Struct({\n identityKey: S.optional(S.String),\n email: S.optional(S.String),\n name: S.optional(S.String),\n role: S.optional(ActorRole),\n});\n\nconst Base = S.Struct({\n pending: S.optional(S.Boolean),\n});\ntype Base = S.Schema.Type<typeof Base>;\nconst Text = S.TaggedStruct('text', {\n mimeType: S.optional(S.String),\n text: S.String,\n ...Base.fields,\n}).pipe(S.mutable);\ninterface Text extends S.Schema.Type<typeof Text> {}\n\nconst MessageType = S.Struct({\n id: ObjectId,\n created: S.String.annotations({\n description: 'ISO date string when the message was sent.',\n }),\n sender: ActorSchema.annotations({\n description: 'Identity of the message sender.',\n }),\n blocks: S.Array(Text).annotations({\n description: 'Contents of the message.',\n }),\n properties: S.optional(\n S.mutable(\n S.Record({ key: S.String, value: S.Any }).annotations({\n description: 'Custom properties for specific message types (e.g. attention context, email subject, etc.).',\n }),\n ),\n ),\n}).pipe(\n EchoObject({\n typename: 'dxos.org/type/Message',\n version: '0.2.0',\n }),\n);\ntype MessageType = S.Schema.Type<typeof MessageType>;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport chat from './chat.ts?raw';\nimport chess from './chess.ts?raw';\nimport dataGenerator from './data-generator.ts?raw';\nimport discord from './discord.ts?raw';\nimport echo from './echo.ts?raw';\nimport email from './email.ts?raw';\nimport forexEffect from './forex-effect.ts?raw';\nimport forex from './forex.ts?raw';\nimport gmail from './gmail.ts?raw';\n\nconst removeHeader = (str: string) => str.split('\\n').slice(4).join('\\n');\n\nexport { dataGenerator };\n\nexport type Template = {\n id: string;\n name: string;\n source: string;\n presetId?: string;\n};\n\nexport const templates: Template[] = [\n {\n id: 'dxos.org/script/echo',\n name: 'Echo',\n source: removeHeader(echo),\n },\n {\n id: 'dxos.org/script/forex',\n name: 'Forex',\n source: removeHeader(forex),\n },\n {\n id: 'dxos.org/script/forex-effect',\n name: 'Forex (Effect)',\n source: removeHeader(forexEffect),\n },\n {\n id: 'dxos.org/script/gpt',\n name: 'Gpt',\n source: removeHeader(chat),\n presetId: 'dxos.org/function/gpt',\n },\n {\n id: 'dxos.org/script/chess',\n name: 'Chess',\n source: removeHeader(chess),\n presetId: 'dxos.org/function/chess',\n },\n {\n id: 'dxos.org/script/email',\n name: 'Email',\n source: removeHeader(email),\n presetId: 'dxos.org/function/email',\n },\n {\n id: 'dxos.org/script/discord',\n name: 'Discord',\n source: removeHeader(discord),\n presetId: 'dxos.org/function/discord',\n },\n {\n id: 'dxos.org/script/gmail',\n name: 'Gmail',\n source: removeHeader(gmail),\n presetId: 'dxos.org/function/gmail',\n },\n {\n id: 'dxos.org/script/data-generator',\n name: 'Data Generator',\n source: removeHeader(dataGenerator),\n presetId: 'dxos.org/function/data-generator',\n },\n];\n"],
5
+ "mappings": ";;;AAAA;;;ACAA;;;ACAA;;;ACAA;;;ACAA;;;ACAA;;;ACAA;;;ACAA;;;ACAA;;;ACcA,IAAMA,eAAe,CAACC,QAAgBA,IAAIC,MAAM,IAAA,EAAMC,MAAM,CAAA,EAAGC,KAAK,IAAA;AAW7D,IAAMC,YAAwB;EACnC;IACEC,IAAI;IACJC,MAAM;IACNC,QAAQC,aAAaC,YAAAA;EACvB;EACA;IACEJ,IAAI;IACJC,MAAM;IACNC,QAAQC,aAAaE,aAAAA;EACvB;EACA;IACEL,IAAI;IACJC,MAAM;IACNC,QAAQC,aAAaG,oBAAAA;EACvB;EACA;IACEN,IAAI;IACJC,MAAM;IACNC,QAAQC,aAAaI,YAAAA;IACrBC,UAAU;EACZ;EACA;IACER,IAAI;IACJC,MAAM;IACNC,QAAQC,aAAaM,aAAAA;IACrBD,UAAU;EACZ;EACA;IACER,IAAI;IACJC,MAAM;IACNC,QAAQC,aAAaO,aAAAA;IACrBF,UAAU;EACZ;EACA;IACER,IAAI;IACJC,MAAM;IACNC,QAAQC,aAAaQ,eAAAA;IACrBH,UAAU;EACZ;EACA;IACER,IAAI;IACJC,MAAM;IACNC,QAAQC,aAAaS,aAAAA;IACrBJ,UAAU;EACZ;EACA;IACER,IAAI;IACJC,MAAM;IACNC,QAAQC,aAAaU,sBAAAA;IACrBL,UAAU;EACZ;;",
6
+ "names": ["removeHeader", "str", "split", "slice", "join", "templates", "id", "name", "source", "removeHeader", "echo", "forex", "forexEffect", "chat", "presetId", "chess", "email", "discord", "gmail", "dataGenerator"]
7
+ }
@@ -2,24 +2,24 @@ import { createRequire } from 'node:module';const require = createRequire(import
2
2
  import {
3
3
  useDeployState,
4
4
  useToolbarState
5
- } from "./chunk-W2DAXWHA.mjs";
5
+ } from "./chunk-2GBESIHU.mjs";
6
6
  import {
7
7
  SCRIPT_PLUGIN,
8
8
  meta
9
- } from "./chunk-AEB5TPEW.mjs";
9
+ } from "./chunk-AHXJ6NQU.mjs";
10
10
 
11
- // packages/plugins/plugin-script/src/components/Settings/ScriptObjectSettings.tsx
11
+ // src/components/Settings/ScriptObjectSettings.tsx
12
12
  import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
13
13
  import { Octokit } from "@octokit/core";
14
- import React, { useCallback, useEffect, useState } from "react";
15
- import { createIntent, SettingsAction, useIntentDispatcher } from "@dxos/app-framework";
16
- import { FunctionType, getInvocationUrl, getUserFunctionUrlInMetadata } from "@dxos/functions";
14
+ import React, { useCallback, useState } from "react";
15
+ import { SettingsAction, createIntent, useIntentDispatcher } from "@dxos/app-framework";
16
+ import { FunctionType, getInvocationUrl, getUserFunctionIdInMetadata } from "@dxos/functions";
17
17
  import { log } from "@dxos/log";
18
18
  import { useClient } from "@dxos/react-client";
19
- import { Filter, getMeta, getSpace, Ref, useQuery } from "@dxos/react-client/echo";
20
- import { Button, Clipboard, Input, useControlledState, useTranslation } from "@dxos/react-ui";
19
+ import { Filter, Ref, getMeta, getSpace, useQuery } from "@dxos/react-client/echo";
20
+ import { Button, Clipboard, Input, useAsyncEffect, useControlledState, useTranslation } from "@dxos/react-ui";
21
21
  import { DataType } from "@dxos/schema";
22
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/plugin-script/src/components/Settings/ScriptObjectSettings.tsx";
22
+ var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-script/src/components/Settings/ScriptObjectSettings.tsx";
23
23
  var ScriptObjectSettings = ({ object }) => {
24
24
  var _effect = _useSignals();
25
25
  try {
@@ -56,8 +56,8 @@ var Binding = ({ object }) => {
56
56
  const [fn] = useQuery(space, Filter.type(FunctionType, {
57
57
  source: Ref.make(object)
58
58
  }));
59
- const functionPath = fn && getUserFunctionUrlInMetadata(getMeta(fn));
60
- const functionUrl = functionPath && getInvocationUrl(functionPath, client.config.values.runtime?.services?.edge?.url ?? "", {
59
+ const functionId = fn && getUserFunctionIdInMetadata(getMeta(fn));
60
+ const functionUrl = functionId && getInvocationUrl(functionId, client.config.values.runtime?.services?.edge?.url ?? "", {
61
61
  spaceId: space?.id
62
62
  });
63
63
  const [binding, setBinding] = useControlledState(fn?.binding ?? "");
@@ -116,33 +116,30 @@ var Publishing = ({ object }) => {
116
116
  }));
117
117
  const gistKey = getMeta(object).keys.find(({ source }) => source === "github.com");
118
118
  const [gistUrl, setGistUrl] = useState();
119
- useEffect(() => {
119
+ useAsyncEffect(async () => {
120
120
  const token = githubToken?.token;
121
121
  const gistId = gistKey?.id;
122
122
  if (!token || !gistId) {
123
123
  setGistUrl(void 0);
124
124
  return;
125
125
  }
126
- const timeout = setTimeout(async () => {
127
- try {
128
- const octokit = new Octokit({
129
- auth: githubToken.token
130
- });
131
- const response = await octokit.request("GET /gists/{gist_id}", {
132
- gist_id: gistId
133
- });
134
- setGistUrl(response.data.html_url);
135
- } catch (err) {
136
- log.catch(err, void 0, {
137
- F: __dxlog_file,
138
- L: 135,
139
- S: void 0,
140
- C: (f, a) => f(...a)
141
- });
142
- setGistUrl(void 0);
143
- }
144
- });
145
- return () => clearTimeout(timeout);
126
+ try {
127
+ const octokit = new Octokit({
128
+ auth: githubToken.token
129
+ });
130
+ const response = await octokit.request("GET /gists/{gist_id}", {
131
+ gist_id: gistId
132
+ });
133
+ setGistUrl(response.data.html_url);
134
+ } catch (err) {
135
+ log.catch(err, void 0, {
136
+ F: __dxlog_file,
137
+ L: 134,
138
+ S: void 0,
139
+ C: (f, a) => f(...a)
140
+ });
141
+ setGistUrl(void 0);
142
+ }
146
143
  }, [
147
144
  githubToken,
148
145
  gistKey
@@ -213,13 +210,13 @@ var Publishing = ({ object }) => {
213
210
  };
214
211
  var kebabize = (str) => str.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? "-" : "") + $.toLowerCase());
215
212
 
216
- // packages/plugins/plugin-script/src/components/Settings/ScriptPluginSettings.tsx
213
+ // src/components/Settings/ScriptPluginSettings.tsx
217
214
  import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
218
215
  import React2 from "react";
219
216
  import { useClient as useClient2 } from "@dxos/react-client";
220
217
  import { Button as Button2, Select, useTranslation as useTranslation2 } from "@dxos/react-ui";
221
218
  import { EditorInputModes } from "@dxos/react-ui-editor";
222
- import { DeprecatedFormContainer, DeprecatedFormInput } from "@dxos/react-ui-form";
219
+ import { ControlGroup, ControlItemInput, ControlPage, ControlSection } from "@dxos/react-ui-form";
223
220
  var ScriptPluginSettings = ({ settings }) => {
224
221
  var _effect = _useSignals2();
225
222
  try {
@@ -246,12 +243,16 @@ var ScriptPluginSettings = ({ settings }) => {
246
243
  }
247
244
  ]);
248
245
  };
249
- return /* @__PURE__ */ React2.createElement(DeprecatedFormContainer, null, /* @__PURE__ */ React2.createElement(DeprecatedFormInput, {
250
- label: t("authenticate action label")
246
+ return /* @__PURE__ */ React2.createElement(ControlPage, null, /* @__PURE__ */ React2.createElement(ControlSection, {
247
+ title: t("settings title", {
248
+ ns: meta.id
249
+ })
250
+ }, /* @__PURE__ */ React2.createElement(ControlGroup, null, /* @__PURE__ */ React2.createElement(ControlItemInput, {
251
+ title: t("authenticate action label")
251
252
  }, /* @__PURE__ */ React2.createElement(Button2, {
252
253
  onClick: handleAuthenticate
253
- }, t("authenticate button label"))), /* @__PURE__ */ React2.createElement(DeprecatedFormInput, {
254
- label: t("editor input mode label")
254
+ }, t("authenticate button label"))), /* @__PURE__ */ React2.createElement(ControlItemInput, {
255
+ title: t("editor input mode label")
255
256
  }, /* @__PURE__ */ React2.createElement(Select.Root, {
256
257
  value: settings.editorInputMode ?? "default",
257
258
  onValueChange: (value) => {
@@ -262,20 +263,20 @@ var ScriptPluginSettings = ({ settings }) => {
262
263
  }), /* @__PURE__ */ React2.createElement(Select.Portal, null, /* @__PURE__ */ React2.createElement(Select.Content, null, /* @__PURE__ */ React2.createElement(Select.Viewport, null, EditorInputModes.map((mode) => /* @__PURE__ */ React2.createElement(Select.Option, {
263
264
  key: mode,
264
265
  value: mode
265
- }, t(`settings editor input mode ${mode} label`)))))))));
266
+ }, t(`settings editor input mode ${mode} label`)))), /* @__PURE__ */ React2.createElement(Select.Arrow, null))))))));
266
267
  } finally {
267
268
  _effect.f();
268
269
  }
269
270
  };
270
271
 
271
- // packages/plugins/plugin-script/src/components/TestPanel/TestPanel.tsx
272
+ // src/components/TestPanel/TestPanel.tsx
272
273
  import { useSignals as _useSignals3 } from "@preact-signals/safe-react/tracking";
273
- import React3, { forwardRef, useEffect as useEffect2, useRef, useState as useState2 } from "react";
274
+ import React3, { forwardRef, useEffect, useRef, useState as useState2 } from "react";
274
275
  import { log as log2 } from "@dxos/log";
275
276
  import { Avatar, Icon, Input as Input2, Toolbar, useTranslation as useTranslation3 } from "@dxos/react-ui";
276
277
  import { SyntaxHighlighter } from "@dxos/react-ui-syntax-highlighter";
277
278
  import { errorText, mx } from "@dxos/react-ui-theme";
278
- var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-script/src/components/TestPanel/TestPanel.tsx";
279
+ var __dxlog_file2 = "/__w/dxos/dxos/packages/plugins/plugin-script/src/components/TestPanel/TestPanel.tsx";
279
280
  var TestPanel = ({ classNames, functionUrl }) => {
280
281
  var _effect = _useSignals3();
281
282
  try {
@@ -292,7 +293,7 @@ var TestPanel = ({ classNames, functionUrl }) => {
292
293
  }
293
294
  };
294
295
  const controller = useRef();
295
- useEffect2(() => {
296
+ useEffect(() => {
296
297
  return () => {
297
298
  handleStop();
298
299
  };
@@ -500,7 +501,7 @@ var MessageItem = ({ classNames, message }) => {
500
501
  className: mx(wrapper, type === "request" && "bg-primary-400 dark:bg-primary-600")
501
502
  }, text || "\xD8"), data && /* @__PURE__ */ React3.createElement(SyntaxHighlighter, {
502
503
  language: "json",
503
- className: mx(wrapper, "px-8 py-2 text-xs")
504
+ className: mx(wrapper, "text-xs")
504
505
  }, JSON.stringify(data, null, 2)));
505
506
  } finally {
506
507
  _effect.f();
@@ -519,11 +520,11 @@ var RobotAvatar = () => {
519
520
  }
520
521
  };
521
522
 
522
- // packages/plugins/plugin-script/src/components/TestPanel/TestContainer.tsx
523
+ // src/components/TestPanel/TestContainer.tsx
523
524
  import { useSignals as _useSignals4 } from "@preact-signals/safe-react/tracking";
524
525
  import React4 from "react";
525
526
  import { StackItem } from "@dxos/react-ui-stack";
526
- var TestContainer = ({ script, role }) => {
527
+ var TestContainer = ({ script }) => {
527
528
  var _effect = _useSignals4();
528
529
  try {
529
530
  const state = useToolbarState();
@@ -531,9 +532,7 @@ var TestContainer = ({ script, role }) => {
531
532
  state,
532
533
  script
533
534
  });
534
- return /* @__PURE__ */ React4.createElement(StackItem.Content, {
535
- role
536
- }, /* @__PURE__ */ React4.createElement(TestPanel, {
535
+ return /* @__PURE__ */ React4.createElement(StackItem.Content, null, /* @__PURE__ */ React4.createElement(TestPanel, {
537
536
  functionUrl: state.functionUrl
538
537
  }));
539
538
  } finally {
@@ -541,10 +540,10 @@ var TestContainer = ({ script, role }) => {
541
540
  }
542
541
  };
543
542
 
544
- // packages/plugins/plugin-script/src/components/index.ts
543
+ // src/components/index.ts
545
544
  import { lazy } from "react";
546
- var ScriptContainer = lazy(() => import("./ScriptContainer-4IOOIPBF.mjs"));
547
- var DeploymentDialog = lazy(() => import("./DeploymentDialog-IA4CH6WZ.mjs"));
545
+ var ScriptContainer = lazy(() => import("./ScriptContainer-KPYZN2KY.mjs"));
546
+ var DeploymentDialog = lazy(() => import("./DeploymentDialog-G6EHEPXN.mjs"));
548
547
 
549
548
  export {
550
549
  ScriptObjectSettings,
@@ -555,4 +554,4 @@ export {
555
554
  ScriptContainer,
556
555
  DeploymentDialog
557
556
  };
558
- //# sourceMappingURL=chunk-B4TP3LSZ.mjs.map
557
+ //# sourceMappingURL=chunk-HUHVIOL5.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/Settings/ScriptObjectSettings.tsx", "../../../src/components/Settings/ScriptPluginSettings.tsx", "../../../src/components/TestPanel/TestPanel.tsx", "../../../src/components/TestPanel/TestContainer.tsx", "../../../src/components/index.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Octokit } from '@octokit/core';\nimport React, { type ChangeEvent, useCallback, useState } from 'react';\n\nimport { SettingsAction, createIntent, useIntentDispatcher } from '@dxos/app-framework';\nimport { FunctionType, type ScriptType, getInvocationUrl, getUserFunctionIdInMetadata } from '@dxos/functions';\nimport { log } from '@dxos/log';\nimport { useClient } from '@dxos/react-client';\nimport { Filter, Ref, getMeta, getSpace, useQuery } from '@dxos/react-client/echo';\nimport { Button, Clipboard, Input, useAsyncEffect, useControlledState, useTranslation } from '@dxos/react-ui';\nimport { DataType } from '@dxos/schema';\n\nimport { SCRIPT_PLUGIN } from '../../meta';\n\nexport type ScriptObjectSettingsProps = {\n object: ScriptType;\n};\n\nexport const ScriptObjectSettings = ({ object }: ScriptObjectSettingsProps) => {\n return (\n <>\n <Binding object={object} />\n <Publishing object={object} />\n </>\n );\n};\n\nexport const ScriptProperties = ({ object }: ScriptObjectSettingsProps) => {\n const { t } = useTranslation(SCRIPT_PLUGIN);\n return (\n <Input.Root>\n <Input.Label>{t('description label')}</Input.Label>\n <Input.TextInput\n placeholder={t('description placeholder')}\n value={object.description ?? ''}\n onChange={(event) => {\n object.description = event.target.value;\n }}\n />\n </Input.Root>\n );\n};\n\nconst Binding = ({ object }: ScriptObjectSettingsProps) => {\n const { t } = useTranslation(SCRIPT_PLUGIN);\n const client = useClient();\n const space = getSpace(object);\n const [fn] = useQuery(space, Filter.type(FunctionType, { source: Ref.make(object) }));\n\n const functionId = fn && getUserFunctionIdInMetadata(getMeta(fn));\n const functionUrl =\n functionId &&\n getInvocationUrl(functionId, client.config.values.runtime?.services?.edge?.url ?? '', {\n spaceId: space?.id,\n });\n\n const [binding, setBinding] = useControlledState(fn?.binding ?? '');\n const handleBindingChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n setBinding(event.target.value);\n },\n [setBinding],\n );\n\n const handleBindingBlur = useCallback(() => {\n fn.binding = binding;\n }, [fn, binding]);\n\n if (!fn || !functionUrl) {\n return null;\n }\n\n // TODO(burdon): Use form.\n return (\n <div role='form' className='flex flex-col gap-2 mlb-cardSpacingBlock'>\n <h2>{t('remote function settings heading')}</h2>\n <Input.Root>\n <div role='none' className='flex flex-col gap-1'>\n <Input.Label>{t('function url label')}</Input.Label>\n <div role='none' className='flex gap-1'>\n <Input.TextInput\n disabled\n value={functionUrl}\n onChange={(event) => {\n fn.name = event.target.value;\n }}\n />\n <Clipboard.IconButton value={functionUrl} />\n </div>\n </div>\n </Input.Root>\n <Input.Root>\n <div role='none' className='flex flex-col gap-1'>\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 </div>\n </Input.Root>\n </div>\n );\n};\n\n// TODO(burdon): Move to separate tab?\nconst Publishing = ({ object }: ScriptObjectSettingsProps) => {\n const { t } = useTranslation(SCRIPT_PLUGIN);\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n const space = getSpace(object);\n const [githubToken] = useQuery(space, Filter.type(DataType.AccessToken, { source: 'github.com' }));\n const gistKey = 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 () => dispatch(createIntent(SettingsAction.Open, { plugin: 'dxos.org/plugin/token-manager' })),\n [],\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 = 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 if (response.data.id) {\n meta.keys.push({ source: 'github.com', id: response.data.id });\n }\n }\n } finally {\n setPublishing(false);\n }\n }, [object, githubToken]);\n\n return (\n <div className='flex flex-col gap-4 mlb-cardSpacingBlock'>\n <div>\n <h2>{t('script publish settings label')}</h2>\n <p className='text-description text-sm'>{t('script publish settings description')}</p>\n </div>\n {!githubToken && (\n <div className='flex flex-col gap-2'>\n <span>{t('no github token label')}</span>\n <Button onClick={handleOpenTokenManager}>{t('open token manager label')}</Button>\n </div>\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(publishing ? 'publishing label' : 'publish label')}\n </Button>\n </div>\n )}\n </div>\n );\n};\n\n// TODO(wittjosiah): Factor out.\n// From https://stackoverflow.com/a/67243723/2804332\nconst kebabize = (str: string) => str.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? '-' : '') + $.toLowerCase());\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type Credential } from '@dxos/protocols/proto/dxos/halo/credentials';\nimport { useClient } from '@dxos/react-client';\nimport { Button, Select, useTranslation } from '@dxos/react-ui';\nimport { type EditorInputMode, EditorInputModes } from '@dxos/react-ui-editor';\nimport { ControlGroup, ControlItemInput, ControlPage, ControlSection } from '@dxos/react-ui-form';\n\nimport { meta } from '../../meta';\nimport { type ScriptSettingsProps } from '../../types';\n\nexport const ScriptPluginSettings = ({ settings }: { settings: ScriptSettingsProps }) => {\n const { t } = useTranslation(meta.id);\n const client = useClient();\n\n // TODO(burdon): Check token.\n const handleAuthenticate = async () => {\n const { identityKey } = client.halo.identity.get()!;\n await client.halo.writeCredentials([\n {\n issuer: identityKey,\n issuanceDate: new Date(),\n subject: {\n id: identityKey,\n assertion: {\n '@type': 'dxos.halo.credentials.ServiceAccess',\n serverName: 'hub.dxos.network',\n serverKey: identityKey,\n identityKey,\n capabilities: ['composer:beta'],\n },\n },\n } satisfies Credential,\n ]);\n };\n\n return (\n <ControlPage>\n <ControlSection title={t('settings title', { ns: meta.id })}>\n <ControlGroup>\n {/* TODO(wittjosiah): Hide outside of dev environments. */}\n <ControlItemInput title={t('authenticate action label')}>\n <Button onClick={handleAuthenticate}>{t('authenticate button label')}</Button>\n </ControlItemInput>\n\n <ControlItemInput title={t('editor input mode label')}>\n <Select.Root\n value={settings.editorInputMode ?? 'default'}\n onValueChange={(value) => {\n settings.editorInputMode = value as EditorInputMode;\n }}\n >\n <Select.TriggerButton placeholder={t('select editor input mode placeholder')} />\n <Select.Portal>\n <Select.Content>\n <Select.Viewport>\n {EditorInputModes.map((mode) => (\n <Select.Option key={mode} value={mode}>\n {t(`settings editor input mode ${mode} label`)}\n </Select.Option>\n ))}\n </Select.Viewport>\n <Select.Arrow />\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n </ControlItemInput>\n </ControlGroup>\n </ControlSection>\n </ControlPage>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { forwardRef, useEffect, useRef, useState } from 'react';\n\nimport { log } from '@dxos/log';\nimport { Avatar, Icon, Input, type ThemedClassName, Toolbar, useTranslation } from '@dxos/react-ui';\nimport { SyntaxHighlighter } from '@dxos/react-ui-syntax-highlighter';\nimport { errorText, mx } from '@dxos/react-ui-theme';\n\nimport { SCRIPT_PLUGIN } from '../../meta';\n\ntype State = 'pending' | 'responding';\n\n/**\n * Request or response.\n */\ntype Message = { type: 'request' | 'response'; text?: string; data?: any; error?: Error };\n\nexport type TestPanelProps = ThemedClassName<{\n functionUrl?: string;\n}>;\n\n// TODO(burdon): Need persistent history (currently lost when switching tabs)..\nexport const TestPanel = ({ classNames, functionUrl }: TestPanelProps) => {\n const { t } = useTranslation(SCRIPT_PLUGIN);\n\n const inputRef = useRef<HTMLInputElement>(null);\n const [input, setInput] = useState('');\n const [result, setResult] = useState('');\n const [state, setState] = useState<State | null>(null);\n\n // TODO(burdon): Persistent history (thread).\n const [history, setHistory] = useState<Message[]>([]);\n\n const scrollerRef = useRef<HTMLDivElement>(null);\n const handleScroll = () => {\n if (scrollerRef.current) {\n scrollerRef.current.scrollTop = scrollerRef.current.scrollHeight;\n }\n };\n\n const controller = useRef<AbortController>();\n useEffect(() => {\n return () => {\n handleStop();\n };\n }, []);\n\n const handleStop = () => {\n controller.current?.abort('stop');\n controller.current = undefined;\n };\n\n const handleClear = () => {\n handleStop();\n setInput('');\n setResult('');\n setHistory([]);\n inputRef.current?.focus();\n };\n\n const handleResponse = ({ text, data, error }: { text?: string; data?: any; error?: Error } = {}) => {\n controller.current = undefined;\n setHistory((history) => [...history, { type: 'response', text, data, error } satisfies Message]);\n setResult('');\n setState(null);\n handleScroll();\n };\n\n const handleRequest = async (input: string) => {\n // Returns a promise that resolves when a value has been received.\n try {\n setState('pending');\n\n let data = null;\n // Detect JSON input.\n if (input.charAt(0) === '{') {\n try {\n const validJsonString = input.replace(/'/g, '\"').replace(/([{,]\\s*)([a-zA-Z0-9_]+)(\\s*:)/g, '$1\"$2\"$3');\n data = JSON.parse(validJsonString);\n input = JSON.stringify(data, null, 2);\n } catch (err) {\n inputRef.current?.focus();\n return;\n }\n }\n\n setInput('');\n setResult('');\n setHistory((history) => [...history, { type: 'request', text: input }]);\n setTimeout(() => {\n handleScroll();\n });\n\n // Throws DOMException when aborted.\n controller.current = new AbortController();\n const response = await fetch(functionUrl!, {\n signal: controller.current.signal,\n method: 'POST',\n body: input,\n headers: {\n 'Content-Type': data ? 'application/json' : 'text/plain',\n },\n });\n\n // Check for error.\n if (!response.ok) {\n const text = await response.text();\n handleResponse({ error: new Error(text || response.statusText || String(response.status)) });\n return;\n }\n\n // Check for JSON.\n const contentType = response.headers.get('content-type');\n if (contentType === 'application/json') {\n const data = await response.json();\n handleResponse({ data });\n return;\n }\n\n // Text (including streaming).\n setState('responding');\n let text = '';\n const reader = response.body!.getReader();\n const pump = async ({ done, value }: ReadableStreamReadResult<Uint8Array>): Promise<void> => {\n text = text + new TextDecoder().decode(value);\n if (!controller.current || done) {\n handleResponse({ text });\n return;\n }\n\n setResult(text);\n setTimeout(() => {\n handleScroll();\n });\n\n return reader.read().then(pump);\n };\n\n void reader\n .read()\n .then(pump)\n .catch((err) => {\n if (err.name !== 'AbortError') {\n log.catch(err);\n }\n });\n } catch (err: any) {\n if (err !== 'stop') {\n const error = err instanceof Error ? err : new Error(err);\n handleResponse({ error });\n log.catch(err);\n } else {\n handleResponse();\n }\n }\n };\n\n return (\n <div className={mx('flex flex-col h-full overflow-hidden', classNames)}>\n {/* TODO(burdon): Replace with Thread. */}\n <MessageThread ref={scrollerRef} state={state} result={result} history={history} />\n {/* TODO(burdon): Replace with Form based on the function's input schema. */}\n <Toolbar.Root classNames='p-2'>\n <Input.Root>\n <Input.TextInput\n ref={inputRef}\n autoFocus\n placeholder={t('function request placeholder')}\n value={input}\n onChange={(ev) => setInput(ev.target.value)}\n onKeyDown={(ev) => ev.key === 'Enter' && handleRequest(input)}\n />\n </Input.Root>\n <Toolbar.Button onClick={() => handleRequest(input)}>\n <Icon icon='ph--play--regular' size={4} />\n </Toolbar.Button>\n <Toolbar.Button onClick={() => (state ? handleStop() : handleClear())}>\n <Icon icon={state ? 'ph--stop--regular' : 'ph--trash--regular'} size={4} />\n </Toolbar.Button>\n </Toolbar.Root>\n </div>\n );\n};\n\n// TODO(burdon): Replace with thread?\n// TODO(burdon): Button to edit/re-run question.\ntype MessageThreadProps = {\n state: State | null;\n history: Message[];\n result: string;\n};\n\nconst MessageThread = forwardRef<HTMLDivElement, MessageThreadProps>(\n ({ state, history, result }: MessageThreadProps, forwardedRef) => {\n return (\n <div ref={forwardedRef} className='flex flex-col gap-6 h-full p-2 overflow-x-hidden overflow-y-auto'>\n {history.map((message, i) => (\n <div key={i} className='grid grid-cols-[2rem_1fr_2rem]'>\n <div className='p-1'>{message.type === 'response' && <RobotAvatar />}</div>\n <div className='overflow-auto'>\n <MessageItem message={message} />\n </div>\n </div>\n ))}\n\n {result?.length > 0 && (\n <div className='grid grid-cols-[2rem_1fr_2rem]'>\n <div className='p-1'>\n {(state === 'pending' && <Icon icon='ph--spinner--regular' size={6} classNames='animate-spin' />) || (\n <Icon icon='ph--robot--regular' size={6} classNames='animate-[pulse_1s_ease-in-out_infinite]' />\n )}\n </div>\n <div className='overflow-auto'>\n <MessageItem message={{ type: 'response', text: result }} />\n </div>\n </div>\n )}\n </div>\n );\n },\n);\n\nconst MessageItem = ({ classNames, message }: ThemedClassName<{ message: Message }>) => {\n const { type, text, data, error } = message;\n const wrapper = 'p-1 px-2 rounded-md bg-hoverSurface overflow-auto';\n return (\n <div className={mx('flex', type === 'request' ? 'ml-[1rem] justify-end' : 'mr-[1rem]', classNames)}>\n {error && <div className={mx(wrapper, 'whitespace-pre', errorText)}>{String(error)}</div>}\n\n {text !== undefined && (\n <div className={mx(wrapper, type === 'request' && 'bg-primary-400 dark:bg-primary-600')}>\n {text || '\\u00D8'}\n </div>\n )}\n\n {data && (\n <SyntaxHighlighter language='json' className={mx(wrapper, 'text-xs')}>\n {JSON.stringify(data, null, 2)}\n </SyntaxHighlighter>\n )}\n </div>\n );\n};\n\nconst RobotAvatar = () => (\n <Avatar.Root>\n <Avatar.Content size={6} variant='circle' icon='ph--robot--regular' />\n </Avatar.Root>\n);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type ScriptType } from '@dxos/functions';\nimport { StackItem } from '@dxos/react-ui-stack';\n\nimport { useDeployState, useToolbarState } from '../../hooks';\n\nimport { TestPanel } from './TestPanel';\n\nexport type TestContainerProps = {\n role: string;\n script: ScriptType;\n};\n\nexport const TestContainer = ({ script }: TestContainerProps) => {\n const state = useToolbarState();\n useDeployState({ state, script });\n return (\n <StackItem.Content>\n <TestPanel functionUrl={state.functionUrl} />\n </StackItem.Content>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { lazy } from 'react';\n\nexport * from './Settings';\nexport * from './TestPanel';\nexport { DEPLOYMENT_DIALOG } from './DeploymentDialog';\n\nexport const ScriptContainer = lazy(() => import('./ScriptContainer'));\nexport const DeploymentDialog = lazy(() => import('./DeploymentDialog'));\n"],
5
+ "mappings": "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",
6
+ "names": ["Octokit", "React", "useCallback", "useState", "SettingsAction", "createIntent", "useIntentDispatcher", "FunctionType", "getInvocationUrl", "getUserFunctionIdInMetadata", "log", "useClient", "Filter", "Ref", "getMeta", "getSpace", "useQuery", "Button", "Clipboard", "Input", "useAsyncEffect", "useControlledState", "useTranslation", "DataType", "ScriptObjectSettings", "object", "Binding", "Publishing", "ScriptProperties", "t", "useTranslation", "SCRIPT_PLUGIN", "Input", "Root", "Label", "TextInput", "placeholder", "value", "description", "onChange", "event", "target", "client", "useClient", "space", "getSpace", "fn", "useQuery", "Filter", "type", "FunctionType", "source", "Ref", "make", "functionId", "getUserFunctionIdInMetadata", "getMeta", "functionUrl", "getInvocationUrl", "config", "values", "runtime", "services", "edge", "url", "spaceId", "id", "binding", "setBinding", "useControlledState", "handleBindingChange", "useCallback", "handleBindingBlur", "div", "role", "className", "h2", "disabled", "name", "Clipboard", "IconButton", "onBlur", "dispatchPromise", "dispatch", "useIntentDispatcher", "githubToken", "DataType", "AccessToken", "gistKey", "keys", "find", "gistUrl", "setGistUrl", "useState", "useAsyncEffect", "token", "gistId", "undefined", "octokit", "Octokit", "auth", "response", "request", "gist_id", "data", "html_url", "err", "log", "catch", "handleOpenTokenManager", "createIntent", "SettingsAction", "Open", "plugin", "publishing", "setPublishing", "handlePublish", "load", "filename", "kebabize", "files", "content", "meta", "githubKey", "public", "push", "p", "span", "Button", "onClick", "str", "replace", "$", "ofs", "toLowerCase", "React", "useClient", "Button", "Select", "useTranslation", "EditorInputModes", "ControlGroup", "ControlItemInput", "ControlPage", "ControlSection", "ScriptPluginSettings", "settings", "t", "useTranslation", "meta", "id", "client", "useClient", "handleAuthenticate", "identityKey", "halo", "identity", "get", "writeCredentials", "issuer", "issuanceDate", "Date", "subject", "assertion", "serverName", "serverKey", "capabilities", "React", "ControlPage", "ControlSection", "title", "ns", "ControlGroup", "ControlItemInput", "Button", "onClick", "Select", "Root", "value", "editorInputMode", "onValueChange", "TriggerButton", "placeholder", "Portal", "Content", "Viewport", "EditorInputModes", "map", "mode", "Option", "key", "Arrow", "React", "forwardRef", "useEffect", "useRef", "useState", "log", "Avatar", "Icon", "Input", "Toolbar", "useTranslation", "SyntaxHighlighter", "errorText", "mx", "TestPanel", "classNames", "functionUrl", "t", "useTranslation", "SCRIPT_PLUGIN", "inputRef", "useRef", "input", "setInput", "useState", "result", "setResult", "state", "setState", "history", "setHistory", "scrollerRef", "handleScroll", "current", "scrollTop", "scrollHeight", "controller", "useEffect", "handleStop", "abort", "undefined", "handleClear", "focus", "handleResponse", "text", "data", "error", "type", "handleRequest", "charAt", "validJsonString", "replace", "JSON", "parse", "stringify", "err", "setTimeout", "AbortController", "response", "fetch", "signal", "method", "body", "headers", "ok", "Error", "statusText", "String", "status", "contentType", "get", "json", "reader", "getReader", "pump", "done", "value", "TextDecoder", "decode", "read", "then", "catch", "name", "log", "React", "div", "className", "mx", "MessageThread", "ref", "Toolbar", "Root", "Input", "TextInput", "autoFocus", "placeholder", "onChange", "ev", "target", "onKeyDown", "key", "Button", "onClick", "Icon", "icon", "size", "forwardRef", "forwardedRef", "map", "message", "i", "RobotAvatar", "MessageItem", "length", "wrapper", "errorText", "SyntaxHighlighter", "language", "Avatar", "Content", "variant", "React", "StackItem", "TestContainer", "script", "state", "useToolbarState", "useDeployState", "React", "StackItem", "Content", "TestPanel", "functionUrl", "lazy", "ScriptContainer", "lazy", "DeploymentDialog"]
7
+ }
@@ -1,15 +1,14 @@
1
1
  import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
2
  import {
3
- SCRIPT_PLUGIN
4
- } from "./chunk-AEB5TPEW.mjs";
3
+ meta
4
+ } from "./chunk-AHXJ6NQU.mjs";
5
5
 
6
- // packages/plugins/plugin-script/src/types.ts
6
+ // src/types/schema.ts
7
7
  import { Schema } from "effect";
8
8
  import { SpaceSchema } from "@dxos/client/echo";
9
9
  import { ScriptType } from "@dxos/functions";
10
10
  import { EditorInputMode } from "@dxos/react-ui-editor";
11
11
  (function(ScriptAction2) {
12
- const SCRIPT_ACTION = `${SCRIPT_PLUGIN}/action`;
13
12
  ScriptAction2.CreateScriptSchema = Schema.Struct({
14
13
  name: Schema.optional(Schema.String),
15
14
  // TODO(wittjosiah): Placeholder annotation?
@@ -18,7 +17,7 @@ import { EditorInputMode } from "@dxos/react-ui-editor";
18
17
  })),
19
18
  initialTemplateId: Schema.optional(Schema.String)
20
19
  });
21
- class Create extends Schema.TaggedClass()(`${SCRIPT_ACTION}/create`, {
20
+ class Create extends Schema.TaggedClass()(`${meta.id}/action/create`, {
22
21
  input: Schema.extend(ScriptAction2.CreateScriptSchema, Schema.Struct({
23
22
  space: SpaceSchema
24
23
  })),
@@ -38,4 +37,4 @@ export {
38
37
  ScriptSettingsSchema,
39
38
  ScriptAction
40
39
  };
41
- //# sourceMappingURL=chunk-UESZKXLR.mjs.map
40
+ //# sourceMappingURL=chunk-JIPFLBYA.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/types/schema.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Schema } from 'effect';\n\nimport { SpaceSchema } from '@dxos/client/echo';\nimport { ScriptType } from '@dxos/functions';\nimport { EditorInputMode } from '@dxos/react-ui-editor';\n\nimport { meta } from '../meta';\n\nexport namespace ScriptAction {\n export const CreateScriptSchema = Schema.Struct({\n name: Schema.optional(Schema.String),\n // TODO(wittjosiah): Placeholder annotation?\n gistUrl: Schema.optional(Schema.String.annotations({ title: 'Import from Gist (url)' })),\n initialTemplateId: Schema.optional(Schema.String),\n });\n\n export type CreateScriptProps = Schema.Schema.Type<typeof CreateScriptSchema>;\n\n export class Create extends Schema.TaggedClass<Create>()(`${meta.id}/action/create`, {\n input: Schema.extend(CreateScriptSchema, Schema.Struct({ space: SpaceSchema })),\n output: Schema.Struct({\n object: ScriptType,\n }),\n }) {}\n}\n\nexport const ScriptSettingsSchema = Schema.mutable(\n Schema.Struct({\n editorInputMode: EditorInputMode,\n }),\n);\n\nexport type ScriptSettingsProps = Schema.Schema.Type<typeof ScriptSettingsSchema>;\n"],
5
+ "mappings": ";;;;;;AAIA,SAASA,cAAc;AAEvB,SAASC,mBAAmB;AAC5B,SAASC,kBAAkB;AAC3B,SAASC,uBAAuB;UAIfC,eAAAA;gBACFC,qBAAqBC,OAAOC,OAAO;IAC9CC,MAAMF,OAAOG,SAASH,OAAOI,MAAM;;IAEnCC,SAASL,OAAOG,SAASH,OAAOI,OAAOE,YAAY;MAAEC,OAAO;IAAyB,CAAA,CAAA;IACrFC,mBAAmBR,OAAOG,SAASH,OAAOI,MAAM;EAClD,CAAA;EAIO,MAAMK,eAAeT,OAAOU,YAAW,EAAW,GAAGC,KAAKC,EAAE,kBAAkB;IACnFC,OAAOb,OAAOc,OAAMhB,cAACC,oBAAoBC,OAAOC,OAAO;MAAEc,OAAOC;IAAY,CAAA,CAAA;IAC5EC,QAAQjB,OAAOC,OAAO;MACpBiB,QAAQC;IACV,CAAA;EACF,CAAA,EAAA;EAAI;gBALSV,SAAAA;AAMf,GAhBiBX,iBAAAA,eAAAA,CAAAA,EAAAA;AAkBV,IAAMsB,uBAAuBpB,OAAOqB,QACzCrB,OAAOC,OAAO;EACZqB,iBAAiBC;AACnB,CAAA,CAAA;;",
6
+ "names": ["Schema", "SpaceSchema", "ScriptType", "EditorInputMode", "ScriptAction", "CreateScriptSchema", "Schema", "Struct", "name", "optional", "String", "gistUrl", "annotations", "title", "initialTemplateId", "Create", "TaggedClass", "meta", "id", "input", "extend", "space", "SpaceSchema", "output", "object", "ScriptType", "ScriptSettingsSchema", "mutable", "editorInputMode", "EditorInputMode"]
7
+ }