@dxos/plugin-script 0.8.3-main.672df60 → 0.8.3-staging.0fa589b

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 (126) hide show
  1. package/dist/lib/browser/{DeploymentDialog-NLWQHNKE.mjs → DeploymentDialog-RPPPWEEL.mjs} +3 -3
  2. package/dist/lib/browser/{ScriptContainer-NDMTQG2N.mjs → ScriptContainer-RSN52NH7.mjs} +40 -50
  3. package/dist/lib/browser/ScriptContainer-RSN52NH7.mjs.map +7 -0
  4. package/dist/lib/browser/{app-graph-builder-V3HPXJAD.mjs → app-graph-builder-5Z3MUX4N.mjs} +4 -4
  5. package/dist/lib/browser/app-graph-builder-5Z3MUX4N.mjs.map +7 -0
  6. package/dist/lib/browser/{artifact-definition-L3AIY4XA.mjs → artifact-definition-A4TBQL75.mjs} +8 -8
  7. package/dist/lib/browser/artifact-definition-A4TBQL75.mjs.map +7 -0
  8. package/dist/lib/browser/{chunk-SH4MI7PU.mjs → chunk-3FU4QZVP.mjs} +3 -3
  9. package/dist/lib/browser/{chunk-SH4MI7PU.mjs.map → chunk-3FU4QZVP.mjs.map} +2 -2
  10. package/dist/lib/browser/{chunk-BMVT3XMV.mjs → chunk-3JLR2SHJ.mjs} +7 -7
  11. package/dist/lib/browser/{chunk-BMVT3XMV.mjs.map → chunk-3JLR2SHJ.mjs.map} +1 -1
  12. package/dist/lib/browser/{chunk-BTEFFA4C.mjs → chunk-LA66DQGU.mjs} +2 -2
  13. package/dist/lib/browser/{chunk-6T64VQHF.mjs → chunk-QJH7I2UV.mjs} +10 -10
  14. package/dist/lib/browser/chunk-QJH7I2UV.mjs.map +7 -0
  15. package/dist/lib/browser/index.mjs +14 -10
  16. package/dist/lib/browser/index.mjs.map +3 -3
  17. package/dist/lib/browser/{intent-resolver-BIJLOJU3.mjs → intent-resolver-JOJNH4UX.mjs} +8 -8
  18. package/dist/lib/browser/intent-resolver-JOJNH4UX.mjs.map +7 -0
  19. package/dist/lib/browser/meta.json +1 -1
  20. package/dist/lib/browser/{react-surface-ZBCIYBGH.mjs → react-surface-7BKUWL2U.mjs} +12 -12
  21. package/dist/lib/browser/react-surface-7BKUWL2U.mjs.map +7 -0
  22. package/dist/lib/browser/{settings-FU7NTENS.mjs → settings-Z22D6JVJ.mjs} +2 -2
  23. package/dist/lib/browser/{settings-FU7NTENS.mjs.map → settings-Z22D6JVJ.mjs.map} +3 -3
  24. package/dist/lib/node/{DeploymentDialog-PC5AL3BB.cjs → DeploymentDialog-C3EEYGRH.cjs} +8 -8
  25. package/dist/lib/node/{DeploymentDialog-PC5AL3BB.cjs.map → DeploymentDialog-C3EEYGRH.cjs.map} +2 -2
  26. package/dist/lib/node/{ScriptContainer-CLW7YCIP.cjs → ScriptContainer-CAC7AISY.cjs} +54 -64
  27. package/dist/lib/node/ScriptContainer-CAC7AISY.cjs.map +7 -0
  28. package/dist/lib/node/{app-graph-builder-YE4OM4OC.cjs → app-graph-builder-25OOTBW4.cjs} +7 -7
  29. package/dist/lib/node/app-graph-builder-25OOTBW4.cjs.map +7 -0
  30. package/dist/lib/node/{artifact-definition-6BD6CVOV.cjs → artifact-definition-QKZI6PTO.cjs} +11 -11
  31. package/dist/lib/node/artifact-definition-QKZI6PTO.cjs.map +7 -0
  32. package/dist/lib/node/{chunk-Q44SJXEN.cjs → chunk-AU2FOE26.cjs} +9 -9
  33. package/dist/lib/node/{chunk-Q44SJXEN.cjs.map → chunk-AU2FOE26.cjs.map} +2 -2
  34. package/dist/lib/node/{chunk-RARNZD62.cjs → chunk-BUOBOT3V.cjs} +6 -6
  35. package/dist/lib/node/{chunk-QCAKVK6S.cjs → chunk-OSBMUJ4T.cjs} +12 -12
  36. package/dist/lib/node/{chunk-QCAKVK6S.cjs.map → chunk-OSBMUJ4T.cjs.map} +1 -1
  37. package/dist/lib/node/{chunk-V6L73D7S.cjs → chunk-YO5W2IPQ.cjs} +13 -13
  38. package/dist/lib/node/chunk-YO5W2IPQ.cjs.map +7 -0
  39. package/dist/lib/node/index.cjs +22 -18
  40. package/dist/lib/node/index.cjs.map +3 -3
  41. package/dist/lib/node/{intent-resolver-QKBCESXR.cjs → intent-resolver-BQ2NKEM7.cjs} +15 -15
  42. package/dist/lib/node/intent-resolver-BQ2NKEM7.cjs.map +7 -0
  43. package/dist/lib/node/meta.json +1 -1
  44. package/dist/lib/node/{react-surface-HZJOZHHG.cjs → react-surface-EUKPDFU3.cjs} +25 -25
  45. package/dist/lib/node/react-surface-EUKPDFU3.cjs.map +7 -0
  46. package/dist/lib/node/{settings-RRCQ7ZQD.cjs → settings-WO53FLYZ.cjs} +5 -5
  47. package/dist/lib/node/{settings-RRCQ7ZQD.cjs.map → settings-WO53FLYZ.cjs.map} +3 -3
  48. package/dist/lib/node-esm/{DeploymentDialog-QHB2BGNJ.mjs → DeploymentDialog-IA4CH6WZ.mjs} +3 -3
  49. package/dist/lib/node-esm/{ScriptContainer-PMRP7AJ5.mjs → ScriptContainer-4IOOIPBF.mjs} +40 -50
  50. package/dist/lib/node-esm/ScriptContainer-4IOOIPBF.mjs.map +7 -0
  51. package/dist/lib/node-esm/{app-graph-builder-4CN7URJQ.mjs → app-graph-builder-IOOUTHV2.mjs} +4 -4
  52. package/dist/lib/node-esm/app-graph-builder-IOOUTHV2.mjs.map +7 -0
  53. package/dist/lib/node-esm/{artifact-definition-PPV2XKU7.mjs → artifact-definition-4XRYAP54.mjs} +8 -8
  54. package/dist/lib/node-esm/artifact-definition-4XRYAP54.mjs.map +7 -0
  55. package/dist/lib/node-esm/{chunk-IIPL3OKN.mjs → chunk-B4TP3LSZ.mjs} +7 -7
  56. package/dist/lib/node-esm/{chunk-IIPL3OKN.mjs.map → chunk-B4TP3LSZ.mjs.map} +1 -1
  57. package/dist/lib/node-esm/{chunk-47MABIVX.mjs → chunk-MJJQBUOL.mjs} +10 -10
  58. package/dist/lib/node-esm/chunk-MJJQBUOL.mjs.map +7 -0
  59. package/dist/lib/node-esm/{chunk-25GOLUXY.mjs → chunk-T7XDCUTF.mjs} +2 -2
  60. package/dist/lib/node-esm/{chunk-JFCZ3L27.mjs → chunk-W2DAXWHA.mjs} +3 -3
  61. package/dist/lib/node-esm/{chunk-JFCZ3L27.mjs.map → chunk-W2DAXWHA.mjs.map} +2 -2
  62. package/dist/lib/node-esm/index.mjs +14 -10
  63. package/dist/lib/node-esm/index.mjs.map +3 -3
  64. package/dist/lib/node-esm/{intent-resolver-UWYXAPLZ.mjs → intent-resolver-HTM5PSRZ.mjs} +8 -8
  65. package/dist/lib/node-esm/intent-resolver-HTM5PSRZ.mjs.map +7 -0
  66. package/dist/lib/node-esm/meta.json +1 -1
  67. package/dist/lib/node-esm/{react-surface-MHCPAP55.mjs → react-surface-6UO64YOS.mjs} +12 -12
  68. package/dist/lib/node-esm/react-surface-6UO64YOS.mjs.map +7 -0
  69. package/dist/lib/node-esm/{settings-NKNC32QC.mjs → settings-KZEGCDYX.mjs} +2 -2
  70. package/dist/lib/node-esm/{settings-NKNC32QC.mjs.map → settings-KZEGCDYX.mjs.map} +3 -3
  71. package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
  72. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  73. package/dist/types/src/components/ScriptContainer.d.ts +4 -5
  74. package/dist/types/src/components/ScriptContainer.d.ts.map +1 -1
  75. package/dist/types/src/components/ScriptToolbar/ScriptToolbar.d.ts.map +1 -1
  76. package/dist/types/src/components/TypescriptEditor/TypescriptEditor.d.ts +5 -4
  77. package/dist/types/src/components/TypescriptEditor/TypescriptEditor.d.ts.map +1 -1
  78. package/dist/types/src/components/index.d.ts +1 -1
  79. package/dist/types/src/components/index.d.ts.map +1 -1
  80. package/dist/types/src/hooks/deploy.d.ts +11 -13
  81. package/dist/types/src/hooks/deploy.d.ts.map +1 -1
  82. package/dist/types/src/hooks/format.d.ts.map +1 -1
  83. package/dist/types/src/translations.d.ts +116 -2
  84. package/dist/types/src/translations.d.ts.map +1 -1
  85. package/dist/types/src/types.d.ts +3 -4
  86. package/dist/types/src/types.d.ts.map +1 -1
  87. package/dist/types/src/util/deploy.d.ts.map +1 -1
  88. package/package.json +49 -49
  89. package/src/capabilities/app-graph-builder.ts +3 -3
  90. package/src/capabilities/artifact-definition.ts +5 -4
  91. package/src/capabilities/intent-resolver.ts +3 -3
  92. package/src/capabilities/react-surface.tsx +7 -7
  93. package/src/capabilities/settings.ts +9 -2
  94. package/src/components/ScriptContainer.tsx +25 -33
  95. package/src/components/ScriptToolbar/ScriptToolbar.tsx +11 -14
  96. package/src/components/Settings/ScriptObjectSettings.tsx +2 -2
  97. package/src/components/TestPanel/TestPanel.tsx +1 -1
  98. package/src/components/TypescriptEditor/TypescriptEditor.tsx +38 -42
  99. package/src/hooks/format.ts +6 -1
  100. package/src/hooks/useCreateAndDeployScriptTemplates.ts +2 -2
  101. package/src/templates/gmail.ts +1 -1
  102. package/src/translations.ts +5 -1
  103. package/src/util/deploy.ts +5 -4
  104. package/dist/lib/browser/ScriptContainer-NDMTQG2N.mjs.map +0 -7
  105. package/dist/lib/browser/app-graph-builder-V3HPXJAD.mjs.map +0 -7
  106. package/dist/lib/browser/artifact-definition-L3AIY4XA.mjs.map +0 -7
  107. package/dist/lib/browser/chunk-6T64VQHF.mjs.map +0 -7
  108. package/dist/lib/browser/intent-resolver-BIJLOJU3.mjs.map +0 -7
  109. package/dist/lib/browser/react-surface-ZBCIYBGH.mjs.map +0 -7
  110. package/dist/lib/node/ScriptContainer-CLW7YCIP.cjs.map +0 -7
  111. package/dist/lib/node/app-graph-builder-YE4OM4OC.cjs.map +0 -7
  112. package/dist/lib/node/artifact-definition-6BD6CVOV.cjs.map +0 -7
  113. package/dist/lib/node/chunk-V6L73D7S.cjs.map +0 -7
  114. package/dist/lib/node/intent-resolver-QKBCESXR.cjs.map +0 -7
  115. package/dist/lib/node/react-surface-HZJOZHHG.cjs.map +0 -7
  116. package/dist/lib/node-esm/ScriptContainer-PMRP7AJ5.mjs.map +0 -7
  117. package/dist/lib/node-esm/app-graph-builder-4CN7URJQ.mjs.map +0 -7
  118. package/dist/lib/node-esm/artifact-definition-PPV2XKU7.mjs.map +0 -7
  119. package/dist/lib/node-esm/chunk-47MABIVX.mjs.map +0 -7
  120. package/dist/lib/node-esm/intent-resolver-UWYXAPLZ.mjs.map +0 -7
  121. package/dist/lib/node-esm/react-surface-MHCPAP55.mjs.map +0 -7
  122. /package/dist/lib/browser/{DeploymentDialog-NLWQHNKE.mjs.map → DeploymentDialog-RPPPWEEL.mjs.map} +0 -0
  123. /package/dist/lib/browser/{chunk-BTEFFA4C.mjs.map → chunk-LA66DQGU.mjs.map} +0 -0
  124. /package/dist/lib/node/{chunk-RARNZD62.cjs.map → chunk-BUOBOT3V.cjs.map} +0 -0
  125. /package/dist/lib/node-esm/{DeploymentDialog-QHB2BGNJ.mjs.map → DeploymentDialog-IA4CH6WZ.mjs.map} +0 -0
  126. /package/dist/lib/node-esm/{chunk-25GOLUXY.mjs.map → chunk-T7XDCUTF.mjs.map} +0 -0
