@dxos/plugin-script 0.7.5-labs.a279d8c → 0.7.5-labs.e27f9b9

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 (85) hide show
  1. package/dist/lib/browser/{ScriptContainer-T2AOMDT3.mjs → ScriptContainer-EBER222J.mjs} +6 -5
  2. package/dist/lib/browser/ScriptContainer-EBER222J.mjs.map +7 -0
  3. package/dist/lib/browser/{chunk-SIOGRRPF.mjs → chunk-PEYUXEY6.mjs} +17 -5
  4. package/dist/lib/browser/chunk-PEYUXEY6.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-REL2R7SB.mjs → chunk-VIX22OMB.mjs} +11 -3
  6. package/dist/lib/browser/chunk-VIX22OMB.mjs.map +7 -0
  7. package/dist/lib/browser/index.mjs +9 -7
  8. package/dist/lib/browser/index.mjs.map +3 -3
  9. package/dist/lib/browser/intent-resolver-G2REMZHC.mjs +45 -0
  10. package/dist/lib/browser/intent-resolver-G2REMZHC.mjs.map +7 -0
  11. package/dist/lib/browser/meta.json +1 -1
  12. package/dist/lib/browser/{react-surface-GAWVYTJ5.mjs → react-surface-GH4LL6CF.mjs} +9 -11
  13. package/dist/lib/browser/react-surface-GH4LL6CF.mjs.map +7 -0
  14. package/dist/lib/node/{ScriptContainer-BV56I4OL.cjs → ScriptContainer-UXMQLKDV.cjs} +11 -10
  15. package/dist/lib/node/ScriptContainer-UXMQLKDV.cjs.map +7 -0
  16. package/dist/lib/node/{chunk-TJ4BTPOS.cjs → chunk-PKT5DD3O.cjs} +12 -6
  17. package/dist/lib/node/chunk-PKT5DD3O.cjs.map +7 -0
  18. package/dist/lib/node/{chunk-5V3XGLTR.cjs → chunk-UAHKFS7F.cjs} +19 -7
  19. package/dist/lib/node/chunk-UAHKFS7F.cjs.map +7 -0
  20. package/dist/lib/node/index.cjs +12 -10
  21. package/dist/lib/node/index.cjs.map +3 -3
  22. package/dist/lib/node/{intent-resolver-SUAPE7H3.cjs → intent-resolver-IWGK77AZ.cjs} +29 -26
  23. package/dist/lib/node/intent-resolver-IWGK77AZ.cjs.map +7 -0
  24. package/dist/lib/node/meta.json +1 -1
  25. package/dist/lib/node/{react-surface-OMBMSFZT.cjs → react-surface-3JKCVT5O.cjs} +15 -17
  26. package/dist/lib/node/react-surface-3JKCVT5O.cjs.map +7 -0
  27. package/dist/lib/node-esm/{ScriptContainer-3S5VHJVR.mjs → ScriptContainer-56ES2HQ5.mjs} +6 -5
  28. package/dist/lib/node-esm/ScriptContainer-56ES2HQ5.mjs.map +7 -0
  29. package/dist/lib/node-esm/{chunk-JJZYWSD7.mjs → chunk-NBAL5DXN.mjs} +11 -3
  30. package/dist/lib/node-esm/chunk-NBAL5DXN.mjs.map +7 -0
  31. package/dist/lib/node-esm/{chunk-XPIKUBGS.mjs → chunk-TYGM5YLW.mjs} +17 -5
  32. package/dist/lib/node-esm/chunk-TYGM5YLW.mjs.map +7 -0
  33. package/dist/lib/node-esm/index.mjs +9 -7
  34. package/dist/lib/node-esm/index.mjs.map +3 -3
  35. package/dist/lib/node-esm/intent-resolver-KGADFH3H.mjs +46 -0
  36. package/dist/lib/node-esm/intent-resolver-KGADFH3H.mjs.map +7 -0
  37. package/dist/lib/node-esm/meta.json +1 -1
  38. package/dist/lib/node-esm/{react-surface-J7NLV2V4.mjs → react-surface-JW776PVP.mjs} +9 -11
  39. package/dist/lib/node-esm/react-surface-JW776PVP.mjs.map +7 -0
  40. package/dist/types/src/ScriptPlugin.d.ts.map +1 -1
  41. package/dist/types/src/capabilities/index.d.ts +4 -4
  42. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  43. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  44. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  45. package/dist/types/src/components/ScriptSettingsPanel.d.ts.map +1 -1
  46. package/dist/types/src/components/ScriptToolbar/deploy.d.ts.map +1 -1
  47. package/dist/types/src/templates/echo.d.ts.map +1 -1
  48. package/dist/types/src/templates/forex-effect.d.ts +6 -0
  49. package/dist/types/src/templates/forex-effect.d.ts.map +1 -0
  50. package/dist/types/src/templates/forex.d.ts +1 -1
  51. package/dist/types/src/templates/forex.d.ts.map +1 -1
  52. package/dist/types/src/templates/index.d.ts.map +1 -1
  53. package/dist/types/src/translations.d.ts +6 -0
  54. package/dist/types/src/translations.d.ts.map +1 -1
  55. package/dist/types/tsconfig.tsbuildinfo +1 -1
  56. package/package.json +42 -41
  57. package/src/ScriptPlugin.tsx +4 -12
  58. package/src/capabilities/intent-resolver.ts +25 -22
  59. package/src/capabilities/react-surface.tsx +6 -7
  60. package/src/components/ScriptSettings/ScriptSettings.tsx +3 -3
  61. package/src/components/ScriptSettingsPanel.tsx +14 -0
  62. package/src/components/ScriptToolbar/deploy.ts +1 -0
  63. package/src/components/TypescriptEditor/TypescriptEditor.tsx +1 -1
  64. package/src/templates/echo.ts +5 -1
  65. package/src/templates/forex-effect.ts +42 -0
  66. package/src/templates/forex.ts +21 -13
  67. package/src/templates/index.ts +7 -0
  68. package/src/translations.ts +2 -0
  69. package/dist/lib/browser/ScriptContainer-T2AOMDT3.mjs.map +0 -7
  70. package/dist/lib/browser/chunk-REL2R7SB.mjs.map +0 -7
  71. package/dist/lib/browser/chunk-SIOGRRPF.mjs.map +0 -7
  72. package/dist/lib/browser/intent-resolver-YPHT6HDZ.mjs +0 -42
  73. package/dist/lib/browser/intent-resolver-YPHT6HDZ.mjs.map +0 -7
  74. package/dist/lib/browser/react-surface-GAWVYTJ5.mjs.map +0 -7
  75. package/dist/lib/node/ScriptContainer-BV56I4OL.cjs.map +0 -7
  76. package/dist/lib/node/chunk-5V3XGLTR.cjs.map +0 -7
  77. package/dist/lib/node/chunk-TJ4BTPOS.cjs.map +0 -7
  78. package/dist/lib/node/intent-resolver-SUAPE7H3.cjs.map +0 -7
  79. package/dist/lib/node/react-surface-OMBMSFZT.cjs.map +0 -7
  80. package/dist/lib/node-esm/ScriptContainer-3S5VHJVR.mjs.map +0 -7
  81. package/dist/lib/node-esm/chunk-JJZYWSD7.mjs.map +0 -7
  82. package/dist/lib/node-esm/chunk-XPIKUBGS.mjs.map +0 -7
  83. package/dist/lib/node-esm/intent-resolver-SZJXQ3CW.mjs +0 -43
  84. package/dist/lib/node-esm/intent-resolver-SZJXQ3CW.mjs.map +0 -7
  85. package/dist/lib/node-esm/react-surface-J7NLV2V4.mjs.map +0 -7
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/plugin-script",
3
- "version": "0.7.5-labs.a279d8c",
3
+ "version": "0.7.5-labs.e27f9b9",
4
4
  "description": "Braneframe notebook plugin",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -53,38 +53,39 @@
