@dxos/plugin-automation 0.8.4-main.dedc0f3 → 0.8.4-main.ead640a

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/dist/lib/browser/AutomationPanel-3PHA5FTJ.mjs +11 -0
  2. package/dist/lib/browser/AutomationSettings-OQERZHTG.mjs +69 -0
  3. package/dist/lib/browser/AutomationSettings-OQERZHTG.mjs.map +7 -0
  4. package/dist/lib/browser/{FunctionsContainer-U4HASI4P.mjs → FunctionsContainer-V3OM6BFC.mjs} +7 -7
  5. package/dist/lib/browser/FunctionsContainer-V3OM6BFC.mjs.map +7 -0
  6. package/dist/lib/browser/{FunctionsPanel-I443Y6KB.mjs → FunctionsPanel-PTFCCUTB.mjs} +3 -3
  7. package/dist/lib/browser/{app-graph-builder-4OFKIRAI.mjs → app-graph-builder-DV5HMFX4.mjs} +10 -9
  8. package/dist/lib/browser/app-graph-builder-DV5HMFX4.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-2AOFK5FW.mjs +14 -0
  10. package/dist/lib/browser/chunk-2AOFK5FW.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-5ARH77PV.mjs +15 -0
  12. package/dist/lib/browser/chunk-5ARH77PV.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-Z5DT4MHW.mjs → chunk-DK7R2HNC.mjs} +20 -7
  14. package/dist/lib/browser/chunk-DK7R2HNC.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-MVPRI3DB.mjs +53 -0
  16. package/dist/lib/browser/chunk-MVPRI3DB.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-QACR4BJ7.mjs +14 -0
  18. package/dist/lib/browser/chunk-QACR4BJ7.mjs.map +7 -0
  19. package/dist/lib/browser/{chunk-S4SM663I.mjs → chunk-SUKAEYF3.mjs} +55 -18
  20. package/dist/lib/browser/chunk-SUKAEYF3.mjs.map +7 -0
  21. package/dist/lib/browser/{chunk-HN7OHFCB.mjs → chunk-VGBZKM3O.mjs} +3 -3
  22. package/dist/lib/browser/chunk-VGBZKM3O.mjs.map +7 -0
  23. package/dist/lib/browser/{chunk-4TWQV33E.mjs → chunk-VL3KSDVL.mjs} +57 -17
  24. package/dist/lib/browser/chunk-VL3KSDVL.mjs.map +7 -0
  25. package/dist/lib/browser/{chunk-GW5U2DGT.mjs → chunk-WWURMV25.mjs} +2 -4
  26. package/dist/lib/browser/chunk-WWURMV25.mjs.map +7 -0
  27. package/dist/lib/browser/compute-runtime-YJREH6WP.mjs +160 -0
  28. package/dist/lib/browser/compute-runtime-YJREH6WP.mjs.map +7 -0
  29. package/dist/lib/browser/hooks/index.mjs +12 -0
  30. package/dist/lib/browser/index.mjs +35 -14
  31. package/dist/lib/browser/index.mjs.map +4 -4
  32. package/dist/lib/browser/{intent-resolver-4PSYSQQG.mjs → intent-resolver-D2OHKQRR.mjs} +5 -5
  33. package/dist/lib/browser/{intent-resolver-4PSYSQQG.mjs.map → intent-resolver-D2OHKQRR.mjs.map} +1 -1
  34. package/dist/lib/browser/meta.json +1 -1
  35. package/dist/lib/browser/{react-surface-M52XGLXY.mjs → react-surface-POLPITTD.mjs} +18 -19
  36. package/dist/lib/browser/react-surface-POLPITTD.mjs.map +7 -0
  37. package/dist/lib/browser/types/index.mjs +2 -2
  38. package/dist/lib/node-esm/{AutomationPanel-MKOLA2FE.mjs → AutomationPanel-EETYIR35.mjs} +4 -4
  39. package/dist/lib/node-esm/AutomationSettings-MCB7HK3O.mjs +70 -0
  40. package/dist/lib/node-esm/AutomationSettings-MCB7HK3O.mjs.map +7 -0
  41. package/dist/lib/node-esm/{FunctionsContainer-VZIVURH6.mjs → FunctionsContainer-UGODP6YP.mjs} +7 -7
  42. package/dist/lib/node-esm/FunctionsContainer-UGODP6YP.mjs.map +7 -0
  43. package/dist/lib/node-esm/{FunctionsPanel-ELINCXPW.mjs → FunctionsPanel-JQFBRVOC.mjs} +3 -3
  44. package/dist/lib/node-esm/FunctionsPanel-JQFBRVOC.mjs.map +7 -0
  45. package/dist/lib/node-esm/{app-graph-builder-555IHYOB.mjs → app-graph-builder-TR2WXPX2.mjs} +10 -9
  46. package/dist/lib/node-esm/app-graph-builder-TR2WXPX2.mjs.map +7 -0
  47. package/dist/lib/node-esm/{chunk-NK5N3QKD.mjs → chunk-5MQJPJR2.mjs} +2 -4
  48. package/dist/lib/node-esm/chunk-5MQJPJR2.mjs.map +7 -0
  49. package/dist/lib/node-esm/{chunk-AONUBWBE.mjs → chunk-AKHETVIQ.mjs} +57 -17
  50. package/dist/lib/node-esm/chunk-AKHETVIQ.mjs.map +7 -0
  51. package/dist/lib/node-esm/{chunk-OEZNHUL2.mjs → chunk-CJUI6AKX.mjs} +3 -3
  52. package/dist/lib/node-esm/chunk-CJUI6AKX.mjs.map +7 -0
  53. package/dist/lib/node-esm/{chunk-CX2AILIS.mjs → chunk-G72KHW5A.mjs} +20 -7
  54. package/dist/lib/node-esm/chunk-G72KHW5A.mjs.map +7 -0
  55. package/dist/lib/node-esm/{chunk-ZOJVKPCA.mjs → chunk-J3XEBEIE.mjs} +55 -18
  56. package/dist/lib/node-esm/chunk-J3XEBEIE.mjs.map +7 -0
  57. package/dist/lib/node-esm/chunk-LB7UQ4SK.mjs +16 -0
  58. package/dist/lib/node-esm/chunk-LB7UQ4SK.mjs.map +7 -0
  59. package/dist/lib/node-esm/chunk-QCA543ZR.mjs +54 -0
  60. package/dist/lib/node-esm/chunk-QCA543ZR.mjs.map +7 -0
  61. package/dist/lib/node-esm/chunk-TXFXIA34.mjs +16 -0
  62. package/dist/lib/node-esm/chunk-TXFXIA34.mjs.map +7 -0
  63. package/dist/lib/node-esm/chunk-WHCSOUNN.mjs +16 -0
  64. package/dist/lib/node-esm/chunk-WHCSOUNN.mjs.map +7 -0
  65. package/dist/lib/node-esm/compute-runtime-CMEPAYND.mjs +161 -0
  66. package/dist/lib/node-esm/compute-runtime-CMEPAYND.mjs.map +7 -0
  67. package/dist/lib/node-esm/hooks/index.mjs +13 -0
  68. package/dist/lib/node-esm/hooks/index.mjs.map +7 -0
  69. package/dist/lib/node-esm/index.mjs +35 -14
  70. package/dist/lib/node-esm/index.mjs.map +4 -4
  71. package/dist/lib/node-esm/{intent-resolver-6ZGBUILG.mjs → intent-resolver-2LGBVXT5.mjs} +5 -5
  72. package/dist/lib/node-esm/{intent-resolver-6ZGBUILG.mjs.map → intent-resolver-2LGBVXT5.mjs.map} +1 -1
  73. package/dist/lib/node-esm/meta.json +1 -1
  74. package/dist/lib/node-esm/{react-surface-Y6AOXM75.mjs → react-surface-5ULTTXAZ.mjs} +18 -19
  75. package/dist/lib/node-esm/react-surface-5ULTTXAZ.mjs.map +7 -0
  76. package/dist/lib/node-esm/types/index.mjs +2 -2
  77. package/dist/types/src/AutomationPlugin.d.ts +1 -1
  78. package/dist/types/src/AutomationPlugin.d.ts.map +1 -1
  79. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  80. package/dist/types/src/capabilities/capabilities.d.ts +19 -0
  81. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -0
  82. package/dist/types/src/capabilities/compute-runtime.d.ts +5 -0
  83. package/dist/types/src/capabilities/compute-runtime.d.ts.map +1 -0
  84. package/dist/types/src/capabilities/index.d.ts +2 -0
  85. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  86. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  87. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts.map +1 -1
  88. package/dist/types/src/components/AutomationPanel/AutomationPanel.stories.d.ts +3 -1
  89. package/dist/types/src/components/AutomationPanel/AutomationPanel.stories.d.ts.map +1 -1
  90. package/dist/types/src/components/AutomationSettings.d.ts +5 -0
  91. package/dist/types/src/components/AutomationSettings.d.ts.map +1 -0
  92. package/dist/types/src/components/FunctionsPanel/FunctionsPanel.d.ts.map +1 -1
  93. package/dist/types/src/components/TriggerEditor/FunctionInputEditor.d.ts.map +1 -1
  94. package/dist/types/src/components/TriggerEditor/SpecSelector.d.ts.map +1 -1
  95. package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts +4 -2
  96. package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts.map +1 -1
  97. package/dist/types/src/components/TriggerEditor/TriggerEditor.stories.d.ts +7 -4
  98. package/dist/types/src/components/TriggerEditor/TriggerEditor.stories.d.ts.map +1 -1
  99. package/dist/types/src/components/TriggerSettings.d.ts +6 -0
  100. package/dist/types/src/components/TriggerSettings.d.ts.map +1 -0
  101. package/dist/types/src/components/index.d.ts +1 -1
  102. package/dist/types/src/components/index.d.ts.map +1 -1
  103. package/dist/types/src/events.d.ts +4 -0
  104. package/dist/types/src/events.d.ts.map +1 -0
  105. package/dist/types/src/hooks/index.d.ts +3 -0
  106. package/dist/types/src/hooks/index.d.ts.map +1 -0
  107. package/dist/types/src/hooks/useComputeRuntimeCallback.d.ts +8 -0
  108. package/dist/types/src/hooks/useComputeRuntimeCallback.d.ts.map +1 -0
  109. package/dist/types/src/hooks/useTriggerRuntimeControls.d.ts +11 -0
  110. package/dist/types/src/hooks/useTriggerRuntimeControls.d.ts.map +1 -0
  111. package/dist/types/src/index.d.ts +2 -0
  112. package/dist/types/src/index.d.ts.map +1 -1
  113. package/dist/types/src/meta.d.ts +0 -1
  114. package/dist/types/src/meta.d.ts.map +1 -1
  115. package/dist/types/src/translations.d.ts +3 -0
  116. package/dist/types/src/translations.d.ts.map +1 -1
  117. package/dist/types/src/types/schema.d.ts +1 -1
  118. package/dist/types/src/types/schema.d.ts.map +1 -1
  119. package/dist/types/tsconfig.tsbuildinfo +1 -1
  120. package/package.json +58 -37
  121. package/src/AutomationPlugin.tsx +35 -29
  122. package/src/capabilities/app-graph-builder.ts +8 -7
  123. package/src/capabilities/capabilities.ts +48 -0
  124. package/src/capabilities/compute-runtime.ts +138 -0
  125. package/src/capabilities/index.ts +3 -0
  126. package/src/capabilities/react-surface.tsx +13 -14
  127. package/src/components/AutomationPanel/AutomationPanel.stories.tsx +3 -6
  128. package/src/components/AutomationPanel/AutomationPanel.tsx +78 -15
  129. package/src/components/{AutomationContainer.tsx → AutomationSettings.tsx} +8 -6
  130. package/src/components/FunctionsContainer.tsx +4 -4
  131. package/src/components/FunctionsPanel/FunctionsPanel.tsx +16 -4
  132. package/src/components/TriggerEditor/FunctionInputEditor.tsx +8 -2
  133. package/src/components/TriggerEditor/SpecSelector.tsx +10 -4
  134. package/src/components/TriggerEditor/TriggerEditor.stories.tsx +57 -18
  135. package/src/components/TriggerEditor/TriggerEditor.tsx +35 -9
  136. package/src/components/TriggerSettings.tsx +25 -0
  137. package/src/components/index.ts +1 -1
  138. package/src/events.ts +11 -0
  139. package/src/hooks/index.ts +6 -0
  140. package/src/hooks/useComputeRuntimeCallback.ts +30 -0
  141. package/src/hooks/useTriggerRuntimeControls.ts +52 -0
  142. package/src/index.ts +2 -0
  143. package/src/meta.ts +1 -3
  144. package/src/testing/test-functions.ts +1 -1
  145. package/src/translations.ts +5 -0
  146. package/src/types/schema.ts +1 -1
  147. package/dist/lib/browser/AutomationContainer-BRV5AJZ3.mjs +0 -35
  148. package/dist/lib/browser/AutomationContainer-BRV5AJZ3.mjs.map +0 -7
  149. package/dist/lib/browser/AutomationPanel-N5HFJJXW.mjs +0 -11
  150. package/dist/lib/browser/FunctionsContainer-U4HASI4P.mjs.map +0 -7
  151. package/dist/lib/browser/app-graph-builder-4OFKIRAI.mjs.map +0 -7
  152. package/dist/lib/browser/chunk-4TWQV33E.mjs.map +0 -7
  153. package/dist/lib/browser/chunk-EIY2EUWC.mjs +0 -14
  154. package/dist/lib/browser/chunk-EIY2EUWC.mjs.map +0 -7
  155. package/dist/lib/browser/chunk-GW5U2DGT.mjs.map +0 -7
  156. package/dist/lib/browser/chunk-HN7OHFCB.mjs.map +0 -7
  157. package/dist/lib/browser/chunk-S4SM663I.mjs.map +0 -7
  158. package/dist/lib/browser/chunk-Z5DT4MHW.mjs.map +0 -7
  159. package/dist/lib/browser/react-surface-M52XGLXY.mjs.map +0 -7
  160. package/dist/lib/node-esm/AutomationContainer-FYRDTERM.mjs +0 -36
  161. package/dist/lib/node-esm/AutomationContainer-FYRDTERM.mjs.map +0 -7
  162. package/dist/lib/node-esm/FunctionsContainer-VZIVURH6.mjs.map +0 -7
  163. package/dist/lib/node-esm/app-graph-builder-555IHYOB.mjs.map +0 -7
  164. package/dist/lib/node-esm/chunk-AONUBWBE.mjs.map +0 -7
  165. package/dist/lib/node-esm/chunk-CICQ73ZT.mjs +0 -16
  166. package/dist/lib/node-esm/chunk-CICQ73ZT.mjs.map +0 -7
  167. package/dist/lib/node-esm/chunk-CX2AILIS.mjs.map +0 -7
  168. package/dist/lib/node-esm/chunk-NK5N3QKD.mjs.map +0 -7
  169. package/dist/lib/node-esm/chunk-OEZNHUL2.mjs.map +0 -7
  170. package/dist/lib/node-esm/chunk-ZOJVKPCA.mjs.map +0 -7
  171. package/dist/lib/node-esm/react-surface-Y6AOXM75.mjs.map +0 -7
  172. package/dist/types/src/components/AutomationContainer.d.ts +0 -5
  173. package/dist/types/src/components/AutomationContainer.d.ts.map +0 -1
  174. /package/dist/lib/browser/{AutomationPanel-N5HFJJXW.mjs.map → AutomationPanel-3PHA5FTJ.mjs.map} +0 -0
  175. /package/dist/lib/browser/{FunctionsPanel-I443Y6KB.mjs.map → FunctionsPanel-PTFCCUTB.mjs.map} +0 -0
  176. /package/dist/lib/{node-esm/AutomationPanel-MKOLA2FE.mjs.map → browser/hooks/index.mjs.map} +0 -0
  177. /package/dist/lib/node-esm/{FunctionsPanel-ELINCXPW.mjs.map → AutomationPanel-EETYIR35.mjs.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/TriggerEditor/TriggerEditor.tsx", "../../../src/components/TriggerEditor/FunctionInputEditor.tsx", "../../../src/components/TriggerEditor/SpecSelector.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useMemo } from 'react';\n\nimport { ComputeGraph } from '@dxos/conductor';\nimport { type Query, Type } from '@dxos/echo';\nimport { FunctionTrigger, FunctionType, ScriptType } from '@dxos/functions';\nimport { Filter, Ref, type Space, useQuery } from '@dxos/react-client/echo';\nimport { Input } from '@dxos/react-ui';\nimport { QueryForm, type QueryFormProps } from '@dxos/react-ui-components';\nimport { type CustomInputMap, Form, InputHeader, SelectInput, useRefQueryLookupHandler } from '@dxos/react-ui-form';\n\nimport { FunctionInputEditor, type FunctionInputEditorProps } from './FunctionInputEditor';\nimport { SpecSelector } from './SpecSelector';\n\nexport type TriggerEditorProps = {\n space: Space;\n trigger: FunctionTrigger;\n // TODO(wittjosiah): This needs to apply to whole spec but currently only applies to spec.kind & spec.query.\n readonlySpec?: boolean;\n onSave?: (trigger: Omit<FunctionTrigger, 'id'>) => void;\n onCancel?: () => void;\n} & Pick<QueryFormProps, 'types' | 'tags'>;\n\nexport const TriggerEditor = ({ space, trigger, readonlySpec, types, tags, onSave, onCancel }: TriggerEditorProps) => {\n const handleSave = ({ id: _, ...values }: FunctionTrigger) => {\n onSave?.(values);\n };\n\n const handleRefQueryLookup = useRefQueryLookupHandler({ space });\n const Custom = useCustomInputs({ space, readonlySpec, types, tags, onQueryRefOptions: handleRefQueryLookup });\n\n return (\n <Form\n outerSpacing={false}\n Custom={Custom}\n schema={FunctionTrigger}\n values={trigger}\n onSave={handleSave}\n onCancel={onCancel}\n onQueryRefOptions={handleRefQueryLookup}\n />\n );\n};\n\ntype UseCustomInputsProps = {\n space: Space;\n readonlySpec?: boolean;\n onQueryRefOptions: FunctionInputEditorProps['onQueryRefOptions'];\n} & Pick<QueryFormProps, 'types' | 'tags'>;\n\nconst useCustomInputs = ({ space, readonlySpec, types, tags, onQueryRefOptions }: UseCustomInputsProps) => {\n const functions = useQuery(space, Filter.type(FunctionType));\n const workflows = useQuery(space, Filter.type(ComputeGraph));\n const scripts = useQuery(space, Filter.type(ScriptType));\n\n return useMemo(\n (): CustomInputMap => ({\n // Function selector.\n ['function' satisfies keyof FunctionTrigger]: (props) => {\n const getValue = useCallback(() => {\n const formValue = props.getValue();\n if (Ref.isRef(formValue)) {\n return formValue.dxn.toString() as string;\n }\n return undefined;\n }, [props]);\n\n const handleOnValueChange = useCallback(\n (_type: any, dxnString: string) => {\n const dxn = Type.DXN.parse(dxnString);\n if (dxn) {\n const ref = Ref.fromDXN(dxn);\n props.onValueChange('object', ref);\n }\n },\n [props.onValueChange],\n );\n\n return (\n <SelectInput\n {...props}\n getValue={getValue as any}\n onValueChange={handleOnValueChange}\n options={getWorkflowOptions(workflows).concat(getFunctionOptions(scripts, functions))}\n />\n );\n },\n\n // Spec selector.\n ['spec.kind' as const]: (props) => <SpecSelector {...props} readonly={readonlySpec ? 'disabled-input' : false} />,\n\n // TODO(wittjosiah): Copied from ViewEditor.\n // Query input editor.\n ['spec.query' as const]: (props) => {\n const handleChange = useCallback(\n (query: Query.Any) => props.onValueChange('object', { ast: query.ast }),\n [props.onValueChange],\n );\n\n return (\n <Input.Root>\n <InputHeader label={props.label} />\n <QueryForm initialQuery={(props.getValue() as any).ast} types={types} tags={tags} onChange={handleChange} />\n </Input.Root>\n );\n },\n\n // Function input editor.\n ['input' as const]: (props) => (\n <FunctionInputEditor {...props} functions={functions} onQueryRefOptions={onQueryRefOptions} />\n ),\n }),\n [workflows, scripts, functions, readonlySpec],\n );\n};\n\nconst getWorkflowOptions = (graphs: ComputeGraph[]) => {\n return graphs.map((graph) => ({ label: `compute-${graph.id}`, value: `dxn:echo:@:${graph.id}` }));\n};\n\nconst getFunctionOptions = (scripts: ScriptType[], functions: FunctionType[]) => {\n const getLabel = (fn: FunctionType) => scripts.find((s) => fn.source?.target?.id === s.id)?.name ?? fn.name;\n return functions.map((fn) => ({ label: getLabel(fn), value: `dxn:echo:@:${fn.id}` }));\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useMemo } from 'react';\n\nimport { Ref, Type } from '@dxos/echo';\nimport { type JsonPath } from '@dxos/echo/internal';\nimport { type FunctionType } from '@dxos/functions';\nimport { useOnTransition } from '@dxos/react-ui';\nimport { Form, type FormInputStateProps, type QueryRefOptions, useFormValues } from '@dxos/react-ui-form';\n\nexport type FunctionInputEditorProps = {\n functions: FunctionType[];\n onQueryRefOptions: QueryRefOptions;\n} & FormInputStateProps;\n\n/**\n * Editor component for function input parameters.\n */\nexport const FunctionInputEditor = ({\n functions,\n getValue,\n onValueChange,\n onQueryRefOptions,\n}: FunctionInputEditorProps) => {\n const selectedFunctionValue = useFormValues(['function' as JsonPath]);\n const selectedFunctionId = useMemo(() => {\n if (Ref.isRef(selectedFunctionValue)) {\n return selectedFunctionValue.dxn.toString().split('dxn:echo:@:').at(1);\n }\n }, [selectedFunctionValue]);\n\n const selectedFunction = useMemo(\n () => functions.find((fn) => fn.id === selectedFunctionId),\n [functions, selectedFunctionId],\n );\n\n useOnTransition(\n // Clear function parameter input when the function changes.\n selectedFunctionValue,\n (prevValue) => {\n if (!Ref.isRef(prevValue) || !Ref.isRef(selectedFunctionValue)) {\n return false;\n }\n\n return prevValue.dxn.toString() !== selectedFunctionValue.dxn.toString();\n },\n (currValue) => currValue !== undefined,\n () => onValueChange('object', {}),\n );\n\n const inputSchema = useMemo(() => selectedFunction?.inputSchema, [selectedFunction]);\n const effectSchema = useMemo(() => (inputSchema ? Type.toEffectSchema(inputSchema) : undefined), [inputSchema]);\n const propertyCount = inputSchema?.properties ? Object.keys(inputSchema.properties).length : 0;\n\n const values = useMemo(() => getValue() ?? {}, [getValue]);\n\n const handleValuesChanged = useCallback(\n (values: any) => {\n onValueChange('object', values);\n },\n [onValueChange],\n );\n\n if (selectedFunction === undefined || effectSchema === undefined || propertyCount === 0) {\n return null;\n }\n\n return (\n <>\n <h3 className='text-md'>Function parameters</h3>\n {/* TODO(ZaymonFC): Try using <FormFields /> internal component for this nesting.\n This would allow errors to flow up to the root context. */}\n <Form\n schema={effectSchema}\n values={values}\n onValuesChanged={handleValuesChanged}\n onQueryRefOptions={onQueryRefOptions}\n outerSpacing={false}\n />\n </>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useMemo } from 'react';\n\nimport { Filter, Query } from '@dxos/echo';\nimport { type FunctionTrigger, TriggerKinds, type TriggerType } from '@dxos/functions';\nimport { useTranslation } from '@dxos/react-ui';\nimport { type InputProps, SelectInput, useInputProps } from '@dxos/react-ui-form';\n\nimport { meta } from '../../meta';\n\nexport type SpecSelectorProps = InputProps;\n\nexport const SpecSelector = (props: SpecSelectorProps) => {\n const { t } = useTranslation(meta.id);\n const specProps = useInputProps(['spec' satisfies keyof FunctionTrigger]);\n\n const handleTypeChange = useCallback(\n (_type: any, value: string): TriggerType | undefined => {\n const getDefaultTriggerSpec = (kind: string) => {\n switch (kind) {\n case 'timer':\n return { kind: 'timer', cron: '' };\n case 'subscription':\n return {\n kind: 'subscription',\n query: {\n ast: Query.select(Filter.nothing()).ast,\n },\n };\n case 'queue':\n return { kind: 'queue', queue: 'dxn:' };\n case 'email':\n return { kind: 'email' };\n case 'webhook':\n return { kind: 'webhook' };\n default:\n return undefined;\n }\n };\n\n const defaultSpec = getDefaultTriggerSpec(value);\n if (!defaultSpec) {\n return;\n }\n\n // Update the entire spec object, not just the `spec.kind`.\n specProps.onValueChange('object', defaultSpec);\n },\n [specProps],\n );\n\n const options = useMemo(\n () =>\n TriggerKinds.map((kind) => ({\n value: kind,\n label: t(`trigger type ${kind}`),\n })),\n [t],\n );\n\n return <SelectInput {...props} options={options} onValueChange={handleTypeChange} />;\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "useCallback", "useMemo", "ComputeGraph", "Type", "FunctionTrigger", "FunctionType", "ScriptType", "Filter", "Ref", "useQuery", "Input", "QueryForm", "Form", "InputHeader", "SelectInput", "useRefQueryLookupHandler", "React", "useCallback", "useMemo", "Ref", "Type", "useOnTransition", "Form", "useFormValues", "FunctionInputEditor", "functions", "getValue", "onValueChange", "onQueryRefOptions", "selectedFunctionValue", "useFormValues", "selectedFunctionId", "useMemo", "Ref", "isRef", "dxn", "toString", "split", "at", "selectedFunction", "find", "fn", "id", "useOnTransition", "prevValue", "currValue", "undefined", "inputSchema", "effectSchema", "Type", "toEffectSchema", "propertyCount", "properties", "Object", "keys", "length", "values", "handleValuesChanged", "useCallback", "h3", "className", "Form", "schema", "onValuesChanged", "outerSpacing", "React", "useCallback", "useMemo", "Filter", "Query", "TriggerKinds", "useTranslation", "SelectInput", "useInputProps", "SpecSelector", "props", "t", "useTranslation", "meta", "id", "specProps", "useInputProps", "handleTypeChange", "useCallback", "_type", "value", "getDefaultTriggerSpec", "kind", "cron", "query", "ast", "Query", "select", "Filter", "nothing", "queue", "undefined", "defaultSpec", "onValueChange", "options", "useMemo", "TriggerKinds", "map", "label", "React", "SelectInput", "TriggerEditor", "space", "trigger", "readonlySpec", "types", "tags", "onSave", "onCancel", "handleSave", "id", "_", "values", "handleRefQueryLookup", "useRefQueryLookupHandler", "Custom", "useCustomInputs", "onQueryRefOptions", "React", "Form", "outerSpacing", "schema", "FunctionTrigger", "functions", "useQuery", "Filter", "type", "FunctionType", "workflows", "ComputeGraph", "scripts", "ScriptType", "useMemo", "props", "getValue", "useCallback", "formValue", "Ref", "isRef", "dxn", "toString", "undefined", "handleOnValueChange", "_type", "dxnString", "Type", "DXN", "parse", "ref", "fromDXN", "onValueChange", "SelectInput", "options", "getWorkflowOptions", "concat", "getFunctionOptions", "SpecSelector", "readonly", "handleChange", "query", "ast", "Input", "Root", "InputHeader", "label", "QueryForm", "initialQuery", "onChange", "FunctionInputEditor", "graphs", "map", "graph", "value", "getLabel", "fn", "find", "s", "source", "target", "name"]
7
+ }
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  meta
3
- } from "./chunk-GW5U2DGT.mjs";
3
+ } from "./chunk-WWURMV25.mjs";
4
4
 
