@dxos/plugin-automation 0.7.4 → 0.7.5-main.937ce75

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 (61) hide show
  1. package/dist/lib/browser/{AssistantPanel-N3QSALKY.mjs → AssistantPanel-32FH2RA6.mjs} +2 -4
  2. package/dist/lib/browser/{AssistantPanel-N3QSALKY.mjs.map → AssistantPanel-32FH2RA6.mjs.map} +2 -2
  3. package/dist/lib/browser/{AutomationPanel-AQMN2CQR.mjs → AutomationPanel-6FUIFUQJ.mjs} +49 -26
  4. package/dist/lib/browser/AutomationPanel-6FUIFUQJ.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-7KB4UMXO.mjs → chunk-DN5M2QL5.mjs} +3 -3
  6. package/dist/lib/browser/{chunk-7KB4UMXO.mjs.map → chunk-DN5M2QL5.mjs.map} +2 -2
  7. package/dist/lib/browser/index.mjs +29 -40
  8. package/dist/lib/browser/index.mjs.map +3 -3
  9. package/dist/lib/browser/meta.json +1 -1
  10. package/dist/lib/browser/types/index.mjs +1 -1
  11. package/dist/lib/node/{AssistantPanel-RIA4TI3B.cjs → AssistantPanel-XANI7YNV.cjs} +5 -7
  12. package/dist/lib/node/{AssistantPanel-RIA4TI3B.cjs.map → AssistantPanel-XANI7YNV.cjs.map} +2 -2
  13. package/dist/lib/node/{AutomationPanel-HZS5WKI5.cjs → AutomationPanel-2UGSAIXU.cjs} +54 -31
  14. package/dist/lib/node/AutomationPanel-2UGSAIXU.cjs.map +7 -0
  15. package/dist/lib/node/{chunk-CUCUWUAF.cjs → chunk-NIL4TP6U.cjs} +5 -5
  16. package/dist/lib/node/{chunk-CUCUWUAF.cjs.map → chunk-NIL4TP6U.cjs.map} +2 -2
  17. package/dist/lib/node/index.cjs +57 -68
  18. package/dist/lib/node/index.cjs.map +3 -3
  19. package/dist/lib/node/meta.json +1 -1
  20. package/dist/lib/node/types/index.cjs +6 -6
  21. package/dist/lib/node/types/index.cjs.map +1 -1
  22. package/dist/lib/node-esm/{AssistantPanel-72YH43CH.mjs → AssistantPanel-5M6O6JV7.mjs} +2 -4
  23. package/dist/lib/node-esm/{AssistantPanel-72YH43CH.mjs.map → AssistantPanel-5M6O6JV7.mjs.map} +2 -2
  24. package/dist/lib/node-esm/{AutomationPanel-JUHOWQWW.mjs → AutomationPanel-72C2JRLV.mjs} +49 -26
  25. package/dist/lib/node-esm/AutomationPanel-72C2JRLV.mjs.map +7 -0
  26. package/dist/lib/node-esm/{chunk-23LY7DYS.mjs → chunk-GCHXTXVT.mjs} +3 -3
  27. package/dist/lib/node-esm/{chunk-23LY7DYS.mjs.map → chunk-GCHXTXVT.mjs.map} +2 -2
  28. package/dist/lib/node-esm/index.mjs +29 -40
  29. package/dist/lib/node-esm/index.mjs.map +3 -3
  30. package/dist/lib/node-esm/meta.json +1 -1
  31. package/dist/lib/node-esm/types/index.mjs +1 -1
  32. package/dist/types/src/AutomationPlugin.d.ts.map +1 -1
  33. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts +1 -1
  34. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts.map +1 -1
  35. package/dist/types/src/components/AutomationPanel/AutomationPanel.stories.d.ts.map +1 -1
  36. package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts.map +1 -1
  37. package/dist/types/src/components/TriggerEditor/TriggerEditor.stories.d.ts.map +1 -1
  38. package/dist/types/src/components/index.d.ts +1 -1
  39. package/dist/types/src/components/index.d.ts.map +1 -1
  40. package/dist/types/src/hooks/email.d.ts.map +1 -1
  41. package/dist/types/src/hooks/invocation-handler.d.ts.map +1 -1
  42. package/dist/types/src/translations.d.ts +1 -0
  43. package/dist/types/src/translations.d.ts.map +1 -1
  44. package/dist/types/src/types/schema.d.ts +31 -39
  45. package/dist/types/src/types/schema.d.ts.map +1 -1
  46. package/dist/types/tsconfig.tsbuildinfo +1 -0
  47. package/package.json +38 -38
  48. package/src/AutomationPlugin.tsx +20 -22
  49. package/src/components/AssistantPanel/AssistantPanel.tsx +1 -1
  50. package/src/components/AutomationPanel/AutomationPanel.stories.tsx +1 -2
  51. package/src/components/AutomationPanel/AutomationPanel.tsx +61 -29
  52. package/src/components/PromptEditor/PromptEditor.stories.tsx +3 -3
  53. package/src/components/TriggerEditor/TriggerEditor.stories.tsx +1 -2
  54. package/src/components/TriggerEditor/TriggerEditor.tsx +9 -3
  55. package/src/hooks/email.ts +2 -2
  56. package/src/hooks/invocation-handler.ts +2 -2
  57. package/src/translations.ts +1 -0
  58. package/src/types/schema.ts +2 -2
  59. package/dist/lib/browser/AutomationPanel-AQMN2CQR.mjs.map +0 -7
  60. package/dist/lib/node/AutomationPanel-HZS5WKI5.cjs.map +0 -7
  61. package/dist/lib/node-esm/AutomationPanel-JUHOWQWW.mjs.map +0 -7
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/plugin-automation",
3
- "version": "0.7.4",
3
+ "version": "0.7.5-main.937ce75",
4
4
  "description": "Prompt chain plugin",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -47,36 +47,36 @@
47
47
  "@effect/schema": "^0.75.5",
48
48
  "@preact/signals-core": "^1.6.0",
49
49
  "lodash.get": "^4.4.2",
50
- "@dxos/app-framework": "0.7.4",
51
- "@dxos/assistant": "0.7.4",
52
- "@dxos/async": "0.7.4",
53
- "@dxos/chain": "0.7.4",
54
- "@dxos/context": "0.7.4",
55
- "@dxos/echo-db": "0.7.4",
56
- "@dxos/echo-schema": "0.7.4",
57
- "@dxos/functions": "0.7.4",
58
- "@dxos/invariant": "0.7.4",
59
- "@dxos/keys": "0.7.4",
60
- "@dxos/live-object": "0.7.4",
61
- "@dxos/log": "0.7.4",
62
- "@dxos/plugin-chess": "0.7.4",
63
- "@dxos/plugin-client": "0.7.4",
64
- "@dxos/plugin-deck": "0.7.4",
65
- "@dxos/plugin-graph": "0.7.4",
66
- "@dxos/plugin-inbox": "0.7.4",
67
- "@dxos/plugin-ipfs": "0.7.4",
68
- "@dxos/plugin-script": "0.7.4",
69
- "@dxos/plugin-markdown": "0.7.4",
70
- "@dxos/plugin-sketch": "0.7.4",
71
- "@dxos/plugin-space": "0.7.4",
72
- "@dxos/plugin-stack": "0.7.4",
73
- "@dxos/react-client": "0.7.4",
74
- "@dxos/react-ui-editor": "0.7.4",
75
- "@dxos/react-ui-form": "0.7.4",
76
- "@dxos/react-ui-list": "0.7.4",
77
- "@dxos/react-ui-syntax-highlighter": "0.7.4",
78
- "@dxos/schema": "0.7.4",
79
- "@dxos/util": "0.7.4"
50
+ "@dxos/async": "0.7.5-main.937ce75",
51
+ "@dxos/app-framework": "0.7.5-main.937ce75",
52
+ "@dxos/assistant": "0.7.5-main.937ce75",
53
+ "@dxos/compute": "0.7.5-main.937ce75",
54
+ "@dxos/context": "0.7.5-main.937ce75",
55
+ "@dxos/echo-db": "0.7.5-main.937ce75",
56
+ "@dxos/echo-schema": "0.7.5-main.937ce75",
57
+ "@dxos/functions": "0.7.5-main.937ce75",
58
+ "@dxos/keys": "0.7.5-main.937ce75",
59
+ "@dxos/invariant": "0.7.5-main.937ce75",
60
+ "@dxos/live-object": "0.7.5-main.937ce75",
61
+ "@dxos/log": "0.7.5-main.937ce75",
62
+ "@dxos/plugin-chess": "0.7.5-main.937ce75",
63
+ "@dxos/plugin-deck": "0.7.5-main.937ce75",
64
+ "@dxos/plugin-client": "0.7.5-main.937ce75",
65
+ "@dxos/plugin-ipfs": "0.7.5-main.937ce75",
66
+ "@dxos/plugin-graph": "0.7.5-main.937ce75",
67
+ "@dxos/plugin-inbox": "0.7.5-main.937ce75",
68
+ "@dxos/plugin-script": "0.7.5-main.937ce75",
69
+ "@dxos/plugin-space": "0.7.5-main.937ce75",
70
+ "@dxos/plugin-markdown": "0.7.5-main.937ce75",
71
+ "@dxos/plugin-sketch": "0.7.5-main.937ce75",
72
+ "@dxos/plugin-stack": "0.7.5-main.937ce75",
73
+ "@dxos/react-client": "0.7.5-main.937ce75",
74
+ "@dxos/react-ui-editor": "0.7.5-main.937ce75",
75
+ "@dxos/react-ui-form": "0.7.5-main.937ce75",
76
+ "@dxos/react-ui-list": "0.7.5-main.937ce75",
77
+ "@dxos/react-ui-syntax-highlighter": "0.7.5-main.937ce75",
78
+ "@dxos/util": "0.7.5-main.937ce75",
79
+ "@dxos/schema": "0.7.5-main.937ce75"
80
80
  },
