@dxos/plugin-script 0.6.10 → 0.6.11-staging.9c4dc38

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 (64) hide show
  1. package/dist/lib/browser/{ScriptEditor-WNCGR5OU.mjs → ScriptEditor-5Y3EROG3.mjs} +126 -65
  2. package/dist/lib/browser/ScriptEditor-5Y3EROG3.mjs.map +7 -0
  3. package/dist/lib/browser/{TypescriptEditor-XTGRVCMY.mjs → TypescriptEditor-GPE72Y6I.mjs} +2 -2
  4. package/dist/lib/browser/{chunk-DX5CSOBP.mjs → chunk-MRGOT5RF.mjs} +25 -26
  5. package/dist/lib/browser/chunk-MRGOT5RF.mjs.map +7 -0
  6. package/dist/lib/browser/{chunk-ZGCETT2W.mjs → chunk-O4LWBX6A.mjs} +7 -2
  7. package/dist/lib/browser/chunk-O4LWBX6A.mjs.map +7 -0
  8. package/dist/lib/browser/index.mjs +6 -6
  9. package/dist/lib/browser/index.mjs.map +2 -2
  10. package/dist/lib/browser/meta.json +1 -1
  11. package/dist/lib/browser/types/index.mjs +1 -1
  12. package/dist/lib/node/{ScriptEditor-RR7AVOQL.cjs → ScriptEditor-YCUQFWQM.cjs} +142 -81
  13. package/dist/lib/node/ScriptEditor-YCUQFWQM.cjs.map +7 -0
  14. package/dist/lib/node/{TypescriptEditor-CRONCQSI.cjs → TypescriptEditor-M3WWFIP2.cjs} +7 -7
  15. package/dist/lib/node/{TypescriptEditor-CRONCQSI.cjs.map → TypescriptEditor-M3WWFIP2.cjs.map} +2 -2
  16. package/dist/lib/node/{chunk-VW2POILW.cjs → chunk-5RBVXKXT.cjs} +9 -4
  17. package/dist/lib/node/chunk-5RBVXKXT.cjs.map +7 -0
  18. package/dist/lib/node/{chunk-RXI576K3.cjs → chunk-IMLDKD5Y.cjs} +28 -29
  19. package/dist/lib/node/chunk-IMLDKD5Y.cjs.map +7 -0
  20. package/dist/lib/node/index.cjs +18 -18
  21. package/dist/lib/node/index.cjs.map +2 -2
  22. package/dist/lib/node/meta.json +1 -1
  23. package/dist/lib/node/types/index.cjs +4 -4
  24. package/dist/lib/node/types/index.cjs.map +1 -1
  25. package/dist/types/src/ScriptPlugin.d.ts.map +1 -1
  26. package/dist/types/src/components/DebugPanel.d.ts +9 -0
  27. package/dist/types/src/components/DebugPanel.d.ts.map +1 -0
  28. package/dist/types/src/components/ScriptBlock/ScriptBlock.stories.d.ts +1 -4
  29. package/dist/types/src/components/ScriptBlock/ScriptBlock.stories.d.ts.map +1 -1
  30. package/dist/types/src/components/ScriptEditor.d.ts.map +1 -1
  31. package/dist/types/src/components/Toolbar.d.ts.map +1 -1
  32. package/dist/types/src/components/Toolbar.stories.d.ts +1 -3
  33. package/dist/types/src/components/Toolbar.stories.d.ts.map +1 -1
  34. package/dist/types/src/components/TypescriptEditor.d.ts +3 -4
  35. package/dist/types/src/components/TypescriptEditor.d.ts.map +1 -1
  36. package/dist/types/src/components/TypescriptEditor.stories.d.ts +1 -4
  37. package/dist/types/src/components/TypescriptEditor.stories.d.ts.map +1 -1
  38. package/dist/types/src/components/index.d.ts +1 -1
  39. package/dist/types/src/types/script.d.ts +12 -0
  40. package/dist/types/src/types/script.d.ts.map +1 -1
  41. package/dist/types/src/types/types.d.ts.map +1 -1
  42. package/package.json +36 -33
  43. package/src/ScriptPlugin.tsx +7 -4
  44. package/src/components/{DetailsPanel.tsx → DebugPanel.tsx} +87 -36
  45. package/src/components/ScriptBlock/ScriptBlock.stories.tsx +27 -20
  46. package/src/components/ScriptEditor.tsx +20 -5
  47. package/src/components/Toolbar.stories.tsx +2 -4
  48. package/src/components/Toolbar.tsx +15 -29
  49. package/src/components/TypescriptEditor.stories.tsx +9 -12
  50. package/src/components/TypescriptEditor.tsx +15 -17
  51. package/src/types/script.ts +13 -0
  52. package/dist/lib/browser/ScriptEditor-WNCGR5OU.mjs.map +0 -7
  53. package/dist/lib/browser/chunk-DX5CSOBP.mjs.map +0 -7
  54. package/dist/lib/browser/chunk-ZGCETT2W.mjs.map +0 -7
  55. package/dist/lib/node/ScriptEditor-RR7AVOQL.cjs.map +0 -7
  56. package/dist/lib/node/chunk-RXI576K3.cjs.map +0 -7
  57. package/dist/lib/node/chunk-VW2POILW.cjs.map +0 -7
  58. package/dist/types/src/components/DetailsPanel.d.ts +0 -9
  59. package/dist/types/src/components/DetailsPanel.d.ts.map +0 -1
  60. package/dist/types/src/data/templates.md.d.ts +0 -3
  61. package/dist/types/src/data/templates.md.d.ts.map +0 -1
  62. package/src/data/templates.md.ts +0 -44
  63. /package/dist/lib/browser/{TypescriptEditor-XTGRVCMY.mjs.map → TypescriptEditor-GPE72Y6I.mjs.map} +0 -0
  64. /package/src/types/{types.tsx → types.ts} +0 -0