5
5
  // src/types/schema.ts
6
- import { Schema } from "effect";
6
+ import * as Schema from "effect/Schema";
7
7
  import { SpaceSchema } from "@dxos/react-client/echo";
8
8
  var TriggerTemplate = Schema.Union(Schema.Struct({
9
9
  type: Schema.Literal("timer"),
@@ -35,4 +35,4 @@ var AutomationAction;
35
35
  export {
36
36
  AutomationAction
37
37
  };
38
- //# sourceMappingURL=chunk-HN7OHFCB.mjs.map
38
+ //# sourceMappingURL=chunk-VGBZKM3O.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/types/schema.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { SpaceSchema } from '@dxos/react-client/echo';\n\nimport { meta } from '../meta';\n\nconst TriggerTemplate = Schema.Union(\n Schema.Struct({ type: Schema.Literal('timer'), cron: Schema.String }),\n Schema.Struct({ type: Schema.Literal('queue'), queueDXN: Schema.Any }),\n);\n\nexport namespace AutomationAction {\n export class CreateTriggerFromTemplate extends Schema.TaggedClass<CreateTriggerFromTemplate>()(\n `${meta.id}/action/create-trigger-from-template`,\n {\n input: Schema.Struct({\n space: SpaceSchema,\n template: TriggerTemplate,\n enabled: Schema.optional(Schema.Boolean),\n // TODO(wittjosiah): Improve how this lookup is done.\n scriptName: Schema.optional(Schema.String),\n input: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.Any })),\n }),\n output: Schema.Void,\n },\n ) {}\n}\n"],
5
+ "mappings": ";;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,mBAAmB;AAI5B,IAAMC,kBAAyBC,aACtBC,cAAO;EAAEC,MAAaC,eAAQ,OAAA;EAAUC,MAAaC;AAAO,CAAA,GAC5DJ,cAAO;EAAEC,MAAaC,eAAQ,OAAA;EAAUG,UAAiBC;AAAI,CAAA,CAAA;UAGrDC,mBAAAA;EACR,MAAMC,kCAAyCC,mBAAW,EAC/D,GAAGC,KAAKC,EAAE,wCACV;IACEC,OAAcZ,cAAO;MACnBa,OAAOC;MACPC,UAAUjB;MACVkB,SAAgBC,gBAAgBC,cAAO;;MAEvCC,YAAmBF,gBAAgBb,aAAM;MACzCQ,OAAcK,gBAAgBG,cAAO;QAAEC,KAAYjB;QAAQkB,OAAchB;MAAI,CAAA,CAAA;IAC/E,CAAA;IACAiB,QAAeC;EACjB,CAAA,EAAA;EACC;oBAbUhB,4BAAAA;AAcf,GAfiBD,qBAAAA,mBAAAA,CAAAA,EAAAA;;",
6
+ "names": ["Schema", "SpaceSchema", "TriggerTemplate", "Union", "Struct", "type", "Literal", "cron", "String", "queueDXN", "Any", "AutomationAction", "CreateTriggerFromTemplate", "TaggedClass", "meta", "id", "input", "space", "SpaceSchema", "template", "enabled", "optional", "Boolean", "scriptName", "Record", "key", "value", "output", "Void"]
7
+ }
@@ -1,31 +1,50 @@
1
1
  import {
2
2
  TriggerEditor
3
- } from "./chunk-S4SM663I.mjs";
3
+ } from "./chunk-SUKAEYF3.mjs";
4
4
  import {
5
- AUTOMATION_PLUGIN
6
- } from "./chunk-GW5U2DGT.mjs";
5
+ meta
6
+ } from "./chunk-WWURMV25.mjs";
7
7
 
