@dxos/plugin-automation 0.8.2-main.fbd8ed0 → 0.8.2-staging.7ac8446

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 (168) hide show
  1. package/dist/lib/browser/{chunk-2QF27UJ2.mjs → AutomationPanel-YAHFXQX6.mjs} +23 -24
  2. package/dist/lib/browser/AutomationPanel-YAHFXQX6.mjs.map +7 -0
  3. package/dist/lib/browser/app-graph-builder-K3BIQFWW.mjs +40 -0
  4. package/dist/lib/browser/app-graph-builder-K3BIQFWW.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-FALBBJNO.mjs +138 -0
  6. package/dist/lib/browser/chunk-FALBBJNO.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-MT3FZH4V.mjs +8 -0
  8. package/dist/lib/browser/chunk-MT3FZH4V.mjs.map +7 -0
  9. package/dist/lib/browser/index.mjs +19 -25
  10. package/dist/lib/browser/index.mjs.map +3 -3
  11. package/dist/lib/browser/meta.json +1 -1
  12. package/dist/lib/browser/react-surface-4QQSJR4A.mjs +42 -0
  13. package/dist/lib/browser/react-surface-4QQSJR4A.mjs.map +7 -0
  14. package/dist/lib/node/{chunk-TI3WBQIB.cjs → AutomationPanel-ZKAMIU6O.cjs} +26 -31
  15. package/dist/lib/node/AutomationPanel-ZKAMIU6O.cjs.map +7 -0
  16. package/dist/lib/node/app-graph-builder-HO4FPGZ5.cjs +56 -0
  17. package/dist/lib/node/app-graph-builder-HO4FPGZ5.cjs.map +7 -0
  18. package/dist/lib/node/{chunk-SV2CB3FT.cjs → chunk-AGJ6XTDN.cjs} +7 -16
  19. package/dist/lib/node/chunk-AGJ6XTDN.cjs.map +7 -0
  20. package/dist/lib/node/chunk-FTEDH5Q6.cjs +167 -0
  21. package/dist/lib/node/chunk-FTEDH5Q6.cjs.map +7 -0
  22. package/dist/lib/node/index.cjs +22 -28
  23. package/dist/lib/node/index.cjs.map +3 -3
  24. package/dist/lib/node/meta.json +1 -1
  25. package/dist/lib/node/{react-surface-43VHU36V.cjs → react-surface-52M54VWV.cjs} +15 -39
  26. package/dist/lib/node/react-surface-52M54VWV.cjs.map +7 -0
  27. package/dist/lib/node-esm/{chunk-DIUPZXCQ.mjs → AutomationPanel-XF7YPSKM.mjs} +23 -24
  28. package/dist/lib/node-esm/AutomationPanel-XF7YPSKM.mjs.map +7 -0
  29. package/dist/lib/node-esm/app-graph-builder-XCJR33VS.mjs +41 -0
  30. package/dist/lib/node-esm/app-graph-builder-XCJR33VS.mjs.map +7 -0
  31. package/dist/lib/node-esm/chunk-M4QXMIIB.mjs +139 -0
  32. package/dist/lib/node-esm/chunk-M4QXMIIB.mjs.map +7 -0
  33. package/dist/lib/node-esm/chunk-OA75PSGH.mjs +10 -0
  34. package/dist/lib/node-esm/chunk-OA75PSGH.mjs.map +7 -0
  35. package/dist/lib/node-esm/index.mjs +19 -25
  36. package/dist/lib/node-esm/index.mjs.map +3 -3
  37. package/dist/lib/node-esm/meta.json +1 -1
  38. package/dist/lib/node-esm/react-surface-MGKM3OO3.mjs +43 -0
  39. package/dist/lib/node-esm/react-surface-MGKM3OO3.mjs.map +7 -0
  40. package/dist/types/src/AutomationPlugin.d.ts.map +1 -1
  41. package/dist/types/src/capabilities/app-graph-builder.d.ts +179 -2
  42. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  43. package/dist/types/src/capabilities/index.d.ts +177 -2
  44. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  45. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  46. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts +3 -6
  47. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts.map +1 -1
  48. package/dist/types/src/components/AutomationPanel/index.d.ts +0 -1
  49. package/dist/types/src/components/AutomationPanel/index.d.ts.map +1 -1
  50. package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts +1 -1
  51. package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts.map +1 -1
  52. package/dist/types/src/components/TriggerEditor/TriggerEditor.stories.d.ts.map +1 -1
  53. package/dist/types/src/components/index.d.ts +1 -8
  54. package/dist/types/src/components/index.d.ts.map +1 -1
  55. package/dist/types/src/testing/test-functions.d.ts.map +1 -1
  56. package/dist/types/src/translations.d.ts +0 -8
  57. package/dist/types/src/translations.d.ts.map +1 -1
  58. package/dist/types/tsconfig.tsbuildinfo +1 -1
  59. package/package.json +24 -36
  60. package/src/AutomationPlugin.tsx +10 -5
  61. package/src/capabilities/app-graph-builder.ts +17 -71
  62. package/src/capabilities/index.ts +0 -1
  63. package/src/capabilities/react-surface.tsx +8 -32
  64. package/src/components/AutomationPanel/AutomationPanel.stories.tsx +5 -5
  65. package/src/components/AutomationPanel/AutomationPanel.tsx +72 -72
  66. package/src/components/AutomationPanel/index.ts +0 -2
  67. package/src/components/TriggerEditor/TriggerEditor.stories.tsx +10 -19
  68. package/src/components/TriggerEditor/TriggerEditor.tsx +93 -53
  69. package/src/components/index.ts +0 -3
  70. package/src/testing/test-functions.ts +9 -23
  71. package/src/translations.ts +1 -10
  72. package/dist/lib/browser/AutomationContainer-DA6IW7O2.mjs +0 -34
  73. package/dist/lib/browser/AutomationContainer-DA6IW7O2.mjs.map +0 -7
  74. package/dist/lib/browser/AutomationPanel-R42D3LDD.mjs +0 -11
  75. package/dist/lib/browser/AutomationPanel-R42D3LDD.mjs.map +0 -7
  76. package/dist/lib/browser/FunctionsContainer-MPBMMOMS.mjs +0 -33
  77. package/dist/lib/browser/FunctionsContainer-MPBMMOMS.mjs.map +0 -7
  78. package/dist/lib/browser/FunctionsPanel-NSI3P53X.mjs +0 -10
  79. package/dist/lib/browser/FunctionsPanel-NSI3P53X.mjs.map +0 -7
  80. package/dist/lib/browser/app-graph-builder-2OGPEVBA.mjs +0 -79
  81. package/dist/lib/browser/app-graph-builder-2OGPEVBA.mjs.map +0 -7
  82. package/dist/lib/browser/chunk-2QF27UJ2.mjs.map +0 -7
  83. package/dist/lib/browser/chunk-ADYCSC6Y.mjs +0 -39
  84. package/dist/lib/browser/chunk-ADYCSC6Y.mjs.map +0 -7
  85. package/dist/lib/browser/chunk-BNQNURZN.mjs +0 -211
  86. package/dist/lib/browser/chunk-BNQNURZN.mjs.map +0 -7
  87. package/dist/lib/browser/chunk-SGT76SL2.mjs +0 -14
  88. package/dist/lib/browser/chunk-SGT76SL2.mjs.map +0 -7
  89. package/dist/lib/browser/chunk-TRC3J2I6.mjs +0 -88
  90. package/dist/lib/browser/chunk-TRC3J2I6.mjs.map +0 -7
  91. package/dist/lib/browser/intent-resolver-X3H6ZSP4.mjs +0 -77
  92. package/dist/lib/browser/intent-resolver-X3H6ZSP4.mjs.map +0 -7
  93. package/dist/lib/browser/react-surface-MOXIHBMS.mjs +0 -68
  94. package/dist/lib/browser/react-surface-MOXIHBMS.mjs.map +0 -7
  95. package/dist/lib/browser/types.mjs +0 -8
  96. package/dist/lib/browser/types.mjs.map +0 -7
  97. package/dist/lib/node/AutomationContainer-FIFH4P5T.cjs +0 -62
  98. package/dist/lib/node/AutomationContainer-FIFH4P5T.cjs.map +0 -7
  99. package/dist/lib/node/AutomationPanel-HTNEWBGB.cjs +0 -32
  100. package/dist/lib/node/AutomationPanel-HTNEWBGB.cjs.map +0 -7
  101. package/dist/lib/node/FunctionsContainer-LF2F6CPE.cjs +0 -61
  102. package/dist/lib/node/FunctionsContainer-LF2F6CPE.cjs.map +0 -7
  103. package/dist/lib/node/FunctionsPanel-6HOAIMQ3.cjs +0 -31
  104. package/dist/lib/node/FunctionsPanel-6HOAIMQ3.cjs.map +0 -7
  105. package/dist/lib/node/app-graph-builder-3XGDVWHR.cjs +0 -95
  106. package/dist/lib/node/app-graph-builder-3XGDVWHR.cjs.map +0 -7
  107. package/dist/lib/node/chunk-CBHWMYKF.cjs +0 -116
  108. package/dist/lib/node/chunk-CBHWMYKF.cjs.map +0 -7
  109. package/dist/lib/node/chunk-GDCG2BML.cjs +0 -58
  110. package/dist/lib/node/chunk-GDCG2BML.cjs.map +0 -7
  111. package/dist/lib/node/chunk-S3Z4AP77.cjs +0 -234
  112. package/dist/lib/node/chunk-S3Z4AP77.cjs.map +0 -7
  113. package/dist/lib/node/chunk-SV2CB3FT.cjs.map +0 -7
  114. package/dist/lib/node/chunk-TI3WBQIB.cjs.map +0 -7
  115. package/dist/lib/node/intent-resolver-Q7WJ4PZZ.cjs +0 -93
  116. package/dist/lib/node/intent-resolver-Q7WJ4PZZ.cjs.map +0 -7
  117. package/dist/lib/node/react-surface-43VHU36V.cjs.map +0 -7
  118. package/dist/lib/node/types.cjs +0 -30
  119. package/dist/lib/node/types.cjs.map +0 -7
  120. package/dist/lib/node-esm/AutomationContainer-OP43F4PD.mjs +0 -35
  121. package/dist/lib/node-esm/AutomationContainer-OP43F4PD.mjs.map +0 -7
  122. package/dist/lib/node-esm/AutomationPanel-ZQKRBWP2.mjs +0 -12
  123. package/dist/lib/node-esm/AutomationPanel-ZQKRBWP2.mjs.map +0 -7
  124. package/dist/lib/node-esm/FunctionsContainer-5TVRDIX5.mjs +0 -34
  125. package/dist/lib/node-esm/FunctionsContainer-5TVRDIX5.mjs.map +0 -7
  126. package/dist/lib/node-esm/FunctionsPanel-NMEW26KL.mjs +0 -11
  127. package/dist/lib/node-esm/FunctionsPanel-NMEW26KL.mjs.map +0 -7
  128. package/dist/lib/node-esm/app-graph-builder-UR2E5CQY.mjs +0 -80
  129. package/dist/lib/node-esm/app-graph-builder-UR2E5CQY.mjs.map +0 -7
  130. package/dist/lib/node-esm/chunk-AD4C4IK2.mjs +0 -89
  131. package/dist/lib/node-esm/chunk-AD4C4IK2.mjs.map +0 -7
  132. package/dist/lib/node-esm/chunk-CUPEMOYK.mjs +0 -16
  133. package/dist/lib/node-esm/chunk-CUPEMOYK.mjs.map +0 -7
  134. package/dist/lib/node-esm/chunk-DIUPZXCQ.mjs.map +0 -7
  135. package/dist/lib/node-esm/chunk-DZ7RKC52.mjs +0 -212
  136. package/dist/lib/node-esm/chunk-DZ7RKC52.mjs.map +0 -7
  137. package/dist/lib/node-esm/chunk-EEA6CZ6B.mjs +0 -40
  138. package/dist/lib/node-esm/chunk-EEA6CZ6B.mjs.map +0 -7
  139. package/dist/lib/node-esm/intent-resolver-HEUGQ6SL.mjs +0 -78
  140. package/dist/lib/node-esm/intent-resolver-HEUGQ6SL.mjs.map +0 -7
  141. package/dist/lib/node-esm/react-surface-TER7JEF6.mjs +0 -69
  142. package/dist/lib/node-esm/react-surface-TER7JEF6.mjs.map +0 -7
  143. package/dist/lib/node-esm/types.mjs +0 -9
  144. package/dist/lib/node-esm/types.mjs.map +0 -7
  145. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  146. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  147. package/dist/types/src/components/AutomationContainer.d.ts +0 -7
  148. package/dist/types/src/components/AutomationContainer.d.ts.map +0 -1
  149. package/dist/types/src/components/FunctionsContainer.d.ts +0 -7
  150. package/dist/types/src/components/FunctionsContainer.d.ts.map +0 -1
  151. package/dist/types/src/components/FunctionsPanel/FunctionsPanel.d.ts +0 -7
  152. package/dist/types/src/components/FunctionsPanel/FunctionsPanel.d.ts.map +0 -1
  153. package/dist/types/src/components/FunctionsPanel/index.d.ts +0 -4
  154. package/dist/types/src/components/FunctionsPanel/index.d.ts.map +0 -1
  155. package/dist/types/src/components/TriggerEditor/FunctionInputEditor.d.ts +0 -12
  156. package/dist/types/src/components/TriggerEditor/FunctionInputEditor.d.ts.map +0 -1
  157. package/dist/types/src/components/TriggerEditor/SpecSelector.d.ts +0 -5
  158. package/dist/types/src/components/TriggerEditor/SpecSelector.d.ts.map +0 -1
  159. package/dist/types/src/types.d.ts +0 -25
  160. package/dist/types/src/types.d.ts.map +0 -1
  161. package/src/capabilities/intent-resolver.ts +0 -73
  162. package/src/components/AutomationContainer.tsx +0 -31
  163. package/src/components/FunctionsContainer.tsx +0 -31
  164. package/src/components/FunctionsPanel/FunctionsPanel.tsx +0 -95
  165. package/src/components/FunctionsPanel/index.ts +0 -8
  166. package/src/components/TriggerEditor/FunctionInputEditor.tsx +0 -77
  167. package/src/components/TriggerEditor/SpecSelector.tsx +0 -59
  168. package/src/types.ts +0 -33
