@dxos/plugin-script 0.7.2 → 0.7.3-staging.971cd8d

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 (101) hide show
  1. package/dist/lib/browser/{AutomationPanel-BZCRRLOQ.mjs → AutomationPanel-PMTZROAZ.mjs} +18 -11
  2. package/dist/lib/browser/AutomationPanel-PMTZROAZ.mjs.map +7 -0
  3. package/dist/lib/browser/{ScriptContainer-GQ2KJ5BM.mjs → ScriptContainer-RYZFYCNK.mjs} +27 -25
  4. package/dist/lib/browser/ScriptContainer-RYZFYCNK.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-NCZUJKJE.mjs → chunk-K7KY6YMG.mjs} +14 -10
  6. package/dist/lib/browser/chunk-K7KY6YMG.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-DTVOXLPP.mjs → chunk-QFZUFT5G.mjs} +2 -2
  8. package/dist/lib/browser/{chunk-DTVOXLPP.mjs.map → chunk-QFZUFT5G.mjs.map} +3 -3
  9. package/dist/lib/browser/chunk-U3OP64V4.mjs +123 -0
  10. package/dist/lib/browser/chunk-U3OP64V4.mjs.map +7 -0
  11. package/dist/lib/browser/edge/index.mjs +5 -9
  12. package/dist/lib/browser/index.mjs +15 -18
  13. package/dist/lib/browser/index.mjs.map +3 -3
  14. package/dist/lib/browser/meta.json +1 -1
  15. package/dist/lib/browser/types/index.mjs +1 -1
  16. package/dist/lib/node/{AutomationPanel-VNLNP3EE.cjs → AutomationPanel-AAGQREH7.cjs} +21 -16
  17. package/dist/lib/node/AutomationPanel-AAGQREH7.cjs.map +7 -0
  18. package/dist/lib/node/{ScriptContainer-K67ZWCKL.cjs → ScriptContainer-FZ44UIRC.cjs} +32 -30
  19. package/dist/lib/node/ScriptContainer-FZ44UIRC.cjs.map +7 -0
  20. package/dist/lib/node/{chunk-BJ4WIWCP.cjs → chunk-4INUJLXL.cjs} +16 -12
  21. package/dist/lib/node/chunk-4INUJLXL.cjs.map +7 -0
  22. package/dist/lib/node/chunk-CS25QNKZ.cjs +151 -0
  23. package/dist/lib/node/chunk-CS25QNKZ.cjs.map +7 -0
  24. package/dist/lib/node/{chunk-T4PYTKIW.cjs → chunk-DQYAU2CJ.cjs} +5 -5
  25. package/dist/lib/node/{chunk-T4PYTKIW.cjs.map → chunk-DQYAU2CJ.cjs.map} +3 -3
  26. package/dist/lib/node/edge/index.cjs +10 -14
  27. package/dist/lib/node/edge/index.cjs.map +2 -2
  28. package/dist/lib/node/index.cjs +30 -33
  29. package/dist/lib/node/index.cjs.map +3 -3
  30. package/dist/lib/node/meta.json +1 -1
  31. package/dist/lib/node/types/index.cjs +4 -4
  32. package/dist/lib/node/types/index.cjs.map +1 -1
  33. package/dist/lib/node-esm/{AutomationPanel-NWE2QCOE.mjs → AutomationPanel-ETQEDY5I.mjs} +18 -11
  34. package/dist/lib/node-esm/AutomationPanel-ETQEDY5I.mjs.map +7 -0
  35. package/dist/lib/node-esm/{ScriptContainer-BVDYLJZI.mjs → ScriptContainer-3PKDW34A.mjs} +27 -25
  36. package/dist/lib/node-esm/ScriptContainer-3PKDW34A.mjs.map +7 -0
  37. package/dist/lib/node-esm/chunk-36DLLQ6E.mjs +125 -0
  38. package/dist/lib/node-esm/chunk-36DLLQ6E.mjs.map +7 -0
  39. package/dist/lib/node-esm/{chunk-2HYWFUEN.mjs → chunk-GMVPKT6A.mjs} +2 -2
  40. package/dist/lib/node-esm/{chunk-2HYWFUEN.mjs.map → chunk-GMVPKT6A.mjs.map} +3 -3
  41. package/dist/lib/node-esm/{chunk-DXWSRDEN.mjs → chunk-OFYGBUNI.mjs} +14 -10
  42. package/dist/lib/node-esm/chunk-OFYGBUNI.mjs.map +7 -0
  43. package/dist/lib/node-esm/edge/index.mjs +5 -9
  44. package/dist/lib/node-esm/index.mjs +15 -18
  45. package/dist/lib/node-esm/index.mjs.map +3 -3
  46. package/dist/lib/node-esm/meta.json +1 -1
  47. package/dist/lib/node-esm/types/index.mjs +1 -1
  48. package/dist/types/src/ScriptPlugin.d.ts.map +1 -1
  49. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts.map +1 -1
  50. package/dist/types/src/components/DebugPanel/DebugPanel.d.ts.map +1 -1
  51. package/dist/types/src/components/ScriptBlock/ScriptBlock.d.ts +1 -5
  52. package/dist/types/src/components/ScriptBlock/ScriptBlock.d.ts.map +1 -1
  53. package/dist/types/src/components/ScriptBlock/ScriptBlock.stories.d.ts.map +1 -1
  54. package/dist/types/src/components/ScriptEditor.d.ts.map +1 -1
  55. package/dist/types/src/components/ScriptSettingsPanel.d.ts.map +1 -1
  56. package/dist/types/src/edge/functions.d.ts +13 -21
  57. package/dist/types/src/edge/functions.d.ts.map +1 -1
  58. package/dist/types/src/edge/index.d.ts +0 -3
  59. package/dist/types/src/edge/index.d.ts.map +1 -1
  60. package/dist/types/src/translations.d.ts +43 -0
  61. package/dist/types/src/translations.d.ts.map +1 -1
  62. package/dist/types/src/types/schema.d.ts +2 -2
  63. package/dist/types/src/types/types.d.ts +2 -3
  64. package/dist/types/src/types/types.d.ts.map +1 -1
  65. package/package.json +37 -36
  66. package/src/ScriptPlugin.tsx +4 -8
  67. package/src/components/AutomationPanel/AutomationPanel.tsx +10 -5
  68. package/src/components/DebugPanel/DebugPanel.tsx +41 -30
  69. package/src/components/ScriptBlock/ScriptBlock.stories.tsx +5 -25
  70. package/src/components/ScriptBlock/ScriptBlock.tsx +3 -8
  71. package/src/components/ScriptEditor.tsx +16 -23
  72. package/src/components/ScriptSettingsPanel.tsx +1 -5
  73. package/src/edge/functions.ts +69 -109
  74. package/src/edge/index.ts +0 -3
  75. package/src/translations.ts +4 -0
  76. package/src/types/schema.ts +1 -1
  77. package/src/types/types.ts +1 -3
  78. package/dist/lib/browser/AutomationPanel-BZCRRLOQ.mjs.map +0 -7
  79. package/dist/lib/browser/ScriptContainer-GQ2KJ5BM.mjs.map +0 -7
  80. package/dist/lib/browser/chunk-5GGRYRS4.mjs +0 -253
  81. package/dist/lib/browser/chunk-5GGRYRS4.mjs.map +0 -7
  82. package/dist/lib/browser/chunk-NCZUJKJE.mjs.map +0 -7
  83. package/dist/lib/node/AutomationPanel-VNLNP3EE.cjs.map +0 -7
  84. package/dist/lib/node/ScriptContainer-K67ZWCKL.cjs.map +0 -7
  85. package/dist/lib/node/chunk-BJ4WIWCP.cjs.map +0 -7
  86. package/dist/lib/node/chunk-XS6GEYYH.cjs +0 -273
  87. package/dist/lib/node/chunk-XS6GEYYH.cjs.map +0 -7
  88. package/dist/lib/node-esm/AutomationPanel-NWE2QCOE.mjs.map +0 -7
  89. package/dist/lib/node-esm/ScriptContainer-BVDYLJZI.mjs.map +0 -7
  90. package/dist/lib/node-esm/chunk-DXWSRDEN.mjs.map +0 -7
  91. package/dist/lib/node-esm/chunk-V74XKPLC.mjs +0 -255
  92. package/dist/lib/node-esm/chunk-V74XKPLC.mjs.map +0 -7
  93. package/dist/types/src/edge/codec.d.ts +0 -4
  94. package/dist/types/src/edge/codec.d.ts.map +0 -1
  95. package/dist/types/src/edge/header-codec.d.ts +0 -24
  96. package/dist/types/src/edge/header-codec.d.ts.map +0 -1
  97. package/dist/types/src/edge/hub-protocol.d.ts +0 -6
  98. package/dist/types/src/edge/hub-protocol.d.ts.map +0 -1
  99. package/src/edge/codec.ts +0 -13
  100. package/src/edge/header-codec.ts +0 -97
  101. package/src/edge/hub-protocol.ts +0 -27
@@ -1,39 +1,46 @@
1
1
  import {
2
2
  DebugPanel
3
- } from "./chunk-NCZUJKJE.mjs";
3
+ } from "./chunk-K7KY6YMG.mjs";
4
4
  import {
5
5
  getInvocationUrl,
6
6
  getUserFunctionUrlInMetadata
7
- } from "./chunk-5GGRYRS4.mjs";
7
+ } from "./chunk-U3OP64V4.mjs";
8
8
  import {
9
9
  FunctionType,
10
10
  ScriptType
11
- } from "./chunk-DTVOXLPP.mjs";
12
- import "./chunk-C7VBULMK.mjs";
11
+ } from "./chunk-QFZUFT5G.mjs";
12
+ import {
13
+ SCRIPT_PLUGIN
14
+ } from "./chunk-C7VBULMK.mjs";
13
15
 
14
16
  // packages/plugins/experimental/plugin-script/src/components/AutomationPanel/AutomationPanel.tsx
15
17
  import React, { useMemo, useState } from "react";
16
18
  import { failUndefined } from "@dxos/debug";
17
19
  import { useClient } from "@dxos/react-client";
18
20
  import { Filter, getMeta, getSpace, useQuery } from "@dxos/react-client/echo";