53
53
  "prettier": "^3.2.4",
54
54
  "react-syntax-highlighter": "^15.5.0",
55
55
  "typescript": "^5.7.2",
56
- "@dxos/app-framework": "0.7.5-labs.a279d8c",
57
- "@dxos/async": "0.7.5-labs.a279d8c",
58
- "@dxos/client": "0.7.5-labs.a279d8c",
59
- "@dxos/client-protocol": "0.7.5-labs.a279d8c",
60
- "@dxos/compute": "0.7.5-labs.a279d8c",
61
- "@dxos/debug": "0.7.5-labs.a279d8c",
62
- "@dxos/crypto": "0.7.5-labs.a279d8c",
63
- "@dxos/echo-schema": "0.7.5-labs.a279d8c",
64
- "@dxos/functions": "0.7.5-labs.a279d8c",
65
- "@dxos/invariant": "0.7.5-labs.a279d8c",
66
- "@dxos/live-object": "0.7.5-labs.a279d8c",
67
- "@dxos/keys": "0.7.5-labs.a279d8c",
68
- "@dxos/log": "0.7.5-labs.a279d8c",
69
- "@dxos/plugin-client": "0.7.5-labs.a279d8c",
70
- "@dxos/plugin-explorer": "0.7.5-labs.a279d8c",
71
- "@dxos/plugin-graph": "0.7.5-labs.a279d8c",
72
- "@dxos/plugin-markdown": "0.7.5-labs.a279d8c",
73
- "@dxos/plugin-stack": "0.7.5-labs.a279d8c",
74
- "@dxos/plugin-space": "0.7.5-labs.a279d8c",
75
- "@dxos/plugin-theme": "0.7.5-labs.a279d8c",
76
- "@dxos/react-client": "0.7.5-labs.a279d8c",
77
- "@dxos/react-ui-attention": "0.7.5-labs.a279d8c",
78
- "@dxos/react-ui-form": "0.7.5-labs.a279d8c",
79
- "@dxos/react-ui-editor": "0.7.5-labs.a279d8c",
80
- "@dxos/react-ui-menu": "0.7.5-labs.a279d8c",
81
- "@dxos/protocols": "0.7.5-labs.a279d8c",
82
- "@dxos/react-ui-stack": "0.7.5-labs.a279d8c",
83
- "@dxos/react-ui-syntax-highlighter": "0.7.5-labs.a279d8c",
84
- "@dxos/rpc": "0.7.5-labs.a279d8c",
85
- "@dxos/rpc-tunnel": "0.7.5-labs.a279d8c",
86
- "@dxos/schema": "0.7.5-labs.a279d8c",
87
- "@dxos/util": "0.7.5-labs.a279d8c"
56
+ "@dxos/async": "0.7.5-labs.e27f9b9",
57
+ "@dxos/client-protocol": "0.7.5-labs.e27f9b9",
58
+ "@dxos/client": "0.7.5-labs.e27f9b9",
59
+ "@dxos/compute": "0.7.5-labs.e27f9b9",
60
+ "@dxos/app-framework": "0.7.5-labs.e27f9b9",
61
+ "@dxos/debug": "0.7.5-labs.e27f9b9",
62
+ "@dxos/echo-schema": "0.7.5-labs.e27f9b9",
63
+ "@dxos/crypto": "0.7.5-labs.e27f9b9",
64
+ "@dxos/functions": "0.7.5-labs.e27f9b9",
65
+ "@dxos/invariant": "0.7.5-labs.e27f9b9",
66
+ "@dxos/keys": "0.7.5-labs.e27f9b9",
67
+ "@dxos/local-storage": "0.7.5-labs.e27f9b9",
68
+ "@dxos/live-object": "0.7.5-labs.e27f9b9",
69
+ "@dxos/log": "0.7.5-labs.e27f9b9",
70
+ "@dxos/plugin-explorer": "0.7.5-labs.e27f9b9",
71
+ "@dxos/plugin-client": "0.7.5-labs.e27f9b9",
72
+ "@dxos/plugin-markdown": "0.7.5-labs.e27f9b9",
73
+ "@dxos/plugin-graph": "0.7.5-labs.e27f9b9",
74
+ "@dxos/plugin-space": "0.7.5-labs.e27f9b9",
75
+ "@dxos/plugin-stack": "0.7.5-labs.e27f9b9",
76
+ "@dxos/plugin-theme": "0.7.5-labs.e27f9b9",
77
+ "@dxos/protocols": "0.7.5-labs.e27f9b9",
78
+ "@dxos/react-ui-attention": "0.7.5-labs.e27f9b9",
79
+ "@dxos/react-client": "0.7.5-labs.e27f9b9",
80
+ "@dxos/react-ui-editor": "0.7.5-labs.e27f9b9",
81
+ "@dxos/react-ui-form": "0.7.5-labs.e27f9b9",
82
+ "@dxos/react-ui-menu": "0.7.5-labs.e27f9b9",
83
+ "@dxos/rpc": "0.7.5-labs.e27f9b9",
84
+ "@dxos/react-ui-syntax-highlighter": "0.7.5-labs.e27f9b9",
85
+ "@dxos/react-ui-stack": "0.7.5-labs.e27f9b9",
86
+ "@dxos/rpc-tunnel": "0.7.5-labs.e27f9b9",
87
+ "@dxos/util": "0.7.5-labs.e27f9b9",
88
+ "@dxos/schema": "0.7.5-labs.e27f9b9"
88
89
  },
89
90
  "devDependencies": {
90
91
  "@phosphor-icons/react": "^2.1.5",
@@ -94,19 +95,19 @@
94
95
  "react": "~18.2.0",
95
96
  "react-dom": "~18.2.0",
96
97
  "vite": "5.4.7",
97
- "@dxos/react-ui": "0.7.5-labs.a279d8c",
98
- "@dxos/react-ui-mosaic": "0.7.5-labs.a279d8c",
99
- "@dxos/react-ui-theme": "0.7.5-labs.a279d8c",
100
- "@dxos/random": "0.7.5-labs.a279d8c",
101
- "@dxos/storybook-utils": "0.7.5-labs.a279d8c"
98
+ "@dxos/react-ui": "0.7.5-labs.e27f9b9",
99
+ "@dxos/random": "0.7.5-labs.e27f9b9",
100
+ "@dxos/react-ui-mosaic": "0.7.5-labs.e27f9b9",
101
+ "@dxos/react-ui-theme": "0.7.5-labs.e27f9b9",
102
+ "@dxos/storybook-utils": "0.7.5-labs.e27f9b9"
102
103
  },
103
104
  "peerDependencies": {
104
105
  "@phosphor-icons/react": "^2.1.5",
105
106
  "react": "~18.2.0",
106
107
  "react-dom": "~18.2.0",
107
- "@dxos/react-ui": "0.7.5-labs.a279d8c",
108
- "@dxos/react-ui-mosaic": "0.7.5-labs.a279d8c",
109
- "@dxos/react-ui-theme": "0.7.5-labs.a279d8c"
108
+ "@dxos/react-ui-mosaic": "0.7.5-labs.e27f9b9",
109
+ "@dxos/react-ui": "0.7.5-labs.e27f9b9",
110
+ "@dxos/react-ui-theme": "0.7.5-labs.e27f9b9"
110
111
  },
