@dxos/plugin-automation 0.7.5-main.9d26e3a → 0.7.5-main.e9bb01b

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 (108) hide show
  1. package/dist/lib/browser/{AssistantPanel-32FH2RA6.mjs → AssistantPanel-NTOUHOWA.mjs} +3 -3
  2. package/dist/lib/browser/{AssistantPanel-32FH2RA6.mjs.map → AssistantPanel-NTOUHOWA.mjs.map} +2 -2
  3. package/dist/lib/browser/AutomationPanel-KT3YFV56.mjs +231 -0
  4. package/dist/lib/browser/AutomationPanel-KT3YFV56.mjs.map +7 -0
  5. package/dist/lib/browser/app-graph-builder-6FSMLMT4.mjs +131 -0
  6. package/dist/lib/browser/app-graph-builder-6FSMLMT4.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-4ODBJDXM.mjs +10 -0
  8. package/dist/lib/browser/chunk-4ODBJDXM.mjs.map +7 -0
  9. package/dist/lib/browser/{chunk-DN5M2QL5.mjs → chunk-DL6LB2NI.mjs} +2 -8
  10. package/dist/lib/browser/{chunk-DN5M2QL5.mjs.map → chunk-DL6LB2NI.mjs.map} +4 -4
  11. package/dist/lib/browser/{chunk-X5KMOH3I.mjs → chunk-DQ7ZSYJJ.mjs} +4 -4
  12. package/dist/lib/browser/chunk-DQ7ZSYJJ.mjs.map +7 -0
  13. package/dist/lib/browser/index.mjs +89 -236
  14. package/dist/lib/browser/index.mjs.map +4 -4
  15. package/dist/lib/browser/meta.json +1 -1
  16. package/dist/lib/browser/react-surface-5YTE5MRE.mjs +34 -0
  17. package/dist/lib/browser/react-surface-5YTE5MRE.mjs.map +7 -0
  18. package/dist/lib/browser/types/index.mjs +1 -3
  19. package/dist/lib/node/{AssistantPanel-XANI7YNV.cjs → AssistantPanel-U7GDWPRC.cjs} +7 -7
  20. package/dist/lib/node/{AssistantPanel-XANI7YNV.cjs.map → AssistantPanel-U7GDWPRC.cjs.map} +2 -2
  21. package/dist/lib/node/{AutomationPanel-VADY3HMP.cjs → AutomationPanel-H5WE4FIU.cjs} +112 -32
  22. package/dist/lib/node/AutomationPanel-H5WE4FIU.cjs.map +7 -0
  23. package/dist/lib/node/app-graph-builder-65TBXO3I.cjs +147 -0
  24. package/dist/lib/node/app-graph-builder-65TBXO3I.cjs.map +7 -0
  25. package/dist/lib/node/{chunk-NIL4TP6U.cjs → chunk-JNDMZQH7.cjs} +4 -9
  26. package/dist/lib/node/chunk-JNDMZQH7.cjs.map +7 -0
  27. package/dist/lib/node/chunk-JUSXT4U5.cjs +43 -0
  28. package/dist/lib/node/chunk-JUSXT4U5.cjs.map +7 -0
  29. package/dist/lib/node/{chunk-DTJ7XVO2.cjs → chunk-TQEDPRY5.cjs} +8 -8
  30. package/dist/lib/node/chunk-TQEDPRY5.cjs.map +7 -0
  31. package/dist/lib/node/index.cjs +112 -258
  32. package/dist/lib/node/index.cjs.map +4 -4
  33. package/dist/lib/node/meta.json +1 -1
  34. package/dist/lib/node/react-surface-S6U5ISJ6.cjs +57 -0
  35. package/dist/lib/node/react-surface-S6U5ISJ6.cjs.map +7 -0
  36. package/dist/lib/node/types/index.cjs +5 -7
  37. package/dist/lib/node/types/index.cjs.map +2 -2
  38. package/dist/lib/node-esm/{AssistantPanel-5M6O6JV7.mjs → AssistantPanel-M67P24GS.mjs} +3 -3
  39. package/dist/lib/node-esm/{AssistantPanel-5M6O6JV7.mjs.map → AssistantPanel-M67P24GS.mjs.map} +2 -2
  40. package/dist/lib/node-esm/AutomationPanel-MW42U6I4.mjs +232 -0
  41. package/dist/lib/node-esm/AutomationPanel-MW42U6I4.mjs.map +7 -0
  42. package/dist/lib/node-esm/app-graph-builder-4SD4F3KN.mjs +132 -0
  43. package/dist/lib/node-esm/app-graph-builder-4SD4F3KN.mjs.map +7 -0
  44. package/dist/lib/node-esm/{chunk-GCHXTXVT.mjs → chunk-GIAYUM5I.mjs} +2 -8
  45. package/dist/lib/node-esm/{chunk-GCHXTXVT.mjs.map → chunk-GIAYUM5I.mjs.map} +4 -4
  46. package/dist/lib/node-esm/{chunk-HNOBZHWK.mjs → chunk-JFHI22MF.mjs} +4 -4
  47. package/dist/lib/node-esm/chunk-JFHI22MF.mjs.map +7 -0
  48. package/dist/lib/node-esm/chunk-XVIEXSEZ.mjs +12 -0
  49. package/dist/lib/node-esm/chunk-XVIEXSEZ.mjs.map +7 -0
  50. package/dist/lib/node-esm/index.mjs +89 -236
  51. package/dist/lib/node-esm/index.mjs.map +4 -4
  52. package/dist/lib/node-esm/meta.json +1 -1
  53. package/dist/lib/node-esm/react-surface-RWTR3TKT.mjs +35 -0
  54. package/dist/lib/node-esm/react-surface-RWTR3TKT.mjs.map +7 -0
  55. package/dist/lib/node-esm/types/index.mjs +1 -3
  56. package/dist/types/src/AutomationPlugin.d.ts +1 -3
  57. package/dist/types/src/AutomationPlugin.d.ts.map +1 -1
  58. package/dist/types/src/capabilities/app-graph-builder.d.ts +180 -0
  59. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -0
  60. package/dist/types/src/capabilities/index.d.ts +179 -0
  61. package/dist/types/src/capabilities/index.d.ts.map +1 -0
  62. package/dist/types/src/capabilities/react-surface.d.ts +4 -0
  63. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
  64. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts +1 -1
  65. package/dist/types/src/components/AutomationPanel/AutomationPanel.d.ts.map +1 -1
  66. package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts +1 -2
  67. package/dist/types/src/components/TriggerEditor/TriggerEditor.d.ts.map +1 -1
  68. package/dist/types/src/components/index.d.ts +1 -1
  69. package/dist/types/src/components/index.d.ts.map +1 -1
  70. package/dist/types/src/index.d.ts +1 -2
  71. package/dist/types/src/index.d.ts.map +1 -1
  72. package/dist/types/src/meta.d.ts +1 -2
  73. package/dist/types/src/meta.d.ts.map +1 -1
  74. package/dist/types/src/translations.d.ts +7 -0
  75. package/dist/types/src/translations.d.ts.map +1 -1
  76. package/dist/types/src/types/index.d.ts +0 -1
  77. package/dist/types/src/types/index.d.ts.map +1 -1
  78. package/dist/types/tsconfig.tsbuildinfo +1 -1
  79. package/package.json +38 -46
  80. package/src/AutomationPlugin.tsx +55 -193
  81. package/src/capabilities/app-graph-builder.ts +127 -0
  82. package/src/capabilities/index.ts +8 -0
  83. package/src/capabilities/react-surface.tsx +27 -0
  84. package/src/components/AssistantPanel/AssistantPanel.tsx +1 -4
  85. package/src/components/AutomationPanel/AutomationPanel.tsx +54 -37
  86. package/src/components/TriggerEditor/TriggerEditor.tsx +65 -8
  87. package/src/index.ts +1 -4
  88. package/src/meta.ts +3 -2
  89. package/src/translations.ts +9 -0
  90. package/src/types/index.ts +0 -1
  91. package/dist/lib/browser/AutomationPanel-ABGPG5LE.mjs +0 -151
  92. package/dist/lib/browser/AutomationPanel-ABGPG5LE.mjs.map +0 -7
  93. package/dist/lib/browser/chunk-X5KMOH3I.mjs.map +0 -7
  94. package/dist/lib/browser/meta.mjs +0 -9
  95. package/dist/lib/browser/meta.mjs.map +0 -7
  96. package/dist/lib/node/AutomationPanel-VADY3HMP.cjs.map +0 -7
  97. package/dist/lib/node/chunk-DTJ7XVO2.cjs.map +0 -7
  98. package/dist/lib/node/chunk-NIL4TP6U.cjs.map +0 -7
  99. package/dist/lib/node/meta.cjs +0 -30
  100. package/dist/lib/node/meta.cjs.map +0 -7
  101. package/dist/lib/node-esm/AutomationPanel-EETYIDPA.mjs +0 -152
  102. package/dist/lib/node-esm/AutomationPanel-EETYIDPA.mjs.map +0 -7
  103. package/dist/lib/node-esm/chunk-HNOBZHWK.mjs.map +0 -7
  104. package/dist/lib/node-esm/meta.mjs +0 -10
  105. package/dist/lib/node-esm/meta.mjs.map +0 -7
  106. package/dist/types/src/types/types.d.ts +0 -7
  107. package/dist/types/src/types/types.d.ts.map +0 -1
  108. package/src/types/types.ts +0 -27