19
- import { Select } from "@dxos/react-ui";
21
+ import { Select, useTranslation } from "@dxos/react-ui";
20
22
  var AutomationPanel = ({ subject }) => {
23
+ const { t } = useTranslation(SCRIPT_PLUGIN);
21
24
  const space = getSpace(subject);
22
- const functions = useQuery(space ?? void 0, Filter.schema(FunctionType, (fn) => subject instanceof ScriptType ? fn.source === subject : fn.binding != null), {}, [
25
+ const functions = useQuery(space ?? void 0, subject instanceof ScriptType ? Filter.schema(FunctionType, {
26
+ source: subject
27
+ }) : Filter.schema(FunctionType, (fn) => fn.binding != null), {}, [
23
28
  subject
24
29
  ]);
25
30
  const [selectedFunction, setSelectedFunction] = useState(null);
26
- const functionToChatWith = subject instanceof ScriptType ? functions[0] : selectedFunction;
31
+ const chatFunction = subject instanceof ScriptType ? functions[0] : selectedFunction;
27
32
  return /* @__PURE__ */ React.createElement("div", {
28
33
  className: "h-full flex flex-col"
29
34
  }, !(subject instanceof ScriptType) && /* @__PURE__ */ React.createElement(BindingSelect, {
30
35
  selectedFunction,
31
36
  setSelectedFunction,
32
37
  functions
33
- }), functionToChatWith && /* @__PURE__ */ React.createElement(ChatPanel, {
34
- fn: functionToChatWith,
38
+ }), chatFunction && /* @__PURE__ */ React.createElement(ChatPanel, {
39
+ fn: chatFunction,
35
40
  subject
36
- }), subject instanceof ScriptType && functions.length === 0 && /* @__PURE__ */ React.createElement("p", null, "Deploy function to interact with it."));
41
+ }), subject instanceof ScriptType && functions.length === 0 && /* @__PURE__ */ React.createElement("div", {
42
+ className: "p-1"
43
+ }, t("not deployed")));
37
44
  };
38
45
  var ChatPanel = ({ fn, subject }) => {
39
46
  const client = useClient();
@@ -75,4 +82,4 @@ export {
75
82
  AutomationPanel,
76
83
  AutomationPanel_default as default
77
84
  };
78
- //# sourceMappingURL=AutomationPanel-BZCRRLOQ.mjs.map
85
+ //# sourceMappingURL=AutomationPanel-PMTZROAZ.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/AutomationPanel/AutomationPanel.tsx", "../../../src/components/AutomationPanel/index.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useMemo, useState } from 'react';\n\nimport { type ReactiveEchoObject } from '@dxos/client/echo';\nimport { failUndefined } from '@dxos/debug';\nimport { useClient } from '@dxos/react-client';\nimport { Filter, getMeta, getSpace, useQuery } from '@dxos/react-client/echo';\nimport { Select, useTranslation } from '@dxos/react-ui';\n\nimport { getInvocationUrl, getUserFunctionUrlInMetadata } from '../../edge';\nimport { SCRIPT_PLUGIN } from '../../meta';\nimport { FunctionType, ScriptType } from '../../types';\nimport { DebugPanel } from '../DebugPanel';\n\nexport interface AutomationPanelProps {\n subject: ReactiveEchoObject<any>;\n}\n\nexport const AutomationPanel = ({ subject }: AutomationPanelProps) => {\n const { t } = useTranslation(SCRIPT_PLUGIN);\n const space = getSpace(subject);\n\n // TODO(dmaretskyi): Parametric query.\n const functions = useQuery(\n space ?? undefined,\n subject instanceof ScriptType\n ? Filter.schema(FunctionType, { source: subject })\n : Filter.schema(FunctionType, (fn) => fn.binding != null),\n {},\n [subject],\n );\n\n const [selectedFunction, setSelectedFunction] = useState<FunctionType | null>(null);\n const chatFunction = subject instanceof ScriptType ? functions[0] : selectedFunction;\n\n return (\n <div className='h-full flex flex-col'>\n {!(subject instanceof ScriptType) && (\n <BindingSelect\n selectedFunction={selectedFunction}\n setSelectedFunction={setSelectedFunction}\n functions={functions}\n />\n )}\n {chatFunction && <ChatPanel fn={chatFunction} subject={subject} />}\n {subject instanceof ScriptType && functions.length === 0 && <div className='p-1'>{t('not deployed')}</div>}\n </div>\n );\n};\n\nexport interface ChatPanelProps {\n fn: FunctionType;\n subject: ReactiveEchoObject<any>;\n}\n\nconst ChatPanel = ({ fn, subject }: ChatPanelProps) => {\n const client = useClient();\n const space = getSpace(fn);\n const existingFunctionUrl = getUserFunctionUrlInMetadata(getMeta(fn));\n const functionUrl = useMemo(() => {\n if (!existingFunctionUrl) {\n return;\n }\n\n return getInvocationUrl(existingFunctionUrl, client.config.values.runtime?.services?.edge?.url ?? '', {\n spaceId: space?.id,\n subjectId: subject?.id,\n });\n }, [existingFunctionUrl, space, subject]);\n\n return <DebugPanel functionUrl={functionUrl} classNames='flex-1' />;\n};\n\nexport interface BindingSelectProps {\n selectedFunction: FunctionType | null;\n setSelectedFunction: (fn: FunctionType) => void;\n functions: FunctionType[];\n}\n\nconst BindingSelect = ({ selectedFunction, setSelectedFunction, functions }: BindingSelectProps) => {\n return (\n <Select.Root\n value={selectedFunction?.id}\n onValueChange={(id) => setSelectedFunction(functions.find((fn) => fn.id === id) ?? failUndefined())}\n >\n <Select.TriggerButton placeholder='Select value' />\n <Select.Portal>\n <Select.Content>\n <Select.ScrollUpButton />\n <Select.Viewport>\n {functions.map(({ id, binding }) => (\n <Select.Option key={id} value={id}>\n {binding}\n </Select.Option>\n ))}\n </Select.Viewport>\n <Select.ScrollDownButton />\n <Select.Arrow />\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { AutomationPanel } from './AutomationPanel';\n\nexport * from './AutomationPanel';\n\nexport default AutomationPanel;\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;AAIA,OAAOA,SAASC,SAASC,gBAAgB;AAGzC,SAASC,qBAAqB;AAC9B,SAASC,iBAAiB;AAC1B,SAASC,QAAQC,SAASC,UAAUC,gBAAgB;AACpD,SAASC,QAAQC,sBAAsB;AAWhC,IAAMC,kBAAkB,CAAC,EAAEC,QAAO,MAAwB;AAC/D,QAAM,EAAEC,EAAC,IAAKC,eAAeC,aAAAA;AAC7B,QAAMC,QAAQC,SAASL,OAAAA;AAGvB,QAAMM,YAAYC,SAChBH,SAASI,QACTR,mBAAmBS,aACfC,OAAOC,OAAOC,cAAc;IAAEC,QAAQb;EAAQ,CAAA,IAC9CU,OAAOC,OAAOC,cAAc,CAACE,OAAOA,GAAGC,WAAW,IAAA,GACtD,CAAC,GACD;IAACf;GAAQ;AAGX,QAAM,CAACgB,kBAAkBC,mBAAAA,IAAuBC,SAA8B,IAAA;AAC9E,QAAMC,eAAenB,mBAAmBS,aAAaH,UAAU,CAAA,IAAKU;AAEpE,SACE,sBAAA,cAACI,OAAAA;IAAIC,WAAU;KACZ,EAAErB,mBAAmBS,eACpB,sBAAA,cAACa,eAAAA;IACCN;IACAC;IACAX;MAGHa,gBAAgB,sBAAA,cAACI,WAAAA;IAAUT,IAAIK;IAAcnB;MAC7CA,mBAAmBS,cAAcH,UAAUkB,WAAW,KAAK,sBAAA,cAACJ,OAAAA;IAAIC,WAAU;KAAOpB,EAAE,cAAA,CAAA,CAAA;AAG1F;AAOA,IAAMsB,YAAY,CAAC,EAAET,IAAId,QAAO,MAAkB;AAChD,QAAMyB,SAASC,UAAAA;AACf,QAAMtB,QAAQC,SAASS,EAAAA;AACvB,QAAMa,sBAAsBC,6BAA6BC,QAAQf,EAAAA,CAAAA;AACjE,QAAMgB,cAAcC,QAAQ,MAAA;AAC1B,QAAI,CAACJ,qBAAqB;AACxB;IACF;AAEA,WAAOK,iBAAiBL,qBAAqBF,OAAOQ,OAAOC,OAAOC,SAASC,UAAUC,MAAMC,OAAO,IAAI;MACpGC,SAASnC,OAAOoC;MAChBC,WAAWzC,SAASwC;IACtB,CAAA;EACF,GAAG;IAACb;IAAqBvB;IAAOJ;GAAQ;AAExC,SAAO,sBAAA,cAAC0C,YAAAA;IAAWZ;IAA0Ba,YAAW;;AAC1D;AAQA,IAAMrB,gBAAgB,CAAC,EAAEN,kBAAkBC,qBAAqBX,UAAS,MAAsB;AAC7F,SACE,sBAAA,cAACsC,OAAOC,MAAI;IACVC,OAAO9B,kBAAkBwB;IACzBO,eAAe,CAACP,OAAOvB,oBAAoBX,UAAU0C,KAAK,CAAClC,OAAOA,GAAG0B,OAAOA,EAAAA,KAAOS,cAAAA,CAAAA;KAEnF,sBAAA,cAACL,OAAOM,eAAa;IAACC,aAAY;MAClC,sBAAA,cAACP,OAAOQ,QAAM,MACZ,sBAAA,cAACR,OAAOS,SAAO,MACb,sBAAA,cAACT,OAAOU,gBAAc,IAAA,GACtB,sBAAA,cAACV,OAAOW,UAAQ,MACbjD,UAAUkD,IAAI,CAAC,EAAEhB,IAAIzB,QAAO,MAC3B,sBAAA,cAAC6B,OAAOa,QAAM;IAACC,KAAKlB;IAAIM,OAAON;KAC5BzB,OAAAA,CAAAA,CAAAA,GAIP,sBAAA,cAAC6B,OAAOe,kBAAgB,IAAA,GACxB,sBAAA,cAACf,OAAOgB,OAAK,IAAA,CAAA,CAAA,CAAA;AAKvB;;;ACjGA,IAAA,0BAAeC;",
6
+ "names": ["React", "useMemo", "useState", "failUndefined", "useClient", "Filter", "getMeta", "getSpace", "useQuery", "Select", "useTranslation", "AutomationPanel", "subject", "t", "useTranslation", "SCRIPT_PLUGIN", "space", "getSpace", "functions", "useQuery", "undefined", "ScriptType", "Filter", "schema", "FunctionType", "source", "fn", "binding", "selectedFunction", "setSelectedFunction", "useState", "chatFunction", "div", "className", "BindingSelect", "ChatPanel", "length", "client", "useClient", "existingFunctionUrl", "getUserFunctionUrlInMetadata", "getMeta", "functionUrl", "useMemo", "getInvocationUrl", "config", "values", "runtime", "services", "edge", "url", "spaceId", "id", "subjectId", "DebugPanel", "classNames", "Select", "Root", "value", "onValueChange", "find", "failUndefined", "TriggerButton", "placeholder", "Portal", "Content", "ScrollUpButton", "Viewport", "map", "Option", "key", "ScrollDownButton", "Arrow", "AutomationPanel"]
7
+ }
@@ -4,18 +4,18 @@ import {
4
4
  } from "./chunk-4UTRJLQ3.mjs";