8
8
  // src/components/AutomationPanel/AutomationPanel.tsx
9
9
  import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
10
- import { Schema } from "effect";
11
- import React, { useState } from "react";
12
- import { Filter, Obj } from "@dxos/echo";
10
+ import * as Array from "effect/Array";
11
+ import * as Function from "effect/Function";
12
+ import * as Match from "effect/Match";
13
+ import * as Schema from "effect/Schema";
14
+ import React, { useMemo, useState } from "react";
15
+ import { Filter, Obj, Tag } from "@dxos/echo";
13
16
  import { FunctionTrigger, FunctionType, ScriptType } from "@dxos/functions";
17
+ import { useTypeOptions } from "@dxos/plugin-space";
14
18
  import { useClient } from "@dxos/react-client";
15
19
  import { getSpace, useQuery } from "@dxos/react-client/echo";
16
20
  import { Clipboard, IconButton, Input, Separator, useTranslation } from "@dxos/react-ui";
17
21
  import { ControlItem, controlItemClasses } from "@dxos/react-ui-form";
18
22
  import { List } from "@dxos/react-ui-list";
19
23
  import { ghostHover, mx } from "@dxos/react-ui-theme";
24
+ import { DataType } from "@dxos/schema";
20
25
  var grid = "grid grid-cols-[40px_1fr_32px] min-bs-[2.5rem]";