@@ -0,0 +1,232 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import {
3
+ AUTOMATION_PLUGIN
4
+ } from "./chunk-JFHI22MF.mjs";
5
+
6
+ // packages/plugins/experimental/plugin-automation/src/components/AutomationPanel/AutomationPanel.tsx
7
+ import React2, { useState as useState2 } from "react";
8
+ import { S } from "@dxos/echo-schema";
9
+ import { FunctionType as FunctionType2, FunctionTrigger, FunctionTriggerSchema as FunctionTriggerSchema2, TriggerKind as TriggerKind2, ScriptType as ScriptType2 } from "@dxos/functions";
10
+ import { useClient } from "@dxos/react-client";
11
+ import { create, Filter as Filter2, useQuery as useQuery2, getSpace } from "@dxos/react-client/echo";
12
+ import { IconButton as IconButton2, Input as Input2, useTranslation as useTranslation2, Button } from "@dxos/react-ui";
13
+ import { List } from "@dxos/react-ui-list";
14
+ import { ghostHover, mx } from "@dxos/react-ui-theme";
15
+
16
+ // packages/plugins/experimental/plugin-automation/src/components/TriggerEditor/TriggerEditor.tsx
17
+ import React, { useState } from "react";
18
+ import { FunctionType, FunctionTriggerSchema, ScriptType, TriggerKind } from "@dxos/functions";
19
+ import { Filter, useQuery } from "@dxos/react-client/echo";
20
+ import { IconButton, Input, useTranslation } from "@dxos/react-ui";
21
+ import { Form, SelectInput, TextInput } from "@dxos/react-ui-form";
22
+ var TriggerEditor = ({ space, trigger, onSave, onCancel }) => {
23
+ const { t } = useTranslation(AUTOMATION_PLUGIN);
24
+ const functions = useQuery(space, Filter.schema(FunctionType));
25
+ const scripts = useQuery(space, Filter.schema(ScriptType));
26
+ const handleSave = (values) => {
27
+ onSave?.(values);
28
+ };
29
+ return /* @__PURE__ */ React.createElement(Form, {
30
+ schema: FunctionTriggerSchema,
31
+ values: trigger,
32
+ onSave: handleSave,
33
+ onCancel,
34
+ Custom: {
35
+ ["function"]: (props) => /* @__PURE__ */ React.createElement(SelectInput, {
36
+ ...props,
37
+ options: functions.map((fn) => ({
38
+ value: fn.name,
39
+ label: getFunctionName(scripts, fn)
40
+ }))
41
+ }),
42
+ ["spec.type"]: (props) => /* @__PURE__ */ React.createElement(SelectInput, {
43
+ ...props,
44
+ options: Object.values(TriggerKind).map((kind) => ({
45
+ value: kind,
46
+ label: t(`trigger type ${kind}`)
47
+ }))
48
+ }),
49
+ ["meta"]: (props) => {
50
+ const meta = props.getValue();
51
+ const [newMetaFieldName, setNewMetaFieldName] = useState("");
52
+ React.useEffect(() => props.onValueChange("object", {
53
+ ...meta
54
+ }), []);
55
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("div", null, props.label), [
56
+ ...Object.keys(meta)
57
+ ].map((key) => {
58
+ const compositeKey = `meta.${key}`;
59
+ return /* @__PURE__ */ React.createElement("div", {
60
+ key: compositeKey,
61
+ role: "none",
62
+ className: "flex items-center mt-2 gap-1"
63
+ }, /* @__PURE__ */ React.createElement("div", {
64
+ role: "none",
65
+ className: "flex-1"
66
+ }, /* @__PURE__ */ React.createElement(TextInput, {
67
+ ...props,
68
+ type: "string",
69
+ label: key
70
+ })), /* @__PURE__ */ React.createElement(IconButton, {
71
+ icon: "ph--trash--regular",
72
+ iconOnly: true,
73
+ classNames: "mt-6",
74
+ label: t("trigger meta remove"),
75
+ onClick: () => {
76
+ const newValues = {
77
+ ...props.getValue()
78
+ };
79
+ delete newValues[key];
80
+ props.onValueChange("object", newValues);
81
+ }
82
+ }));
83
+ }), /* @__PURE__ */ React.createElement("div", {
84
+ role: "none",
85
+ className: "flex items-center mt-2 gap-1 plb-1"
86
+ }, /* @__PURE__ */ React.createElement("div", {
87
+ role: "none",
88
+ className: "flex-1"
89
+ }, /* @__PURE__ */ React.createElement(Input.Root, null, /* @__PURE__ */ React.createElement(Input.TextInput, {
90
+ placeholder: t("trigger meta prop name placeholder"),
91
+ value: newMetaFieldName,
92
+ onChange: (event) => setNewMetaFieldName(event.target.value)
93
+ }))), /* @__PURE__ */ React.createElement(IconButton, {
94
+ icon: "ph--plus--regular",
95
+ iconOnly: true,
96
+ label: t("trigger meta add"),
97
+ onClick: () => {
98
+ if (newMetaFieldName.length) {
99
+ const meta2 = props.getValue() ?? {};
100
+ const metaWithNewProp = {
101
+ ...meta2,
102
+ [newMetaFieldName]: ""
103
+ };
104
+ setNewMetaFieldName("");
105
+ props.onValueChange("object", metaWithNewProp);
106
+ }
107
+ }
108
+ })));
109
+ }
110
+ }
111
+ });
112
+ };
113
+ var getFunctionName = (scripts, fn) => {
114
+ return scripts.find((s) => fn.source?.target?.id === s.id)?.name ?? fn.name;
115
+ };
116
+
117
+ // packages/plugins/experimental/plugin-automation/src/components/AutomationPanel/AutomationPanel.tsx
118
+ var grid = "grid grid-cols-[40px_1fr_32px] min-bs-[2.5rem]";
119
+ var AutomationPanel = ({ space, object }) => {
120
+ const { t } = useTranslation2(AUTOMATION_PLUGIN);
121
+ const client = useClient();
122
+ const triggers = useQuery2(space, Filter2.schema(FunctionTrigger));
123
+ const functions = useQuery2(space, Filter2.schema(FunctionType2));
124
+ const scripts = useQuery2(space, Filter2.schema(ScriptType2));
125
+ const [trigger, setTrigger] = useState2();
126
+ const [selected, setSelected] = useState2();
127
+ const handleSelect = (trigger2) => {
128
+ const { id: _, ...values } = trigger2;
129
+ setTrigger(values);
130
+ setSelected(trigger2);
131
+ };
132
+ const handleAdd = () => {
133
+ setTrigger(create(FunctionTriggerSchema2, {
134
+ meta: {}
135
+ }));
136
+ setSelected(void 0);
137
+ };
138
+ const handleDelete = (trigger2) => {
139
+ space.db.remove(trigger2);
140
+ setTrigger(void 0);
141
+ setSelected(void 0);
142
+ };
143
+ const handleSave = (trigger2) => {
144
+ if (selected) {
145
+ Object.assign(selected, trigger2);
146
+ } else {
147
+ space.db.add(create(FunctionTrigger, trigger2));
148
+ }
149
+ setTrigger(void 0);
150
+ setSelected(void 0);
151
+ };
152
+ const handleCancel = () => {
153
+ setTrigger(void 0);
154
+ };
155
+ return /* @__PURE__ */ React2.createElement("div", {
156
+ className: "flex flex-col w-full divide-y divide-separator overflow-y-auto"
157
+ }, /* @__PURE__ */ React2.createElement(List.Root, {
158
+ items: triggers,
159
+ isItem: S.is(FunctionTrigger),
160
+ getId: (field) => field.id
161
+ }, ({ items: triggers2 }) => /* @__PURE__ */ React2.createElement("div", {
162
+ role: "list",
163
+ className: "flex flex-col w-full"
164
+ }, triggers2?.map((trigger2) => {
165
+ const copyAction = getCopyAction(client, trigger2);
166
+ return /* @__PURE__ */ React2.createElement(List.Item, {
167
+ key: trigger2.id,
168
+ item: trigger2,
169
+ classNames: mx(grid, ghostHover, "items-center", "px-2")
170
+ }, /* @__PURE__ */ React2.createElement(Input2.Root, null, /* @__PURE__ */ React2.createElement(Input2.Switch, {
171
+ checked: trigger2.enabled,
172
+ onCheckedChange: (checked) => trigger2.enabled = checked
173
+ })), /* @__PURE__ */ React2.createElement("div", {
174
+ className: "flex"
175
+ }, /* @__PURE__ */ React2.createElement(List.ItemTitle, {
176
+ classNames: "px-1 cursor-pointer w-0 shrink truncate",
177
+ onClick: () => handleSelect(trigger2)
178
+ }, getFunctionName2(scripts, functions, trigger2) ?? "\u2205"), copyAction && /* @__PURE__ */ React2.createElement(Button, {
179
+ onClick: () => navigator.clipboard.writeText(copyAction.contentProvider())
180
+ }, t(copyAction.translationKey))), /* @__PURE__ */ React2.createElement(List.ItemDeleteButton, {
181
+ onClick: () => handleDelete(trigger2)
182
+ }));
183
+ }))), trigger && /* @__PURE__ */ React2.createElement(TriggerEditor, {
184
+ space,
185
+ trigger,
186
+ onSave: handleSave,
187
+ onCancel: handleCancel
188
+ }), !trigger && /* @__PURE__ */ React2.createElement("div", {
189
+ className: "flex p-2 justify-center"
190
+ }, /* @__PURE__ */ React2.createElement(IconButton2, {
191
+ icon: "ph--plus--regular",
192
+ label: t("new trigger"),
193
+ onClick: handleAdd
194
+ })));
195
+ };
196
+ var getCopyAction = (client, trigger) => {
197
+ if (trigger?.spec?.type === TriggerKind2.Email) {
198
+ return {
199
+ translationKey: "trigger copy email",
200
+ contentProvider: () => `${getSpace(trigger).id}@dxos.network`
201
+ };
202
+ }
203
+ if (trigger?.spec?.type === TriggerKind2.Webhook) {
204
+ return {
205
+ translationKey: "trigger copy url",
206
+ contentProvider: () => getWebhookUrl(client, trigger)
207
+ };
208
+ }
209
+ return void 0;
210
+ };
211
+ var getWebhookUrl = (client, trigger) => {
212
+ const spaceId = getSpace(trigger).id;
213
+ const edgeUrl = new URL(client.config.values.runtime.services.edge.url);
214
+ const isSecure = edgeUrl.protocol.startsWith("https") || edgeUrl.protocol.startsWith("wss");
215
+ edgeUrl.protocol = isSecure ? "https" : "http";
216
+ return new URL(`/webhook/${spaceId}:${trigger.id}`, edgeUrl).toString();
217
+ };
218
+ var getFunctionName2 = (scripts, functions, trigger) => {
219
+ const shortId = trigger.function && `${trigger.function?.slice(0, 16)}\u2026`;
220
+ const functionObject = functions.find((fn) => fn.name === trigger.function);
221
+ if (!functionObject) {
222
+ return shortId;
223
+ }
224
+ return scripts.find((s) => functionObject.source?.target?.id === s.id)?.name ?? shortId;
225
+ };
226
+
227
+ // packages/plugins/experimental/plugin-automation/src/components/AutomationPanel/index.ts
228
+ var AutomationPanel_default = AutomationPanel;
229
+ export {
230
+ AutomationPanel_default as default
231
+ };
232
+ //# sourceMappingURL=AutomationPanel-MW42U6I4.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/AutomationPanel/AutomationPanel.tsx", "../../../src/components/TriggerEditor/TriggerEditor.tsx", "../../../src/components/AutomationPanel/index.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useState } from 'react';\n\nimport { S } from '@dxos/echo-schema';\nimport {\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 { create, Filter, useQuery, type Space, type ReactiveObject, getSpace } from '@dxos/react-client/echo';\nimport { IconButton, Input, useTranslation, Button } from '@dxos/react-ui';\nimport { List } from '@dxos/react-ui-list';\nimport { ghostHover, mx } from '@dxos/react-ui-theme';\n\nimport { AUTOMATION_PLUGIN } from '../../meta';\nimport { TriggerEditor, type TriggerEditorProps } from '../TriggerEditor';\n\nconst grid = 'grid grid-cols-[40px_1fr_32px] min-bs-[2.5rem]';\n\nexport type AutomationPanelProps = {\n space: Space;\n object?: ReactiveObject<any>;\n};\n\n// TODO(burdon): Factor out common layout with ViewEditor.\nexport const AutomationPanel = ({ space, object }: AutomationPanelProps) => {\n const { t } = useTranslation(AUTOMATION_PLUGIN);\n const client = useClient();\n const triggers = useQuery(space, Filter.schema(FunctionTrigger));\n const functions = useQuery(space, Filter.schema(FunctionType));\n const scripts = useQuery(space, Filter.schema(ScriptType));\n\n const [trigger, setTrigger] = useState<FunctionTriggerType>();\n const [selected, setSelected] = useState<FunctionTrigger>();\n\n const handleSelect = (trigger: FunctionTrigger) => {\n const { id: _, ...values } = trigger;\n setTrigger(values);\n setSelected(trigger);\n };\n\n const handleAdd = () => {\n setTrigger(create(FunctionTriggerSchema, { meta: {} }));\n setSelected(undefined);\n };\n\n const handleDelete = (trigger: FunctionTrigger) => {\n space.db.remove(trigger);\n setTrigger(undefined);\n setSelected(undefined);\n };\n\n const handleSave: TriggerEditorProps['onSave'] = (trigger) => {\n if (selected) {\n Object.assign(selected, trigger);\n } else {\n space.db.add(create(FunctionTrigger, trigger));\n }\n\n setTrigger(undefined);\n setSelected(undefined);\n };\n\n const handleCancel: TriggerEditorProps['onCancel'] = () => {\n setTrigger(undefined);\n };\n\n return (\n <div className='flex flex-col w-full divide-y divide-separator overflow-y-auto'>\n <List.Root<FunctionTrigger> items={triggers} isItem={S.is(FunctionTrigger)} getId={(field) => field.id}>\n {({ items: triggers }) => (\n <div role='list' className='flex flex-col w-full'>\n {triggers?.map((trigger) => {\n 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 <Button onClick={() => navigator.clipboard.writeText(copyAction.contentProvider())}>\n {t(copyAction.translationKey)}\n </Button>\n )}\n </div>\n\n <List.ItemDeleteButton onClick={() => handleDelete(trigger)} />\n </List.Item>\n );\n })}\n </div>\n )}\n </List.Root>\n\n {trigger && <TriggerEditor space={space} trigger={trigger} onSave={handleSave} onCancel={handleCancel} />}\n\n {!trigger && (\n <div className='flex p-2 justify-center'>\n <IconButton icon='ph--plus--regular' label={t('new trigger')} onClick={handleAdd} />\n </div>\n )}\n </div>\n );\n};\n\nconst getCopyAction = (client: Client, trigger: FunctionTrigger | undefined) => {\n if (trigger?.spec?.type === TriggerKind.Email) {\n return { translationKey: 'trigger copy email', contentProvider: () => `${getSpace(trigger)!.id}@dxos.network` };\n }\n\n if (trigger?.spec?.type === 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 const shortId = trigger.function && `${trigger.function?.slice(0, 16)}…`;\n const functionObject = functions.find((fn) => fn.name === trigger.function);\n if (!functionObject) {\n return shortId;\n }\n return scripts.find((s) => functionObject.source?.target?.id === s.id)?.name ?? shortId;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useState } from 'react';\n\nimport {\n FunctionType,\n FunctionTriggerSchema,\n type FunctionTriggerType,\n type FunctionTrigger,\n ScriptType,\n TriggerKind,\n} from '@dxos/functions';\nimport { Filter, useQuery, type Space } from '@dxos/react-client/echo';\nimport { IconButton, Input, useTranslation } from '@dxos/react-ui';\nimport { Form, SelectInput, TextInput } from '@dxos/react-ui-form';\n\nimport { AUTOMATION_PLUGIN } from '../../meta';\n\nexport type TriggerEditorProps = {\n space: Space;\n trigger: FunctionTriggerType;\n onSave?: (trigger: Omit<FunctionTrigger, 'id'>) => void;\n onCancel?: () => void;\n};\n\nexport const TriggerEditor = ({ space, trigger, onSave, onCancel }: TriggerEditorProps) => {\n const { t } = useTranslation(AUTOMATION_PLUGIN);\n\n const functions = useQuery(space, Filter.schema(FunctionType));\n const scripts = useQuery(space, Filter.schema(ScriptType));\n\n const handleSave = (values: FunctionTriggerType) => {\n onSave?.(values);\n };\n\n return (\n <Form<FunctionTriggerType>\n schema={FunctionTriggerSchema}\n values={trigger}\n onSave={handleSave}\n onCancel={onCancel}\n Custom={{\n ['function' satisfies keyof FunctionTriggerType]: (props) => (\n <SelectInput\n {...props}\n options={functions.map((fn) => ({\n value: fn.name,\n label: getFunctionName(scripts, fn),\n }))}\n />\n ),\n ['spec.type' as const]: (props) => (\n <SelectInput\n {...props}\n options={Object.values(TriggerKind).map((kind) => ({\n value: kind,\n label: t(`trigger type ${kind}`),\n }))}\n />\n ),\n ['meta' as const]: (props) => {\n const meta = props.getValue()!;\n\n const [newMetaFieldName, setNewMetaFieldName] = useState('');\n\n React.useEffect(() => props.onValueChange('object', { ...meta }), []);\n\n return (\n <>\n <div>{props.label}</div>\n {[...Object.keys(meta)].map((key) => {\n const compositeKey: any = `meta.${key}`;\n return (\n <div key={compositeKey} role='none' className='flex items-center mt-2 gap-1'>\n <div role='none' className='flex-1'>\n <TextInput {...props} type={'string'} label={key} />\n </div>\n <IconButton\n icon='ph--trash--regular'\n iconOnly\n classNames={'mt-6'}\n label={t('trigger meta remove')}\n onClick={() => {\n const newValues: any = { ...props.getValue() };\n delete newValues[key];\n props.onValueChange('object', newValues);\n }}\n />\n </div>\n );\n })}\n <div role='none' className='flex items-center mt-2 gap-1 plb-1'>\n <div role='none' className='flex-1'>\n <Input.Root>\n <Input.TextInput\n placeholder={t('trigger meta prop name placeholder')}\n value={newMetaFieldName}\n onChange={(event) => setNewMetaFieldName(event.target.value)}\n />\n </Input.Root>\n </div>\n <IconButton\n icon='ph--plus--regular'\n iconOnly\n label={t('trigger meta add')}\n onClick={() => {\n if (newMetaFieldName.length) {\n const meta = props.getValue() ?? {};\n const metaWithNewProp = { ...meta, [newMetaFieldName]: '' };\n setNewMetaFieldName('');\n props.onValueChange('object', metaWithNewProp);\n }\n }}\n />\n </div>\n </>\n );\n },\n }}\n />\n );\n};\n\nconst getFunctionName = (scripts: ScriptType[], fn: FunctionType) => {\n return scripts.find((s) => fn.source?.target?.id === s.id)?.name ?? fn.name;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { AutomationPanel } from './AutomationPanel';\n\nexport default AutomationPanel;\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "useState", "S", "FunctionType", "FunctionTrigger", "FunctionTriggerSchema", "TriggerKind", "ScriptType", "useClient", "create", "Filter", "useQuery", "getSpace", "IconButton", "Input", "useTranslation", "Button", "List", "ghostHover", "mx", "React", "useState", "FunctionType", "FunctionTriggerSchema", "ScriptType", "TriggerKind", "Filter", "useQuery", "IconButton", "Input", "useTranslation", "Form", "SelectInput", "TextInput", "TriggerEditor", "space", "trigger", "onSave", "onCancel", "t", "useTranslation", "AUTOMATION_PLUGIN", "functions", "useQuery", "Filter", "schema", "FunctionType", "scripts", "ScriptType", "handleSave", "values", "Form", "FunctionTriggerSchema", "Custom", "props", "SelectInput", "options", "map", "fn", "value", "name", "label", "getFunctionName", "Object", "TriggerKind", "kind", "meta", "getValue", "newMetaFieldName", "setNewMetaFieldName", "useState", "React", "useEffect", "onValueChange", "div", "keys", "key", "compositeKey", "role", "className", "TextInput", "type", "IconButton", "icon", "iconOnly", "classNames", "onClick", "newValues", "Input", "Root", "placeholder", "onChange", "event", "target", "length", "metaWithNewProp", "find", "s", "source", "id", "grid", "AutomationPanel", "space", "object", "t", "useTranslation", "AUTOMATION_PLUGIN", "client", "useClient", "triggers", "useQuery", "Filter", "schema", "FunctionTrigger", "functions", "FunctionType", "scripts", "ScriptType", "trigger", "setTrigger", "useState", "selected", "setSelected", "handleSelect", "id", "_", "values", "handleAdd", "create", "FunctionTriggerSchema", "meta", "undefined", "handleDelete", "db", "remove", "handleSave", "Object", "assign", "add", "handleCancel", "React", "div", "className", "List", "Root", "items", "isItem", "S", "is", "getId", "field", "role", "map", "copyAction", "getCopyAction", "Item", "key", "item", "classNames", "mx", "ghostHover", "Input", "Switch", "checked", "enabled", "onCheckedChange", "ItemTitle", "onClick", "getFunctionName", "Button", "navigator", "clipboard", "writeText", "contentProvider", "translationKey", "ItemDeleteButton", "TriggerEditor", "onSave", "onCancel", "IconButton", "icon", "label", "spec", "type", "TriggerKind", "Email", "getSpace", "Webhook", "getWebhookUrl", "spaceId", "edgeUrl", "URL", "config", "runtime", "services", "edge", "url", "isSecure", "protocol", "startsWith", "toString", "shortId", "function", "slice", "functionObject", "find", "fn", "name", "s", "source", "target", "AutomationPanel"]
7
+ }
@@ -0,0 +1,132 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import {
3
+ AUTOMATION_PLUGIN
4
+ } from "./chunk-JFHI22MF.mjs";
5
+
6
+ // packages/plugins/experimental/plugin-automation/src/capabilities/app-graph-builder.ts
7
+ import { Capabilities, contributes } from "@dxos/app-framework";
8
+ import { ClientCapabilities } from "@dxos/plugin-client";
9
+ import { createExtension, toSignal } from "@dxos/plugin-graph";
10
+ import { memoizeQuery } from "@dxos/plugin-space";
11
+ import { getTypename, parseId, SpaceState } from "@dxos/react-client/echo";
12
+ var app_graph_builder_default = (context) => {
13
+ const resolve = (typename) => context.requestCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {};
14
+ return contributes(Capabilities.AppGraphBuilder, [
15
+ createExtension({
16
+ id: `${AUTOMATION_PLUGIN}/automation-for-subject`,
17
+ resolver: ({ id }) => {
18
+ if (!id.endsWith("~automation")) {
19
+ return;
20
+ }
21
+ const type = "orphan-settings-for-subject";
22
+ const icon = "ph--magic-wand--regular";
23
+ const client = context.requestCapability(ClientCapabilities.Client);
24
+ const [subjectId] = id.split("~");
25
+ const { spaceId, objectId } = parseId(subjectId);
26
+ const spaces = toSignal((onChange) => client.spaces.subscribe(() => onChange()).unsubscribe, () => client.spaces.get());
27
+ const space = spaces?.find((space2) => space2.id === spaceId && space2.state.get() === SpaceState.SPACE_READY);
28
+ if (!objectId) {
29
+ const label2 = space ? space.properties.name || [
30
+ "unnamed space label",
31
+ {
32
+ ns: AUTOMATION_PLUGIN
33
+ }
34
+ ] : [
35
+ "unnamed object settings label",
36
+ {
37
+ ns: AUTOMATION_PLUGIN
38
+ }
39
+ ];
40
+ return {
41
+ id,
42
+ type,
43
+ data: null,
44
+ properties: {
45
+ icon,
46
+ label: label2,
47
+ showResolvedThreads: false,
48
+ object: null,
49
+ space
50
+ }
51
+ };
52
+ }
53
+ const [object] = memoizeQuery(space, {
54
+ id: objectId
55
+ });
56
+ if (!object || !subjectId) {
57
+ return;
58
+ }
59
+ const meta = resolve(getTypename(object) ?? "");
60
+ const label = meta.label?.(object) || object.name || meta.placeholder || [
61
+ "unnamed object settings label",
62
+ {
63
+ ns: AUTOMATION_PLUGIN
64
+ }
65
+ ];
66
+ return {
67
+ id,
68
+ type,
69
+ data: null,
70
+ properties: {
71
+ icon,
72
+ label,
73
+ object
74
+ }
75
+ };
76
+ }
77
+ }),
78
+ createExtension({
79
+ id: `${AUTOMATION_PLUGIN}/assistant-for-subject`,
80
+ resolver: ({ id }) => {
81
+ if (!id.endsWith("~assistant")) {
82
+ return;
83
+ }
84
+ const client = context.requestCapability(ClientCapabilities.Client);
85
+ const [subjectId] = id.split("~");
86
+ const { spaceId, objectId } = parseId(subjectId);
87
+ const spaces = toSignal((onChange) => client.spaces.subscribe(() => onChange()).unsubscribe, () => client.spaces.get());
88
+ const space = spaces?.find((space2) => space2.id === spaceId && space2.state.get() === SpaceState.SPACE_READY);
89
+ if (!objectId) {
90
+ return {
91
+ id,
92
+ type: "orphan-automation-for-subject",
93
+ data: null,
94
+ properties: {
95
+ icon: "ph--atom--regular",
96
+ label: [
97
+ "assistant panel label",
98
+ {
99
+ ns: AUTOMATION_PLUGIN
100
+ }
101
+ ],
102
+ object: null,
103
+ space
104
+ }
105
+ };
106
+ }
107
+ const [object] = memoizeQuery(space, {
108
+ id: objectId
109
+ });
110
+ return {
111
+ id,
112
+ type: "orphan-automation-for-subject",
113
+ data: null,
114
+ properties: {
115
+ icon: "ph--atom--regular",
116
+ label: [
117
+ "assistant panel label",
118
+ {
119
+ ns: AUTOMATION_PLUGIN
120
+ }
121
+ ],
122
+ object
123
+ }
124
+ };
125
+ }
126
+ })
127
+ ]);
128
+ };
129
+ export {
130
+ app_graph_builder_default as default
131
+ };
132
+ //# sourceMappingURL=app-graph-builder-4SD4F3KN.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/app-graph-builder.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capabilities, contributes, type PluginsContext } from '@dxos/app-framework';\nimport { ClientCapabilities } from '@dxos/plugin-client';\nimport { createExtension, toSignal } from '@dxos/plugin-graph';\nimport { memoizeQuery } from '@dxos/plugin-space';\nimport { getTypename, parseId, SpaceState } from '@dxos/react-client/echo';\n\nimport { AUTOMATION_PLUGIN } from '../meta';\n\nexport default (context: PluginsContext) => {\n const resolve = (typename: string) =>\n context.requestCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {};\n\n return contributes(Capabilities.AppGraphBuilder, [\n createExtension({\n id: `${AUTOMATION_PLUGIN}/automation-for-subject`,\n resolver: ({ id }) => {\n if (!id.endsWith('~automation')) {\n return;\n }\n\n const type = 'orphan-settings-for-subject';\n const icon = 'ph--magic-wand--regular';\n\n const client = context.requestCapability(ClientCapabilities.Client);\n const [subjectId] = id.split('~');\n const { spaceId, objectId } = parseId(subjectId);\n const spaces = toSignal(\n (onChange) => client.spaces.subscribe(() => onChange()).unsubscribe,\n () => client.spaces.get(),\n );\n const space = spaces?.find((space) => space.id === spaceId && space.state.get() === SpaceState.SPACE_READY);\n if (!objectId) {\n // TODO(burdon): Ref SPACE_PLUGIN ns.\n const label = space\n ? space.properties.name || ['unnamed space label', { ns: AUTOMATION_PLUGIN }]\n : ['unnamed object settings label', { ns: AUTOMATION_PLUGIN }];\n\n // TODO(wittjosiah): Support comments for arbitrary subjects.\n // This is to ensure that the comments panel is not stuck on an old object.\n return {\n id,\n type,\n data: null,\n properties: {\n icon,\n label,\n showResolvedThreads: false,\n object: null,\n space,\n },\n };\n }\n\n const [object] = memoizeQuery(space, { id: objectId });\n if (!object || !subjectId) {\n return;\n }\n\n const meta = resolve(getTypename(object) ?? '');\n const label = meta.label?.(object) ||\n object.name ||\n meta.placeholder || ['unnamed object settings label', { ns: AUTOMATION_PLUGIN }];\n\n return {\n id,\n type,\n data: null,\n properties: {\n icon,\n label,\n object,\n },\n };\n },\n }),\n createExtension({\n id: `${AUTOMATION_PLUGIN}/assistant-for-subject`,\n resolver: ({ id }) => {\n // TODO(Zan): Find util (or make one). Effect schema!!\n if (!id.endsWith('~assistant')) {\n return;\n }\n\n const client = context.requestCapability(ClientCapabilities.Client);\n const [subjectId] = id.split('~');\n const { spaceId, objectId } = parseId(subjectId);\n const spaces = toSignal(\n (onChange) => client.spaces.subscribe(() => onChange()).unsubscribe,\n () => client.spaces.get(),\n );\n const space = spaces?.find((space) => space.id === spaceId && space.state.get() === SpaceState.SPACE_READY);\n if (!objectId) {\n // TODO(wittjosiah): Support assistant for arbitrary subjects.\n // This is to ensure that the assistant panel is not stuck on an old object.\n return {\n id,\n type: 'orphan-automation-for-subject',\n data: null,\n properties: {\n icon: 'ph--atom--regular',\n label: ['assistant panel label', { ns: AUTOMATION_PLUGIN }],\n object: null,\n space,\n },\n };\n }\n\n const [object] = memoizeQuery(space, { id: objectId });\n\n return {\n id,\n type: 'orphan-automation-for-subject',\n data: null,\n properties: {\n icon: 'ph--atom--regular',\n label: ['assistant panel label', { ns: AUTOMATION_PLUGIN }],\n object,\n },\n };\n },\n }),\n ]);\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["Capabilities", "contributes", "ClientCapabilities", "createExtension", "toSignal", "memoizeQuery", "getTypename", "parseId", "SpaceState", "context", "resolve", "typename", "requestCapabilities", "Capabilities", "Metadata", "find", "id", "metadata", "contributes", "AppGraphBuilder", "createExtension", "AUTOMATION_PLUGIN", "resolver", "endsWith", "type", "icon", "client", "requestCapability", "ClientCapabilities", "Client", "subjectId", "split", "spaceId", "objectId", "parseId", "spaces", "toSignal", "onChange", "subscribe", "unsubscribe", "get", "space", "state", "SpaceState", "SPACE_READY", "label", "properties", "name", "ns", "data", "showResolvedThreads", "object", "memoizeQuery", "meta", "getTypename", "placeholder"]
7
+ }
@@ -36,16 +36,10 @@ var ChainType = class extends TypedObject({
36
36
  }) {
37
37
  };