@@ -1,5 +1,5 @@
1
1
  //
2
- // Copyright 2025 DXOS.org
2
+ // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
5
  import '@dxos-theme';
@@ -7,11 +7,10 @@ import '@dxos-theme';
7
7
  import { type Meta } from '@storybook/react';
8
8
  import React, { useEffect, useState } from 'react';
9
9
 
10
- import { FunctionType, FunctionTrigger, TriggerKind } from '@dxos/functions';
11
- import { live } from '@dxos/live-object';
12
- import { faker } from '@dxos/random';
10
+ import { FunctionType, FunctionTrigger, TriggerKind } from '@dxos/functions/types';
11
+ import { create } from '@dxos/live-object';
13
12
  import { useSpaces } from '@dxos/react-client/echo';
14
- import { ContactType, withClientProvider } from '@dxos/react-client/testing';
13
+ import { withClientProvider } from '@dxos/react-client/testing';
15
14
  import { withLayout, withTheme } from '@dxos/storybook-utils';
16
15
 
17
16
  import { TriggerEditor } from './TriggerEditor';
@@ -27,7 +26,7 @@ const DefaultStory = () => {
27
26
  return;
28
27
  }
29
28
 
30
- const trigger = space.db.add(live(FunctionTrigger, { spec: { kind: TriggerKind.Timer, cron: '' } }));
29
+ const trigger = space.db.add(create(FunctionTrigger, { spec: { type: TriggerKind.Timer, cron: '' } }));
31
30
  setTrigger(trigger);
