@dxos/plugin-script 0.6.13-staging.1e988a3 → 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.
- package/README.md +1 -1
- package/dist/lib/browser/AutomationPanel-LJD3HE2U.mjs +78 -0
- package/dist/lib/browser/AutomationPanel-LJD3HE2U.mjs.map +7 -0
- package/dist/lib/browser/ScriptContainer-B3CPWXRE.mjs +423 -0
- package/dist/lib/browser/ScriptContainer-B3CPWXRE.mjs.map +7 -0
- package/dist/lib/browser/chunk-G66MXS4T.mjs +248 -0
- package/dist/lib/browser/chunk-G66MXS4T.mjs.map +7 -0
- package/dist/lib/browser/{chunk-RHEZ5LUU.mjs → chunk-G6H56WFS.mjs} +51 -2
- package/dist/lib/browser/{chunk-RHEZ5LUU.mjs.map → chunk-G6H56WFS.mjs.map} +4 -4
- package/dist/lib/browser/{chunk-DL5XQRQM.mjs → chunk-KHNN3F7J.mjs} +18 -6
- package/dist/lib/browser/chunk-KHNN3F7J.mjs.map +7 -0
- package/dist/lib/browser/{chunk-O4LWBX6A.mjs → chunk-KXVQPS4Y.mjs} +2 -2
- package/dist/lib/browser/{chunk-O4LWBX6A.mjs.map → chunk-KXVQPS4Y.mjs.map} +2 -2
- package/dist/lib/browser/chunk-SGQHRB4P.mjs +17 -0
- package/dist/lib/browser/chunk-SGQHRB4P.mjs.map +7 -0
- package/dist/lib/browser/edge/index.mjs +5 -1
- package/dist/lib/browser/index.mjs +86 -61
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/meta.mjs +1 -1
- package/dist/lib/browser/types/index.mjs +2 -2
- package/dist/lib/node/AutomationPanel-2U3LW3J4.cjs +100 -0
- package/dist/lib/node/AutomationPanel-2U3LW3J4.cjs.map +7 -0
- package/dist/lib/node/ScriptContainer-BV7HMUY5.cjs +425 -0
- package/dist/lib/node/ScriptContainer-BV7HMUY5.cjs.map +7 -0
- package/dist/lib/node/{chunk-5RBVXKXT.cjs → chunk-25PQE7FL.cjs} +6 -6
- package/dist/lib/node/{chunk-5RBVXKXT.cjs.map → chunk-25PQE7FL.cjs.map} +2 -2
- package/dist/lib/node/{chunk-4GTXIELQ.cjs → chunk-ACLCRWDB.cjs} +44 -6
- package/dist/lib/node/chunk-ACLCRWDB.cjs.map +7 -0
- package/dist/lib/node/{TypescriptEditor-M3WWFIP2.cjs → chunk-EJC55SDD.cjs} +18 -8
- package/dist/lib/node/chunk-EJC55SDD.cjs.map +7 -0
- package/dist/lib/node/{chunk-PFH3ROEH.cjs → chunk-FY5KKL5N.cjs} +22 -8
- package/dist/lib/node/chunk-FY5KKL5N.cjs.map +7 -0
- package/dist/lib/node/chunk-JWKMTYYH.cjs +277 -0
- package/dist/lib/node/chunk-JWKMTYYH.cjs.map +7 -0
- package/dist/lib/node/edge/index.cjs +12 -8
- package/dist/lib/node/edge/index.cjs.map +2 -2
- package/dist/lib/node/index.cjs +103 -82
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/meta.cjs +3 -3
- package/dist/lib/node/meta.cjs.map +1 -1
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/types/index.cjs +5 -5
- package/dist/lib/node/types/index.cjs.map +1 -1
- package/dist/lib/node-esm/AutomationPanel-FS47OF3I.mjs +79 -0
- package/dist/lib/node-esm/AutomationPanel-FS47OF3I.mjs.map +7 -0
- package/dist/lib/node-esm/ScriptContainer-HSIOGVP3.mjs +424 -0
- package/dist/lib/node-esm/ScriptContainer-HSIOGVP3.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-3QHVR4VV.mjs +249 -0
- package/dist/lib/node-esm/chunk-3QHVR4VV.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-7EDYDVQH.mjs +47 -0
- package/dist/lib/node-esm/chunk-7EDYDVQH.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-GO7HYFM5.mjs +19 -0
- package/dist/lib/node-esm/chunk-GO7HYFM5.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-LDLNTVAK.mjs +280 -0
- package/dist/lib/node-esm/chunk-LDLNTVAK.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-QMTTZYLF.mjs +255 -0
- package/dist/lib/node-esm/chunk-QMTTZYLF.mjs.map +7 -0
- package/dist/lib/node-esm/edge/index.mjs +24 -0
- package/dist/lib/node-esm/index.mjs +317 -0
- package/dist/lib/node-esm/index.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -0
- package/dist/lib/node-esm/meta.mjs +10 -0
- package/dist/lib/node-esm/meta.mjs.map +7 -0
- package/dist/lib/node-esm/types/index.mjs +13 -0
- package/dist/lib/node-esm/types/index.mjs.map +7 -0
- package/dist/types/src/ScriptPlugin.d.ts.map +1 -1
- package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts +17 -0
- package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts.map +1 -0
- package/dist/types/src/components/AutomationPanel/index.d.ts +4 -0
- package/dist/types/src/components/AutomationPanel/index.d.ts.map +1 -0
- package/dist/types/src/components/{DebugPanel.d.ts → DebugPanel/DebugPanel.d.ts} +2 -1
- package/dist/types/src/components/DebugPanel/DebugPanel.d.ts.map +1 -0
- package/dist/types/src/components/DebugPanel/index.d.ts +2 -0
- package/dist/types/src/components/DebugPanel/index.d.ts.map +1 -0
- package/dist/types/src/components/{ScriptBlock/FrameContainer → FrameContainer}/FrameContainer.d.ts +1 -1
- package/dist/types/src/components/FrameContainer/FrameContainer.d.ts.map +1 -0
- package/dist/types/src/components/FrameContainer/frame.d.ts.map +1 -0
- package/dist/types/src/components/FrameContainer/index.d.ts.map +1 -0
- package/dist/types/src/components/ScriptBlock/ScriptBlock.d.ts +1 -3
- package/dist/types/src/components/ScriptBlock/ScriptBlock.d.ts.map +1 -1
- package/dist/types/src/components/ScriptBlock/ScriptBlock.stories.d.ts +3 -8
- package/dist/types/src/components/ScriptBlock/ScriptBlock.stories.d.ts.map +1 -1
- package/dist/types/src/components/ScriptContainer.d.ts +5 -0
- package/dist/types/src/components/ScriptContainer.d.ts.map +1 -0
- package/dist/types/src/components/ScriptEditor.d.ts +4 -5
- package/dist/types/src/components/ScriptEditor.d.ts.map +1 -1
- package/dist/types/src/components/ScriptSettings/ScriptSettings.d.ts +6 -0
- package/dist/types/src/components/ScriptSettings/ScriptSettings.d.ts.map +1 -0
- package/dist/types/src/components/ScriptSettings/index.d.ts +2 -0
- package/dist/types/src/components/ScriptSettings/index.d.ts.map +1 -0
- package/dist/types/src/components/Toolbar/Toolbar.d.ts +23 -0
- package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -0
- package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts +14 -0
- package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -0
- package/dist/types/src/components/Toolbar/index.d.ts +2 -0
- package/dist/types/src/components/Toolbar/index.d.ts.map +1 -0
- package/dist/types/src/components/{TypescriptEditor.d.ts → TypescriptEditor/TypescriptEditor.d.ts} +1 -2
- package/dist/types/src/components/TypescriptEditor/TypescriptEditor.d.ts.map +1 -0
- package/dist/types/src/components/TypescriptEditor/TypescriptEditor.stories.d.ts +6 -0
- package/dist/types/src/components/TypescriptEditor/TypescriptEditor.stories.d.ts.map +1 -0
- package/dist/types/src/components/TypescriptEditor/index.d.ts +2 -0
- package/dist/types/src/components/TypescriptEditor/index.d.ts.map +1 -0
- package/dist/types/src/components/index.d.ts +3 -3
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/edge/functions.d.ts +7 -0
- package/dist/types/src/edge/functions.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +4 -9
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/templates/chat.d.ts +6 -0
- package/dist/types/src/templates/chat.d.ts.map +1 -0
- package/dist/types/src/templates/chess.d.ts +6 -0
- package/dist/types/src/templates/chess.d.ts.map +1 -0
- package/dist/types/src/templates/echo.d.ts +6 -0
- package/dist/types/src/templates/echo.d.ts.map +1 -0
- package/dist/types/src/templates/email.d.ts +6 -0
- package/dist/types/src/templates/email.d.ts.map +1 -0
- package/dist/types/src/templates/forex.d.ts +6 -0
- package/dist/types/src/templates/forex.d.ts.map +1 -0
- package/dist/types/src/templates.d.ts +8 -0
- package/dist/types/src/templates.d.ts.map +1 -0
- package/dist/types/src/translations.d.ts +2 -0
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/script.d.ts +4 -4
- package/dist/types/src/types/types.d.ts +4 -3
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/package.json +61 -55
- package/src/ScriptPlugin.tsx +26 -39
- package/src/bundler/bundler.test.ts +12 -2
- package/src/components/AutomationPanel/AutomationPanel.tsx +101 -0
- package/src/components/AutomationPanel/index.ts +9 -0
- package/src/components/{DebugPanel.tsx → DebugPanel/DebugPanel.tsx} +83 -78
- package/src/components/DebugPanel/index.ts +5 -0
- package/src/components/{ScriptBlock/FrameContainer → FrameContainer}/FrameContainer.tsx +1 -1
- package/src/components/ScriptBlock/ScriptBlock.stories.tsx +14 -13
- package/src/components/ScriptBlock/ScriptBlock.tsx +23 -51
- package/src/components/ScriptContainer.tsx +22 -0
- package/src/components/ScriptEditor.tsx +58 -55
- package/src/components/ScriptSettings/ScriptSettings.tsx +47 -0
- package/src/components/ScriptSettings/index.ts +5 -0
- package/src/components/Toolbar/Toolbar.stories.tsx +30 -0
- package/src/components/Toolbar/Toolbar.tsx +177 -0
- package/src/components/{ScriptBlock/Splitter → Toolbar}/index.ts +1 -1
- package/src/components/{TypescriptEditor.stories.tsx → TypescriptEditor/TypescriptEditor.stories.tsx} +17 -35
- package/src/components/{TypescriptEditor.tsx → TypescriptEditor/TypescriptEditor.tsx} +1 -3
- package/src/components/TypescriptEditor/index.ts +5 -0
- package/src/components/index.ts +5 -3
- package/src/edge/functions.ts +19 -0
- package/src/meta.ts +15 -0
- package/src/templates/chat.ts +102 -0
- package/src/templates/chess.ts +41 -0
- package/src/templates/echo.ts +15 -0
- package/src/templates/email.ts +38 -0
- package/src/templates/forex.ts +21 -0
- package/src/templates.ts +54 -0
- package/src/translations.ts +2 -0
- package/src/types/types.ts +9 -5
- package/dist/lib/browser/ScriptEditor-5Y3EROG3.mjs +0 -513
- package/dist/lib/browser/ScriptEditor-5Y3EROG3.mjs.map +0 -7
- package/dist/lib/browser/TypescriptEditor-GPE72Y6I.mjs +0 -9
- package/dist/lib/browser/chunk-DL5XQRQM.mjs.map +0 -7
- package/dist/lib/browser/chunk-JBACGDOJ.mjs +0 -21
- package/dist/lib/browser/chunk-JBACGDOJ.mjs.map +0 -7
- package/dist/lib/browser/chunk-MRGOT5RF.mjs +0 -78
- package/dist/lib/browser/chunk-MRGOT5RF.mjs.map +0 -7
- package/dist/lib/node/ScriptEditor-YCUQFWQM.cjs +0 -526
- package/dist/lib/node/ScriptEditor-YCUQFWQM.cjs.map +0 -7
- package/dist/lib/node/TypescriptEditor-M3WWFIP2.cjs.map +0 -7
- package/dist/lib/node/chunk-4GTXIELQ.cjs.map +0 -7
- package/dist/lib/node/chunk-4VMNBXWU.cjs +0 -54
- package/dist/lib/node/chunk-4VMNBXWU.cjs.map +0 -7
- package/dist/lib/node/chunk-IMLDKD5Y.cjs +0 -111
- package/dist/lib/node/chunk-IMLDKD5Y.cjs.map +0 -7
- package/dist/lib/node/chunk-PFH3ROEH.cjs.map +0 -7
- package/dist/types/src/components/DebugPanel.d.ts.map +0 -1
- package/dist/types/src/components/ScriptBlock/FrameContainer/FrameContainer.d.ts.map +0 -1
- package/dist/types/src/components/ScriptBlock/FrameContainer/frame.d.ts.map +0 -1
- package/dist/types/src/components/ScriptBlock/FrameContainer/index.d.ts.map +0 -1
- package/dist/types/src/components/ScriptBlock/Splitter/Splitter.d.ts +0 -15
- package/dist/types/src/components/ScriptBlock/Splitter/Splitter.d.ts.map +0 -1
- package/dist/types/src/components/ScriptBlock/Splitter/Splitter.stories.d.ts +0 -13
- package/dist/types/src/components/ScriptBlock/Splitter/Splitter.stories.d.ts.map +0 -1
- package/dist/types/src/components/ScriptBlock/Splitter/index.d.ts +0 -2
- package/dist/types/src/components/ScriptBlock/Splitter/index.d.ts.map +0 -1
- package/dist/types/src/components/Toolbar.d.ts +0 -13
- package/dist/types/src/components/Toolbar.d.ts.map +0 -1
- package/dist/types/src/components/Toolbar.stories.d.ts +0 -14
- package/dist/types/src/components/Toolbar.stories.d.ts.map +0 -1
- package/dist/types/src/components/TypescriptEditor.d.ts.map +0 -1
- package/dist/types/src/components/TypescriptEditor.stories.d.ts +0 -10
- package/dist/types/src/components/TypescriptEditor.stories.d.ts.map +0 -1
- package/src/components/ScriptBlock/Splitter/Splitter.stories.tsx +0 -37
- package/src/components/ScriptBlock/Splitter/Splitter.tsx +0 -52
- package/src/components/Toolbar.stories.tsx +0 -17
- package/src/components/Toolbar.tsx +0 -147
- package/src/meta.tsx +0 -19
- /package/dist/lib/{browser/TypescriptEditor-GPE72Y6I.mjs.map → node-esm/edge/index.mjs.map} +0 -0
- /package/dist/types/src/components/{ScriptBlock/FrameContainer → FrameContainer}/frame.d.ts +0 -0
- /package/dist/types/src/components/{ScriptBlock/FrameContainer → FrameContainer}/index.d.ts +0 -0
- /package/src/components/{ScriptBlock/FrameContainer → FrameContainer}/frame.html +0 -0
- /package/src/components/{ScriptBlock/FrameContainer → FrameContainer}/frame.tsx +0 -0
- /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": ";;;;;;AAIA,OAAOA,SAASC,WAAWC,QAAQC,gBAAgB;AAEnD,SAASC,WAAW;AACpB,SAASC,QAAQC,MAAMC,OAA6BC,SAASC,oBAAoBC,sBAAsB;AACvG,SAASC,yBAAyB;AAClC,SAASC,UAAU;;AAkBZ,IAAMC,aAAa,CAAC,EACzBC,YACAC,aACAC,SAASC,UACTC,iBACAC,oBAAoB,MAAK,MACT;AAChB,QAAM,EAAEC,EAAC,IAAKC,eAAeC,aAAAA;AAE7B,QAAMC,kBAAkBC,OAAyB,IAAA;AACjD,QAAM,CAACR,SAASS,UAAAA,IAAcC,mBAAmBT,YAAY,EAAA;AAC7D,QAAMU,aAAa,MAAA;AACjBT,sBAAkBF,OAAAA;EACpB;AAEA,QAAMY,WAAWJ,OAAyB,IAAA;AAC1C,QAAM,CAACK,OAAOC,QAAAA,IAAYC,SAAS,EAAA;AACnC,QAAM,CAACC,QAAQC,SAAAA,IAAaF,SAAS,EAAA;AACrC,QAAM,CAACG,OAAOC,QAAAA,IAAYJ,SAAuB,IAAA;AAGjD,QAAM,CAACK,SAASC,UAAAA,IAAcN,SAAoB,CAAA,CAAE;AAEpD,QAAMO,cAAcd,OAAuB,IAAA;AAC3C,QAAMe,eAAe,MAAA;AACnB,QAAID,YAAYE,SAAS;AACvBF,kBAAYE,QAAQC,YAAYH,YAAYE,QAAQE;IACtD;EACF;AAEA,QAAMC,aAAanB,OAAAA;AACnBoB,YAAU,MAAA;AACR,WAAO,MAAA;AACLC,iBAAAA;IACF;EACF,GAAG,CAAA,CAAE;AAEL,QAAMA,aAAa,MAAA;AACjBF,eAAWH,SAASM,MAAM,MAAA;AAC1BH,eAAWH,UAAUO;EACvB;AAEA,QAAMC,cAAc,MAAA;AAClBH,eAAAA;AACAf,aAAS,EAAA;AACTG,cAAU,EAAA;AACVI,eAAW,CAAA,CAAE;AACbT,aAASY,SAASS,MAAAA;EACpB;AAEA,QAAMC,iBAAiB,CAAC,EAAEC,MAAMC,MAAMC,MAAK,IAAmD,CAAC,MAAC;AAC9FV,eAAWH,UAAUO;AACrBV,eAAW,CAACD,aAAY;SAAIA;MAAS;QAAEkB,MAAM;QAAYH;QAAMC;QAAMC;MAAM;KAAoB;AAC/FpB,cAAU,EAAA;AACVE,aAAS,IAAA;AACTI,iBAAAA;EACF;AAEA,QAAMgB,gBAAgB,OAAO1B,WAAAA;AAE3B,QAAI;AACFM,eAAS,SAAA;AAET,UAAIiB,OAAO;AAEX,UAAIvB,OAAM2B,OAAO,CAAA,MAAO,KAAK;AAC3B,YAAI;AACF,gBAAMC,kBAAkB5B,OAAM6B,QAAQ,MAAM,GAAA,EAAKA,QAAQ,mCAAmC,UAAA;AAC5FN,iBAAOO,KAAKC,MAAMH,eAAAA;AAClB5B,UAAAA,SAAQ8B,KAAKE,UAAUT,MAAM,MAAM,CAAA;QACrC,SAASU,KAAK;AACZlC,mBAASY,SAASS,MAAAA;AAClB;QACF;MACF;AAEAnB,eAAS,EAAA;AACTG,gBAAU,EAAA;AACVI,iBAAW,CAACD,aAAY;WAAIA;QAAS;UAAEkB,MAAM;UAAWH,MAAMtB;QAAM;OAAE;AACtEkC,iBAAW,MAAA;AACTxB,qBAAAA;MACF,CAAA;AAGAI,iBAAWH,UAAU,IAAIwB,gBAAAA;AACzB,YAAMC,WAAW,MAAMC,MAAMnD,aAAc;QACzCoD,QAAQxB,WAAWH,QAAQ2B;QAC3BC,QAAQ;QACRC,MAAMxC;QACNyC,SAAS;UACP,gBAAgBlB,OAAO,qBAAqB;QAC9C;MACF,CAAA;AAGA,UAAI,CAACa,SAASM,IAAI;AAChB,cAAMpB,QAAO,MAAMc,SAASd,KAAI;AAChCD,uBAAe;UAAEG,OAAO,IAAImB,MAAMrB,SAAQc,SAASQ,cAAcC,OAAOT,SAASU,MAAM,CAAA;QAAG,CAAA;AAC1F;MACF;AAGA,YAAMC,cAAcX,SAASK,QAAQO,IAAI,cAAA;AACzC,UAAID,gBAAgB,oBAAoB;AACtC,cAAMxB,QAAO,MAAMa,SAASa,KAAI;AAChC5B,uBAAe;UAAEE,MAAAA;QAAK,CAAA;AACtB;MACF;AAGAjB,eAAS,YAAA;AACT,UAAIgB,OAAO;AACX,YAAM4B,SAASd,SAASI,KAAMW,UAAS;AACvC,YAAMC,OAAO,OAAO,EAAEC,MAAMC,MAAK,MAAwC;AACvEhC,eAAOA,OAAO,IAAIiC,YAAAA,EAAcC,OAAOF,KAAAA;AACvC,YAAI,CAACxC,WAAWH,WAAW0C,MAAM;AAC/BhC,yBAAe;YAAEC;UAAK,CAAA;AACtB;QACF;AAEAlB,kBAAUkB,IAAAA;AACVY,mBAAW,MAAA;AACTxB,uBAAAA;QACF,CAAA;AAEA,eAAOwC,OAAOO,KAAI,EAAGC,KAAKN,IAAAA;MAC5B;AAEA,WAAKF,OACFO,KAAI,EACJC,KAAKN,IAAAA,EACLO,MAAM,CAAC1B,QAAAA;AACN,YAAIA,IAAI2B,SAAS,cAAc;AAC7BC,cAAIF,MAAM1B,KAAAA,QAAAA;;;;;;QACZ;MACF,CAAA;IACJ,SAASA,KAAU;AACjB,UAAIA,QAAQ,QAAQ;AAClB,cAAMT,QAAQS,eAAeU,QAAQV,MAAM,IAAIU,MAAMV,GAAAA;AACrDZ,uBAAe;UAAEG;QAAM,CAAA;AACvBqC,YAAIF,MAAM1B,KAAAA,QAAAA;;;;;;MACZ,OAAO;AACLZ,uBAAAA;MACF;IACF;EACF;AAEA,SACE,sBAAA,cAACyC,OAAAA;IAAIC,WAAWC,GAAG,wCAAwC/E,UAAAA;KAEzD,sBAAA,cAAC6E,OAAAA;IAAIG,KAAKxD;IAAasD,WAAU;KAC/B,sBAAA,cAACG,eAAAA;IAAc7D;IAAcF;IAAgBI;OAG/C,sBAAA,cAAC4D,QAAQC,MAAI;IAACnF,YAAW;KACvB,sBAAA,cAACoF,MAAMD,MAAI,MACT,sBAAA,cAACC,MAAMC,WAAS;IACdL,KAAKlE;IACLwE,WAAAA;IACAC,aAAajF,EAAE,8BAAA;IACf+D,OAAOtD;IACPyE,UAAU,CAACC,OAAOzE,SAASyE,GAAGC,OAAOrB,KAAK;IAC1CsB,WAAW,CAACF,OAAOA,GAAGG,QAAQ,WAAWnD,cAAc1B,KAAAA;OAG1DV,qBACC,sBAAA,cAAC+E,MAAMD,MAAI,MACT,sBAAA,cAACC,MAAMC,WAAS;IACdL,KAAKvE;IACLT,YAAW;IACXuF,aAAajF,EAAE,qBAAA;IACf+D,OAAOnE;IACPsF,UAAU,CAACC,OAAO9E,WAAW8E,GAAGC,OAAOrB,MAAMwB,YAAW,CAAA;IACxDC,QAAQjF;OAId,sBAAA,cAACqE,QAAQa,QAAM;IAACC,SAAS,MAAMvD,cAAc1B,KAAAA;KAC3C,sBAAA,cAACkF,MAAAA;IAAKC,MAAK;IAAoBC,MAAM;OAEvC,sBAAA,cAACjB,QAAQa,QAAM;IAACC,SAAS,MAAO5E,QAAQW,WAAAA,IAAeG,YAAAA;KACrD,sBAAA,cAAC+D,MAAAA;IAAKC,MAAM9E,QAAQ,sBAAsB;IAAsB+E,MAAM;;AAKhF;AAKA,IAAMlB,gBAAgB,CAAC,EAAE7D,OAAOF,QAAQI,QAAO,MAA+D;AAC5G,SACE,sBAAA,cAAA,MAAA,UAAA,MACGA,QAAQ8E,IAAI,CAACC,SAASC,MACrB,sBAAA,cAACzB,OAAAA;IAAIe,KAAKU;IAAGxB,WAAU;KACrB,sBAAA,cAACD,OAAAA;IAAIC,WAAU;KAAOuB,QAAQ7D,SAAS,cAAc,sBAAA,cAAC+D,aAAAA,IAAAA,CAAAA,GACtD,sBAAA,cAAC1B,OAAAA;IAAIC,WAAU;KACb,sBAAA,cAAC0B,aAAAA;IAAYH;SAIlBnF,QAAQuF,SAAS,KAChB,sBAAA,cAAC5B,OAAAA;IAAIC,WAAU;KACb,sBAAA,cAACD,OAAAA;IAAIC,WAAU;KACX1D,UAAU,aAAa,sBAAA,cAAC6E,MAAAA;IAAKC,MAAK;IAAuBC,MAAM;IAAGnG,YAAW;QAC7E,sBAAA,cAACiG,MAAAA;IAAKC,MAAK;IAAqBC,MAAM;IAAGnG,YAAW;OAGxD,sBAAA,cAAC6E,OAAAA;IAAIC,WAAU;KACb,sBAAA,cAAC0B,aAAAA;IAAYH,SAAS;MAAE7D,MAAM;MAAYH,MAAMnB;IAAO;;AAMnE;AAEA,IAAMsF,cAAc,CAAC,EAAExG,YAAYqG,QAAO,MAAyC;AACjF,QAAM,EAAE7D,MAAMH,MAAMC,MAAMC,MAAK,IAAK8D;AACpC,QAAMK,UAAU;AAChB,SACE,sBAAA,cAAC7B,OAAAA;IAAIC,WAAWC,GAAG,QAAQvC,SAAS,YAAY,0BAA0B,aAAaxC,UAAAA;KACpFuC,SAAS,sBAAA,cAACsC,OAAAA;IAAIC,WAAWC,GAAG2B,SAAS,2BAAA;KAA+B9C,OAAOrB,KAAAA,CAAAA,GAE3EF,SAASJ,UACR,sBAAA,cAAC4C,OAAAA;IAAIC,WAAWC,GAAG2B,SAASlE,SAAS,aAAa,oCAAA;KAC/CH,QAAQ,MAAA,GAIZC,QACC,sBAAA,cAACqE,mBAAAA;IAAkBC,UAAS;IAAO9B,WAAWC,GAAG2B,SAAS,mBAAA;KACvD7D,KAAKE,UAAUT,MAAM,MAAM,CAAA,CAAA,CAAA;AAKtC;AAEA,IAAMiE,cAAc,MAClB,sBAAA,cAACM,OAAO1B,MAAI;EAACgB,MAAM;EAAGW,SAAQ;GAC5B,sBAAA,cAACD,OAAOE,OAAK,MACX,sBAAA,cAACF,OAAOZ,MAAI;EAACC,MAAK;;",
|
|
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
|