81
81
  "devDependencies": {
82
82
  "@phosphor-icons/react": "^2.1.5",
@@ -86,18 +86,18 @@
86
86
  "react": "~18.2.0",
87
87
  "react-dom": "~18.2.0",
88
88
  "vite": "5.4.7",
89
- "@dxos/random": "0.7.4",
90
- "@dxos/echo-db": "0.7.4",
91
- "@dxos/react-ui": "0.7.4",
92
- "@dxos/react-ui-theme": "0.7.4",
93
- "@dxos/storybook-utils": "0.7.4"
89
+ "@dxos/echo-db": "0.7.5-main.937ce75",
90
+ "@dxos/random": "0.7.5-main.937ce75",
91
+ "@dxos/react-ui": "0.7.5-main.937ce75",
92
+ "@dxos/react-ui-theme": "0.7.5-main.937ce75",
93
+ "@dxos/storybook-utils": "0.7.5-main.937ce75"
94
94
  },
95
95
  "peerDependencies": {
96
96
  "@phosphor-icons/react": "^2.1.5",
97
97
  "react": "~18.2.0",
98
98
  "react-dom": "~18.2.0",
99
- "@dxos/react-ui": "0.7.4",
100
- "@dxos/react-ui-theme": "0.7.4"
99
+ "@dxos/react-ui": "0.7.5-main.937ce75",
100
+ "@dxos/react-ui-theme": "0.7.5-main.937ce75"
101
101
  },
102
102
  "publishConfig": {
103
103
  "access": "public"
@@ -4,18 +4,19 @@
4
4
 
5
5
  import React from 'react';
6
6
 
7
- import { parseMetadataResolverPlugin, type PluginDefinition, resolvePlugin } from '@dxos/app-framework';
7
+ import { createSurface, parseMetadataResolverPlugin, type PluginDefinition, resolvePlugin } from '@dxos/app-framework';
8
8
  import { FunctionTrigger } from '@dxos/functions';
9
9
  import { invariant } from '@dxos/invariant';
10
- import { parseClientPlugin } from '@dxos/plugin-client';
10
+ import { parseClientPlugin } from '@dxos/plugin-client/types';
11
11
  import { createExtension, toSignal } from '@dxos/plugin-graph';
12
12
  import { memoizeQuery } from '@dxos/plugin-space';
13
13
  import {
14
14
  getSpace,
15
15
  getTypename,
16
16
  isEchoObject,
17
- loadObjectReferences,
18
17
  parseId,
18
+ type ReactiveEchoObject,
19
+ RefArray,
19
20
  SpaceState,
20
21
  } from '@dxos/react-client/echo';
21
22
  import { translations as formTranslations } from '@dxos/react-ui-form';
@@ -35,7 +36,7 @@ export const AutomationPlugin = (): PluginDefinition<AutomationPluginProvides> =
35
36
  placeholder: ['object placeholder', { ns: AUTOMATION_PLUGIN }],
36
37
  icon: 'ph--magic-wand--regular',
37
38
  // TODO(wittjosiah): Move out of metadata.
38
- loadReferences: (chain: ChainType) => loadObjectReferences(chain, (chain) => chain.prompts),
39
+ loadReferences: async (chain: ChainType) => await RefArray.loadAll(chain.prompts ?? []),
39
40
  },
40
41
  },
41
42
  },
@@ -182,26 +183,23 @@ export const AutomationPlugin = (): PluginDefinition<AutomationPluginProvides> =
182
183
  },
183
184
  },
184
185
  surface: {
185
- component: ({ data, role }) => {
186
- switch (role) {
187
- case 'complementary--assistant':
188
- return <AssistantPanel subject={data.subject as any} />;
189
- case 'complementary--automation': {
190
- const object = data.subject;
191
- const space = isEchoObject(object) ? getSpace(object) : undefined;
192
- if (space) {
193
- invariant(isEchoObject(object));
194
- return <AutomationPanel space={space} object={object} />;
195
- }
196
- break;
197
- }
198
- }
199
-
200
- return null;
201
- },
186
+ definitions: () => [
187
+ createSurface({
188
+ id: `${AUTOMATION_PLUGIN}/assistant`,
189
+ role: 'complementary--assistant',
190
+ component: ({ data }) => <AssistantPanel subject={data.subject} />,
191
+ }),
192
+ createSurface({
193
+ id: `${AUTOMATION_PLUGIN}/automation`,
194
+ role: 'complementary--automation',
195
+ filter: (data): data is { subject: ReactiveEchoObject<any> } =>
196
+ isEchoObject(data.subject) && !!getSpace(data.subject),
197
+ component: ({ data }) => <AutomationPanel space={getSpace(data.subject)!} object={data.subject} />,
198
+ }),
199
+ ],
202
200
  },
203
201
  intent: {
204
- resolver: (intent) => {},
202
+ resolvers: () => [],
205
203
  },
206
204
  },
207
205
  };
@@ -146,7 +146,7 @@ export const AssistantPanel = ({ subject, classNames }: AssistantPanelProps) =>
146
146
  </Toolbar.Button>
147
147
  </ContextMenu.Trigger>
148
148
  <ContextMenu.Portal>
149
- <ContextMenu.Content classNames='z-[31]'>
149
+ <ContextMenu.Content>
150
150
  <ContextMenu.Viewport>
151
151
  <ContextMenu.Item onClick={clearThread}>Clear thread</ContextMenu.Item>
152
152
  <ContextMenu.Item onClick={async () => console.log(await getSystemPrompt())}>
@@ -7,8 +7,7 @@ import '@dxos-theme';
7
7
  import { type Meta } from '@storybook/react';
8
8
  import React from 'react';
9
9
 
10
- import { FunctionTrigger } from '@dxos/functions';
11
- import { FunctionType } from '@dxos/plugin-script/types';
10
+ import { FunctionType, FunctionTrigger } from '@dxos/functions';
12
11
  import { create, useSpaces } from '@dxos/react-client/echo';
13
12
  import { withClientProvider } from '@dxos/react-client/testing';
14
13
  import { withLayout, withTheme } from '@dxos/storybook-utils';
@@ -5,8 +5,14 @@
5
5
  import React, { useState } from 'react';
6
6
 
7
7
  import { S } from '@dxos/echo-schema';
8
- import { FunctionTriggerSchema, FunctionTrigger, type FunctionTriggerType } from '@dxos/functions';
9
- import { FunctionType, ScriptType } from '@dxos/plugin-script';
8
+ import {
9
+ FunctionType,
10
+ FunctionTrigger,
11
+ FunctionTriggerSchema,
12
+ TriggerKind,
13
+ type FunctionTriggerType,
14
+ ScriptType,
15
+ } from '@dxos/functions';
10
16
  import { type Client, useClient } from '@dxos/react-client';