21
26
  var AutomationPanel = ({ classNames, space, object, initialTrigger, onDone }) => {
22
27
  var _effect = _useSignals();
23
28
  try {
24
- const { t } = useTranslation(AUTOMATION_PLUGIN);
29
+ const { t } = useTranslation(meta.id);
25
30
  const client = useClient();
26
- const triggers = useQuery(space, Filter.type(FunctionTrigger));
27
31
  const functions = useQuery(space, Filter.type(FunctionType));
28
- const scripts = useQuery(space, Filter.type(ScriptType));
32
+ const triggers = useQuery(space, Filter.type(FunctionTrigger));
33
+ const filteredTriggers = useMemo(() => {
34
+ return object ? triggers.filter(triggerMatch(object)) : triggers;
35
+ }, [
36
+ object,
37
+ triggers
38
+ ]);
39
+ const tags = useQuery(space, Filter.type(Tag.Tag));
40
+ const types = useTypeOptions({
41
+ space,
42
+ annotation: [
43
+ "dynamic",
44
+ "limited-static",
45
+ "object-form"
46
+ ]
47
+ });
29
48
  const [trigger, setTrigger] = useState(initialTrigger);
30
49
  const [selected, setSelected] = useState();
31
50
  const handleSelect = (trigger2) => {
@@ -61,20 +80,23 @@ var AutomationPanel = ({ classNames, space, object, initialTrigger, onDone }) =>
61
80
  }, /* @__PURE__ */ React.createElement(TriggerEditor, {
62
81
  space,
63
82
  trigger,
83
+ readonlySpec: Boolean(object),
84
+ tags,
85
+ types,
64
86
  onSave: handleSave,
65
87
  onCancel: handleCancel
66
88
  }));
67
89
  }
