@dxos/plugin-script 0.6.13 → 0.6.14-main.69511f5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/lib/browser/AutomationPanel-MDPZ5WAC.mjs +78 -0
- package/dist/lib/browser/AutomationPanel-MDPZ5WAC.mjs.map +7 -0
- package/dist/lib/browser/ScriptContainer-B3CPWXRE.mjs +423 -0
- package/dist/lib/browser/ScriptContainer-B3CPWXRE.mjs.map +7 -0
- package/dist/lib/browser/chunk-G66MXS4T.mjs +248 -0
- package/dist/lib/browser/chunk-G66MXS4T.mjs.map +7 -0
- package/dist/lib/browser/{chunk-RHEZ5LUU.mjs → chunk-G6H56WFS.mjs} +51 -2
- package/dist/lib/browser/{chunk-RHEZ5LUU.mjs.map → chunk-G6H56WFS.mjs.map} +4 -4
- package/dist/lib/browser/{chunk-DL5XQRQM.mjs → chunk-KHNN3F7J.mjs} +18 -6
- package/dist/lib/browser/chunk-KHNN3F7J.mjs.map +7 -0
- package/dist/lib/browser/{chunk-O4LWBX6A.mjs → chunk-KXVQPS4Y.mjs} +2 -2
- package/dist/lib/browser/{chunk-O4LWBX6A.mjs.map → chunk-KXVQPS4Y.mjs.map} +2 -2
- package/dist/lib/browser/chunk-SGQHRB4P.mjs +17 -0
- package/dist/lib/browser/chunk-SGQHRB4P.mjs.map +7 -0
- package/dist/lib/browser/edge/index.mjs +5 -1
- package/dist/lib/browser/index.mjs +91 -61
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/meta.mjs +1 -1
- package/dist/lib/browser/types/index.mjs +2 -2
- package/dist/lib/node/AutomationPanel-SANUE5X4.cjs +100 -0
- package/dist/lib/node/AutomationPanel-SANUE5X4.cjs.map +7 -0
- package/dist/lib/node/ScriptContainer-BV7HMUY5.cjs +425 -0
- package/dist/lib/node/ScriptContainer-BV7HMUY5.cjs.map +7 -0
- package/dist/lib/node/{chunk-5RBVXKXT.cjs → chunk-25PQE7FL.cjs} +6 -6
- package/dist/lib/node/{chunk-5RBVXKXT.cjs.map → chunk-25PQE7FL.cjs.map} +2 -2
- package/dist/lib/node/{chunk-4GTXIELQ.cjs → chunk-ACLCRWDB.cjs} +44 -6
- package/dist/lib/node/chunk-ACLCRWDB.cjs.map +7 -0
- package/dist/lib/node/{TypescriptEditor-M3WWFIP2.cjs → chunk-EJC55SDD.cjs} +18 -8
- package/dist/lib/node/chunk-EJC55SDD.cjs.map +7 -0
- package/dist/lib/node/{chunk-PFH3ROEH.cjs → chunk-FY5KKL5N.cjs} +22 -8
- package/dist/lib/node/chunk-FY5KKL5N.cjs.map +7 -0
- package/dist/lib/node/chunk-JWKMTYYH.cjs +277 -0
- package/dist/lib/node/chunk-JWKMTYYH.cjs.map +7 -0
- package/dist/lib/node/edge/index.cjs +12 -8
- package/dist/lib/node/edge/index.cjs.map +2 -2
- package/dist/lib/node/index.cjs +107 -81
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/meta.cjs +3 -3
- package/dist/lib/node/meta.cjs.map +1 -1
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/types/index.cjs +5 -5
- package/dist/lib/node/types/index.cjs.map +1 -1
- package/dist/lib/node-esm/AutomationPanel-H2IKE53E.mjs +79 -0
- package/dist/lib/node-esm/AutomationPanel-H2IKE53E.mjs.map +7 -0
- package/dist/lib/node-esm/ScriptContainer-HSIOGVP3.mjs +424 -0
- package/dist/lib/node-esm/ScriptContainer-HSIOGVP3.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-3QHVR4VV.mjs +249 -0
- package/dist/lib/node-esm/chunk-3QHVR4VV.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-7EDYDVQH.mjs +47 -0
- package/dist/lib/node-esm/chunk-7EDYDVQH.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-GO7HYFM5.mjs +19 -0
- package/dist/lib/node-esm/chunk-GO7HYFM5.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-LDLNTVAK.mjs +280 -0
- package/dist/lib/node-esm/chunk-LDLNTVAK.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-QMTTZYLF.mjs +255 -0
- package/dist/lib/node-esm/chunk-QMTTZYLF.mjs.map +7 -0
- package/dist/lib/node-esm/edge/index.mjs +24 -0
- package/dist/lib/node-esm/index.mjs +322 -0
- package/dist/lib/node-esm/index.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -0
- package/dist/lib/node-esm/meta.mjs +10 -0
- package/dist/lib/node-esm/meta.mjs.map +7 -0
- package/dist/lib/node-esm/types/index.mjs +13 -0
- package/dist/lib/node-esm/types/index.mjs.map +7 -0
- package/dist/types/src/ScriptPlugin.d.ts.map +1 -1
- package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts +17 -0
- package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts.map +1 -0
- package/dist/types/src/components/AutomationPanel/index.d.ts +4 -0
- package/dist/types/src/components/AutomationPanel/index.d.ts.map +1 -0
- package/dist/types/src/components/{DebugPanel.d.ts → DebugPanel/DebugPanel.d.ts} +2 -1
- package/dist/types/src/components/DebugPanel/DebugPanel.d.ts.map +1 -0
- package/dist/types/src/components/DebugPanel/index.d.ts +2 -0
- package/dist/types/src/components/DebugPanel/index.d.ts.map +1 -0
- package/dist/types/src/components/{ScriptBlock/FrameContainer → FrameContainer}/FrameContainer.d.ts +1 -1
- package/dist/types/src/components/FrameContainer/FrameContainer.d.ts.map +1 -0
- package/dist/types/src/components/FrameContainer/frame.d.ts.map +1 -0
- package/dist/types/src/components/FrameContainer/index.d.ts.map +1 -0
- package/dist/types/src/components/ScriptBlock/ScriptBlock.d.ts +1 -3
- package/dist/types/src/components/ScriptBlock/ScriptBlock.d.ts.map +1 -1
- package/dist/types/src/components/ScriptBlock/ScriptBlock.stories.d.ts +3 -8
- package/dist/types/src/components/ScriptBlock/ScriptBlock.stories.d.ts.map +1 -1
- package/dist/types/src/components/ScriptContainer.d.ts +5 -0
- package/dist/types/src/components/ScriptContainer.d.ts.map +1 -0
- package/dist/types/src/components/ScriptEditor.d.ts +4 -5
- package/dist/types/src/components/ScriptEditor.d.ts.map +1 -1
- package/dist/types/src/components/ScriptSettings/ScriptSettings.d.ts +6 -0
- package/dist/types/src/components/ScriptSettings/ScriptSettings.d.ts.map +1 -0
- package/dist/types/src/components/ScriptSettings/index.d.ts +2 -0
- package/dist/types/src/components/ScriptSettings/index.d.ts.map +1 -0
- package/dist/types/src/components/Toolbar/Toolbar.d.ts +23 -0
- package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -0
- package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts +14 -0
- package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -0
- package/dist/types/src/components/Toolbar/index.d.ts +2 -0
- package/dist/types/src/components/Toolbar/index.d.ts.map +1 -0
- package/dist/types/src/components/{TypescriptEditor.d.ts → TypescriptEditor/TypescriptEditor.d.ts} +1 -2
- package/dist/types/src/components/TypescriptEditor/TypescriptEditor.d.ts.map +1 -0
- package/dist/types/src/components/TypescriptEditor/TypescriptEditor.stories.d.ts +6 -0
- package/dist/types/src/components/TypescriptEditor/TypescriptEditor.stories.d.ts.map +1 -0
- package/dist/types/src/components/TypescriptEditor/index.d.ts +2 -0
- package/dist/types/src/components/TypescriptEditor/index.d.ts.map +1 -0
- package/dist/types/src/components/index.d.ts +3 -3
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/edge/functions.d.ts +7 -0
- package/dist/types/src/edge/functions.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +4 -9
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/templates/chat.d.ts +6 -0
- package/dist/types/src/templates/chat.d.ts.map +1 -0
- package/dist/types/src/templates/chess.d.ts +6 -0
- package/dist/types/src/templates/chess.d.ts.map +1 -0
- package/dist/types/src/templates/echo.d.ts +6 -0
- package/dist/types/src/templates/echo.d.ts.map +1 -0
- package/dist/types/src/templates/email.d.ts +6 -0
- package/dist/types/src/templates/email.d.ts.map +1 -0
- package/dist/types/src/templates/forex.d.ts +6 -0
- package/dist/types/src/templates/forex.d.ts.map +1 -0
- package/dist/types/src/templates.d.ts +8 -0
- package/dist/types/src/templates.d.ts.map +1 -0
- package/dist/types/src/translations.d.ts +2 -0
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/script.d.ts +4 -4
- package/dist/types/src/types/types.d.ts +4 -3
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/package.json +59 -64
- package/src/ScriptPlugin.tsx +39 -41
- package/src/bundler/bundler.test.ts +12 -2
- package/src/components/AutomationPanel/AutomationPanel.tsx +101 -0
- package/src/components/AutomationPanel/index.ts +9 -0
- package/src/components/{DebugPanel.tsx → DebugPanel/DebugPanel.tsx} +83 -78
- package/src/components/DebugPanel/index.ts +5 -0
- package/src/components/{ScriptBlock/FrameContainer → FrameContainer}/FrameContainer.tsx +1 -1
- package/src/components/ScriptBlock/ScriptBlock.stories.tsx +15 -14
- package/src/components/ScriptBlock/ScriptBlock.tsx +23 -51
- package/src/components/ScriptContainer.tsx +22 -0
- package/src/components/ScriptEditor.tsx +58 -55
- package/src/components/ScriptSettings/ScriptSettings.tsx +47 -0
- package/src/components/ScriptSettings/index.ts +5 -0
- package/src/components/Toolbar/Toolbar.stories.tsx +30 -0
- package/src/components/Toolbar/Toolbar.tsx +177 -0
- package/src/components/{ScriptBlock/Splitter → Toolbar}/index.ts +1 -1
- package/src/components/{TypescriptEditor.stories.tsx → TypescriptEditor/TypescriptEditor.stories.tsx} +17 -35
- package/src/components/{TypescriptEditor.tsx → TypescriptEditor/TypescriptEditor.tsx} +1 -3
- package/src/components/TypescriptEditor/index.ts +5 -0
- package/src/components/index.ts +5 -3
- package/src/edge/functions.ts +19 -0
- package/src/meta.ts +15 -0
- package/src/templates/chat.ts +102 -0
- package/src/templates/chess.ts +41 -0
- package/src/templates/echo.ts +15 -0
- package/src/templates/email.ts +38 -0
- package/src/templates/forex.ts +21 -0
- package/src/templates.ts +54 -0
- package/src/translations.ts +2 -0
- package/src/types/types.ts +9 -5
- package/dist/lib/browser/ScriptEditor-5Y3EROG3.mjs +0 -513
- package/dist/lib/browser/ScriptEditor-5Y3EROG3.mjs.map +0 -7
- package/dist/lib/browser/TypescriptEditor-GPE72Y6I.mjs +0 -9
- package/dist/lib/browser/chunk-DL5XQRQM.mjs.map +0 -7
- package/dist/lib/browser/chunk-JBACGDOJ.mjs +0 -21
- package/dist/lib/browser/chunk-JBACGDOJ.mjs.map +0 -7
- package/dist/lib/browser/chunk-MRGOT5RF.mjs +0 -78
- package/dist/lib/browser/chunk-MRGOT5RF.mjs.map +0 -7
- package/dist/lib/node/ScriptEditor-YCUQFWQM.cjs +0 -526
- package/dist/lib/node/ScriptEditor-YCUQFWQM.cjs.map +0 -7
- package/dist/lib/node/TypescriptEditor-M3WWFIP2.cjs.map +0 -7
- package/dist/lib/node/chunk-4GTXIELQ.cjs.map +0 -7
- package/dist/lib/node/chunk-4VMNBXWU.cjs +0 -54
- package/dist/lib/node/chunk-4VMNBXWU.cjs.map +0 -7
- package/dist/lib/node/chunk-IMLDKD5Y.cjs +0 -111
- package/dist/lib/node/chunk-IMLDKD5Y.cjs.map +0 -7
- package/dist/lib/node/chunk-PFH3ROEH.cjs.map +0 -7
- package/dist/types/src/components/DebugPanel.d.ts.map +0 -1
- package/dist/types/src/components/ScriptBlock/FrameContainer/FrameContainer.d.ts.map +0 -1
- package/dist/types/src/components/ScriptBlock/FrameContainer/frame.d.ts.map +0 -1
- package/dist/types/src/components/ScriptBlock/FrameContainer/index.d.ts.map +0 -1
- package/dist/types/src/components/ScriptBlock/Splitter/Splitter.d.ts +0 -15
- package/dist/types/src/components/ScriptBlock/Splitter/Splitter.d.ts.map +0 -1
- package/dist/types/src/components/ScriptBlock/Splitter/Splitter.stories.d.ts +0 -13
- package/dist/types/src/components/ScriptBlock/Splitter/Splitter.stories.d.ts.map +0 -1
- package/dist/types/src/components/ScriptBlock/Splitter/index.d.ts +0 -2
- package/dist/types/src/components/ScriptBlock/Splitter/index.d.ts.map +0 -1
- package/dist/types/src/components/Toolbar.d.ts +0 -13
- package/dist/types/src/components/Toolbar.d.ts.map +0 -1
- package/dist/types/src/components/Toolbar.stories.d.ts +0 -14
- package/dist/types/src/components/Toolbar.stories.d.ts.map +0 -1
- package/dist/types/src/components/TypescriptEditor.d.ts.map +0 -1
- package/dist/types/src/components/TypescriptEditor.stories.d.ts +0 -10
- package/dist/types/src/components/TypescriptEditor.stories.d.ts.map +0 -1
- package/src/components/ScriptBlock/Splitter/Splitter.stories.tsx +0 -37
- package/src/components/ScriptBlock/Splitter/Splitter.tsx +0 -52
- package/src/components/Toolbar.stories.tsx +0 -17
- package/src/components/Toolbar.tsx +0 -147
- package/src/meta.tsx +0 -19
- /package/dist/lib/{browser/TypescriptEditor-GPE72Y6I.mjs.map → node-esm/edge/index.mjs.map} +0 -0
- /package/dist/types/src/components/{ScriptBlock/FrameContainer → FrameContainer}/frame.d.ts +0 -0
- /package/dist/types/src/components/{ScriptBlock/FrameContainer → FrameContainer}/index.d.ts +0 -0
- /package/src/components/{ScriptBlock/FrameContainer → FrameContainer}/frame.html +0 -0
- /package/src/components/{ScriptBlock/FrameContainer → FrameContainer}/frame.tsx +0 -0
- /package/src/components/{ScriptBlock/FrameContainer → FrameContainer}/index.ts +0 -0
package/src/ScriptPlugin.tsx
CHANGED
|
@@ -2,12 +2,11 @@
|
|
|
2
2
|
// Copyright 2023 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import { Code, type IconProps } from '@phosphor-icons/react';
|
|
6
5
|
// @ts-ignore
|
|
7
6
|
import wasmUrl from 'esbuild-wasm/esbuild.wasm?url';
|
|
8
7
|
import React from 'react';
|
|
9
8
|
|
|
10
|
-
import { parseIntentPlugin, type PluginDefinition, resolvePlugin
|
|
9
|
+
import { NavigationAction, parseIntentPlugin, type PluginDefinition, resolvePlugin } from '@dxos/app-framework';
|
|
11
10
|
import { create } from '@dxos/echo-schema';
|
|
12
11
|
import { parseClientPlugin } from '@dxos/plugin-client';
|
|
13
12
|
import { type ActionGroup, createExtension, isActionGroup } from '@dxos/plugin-graph';
|
|
@@ -17,11 +16,11 @@ import { loadObjectReferences } from '@dxos/react-client/echo';
|
|
|
17
16
|
|
|
18
17
|
import { initializeBundler } from './bundler';
|
|
19
18
|
import { Compiler } from './compiler';
|
|
20
|
-
import {
|
|
19
|
+
import { AutomationPanel, ScriptContainer, ScriptSettings } from './components';
|
|
21
20
|
import meta, { SCRIPT_PLUGIN } from './meta';
|
|
21
|
+
import { templates } from './templates';
|
|
22
22
|
import translations from './translations';
|
|
23
|
-
import { FunctionType, ScriptType } from './types';
|
|
24
|
-
import { ScriptAction, type ScriptPluginProvides } from './types';
|
|
23
|
+
import { FunctionType, ScriptAction, type ScriptPluginProvides, ScriptType } from './types';
|
|
25
24
|
|
|
26
25
|
export const ScriptPlugin = (): PluginDefinition<ScriptPluginProvides> => {
|
|
27
26
|
const compiler = new Compiler();
|
|
@@ -45,12 +44,12 @@ export const ScriptPlugin = (): PluginDefinition<ScriptPluginProvides> => {
|
|
|
45
44
|
await initializeBundler({ wasmUrl });
|
|
46
45
|
},
|
|
47
46
|
provides: {
|
|
47
|
+
settings: {},
|
|
48
48
|
metadata: {
|
|
49
49
|
records: {
|
|
50
50
|
[ScriptType.typename]: {
|
|
51
51
|
placeholder: ['object title placeholder', { ns: SCRIPT_PLUGIN }],
|
|
52
|
-
icon:
|
|
53
|
-
iconSymbol: 'ph--code--regular',
|
|
52
|
+
icon: 'ph--code--regular',
|
|
54
53
|
// TODO(wittjosiah): Move out of metadata.
|
|
55
54
|
loadReferences: (script: ScriptType) => loadObjectReferences(script, (script) => [script.source]),
|
|
56
55
|
},
|
|
@@ -60,6 +59,12 @@ export const ScriptPlugin = (): PluginDefinition<ScriptPluginProvides> => {
|
|
|
60
59
|
echo: {
|
|
61
60
|
schema: [ScriptType, FunctionType],
|
|
62
61
|
},
|
|
62
|
+
space: {
|
|
63
|
+
onSpaceCreate: {
|
|
64
|
+
label: ['create object label', { ns: SCRIPT_PLUGIN }],
|
|
65
|
+
action: ScriptAction.CREATE,
|
|
66
|
+
},
|
|
67
|
+
},
|
|
63
68
|
graph: {
|
|
64
69
|
builder: (plugins) => {
|
|
65
70
|
const client = resolvePlugin(plugins, parseClientPlugin)?.provides.client;
|
|
@@ -93,8 +98,7 @@ export const ScriptPlugin = (): PluginDefinition<ScriptPluginProvides> => {
|
|
|
93
98
|
},
|
|
94
99
|
properties: {
|
|
95
100
|
label: ['create object label', { ns: SCRIPT_PLUGIN }],
|
|
96
|
-
icon:
|
|
97
|
-
iconSymbol: 'ph--code--regular',
|
|
101
|
+
icon: 'ph--code--regular',
|
|
98
102
|
testId: 'scriptPlugin.createObject',
|
|
99
103
|
},
|
|
100
104
|
},
|
|
@@ -103,29 +107,28 @@ export const ScriptPlugin = (): PluginDefinition<ScriptPluginProvides> => {
|
|
|
103
107
|
});
|
|
104
108
|
},
|
|
105
109
|
},
|
|
106
|
-
stack: {
|
|
107
|
-
creators: [
|
|
108
|
-
{
|
|
109
|
-
id: 'create-stack-section-script',
|
|
110
|
-
testId: 'scriptPlugin.createSection',
|
|
111
|
-
type: ['plugin name', { ns: SCRIPT_PLUGIN }],
|
|
112
|
-
label: ['create stack section label', { ns: SCRIPT_PLUGIN }],
|
|
113
|
-
icon: (props: any) => <Code {...props} />,
|
|
114
|
-
intent: {
|
|
115
|
-
plugin: SCRIPT_PLUGIN,
|
|
116
|
-
action: ScriptAction.CREATE,
|
|
117
|
-
},
|
|
118
|
-
},
|
|
119
|
-
],
|
|
120
|
-
},
|
|
121
110
|
surface: {
|
|
122
111
|
component: ({ data, role }) => {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
112
|
+
switch (role) {
|
|
113
|
+
case 'settings': {
|
|
114
|
+
return data.plugin === meta.id ? <ScriptSettings settings={{}} /> : null;
|
|
115
|
+
}
|
|
126
116
|
|
|
127
|
-
|
|
128
|
-
|
|
117
|
+
case 'article': {
|
|
118
|
+
if (data.object instanceof ScriptType) {
|
|
119
|
+
return <ScriptContainer script={data.object} env={compiler.environment} />;
|
|
120
|
+
}
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
case 'complementary--automation': {
|
|
125
|
+
if (data.object instanceof ScriptType) {
|
|
126
|
+
return {
|
|
127
|
+
node: <AutomationPanel subject={data.subject as any} />,
|
|
128
|
+
disposition: 'hoist',
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
}
|
|
129
132
|
}
|
|
130
133
|
|
|
131
134
|
return null;
|
|
@@ -135,7 +138,13 @@ export const ScriptPlugin = (): PluginDefinition<ScriptPluginProvides> => {
|
|
|
135
138
|
resolver: (intent) => {
|
|
136
139
|
switch (intent.action) {
|
|
137
140
|
case ScriptAction.CREATE: {
|
|
138
|
-
return {
|
|
141
|
+
return {
|
|
142
|
+
data: create(ScriptType, {
|
|
143
|
+
source: create(TextType, {
|
|
144
|
+
content: templates[0].source,
|
|
145
|
+
}),
|
|
146
|
+
}),
|
|
147
|
+
};
|
|
139
148
|
}
|
|
140
149
|
}
|
|
141
150
|
},
|
|
@@ -143,14 +152,3 @@ export const ScriptPlugin = (): PluginDefinition<ScriptPluginProvides> => {
|
|
|
143
152
|
},
|
|
144
153
|
};
|
|
145
154
|
};
|
|
146
|
-
|
|
147
|
-
// TODO(burdon): Import.
|
|
148
|
-
const example = [
|
|
149
|
-
'export default async ({ ',
|
|
150
|
-
' event: { data: { request } },',
|
|
151
|
-
' context: { space, ai } ',
|
|
152
|
-
'}: any) => {',
|
|
153
|
-
" return new Response('Hello DXOS!');",
|
|
154
|
-
'};',
|
|
155
|
-
'',
|
|
156
|
-
].join('\n');
|
|
@@ -2,11 +2,21 @@
|
|
|
2
2
|
// Copyright 2022 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
// @ts-ignore
|
|
6
|
+
import wasmUrl from 'esbuild-wasm/esbuild.wasm?url';
|
|
7
|
+
import { beforeAll, describe, expect, test } from 'vitest';
|
|
6
8
|
|
|
7
|
-
import {
|
|
9
|
+
import { isNode } from '@dxos/util';
|
|
10
|
+
|
|
11
|
+
import { Bundler, initializeBundler } from './bundler';
|
|
8
12
|
|
|
9
13
|
describe('Bundler', () => {
|
|
14
|
+
beforeAll(async () => {
|
|
15
|
+
if (!isNode()) {
|
|
16
|
+
await initializeBundler({ wasmUrl });
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
|
|
10
20
|
test('Basic', async () => {
|
|
11
21
|
const bundler = new Bundler({ platform: 'node', sandboxedModules: [], remoteModules: {} });
|
|
12
22
|
const result = await bundler.bundle('const x = 100'); // TODO(burdon): Test import.
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import React, { useMemo, useState } from 'react';
|
|
6
|
+
|
|
7
|
+
import { type EchoReactiveObject } from '@dxos/client/echo';
|
|
8
|
+
import { failUndefined } from '@dxos/debug';
|
|
9
|
+
import { useClient } from '@dxos/react-client';
|
|
10
|
+
import { Filter, getMeta, getSpace, useQuery } from '@dxos/react-client/echo';
|
|
11
|
+
import { Select } from '@dxos/react-ui';
|
|
12
|
+
|
|
13
|
+
import { getInvocationUrl, getUserFunctionUrlInMetadata } from '../../edge';
|
|
14
|
+
import { FunctionType, ScriptType } from '../../types';
|
|
15
|
+
import { DebugPanel } from '../DebugPanel';
|
|
16
|
+
|
|
17
|
+
export interface AutomationPanelProps {
|
|
18
|
+
subject: EchoReactiveObject<any>;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export const AutomationPanel = ({ subject }: AutomationPanelProps) => {
|
|
22
|
+
const space = getSpace(subject);
|
|
23
|
+
|
|
24
|
+
// TODO(dmaretskyi): Parametric query.
|
|
25
|
+
const functions = useQuery(
|
|
26
|
+
space ?? undefined,
|
|
27
|
+
Filter.schema(FunctionType, (fn) => (subject instanceof ScriptType ? fn.source === subject : fn.binding != null)),
|
|
28
|
+
{},
|
|
29
|
+
[subject],
|
|
30
|
+
);
|
|
31
|
+
const [selectedFunction, setSelectedFunction] = useState<FunctionType | null>(null);
|
|
32
|
+
const functionToChatWith = subject instanceof ScriptType ? functions[0] : selectedFunction;
|
|
33
|
+
|
|
34
|
+
return (
|
|
35
|
+
<div className='h-full flex flex-col'>
|
|
36
|
+
{!(subject instanceof ScriptType) && (
|
|
37
|
+
<BindingSelect
|
|
38
|
+
selectedFunction={selectedFunction}
|
|
39
|
+
setSelectedFunction={setSelectedFunction}
|
|
40
|
+
functions={functions}
|
|
41
|
+
/>
|
|
42
|
+
)}
|
|
43
|
+
{functionToChatWith && <ChatPanel fn={functionToChatWith} subject={subject} />}
|
|
44
|
+
{subject instanceof ScriptType && functions.length === 0 && <p>Deploy function to interact with it.</p>}
|
|
45
|
+
</div>
|
|
46
|
+
);
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export interface ChatPanelProps {
|
|
50
|
+
fn: FunctionType;
|
|
51
|
+
subject: EchoReactiveObject<any>;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const ChatPanel = ({ fn, subject }: ChatPanelProps) => {
|
|
55
|
+
const client = useClient();
|
|
56
|
+
const space = getSpace(fn);
|
|
57
|
+
const existingFunctionUrl = getUserFunctionUrlInMetadata(getMeta(fn));
|
|
58
|
+
const functionUrl = useMemo(() => {
|
|
59
|
+
if (!existingFunctionUrl) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return getInvocationUrl(existingFunctionUrl, client.config.values.runtime?.services?.edge?.url ?? '', {
|
|
64
|
+
spaceId: space?.id,
|
|
65
|
+
subjectId: subject?.id,
|
|
66
|
+
});
|
|
67
|
+
}, [existingFunctionUrl, space, subject]);
|
|
68
|
+
|
|
69
|
+
return <DebugPanel functionUrl={functionUrl} classNames='flex-1' />;
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
export interface BindingSelectProps {
|
|
73
|
+
selectedFunction: FunctionType | null;
|
|
74
|
+
setSelectedFunction: (fn: FunctionType) => void;
|
|
75
|
+
functions: FunctionType[];
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const BindingSelect = ({ selectedFunction, setSelectedFunction, functions }: BindingSelectProps) => {
|
|
79
|
+
return (
|
|
80
|
+
<Select.Root
|
|
81
|
+
value={selectedFunction?.id}
|
|
82
|
+
onValueChange={(id) => setSelectedFunction(functions.find((fn) => fn.id === id) ?? failUndefined())}
|
|
83
|
+
>
|
|
84
|
+
<Select.TriggerButton placeholder='Select value' />
|
|
85
|
+
<Select.Portal>
|
|
86
|
+
<Select.Content>
|
|
87
|
+
<Select.ScrollUpButton />
|
|
88
|
+
<Select.Viewport>
|
|
89
|
+
{functions.map(({ id, binding }) => (
|
|
90
|
+
<Select.Option key={id} value={id}>
|
|
91
|
+
{binding}
|
|
92
|
+
</Select.Option>
|
|
93
|
+
))}
|
|
94
|
+
</Select.Viewport>
|
|
95
|
+
<Select.ScrollDownButton />
|
|
96
|
+
<Select.Arrow />
|
|
97
|
+
</Select.Content>
|
|
98
|
+
</Select.Portal>
|
|
99
|
+
</Select.Root>
|
|
100
|
+
);
|
|
101
|
+
};
|
|
@@ -5,20 +5,11 @@
|
|
|
5
5
|
import React, { useEffect, useRef, useState } from 'react';
|
|
6
6
|
|
|
7
7
|
import { log } from '@dxos/log';
|
|
8
|
-
import {
|
|
9
|
-
Avatar,
|
|
10
|
-
DensityProvider,
|
|
11
|
-
Icon,
|
|
12
|
-
Input,
|
|
13
|
-
type ThemedClassName,
|
|
14
|
-
Toolbar,
|
|
15
|
-
useControlledValue,
|
|
16
|
-
useTranslation,
|
|
17
|
-
} from '@dxos/react-ui';
|
|
8
|
+
import { Avatar, Icon, Input, type ThemedClassName, Toolbar, useControlledValue, useTranslation } from '@dxos/react-ui';
|
|
18
9
|
import { SyntaxHighlighter } from '@dxos/react-ui-syntax-highlighter';
|
|
19
10
|
import { mx } from '@dxos/react-ui-theme';
|
|
20
11
|
|
|
21
|
-
import { SCRIPT_PLUGIN } from '
|
|
12
|
+
import { SCRIPT_PLUGIN } from '../../meta';
|
|
22
13
|
|
|
23
14
|
type State = 'pending' | 'responding';
|
|
24
15
|
|
|
@@ -31,9 +22,16 @@ export type DebugPanelProps = ThemedClassName<{
|
|
|
31
22
|
functionUrl?: string;
|
|
32
23
|
binding?: string;
|
|
33
24
|
onBindingChange?: (binding: string) => void;
|
|
25
|
+
showBindingConfig?: boolean;
|
|
34
26
|
}>;
|
|
35
27
|
|
|
36
|
-
export const DebugPanel = ({
|
|
28
|
+
export const DebugPanel = ({
|
|
29
|
+
classNames,
|
|
30
|
+
functionUrl,
|
|
31
|
+
binding: _binding,
|
|
32
|
+
onBindingChange,
|
|
33
|
+
showBindingConfig = false,
|
|
34
|
+
}: DebugPanelProps) => {
|
|
37
35
|
const { t } = useTranslation(SCRIPT_PLUGIN);
|
|
38
36
|
|
|
39
37
|
const bindingInputRef = useRef<HTMLInputElement>(null);
|
|
@@ -47,7 +45,7 @@ export const DebugPanel = ({ classNames, functionUrl, binding: _binding, onBindi
|
|
|
47
45
|
const [result, setResult] = useState('');
|
|
48
46
|
const [state, setState] = useState<State | null>(null);
|
|
49
47
|
|
|
50
|
-
// TODO(burdon): Persistent history (non-space ECHO data?)
|
|
48
|
+
// TODO(burdon): Persistent history -- at least for session (non-space ECHO data?)
|
|
51
49
|
const [history, setHistory] = useState<Message[]>([]);
|
|
52
50
|
|
|
53
51
|
const scrollerRef = useRef<HTMLDivElement>(null);
|
|
@@ -175,24 +173,24 @@ export const DebugPanel = ({ classNames, functionUrl, binding: _binding, onBindi
|
|
|
175
173
|
};
|
|
176
174
|
|
|
177
175
|
return (
|
|
178
|
-
<
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
<
|
|
182
|
-
|
|
183
|
-
</div>
|
|
176
|
+
<div className={mx('flex flex-col h-full overflow-hidden', classNames)}>
|
|
177
|
+
{/* TODO(burdon): Replace with Thread? */}
|
|
178
|
+
<div ref={scrollerRef} className='flex flex-col gap-6 h-full p-2 overflow-x-hidden overflow-y-auto'>
|
|
179
|
+
<MessageThread state={state} result={result} history={history} />
|
|
180
|
+
</div>
|
|
184
181
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
182
|
+
<Toolbar.Root classNames='p-2'>
|
|
183
|
+
<Input.Root>
|
|
184
|
+
<Input.TextInput
|
|
185
|
+
ref={inputRef}
|
|
186
|
+
autoFocus
|
|
187
|
+
placeholder={t('function request placeholder')}
|
|
188
|
+
value={input}
|
|
189
|
+
onChange={(ev) => setInput(ev.target.value)}
|
|
190
|
+
onKeyDown={(ev) => ev.key === 'Enter' && handleRequest(input)}
|
|
191
|
+
/>
|
|
192
|
+
</Input.Root>
|
|
193
|
+
{showBindingConfig && (
|
|
196
194
|
<Input.Root>
|
|
197
195
|
<Input.TextInput
|
|
198
196
|
ref={bindingInputRef}
|
|
@@ -203,67 +201,74 @@ export const DebugPanel = ({ classNames, functionUrl, binding: _binding, onBindi
|
|
|
203
201
|
onBlur={handleBlur}
|
|
204
202
|
/>
|
|
205
203
|
</Input.Root>
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
</Toolbar.
|
|
213
|
-
</
|
|
214
|
-
</
|
|
204
|
+
)}
|
|
205
|
+
<Toolbar.Button onClick={() => handleRequest(input)}>
|
|
206
|
+
<Icon icon='ph--play--regular' size={4} />
|
|
207
|
+
</Toolbar.Button>
|
|
208
|
+
<Toolbar.Button onClick={() => (state ? handleStop() : handleClear())}>
|
|
209
|
+
<Icon icon={state ? 'ph--stop--regular' : 'ph--trash--regular'} size={4} />
|
|
210
|
+
</Toolbar.Button>
|
|
211
|
+
</Toolbar.Root>
|
|
212
|
+
</div>
|
|
215
213
|
);
|
|
216
214
|
};
|
|
217
215
|
|
|
218
|
-
const RobotAvatar = () => (
|
|
219
|
-
<Avatar.Root size={6} variant='circle'>
|
|
220
|
-
<Avatar.Frame>
|
|
221
|
-
<Avatar.Icon icon='ph--robot--regular' />
|
|
222
|
-
</Avatar.Frame>
|
|
223
|
-
</Avatar.Root>
|
|
224
|
-
);
|
|
225
|
-
|
|
226
|
-
const MessageItem = ({ classNames, message }: ThemedClassName<{ message: Message }>) => {
|
|
227
|
-
const { text, data, error } = message;
|
|
228
|
-
if (error) {
|
|
229
|
-
return <span className={mx(classNames, 'whitespace-pre text-error')}>{String(error)}</span>;
|
|
230
|
-
} else if (data) {
|
|
231
|
-
return (
|
|
232
|
-
<SyntaxHighlighter language='json' className={mx('text-xs', classNames)}>
|
|
233
|
-
{JSON.stringify(data, null, 2)}
|
|
234
|
-
</SyntaxHighlighter>
|
|
235
|
-
);
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
return <span className={mx(classNames)}>{text || '\u00D8'}</span>;
|
|
239
|
-
};
|
|
240
|
-
|
|
241
216
|
// TODO(burdon): Replace with thread?
|
|
242
217
|
// TODO(burdon): Button to delete individual messages.
|
|
243
|
-
// TODO(burdon): Button to re-run question.
|
|
218
|
+
// TODO(burdon): Button to edit/re-run question.
|
|
244
219
|
const MessageThread = ({ state, result, history }: { state: State | null; result: string; history: Message[] }) => {
|
|
245
220
|
return (
|
|
246
221
|
<>
|
|
247
222
|
{history.map((message, i) => (
|
|
248
|
-
<div key={i} className='grid grid-cols-[
|
|
249
|
-
<div>{message.type === 'response' && <RobotAvatar />}</div>
|
|
250
|
-
<div className=
|
|
251
|
-
<MessageItem
|
|
252
|
-
classNames={[message.type === 'request' && 'p-1 px-2 rounded-lg bg-hoverSurface']}
|
|
253
|
-
message={message}
|
|
254
|
-
/>
|
|
223
|
+
<div key={i} className='grid grid-cols-[2rem_1fr_2rem]'>
|
|
224
|
+
<div className='p-1'>{message.type === 'response' && <RobotAvatar />}</div>
|
|
225
|
+
<div className='overflow-auto'>
|
|
226
|
+
<MessageItem message={message} />
|
|
255
227
|
</div>
|
|
256
228
|
</div>
|
|
257
229
|
))}
|
|
258
|
-
|
|
259
|
-
<div>
|
|
260
|
-
|
|
261
|
-
(
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
230
|
+
{result?.length > 0 && (
|
|
231
|
+
<div className='grid grid-cols-[2rem_1fr_2rem]'>
|
|
232
|
+
<div className='p-1'>
|
|
233
|
+
{(state === 'pending' && <Icon icon='ph--spinner--regular' size={6} classNames='animate-spin' />) || (
|
|
234
|
+
<Icon icon='ph--robot--regular' size={6} classNames='animate-[pulse_1s_ease-in-out_infinite]' />
|
|
235
|
+
)}
|
|
236
|
+
</div>
|
|
237
|
+
<div className='overflow-auto'>
|
|
238
|
+
<MessageItem message={{ type: 'response', text: result }} />
|
|
239
|
+
</div>
|
|
265
240
|
</div>
|
|
266
|
-
|
|
241
|
+
)}
|
|
267
242
|
</>
|
|
268
243
|
);
|
|
269
244
|
};
|
|
245
|
+
|
|
246
|
+
const MessageItem = ({ classNames, message }: ThemedClassName<{ message: Message }>) => {
|
|
247
|
+
const { type, text, data, error } = message;
|
|
248
|
+
const wrapper = 'p-1 px-2 rounded-lg bg-hoverSurface overflow-auto';
|
|
249
|
+
return (
|
|
250
|
+
<div className={mx('flex', type === 'request' ? 'ml-[1rem] justify-end' : 'mr-[1rem]', classNames)}>
|
|
251
|
+
{error && <div className={mx(wrapper, 'whitespace-pre text-error')}>{String(error)}</div>}
|
|
252
|
+
|
|
253
|
+
{text !== undefined && (
|
|
254
|
+
<div className={mx(wrapper, type === 'request' && 'bg-primary-400 dark:bg-primary-600')}>
|
|
255
|
+
{text || '\u00D8'}
|
|
256
|
+
</div>
|
|
257
|
+
)}
|
|
258
|
+
|
|
259
|
+
{data && (
|
|
260
|
+
<SyntaxHighlighter language='json' className={mx(wrapper, 'px-8 py-2 text-xs')}>
|
|
261
|
+
{JSON.stringify(data, null, 2)}
|
|
262
|
+
</SyntaxHighlighter>
|
|
263
|
+
)}
|
|
264
|
+
</div>
|
|
265
|
+
);
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
const RobotAvatar = () => (
|
|
269
|
+
<Avatar.Root size={6} variant='circle'>
|
|
270
|
+
<Avatar.Frame>
|
|
271
|
+
<Avatar.Icon icon='ph--robot--regular' />
|
|
272
|
+
</Avatar.Frame>
|
|
273
|
+
</Avatar.Root>
|
|
274
|
+
);
|
|
@@ -11,7 +11,7 @@ import { baseSurface, mx } from '@dxos/react-ui-theme';
|
|
|
11
11
|
import { createProtoRpcPeer } from '@dxos/rpc';
|
|
12
12
|
import { createIFramePort } from '@dxos/rpc-tunnel';
|
|
13
13
|
|
|
14
|
-
import { type BundlerResult } from '
|
|
14
|
+
import { type BundlerResult } from '../../bundler';
|
|
15
15
|
|
|
16
16
|
export type FrameContainerProps = {
|
|
17
17
|
containerUrl: string;
|
|
@@ -3,19 +3,21 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import '@dxos-theme';
|
|
6
|
+
|
|
7
|
+
import { type Meta } from '@storybook/react';
|
|
6
8
|
import React, { useEffect, useMemo } from 'react';
|
|
7
9
|
|
|
8
10
|
import { createSpaceObjectGenerator, TestSchemaType } from '@dxos/echo-generator';
|
|
9
11
|
import { TextType } from '@dxos/plugin-markdown/types';
|
|
10
12
|
import { useClient } from '@dxos/react-client';
|
|
11
|
-
import { create,
|
|
13
|
+
import { create, createObject, useSpaces } from '@dxos/react-client/echo';
|
|
12
14
|
import { withClientProvider } from '@dxos/react-client/testing';
|
|
13
15
|
import { withLayout, withTheme } from '@dxos/storybook-utils';
|
|
14
16
|
|
|
15
|
-
// @ts-ignore
|
|
16
|
-
import mainUrl from './FrameContainer/frame?url';
|
|
17
17
|
import { ScriptBlock } from './ScriptBlock';
|
|
18
18
|
import { ScriptType } from '../../types';
|
|
19
|
+
// @ts-ignore
|
|
20
|
+
import mainUrl from '../FrameContainer/frame?url';
|
|
19
21
|
|
|
20
22
|
const code = [
|
|
21
23
|
"import { Filter, useQuery, useSpaces} from '@dxos/react-client/echo';",
|
|
@@ -29,7 +31,7 @@ const code = [
|
|
|
29
31
|
'}',
|
|
30
32
|
].join('\n');
|
|
31
33
|
|
|
32
|
-
const
|
|
34
|
+
const DefaultStory = () => {
|
|
33
35
|
const client = useClient();
|
|
34
36
|
const spaces = useSpaces();
|
|
35
37
|
console.log(spaces.length);
|
|
@@ -44,28 +46,27 @@ const Story = () => {
|
|
|
44
46
|
[TestSchemaType.organization]: 20,
|
|
45
47
|
[TestSchemaType.contact]: 50,
|
|
46
48
|
})
|
|
47
|
-
.catch();
|
|
49
|
+
.catch(() => {});
|
|
48
50
|
} catch (err) {
|
|
49
51
|
console.log(err);
|
|
50
52
|
}
|
|
51
53
|
}, [client]);
|
|
52
54
|
|
|
53
55
|
// TODO(burdon): Review what's the right way to create automerge-backed objects.
|
|
54
|
-
const object = useMemo(
|
|
55
|
-
() => createEchoObject(create(ScriptType, { source: create(TextType, { content: code }) })),
|
|
56
|
-
[],
|
|
57
|
-
);
|
|
56
|
+
const object = useMemo(() => createObject(create(ScriptType, { source: create(TextType, { content: code }) })), []);
|
|
58
57
|
|
|
59
58
|
// TODO(dmaretskyi): Not sure how to provide `containerUrl` here since the html now lives in composer-app.
|
|
60
59
|
// TODO(burdon): Normalize html/frame.tsx with composer-app to test locally.
|
|
61
60
|
return <ScriptBlock script={object} containerUrl={mainUrl} />;
|
|
62
61
|
};
|
|
63
62
|
|
|
64
|
-
export
|
|
65
|
-
|
|
63
|
+
export const Default = {};
|
|
64
|
+
|
|
65
|
+
const meta: Meta = {
|
|
66
|
+
title: 'plugins/plugin-script/ScriptBlock',
|
|
66
67
|
component: ScriptBlock,
|
|
67
|
-
|
|
68
|
-
|
|
68
|
+
render: DefaultStory,
|
|
69
|
+
decorators: [withClientProvider({ createSpace: true }), withTheme, withLayout({ fullscreen: true, tooltips: true })],
|
|
69
70
|
};
|
|
70
71
|
|
|
71
|
-
export
|
|
72
|
+
export default meta;
|