@@ -26,17 +26,17 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  mod
27
27
  ));
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var ScriptEditor_RR7AVOQL_exports = {};
30
- __export(ScriptEditor_RR7AVOQL_exports, {
29
+ var ScriptEditor_YCUQFWQM_exports = {};
30
+ __export(ScriptEditor_YCUQFWQM_exports, {
31
31
  ScriptEditor: () => ScriptEditor,
32
32
  default: () => ScriptEditor_default
33
33
  });
34
- module.exports = __toCommonJS(ScriptEditor_RR7AVOQL_exports);
34
+ module.exports = __toCommonJS(ScriptEditor_YCUQFWQM_exports);
35
35
  var import_chunk_PFH3ROEH = require("./chunk-PFH3ROEH.cjs");
36
36
  var import_chunk_4GTXIELQ = require("./chunk-4GTXIELQ.cjs");
37
- var import_chunk_VW2POILW = require("./chunk-VW2POILW.cjs");
37
+ var import_chunk_5RBVXKXT = require("./chunk-5RBVXKXT.cjs");
38
38
  var import_chunk_4VMNBXWU = require("./chunk-4VMNBXWU.cjs");
39
- var import_chunk_RXI576K3 = require("./chunk-RXI576K3.cjs");
39
+ var import_chunk_IMLDKD5Y = require("./chunk-IMLDKD5Y.cjs");
40
40
  var import_prettier = require("prettier");
41
41
  var import_estree = __toESM(require("prettier/plugins/estree"));
42
42
  var import_typescript = __toESM(require("prettier/plugins/typescript"));
@@ -46,18 +46,18 @@ var import_react_client = require("@dxos/react-client");
46
46
  var import_echo = require("@dxos/react-client/echo");
47
47
  var import_halo = require("@dxos/react-client/halo");
48
48
  var import_react_ui = require("@dxos/react-ui");
49
+ var import_react_ui_attention = require("@dxos/react-ui-attention");
49
50
  var import_react_ui_editor = require("@dxos/react-ui-editor");
50
51
  var import_react_ui_theme = require("@dxos/react-ui-theme");
51
52
  var import_react2 = __toESM(require("react"));
52
53
  var import_log2 = require("@dxos/log");
53
54
  var import_react_ui2 = require("@dxos/react-ui");
55
+ var import_react_ui_syntax_highlighter = require("@dxos/react-ui-syntax-highlighter");
54
56
  var import_react_ui_theme2 = require("@dxos/react-ui-theme");
55
- var import_react3 = require("@phosphor-icons/react");
56
- var import_react4 = __toESM(require("react"));
57
+ var import_react3 = __toESM(require("react"));
57
58
  var import_react_ui3 = require("@dxos/react-ui");
58
- var import_react_ui_theme3 = require("@dxos/react-ui-theme");
59
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/experimental/plugin-script/src/components/DetailsPanel.tsx";
60
- var DetailsPanel = ({ classNames, functionUrl, binding: _binding, onBindingChange }) => {
59
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/experimental/plugin-script/src/components/DebugPanel.tsx";
60
+ var DebugPanel = ({ classNames, functionUrl, binding: _binding, onBindingChange }) => {
61
61
  const { t } = (0, import_react_ui2.useTranslation)(import_chunk_4VMNBXWU.SCRIPT_PLUGIN);
62
62
  const bindingInputRef = (0, import_react2.useRef)(null);
63
63
  const [binding, setBinding] = (0, import_react_ui2.useControlledValue)(_binding ?? "");
@@ -67,7 +67,6 @@ var DetailsPanel = ({ classNames, functionUrl, binding: _binding, onBindingChang
67
67
  const inputRef = (0, import_react2.useRef)(null);
68
68
  const [input, setInput] = (0, import_react2.useState)("");
69
69
  const [result, setResult] = (0, import_react2.useState)("");
70
- const resultRef = (0, import_react_ui2.useDynamicRef)(result);
71
70
  const [state, setState] = (0, import_react2.useState)(null);
72
71
  const [history, setHistory] = (0, import_react2.useState)([]);
73
72
  const scrollerRef = (0, import_react2.useRef)(null);
@@ -93,75 +92,112 @@ var DetailsPanel = ({ classNames, functionUrl, binding: _binding, onBindingChang
93
92
  setHistory([]);
94
93
  inputRef.current?.focus();
95
94
  };
96
- const handleDone = () => {
95
+ const handleResponse = ({ text, data, error } = {}) => {
97
96
  controller.current = void 0;
98
97
  setHistory((history2) => [
99
98
  ...history2,
100
99
  {
101
100
  type: "response",
102
- text: resultRef.current
101
+ text,
102
+ data,
103
+ error
103
104
  }
104
105
  ]);
105
106
  setResult("");
106
107
  setState(null);
107
108
  handleScroll();
108
109
  };
109
- const handleRun = async (input2) => {
110
- if (input2.trim().length === 0) {
111
- inputRef.current?.focus();
112
- return;
113
- }
114
- setHistory((history2) => [
115
- ...history2,
116
- {
117
- type: "request",
118
- text: input2
119
- }
120
- ]);
121
- setInput("");
122
- setResult("");
110
+ const handleRequest = async (input2) => {
123
111
  try {
124
112
  setState("pending");
113
+ let data = null;
114
+ if (input2.charAt(0) === "{") {
115
+ try {
116
+ const validJsonString = input2.replace(/'/g, '"').replace(/([{,]\s*)([a-zA-Z0-9_]+)(\s*:)/g, '$1"$2"$3');
117
+ data = JSON.parse(validJsonString);
118
+ input2 = JSON.stringify(data, null, 2);
119
+ } catch (err) {
120
+ inputRef.current?.focus();
121
+ return;
122
+ }
123
+ }
124
+ setInput("");
125
+ setResult("");
126
+ setHistory((history2) => [
127
+ ...history2,
128
+ {
129
+ type: "request",
130
+ text: input2
131
+ }
132
+ ]);
133
+ setTimeout(() => {
134
+ handleScroll();
135
+ });
125
136
  controller.current = new AbortController();
126
137
  const response = await fetch(functionUrl, {
127
138
  signal: controller.current.signal,
128
139
  method: "POST",
129
- body: input2
140
+ body: input2,
141
+ headers: {
142
+ "Content-Type": data ? "application/json" : "text/plain"
143
+ }
130
144
  });
131
145
  if (!response.ok) {
132
- setState(null);
146
+ const text2 = await response.text();
147
+ handleResponse({
148
+ error: new Error(text2 || response.statusText || String(response.status))
149
+ });
150
+ return;
151
+ }
152
+ const contentType = response.headers.get("content-type");
153
+ if (contentType === "application/json") {
154
+ const data2 = await response.json();
155
+ handleResponse({
156
+ data: data2
157
+ });
133
158
  return;
134
159
  }
135
160
  setState("responding");
161
+ let text = "";
136
162
  const reader = response.body.getReader();
137
163
  const pump = async ({ done, value }) => {
138
- setResult((result2) => result2 + new TextDecoder().decode(value));
139
- handleScroll();
164
+ text = text + new TextDecoder().decode(value);
140
165
  if (!controller.current || done) {
141
- handleDone();
166
+ handleResponse({
167
+ text
168
+ });
142
169
  return;
143
170
  }
171
+ setResult(text);
172
+ setTimeout(() => {
173
+ handleScroll();
174
+ });
144
175
  return reader.read().then(pump);
145
176
  };
146
177
  void reader.read().then(pump).catch((err) => {
147
178
  if (err.name !== "AbortError") {
148
179
  import_log2.log.catch(err, void 0, {
149
180
  F: __dxlog_file,
150
- L: 133,
181
+ L: 163,
151
182
  S: void 0,
152
183
  C: (f, a) => f(...a)
153
184
  });
154
185
  }
155
186
  });
156
187
  } catch (err) {
157
- setState(null);
158
188
  if (err !== "stop") {
189
+ const error = err instanceof Error ? err : new Error(err);
190
+ handleResponse({
191
+ error
192
+ });
159
193
  import_log2.log.catch(err, void 0, {
160
194
  F: __dxlog_file,
161
- L: 139,
195
+ L: 170,
162
196
  S: void 0,
163
197
  C: (f, a) => f(...a)
164
198
  });
199
+ } else {
200
+ handleResponse();
165
201
  }
166
202
  }
167
203
  };
@@ -184,7 +220,7 @@ var DetailsPanel = ({ classNames, functionUrl, binding: _binding, onBindingChang
184
220
  placeholder: t("function request placeholder"),
185
221
  value: input,
186
222
  onChange: (ev) => setInput(ev.target.value),
187
- onKeyDown: (ev) => ev.key === "Enter" && handleRun(input)
223
+ onKeyDown: (ev) => ev.key === "Enter" && handleRequest(input)
188
224
  })), /* @__PURE__ */ import_react2.default.createElement(import_react_ui2.Input.Root, null, /* @__PURE__ */ import_react2.default.createElement(import_react_ui2.Input.TextInput, {
189
225
  ref: bindingInputRef,
190
226
  classNames: "!w-[10rem]",
@@ -193,7 +229,7 @@ var DetailsPanel = ({ classNames, functionUrl, binding: _binding, onBindingChang
193
229
  onChange: (ev) => setBinding(ev.target.value.toUpperCase()),
194
230
  onBlur: handleBlur
195
231
  })), /* @__PURE__ */ import_react2.default.createElement(import_react_ui2.Toolbar.Button, {
196
- onClick: () => handleRun(input)
232
+ onClick: () => handleRequest(input)
197
233
  }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui2.Icon, {
198
234
  icon: "ph--play--regular",
199
235
  size: 4
@@ -210,15 +246,34 @@ var RobotAvatar = () => /* @__PURE__ */ import_react2.default.createElement(impo
210
246
  }, /* @__PURE__ */ import_react2.default.createElement(import_react_ui2.Avatar.Frame, null, /* @__PURE__ */ import_react2.default.createElement(import_react_ui2.Avatar.Icon, {
211
247
  icon: "ph--robot--regular"
212
248
  })));
249
+ var MessageItem = ({ classNames, message }) => {
250
+ const { text, data, error } = message;
251
+ if (error) {
252
+ return /* @__PURE__ */ import_react2.default.createElement("span", {
253
+ className: (0, import_react_ui_theme2.mx)(classNames, "whitespace-pre text-error")
254
+ }, String(error));
255
+ } else if (data) {
256
+ return /* @__PURE__ */ import_react2.default.createElement(import_react_ui_syntax_highlighter.SyntaxHighlighter, {
257
+ language: "json",
258
+ className: (0, import_react_ui_theme2.mx)("text-xs", classNames)
259
+ }, JSON.stringify(data, null, 2));
260
+ }
261
+ return /* @__PURE__ */ import_react2.default.createElement("span", {
262
+ className: (0, import_react_ui_theme2.mx)(classNames)
263
+ }, text || "\xD8");
264
+ };
213
265
  var MessageThread = ({ state, result, history }) => {
214
- return /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, history.map(({ type, text }, i) => /* @__PURE__ */ import_react2.default.createElement("div", {
266
+ return /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, history.map((message, i) => /* @__PURE__ */ import_react2.default.createElement("div", {
215
267
  key: i,
216
268
  className: "grid grid-cols-[3rem_1fr]"
217
- }, /* @__PURE__ */ import_react2.default.createElement("div", null, type === "response" && /* @__PURE__ */ import_react2.default.createElement(RobotAvatar, null)), /* @__PURE__ */ import_react2.default.createElement("div", {
218
- className: (0, import_react_ui_theme2.mx)("flex", type === "request" && "justify-end")
219
- }, /* @__PURE__ */ import_react2.default.createElement("span", {
220
- className: (0, import_react_ui_theme2.mx)(type === "request" && "p-1 px-2 rounded-lg bg-hoverSurface")
221
- }, text)))), /* @__PURE__ */ import_react2.default.createElement("div", {
269
+ }, /* @__PURE__ */ import_react2.default.createElement("div", null, message.type === "response" && /* @__PURE__ */ import_react2.default.createElement(RobotAvatar, null)), /* @__PURE__ */ import_react2.default.createElement("div", {
270
+ className: (0, import_react_ui_theme2.mx)("flex", message.type === "request" && "justify-end")
271
+ }, /* @__PURE__ */ import_react2.default.createElement(MessageItem, {
272
+ classNames: [
273
+ message.type === "request" && "p-1 px-2 rounded-lg bg-hoverSurface"
274
+ ],
275
+ message
276
+ })))), /* @__PURE__ */ import_react2.default.createElement("div", {
222
277
  className: "grid grid-cols-[3rem_1fr]"
223
278
  }, /* @__PURE__ */ import_react2.default.createElement("div", null, state === "pending" && /* @__PURE__ */ import_react2.default.createElement(import_react_ui2.Icon, {
224
279
  icon: "ph--spinner--regular",
@@ -228,7 +283,7 @@ var MessageThread = ({ state, result, history }) => {
228
283
  };
229
284
  var Toolbar2 = ({ classNames, deployed, error, functionUrl, showPanel, onDeploy, onFormat, onTogglePanel }) => {
230
285
  const { t } = (0, import_react_ui3.useTranslation)(import_chunk_4VMNBXWU.SCRIPT_PLUGIN);
231
- const [pending, setPending] = (0, import_react4.useState)(false);
286
+ const [pending, setPending] = (0, import_react3.useState)(false);
232
287
  const handleCopyLink = async () => {
233
288
  if (!functionUrl) {
234
289
  return;
@@ -240,11 +295,11 @@ var Toolbar2 = ({ classNames, deployed, error, functionUrl, showPanel, onDeploy,
240
295
  await onDeploy?.();
241
296
  setPending(false);
242
297
  };
243
- return /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.DensityProvider, {
298
+ return /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.DensityProvider, {
244
299
  density: "fine"
245
- }, /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.ElevationProvider, {
300
+ }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.ElevationProvider, {
246
301
  elevation: "chrome"
247
- }, /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Toolbar.Root, {
302
+ }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Toolbar.Root, {
248
303
  classNames: [
249
304
  "p-1",
250
305
  classNames
@@ -252,54 +307,59 @@ var Toolbar2 = ({ classNames, deployed, error, functionUrl, showPanel, onDeploy,
252
307
  style: {
253
308
  contain: "layout"
254
309
  }
255
- }, onFormat && /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Tooltip.Root, null, /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Tooltip.Trigger, {
310
+ }, onFormat && /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Tooltip.Root, null, /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Tooltip.Trigger, {
256
311
  asChild: true
257
- }, /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Toolbar.Button, {
312
+ }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Toolbar.Button, {
258
313
  variant: "ghost",
259
314
  onClick: onFormat
260
- }, /* @__PURE__ */ import_react4.default.createElement(import_react3.MagicWand, {
261
- className: (0, import_react_ui_theme3.getSize)(4)
262
- }))), /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Tooltip.Portal, null, /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Tooltip.Content, null, /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Tooltip.Arrow, null), t("format label")))), /* @__PURE__ */ import_react4.default.createElement("div", {
315
+ }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Icon, {
316
+ icon: "ph--magic-wand--regular",
317
+ size: 4
318
+ }))), /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Tooltip.Portal, null, /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Tooltip.Content, null, /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Tooltip.Arrow, null), t("format label")))), /* @__PURE__ */ import_react3.default.createElement("div", {
263
319
  role: "separator",
264
320
  className: "grow"
265
- }), functionUrl && /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Tooltip.Root, null, /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Tooltip.Trigger, {
321
+ }), error ? /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Tooltip.Root, null, /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Tooltip.Trigger, null, /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Icon, {
322
+ icon: "ph--warning-circle--regular",
323
+ size: 4
324
+ })), /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Tooltip.Portal, null, /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Tooltip.Content, null, /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Tooltip.Arrow, null), error))) : null, functionUrl && deployed && /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Tooltip.Root, null, /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Tooltip.Trigger, {
266
325
  asChild: true
267
- }, /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Toolbar.Button, {
326
+ }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Toolbar.Button, {
268
327
  variant: "ghost",
269
328
  onClick: handleCopyLink
270
- }, /* @__PURE__ */ import_react4.default.createElement(import_react3.Link, {
271
- className: (0, import_react_ui_theme3.getSize)(4)
272
- }))), /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Tooltip.Portal, null, /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Tooltip.Content, null, /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Tooltip.Arrow, null), t("copy link label")))), error ? /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Tooltip.Root, null, /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Tooltip.Trigger, null, /* @__PURE__ */ import_react4.default.createElement(import_react3.WarningCircle, {
273
- className: (0, import_react_ui_theme3.getSize)(4)
274
- })), /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Tooltip.Portal, null, /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Tooltip.Content, null, /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Tooltip.Arrow, null), error))) : deployed ? /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Tooltip.Root, null, /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Tooltip.Trigger, null, /* @__PURE__ */ import_react4.default.createElement(import_react3.Checks, {
275
- className: (0, import_react_ui_theme3.getSize)(4)
276
- })), /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Tooltip.Portal, null, /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Tooltip.Content, null, /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Tooltip.Arrow, null), t("deployed label")))) : null, /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Tooltip.Root, null, /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Tooltip.Trigger, {
329
+ }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Icon, {
330
+ icon: "ph--link--regular",
331
+ size: 4
332
+ }))), /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Tooltip.Portal, null, /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Tooltip.Content, null, /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Tooltip.Arrow, null), t("copy link label")))), /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Tooltip.Root, null, /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Tooltip.Trigger, {
277
333
  asChild: true
278
- }, /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Toolbar.Button, {
334
+ }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Toolbar.Button, {
279
335
  variant: "ghost",
280
336
  onClick: handleDeploy,
281
337
  disabled: pending
282
- }, pending ? /* @__PURE__ */ import_react4.default.createElement(import_react3.CircleNotch, {
283
- className: (0, import_react_ui_theme3.mx)("spinner", (0, import_react_ui_theme3.getSize)(4))
284
- }) : /* @__PURE__ */ import_react4.default.createElement(import_react3.UploadSimple, {
285
- className: (0, import_react_ui_theme3.getSize)(4)
286
- }))), /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Tooltip.Portal, null, /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Tooltip.Content, null, /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Tooltip.Arrow, null), pending ? t("pending label") : t("deploy label")))), onTogglePanel && /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Tooltip.Root, null, /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Tooltip.Trigger, {
338
+ }, pending ? /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Icon, {
339
+ icon: "ph--spinner--regular",
340
+ size: 4,
341
+ classNames: "animate-spin-slow"
342
+ }) : /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Icon, {
343
+ icon: "ph--cloud-arrow-up--regular",
344
+ size: 4
345
+ }))), /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Tooltip.Portal, null, /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Tooltip.Content, null, /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Tooltip.Arrow, null), pending ? t("pending label") : t("deploy label")))), onTogglePanel && /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Tooltip.Root, null, /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Tooltip.Trigger, {
287
346
  asChild: true
288
- }, /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Toolbar.Button, {
347
+ }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Toolbar.Button, {
289
348
  variant: "ghost",
290
349
  onClick: onTogglePanel
291
- }, /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Icon, {
292
- icon: showPanel ? "ph--caret-up--regular" : "ph--caret-down--regular",
350
+ }, /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Icon, {
351
+ icon: showPanel ? "ph--caret-down--regular" : "ph--caret-up--regular",
293
352
  size: 4
294
- }))), /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Tooltip.Portal, null, /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Tooltip.Content, null, /* @__PURE__ */ import_react4.default.createElement(import_react_ui3.Tooltip.Arrow, null), t("toggle details label")))))));
353
+ }))), /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Tooltip.Portal, null, /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Tooltip.Content, null, /* @__PURE__ */ import_react3.default.createElement(import_react_ui3.Tooltip.Arrow, null), t("toggle details label")))))));
295
354
  };