38
38
 
39
- // packages/plugins/experimental/plugin-automation/src/types/types.ts
40
- var AutomationAction;
41
- /* @__PURE__ */ (function(AutomationAction2) {
42
- })(AutomationAction || (AutomationAction = {}));
43
-
44
39
  export {
45
40
  ChainInputType,
46
41
  ChainInputSchema,
47
42
  ChainPromptType,
48
- ChainType,
49
- AutomationAction
43
+ ChainType
50
44
  };
51
- //# sourceMappingURL=chunk-GCHXTXVT.mjs.map
45
+ //# sourceMappingURL=chunk-GIAYUM5I.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../src/types/schema.ts", "../../../src/types/types.ts"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Ref, S, TypedObject } from '@dxos/echo-schema';\n\n// TODO(burdon): Change to S.Literal (and discriminated union).\nexport enum ChainInputType {\n VALUE = 0,\n PASS_THROUGH = 1,\n RETRIEVER = 2,\n FUNCTION = 3,\n QUERY = 4,\n RESOLVER = 5,\n CONTEXT = 6,\n SCHEMA = 7,\n}\n\nexport const ChainInputSchema = S.mutable(\n S.Struct({\n name: S.String,\n type: S.optional(S.Enums(ChainInputType)),\n value: S.optional(S.String),\n }),\n);\n\nexport type ChainInput = S.Schema.Type<typeof ChainInputSchema>;\n\nexport class ChainPromptType extends TypedObject({ typename: 'dxos.org/type/ChainPrompt', version: '0.1.0' })({\n command: S.optional(S.String),\n template: S.String,\n inputs: S.optional(S.mutable(S.Array(ChainInputSchema))),\n}) {}\n\nexport class ChainType extends TypedObject({ typename: 'dxos.org/type/Chain', version: '0.1.0' })({\n name: S.optional(S.String),\n prompts: S.optional(S.mutable(S.Array(Ref(ChainPromptType)))),\n}) {}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport type {\n GraphBuilderProvides,\n IntentResolverProvides,\n MetadataRecordsProvides,\n SurfaceProvides,\n TranslationsProvides,\n} from '@dxos/app-framework';\nimport { type PanelProvides } from '@dxos/plugin-deck/types';\nimport { type SchemaProvides } from '@dxos/plugin-space';\n\n// import { AUTOMATION_PLUGIN } from '../meta';\n\n// const AUTOMATION_ACTION = `${AUTOMATION_PLUGIN}/action`;\n\nexport enum AutomationAction {}\n\nexport type AutomationPluginProvides = SurfaceProvides &\n IntentResolverProvides &\n MetadataRecordsProvides &\n TranslationsProvides &\n GraphBuilderProvides &\n SchemaProvides &\n PanelProvides;\n"],
5
- "mappings": ";;;AAIA,SAASA,KAAKC,GAAGC,mBAAmB;;UAGxBC,iBAAAA;;;;;;;;;GAAAA,mBAAAA,iBAAAA,CAAAA,EAAAA;AAWL,IAAMC,mBAAmBC,EAAEC,QAChCD,EAAEE,OAAO;EACPC,MAAMH,EAAEI;EACRC,MAAML,EAAEM,SAASN,EAAEO,MAAMT,cAAAA,CAAAA;EACzBU,OAAOR,EAAEM,SAASN,EAAEI,MAAM;AAC5B,CAAA,CAAA;AAKK,IAAMK,kBAAN,cAA8BC,YAAY;EAAEC,UAAU;EAA6BC,SAAS;AAAQ,CAAA,EAAG;EAC5GC,SAASb,EAAEM,SAASN,EAAEI,MAAM;EAC5BU,UAAUd,EAAEI;EACZW,QAAQf,EAAEM,SAASN,EAAEC,QAAQD,EAAEgB,MAAMjB,gBAAAA,CAAAA,CAAAA;AACvC,CAAA,EAAA;AAAI;AAEG,IAAMkB,YAAN,cAAwBP,YAAY;EAAEC,UAAU;EAAuBC,SAAS;AAAQ,CAAA,EAAG;EAChGT,MAAMH,EAAEM,SAASN,EAAEI,MAAM;EACzBc,SAASlB,EAAEM,SAASN,EAAEC,QAAQD,EAAEgB,MAAMG,IAAIV,eAAAA,CAAAA,CAAAA,CAAAA;AAC5C,CAAA,EAAA;AAAI;;;;0BCnBQW,mBAAAA;AAAAA,GAAAA,qBAAAA,mBAAAA,CAAAA,EAAAA;",
6
- "names": ["Ref", "S", "TypedObject", "ChainInputType", "ChainInputSchema", "S", "mutable", "Struct", "name", "String", "type", "optional", "Enums", "value", "ChainPromptType", "TypedObject", "typename", "version", "command", "template", "inputs", "Array", "ChainType", "prompts", "Ref", "AutomationAction"]
3
+ "sources": ["../../../src/types/schema.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Ref, S, TypedObject } from '@dxos/echo-schema';\n\n// TODO(burdon): Change to S.Literal (and discriminated union).\nexport enum ChainInputType {\n VALUE = 0,\n PASS_THROUGH = 1,\n RETRIEVER = 2,\n FUNCTION = 3,\n QUERY = 4,\n RESOLVER = 5,\n CONTEXT = 6,\n SCHEMA = 7,\n}\n\nexport const ChainInputSchema = S.mutable(\n S.Struct({\n name: S.String,\n type: S.optional(S.Enums(ChainInputType)),\n value: S.optional(S.String),\n }),\n);\n\nexport type ChainInput = S.Schema.Type<typeof ChainInputSchema>;\n\nexport class ChainPromptType extends TypedObject({ typename: 'dxos.org/type/ChainPrompt', version: '0.1.0' })({\n command: S.optional(S.String),\n template: S.String,\n inputs: S.optional(S.mutable(S.Array(ChainInputSchema))),\n}) {}\n\nexport class ChainType extends TypedObject({ typename: 'dxos.org/type/Chain', version: '0.1.0' })({\n name: S.optional(S.String),\n prompts: S.optional(S.mutable(S.Array(Ref(ChainPromptType)))),\n}) {}\n"],
5
+ "mappings": ";;;AAIA,SAASA,KAAKC,GAAGC,mBAAmB;;UAGxBC,iBAAAA;;;;;;;;;GAAAA,mBAAAA,iBAAAA,CAAAA,EAAAA;AAWL,IAAMC,mBAAmBC,EAAEC,QAChCD,EAAEE,OAAO;EACPC,MAAMH,EAAEI;EACRC,MAAML,EAAEM,SAASN,EAAEO,MAAMT,cAAAA,CAAAA;EACzBU,OAAOR,EAAEM,SAASN,EAAEI,MAAM;AAC5B,CAAA,CAAA;AAKK,IAAMK,kBAAN,cAA8BC,YAAY;EAAEC,UAAU;EAA6BC,SAAS;AAAQ,CAAA,EAAG;EAC5GC,SAASb,EAAEM,SAASN,EAAEI,MAAM;EAC5BU,UAAUd,EAAEI;EACZW,QAAQf,EAAEM,SAASN,EAAEC,QAAQD,EAAEgB,MAAMjB,gBAAAA,CAAAA,CAAAA;AACvC,CAAA,EAAA;AAAI;AAEG,IAAMkB,YAAN,cAAwBP,YAAY;EAAEC,UAAU;EAAuBC,SAAS;AAAQ,CAAA,EAAG;EAChGT,MAAMH,EAAEM,SAASN,EAAEI,MAAM;EACzBc,SAASlB,EAAEM,SAASN,EAAEC,QAAQD,EAAEgB,MAAMG,IAAIV,eAAAA,CAAAA,CAAAA,CAAAA;AAC5C,CAAA,EAAA;AAAI;",
6
+ "names": ["Ref", "S", "TypedObject", "ChainInputType", "ChainInputSchema", "S", "mutable", "Struct", "name", "String", "type", "optional", "Enums", "value", "ChainPromptType", "TypedObject", "typename", "version", "command", "template", "inputs", "Array", "ChainType", "prompts", "Ref"]
7
7
  }
