@dxos/plugin-script 0.6.13 → 0.6.14-main.7bd9c89

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 (202) hide show
  1. package/README.md +1 -1
  2. package/dist/lib/browser/AutomationPanel-LJD3HE2U.mjs +78 -0
  3. package/dist/lib/browser/AutomationPanel-LJD3HE2U.mjs.map +7 -0
  4. package/dist/lib/browser/ScriptContainer-B3CPWXRE.mjs +423 -0
  5. package/dist/lib/browser/ScriptContainer-B3CPWXRE.mjs.map +7 -0
  6. package/dist/lib/browser/chunk-G66MXS4T.mjs +248 -0
  7. package/dist/lib/browser/chunk-G66MXS4T.mjs.map +7 -0
  8. package/dist/lib/browser/{chunk-RHEZ5LUU.mjs → chunk-G6H56WFS.mjs} +51 -2
  9. package/dist/lib/browser/{chunk-RHEZ5LUU.mjs.map → chunk-G6H56WFS.mjs.map} +4 -4
  10. package/dist/lib/browser/{chunk-DL5XQRQM.mjs → chunk-KHNN3F7J.mjs} +18 -6
  11. package/dist/lib/browser/chunk-KHNN3F7J.mjs.map +7 -0
  12. package/dist/lib/browser/{chunk-O4LWBX6A.mjs → chunk-KXVQPS4Y.mjs} +2 -2
  13. package/dist/lib/browser/{chunk-O4LWBX6A.mjs.map → chunk-KXVQPS4Y.mjs.map} +2 -2
  14. package/dist/lib/browser/chunk-SGQHRB4P.mjs +17 -0
  15. package/dist/lib/browser/chunk-SGQHRB4P.mjs.map +7 -0
  16. package/dist/lib/browser/edge/index.mjs +5 -1
  17. package/dist/lib/browser/index.mjs +86 -61
  18. package/dist/lib/browser/index.mjs.map +4 -4
  19. package/dist/lib/browser/meta.json +1 -1
  20. package/dist/lib/browser/meta.mjs +1 -1
  21. package/dist/lib/browser/types/index.mjs +2 -2
  22. package/dist/lib/node/AutomationPanel-2U3LW3J4.cjs +100 -0
  23. package/dist/lib/node/AutomationPanel-2U3LW3J4.cjs.map +7 -0
  24. package/dist/lib/node/ScriptContainer-BV7HMUY5.cjs +425 -0
  25. package/dist/lib/node/ScriptContainer-BV7HMUY5.cjs.map +7 -0
  26. package/dist/lib/node/{chunk-5RBVXKXT.cjs → chunk-25PQE7FL.cjs} +6 -6
  27. package/dist/lib/node/{chunk-5RBVXKXT.cjs.map → chunk-25PQE7FL.cjs.map} +2 -2
  28. package/dist/lib/node/{chunk-4GTXIELQ.cjs → chunk-ACLCRWDB.cjs} +44 -6
  29. package/dist/lib/node/chunk-ACLCRWDB.cjs.map +7 -0
  30. package/dist/lib/node/{TypescriptEditor-M3WWFIP2.cjs → chunk-EJC55SDD.cjs} +18 -8
  31. package/dist/lib/node/chunk-EJC55SDD.cjs.map +7 -0
  32. package/dist/lib/node/{chunk-PFH3ROEH.cjs → chunk-FY5KKL5N.cjs} +22 -8
  33. package/dist/lib/node/chunk-FY5KKL5N.cjs.map +7 -0
  34. package/dist/lib/node/chunk-JWKMTYYH.cjs +277 -0
  35. package/dist/lib/node/chunk-JWKMTYYH.cjs.map +7 -0
  36. package/dist/lib/node/edge/index.cjs +12 -8
  37. package/dist/lib/node/edge/index.cjs.map +2 -2
  38. package/dist/lib/node/index.cjs +103 -82
  39. package/dist/lib/node/index.cjs.map +4 -4
  40. package/dist/lib/node/meta.cjs +3 -3
  41. package/dist/lib/node/meta.cjs.map +1 -1
  42. package/dist/lib/node/meta.json +1 -1
  43. package/dist/lib/node/types/index.cjs +5 -5
  44. package/dist/lib/node/types/index.cjs.map +1 -1
  45. package/dist/lib/node-esm/AutomationPanel-FS47OF3I.mjs +79 -0
  46. package/dist/lib/node-esm/AutomationPanel-FS47OF3I.mjs.map +7 -0
  47. package/dist/lib/node-esm/ScriptContainer-HSIOGVP3.mjs +424 -0
  48. package/dist/lib/node-esm/ScriptContainer-HSIOGVP3.mjs.map +7 -0
  49. package/dist/lib/node-esm/chunk-3QHVR4VV.mjs +249 -0
  50. package/dist/lib/node-esm/chunk-3QHVR4VV.mjs.map +7 -0
  51. package/dist/lib/node-esm/chunk-7EDYDVQH.mjs +47 -0
  52. package/dist/lib/node-esm/chunk-7EDYDVQH.mjs.map +7 -0
  53. package/dist/lib/node-esm/chunk-GO7HYFM5.mjs +19 -0
  54. package/dist/lib/node-esm/chunk-GO7HYFM5.mjs.map +7 -0
  55. package/dist/lib/node-esm/chunk-LDLNTVAK.mjs +280 -0
  56. package/dist/lib/node-esm/chunk-LDLNTVAK.mjs.map +7 -0
  57. package/dist/lib/node-esm/chunk-QMTTZYLF.mjs +255 -0
  58. package/dist/lib/node-esm/chunk-QMTTZYLF.mjs.map +7 -0
  59. package/dist/lib/node-esm/edge/index.mjs +24 -0
  60. package/dist/lib/node-esm/index.mjs +317 -0
  61. package/dist/lib/node-esm/index.mjs.map +7 -0
  62. package/dist/lib/node-esm/meta.json +1 -0
  63. package/dist/lib/node-esm/meta.mjs +10 -0
  64. package/dist/lib/node-esm/meta.mjs.map +7 -0
  65. package/dist/lib/node-esm/types/index.mjs +13 -0
  66. package/dist/lib/node-esm/types/index.mjs.map +7 -0
  67. package/dist/types/src/ScriptPlugin.d.ts.map +1 -1
  68. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts +17 -0
  69. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts.map +1 -0
  70. package/dist/types/src/components/AutomationPanel/index.d.ts +4 -0
  71. package/dist/types/src/components/AutomationPanel/index.d.ts.map +1 -0
  72. package/dist/types/src/components/{DebugPanel.d.ts → DebugPanel/DebugPanel.d.ts} +2 -1
  73. package/dist/types/src/components/DebugPanel/DebugPanel.d.ts.map +1 -0
  74. package/dist/types/src/components/DebugPanel/index.d.ts +2 -0
  75. package/dist/types/src/components/DebugPanel/index.d.ts.map +1 -0
  76. package/dist/types/src/components/{ScriptBlock/FrameContainer → FrameContainer}/FrameContainer.d.ts +1 -1
  77. package/dist/types/src/components/FrameContainer/FrameContainer.d.ts.map +1 -0
  78. package/dist/types/src/components/FrameContainer/frame.d.ts.map +1 -0
  79. package/dist/types/src/components/FrameContainer/index.d.ts.map +1 -0
  80. package/dist/types/src/components/ScriptBlock/ScriptBlock.d.ts +1 -3
  81. package/dist/types/src/components/ScriptBlock/ScriptBlock.d.ts.map +1 -1
  82. package/dist/types/src/components/ScriptBlock/ScriptBlock.stories.d.ts +3 -8
  83. package/dist/types/src/components/ScriptBlock/ScriptBlock.stories.d.ts.map +1 -1
  84. package/dist/types/src/components/ScriptContainer.d.ts +5 -0
  85. package/dist/types/src/components/ScriptContainer.d.ts.map +1 -0
  86. package/dist/types/src/components/ScriptEditor.d.ts +4 -5
  87. package/dist/types/src/components/ScriptEditor.d.ts.map +1 -1
  88. package/dist/types/src/components/ScriptSettings/ScriptSettings.d.ts +6 -0
  89. package/dist/types/src/components/ScriptSettings/ScriptSettings.d.ts.map +1 -0
  90. package/dist/types/src/components/ScriptSettings/index.d.ts +2 -0
  91. package/dist/types/src/components/ScriptSettings/index.d.ts.map +1 -0
  92. package/dist/types/src/components/Toolbar/Toolbar.d.ts +23 -0
  93. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -0
  94. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts +14 -0
  95. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -0
  96. package/dist/types/src/components/Toolbar/index.d.ts +2 -0
  97. package/dist/types/src/components/Toolbar/index.d.ts.map +1 -0
  98. package/dist/types/src/components/{TypescriptEditor.d.ts → TypescriptEditor/TypescriptEditor.d.ts} +1 -2
  99. package/dist/types/src/components/TypescriptEditor/TypescriptEditor.d.ts.map +1 -0
  100. package/dist/types/src/components/TypescriptEditor/TypescriptEditor.stories.d.ts +6 -0
  101. package/dist/types/src/components/TypescriptEditor/TypescriptEditor.stories.d.ts.map +1 -0
  102. package/dist/types/src/components/TypescriptEditor/index.d.ts +2 -0
  103. package/dist/types/src/components/TypescriptEditor/index.d.ts.map +1 -0
  104. package/dist/types/src/components/index.d.ts +3 -3
  105. package/dist/types/src/components/index.d.ts.map +1 -1
  106. package/dist/types/src/edge/functions.d.ts +7 -0
  107. package/dist/types/src/edge/functions.d.ts.map +1 -1
  108. package/dist/types/src/meta.d.ts +4 -9
  109. package/dist/types/src/meta.d.ts.map +1 -1
  110. package/dist/types/src/templates/chat.d.ts +6 -0
  111. package/dist/types/src/templates/chat.d.ts.map +1 -0
  112. package/dist/types/src/templates/chess.d.ts +6 -0
  113. package/dist/types/src/templates/chess.d.ts.map +1 -0
  114. package/dist/types/src/templates/echo.d.ts +6 -0
  115. package/dist/types/src/templates/echo.d.ts.map +1 -0
  116. package/dist/types/src/templates/email.d.ts +6 -0
  117. package/dist/types/src/templates/email.d.ts.map +1 -0
  118. package/dist/types/src/templates/forex.d.ts +6 -0
  119. package/dist/types/src/templates/forex.d.ts.map +1 -0
  120. package/dist/types/src/templates.d.ts +8 -0
  121. package/dist/types/src/templates.d.ts.map +1 -0
  122. package/dist/types/src/translations.d.ts +2 -0
  123. package/dist/types/src/translations.d.ts.map +1 -1
  124. package/dist/types/src/types/script.d.ts +4 -4
  125. package/dist/types/src/types/types.d.ts +4 -3
  126. package/dist/types/src/types/types.d.ts.map +1 -1
  127. package/package.json +61 -55
  128. package/src/ScriptPlugin.tsx +26 -39
  129. package/src/bundler/bundler.test.ts +12 -2
  130. package/src/components/AutomationPanel/AutomationPanel.tsx +101 -0
  131. package/src/components/AutomationPanel/index.ts +9 -0
  132. package/src/components/{DebugPanel.tsx → DebugPanel/DebugPanel.tsx} +83 -78
  133. package/src/components/DebugPanel/index.ts +5 -0
  134. package/src/components/{ScriptBlock/FrameContainer → FrameContainer}/FrameContainer.tsx +1 -1
  135. package/src/components/ScriptBlock/ScriptBlock.stories.tsx +14 -13
  136. package/src/components/ScriptBlock/ScriptBlock.tsx +23 -51
  137. package/src/components/ScriptContainer.tsx +22 -0
  138. package/src/components/ScriptEditor.tsx +58 -55
  139. package/src/components/ScriptSettings/ScriptSettings.tsx +47 -0
  140. package/src/components/ScriptSettings/index.ts +5 -0
  141. package/src/components/Toolbar/Toolbar.stories.tsx +30 -0
  142. package/src/components/Toolbar/Toolbar.tsx +177 -0
  143. package/src/components/{ScriptBlock/Splitter → Toolbar}/index.ts +1 -1
  144. package/src/components/{TypescriptEditor.stories.tsx → TypescriptEditor/TypescriptEditor.stories.tsx} +17 -35
  145. package/src/components/{TypescriptEditor.tsx → TypescriptEditor/TypescriptEditor.tsx} +1 -3
  146. package/src/components/TypescriptEditor/index.ts +5 -0
  147. package/src/components/index.ts +5 -3
  148. package/src/edge/functions.ts +19 -0
  149. package/src/meta.ts +15 -0
  150. package/src/templates/chat.ts +102 -0
  151. package/src/templates/chess.ts +41 -0
  152. package/src/templates/echo.ts +15 -0
  153. package/src/templates/email.ts +38 -0
  154. package/src/templates/forex.ts +21 -0
  155. package/src/templates.ts +54 -0
  156. package/src/translations.ts +2 -0
  157. package/src/types/types.ts +9 -5
  158. package/dist/lib/browser/ScriptEditor-5Y3EROG3.mjs +0 -513
  159. package/dist/lib/browser/ScriptEditor-5Y3EROG3.mjs.map +0 -7
  160. package/dist/lib/browser/TypescriptEditor-GPE72Y6I.mjs +0 -9
  161. package/dist/lib/browser/chunk-DL5XQRQM.mjs.map +0 -7
  162. package/dist/lib/browser/chunk-JBACGDOJ.mjs +0 -21
  163. package/dist/lib/browser/chunk-JBACGDOJ.mjs.map +0 -7
  164. package/dist/lib/browser/chunk-MRGOT5RF.mjs +0 -78
  165. package/dist/lib/browser/chunk-MRGOT5RF.mjs.map +0 -7
  166. package/dist/lib/node/ScriptEditor-YCUQFWQM.cjs +0 -526
  167. package/dist/lib/node/ScriptEditor-YCUQFWQM.cjs.map +0 -7
  168. package/dist/lib/node/TypescriptEditor-M3WWFIP2.cjs.map +0 -7
  169. package/dist/lib/node/chunk-4GTXIELQ.cjs.map +0 -7
  170. package/dist/lib/node/chunk-4VMNBXWU.cjs +0 -54
  171. package/dist/lib/node/chunk-4VMNBXWU.cjs.map +0 -7
  172. package/dist/lib/node/chunk-IMLDKD5Y.cjs +0 -111
  173. package/dist/lib/node/chunk-IMLDKD5Y.cjs.map +0 -7
  174. package/dist/lib/node/chunk-PFH3ROEH.cjs.map +0 -7
  175. package/dist/types/src/components/DebugPanel.d.ts.map +0 -1
  176. package/dist/types/src/components/ScriptBlock/FrameContainer/FrameContainer.d.ts.map +0 -1
  177. package/dist/types/src/components/ScriptBlock/FrameContainer/frame.d.ts.map +0 -1
  178. package/dist/types/src/components/ScriptBlock/FrameContainer/index.d.ts.map +0 -1
  179. package/dist/types/src/components/ScriptBlock/Splitter/Splitter.d.ts +0 -15
  180. package/dist/types/src/components/ScriptBlock/Splitter/Splitter.d.ts.map +0 -1
  181. package/dist/types/src/components/ScriptBlock/Splitter/Splitter.stories.d.ts +0 -13
  182. package/dist/types/src/components/ScriptBlock/Splitter/Splitter.stories.d.ts.map +0 -1
  183. package/dist/types/src/components/ScriptBlock/Splitter/index.d.ts +0 -2
  184. package/dist/types/src/components/ScriptBlock/Splitter/index.d.ts.map +0 -1
  185. package/dist/types/src/components/Toolbar.d.ts +0 -13
  186. package/dist/types/src/components/Toolbar.d.ts.map +0 -1
  187. package/dist/types/src/components/Toolbar.stories.d.ts +0 -14
  188. package/dist/types/src/components/Toolbar.stories.d.ts.map +0 -1
  189. package/dist/types/src/components/TypescriptEditor.d.ts.map +0 -1
  190. package/dist/types/src/components/TypescriptEditor.stories.d.ts +0 -10
  191. package/dist/types/src/components/TypescriptEditor.stories.d.ts.map +0 -1
  192. package/src/components/ScriptBlock/Splitter/Splitter.stories.tsx +0 -37
  193. package/src/components/ScriptBlock/Splitter/Splitter.tsx +0 -52
  194. package/src/components/Toolbar.stories.tsx +0 -17
  195. package/src/components/Toolbar.tsx +0 -147
  196. package/src/meta.tsx +0 -19
  197. /package/dist/lib/{browser/TypescriptEditor-GPE72Y6I.mjs.map → node-esm/edge/index.mjs.map} +0 -0
  198. /package/dist/types/src/components/{ScriptBlock/FrameContainer → FrameContainer}/frame.d.ts +0 -0
  199. /package/dist/types/src/components/{ScriptBlock/FrameContainer → FrameContainer}/index.d.ts +0 -0
  200. /package/src/components/{ScriptBlock/FrameContainer → FrameContainer}/frame.html +0 -0
  201. /package/src/components/{ScriptBlock/FrameContainer → FrameContainer}/frame.tsx +0 -0
  202. /package/src/components/{ScriptBlock/FrameContainer → FrameContainer}/index.ts +0 -0