@@ -6,8 +6,8 @@ import {
6
6
  useDeployDeps,
7
7
  useDeployState,
8
8
  useToolbarState
9
- } from "./chunk-JFCZ3L27.mjs";
10
- import "./chunk-47MABIVX.mjs";
9
+ } from "./chunk-W2DAXWHA.mjs";
10
+ import "./chunk-MJJQBUOL.mjs";
11
11
  import "./chunk-UESZKXLR.mjs";
12
12
  import {
13
13
  SCRIPT_PLUGIN
@@ -20,7 +20,6 @@ import { createDocAccessor, getSpace } from "@dxos/react-client/echo";
20
20
  import { useIdentity } from "@dxos/react-client/halo";
21
21
  import { createDataExtensions, listener, stackItemContentEditorClassNames } from "@dxos/react-ui-editor";
22
22
  import { StackItem } from "@dxos/react-ui-stack";
23
- import { mx } from "@dxos/react-ui-theme";
24
23
 
25
24
  // packages/plugins/plugin-script/src/components/ScriptToolbar/ScriptToolbar.tsx
26
25
  import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
@@ -28,7 +27,6 @@ import { Rx } from "@effect-rx/rx-react";
28
27
  import React, { useMemo } from "react";
29
28
  import { fullyQualifiedId } from "@dxos/react-client/echo";
30
29
  import { ElevationProvider, useTranslation } from "@dxos/react-ui";
31
- import { stackItemContentToolbarClassNames } from "@dxos/react-ui-editor";
32
30
  import { createGapSeparator, MenuProvider, rxFromSignal, ToolbarMenu, useMenuActions } from "@dxos/react-ui-menu";
33
31
  var createToolbar = ({ state, script, ...options }) => Rx.make((get) => get(rxFromSignal(() => {
34
32
  const templateSelect = createTemplateSelect(script);
@@ -73,17 +71,14 @@ var ScriptToolbar = ({ script, role, state, classNames }) => {
73
71
  t
74
72
  ]);
75
73
  const menu = useMenuActions(toolbarCreator);
76
- return /* @__PURE__ */ React.createElement("div", {
77
- role: "none",
78
- className: stackItemContentToolbarClassNames(role)
79
- }, /* @__PURE__ */ React.createElement(ElevationProvider, {
74
+ return /* @__PURE__ */ React.createElement(ElevationProvider, {
80
75
  elevation: role === "section" ? "positioned" : "base"
81
76
  }, /* @__PURE__ */ React.createElement(MenuProvider, {
82
77
  ...menu,
83
78
  attendableId: fullyQualifiedId(script)
84
79
  }, /* @__PURE__ */ React.createElement(ToolbarMenu, {
85
80
  classNames
86
- }))));
81
+ })));
87
82
  } finally {
88
83
  _effect.f();
89
84
  }
@@ -93,6 +88,7 @@ var ScriptToolbar = ({ script, role, state, classNames }) => {
93
88
  import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
94
89
  import { javascript } from "@codemirror/lang-javascript";
95
90
  import { defaultHighlightStyle } from "@codemirror/language";
91
+ import { lintKeymap } from "@codemirror/lint";
96
92
  import { Prec } from "@codemirror/state";
97
93
  import { oneDarkHighlightStyle } from "@codemirror/theme-one-dark";
98
94
  import { keymap } from "@codemirror/view";
@@ -101,15 +97,18 @@ import { continueKeymap } from "@valtown/codemirror-continue";
101
97
  import { tsSync, tsFacet, tsLinter, tsAutocomplete, tsHover } from "@valtown/codemirror-ts";
102
98
  import React2 from "react";
103
99
  import { useThemeContext } from "@dxos/react-ui";
104
- import { autocomplete, createBasicExtensions, createThemeExtensions, editorMonospace, EditorView, folding, InputModeExtensions, useTextEditor } from "@dxos/react-ui-editor";
100
+ import { InputModeExtensions, autocomplete, createBasicExtensions, createThemeExtensions, folding, useTextEditor } from "@dxos/react-ui-editor";
101
+ import { mx } from "@dxos/react-ui-theme";
105
102
  import { isNonNullable } from "@dxos/util";
106
- var TypescriptEditor = ({ id, env, className, initialValue, extensions, scrollTo, selection, toolbar, inputMode = "vscode" }) => {
103
+ var TypescriptEditor = ({ classNames, id, inputMode = "vscode", toolbar, env, initialValue, extensions, scrollTo, selection }) => {
107
104
  var _effect = _useSignals2();
108
105
  try {
109
106
  const { themeMode } = useThemeContext();
110
107
  const { parentRef, focusAttributes } = useTextEditor(() => ({
111
108
  id,
112
109
  initialValue,
110
+ selection,
111
+ scrollTo,
113
112
  extensions: [
114
113
  extensions,
115
114
  createBasicExtensions({
@@ -117,49 +116,40 @@ var TypescriptEditor = ({ id, env, className, initialValue, extensions, scrollTo
117
116
  indentWithTab: true,
118
117
  lineNumbers: true,
119
118
  lineWrapping: false,
119
+ monospace: true,
120
120
  scrollPastEnd: true
121
121
  }),
122
122
  createThemeExtensions({
123
123
  themeMode,
124
124
  syntaxHighlighting: true
125
125
  }),
126
- // NOTE: Not using default editor gutter because folding for code works best right beside text.
127
- EditorView.theme({
128
- ".cm-gutters": {
129
- background: "var(--dx-baseSurface)"
130
- }
131
- }),
132
126
  InputModeExtensions[inputMode],
133
127
  folding(),
134
- // Continues block comments when you hit Enter.
128
+ // Continues block comments when pressing Enter.
135
129
  Prec.high(keymap.of(continueKeymap)),
136
130
  // TODO(burdon): Factor out.
137
- [
138
- editorMonospace,
139
- javascript({
140
- typescript: true
141
- }),
142
- // https://github.com/val-town/codemirror-ts
143
- autocomplete({
144
- override: env ? [
145
- tsAutocomplete()
146
- ] : []
131
+ javascript({
132
+ typescript: true
133
+ }),
134
+ // https://github.com/val-town/codemirror-ts
135
+ autocomplete({
136
+ override: env ? [
137
+ tsAutocomplete()
138
+ ] : void 0
139
+ }),
140
+ keymap.of(lintKeymap),
141
+ env && [
142
+ tsFacet.of({
143
+ env,
144
+ path: `/src/${id}.ts`
147
145
  }),
148
- env ? [
149
- tsFacet.of({
150
- env,
151
- path: `/src/${id}.ts`
152
- }),
153
- tsSync(),
154
- tsLinter(),
155
- tsHover({
156
- renderTooltip: createTooltipRenderer(themeMode)
157
- })
158
- ] : []
146
+ tsSync(),
147
+ tsLinter(),
148
+ tsHover({
149
+ renderTooltip: createTooltipRenderer(themeMode)
150
+ })
159
151
  ]
160
- ].filter(isNonNullable),
161
- selection,
162
- scrollTo
152
+ ].filter(isNonNullable)
163
153
  }), [
164
154
  id,
165
155
  extensions,
@@ -171,7 +161,7 @@ var TypescriptEditor = ({ id, env, className, initialValue, extensions, scrollTo
171
161
  return /* @__PURE__ */ React2.createElement("div", {
172
162
  ref: parentRef,
173
163
  "data-toolbar": toolbar ? "enabled" : "disabled",
174
- className,
164
+ className: mx(classNames),
175
165
  ...focusAttributes
176
166
  });
177
167
  } finally {
@@ -211,7 +201,7 @@ var createTooltipRenderer = (themeMode) => {
211
201
  };
212
202
 
213
203
  // packages/plugins/plugin-script/src/components/ScriptContainer.tsx
214
- var ScriptContainer = ({ classNames, role, script, settings = {
204
+ var ScriptContainer = ({ role, script, settings = {
215
205
  editorInputMode: "vscode"
216
206
  }, env }) => {
217
207
  var _effect = _useSignals3();
@@ -223,23 +213,23 @@ var ScriptContainer = ({ classNames, role, script, settings = {
223
213
  state,
224
214
  script
225
215
  });
226
- const extensions = useMemo2(() => [
216
+ const extensions = useMemo2(() => script.source.target ? [
227
217
  listener({
228
218
  onChange: (text) => {
229
- if (script.source.target && script.source.target.content !== text) {
219
+ if (script.source.target?.content !== text) {
230
220
  script.changed = true;
231
221
  }
232
222
  }
233
223
  }),
234
224
  createDataExtensions({
235
225
  id: script.id,
236
- text: script.source.target && createDocAccessor(script.source.target, [
226
+ text: createDocAccessor(script.source.target, [
237
227
  "content"
238
228
  ]),
239
229
  space,
240
230
  identity
241
231
  })
242
- ], [
232
+ ] : [], [
243
233
  identity,
244
234
  space,
245
235
  script,
@@ -256,7 +246,7 @@ var ScriptContainer = ({ classNames, role, script, settings = {
256
246
  env,
257
247
  initialValue: script.source?.target?.content,
258
248
  extensions,
259
- className: mx(stackItemContentEditorClassNames(role)),
249
+ classNames: stackItemContentEditorClassNames(role),
260
250
  inputMode: settings.editorInputMode,
261
251
  toolbar: true
262
252
  }));
@@ -269,4 +259,4 @@ export {
269
259
  ScriptContainer,
270
260
  ScriptContainer_default as default
271
261
  };
272
- //# sourceMappingURL=ScriptContainer-PMRP7AJ5.mjs.map
262
+ //# sourceMappingURL=ScriptContainer-4IOOIPBF.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/ScriptContainer.tsx", "../../../src/components/ScriptToolbar/ScriptToolbar.tsx", "../../../src/components/TypescriptEditor/TypescriptEditor.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useMemo } from 'react';\n\nimport { type ScriptType } from '@dxos/functions';\nimport { createDocAccessor, getSpace } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { createDataExtensions, listener, stackItemContentEditorClassNames } from '@dxos/react-ui-editor';\nimport { StackItem, type StackItemContentProps } from '@dxos/react-ui-stack';\n\nimport { ScriptToolbar } from './ScriptToolbar';\nimport { TypescriptEditor, type TypescriptEditorProps } from './TypescriptEditor';\nimport { useDeployState, useToolbarState } from '../hooks';\nimport { type ScriptSettingsProps } from '../types';\n\nexport type ScriptEditorProps = Pick<StackItemContentProps, 'role'> & {\n script: ScriptType;\n settings?: ScriptSettingsProps;\n} & Pick<TypescriptEditorProps, 'env'>;\n\nexport const ScriptContainer = ({ role, script, settings = { editorInputMode: 'vscode' }, env }: ScriptEditorProps) => {\n const identity = useIdentity();\n const space = getSpace(script);\n const state = useToolbarState();\n useDeployState({ state, script });\n\n const extensions = useMemo(\n () =>\n script.source.target\n ? [\n listener({\n onChange: (text) => {\n if (script.source.target?.content !== text) {\n script.changed = true;\n }\n },\n }),\n createDataExtensions({\n id: script.id,\n text: createDocAccessor(script.source.target, ['content']),\n space,\n identity,\n }),\n ]\n : [],\n [identity, space, script, script.source.target],\n );\n\n return (\n <StackItem.Content toolbar>\n <ScriptToolbar state={state} role={role} script={script} />\n <TypescriptEditor\n id={script.id}\n env={env}\n initialValue={script.source?.target?.content}\n extensions={extensions}\n classNames={stackItemContentEditorClassNames(role)}\n inputMode={settings.editorInputMode}\n toolbar\n />\n </StackItem.Content>\n );\n};\n\nexport default ScriptContainer;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Rx } from '@effect-rx/rx-react';\nimport React, { useMemo } from 'react';\n\nimport { type ScriptType } from '@dxos/functions';\nimport { fullyQualifiedId } from '@dxos/react-client/echo';\nimport { ElevationProvider, useTranslation, type ThemedClassName } from '@dxos/react-ui';\nimport { createGapSeparator, MenuProvider, rxFromSignal, ToolbarMenu, useMenuActions } from '@dxos/react-ui-menu';\n\nimport {\n type CreateDeployOptions,\n type ScriptToolbarState,\n createDeploy,\n createFormat,\n createTemplateSelect,\n useDeployDeps,\n} from '../../hooks';\nimport { SCRIPT_PLUGIN } from '../../meta';\n\nconst createToolbar = ({ state, script, ...options }: CreateDeployOptions) =>\n Rx.make((get) =>\n get(\n rxFromSignal(() => {\n const templateSelect = createTemplateSelect(script);\n const format = createFormat(script);\n const gap = createGapSeparator();\n const deploy = createDeploy({ state, script, ...options });\n return {\n nodes: [...templateSelect.nodes, ...format.nodes, ...gap.nodes, ...deploy.nodes],\n edges: [...templateSelect.edges, ...format.edges, ...gap.edges, ...deploy.edges],\n };\n }),\n ),\n );\n\nexport type ScriptToolbarProps = ThemedClassName<{\n role?: string;\n script: ScriptType;\n state: ScriptToolbarState;\n}>;\n\nexport const ScriptToolbar = ({ script, role, state, classNames }: ScriptToolbarProps) => {\n const { t } = useTranslation(SCRIPT_PLUGIN);\n const options = useDeployDeps({ script });\n const toolbarCreator = useMemo(() => createToolbar({ state, script, t, ...options }), [state, script, options, t]);\n const menu = useMenuActions(toolbarCreator);\n\n return (\n <ElevationProvider elevation={role === 'section' ? 'positioned' : 'base'}>\n <MenuProvider {...menu} attendableId={fullyQualifiedId(script)}>\n <ToolbarMenu classNames={classNames} />\n </MenuProvider>\n </ElevationProvider>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { javascript } from '@codemirror/lang-javascript';\nimport { defaultHighlightStyle } from '@codemirror/language';\nimport { lintKeymap } from '@codemirror/lint';\nimport { Prec } from '@codemirror/state';\nimport { oneDarkHighlightStyle } from '@codemirror/theme-one-dark';\nimport { keymap } from '@codemirror/view';\nimport { tags } from '@lezer/highlight';\nimport { type VirtualTypeScriptEnvironment } from '@typescript/vfs';\nimport { continueKeymap } from '@valtown/codemirror-continue';\nimport { tsSync, tsFacet, tsLinter, tsAutocomplete, tsHover, type HoverInfo } from '@valtown/codemirror-ts';\nimport React from 'react';\n\nimport { type ThemedClassName, type ThemeMode, useThemeContext } from '@dxos/react-ui';\nimport {\n type EditorInputMode,\n InputModeExtensions,\n type UseTextEditorProps,\n autocomplete,\n createBasicExtensions,\n createThemeExtensions,\n folding,\n useTextEditor,\n} from '@dxos/react-ui-editor';\nimport { mx } from '@dxos/react-ui-theme';\nimport { isNonNullable } from '@dxos/util';\n\nexport type TypescriptEditorProps = ThemedClassName<\n {\n id: string;\n inputMode?: EditorInputMode;\n toolbar?: boolean;\n env?: VirtualTypeScriptEnvironment;\n } & Pick<UseTextEditorProps, 'initialValue' | 'extensions' | 'scrollTo' | 'selection'>\n>;\n\nexport const TypescriptEditor = ({\n classNames,\n id,\n inputMode = 'vscode',\n toolbar,\n env,\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 selection,\n scrollTo,\n extensions: [\n extensions,\n createBasicExtensions({\n highlightActiveLine: true,\n indentWithTab: true,\n lineNumbers: true,\n lineWrapping: false,\n monospace: true,\n scrollPastEnd: true,\n }),\n createThemeExtensions({ themeMode, syntaxHighlighting: true }),\n InputModeExtensions[inputMode],\n folding(),\n // Continues block comments when pressing Enter.\n Prec.high(keymap.of(continueKeymap)),\n\n // TODO(burdon): Factor out.\n javascript({ typescript: true }),\n // https://github.com/val-town/codemirror-ts\n autocomplete({ override: env ? [tsAutocomplete()] : undefined }),\n keymap.of(lintKeymap),\n env && [\n tsFacet.of({ env, path: `/src/${id}.ts` }),\n tsSync(),\n tsLinter(),\n tsHover({ renderTooltip: createTooltipRenderer(themeMode) }),\n ],\n ].filter(isNonNullable),\n }),\n [id, extensions, themeMode, inputMode, selection, scrollTo],\n );\n\n return (\n <div\n ref={parentRef}\n data-toolbar={toolbar ? 'enabled' : 'disabled'}\n className={mx(classNames)}\n {...focusAttributes}\n />\n );\n};\n\nconst createTooltipRenderer = (themeMode: ThemeMode) => {\n const theme = themeMode === 'dark' ? oneDarkHighlightStyle : defaultHighlightStyle;\n\n const classFromKind = (_kind: string) => {\n // E.g., localName, methodName, parameterName, etc.\n const kind = _kind.endsWith('Name') ? 'name' : _kind;\n const validTag = kind in tags;\n if (!validTag) {\n return '';\n }\n\n const tag = tags[kind as keyof typeof tags];\n if (typeof tag === 'function') {\n return '';\n }\n\n return theme.style([tag]) ?? '';\n };\n\n return (info: HoverInfo) => {\n const div = document.createElement('div');\n div.className = 'p-1 rounded border border-separator bg-baseSurface xs:max-w-80 max-w-lg';\n\n if (info.quickInfo?.displayParts) {\n for (const part of info.quickInfo.displayParts) {\n const span = div.appendChild(document.createElement('span'));\n span.className = classFromKind(part.kind);\n span.innerText = part.text;\n }\n }\n\n return { dom: div };\n };\n};\n\nexport default TypescriptEditor;\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "useMemo", "createDocAccessor", "getSpace", "useIdentity", "createDataExtensions", "listener", "stackItemContentEditorClassNames", "StackItem", "Rx", "React", "useMemo", "fullyQualifiedId", "ElevationProvider", "useTranslation", "createGapSeparator", "MenuProvider", "rxFromSignal", "ToolbarMenu", "useMenuActions", "createToolbar", "state", "script", "options", "Rx", "make", "get", "rxFromSignal", "templateSelect", "createTemplateSelect", "format", "createFormat", "gap", "createGapSeparator", "deploy", "createDeploy", "nodes", "edges", "ScriptToolbar", "role", "classNames", "t", "useTranslation", "SCRIPT_PLUGIN", "useDeployDeps", "toolbarCreator", "useMemo", "menu", "useMenuActions", "ElevationProvider", "elevation", "MenuProvider", "attendableId", "fullyQualifiedId", "ToolbarMenu", "javascript", "defaultHighlightStyle", "lintKeymap", "Prec", "oneDarkHighlightStyle", "keymap", "tags", "continueKeymap", "tsSync", "tsFacet", "tsLinter", "tsAutocomplete", "tsHover", "React", "useThemeContext", "InputModeExtensions", "autocomplete", "createBasicExtensions", "createThemeExtensions", "folding", "useTextEditor", "mx", "isNonNullable", "TypescriptEditor", "classNames", "id", "inputMode", "toolbar", "env", "initialValue", "extensions", "scrollTo", "selection", "themeMode", "useThemeContext", "parentRef", "focusAttributes", "useTextEditor", "createBasicExtensions", "highlightActiveLine", "indentWithTab", "lineNumbers", "lineWrapping", "monospace", "scrollPastEnd", "createThemeExtensions", "syntaxHighlighting", "InputModeExtensions", "folding", "Prec", "high", "keymap", "of", "continueKeymap", "javascript", "typescript", "autocomplete", "override", "tsAutocomplete", "undefined", "lintKeymap", "tsFacet", "path", "tsSync", "tsLinter", "tsHover", "renderTooltip", "createTooltipRenderer", "filter", "isNonNullable", "React", "div", "ref", "data-toolbar", "className", "mx", "theme", "oneDarkHighlightStyle", "defaultHighlightStyle", "classFromKind", "_kind", "kind", "endsWith", "validTag", "tags", "tag", "style", "info", "document", "createElement", "quickInfo", "displayParts", "part", "span", "appendChild", "innerText", "text", "dom", "ScriptContainer", "role", "script", "settings", "editorInputMode", "env", "identity", "useIdentity", "space", "getSpace", "state", "useToolbarState", "useDeployState", "extensions", "useMemo", "source", "target", "listener", "onChange", "text", "content", "changed", "createDataExtensions", "id", "createDocAccessor", "React", "StackItem", "Content", "toolbar", "ScriptToolbar", "TypescriptEditor", "initialValue", "classNames", "stackItemContentEditorClassNames", "inputMode"]
7
+ }
@@ -7,14 +7,14 @@ import {
7
7
  import { Rx } from "@effect-rx/rx-react";
8
8
  import { Option, pipe } from "effect";
9
9
  import { Capabilities, contributes } from "@dxos/app-framework";
10
- import { isInstanceOf } from "@dxos/echo-schema";
10
+ import { Obj } from "@dxos/echo";
11
11
  import { ScriptType } from "@dxos/functions";
12
12
  import { PLANK_COMPANION_TYPE, ATTENDABLE_PATH_SEPARATOR } from "@dxos/plugin-deck/types";
13
13
  import { createExtension } from "@dxos/plugin-graph";
14
14
  var app_graph_builder_default = (context) => contributes(Capabilities.AppGraphBuilder, [
15
15
  createExtension({
16
16
  id: `${meta.id}/execute`,
17
- connector: (node) => Rx.make((get) => pipe(get(node), Option.flatMap((node2) => isInstanceOf(ScriptType, node2.data) ? Option.some(node2) : Option.none()), Option.map((node2) => [
17
+ connector: (node) => Rx.make((get) => pipe(get(node), Option.flatMap((node2) => Obj.instanceOf(ScriptType, node2.data) ? Option.some(node2) : Option.none()), Option.map((node2) => [
18
18
  {
19
19
  id: [
20
20
  node2.id,
@@ -37,7 +37,7 @@ var app_graph_builder_default = (context) => contributes(Capabilities.AppGraphBu
37
37
  }),
38
38
  createExtension({
39
39
  id: `${meta.id}/logs`,
40
- connector: (node) => Rx.make((get) => pipe(get(node), Option.flatMap((node2) => isInstanceOf(ScriptType, node2.data) ? Option.some(node2) : Option.none()), Option.map((node2) => [
40
+ connector: (node) => Rx.make((get) => pipe(get(node), Option.flatMap((node2) => Obj.instanceOf(ScriptType, node2.data) ? Option.some(node2) : Option.none()), Option.map((node2) => [
41
41
  {
42
42
  id: [
43
43
  node2.id,
@@ -62,4 +62,4 @@ var app_graph_builder_default = (context) => contributes(Capabilities.AppGraphBu
62
62
  export {
63
63
  app_graph_builder_default as default
64
64
  };
65
- //# sourceMappingURL=app-graph-builder-4CN7URJQ.mjs.map
65
+ //# sourceMappingURL=app-graph-builder-IOOUTHV2.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/app-graph-builder.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Rx } from '@effect-rx/rx-react';\nimport { Option, pipe } from 'effect';\n\nimport { Capabilities, contributes, type PluginContext } from '@dxos/app-framework';\nimport { Obj } from '@dxos/echo';\nimport { ScriptType } from '@dxos/functions';\nimport { PLANK_COMPANION_TYPE, ATTENDABLE_PATH_SEPARATOR } from '@dxos/plugin-deck/types';\nimport { createExtension } from '@dxos/plugin-graph';\n\nimport { meta } from '../meta';\n\nexport default (context: PluginContext) =>\n contributes(Capabilities.AppGraphBuilder, [\n createExtension({\n id: `${meta.id}/execute`,\n connector: (node) =>\n Rx.make((get) =>\n pipe(\n get(node),\n Option.flatMap((node) => (Obj.instanceOf(ScriptType, node.data) ? Option.some(node) : Option.none())),\n Option.map((node) => [\n {\n id: [node.id, 'execute'].join(ATTENDABLE_PATH_SEPARATOR),\n type: PLANK_COMPANION_TYPE,\n data: 'execute',\n properties: {\n label: ['script test label', { ns: meta.id }],\n icon: 'ph--terminal--regular',\n disposition: 'hidden',\n },\n },\n ]),\n Option.getOrElse(() => []),\n ),\n ),\n }),\n createExtension({\n id: `${meta.id}/logs`,\n connector: (node) =>\n Rx.make((get) =>\n pipe(\n get(node),\n Option.flatMap((node) => (Obj.instanceOf(ScriptType, node.data) ? Option.some(node) : Option.none())),\n Option.map((node) => [\n {\n id: [node.id, 'logs'].join(ATTENDABLE_PATH_SEPARATOR),\n type: PLANK_COMPANION_TYPE,\n data: 'logs',\n properties: {\n label: ['script logs label', { ns: meta.id }],\n icon: 'ph--clock-countdown--regular',\n disposition: 'hidden',\n },\n },\n ]),\n Option.getOrElse(() => []),\n ),\n ),\n }),\n ]);\n"],
5
+ "mappings": ";;;;;;AAIA,SAASA,UAAU;AACnB,SAASC,QAAQC,YAAY;AAE7B,SAASC,cAAcC,mBAAuC;AAC9D,SAASC,WAAW;AACpB,SAASC,kBAAkB;AAC3B,SAASC,sBAAsBC,iCAAiC;AAChE,SAASC,uBAAuB;AAIhC,IAAA,4BAAe,CAACC,YACdC,YAAYC,aAAaC,iBAAiB;EACxCC,gBAAgB;IACdC,IAAI,GAAGC,KAAKD,EAAE;IACdE,WAAW,CAACC,SACVC,GAAGC,KAAK,CAACC,QACPC,KACED,IAAIH,IAAAA,GACJK,OAAOC,QAAQ,CAACN,UAAUO,IAAIC,WAAWC,YAAYT,MAAKU,IAAI,IAAIL,OAAOM,KAAKX,KAAAA,IAAQK,OAAOO,KAAI,CAAA,GACjGP,OAAOQ,IAAI,CAACb,UAAS;MACnB;QACEH,IAAI;UAACG,MAAKH;UAAI;UAAWiB,KAAKC,yBAAAA;QAC9BC,MAAMC;QACNP,MAAM;QACNQ,YAAY;UACVC,OAAO;YAAC;YAAqB;cAAEC,IAAItB,KAAKD;YAAG;;UAC3CwB,MAAM;UACNC,aAAa;QACf;MACF;KACD,GACDjB,OAAOkB,UAAU,MAAM,CAAA,CAAE,CAAA,CAAA;EAGjC,CAAA;EACA3B,gBAAgB;IACdC,IAAI,GAAGC,KAAKD,EAAE;IACdE,WAAW,CAACC,SACVC,GAAGC,KAAK,CAACC,QACPC,KACED,IAAIH,IAAAA,GACJK,OAAOC,QAAQ,CAACN,UAAUO,IAAIC,WAAWC,YAAYT,MAAKU,IAAI,IAAIL,OAAOM,KAAKX,KAAAA,IAAQK,OAAOO,KAAI,CAAA,GACjGP,OAAOQ,IAAI,CAACb,UAAS;MACnB;QACEH,IAAI;UAACG,MAAKH;UAAI;UAAQiB,KAAKC,yBAAAA;QAC3BC,MAAMC;QACNP,MAAM;QACNQ,YAAY;UACVC,OAAO;YAAC;YAAqB;cAAEC,IAAItB,KAAKD;YAAG;;UAC3CwB,MAAM;UACNC,aAAa;QACf;MACF;KACD,GACDjB,OAAOkB,UAAU,MAAM,CAAA,CAAE,CAAA,CAAA;EAGjC,CAAA;CACD;",
6
+ "names": ["Rx", "Option", "pipe", "Capabilities", "contributes", "Obj", "ScriptType", "PLANK_COMPANION_TYPE", "ATTENDABLE_PATH_SEPARATOR", "createExtension", "context", "contributes", "Capabilities", "AppGraphBuilder", "createExtension", "id", "meta", "connector", "node", "Rx", "make", "get", "pipe", "Option", "flatMap", "Obj", "instanceOf", "ScriptType", "data", "some", "none", "map", "join", "ATTENDABLE_PATH_SEPARATOR", "type", "PLANK_COMPANION_TYPE", "properties", "label", "ns", "icon", "disposition", "getOrElse"]
7
+ }
@@ -9,10 +9,10 @@ import { createTool, ToolResult } from "@dxos/ai";
9
9
  import { Capabilities, contributes, createIntent } from "@dxos/app-framework";
10
10
  import { ArtifactId, defineArtifact } from "@dxos/artifact";
11
11
  import { createArtifactElement } from "@dxos/assistant";
12
+ import { Filter, Obj, Ref } from "@dxos/echo";
12
13
  import { ScriptType } from "@dxos/functions";
13
14
  import { invariant } from "@dxos/invariant";
14
15
  import { SpaceAction } from "@dxos/plugin-space/types";
15
- import { Filter, live, makeRef } from "@dxos/react-client/echo";
16
16
  import { DataType } from "@dxos/schema";
17
17
  var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/plugin-script/src/capabilities/artifact-definition.ts";
18
18
  var artifact_definition_default = () => {
@@ -148,7 +148,7 @@ var artifact_definition_default = () => {
148
148
  execute: async ({ name, code }, { extensions }) => {
149
149
  invariant(extensions?.space, "No space", {
150
150
  F: __dxlog_file,
151
- L: 155,
151
+ L: 156,
152
152
  S: void 0,
153
153
  A: [
154
154
  "extensions?.space",
@@ -157,16 +157,16 @@ var artifact_definition_default = () => {
157
157
  });
158
158
  invariant(extensions?.dispatch, "No intent dispatcher", {
159
159
  F: __dxlog_file,
160
- L: 156,
160
+ L: 157,
161
161
  S: void 0,
162
162
  A: [
163
163
  "extensions?.dispatch",
164
164
  "'No intent dispatcher'"
165
165
  ]
166
166
  });
167
- const script = live(ScriptType, {
167
+ const script = Obj.make(ScriptType, {
168
168
  name,
169
- source: makeRef(live(DataType.Text, {
169
+ source: Ref.make(Obj.make(DataType.Text, {
170
170
  content: code
171
171
  }))
172
172
  });
@@ -193,7 +193,7 @@ var artifact_definition_default = () => {
193
193
  execute: async ({ id }, { extensions }) => {
194
194
  invariant(extensions?.space, "No space", {
195
195
  F: __dxlog_file,
196
- L: 185,
196
+ L: 186,
197
197
  S: void 0,
198
198
  A: [
199
199
  "extensions?.space",
@@ -221,7 +221,7 @@ var artifact_definition_default = () => {
221
221
  execute: async ({ id, code }, { extensions }) => {
222
222
  invariant(extensions?.space, "No space", {
223
223
  F: __dxlog_file,
224
- L: 207,
224
+ L: 208,
225
225
  S: void 0,
226
226
  A: [
227
227
  "extensions?.space",
@@ -247,4 +247,4 @@ var artifact_definition_default = () => {
247
247
  export {
248
248
  artifact_definition_default as default
249
249
  };
250
- //# sourceMappingURL=artifact-definition-PPV2XKU7.mjs.map
250
+ //# sourceMappingURL=artifact-definition-4XRYAP54.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/artifact-definition.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Schema } from 'effect';\n\nimport { createTool, ToolResult } from '@dxos/ai';\nimport { Capabilities, contributes, createIntent, type PromiseIntentDispatcher } from '@dxos/app-framework';\nimport { ArtifactId, defineArtifact } from '@dxos/artifact';\nimport { createArtifactElement } from '@dxos/assistant';\nimport { Filter, Obj, Ref } from '@dxos/echo';\nimport { ScriptType } from '@dxos/functions';\nimport { invariant } from '@dxos/invariant';\nimport { SpaceAction } from '@dxos/plugin-space/types';\nimport { type Space } from '@dxos/react-client/echo';\nimport { DataType } from '@dxos/schema';\n\nimport { meta } from '../meta';\n// TODO(burdon): Factor out.\ndeclare global {\n interface ToolContextExtensions {\n space?: Space;\n dispatch?: PromiseIntentDispatcher;\n }\n}\n\nexport default () => {\n const definition = defineArtifact({\n id: `artifact:${meta.id}`,\n name: meta.name,\n // TODO(dmaretskyi): Since writing scripts requires a lot of domain knowledge,\n // we should offload the work of synthesizing the code to a separate model.\n // The main reasoning model will give it a concrete task and the script model will synthesize the code, knowing all the docs.\n instructions: `\n If the user explicitly requests you to write a script, you can create one.\n If the user requests you to change one of the existing script, you can update it.\n You must not create a script unless the user explicitly requests it.\n Scripts are short code pieces of executable code that can be used to perform computations, integrate with external systems, and perform automated tasks.\n Each script must follow as strict shape for the definition but the body can contain any valid executable code.\n Scripts are written in JavaScript or TypeScript.\n Each script must define an input schema and output schema.\n Each script must have its own detailed description.\n\n Important: You cannot execute scripts. Scripts are only available as tools after the user deploys them. You must only call the available tools.\n\n Description:\n The description is a detailed description of the script.\n It is used to describe the script's purpose, input, and output.\n The description is used to generate the script's documentation.\n The description is also goes into the script metadata.\n The description is used by AI to understand the script and its purpose.\n The description must provide cases on when the script should be used.\n\n Schema: \n The schema is defined using a schema-DSL library called Effect Schema.\n The input schema describes the arguments that the script accepts.\n The output schema describes the result that the script produces.\n The schema is used to validate the script's input and output.\n The schema is also goes into the script metadata.\n The properties in the schema must have valid descriptions.\n The input and output schemas must both be a struct of fields.\n\n Restricts:\n The scripts can only import code from \"dxos:functions\" module. No other modules are allowed.\n Some web APIs are available - like fetch.\n\n Reasoning:\n Before writing a script, synthesize the following information:\n - Description\n - What APIs will be used.\n - Detailed input schema\n - Detailed output schema\n\n <apis>\n export function defineFunction(params: { \n description: string, \n inputSchema: Schema.Schema, \n outputSchema: Schema.Schema, \n handler: (params: { event: { data: TInput } }) => Promise<TOutput> \n }): FunctionDefinition\n /**\n * Effect Schema\n */\n export const Schema; \n\n // Examples: \n\n Schema.String\n Schema.Number\n Schema.Boolean\n Schema.Struct({\n from: Schema.String.annotations({ description: 'The source currency' }),\n to: Schema.String.annotations({ description: 'The target currency' }),\n })\n Schema.Array(Schema.String)\n Schema.Union(Schema.String, Schema.Number)\n Schema.optional(Schema.String)\n Schema.String.annotations({ description: 'The source currency' })\n </apis>\n\n <handler_function>\n Async function that takes the argument in the form of:\n\n type HandlerFunctionParam = {\n event: {\n data: T // The input schema\n },\n }\n\n The function must return the result that matches the output schema.\n </handler_function>\n \n <example>\n import { defineFunction, S } from 'dxos:functions';\n\n export default defineFunction({\n description: 'Returns the exchange rate between two currencies.',\n\n inputSchema: Schema.Struct({\n from: Schema.String.annotations({ description: 'The source currency' }),\n to: Schema.String.annotations({ description: 'The target currency' }),\n }),\n\n outputSchema: Schema.Struct({\n rate: Schema.String.annotations({ description: 'The exchange rate' }),\n }),\n\n handler: async ({\n event: {\n data: { from, to },\n },\n }: any) => {\n const res = await fetch(\\`https://free.ratesdb.com/v1/rates?from=\\${from}&to=\\${to}\\`);\n const {\n data: { rates },\n } = await res.json();\n\n return { rate: rates[to].toString() };\n },\n });\n </example>\n `,\n schema: ScriptType,\n tools: [\n createTool(meta.id, {\n name: 'create',\n description: 'Create a new script. Returns the artifact definition for the script',\n caption: 'Creating script...',\n schema: Schema.Struct({\n name: Schema.String.annotations({ description: 'The name of the script' }),\n code: Schema.String.annotations({\n description: 'The full code of the script in JavaScript or TypeScript. Must be valid executable code.',\n }),\n }),\n execute: async ({ name, code }, { extensions }) => {\n invariant(extensions?.space, 'No space');\n invariant(extensions?.dispatch, 'No intent dispatcher');\n const script = Obj.make(ScriptType, {\n name,\n source: Ref.make(\n Obj.make(DataType.Text, {\n content: code,\n }),\n ),\n });\n extensions.space.db.add(script);\n await extensions.space.db.flush();\n\n const intent = createIntent(SpaceAction.AddObject, { target: extensions.space, object: script });\n const { data, error } = await extensions.dispatch(intent);\n if (!data || error) {\n return ToolResult.Error(error?.message ?? 'Failed to create chess game');\n }\n\n return ToolResult.Success(createArtifactElement(script.id));\n },\n }),\n createTool(meta.id, {\n name: 'inspect',\n description: 'Inspect a script. Returns the artifact definition for the script',\n caption: 'Inspecting script...',\n schema: Schema.Struct({\n id: ArtifactId,\n }),\n execute: async ({ id }, { extensions }) => {\n invariant(extensions?.space, 'No space');\n\n const script = (await extensions.space.db.query(Filter.ids(id)).first()) as ScriptType;\n const { content } = await script.source.load();\n\n return ToolResult.Success({\n name: script.name,\n code: content,\n });\n },\n }),\n createTool(meta.id, {\n name: 'update',\n description: 'Update a script. Returns the artifact definition for the script',\n caption: 'Updating script...',\n schema: Schema.Struct({\n id: ArtifactId,\n code: Schema.String.annotations({\n description: 'The full code of the script in JavaScript or TypeScript. Must be valid executable code.',\n }),\n }),\n execute: async ({ id, code }, { extensions }) => {\n invariant(extensions?.space, 'No space');\n\n const script = (await extensions.space.db.query(Filter.ids(id)).first()) as ScriptType;\n const source = await script.source.load();\n if (!source) {\n return ToolResult.Error('Script not found');\n }\n\n source.content = code;\n await extensions.space?.db.flush();\n\n return ToolResult.Success({\n name: script.name,\n });\n },\n }),\n ],\n });\n\n return contributes(Capabilities.ArtifactDefinition, definition);\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["Schema", "createTool", "ToolResult", "Capabilities", "contributes", "createIntent", "ArtifactId", "defineArtifact", "createArtifactElement", "Filter", "Obj", "Ref", "ScriptType", "invariant", "SpaceAction", "DataType", "definition", "defineArtifact", "id", "meta", "name", "instructions", "schema", "ScriptType", "tools", "createTool", "description", "caption", "Schema", "Struct", "String", "annotations", "code", "execute", "extensions", "invariant", "space", "dispatch", "script", "Obj", "make", "source", "Ref", "DataType", "Text", "content", "db", "add", "flush", "intent", "createIntent", "SpaceAction", "AddObject", "target", "object", "data", "error", "ToolResult", "Error", "message", "Success", "createArtifactElement", "ArtifactId", "query", "Filter", "ids", "first", "load", "contributes", "Capabilities", "ArtifactDefinition"]
7
+ }
@@ -2,7 +2,7 @@ import { createRequire } from 'node:module';const require = createRequire(import
2
2
  import {
3
3
  useDeployState,
4
4
  useToolbarState
5
- } from "./chunk-JFCZ3L27.mjs";
5
+ } from "./chunk-W2DAXWHA.mjs";
6
6
  import {
7
7
  SCRIPT_PLUGIN,
8
8
  meta
@@ -77,7 +77,7 @@ var Binding = ({ object }) => {
77
77
  }
78
78
  return /* @__PURE__ */ React.createElement("div", {
79
79
  role: "form",
80
- className: "flex flex-col p-2 gap-2"
80
+ className: "flex flex-col gap-2 mlb-cardSpacingBlock"
81
81
  }, /* @__PURE__ */ React.createElement("h2", null, t("remote function settings heading")), /* @__PURE__ */ React.createElement(Input.Root, null, /* @__PURE__ */ React.createElement("div", {
82
82
  role: "none",
83
83
  className: "flex flex-col gap-1"
@@ -192,7 +192,7 @@ var Publishing = ({ object }) => {
192
192
  githubToken
193
193
  ]);
194
194
  return /* @__PURE__ */ React.createElement("div", {
195
- className: "flex flex-col p-2 gap-4"
195
+ className: "flex flex-col gap-4 mlb-cardSpacingBlock"
196
196
  }, /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement("h2", null, t("script publish settings label")), /* @__PURE__ */ React.createElement("p", {
197
197
  className: "text-description text-sm"
198
198
  }, t("script publish settings description"))), !githubToken && /* @__PURE__ */ React.createElement("div", {
@@ -491,7 +491,7 @@ var MessageItem = ({ classNames, message }) => {
491
491
  var _effect = _useSignals3();
492
492
  try {
493
493
  const { type, text, data, error } = message;
494
- const wrapper = "p-1 px-2 rounded-lg bg-hoverSurface overflow-auto";
494
+ const wrapper = "p-1 px-2 rounded-md bg-hoverSurface overflow-auto";
495
495
  return /* @__PURE__ */ React3.createElement("div", {
496
496
  className: mx("flex", type === "request" ? "ml-[1rem] justify-end" : "mr-[1rem]", classNames)
497
497
  }, error && /* @__PURE__ */ React3.createElement("div", {
@@ -543,8 +543,8 @@ var TestContainer = ({ script, role }) => {
543
543
 
544
544
  // packages/plugins/plugin-script/src/components/index.ts
545
545
  import { lazy } from "react";
546
- var ScriptContainer = lazy(() => import("./ScriptContainer-PMRP7AJ5.mjs"));
547
- var DeploymentDialog = lazy(() => import("./DeploymentDialog-QHB2BGNJ.mjs"));
546
+ var ScriptContainer = lazy(() => import("./ScriptContainer-4IOOIPBF.mjs"));
547
+ var DeploymentDialog = lazy(() => import("./DeploymentDialog-IA4CH6WZ.mjs"));
548
548
 
549
549
  export {
550
550
  ScriptObjectSettings,
@@ -555,4 +555,4 @@ export {
555
555
  ScriptContainer,
556
556
  DeploymentDialog
557
557
  };
558
- //# sourceMappingURL=chunk-IIPL3OKN.mjs.map
558
+ //# sourceMappingURL=chunk-B4TP3LSZ.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/components/Settings/ScriptObjectSettings.tsx", "../../../src/components/Settings/ScriptPluginSettings.tsx", "../../../src/components/TestPanel/TestPanel.tsx", "../../../src/components/TestPanel/TestContainer.tsx", "../../../src/components/index.ts"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Octokit } from '@octokit/core';\nimport React, { type ChangeEvent, useCallback, useEffect, useState } from 'react';\n\nimport { createIntent, SettingsAction, useIntentDispatcher } from '@dxos/app-framework';\nimport { FunctionType, type ScriptType, getInvocationUrl, getUserFunctionUrlInMetadata } from '@dxos/functions';\nimport { log } from '@dxos/log';\nimport { useClient } from '@dxos/react-client';\nimport { Filter, getMeta, getSpace, Ref, useQuery } from '@dxos/react-client/echo';\nimport { Button, Clipboard, Input, useControlledState, useTranslation } from '@dxos/react-ui';\nimport { DataType } from '@dxos/schema';\n\nimport { SCRIPT_PLUGIN } from '../../meta';\n\nexport type ScriptObjectSettingsProps = {\n object: ScriptType;\n};\n\nexport const ScriptObjectSettings = ({ object }: ScriptObjectSettingsProps) => {\n return (\n <>\n <Binding object={object} />\n <Publishing object={object} />\n </>\n );\n};\n\nexport const ScriptProperties = ({ object }: ScriptObjectSettingsProps) => {\n const { t } = useTranslation(SCRIPT_PLUGIN);\n return (\n <Input.Root>\n <Input.Label>{t('description label')}</Input.Label>\n <Input.TextInput\n placeholder={t('description placeholder')}\n value={object.description ?? ''}\n onChange={(event) => {\n object.description = event.target.value;\n }}\n />\n </Input.Root>\n );\n};\n\nconst Binding = ({ object }: ScriptObjectSettingsProps) => {\n const { t } = useTranslation(SCRIPT_PLUGIN);\n const client = useClient();\n const space = getSpace(object);\n const [fn] = useQuery(space, Filter.type(FunctionType, { source: Ref.make(object) }));\n\n const functionPath = fn && getUserFunctionUrlInMetadata(getMeta(fn));\n const functionUrl =\n functionPath &&\n getInvocationUrl(functionPath, client.config.values.runtime?.services?.edge?.url ?? '', {\n spaceId: space?.id,\n });\n\n const [binding, setBinding] = useControlledState(fn?.binding ?? '');\n const handleBindingChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n setBinding(event.target.value);\n },\n [setBinding],\n );\n\n const handleBindingBlur = useCallback(() => {\n fn.binding = binding;\n }, [fn, binding]);\n\n if (!fn || !functionUrl) {\n return null;\n }\n\n // TODO(burdon): Use form.\n return (\n <div role='form' className='flex flex-col p-2 gap-2'>\n <h2>{t('remote function settings heading')}</h2>\n <Input.Root>\n <div role='none' className='flex flex-col gap-1'>\n <Input.Label>{t('function url label')}</Input.Label>\n <div role='none' className='flex gap-1'>\n <Input.TextInput\n disabled\n value={functionUrl}\n onChange={(event) => {\n fn.name = event.target.value;\n }}\n />\n <Clipboard.IconButton value={functionUrl} />\n </div>\n </div>\n </Input.Root>\n <Input.Root>\n <div role='none' className='flex flex-col gap-1'>\n <Input.Label>{t('function binding label')}</Input.Label>\n <Input.TextInput\n placeholder={t('function binding placeholder')}\n value={binding}\n onChange={handleBindingChange}\n onBlur={handleBindingBlur}\n />\n </div>\n </Input.Root>\n </div>\n );\n};\n\n// TODO(burdon): Move to separate tab?\nconst Publishing = ({ object }: ScriptObjectSettingsProps) => {\n const { t } = useTranslation(SCRIPT_PLUGIN);\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n const space = getSpace(object);\n const [githubToken] = useQuery(space, Filter.type(DataType.AccessToken, { source: 'github.com' }));\n const gistKey = getMeta(object).keys.find(({ source }) => source === 'github.com');\n const [gistUrl, setGistUrl] = useState<string | undefined>();\n\n useEffect(() => {\n const token = githubToken?.token;\n const gistId = gistKey?.id;\n if (!token || !gistId) {\n setGistUrl(undefined);\n return;\n }\n\n const timeout = setTimeout(async () => {\n try {\n const octokit = new Octokit({ auth: githubToken.token });\n const response = await octokit.request('GET /gists/{gist_id}', {\n gist_id: gistId,\n });\n setGistUrl(response.data.html_url);\n } catch (err) {\n log.catch(err);\n setGistUrl(undefined);\n }\n });\n\n return () => clearTimeout(timeout);\n }, [githubToken, gistKey]);\n\n const handleOpenTokenManager = useCallback(\n () => dispatch(createIntent(SettingsAction.Open, { plugin: 'dxos.org/plugin/token-manager' })),\n [],\n );\n\n const [publishing, setPublishing] = useState(false);\n const handlePublish = useCallback(async () => {\n setPublishing(true);\n const octokit = new Octokit({ auth: githubToken.token });\n const source = await object.source.load();\n const filename = object.name ? kebabize(object.name) : 'composer-script';\n const files = { [`${filename}.ts`]: { content: source.content } };\n\n try {\n // TODO(wittjosiah): Factor out to intent.\n const meta = getMeta(object);\n const githubKey = meta.keys.find(({ source }) => source === 'github.com');\n const gistId = githubKey?.id;\n if (gistId) {\n await octokit.request('PATCH /gists/{gist_id}', {\n gist_id: gistId,\n files,\n });\n } else {\n const response = await octokit.request('POST /gists', {\n public: true,\n files,\n });\n if (response.data.id) {\n meta.keys.push({ source: 'github.com', id: response.data.id });\n }\n }\n } finally {\n setPublishing(false);\n }\n }, [object, githubToken]);\n\n return (\n <div className='flex flex-col p-2 gap-4'>\n <div>\n <h2>{t('script publish settings label')}</h2>\n <p className='text-description text-sm'>{t('script publish settings description')}</p>\n </div>\n {!githubToken && (\n <div className='flex flex-col gap-2'>\n <span>{t('no github token label')}</span>\n <Button onClick={handleOpenTokenManager}>{t('open token manager label')}</Button>\n </div>\n )}\n {githubToken && (\n <div className='flex justify-end gap-2'>\n {gistUrl && <Clipboard.IconButton value={gistUrl} />}\n <Button disabled={publishing} onClick={handlePublish}>\n {t(publishing ? 'publishing label' : 'publish label')}\n </Button>\n </div>\n )}\n </div>\n );\n};\n\n// TODO(wittjosiah): Factor out.\n// From https://stackoverflow.com/a/67243723/2804332\nconst kebabize = (str: string) => str.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? '-' : '') + $.toLowerCase());\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type Credential } from '@dxos/protocols/proto/dxos/halo/credentials';\nimport { useClient } from '@dxos/react-client';\nimport { Button, Select, useTranslation } from '@dxos/react-ui';\nimport { type EditorInputMode, EditorInputModes } from '@dxos/react-ui-editor';\nimport { DeprecatedFormContainer, DeprecatedFormInput } from '@dxos/react-ui-form';\n\nimport { meta } from '../../meta';\nimport { type ScriptSettingsProps } from '../../types';\n\nexport const ScriptPluginSettings = ({ settings }: { settings: ScriptSettingsProps }) => {\n const { t } = useTranslation(meta.id);\n const client = useClient();\n\n // TODO(burdon): Check token.\n const handleAuthenticate = async () => {\n const { identityKey } = client.halo.identity.get()!;\n await client.halo.writeCredentials([\n {\n issuer: identityKey,\n issuanceDate: new Date(),\n subject: {\n id: identityKey,\n assertion: {\n '@type': 'dxos.halo.credentials.ServiceAccess',\n serverName: 'hub.dxos.network',\n serverKey: identityKey,\n identityKey,\n capabilities: ['composer:beta'],\n },\n },\n } satisfies Credential,\n ]);\n };\n\n return (\n <DeprecatedFormContainer>\n {/* TODO(wittjosiah): Hide outside of dev environments. */}\n <DeprecatedFormInput label={t('authenticate action label')}>\n <Button onClick={handleAuthenticate}>{t('authenticate button label')}</Button>\n </DeprecatedFormInput>\n\n <DeprecatedFormInput label={t('editor input mode label')}>\n <Select.Root\n value={settings.editorInputMode ?? 'default'}\n onValueChange={(value) => {\n settings.editorInputMode = value as EditorInputMode;\n }}\n >\n <Select.TriggerButton placeholder={t('select editor input mode placeholder')} />\n <Select.Portal>\n <Select.Content>\n <Select.Viewport>\n {EditorInputModes.map((mode) => (\n <Select.Option key={mode} value={mode}>\n {t(`settings editor input mode ${mode} label`)}\n </Select.Option>\n ))}\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n </DeprecatedFormInput>\n </DeprecatedFormContainer>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { forwardRef, useEffect, useRef, useState } from 'react';\n\nimport { log } from '@dxos/log';\nimport { Avatar, Icon, Input, type ThemedClassName, Toolbar, useTranslation } from '@dxos/react-ui';\nimport { SyntaxHighlighter } from '@dxos/react-ui-syntax-highlighter';\nimport { errorText, mx } from '@dxos/react-ui-theme';\n\nimport { SCRIPT_PLUGIN } from '../../meta';\n\ntype State = 'pending' | 'responding';\n\n/**\n * Request or response.\n */\ntype Message = { type: 'request' | 'response'; text?: string; data?: any; error?: Error };\n\nexport type TestPanelProps = ThemedClassName<{\n functionUrl?: string;\n}>;\n\n// TODO(burdon): Need persistent history (currently lost when switching tabs)..\nexport const TestPanel = ({ classNames, functionUrl }: TestPanelProps) => {\n const { t } = useTranslation(SCRIPT_PLUGIN);\n\n const inputRef = useRef<HTMLInputElement>(null);\n const [input, setInput] = useState('');\n const [result, setResult] = useState('');\n const [state, setState] = useState<State | null>(null);\n\n // TODO(burdon): Persistent history (thread).\n const [history, setHistory] = useState<Message[]>([]);\n\n const scrollerRef = useRef<HTMLDivElement>(null);\n const handleScroll = () => {\n if (scrollerRef.current) {\n scrollerRef.current.scrollTop = scrollerRef.current.scrollHeight;\n }\n };\n\n const controller = useRef<AbortController>();\n useEffect(() => {\n return () => {\n handleStop();\n };\n }, []);\n\n const handleStop = () => {\n controller.current?.abort('stop');\n controller.current = undefined;\n };\n\n const handleClear = () => {\n handleStop();\n setInput('');\n setResult('');\n setHistory([]);\n inputRef.current?.focus();\n };\n\n const handleResponse = ({ text, data, error }: { text?: string; data?: any; error?: Error } = {}) => {\n controller.current = undefined;\n setHistory((history) => [...history, { type: 'response', text, data, error } satisfies Message]);\n setResult('');\n setState(null);\n handleScroll();\n };\n\n const handleRequest = async (input: string) => {\n // Returns a promise that resolves when a value has been received.\n try {\n setState('pending');\n\n let data = null;\n // Detect JSON input.\n if (input.charAt(0) === '{') {\n try {\n const validJsonString = input.replace(/'/g, '\"').replace(/([{,]\\s*)([a-zA-Z0-9_]+)(\\s*:)/g, '$1\"$2\"$3');\n data = JSON.parse(validJsonString);\n input = JSON.stringify(data, null, 2);\n } catch (err) {\n inputRef.current?.focus();\n return;\n }\n }\n\n setInput('');\n setResult('');\n setHistory((history) => [...history, { type: 'request', text: input }]);\n setTimeout(() => {\n handleScroll();\n });\n\n // Throws DOMException when aborted.\n controller.current = new AbortController();\n const response = await fetch(functionUrl!, {\n signal: controller.current.signal,\n method: 'POST',\n body: input,\n headers: {\n 'Content-Type': data ? 'application/json' : 'text/plain',\n },\n });\n\n // Check for error.\n if (!response.ok) {\n const text = await response.text();\n handleResponse({ error: new Error(text || response.statusText || String(response.status)) });\n return;\n }\n\n // Check for JSON.\n const contentType = response.headers.get('content-type');\n if (contentType === 'application/json') {\n const data = await response.json();\n handleResponse({ data });\n return;\n }\n\n // Text (including streaming).\n setState('responding');\n let text = '';\n const reader = response.body!.getReader();\n const pump = async ({ done, value }: ReadableStreamReadResult<Uint8Array>): Promise<void> => {\n text = text + new TextDecoder().decode(value);\n if (!controller.current || done) {\n handleResponse({ text });\n return;\n }\n\n setResult(text);\n setTimeout(() => {\n handleScroll();\n });\n\n return reader.read().then(pump);\n };\n\n void reader\n .read()\n .then(pump)\n .catch((err) => {\n if (err.name !== 'AbortError') {\n log.catch(err);\n }\n });\n } catch (err: any) {\n if (err !== 'stop') {\n const error = err instanceof Error ? err : new Error(err);\n handleResponse({ error });\n log.catch(err);\n } else {\n handleResponse();\n }\n }\n };\n\n return (\n <div className={mx('flex flex-col h-full overflow-hidden', classNames)}>\n {/* TODO(burdon): Replace with Thread. */}\n <MessageThread ref={scrollerRef} state={state} result={result} history={history} />\n {/* TODO(burdon): Replace with Form based on the function's input schema. */}\n <Toolbar.Root classNames='p-2'>\n <Input.Root>\n <Input.TextInput\n ref={inputRef}\n autoFocus\n placeholder={t('function request placeholder')}\n value={input}\n onChange={(ev) => setInput(ev.target.value)}\n onKeyDown={(ev) => ev.key === 'Enter' && handleRequest(input)}\n />\n </Input.Root>\n <Toolbar.Button onClick={() => handleRequest(input)}>\n <Icon icon='ph--play--regular' size={4} />\n </Toolbar.Button>\n <Toolbar.Button onClick={() => (state ? handleStop() : handleClear())}>\n <Icon icon={state ? 'ph--stop--regular' : 'ph--trash--regular'} size={4} />\n </Toolbar.Button>\n </Toolbar.Root>\n </div>\n );\n};\n\n// TODO(burdon): Replace with thread?\n// TODO(burdon): Button to edit/re-run question.\ntype MessageThreadProps = {\n state: State | null;\n history: Message[];\n result: string;\n};\n\nconst MessageThread = forwardRef<HTMLDivElement, MessageThreadProps>(\n ({ state, history, result }: MessageThreadProps, forwardedRef) => {\n return (\n <div ref={forwardedRef} className='flex flex-col gap-6 h-full p-2 overflow-x-hidden overflow-y-auto'>\n {history.map((message, i) => (\n <div key={i} className='grid grid-cols-[2rem_1fr_2rem]'>\n <div className='p-1'>{message.type === 'response' && <RobotAvatar />}</div>\n <div className='overflow-auto'>\n <MessageItem message={message} />\n </div>\n </div>\n ))}\n\n {result?.length > 0 && (\n <div className='grid grid-cols-[2rem_1fr_2rem]'>\n <div className='p-1'>\n {(state === 'pending' && <Icon icon='ph--spinner--regular' size={6} classNames='animate-spin' />) || (\n <Icon icon='ph--robot--regular' size={6} classNames='animate-[pulse_1s_ease-in-out_infinite]' />\n )}\n </div>\n <div className='overflow-auto'>\n <MessageItem message={{ type: 'response', text: result }} />\n </div>\n </div>\n )}\n </div>\n );\n },\n);\n\nconst MessageItem = ({ classNames, message }: ThemedClassName<{ message: Message }>) => {\n const { type, text, data, error } = message;\n const wrapper = 'p-1 px-2 rounded-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', errorText)}>{String(error)}</div>}\n\n {text !== undefined && (\n <div className={mx(wrapper, type === 'request' && 'bg-primary-400 dark:bg-primary-600')}>\n {text || '\\u00D8'}\n </div>\n )}\n\n {data && (\n <SyntaxHighlighter language='json' className={mx(wrapper, '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>\n <Avatar.Content size={6} variant='circle' icon='ph--robot--regular' />\n </Avatar.Root>\n);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type ScriptType } from '@dxos/functions';\nimport { StackItem } from '@dxos/react-ui-stack';\n\nimport { TestPanel } from './TestPanel';\nimport { useDeployState, useToolbarState } from '../../hooks';\n\nexport const TestContainer = ({ script, role }: { script: ScriptType; role: string }) => {\n const state = useToolbarState();\n useDeployState({ state, script });\n return (\n <StackItem.Content role={role}>\n <TestPanel functionUrl={state.functionUrl} />\n </StackItem.Content>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { lazy } from 'react';\n\nexport * from './Settings';\nexport * from './TestPanel';\nexport { DEPLOYMENT_DIALOG } from './DeploymentDialog';\n\nexport const ScriptContainer = lazy(() => import('./ScriptContainer'));\nexport const DeploymentDialog = lazy(() => import('./DeploymentDialog'));\n"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Octokit } from '@octokit/core';\nimport React, { type ChangeEvent, useCallback, useEffect, useState } from 'react';\n\nimport { createIntent, SettingsAction, useIntentDispatcher } from '@dxos/app-framework';\nimport { FunctionType, type ScriptType, getInvocationUrl, getUserFunctionUrlInMetadata } from '@dxos/functions';\nimport { log } from '@dxos/log';\nimport { useClient } from '@dxos/react-client';\nimport { Filter, getMeta, getSpace, Ref, useQuery } from '@dxos/react-client/echo';\nimport { Button, Clipboard, Input, useControlledState, useTranslation } from '@dxos/react-ui';\nimport { DataType } from '@dxos/schema';\n\nimport { SCRIPT_PLUGIN } from '../../meta';\n\nexport type ScriptObjectSettingsProps = {\n object: ScriptType;\n};\n\nexport const ScriptObjectSettings = ({ object }: ScriptObjectSettingsProps) => {\n return (\n <>\n <Binding object={object} />\n <Publishing object={object} />\n </>\n );\n};\n\nexport const ScriptProperties = ({ object }: ScriptObjectSettingsProps) => {\n const { t } = useTranslation(SCRIPT_PLUGIN);\n return (\n <Input.Root>\n <Input.Label>{t('description label')}</Input.Label>\n <Input.TextInput\n placeholder={t('description placeholder')}\n value={object.description ?? ''}\n onChange={(event) => {\n object.description = event.target.value;\n }}\n />\n </Input.Root>\n );\n};\n\nconst Binding = ({ object }: ScriptObjectSettingsProps) => {\n const { t } = useTranslation(SCRIPT_PLUGIN);\n const client = useClient();\n const space = getSpace(object);\n const [fn] = useQuery(space, Filter.type(FunctionType, { source: Ref.make(object) }));\n\n const functionPath = fn && getUserFunctionUrlInMetadata(getMeta(fn));\n const functionUrl =\n functionPath &&\n getInvocationUrl(functionPath, client.config.values.runtime?.services?.edge?.url ?? '', {\n spaceId: space?.id,\n });\n\n const [binding, setBinding] = useControlledState(fn?.binding ?? '');\n const handleBindingChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n setBinding(event.target.value);\n },\n [setBinding],\n );\n\n const handleBindingBlur = useCallback(() => {\n fn.binding = binding;\n }, [fn, binding]);\n\n if (!fn || !functionUrl) {\n return null;\n }\n\n // TODO(burdon): Use form.\n return (\n <div role='form' className='flex flex-col gap-2 mlb-cardSpacingBlock'>\n <h2>{t('remote function settings heading')}</h2>\n <Input.Root>\n <div role='none' className='flex flex-col gap-1'>\n <Input.Label>{t('function url label')}</Input.Label>\n <div role='none' className='flex gap-1'>\n <Input.TextInput\n disabled\n value={functionUrl}\n onChange={(event) => {\n fn.name = event.target.value;\n }}\n />\n <Clipboard.IconButton value={functionUrl} />\n </div>\n </div>\n </Input.Root>\n <Input.Root>\n <div role='none' className='flex flex-col gap-1'>\n <Input.Label>{t('function binding label')}</Input.Label>\n <Input.TextInput\n placeholder={t('function binding placeholder')}\n value={binding}\n onChange={handleBindingChange}\n onBlur={handleBindingBlur}\n />\n </div>\n </Input.Root>\n </div>\n );\n};\n\n// TODO(burdon): Move to separate tab?\nconst Publishing = ({ object }: ScriptObjectSettingsProps) => {\n const { t } = useTranslation(SCRIPT_PLUGIN);\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n const space = getSpace(object);\n const [githubToken] = useQuery(space, Filter.type(DataType.AccessToken, { source: 'github.com' }));\n const gistKey = getMeta(object).keys.find(({ source }) => source === 'github.com');\n const [gistUrl, setGistUrl] = useState<string | undefined>();\n\n useEffect(() => {\n const token = githubToken?.token;\n const gistId = gistKey?.id;\n if (!token || !gistId) {\n setGistUrl(undefined);\n return;\n }\n\n const timeout = setTimeout(async () => {\n try {\n const octokit = new Octokit({ auth: githubToken.token });\n const response = await octokit.request('GET /gists/{gist_id}', {\n gist_id: gistId,\n });\n setGistUrl(response.data.html_url);\n } catch (err) {\n log.catch(err);\n setGistUrl(undefined);\n }\n });\n\n return () => clearTimeout(timeout);\n }, [githubToken, gistKey]);\n\n const handleOpenTokenManager = useCallback(\n () => dispatch(createIntent(SettingsAction.Open, { plugin: 'dxos.org/plugin/token-manager' })),\n [],\n );\n\n const [publishing, setPublishing] = useState(false);\n const handlePublish = useCallback(async () => {\n setPublishing(true);\n const octokit = new Octokit({ auth: githubToken.token });\n const source = await object.source.load();\n const filename = object.name ? kebabize(object.name) : 'composer-script';\n const files = { [`${filename}.ts`]: { content: source.content } };\n\n try {\n // TODO(wittjosiah): Factor out to intent.\n const meta = getMeta(object);\n const githubKey = meta.keys.find(({ source }) => source === 'github.com');\n const gistId = githubKey?.id;\n if (gistId) {\n await octokit.request('PATCH /gists/{gist_id}', {\n gist_id: gistId,\n files,\n });\n } else {\n const response = await octokit.request('POST /gists', {\n public: true,\n files,\n });\n if (response.data.id) {\n meta.keys.push({ source: 'github.com', id: response.data.id });\n }\n }\n } finally {\n setPublishing(false);\n }\n }, [object, githubToken]);\n\n return (\n <div className='flex flex-col gap-4 mlb-cardSpacingBlock'>\n <div>\n <h2>{t('script publish settings label')}</h2>\n <p className='text-description text-sm'>{t('script publish settings description')}</p>\n </div>\n {!githubToken && (\n <div className='flex flex-col gap-2'>\n <span>{t('no github token label')}</span>\n <Button onClick={handleOpenTokenManager}>{t('open token manager label')}</Button>\n </div>\n )}\n {githubToken && (\n <div className='flex justify-end gap-2'>\n {gistUrl && <Clipboard.IconButton value={gistUrl} />}\n <Button disabled={publishing} onClick={handlePublish}>\n {t(publishing ? 'publishing label' : 'publish label')}\n </Button>\n </div>\n )}\n </div>\n );\n};\n\n// TODO(wittjosiah): Factor out.\n// From https://stackoverflow.com/a/67243723/2804332\nconst kebabize = (str: string) => str.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? '-' : '') + $.toLowerCase());\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type Credential } from '@dxos/protocols/proto/dxos/halo/credentials';\nimport { useClient } from '@dxos/react-client';\nimport { Button, Select, useTranslation } from '@dxos/react-ui';\nimport { type EditorInputMode, EditorInputModes } from '@dxos/react-ui-editor';\nimport { DeprecatedFormContainer, DeprecatedFormInput } from '@dxos/react-ui-form';\n\nimport { meta } from '../../meta';\nimport { type ScriptSettingsProps } from '../../types';\n\nexport const ScriptPluginSettings = ({ settings }: { settings: ScriptSettingsProps }) => {\n const { t } = useTranslation(meta.id);\n const client = useClient();\n\n // TODO(burdon): Check token.\n const handleAuthenticate = async () => {\n const { identityKey } = client.halo.identity.get()!;\n await client.halo.writeCredentials([\n {\n issuer: identityKey,\n issuanceDate: new Date(),\n subject: {\n id: identityKey,\n assertion: {\n '@type': 'dxos.halo.credentials.ServiceAccess',\n serverName: 'hub.dxos.network',\n serverKey: identityKey,\n identityKey,\n capabilities: ['composer:beta'],\n },\n },\n } satisfies Credential,\n ]);\n };\n\n return (\n <DeprecatedFormContainer>\n {/* TODO(wittjosiah): Hide outside of dev environments. */}\n <DeprecatedFormInput label={t('authenticate action label')}>\n <Button onClick={handleAuthenticate}>{t('authenticate button label')}</Button>\n </DeprecatedFormInput>\n\n <DeprecatedFormInput label={t('editor input mode label')}>\n <Select.Root\n value={settings.editorInputMode ?? 'default'}\n onValueChange={(value) => {\n settings.editorInputMode = value as EditorInputMode;\n }}\n >\n <Select.TriggerButton placeholder={t('select editor input mode placeholder')} />\n <Select.Portal>\n <Select.Content>\n <Select.Viewport>\n {EditorInputModes.map((mode) => (\n <Select.Option key={mode} value={mode}>\n {t(`settings editor input mode ${mode} label`)}\n </Select.Option>\n ))}\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n </DeprecatedFormInput>\n </DeprecatedFormContainer>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { forwardRef, useEffect, useRef, useState } from 'react';\n\nimport { log } from '@dxos/log';\nimport { Avatar, Icon, Input, type ThemedClassName, Toolbar, useTranslation } from '@dxos/react-ui';\nimport { SyntaxHighlighter } from '@dxos/react-ui-syntax-highlighter';\nimport { errorText, mx } from '@dxos/react-ui-theme';\n\nimport { SCRIPT_PLUGIN } from '../../meta';\n\ntype State = 'pending' | 'responding';\n\n/**\n * Request or response.\n */\ntype Message = { type: 'request' | 'response'; text?: string; data?: any; error?: Error };\n\nexport type TestPanelProps = ThemedClassName<{\n functionUrl?: string;\n}>;\n\n// TODO(burdon): Need persistent history (currently lost when switching tabs)..\nexport const TestPanel = ({ classNames, functionUrl }: TestPanelProps) => {\n const { t } = useTranslation(SCRIPT_PLUGIN);\n\n const inputRef = useRef<HTMLInputElement>(null);\n const [input, setInput] = useState('');\n const [result, setResult] = useState('');\n const [state, setState] = useState<State | null>(null);\n\n // TODO(burdon): Persistent history (thread).\n const [history, setHistory] = useState<Message[]>([]);\n\n const scrollerRef = useRef<HTMLDivElement>(null);\n const handleScroll = () => {\n if (scrollerRef.current) {\n scrollerRef.current.scrollTop = scrollerRef.current.scrollHeight;\n }\n };\n\n const controller = useRef<AbortController>();\n useEffect(() => {\n return () => {\n handleStop();\n };\n }, []);\n\n const handleStop = () => {\n controller.current?.abort('stop');\n controller.current = undefined;\n };\n\n const handleClear = () => {\n handleStop();\n setInput('');\n setResult('');\n setHistory([]);\n inputRef.current?.focus();\n };\n\n const handleResponse = ({ text, data, error }: { text?: string; data?: any; error?: Error } = {}) => {\n controller.current = undefined;\n setHistory((history) => [...history, { type: 'response', text, data, error } satisfies Message]);\n setResult('');\n setState(null);\n handleScroll();\n };\n\n const handleRequest = async (input: string) => {\n // Returns a promise that resolves when a value has been received.\n try {\n setState('pending');\n\n let data = null;\n // Detect JSON input.\n if (input.charAt(0) === '{') {\n try {\n const validJsonString = input.replace(/'/g, '\"').replace(/([{,]\\s*)([a-zA-Z0-9_]+)(\\s*:)/g, '$1\"$2\"$3');\n data = JSON.parse(validJsonString);\n input = JSON.stringify(data, null, 2);\n } catch (err) {\n inputRef.current?.focus();\n return;\n }\n }\n\n setInput('');\n setResult('');\n setHistory((history) => [...history, { type: 'request', text: input }]);\n setTimeout(() => {\n handleScroll();\n });\n\n // Throws DOMException when aborted.\n controller.current = new AbortController();\n const response = await fetch(functionUrl!, {\n signal: controller.current.signal,\n method: 'POST',\n body: input,\n headers: {\n 'Content-Type': data ? 'application/json' : 'text/plain',\n },\n });\n\n // Check for error.\n if (!response.ok) {\n const text = await response.text();\n handleResponse({ error: new Error(text || response.statusText || String(response.status)) });\n return;\n }\n\n // Check for JSON.\n const contentType = response.headers.get('content-type');\n if (contentType === 'application/json') {\n const data = await response.json();\n handleResponse({ data });\n return;\n }\n\n // Text (including streaming).\n setState('responding');\n let text = '';\n const reader = response.body!.getReader();\n const pump = async ({ done, value }: ReadableStreamReadResult<Uint8Array>): Promise<void> => {\n text = text + new TextDecoder().decode(value);\n if (!controller.current || done) {\n handleResponse({ text });\n return;\n }\n\n setResult(text);\n setTimeout(() => {\n handleScroll();\n });\n\n return reader.read().then(pump);\n };\n\n void reader\n .read()\n .then(pump)\n .catch((err) => {\n if (err.name !== 'AbortError') {\n log.catch(err);\n }\n });\n } catch (err: any) {\n if (err !== 'stop') {\n const error = err instanceof Error ? err : new Error(err);\n handleResponse({ error });\n log.catch(err);\n } else {\n handleResponse();\n }\n }\n };\n\n return (\n <div className={mx('flex flex-col h-full overflow-hidden', classNames)}>\n {/* TODO(burdon): Replace with Thread. */}\n <MessageThread ref={scrollerRef} state={state} result={result} history={history} />\n {/* TODO(burdon): Replace with Form based on the function's input schema. */}\n <Toolbar.Root classNames='p-2'>\n <Input.Root>\n <Input.TextInput\n ref={inputRef}\n autoFocus\n placeholder={t('function request placeholder')}\n value={input}\n onChange={(ev) => setInput(ev.target.value)}\n onKeyDown={(ev) => ev.key === 'Enter' && handleRequest(input)}\n />\n </Input.Root>\n <Toolbar.Button onClick={() => handleRequest(input)}>\n <Icon icon='ph--play--regular' size={4} />\n </Toolbar.Button>\n <Toolbar.Button onClick={() => (state ? handleStop() : handleClear())}>\n <Icon icon={state ? 'ph--stop--regular' : 'ph--trash--regular'} size={4} />\n </Toolbar.Button>\n </Toolbar.Root>\n </div>\n );\n};\n\n// TODO(burdon): Replace with thread?\n// TODO(burdon): Button to edit/re-run question.\ntype MessageThreadProps = {\n state: State | null;\n history: Message[];\n result: string;\n};\n\nconst MessageThread = forwardRef<HTMLDivElement, MessageThreadProps>(\n ({ state, history, result }: MessageThreadProps, forwardedRef) => {\n return (\n <div ref={forwardedRef} className='flex flex-col gap-6 h-full p-2 overflow-x-hidden overflow-y-auto'>\n {history.map((message, i) => (\n <div key={i} className='grid grid-cols-[2rem_1fr_2rem]'>\n <div className='p-1'>{message.type === 'response' && <RobotAvatar />}</div>\n <div className='overflow-auto'>\n <MessageItem message={message} />\n </div>\n </div>\n ))}\n\n {result?.length > 0 && (\n <div className='grid grid-cols-[2rem_1fr_2rem]'>\n <div className='p-1'>\n {(state === 'pending' && <Icon icon='ph--spinner--regular' size={6} classNames='animate-spin' />) || (\n <Icon icon='ph--robot--regular' size={6} classNames='animate-[pulse_1s_ease-in-out_infinite]' />\n )}\n </div>\n <div className='overflow-auto'>\n <MessageItem message={{ type: 'response', text: result }} />\n </div>\n </div>\n )}\n </div>\n );\n },\n);\n\nconst MessageItem = ({ classNames, message }: ThemedClassName<{ message: Message }>) => {\n const { type, text, data, error } = message;\n const wrapper = 'p-1 px-2 rounded-md bg-hoverSurface overflow-auto';\n return (\n <div className={mx('flex', type === 'request' ? 'ml-[1rem] justify-end' : 'mr-[1rem]', classNames)}>\n {error && <div className={mx(wrapper, 'whitespace-pre', errorText)}>{String(error)}</div>}\n\n {text !== undefined && (\n <div className={mx(wrapper, type === 'request' && 'bg-primary-400 dark:bg-primary-600')}>\n {text || '\\u00D8'}\n </div>\n )}\n\n {data && (\n <SyntaxHighlighter language='json' className={mx(wrapper, '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>\n <Avatar.Content size={6} variant='circle' icon='ph--robot--regular' />\n </Avatar.Root>\n);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type ScriptType } from '@dxos/functions';\nimport { StackItem } from '@dxos/react-ui-stack';\n\nimport { TestPanel } from './TestPanel';\nimport { useDeployState, useToolbarState } from '../../hooks';\n\nexport const TestContainer = ({ script, role }: { script: ScriptType; role: string }) => {\n const state = useToolbarState();\n useDeployState({ state, script });\n return (\n <StackItem.Content role={role}>\n <TestPanel functionUrl={state.functionUrl} />\n </StackItem.Content>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { lazy } from 'react';\n\nexport * from './Settings';\nexport * from './TestPanel';\nexport { DEPLOYMENT_DIALOG } from './DeploymentDialog';\n\nexport const ScriptContainer = lazy(() => import('./ScriptContainer'));\nexport const DeploymentDialog = lazy(() => import('./DeploymentDialog'));\n"],
5
5
  "mappings": "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",
6
6
  "names": ["Octokit", "React", "useCallback", "useEffect", "useState", "createIntent", "SettingsAction", "useIntentDispatcher", "FunctionType", "getInvocationUrl", "getUserFunctionUrlInMetadata", "log", "useClient", "Filter", "getMeta", "getSpace", "Ref", "useQuery", "Button", "Clipboard", "Input", "useControlledState", "useTranslation", "DataType", "ScriptObjectSettings", "object", "Binding", "Publishing", "ScriptProperties", "t", "useTranslation", "SCRIPT_PLUGIN", "Input", "Root", "Label", "TextInput", "placeholder", "value", "description", "onChange", "event", "target", "client", "useClient", "space", "getSpace", "fn", "useQuery", "Filter", "type", "FunctionType", "source", "Ref", "make", "functionPath", "getUserFunctionUrlInMetadata", "getMeta", "functionUrl", "getInvocationUrl", "config", "values", "runtime", "services", "edge", "url", "spaceId", "id", "binding", "setBinding", "useControlledState", "handleBindingChange", "useCallback", "handleBindingBlur", "div", "role", "className", "h2", "disabled", "name", "Clipboard", "IconButton", "onBlur", "dispatchPromise", "dispatch", "useIntentDispatcher", "githubToken", "DataType", "AccessToken", "gistKey", "keys", "find", "gistUrl", "setGistUrl", "useState", "useEffect", "token", "gistId", "undefined", "timeout", "setTimeout", "octokit", "Octokit", "auth", "response", "request", "gist_id", "data", "html_url", "err", "log", "catch", "clearTimeout", "handleOpenTokenManager", "createIntent", "SettingsAction", "Open", "plugin", "publishing", "setPublishing", "handlePublish", "load", "filename", "kebabize", "files", "content", "meta", "githubKey", "public", "push", "p", "span", "Button", "onClick", "str", "replace", "$", "ofs", "toLowerCase", "React", "useClient", "Button", "Select", "useTranslation", "EditorInputModes", "DeprecatedFormContainer", "DeprecatedFormInput", "ScriptPluginSettings", "settings", "t", "useTranslation", "meta", "id", "client", "useClient", "handleAuthenticate", "identityKey", "halo", "identity", "get", "writeCredentials", "issuer", "issuanceDate", "Date", "subject", "assertion", "serverName", "serverKey", "capabilities", "React", "DeprecatedFormContainer", "DeprecatedFormInput", "label", "Button", "onClick", "Select", "Root", "value", "editorInputMode", "onValueChange", "TriggerButton", "placeholder", "Portal", "Content", "Viewport", "EditorInputModes", "map", "mode", "Option", "key", "React", "forwardRef", "useEffect", "useRef", "useState", "log", "Avatar", "Icon", "Input", "Toolbar", "useTranslation", "SyntaxHighlighter", "errorText", "mx", "TestPanel", "classNames", "functionUrl", "t", "useTranslation", "SCRIPT_PLUGIN", "inputRef", "useRef", "input", "setInput", "useState", "result", "setResult", "state", "setState", "history", "setHistory", "scrollerRef", "handleScroll", "current", "scrollTop", "scrollHeight", "controller", "useEffect", "handleStop", "abort", "undefined", "handleClear", "focus", "handleResponse", "text", "data", "error", "type", "handleRequest", "charAt", "validJsonString", "replace", "JSON", "parse", "stringify", "err", "setTimeout", "AbortController", "response", "fetch", "signal", "method", "body", "headers", "ok", "Error", "statusText", "String", "status", "contentType", "get", "json", "reader", "getReader", "pump", "done", "value", "TextDecoder", "decode", "read", "then", "catch", "name", "log", "React", "div", "className", "mx", "MessageThread", "ref", "Toolbar", "Root", "Input", "TextInput", "autoFocus", "placeholder", "onChange", "ev", "target", "onKeyDown", "key", "Button", "onClick", "Icon", "icon", "size", "forwardRef", "forwardedRef", "map", "message", "i", "RobotAvatar", "MessageItem", "length", "wrapper", "errorText", "SyntaxHighlighter", "language", "Avatar", "Content", "variant", "React", "StackItem", "TestContainer", "script", "role", "state", "useToolbarState", "useDeployState", "React", "StackItem", "Content", "TestPanel", "functionUrl", "lazy", "ScriptContainer", "lazy", "DeploymentDialog"]
7
7
  }