11
17
  import { create, Filter, useQuery, type Space, type ReactiveObject, getSpace } from '@dxos/react-client/echo';
12
18
  import { IconButton, Input, useTranslation, Button } from '@dxos/react-ui';
@@ -24,7 +30,7 @@ export type AutomationPanelProps = {
24
30
  };
25
31
 
26
32
  // TODO(burdon): Factor out common layout with ViewEditor.
27
- export const AutomationPanel = ({ space }: AutomationPanelProps) => {
33
+ export const AutomationPanel = ({ space, object }: AutomationPanelProps) => {
28
34
  const { t } = useTranslation(AUTOMATION_PLUGIN);
29
35
  const client = useClient();
30
36
  const triggers = useQuery(space, Filter.schema(FunctionTrigger));
@@ -55,7 +61,13 @@ export const AutomationPanel = ({ space }: AutomationPanelProps) => {
55
61
  if (selected) {
56
62
  Object.assign(selected, trigger);
57
63
  } else {
58
- space.db.add(create(FunctionTrigger, trigger));
64
+ const automationTargetId = object?.id;
65
+ space.db.add(
66
+ create(
67
+ FunctionTrigger,
68
+ automationTargetId ? { ...trigger, meta: { ...trigger.meta, automationTargetId } } : trigger,
69
+ ),
70
+ );
59
71
  }
60
72
 
61
73
  setTrigger(undefined);
@@ -71,30 +83,38 @@ export const AutomationPanel = ({ space }: AutomationPanelProps) => {
71
83
  <List.Root<FunctionTrigger> items={triggers} isItem={S.is(FunctionTrigger)} getId={(field) => field.id}>
72
84
  {({ items: triggers }) => (
73
85
  <div role='list' className='flex flex-col w-full'>
74
- {triggers?.map((trigger) => (
75
- <List.Item<FunctionTrigger>
76
- key={trigger.id}
77
- item={trigger}
78
- classNames={mx(grid, ghostHover, 'items-center')}
79
- >
80
- <Input.Root>
81
- <Input.Switch checked={trigger.enabled} onCheckedChange={(checked) => (trigger.enabled = checked)} />
82
- </Input.Root>
83
-
84
- <div className={'flex'}>
85
- <List.ItemTitle classNames='px-2 cursor-pointer w-0 shrink' onClick={() => handleSelect(trigger)}>
86
- {getFunctionName(scripts, functions, trigger)}
87
- </List.ItemTitle>
88
-
89
- {/* TODO: a better way to expose URL copy action */}
90
- <Button onClick={() => navigator.clipboard.writeText(getWebhookUrl(client, trigger))}>
91
- Copy URL
92
- </Button>
93
- </div>
94
-
95
- <List.ItemDeleteButton onClick={() => handleDelete(trigger)} />
96
- </List.Item>
97
- ))}
86
+ {triggers?.map((trigger) => {
87
+ const copyAction = getCopyAction(client, trigger);
88
+ return (
89
+ <List.Item<FunctionTrigger>
90
+ key={trigger.id}
91
+ item={trigger}
92
+ classNames={mx(grid, ghostHover, 'items-center')}
93
+ >
94
+ <Input.Root>
95
+ <Input.Switch
96
+ checked={trigger.enabled}
97
+ onCheckedChange={(checked) => (trigger.enabled = checked)}
98
+ />
99
+ </Input.Root>
100
+
101
+ <div className={'flex'}>
102
+ <List.ItemTitle classNames='px-2 cursor-pointer w-0 shrink' onClick={() => handleSelect(trigger)}>
103
+ {getFunctionName(scripts, functions, trigger)}
104
+ </List.ItemTitle>
105
+
106
+ {/* TODO: a better way to expose URL copy action */}
107
+ {copyAction && (
108
+ <Button onClick={() => navigator.clipboard.writeText(copyAction.contentProvider())}>
109
+ {copyAction.text}
110
+ </Button>
111
+ )}
112
+ </div>
113
+
114
+ <List.ItemDeleteButton onClick={() => handleDelete(trigger)} />
115
+ </List.Item>
116
+ );
117
+ })}
98
118
  </div>
99
119
  )}
100
120
  </List.Root>
@@ -118,6 +138,18 @@ export const AutomationPanel = ({ space }: AutomationPanelProps) => {
118
138
  );
119
139
  };
120
140
 
141
+ const getCopyAction = (client: Client, trigger: FunctionTrigger | undefined) => {
142
+ if (trigger?.spec?.type === TriggerKind.Email) {
143
+ return { text: 'Copy Email', contentProvider: () => `${getSpace(trigger)!.id}@dxos.network` };
144
+ }
145
+
146
+ if (trigger?.spec?.type === TriggerKind.Webhook) {
147
+ return { text: 'Copy URL', contentProvider: () => getWebhookUrl(client, trigger) };
148
+ }
149
+
150
+ return undefined;
151
+ };
152
+
121
153
  const getWebhookUrl = (client: Client, trigger: FunctionTrigger) => {
122
154
  const spaceId = getSpace(trigger)!.id;
123
155
  const edgeUrl = new URL(client.config.values.runtime!.services!.edge!.url!);
@@ -131,5 +163,5 @@ const getFunctionName = (scripts: ScriptType[], functions: FunctionType[], trigg
131
163
  if (!functionObject) {
132
164
  return trigger.function;
133
165
  }
134
- return scripts.find((s) => functionObject.source?.id === s.id)?.name ?? functionObject.name;
166
+ return scripts.find((s) => functionObject.source?.target?.id === s.id)?.name ?? functionObject.name;
135
167
  };
@@ -7,7 +7,7 @@ import '@dxos-theme';
7
7
  import { type Meta } from '@storybook/react';
8
8
  import React, { useState } from 'react';
9
9
 
10
- import { create } from '@dxos/live-object';
10
+ import { create, makeRef } from '@dxos/live-object';
11
11
  import { useClient } from '@dxos/react-client';
12
12
  import { withClientProvider } from '@dxos/react-client/testing';
13
13
  import { withLayout, withTheme } from '@dxos/storybook-utils';
@@ -34,14 +34,14 @@ const DefaultStory = () => {
34
34
  const space = client.spaces.default;
35
35
  return space.db.add(
36
36
  create(ChainType, {
37
- prompts: [create(ChainPromptType, { command: 'test', template, inputs: [] })],
37
+ prompts: [makeRef(create(ChainPromptType, { command: 'test', template, inputs: [] }))],
38
38
  }),
39
39
  );
40
40
  });
41
41
 
42
42
  return (
43
43
  <div role='none' className='flex w-[350px] border border-separator overflow-hidden'>
44
- <PromptEditor prompt={chain.prompts![0]!} />
44
+ <PromptEditor prompt={chain.prompts![0]!.target!} />
45
45
  </div>
46
46
  );
47
47
  };
@@ -7,9 +7,8 @@ import '@dxos-theme';
7
7
  import { type Meta } from '@storybook/react';
8
8
  import React, { useEffect, useState } from 'react';
9
9
 
10
- import { FunctionTrigger, TriggerKind } from '@dxos/functions';
10
+ import { FunctionType, FunctionTrigger, TriggerKind } from '@dxos/functions';
11
11
  import { create } from '@dxos/live-object';
12
- import { FunctionType } from '@dxos/plugin-script/types';
13
12
  import { useSpaces } from '@dxos/react-client/echo';
14
13
  import { withClientProvider } from '@dxos/react-client/testing';
15
14
  import { withLayout, withTheme } from '@dxos/storybook-utils';
@@ -4,8 +4,14 @@
4
4
 
5
5
  import React from 'react';
6
6
 
7
- import { FunctionTriggerSchema, type FunctionTriggerType, type FunctionTrigger, TriggerKind } from '@dxos/functions';
8
- import { FunctionType, ScriptType } from '@dxos/plugin-script/types';
7
+ import {
8
+ FunctionType,
9
+ FunctionTriggerSchema,
10
+ type FunctionTriggerType,
11
+ type FunctionTrigger,
12
+ ScriptType,
13
+ TriggerKind,
14
+ } from '@dxos/functions';
9
15
  import { Filter, useQuery, type Space } from '@dxos/react-client/echo';
10
16
  import { useTranslation } from '@dxos/react-ui';
11
17
  import { Form, SelectInput } from '@dxos/react-ui-form';
@@ -61,5 +67,5 @@ export const TriggerEditor = ({ space, trigger, onSave, onCancel, storedTrigger
61
67
  };
62
68
 
63
69
  const getFunctionName = (scripts: ScriptType[], fn: FunctionType) => {
64
- return scripts.find((s) => fn.source?.id === s.id)?.name ?? fn.name;
70
+ return scripts.find((s) => fn.source?.target?.id === s.id)?.name ?? fn.name;
65
71
  };
@@ -7,7 +7,7 @@ import { foreignKey } from '@dxos/echo-schema';
7
7
  import { log } from '@dxos/log';
8
8
  import { MailboxType } from '@dxos/plugin-inbox/types';
9
9
  import { MessageType } from '@dxos/plugin-space/types';
10
- import { type Space, Filter, create } from '@dxos/react-client/echo';
10
+ import { type Space, Filter, create, makeRef } from '@dxos/react-client/echo';
11
11
 
12
12
  export const SOURCE_ID = 'hub.dxos.network/api/mailbox';
13
13
 
@@ -41,7 +41,7 @@ export const handleEmail = async (space: Space, data: any) => {
41
41
  },
42
42
  ),
43
43
  );
44
- mailbox.messages?.push(object);
44
+ mailbox.messages?.push(makeRef(object));
45
45
  }