@@ -0,0 +1,249 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import {
3
+ SCRIPT_PLUGIN
4
+ } from "./chunk-GO7HYFM5.mjs";
5
+
6
+ // packages/plugins/experimental/plugin-script/src/components/DebugPanel/DebugPanel.tsx
7
+ import React, { useEffect, useRef, useState } from "react";
8
+ import { log } from "@dxos/log";
9
+ import { Avatar, Icon, Input, Toolbar, useControlledValue, useTranslation } from "@dxos/react-ui";
10
+ import { SyntaxHighlighter } from "@dxos/react-ui-syntax-highlighter";
11
+ import { mx } from "@dxos/react-ui-theme";
12
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/experimental/plugin-script/src/components/DebugPanel/DebugPanel.tsx";
13
+ var DebugPanel = ({ classNames, functionUrl, binding: _binding, onBindingChange, showBindingConfig = false }) => {
14
+ const { t } = useTranslation(SCRIPT_PLUGIN);
15
+ const bindingInputRef = useRef(null);
16
+ const [binding, setBinding] = useControlledValue(_binding ?? "");
17
+ const handleBlur = () => {
18
+ onBindingChange?.(binding);
19
+ };
20
+ const inputRef = useRef(null);
21
+ const [input, setInput] = useState("");
22
+ const [result, setResult] = useState("");
23
+ const [state, setState] = useState(null);
24
+ const [history, setHistory] = useState([]);
25
+ const scrollerRef = useRef(null);
26
+ const handleScroll = () => {
27
+ if (scrollerRef.current) {
28
+ scrollerRef.current.scrollTop = scrollerRef.current.scrollHeight;
29
+ }
30
+ };
31
+ const controller = useRef();
32
+ useEffect(() => {
33
+ return () => {
34
+ handleStop();
35
+ };
36
+ }, []);
37
+ const handleStop = () => {
38
+ controller.current?.abort("stop");
39
+ controller.current = void 0;
40
+ };
41
+ const handleClear = () => {
42
+ handleStop();
43
+ setInput("");
44
+ setResult("");
45
+ setHistory([]);
46
+ inputRef.current?.focus();
47
+ };
48
+ const handleResponse = ({ text, data, error } = {}) => {
49
+ controller.current = void 0;
50
+ setHistory((history2) => [
51
+ ...history2,
52
+ {
53
+ type: "response",
54
+ text,
55
+ data,
56
+ error
57
+ }
58
+ ]);
59
+ setResult("");
60
+ setState(null);
61
+ handleScroll();
62
+ };
63
+ const handleRequest = async (input2) => {
64
+ try {
65
+ setState("pending");
66
+ let data = null;
67
+ if (input2.charAt(0) === "{") {
68
+ try {
69
+ const validJsonString = input2.replace(/'/g, '"').replace(/([{,]\s*)([a-zA-Z0-9_]+)(\s*:)/g, '$1"$2"$3');
70
+ data = JSON.parse(validJsonString);
71
+ input2 = JSON.stringify(data, null, 2);
72
+ } catch (err) {
73
+ inputRef.current?.focus();
74
+ return;
75
+ }
76
+ }
77
+ setInput("");
78
+ setResult("");
79
+ setHistory((history2) => [
80
+ ...history2,
81
+ {
82
+ type: "request",
83
+ text: input2
84
+ }
85
+ ]);
86
+ setTimeout(() => {
87
+ handleScroll();
88
+ });
89
+ controller.current = new AbortController();
90
+ const response = await fetch(functionUrl, {
91
+ signal: controller.current.signal,
92
+ method: "POST",
93
+ body: input2,
94
+ headers: {
95
+ "Content-Type": data ? "application/json" : "text/plain"
96
+ }
97
+ });
98
+ if (!response.ok) {
99
+ const text2 = await response.text();
100
+ handleResponse({
101
+ error: new Error(text2 || response.statusText || String(response.status))
102
+ });
103
+ return;
104
+ }
105
+ const contentType = response.headers.get("content-type");
106
+ if (contentType === "application/json") {
107
+ const data2 = await response.json();
108
+ handleResponse({
109
+ data: data2
110
+ });
111
+ return;
112
+ }
113
+ setState("responding");
114
+ let text = "";
115
+ const reader = response.body.getReader();
116
+ const pump = async ({ done, value }) => {
117
+ text = text + new TextDecoder().decode(value);
118
+ if (!controller.current || done) {
119
+ handleResponse({
120
+ text
121
+ });
122
+ return;
123
+ }
124
+ setResult(text);
125
+ setTimeout(() => {
126
+ handleScroll();
127
+ });
128
+ return reader.read().then(pump);
129
+ };
130
+ void reader.read().then(pump).catch((err) => {
131
+ if (err.name !== "AbortError") {
132
+ log.catch(err, void 0, {
133
+ F: __dxlog_file,
134
+ L: 161,
135
+ S: void 0,
136
+ C: (f, a) => f(...a)
137
+ });
138
+ }
139
+ });
140
+ } catch (err) {
141
+ if (err !== "stop") {
142
+ const error = err instanceof Error ? err : new Error(err);
143
+ handleResponse({
144
+ error
145
+ });
146
+ log.catch(err, void 0, {
147
+ F: __dxlog_file,
148
+ L: 168,
149
+ S: void 0,
150
+ C: (f, a) => f(...a)
151
+ });
152
+ } else {
153
+ handleResponse();
154
+ }
155
+ }
156
+ };
157
+ return /* @__PURE__ */ React.createElement("div", {
158
+ className: mx("flex flex-col h-full overflow-hidden", classNames)
159
+ }, /* @__PURE__ */ React.createElement("div", {
160
+ ref: scrollerRef,
161
+ className: "flex flex-col gap-6 h-full p-2 overflow-x-hidden overflow-y-auto"
162
+ }, /* @__PURE__ */ React.createElement(MessageThread, {
163
+ state,
164
+ result,
165
+ history
166
+ })), /* @__PURE__ */ React.createElement(Toolbar.Root, {
167
+ classNames: "p-2"
168
+ }, /* @__PURE__ */ React.createElement(Input.Root, null, /* @__PURE__ */ React.createElement(Input.TextInput, {
169
+ ref: inputRef,
170
+ autoFocus: true,
171
+ placeholder: t("function request placeholder"),
172
+ value: input,
173
+ onChange: (ev) => setInput(ev.target.value),
174
+ onKeyDown: (ev) => ev.key === "Enter" && handleRequest(input)
175
+ })), showBindingConfig && /* @__PURE__ */ React.createElement(Input.Root, null, /* @__PURE__ */ React.createElement(Input.TextInput, {
176
+ ref: bindingInputRef,
177
+ classNames: "!w-[10rem]",
178
+ placeholder: t("binding placeholder"),
179
+ value: binding,
180
+ onChange: (ev) => setBinding(ev.target.value.toUpperCase()),
181
+ onBlur: handleBlur
182
+ })), /* @__PURE__ */ React.createElement(Toolbar.Button, {
183
+ onClick: () => handleRequest(input)
184
+ }, /* @__PURE__ */ React.createElement(Icon, {
185
+ icon: "ph--play--regular",
186
+ size: 4
187
+ })), /* @__PURE__ */ React.createElement(Toolbar.Button, {
188
+ onClick: () => state ? handleStop() : handleClear()
189
+ }, /* @__PURE__ */ React.createElement(Icon, {
190
+ icon: state ? "ph--stop--regular" : "ph--trash--regular",
191
+ size: 4
192
+ }))));
193
+ };
194
+ var MessageThread = ({ state, result, history }) => {
195
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, history.map((message, i) => /* @__PURE__ */ React.createElement("div", {
196
+ key: i,
197
+ className: "grid grid-cols-[2rem_1fr_2rem]"
198
+ }, /* @__PURE__ */ React.createElement("div", {
199
+ className: "p-1"
200
+ }, message.type === "response" && /* @__PURE__ */ React.createElement(RobotAvatar, null)), /* @__PURE__ */ React.createElement("div", {
201
+ className: "overflow-auto"
202
+ }, /* @__PURE__ */ React.createElement(MessageItem, {
203
+ message
204
+ })))), result?.length > 0 && /* @__PURE__ */ React.createElement("div", {
205
+ className: "grid grid-cols-[2rem_1fr_2rem]"
206
+ }, /* @__PURE__ */ React.createElement("div", {
207
+ className: "p-1"
208
+ }, state === "pending" && /* @__PURE__ */ React.createElement(Icon, {
209
+ icon: "ph--spinner--regular",
210
+ size: 6,
211
+ classNames: "animate-spin"
212
+ }) || /* @__PURE__ */ React.createElement(Icon, {
213
+ icon: "ph--robot--regular",
214
+ size: 6,
215
+ classNames: "animate-[pulse_1s_ease-in-out_infinite]"
216
+ })), /* @__PURE__ */ React.createElement("div", {
217
+ className: "overflow-auto"
218
+ }, /* @__PURE__ */ React.createElement(MessageItem, {
219
+ message: {
220
+ type: "response",
221
+ text: result
222
+ }
223
+ }))));
224
+ };
225
+ var MessageItem = ({ classNames, message }) => {
226
+ const { type, text, data, error } = message;
227
+ const wrapper = "p-1 px-2 rounded-lg bg-hoverSurface overflow-auto";
228
+ return /* @__PURE__ */ React.createElement("div", {
229
+ className: mx("flex", type === "request" ? "ml-[1rem] justify-end" : "mr-[1rem]", classNames)
230
+ }, error && /* @__PURE__ */ React.createElement("div", {
231
+ className: mx(wrapper, "whitespace-pre text-error")
232
+ }, String(error)), text !== void 0 && /* @__PURE__ */ React.createElement("div", {
233
+ className: mx(wrapper, type === "request" && "bg-primary-400 dark:bg-primary-600")
234
+ }, text || "\xD8"), data && /* @__PURE__ */ React.createElement(SyntaxHighlighter, {
235
+ language: "json",
236
+ className: mx(wrapper, "px-8 py-2 text-xs")
237
+ }, JSON.stringify(data, null, 2)));
238
+ };
239
+ var RobotAvatar = () => /* @__PURE__ */ React.createElement(Avatar.Root, {
240
+ size: 6,
241
+ variant: "circle"
242
+ }, /* @__PURE__ */ React.createElement(Avatar.Frame, null, /* @__PURE__ */ React.createElement(Avatar.Icon, {
243
+ icon: "ph--robot--regular"
244
+ })));
245
+
246
+ export {
247
+ DebugPanel
248
+ };
249
+ //# sourceMappingURL=chunk-3QHVR4VV.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/DebugPanel/DebugPanel.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useEffect, useRef, useState } from 'react';\n\nimport { log } from '@dxos/log';\nimport { Avatar, Icon, Input, type ThemedClassName, Toolbar, useControlledValue, useTranslation } from '@dxos/react-ui';\nimport { SyntaxHighlighter } from '@dxos/react-ui-syntax-highlighter';\nimport { 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 DebugPanelProps = ThemedClassName<{\n functionUrl?: string;\n binding?: string;\n onBindingChange?: (binding: string) => void;\n showBindingConfig?: boolean;\n}>;\n\nexport const DebugPanel = ({\n classNames,\n functionUrl,\n binding: _binding,\n onBindingChange,\n showBindingConfig = false,\n}: DebugPanelProps) => {\n const { t } = useTranslation(SCRIPT_PLUGIN);\n\n const bindingInputRef = useRef<HTMLInputElement>(null);\n const [binding, setBinding] = useControlledValue(_binding ?? '');\n const handleBlur = () => {\n onBindingChange?.(binding);\n };\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 -- at least for session (non-space ECHO data?)\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 <div ref={scrollerRef} className='flex flex-col gap-6 h-full p-2 overflow-x-hidden overflow-y-auto'>\n <MessageThread state={state} result={result} history={history} />\n </div>\n\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 {showBindingConfig && (\n <Input.Root>\n <Input.TextInput\n ref={bindingInputRef}\n classNames='!w-[10rem]'\n placeholder={t('binding placeholder')}\n value={binding}\n onChange={(ev) => setBinding(ev.target.value.toUpperCase())}\n onBlur={handleBlur}\n />\n </Input.Root>\n )}\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 delete individual messages.\n// TODO(burdon): Button to edit/re-run question.\nconst MessageThread = ({ state, result, history }: { state: State | null; result: string; history: Message[] }) => {\n return (\n <>\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 {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 </>\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-lg 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 text-error')}>{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, 'px-8 py-2 text-xs')}>\n {JSON.stringify(data, null, 2)}\n </SyntaxHighlighter>\n )}\n </div>\n );\n};\n\nconst RobotAvatar = () => (\n <Avatar.Root size={6} variant='circle'>\n <Avatar.Frame>\n <Avatar.Icon icon='ph--robot--regular' />\n </Avatar.Frame>\n </Avatar.Root>\n);\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "useEffect", "useRef", "useState", "log", "Avatar", "Icon", "Input", "Toolbar", "useControlledValue", "useTranslation", "SyntaxHighlighter", "mx", "DebugPanel", "classNames", "functionUrl", "binding", "_binding", "onBindingChange", "showBindingConfig", "t", "useTranslation", "SCRIPT_PLUGIN", "bindingInputRef", "useRef", "setBinding", "useControlledValue", "handleBlur", "inputRef", "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", "div", "className", "mx", "ref", "MessageThread", "Toolbar", "Root", "Input", "TextInput", "autoFocus", "placeholder", "onChange", "ev", "target", "onKeyDown", "key", "toUpperCase", "onBlur", "Button", "onClick", "Icon", "icon", "size", "map", "message", "i", "RobotAvatar", "MessageItem", "length", "wrapper", "SyntaxHighlighter", "language", "Avatar", "variant", "Frame"]
7
+ }
@@ -0,0 +1,47 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import {
3
+ SCRIPT_PLUGIN
4
+ } from "./chunk-GO7HYFM5.mjs";
5
+
6
+ // packages/plugins/experimental/plugin-script/src/types/script.ts
7
+ import { ref, S, TypedObject } from "@dxos/echo-schema";
8
+ import { TextType } from "@dxos/plugin-markdown/types";
9
+ var ScriptType = class extends TypedObject({
10
+ typename: "dxos.org/type/Script",
11
+ version: "0.1.0"
12
+ })({
13
+ // TODO(burdon): Change to URI?
14
+ name: S.optional(S.String),
15
+ description: S.optional(S.String),
16
+ source: ref(TextType),
17
+ // TODO(burdon): Change to has of deployed content.
18
+ // Whether source has changed since last deploy.
19
+ changed: S.optional(S.Boolean)
20
+ }) {
21
+ };
22
+ var FunctionType = class extends TypedObject({
23
+ typename: "dxos.org/type/Function",
24
+ version: "0.1.0"
25
+ })({
26
+ name: S.optional(S.String),
27
+ version: S.Number,
28
+ // Local binding to a function name.
29
+ // TODO(burdon): Move binding to inner type.
30
+ binding: S.optional(S.String),
31
+ // Reference to a source script if it exists within ECHO.
32
+ source: S.optional(ref(ScriptType))
33
+ }) {
34
+ };
35
+
36
+ // packages/plugins/experimental/plugin-script/src/types/types.ts
37
+ var ScriptAction;
38
+ (function(ScriptAction2) {
39
+ ScriptAction2[ScriptAction2["CREATE"] = `${SCRIPT_PLUGIN}/create`] = "CREATE";
40
+ })(ScriptAction || (ScriptAction = {}));
41
+
42
+ export {
43
+ ScriptType,
44
+ FunctionType,
45
+ ScriptAction
46
+ };
47
+ //# sourceMappingURL=chunk-7EDYDVQH.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/types/script.ts", "../../../src/types/types.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { ref, S, TypedObject } from '@dxos/echo-schema';\nimport { TextType } from '@dxos/plugin-markdown/types';\n\n// TODO(burdon): Which is the outer type? I.e., in the navbar?\n\n/**\n * Source script.\n */\nexport class ScriptType extends TypedObject({ typename: 'dxos.org/type/Script', version: '0.1.0' })({\n // TODO(burdon): Change to URI?\n name: S.optional(S.String),\n description: S.optional(S.String),\n source: ref(TextType),\n // TODO(burdon): Change to has of deployed content.\n // Whether source has changed since last deploy.\n changed: S.optional(S.Boolean),\n}) {}\n\n/**\n * Function deployment.\n */\nexport class FunctionType extends TypedObject({ typename: 'dxos.org/type/Function', version: '0.1.0' })({\n name: S.optional(S.String),\n version: S.Number,\n // Local binding to a function name.\n // TODO(burdon): Move binding to inner type.\n binding: S.optional(S.String),\n // Reference to a source script if it exists within ECHO.\n source: S.optional(ref(ScriptType)),\n}) {}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport type {\n GraphBuilderProvides,\n IntentResolverProvides,\n MetadataRecordsProvides,\n SettingsProvides,\n SurfaceProvides,\n TranslationsProvides,\n} from '@dxos/app-framework';\nimport { type SchemaProvides } from '@dxos/plugin-client';\nimport { type SpaceInitProvides } from '@dxos/plugin-space';\n\nimport { SCRIPT_PLUGIN } from '../meta';\n\nexport enum ScriptAction {\n CREATE = `${SCRIPT_PLUGIN}/create`,\n}\n\nexport type ScriptSettingsProps = {};\n\nexport type ScriptPluginProvides = GraphBuilderProvides &\n IntentResolverProvides &\n MetadataRecordsProvides &\n SchemaProvides &\n SettingsProvides<ScriptSettingsProps> &\n SpaceInitProvides &\n SurfaceProvides &\n TranslationsProvides;\n"],
5
+ "mappings": ";;;;;;AAIA,SAASA,KAAKC,GAAGC,mBAAmB;AACpC,SAASC,gBAAgB;AAOlB,IAAMC,aAAN,cAAyBC,YAAY;EAAEC,UAAU;EAAwBC,SAAS;AAAQ,CAAA,EAAG;;EAElGC,MAAMC,EAAEC,SAASD,EAAEE,MAAM;EACzBC,aAAaH,EAAEC,SAASD,EAAEE,MAAM;EAChCE,QAAQC,IAAIC,QAAAA;;;EAGZC,SAASP,EAAEC,SAASD,EAAEQ,OAAO;AAC/B,CAAA,EAAA;AAAI;AAKG,IAAMC,eAAN,cAA2Bb,YAAY;EAAEC,UAAU;EAA0BC,SAAS;AAAQ,CAAA,EAAG;EACtGC,MAAMC,EAAEC,SAASD,EAAEE,MAAM;EACzBJ,SAASE,EAAEU;;;EAGXC,SAASX,EAAEC,SAASD,EAAEE,MAAM;;EAE5BE,QAAQJ,EAAEC,SAASI,IAAIV,UAAAA,CAAAA;AACzB,CAAA,EAAA;AAAI;;;;UChBQiB,eAAAA;0CACD,GAAGC,aAAAA,SAAsB,IAAA;GADxBD,iBAAAA,eAAAA,CAAAA,EAAAA;",
6
+ "names": ["ref", "S", "TypedObject", "TextType", "ScriptType", "TypedObject", "typename", "version", "name", "S", "optional", "String", "description", "source", "ref", "TextType", "changed", "Boolean", "FunctionType", "Number", "binding", "ScriptAction", "SCRIPT_PLUGIN"]
7
+ }
@@ -0,0 +1,19 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+
3
+ // packages/plugins/experimental/plugin-script/src/meta.ts
4
+ var SCRIPT_PLUGIN = "dxos.org/plugin/script";
5
+ var meta_default = {
6
+ id: SCRIPT_PLUGIN,
7
+ name: "Scripts",
8
+ description: "Distributed functions.",
9
+ tags: [
10
+ "experimental"
11
+ ],
12
+ icon: "ph--code--regular"
13
+ };
14
+
15
+ export {
16
+ SCRIPT_PLUGIN,
17
+ meta_default
18
+ };
19
+ //# sourceMappingURL=chunk-GO7HYFM5.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/meta.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type PluginMeta } from '@dxos/app-framework';\n\nexport const SCRIPT_PLUGIN = 'dxos.org/plugin/script';\n\nexport default {\n id: SCRIPT_PLUGIN,\n name: 'Scripts',\n description: 'Distributed functions.',\n tags: ['experimental'],\n icon: 'ph--code--regular',\n} satisfies PluginMeta;\n"],
5
+ "mappings": ";;;AAMO,IAAMA,gBAAgB;AAE7B,IAAA,eAAe;EACbC,IAAID;EACJE,MAAM;EACNC,aAAa;EACbC,MAAM;IAAC;;EACPC,MAAM;AACR;",
6
+ "names": ["SCRIPT_PLUGIN", "id", "name", "description", "tags", "icon"]
7
+ }
@@ -0,0 +1,280 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+
3
+ // packages/plugins/experimental/plugin-script/src/bundler/bundler.ts
4
+ import { build, initialize } from "esbuild-wasm";
5
+ import { subtleCrypto } from "@dxos/crypto";
6
+ import { invariant } from "@dxos/invariant";
7
+ import { log } from "@dxos/log";
8
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/experimental/plugin-script/src/bundler/bundler.ts";
9
+ var initialized;
10
+ var initializeBundler = async (options) => {
11
+ await (initialized ??= initialize({
12
+ wasmURL: options.wasmUrl
13
+ }));
14
+ };
15
+ var Bundler = class {
16
+ constructor(_options) {
17
+ this._options = _options;
18
+ }
19
+ async bundle(source) {
20
+ const { sandboxedModules: providedModules, ...options } = this._options;
21
+ const createResult = async (result) => {
22
+ return {
23
+ timestamp: Date.now(),
24
+ sourceHash: Buffer.from(await subtleCrypto.digest("SHA-256", Buffer.from(source))),
25
+ ...result
26
+ };
27
+ };
28
+ if (this._options.platform === "browser") {
29
+ invariant(initialized, "Compiler not initialized.", {
30
+ F: __dxlog_file,
31
+ L: 57,
32
+ S: this,
33
+ A: [
34
+ "initialized",
35
+ "'Compiler not initialized.'"
36
+ ]
37
+ });
38
+ await initialized;
39
+ }
40
+ const imports = analyzeSourceFileImports(source);
41
+ try {
42
+ const result = await build({
43
+ platform: options.platform,
44
+ conditions: [
45
+ "workerd",
46
+ "browser"
47
+ ],
48
+ metafile: true,
49
+ write: false,
50
+ entryPoints: [
51
+ "memory:main.tsx"
52
+ ],
53
+ bundle: true,
54
+ format: "esm",
55
+ plugins: [
56
+ {
57
+ name: "memory",
58
+ setup: (build2) => {
59
+ build2.onResolve({
60
+ filter: /^\.\/runtime\.js$/
61
+ }, ({ path }) => {
62
+ return {
63
+ path,
64
+ external: true
65
+ };
66
+ });
67
+ build2.onResolve({
68
+ filter: /^memory:/
69
+ }, ({ path }) => {
70
+ return {
71
+ path: path.split(":")[1],
72
+ namespace: "memory"
73
+ };
74
+ });
75
+ build2.onLoad({
76
+ filter: /.*/,
77
+ namespace: "memory"
78
+ }, ({ path }) => {
79
+ if (path === "main.tsx") {
80
+ return {
81
+ contents: source,
82
+ loader: "tsx"
83
+ };
84
+ }
85
+ });
86
+ for (const module of providedModules) {
87
+ build2.onResolve({
88
+ filter: new RegExp(`^${module}$`)
89
+ }, ({ path }) => {
90
+ return {
91
+ path,
92
+ namespace: "injected-module"
93
+ };
94
+ });
95
+ }
96
+ build2.onLoad({
97
+ filter: /.*/,
98
+ namespace: "injected-module"
99
+ }, ({ path }) => {
100
+ const namedImports = imports.find((entry) => entry.moduleIdentifier === path)?.namedImports ?? [];
101
+ return {
102
+ contents: `
103
+ const { ${namedImports.join(",")} } = window.__DXOS_SANDBOX_MODULES__[${JSON.stringify(path)}];
104
+ export { ${namedImports.join(",")} };
105
+ export default window.__DXOS_SANDBOX_MODULES__[${JSON.stringify(path)}].default;
106
+ `,
107
+ loader: "tsx"
108
+ };
109
+ });
110
+ }
111
+ },
112
+ httpPlugin
113
+ ]
114
+ });
115
+ log("compile complete", result.metafile, {
116
+ F: __dxlog_file,
117
+ L: 117,
118
+ S: this,
119
+ C: (f, a) => f(...a)
120
+ });
121
+ return await createResult({
122
+ imports: this.analyzeImports(result),
123
+ bundle: result.outputFiles[0].text
124
+ });
125
+ } catch (err) {
126
+ return await createResult({
127
+ error: err
128
+ });
129
+ }
130
+ }
131
+ // TODO(dmaretskyi): In the future we can replace the compiler with SWC with plugins running in WASM.
132
+ analyzeImports(result) {
133
+ invariant(result.outputFiles, void 0, {
134
+ F: __dxlog_file,
135
+ L: 130,
136
+ S: this,
137
+ A: [
138
+ "result.outputFiles",
139
+ ""
140
+ ]
141
+ });
142
+ const parsedImports = allMatches(IMPORT_REGEX, result.outputFiles[0].text);
143
+ return Object.values(result.metafile.outputs)[0].imports.map((entry) => {
144
+ const namedImports = [];
145
+ const parsedImport = parsedImports.find((capture) => capture?.[4] === entry.path);
146
+ if (parsedImport?.[2]) {
147
+ NAMED_IMPORTS_REGEX.lastIndex = 0;
148
+ const namedImportsMatch = NAMED_IMPORTS_REGEX.exec(parsedImport[2]);
149
+ if (namedImportsMatch) {
150
+ namedImportsMatch[1].split(",").forEach((importName) => {
151
+ namedImports.push(importName.trim());
152
+ });
153
+ }
154
+ }
155
+ return {
156
+ moduleUrl: entry.path,
157
+ defaultImport: !!parsedImport?.[1],
158
+ namedImports
159
+ };
160
+ });
161
+ }
162
+ analyzeSourceFileImports(code) {
163
+ const parsedImports = allMatches(IMPORT_REGEX, code);
164
+ return parsedImports.map((capture) => {
165
+ return {
166
+ defaultImportName: capture[1],
167
+ namedImports: capture[2]?.split(",").map((importName) => importName.trim()),
168
+ wildcardImportName: capture[3],
169
+ moduleIdentifier: capture[4],
170
+ quotes: capture[5]
171
+ };
172
+ });
173
+ }
174
+ };
175
+ var IMPORT_REGEX = /import(?:(?:(?:[ \n\t]+([^ *\n\t{},]+)[ \n\t]*(?:,|[ \n\t]+))?([ \n\t]*{(?:[ \n\t]*[^ \n\t"'{}]+[ \n\t]*,?)+})?[ \n\t]*)|[ \n\t]*\*[ \n\t]*as[ \n\t]+([^ \n\t{}]+)[ \n\t]+)from[ \n\t]*(?:['"])([^'"\n]+)(['"])/gm;
176
+ var NAMED_IMPORTS_REGEX = /[ \n\t]*{((?:[ \n\t]*[^ \n\t"'{}]+[ \n\t]*,?)+)}[ \n\t]*/gm;
177
+ var allMatches = (regex, str) => {
178
+ regex.lastIndex = 0;
179
+ let match;
180
+ const matches = [];
181
+ while (match = regex.exec(str)) {
182
+ matches.push(match);
183
+ }
184
+ return matches;
185
+ };
186
+ var analyzeSourceFileImports = (code) => {
187
+ const parsedImports = allMatches(IMPORT_REGEX, code);
188
+ return parsedImports.map((capture) => {
189
+ return {
190
+ defaultImportName: capture[1],
191
+ namedImports: capture[2]?.trim().slice(1, -1).split(",").map((importName) => importName.trim()),
192
+ wildcardImportName: capture[3],
193
+ moduleIdentifier: capture[4],
194
+ quotes: capture[5]
195
+ };
196
+ });
197
+ };
198
+ var httpPlugin = {
199
+ name: "http",
200
+ setup: (build2) => {
201
+ build2.onResolve({
202
+ filter: /^https?:\/\//
203
+ }, (args) => ({
204
+ path: args.path,
205
+ namespace: "http-url"
206
+ }));
207
+ build2.onResolve({
208
+ filter: /.*/,
209
+ namespace: "http-url"
210
+ }, (args) => ({
211
+ path: new URL(args.path, args.importer).toString(),
212
+ namespace: "http-url"
213
+ }));
214
+ build2.onLoad({
215
+ filter: /.*/,
216
+ namespace: "http-url"
217
+ }, async (args) => {
218
+ const response = await fetch(args.path);
219
+ return {
220
+ contents: await response.text(),
221
+ loader: "jsx"
222
+ };
223
+ });
224
+ }
225
+ };
226
+
227
+ // raw-loader:./templates/chat.ts?raw
228
+ var chat_default = "//\n// Copyright 2024 DXOS.org\n//\n\n// @ts-ignore\nimport { transformServerSentEvents } from 'https://esm.sh/@dxos/script-toolbox';\n\n/**\n * Chatbot that answers questions based on the context data.\n */\nexport default async ({\n event: {\n data: { request },\n },\n context: { space, ai },\n}: any) => {\n const textBody = await request.text();\n let parsedRequest: any;\n try {\n parsedRequest = JSON.parse(textBody);\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 ${textBody}\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 === ChainInputType.VALUE) {\n value = String(input.value);\n } else if (input.type === ChainInputType.RETRIEVER) {\n value = await getContext({ space });\n } else if (input.type === ChainInputType.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 ChainInputType {\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";
229
+
230
+ // raw-loader:./templates/chess.ts?raw
231
+ var chess_default = "//\n// Copyright 2024 DXOS.org\n//\n\n// @ts-ignore\nimport { Chess } from 'https://esm.sh/chess.js@0.13.1';\n\n/**\n * Plays a random move in a chess game.\n */\nexport default async ({\n event: {\n data: { request },\n },\n context: { space },\n}: any) => {\n const {\n data: {\n objects: [gameId],\n player = 'b',\n },\n } = await request.json();\n\n const { pgn } = await space.crud.query({ id: gameId }).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.crud.update({ id: gameId }, { pgn: newPgn });\n return new Response(game.ascii());\n};\n";
232
+
233
+ // raw-loader:./templates/echo.ts?raw
234
+ var echo_default = "//\n// Copyright 2024 DXOS.org\n//\n\n/**\n * Echos the request data.\n */\nexport default async ({\n event: {\n data: { request },\n },\n}: any) => {\n const data = await request.json();\n return new Response(JSON.stringify(data ?? {}), { headers: { 'Content-Type': 'application/json' } });\n};\n";
235
+
236
+ // raw-loader:./templates/email.ts?raw
237
+ var email_default = "//\n// Copyright 2024 DXOS.org\n//\n\n/**\n * Stores a message into ECHO Mailbox object.\n */\nexport default async ({\n event: {\n data: { request },\n },\n context: { space },\n}: any) => {\n const {\n data: {\n objects: [message],\n },\n } = await request.json();\n\n const mailbox = await space.crud.query({ __typename: 'dxos.org/type/MailboxType' }).first();\n if (!mailbox) {\n return new Response('Mailbox not found.', { status: 500 });\n }\n\n await space.crud.push(\n { id: mailbox.id },\n {\n sender: { email: message.from },\n timestamp: new Date(message.created).toISOString(),\n text: message.body,\n properties: {\n subject: message.subject,\n to: [{ email: message.to }],\n },\n },\n );\n return new Response(JSON.stringify(message));\n};\n";
238
+
239
+ // raw-loader:./templates/forex.ts?raw
240
+ var forex_default = "//\n// Copyright 2024 DXOS.org\n//\n\n/**\n * Returns the exchange rate between two currencies.\n */\nexport default async ({\n event: {\n data: { request },\n },\n}: any) => {\n const { args: [from = 'EUR', to = 'USD'] = [] } = await request.json();\n\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 new Response(rates[to].toString());\n};\n";
241
+
242
+ // packages/plugins/experimental/plugin-script/src/templates.ts
243
+ var removeHeader = (str) => str.split("\n").slice(4).join("\n");
244
+ var templates = [
245
+ {
246
+ id: "dxos.org/script/echo",
247
+ name: "Echo",
248
+ source: removeHeader(echo_default)
249
+ },
250
+ {
251
+ id: "dxos.org/script/forex",
252
+ name: "Forex",
253
+ source: removeHeader(forex_default)
254
+ },
255
+ {
256
+ id: "dxos.org/script/gpt",
257
+ name: "Gpt",
258
+ source: removeHeader(chat_default),
259
+ presetId: "dxos.org/function/gpt"
260
+ },
261
+ {
262
+ id: "dxos.org/script/chess",
263
+ name: "Chess",
264
+ source: removeHeader(chess_default),
265
+ presetId: "dxos.org/function/chess"
266
+ },
267
+ {
268
+ id: "dxos.org/script/email",
269
+ name: "Email",
270
+ source: removeHeader(email_default),
271
+ presetId: "dxos.org/function/email"
272
+ }
273
+ ];
274
+
275
+ export {
276
+ initializeBundler,
277
+ Bundler,
278
+ templates
279
+ };
280
+ //# sourceMappingURL=chunk-LDLNTVAK.mjs.map