68
90
  return /* @__PURE__ */ React.createElement("div", {
69
91
  className: mx(controlItemClasses, classNames)
70
- }, triggers.length > 0 && /* @__PURE__ */ React.createElement(List.Root, {
71
- items: triggers,
92
+ }, filteredTriggers.length > 0 && /* @__PURE__ */ React.createElement(List.Root, {
93
+ items: filteredTriggers,
72
94
  isItem: Schema.is(FunctionTrigger),
73
95
  getId: (field) => field.id
74
- }, ({ items: triggers2 }) => /* @__PURE__ */ React.createElement("div", {
96
+ }, ({ items: filteredTriggers2 }) => /* @__PURE__ */ React.createElement("div", {
75
97
  role: "list",
76
98
  className: "flex flex-col w-full"
77
- }, triggers2?.map((trigger2) => {
99
+ }, filteredTriggers2?.map((trigger2) => {
78
100
  const copyAction = getCopyAction(client, trigger2);
79
101
  return /* @__PURE__ */ React.createElement(List.Item, {
80
102
  key: trigger2.id,
@@ -88,13 +110,13 @@ var AutomationPanel = ({ classNames, space, object, initialTrigger, onDone }) =>
88
110
  }, /* @__PURE__ */ React.createElement(List.ItemTitle, {
89
111
  classNames: "px-1 cursor-pointer w-0 shrink truncate",
90
112
  onClick: () => handleSelect(trigger2)
91
- }, getFunctionName(scripts, functions, trigger2) ?? "\u2205"), copyAction && /* @__PURE__ */ React.createElement(Clipboard.IconButton, {
113
+ }, getFunctionName(functions, trigger2) ?? "\u2205"), copyAction && /* @__PURE__ */ React.createElement(Clipboard.IconButton, {
92
114
  label: t(copyAction.translationKey),
93
115
  value: copyAction.contentProvider()
94
116
  })), /* @__PURE__ */ React.createElement(List.ItemDeleteButton, {
95
117
  onClick: () => handleDelete(trigger2)
96
118
  }));
97
- }))), triggers.length > 0 && /* @__PURE__ */ React.createElement(Separator, {
119
+ }))), filteredTriggers.length > 0 && /* @__PURE__ */ React.createElement(Separator, {
98
120
  classNames: "mlb-4"
99
121
  }), /* @__PURE__ */ React.createElement(IconButton, {
100
122
  icon: "ph--plus--regular",
@@ -127,11 +149,29 @@ var getWebhookUrl = (client, trigger) => {
127
149
  edgeUrl.protocol = isSecure ? "https" : "http";
128
150
  return new URL(`/webhook/${spaceId}:${trigger.id}`, edgeUrl).toString();
129
151
  };
130
- var getFunctionName = (scripts, functions, trigger) => {
152
+ var getFunctionName = (functions, trigger) => {
131
153
  const shortId = trigger.function && `${trigger.function.dxn.toString().slice(0, 16)}\u2026`;
132
154
  const functionObject = functions.find((fn) => fn === trigger.function?.target);
133
155
  return functionObject?.name ?? shortId;
134
156
  };
157
+ var scriptMatch = (script) => (trigger) => {
158
+ const fn = trigger.function?.target;
159
+ if (!Obj.instanceOf(FunctionType, fn)) {
160
+ return false;
161
+ }
162
+ return fn.source?.target === script;
163
+ };
164
+ var projectMatch = (project) => {
165
+ const viewQueries = Function.pipe(project.collections, Array.map((collection) => collection.target), Array.filter(Schema.is(DataType.View)), Array.map((view) => Obj.getSnapshot(view).query.ast), Array.map((ast) => JSON.stringify(ast)));
166
+ return (trigger) => {
167
+ const spec = Obj.getSnapshot(trigger).spec;
168
+ if (spec?.kind !== "subscription") {
169
+ return false;
170
+ }
171
+ return viewQueries.some((query) => JSON.stringify(spec.query) === query);
172
+ };
173
+ };
174
+ var triggerMatch = Match.type().pipe(Match.withReturnType(), Match.when((obj) => Obj.instanceOf(ScriptType, obj), (obj) => scriptMatch(obj)), Match.when((obj) => Obj.instanceOf(DataType.Project, obj), (obj) => projectMatch(obj)), Match.orElse((_obj) => () => true));
135
175
 
136
176
  // src/components/AutomationPanel/index.ts
137
177
  var AutomationPanel_default = AutomationPanel;
@@ -140,4 +180,4 @@ export {
140
180
  AutomationPanel,
141
181
  AutomationPanel_default
142
182
  };
143
- //# sourceMappingURL=chunk-4TWQV33E.mjs.map
183
+ //# sourceMappingURL=chunk-VL3KSDVL.mjs.map
@@ -0,0 +1,7 @@
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 * as Array from 'effect/Array';\nimport * as Function from 'effect/Function';\nimport * as Match from 'effect/Match';\nimport * as Schema from 'effect/Schema';\nimport React, { useMemo, useState } from 'react';\n\nimport { Filter, Obj, Tag } from '@dxos/echo';\nimport { FunctionTrigger, FunctionType, ScriptType } from '@dxos/functions';\nimport { useTypeOptions } from '@dxos/plugin-space';\nimport { type Client, useClient } from '@dxos/react-client';\nimport { type Space, getSpace, useQuery } from '@dxos/react-client/echo';\nimport { Clipboard, IconButton, Input, Separator, type ThemedClassName, 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';\nimport { DataType } from '@dxos/schema';\n\nimport { meta } 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 = ThemedClassName<{\n space: Space;\n object?: Obj.Any;\n initialTrigger?: FunctionTrigger;\n onDone?: () => void;\n}>;\n\n// TODO(burdon): Factor out common layout with ViewEditor.\nexport const AutomationPanel = ({ classNames, space, object, initialTrigger, onDone }: AutomationPanelProps) => {\n const { t } = useTranslation(meta.id);\n const client = useClient();\n const functions = useQuery(space, Filter.type(FunctionType));\n const triggers = useQuery(space, Filter.type(FunctionTrigger));\n const filteredTriggers = useMemo(() => {\n return object ? triggers.filter(triggerMatch(object)) : triggers;\n }, [object, triggers]);\n const tags = useQuery(space, Filter.type(Tag.Tag));\n const types = useTypeOptions({ space, annotation: ['dynamic', 'limited-static', 'object-form'] });\n\n const [trigger, setTrigger] = useState<FunctionTrigger | undefined>(initialTrigger);\n const [selected, setSelected] = useState<FunctionTrigger>();\n\n const handleSelect = (trigger: FunctionTrigger) => {\n setTrigger(trigger);\n setSelected(trigger);\n };\n\n const handleAdd = () => {\n setTrigger(Obj.make(FunctionTrigger, {}));\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(Obj.make(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 if (trigger) {\n return (\n <ControlItem title={t('trigger editor title')}>\n <TriggerEditor\n space={space}\n trigger={trigger}\n readonlySpec={Boolean(object)}\n tags={tags}\n types={types}\n onSave={handleSave}\n onCancel={handleCancel}\n />\n </ControlItem>\n );\n }\n\n return (\n <div className={mx(controlItemClasses, classNames)}>\n {filteredTriggers.length > 0 && (\n <List.Root<FunctionTrigger>\n items={filteredTriggers}\n isItem={Schema.is(FunctionTrigger)}\n getId={(field) => field.id}\n >\n {({ items: filteredTriggers }) => (\n <div role='list' className='flex flex-col w-full'>\n {filteredTriggers?.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(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 )}\n {filteredTriggers.length > 0 && <Separator classNames='mlb-4' />}\n <IconButton icon='ph--plus--regular' label={t('new trigger label')} onClick={handleAdd} />\n </div>\n );\n};\n\nconst getCopyAction = (client: Client, trigger: FunctionTrigger | undefined) => {\n if (trigger?.spec?.kind === 'email') {\n return { translationKey: 'trigger copy email', contentProvider: () => `${getSpace(trigger)!.id}@dxos.network` };\n }\n\n if (trigger?.spec?.kind === '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 = (functions: FunctionType[], trigger: FunctionTrigger) => {\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 return functionObject?.name ?? shortId;\n};\n\nconst scriptMatch = (script: ScriptType) => (trigger: FunctionTrigger) => {\n const fn = trigger.function?.target;\n if (!Obj.instanceOf(FunctionType, fn)) {\n return false;\n }\n\n return fn.source?.target === script;\n};\n\nconst projectMatch = (project: DataType.Project) => {\n const viewQueries = Function.pipe(\n project.collections,\n Array.map((collection) => collection.target),\n Array.filter(Schema.is(DataType.View)),\n Array.map((view) => Obj.getSnapshot(view).query.ast),\n Array.map((ast) => JSON.stringify(ast)),\n );\n\n return (trigger: FunctionTrigger) => {\n const spec = Obj.getSnapshot(trigger).spec;\n if (spec?.kind !== 'subscription') {\n return false;\n }\n\n // TODO(wittjosiah): Implement better way of comparing query ASTs.\n return viewQueries.some((query) => JSON.stringify(spec.query) === query);\n };\n};\n\nconst triggerMatch = Match.type<Obj.Any>().pipe(\n Match.withReturnType<(trigger: FunctionTrigger) => boolean>(),\n Match.when(\n (obj) => Obj.instanceOf(ScriptType, obj),\n (obj) => scriptMatch(obj),\n ),\n Match.when(\n (obj) => Obj.instanceOf(DataType.Project, obj),\n (obj) => projectMatch(obj),\n ),\n Match.orElse((_obj) => () => true),\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": ["Array", "Function", "Match", "Schema", "React", "useMemo", "useState", "Filter", "Obj", "Tag", "FunctionTrigger", "FunctionType", "ScriptType", "useTypeOptions", "useClient", "getSpace", "useQuery", "Clipboard", "IconButton", "Input", "Separator", "useTranslation", "ControlItem", "controlItemClasses", "List", "ghostHover", "mx", "DataType", "grid", "AutomationPanel", "classNames", "space", "object", "initialTrigger", "onDone", "t", "useTranslation", "meta", "id", "client", "useClient", "functions", "useQuery", "Filter", "type", "FunctionType", "triggers", "FunctionTrigger", "filteredTriggers", "useMemo", "filter", "triggerMatch", "tags", "Tag", "types", "useTypeOptions", "annotation", "trigger", "setTrigger", "useState", "selected", "setSelected", "handleSelect", "handleAdd", "Obj", "make", "undefined", "handleDelete", "db", "remove", "handleSave", "Object", "assign", "add", "handleCancel", "ControlItem", "title", "TriggerEditor", "readonlySpec", "Boolean", "onSave", "onCancel", "div", "className", "mx", "controlItemClasses", "length", "List", "Root", "items", "isItem", "is", "getId", "field", "role", "map", "copyAction", "getCopyAction", "Item", "key", "item", "ghostHover", "Input", "Switch", "checked", "enabled", "onCheckedChange", "ItemTitle", "onClick", "getFunctionName", "Clipboard", "IconButton", "label", "translationKey", "value", "contentProvider", "ItemDeleteButton", "Separator", "icon", "spec", "kind", "getSpace", "getWebhookUrl", "spaceId", "edgeUrl", "URL", "config", "values", "runtime", "services", "edge", "url", "isSecure", "protocol", "startsWith", "toString", "shortId", "function", "dxn", "slice", "functionObject", "find", "fn", "target", "name", "scriptMatch", "script", "instanceOf", "source", "projectMatch", "project", "viewQueries", "pipe", "collections", "collection", "DataType", "View", "view", "getSnapshot", "query", "ast", "JSON", "stringify", "some", "withReturnType", "when", "obj", "ScriptType", "Project", "orElse", "_obj", "AutomationPanel"]
7
+ }
@@ -1,7 +1,6 @@
1
1
  // src/meta.ts
2
- var AUTOMATION_PLUGIN = "dxos.org/plugin/automation";
3
2
  var meta = {
4
- id: AUTOMATION_PLUGIN,
3
+ id: "dxos.org/plugin/automation",
5
4
  name: "Automation",
6
5
  description: "The Automation tab allows you to trigger pre-defined workflows related to the element you are interacting with inside of Composer.",
7
6
  icon: "ph--robot--regular",
@@ -9,7 +8,6 @@ var meta = {
9
8
  };
10
9
 
11
10
  export {
12
- AUTOMATION_PLUGIN,
13
11
  meta
14
12
  };
15
- //# sourceMappingURL=chunk-GW5U2DGT.mjs.map
13
+ //# sourceMappingURL=chunk-WWURMV25.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/meta.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type PluginMeta } from '@dxos/app-framework';\n\nexport const meta: PluginMeta = {\n id: 'dxos.org/plugin/automation',\n name: 'Automation',\n description:\n 'The Automation tab allows you to trigger pre-defined workflows related to the element you are interacting with inside of Composer.',\n icon: 'ph--robot--regular',\n source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-automation',\n};\n"],
5
+ "mappings": ";AAMO,IAAMA,OAAmB;EAC9BC,IAAI;EACJC,MAAM;EACNC,aACE;EACFC,MAAM;EACNC,QAAQ;AACV;",
6
+ "names": ["meta", "id", "name", "description", "icon", "source"]
7
+ }
@@ -0,0 +1,160 @@
1
+ import {
2
+ AutomationCapabilities
3
+ } from "./chunk-5ARH77PV.mjs";
4
+ import "./chunk-WWURMV25.mjs";
5
+
6
+ // src/capabilities/compute-runtime.ts
7
+ import * as Toolkit from "@effect/ai/Toolkit";
8
+ import * as BrowserKeyValueStore from "@effect/platform-browser/BrowserKeyValueStore";
9
+ import * as Effect from "effect/Effect";
10
+ import * as Layer from "effect/Layer";
11
+ import * as ManagedRuntime from "effect/ManagedRuntime";
12
+ import { Capabilities, contributes } from "@dxos/app-framework";
13
+ import { makeToolExecutionServiceFromFunctions, makeToolResolverFromFunctions } from "@dxos/assistant";
14
+ import { Resource } from "@dxos/context";
15
+ import { Query, Ref } from "@dxos/echo";
16
+ import { CredentialsService, DatabaseService, FunctionImplementationResolver, FunctionInvocationService, InvocationTracer, LocalFunctionExecutionService, QueueService, RemoteFunctionExecutionService, TriggerDispatcher } from "@dxos/functions";
17
+ import { TriggerStateStore } from "@dxos/functions";
18
+ import { invariant } from "@dxos/invariant";
19
+ import { ClientCapabilities } from "@dxos/plugin-client";
20
+ import { PropertiesType } from "@dxos/react-client/echo";
21
+ function _check_private_redeclaration(obj, privateCollection) {
22
+ if (privateCollection.has(obj)) {
23
+ throw new TypeError("Cannot initialize the same private elements twice on an object");
24
+ }
25
+ }
26
+ function _class_apply_descriptor_get(receiver, descriptor) {
27
+ if (descriptor.get) {
28
+ return descriptor.get.call(receiver);
29
+ }
30
+ return descriptor.value;
31
+ }
32
+ function _class_apply_descriptor_set(receiver, descriptor, value) {
33
+ if (descriptor.set) {
34
+ descriptor.set.call(receiver, value);
35
+ } else {
36
+ if (!descriptor.writable) {
37
+ throw new TypeError("attempted to set read only private field");
38
+ }
39
+ descriptor.value = value;
40
+ }
41
+ }
42
+ function _class_extract_field_descriptor(receiver, privateMap, action) {
43
+ if (!privateMap.has(receiver)) {
44
+ throw new TypeError("attempted to " + action + " private field on non-instance");
45
+ }
46
+ return privateMap.get(receiver);
47
+ }
48
+ function _class_private_field_get(receiver, privateMap) {
49
+ var descriptor = _class_extract_field_descriptor(receiver, privateMap, "get");
50
+ return _class_apply_descriptor_get(receiver, descriptor);
51
+ }
52
+ function _class_private_field_init(obj, privateMap, value) {
53
+ _check_private_redeclaration(obj, privateMap);
54
+ privateMap.set(obj, value);
55
+ }
56
+ function _class_private_field_set(receiver, privateMap, value) {
57
+ var descriptor = _class_extract_field_descriptor(receiver, privateMap, "set");
58
+ _class_apply_descriptor_set(receiver, descriptor, value);
59
+ return value;
60
+ }
61
+ var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-automation/src/capabilities/compute-runtime.ts";
62
+ var compute_runtime_default = (async (context) => {
63
+ const provider = await new ComputeRuntimeProviderImpl(context).open();
64
+ return contributes(AutomationCapabilities.ComputeRuntime, provider, async () => {
65
+ await provider.close();
66
+ });
67
+ });
68
+ var _runtimes = /* @__PURE__ */ new WeakMap();
69
+ var _context = /* @__PURE__ */ new WeakMap();
70
+ var ComputeRuntimeProviderImpl = class extends Resource {
71
+ async _open() {
72
+ }
73
+ async _close() {
74
+ await Promise.all(Array.from(_class_private_field_get(this, _runtimes).values()).map((rt) => rt.dispose()));
75
+ _class_private_field_get(this, _runtimes).clear();
76
+ }
77
+ getRuntime(spaceId) {
78
+ if (_class_private_field_get(this, _runtimes).has(spaceId)) {
79
+ return _class_private_field_get(this, _runtimes).get(spaceId);
80
+ }
81
+ const layer = Layer.unwrapEffect(Effect.gen(this, function* () {
82
+ const client = _class_private_field_get(this, _context).getCapability(ClientCapabilities.Client);
83
+ const serviceLayer = _class_private_field_get(this, _context).getCapability(Capabilities.AiServiceLayer) ?? Layer.die("AiService not found");
84
+ const functions = _class_private_field_get(this, _context).getCapabilities(Capabilities.Functions);
85
+ const toolkits = _class_private_field_get(this, _context).getCapabilities(Capabilities.Toolkit);
86
+ const handlers = _class_private_field_get(this, _context).getCapabilities(Capabilities.ToolkitHandler);
87
+ const allFunctions = functions.flat();
88
+ const toolkit = Toolkit.merge(...toolkits);
89
+ const handlersLayer = Layer.mergeAll(Layer.empty, ...handlers);
90
+ const space = client.spaces.get(spaceId);
91
+ invariant(space, void 0, {
92
+ F: __dxlog_file,
93
+ L: 79,
94
+ S: this,
95
+ A: [
96
+ "space",
97
+ ""
98
+ ]
99
+ });
100
+ yield* Effect.promise(() => space.waitUntilReady());
101
+ return Layer.mergeAll(TriggerDispatcher.layer({
102
+ timeControl: "natural"
103
+ })).pipe(Layer.provideMerge(Layer.mergeAll(InvocationTracerLive, TriggerStateStore.layerKv.pipe(Layer.provide(BrowserKeyValueStore.layerLocalStorage)), makeToolResolverFromFunctions(allFunctions, toolkit), makeToolExecutionServiceFromFunctions(toolkit, handlersLayer))), Layer.provideMerge(Layer.mergeAll(FunctionInvocationService.layer.pipe(Layer.provideMerge(LocalFunctionExecutionService.layerLive.pipe(Layer.provideMerge(FunctionImplementationResolver.layerTest({
104
+ functions: allFunctions
105
+ })), Layer.provideMerge(RemoteFunctionExecutionService.fromClient(
106
+ client.edge.baseUrl,
107
+ // If agent is not enabled do not provide spaceId because space context will be unavailable on EDGE.
108
+ client.config.get("runtime.client.edgeFeatures.agents") ? spaceId : void 0
109
+ )), Layer.provideMerge(serviceLayer), Layer.provideMerge(CredentialsService.layerFromDatabase()), Layer.provideMerge(space ? DatabaseService.layer(space.db) : DatabaseService.notAvailable), Layer.provideMerge(space ? QueueService.layer(space.queues) : QueueService.notAvailable)))))));
110
+ }));
111
+ const runtime = ManagedRuntime.make(layer);
112
+ _class_private_field_get(this, _runtimes).set(spaceId, runtime);
113
+ return runtime;
114
+ }
115
+ constructor(context) {
116
+ super(), _class_private_field_init(this, _runtimes, {
117
+ writable: true,
118
+ value: /* @__PURE__ */ new Map()
119
+ }), _class_private_field_init(this, _context, {
120
+ writable: true,
121
+ value: void 0
122
+ });
123
+ _class_private_field_set(this, _context, context);
124
+ }
125
+ };
126
+ var InvocationTracerLive = Layer.unwrapEffect(Effect.gen(function* () {
127
+ const { objects: [properties] } = yield* DatabaseService.runQuery(Query.type(PropertiesType));
128
+ invariant(properties, void 0, {
129
+ F: __dxlog_file,
130
+ L: 129,
131
+ S: this,
132
+ A: [
133
+ "properties",
134
+ ""
135
+ ]
136
+ });
137
+ if (!properties.invocationTraceQueue) {
138
+ const queue2 = yield* QueueService.createQueue({
139
+ subspaceTag: "trace"
140
+ });
141
+ properties.invocationTraceQueue = Ref.fromDXN(queue2.dxn);
142
+ }
143
+ const queue = properties.invocationTraceQueue.target;
144
+ invariant(queue, void 0, {
145
+ F: __dxlog_file,
146
+ L: 135,
147
+ S: this,
148
+ A: [
149
+ "queue",
150
+ ""
151
+ ]
152
+ });
153
+ return InvocationTracer.layerLive({
154
+ invocationTraceQueue: queue
155
+ });
156
+ }));
157
+ export {
158
+ compute_runtime_default as default
159
+ };
160
+ //# sourceMappingURL=compute-runtime-YJREH6WP.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/compute-runtime.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Toolkit from '@effect/ai/Toolkit';\nimport * as BrowserKeyValueStore from '@effect/platform-browser/BrowserKeyValueStore';\nimport * as Effect from 'effect/Effect';\nimport * as Layer from 'effect/Layer';\nimport * as ManagedRuntime from 'effect/ManagedRuntime';\n\nimport { Capabilities, type PluginContext, contributes } from '@dxos/app-framework';\nimport { makeToolExecutionServiceFromFunctions, makeToolResolverFromFunctions } from '@dxos/assistant';\nimport { Resource } from '@dxos/context';\nimport { Query, Ref } from '@dxos/echo';\nimport {\n CredentialsService,\n DatabaseService,\n FunctionImplementationResolver,\n FunctionInvocationService,\n InvocationTracer,\n LocalFunctionExecutionService,\n QueueService,\n RemoteFunctionExecutionService,\n TriggerDispatcher,\n} from '@dxos/functions';\nimport { TriggerStateStore } from '@dxos/functions';\nimport { invariant } from '@dxos/invariant';\nimport { type SpaceId } from '@dxos/keys';\nimport { ClientCapabilities } from '@dxos/plugin-client';\nimport { PropertiesType } from '@dxos/react-client/echo';\n\nimport { AutomationCapabilities } from './capabilities';\n\nexport default async (context: PluginContext) => {\n const provider = await new ComputeRuntimeProviderImpl(context).open();\n return contributes(AutomationCapabilities.ComputeRuntime, provider, async () => {\n await provider.close();\n });\n};\n\nclass ComputeRuntimeProviderImpl extends Resource implements AutomationCapabilities.ComputeRuntimeProvider {\n readonly #runtimes = new Map<SpaceId, AutomationCapabilities.ComputeRuntime>();\n readonly #context: PluginContext;\n\n constructor(context: PluginContext) {\n super();\n this.#context = context;\n }\n\n protected override async _open() {}\n\n protected override async _close() {\n await Promise.all(Array.from(this.#runtimes.values()).map((rt) => rt.dispose()));\n this.#runtimes.clear();\n }\n\n getRuntime(spaceId: SpaceId): AutomationCapabilities.ComputeRuntime {\n if (this.#runtimes.has(spaceId)) {\n return this.#runtimes.get(spaceId)!;\n }\n\n const layer = Layer.unwrapEffect(\n Effect.gen(this, function* () {\n const client = this.#context.getCapability(ClientCapabilities.Client);\n const serviceLayer =\n this.#context.getCapability(Capabilities.AiServiceLayer) ?? Layer.die('AiService not found');\n\n // TODO(dmaretskyi): Make those reactive.\n const functions = this.#context.getCapabilities(Capabilities.Functions);\n const toolkits = this.#context.getCapabilities(Capabilities.Toolkit);\n const handlers = this.#context.getCapabilities(Capabilities.ToolkitHandler);\n\n const allFunctions = functions.flat();\n // TODO(wittjosiah): Don't cast.\n const toolkit = Toolkit.merge(...toolkits) as Toolkit.Toolkit<any>;\n const handlersLayer = Layer.mergeAll(Layer.empty, ...handlers);\n\n const space = client.spaces.get(spaceId);\n invariant(space);\n yield* Effect.promise(() => space.waitUntilReady());\n\n return Layer.mergeAll(TriggerDispatcher.layer({ timeControl: 'natural' })).pipe(\n Layer.provideMerge(\n Layer.mergeAll(\n InvocationTracerLive,\n TriggerStateStore.layerKv.pipe(Layer.provide(BrowserKeyValueStore.layerLocalStorage)),\n makeToolResolverFromFunctions(allFunctions, toolkit),\n makeToolExecutionServiceFromFunctions(toolkit, handlersLayer),\n ),\n ),\n Layer.provideMerge(\n Layer.mergeAll(\n FunctionInvocationService.layer.pipe(\n Layer.provideMerge(\n LocalFunctionExecutionService.layerLive.pipe(\n Layer.provideMerge(FunctionImplementationResolver.layerTest({ functions: allFunctions })),\n Layer.provideMerge(\n RemoteFunctionExecutionService.fromClient(\n client.edge.baseUrl,\n // If agent is not enabled do not provide spaceId because space context will be unavailable on EDGE.\n client.config.get('runtime.client.edgeFeatures.agents') ? spaceId : undefined,\n ),\n ),\n Layer.provideMerge(serviceLayer),\n Layer.provideMerge(CredentialsService.layerFromDatabase()),\n Layer.provideMerge(space ? DatabaseService.layer(space.db) : DatabaseService.notAvailable),\n Layer.provideMerge(space ? QueueService.layer(space.queues) : QueueService.notAvailable),\n ),\n ),\n ),\n ),\n ),\n );\n }),\n );\n\n const runtime = ManagedRuntime.make(layer);\n this.#runtimes.set(spaceId, runtime);\n\n return runtime;\n }\n}\n\nconst InvocationTracerLive = Layer.unwrapEffect(\n Effect.gen(function* () {\n const {\n objects: [properties],\n } = yield* DatabaseService.runQuery(Query.type(PropertiesType));\n invariant(properties);\n if (!properties.invocationTraceQueue) {\n const queue = yield* QueueService.createQueue({ subspaceTag: 'trace' });\n properties.invocationTraceQueue = Ref.fromDXN(queue.dxn);\n }\n const queue = properties.invocationTraceQueue.target;\n invariant(queue);\n return InvocationTracer.layerLive({ invocationTraceQueue: queue });\n }),\n);\n"],
5
+ "mappings": "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",
6
+ "names": ["Toolkit", "BrowserKeyValueStore", "Effect", "Layer", "ManagedRuntime", "Capabilities", "contributes", "makeToolExecutionServiceFromFunctions", "makeToolResolverFromFunctions", "Resource", "Query", "Ref", "CredentialsService", "DatabaseService", "FunctionImplementationResolver", "FunctionInvocationService", "InvocationTracer", "LocalFunctionExecutionService", "QueueService", "RemoteFunctionExecutionService", "TriggerDispatcher", "TriggerStateStore", "invariant", "ClientCapabilities", "PropertiesType", "context", "provider", "ComputeRuntimeProviderImpl", "open", "contributes", "AutomationCapabilities", "ComputeRuntime", "close", "Resource", "_open", "_close", "Promise", "all", "Array", "from", "values", "map", "rt", "dispose", "clear", "getRuntime", "spaceId", "has", "get", "layer", "unwrapEffect", "gen", "client", "getCapability", "ClientCapabilities", "Client", "serviceLayer", "Capabilities", "AiServiceLayer", "die", "functions", "getCapabilities", "Functions", "toolkits", "Toolkit", "handlers", "ToolkitHandler", "allFunctions", "flat", "toolkit", "merge", "handlersLayer", "mergeAll", "empty", "space", "spaces", "invariant", "promise", "waitUntilReady", "TriggerDispatcher", "timeControl", "pipe", "provideMerge", "InvocationTracerLive", "TriggerStateStore", "layerKv", "provide", "layerLocalStorage", "makeToolResolverFromFunctions", "makeToolExecutionServiceFromFunctions", "FunctionInvocationService", "LocalFunctionExecutionService", "layerLive", "FunctionImplementationResolver", "layerTest", "RemoteFunctionExecutionService", "fromClient", "edge", "baseUrl", "config", "undefined", "CredentialsService", "layerFromDatabase", "DatabaseService", "db", "notAvailable", "QueueService", "queues", "runtime", "make", "set", "Map", "objects", "properties", "runQuery", "Query", "type", "PropertiesType", "invocationTraceQueue", "queue", "createQueue", "subspaceTag", "Ref", "fromDXN", "dxn", "target", "InvocationTracer"]
7
+ }
@@ -0,0 +1,12 @@
1
+ import {
2
+ useComputeRuntimeCallback,
3
+ useTriggerRuntimeControls
4
+ } from "../chunk-MVPRI3DB.mjs";
5
+ import "../chunk-QACR4BJ7.mjs";
6
+ import "../chunk-5ARH77PV.mjs";
7
+ import "../chunk-WWURMV25.mjs";
8
+ export {
9
+ useComputeRuntimeCallback,
10
+ useTriggerRuntimeControls
11
+ };
12
+ //# sourceMappingURL=index.mjs.map
@@ -1,28 +1,37 @@
1
1
  import {
2
- AutomationContainer,
3
2
  AutomationPanel,
3
+ AutomationSettings,
4
4
  FunctionsContainer,
5
5
  FunctionsPanel
6
- } from "./chunk-EIY2EUWC.mjs";
6
+ } from "./chunk-2AOFK5FW.mjs";
7
+ import {
8
+ AppGraphBuilder,
9
+ ComputeRuntime,
10
+ IntentResolver,
11
+ ReactSurface
12
+ } from "./chunk-QACR4BJ7.mjs";
13
+ import {
14
+ AutomationCapabilities
15
+ } from "./chunk-5ARH77PV.mjs";
7
16
  import {
8
17
  TriggerEditor
9
- } from "./chunk-S4SM663I.mjs";
18
+ } from "./chunk-SUKAEYF3.mjs";
10
19
  import {
11
- AUTOMATION_PLUGIN,
12
20
  meta
13
- } from "./chunk-GW5U2DGT.mjs";
21
+ } from "./chunk-WWURMV25.mjs";
22
+
23
+ // src/events.ts
24
+ import { defineEvent } from "@dxos/app-framework";
25
+ (function(AutomationEvents2) {
26
+ AutomationEvents2.ComputeRuntimeReady = defineEvent(`${meta.id}/event/compute-runtime-ready`);
27
+ })(AutomationEvents || (AutomationEvents = {}));
28
+ var AutomationEvents;
14
29
 
15
30
  // src/AutomationPlugin.tsx
16
31
  import { Capabilities, Events, contributes, defineModule, definePlugin } from "@dxos/app-framework";
17
32
  import { FunctionTrigger, FunctionType } from "@dxos/functions";
18
33
  import { ClientCapabilities, ClientEvents } from "@dxos/plugin-client";
19
34
 
20
- // src/capabilities/index.ts
21
- import { lazy } from "@dxos/app-framework";
22
- var AppGraphBuilder = lazy(() => import("./app-graph-builder-4OFKIRAI.mjs"));
23
- var IntentResolver = lazy(() => import("./intent-resolver-4PSYSQQG.mjs"));
24
- var ReactSurface = lazy(() => import("./react-surface-M52XGLXY.mjs"));
25
-
26
35
  // src/translations.ts
27
36
  var translations = [
28
37
  {
@@ -33,12 +42,15 @@ var translations = [
33
42
  "script automation label": "Automation",
34
43
  "automation verbose label": "Manage automations",
35
44
  "automation description": "You can manage all the triggers which automate your space here.",
45
+ "runtime label": "Enable Local Runtime",
46
+ "runtime description": "This will start a trigger dispatcher locally for this space to run triggers on your device while Composer is running.",
36
47
  "functions panel label": "Functions",
37
48
  "functions verbose label": "Manage deployed functions",
38
49
  "functions description": "You can manage all the functions deployed from your space on EDGE here.",
39
50
  "function copy id": "Copy Function ID",
40
51
  "no functions found": "No functions found",
41
52
  "go to function source button label": "Show function source",
53
+ "delete function button label": "Delete function",
42
54
  "trigger editor title": "Configure Trigger",
43
55
  "new trigger label": "Add Trigger",
44
56
  "trigger type timer": "Timer",
@@ -58,7 +70,7 @@ var translations = [
58
70
  ];
59
71
 
60
72
  // src/AutomationPlugin.tsx
61
- var AutomationPlugin = () => definePlugin(meta, [
73
+ var AutomationPlugin = definePlugin(meta, () => [
62
74
  defineModule({
63
75
  id: `${meta.id}/module/translations`,
64
76
  activatesOn: Events.SetupTranslations,
@@ -86,13 +98,22 @@ var AutomationPlugin = () => definePlugin(meta, [
86
98
  id: `${meta.id}/module/react-surface`,
87
99
  activatesOn: Events.SetupReactSurface,
88
100
  activate: ReactSurface
101
+ }),
102
+ defineModule({
103
+ id: `${meta.id}/module/compute-runtime`,
104
+ activatesOn: ClientEvents.ClientReady,
105
+ activatesAfter: [
106
+ AutomationEvents.ComputeRuntimeReady
107
+ ],
108
+ activate: ComputeRuntime
89
109
  })
90
110
  ]);
91
111
  export {
92
- AUTOMATION_PLUGIN,
93
- AutomationContainer,
112
+ AutomationCapabilities,
113
+ AutomationEvents,
94
114
  AutomationPanel,
95
115
  AutomationPlugin,
116
+ AutomationSettings,
96
117
  FunctionsContainer,
97
118
  FunctionsPanel,
98
119
  TriggerEditor,