111
112
  "publishConfig": {
112
113
  "access": "public"
@@ -4,15 +4,7 @@
4
4
 
5
5
  // @ts-ignore
6
6
 
7
- import {
8
- Capabilities,
9
- contributes,
10
- createIntent,
11
- defineModule,
12
- definePlugin,
13
- Events,
14
- oneOf,
15
- } from '@dxos/app-framework';
7
+ import { Capabilities, contributes, createIntent, defineModule, definePlugin, Events } from '@dxos/app-framework';
16
8
  import { type Space } from '@dxos/client/echo';
17
9
  import { FunctionType, ScriptType } from '@dxos/functions';
18
10
  import { RefArray } from '@dxos/live-object';
@@ -42,7 +34,7 @@ export const ScriptPlugin = () =>
42
34
  }),
43
35
  defineModule({
44
36
  id: `${meta.id}/module/metadata`,
45
- activatesOn: oneOf(Events.Startup, Events.SetupAppGraph),
37
+ activatesOn: Events.SetupMetadata,
46
38
  activate: () =>
47
39
  contributes(Capabilities.Metadata, {
48
40
  id: ScriptType.typename,
@@ -59,7 +51,7 @@ export const ScriptPlugin = () =>
59
51
  }),
60
52
  defineModule({
61
53
  id: `${meta.id}/module/schema`,
62
- activatesOn: ClientEvents.SetupClient,
54
+ activatesOn: ClientEvents.SetupSchema,
63
55
  activate: () => [
64
56
  contributes(ClientCapabilities.SystemSchema, [FunctionType]),
65
57
  contributes(ClientCapabilities.Schema, [ScriptType]),
@@ -67,7 +59,7 @@ export const ScriptPlugin = () =>
67
59
  }),
68
60
  defineModule({
69
61
  id: `${meta.id}/module/react-surface`,
70
- activatesOn: Events.Startup,
62
+ activatesOn: Events.SetupSurfaces,
71
63
  activate: ReactSurface,
72
64
  }),
73
65
  defineModule({
@@ -15,29 +15,32 @@ import { ScriptAction } from '../types';
15
15
  export default () =>
16
16
  contributes(
17
17
  Capabilities.IntentResolver,
18
- createResolver(ScriptAction.Create, async ({ name, gistUrl, space }) => {
19
- let content = templates[0].source;
20
- const gistId = gistUrl?.split('/').at(-1);
21
- if (gistId) {
22
- // TODO(wittjosiah): Capability which contributes Octokit?
23
- // NOTE: AccessToken not needed to read public gists.
24
- const octokit = new Octokit();
25
- const response = await octokit.request('GET /gists/{gist_id}', {
26
- gist_id: gistId,
27
- });
28
- const gistContent = Object.values(response.data.files ?? {})[0]?.content;
29
- if (gistContent) {
30
- content = gistContent;
18
+ createResolver({
19
+ intent: ScriptAction.Create,
20
+ resolve: async ({ name, gistUrl }) => {
21
+ let content = templates[0].source;
22
+ const gistId = gistUrl?.split('/').at(-1);
23
+ if (gistId) {
24
+ // TODO(wittjosiah): Capability which contributes Octokit?
25
+ // NOTE: AccessToken not needed to read public gists.
26
+ const octokit = new Octokit();
27
+ const response = await octokit.request('GET /gists/{gist_id}', {
28
+ gist_id: gistId,
29
+ });
30
+ const gistContent = Object.values(response.data.files ?? {})[0]?.content;
31
+ if (gistContent) {
32
+ content = gistContent;
33
+ }
31
34
  }
32
- }
33
35
 
34
- return {
35
- data: {
36
- object: create(ScriptType, {
37
- name,
38
- source: makeRef(create(TextType, { content })),
39
- }),
40
- },
41
- };
36
+ return {
37
+ data: {
38
+ object: create(ScriptType, {
39
+ name,
40
+ source: makeRef(create(TextType, { content })),
41
+ }),
42
+ },
43
+ };
44
+ },
42
45
  }),
43
46
  );
@@ -6,6 +6,7 @@ import React from 'react';
6
6
 
7
7
  import { Capabilities, contributes, createSurface, useCapability } from '@dxos/app-framework';
8
8
  import { ScriptType } from '@dxos/functions';
9
+ import { SettingsStore } from '@dxos/local-storage';
9
10
  import { Clipboard } from '@dxos/react-ui';
10
11
 
11
12
  import { ScriptCapabilities } from './capabilities';
@@ -17,12 +18,10 @@ export default () =>
17
18
  contributes(Capabilities.ReactSurface, [
18
19
  createSurface({
19
20
  id: `${SCRIPT_PLUGIN}/settings`,
20
- role: 'settings',
21
- filter: (data): data is any => data.subject === SCRIPT_PLUGIN,
22
- component: () => {
23
- const settings = useCapability(Capabilities.SettingsStore).getStore<ScriptSettingsProps>(SCRIPT_PLUGIN)!.value;
24
- return <ScriptSettings settings={settings} />;
25
- },
21
+ role: 'article',
22
+ filter: (data): data is { subject: SettingsStore<ScriptSettingsProps> } =>
23
+ data.subject instanceof SettingsStore && data.subject.prefix === SCRIPT_PLUGIN,
24
+ component: ({ data: { subject } }) => <ScriptSettings settings={subject.value} />,
26
25
  }),
27
26
  createSurface({
28
27
  id: `${SCRIPT_PLUGIN}/article`,
@@ -37,7 +36,7 @@ export default () =>
37
36
  createSurface({
38
37
  id: `${SCRIPT_PLUGIN}/automation`,
39
38
  role: 'complementary--automation',
40
- disposition: 'hoist',
39
+ position: 'hoist',
41
40
  filter: (data): data is { subject: ScriptType } => data.subject instanceof ScriptType,
42
41
  component: ({ data }) => <AutomationPanel subject={data.subject} />,
43
42
  }),
@@ -8,7 +8,7 @@ import { type Credential } from '@dxos/protocols/proto/dxos/halo/credentials';
8
8
  import { useClient } from '@dxos/react-client';
9
9
  import { Button, Select, useTranslation } from '@dxos/react-ui';
10
10
  import { type EditorInputMode, EditorInputModes } from '@dxos/react-ui-editor';
11
- import { DeprecatedFormInput } from '@dxos/react-ui-form';
11
+ import { DeprecatedFormContainer, DeprecatedFormInput } from '@dxos/react-ui-form';
12
12
 
13
13
  import { SCRIPT_PLUGIN } from '../../meta';
14
14
  import { type ScriptSettingsProps } from '../../types';
@@ -39,7 +39,7 @@ export const ScriptSettings = ({ settings }: { settings: ScriptSettingsProps })
39
39
  };
40
40
 
41
41
  return (
42
- <>
42
+ <DeprecatedFormContainer>
43
43
  {/* TODO(wittjosiah): Hide outside of dev environments. */}
44
44
  <DeprecatedFormInput label={t('authenticate action label')}>
45
45
  <Button onClick={handleAuthenticate}>{t('authenticate button label')}</Button>
@@ -66,6 +66,6 @@ export const ScriptSettings = ({ settings }: { settings: ScriptSettingsProps })
66
66
  </Select.Portal>
67
67
  </Select.Root>
68
68
  </DeprecatedFormInput>
69
- </>
69
+ </DeprecatedFormContainer>
70
70
  );
71
71
  };
@@ -114,6 +114,20 @@ export const ScriptSettingsPanel = ({ script }: ScriptSettingsPanelProps) => {
114
114
 
115
115
  return (
116
116
  <>
117
+ <div role='form' className='flex flex-col w-full p-2 gap-4'>
118
+ <Input.Root>
119
+ <div role='none' className='flex flex-col gap-1'>
120
+ <Input.Label>{t('description label')}</Input.Label>
121
+ <Input.TextInput
122
+ placeholder={t('description placeholder')}
123
+ value={script.description ?? ''}
124
+ onChange={(event) => {
125
+ script.description = event.target.value;
126
+ }}
127
+ />
128
+ </div>
129
+ </Input.Root>
130
+ </div>
117
131
  {fn && functionUrl && (
118
132
  <>
119
133
  <Separator />
@@ -130,6 +130,7 @@ export const useDeployHandler = ({ state, script }: { state: Partial<DeployState
130
130
  fn ?? space.db.add(create(FunctionType, { name: functionId, version, source: makeRef(script) }));
131
131
 
132
132
  script.changed = false;
133
+ deployedFunction.description = script.description;
133
134
 
134
135
  if (meta.inputSchema) {
135
136
  deployedFunction.inputSchema = meta.inputSchema;
@@ -127,7 +127,7 @@ const createTooltipRenderer = (themeMode: ThemeMode) => {
127
127
 
128
128
  return (info: HoverInfo) => {
129
129
  const div = document.createElement('div');
130
- div.className = 'p-1 rounded border border-separator bg-base xs:max-w-80 max-w-lg';
130
+ div.className = 'p-1 rounded border border-separator bg-baseSurface xs:max-w-80 max-w-lg';
131
131
 
132
132
  if (info.quickInfo?.displayParts) {
133
133
  for (const part of info.quickInfo.displayParts) {
@@ -11,5 +11,9 @@ export default async ({
11
11
  },
12
12
  }: any) => {
13
13
  const data = await request.json();
14
- return new Response(JSON.stringify(data ?? {}), { headers: { 'Content-Type': 'application/json' } });
14
+ return new Response(JSON.stringify(data ?? {}), {
15
+ headers: {
16
+ 'Content-Type': 'application/json',
17
+ },
18
+ });
15
19
  };
@@ -0,0 +1,42 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ // @ts-ignore
6
+ import { defineFunction, S } from 'dxos:functions';
7
+ import {
8
+ HttpClient,
9
+ HttpClientRequest,
10
+ HttpClientResponse,
11
+ HttpClientError,
12
+ // @ts-ignore
13
+ } from 'https://esm.sh/@effect/platform@0.61.0?deps=effect@3.6.0';
14
+ // @ts-ignore
15
+ import type { Cause } from 'https://esm.sh/effect@3.6.0';
16
+ // @ts-ignore
17
+ import { Effect, Schedule } from 'https://esm.sh/effect@3.6.0';
18
+
19
+ /**
20
+ * Returns the exchange rate between two currencies.
21
+ */
22
+ export default defineFunction({
23
+ inputSchema: S.Struct({
24
+ from: S.String.annotations({ description: 'The source currency' }),
25
+ to: S.String.annotations({ description: 'The target currency' }),
26
+ }),
27
+
28
+ outputSchema: S.String,
29
+
30
+ handler: async ({
31
+ event: {
32
+ data: { from, to },
33
+ },
34
+ }: any) =>
35
+ HttpClientRequest.get(`https://free.ratesdb.com/v1/rates?from=${from}&to=${to}`).pipe(
36
+ HttpClient.fetchOk,
37
+ HttpClientResponse.json,
38
+ Effect.timeout('1 second'),
39
+ Effect.retry(Schedule.exponential(1000).pipe(Schedule.compose(Schedule.recurs(3)))),
40
+ Effect.map(({ data: { rates } }: any) => rates[to].toString()),
41
+ ),
42
+ });
@@ -1,21 +1,29 @@
1
1
  //
2
- // Copyright 2024 DXOS.org
2
+ // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
+ // @ts-ignore
6
+ import { defineFunction, S } from 'dxos:functions';
7
+
5
8
  /**
6
9
  * Returns the exchange rate between two currencies.
7
10
  */
8
- export default async ({
9
- event: {
10
- data: { request },
11
- },
12
- }: any) => {
13
- const { args: [from = 'EUR', to = 'USD'] = [] } = await request.json();
11
+ export default defineFunction({
12
+ inputSchema: S.Struct({
13
+ from: S.String.annotations({ description: 'The source currency' }),
14
+ to: S.String.annotations({ description: 'The target currency' }),
15
+ }),
14
16
 
15
- const res = await fetch(`https://free.ratesdb.com/v1/rates?from=${from}&to=${to}`);
16
- const {
17
- data: { rates },
18
- } = await res.json();
17
+ handler: async ({
18
+ event: {
19
+ data: { from, to },
20
+ },
21
+ }: any) => {
22
+ const res = await fetch(`https://free.ratesdb.com/v1/rates?from=${from}&to=${to}`);
23
+ const {
24
+ data: { rates },
25
+ } = await res.json();
19
26
 
20
- return new Response(rates[to].toString());
21
- };
27
+ return rates[to].toString();
28
+ },
29
+ });
@@ -12,6 +12,8 @@ import echo from './echo.ts?raw';
12
12
  import email from './email.ts?raw';
13
13
  // @ts-ignore
14
14
  import forex from './forex.ts?raw';
15
+ // @ts-ignore
16
+ import forexEffect from './forex-effect.ts?raw';
15
17
 
16
18
  const removeHeader = (str: string) => str.split('\n').slice(4).join('\n');
17
19
 
@@ -33,6 +35,11 @@ export const templates: Template[] = [
33
35
  name: 'Forex',
34
36
  source: removeHeader(forex),
35
37
  },
38
+ {
39
+ id: 'dxos.org/script/forex-effect',
40
+ name: 'Forex (Effect)',
41
+ source: removeHeader(forexEffect),
42
+ },
36
43
  {
37
44
  id: 'dxos.org/script/gpt',
38
45
  name: 'Gpt',
@@ -17,6 +17,8 @@ export default [
17
17
  'object title placeholder': 'New script',
18
18
  'create object label': 'Create script',
19
19
  'create stack section label': 'Create script',
20
+ 'description label': 'Description',
21
+ 'description placeholder': 'Describe what the script does.',
20
22
  'binding placeholder': 'Function name',
21
23
  'function request placeholder': 'Function request',
22
24
  'deploy label': 'Deploy',
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/components/ScriptContainer.tsx", "../../../src/components/ScriptToolbar/ScriptToolbar.tsx", "../../../src/components/ScriptToolbar/deploy.ts", "../../../src/components/ScriptToolbar/format.ts", "../../../src/components/ScriptToolbar/templateSelect.ts", "../../../src/components/ScriptToolbar/useToolbarAction.ts", "../../../src/components/ScriptToolbar/view.ts", "../../../src/components/ScriptToolbar/useToolbarState.ts", "../../../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 { type ThemedClassName } from '@dxos/react-ui';\nimport { createDataExtensions, listener, stackItemContentEditorClassNames } from '@dxos/react-ui-editor';\nimport { StackItem } from '@dxos/react-ui-stack';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { DebugPanel } from './DebugPanel';\nimport { ScriptToolbar } from './ScriptToolbar';\nimport { useDeployState } from './ScriptToolbar/deploy';\nimport { useToolbarState } from './ScriptToolbar/useToolbarState';\nimport { TypescriptEditor, type TypescriptEditorProps } from './TypescriptEditor';\nimport { type ScriptSettingsProps } from '../types';\n\nexport type ScriptEditorProps = ThemedClassName<{\n script: ScriptType;\n settings: ScriptSettingsProps;\n role?: string;\n}> &\n Pick<TypescriptEditorProps, 'env'>;\n\nexport const ScriptContainer = ({ role, classNames, script, settings, env }: ScriptEditorProps) => {\n const identity = useIdentity();\n const space = getSpace(script);\n\n const extensions = useMemo(\n () => [\n listener({\n onChange: (text) => {\n if (script.source.target && script.source.target.content !== text) {\n script.changed = true;\n }\n },\n }),\n createDataExtensions({\n id: script.id,\n text: script.source.target && createDocAccessor(script.source.target, ['content']),\n space,\n identity,\n }),\n ],\n [script, script.source.target, space, identity],\n );\n\n const state = useToolbarState({ view: 'split' });\n useDeployState({ state, script });\n\n return (\n <StackItem.Content toolbar>\n <ScriptToolbar state={state} role={role} script={script} />\n <div role='none' className={mx('flex flex-col w-full overflow-hidden divide-y divide-separator', classNames)}>\n {state.view !== 'debug' && (\n <TypescriptEditor\n id={script.id}\n env={env}\n initialValue={script.source?.target?.content}\n extensions={extensions}\n className={stackItemContentEditorClassNames(role)}\n inputMode={settings.editorInputMode}\n toolbar\n />\n )}\n\n {state.view !== 'editor' && <DebugPanel functionUrl={state.functionUrl} />}\n </div>\n </StackItem.Content>\n );\n};\n\nexport default ScriptContainer;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useCallback } from 'react';\n\nimport { type ScriptType } from '@dxos/functions';\nimport { fullyQualifiedId } from '@dxos/react-client/echo';\nimport { ElevationProvider, type ThemedClassName } from '@dxos/react-ui';\nimport { stackItemContentToolbarClassNames } from '@dxos/react-ui-editor';\nimport { createGapSeparator, MenuProvider, ToolbarMenu, useMenuActions } from '@dxos/react-ui-menu';\n\nimport { createDeploy } from './deploy';\nimport { createFormat } from './format';\nimport { createTemplateSelect } from './templateSelect';\nimport { useToolbarAction } from './useToolbarAction';\nimport { type ScriptToolbarState } from './useToolbarState';\nimport { createView } from './view';\n\nexport type ScriptToolbarProps = ThemedClassName<{\n role?: string;\n script: ScriptType;\n state: ScriptToolbarState;\n}>;\n\nconst createToolbar = (state: ScriptToolbarState) => {\n const templateSelect = createTemplateSelect();\n const format = createFormat();\n const gap = createGapSeparator();\n const deploy = createDeploy(state);\n const view = createView(state);\n return {\n nodes: [...templateSelect.nodes, ...format.nodes, ...gap.nodes, ...deploy.nodes, ...view.nodes],\n edges: [...templateSelect.edges, ...format.edges, ...gap.edges, ...deploy.edges, ...view.edges],\n };\n};\n\nexport const ScriptToolbar = ({ script, role, state, classNames }: ScriptToolbarProps) => {\n const handleAction = useToolbarAction({ state, script });\n const toolbarCreator = useCallback(() => createToolbar(state), [state]);\n const menu = useMenuActions(toolbarCreator);\n return (\n <div role='none' className={stackItemContentToolbarClassNames(role)}>\n <ElevationProvider elevation={role === 'section' ? 'positioned' : 'base'}>\n <MenuProvider {...menu} onAction={handleAction} attendableId={fullyQualifiedId(script)}>\n <ToolbarMenu classNames={classNames} />\n </MenuProvider>\n </ElevationProvider>\n </div>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useCallback, useEffect, useMemo } from 'react';\n\nimport {\n FunctionType,\n getInvocationUrl,\n getUserFunctionUrlInMetadata,\n incrementSemverPatch,\n type ScriptType,\n setUserFunctionUrlInMetadata,\n uploadWorkerFunction,\n} from '@dxos/functions';\nimport { log } from '@dxos/log';\nimport { useClient } from '@dxos/react-client';\nimport { Filter, create, getMeta, getSpace, makeRef, useQuery } from '@dxos/react-client/echo';\nimport { useTranslation } from '@dxos/react-ui';\nimport { createMenuAction } from '@dxos/react-ui-menu';\n\nimport { type ViewState } from './view';\nimport { Bundler } from '../../bundler';\nimport { SCRIPT_PLUGIN } from '../../meta';\n\nexport type DeployActionProperties = { type: 'deploy' } | { type: 'copy' };\n\nexport type DeployState = ViewState & {\n deploying: boolean;\n deployed: boolean;\n functionUrl: string;\n error: string;\n};\n\nexport const createDeploy = (state: Partial<DeployState>) => {\n const errorItem = createMenuAction('error', {\n label: state.error ?? ['no error label', { ns: SCRIPT_PLUGIN }],\n icon: 'ph--warning-circle--regular',\n hidden: !state.error,\n });\n\n const deployAction = createMenuAction<DeployActionProperties>('deploy', {\n type: 'deploy',\n label: [state.deploying ? 'pending label' : 'deploy label', { ns: SCRIPT_PLUGIN }],\n icon: state.deploying ? 'ph--spinner-gap--regular' : 'ph--cloud-arrow-up--regular',\n disabled: state.deploying,\n classNames: state.deploying ? '[&_svg]:animate-spin' : '',\n });\n\n const copyAction = createMenuAction<DeployActionProperties>('copy', {\n type: 'copy',\n label: ['copy link label', { ns: SCRIPT_PLUGIN }],\n icon: 'ph--link--regular',\n disabled: !state.functionUrl,\n });\n\n return {\n nodes: [errorItem, deployAction, copyAction],\n edges: [\n { source: 'root', target: 'error' },\n { source: 'root', target: 'deploy' },\n { source: 'root', target: 'copy' },\n ],\n };\n};\n\nconst useDeployDeps = ({ state, script }: { state: Partial<DeployState>; script: ScriptType }) => {\n const space = getSpace(script);\n const [fn] = useQuery(space, Filter.schema(FunctionType, { source: script }));\n const client = useClient();\n const existingFunctionUrl = useMemo(() => fn && getUserFunctionUrlInMetadata(getMeta(fn)), [fn]);\n return { space, fn, client, existingFunctionUrl };\n};\n\nexport const useDeployState = ({ state, script }: { state: Partial<DeployState>; script: ScriptType }) => {\n const { space, client, existingFunctionUrl } = useDeployDeps({ state, script });\n useEffect(() => {\n if (!existingFunctionUrl) {\n return;\n }\n\n state.functionUrl = getInvocationUrl(existingFunctionUrl, client.config.values.runtime?.services?.edge?.url ?? '', {\n spaceId: space?.id,\n });\n }, [existingFunctionUrl, space]);\n\n useEffect(() => {\n state.deployed = Boolean(existingFunctionUrl) && !script.changed;\n }, [script.changed, existingFunctionUrl]);\n};\n\nexport const useDeployHandler = ({ state, script }: { state: Partial<DeployState>; script: ScriptType }) => {\n const { space, fn, client, existingFunctionUrl } = useDeployDeps({ state, script });\n const { t } = useTranslation(SCRIPT_PLUGIN);\n\n return useCallback(async () => {\n if (!script.source || !space) {\n return;\n }\n\n state.error = undefined;\n state.deploying = true;\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.target!.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 =\n fn ?? space.db.add(create(FunctionType, { name: functionId, version, source: makeRef(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 state.view = 'split';\n } catch (err: any) {\n log.catch(err);\n state.error = t('upload failed label');\n }\n state.deploying = false;\n }, [fn, client, t, existingFunctionUrl, script, script.name, script.source, space?.id ?? null]);\n};\n\nexport const useCopyHandler = ({ state }: { state: Partial<DeployState> }) =>\n useCallback(async () => {\n if (!state.functionUrl) {\n return;\n }\n await navigator.clipboard.writeText(state.functionUrl);\n }, [state.functionUrl]);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { format } from 'prettier';\nimport prettierPluginEstree from 'prettier/plugins/estree';\nimport prettierPluginTypescript from 'prettier/plugins/typescript';\nimport { useCallback } from 'react';\n\nimport { type ScriptType } from '@dxos/functions';\nimport { log } from '@dxos/log';\nimport { createMenuAction } from '@dxos/react-ui-menu';\n\nimport { SCRIPT_PLUGIN } from '../../meta';\n\nexport type FormatActionProperties = { type: 'format' };\n\nexport const createFormat = () => {\n const formatAction = createMenuAction('format', {\n label: ['format label', { ns: SCRIPT_PLUGIN }],\n icon: 'ph--magic-wand--regular',\n });\n\n return {\n nodes: [formatAction],\n edges: [{ source: 'root', target: 'format' }],\n };\n};\n\nexport const useFormatHandler = ({ script }: { script: ScriptType }) =>\n useCallback(async () => {\n if (!script.source) {\n return;\n }\n\n try {\n script.source.target!.content = await format(script.source.target!.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// Copyright 2025 DXOS.org\n//\n\nimport { useCallback } from 'react';\n\nimport { FUNCTIONS_PRESET_META_KEY, type ScriptType } from '@dxos/functions';\nimport { getMeta } from '@dxos/live-object';\nimport { createMenuItemGroup, createMenuAction } from '@dxos/react-ui-menu';\n\nimport { SCRIPT_PLUGIN } from '../../meta';\nimport { templates } from '../../templates';\n\nexport type TemplateActionProperties = { type: 'template'; value: string };\n\nconst createTemplateSelectGroup = () => {\n return createMenuItemGroup('template-select', {\n label: ['template select group label', { ns: SCRIPT_PLUGIN }],\n variant: 'dropdownMenu',\n });\n};\n\nconst createTemplateSelectActions = () => {\n return templates.map((template) => {\n return createMenuAction<TemplateActionProperties>(`template--${template.id}`, {\n label: template.name,\n value: template.id,\n type: 'template',\n });\n });\n};\n\nexport const createTemplateSelect = () => {\n const templateSelectGroup = createTemplateSelectGroup();\n const templateSelectActions = createTemplateSelectActions();\n return {\n nodes: [templateSelectGroup, ...templateSelectActions],\n edges: [\n { source: 'root', target: 'template-select' },\n ...templateSelectActions.map((action) => ({ source: 'template-select', target: action.id })),\n ],\n };\n};\n\nexport const useTemplateSelectHandler = ({ script }: { script: ScriptType }) => {\n return useCallback(\n (templateId: string) => {\n const template = templates.find((template) => template.id === templateId);\n if (template) {\n script.name = template.name;\n script.source!.target!.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 [script],\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useCallback } from 'react';\n\nimport { type ScriptType } from '@dxos/functions';\nimport { log } from '@dxos/log';\nimport { type MenuAction, type MenuActionHandler } from '@dxos/react-ui-menu';\n\nimport { type DeployActionProperties, useDeployHandler, useCopyHandler } from './deploy';\nimport { type FormatActionProperties, useFormatHandler } from './format';\nimport { type TemplateActionProperties, useTemplateSelectHandler } from './templateSelect';\nimport { type ScriptToolbarState } from './useToolbarState';\nimport { type ViewActionProperties } from './view';\n\nexport type ScriptToolbarActionProperties =\n | TemplateActionProperties\n | ViewActionProperties\n | FormatActionProperties\n | DeployActionProperties;\n\nexport type ScriptToolbarAction = MenuAction<ScriptToolbarActionProperties>;\n\nexport const useToolbarAction = (props: { state: ScriptToolbarState; script: ScriptType }) => {\n const handleTemplateSelect = useTemplateSelectHandler(props);\n const handleFormat = useFormatHandler(props);\n const handleDeploy = useDeployHandler(props);\n const handleCopy = useCopyHandler(props);\n return useCallback(\n ((action: ScriptToolbarAction) => {\n switch (action.properties.type) {\n case 'template':\n handleTemplateSelect(action.properties.value);\n break;\n case 'view':\n props.state.view = action.properties.value;\n break;\n case 'format':\n void handleFormat();\n break;\n case 'deploy':\n void handleDeploy();\n break;\n case 'copy':\n void handleCopy();\n break;\n default:\n log.error('Unknown action type', action);\n }\n }) as MenuActionHandler,\n [handleTemplateSelect, handleFormat, handleDeploy, handleCopy],\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { createMenuAction, createMenuItemGroup } from '@dxos/react-ui-menu';\n\nimport { SCRIPT_PLUGIN } from '../../meta';\n\nexport type ViewType = 'editor' | 'split' | 'debug';\n\nexport type ViewState = { view: ViewType };\n\nexport type ViewActionProperties = { type: 'view'; value: ViewType };\n\nconst views: Record<ViewType, string> = {\n editor: 'ph--code--regular',\n split: 'ph--square-split-vertical--regular',\n debug: 'ph--bug--regular',\n};\n\nconst createViewGroupItem = (state: Partial<ViewState>) => {\n return createMenuItemGroup('view', {\n label: ['view group label', { ns: SCRIPT_PLUGIN }],\n variant: 'dropdownMenu',\n applyActive: true,\n value: state.view,\n });\n};\n\nconst createViewActions = (state: Partial<ViewState>) => {\n return Object.entries(views).map(([viewType, icon]) => {\n return createMenuAction<ViewActionProperties>(`view--${viewType}`, {\n type: 'view',\n value: viewType as ViewType,\n label: [`view ${viewType} label`, { ns: SCRIPT_PLUGIN }],\n icon,\n checked: state.view === viewType,\n });\n });\n};\n\nexport const createView = (state: Partial<ViewState>) => {\n const viewGroupItem = createViewGroupItem(state);\n const viewActions = createViewActions(state);\n return {\n nodes: [viewGroupItem, ...viewActions],\n edges: [\n { source: 'root', target: 'view' },\n ...viewActions.map((action) => ({ source: 'view', target: action.id })),\n ],\n };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useMemo } from 'react';\n\nimport { create } from '@dxos/live-object';\n\nimport { type DeployState } from './deploy';\nimport { type ViewState } from './view';\n\nexport type ScriptToolbarState = Partial<DeployState & ViewState>;\n\nexport const useToolbarState = (initialState: ScriptToolbarState = {}) => {\n return useMemo(() => create<ScriptToolbarState>(initialState), []);\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { javascript } from '@codemirror/lang-javascript';\nimport { defaultHighlightStyle } from '@codemirror/language';\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 ThemeMode, useThemeContext } from '@dxos/react-ui';\nimport {\n autocomplete,\n createBasicExtensions,\n createThemeExtensions,\n editorFullWidth,\n type EditorInputMode,\n editorMonospace,\n EditorView,\n folding,\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 inputMode?: EditorInputMode;\n env?: VirtualTypeScriptEnvironment;\n toolbar?: boolean;\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 toolbar,\n inputMode = 'vscode',\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 // NOTE: Not using default editor gutter because folding for code works best right beside text.\n EditorView.theme({\n '.cm-gutters': {\n // Match margin from content.\n marginTop: '16px',\n },\n }),\n InputModeExtensions[inputMode],\n folding(),\n // Continues block comments when you hit Enter.\n Prec.high(keymap.of(continueKeymap)),\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\n ? [\n tsFacet.of({ env, path: `/src/${id}.ts` }),\n tsSync(),\n tsLinter(),\n tsHover({ renderTooltip: createTooltipRenderer(themeMode) }),\n ]\n : [],\n ],\n ].filter(nonNullable),\n selection,\n scrollTo,\n }),\n [id, extensions, themeMode, inputMode, selection, scrollTo],\n );\n\n return (\n <div ref={parentRef} data-toolbar={toolbar ? 'enabled' : 'disabled'} className={className} {...focusAttributes} />\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-base 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", "mx", "React", "useCallback", "fullyQualifiedId", "ElevationProvider", "stackItemContentToolbarClassNames", "createGapSeparator", "MenuProvider", "ToolbarMenu", "useMenuActions", "useCallback", "useEffect", "useMemo", "FunctionType", "getInvocationUrl", "getUserFunctionUrlInMetadata", "incrementSemverPatch", "setUserFunctionUrlInMetadata", "uploadWorkerFunction", "log", "useClient", "Filter", "create", "getMeta", "getSpace", "makeRef", "useQuery", "useTranslation", "createMenuAction", "createDeploy", "state", "errorItem", "createMenuAction", "label", "error", "ns", "SCRIPT_PLUGIN", "icon", "hidden", "deployAction", "type", "deploying", "disabled", "classNames", "copyAction", "functionUrl", "nodes", "edges", "source", "target", "useDeployDeps", "script", "space", "getSpace", "fn", "useQuery", "Filter", "schema", "FunctionType", "client", "useClient", "existingFunctionUrl", "useMemo", "getUserFunctionUrlInMetadata", "getMeta", "useDeployState", "useEffect", "getInvocationUrl", "config", "values", "runtime", "services", "edge", "url", "spaceId", "id", "deployed", "Boolean", "changed", "useDeployHandler", "t", "useTranslation", "useCallback", "undefined", "existingFunctionId", "split", "at", "bundler", "Bundler", "platform", "sandboxedModules", "remoteModules", "buildResult", "bundle", "content", "functionId", "version", "meta", "uploadWorkerFunction", "incrementSemverPatch", "Error", "log", "info", "deployedFunction", "db", "add", "create", "name", "makeRef", "inputSchema", "verbose", "setUserFunctionUrlInMetadata", "view", "err", "catch", "useCopyHandler", "navigator", "clipboard", "writeText", "format", "prettierPluginEstree", "prettierPluginTypescript", "useCallback", "log", "createMenuAction", "createFormat", "formatAction", "createMenuAction", "label", "ns", "SCRIPT_PLUGIN", "icon", "nodes", "edges", "source", "target", "useFormatHandler", "script", "useCallback", "content", "format", "parser", "plugins", "prettierPluginEstree", "prettierPluginTypescript", "semi", "singleQuote", "err", "log", "catch", "useCallback", "FUNCTIONS_PRESET_META_KEY", "getMeta", "createMenuItemGroup", "createMenuAction", "createTemplateSelectGroup", "createMenuItemGroup", "label", "ns", "SCRIPT_PLUGIN", "variant", "createTemplateSelectActions", "templates", "map", "template", "createMenuAction", "id", "name", "value", "type", "createTemplateSelect", "templateSelectGroup", "templateSelectActions", "nodes", "edges", "source", "target", "action", "useTemplateSelectHandler", "script", "useCallback", "templateId", "find", "content", "metaKeys", "getMeta", "keys", "oldPresetIndex", "findIndex", "key", "FUNCTIONS_PRESET_META_KEY", "splice", "presetId", "push", "useCallback", "log", "useToolbarAction", "props", "handleTemplateSelect", "useTemplateSelectHandler", "handleFormat", "useFormatHandler", "handleDeploy", "useDeployHandler", "handleCopy", "useCopyHandler", "useCallback", "action", "properties", "type", "value", "state", "view", "log", "error", "createMenuAction", "createMenuItemGroup", "views", "editor", "split", "debug", "createViewGroupItem", "state", "createMenuItemGroup", "label", "ns", "SCRIPT_PLUGIN", "variant", "applyActive", "value", "view", "createViewActions", "Object", "entries", "map", "viewType", "icon", "createMenuAction", "type", "checked", "createView", "viewGroupItem", "viewActions", "nodes", "edges", "source", "target", "action", "id", "createToolbar", "state", "templateSelect", "createTemplateSelect", "format", "createFormat", "gap", "createGapSeparator", "deploy", "createDeploy", "view", "createView", "nodes", "edges", "ScriptToolbar", "script", "role", "classNames", "handleAction", "useToolbarAction", "toolbarCreator", "useCallback", "menu", "useMenuActions", "div", "className", "stackItemContentToolbarClassNames", "ElevationProvider", "elevation", "MenuProvider", "onAction", "attendableId", "fullyQualifiedId", "ToolbarMenu", "useMemo", "create", "useToolbarState", "initialState", "useMemo", "create", "javascript", "defaultHighlightStyle", "Prec", "oneDarkHighlightStyle", "keymap", "tags", "continueKeymap", "tsSync", "tsFacet", "tsLinter", "tsAutocomplete", "tsHover", "React", "useThemeContext", "autocomplete", "createBasicExtensions", "createThemeExtensions", "editorFullWidth", "editorMonospace", "EditorView", "folding", "InputModeExtensions", "useTextEditor", "nonNullable", "TypescriptEditor", "id", "env", "className", "initialValue", "extensions", "scrollTo", "selection", "toolbar", "inputMode", "themeMode", "useThemeContext", "parentRef", "focusAttributes", "useTextEditor", "createBasicExtensions", "highlightActiveLine", "indentWithTab", "lineNumbers", "lineWrapping", "scrollPastEnd", "createThemeExtensions", "syntaxHighlighting", "slots", "content", "editorFullWidth", "EditorView", "theme", "marginTop", "InputModeExtensions", "folding", "Prec", "high", "keymap", "of", "continueKeymap", "editorMonospace", "javascript", "typescript", "autocomplete", "override", "tsAutocomplete", "tsFacet", "path", "tsSync", "tsLinter", "tsHover", "renderTooltip", "createTooltipRenderer", "filter", "nonNullable", "React", "div", "ref", "data-toolbar", "oneDarkHighlightStyle", "defaultHighlightStyle", "classFromKind", "_kind", "kind", "endsWith", "validTag", "tags", "tag", "style", "info", "document", "createElement", "quickInfo", "displayParts", "part", "span", "appendChild", "innerText", "text", "dom", "ScriptContainer", "role", "classNames", "script", "settings", "env", "identity", "useIdentity", "space", "getSpace", "extensions", "useMemo", "listener", "onChange", "text", "source", "target", "content", "changed", "createDataExtensions", "id", "createDocAccessor", "state", "useToolbarState", "view", "useDeployState", "React", "StackItem", "Content", "toolbar", "ScriptToolbar", "div", "className", "mx", "TypescriptEditor", "initialValue", "stackItemContentEditorClassNames", "inputMode", "editorInputMode", "DebugPanel", "functionUrl"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["raw-loader:./chat.ts?raw", "raw-loader:./chess.ts?raw", "raw-loader:./echo.ts?raw", "raw-loader:./email.ts?raw", "raw-loader:./forex.ts?raw", "../../../src/templates/index.ts"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\n// @ts-ignore\nimport { transformServerSentEvents } from 'https://esm.sh/@dxos/script-toolbox';\n\n/**\n * Chatbot that answers questions based on the context data.\n */\nexport default async ({\n event: {\n data: { request },\n },\n context: { space, ai },\n}: any) => {\n const textBody = await request.text();\n let parsedRequest: any;\n try {\n parsedRequest = JSON.parse(textBody);\n } catch (err) {\n const answer = await ai.run('@cf/meta/llama-3.1-8b-instruct', {\n stream: true,\n prompt: `\n Using only the context data below to answer the user's question.\n If you cannot answer the question from the provided content, then reply with \"I don't know.\"\n\n CONTEXT:\n ${await getContext({ space })}\n\n QUESTION:\n ${textBody}\n `,\n });\n return new Response(transformServerSentEvents(answer));\n }\n\n const promptId = parsedRequest.trigger.promptId;\n const promptObject = await space.crud.query({ id: promptId }).first();\n\n if (parsedRequest.data.objects.length !== 1) {\n return new Response('Message batches not supported.');\n }\n\n const messageId = parsedRequest.data.objects[0];\n let message;\n try {\n message = await space.crud.query({ id: messageId }).first();\n } catch (err) {\n return new Response('Message not replicated yet.', { status: 409 });\n }\n\n if (message.text.includes('--------')) {\n return new Response('Message was already processed.');\n }\n\n let prompt = promptObject.template;\n for (const input of promptObject.inputs) {\n let value: string | null = null;\n if (input.type === ChainInputType.VALUE) {\n value = String(input.value);\n } else if (input.type === ChainInputType.RETRIEVER) {\n value = await getContext({ space });\n } else if (input.type === ChainInputType.PASS_THROUGH) {\n value = message.text;\n }\n if (value) {\n prompt = prompt.replaceAll(`{${input.name}}`, value);\n }\n }\n\n const answer = await ai.run('@cf/meta/llama-3.1-8b-instruct', {\n stream: false,\n prompt,\n });\n const response = { response: answer.response, prompt, message };\n const textWithAnswer = message.text + '\\n--------\\n\\n' + answer.response;\n await space.crud.update({ id: messageId }, { text: textWithAnswer });\n\n return new Response(JSON.stringify(response));\n};\n\nconst getContext = async ({ space }: any) => {\n let context = '';\n const { objects: docs } = await space.crud.query({ __typename: 'dxos.org/type/Document' }).run();\n for (const doc of docs) {\n const { content } = await space.crud.query({ id: doc.content }).first();\n context += content + '\\n\\n';\n }\n return context;\n};\n\nenum ChainInputType {\n VALUE = 0,\n PASS_THROUGH = 1,\n RETRIEVER = 2,\n FUNCTION = 3,\n QUERY = 4,\n RESOLVER = 5,\n CONTEXT = 6,\n SCHEMA = 7,\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\n// @ts-ignore\nimport { Chess } from 'https://esm.sh/chess.js@0.13.1';\n\n/**\n * Plays a random move in a chess game.\n */\nexport default async ({\n event: {\n data: { request },\n },\n context: { space },\n}: any) => {\n const {\n data: {\n objects: [gameId],\n player = 'b',\n },\n } = await request.json();\n\n const { pgn } = await space.crud.query({ id: gameId }).first();\n const game = new Chess();\n game.load_pgn(pgn);\n if (game.turn() !== player) {\n return new Response('Invalid turn', { status: 409 });\n }\n\n const moves = game.moves();\n const move = moves[Math.floor(Math.random() * moves.length)];\n if (!move) {\n return new Response('No legal moves', { status: 406 });\n }\n\n game.move(move);\n const newPgn = game.pgn();\n await space.crud.update({ id: gameId }, { pgn: newPgn });\n return new Response(game.ascii());\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\n/**\n * Echos the request data.\n */\nexport default async ({\n event: {\n data: { request },\n },\n}: any) => {\n const data = await request.json();\n return new Response(JSON.stringify(data ?? {}), { headers: { 'Content-Type': 'application/json' } });\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\n/**\n * Appends a message to the end of a Document configured through a trigger.\n * Trigger must have a targetDocumentId field set in Meta.\n */\nexport default async ({\n event: {\n data: { request },\n },\n context: { space },\n}: any) => {\n const { data, trigger } = (await request.json()) as RequestPayload;\n\n const documentId = trigger.meta.targetDocumentId;\n const document = await space.db.query({ id: documentId }, { format: 'plain' }).first();\n\n const contentId = document.content['/'].split(':')[3];\n const documentContent = await space.db.query({ id: contentId }, { format: 'plain' }).first();\n const modifiedContent = [\n documentContent.content,\n '',\n '---',\n `**From:** ${data.from}`,\n `**Subject:** ${data.subject}`,\n `**Date:** ${data.created}`,\n '',\n data.body,\n ].join('\\n');\n\n await space.db.update({ id: contentId }, { content: modifiedContent });\n\n return new Response(JSON.stringify({ success: true }));\n};\n\ntype RequestPayload = {\n data: { from: string; subject: string; created: string; body: string };\n trigger: { meta: { targetDocumentId: string } };\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\n/**\n * Returns the exchange rate between two currencies.\n */\nexport default async ({\n event: {\n data: { request },\n },\n}: any) => {\n const { args: [from = 'EUR', to = 'USD'] = [] } = await request.json();\n\n const res = await fetch(`https://free.ratesdb.com/v1/rates?from=${from}&to=${to}`);\n const {\n data: { rates },\n } = await res.json();\n\n return new Response(rates[to].toString());\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\n// @ts-ignore\nimport chat from './chat.ts?raw';\n// @ts-ignore\nimport chess from './chess.ts?raw';\n// @ts-ignore\nimport echo from './echo.ts?raw';\n// @ts-ignore\nimport email from './email.ts?raw';\n// @ts-ignore\nimport forex from './forex.ts?raw';\n\nconst removeHeader = (str: string) => str.split('\\n').slice(4).join('\\n');\n\nexport type Template = {\n id: string;\n name: string;\n source: string;\n presetId?: string;\n};\n\nexport const templates: Template[] = [\n {\n id: 'dxos.org/script/echo',\n name: 'Echo',\n source: removeHeader(echo),\n },\n {\n id: 'dxos.org/script/forex',\n name: 'Forex',\n source: removeHeader(forex),\n },\n {\n id: 'dxos.org/script/gpt',\n name: 'Gpt',\n source: removeHeader(chat),\n presetId: 'dxos.org/function/gpt',\n },\n {\n id: 'dxos.org/script/chess',\n name: 'Chess',\n source: removeHeader(chess),\n presetId: 'dxos.org/function/chess',\n },\n {\n id: 'dxos.org/script/email',\n name: 'Email',\n source: removeHeader(email),\n presetId: 'dxos.org/function/email',\n },\n];\n"],
5
- "mappings": ";AAAA;;;ACAA;;;ACAA;;;ACAA;;;ACAA;;;ACeA,IAAMA,eAAe,CAACC,QAAgBA,IAAIC,MAAM,IAAA,EAAMC,MAAM,CAAA,EAAGC,KAAK,IAAA;AAS7D,IAAMC,YAAwB;EACnC;IACEC,IAAI;IACJC,MAAM;IACNC,QAAQR,aAAaS,YAAAA;EACvB;EACA;IACEH,IAAI;IACJC,MAAM;IACNC,QAAQR,aAAaU,aAAAA;EACvB;EACA;IACEJ,IAAI;IACJC,MAAM;IACNC,QAAQR,aAAaW,YAAAA;IACrBC,UAAU;EACZ;EACA;IACEN,IAAI;IACJC,MAAM;IACNC,QAAQR,aAAaa,aAAAA;IACrBD,UAAU;EACZ;EACA;IACEN,IAAI;IACJC,MAAM;IACNC,QAAQR,aAAac,aAAAA;IACrBF,UAAU;EACZ;;",
6
- "names": ["removeHeader", "str", "split", "slice", "join", "templates", "id", "name", "source", "echo", "forex", "chat", "presetId", "chess", "email"]
7
- }