46
46
  }
47
47
 
@@ -4,12 +4,12 @@
4
4
 
5
5
  import { sleep } from '@dxos/async';
6
6
  import { getObjectCore, ResultFormat } from '@dxos/echo-db';
7
- import type { AnyObjectData } from '@dxos/echo-schema';
7
+ import { type AnyObjectData } from '@dxos/echo-schema';
8
+ import { FunctionType } from '@dxos/functions';
8
9
  import { type FunctionTrigger } from '@dxos/functions';
9
10
  import { invariant } from '@dxos/invariant';
10
11
  import { DXN, LOCAL_SPACE_TAG } from '@dxos/keys';
11
12
  import { log } from '@dxos/log';
12
- import { FunctionType } from '@dxos/plugin-script';
13
13
  import { type Client, type Config } from '@dxos/react-client';
14
14
  import { type Space } from '@dxos/react-client/echo';
15
15
 
@@ -29,6 +29,7 @@ export default [
29
29
  'trigger type webhook': 'Webhook',
30
30
  'trigger type websocket': 'Websocket',
31
31
  'trigger type subscription': 'Subscription',
32
+ 'trigger type email': 'Email',
32
33
 
33
34
  'trigger filter': 'Filter',
34
35
  'trigger cron': 'Cron',
@@ -2,7 +2,7 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { ref, S, TypedObject } from '@dxos/echo-schema';
5
+ import { Ref, S, TypedObject } from '@dxos/echo-schema';
6
6
 
7
7
  // TODO(burdon): Change to S.Literal (and discriminated union).
8
8
  export enum ChainInputType {
@@ -34,5 +34,5 @@ export class ChainPromptType extends TypedObject({ typename: 'dxos.org/type/Chai
34
34
 
35
35
  export class ChainType extends TypedObject({ typename: 'dxos.org/type/Chain', version: '0.1.0' })({
36
36
  name: S.optional(S.String),
37
- prompts: S.optional(S.mutable(S.Array(ref(ChainPromptType)))),
37
+ prompts: S.optional(S.mutable(S.Array(Ref(ChainPromptType)))),
38
38
  }) {}
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/components/AutomationPanel/AutomationPanel.tsx", "../../../src/components/TriggerEditor/TriggerEditor.tsx", "../../../src/components/AutomationPanel/index.ts"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useState } from 'react';\n\nimport { S } from '@dxos/echo-schema';\nimport { FunctionTriggerSchema, FunctionTrigger, type FunctionTriggerType } from '@dxos/functions';\nimport { FunctionType, ScriptType } from '@dxos/plugin-script';\nimport { type Client, useClient } from '@dxos/react-client';\nimport { create, Filter, useQuery, type Space, type ReactiveObject, getSpace } from '@dxos/react-client/echo';\nimport { IconButton, Input, useTranslation, Button } from '@dxos/react-ui';\nimport { List } from '@dxos/react-ui-list';\nimport { ghostHover, mx } from '@dxos/react-ui-theme';\n\nimport { AUTOMATION_PLUGIN } from '../../meta';\nimport { TriggerEditor, type TriggerEditorProps } from '../TriggerEditor';\n\nconst grid = 'grid grid-cols-[40px_1fr_32px] min-bs-[2.5rem]';\n\nexport type AutomationPanelProps = {\n space: Space;\n object?: ReactiveObject<any>;\n};\n\n// TODO(burdon): Factor out common layout with ViewEditor.\nexport const AutomationPanel = ({ space }: AutomationPanelProps) => {\n const { t } = useTranslation(AUTOMATION_PLUGIN);\n const client = useClient();\n const triggers = useQuery(space, Filter.schema(FunctionTrigger));\n const functions = useQuery(space, Filter.schema(FunctionType));\n const scripts = useQuery(space, Filter.schema(ScriptType));\n\n const [trigger, setTrigger] = useState<FunctionTriggerType>();\n const [selected, setSelected] = useState<FunctionTrigger>();\n\n const handleSelect = (trigger: FunctionTrigger) => {\n const { id: _, ...values } = trigger;\n setTrigger(values);\n setSelected(trigger);\n };\n\n const handleAdd = () => {\n setTrigger(create(FunctionTriggerSchema, {}));\n setSelected(undefined);\n };\n\n const handleDelete = (trigger: FunctionTrigger) => {\n space.db.remove(trigger);\n setTrigger(undefined);\n setSelected(undefined);\n };\n\n const handleSave: TriggerEditorProps['onSave'] = (trigger) => {\n if (selected) {\n Object.assign(selected, trigger);\n } else {\n space.db.add(create(FunctionTrigger, trigger));\n }\n\n setTrigger(undefined);\n setSelected(undefined);\n };\n\n const handleCancel: TriggerEditorProps['onCancel'] = () => {\n setTrigger(undefined);\n };\n\n return (\n <div className='flex flex-col w-full divide-y divide-separator overflow-y-auto'>\n <List.Root<FunctionTrigger> items={triggers} isItem={S.is(FunctionTrigger)} getId={(field) => field.id}>\n {({ items: triggers }) => (\n <div role='list' className='flex flex-col w-full'>\n {triggers?.map((trigger) => (\n <List.Item<FunctionTrigger>\n key={trigger.id}\n item={trigger}\n classNames={mx(grid, ghostHover, 'items-center')}\n >\n <Input.Root>\n <Input.Switch checked={trigger.enabled} onCheckedChange={(checked) => (trigger.enabled = checked)} />\n </Input.Root>\n\n <div className={'flex'}>\n <List.ItemTitle classNames='px-2 cursor-pointer w-0 shrink' onClick={() => handleSelect(trigger)}>\n {getFunctionName(scripts, functions, trigger)}\n </List.ItemTitle>\n\n {/* TODO: a better way to expose URL copy action */}\n <Button onClick={() => navigator.clipboard.writeText(getWebhookUrl(client, trigger))}>\n Copy URL\n </Button>\n </div>\n\n <List.ItemDeleteButton onClick={() => handleDelete(trigger)} />\n </List.Item>\n ))}\n </div>\n )}\n </List.Root>\n\n {trigger && (\n <TriggerEditor\n space={space}\n storedTrigger={selected}\n trigger={trigger}\n onSave={handleSave}\n onCancel={handleCancel}\n />\n )}\n\n {!trigger && (\n <div className='flex p-2 justify-center'>\n <IconButton icon='ph--plus--regular' label={t('new trigger')} onClick={handleAdd} />\n </div>\n )}\n </div>\n );\n};\n\nconst getWebhookUrl = (client: Client, trigger: FunctionTrigger) => {\n const spaceId = getSpace(trigger)!.id;\n const edgeUrl = new URL(client.config.values.runtime!.services!.edge!.url!);\n const isSecure = edgeUrl.protocol.startsWith('https') || edgeUrl.protocol.startsWith('wss');\n edgeUrl.protocol = isSecure ? 'https' : 'http';\n return new URL(`/webhook/${spaceId}:${trigger.id}`, edgeUrl).toString();\n};\n\nconst getFunctionName = (scripts: ScriptType[], functions: FunctionType[], trigger: FunctionTriggerType) => {\n const functionObject = functions.find((fn) => fn.name === trigger.function);\n if (!functionObject) {\n return trigger.function;\n }\n return scripts.find((s) => functionObject.source?.id === s.id)?.name ?? functionObject.name;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { FunctionTriggerSchema, type FunctionTriggerType, type FunctionTrigger, TriggerKind } from '@dxos/functions';\nimport { FunctionType, ScriptType } from '@dxos/plugin-script/types';\nimport { Filter, useQuery, type Space } from '@dxos/react-client/echo';\nimport { useTranslation } from '@dxos/react-ui';\nimport { Form, SelectInput } from '@dxos/react-ui-form';\n\nimport { AUTOMATION_PLUGIN } from '../../meta';\n\nexport type TriggerEditorProps = {\n space: Space;\n trigger: FunctionTriggerType;\n storedTrigger?: FunctionTrigger;\n onSave?: (trigger: Omit<FunctionTrigger, 'id'>) => void;\n onCancel?: () => void;\n};\n\nexport const TriggerEditor = ({ space, trigger, onSave, onCancel, storedTrigger }: TriggerEditorProps) => {\n const { t } = useTranslation(AUTOMATION_PLUGIN);\n const functions = useQuery(space, Filter.schema(FunctionType));\n const scripts = useQuery(space, Filter.schema(ScriptType));\n\n const handleSave = (values: FunctionTriggerType) => {\n onSave?.(values);\n };\n\n return (\n <Form<FunctionTriggerType>\n schema={FunctionTriggerSchema}\n values={trigger}\n filter={(props) => props.filter((p) => p.name !== 'meta')}\n onSave={handleSave}\n onCancel={onCancel}\n Custom={{\n ['function' satisfies keyof FunctionTriggerType]: (props) => (\n <SelectInput<FunctionTriggerType>\n {...props}\n options={functions.map((fn) => ({\n value: fn.name,\n label: getFunctionName(scripts, fn),\n }))}\n />\n ),\n ['spec.type' as const]: (props) => (\n <SelectInput<FunctionTriggerType>\n {...props}\n options={Object.values(TriggerKind).map((kind) => ({\n value: kind,\n label: t(`trigger type ${kind}`),\n }))}\n />\n ),\n }}\n />\n );\n};\n\nconst getFunctionName = (scripts: ScriptType[], fn: FunctionType) => {\n return scripts.find((s) => fn.source?.id === s.id)?.name ?? fn.name;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { AutomationPanel } from './AutomationPanel';\n\nexport default AutomationPanel;\n"],
5
- "mappings": "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",
6
- "names": ["React", "useState", "S", "FunctionTriggerSchema", "FunctionTrigger", "FunctionType", "ScriptType", "useClient", "create", "Filter", "useQuery", "getSpace", "IconButton", "Input", "useTranslation", "Button", "List", "ghostHover", "mx", "React", "FunctionTriggerSchema", "TriggerKind", "FunctionType", "ScriptType", "Filter", "useQuery", "useTranslation", "Form", "SelectInput", "TriggerEditor", "space", "trigger", "onSave", "onCancel", "storedTrigger", "t", "useTranslation", "AUTOMATION_PLUGIN", "functions", "useQuery", "Filter", "schema", "FunctionType", "scripts", "ScriptType", "handleSave", "values", "Form", "FunctionTriggerSchema", "filter", "props", "p", "name", "Custom", "SelectInput", "options", "map", "fn", "value", "label", "getFunctionName", "Object", "TriggerKind", "kind", "find", "s", "source", "id", "grid", "AutomationPanel", "space", "t", "useTranslation", "AUTOMATION_PLUGIN", "client", "useClient", "triggers", "useQuery", "Filter", "schema", "FunctionTrigger", "functions", "FunctionType", "scripts", "ScriptType", "trigger", "setTrigger", "useState", "selected", "setSelected", "handleSelect", "id", "_", "values", "handleAdd", "create", "FunctionTriggerSchema", "undefined", "handleDelete", "db", "remove", "handleSave", "Object", "assign", "add", "handleCancel", "React", "div", "className", "List", "Root", "items", "isItem", "S", "is", "getId", "field", "role", "map", "Item", "key", "item", "classNames", "mx", "ghostHover", "Input", "Switch", "checked", "enabled", "onCheckedChange", "ItemTitle", "onClick", "getFunctionName", "Button", "navigator", "clipboard", "writeText", "getWebhookUrl", "ItemDeleteButton", "TriggerEditor", "storedTrigger", "onSave", "onCancel", "IconButton", "icon", "label", "spaceId", "getSpace", "edgeUrl", "URL", "config", "runtime", "services", "edge", "url", "isSecure", "protocol", "startsWith", "toString", "functionObject", "find", "fn", "name", "function", "s", "source", "AutomationPanel"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/components/AutomationPanel/AutomationPanel.tsx", "../../../src/components/TriggerEditor/TriggerEditor.tsx", "../../../src/components/AutomationPanel/index.ts"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useState } from 'react';\n\nimport { S } from '@dxos/echo-schema';\nimport { FunctionTriggerSchema, FunctionTrigger, type FunctionTriggerType } from '@dxos/functions';\nimport { FunctionType, ScriptType } from '@dxos/plugin-script';\nimport { type Client, useClient } from '@dxos/react-client';\nimport { create, Filter, useQuery, type Space, type ReactiveObject, getSpace } from '@dxos/react-client/echo';\nimport { IconButton, Input, useTranslation, Button } from '@dxos/react-ui';\nimport { List } from '@dxos/react-ui-list';\nimport { ghostHover, mx } from '@dxos/react-ui-theme';\n\nimport { AUTOMATION_PLUGIN } from '../../meta';\nimport { TriggerEditor, type TriggerEditorProps } from '../TriggerEditor';\n\nconst grid = 'grid grid-cols-[40px_1fr_32px] min-bs-[2.5rem]';\n\nexport type AutomationPanelProps = {\n space: Space;\n object?: ReactiveObject<any>;\n};\n\n// TODO(burdon): Factor out common layout with ViewEditor.\nexport const AutomationPanel = ({ space }: AutomationPanelProps) => {\n const { t } = useTranslation(AUTOMATION_PLUGIN);\n const client = useClient();\n const triggers = useQuery(space, Filter.schema(FunctionTrigger));\n const functions = useQuery(space, Filter.schema(FunctionType));\n const scripts = useQuery(space, Filter.schema(ScriptType));\n\n const [trigger, setTrigger] = useState<FunctionTriggerType>();\n const [selected, setSelected] = useState<FunctionTrigger>();\n\n const handleSelect = (trigger: FunctionTrigger) => {\n const { id: _, ...values } = trigger;\n setTrigger(values);\n setSelected(trigger);\n };\n\n const handleAdd = () => {\n setTrigger(create(FunctionTriggerSchema, {}));\n setSelected(undefined);\n };\n\n const handleDelete = (trigger: FunctionTrigger) => {\n space.db.remove(trigger);\n setTrigger(undefined);\n setSelected(undefined);\n };\n\n const handleSave: TriggerEditorProps['onSave'] = (trigger) => {\n if (selected) {\n Object.assign(selected, trigger);\n } else {\n space.db.add(create(FunctionTrigger, trigger));\n }\n\n setTrigger(undefined);\n setSelected(undefined);\n };\n\n const handleCancel: TriggerEditorProps['onCancel'] = () => {\n setTrigger(undefined);\n };\n\n return (\n <div className='flex flex-col w-full divide-y divide-separator overflow-y-auto'>\n <List.Root<FunctionTrigger> items={triggers} isItem={S.is(FunctionTrigger)} getId={(field) => field.id}>\n {({ items: triggers }) => (\n <div role='list' className='flex flex-col w-full'>\n {triggers?.map((trigger) => (\n <List.Item<FunctionTrigger>\n key={trigger.id}\n item={trigger}\n classNames={mx(grid, ghostHover, 'items-center')}\n >\n <Input.Root>\n <Input.Switch checked={trigger.enabled} onCheckedChange={(checked) => (trigger.enabled = checked)} />\n </Input.Root>\n\n <div className={'flex'}>\n <List.ItemTitle classNames='px-2 cursor-pointer w-0 shrink' onClick={() => handleSelect(trigger)}>\n {getFunctionName(scripts, functions, trigger)}\n </List.ItemTitle>\n\n {/* TODO: a better way to expose URL copy action */}\n <Button onClick={() => navigator.clipboard.writeText(getWebhookUrl(client, trigger))}>\n Copy URL\n </Button>\n </div>\n\n <List.ItemDeleteButton onClick={() => handleDelete(trigger)} />\n </List.Item>\n ))}\n </div>\n )}\n </List.Root>\n\n {trigger && (\n <TriggerEditor\n space={space}\n storedTrigger={selected}\n trigger={trigger}\n onSave={handleSave}\n onCancel={handleCancel}\n />\n )}\n\n {!trigger && (\n <div className='flex p-2 justify-center'>\n <IconButton icon='ph--plus--regular' label={t('new trigger')} onClick={handleAdd} />\n </div>\n )}\n </div>\n );\n};\n\nconst getWebhookUrl = (client: Client, trigger: FunctionTrigger) => {\n const spaceId = getSpace(trigger)!.id;\n const edgeUrl = new URL(client.config.values.runtime!.services!.edge!.url!);\n const isSecure = edgeUrl.protocol.startsWith('https') || edgeUrl.protocol.startsWith('wss');\n edgeUrl.protocol = isSecure ? 'https' : 'http';\n return new URL(`/webhook/${spaceId}:${trigger.id}`, edgeUrl).toString();\n};\n\nconst getFunctionName = (scripts: ScriptType[], functions: FunctionType[], trigger: FunctionTriggerType) => {\n const functionObject = functions.find((fn) => fn.name === trigger.function);\n if (!functionObject) {\n return trigger.function;\n }\n return scripts.find((s) => functionObject.source?.id === s.id)?.name ?? functionObject.name;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { FunctionTriggerSchema, type FunctionTriggerType, type FunctionTrigger, TriggerKind } from '@dxos/functions';\nimport { FunctionType, ScriptType } from '@dxos/plugin-script/types';\nimport { Filter, useQuery, type Space } from '@dxos/react-client/echo';\nimport { useTranslation } from '@dxos/react-ui';\nimport { Form, SelectInput } from '@dxos/react-ui-form';\n\nimport { AUTOMATION_PLUGIN } from '../../meta';\n\nexport type TriggerEditorProps = {\n space: Space;\n trigger: FunctionTriggerType;\n storedTrigger?: FunctionTrigger;\n onSave?: (trigger: Omit<FunctionTrigger, 'id'>) => void;\n onCancel?: () => void;\n};\n\nexport const TriggerEditor = ({ space, trigger, onSave, onCancel, storedTrigger }: TriggerEditorProps) => {\n const { t } = useTranslation(AUTOMATION_PLUGIN);\n const functions = useQuery(space, Filter.schema(FunctionType));\n const scripts = useQuery(space, Filter.schema(ScriptType));\n\n const handleSave = (values: FunctionTriggerType) => {\n onSave?.(values);\n };\n\n return (\n <Form<FunctionTriggerType>\n schema={FunctionTriggerSchema}\n values={trigger}\n filter={(props) => props.filter((p) => p.name !== 'meta')}\n onSave={handleSave}\n onCancel={onCancel}\n Custom={{\n ['function' satisfies keyof FunctionTriggerType]: (props) => (\n <SelectInput<FunctionTriggerType>\n {...props}\n options={functions.map((fn) => ({\n value: fn.name,\n label: getFunctionName(scripts, fn),\n }))}\n />\n ),\n ['spec.type' as const]: (props) => (\n <SelectInput<FunctionTriggerType>\n {...props}\n options={Object.values(TriggerKind).map((kind) => ({\n value: kind,\n label: t(`trigger type ${kind}`),\n }))}\n />\n ),\n }}\n />\n );\n};\n\nconst getFunctionName = (scripts: ScriptType[], fn: FunctionType) => {\n return scripts.find((s) => fn.source?.id === s.id)?.name ?? fn.name;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { AutomationPanel } from './AutomationPanel';\n\nexport default AutomationPanel;\n"],
5
- "mappings": "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",
6
- "names": ["import_react", "import_functions", "import_echo", "import_react_ui", "TriggerEditor", "space", "trigger", "onSave", "onCancel", "storedTrigger", "t", "useTranslation", "AUTOMATION_PLUGIN", "functions", "useQuery", "Filter", "schema", "FunctionType", "scripts", "ScriptType", "handleSave", "values", "React", "Form", "FunctionTriggerSchema", "filter", "props", "p", "name", "Custom", "SelectInput", "options", "map", "fn", "value", "label", "getFunctionName", "Object", "TriggerKind", "kind", "find", "s", "source", "id", "grid", "AutomationPanel", "client", "useClient", "triggers", "FunctionTrigger", "setTrigger", "useState", "selected", "setSelected", "handleSelect", "_", "handleAdd", "create", "undefined", "handleDelete", "db", "remove", "assign", "add", "handleCancel", "div", "className", "List", "Root", "items", "isItem", "S", "is", "getId", "field", "role", "Item", "key", "item", "classNames", "mx", "ghostHover", "Input", "Switch", "checked", "enabled", "onCheckedChange", "ItemTitle", "onClick", "Button", "navigator", "clipboard", "writeText", "getWebhookUrl", "ItemDeleteButton", "IconButton", "icon", "spaceId", "getSpace", "edgeUrl", "URL", "config", "runtime", "services", "edge", "url", "isSecure", "protocol", "startsWith", "toString", "functionObject", "function"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/components/AutomationPanel/AutomationPanel.tsx", "../../../src/components/TriggerEditor/TriggerEditor.tsx", "../../../src/components/AutomationPanel/index.ts"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useState } from 'react';\n\nimport { S } from '@dxos/echo-schema';\nimport { FunctionTriggerSchema, FunctionTrigger, type FunctionTriggerType } from '@dxos/functions';\nimport { FunctionType, ScriptType } from '@dxos/plugin-script';\nimport { type Client, useClient } from '@dxos/react-client';\nimport { create, Filter, useQuery, type Space, type ReactiveObject, getSpace } from '@dxos/react-client/echo';\nimport { IconButton, Input, useTranslation, Button } from '@dxos/react-ui';\nimport { List } from '@dxos/react-ui-list';\nimport { ghostHover, mx } from '@dxos/react-ui-theme';\n\nimport { AUTOMATION_PLUGIN } from '../../meta';\nimport { TriggerEditor, type TriggerEditorProps } from '../TriggerEditor';\n\nconst grid = 'grid grid-cols-[40px_1fr_32px] min-bs-[2.5rem]';\n\nexport type AutomationPanelProps = {\n space: Space;\n object?: ReactiveObject<any>;\n};\n\n// TODO(burdon): Factor out common layout with ViewEditor.\nexport const AutomationPanel = ({ space }: AutomationPanelProps) => {\n const { t } = useTranslation(AUTOMATION_PLUGIN);\n const client = useClient();\n const triggers = useQuery(space, Filter.schema(FunctionTrigger));\n const functions = useQuery(space, Filter.schema(FunctionType));\n const scripts = useQuery(space, Filter.schema(ScriptType));\n\n const [trigger, setTrigger] = useState<FunctionTriggerType>();\n const [selected, setSelected] = useState<FunctionTrigger>();\n\n const handleSelect = (trigger: FunctionTrigger) => {\n const { id: _, ...values } = trigger;\n setTrigger(values);\n setSelected(trigger);\n };\n\n const handleAdd = () => {\n setTrigger(create(FunctionTriggerSchema, {}));\n setSelected(undefined);\n };\n\n const handleDelete = (trigger: FunctionTrigger) => {\n space.db.remove(trigger);\n setTrigger(undefined);\n setSelected(undefined);\n };\n\n const handleSave: TriggerEditorProps['onSave'] = (trigger) => {\n if (selected) {\n Object.assign(selected, trigger);\n } else {\n space.db.add(create(FunctionTrigger, trigger));\n }\n\n setTrigger(undefined);\n setSelected(undefined);\n };\n\n const handleCancel: TriggerEditorProps['onCancel'] = () => {\n setTrigger(undefined);\n };\n\n return (\n <div className='flex flex-col w-full divide-y divide-separator overflow-y-auto'>\n <List.Root<FunctionTrigger> items={triggers} isItem={S.is(FunctionTrigger)} getId={(field) => field.id}>\n {({ items: triggers }) => (\n <div role='list' className='flex flex-col w-full'>\n {triggers?.map((trigger) => (\n <List.Item<FunctionTrigger>\n key={trigger.id}\n item={trigger}\n classNames={mx(grid, ghostHover, 'items-center')}\n >\n <Input.Root>\n <Input.Switch checked={trigger.enabled} onCheckedChange={(checked) => (trigger.enabled = checked)} />\n </Input.Root>\n\n <div className={'flex'}>\n <List.ItemTitle classNames='px-2 cursor-pointer w-0 shrink' onClick={() => handleSelect(trigger)}>\n {getFunctionName(scripts, functions, trigger)}\n </List.ItemTitle>\n\n {/* TODO: a better way to expose URL copy action */}\n <Button onClick={() => navigator.clipboard.writeText(getWebhookUrl(client, trigger))}>\n Copy URL\n </Button>\n </div>\n\n <List.ItemDeleteButton onClick={() => handleDelete(trigger)} />\n </List.Item>\n ))}\n </div>\n )}\n </List.Root>\n\n {trigger && (\n <TriggerEditor\n space={space}\n storedTrigger={selected}\n trigger={trigger}\n onSave={handleSave}\n onCancel={handleCancel}\n />\n )}\n\n {!trigger && (\n <div className='flex p-2 justify-center'>\n <IconButton icon='ph--plus--regular' label={t('new trigger')} onClick={handleAdd} />\n </div>\n )}\n </div>\n );\n};\n\nconst getWebhookUrl = (client: Client, trigger: FunctionTrigger) => {\n const spaceId = getSpace(trigger)!.id;\n const edgeUrl = new URL(client.config.values.runtime!.services!.edge!.url!);\n const isSecure = edgeUrl.protocol.startsWith('https') || edgeUrl.protocol.startsWith('wss');\n edgeUrl.protocol = isSecure ? 'https' : 'http';\n return new URL(`/webhook/${spaceId}:${trigger.id}`, edgeUrl).toString();\n};\n\nconst getFunctionName = (scripts: ScriptType[], functions: FunctionType[], trigger: FunctionTriggerType) => {\n const functionObject = functions.find((fn) => fn.name === trigger.function);\n if (!functionObject) {\n return trigger.function;\n }\n return scripts.find((s) => functionObject.source?.id === s.id)?.name ?? functionObject.name;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { FunctionTriggerSchema, type FunctionTriggerType, type FunctionTrigger, TriggerKind } from '@dxos/functions';\nimport { FunctionType, ScriptType } from '@dxos/plugin-script/types';\nimport { Filter, useQuery, type Space } from '@dxos/react-client/echo';\nimport { useTranslation } from '@dxos/react-ui';\nimport { Form, SelectInput } from '@dxos/react-ui-form';\n\nimport { AUTOMATION_PLUGIN } from '../../meta';\n\nexport type TriggerEditorProps = {\n space: Space;\n trigger: FunctionTriggerType;\n storedTrigger?: FunctionTrigger;\n onSave?: (trigger: Omit<FunctionTrigger, 'id'>) => void;\n onCancel?: () => void;\n};\n\nexport const TriggerEditor = ({ space, trigger, onSave, onCancel, storedTrigger }: TriggerEditorProps) => {\n const { t } = useTranslation(AUTOMATION_PLUGIN);\n const functions = useQuery(space, Filter.schema(FunctionType));\n const scripts = useQuery(space, Filter.schema(ScriptType));\n\n const handleSave = (values: FunctionTriggerType) => {\n onSave?.(values);\n };\n\n return (\n <Form<FunctionTriggerType>\n schema={FunctionTriggerSchema}\n values={trigger}\n filter={(props) => props.filter((p) => p.name !== 'meta')}\n onSave={handleSave}\n onCancel={onCancel}\n Custom={{\n ['function' satisfies keyof FunctionTriggerType]: (props) => (\n <SelectInput<FunctionTriggerType>\n {...props}\n options={functions.map((fn) => ({\n value: fn.name,\n label: getFunctionName(scripts, fn),\n }))}\n />\n ),\n ['spec.type' as const]: (props) => (\n <SelectInput<FunctionTriggerType>\n {...props}\n options={Object.values(TriggerKind).map((kind) => ({\n value: kind,\n label: t(`trigger type ${kind}`),\n }))}\n />\n ),\n }}\n />\n );\n};\n\nconst getFunctionName = (scripts: ScriptType[], fn: FunctionType) => {\n return scripts.find((s) => fn.source?.id === s.id)?.name ?? fn.name;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { AutomationPanel } from './AutomationPanel';\n\nexport default AutomationPanel;\n"],
5
- "mappings": ";;;;;;AAIA,OAAOA,UAASC,gBAAgB;AAEhC,SAASC,SAAS;AAClB,SAASC,yBAAAA,wBAAuBC,uBAAiD;AACjF,SAASC,gBAAAA,eAAcC,cAAAA,mBAAkB;AACzC,SAAsBC,iBAAiB;AACvC,SAASC,QAAQC,UAAAA,SAAQC,YAAAA,WAA2CC,gBAAgB;AACpF,SAASC,YAAYC,OAAOC,kBAAAA,iBAAgBC,cAAc;AAC1D,SAASC,YAAY;AACrB,SAASC,YAAYC,UAAU;;;ACT/B,OAAOC,WAAW;AAElB,SAASC,uBAAuEC,mBAAmB;AACnG,SAASC,cAAcC,kBAAkB;AACzC,SAASC,QAAQC,gBAA4B;AAC7C,SAASC,sBAAsB;AAC/B,SAASC,MAAMC,mBAAmB;AAY3B,IAAMC,gBAAgB,CAAC,EAAEC,OAAOC,SAASC,QAAQC,UAAUC,cAAa,MAAsB;AACnG,QAAM,EAAEC,EAAC,IAAKC,eAAeC,iBAAAA;AAC7B,QAAMC,YAAYC,SAAST,OAAOU,OAAOC,OAAOC,YAAAA,CAAAA;AAChD,QAAMC,UAAUJ,SAAST,OAAOU,OAAOC,OAAOG,UAAAA,CAAAA;AAE9C,QAAMC,aAAa,CAACC,WAAAA;AAClBd,aAASc,MAAAA;EACX;AAEA,SACE,sBAAA,cAACC,MAAAA;IACCN,QAAQO;IACRF,QAAQf;IACRkB,QAAQ,CAACC,UAAUA,MAAMD,OAAO,CAACE,MAAMA,EAAEC,SAAS,MAAA;IAClDpB,QAAQa;IACRZ;IACAoB,QAAQ;MACN,CAAC,UAAA,GAAiD,CAACH,UACjD,sBAAA,cAACI,aAAAA;QACE,GAAGJ;QACJK,SAASjB,UAAUkB,IAAI,CAACC,QAAQ;UAC9BC,OAAOD,GAAGL;UACVO,OAAOC,gBAAgBjB,SAASc,EAAAA;QAClC,EAAA;;MAGJ,CAAC,WAAA,GAAuB,CAACP,UACvB,sBAAA,cAACI,aAAAA;QACE,GAAGJ;QACJK,SAASM,OAAOf,OAAOgB,WAAAA,EAAaN,IAAI,CAACO,UAAU;UACjDL,OAAOK;UACPJ,OAAOxB,EAAE,gBAAgB4B,IAAAA,EAAM;QACjC,EAAA;;IAGN;;AAGN;AAEA,IAAMH,kBAAkB,CAACjB,SAAuBc,OAAAA;AAC9C,SAAOd,QAAQqB,KAAK,CAACC,MAAMR,GAAGS,QAAQC,OAAOF,EAAEE,EAAE,GAAGf,QAAQK,GAAGL;AACjE;;;AD9CA,IAAMgB,OAAO;AAQN,IAAMC,kBAAkB,CAAC,EAAEC,MAAK,MAAwB;AAC7D,QAAM,EAAEC,EAAC,IAAKC,gBAAeC,iBAAAA;AAC7B,QAAMC,SAASC,UAAAA;AACf,QAAMC,WAAWC,UAASP,OAAOQ,QAAOC,OAAOC,eAAAA,CAAAA;AAC/C,QAAMC,YAAYJ,UAASP,OAAOQ,QAAOC,OAAOG,aAAAA,CAAAA;AAChD,QAAMC,UAAUN,UAASP,OAAOQ,QAAOC,OAAOK,WAAAA,CAAAA;AAE9C,QAAM,CAACC,SAASC,UAAAA,IAAcC,SAAAA;AAC9B,QAAM,CAACC,UAAUC,WAAAA,IAAeF,SAAAA;AAEhC,QAAMG,eAAe,CAACL,aAAAA;AACpB,UAAM,EAAEM,IAAIC,GAAG,GAAGC,OAAAA,IAAWR;AAC7BC,eAAWO,MAAAA;AACXJ,gBAAYJ,QAAAA;EACd;AAEA,QAAMS,YAAY,MAAA;AAChBR,eAAWS,OAAOC,wBAAuB,CAAC,CAAA,CAAA;AAC1CP,gBAAYQ,MAAAA;EACd;AAEA,QAAMC,eAAe,CAACb,aAAAA;AACpBf,UAAM6B,GAAGC,OAAOf,QAAAA;AAChBC,eAAWW,MAAAA;AACXR,gBAAYQ,MAAAA;EACd;AAEA,QAAMI,aAA2C,CAAChB,aAAAA;AAChD,QAAIG,UAAU;AACZc,aAAOC,OAAOf,UAAUH,QAAAA;IAC1B,OAAO;AACLf,YAAM6B,GAAGK,IAAIT,OAAOf,iBAAiBK,QAAAA,CAAAA;IACvC;AAEAC,eAAWW,MAAAA;AACXR,gBAAYQ,MAAAA;EACd;AAEA,QAAMQ,eAA+C,MAAA;AACnDnB,eAAWW,MAAAA;EACb;AAEA,SACE,gBAAAS,OAAA,cAACC,OAAAA;IAAIC,WAAU;KACb,gBAAAF,OAAA,cAACG,KAAKC,MAAI;IAAkBC,OAAOnC;IAAUoC,QAAQC,EAAEC,GAAGlC,eAAAA;IAAkBmC,OAAO,CAACC,UAAUA,MAAMzB;KACjG,CAAC,EAAEoB,OAAOnC,UAAQ,MACjB,gBAAA8B,OAAA,cAACC,OAAAA;IAAIU,MAAK;IAAOT,WAAU;KACxBhC,WAAU0C,IAAI,CAACjC,aACd,gBAAAqB,OAAA,cAACG,KAAKU,MAAI;IACRC,KAAKnC,SAAQM;IACb8B,MAAMpC;IACNqC,YAAYC,GAAGvD,MAAMwD,YAAY,cAAA;KAEjC,gBAAAlB,OAAA,cAACmB,MAAMf,MAAI,MACT,gBAAAJ,OAAA,cAACmB,MAAMC,QAAM;IAACC,SAAS1C,SAAQ2C;IAASC,iBAAiB,CAACF,YAAa1C,SAAQ2C,UAAUD;OAG3F,gBAAArB,OAAA,cAACC,OAAAA;IAAIC,WAAW;KACd,gBAAAF,OAAA,cAACG,KAAKqB,WAAS;IAACR,YAAW;IAAiCS,SAAS,MAAMzC,aAAaL,QAAAA;KACrF+C,iBAAgBjD,SAASF,WAAWI,QAAAA,CAAAA,GAIvC,gBAAAqB,OAAA,cAAC2B,QAAAA;IAAOF,SAAS,MAAMG,UAAUC,UAAUC,UAAUC,cAAc/D,QAAQW,QAAAA,CAAAA;KAAW,UAAA,CAAA,GAKxF,gBAAAqB,OAAA,cAACG,KAAK6B,kBAAgB;IAACP,SAAS,MAAMjC,aAAab,QAAAA;UAO5DA,WACC,gBAAAqB,OAAA,cAACiC,eAAAA;IACCrE;IACAsE,eAAepD;IACfH;IACAwD,QAAQxC;IACRyC,UAAUrC;MAIb,CAACpB,WACA,gBAAAqB,OAAA,cAACC,OAAAA;IAAIC,WAAU;KACb,gBAAAF,OAAA,cAACqC,YAAAA;IAAWC,MAAK;IAAoBC,OAAO1E,EAAE,aAAA;IAAgB4D,SAASrC;;AAKjF;AAEA,IAAM2C,gBAAgB,CAAC/D,QAAgBW,YAAAA;AACrC,QAAM6D,UAAUC,SAAS9D,OAAAA,EAAUM;AACnC,QAAMyD,UAAU,IAAIC,IAAI3E,OAAO4E,OAAOzD,OAAO0D,QAASC,SAAUC,KAAMC,GAAG;AACzE,QAAMC,WAAWP,QAAQQ,SAASC,WAAW,OAAA,KAAYT,QAAQQ,SAASC,WAAW,KAAA;AACrFT,UAAQQ,WAAWD,WAAW,UAAU;AACxC,SAAO,IAAIN,IAAI,YAAYH,OAAAA,IAAW7D,QAAQM,EAAE,IAAIyD,OAAAA,EAASU,SAAQ;AACvE;AAEA,IAAM1B,mBAAkB,CAACjD,SAAuBF,WAA2BI,YAAAA;AACzE,QAAM0E,iBAAiB9E,UAAU+E,KAAK,CAACC,OAAOA,GAAGC,SAAS7E,QAAQ8E,QAAQ;AAC1E,MAAI,CAACJ,gBAAgB;AACnB,WAAO1E,QAAQ8E;EACjB;AACA,SAAOhF,QAAQ6E,KAAK,CAACI,MAAML,eAAeM,QAAQ1E,OAAOyE,EAAEzE,EAAE,GAAGuE,QAAQH,eAAeG;AACzF;;;AEhIA,IAAA,0BAAeI;",
6
- "names": ["React", "useState", "S", "FunctionTriggerSchema", "FunctionTrigger", "FunctionType", "ScriptType", "useClient", "create", "Filter", "useQuery", "getSpace", "IconButton", "Input", "useTranslation", "Button", "List", "ghostHover", "mx", "React", "FunctionTriggerSchema", "TriggerKind", "FunctionType", "ScriptType", "Filter", "useQuery", "useTranslation", "Form", "SelectInput", "TriggerEditor", "space", "trigger", "onSave", "onCancel", "storedTrigger", "t", "useTranslation", "AUTOMATION_PLUGIN", "functions", "useQuery", "Filter", "schema", "FunctionType", "scripts", "ScriptType", "handleSave", "values", "Form", "FunctionTriggerSchema", "filter", "props", "p", "name", "Custom", "SelectInput", "options", "map", "fn", "value", "label", "getFunctionName", "Object", "TriggerKind", "kind", "find", "s", "source", "id", "grid", "AutomationPanel", "space", "t", "useTranslation", "AUTOMATION_PLUGIN", "client", "useClient", "triggers", "useQuery", "Filter", "schema", "FunctionTrigger", "functions", "FunctionType", "scripts", "ScriptType", "trigger", "setTrigger", "useState", "selected", "setSelected", "handleSelect", "id", "_", "values", "handleAdd", "create", "FunctionTriggerSchema", "undefined", "handleDelete", "db", "remove", "handleSave", "Object", "assign", "add", "handleCancel", "React", "div", "className", "List", "Root", "items", "isItem", "S", "is", "getId", "field", "role", "map", "Item", "key", "item", "classNames", "mx", "ghostHover", "Input", "Switch", "checked", "enabled", "onCheckedChange", "ItemTitle", "onClick", "getFunctionName", "Button", "navigator", "clipboard", "writeText", "getWebhookUrl", "ItemDeleteButton", "TriggerEditor", "storedTrigger", "onSave", "onCancel", "IconButton", "icon", "label", "spaceId", "getSpace", "edgeUrl", "URL", "config", "runtime", "services", "edge", "url", "isSecure", "protocol", "startsWith", "toString", "functionObject", "find", "fn", "name", "function", "s", "source", "AutomationPanel"]
7
- }