@@ -2,10 +2,10 @@ import { createRequire } from 'node:module';const require = createRequire(import
2
2
 
3
3
  // packages/plugins/experimental/plugin-automation/src/meta.ts
4
4
  var AUTOMATION_PLUGIN = "dxos.org/plugin/automation";
5
- var meta_default = {
5
+ var meta = {
6
6
  id: AUTOMATION_PLUGIN,
7
7
  name: "Automation",
8
- description: "Automation workflows.",
8
+ description: "The Automation tab allows you to trigger pre-defined workflows related to the element you are interacting with inside of Composer.",
9
9
  icon: "ph--magic-wand--regular",
10
10
  source: "https://github.com/dxos/dxos/tree/main/packages/plugins/experimental/plugin-automation",
11
11
  tags: [
@@ -15,6 +15,6 @@ var meta_default = {
15
15
 
16
16
  export {
17
17
  AUTOMATION_PLUGIN,
18
- meta_default
18
+ meta
19
19
  };
20
- //# sourceMappingURL=chunk-HNOBZHWK.mjs.map
20
+ //# sourceMappingURL=chunk-JFHI22MF.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 AUTOMATION_PLUGIN = 'dxos.org/plugin/automation';\n\nexport const meta = {\n id: AUTOMATION_PLUGIN,\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--magic-wand--regular',\n source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/experimental/plugin-automation',\n tags: ['experimental'],\n} satisfies PluginMeta;\n"],
5
+ "mappings": ";;;AAMO,IAAMA,oBAAoB;AAE1B,IAAMC,OAAO;EAClBC,IAAIF;EACJG,MAAM;EACNC,aACE;EACFC,MAAM;EACNC,QAAQ;EACRC,MAAM;IAAC;;AACT;",
6
+ "names": ["AUTOMATION_PLUGIN", "meta", "id", "name", "description", "icon", "source", "tags"]
7
+ }
@@ -0,0 +1,12 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+
3
+ // packages/plugins/experimental/plugin-automation/src/components/index.ts
4
+ import { lazy } from "react";
5
+ var AssistantPanel = lazy(() => import("./AssistantPanel-M67P24GS.mjs"));
6
+ var AutomationPanel = lazy(() => import("./AutomationPanel-MW42U6I4.mjs"));
7
+
8
+ export {
9
+ AssistantPanel,
10
+ AutomationPanel
11
+ };
12
+ //# sourceMappingURL=chunk-XVIEXSEZ.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/index.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { lazy } from 'react';\n\nexport const AssistantPanel = lazy(() => import('./AssistantPanel'));\nexport const AutomationPanel = lazy(() => import('./AutomationPanel'));\n"],
5
+ "mappings": ";;;AAIA,SAASA,YAAY;AAEd,IAAMC,iBAAiBC,KAAK,MAAM,OAAO,+BAAA,CAAA;AACzC,IAAMC,kBAAkBD,KAAK,MAAM,OAAO,gCAAA,CAAA;",
6
+ "names": ["lazy", "AssistantPanel", "lazy", "AutomationPanel"]
7
+ }