32
31
  }, [space]);
33
32
 
@@ -36,8 +35,8 @@ const DefaultStory = () => {
36
35
  }
37
36
 
38
37
  return (
39
- <div role='none' className='w-[32rem] bs-fit border border-separator rounded-sm'>
40
- <TriggerEditor space={space} trigger={trigger} onSave={(values) => console.log('on save', values)} />
38
+ <div role='none' className='flex w-[350px] border border-separator overflow-hidden'>
39
+ <TriggerEditor space={space} trigger={trigger} />
41
40
  </div>
42
41
  );
43
42
  };
@@ -50,22 +49,14 @@ const meta: Meta = {
50
49
  withClientProvider({
51
50
  createIdentity: true,
52
51
  createSpace: true,
53
- types: [FunctionType, FunctionTrigger, ContactType],
52
+ types: [FunctionType, FunctionTrigger],
54
53
  onSpaceCreated: ({ space }) => {
55
54
  for (const fn of functions) {
56
- space.db.add(live(FunctionType, fn));
55
+ space.db.add(create(FunctionType, fn));
57
56
  }
58
- Array.from({ length: 10 }).map(() => {
59
- return space.db.add(
60
- live(ContactType, {
61
- name: faker.person.fullName(),
62
- identifiers: [],
63
- }),
64
- );
65
- });
66
57
  },
67
58
  }),
68
- withLayout({ fullscreen: true, classNames: 'flex justify-center m-2' }),
59
+ withLayout({ fullscreen: true, tooltips: true, classNames: 'flex justify-center m-2' }),
69
60
  withTheme,
70
61
  ],
71
62
  parameters: {
@@ -1,24 +1,22 @@
1
1
  //
2
- // Copyright 2025 DXOS.org
2
+ // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import React, { useCallback, useMemo } from 'react';
5
+ import React, { useCallback, useEffect, useMemo, useState } from 'react';
6
6
 
7
7
  import { ComputeGraph } from '@dxos/conductor';
8
- import { DXN } from '@dxos/echo';
9
8
  import {
10
9
  FunctionType,
11
10
  FunctionTriggerSchema,
12
11
  type FunctionTriggerType,
13
12
  type FunctionTrigger,
14
13
  ScriptType,
15
- } from '@dxos/functions';
16
- import { Filter, Ref, useQuery, type Space } from '@dxos/react-client/echo';
17
- import { useTranslation } from '@dxos/react-ui';
18
- import { type CustomInputMap, Form, SelectInput, useRefQueryLookupHandler } from '@dxos/react-ui-form';
14
+ TriggerKind,
15
+ } from '@dxos/functions/types';
16
+ import { Filter, useQuery, type Space } from '@dxos/react-client/echo';
17
+ import { IconButton, Input, useTranslation } from '@dxos/react-ui';
18
+ import { type CustomInputMap, Form, type InputProps, SelectInput, TextInput, useInputProps } from '@dxos/react-ui-form';
19
19
 
20
- import { FunctionInputEditor } from './FunctionInputEditor';
21
- import { SpecSelector } from './SpecSelector';
22
20
  import { AUTOMATION_PLUGIN } from '../../meta';
23
21
 
