@dxos/plugin-script 0.8.4-main.dedc0f3 → 0.8.4-main.ead640a
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/dist/lib/browser/DeploymentDialog-65TWT6S5.mjs +13 -0
- package/dist/lib/browser/NotebookContainer-LVGRPFY3.mjs +683 -0
- package/dist/lib/browser/NotebookContainer-LVGRPFY3.mjs.map +7 -0
- package/dist/lib/browser/ScriptContainer-LRTRN7JW.mjs +149 -0
- package/dist/lib/browser/ScriptContainer-LRTRN7JW.mjs.map +7 -0
- package/dist/lib/browser/{app-graph-builder-IABOSTBK.mjs → app-graph-builder-DPYULSME.mjs} +8 -7
- package/dist/lib/browser/app-graph-builder-DPYULSME.mjs.map +7 -0
- package/dist/lib/browser/{blueprint-definition-AR7ITBCD.mjs → blueprint-definition-ET5KZ46I.mjs} +3 -3
- package/dist/lib/browser/{blueprint-definition-AR7ITBCD.mjs.map → blueprint-definition-ET5KZ46I.mjs.map} +1 -1
- package/dist/lib/browser/chunk-5CYLWXRH.mjs +89 -0
- package/dist/lib/browser/chunk-5CYLWXRH.mjs.map +7 -0
- package/dist/lib/browser/chunk-75LH4EUR.mjs +326 -0
- package/dist/lib/browser/chunk-75LH4EUR.mjs.map +7 -0
- package/dist/lib/browser/{chunk-6CAH7VIE.mjs → chunk-E7DXDICD.mjs} +18 -19
- package/dist/lib/browser/chunk-E7DXDICD.mjs.map +7 -0
- package/dist/lib/browser/{chunk-QYAREHGH.mjs → chunk-EZVXV6DA.mjs} +3 -5
- package/dist/lib/browser/chunk-EZVXV6DA.mjs.map +7 -0
- package/dist/lib/browser/{chunk-GZKWMME3.mjs → chunk-I3QSGUFJ.mjs} +122 -32
- package/dist/lib/browser/chunk-I3QSGUFJ.mjs.map +7 -0
- package/dist/lib/browser/{chunk-NXKU3BNX.mjs → chunk-JO2O7W6J.mjs} +39 -7
- package/dist/lib/browser/chunk-JO2O7W6J.mjs.map +7 -0
- package/dist/lib/browser/chunk-N6M34EUC.mjs +112 -0
- package/dist/lib/browser/chunk-N6M34EUC.mjs.map +7 -0
- package/dist/lib/browser/{chunk-YCZPTTFO.mjs → chunk-NM4WQS4F.mjs} +14 -14
- package/dist/lib/browser/chunk-NM4WQS4F.mjs.map +7 -0
- package/dist/lib/browser/{chunk-5TVBECWH.mjs → chunk-OKXN2N7M.mjs} +2 -2
- package/dist/lib/browser/chunk-ST3ACVUC.mjs +88 -0
- package/dist/lib/browser/chunk-ST3ACVUC.mjs.map +7 -0
- package/dist/lib/browser/{compiler-2HJH34GM.mjs → compiler-G2N2CG63.mjs} +5 -5
- package/dist/lib/browser/{compiler-2HJH34GM.mjs.map → compiler-G2N2CG63.mjs.map} +1 -1
- package/dist/lib/browser/index.mjs +107 -36
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/{intent-resolver-F4YSRPJI.mjs → intent-resolver-JLU7DVLQ.mjs} +31 -15
- package/dist/lib/browser/intent-resolver-JLU7DVLQ.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{react-surface-BBHFU6MI.mjs → react-surface-76SDTUYG.mjs} +36 -13
- package/dist/lib/browser/react-surface-76SDTUYG.mjs.map +7 -0
- package/dist/lib/browser/{settings-KCTBK5TY.mjs → settings-ERFKVNUK.mjs} +9 -8
- package/dist/lib/browser/settings-ERFKVNUK.mjs.map +7 -0
- package/dist/lib/browser/templates/index.mjs +1 -1
- package/dist/lib/browser/types/index.mjs +7 -4
- package/dist/lib/node-esm/{DeploymentDialog-G6EHEPXN.mjs → DeploymentDialog-I63ZC2HH.mjs} +6 -5
- package/dist/lib/node-esm/NotebookContainer-QY5NJGJI.mjs +684 -0
- package/dist/lib/node-esm/NotebookContainer-QY5NJGJI.mjs.map +7 -0
- package/dist/lib/node-esm/ScriptContainer-SVXCSLNH.mjs +150 -0
- package/dist/lib/node-esm/ScriptContainer-SVXCSLNH.mjs.map +7 -0
- package/dist/lib/node-esm/{app-graph-builder-CQTTAYHP.mjs → app-graph-builder-UXJGHXSL.mjs} +8 -7
- package/dist/lib/node-esm/app-graph-builder-UXJGHXSL.mjs.map +7 -0
- package/dist/lib/node-esm/{blueprint-definition-TJY4TX6S.mjs → blueprint-definition-AIYFOT7Q.mjs} +3 -3
- package/dist/lib/node-esm/{blueprint-definition-TJY4TX6S.mjs.map → blueprint-definition-AIYFOT7Q.mjs.map} +1 -1
- package/dist/lib/node-esm/chunk-2GVTWESW.mjs +90 -0
- package/dist/lib/node-esm/chunk-2GVTWESW.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-4X375PGY.mjs +90 -0
- package/dist/lib/node-esm/chunk-4X375PGY.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-67OVZHI3.mjs +327 -0
- package/dist/lib/node-esm/chunk-67OVZHI3.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-ZA36GO4T.mjs → chunk-C2ORIPKH.mjs} +14 -14
- package/dist/lib/node-esm/chunk-C2ORIPKH.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-35M3CHYE.mjs → chunk-NUXZQQ6P.mjs} +2 -2
- package/dist/lib/node-esm/{chunk-AHXJ6NQU.mjs → chunk-OG2SIKHE.mjs} +3 -5
- package/dist/lib/node-esm/chunk-OG2SIKHE.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-HUHVIOL5.mjs → chunk-SMFPSKQT.mjs} +122 -32
- package/dist/lib/node-esm/chunk-SMFPSKQT.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-VRSDE4CI.mjs +114 -0
- package/dist/lib/node-esm/chunk-VRSDE4CI.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-2GBESIHU.mjs → chunk-VZAFGLD7.mjs} +18 -19
- package/dist/lib/node-esm/chunk-VZAFGLD7.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-M642JUOZ.mjs → chunk-YW36TZ7K.mjs} +39 -7
- package/dist/lib/node-esm/chunk-YW36TZ7K.mjs.map +7 -0
- package/dist/lib/node-esm/{compiler-7SP27RA6.mjs → compiler-PLDAZ5GJ.mjs} +5 -5
- package/dist/lib/node-esm/{compiler-7SP27RA6.mjs.map → compiler-PLDAZ5GJ.mjs.map} +1 -1
- package/dist/lib/node-esm/index.mjs +107 -36
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/{intent-resolver-CGQYRWWD.mjs → intent-resolver-SFGTIFOG.mjs} +31 -15
- package/dist/lib/node-esm/intent-resolver-SFGTIFOG.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{react-surface-UWIWPKZD.mjs → react-surface-SHEBNW4R.mjs} +36 -13
- package/dist/lib/node-esm/react-surface-SHEBNW4R.mjs.map +7 -0
- package/dist/lib/node-esm/{settings-DXZ334A3.mjs → settings-5TYXQ42N.mjs} +9 -8
- package/dist/lib/node-esm/settings-5TYXQ42N.mjs.map +7 -0
- package/dist/lib/node-esm/templates/index.mjs +1 -1
- package/dist/lib/node-esm/types/index.mjs +7 -4
- package/dist/types/src/ScriptPlugin.d.ts +1 -1
- package/dist/types/src/ScriptPlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/components/DeploymentDialog/DeploymentDialog.d.ts +1 -1
- package/dist/types/src/components/DeploymentDialog/DeploymentDialog.d.ts.map +1 -1
- package/dist/types/src/components/DeploymentDialog/DeploymentDialog.stories.d.ts +111 -5
- package/dist/types/src/components/DeploymentDialog/DeploymentDialog.stories.d.ts.map +1 -1
- package/dist/types/src/components/NotebookContainer.d.ts +10 -0
- package/dist/types/src/components/NotebookContainer.d.ts.map +1 -0
- package/dist/types/src/components/NotebookContainer.stories.d.ts +248 -0
- package/dist/types/src/components/NotebookContainer.stories.d.ts.map +1 -0
- package/dist/types/src/components/NotebookStack/NotebookCell.d.ts +14 -0
- package/dist/types/src/components/NotebookStack/NotebookCell.d.ts.map +1 -0
- package/dist/types/src/components/NotebookStack/NotebookMenu.d.ts +9 -0
- package/dist/types/src/components/NotebookStack/NotebookMenu.d.ts.map +1 -0
- package/dist/types/src/components/NotebookStack/NotebookStack.d.ts +14 -0
- package/dist/types/src/components/NotebookStack/NotebookStack.d.ts.map +1 -0
- package/dist/types/src/components/NotebookStack/NotebookStack.stories.d.ts +248 -0
- package/dist/types/src/components/NotebookStack/NotebookStack.stories.d.ts.map +1 -0
- package/dist/types/src/components/NotebookStack/index.d.ts +3 -0
- package/dist/types/src/components/NotebookStack/index.d.ts.map +1 -0
- package/dist/types/src/components/ScriptContainer.d.ts +2 -2
- package/dist/types/src/components/ScriptContainer.d.ts.map +1 -1
- package/dist/types/src/components/ScriptToolbar/ScriptToolbar.d.ts.map +1 -1
- package/dist/types/src/components/ScriptToolbar/ScriptToolbar.stories.d.ts +239 -1
- package/dist/types/src/components/ScriptToolbar/ScriptToolbar.stories.d.ts.map +1 -1
- package/dist/types/src/components/Settings/ScriptObjectSettings.d.ts.map +1 -1
- package/dist/types/src/components/Settings/ScriptPluginSettings.d.ts +2 -2
- package/dist/types/src/components/Settings/ScriptPluginSettings.d.ts.map +1 -1
- package/dist/types/src/components/TypescriptEditor/TypescriptEditor.d.ts +4 -2
- package/dist/types/src/components/TypescriptEditor/TypescriptEditor.d.ts.map +1 -1
- package/dist/types/src/components/TypescriptEditor/TypescriptEditor.stories.d.ts +3 -3
- package/dist/types/src/components/TypescriptEditor/TypescriptEditor.stories.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +2 -0
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/events.d.ts.map +1 -1
- package/dist/types/src/hooks/deploy.d.ts +6 -6
- package/dist/types/src/hooks/deploy.d.ts.map +1 -1
- package/dist/types/src/hooks/template.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +1 -0
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +0 -1
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/notebook/eval.d.ts +13 -0
- package/dist/types/src/notebook/eval.d.ts.map +1 -0
- package/dist/types/src/notebook/index.d.ts +2 -0
- package/dist/types/src/notebook/index.d.ts.map +1 -0
- package/dist/types/src/notebook/notebook.d.ts +35 -0
- package/dist/types/src/notebook/notebook.d.ts.map +1 -0
- package/dist/types/src/notebook/notebook.test.d.ts +2 -0
- package/dist/types/src/notebook/notebook.test.d.ts.map +1 -0
- package/dist/types/src/notebook/vfs-parser.d.ts +74 -0
- package/dist/types/src/notebook/vfs-parser.d.ts.map +1 -0
- package/dist/types/src/notebook/vfs-parser.test.d.ts +2 -0
- package/dist/types/src/notebook/vfs-parser.test.d.ts.map +1 -0
- package/dist/types/src/templates/chess.d.ts.map +1 -1
- package/dist/types/src/templates/data-generator.d.ts.map +1 -1
- package/dist/types/src/templates/discord.d.ts.map +1 -1
- package/dist/types/src/templates/forex-effect.d.ts.map +1 -1
- package/dist/types/src/templates/forex.d.ts.map +1 -1
- package/dist/types/src/templates/gmail.d.ts.map +1 -1
- package/dist/types/src/templates/index.d.ts +43 -1
- package/dist/types/src/templates/index.d.ts.map +1 -1
- package/dist/types/src/templates/{echo.d.ts → ping.d.ts} +1 -1
- package/dist/types/src/templates/ping.d.ts.map +1 -0
- package/dist/types/src/testing/data.d.ts +19 -0
- package/dist/types/src/testing/data.d.ts.map +1 -0
- package/dist/types/src/testing/index.d.ts +2 -0
- package/dist/types/src/testing/index.d.ts.map +1 -0
- package/dist/types/src/translations.d.ts +27 -2
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/actions.d.ts +66 -0
- package/dist/types/src/types/actions.d.ts.map +1 -0
- package/dist/types/src/types/index.d.ts +1 -0
- package/dist/types/src/types/index.d.ts.map +1 -1
- package/dist/types/src/types/schema.d.ts +54 -31
- package/dist/types/src/types/schema.d.ts.map +1 -1
- package/dist/types/src/util/functions.d.ts +5 -2
- package/dist/types/src/util/functions.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +67 -63
- package/src/ScriptPlugin.tsx +93 -68
- package/src/capabilities/app-graph-builder.ts +4 -3
- package/src/capabilities/artifact-definition.ts +1 -1
- package/src/capabilities/intent-resolver.ts +14 -4
- package/src/capabilities/react-surface.tsx +17 -5
- package/src/capabilities/settings.ts +3 -3
- package/src/components/DeploymentDialog/DeploymentDialog.stories.tsx +6 -4
- package/src/components/DeploymentDialog/DeploymentDialog.tsx +11 -17
- package/src/components/NotebookContainer.stories.tsx +32 -0
- package/src/components/NotebookContainer.tsx +124 -0
- package/src/components/NotebookStack/NotebookCell.tsx +217 -0
- package/src/components/NotebookStack/NotebookMenu.tsx +47 -0
- package/src/components/NotebookStack/NotebookStack.stories.tsx +32 -0
- package/src/components/NotebookStack/NotebookStack.tsx +79 -0
- package/src/components/NotebookStack/index.ts +6 -0
- package/src/components/ScriptContainer.tsx +2 -2
- package/src/components/ScriptToolbar/ScriptToolbar.stories.tsx +17 -5
- package/src/components/ScriptToolbar/ScriptToolbar.tsx +21 -24
- package/src/components/Settings/ScriptObjectSettings.tsx +92 -8
- package/src/components/Settings/ScriptPluginSettings.tsx +4 -19
- package/src/components/TestPanel/TestPanel.tsx +5 -5
- package/src/components/TypescriptEditor/TypescriptEditor.stories.tsx +71 -16
- package/src/components/TypescriptEditor/TypescriptEditor.tsx +29 -24
- package/src/components/index.ts +3 -0
- package/src/events.ts +2 -2
- package/src/hooks/deploy.ts +8 -9
- package/src/hooks/format.ts +2 -2
- package/src/hooks/template.ts +4 -3
- package/src/hooks/useCreateAndDeployScriptTemplates.ts +3 -3
- package/src/index.ts +1 -0
- package/src/meta.ts +2 -4
- package/src/notebook/eval.ts +105 -0
- package/src/notebook/index.ts +5 -0
- package/src/notebook/notebook.test.ts +70 -0
- package/src/notebook/notebook.ts +183 -0
- package/src/notebook/vfs-parser.test.ts +149 -0
- package/src/notebook/vfs-parser.ts +451 -0
- package/src/templates/chess.ts +2 -0
- package/src/templates/data-generator.ts +2 -0
- package/src/templates/discord.ts +9 -1
- package/src/templates/forex-effect.ts +5 -1
- package/src/templates/forex.ts +2 -0
- package/src/templates/gmail.ts +21 -9
- package/src/templates/index.ts +6 -6
- package/src/testing/data.ts +47 -0
- package/src/testing/index.ts +5 -0
- package/src/translations.ts +30 -4
- package/src/types/actions.ts +53 -0
- package/src/types/index.ts +1 -0
- package/src/types/schema.ts +30 -19
- package/src/util/functions.ts +32 -3
- package/dist/lib/browser/DeploymentDialog-QZSTVNIS.mjs +0 -12
- package/dist/lib/browser/ScriptContainer-DNNA6XC6.mjs +0 -265
- package/dist/lib/browser/ScriptContainer-DNNA6XC6.mjs.map +0 -7
- package/dist/lib/browser/app-graph-builder-IABOSTBK.mjs.map +0 -7
- package/dist/lib/browser/chunk-6CAH7VIE.mjs.map +0 -7
- package/dist/lib/browser/chunk-GZKWMME3.mjs.map +0 -7
- package/dist/lib/browser/chunk-IS4OG2UW.mjs +0 -39
- package/dist/lib/browser/chunk-IS4OG2UW.mjs.map +0 -7
- package/dist/lib/browser/chunk-NXKU3BNX.mjs.map +0 -7
- package/dist/lib/browser/chunk-QYAREHGH.mjs.map +0 -7
- package/dist/lib/browser/chunk-RNGIQIEJ.mjs +0 -88
- package/dist/lib/browser/chunk-RNGIQIEJ.mjs.map +0 -7
- package/dist/lib/browser/chunk-YCZPTTFO.mjs.map +0 -7
- package/dist/lib/browser/intent-resolver-F4YSRPJI.mjs.map +0 -7
- package/dist/lib/browser/react-surface-BBHFU6MI.mjs.map +0 -7
- package/dist/lib/browser/settings-KCTBK5TY.mjs.map +0 -7
- package/dist/lib/node-esm/ScriptContainer-KPYZN2KY.mjs +0 -266
- package/dist/lib/node-esm/ScriptContainer-KPYZN2KY.mjs.map +0 -7
- package/dist/lib/node-esm/app-graph-builder-CQTTAYHP.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-2GBESIHU.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-AHXJ6NQU.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-GWHLP5LM.mjs +0 -90
- package/dist/lib/node-esm/chunk-GWHLP5LM.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-HUHVIOL5.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-JIPFLBYA.mjs +0 -40
- package/dist/lib/node-esm/chunk-JIPFLBYA.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-M642JUOZ.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-ZA36GO4T.mjs.map +0 -7
- package/dist/lib/node-esm/intent-resolver-CGQYRWWD.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-UWIWPKZD.mjs.map +0 -7
- package/dist/lib/node-esm/settings-DXZ334A3.mjs.map +0 -7
- package/dist/types/src/templates/echo.d.ts.map +0 -1
- /package/dist/lib/browser/{DeploymentDialog-QZSTVNIS.mjs.map → DeploymentDialog-65TWT6S5.mjs.map} +0 -0
- /package/dist/lib/browser/{chunk-5TVBECWH.mjs.map → chunk-OKXN2N7M.mjs.map} +0 -0
- /package/dist/lib/node-esm/{DeploymentDialog-G6EHEPXN.mjs.map → DeploymentDialog-I63ZC2HH.mjs.map} +0 -0
- /package/dist/lib/node-esm/{chunk-35M3CHYE.mjs.map → chunk-NUXZQQ6P.mjs.map} +0 -0
- /package/src/templates/{echo.ts → ping.ts} +0 -0
|
@@ -5,15 +5,18 @@
|
|
|
5
5
|
import { Octokit } from '@octokit/core';
|
|
6
6
|
import React, { type ChangeEvent, useCallback, useState } from 'react';
|
|
7
7
|
|
|
8
|
+
import { ToolId } from '@dxos/ai';
|
|
8
9
|
import { SettingsAction, createIntent, useIntentDispatcher } from '@dxos/app-framework';
|
|
10
|
+
import { Blueprint, Template } from '@dxos/blueprints';
|
|
9
11
|
import { FunctionType, type ScriptType, getInvocationUrl, getUserFunctionIdInMetadata } from '@dxos/functions';
|
|
10
12
|
import { log } from '@dxos/log';
|
|
11
13
|
import { useClient } from '@dxos/react-client';
|
|
12
14
|
import { Filter, Ref, getMeta, getSpace, useQuery } from '@dxos/react-client/echo';
|
|
13
15
|
import { Button, Clipboard, Input, useAsyncEffect, useControlledState, useTranslation } from '@dxos/react-ui';
|
|
14
16
|
import { DataType } from '@dxos/schema';
|
|
17
|
+
import { kebabize } from '@dxos/util';
|
|
15
18
|
|
|
16
|
-
import {
|
|
19
|
+
import { meta } from '../../meta';
|
|
17
20
|
|
|
18
21
|
export type ScriptObjectSettingsProps = {
|
|
19
22
|
object: ScriptType;
|
|
@@ -23,13 +26,14 @@ export const ScriptObjectSettings = ({ object }: ScriptObjectSettingsProps) => {
|
|
|
23
26
|
return (
|
|
24
27
|
<>
|
|
25
28
|
<Binding object={object} />
|
|
29
|
+
<BlueprintEditor object={object} />
|
|
26
30
|
<Publishing object={object} />
|
|
27
31
|
</>
|
|
28
32
|
);
|
|
29
33
|
};
|
|
30
34
|
|
|
31
35
|
export const ScriptProperties = ({ object }: ScriptObjectSettingsProps) => {
|
|
32
|
-
const { t } = useTranslation(
|
|
36
|
+
const { t } = useTranslation(meta.id);
|
|
33
37
|
return (
|
|
34
38
|
<Input.Root>
|
|
35
39
|
<Input.Label>{t('description label')}</Input.Label>
|
|
@@ -44,8 +48,92 @@ export const ScriptProperties = ({ object }: ScriptObjectSettingsProps) => {
|
|
|
44
48
|
);
|
|
45
49
|
};
|
|
46
50
|
|
|
51
|
+
const BlueprintEditor = ({ object }: ScriptObjectSettingsProps) => {
|
|
52
|
+
const { t } = useTranslation(meta.id);
|
|
53
|
+
const space = getSpace(object);
|
|
54
|
+
const [fn] = useQuery(space, Filter.type(FunctionType, { source: Ref.make(object) }));
|
|
55
|
+
const blueprints = useQuery(space, Filter.type(Blueprint.Blueprint));
|
|
56
|
+
|
|
57
|
+
const [creating, setCreating] = useState(false);
|
|
58
|
+
const [instructions, setInstructions] = useState<string>(`You can run the script "${object.name ?? 'script'}".`);
|
|
59
|
+
const blueprintKey = `dxos.org/blueprint/${kebabize(object.name ?? 'script')}`;
|
|
60
|
+
const existingBlueprint = blueprints.find((bp) => bp.key === blueprintKey);
|
|
61
|
+
|
|
62
|
+
useAsyncEffect(async () => {
|
|
63
|
+
if (!existingBlueprint) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const source = await existingBlueprint.instructions.source.load();
|
|
67
|
+
setInstructions(source.content ?? '');
|
|
68
|
+
}, [existingBlueprint]);
|
|
69
|
+
|
|
70
|
+
const handleSave = useCallback(async () => {
|
|
71
|
+
if (!space) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
setCreating(true);
|
|
76
|
+
try {
|
|
77
|
+
if (existingBlueprint) {
|
|
78
|
+
const text = await existingBlueprint.instructions.source.load();
|
|
79
|
+
text.content = instructions;
|
|
80
|
+
if (fn?.key) {
|
|
81
|
+
const toolId = ToolId.make(fn.key);
|
|
82
|
+
if (!existingBlueprint.tools?.includes(toolId)) {
|
|
83
|
+
existingBlueprint.tools = [...(existingBlueprint.tools ?? []), toolId];
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
} else if (fn?.key) {
|
|
87
|
+
space.db.add(
|
|
88
|
+
Blueprint.make({
|
|
89
|
+
key: blueprintKey,
|
|
90
|
+
name: object.name ?? 'Script',
|
|
91
|
+
instructions: Template.make({
|
|
92
|
+
source: instructions,
|
|
93
|
+
}),
|
|
94
|
+
tools: [ToolId.make(fn.key)],
|
|
95
|
+
}),
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
await space.db.flush();
|
|
99
|
+
} finally {
|
|
100
|
+
setCreating(false);
|
|
101
|
+
}
|
|
102
|
+
}, [space, existingBlueprint, fn, blueprintKey, object.name, instructions]);
|
|
103
|
+
|
|
104
|
+
return (
|
|
105
|
+
<div className='flex flex-col gap-4 mlb-cardSpacingBlock'>
|
|
106
|
+
<div>
|
|
107
|
+
<h2>{t('blueprint editor label', { default: 'Blueprint' })}</h2>
|
|
108
|
+
<p className='text-description text-sm'>
|
|
109
|
+
{t('blueprint editor description', { default: 'Create a blueprint that exposes this script as a tool.' })}
|
|
110
|
+
</p>
|
|
111
|
+
</div>
|
|
112
|
+
<Input.Root>
|
|
113
|
+
<div role='none' className='flex flex-col gap-1'>
|
|
114
|
+
<Input.Label>{t('blueprint instructions label', { default: 'Instructions' })}</Input.Label>
|
|
115
|
+
<Input.TextArea
|
|
116
|
+
placeholder={t('blueprint instructions placeholder', { default: 'Describe how this tool should be used.' })}
|
|
117
|
+
rows={6}
|
|
118
|
+
value={instructions}
|
|
119
|
+
onChange={(event) => setInstructions(event.target.value)}
|
|
120
|
+
classNames='resize-y'
|
|
121
|
+
/>
|
|
122
|
+
</div>
|
|
123
|
+
</Input.Root>
|
|
124
|
+
<div className='flex justify-end gap-2'>
|
|
125
|
+
<Button disabled={(!existingBlueprint && !fn?.key) || creating} onClick={handleSave}>
|
|
126
|
+
{t(creating ? 'creating label' : 'create blueprint label', {
|
|
127
|
+
default: creating ? 'Creating…' : 'Create blueprint',
|
|
128
|
+
})}
|
|
129
|
+
</Button>
|
|
130
|
+
</div>
|
|
131
|
+
</div>
|
|
132
|
+
);
|
|
133
|
+
};
|
|
134
|
+
|
|
47
135
|
const Binding = ({ object }: ScriptObjectSettingsProps) => {
|
|
48
|
-
const { t } = useTranslation(
|
|
136
|
+
const { t } = useTranslation(meta.id);
|
|
49
137
|
const client = useClient();
|
|
50
138
|
const space = getSpace(object);
|
|
51
139
|
const [fn] = useQuery(space, Filter.type(FunctionType, { source: Ref.make(object) }));
|
|
@@ -109,7 +197,7 @@ const Binding = ({ object }: ScriptObjectSettingsProps) => {
|
|
|
109
197
|
|
|
110
198
|
// TODO(burdon): Move to separate tab?
|
|
111
199
|
const Publishing = ({ object }: ScriptObjectSettingsProps) => {
|
|
112
|
-
const { t } = useTranslation(
|
|
200
|
+
const { t } = useTranslation(meta.id);
|
|
113
201
|
const { dispatchPromise: dispatch } = useIntentDispatcher();
|
|
114
202
|
const space = getSpace(object);
|
|
115
203
|
const [githubToken] = useQuery(space, Filter.type(DataType.AccessToken, { source: 'github.com' }));
|
|
@@ -196,7 +284,3 @@ const Publishing = ({ object }: ScriptObjectSettingsProps) => {
|
|
|
196
284
|
</div>
|
|
197
285
|
);
|
|
198
286
|
};
|
|
199
|
-
|
|
200
|
-
// TODO(wittjosiah): Factor out.
|
|
201
|
-
// From https://stackoverflow.com/a/67243723/2804332
|
|
202
|
-
const kebabize = (str: string) => str.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? '-' : '') + $.toLowerCase());
|
|
@@ -4,38 +4,23 @@
|
|
|
4
4
|
|
|
5
5
|
import React from 'react';
|
|
6
6
|
|
|
7
|
-
import { type Credential } from '@dxos/protocols/proto/dxos/halo/credentials';
|
|
8
7
|
import { useClient } from '@dxos/react-client';
|
|
9
8
|
import { Button, Select, useTranslation } from '@dxos/react-ui';
|
|
10
9
|
import { type EditorInputMode, EditorInputModes } from '@dxos/react-ui-editor';
|
|
11
10
|
import { ControlGroup, ControlItemInput, ControlPage, ControlSection } from '@dxos/react-ui-form';
|
|
12
11
|
|
|
13
12
|
import { meta } from '../../meta';
|
|
14
|
-
import { type
|
|
13
|
+
import { type ScriptSettings } from '../../types';
|
|
14
|
+
import { getAccessCredential } from '../../util';
|
|
15
15
|
|
|
16
|
-
export const ScriptPluginSettings = ({ settings }: { settings:
|
|
16
|
+
export const ScriptPluginSettings = ({ settings }: { settings: ScriptSettings }) => {
|
|
17
17
|
const { t } = useTranslation(meta.id);
|
|
18
18
|
const client = useClient();
|
|
19
19
|
|
|
20
20
|
// TODO(burdon): Check token.
|
|
21
21
|
const handleAuthenticate = async () => {
|
|
22
22
|
const { identityKey } = client.halo.identity.get()!;
|
|
23
|
-
await client.halo.writeCredentials([
|
|
24
|
-
{
|
|
25
|
-
issuer: identityKey,
|
|
26
|
-
issuanceDate: new Date(),
|
|
27
|
-
subject: {
|
|
28
|
-
id: identityKey,
|
|
29
|
-
assertion: {
|
|
30
|
-
'@type': 'dxos.halo.credentials.ServiceAccess',
|
|
31
|
-
serverName: 'hub.dxos.network',
|
|
32
|
-
serverKey: identityKey,
|
|
33
|
-
identityKey,
|
|
34
|
-
capabilities: ['composer:beta'],
|
|
35
|
-
},
|
|
36
|
-
},
|
|
37
|
-
} satisfies Credential,
|
|
38
|
-
]);
|
|
23
|
+
await client.halo.writeCredentials([getAccessCredential(identityKey)]);
|
|
39
24
|
};
|
|
40
25
|
|
|
41
26
|
return (
|
|
@@ -9,7 +9,7 @@ import { Avatar, Icon, Input, type ThemedClassName, Toolbar, useTranslation } fr
|
|
|
9
9
|
import { SyntaxHighlighter } from '@dxos/react-ui-syntax-highlighter';
|
|
10
10
|
import { errorText, mx } from '@dxos/react-ui-theme';
|
|
11
11
|
|
|
12
|
-
import {
|
|
12
|
+
import { meta } from '../../meta';
|
|
13
13
|
|
|
14
14
|
type State = 'pending' | 'responding';
|
|
15
15
|
|
|
@@ -24,7 +24,7 @@ export type TestPanelProps = ThemedClassName<{
|
|
|
24
24
|
|
|
25
25
|
// TODO(burdon): Need persistent history (currently lost when switching tabs)..
|
|
26
26
|
export const TestPanel = ({ classNames, functionUrl }: TestPanelProps) => {
|
|
27
|
-
const { t } = useTranslation(
|
|
27
|
+
const { t } = useTranslation(meta.id);
|
|
28
28
|
|
|
29
29
|
const inputRef = useRef<HTMLInputElement>(null);
|
|
30
30
|
const [input, setInput] = useState('');
|
|
@@ -41,7 +41,7 @@ export const TestPanel = ({ classNames, functionUrl }: TestPanelProps) => {
|
|
|
41
41
|
}
|
|
42
42
|
};
|
|
43
43
|
|
|
44
|
-
const controller = useRef<AbortController>();
|
|
44
|
+
const controller = useRef<AbortController>(null);
|
|
45
45
|
useEffect(() => {
|
|
46
46
|
return () => {
|
|
47
47
|
handleStop();
|
|
@@ -50,7 +50,7 @@ export const TestPanel = ({ classNames, functionUrl }: TestPanelProps) => {
|
|
|
50
50
|
|
|
51
51
|
const handleStop = () => {
|
|
52
52
|
controller.current?.abort('stop');
|
|
53
|
-
controller.current =
|
|
53
|
+
controller.current = null;
|
|
54
54
|
};
|
|
55
55
|
|
|
56
56
|
const handleClear = () => {
|
|
@@ -62,7 +62,7 @@ export const TestPanel = ({ classNames, functionUrl }: TestPanelProps) => {
|
|
|
62
62
|
};
|
|
63
63
|
|
|
64
64
|
const handleResponse = ({ text, data, error }: { text?: string; data?: any; error?: Error } = {}) => {
|
|
65
|
-
controller.current =
|
|
65
|
+
controller.current = null;
|
|
66
66
|
setHistory((history) => [...history, { type: 'response', text, data, error } satisfies Message]);
|
|
67
67
|
setResult('');
|
|
68
68
|
setState(null);
|
|
@@ -2,36 +2,91 @@
|
|
|
2
2
|
// Copyright 2023 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import '@dxos-theme';
|
|
6
|
-
|
|
7
5
|
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
8
|
-
import React, { useMemo } from 'react';
|
|
6
|
+
import React, { useCallback, useMemo, useState } from 'react';
|
|
9
7
|
|
|
10
|
-
import { createDocAccessor
|
|
8
|
+
import { createDocAccessor } from '@dxos/react-client/echo';
|
|
9
|
+
import { createObject } from '@dxos/react-client/echo';
|
|
10
|
+
import { Toolbar } from '@dxos/react-ui';
|
|
11
|
+
import { withLayout, withTheme } from '@dxos/react-ui/testing';
|
|
11
12
|
import { createDataExtensions } from '@dxos/react-ui-editor';
|
|
12
|
-
import {
|
|
13
|
+
import { StackItem } from '@dxos/react-ui-stack';
|
|
14
|
+
import { Json } from '@dxos/react-ui-syntax-highlighter';
|
|
15
|
+
import { trim } from '@dxos/util';
|
|
16
|
+
|
|
17
|
+
import { TypescriptEditor, type TypescriptEditorProps } from './TypescriptEditor';
|
|
18
|
+
|
|
19
|
+
const SCRIPT = trim`
|
|
20
|
+
x * 2
|
|
21
|
+
`;
|
|
22
|
+
|
|
23
|
+
const DefaultStory = (props: TypescriptEditorProps) => {
|
|
24
|
+
const object = useMemo(() => createObject({ content: SCRIPT }), []);
|
|
25
|
+
const [result, setResult] = useState<object | undefined>({});
|
|
13
26
|
|
|
14
|
-
|
|
27
|
+
// TODO(burdon): Make this work.
|
|
28
|
+
// const object = useMemo(() => DataType.makeText(templates[1].source), []);
|
|
29
|
+
// const script = useMemo(
|
|
30
|
+
// () =>
|
|
31
|
+
// Obj.make(ScriptType, {
|
|
32
|
+
// source: Ref.make(createObject({ content: templates[0].source })),
|
|
33
|
+
// }),
|
|
34
|
+
// [object],
|
|
35
|
+
// );
|
|
15
36
|
|
|
16
|
-
|
|
37
|
+
const extensions = useMemo(
|
|
38
|
+
() => [createDataExtensions({ id: object.id, text: createDocAccessor(object, ['content']) })],
|
|
39
|
+
[],
|
|
40
|
+
);
|
|
17
41
|
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
42
|
+
const handleRun = useCallback(async () => {
|
|
43
|
+
try {
|
|
44
|
+
const definitions: [string, any][] = [['x', 100]];
|
|
45
|
+
|
|
46
|
+
// eslint-disable-next-line @typescript-eslint/no-implied-eval
|
|
47
|
+
const result = new Function(...definitions.map(([name]) => name), `return ${object.content.trim()}`)(
|
|
48
|
+
...definitions.map(([, value]) => value),
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
setResult({
|
|
52
|
+
timestamp: Date.now(),
|
|
53
|
+
result,
|
|
54
|
+
});
|
|
55
|
+
} catch (err) {
|
|
56
|
+
setResult({
|
|
57
|
+
timestamp: Date.now(),
|
|
58
|
+
error: String(err),
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}, [object]);
|
|
62
|
+
|
|
63
|
+
return (
|
|
64
|
+
<StackItem.Content toolbar>
|
|
65
|
+
{/* <ScriptToolbar script={script} state={{}} /> */}
|
|
66
|
+
<Toolbar.Root>
|
|
67
|
+
<Toolbar.Button onClick={handleRun}>Run</Toolbar.Button>
|
|
68
|
+
</Toolbar.Root>
|
|
69
|
+
<div role='none' className='grid grid-rows-[1fr_min-content] bs-full overflow-hidden text-sm'>
|
|
70
|
+
<TypescriptEditor {...props} initialValue={object.content} extensions={extensions} />
|
|
71
|
+
<Json data={result} classNames='shrink-0 p-2 border-t border-subduedSeparator' />
|
|
72
|
+
</div>
|
|
73
|
+
</StackItem.Content>
|
|
74
|
+
);
|
|
24
75
|
};
|
|
25
76
|
|
|
26
77
|
const meta = {
|
|
27
78
|
title: 'plugins/plugin-script/TypescriptEditor',
|
|
28
|
-
component: TypescriptEditor
|
|
79
|
+
component: TypescriptEditor,
|
|
29
80
|
render: DefaultStory,
|
|
30
|
-
decorators: [withTheme],
|
|
81
|
+
decorators: [withTheme, withLayout({ container: 'column', classNames: 'is-prose' })],
|
|
31
82
|
} satisfies Meta<typeof DefaultStory>;
|
|
32
83
|
|
|
33
84
|
export default meta;
|
|
34
85
|
|
|
35
86
|
type Story = StoryObj<typeof meta>;
|
|
36
87
|
|
|
37
|
-
export const Default: Story = {
|
|
88
|
+
export const Default: Story = {
|
|
89
|
+
args: {
|
|
90
|
+
id: 'test',
|
|
91
|
+
},
|
|
92
|
+
};
|
|
@@ -4,10 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|
import { autocompletion, completionKeymap } from '@codemirror/autocomplete';
|
|
6
6
|
import { javascript } from '@codemirror/lang-javascript';
|
|
7
|
-
import {
|
|
7
|
+
import { HighlightStyle } from '@codemirror/language';
|
|
8
8
|
import { lintKeymap } from '@codemirror/lint';
|
|
9
9
|
import { Prec } from '@codemirror/state';
|
|
10
|
-
import { oneDarkHighlightStyle } from '@codemirror/theme-one-dark';
|
|
11
10
|
import { keymap } from '@codemirror/view';
|
|
12
11
|
import { tags } from '@lezer/highlight';
|
|
13
12
|
import { type VirtualTypeScriptEnvironment } from '@typescript/vfs';
|
|
@@ -15,14 +14,15 @@ import { continueKeymap } from '@valtown/codemirror-continue';
|
|
|
15
14
|
import { type HoverInfo, tsAutocomplete, tsFacet, tsHover, tsLinter, tsSync } from '@valtown/codemirror-ts';
|
|
16
15
|
import React from 'react';
|
|
17
16
|
|
|
18
|
-
import { type ThemeMode, type ThemedClassName, useThemeContext } from '@dxos/react-ui';
|
|
17
|
+
import { Domino, type ThemeMode, type ThemedClassName, useThemeContext } from '@dxos/react-ui';
|
|
19
18
|
import {
|
|
19
|
+
type BasicExtensionsOptions,
|
|
20
20
|
type EditorInputMode,
|
|
21
21
|
InputModeExtensions,
|
|
22
22
|
type UseTextEditorProps,
|
|
23
23
|
createBasicExtensions,
|
|
24
24
|
createThemeExtensions,
|
|
25
|
-
|
|
25
|
+
defaultStyles,
|
|
26
26
|
useTextEditor,
|
|
27
27
|
} from '@dxos/react-ui-editor';
|
|
28
28
|
import { mx } from '@dxos/react-ui-theme';
|
|
@@ -31,18 +31,22 @@ import { isNonNullable } from '@dxos/util';
|
|
|
31
31
|
export type TypescriptEditorProps = ThemedClassName<
|
|
32
32
|
{
|
|
33
33
|
id: string;
|
|
34
|
+
role?: string;
|
|
34
35
|
inputMode?: EditorInputMode;
|
|
35
36
|
toolbar?: boolean;
|
|
36
37
|
env?: VirtualTypeScriptEnvironment;
|
|
38
|
+
options?: BasicExtensionsOptions;
|
|
37
39
|
} & Pick<UseTextEditorProps, 'initialValue' | 'extensions' | 'scrollTo' | 'selection'>
|
|
38
40
|
>;
|
|
39
41
|
|
|
40
42
|
export const TypescriptEditor = ({
|
|
41
43
|
classNames,
|
|
42
44
|
id,
|
|
45
|
+
role = 'article',
|
|
43
46
|
inputMode = 'vscode',
|
|
44
47
|
toolbar,
|
|
45
48
|
env,
|
|
49
|
+
options,
|
|
46
50
|
initialValue,
|
|
47
51
|
extensions,
|
|
48
52
|
scrollTo,
|
|
@@ -63,21 +67,22 @@ export const TypescriptEditor = ({
|
|
|
63
67
|
lineNumbers: true,
|
|
64
68
|
lineWrapping: false,
|
|
65
69
|
monospace: true,
|
|
66
|
-
scrollPastEnd:
|
|
70
|
+
scrollPastEnd: role !== 'section',
|
|
67
71
|
search: true,
|
|
72
|
+
...options,
|
|
68
73
|
}),
|
|
69
74
|
createThemeExtensions({ themeMode, syntaxHighlighting: true }),
|
|
70
75
|
InputModeExtensions[inputMode],
|
|
71
|
-
folding(),
|
|
72
|
-
// Continues block comments when pressing Enter.
|
|
73
|
-
Prec.high(keymap.of(continueKeymap)),
|
|
74
76
|
|
|
75
|
-
// TODO(burdon): Factor out.
|
|
76
77
|
javascript({ typescript: true }),
|
|
77
|
-
// https://github.com/val-town/codemirror-ts
|
|
78
|
-
keymap.of(completionKeymap),
|
|
79
78
|
autocompletion({ override: env ? [tsAutocomplete()] : undefined }),
|
|
79
|
+
|
|
80
|
+
// Continues block comments when pressing Enter.
|
|
81
|
+
Prec.high(keymap.of(continueKeymap)),
|
|
82
|
+
keymap.of(completionKeymap),
|
|
80
83
|
keymap.of(lintKeymap),
|
|
84
|
+
|
|
85
|
+
// https://github.com/val-town/codemirror-ts
|
|
81
86
|
env && [
|
|
82
87
|
tsFacet.of({ env, path: `/src/${id}.ts` }),
|
|
83
88
|
tsSync(),
|
|
@@ -89,6 +94,7 @@ export const TypescriptEditor = ({
|
|
|
89
94
|
[id, extensions, themeMode, inputMode, selection, scrollTo],
|
|
90
95
|
);
|
|
91
96
|
|
|
97
|
+
// TODO(brudon): Use react-ui-editor's Editor component.
|
|
92
98
|
return (
|
|
93
99
|
<div
|
|
94
100
|
ref={parentRef}
|
|
@@ -99,8 +105,9 @@ export const TypescriptEditor = ({
|
|
|
99
105
|
);
|
|
100
106
|
};
|
|
101
107
|
|
|
108
|
+
// TODO(burdon): Factor out (react-ui-editor).
|
|
102
109
|
const createTooltipRenderer = (themeMode: ThemeMode) => {
|
|
103
|
-
const theme = themeMode === 'dark' ?
|
|
110
|
+
const theme = HighlightStyle.define(themeMode === 'dark' ? defaultStyles.dark : defaultStyles.light);
|
|
104
111
|
|
|
105
112
|
const classFromKind = (_kind: string) => {
|
|
106
113
|
// E.g., localName, methodName, parameterName, etc.
|
|
@@ -119,18 +126,16 @@ const createTooltipRenderer = (themeMode: ThemeMode) => {
|
|
|
119
126
|
};
|
|
120
127
|
|
|
121
128
|
return (info: HoverInfo) => {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
return { dom: div };
|
|
129
|
+
return {
|
|
130
|
+
dom: Domino.of('div')
|
|
131
|
+
.classNames('xs:max-is-80 max-is-lg p-1 bg-baseSurface rounded border border-separator')
|
|
132
|
+
.children(
|
|
133
|
+
...(info.quickInfo?.displayParts?.map(({ kind, text }) =>
|
|
134
|
+
Domino.of('span').classNames(classFromKind(kind)).text(text),
|
|
135
|
+
) ?? []),
|
|
136
|
+
)
|
|
137
|
+
.build(),
|
|
138
|
+
};
|
|
134
139
|
};
|
|
135
140
|
};
|
|
136
141
|
|
package/src/components/index.ts
CHANGED
|
@@ -4,9 +4,12 @@
|
|
|
4
4
|
|
|
5
5
|
import { lazy } from 'react';
|
|
6
6
|
|
|
7
|
+
export * from './NotebookStack';
|
|
7
8
|
export * from './Settings';
|
|
8
9
|
export * from './TestPanel';
|
|
10
|
+
|
|
9
11
|
export { DEPLOYMENT_DIALOG } from './DeploymentDialog';
|
|
10
12
|
|
|
11
13
|
export const ScriptContainer = lazy(() => import('./ScriptContainer'));
|
|
12
14
|
export const DeploymentDialog = lazy(() => import('./DeploymentDialog'));
|
|
15
|
+
export const NotebookContainer = lazy(() => import('./NotebookContainer'));
|
package/src/events.ts
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
import { defineEvent } from '@dxos/app-framework';
|
|
6
6
|
|
|
7
|
-
import {
|
|
7
|
+
import { meta } from './meta';
|
|
8
8
|
|
|
9
9
|
export namespace ScriptEvents {
|
|
10
|
-
export const SetupCompiler = defineEvent(`${
|
|
10
|
+
export const SetupCompiler = defineEvent(`${meta.id}/event/setup-compiler`);
|
|
11
11
|
}
|
package/src/hooks/deploy.ts
CHANGED
|
@@ -12,7 +12,7 @@ import { type TFunction } from '@dxos/react-ui';
|
|
|
12
12
|
import { createMenuAction } from '@dxos/react-ui-menu';
|
|
13
13
|
import { errorMessageColors } from '@dxos/react-ui-theme';
|
|
14
14
|
|
|
15
|
-
import {
|
|
15
|
+
import { meta } from '../meta';
|
|
16
16
|
import { deployScript, getFunctionUrl, isScriptDeployed } from '../util';
|
|
17
17
|
|
|
18
18
|
export type DeployActionProperties = { type: 'deploy' } | { type: 'copy' };
|
|
@@ -37,7 +37,7 @@ export type CreateDeployOptions = {
|
|
|
37
37
|
export const createDeploy = ({ state, script, space, fn, client, existingFunctionId, t }: CreateDeployOptions) => {
|
|
38
38
|
// TODO(wittjosiah): Should this be an action?
|
|
39
39
|
const errorItem = createMenuAction('error', () => {}, {
|
|
40
|
-
label: state.error ?? ['no error label', { ns:
|
|
40
|
+
label: state.error ?? ['no error label', { ns: meta.id }],
|
|
41
41
|
icon: 'ph--warning-circle--regular',
|
|
42
42
|
hidden: !state.error,
|
|
43
43
|
classNames: state.error && errorMessageColors,
|
|
@@ -64,7 +64,7 @@ export const createDeploy = ({ state, script, space, fn, client, existingFunctio
|
|
|
64
64
|
},
|
|
65
65
|
{
|
|
66
66
|
type: 'deploy',
|
|
67
|
-
label: [state.deploying ? '
|
|
67
|
+
label: [state.deploying ? 'publishing label' : 'deploy label', { ns: meta.id }],
|
|
68
68
|
icon: state.deploying ? 'ph--spinner-gap--regular' : 'ph--cloud-arrow-up--regular',
|
|
69
69
|
disabled: state.deploying,
|
|
70
70
|
classNames: state.deploying ? '[&_svg]:animate-spin' : '',
|
|
@@ -74,14 +74,13 @@ export const createDeploy = ({ state, script, space, fn, client, existingFunctio
|
|
|
74
74
|
const copyAction = createMenuAction<DeployActionProperties>(
|
|
75
75
|
'copy',
|
|
76
76
|
async () => {
|
|
77
|
-
if (
|
|
78
|
-
|
|
77
|
+
if (state.functionUrl) {
|
|
78
|
+
await navigator.clipboard.writeText(state.functionUrl);
|
|
79
79
|
}
|
|
80
|
-
await navigator.clipboard.writeText(state.functionUrl);
|
|
81
80
|
},
|
|
82
81
|
{
|
|
83
82
|
type: 'copy',
|
|
84
|
-
label: ['copy link label', { ns:
|
|
83
|
+
label: ['copy link label', { ns: meta.id }],
|
|
85
84
|
icon: 'ph--link--regular',
|
|
86
85
|
disabled: !state.functionUrl,
|
|
87
86
|
},
|
|
@@ -117,9 +116,9 @@ export const useDeployState = ({ state, script }: { state: Partial<DeployState>;
|
|
|
117
116
|
};
|
|
118
117
|
|
|
119
118
|
export const useDeployDeps = ({ script }: { script: ScriptType }) => {
|
|
119
|
+
const client = useClient();
|
|
120
120
|
const space = getSpace(script);
|
|
121
121
|
const [fn] = useQuery(space, Query.type(FunctionType, { source: Ref.make(script) }));
|
|
122
|
-
const client = useClient();
|
|
123
122
|
const existingFunctionId = useMemo(() => fn && getUserFunctionIdInMetadata(getMeta(fn)), [fn]);
|
|
124
|
-
return { space, fn,
|
|
123
|
+
return { client, space, fn, existingFunctionId };
|
|
125
124
|
};
|
package/src/hooks/format.ts
CHANGED
|
@@ -10,7 +10,7 @@ import { type ScriptType } from '@dxos/functions';
|
|
|
10
10
|
import { log } from '@dxos/log';
|
|
11
11
|
import { createMenuAction } from '@dxos/react-ui-menu';
|
|
12
12
|
|
|
13
|
-
import {
|
|
13
|
+
import { meta } from '../meta';
|
|
14
14
|
|
|
15
15
|
export type FormatActionProperties = { type: 'format' };
|
|
16
16
|
|
|
@@ -35,7 +35,7 @@ export const createFormat = (script: ScriptType) => {
|
|
|
35
35
|
}
|
|
36
36
|
},
|
|
37
37
|
{
|
|
38
|
-
label: ['format label', { ns:
|
|
38
|
+
label: ['format label', { ns: meta.id }],
|
|
39
39
|
icon: 'ph--magic-wand--regular',
|
|
40
40
|
},
|
|
41
41
|
);
|
package/src/hooks/template.ts
CHANGED
|
@@ -6,14 +6,15 @@ import { Obj } from '@dxos/echo';
|
|
|
6
6
|
import { FUNCTIONS_PRESET_META_KEY, type ScriptType } from '@dxos/functions';
|
|
7
7
|
import { createMenuAction, createMenuItemGroup } from '@dxos/react-ui-menu';
|
|
8
8
|
|
|
9
|
-
import {
|
|
9
|
+
import { meta } from '../meta';
|
|
10
10
|
import { templates } from '../templates';
|
|
11
11
|
|
|
12
12
|
export type TemplateActionProperties = { type: 'template'; value: string };
|
|
13
13
|
|
|
14
14
|
const createTemplateSelectGroup = () => {
|
|
15
|
+
// TODO(burdon): This should not be in the toolbar (move to create Object dialog).
|
|
15
16
|
return createMenuItemGroup('template-select', {
|
|
16
|
-
label: ['template select group label', { ns:
|
|
17
|
+
label: ['template select group label', { ns: meta.id }],
|
|
17
18
|
variant: 'dropdownMenu',
|
|
18
19
|
});
|
|
19
20
|
};
|
|
@@ -30,7 +31,7 @@ const createTemplateSelectActions = (script: ScriptType) => {
|
|
|
30
31
|
if (oldPresetIndex >= 0) {
|
|
31
32
|
metaKeys.splice(oldPresetIndex, 1);
|
|
32
33
|
}
|
|
33
|
-
if (template
|
|
34
|
+
if ('presetId' in template) {
|
|
34
35
|
metaKeys.push({ source: FUNCTIONS_PRESET_META_KEY, id: template.presetId });
|
|
35
36
|
}
|
|
36
37
|
},
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import
|
|
5
|
+
import * as Function from 'effect/Function';
|
|
6
6
|
import { useCallback, useState } from 'react';
|
|
7
7
|
|
|
8
8
|
import { chain, createIntent, useIntentDispatcher } from '@dxos/app-framework';
|
|
@@ -40,8 +40,8 @@ export const useCreateAndDeployScriptTemplates = (space: Space | undefined, scri
|
|
|
40
40
|
const deploymentResults = await Promise.all(
|
|
41
41
|
scriptTemplates.map(async (template) => {
|
|
42
42
|
const result = await dispatch(
|
|
43
|
-
pipe(
|
|
44
|
-
createIntent(ScriptAction.
|
|
43
|
+
Function.pipe(
|
|
44
|
+
createIntent(ScriptAction.CreateScript, { space, initialTemplateId: template.id as any }),
|
|
45
45
|
chain(SpaceAction.AddObject, { target: space }),
|
|
46
46
|
),
|
|
47
47
|
);
|
package/src/index.ts
CHANGED
package/src/meta.ts
CHANGED
|
@@ -4,13 +4,11 @@
|
|
|
4
4
|
|
|
5
5
|
import { type PluginMeta } from '@dxos/app-framework';
|
|
6
6
|
|
|
7
|
-
export const SCRIPT_PLUGIN = 'dxos.org/plugin/script';
|
|
8
|
-
|
|
9
7
|
export const meta: PluginMeta = {
|
|
10
|
-
id:
|
|
8
|
+
id: 'dxos.org/plugin/script',
|
|
11
9
|
name: 'Scripts',
|
|
12
10
|
description:
|
|
13
|
-
'Scripts
|
|
11
|
+
'Scripts enable you to deploy custom functions that run on the edge. These functions can be referenced by your AI agent and called inside of cells in any Sheet. Use scripts to interact with API’s or external data inside of Composer.',
|
|
14
12
|
icon: 'ph--code--regular',
|
|
15
13
|
source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-explorer',
|
|
16
14
|
tags: ['labs'],
|