5
5
  import {
6
6
  DebugPanel
7
- } from "./chunk-NCZUJKJE.mjs";
7
+ } from "./chunk-K7KY6YMG.mjs";
8
8
  import {
9
- USERFUNCTIONS_PRESET_META_KEY,
9
+ FUNCTIONS_PRESET_META_KEY,
10
10
  getInvocationUrl,
11
11
  getUserFunctionUrlInMetadata,
12
- publicKeyToDid,
12
+ incrementSemverPatch,
13
13
  setUserFunctionUrlInMetadata,
14
14
  uploadWorkerFunction
15
- } from "./chunk-5GGRYRS4.mjs";
15
+ } from "./chunk-U3OP64V4.mjs";
16
16
  import {
17
17
  FunctionType
18
- } from "./chunk-DTVOXLPP.mjs";
18
+ } from "./chunk-QFZUFT5G.mjs";
19
19
  import {
20
20
  SCRIPT_PLUGIN
21
21
  } from "./chunk-C7VBULMK.mjs";
@@ -225,7 +225,9 @@ var ScriptEditor = ({ classNames, script, env }) => {
225
225
  const client = useClient();
226
226
  const identity = useIdentity();
227
227
  const space = getSpace(script);
228
- const [fn] = useQuery(space, Filter.schema(FunctionType, (fn2) => fn2.source === script));
228
+ const [fn] = useQuery(space, Filter.schema(FunctionType, {
229
+ source: script
230
+ }));
229
231
  const extensions = useMemo(() => [
230
232
  listener({
231
233
  onChange: (text) => {
@@ -268,7 +270,7 @@ var ScriptEditor = ({ classNames, script, env }) => {
268
270
  } catch (err) {
269
271
  log.catch(err, void 0, {
270
272
  F: __dxlog_file,
271
- L: 88,
273
+ L: 83,
272
274
  S: void 0,
273
275
  C: (f, a) => f(...a)
274
276
  });
@@ -282,13 +284,13 @@ var ScriptEditor = ({ classNames, script, env }) => {
282
284
  script.name = template.name;
283
285
  script.source.content = template.source;
284
286
  const metaKeys = getMeta(script).keys;
285
- const oldPresetIndex = metaKeys.findIndex((key) => key.source === USERFUNCTIONS_PRESET_META_KEY);
287
+ const oldPresetIndex = metaKeys.findIndex((key) => key.source === FUNCTIONS_PRESET_META_KEY);
286
288
  if (oldPresetIndex >= 0) {
287
289
  metaKeys.splice(oldPresetIndex, 1);
288
290
  }
289
291
  if (template.presetId) {
290
292
  metaKeys.push({
291
- source: USERFUNCTIONS_PRESET_META_KEY,
293
+ source: FUNCTIONS_PRESET_META_KEY,
292
294
  id: template.presetId
293
295
  });
294
296
  }
@@ -301,7 +303,6 @@ var ScriptEditor = ({ classNames, script, env }) => {
301
303
  setError(void 0);
302
304
  try {
303
305
  const existingFunctionId = existingFunctionUrl?.split("/").at(-1);
304
- const ownerDid = existingFunctionUrl?.split("/").at(-2) ?? publicKeyToDid(identity.identityKey);
305
306
  const bundler = new Bundler({
306
307
  platform: "browser",
307
308
  sandboxedModules: [],
@@ -311,31 +312,31 @@ var ScriptEditor = ({ classNames, script, env }) => {
311
312
  if (buildResult.error || !buildResult.bundle) {
312
313
  throw buildResult.error;
313
314
  }
314
- const { result, functionId, functionVersionNumber, errorMessage, meta } = await uploadWorkerFunction({
315
- clientConfig: client.config,
316
- halo: client.halo,
317
- ownerDid,
315
+ const { functionId, version, meta } = await uploadWorkerFunction({
316
+ client,
317
+ spaceId: space.id,
318
+ version: fn ? incrementSemverPatch(fn.version) : "0.0.1",
318
319
  functionId: existingFunctionId,
319
320
  source: buildResult.bundle
320
321
  });
321
- if (result !== "success" || functionId === void 0 || functionVersionNumber === void 0) {
322
- throw new Error(errorMessage);
322
+ if (functionId === void 0 || version === void 0) {
323
+ throw new Error(`Upload didn't return expected data: functionId=${functionId}, version=${version}`);
323
324
  }
324
325
  log.info("function uploaded", {
325
326
  functionId,
326
- functionVersionNumber
327
+ version
327
328
  }, {
328
329
  F: __dxlog_file,
329
- L: 136,
330
+ L: 130,
330
331
  S: void 0,
331
332
  C: (f, a) => f(...a)
332
333
  });
333
334
  if (fn) {
334
- fn.version = functionVersionNumber;
335
+ fn.version = version;
335
336
  }
336
337
  const deployedFunction = fn ?? space.db.add(create(FunctionType, {
337
338
  name: functionId,
338
- version: functionVersionNumber,
339
+ version,
339
340
  source: script
340
341
  }));
341
342
  script.changed = false;
@@ -346,17 +347,17 @@ var ScriptEditor = ({ classNames, script, env }) => {
346
347
  functionId
347
348
  }, {
348
349
  F: __dxlog_file,
349
- L: 149,
350
+ L: 142,
350
351
  S: void 0,
351
352
  C: (f, a) => f(...a)
352
353
  });
353
354
  }
354
- setUserFunctionUrlInMetadata(getMeta(deployedFunction), `/${ownerDid}/${functionId}`);
355
+ setUserFunctionUrlInMetadata(getMeta(deployedFunction), `/${space.id}/${functionId}`);
355
356
  setView("split");
356
357
  } catch (err) {
357
358
  log.catch(err, void 0, {
358
359
  F: __dxlog_file,
359
- L: 156,
360
+ L: 149,
360
361
  S: void 0,
361
362
  C: (f, a) => f(...a)
362
363
  });
@@ -367,7 +368,8 @@ var ScriptEditor = ({ classNames, script, env }) => {
367
368
  existingFunctionUrl,
368
369
  script,
369
370
  script.name,
370
- script.source
371
+ script.source,
372
+ space?.id ?? null
371
373
  ]);
372
374
  const functionUrl = useMemo(() => {
373
375
  if (!existingFunctionUrl) {
@@ -420,4 +422,4 @@ var ScriptContainer_default = ScriptContainer;
420
422
  export {
421
423
  ScriptContainer_default as default
422
424
  };
423
- //# sourceMappingURL=ScriptContainer-GQ2KJ5BM.mjs.map
425
+ //# sourceMappingURL=ScriptContainer-RYZFYCNK.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/ScriptContainer.tsx", "../../../src/components/ScriptEditor.tsx", "../../../src/components/Toolbar/Toolbar.tsx", "../../../src/components/TypescriptEditor/TypescriptEditor.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { fullyQualifiedId } from '@dxos/react-client/echo';\nimport { useAttendableAttributes } from '@dxos/react-ui-attention';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { ScriptEditor, type ScriptEditorProps } from './ScriptEditor';\n\nconst ScriptContainer = ({ script, ...props }: ScriptEditorProps) => {\n const attendableAttrs = useAttendableAttributes(fullyQualifiedId(script));\n return (\n <div role='none' className={mx('flex row-span-2 w-full overflow-hidden attention-surface')} {...attendableAttrs}>\n <ScriptEditor {...props} script={script} />\n </div>\n );\n};\n\nexport default ScriptContainer;\n", "//\n// Copyright 2023 DXOS.org\n//\n\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 { create, createDocAccessor, Filter, getMeta, getSpace, useQuery } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { useTranslation, type ThemedClassName } from '@dxos/react-ui';\nimport { createDataExtensions, listener } from '@dxos/react-ui-editor';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { DebugPanel } from './DebugPanel';\nimport { type TemplateSelectProps, Toolbar, type ViewType } from './Toolbar';\nimport { TypescriptEditor, type TypescriptEditorProps } from './TypescriptEditor';\nimport { Bundler } from '../bundler';\nimport {\n getInvocationUrl,\n getUserFunctionUrlInMetadata,\n setUserFunctionUrlInMetadata,\n uploadWorkerFunction,\n FUNCTIONS_PRESET_META_KEY,\n incrementSemverPatch,\n} from '../edge';\nimport { SCRIPT_PLUGIN } from '../meta';\nimport { templates } from '../templates';\nimport { FunctionType, type ScriptType } from '../types';\n\nexport type ScriptEditorProps = ThemedClassName<{\n script: ScriptType;\n}> &\n Pick<TypescriptEditorProps, 'env'>;\n\nexport const ScriptEditor = ({ classNames, script, env }: ScriptEditorProps) => {\n const { t } = useTranslation(SCRIPT_PLUGIN);\n const client = useClient();\n const identity = useIdentity();\n const space = getSpace(script);\n const [fn] = useQuery(space, Filter.schema(FunctionType, { source: script }));\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 [view, setView] = useState<ViewType>('editor');\n const existingFunctionUrl = fn && getUserFunctionUrlInMetadata(getMeta(fn));\n const [error, setError] = useState<string>();\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 handleTemplateChange: TemplateSelectProps['onTemplateSelect'] = (id) => {\n const template = templates.find((template) => template.id === id);\n if (template) {\n script.name = template.name;\n script.source!.content = template.source;\n const metaKeys = getMeta(script).keys;\n const oldPresetIndex = metaKeys.findIndex((key) => key.source === FUNCTIONS_PRESET_META_KEY);\n if (oldPresetIndex >= 0) {\n metaKeys.splice(oldPresetIndex, 1);\n }\n if (template.presetId) {\n metaKeys.push({ source: FUNCTIONS_PRESET_META_KEY, id: template.presetId });\n }\n }\n };\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\n const bundler = new Bundler({ platform: 'browser', sandboxedModules: [], remoteModules: {} });\n const buildResult = await bundler.bundle(script.source.content);\n if (buildResult.error || !buildResult.bundle) {\n throw buildResult.error;\n }\n\n const { functionId, version, meta } = await uploadWorkerFunction({\n client,\n spaceId: space.id,\n version: fn ? incrementSemverPatch(fn.version) : '0.0.1',\n functionId: existingFunctionId,\n source: buildResult.bundle,\n });\n if (functionId === undefined || version === undefined) {\n throw new Error(`Upload didn't return expected data: functionId=${functionId}, version=${version}`);\n }\n\n log.info('function uploaded', { functionId, version });\n if (fn) {\n fn.version = version;\n }\n\n const deployedFunction = fn ?? space.db.add(create(FunctionType, { name: functionId, version, source: script }));\n\n script.changed = false;\n\n if (meta.inputSchema) {\n deployedFunction.inputSchema = meta.inputSchema;\n } else {\n log.verbose('no input schema in function metadata', { functionId });\n }\n\n setUserFunctionUrlInMetadata(getMeta(deployedFunction), `/${space.id}/${functionId}`);\n\n setView('split');\n } catch (err: any) {\n log.catch(err);\n setError(t('upload failed label'));\n }\n }, [fn, existingFunctionUrl, script, script.name, script.source, space?.id ?? null]);\n\n const functionUrl = useMemo(() => {\n if (!existingFunctionUrl) {\n return;\n }\n\n return getInvocationUrl(existingFunctionUrl, client.config.values.runtime?.services?.edge?.url ?? '', {\n spaceId: space?.id,\n });\n }, [existingFunctionUrl, space]);\n\n return (\n <div role='none' className={mx('flex flex-col w-full overflow-hidden divide-y divide-separator', classNames)}>\n <Toolbar\n deployed={Boolean(existingFunctionUrl) && !script.changed}\n functionUrl={functionUrl}\n error={error}\n view={view}\n templates={templates}\n onDeploy={handleDeploy}\n onFormat={handleFormat}\n onViewChange={setView}\n onTemplateSelect={handleTemplateChange}\n />\n\n {view !== 'preview' && (\n <TypescriptEditor\n id={script.id}\n env={env}\n initialValue={script.source?.content}\n extensions={extensions}\n className='flex is-full bs-full overflow-hidden ch-focus-ring-inset-over-all'\n />\n )}\n\n {view !== 'editor' && <DebugPanel functionUrl={functionUrl} />}\n </div>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useState } from 'react';\n\nimport {\n ElevationProvider,\n Icon,\n Select,\n type ThemedClassName,\n ToggleGroup,\n ToggleGroupItem,\n type ToolbarButtonProps,\n Toolbar as NaturalToolbar,\n Tooltip,\n useTranslation,\n} from '@dxos/react-ui';\n\nimport { SCRIPT_PLUGIN } from '../../meta';\nimport { type Template } from '../../templates';\n\nexport type ToolbarProps = ThemedClassName<\n {\n deployed?: boolean;\n error?: string;\n functionUrl?: string;\n onDeploy?: () => Promise<void>;\n onFormat?: () => Promise<void>;\n } & TemplateSelectProps &\n ViewSelectorProps\n>;\n\nexport const Toolbar = ({\n classNames,\n deployed,\n error,\n functionUrl,\n view,\n templates,\n onDeploy,\n onFormat,\n onViewChange,\n onTemplateSelect,\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 if (!pending) {\n setPending(true);\n await onDeploy?.();\n setPending(false);\n }\n };\n\n // TODO(burdon): Factor out common toolbar components with sheet/editor?\n return (\n <ElevationProvider elevation='chrome'>\n <NaturalToolbar.Root classNames={['p-1', classNames]} style={{ contain: 'layout' }}>\n {templates && <TemplateSelect templates={templates} onTemplateSelect={onTemplateSelect} />}\n {onFormat && <ToolbarIconButton icon='ph--magic-wand--regular' text={t('format label')} onClick={onFormat} />}\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 <ToolbarIconButton icon='ph--link--regular' text={t('copy link label')} onClick={handleCopyLink} />\n )}\n\n {onDeploy && (\n <ToolbarIconButton\n icon={pending ? 'ph--spinner-gap--regular' : 'ph--cloud-arrow-up--regular'}\n classNames={[pending && 'animate-spin']}\n text={pending ? t('pending label') : t('deploy label')}\n onClick={handleDeploy}\n />\n )}\n\n <ViewSelector view={view} onViewChange={onViewChange} />\n </NaturalToolbar.Root>\n </ElevationProvider>\n );\n};\n\nconst ToolbarIconButton = ({\n icon,\n text,\n classNames,\n disabled,\n onClick,\n}: { icon: string; text: string } & Pick<ToolbarButtonProps, 'classNames' | 'disabled' | 'onClick'>) => {\n return (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <NaturalToolbar.Button variant='ghost' disabled={disabled} onClick={onClick}>\n <Icon icon={icon} size={4} classNames={classNames} />\n </NaturalToolbar.Button>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content>\n <Tooltip.Arrow />\n {text}\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n );\n};\n\nexport type ViewType = 'editor' | 'split' | 'preview';\n\nexport type TemplateSelectProps = {\n templates?: Template[];\n onTemplateSelect?: (id: string) => void;\n};\n\nexport const TemplateSelect = ({ templates = [], onTemplateSelect }: TemplateSelectProps) => {\n return (\n <Select.Root value={''} onValueChange={onTemplateSelect}>\n <Select.TriggerButton />\n <Select.Portal>\n <Select.Content>\n <Select.Viewport>\n <Select.Option value={''}>Template</Select.Option>\n {templates.map(({ id, name }) => (\n <Select.Option key={id} value={id}>\n {name}\n </Select.Option>\n ))}\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n );\n};\n\nexport type ViewSelectorProps = {\n view?: ViewType;\n onViewChange?: (view: ViewType) => void;\n};\n\nexport const ViewSelector = ({ view, onViewChange }: ViewSelectorProps) => {\n return (\n <ToggleGroup type='single' value={view} onValueChange={(value) => onViewChange?.(value as ViewType)}>\n <ToggleGroupItem value='editor' classNames='bg-transparent text-subdued'>\n <Icon icon='ph--code--regular' size={4} />\n </ToggleGroupItem>\n <ToggleGroupItem value='split' classNames='bg-transparent text-subdued'>\n <Icon icon='ph--square-split-vertical--regular' size={4} />\n </ToggleGroupItem>\n <ToggleGroupItem value='preview' classNames='bg-transparent text-subdued'>\n <Icon icon='ph--eye--regular' size={4} />\n </ToggleGroupItem>\n </ToggleGroup>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { javascript } from '@codemirror/lang-javascript';\nimport { type VirtualTypeScriptEnvironment } from '@typescript/vfs';\nimport { tsSync, tsFacet, tsLinter, tsAutocomplete, tsHover } from '@valtown/codemirror-ts';\nimport React from 'react';\n\nimport { useThemeContext } from '@dxos/react-ui';\nimport {\n autocomplete,\n createBasicExtensions,\n createThemeExtensions,\n editorFullWidth,\n editorGutter,\n editorMonospace,\n InputModeExtensions,\n useTextEditor,\n type UseTextEditorProps,\n} from '@dxos/react-ui-editor';\nimport { nonNullable } from '@dxos/util';\n\nexport type TypescriptEditorProps = {\n id: string;\n env?: VirtualTypeScriptEnvironment;\n} & Pick<UseTextEditorProps, 'className' | 'initialValue' | 'extensions' | 'scrollTo' | 'selection'>;\n\nexport const TypescriptEditor = ({\n id,\n env,\n className,\n initialValue,\n extensions,\n scrollTo,\n selection,\n}: TypescriptEditorProps) => {\n const { themeMode } = useThemeContext();\n const { parentRef, focusAttributes } = useTextEditor(\n () => ({\n id,\n initialValue,\n extensions: [\n extensions,\n createBasicExtensions({\n highlightActiveLine: true,\n indentWithTab: true,\n lineNumbers: true,\n lineWrapping: false,\n scrollPastEnd: true,\n }),\n createThemeExtensions({\n themeMode,\n syntaxHighlighting: true,\n slots: {\n content: { className: editorFullWidth },\n },\n }),\n editorGutter,\n // TODO(burdon): Factor out.\n [\n editorMonospace,\n javascript({ typescript: true }),\n // https://github.com/val-town/codemirror-ts\n autocomplete({ override: env ? [tsAutocomplete()] : [] }),\n env ? [tsFacet.of({ env, path: `/src/${id}.ts` }), tsSync(), tsLinter(), tsHover()] : [],\n InputModeExtensions.vscode,\n ],\n ].filter(nonNullable),\n selection,\n scrollTo,\n }),\n [id, extensions, themeMode, selection, scrollTo],\n );\n\n return <div ref={parentRef} className={className} {...focusAttributes} />;\n};\n\nexport default TypescriptEditor;\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;AAIA,OAAOA,YAAW;AAElB,SAASC,wBAAwB;AACjC,SAASC,+BAA+B;AACxC,SAASC,MAAAA,WAAU;;;ACJnB,SAASC,cAAc;AACvB,OAAOC,0BAA0B;AACjC,OAAOC,8BAA8B;AACrC,OAAOC,UAASC,aAAaC,SAASC,YAAAA,iBAAgB;AAEtD,SAASC,WAAW;AACpB,SAASC,iBAAiB;AAC1B,SAASC,QAAQC,mBAAmBC,QAAQC,SAASC,UAAUC,gBAAgB;AAC/E,SAASC,mBAAmB;AAC5B,SAASC,kBAAAA,uBAA4C;AACrD,SAASC,sBAAsBC,gBAAgB;AAC/C,SAASC,UAAU;;;ACXnB,OAAOC,SAASC,gBAAgB;AAEhC,SACEC,mBACAC,MACAC,QAEAC,aACAC,iBAEAC,WAAWC,gBACXC,SACAC,sBACK;AAgBA,IAAMC,UAAU,CAAC,EACtBC,YACAC,UACAC,OACAC,aACAC,MACAC,WAAAA,YACAC,UACAC,UACAC,cACAC,iBAAgB,MACH;AACb,QAAM,EAAEC,EAAC,IAAKC,eAAeC,aAAAA;AAC7B,QAAM,CAACC,SAASC,UAAAA,IAAcC,SAAS,KAAA;AAEvC,QAAMC,iBAAiB,YAAA;AACrB,QAAI,CAACb,aAAa;AAChB;IACF;AAEA,UAAMc,UAAUC,UAAUC,UAAUhB,WAAAA;EACtC;AAEA,QAAMiB,eAAe,YAAA;AACnB,QAAI,CAACP,SAAS;AACZC,iBAAW,IAAA;AACX,YAAMR,WAAAA;AACNQ,iBAAW,KAAA;IACb;EACF;AAGA,SACE,sBAAA,cAACO,mBAAAA;IAAkBC,WAAU;KAC3B,sBAAA,cAACC,eAAeC,MAAI;IAACxB,YAAY;MAAC;MAAOA;;IAAayB,OAAO;MAAEC,SAAS;IAAS;KAC9ErB,cAAa,sBAAA,cAACsB,gBAAAA;IAAetB,WAAWA;IAAWI;MACnDF,YAAY,sBAAA,cAACqB,mBAAAA;IAAkBC,MAAK;IAA0BC,MAAMpB,EAAE,cAAA;IAAiBqB,SAASxB;MAEjG,sBAAA,cAACyB,OAAAA;IAAIC,MAAK;IAAYC,WAAU;MAE/BhC,QACC,sBAAA,cAACiC,QAAQX,MAAI,MACX,sBAAA,cAACW,QAAQC,SAAO,MACd,sBAAA,cAACC,MAAAA;IAAKR,MAAK;IAA8BS,MAAM;OAEjD,sBAAA,cAACH,QAAQI,QAAM,MACb,sBAAA,cAACJ,QAAQK,SAAO,MACd,sBAAA,cAACL,QAAQM,OAAK,IAAA,GACbvC,KAAAA,CAAAA,CAAAA,IAIL,MAEHC,eAAeF,YACd,sBAAA,cAAC2B,mBAAAA;IAAkBC,MAAK;IAAoBC,MAAMpB,EAAE,iBAAA;IAAoBqB,SAASf;MAGlFV,YACC,sBAAA,cAACsB,mBAAAA;IACCC,MAAMhB,UAAU,6BAA6B;IAC7Cb,YAAY;MAACa,WAAW;;IACxBiB,MAAMjB,UAAUH,EAAE,eAAA,IAAmBA,EAAE,cAAA;IACvCqB,SAASX;MAIb,sBAAA,cAACsB,cAAAA;IAAatC;IAAYI;;AAIlC;AAEA,IAAMoB,oBAAoB,CAAC,EACzBC,MACAC,MACA9B,YACA2C,UACAZ,QAAO,MAC0F;AACjG,SACE,sBAAA,cAACI,QAAQX,MAAI,MACX,sBAAA,cAACW,QAAQC,SAAO;IAACQ,SAAAA;KACf,sBAAA,cAACrB,eAAesB,QAAM;IAACC,SAAQ;IAAQH;IAAoBZ;KACzD,sBAAA,cAACM,MAAAA;IAAKR;IAAYS,MAAM;IAAGtC;QAG/B,sBAAA,cAACmC,QAAQI,QAAM,MACb,sBAAA,cAACJ,QAAQK,SAAO,MACd,sBAAA,cAACL,QAAQM,OAAK,IAAA,GACbX,IAAAA,CAAAA,CAAAA;AAKX;AASO,IAAMH,iBAAiB,CAAC,EAAEtB,WAAAA,aAAY,CAAA,GAAII,iBAAgB,MAAuB;AACtF,SACE,sBAAA,cAACsC,OAAOvB,MAAI;IAACwB,OAAO;IAAIC,eAAexC;KACrC,sBAAA,cAACsC,OAAOG,eAAa,IAAA,GACrB,sBAAA,cAACH,OAAOR,QAAM,MACZ,sBAAA,cAACQ,OAAOP,SAAO,MACb,sBAAA,cAACO,OAAOI,UAAQ,MACd,sBAAA,cAACJ,OAAOK,QAAM;IAACJ,OAAO;KAAI,UAAA,GACzB3C,WAAUgD,IAAI,CAAC,EAAEC,IAAIC,KAAI,MACxB,sBAAA,cAACR,OAAOK,QAAM;IAACI,KAAKF;IAAIN,OAAOM;KAC5BC,IAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA;AAQjB;AAOO,IAAMb,eAAe,CAAC,EAAEtC,MAAMI,aAAY,MAAqB;AACpE,SACE,sBAAA,cAACiD,aAAAA;IAAYC,MAAK;IAASV,OAAO5C;IAAM6C,eAAe,CAACD,UAAUxC,eAAewC,KAAAA;KAC/E,sBAAA,cAACW,iBAAAA;IAAgBX,OAAM;IAAShD,YAAW;KACzC,sBAAA,cAACqC,MAAAA;IAAKR,MAAK;IAAoBS,MAAM;OAEvC,sBAAA,cAACqB,iBAAAA;IAAgBX,OAAM;IAAQhD,YAAW;KACxC,sBAAA,cAACqC,MAAAA;IAAKR,MAAK;IAAqCS,MAAM;OAExD,sBAAA,cAACqB,iBAAAA;IAAgBX,OAAM;IAAUhD,YAAW;KAC1C,sBAAA,cAACqC,MAAAA;IAAKR,MAAK;IAAmBS,MAAM;;AAI5C;;;AC5KA,SAASsB,kBAAkB;AAE3B,SAASC,QAAQC,SAASC,UAAUC,gBAAgBC,eAAe;AACnE,OAAOC,YAAW;AAElB,SAASC,uBAAuB;AAChC,SACEC,cACAC,uBACAC,uBACAC,iBACAC,cACAC,iBACAC,qBACAC,qBAEK;AACP,SAASC,mBAAmB;AAOrB,IAAMC,mBAAmB,CAAC,EAC/BC,IACAC,KACAC,WACAC,cACAC,YACAC,UACAC,UAAS,MACa;AACtB,QAAM,EAAEC,UAAS,IAAKC,gBAAAA;AACtB,QAAM,EAAEC,WAAWC,gBAAe,IAAKC,cACrC,OAAO;IACLX;IACAG;IACAC,YAAY;MACVA;MACAQ,sBAAsB;QACpBC,qBAAqB;QACrBC,eAAe;QACfC,aAAa;QACbC,cAAc;QACdC,eAAe;MACjB,CAAA;MACAC,sBAAsB;QACpBX;QACAY,oBAAoB;QACpBC,OAAO;UACLC,SAAS;YAAEnB,WAAWoB;UAAgB;QACxC;MACF,CAAA;MACAC;;MAEA;QACEC;QACAC,WAAW;UAAEC,YAAY;QAAK,CAAA;;QAE9BC,aAAa;UAAEC,UAAU3B,MAAM;YAAC4B,eAAAA;cAAoB,CAAA;QAAG,CAAA;QACvD5B,MAAM;UAAC6B,QAAQC,GAAG;YAAE9B;YAAK+B,MAAM,QAAQhC,EAAAA;UAAQ,CAAA;UAAIiC,OAAAA;UAAUC,SAAAA;UAAYC,QAAAA;YAAa,CAAA;QACtFC,oBAAoBC;;MAEtBC,OAAOC,WAAAA;IACTjC;IACAD;EACF,IACA;IAACL;IAAII;IAAYG;IAAWD;IAAWD;GAAS;AAGlD,SAAO,gBAAAmC,OAAA,cAACC,OAAAA;IAAIC,KAAKjC;IAAWP;IAAuB,GAAGQ;;AACxD;;;;AFtCO,IAAMiC,eAAe,CAAC,EAAEC,YAAYC,QAAQC,IAAG,MAAqB;AACzE,QAAM,EAAEC,EAAC,IAAKC,gBAAeC,aAAAA;AAC7B,QAAMC,SAASC,UAAAA;AACf,QAAMC,WAAWC,YAAAA;AACjB,QAAMC,QAAQC,SAASV,MAAAA;AACvB,QAAM,CAACW,EAAAA,IAAMC,SAASH,OAAOI,OAAOC,OAAOC,cAAc;IAAEC,QAAQhB;EAAO,CAAA,CAAA;AAE1E,QAAMiB,aAAaC,QACjB,MAAM;IACJC,SAAS;MACPC,UAAU,CAACC,SAAAA;AACT,YAAIrB,OAAOgB,UAAUhB,OAAOgB,QAAQM,YAAYD,MAAM;AACpDrB,iBAAOuB,UAAU;QACnB;MACF;IACF,CAAA;IACAC,qBAAqB;MACnBC,IAAIzB,OAAOyB;MACXJ,MAAMrB,OAAOgB,UAAUU,kBAAkB1B,OAAOgB,QAAQ;QAAC;OAAU;MACnEP;MACAF;IACF,CAAA;KAEF;IAACP;IAAQA,OAAOgB;IAAQP;IAAOF;GAAS;AAG1C,QAAM,CAACoB,MAAMC,OAAAA,IAAWC,UAAmB,QAAA;AAC3C,QAAMC,sBAAsBnB,MAAMoB,6BAA6BC,QAAQrB,EAAAA,CAAAA;AACvE,QAAM,CAACsB,OAAOC,QAAAA,IAAYL,UAAAA;AAE1B,QAAMM,eAAeC,YAAY,YAAA;AAC/B,QAAI,CAACpC,OAAOgB,QAAQ;AAClB;IACF;AAEA,QAAI;AACFhB,aAAOgB,OAAOM,UAAU,MAAMe,OAAOrC,OAAOgB,OAAOM,SAAS;QAC1DgB,QAAQ;QACRC,SAAS;UAACC;UAAsBC;;QAChCC,MAAM;QACNC,aAAa;MACf,CAAA;IACF,SAASC,KAAU;AAEjBC,UAAIC,MAAMF,KAAAA,QAAAA;;;;;;IACZ;EACF,GAAG;IAAC5C,OAAOgB;GAAO;AAElB,QAAM+B,uBAAgE,CAACtB,OAAAA;AACrE,UAAMuB,WAAWC,UAAUC,KAAK,CAACF,cAAaA,UAASvB,OAAOA,EAAAA;AAC9D,QAAIuB,UAAU;AACZhD,aAAOmD,OAAOH,SAASG;AACvBnD,aAAOgB,OAAQM,UAAU0B,SAAShC;AAClC,YAAMoC,WAAWpB,QAAQhC,MAAAA,EAAQqD;AACjC,YAAMC,iBAAiBF,SAASG,UAAU,CAACC,QAAQA,IAAIxC,WAAWyC,yBAAAA;AAClE,UAAIH,kBAAkB,GAAG;AACvBF,iBAASM,OAAOJ,gBAAgB,CAAA;MAClC;AACA,UAAIN,SAASW,UAAU;AACrBP,iBAASQ,KAAK;UAAE5C,QAAQyC;UAA2BhC,IAAIuB,SAASW;QAAS,CAAA;MAC3E;IACF;EACF;AAEA,QAAME,eAAezB,YAAY,YAAA;AAC/B,QAAI,CAACpC,OAAOgB,UAAU,CAACT,YAAY,CAACE,OAAO;AACzC;IACF;AAEAyB,aAAS4B,MAAAA;AAET,QAAI;AACF,YAAMC,qBAAqBjC,qBAAqBkC,MAAM,GAAA,EAAKC,GAAG,EAAC;AAE/D,YAAMC,UAAU,IAAIC,QAAQ;QAAEC,UAAU;QAAWC,kBAAkB,CAAA;QAAIC,eAAe,CAAC;MAAE,CAAA;AAC3F,YAAMC,cAAc,MAAML,QAAQM,OAAOxE,OAAOgB,OAAOM,OAAO;AAC9D,UAAIiD,YAAYtC,SAAS,CAACsC,YAAYC,QAAQ;AAC5C,cAAMD,YAAYtC;MACpB;AAEA,YAAM,EAAEwC,YAAYC,SAASC,KAAI,IAAK,MAAMC,qBAAqB;QAC/DvE;QACAwE,SAASpE,MAAMgB;QACfiD,SAAS/D,KAAKmE,qBAAqBnE,GAAG+D,OAAO,IAAI;QACjDD,YAAYV;QACZ/C,QAAQuD,YAAYC;MACtB,CAAA;AACA,UAAIC,eAAeX,UAAaY,YAAYZ,QAAW;AACrD,cAAM,IAAIiB,MAAM,kDAAkDN,UAAAA,aAAuBC,OAAAA,EAAS;MACpG;AAEA7B,UAAImC,KAAK,qBAAqB;QAAEP;QAAYC;MAAQ,GAAA;;;;;;AACpD,UAAI/D,IAAI;AACNA,WAAG+D,UAAUA;MACf;AAEA,YAAMO,mBAAmBtE,MAAMF,MAAMyE,GAAGC,IAAIC,OAAOrE,cAAc;QAAEoC,MAAMsB;QAAYC;QAAS1D,QAAQhB;MAAO,CAAA,CAAA;AAE7GA,aAAOuB,UAAU;AAEjB,UAAIoD,KAAKU,aAAa;AACpBJ,yBAAiBI,cAAcV,KAAKU;MACtC,OAAO;AACLxC,YAAIyC,QAAQ,wCAAwC;UAAEb;QAAW,GAAA;;;;;;MACnE;AAEAc,mCAA6BvD,QAAQiD,gBAAAA,GAAmB,IAAIxE,MAAMgB,EAAE,IAAIgD,UAAAA,EAAY;AAEpF7C,cAAQ,OAAA;IACV,SAASgB,KAAU;AACjBC,UAAIC,MAAMF,KAAAA,QAAAA;;;;;;AACVV,eAAShC,EAAE,qBAAA,CAAA;IACb;EACF,GAAG;IAACS;IAAImB;IAAqB9B;IAAQA,OAAOmD;IAAMnD,OAAOgB;IAAQP,OAAOgB,MAAM;GAAK;AAEnF,QAAM+D,cAActE,QAAQ,MAAA;AAC1B,QAAI,CAACY,qBAAqB;AACxB;IACF;AAEA,WAAO2D,iBAAiB3D,qBAAqBzB,OAAOqF,OAAOC,OAAOC,SAASC,UAAUC,MAAMC,OAAO,IAAI;MACpGlB,SAASpE,OAAOgB;IAClB,CAAA;EACF,GAAG;IAACK;IAAqBrB;GAAM;AAE/B,SACE,gBAAAuF,OAAA,cAACC,OAAAA;IAAIC,MAAK;IAAOC,WAAWC,GAAG,kEAAkErG,UAAAA;KAC/F,gBAAAiG,OAAA,cAACK,SAAAA;IACCC,UAAUC,QAAQzE,mBAAAA,KAAwB,CAAC9B,OAAOuB;IAClDiE;IACAvD;IACAN;IACAsB;IACAuD,UAAU3C;IACV4C,UAAUtE;IACVuE,cAAc9E;IACd+E,kBAAkB5D;MAGnBpB,SAAS,aACR,gBAAAqE,OAAA,cAACY,kBAAAA;IACCnF,IAAIzB,OAAOyB;IACXxB;IACA4G,cAAc7G,OAAOgB,QAAQM;IAC7BL;IACAkF,WAAU;MAIbxE,SAAS,YAAY,gBAAAqE,OAAA,cAACc,YAAAA;IAAWtB;;AAGxC;;;ADlLA,IAAMuB,kBAAkB,CAAC,EAAEC,QAAQ,GAAGC,MAAAA,MAA0B;AAC9D,QAAMC,kBAAkBC,wBAAwBC,iBAAiBJ,MAAAA,CAAAA;AACjE,SACE,gBAAAK,OAAA,cAACC,OAAAA;IAAIC,MAAK;IAAOC,WAAWC,IAAG,0DAAA;IAA8D,GAAGP;KAC9F,gBAAAG,OAAA,cAACK,cAAAA;IAAc,GAAGT;IAAOD;;AAG/B;AAEA,IAAA,0BAAeD;",
6
+ "names": ["React", "fullyQualifiedId", "useAttendableAttributes", "mx", "format", "prettierPluginEstree", "prettierPluginTypescript", "React", "useCallback", "useMemo", "useState", "log", "useClient", "create", "createDocAccessor", "Filter", "getMeta", "getSpace", "useQuery", "useIdentity", "useTranslation", "createDataExtensions", "listener", "mx", "React", "useState", "ElevationProvider", "Icon", "Select", "ToggleGroup", "ToggleGroupItem", "Toolbar", "NaturalToolbar", "Tooltip", "useTranslation", "Toolbar", "classNames", "deployed", "error", "functionUrl", "view", "templates", "onDeploy", "onFormat", "onViewChange", "onTemplateSelect", "t", "useTranslation", "SCRIPT_PLUGIN", "pending", "setPending", "useState", "handleCopyLink", "navigator", "clipboard", "writeText", "handleDeploy", "ElevationProvider", "elevation", "NaturalToolbar", "Root", "style", "contain", "TemplateSelect", "ToolbarIconButton", "icon", "text", "onClick", "div", "role", "className", "Tooltip", "Trigger", "Icon", "size", "Portal", "Content", "Arrow", "ViewSelector", "disabled", "asChild", "Button", "variant", "Select", "value", "onValueChange", "TriggerButton", "Viewport", "Option", "map", "id", "name", "key", "ToggleGroup", "type", "ToggleGroupItem", "javascript", "tsSync", "tsFacet", "tsLinter", "tsAutocomplete", "tsHover", "React", "useThemeContext", "autocomplete", "createBasicExtensions", "createThemeExtensions", "editorFullWidth", "editorGutter", "editorMonospace", "InputModeExtensions", "useTextEditor", "nonNullable", "TypescriptEditor", "id", "env", "className", "initialValue", "extensions", "scrollTo", "selection", "themeMode", "useThemeContext", "parentRef", "focusAttributes", "useTextEditor", "createBasicExtensions", "highlightActiveLine", "indentWithTab", "lineNumbers", "lineWrapping", "scrollPastEnd", "createThemeExtensions", "syntaxHighlighting", "slots", "content", "editorFullWidth", "editorGutter", "editorMonospace", "javascript", "typescript", "autocomplete", "override", "tsAutocomplete", "tsFacet", "of", "path", "tsSync", "tsLinter", "tsHover", "InputModeExtensions", "vscode", "filter", "nonNullable", "React", "div", "ref", "ScriptEditor", "classNames", "script", "env", "t", "useTranslation", "SCRIPT_PLUGIN", "client", "useClient", "identity", "useIdentity", "space", "getSpace", "fn", "useQuery", "Filter", "schema", "FunctionType", "source", "extensions", "useMemo", "listener", "onChange", "text", "content", "changed", "createDataExtensions", "id", "createDocAccessor", "view", "setView", "useState", "existingFunctionUrl", "getUserFunctionUrlInMetadata", "getMeta", "error", "setError", "handleFormat", "useCallback", "format", "parser", "plugins", "prettierPluginEstree", "prettierPluginTypescript", "semi", "singleQuote", "err", "log", "catch", "handleTemplateChange", "template", "templates", "find", "name", "metaKeys", "keys", "oldPresetIndex", "findIndex", "key", "FUNCTIONS_PRESET_META_KEY", "splice", "presetId", "push", "handleDeploy", "undefined", "existingFunctionId", "split", "at", "bundler", "Bundler", "platform", "sandboxedModules", "remoteModules", "buildResult", "bundle", "functionId", "version", "meta", "uploadWorkerFunction", "spaceId", "incrementSemverPatch", "Error", "info", "deployedFunction", "db", "add", "create", "inputSchema", "verbose", "setUserFunctionUrlInMetadata", "functionUrl", "getInvocationUrl", "config", "values", "runtime", "services", "edge", "url", "React", "div", "role", "className", "mx", "Toolbar", "deployed", "Boolean", "onDeploy", "onFormat", "onViewChange", "onTemplateSelect", "TypescriptEditor", "initialValue", "DebugPanel", "ScriptContainer", "script", "props", "attendableAttrs", "useAttendableAttributes", "fullyQualifiedId", "React", "div", "role", "className", "mx", "ScriptEditor"]
7
+ }
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-C7VBULMK.mjs";
4
4
 
5
5
  // packages/plugins/experimental/plugin-script/src/components/DebugPanel/DebugPanel.tsx
6
- import React, { useEffect, useRef, useState } from "react";
6
+ import React, { forwardRef, useEffect, useRef, useState } from "react";
7
7
  import { log } from "@dxos/log";
8
8
  import { Avatar, Icon, Input, Toolbar, useTranslation } from "@dxos/react-ui";
9
9
  import { SyntaxHighlighter } from "@dxos/react-ui-syntax-highlighter";
@@ -150,15 +150,13 @@ var DebugPanel = ({ classNames, functionUrl }) => {
150
150
  };
151
151
  return /* @__PURE__ */ React.createElement("div", {
152
152
  className: mx("flex flex-col h-full overflow-hidden", classNames)
153
- }, /* @__PURE__ */ React.createElement("div", {
154
- ref: scrollerRef,
155
- className: "flex flex-col gap-6 h-full p-2 overflow-x-hidden overflow-y-auto"
156
153
  }, /* @__PURE__ */ React.createElement(MessageThread, {
154
+ ref: scrollerRef,
157
155
  state,
158
156
  result,
159
157
  history
160
- })), /* @__PURE__ */ React.createElement(Toolbar.Root, {
161
- classNames: "p-2"
158
+ }), /* @__PURE__ */ React.createElement(Toolbar.Root, {
159
+ classNames: "p-1"
162
160
  }, /* @__PURE__ */ React.createElement(Input.Root, null, /* @__PURE__ */ React.createElement(Input.TextInput, {
163
161
  ref: inputRef,
164
162
  autoFocus: true,
@@ -178,8 +176,14 @@ var DebugPanel = ({ classNames, functionUrl }) => {
178
176
  size: 4
179
177
  }))));
180
178
  };
181
- var MessageThread = ({ state, result, history }) => {
182
- return /* @__PURE__ */ React.createElement(React.Fragment, null, history.map((message, i) => /* @__PURE__ */ React.createElement("div", {
179
+ var MessageThread = /* @__PURE__ */ forwardRef(({ state, history, result }, forwardedRef) => {
180
+ if (!history.length && !result.length) {
181
+ return null;
182
+ }
183
+ return /* @__PURE__ */ React.createElement("div", {
184
+ ref: forwardedRef,
185
+ className: "flex flex-col gap-6 h-full p-2 overflow-x-hidden overflow-y-auto"
186
+ }, history.map((message, i) => /* @__PURE__ */ React.createElement("div", {
183
187
  key: i,
184
188
  className: "grid grid-cols-[2rem_1fr_2rem]"
185
189
  }, /* @__PURE__ */ React.createElement("div", {
@@ -208,7 +212,7 @@ var MessageThread = ({ state, result, history }) => {
208
212
  text: result
209
213
  }
210
214
  }))));
211
- };
215
+ });
212
216
  var MessageItem = ({ classNames, message }) => {
213
217
  const { type, text, data, error } = message;
214
218
  const wrapper = "p-1 px-2 rounded-lg bg-hoverSurface overflow-auto";
@@ -233,4 +237,4 @@ var RobotAvatar = () => /* @__PURE__ */ React.createElement(Avatar.Root, {
233
237
  export {
234
238
  DebugPanel
235
239
  };
236
- //# sourceMappingURL=chunk-NCZUJKJE.mjs.map
240
+ //# sourceMappingURL=chunk-K7KY6YMG.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, { forwardRef, useEffect, useRef, useState } from 'react';\n\nimport { log } from '@dxos/log';\nimport { Avatar, Icon, Input, type ThemedClassName, Toolbar, useTranslation } from '@dxos/react-ui';\nimport { SyntaxHighlighter } from '@dxos/react-ui-syntax-highlighter';\nimport { 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}>;\n\nexport const DebugPanel = ({ classNames, functionUrl }: DebugPanelProps) => {\n const { t } = useTranslation(SCRIPT_PLUGIN);\n\n const inputRef = useRef<HTMLInputElement>(null);\n const [input, setInput] = useState('');\n const [result, setResult] = useState('');\n const [state, setState] = useState<State | null>(null);\n\n // TODO(burdon): Persistent history -- 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 <MessageThread ref={scrollerRef} state={state} result={result} history={history} />\n\n <Toolbar.Root classNames='p-1'>\n <Input.Root>\n <Input.TextInput\n ref={inputRef}\n autoFocus\n placeholder={t('function request placeholder')}\n value={input}\n onChange={(ev) => setInput(ev.target.value)}\n onKeyDown={(ev) => ev.key === 'Enter' && handleRequest(input)}\n />\n </Input.Root>\n <Toolbar.Button onClick={() => handleRequest(input)}>\n <Icon icon='ph--play--regular' size={4} />\n </Toolbar.Button>\n <Toolbar.Button onClick={() => (state ? handleStop() : handleClear())}>\n <Icon icon={state ? 'ph--stop--regular' : 'ph--trash--regular'} size={4} />\n </Toolbar.Button>\n </Toolbar.Root>\n </div>\n );\n};\n\n// TODO(burdon): Replace with thread?\n// TODO(burdon): Button to delete individual messages.\n// TODO(burdon): Button to edit/re-run question.\ntype MessageThreadProps = {\n state: State | null;\n history: Message[];\n result: string;\n};\n\nconst MessageThread = forwardRef<HTMLDivElement, MessageThreadProps>(\n ({ state, history, result }: MessageThreadProps, forwardedRef) => {\n if (!history.length && !result.length) {\n return null;\n }\n\n return (\n <div ref={forwardedRef} className='flex flex-col gap-6 h-full p-2 overflow-x-hidden overflow-y-auto'>\n {history.map((message, i) => (\n <div key={i} className='grid grid-cols-[2rem_1fr_2rem]'>\n <div className='p-1'>{message.type === 'response' && <RobotAvatar />}</div>\n <div className='overflow-auto'>\n <MessageItem message={message} />\n </div>\n </div>\n ))}\n\n {result?.length > 0 && (\n <div className='grid grid-cols-[2rem_1fr_2rem]'>\n <div className='p-1'>\n {(state === 'pending' && <Icon icon='ph--spinner--regular' size={6} classNames='animate-spin' />) || (\n <Icon icon='ph--robot--regular' size={6} classNames='animate-[pulse_1s_ease-in-out_infinite]' />\n )}\n </div>\n <div className='overflow-auto'>\n <MessageItem message={{ type: 'response', text: result }} />\n </div>\n </div>\n )}\n </div>\n );\n },\n);\n\nconst MessageItem = ({ classNames, message }: ThemedClassName<{ message: Message }>) => {\n const { type, text, data, error } = message;\n const wrapper = 'p-1 px-2 rounded-lg bg-hoverSurface overflow-auto';\n return (\n <div className={mx('flex', type === 'request' ? 'ml-[1rem] justify-end' : 'mr-[1rem]', classNames)}>\n {error && <div className={mx(wrapper, 'whitespace-pre text-error')}>{String(error)}</div>}\n\n {text !== undefined && (\n <div className={mx(wrapper, type === 'request' && 'bg-primary-400 dark:bg-primary-600')}>\n {text || '\\u00D8'}\n </div>\n )}\n\n {data && (\n <SyntaxHighlighter language='json' className={mx(wrapper, 'px-8 py-2 text-xs')}>\n {JSON.stringify(data, null, 2)}\n </SyntaxHighlighter>\n )}\n </div>\n );\n};\n\nconst RobotAvatar = () => (\n <Avatar.Root size={6} variant='circle'>\n <Avatar.Frame>\n <Avatar.Icon icon='ph--robot--regular' />\n </Avatar.Frame>\n </Avatar.Root>\n);\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "forwardRef", "useEffect", "useRef", "useState", "log", "Avatar", "Icon", "Input", "Toolbar", "useTranslation", "SyntaxHighlighter", "mx", "DebugPanel", "classNames", "functionUrl", "t", "useTranslation", "SCRIPT_PLUGIN", "inputRef", "useRef", "input", "setInput", "useState", "result", "setResult", "state", "setState", "history", "setHistory", "scrollerRef", "handleScroll", "current", "scrollTop", "scrollHeight", "controller", "useEffect", "handleStop", "abort", "undefined", "handleClear", "focus", "handleResponse", "text", "data", "error", "type", "handleRequest", "charAt", "validJsonString", "replace", "JSON", "parse", "stringify", "err", "setTimeout", "AbortController", "response", "fetch", "signal", "method", "body", "headers", "ok", "Error", "statusText", "String", "status", "contentType", "get", "json", "reader", "getReader", "pump", "done", "value", "TextDecoder", "decode", "read", "then", "catch", "name", "log", "div", "className", "mx", "MessageThread", "ref", "Toolbar", "Root", "Input", "TextInput", "autoFocus", "placeholder", "onChange", "ev", "target", "onKeyDown", "key", "Button", "onClick", "Icon", "icon", "size", "forwardRef", "forwardedRef", "length", "map", "message", "i", "RobotAvatar", "MessageItem", "wrapper", "SyntaxHighlighter", "language", "Avatar", "variant", "Frame"]
7
+ }
@@ -24,7 +24,7 @@ var FunctionType = class extends TypedObject({
24
24
  })({
25
25
  // TODO(burdon): Rename to id/uri?
26
26
  name: S.NonEmptyString,
27
- version: S.Number,
27
+ version: S.String,
28
28
  // Reference to a source script if it exists within ECHO.
29
29
  // TODO(burdon): Don't ref ScriptType directly (core).
30
30
  source: S.optional(ref(ScriptType)),
@@ -45,4 +45,4 @@ export {
45
45
  FunctionType,
46
46
  ScriptAction
47
47
  };
48
- //# sourceMappingURL=chunk-DTVOXLPP.mjs.map
48
+ //# sourceMappingURL=chunk-QFZUFT5G.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/types/schema.ts", "../../../src/types/types.ts"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { JsonSchemaType, ref, S, TypedObject } from '@dxos/echo-schema';\nimport { TextType } from '@dxos/plugin-markdown/types';\n\n/**\n * Source script.\n */\nexport class ScriptType extends TypedObject({\n typename: 'dxos.org/type/Script',\n version: '0.1.0',\n})({\n // TODO(burdon): Change to URI?\n name: S.optional(S.String),\n description: S.optional(S.String),\n // TODO(burdon): Change to hash of deployed content.\n // Whether source has changed since last deploy.\n changed: S.optional(S.Boolean),\n source: ref(TextType),\n}) {}\n\n/**\n * Function deployment.\n */\n// TODO(burdon): Move to core/functions.\nexport class FunctionType extends TypedObject({\n typename: 'dxos.org/type/Function',\n version: '0.1.0',\n})({\n // TODO(burdon): Rename to id/uri?\n name: S.NonEmptyString,\n version: S.Number,\n\n // Reference to a source script if it exists within ECHO.\n // TODO(burdon): Don't ref ScriptType directly (core).\n source: S.optional(ref(ScriptType)),\n\n inputSchema: S.optional(JsonSchemaType),\n\n // Local binding to a function name.\n binding: S.optional(S.String),\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,gBAAgBC,KAAKC,GAAGC,mBAAmB;AACpD,SAASC,gBAAgB;AAKlB,IAAMC,aAAN,cAAyBC,YAAY;EAC1CC,UAAU;EACVC,SAAS;AACX,CAAA,EAAG;;EAEDC,MAAMC,EAAEC,SAASD,EAAEE,MAAM;EACzBC,aAAaH,EAAEC,SAASD,EAAEE,MAAM;;;EAGhCE,SAASJ,EAAEC,SAASD,EAAEK,OAAO;EAC7BC,QAAQC,IAAIC,QAAAA;AACd,CAAA,EAAA;AAAI;AAMG,IAAMC,eAAN,cAA2Bb,YAAY;EAC5CC,UAAU;EACVC,SAAS;AACX,CAAA,EAAG;;EAEDC,MAAMC,EAAEU;EACRZ,SAASE,EAAEW;;;EAIXL,QAAQN,EAAEC,SAASM,IAAIZ,UAAAA,CAAAA;EAEvBiB,aAAaZ,EAAEC,SAASY,cAAAA;;EAGxBC,SAASd,EAAEC,SAASD,EAAEE,MAAM;AAC9B,CAAA,EAAA;AAAI;;;;UC1BQa,eAAAA;0CACD,GAAGC,aAAAA,SAAsB,IAAA;GADxBD,iBAAAA,eAAAA,CAAAA,EAAAA;",
6
- "names": ["JsonSchemaType", "ref", "S", "TypedObject", "TextType", "ScriptType", "TypedObject", "typename", "version", "name", "S", "optional", "String", "description", "changed", "Boolean", "source", "ref", "TextType", "FunctionType", "NonEmptyString", "Number", "inputSchema", "JsonSchemaType", "binding", "ScriptAction", "SCRIPT_PLUGIN"]
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { JsonSchemaType, ref, S, TypedObject } from '@dxos/echo-schema';\nimport { TextType } from '@dxos/plugin-markdown/types';\n\n/**\n * Source script.\n */\nexport class ScriptType extends TypedObject({\n typename: 'dxos.org/type/Script',\n version: '0.1.0',\n})({\n // TODO(burdon): Change to URI?\n name: S.optional(S.String),\n description: S.optional(S.String),\n // TODO(burdon): Change to hash of deployed content.\n // Whether source has changed since last deploy.\n changed: S.optional(S.Boolean),\n source: ref(TextType),\n}) {}\n\n/**\n * Function deployment.\n */\n// TODO(burdon): Move to core/functions.\nexport class FunctionType extends TypedObject({\n typename: 'dxos.org/type/Function',\n version: '0.1.0',\n})({\n // TODO(burdon): Rename to id/uri?\n name: S.NonEmptyString,\n version: S.String,\n\n // Reference to a source script if it exists within ECHO.\n // TODO(burdon): Don't ref ScriptType directly (core).\n source: S.optional(ref(ScriptType)),\n\n inputSchema: S.optional(JsonSchemaType),\n\n // Local binding to a function name.\n binding: S.optional(S.String),\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-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 SurfaceProvides &\n TranslationsProvides;\n"],
5
+ "mappings": ";;;;;AAIA,SAASA,gBAAgBC,KAAKC,GAAGC,mBAAmB;AACpD,SAASC,gBAAgB;AAKlB,IAAMC,aAAN,cAAyBC,YAAY;EAC1CC,UAAU;EACVC,SAAS;AACX,CAAA,EAAG;;EAEDC,MAAMC,EAAEC,SAASD,EAAEE,MAAM;EACzBC,aAAaH,EAAEC,SAASD,EAAEE,MAAM;;;EAGhCE,SAASJ,EAAEC,SAASD,EAAEK,OAAO;EAC7BC,QAAQC,IAAIC,QAAAA;AACd,CAAA,EAAA;AAAI;AAMG,IAAMC,eAAN,cAA2Bb,YAAY;EAC5CC,UAAU;EACVC,SAAS;AACX,CAAA,EAAG;;EAEDC,MAAMC,EAAEU;EACRZ,SAASE,EAAEE;;;EAIXI,QAAQN,EAAEC,SAASM,IAAIZ,UAAAA,CAAAA;EAEvBgB,aAAaX,EAAEC,SAASW,cAAAA;;EAGxBC,SAASb,EAAEC,SAASD,EAAEE,MAAM;AAC9B,CAAA,EAAA;AAAI;;;;UC3BQY,eAAAA;0CACD,GAAGC,aAAAA,SAAsB,IAAA;GADxBD,iBAAAA,eAAAA,CAAAA,EAAAA;",
6
+ "names": ["JsonSchemaType", "ref", "S", "TypedObject", "TextType", "ScriptType", "TypedObject", "typename", "version", "name", "S", "optional", "String", "description", "changed", "Boolean", "source", "ref", "TextType", "FunctionType", "NonEmptyString", "inputSchema", "JsonSchemaType", "binding", "ScriptAction", "SCRIPT_PLUGIN"]
7
7
  }
@@ -0,0 +1,123 @@
1
+ // packages/plugins/experimental/plugin-script/src/edge/functions.ts
2
+ import { EdgeHttpClient } from "@dxos/edge-client";
3
+ import { invariant } from "@dxos/invariant";
4
+ import { log } from "@dxos/log";
5
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/experimental/plugin-script/src/edge/functions.ts";
6
+ var FUNCTIONS_META_KEY = "dxos.org/service/function";
7
+ var FUNCTIONS_PRESET_META_KEY = "dxos.org/service/function-preset";
8
+ var uploadWorkerFunction = async ({ client, name, version, source, spaceId, functionId }) => {
9
+ const edgeUrl = client.config.values.runtime?.services?.edge?.url;
10
+ invariant(edgeUrl, "Edge is not configured.", {
11
+ F: __dxlog_file,
12
+ L: 38,
13
+ S: void 0,
14
+ A: [
15
+ "edgeUrl",
16
+ "'Edge is not configured.'"
17
+ ]
18
+ });
19
+ const edgeClient = new EdgeHttpClient(edgeUrl);
20
+ const edgeIdentity = createEdgeIdentity(client);
21
+ edgeClient.setIdentity(edgeIdentity);
22
+ const response = await edgeClient.uploadFunction({
23
+ spaceId,
24
+ functionId
25
+ }, {
26
+ name,
27
+ version,
28
+ script: source
29
+ });
30
+ log("Uploaded", {
31
+ functionId,
32
+ source,
33
+ name,
34
+ identityKey: edgeIdentity.identityKey,
35
+ response
36
+ }, {
37
+ F: __dxlog_file,
38
+ L: 44,
39
+ S: void 0,
40
+ C: (f, a) => f(...a)
41
+ });
42
+ return response;
43
+ };
44
+ var getUserFunctionUrlInMetadata = (meta) => {
45
+ return meta.keys.find((key) => key.source === FUNCTIONS_META_KEY)?.id;
46
+ };
47
+ var setUserFunctionUrlInMetadata = (meta, functionUrl) => {
48
+ const key = meta.keys.find((key2) => key2.source === FUNCTIONS_META_KEY);
49
+ if (key) {
50
+ if (key.id !== functionUrl) {
51
+ throw new Error("Metadata mismatch");
52
+ }
53
+ } else {
54
+ meta.keys.push({
55
+ source: FUNCTIONS_META_KEY,
56
+ id: functionUrl
57
+ });
58
+ }
59
+ };
60
+ var getInvocationUrl = (functionUrl, edgeUrl, options = {}) => {
61
+ const baseUrl = new URL("functions/", edgeUrl);
62
+ const relativeUrl = functionUrl.replace(/^\//, "");
63
+ const url = new URL(`./${relativeUrl}`, baseUrl.toString());
64
+ options.spaceId && url.searchParams.set("spaceId", options.spaceId);
65
+ options.subjectId && url.searchParams.set("subjectId", options.subjectId);
66
+ url.protocol = "https";
67
+ return url.toString();
68
+ };
69
+ var createEdgeIdentity = (client) => {
70
+ const identity = client.halo.identity.get();
71
+ const device = client.halo.device;
72
+ if (!identity || !device) {
73
+ throw new Error("Identity not available");
74
+ }
75
+ return {
76
+ identityKey: identity.identityKey.toHex(),
77
+ peerKey: device.deviceKey.toHex(),
78
+ presentCredentials: async ({ challenge }) => {
79
+ const identityService = client.services.services.IdentityService;
80
+ const authCredential = await identityService.createAuthCredential();
81
+ return identityService.signPresentation({
82
+ presentation: {
83
+ credentials: [
84
+ authCredential
85
+ ]
86
+ },
87
+ nonce: challenge
88
+ });
89
+ }
90
+ };
91
+ };
92
+ var incrementSemverPatch = (version) => {
93
+ const [major, minor, patch] = version.split(".");
94
+ const patchNum = Number(patch);
95
+ invariant(!Number.isNaN(patchNum), "Unexpected function version format.", {
96
+ F: __dxlog_file,
97
+ L: 105,
98
+ S: void 0,
99
+ A: [
100
+ "!Number.isNaN(patchNum)",
101
+ "'Unexpected function version format.'"
102
+ ]
103
+ });
104
+ return [
105
+ major,
106
+ minor,
107
+ String(patchNum + 1)
108
+ ].join(".");
109
+ };
110
+ var publicKeyToDid = (key) => {
111
+ return `did:key:${key.toHex()}`;
112
+ };
113
+
114
+ export {
115
+ FUNCTIONS_PRESET_META_KEY,
116
+ uploadWorkerFunction,
117
+ getUserFunctionUrlInMetadata,
118
+ setUserFunctionUrlInMetadata,
119
+ getInvocationUrl,
120
+ incrementSemverPatch,
121
+ publicKeyToDid
122
+ };
123
+ //# sourceMappingURL=chunk-U3OP64V4.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/edge/functions.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { type DID } from 'iso-did/types';\n\nimport { type Client } from '@dxos/client';\nimport { type ObjectMeta } from '@dxos/echo-schema';\nimport { EdgeHttpClient, type EdgeIdentity } from '@dxos/edge-client';\nimport { invariant } from '@dxos/invariant';\nimport type { PublicKey, SpaceId } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { type UploadFunctionResponseBody } from '@dxos/protocols';\n\n// TODO: use URL scheme for source?\nconst FUNCTIONS_META_KEY = 'dxos.org/service/function';\n\nexport const FUNCTIONS_PRESET_META_KEY = 'dxos.org/service/function-preset';\n\nexport type UploadWorkerArgs = {\n client: Client;\n name?: string;\n source: string;\n version: string;\n functionId?: string;\n spaceId: SpaceId;\n};\n\nexport const uploadWorkerFunction = async ({\n client,\n name,\n version,\n source,\n spaceId,\n functionId,\n}: UploadWorkerArgs): Promise<UploadFunctionResponseBody> => {\n const edgeUrl = client.config.values.runtime?.services?.edge?.url;\n invariant(edgeUrl, 'Edge is not configured.');\n const edgeClient = new EdgeHttpClient(edgeUrl);\n const edgeIdentity = createEdgeIdentity(client);\n edgeClient.setIdentity(edgeIdentity);\n const response = await edgeClient.uploadFunction({ spaceId, functionId }, { name, version, script: source });\n\n log('Uploaded', {\n functionId,\n source,\n name,\n identityKey: edgeIdentity.identityKey,\n response,\n });\n\n return response;\n};\n\nexport const getUserFunctionUrlInMetadata = (meta: ObjectMeta) => {\n return meta.keys.find((key) => key.source === FUNCTIONS_META_KEY)?.id;\n};\n\nexport const setUserFunctionUrlInMetadata = (meta: ObjectMeta, functionUrl: string) => {\n const key = meta.keys.find((key) => key.source === FUNCTIONS_META_KEY);\n if (key) {\n if (key.id !== functionUrl) {\n throw new Error('Metadata mismatch');\n }\n } else {\n meta.keys.push({ source: FUNCTIONS_META_KEY, id: functionUrl });\n }\n};\n\nexport const getInvocationUrl = (functionUrl: string, edgeUrl: string, options: InvocationOptions = {}) => {\n const baseUrl = new URL('functions/', edgeUrl);\n\n // Leading slashes cause the URL to be treated as an absolute path.\n const relativeUrl = functionUrl.replace(/^\\//, '');\n const url = new URL(`./${relativeUrl}`, baseUrl.toString());\n options.spaceId && url.searchParams.set('spaceId', options.spaceId);\n options.subjectId && url.searchParams.set('subjectId', options.subjectId);\n url.protocol = 'https';\n return url.toString();\n};\n\nconst createEdgeIdentity = (client: Client): EdgeIdentity => {\n const identity = client.halo.identity.get();\n const device = client.halo.device;\n if (!identity || !device) {\n throw new Error('Identity not available');\n }\n return {\n identityKey: identity.identityKey.toHex(),\n peerKey: device.deviceKey.toHex(),\n presentCredentials: async ({ challenge }) => {\n const identityService = client.services.services.IdentityService!;\n const authCredential = await identityService.createAuthCredential();\n return identityService.signPresentation({\n presentation: { credentials: [authCredential] },\n nonce: challenge,\n });\n },\n };\n};\n\nexport const incrementSemverPatch = (version: string): string => {\n const [major, minor, patch] = version.split('.');\n const patchNum = Number(patch);\n invariant(!Number.isNaN(patchNum), 'Unexpected function version format.');\n return [major, minor, String(patchNum + 1)].join('.');\n};\n\nexport const publicKeyToDid = (key: PublicKey): DID => {\n return `did:key:${key.toHex()}`;\n};\n\nexport type InvocationOptions = {\n spaceId?: SpaceId;\n subjectId?: string;\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["EdgeHttpClient", "invariant", "log", "FUNCTIONS_META_KEY", "FUNCTIONS_PRESET_META_KEY", "uploadWorkerFunction", "client", "name", "version", "source", "spaceId", "functionId", "edgeUrl", "config", "values", "runtime", "services", "edge", "url", "edgeClient", "edgeIdentity", "createEdgeIdentity", "setIdentity", "response", "uploadFunction", "script", "identityKey", "getUserFunctionUrlInMetadata", "meta", "keys", "find", "key", "id", "setUserFunctionUrlInMetadata", "functionUrl", "Error", "push", "getInvocationUrl", "options", "baseUrl", "URL", "relativeUrl", "replace", "toString", "searchParams", "set", "subjectId", "protocol", "identity", "halo", "get", "device", "toHex", "peerKey", "deviceKey", "presentCredentials", "challenge", "identityService", "IdentityService", "authCredential", "createAuthCredential", "signPresentation", "presentation", "credentials", "nonce", "incrementSemverPatch", "major", "minor", "patch", "split", "patchNum", "Number", "isNaN", "String", "join", "publicKeyToDid"]
7
+ }
@@ -1,21 +1,17 @@
1
1
  import {
2
- HeaderCodec,
3
- USERFUNCTIONS_PRESET_META_KEY,
4
- codec,
2
+ FUNCTIONS_PRESET_META_KEY,
5
3
  getInvocationUrl,
6
4
  getUserFunctionUrlInMetadata,
7
- matchServiceCredential,
5
+ incrementSemverPatch,
8
6
  publicKeyToDid,
9
7
  setUserFunctionUrlInMetadata,
10
8
  uploadWorkerFunction
11
- } from "../chunk-5GGRYRS4.mjs";
9
+ } from "../chunk-U3OP64V4.mjs";
12
10
  export {
13
- HeaderCodec,
14
- USERFUNCTIONS_PRESET_META_KEY,
15
- codec,
11
+ FUNCTIONS_PRESET_META_KEY,
16
12
  getInvocationUrl,
17
13
  getUserFunctionUrlInMetadata,
18
- matchServiceCredential,
14
+ incrementSemverPatch,
19
15
  publicKeyToDid,
20
16
  setUserFunctionUrlInMetadata,
21
17
  uploadWorkerFunction