24
22
  export type TriggerEditorProps = {
@@ -28,69 +26,111 @@ export type TriggerEditorProps = {
28
26
  onCancel?: () => void;
29
27
  };
30
28
 
29
+ const PayloadInput = (props: InputProps & { property: string }) => {
30
+ const { t } = useTranslation(AUTOMATION_PLUGIN);
31
+ // TODO(dmaretskyi): Prop name (`meta`) should be passed in.
32
+ const inputProps = useInputProps(['meta', props.property]);
33
+ return (
34
+ <div role='none' className='flex items-center mt-2 gap-1'>
35
+ <div role='none' className='flex-1'>
36
+ <TextInput {...inputProps} type='string' label={props.property} />
37
+ </div>
38
+ <IconButton
39
+ icon='ph--trash--regular'
40
+ iconOnly
41
+ classNames={'mt-6'}
42
+ label={t('trigger meta remove')}
43
+ onClick={() => {
44
+ const newValues: any = { ...props.getValue() };
45
+ delete newValues[props.property];
46
+ props.onValueChange('object', newValues);
47
+ }}
48
+ />
49
+ </div>
50
+ );
51
+ };
52
+
31
53
  export const TriggerEditor = ({ space, trigger, onSave, onCancel }: TriggerEditorProps) => {
32
54
  const { t } = useTranslation(AUTOMATION_PLUGIN);
33
55
 
34
- const functions = useQuery(space, Filter.type(FunctionType));
35
- const workflows = useQuery(space, Filter.type(ComputeGraph));
36
- const scripts = useQuery(space, Filter.type(ScriptType));
56
+ const functions = useQuery(space, Filter.schema(FunctionType));
57
+ const workflows = useQuery(space, Filter.schema(ComputeGraph));
58
+ const scripts = useQuery(space, Filter.schema(ScriptType));
37
59
 
38
60
  const handleSave = (values: FunctionTriggerType) => {
39
61
  onSave?.(values);
40
62
  };
41
63
 
42
- const handleRefQueryLookup = useRefQueryLookupHandler({ space });
43
-
44
64
  const Custom = useMemo(
45
65
  (): CustomInputMap => ({
46
- ['function' satisfies keyof FunctionTriggerType]: (props) => {
47
- const getValue = useCallback(() => {
48
- const formValue = props.getValue();
49
- if (Ref.isRef(formValue)) {
50
- return formValue.dxn.toString() as string;
51
- }
52
- return undefined;
53
- }, [props]);
66
+ ['function' satisfies keyof FunctionTriggerType]: (props) => (
67
+ <SelectInput
68
+ {...props}
69
+ options={getWorkflowOptions(workflows).concat(getFunctionOptions(scripts, functions))}
70
+ />
71
+ ),
72
+ ['spec.type' as const]: (props) => (
73
+ <SelectInput
74
+ {...props}
75
+ options={Object.values(TriggerKind).map((kind) => ({
76
+ value: kind,
77
+ label: t(`trigger type ${kind}`),
78
+ }))}
79
+ />
80
+ ),
81
+ // TODO(wittjosiah): Form should be able to handle arbitrary records by default.
82
+ ['meta' as const]: (props) => {
83
+ const payload = props.getValue() ?? {};
84
+ useEffect(() => props.onValueChange('object', { ...payload }), []);
85
+ const [newPayloadFieldName, setNewPayloadFieldName] = useState('');
54
86
 
55
- const handleOnValueChange = useCallback(
56
- (_type: any, dxnString: string) => {
57
- const dxn = DXN.parse(dxnString);
58
- if (dxn) {
59
- const ref = Ref.fromDXN(dxn);
60
- props.onValueChange('object', ref);
61
- }
62
- },
63
- [props.onValueChange],
64
- );
87
+ const handleAddPayload = useCallback(() => {
88
+ if (newPayloadFieldName.length) {
89
+ const payload = props.getValue() ?? {};
90
+ const payloadWithNewProp = { ...payload, [newPayloadFieldName]: '' };
91
+ setNewPayloadFieldName('');
92
+ props.onValueChange('object', payloadWithNewProp);
93
+ }
94
+ }, [newPayloadFieldName, props.getValue, props.onValueChange]);
65
95
 
66
96
  return (
67
- <SelectInput
68
- {...props}
69
- getValue={getValue as any}
70
- onValueChange={handleOnValueChange}
71
- options={getWorkflowOptions(workflows).concat(getFunctionOptions(scripts, functions))}
72
- />
97
+ <>
98
+ <div>{/* TODO(wittjosiah): props.label */ 'Payload'}</div>
99
+ {[...Object.keys(payload)].map((key) => (
100
+ <PayloadInput key={key} property={key} {...props} />
101
+ ))}
102
+ <div role='none' className='flex items-center mt-2 gap-1 plb-1'>
103
+ <div role='none' className='flex-1'>
104
+ <Input.Root>
105
+ <Input.TextInput
106
+ placeholder={t('trigger payload prop name placeholder')}
107
+ value={newPayloadFieldName}
108
+ onChange={(event) => setNewPayloadFieldName(event.target.value)}
109
+ />
110
+ </Input.Root>
111
+ </div>
112
+ <IconButton
113
+ icon='ph--plus--regular'
114
+ iconOnly
115
+ label={t('trigger payload add')}
116
+ onClick={handleAddPayload}
117
+ />
118
+ </div>
119
+ </>
73
120
  );
74
121
  },
75
- ['spec.kind' as const]: SpecSelector,
76
- ['input' as const]: (props) => (
77
- <FunctionInputEditor {...props} functions={functions} onQueryRefOptions={handleRefQueryLookup} />
78
- ),
79
122
  }),
80
123
  [workflows, scripts, functions, t],
81
124
  );
82
125
 
83
126
  return (
84
- <div role='none' className='bs-full is-full'>
85
- <Form
86
- schema={FunctionTriggerSchema}
87
- values={trigger}
88
- onSave={handleSave}
89
- onCancel={onCancel}
90
- Custom={Custom}
91
- onQueryRefOptions={handleRefQueryLookup}
92
- />
93
- </div>
127
+ <Form<FunctionTriggerType>
128
+ schema={FunctionTriggerSchema}
129
+ values={trigger}
130
+ onSave={handleSave}
131
+ onCancel={onCancel}
132
+ Custom={Custom}
133
+ />
94
134
  );
95
135
  };
96
136
 
@@ -100,5 +140,5 @@ const getWorkflowOptions = (graphs: ComputeGraph[]) => {
100
140
 
101
141
  const getFunctionOptions = (scripts: ScriptType[], functions: FunctionType[]) => {
102
142
  const getLabel = (fn: FunctionType) => scripts.find((s) => fn.source?.target?.id === s.id)?.name ?? fn.name;
103
- return functions.map((fn) => ({ label: getLabel(fn), value: `dxn:echo:@:${fn.id}` }));
143
+ return functions.map((fn) => ({ label: getLabel(fn), value: `dxn:worker:${fn.name}` }));
104
144
  };
@@ -6,7 +6,4 @@ import { lazy } from 'react';
6
6
 
7
7
  export * from './TriggerEditor';
8
8
 
9
- export const AutomationContainer = lazy(() => import('./AutomationContainer'));
10
9
  export const AutomationPanel = lazy(() => import('./AutomationPanel'));
11
- export const FunctionsContainer = lazy(() => import('./FunctionsContainer'));
12
- export const FunctionsPanel = lazy(() => import('./FunctionsPanel'));
@@ -2,19 +2,16 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { Schema, SchemaAST } from 'effect';
6
-
7
- import { ContactType } from '@dxos/client/testing';
8
- import { Ref, toJsonSchema } from '@dxos/echo-schema';
5
+ import { AST, S, toJsonSchema } from '@dxos/echo-schema';
9
6
 
10
7
  export const functions = [
11
8
  {
12
9
  name: 'example.com/function/chess',
13
10
  version: '0.1.0',
14
11
  inputSchema: toJsonSchema(
15
- Schema.Struct({
16
- level: Schema.Number.annotations({
17
- [SchemaAST.TitleAnnotationId]: 'Level',
12
+ S.Struct({
13
+ level: S.Number.annotations({
14
+ [AST.TitleAnnotationId]: 'Level',
18
15
  }),
19
16
  }),
20
17
  ),
@@ -24,23 +21,12 @@ export const functions = [
24
21
  version: '0.1.0',
25
22
  binding: 'FOREX',
26
23
  inputSchema: toJsonSchema(
27
- Schema.Struct({
28
- from: Schema.String.annotations({
29
- [SchemaAST.TitleAnnotationId]: 'Currency from',
30
- }),
31
- to: Schema.String.annotations({
32
- [SchemaAST.TitleAnnotationId]: 'Currency to',
24
+ S.Struct({
25
+ from: S.String.annotations({
26
+ [AST.TitleAnnotationId]: 'Currency from',
33
27
  }),
34
- }),
35
- ),
36
- },
37
- {
38
- name: 'example.com/function/ping-contact',
39
- version: '0.0.1',
40
- inputSchema: toJsonSchema(
41
- Schema.Struct({
42
- contact: Ref(ContactType).annotations({
43
- [SchemaAST.TitleAnnotationId]: 'Contact',
28
+ to: S.String.annotations({
29
+ [AST.TitleAnnotationId]: 'Currency to',
44
30
  }),
45
31
  }),
46
32
  ),
@@ -11,17 +11,8 @@ export default [
11
11
  'plugin name': 'Automation',
12
12
  'automation panel label': 'Automations',
13
13
  'script automation label': 'Automation',
14
- 'automation verbose label': 'Manage automations',
15
- 'automation description': 'You can manage all the triggers which automate your space here.',
16
14
 
17
- 'functions panel label': 'Functions',
18
- 'functions verbose label': 'Manage deployed functions',
19
- 'functions description': 'You can manage all the functions deployed from your space on EDGE here.',
20
- 'function copy id': 'Copy Function ID',
21
- 'no functions found': 'No functions found',
22
- 'go to function source button label': 'Show function source',
23
-
24
- 'trigger editor title': 'Configure Trigger',
15
+ 'trigger editor title': 'New Trigger',
25
16
  'new trigger label': 'Add Trigger',
26
17
  'trigger type timer': 'Timer',
27
18
  'trigger type webhook': 'Webhook',
@@ -1,34 +0,0 @@
1
- import {
2
- AutomationPanel
3
- } from "./chunk-2QF27UJ2.mjs";
4
- import "./chunk-BNQNURZN.mjs";
5
- import {
6
- AUTOMATION_PLUGIN
7
- } from "./chunk-WKKQV4PC.mjs";
8
-
9
- // packages/plugins/plugin-automation/src/components/AutomationContainer.tsx
10
- import React from "react";
11
- import { useTranslation } from "@dxos/react-ui";
12
- import { ControlSection, ControlPage } from "@dxos/react-ui-form";
13
- import { StackItem } from "@dxos/react-ui-stack";
14
- var AutomationContainer = ({ space }) => {
15
- const { t } = useTranslation(AUTOMATION_PLUGIN);
16
- return /* @__PURE__ */ React.createElement(StackItem.Content, {
17
- classNames: "block overflow-y-auto"
18
- }, /* @__PURE__ */ React.createElement(ControlPage, null, /* @__PURE__ */ React.createElement(ControlSection, {
19
- title: t("automation verbose label", {
20
- ns: AUTOMATION_PLUGIN
21
- }),
22
- description: t("automation description", {
23
- ns: AUTOMATION_PLUGIN
24
- })
25
- }, /* @__PURE__ */ React.createElement(AutomationPanel, {
26
- space
27
- }))));
28
- };
29
- var AutomationContainer_default = AutomationContainer;
30
- export {
31
- AutomationContainer,
32
- AutomationContainer_default as default
33
- };
34
- //# sourceMappingURL=AutomationContainer-DA6IW7O2.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/components/AutomationContainer.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type Space } from '@dxos/react-client/echo';\nimport { useTranslation } from '@dxos/react-ui';\nimport { ControlSection, ControlPage } from '@dxos/react-ui-form';\nimport { StackItem } from '@dxos/react-ui-stack';\n\nimport { AutomationPanel } from './AutomationPanel';\nimport { AUTOMATION_PLUGIN } from '../meta';\n\nexport const AutomationContainer = ({ space }: { space: Space }) => {\n const { t } = useTranslation(AUTOMATION_PLUGIN);\n return (\n <StackItem.Content classNames='block overflow-y-auto'>\n <ControlPage>\n <ControlSection\n title={t('automation verbose label', { ns: AUTOMATION_PLUGIN })}\n description={t('automation description', { ns: AUTOMATION_PLUGIN })}\n >\n <AutomationPanel space={space} />\n </ControlSection>\n </ControlPage>\n </StackItem.Content>\n );\n};\n\nexport default AutomationContainer;\n"],
5
- "mappings": ";;;;;;;;;AAIA,OAAOA,WAAW;AAGlB,SAASC,sBAAsB;AAC/B,SAASC,gBAAgBC,mBAAmB;AAC5C,SAASC,iBAAiB;AAKnB,IAAMC,sBAAsB,CAAC,EAAEC,MAAK,MAAoB;AAC7D,QAAM,EAAEC,EAAC,IAAKC,eAAeC,iBAAAA;AAC7B,SACE,sBAAA,cAACC,UAAUC,SAAO;IAACC,YAAW;KAC5B,sBAAA,cAACC,aAAAA,MACC,sBAAA,cAACC,gBAAAA;IACCC,OAAOR,EAAE,4BAA4B;MAAES,IAAIP;IAAkB,CAAA;IAC7DQ,aAAaV,EAAE,0BAA0B;MAAES,IAAIP;IAAkB,CAAA;KAEjE,sBAAA,cAACS,iBAAAA;IAAgBZ;;AAK3B;AAEA,IAAA,8BAAeD;",
6
- "names": ["React", "useTranslation", "ControlSection", "ControlPage", "StackItem", "AutomationContainer", "space", "t", "useTranslation", "AUTOMATION_PLUGIN", "StackItem", "Content", "classNames", "ControlPage", "ControlSection", "title", "ns", "description", "AutomationPanel"]
7
- }
@@ -1,11 +0,0 @@
1
- import {
2
- AutomationPanel,
3
- AutomationPanel_default
4
- } from "./chunk-2QF27UJ2.mjs";
5
- import "./chunk-BNQNURZN.mjs";
6
- import "./chunk-WKKQV4PC.mjs";
7
- export {
8
- AutomationPanel,
9
- AutomationPanel_default as default
10
- };
11
- //# sourceMappingURL=AutomationPanel-R42D3LDD.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": [],
4
- "sourcesContent": [],
5
- "mappings": "",
6
- "names": []
7
- }
@@ -1,33 +0,0 @@
1
- import {
2
- FunctionsPanel
3
- } from "./chunk-TRC3J2I6.mjs";
4
- import {
5
- AUTOMATION_PLUGIN
6
- } from "./chunk-WKKQV4PC.mjs";
7
-
8
- // packages/plugins/plugin-automation/src/components/FunctionsContainer.tsx
9
- import React from "react";
10
- import { useTranslation } from "@dxos/react-ui";
11
- import { ControlPage, ControlSection } from "@dxos/react-ui-form";
12
- import { StackItem } from "@dxos/react-ui-stack";
13
- var FunctionsContainer = ({ space }) => {
14
- const { t } = useTranslation(AUTOMATION_PLUGIN);
15
- return /* @__PURE__ */ React.createElement(StackItem.Content, {
16
- classNames: "block overflow-y-auto"
17
- }, /* @__PURE__ */ React.createElement(ControlPage, null, /* @__PURE__ */ React.createElement(ControlSection, {
18
- title: t("functions verbose label", {
19
- ns: AUTOMATION_PLUGIN
20
- }),
21
- description: t("functions description", {
22
- ns: AUTOMATION_PLUGIN
23
- })
24
- }, /* @__PURE__ */ React.createElement(FunctionsPanel, {
25
- space
26
- }))));
27
- };
28
- var FunctionsContainer_default = FunctionsContainer;
29
- export {
30
- FunctionsContainer,
31
- FunctionsContainer_default as default
32
- };
33
- //# sourceMappingURL=FunctionsContainer-MPBMMOMS.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/components/FunctionsContainer.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type Space } from '@dxos/react-client/echo';\nimport { useTranslation } from '@dxos/react-ui';\nimport { ControlPage, ControlSection } from '@dxos/react-ui-form';\nimport { StackItem } from '@dxos/react-ui-stack';\n\nimport { FunctionsPanel } from './FunctionsPanel';\nimport { AUTOMATION_PLUGIN } from '../meta';\n\nexport const FunctionsContainer = ({ space }: { space: Space }) => {\n const { t } = useTranslation(AUTOMATION_PLUGIN);\n return (\n <StackItem.Content classNames='block overflow-y-auto'>\n <ControlPage>\n <ControlSection\n title={t('functions verbose label', { ns: AUTOMATION_PLUGIN })}\n description={t('functions description', { ns: AUTOMATION_PLUGIN })}\n >\n <FunctionsPanel space={space} />\n </ControlSection>\n </ControlPage>\n </StackItem.Content>\n );\n};\n\nexport default FunctionsContainer;\n"],
5
- "mappings": ";;;;;;;;AAIA,OAAOA,WAAW;AAGlB,SAASC,sBAAsB;AAC/B,SAASC,aAAaC,sBAAsB;AAC5C,SAASC,iBAAiB;AAKnB,IAAMC,qBAAqB,CAAC,EAAEC,MAAK,MAAoB;AAC5D,QAAM,EAAEC,EAAC,IAAKC,eAAeC,iBAAAA;AAC7B,SACE,sBAAA,cAACC,UAAUC,SAAO;IAACC,YAAW;KAC5B,sBAAA,cAACC,aAAAA,MACC,sBAAA,cAACC,gBAAAA;IACCC,OAAOR,EAAE,2BAA2B;MAAES,IAAIP;IAAkB,CAAA;IAC5DQ,aAAaV,EAAE,yBAAyB;MAAES,IAAIP;IAAkB,CAAA;KAEhE,sBAAA,cAACS,gBAAAA;IAAeZ;;AAK1B;AAEA,IAAA,6BAAeD;",
6
- "names": ["React", "useTranslation", "ControlPage", "ControlSection", "StackItem", "FunctionsContainer", "space", "t", "useTranslation", "AUTOMATION_PLUGIN", "StackItem", "Content", "classNames", "ControlPage", "ControlSection", "title", "ns", "description", "FunctionsPanel"]
7
- }
@@ -1,10 +0,0 @@
1
- import {
2
- FunctionsPanel,
3
- FunctionsPanel_default
4
- } from "./chunk-TRC3J2I6.mjs";
5
- import "./chunk-WKKQV4PC.mjs";
6
- export {
7
- FunctionsPanel,
8
- FunctionsPanel_default as default
9
- };
10
- //# sourceMappingURL=FunctionsPanel-NSI3P53X.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": [],
4
- "sourcesContent": [],
5
- "mappings": "",
6
- "names": []
7
- }
@@ -1,79 +0,0 @@
1
- import {
2
- meta
3
- } from "./chunk-WKKQV4PC.mjs";
4
-
5
- // packages/plugins/plugin-automation/src/capabilities/app-graph-builder.ts
6
- import { Rx } from "@effect-rx/rx-react";
7
- import { Option, pipe } from "effect";
8
- import { Capabilities, contributes } from "@dxos/app-framework";
9
- import { isInstanceOf } from "@dxos/echo-schema";
10
- import { ScriptType } from "@dxos/functions";
11
- import { PLANK_COMPANION_TYPE, ATTENDABLE_PATH_SEPARATOR } from "@dxos/plugin-deck/types";
12
- import { createExtension } from "@dxos/plugin-graph";
13
- import { SPACE_PLUGIN } from "@dxos/plugin-space";
14
- var app_graph_builder_default = (context) => contributes(Capabilities.AppGraphBuilder, [
15
- createExtension({
16
- id: `${meta.id}/space-settings-automation`,
17
- connector: (node) => Rx.make((get) => pipe(get(node), Option.flatMap((node2) => node2.type === `${SPACE_PLUGIN}/settings` ? Option.some(node2) : Option.none()), Option.map((node2) => [
18
- {
19
- id: `automation-${node2.id}`,
20
- type: `${meta.id}/space-settings-automation`,
21
- data: `${meta.id}/space-settings-automation`,
22
- properties: {
23
- label: [
24
- "automation panel label",
25
- {
26
- ns: meta.id
27
- }
28
- ],
29
- icon: "ph--lightning--regular"
30
- }
31
- }
32
- ]), Option.getOrElse(() => [])))
33
- }),
34
- createExtension({
35
- id: `${meta.id}/space-settings-functions`,
36
- connector: (node) => Rx.make((get) => pipe(get(node), Option.flatMap((node2) => node2.type === `${SPACE_PLUGIN}/settings` ? Option.some(node2) : Option.none()), Option.map((node2) => [
37
- {
38
- id: `functions-${node2.id}`,
39
- type: `${meta.id}/space-settings-functions`,
40
- data: `${meta.id}/space-settings-functions`,
41
- properties: {
42
- label: [
43
- "functions panel label",
44
- {
45
- ns: meta.id
46
- }
47
- ],
48
- icon: "ph--function--regular"
49
- }
50
- }
51
- ]), Option.getOrElse(() => [])))
52
- }),
53
- createExtension({
54
- id: `${meta.id}/script-companion`,
55
- connector: (node) => Rx.make((get) => pipe(get(node), Option.flatMap((node2) => isInstanceOf(ScriptType, node2.data) ? Option.some(node2) : Option.none()), Option.map((node2) => [
56
- {
57
- id: [
58
- node2.id,
59
- "automation"
60
- ].join(ATTENDABLE_PATH_SEPARATOR),
61
- type: PLANK_COMPANION_TYPE,
62
- data: "automation",
63
- properties: {
64
- label: [
65
- "script automation label",
66
- {
67
- ns: meta.id
68
- }
69
- ],
70
- icon: "ph--lightning--regular"
71
- }
72
- }
73
- ]), Option.getOrElse(() => [])))
74
- })
75
- ]);
76
- export {
77
- app_graph_builder_default as default
78
- };
79
- //# sourceMappingURL=app-graph-builder-2OGPEVBA.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/app-graph-builder.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Rx } from '@effect-rx/rx-react';\nimport { Option, pipe } from 'effect';\n\nimport { Capabilities, contributes, type PluginContext } from '@dxos/app-framework';\nimport { isInstanceOf } from '@dxos/echo-schema';\nimport { ScriptType } from '@dxos/functions';\nimport { PLANK_COMPANION_TYPE, ATTENDABLE_PATH_SEPARATOR } from '@dxos/plugin-deck/types';\nimport { createExtension } from '@dxos/plugin-graph';\nimport { SPACE_PLUGIN } from '@dxos/plugin-space';\n\nimport { meta } from '../meta';\n\nexport default (context: PluginContext) =>\n contributes(Capabilities.AppGraphBuilder, [\n createExtension({\n id: `${meta.id}/space-settings-automation`,\n connector: (node) =>\n Rx.make((get) =>\n pipe(\n get(node),\n Option.flatMap((node) => (node.type === `${SPACE_PLUGIN}/settings` ? Option.some(node) : Option.none())),\n Option.map((node) => [\n {\n id: `automation-${node.id}`,\n type: `${meta.id}/space-settings-automation`,\n data: `${meta.id}/space-settings-automation`,\n properties: {\n label: ['automation panel label', { ns: meta.id }],\n icon: 'ph--lightning--regular',\n },\n },\n ]),\n Option.getOrElse(() => []),\n ),\n ),\n }),\n createExtension({\n id: `${meta.id}/space-settings-functions`,\n connector: (node) =>\n Rx.make((get) =>\n pipe(\n get(node),\n Option.flatMap((node) => (node.type === `${SPACE_PLUGIN}/settings` ? Option.some(node) : Option.none())),\n Option.map((node) => [\n {\n id: `functions-${node.id}`,\n type: `${meta.id}/space-settings-functions`,\n data: `${meta.id}/space-settings-functions`,\n properties: {\n label: ['functions panel label', { ns: meta.id }],\n icon: 'ph--function--regular',\n },\n },\n ]),\n Option.getOrElse(() => []),\n ),\n ),\n }),\n createExtension({\n id: `${meta.id}/script-companion`,\n connector: (node) =>\n Rx.make((get) =>\n pipe(\n get(node),\n Option.flatMap((node) => (isInstanceOf(ScriptType, node.data) ? Option.some(node) : Option.none())),\n Option.map((node) => [\n {\n id: [node.id, 'automation'].join(ATTENDABLE_PATH_SEPARATOR),\n type: PLANK_COMPANION_TYPE,\n data: 'automation',\n properties: {\n label: ['script automation label', { ns: meta.id }],\n icon: 'ph--lightning--regular',\n },\n },\n ]),\n Option.getOrElse(() => []),\n ),\n ),\n }),\n ]);\n"],
5
- "mappings": ";;;;;AAIA,SAASA,UAAU;AACnB,SAASC,QAAQC,YAAY;AAE7B,SAASC,cAAcC,mBAAuC;AAC9D,SAASC,oBAAoB;AAC7B,SAASC,kBAAkB;AAC3B,SAASC,sBAAsBC,iCAAiC;AAChE,SAASC,uBAAuB;AAChC,SAASC,oBAAoB;AAI7B,IAAA,4BAAe,CAACC,YACdC,YAAYC,aAAaC,iBAAiB;EACxCC,gBAAgB;IACdC,IAAI,GAAGC,KAAKD,EAAE;IACdE,WAAW,CAACC,SACVC,GAAGC,KAAK,CAACC,QACPC,KACED,IAAIH,IAAAA,GACJK,OAAOC,QAAQ,CAACN,UAAUA,MAAKO,SAAS,GAAGC,YAAAA,cAA0BH,OAAOI,KAAKT,KAAAA,IAAQK,OAAOK,KAAI,CAAA,GACpGL,OAAOM,IAAI,CAACX,UAAS;MACnB;QACEH,IAAI,cAAcG,MAAKH,EAAE;QACzBU,MAAM,GAAGT,KAAKD,EAAE;QAChBe,MAAM,GAAGd,KAAKD,EAAE;QAChBgB,YAAY;UACVC,OAAO;YAAC;YAA0B;cAAEC,IAAIjB,KAAKD;YAAG;;UAChDmB,MAAM;QACR;MACF;KACD,GACDX,OAAOY,UAAU,MAAM,CAAA,CAAE,CAAA,CAAA;EAGjC,CAAA;EACArB,gBAAgB;IACdC,IAAI,GAAGC,KAAKD,EAAE;IACdE,WAAW,CAACC,SACVC,GAAGC,KAAK,CAACC,QACPC,KACED,IAAIH,IAAAA,GACJK,OAAOC,QAAQ,CAACN,UAAUA,MAAKO,SAAS,GAAGC,YAAAA,cAA0BH,OAAOI,KAAKT,KAAAA,IAAQK,OAAOK,KAAI,CAAA,GACpGL,OAAOM,IAAI,CAACX,UAAS;MACnB;QACEH,IAAI,aAAaG,MAAKH,EAAE;QACxBU,MAAM,GAAGT,KAAKD,EAAE;QAChBe,MAAM,GAAGd,KAAKD,EAAE;QAChBgB,YAAY;UACVC,OAAO;YAAC;YAAyB;cAAEC,IAAIjB,KAAKD;YAAG;;UAC/CmB,MAAM;QACR;MACF;KACD,GACDX,OAAOY,UAAU,MAAM,CAAA,CAAE,CAAA,CAAA;EAGjC,CAAA;EACArB,gBAAgB;IACdC,IAAI,GAAGC,KAAKD,EAAE;IACdE,WAAW,CAACC,SACVC,GAAGC,KAAK,CAACC,QACPC,KACED,IAAIH,IAAAA,GACJK,OAAOC,QAAQ,CAACN,UAAUkB,aAAaC,YAAYnB,MAAKY,IAAI,IAAIP,OAAOI,KAAKT,KAAAA,IAAQK,OAAOK,KAAI,CAAA,GAC/FL,OAAOM,IAAI,CAACX,UAAS;MACnB;QACEH,IAAI;UAACG,MAAKH;UAAI;UAAcuB,KAAKC,yBAAAA;QACjCd,MAAMe;QACNV,MAAM;QACNC,YAAY;UACVC,OAAO;YAAC;YAA2B;cAAEC,IAAIjB,KAAKD;YAAG;;UACjDmB,MAAM;QACR;MACF;KACD,GACDX,OAAOY,UAAU,MAAM,CAAA,CAAE,CAAA,CAAA;EAGjC,CAAA;CACD;",
6
- "names": ["Rx", "Option", "pipe", "Capabilities", "contributes", "isInstanceOf", "ScriptType", "PLANK_COMPANION_TYPE", "ATTENDABLE_PATH_SEPARATOR", "createExtension", "SPACE_PLUGIN", "context", "contributes", "Capabilities", "AppGraphBuilder", "createExtension", "id", "meta", "connector", "node", "Rx", "make", "get", "pipe", "Option", "flatMap", "type", "SPACE_PLUGIN", "some", "none", "map", "data", "properties", "label", "ns", "icon", "getOrElse", "isInstanceOf", "ScriptType", "join", "ATTENDABLE_PATH_SEPARATOR", "PLANK_COMPANION_TYPE"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/components/AutomationPanel/AutomationPanel.tsx", "../../../src/components/AutomationPanel/index.ts"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Schema } from 'effect';\nimport React, { useState } from 'react';\n\nimport {\n FunctionType,\n FunctionTrigger,\n FunctionTriggerSchema,\n TriggerKind,\n type FunctionTriggerType,\n ScriptType,\n} from '@dxos/functions';\nimport { type Client, useClient } from '@dxos/react-client';\nimport { live, Filter, useQuery, type Space, type Live, getSpace } from '@dxos/react-client/echo';\nimport { Clipboard, IconButton, Input, Separator, useTranslation } from '@dxos/react-ui';\nimport { ControlItem, controlItemClasses } from '@dxos/react-ui-form';\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?: Live<any>;\n initialTrigger?: FunctionTriggerType;\n onDone?: () => void;\n};\n\n// TODO(burdon): Factor out common layout with ViewEditor.\nexport const AutomationPanel = ({ space, object, initialTrigger, onDone }: AutomationPanelProps) => {\n const { t } = useTranslation(AUTOMATION_PLUGIN);\n const client = useClient();\n const triggers = useQuery(space, Filter.type(FunctionTrigger));\n const functions = useQuery(space, Filter.type(FunctionType));\n const scripts = useQuery(space, Filter.type(ScriptType));\n\n const [trigger, setTrigger] = useState<FunctionTriggerType | undefined>(initialTrigger);\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(live(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(live(FunctionTrigger, trigger));\n }\n\n setTrigger(undefined);\n setSelected(undefined);\n onDone?.();\n };\n\n const handleCancel: TriggerEditorProps['onCancel'] = () => {\n setTrigger(undefined);\n onDone?.();\n };\n\n return (\n <div className='flex flex-col w-full'>\n {trigger ? (\n <ControlItem title={t('trigger editor title')}>\n <TriggerEditor space={space} trigger={trigger} onSave={handleSave} onCancel={handleCancel} />\n </ControlItem>\n ) : (\n <div role='none' className={controlItemClasses}>\n <List.Root<FunctionTrigger> items={triggers} isItem={Schema.is(FunctionTrigger)} getId={(field) => field.id}>\n {({ items: triggers }) => (\n <div role='list' className='flex flex-col w-full'>\n {triggers?.map((trigger) => {\n const copyAction = getCopyAction(client, trigger);\n return (\n <List.Item<FunctionTrigger>\n key={trigger.id}\n item={trigger}\n classNames={mx(grid, ghostHover, 'items-center', 'px-2')}\n >\n <Input.Root>\n <Input.Switch\n checked={trigger.enabled}\n onCheckedChange={(checked) => (trigger.enabled = checked)}\n />\n </Input.Root>\n\n <div className={'flex'}>\n <List.ItemTitle\n classNames='px-1 cursor-pointer w-0 shrink truncate'\n onClick={() => handleSelect(trigger)}\n >\n {getFunctionName(scripts, functions, trigger) ?? '∅'}\n </List.ItemTitle>\n\n {/* TODO: a better way to expose copy action */}\n {copyAction && (\n <Clipboard.IconButton\n label={t(copyAction.translationKey)}\n value={copyAction.contentProvider()}\n />\n )}\n </div>\n\n <List.ItemDeleteButton onClick={() => handleDelete(trigger)} />\n </List.Item>\n );\n })}\n </div>\n )}\n </List.Root>\n {triggers.length > 0 && <Separator classNames='mlb-4' />}\n <IconButton icon='ph--plus--regular' label={t('new trigger label')} onClick={handleAdd} />\n </div>\n )}\n </div>\n );\n};\n\nconst getCopyAction = (client: Client, trigger: FunctionTrigger | undefined) => {\n if (trigger?.spec?.kind === TriggerKind.Email) {\n return { translationKey: 'trigger copy email', contentProvider: () => `${getSpace(trigger)!.id}@dxos.network` };\n }\n\n if (trigger?.spec?.kind === TriggerKind.Webhook) {\n return { translationKey: 'trigger copy url', contentProvider: () => getWebhookUrl(client, trigger) };\n }\n\n return undefined;\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 // TODO(wittjosiah): Truncation should be done in the UI.\n // Warning that the List component is currently a can of worms.\n const shortId = trigger.function && `${trigger.function.dxn.toString().slice(0, 16)}…`;\n const functionObject = functions.find((fn) => fn === trigger.function?.target);\n if (!functionObject) {\n return shortId;\n }\n\n return scripts.find((s) => functionObject.source?.target?.id === s.id)?.name ?? shortId;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { AutomationPanel } from './AutomationPanel';\n\nexport * from './AutomationPanel';\n\nexport default AutomationPanel;\n"],
5
- "mappings": "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",
6
- "names": ["Schema", "React", "useState", "FunctionType", "FunctionTrigger", "FunctionTriggerSchema", "TriggerKind", "ScriptType", "useClient", "live", "Filter", "useQuery", "getSpace", "Clipboard", "IconButton", "Input", "Separator", "useTranslation", "ControlItem", "controlItemClasses", "List", "ghostHover", "mx", "grid", "AutomationPanel", "space", "object", "initialTrigger", "onDone", "t", "useTranslation", "AUTOMATION_PLUGIN", "client", "useClient", "triggers", "useQuery", "Filter", "type", "FunctionTrigger", "functions", "FunctionType", "scripts", "ScriptType", "trigger", "setTrigger", "useState", "selected", "setSelected", "handleSelect", "id", "_", "values", "handleAdd", "live", "FunctionTriggerSchema", "undefined", "handleDelete", "db", "remove", "handleSave", "Object", "assign", "add", "handleCancel", "div", "className", "ControlItem", "title", "TriggerEditor", "onSave", "onCancel", "role", "controlItemClasses", "List", "Root", "items", "isItem", "Schema", "is", "getId", "field", "map", "copyAction", "getCopyAction", "Item", "key", "item", "classNames", "mx", "ghostHover", "Input", "Switch", "checked", "enabled", "onCheckedChange", "ItemTitle", "onClick", "getFunctionName", "Clipboard", "IconButton", "label", "translationKey", "value", "contentProvider", "ItemDeleteButton", "length", "Separator", "icon", "spec", "kind", "TriggerKind", "Email", "getSpace", "Webhook", "getWebhookUrl", "spaceId", "edgeUrl", "URL", "config", "runtime", "services", "edge", "url", "isSecure", "protocol", "startsWith", "toString", "shortId", "function", "dxn", "slice", "functionObject", "find", "fn", "target", "s", "source", "name", "AutomationPanel"]
7
- }