296
355
  var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/plugins/experimental/plugin-script/src/components/ScriptEditor.tsx";
297
356
  var ScriptEditor = ({ env, script, role }) => {
298
357
  const { t } = (0, import_react_ui.useTranslation)(import_chunk_4VMNBXWU.SCRIPT_PLUGIN);
358
+ const hasAttention = (0, import_react_ui_attention.useHasAttention)((0, import_echo.fullyQualifiedId)(script));
299
359
  const client = (0, import_react_client.useClient)();
300
360
  const identity = (0, import_halo.useIdentity)();
301
361
  const space = (0, import_echo.getSpace)(script);
302
- const [fn] = (0, import_echo.useQuery)(space, import_echo.Filter.schema(import_chunk_VW2POILW.FunctionType, (fn2) => fn2.source === script));
362
+ const [fn] = (0, import_echo.useQuery)(space, import_echo.Filter.schema(import_chunk_5RBVXKXT.FunctionType, (fn2) => fn2.source === script));
303
363
  const extensions = (0, import_react.useMemo)(() => [
304
364
  (0, import_react_ui_editor.listener)({
305
365
  onChange: (text) => {
@@ -350,7 +410,7 @@ var ScriptEditor = ({ env, script, role }) => {
350
410
  } catch (err) {
351
411
  import_log.log.catch(err, void 0, {
352
412
  F: __dxlog_file2,
353
- L: 92,
413
+ L: 102,
354
414
  S: void 0,
355
415
  C: (f, a) => f(...a)
356
416
  });
@@ -390,14 +450,14 @@ var ScriptEditor = ({ env, script, role }) => {
390
450
  functionVersionNumber
391
451
  }, {
392
452
  F: __dxlog_file2,
393
- L: 127,
453
+ L: 137,
394
454
  S: void 0,
395
455
  C: (f, a) => f(...a)
396
456
  });
397
457
  if (fn) {
398
458
  fn.version = functionVersionNumber;
399
459
  }
400
- const deployedFunction = fn ?? space.db.add((0, import_echo.create)(import_chunk_VW2POILW.FunctionType, {
460
+ const deployedFunction = fn ?? space.db.add((0, import_echo.create)(import_chunk_5RBVXKXT.FunctionType, {
401
461
  version: functionVersionNumber,
402
462
  source: script
403
463
  }));
@@ -407,7 +467,7 @@ var ScriptEditor = ({ env, script, role }) => {
407
467
  } catch (err) {
408
468
  import_log.log.catch(err, void 0, {
409
469
  F: __dxlog_file2,
410
- L: 137,
470
+ L: 147,
411
471
  S: void 0,
412
472
  C: (f, a) => f(...a)
413
473
  });
@@ -436,14 +496,15 @@ var ScriptEditor = ({ env, script, role }) => {
436
496
  ]);
437
497
  return /* @__PURE__ */ import_react.default.createElement("div", {
438
498
  role: "none",
439
- className: (0, import_react_ui_theme.mx)(role === "article" && "row-span-2", "flex flex-col is-full bs-full overflow-hidden")
440
- }, /* @__PURE__ */ import_react.default.createElement(import_chunk_RXI576K3.TypescriptEditor, {
499
+ className: (0, import_react_ui_theme.mx)("flex flex-col is-full bs-full overflow-hidden", role === "article" && "row-span-2", hasAttention && "attention-surface")
500
+ }, /* @__PURE__ */ import_react.default.createElement(import_chunk_IMLDKD5Y.TypescriptEditor, {
441
501
  id: script.id,
442
502
  env,
443
503
  initialValue,
444
504
  extensions,
445
- className: "flex is-full bs-full overflow-hidden border-b border-separator"
505
+ className: "flex is-full bs-full overflow-hidden ch-focus-ring-inset-over-all"
446
506
  }), /* @__PURE__ */ import_react.default.createElement(Toolbar2, {
507
+ classNames: "border-t border-separator",
447
508
  deployed: Boolean(existingFunctionUrl) && !script.changed,
448
509
  functionUrl,
449
510
  error,
@@ -451,7 +512,7 @@ var ScriptEditor = ({ env, script, role }) => {
451
512
  onDeploy: handleDeploy,
452
513
  onFormat: handleFormat,
453
514
  onTogglePanel: async () => setShowPanel((showDetails) => !showDetails)
454
- }), showPanel && /* @__PURE__ */ import_react.default.createElement(DetailsPanel, {
515
+ }), showPanel && /* @__PURE__ */ import_react.default.createElement(DebugPanel, {
455
516
  functionUrl,
456
517
  binding: fn?.binding,
457
518
  onBindingChange: handleBindingChange
@@ -462,4 +523,4 @@ var ScriptEditor_default = ScriptEditor;
462
523
  0 && (module.exports = {
463
524
  ScriptEditor
464
525
  });
465
- //# sourceMappingURL=ScriptEditor-RR7AVOQL.cjs.map
526
+ //# sourceMappingURL=ScriptEditor-YCUQFWQM.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/ScriptEditor.tsx", "../../../src/components/DebugPanel.tsx", "../../../src/components/Toolbar.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type DID } from 'iso-did/types';\nimport { format } from 'prettier';\nimport prettierPluginEstree from 'prettier/plugins/estree';\nimport prettierPluginTypescript from 'prettier/plugins/typescript';\nimport React, { useCallback, useMemo, useState } from 'react';\n\nimport { log } from '@dxos/log';\nimport { useClient } from '@dxos/react-client';\nimport {\n create,\n createDocAccessor,\n Filter,\n fullyQualifiedId,\n getMeta,\n getSpace,\n useQuery,\n} from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { useTranslation } from '@dxos/react-ui';\nimport { useHasAttention } from '@dxos/react-ui-attention';\nimport { createDataExtensions, listener } from '@dxos/react-ui-editor';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { DebugPanel } from './DebugPanel';\nimport { Toolbar } from './Toolbar';\nimport { TypescriptEditor, type TypescriptEditorProps } from './TypescriptEditor';\nimport { Bundler } from '../bundler';\nimport {\n getUserFunctionUrlInMetadata,\n publicKeyToDid,\n setUserFunctionUrlInMetadata,\n uploadWorkerFunction,\n} from '../edge';\nimport { SCRIPT_PLUGIN } from '../meta';\nimport { FunctionType, type ScriptType } from '../types';\n\nexport type ScriptEditorProps = {\n script: ScriptType;\n role?: string;\n} & Pick<TypescriptEditorProps, 'env'>;\n\nexport const ScriptEditor = ({ env, script, role }: ScriptEditorProps) => {\n const { t } = useTranslation(SCRIPT_PLUGIN);\n const hasAttention = useHasAttention(fullyQualifiedId(script));\n const client = useClient();\n const identity = useIdentity();\n const space = getSpace(script);\n const [fn] = useQuery(\n space,\n Filter.schema(FunctionType, (fn) => fn.source === script),\n );\n\n const extensions = useMemo(\n () => [\n listener({\n onChange: (text) => {\n if (script.source && script.source?.content !== text) {\n script.changed = true;\n }\n },\n }),\n createDataExtensions({\n id: script.id,\n text: script.source && createDocAccessor(script.source, ['content']),\n space,\n identity,\n }),\n ],\n [script, script.source, space, identity],\n );\n\n const [showPanel, setShowPanel] = useState(false);\n const initialValue = useMemo(() => script.source?.content, [script.source]);\n const existingFunctionUrl = fn && getUserFunctionUrlInMetadata(getMeta(fn));\n const [error, setError] = useState<string>();\n\n const handleBindingChange = useCallback(\n (binding: string) => {\n fn.binding = binding;\n },\n [fn],\n );\n\n const handleFormat = useCallback(async () => {\n if (!script.source) {\n return;\n }\n\n try {\n script.source.content = await format(script.source.content, {\n parser: 'typescript',\n plugins: [prettierPluginEstree, prettierPluginTypescript],\n semi: true,\n singleQuote: true,\n });\n } catch (err: any) {\n // TODO(wittjosiah): Show error in UI.\n log.catch(err);\n }\n }, [script.source]);\n\n const handleDeploy = useCallback(async () => {\n if (!script.source || !identity || !space) {\n return;\n }\n\n setError(undefined);\n\n try {\n const existingFunctionId = existingFunctionUrl?.split('/').at(-1);\n const ownerDid = (existingFunctionUrl?.split('/').at(-2) as DID) ?? publicKeyToDid(identity.identityKey);\n\n const bundler = new Bundler({\n platform: 'browser',\n sandboxedModules: [],\n remoteModules: {},\n });\n const buildResult = await bundler.bundle(script.source.content);\n if (buildResult.error || !buildResult.bundle) {\n throw buildResult.error;\n }\n\n const { result, functionId, functionVersionNumber, errorMessage } = await uploadWorkerFunction({\n clientConfig: client.config,\n halo: client.halo,\n ownerDid,\n functionId: existingFunctionId,\n source: buildResult.bundle,\n });\n if (result !== 'success' || functionId === undefined || functionVersionNumber === undefined) {\n throw new Error(errorMessage);\n }\n log.info('function uploaded', { functionId, functionVersionNumber });\n if (fn) {\n fn.version = functionVersionNumber;\n }\n const deployedFunction =\n fn ?? space.db.add(create(FunctionType, { version: functionVersionNumber, source: script }));\n const meta = getMeta(deployedFunction);\n setUserFunctionUrlInMetadata(meta, `/${ownerDid}/${functionId}`);\n script.changed = false;\n } catch (err: any) {\n log.catch(err);\n setError(t('upload failed label'));\n }\n }, [fn, existingFunctionUrl, script, script.name, script.source]);\n\n const functionUrl = useMemo(() => {\n if (!existingFunctionUrl) {\n return;\n }\n\n const baseUrl = new URL('functions/', client.config.values.runtime?.services?.edge?.url);\n\n // Leading slashes cause the URL to be treated as an absolute path.\n const relativeUrl = existingFunctionUrl.replace(/^\\//, '');\n const url = new URL(`./${relativeUrl}`, baseUrl.toString());\n space && url.searchParams.set('spaceId', space.id);\n url.protocol = 'https';\n return url.toString();\n }, [existingFunctionUrl, space]);\n\n return (\n <div\n role='none'\n className={mx(\n 'flex flex-col is-full bs-full overflow-hidden',\n role === 'article' && 'row-span-2',\n hasAttention && 'attention-surface',\n )}\n >\n <TypescriptEditor\n id={script.id}\n env={env}\n initialValue={initialValue}\n extensions={extensions}\n className='flex is-full bs-full overflow-hidden ch-focus-ring-inset-over-all'\n />\n\n <Toolbar\n classNames='border-t border-separator'\n deployed={Boolean(existingFunctionUrl) && !script.changed}\n functionUrl={functionUrl}\n error={error}\n showPanel={showPanel}\n onDeploy={handleDeploy}\n onFormat={handleFormat}\n onTogglePanel={async () => setShowPanel((showDetails) => !showDetails)}\n />\n\n {showPanel && (\n <DebugPanel functionUrl={functionUrl} binding={fn?.binding} onBindingChange={handleBindingChange} />\n )}\n </div>\n );\n};\n\nexport default ScriptEditor;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useEffect, useRef, useState } from 'react';\n\nimport { log } from '@dxos/log';\nimport {\n Avatar,\n DensityProvider,\n Icon,\n Input,\n type ThemedClassName,\n Toolbar,\n useControlledValue,\n useTranslation,\n} 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}>;\n\nexport const DebugPanel = ({ classNames, functionUrl, binding: _binding, onBindingChange }: 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 (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 <DensityProvider density='fine'>\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-4 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 <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 <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 </DensityProvider>\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\nconst MessageItem = ({ classNames, message }: ThemedClassName<{ message: Message }>) => {\n const { text, data, error } = message;\n if (error) {\n return <span className={mx(classNames, 'whitespace-pre text-error')}>{String(error)}</span>;\n } else if (data) {\n return (\n <SyntaxHighlighter language='json' className={mx('text-xs', classNames)}>\n {JSON.stringify(data, null, 2)}\n </SyntaxHighlighter>\n );\n }\n\n return <span className={mx(classNames)}>{text || '\\u00D8'}</span>;\n};\n\n// TODO(burdon): Replace with thread?\n// TODO(burdon): Button to delete individual messages.\n// TODO(burdon): Button to 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-[3rem_1fr]'>\n <div>{message.type === 'response' && <RobotAvatar />}</div>\n <div className={mx('flex', message.type === 'request' && 'justify-end')}>\n <MessageItem\n classNames={[message.type === 'request' && 'p-1 px-2 rounded-lg bg-hoverSurface']}\n message={message}\n />\n </div>\n </div>\n ))}\n <div className='grid grid-cols-[3rem_1fr]'>\n <div>\n {(state === 'pending' && <Icon icon='ph--spinner--regular' size={6} classNames='animate-spin-slow' />) ||\n (result.length > 0 && <RobotAvatar />)}\n </div>\n <div>\n <span>{result}</span>\n </div>\n </div>\n </>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useState } from 'react';\n\nimport {\n DensityProvider,\n ElevationProvider,\n Icon,\n type ThemedClassName,\n Toolbar as NaturalToolbar,\n Tooltip,\n useTranslation,\n} from '@dxos/react-ui';\n\nimport { SCRIPT_PLUGIN } from '../meta';\n\nexport type ToolbarProps = ThemedClassName<{\n deployed?: boolean;\n error?: string;\n functionUrl?: string;\n showPanel?: boolean;\n onDeploy?: () => Promise<void>;\n onFormat?: () => Promise<void>;\n onTogglePanel?: () => Promise<void>;\n}>;\n\nexport const Toolbar = ({\n classNames,\n deployed,\n error,\n functionUrl,\n showPanel,\n onDeploy,\n onFormat,\n onTogglePanel,\n}: ToolbarProps) => {\n const { t } = useTranslation(SCRIPT_PLUGIN);\n const [pending, setPending] = useState(false);\n\n const handleCopyLink = async () => {\n if (!functionUrl) {\n return;\n }\n\n await navigator.clipboard.writeText(functionUrl);\n };\n\n const handleDeploy = async () => {\n setPending(true);\n await onDeploy?.();\n setPending(false);\n };\n\n // TODO(burdon): Simplify tooltips.\n // TODO(burdon): Factor out common toolbar components with sheet/editor?\n return (\n <DensityProvider density='fine'>\n <ElevationProvider elevation='chrome'>\n <NaturalToolbar.Root classNames={['p-1', classNames]} style={{ contain: 'layout' }}>\n {onFormat && (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <NaturalToolbar.Button variant='ghost' onClick={onFormat}>\n <Icon icon='ph--magic-wand--regular' size={4} />\n </NaturalToolbar.Button>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content>\n <Tooltip.Arrow />\n {t('format label')}\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n )}\n\n <div role='separator' className='grow' />\n\n {error ? (\n <Tooltip.Root>\n <Tooltip.Trigger>\n <Icon icon='ph--warning-circle--regular' size={4} />\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content>\n <Tooltip.Arrow />\n {error}\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n ) : null}\n\n {functionUrl && deployed && (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <NaturalToolbar.Button variant='ghost' onClick={handleCopyLink}>\n <Icon icon='ph--link--regular' size={4} />\n </NaturalToolbar.Button>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content>\n <Tooltip.Arrow />\n {t('copy link label')}\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n )}\n\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <NaturalToolbar.Button variant='ghost' onClick={handleDeploy} disabled={pending}>\n {pending ? (\n <Icon icon='ph--spinner--regular' size={4} classNames='animate-spin-slow' />\n ) : (\n <Icon icon='ph--cloud-arrow-up--regular' size={4} />\n )}\n </NaturalToolbar.Button>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content>\n <Tooltip.Arrow />\n {pending ? t('pending label') : t('deploy label')}\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n\n {onTogglePanel && (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <NaturalToolbar.Button variant='ghost' onClick={onTogglePanel}>\n <Icon icon={showPanel ? 'ph--caret-down--regular' : 'ph--caret-up--regular'} size={4} />\n </NaturalToolbar.Button>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content>\n <Tooltip.Arrow />\n {t('toggle details label')}\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n )}\n </NaturalToolbar.Root>\n </ElevationProvider>\n </DensityProvider>\n );\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["import_react", "import_log", "import_react_ui", "import_react_ui_theme", "DebugPanel", "classNames", "functionUrl", "binding", "_binding", "onBindingChange", "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", "React", "DensityProvider", "density", "div", "className", "mx", "ref", "MessageThread", "Toolbar", "Root", "Input", "TextInput", "autoFocus", "placeholder", "onChange", "ev", "target", "onKeyDown", "key", "toUpperCase", "onBlur", "Button", "onClick", "Icon", "icon", "size", "RobotAvatar", "Avatar", "variant", "Frame", "MessageItem", "message", "span", "SyntaxHighlighter", "language", "map", "i", "length", "deployed", "showPanel", "onDeploy", "onFormat", "onTogglePanel", "pending", "setPending", "handleCopyLink", "navigator", "clipboard", "writeText", "handleDeploy", "ElevationProvider", "elevation", "NaturalToolbar", "style", "contain", "Tooltip", "Trigger", "asChild", "Portal", "Content", "Arrow", "role", "disabled", "ScriptEditor", "env", "script", "hasAttention", "useHasAttention", "fullyQualifiedId", "client", "useClient", "identity", "useIdentity", "space", "getSpace", "fn", "useQuery", "Filter", "schema", "FunctionType", "source", "extensions", "useMemo", "listener", "content", "changed", "createDataExtensions", "id", "createDocAccessor", "setShowPanel", "initialValue", "existingFunctionUrl", "getUserFunctionUrlInMetadata", "getMeta", "setError", "handleBindingChange", "useCallback", "handleFormat", "format", "parser", "plugins", "prettierPluginEstree", "prettierPluginTypescript", "semi", "singleQuote", "existingFunctionId", "split", "at", "ownerDid", "publicKeyToDid", "identityKey", "bundler", "Bundler", "platform", "sandboxedModules", "remoteModules", "buildResult", "bundle", "functionId", "functionVersionNumber", "errorMessage", "uploadWorkerFunction", "clientConfig", "config", "halo", "info", "version", "deployedFunction", "db", "add", "create", "meta", "setUserFunctionUrlInMetadata", "baseUrl", "URL", "values", "runtime", "services", "edge", "url", "relativeUrl", "toString", "searchParams", "set", "protocol", "TypescriptEditor", "Boolean", "showDetails"]
7
+ }
@@ -16,15 +16,15 @@ var __copyProps = (to, from, except, desc) => {
16
16
  return to;
17
17
  };
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var TypescriptEditor_CRONCQSI_exports = {};
20
- __export(TypescriptEditor_CRONCQSI_exports, {
21
- TypescriptEditor: () => import_chunk_RXI576K3.TypescriptEditor,
22
- default: () => import_chunk_RXI576K3.TypescriptEditor_default
19
+ var TypescriptEditor_M3WWFIP2_exports = {};
20
+ __export(TypescriptEditor_M3WWFIP2_exports, {
21
+ TypescriptEditor: () => import_chunk_IMLDKD5Y.TypescriptEditor,
22
+ default: () => import_chunk_IMLDKD5Y.TypescriptEditor_default
23
23
  });
24
- module.exports = __toCommonJS(TypescriptEditor_CRONCQSI_exports);
25
- var import_chunk_RXI576K3 = require("./chunk-RXI576K3.cjs");
24
+ module.exports = __toCommonJS(TypescriptEditor_M3WWFIP2_exports);
25
+ var import_chunk_IMLDKD5Y = require("./chunk-IMLDKD5Y.cjs");
26
26
  // Annotate the CommonJS export names for ESM import in node:
27
27
  0 && (module.exports = {
28
28
  TypescriptEditor
29
29
  });
30
- //# sourceMappingURL=TypescriptEditor-CRONCQSI.cjs.map
30
+ //# sourceMappingURL=TypescriptEditor-M3WWFIP2.cjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["TypescriptEditor-CRONCQSI.cjs"],
4
- "sourcesContent": ["import {\n TypescriptEditor,\n TypescriptEditor_default\n} from \"./chunk-RXI576K3.cjs\";\nexport {\n TypescriptEditor,\n TypescriptEditor_default as default\n};\n//# sourceMappingURL=TypescriptEditor-CRONCQSI.cjs.map\n"],
3
+ "sources": ["TypescriptEditor-M3WWFIP2.cjs"],
4
+ "sourcesContent": ["import {\n TypescriptEditor,\n TypescriptEditor_default\n} from \"./chunk-IMLDKD5Y.cjs\";\nexport {\n TypescriptEditor,\n TypescriptEditor_default as default\n};\n//# sourceMappingURL=TypescriptEditor-M3WWFIP2.cjs.map\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAGO;",
6
6
  "names": []
7
7
  }
@@ -16,13 +16,13 @@ var __copyProps = (to, from, except, desc) => {
16
16
  return to;
17
17
  };
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var chunk_VW2POILW_exports = {};
20
- __export(chunk_VW2POILW_exports, {
19
+ var chunk_5RBVXKXT_exports = {};
20
+ __export(chunk_5RBVXKXT_exports, {
21
21
  FunctionType: () => FunctionType,
22
22
  ScriptAction: () => ScriptAction,
23
23
  ScriptType: () => ScriptType
24
24
  });
25
- module.exports = __toCommonJS(chunk_VW2POILW_exports);
25
+ module.exports = __toCommonJS(chunk_5RBVXKXT_exports);
26
26
  var import_chunk_4VMNBXWU = require("./chunk-4VMNBXWU.cjs");
27
27
  var import_echo_schema = require("@dxos/echo-schema");
28
28
  var import_types = require("@dxos/plugin-markdown/types");
@@ -30,8 +30,11 @@ var ScriptType = class extends (0, import_echo_schema.TypedObject)({
30
30
  typename: "dxos.org/type/Script",
31
31
  version: "0.1.0"
32
32
  })({
33
+ // TODO(burdon): Change to URI?
33
34
  name: import_echo_schema.S.optional(import_echo_schema.S.String),
35
+ description: import_echo_schema.S.optional(import_echo_schema.S.String),
34
36
  source: (0, import_echo_schema.ref)(import_types.TextType),
37
+ // TODO(burdon): Change to has of deployed content.
35
38
  // Whether source has changed since last deploy.
36
39
  changed: import_echo_schema.S.optional(import_echo_schema.S.Boolean)
37
40
  }) {
@@ -40,8 +43,10 @@ var FunctionType = class extends (0, import_echo_schema.TypedObject)({
40
43
  typename: "dxos.org/type/Function",
41
44
  version: "0.1.0"
42
45
  })({
46
+ name: import_echo_schema.S.optional(import_echo_schema.S.String),
43
47
  version: import_echo_schema.S.Number,
44
48
  // Local binding to a function name.
49
+ // TODO(burdon): Move binding to inner type.
45
50
  binding: import_echo_schema.S.optional(import_echo_schema.S.String),
46
51
  // Reference to a source script if it exists within ECHO.
47
52
  source: import_echo_schema.S.optional((0, import_echo_schema.ref)(ScriptType))
@@ -57,4 +62,4 @@ var ScriptAction;
57
62
  ScriptAction,
58
63
  ScriptType
59
64
  });
60
- //# sourceMappingURL=chunk-VW2POILW.cjs.map
65
+ //# sourceMappingURL=chunk-5RBVXKXT.cjs.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 SurfaceProvides,\n TranslationsProvides,\n} from '@dxos/app-framework';\nimport { type SchemaProvides } from '@dxos/plugin-client';\nimport { type StackProvides } from '@dxos/plugin-stack';\n\nimport { SCRIPT_PLUGIN } from '../meta';\n\nexport enum ScriptAction {\n CREATE = `${SCRIPT_PLUGIN}/create`,\n}\n\nexport type ScriptPluginProvides = SurfaceProvides &\n IntentResolverProvides &\n GraphBuilderProvides &\n MetadataRecordsProvides &\n TranslationsProvides &\n SchemaProvides &\n StackProvides;\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,yBAAoC;AACpC,mBAAyB;AAOlB,IAAMA,aAAN,kBAAyBC,gCAAY;EAAEC,UAAU;EAAwBC,SAAS;AAAQ,CAAA,EAAG;;EAElGC,MAAMC,qBAAEC,SAASD,qBAAEE,MAAM;EACzBC,aAAaH,qBAAEC,SAASD,qBAAEE,MAAM;EAChCE,YAAQC,wBAAIC,qBAAAA;;;EAGZC,SAASP,qBAAEC,SAASD,qBAAEQ,OAAO;AAC/B,CAAA,EAAA;AAAI;AAKG,IAAMC,eAAN,kBAA2Bb,gCAAY;EAAEC,UAAU;EAA0BC,SAAS;AAAQ,CAAA,EAAG;EACtGC,MAAMC,qBAAEC,SAASD,qBAAEE,MAAM;EACzBJ,SAASE,qBAAEU;;;EAGXC,SAASX,qBAAEC,SAASD,qBAAEE,MAAM;;EAE5BE,QAAQJ,qBAAEC,aAASI,wBAAIV,UAAAA,CAAAA;AACzB,CAAA,EAAA;AAAI;;UCjBQiB,eAAAA;0CACD,GAAGC,mCAAAA,SAAsB,IAAA;GADxBD,iBAAAA,eAAAA,CAAAA,EAAAA;",
6
+ "names": ["ScriptType", "TypedObject", "typename", "version", "name", "S", "optional", "String", "description", "source", "ref", "TextType", "changed", "Boolean", "FunctionType", "Number", "binding", "ScriptAction", "SCRIPT_PLUGIN"]
7
+ }