@dxos/plugin-automation 0.7.5-labs.8a82073 → 0.7.5-labs.c0e040f

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 (139) hide show
  1. package/dist/lib/browser/AutomationPanel-VW2XIUPU.mjs +8 -0
  2. package/dist/lib/browser/ChatContainer-OLRZNGWK.mjs +12 -0
  3. package/dist/lib/browser/{ai-client-UJLNYP7B.mjs → ai-client-5CNY6JBF.mjs} +3 -3
  4. package/dist/lib/browser/{app-graph-builder-3H5TCRG4.mjs → app-graph-builder-6H7MDCXE.mjs} +39 -4
  5. package/dist/lib/browser/app-graph-builder-6H7MDCXE.mjs.map +7 -0
  6. package/dist/lib/browser/{chunk-BQHXJZ4K.mjs → chunk-2H2EUYXL.mjs} +2 -2
  7. package/dist/lib/browser/{chunk-N4SSCQ7P.mjs → chunk-ITG6CBKL.mjs} +10 -10
  8. package/dist/lib/browser/chunk-ITG6CBKL.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-MRBC5J4T.mjs +518 -0
  10. package/dist/lib/browser/chunk-MRBC5J4T.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-6KJRL5KV.mjs → chunk-NQFZ6XRX.mjs} +2 -2
  12. package/dist/lib/browser/{chunk-43WRHV2L.mjs → chunk-Q4IMHYGH.mjs} +2 -2
  13. package/dist/lib/browser/{chunk-DQ7ZSYJJ.mjs → chunk-R4JH4TLE.mjs} +3 -1
  14. package/dist/lib/browser/chunk-R4JH4TLE.mjs.map +7 -0
  15. package/dist/lib/browser/index.mjs +10 -6
  16. package/dist/lib/browser/index.mjs.map +1 -1
  17. package/dist/lib/browser/{intent-resolver-5YVZJFS3.mjs → intent-resolver-BWAXKT27.mjs} +3 -3
  18. package/dist/lib/browser/meta.json +1 -1
  19. package/dist/lib/browser/{react-surface-RRTZFTKR.mjs → react-surface-O6SHIBCA.mjs} +15 -7
  20. package/dist/lib/browser/react-surface-O6SHIBCA.mjs.map +7 -0
  21. package/dist/lib/browser/types/index.mjs +2 -2
  22. package/dist/lib/node/{AutomationPanel-BCEY3YXO.cjs → AutomationPanel-G6EDDYWW.cjs} +7 -7
  23. package/dist/lib/node/{AutomationPanel-BCEY3YXO.cjs.map → AutomationPanel-G6EDDYWW.cjs.map} +2 -2
  24. package/dist/lib/node/{ChatContainer-QUWFEBTI.cjs → ChatContainer-GRZDJIG5.cjs} +10 -10
  25. package/dist/lib/node/ChatContainer-GRZDJIG5.cjs.map +7 -0
  26. package/dist/lib/node/{ai-client-AOB6TLNW.cjs → ai-client-FKLPDELV.cjs} +7 -7
  27. package/dist/lib/node/{app-graph-builder-CDEQJEHY.cjs → app-graph-builder-7JMJLZIE.cjs} +48 -14
  28. package/dist/lib/node/app-graph-builder-7JMJLZIE.cjs.map +7 -0
  29. package/dist/lib/node/{chunk-DKGNORZK.cjs → chunk-CFBERLTN.cjs} +21 -21
  30. package/dist/lib/node/chunk-CFBERLTN.cjs.map +7 -0
  31. package/dist/lib/node/{chunk-TQEDPRY5.cjs → chunk-EQYHOTGG.cjs} +7 -4
  32. package/dist/lib/node/chunk-EQYHOTGG.cjs.map +7 -0
  33. package/dist/lib/node/chunk-FQUY77HT.cjs +527 -0
  34. package/dist/lib/node/chunk-FQUY77HT.cjs.map +7 -0
  35. package/dist/lib/node/{chunk-H3RSMGJG.cjs → chunk-GB7245FH.cjs} +6 -6
  36. package/dist/lib/node/{chunk-IPCNJYQL.cjs → chunk-QXIHYOMF.cjs} +7 -7
  37. package/dist/lib/node/{chunk-AWZVJZ2I.cjs → chunk-U5Z7LFWB.cjs} +6 -6
  38. package/dist/lib/node/index.cjs +75 -71
  39. package/dist/lib/node/index.cjs.map +1 -1
  40. package/dist/lib/node/{intent-resolver-MJFZT5IU.cjs → intent-resolver-C6OKFVEW.cjs} +8 -8
  41. package/dist/lib/node/meta.json +1 -1
  42. package/dist/lib/node/{react-surface-BVZ63QP4.cjs → react-surface-JT6SVCPK.cjs} +23 -17
  43. package/dist/lib/node/react-surface-JT6SVCPK.cjs.map +7 -0
  44. package/dist/lib/node/types/index.cjs +11 -11
  45. package/dist/lib/node/types/index.cjs.map +1 -1
  46. package/dist/lib/node-esm/{AutomationPanel-YTIZ74RI.mjs → AutomationPanel-V3IWQAMO.mjs} +3 -3
  47. package/dist/lib/node-esm/{ChatContainer-QSMDZRDU.mjs → ChatContainer-ORVWQPJO.mjs} +5 -5
  48. package/dist/lib/node-esm/{ai-client-RUCCJ7JZ.mjs → ai-client-XGNA6SJ5.mjs} +3 -3
  49. package/dist/lib/node-esm/{app-graph-builder-GR3URVNX.mjs → app-graph-builder-C6NUQGCU.mjs} +39 -4
  50. package/dist/lib/node-esm/app-graph-builder-C6NUQGCU.mjs.map +7 -0
  51. package/dist/lib/node-esm/chunk-2OKJZ4ZW.mjs +519 -0
  52. package/dist/lib/node-esm/chunk-2OKJZ4ZW.mjs.map +7 -0
  53. package/dist/lib/node-esm/{chunk-CZXU4CFK.mjs → chunk-6HLBYDUI.mjs} +2 -2
  54. package/dist/lib/node-esm/{chunk-D7RARVTS.mjs → chunk-7VPT3OO3.mjs} +10 -10
  55. package/dist/lib/node-esm/chunk-7VPT3OO3.mjs.map +7 -0
  56. package/dist/lib/node-esm/{chunk-7JO77AAS.mjs → chunk-DNCXRGAF.mjs} +2 -2
  57. package/dist/lib/node-esm/{chunk-JFHI22MF.mjs → chunk-EMVA6QUT.mjs} +3 -1
  58. package/dist/lib/node-esm/chunk-EMVA6QUT.mjs.map +7 -0
  59. package/dist/lib/node-esm/{chunk-LSSWQIQD.mjs → chunk-IJRTDSKN.mjs} +2 -2
  60. package/dist/lib/node-esm/index.mjs +10 -6
  61. package/dist/lib/node-esm/index.mjs.map +1 -1
  62. package/dist/lib/node-esm/{intent-resolver-FCKNRTKQ.mjs → intent-resolver-DCP4ZDBA.mjs} +3 -3
  63. package/dist/lib/node-esm/meta.json +1 -1
  64. package/dist/lib/node-esm/{react-surface-Y5LQHUQN.mjs → react-surface-DSVM33SA.mjs} +15 -7
  65. package/dist/lib/node-esm/react-surface-DSVM33SA.mjs.map +7 -0
  66. package/dist/lib/node-esm/types/index.mjs +2 -2
  67. package/dist/types/src/capabilities/app-graph-builder.d.ts +23 -22
  68. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  69. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  70. package/dist/types/src/components/AmbientChatDialog/AmbientChatDialog.d.ts +3 -0
  71. package/dist/types/src/components/AmbientChatDialog/AmbientChatDialog.d.ts.map +1 -0
  72. package/dist/types/src/components/AmbientChatDialog/AmbientChatDialog.stories.d.ts +8 -0
  73. package/dist/types/src/components/AmbientChatDialog/AmbientChatDialog.stories.d.ts.map +1 -0
  74. package/dist/types/src/components/AmbientChatDialog/index.d.ts +2 -0
  75. package/dist/types/src/components/AmbientChatDialog/index.d.ts.map +1 -0
  76. package/dist/types/src/components/Prompt/Prompt.d.ts +3 -3
  77. package/dist/types/src/components/Prompt/Prompt.d.ts.map +1 -1
  78. package/dist/types/src/components/Prompt/prompt-autocomplete.d.ts +1 -1
  79. package/dist/types/src/components/Prompt/prompt-autocomplete.d.ts.map +1 -1
  80. package/dist/types/src/components/ServiceRegistry/ServiceRegistry.d.ts.map +1 -1
  81. package/dist/types/src/components/index.d.ts +1 -0
  82. package/dist/types/src/components/index.d.ts.map +1 -1
  83. package/dist/types/src/meta.d.ts +1 -0
  84. package/dist/types/src/meta.d.ts.map +1 -1
  85. package/package.json +52 -51
  86. package/src/capabilities/app-graph-builder.ts +34 -3
  87. package/src/capabilities/react-surface.tsx +8 -2
  88. package/src/components/AmbientChatDialog/AmbientChatDialog.stories.tsx +44 -0
  89. package/src/components/AmbientChatDialog/AmbientChatDialog.tsx +63 -0
  90. package/src/components/AmbientChatDialog/index.ts +5 -0
  91. package/src/components/Prompt/Prompt.tsx +6 -3
  92. package/src/components/Prompt/prompt-autocomplete.ts +2 -2
  93. package/src/components/PromptEditor/PromptEditor.tsx +3 -3
  94. package/src/components/ServiceRegistry/ServiceRegistry.tsx +1 -0
  95. package/src/components/Thread/Thread.stories.tsx +1 -1
  96. package/src/components/index.ts +1 -0
  97. package/src/hooks/useChatProcessor.tsx +2 -2
  98. package/src/meta.ts +2 -0
  99. package/src/tools/openapi.test.ts +3 -6
  100. package/dist/lib/browser/AutomationPanel-CL2TWZT5.mjs +0 -8
  101. package/dist/lib/browser/ChatContainer-EJ3IWL7Y.mjs +0 -12
  102. package/dist/lib/browser/app-graph-builder-3H5TCRG4.mjs.map +0 -7
  103. package/dist/lib/browser/chunk-4M74P6YW.mjs +0 -284
  104. package/dist/lib/browser/chunk-4M74P6YW.mjs.map +0 -7
  105. package/dist/lib/browser/chunk-DQ7ZSYJJ.mjs.map +0 -7
  106. package/dist/lib/browser/chunk-N4SSCQ7P.mjs.map +0 -7
  107. package/dist/lib/browser/react-surface-RRTZFTKR.mjs.map +0 -7
  108. package/dist/lib/node/ChatContainer-QUWFEBTI.cjs.map +0 -7
  109. package/dist/lib/node/app-graph-builder-CDEQJEHY.cjs.map +0 -7
  110. package/dist/lib/node/chunk-DKGNORZK.cjs.map +0 -7
  111. package/dist/lib/node/chunk-LC6KNDPQ.cjs +0 -302
  112. package/dist/lib/node/chunk-LC6KNDPQ.cjs.map +0 -7
  113. package/dist/lib/node/chunk-TQEDPRY5.cjs.map +0 -7
  114. package/dist/lib/node/react-surface-BVZ63QP4.cjs.map +0 -7
  115. package/dist/lib/node-esm/app-graph-builder-GR3URVNX.mjs.map +0 -7
  116. package/dist/lib/node-esm/chunk-CQPQXIJP.mjs +0 -285
  117. package/dist/lib/node-esm/chunk-CQPQXIJP.mjs.map +0 -7
  118. package/dist/lib/node-esm/chunk-D7RARVTS.mjs.map +0 -7
  119. package/dist/lib/node-esm/chunk-JFHI22MF.mjs.map +0 -7
  120. package/dist/lib/node-esm/react-surface-Y5LQHUQN.mjs.map +0 -7
  121. /package/dist/lib/browser/{AutomationPanel-CL2TWZT5.mjs.map → AutomationPanel-VW2XIUPU.mjs.map} +0 -0
  122. /package/dist/lib/browser/{ChatContainer-EJ3IWL7Y.mjs.map → ChatContainer-OLRZNGWK.mjs.map} +0 -0
  123. /package/dist/lib/browser/{ai-client-UJLNYP7B.mjs.map → ai-client-5CNY6JBF.mjs.map} +0 -0
  124. /package/dist/lib/browser/{chunk-BQHXJZ4K.mjs.map → chunk-2H2EUYXL.mjs.map} +0 -0
  125. /package/dist/lib/browser/{chunk-6KJRL5KV.mjs.map → chunk-NQFZ6XRX.mjs.map} +0 -0
  126. /package/dist/lib/browser/{chunk-43WRHV2L.mjs.map → chunk-Q4IMHYGH.mjs.map} +0 -0
  127. /package/dist/lib/browser/{intent-resolver-5YVZJFS3.mjs.map → intent-resolver-BWAXKT27.mjs.map} +0 -0
  128. /package/dist/lib/node/{ai-client-AOB6TLNW.cjs.map → ai-client-FKLPDELV.cjs.map} +0 -0
  129. /package/dist/lib/node/{chunk-H3RSMGJG.cjs.map → chunk-GB7245FH.cjs.map} +0 -0
  130. /package/dist/lib/node/{chunk-IPCNJYQL.cjs.map → chunk-QXIHYOMF.cjs.map} +0 -0
  131. /package/dist/lib/node/{chunk-AWZVJZ2I.cjs.map → chunk-U5Z7LFWB.cjs.map} +0 -0
  132. /package/dist/lib/node/{intent-resolver-MJFZT5IU.cjs.map → intent-resolver-C6OKFVEW.cjs.map} +0 -0
  133. /package/dist/lib/node-esm/{AutomationPanel-YTIZ74RI.mjs.map → AutomationPanel-V3IWQAMO.mjs.map} +0 -0
  134. /package/dist/lib/node-esm/{ChatContainer-QSMDZRDU.mjs.map → ChatContainer-ORVWQPJO.mjs.map} +0 -0
  135. /package/dist/lib/node-esm/{ai-client-RUCCJ7JZ.mjs.map → ai-client-XGNA6SJ5.mjs.map} +0 -0
  136. /package/dist/lib/node-esm/{chunk-CZXU4CFK.mjs.map → chunk-6HLBYDUI.mjs.map} +0 -0
  137. /package/dist/lib/node-esm/{chunk-7JO77AAS.mjs.map → chunk-DNCXRGAF.mjs.map} +0 -0
  138. /package/dist/lib/node-esm/{chunk-LSSWQIQD.mjs.map → chunk-IJRTDSKN.mjs.map} +0 -0
  139. /package/dist/lib/node-esm/{intent-resolver-FCKNRTKQ.mjs.map → intent-resolver-DCP4ZDBA.mjs.map} +0 -0
@@ -0,0 +1,518 @@
1
+ import {
2
+ useServices
3
+ } from "./chunk-ITG6CBKL.mjs";
4
+ import {
5
+ ChainInputType,
6
+ ServiceType,
7
+ categoryIcons
8
+ } from "./chunk-Q4IMHYGH.mjs";
9
+ import {
10
+ AUTOMATION_PLUGIN
11
+ } from "./chunk-R4JH4TLE.mjs";
12
+
13
+ // packages/plugins/experimental/plugin-automation/src/components/AmbientChatDialog/AmbientChatDialog.tsx
14
+ import React2, { useState } from "react";
15
+ import { Dialog, Icon, IconButton, useTranslation } from "@dxos/react-ui";
16
+ import { resizeAttributes, ResizeHandle, sizeStyle } from "@dxos/react-ui-dnd";
17
+
18
+ // packages/plugins/experimental/plugin-automation/src/components/Prompt/Prompt.tsx
19
+ import React from "react";
20
+ import { useThemeContext } from "@dxos/react-ui";
21
+ import { createBasicExtensions, createThemeExtensions, useTextEditor } from "@dxos/react-ui-editor";
22
+ import { mx } from "@dxos/react-ui-theme";
23
+
24
+ // packages/plugins/experimental/plugin-automation/src/components/Prompt/prompt-autocomplete.ts
25
+ import { Prec } from "@codemirror/state";
26
+ import { EditorView, Decoration, ViewPlugin, keymap, WidgetType } from "@codemirror/view";
27
+ var InlineSuggestionWidget = class extends WidgetType {
28
+ constructor(suffix) {
29
+ super();
30
+ this.suffix = suffix;
31
+ }
32
+ toDOM() {
33
+ const span = document.createElement("span");
34
+ span.textContent = this.suffix;
35
+ span.className = "cm-inline-suggestion";
36
+ return span;
37
+ }
38
+ eq(other) {
39
+ return other.suffix === this.suffix;
40
+ }
41
+ };
42
+ var createAutocompleteExtension = ({ onEnter, onSuggest }) => {
43
+ const suggestionPlugin = ViewPlugin.fromClass(class {
44
+ constructor(view) {
45
+ this._currentSuggestion = null;
46
+ this._decorations = this.computeDecorations(view);
47
+ }
48
+ update(update) {
49
+ if (update.docChanged || update.selectionSet) {
50
+ this._decorations = this.computeDecorations(update.view);
51
+ }
52
+ }
53
+ computeDecorations(view) {
54
+ const text = view.state.doc.toString();
55
+ const suggestions = onSuggest?.(text) ?? [];
56
+ if (!suggestions.length) {
57
+ this._currentSuggestion = null;
58
+ return Decoration.none;
59
+ }
60
+ this._currentSuggestion = suggestions[0];
61
+ const suffix = this._currentSuggestion.slice(text.length);
62
+ if (!suffix) {
63
+ return Decoration.none;
64
+ }
65
+ return Decoration.set([
66
+ Decoration.widget({
67
+ widget: new InlineSuggestionWidget(suffix),
68
+ side: 1
69
+ }).range(view.state.doc.length)
70
+ ]);
71
+ }
72
+ completeSuggestion(view) {
73
+ if (!this._currentSuggestion) {
74
+ return false;
75
+ }
76
+ const text = view.state.doc.toString();
77
+ const suffix = this._currentSuggestion.slice(text.length);
78
+ if (!suffix) {
79
+ return false;
80
+ }
81
+ view.dispatch({
82
+ changes: {
83
+ from: view.state.doc.length,
84
+ insert: suffix
85
+ },
86
+ selection: {
87
+ anchor: view.state.doc.length + suffix.length
88
+ }
89
+ });
90
+ return true;
91
+ }
92
+ }, {
93
+ decorations: (v) => v._decorations
94
+ });
95
+ return [
96
+ suggestionPlugin,
97
+ EditorView.theme({
98
+ ".cm-inline-suggestion": {
99
+ opacity: 0.4
100
+ }
101
+ }),
102
+ // Accept the current suggestion.
103
+ Prec.highest(keymap.of([
104
+ {
105
+ key: "Tab",
106
+ run: (view) => {
107
+ const plugin = view.plugin(suggestionPlugin);
108
+ return plugin?.completeSuggestion(view) ?? false;
109
+ }
110
+ },
111
+ {
112
+ key: "ArrowRight",
113
+ run: (view) => {
114
+ if (view.state.selection.main.head !== view.state.doc.length) {
115
+ return false;
116
+ }
117
+ const plugin = view.plugin(suggestionPlugin);
118
+ return plugin?.completeSuggestion(view) ?? false;
119
+ }
120
+ },
121
+ {
122
+ key: "Enter",
123
+ preventDefault: true,
124
+ run: (view) => {
125
+ const text = view.state.doc.toString();
126
+ if (onEnter) {
127
+ onEnter(text);
128
+ view.dispatch({
129
+ changes: {
130
+ from: 0,
131
+ to: view.state.doc.length,
132
+ insert: ""
133
+ }
134
+ });
135
+ return true;
136
+ }
137
+ return false;
138
+ }
139
+ },
140
+ {
141
+ key: "Shift-Enter",
142
+ run: (view) => {
143
+ view.dispatch({
144
+ changes: {
145
+ from: view.state.selection.main.head,
146
+ insert: "\n"
147
+ }
148
+ });
149
+ return true;
150
+ }
151
+ },
152
+ {
153
+ key: "Escape",
154
+ run: (view) => {
155
+ view.dispatch({
156
+ changes: {
157
+ from: 0,
158
+ to: view.state.doc.length,
159
+ insert: ""
160
+ }
161
+ });
162
+ return true;
163
+ }
164
+ }
165
+ ]))
166
+ ];
167
+ };
168
+
169
+ // packages/plugins/experimental/plugin-automation/src/components/Prompt/Prompt.tsx
170
+ var Prompt = ({ classNames, autoFocus, lineWrapping = false, onEnter, onSuggest }) => {
171
+ const { themeMode } = useThemeContext();
172
+ const { parentRef } = useTextEditor({
173
+ autoFocus,
174
+ extensions: [
175
+ createBasicExtensions({
176
+ bracketMatching: false,
177
+ lineWrapping,
178
+ placeholder: "Ask a question..."
179
+ }),
180
+ createThemeExtensions({
181
+ themeMode
182
+ }),
183
+ createAutocompleteExtension({
184
+ onEnter,
185
+ onSuggest
186
+ })
187
+ ]
188
+ });
189
+ return /* @__PURE__ */ React.createElement("div", {
190
+ ref: parentRef,
191
+ className: mx(classNames)
192
+ });
193
+ };
194
+
195
+ // packages/plugins/experimental/plugin-automation/src/components/AmbientChatDialog/AmbientChatDialog.tsx
196
+ var preventDefault = (event) => event.preventDefault();
197
+ var AmbientChatDialog = ({ children }) => {
198
+ const { t } = useTranslation(AUTOMATION_PLUGIN);
199
+ const [size, setSize] = useState("min-content");
200
+ const [iter, setIter] = useState(0);
201
+ return /* @__PURE__ */ React2.createElement("div", {
202
+ role: "none",
203
+ className: "dx-dialog__overlay bg-transparent pointer-events-none",
204
+ "data-block-align": "end"
205
+ }, /* @__PURE__ */ React2.createElement(Dialog.Content, {
206
+ onInteractOutside: preventDefault,
207
+ classNames: "pointer-events-auto relative overflow-hidden is-[500px] max-is-none",
208
+ inOverlayLayout: true,
209
+ ...resizeAttributes,
210
+ style: {
211
+ ...sizeStyle(size, "vertical"),
212
+ maxBlockSize: "calc(100dvh - env(safe-area-inset-bottom) - env(safe-area-inset-top) - 8rem)"
213
+ }
214
+ }, /* @__PURE__ */ React2.createElement(ResizeHandle, {
215
+ key: iter,
216
+ side: "block-start",
217
+ defaultSize: "min-content",
218
+ minSize: 5,
219
+ fallbackSize: 5,
220
+ iconPosition: "center",
221
+ onSizeChange: setSize
222
+ }), /* @__PURE__ */ React2.createElement("div", {
223
+ className: "flex w-full items-center"
224
+ }, /* @__PURE__ */ React2.createElement(Dialog.Title, {
225
+ classNames: "sr-only"
226
+ }, t("ambient chat dialog title")), /* @__PURE__ */ React2.createElement(Dialog.Close, null, /* @__PURE__ */ React2.createElement(Icon, {
227
+ icon: "ph--x--regular",
228
+ size: 4
229
+ })), /* @__PURE__ */ React2.createElement("div", {
230
+ className: "grow"
231
+ }), /* @__PURE__ */ React2.createElement(IconButton, {
232
+ variant: "ghost",
233
+ icon: "ph--caret-down--regular",
234
+ iconOnly: true,
235
+ label: "Shrink",
236
+ onClick: () => {
237
+ setIter((iter2) => iter2 + 1);
238
+ setSize("min-content");
239
+ }
240
+ })), /* @__PURE__ */ React2.createElement(Prompt, {
241
+ autoFocus: true,
242
+ lineWrapping: true
243
+ })));
244
+ };
245
+
246
+ // packages/plugins/experimental/plugin-automation/src/components/PromptEditor/PromptEditor.tsx
247
+ import React3, { useEffect } from "react";
248
+ import { createDocAccessor } from "@dxos/react-client/echo";
249
+ import { Input, Select, useThemeContext as useThemeContext2, useTranslation as useTranslation2 } from "@dxos/react-ui";
250
+ import { createBasicExtensions as createBasicExtensions2, createDataExtensions, createThemeExtensions as createThemeExtensions2, useTextEditor as useTextEditor2 } from "@dxos/react-ui-editor";
251
+ import { attentionSurface, groupBorder, mx as mx3 } from "@dxos/react-ui-theme";
252
+ import { isNonNullable } from "@dxos/util";
253
+
254
+ // packages/plugins/experimental/plugin-automation/src/components/PromptEditor/prompt-extension.ts
255
+ import { HighlightStyle, StreamLanguage, syntaxHighlighting } from "@codemirror/language";
256
+ import { tags } from "@dxos/react-ui-editor";
257
+ import { mx as mx2 } from "@dxos/react-ui-theme";
258
+ var nameRegex = /\{([\w-]+)}/;
259
+ var parser = StreamLanguage.define({
260
+ token: (stream) => {
261
+ if (stream.eatSpace()) {
262
+ return null;
263
+ }
264
+ if (stream.match(/^#.*/)) {
265
+ return "lineComment";
266
+ }
267
+ if (stream.match(/^-+$/)) {
268
+ return "lineComment";
269
+ }
270
+ if (stream.match(nameRegex)) {
271
+ return "variableName";
272
+ }
273
+ stream.next();
274
+ return null;
275
+ }
276
+ });
277
+ var highlightStyles = HighlightStyle.define([
278
+ {
279
+ tag: tags.variableName,
280
+ class: mx2("rounded border border-yellow-500 bg-yellow-100 text-black font-mono text-sm")
281
+ }
282
+ ]);
283
+ var promptExtension = [
284
+ parser,
285
+ syntaxHighlighting(highlightStyles)
286
+ ];
287
+
288
+ // packages/plugins/experimental/plugin-automation/src/components/PromptEditor/PromptEditor.tsx
289
+ var inputTypes = [
290
+ {
291
+ value: ChainInputType.VALUE,
292
+ label: "Value"
293
+ },
294
+ {
295
+ value: ChainInputType.PASS_THROUGH,
296
+ label: "Pass through"
297
+ },
298
+ {
299
+ value: ChainInputType.RETRIEVER,
300
+ label: "Retriever"
301
+ },
302
+ // {
303
+ // value: ChainInputType.FUNCTION,
304
+ // label: 'Function',
305
+ // },
306
+ // {
307
+ // value: ChainInputType.QUERY,
308
+ // label: 'Query',
309
+ // },
310
+ {
311
+ value: ChainInputType.RESOLVER,
312
+ label: "Resolver"
313
+ },
314
+ {
315
+ value: ChainInputType.CONTEXT,
316
+ label: "Context"
317
+ },
318
+ {
319
+ value: ChainInputType.SCHEMA,
320
+ label: "Schema"
321
+ }
322
+ ];
323
+ var getInputType = (type) => inputTypes.find(({ value }) => String(value) === type)?.value;
324
+ var usePromptInputs = (prompt) => {
325
+ useEffect(() => {
326
+ const text = prompt.template ?? "";
327
+ if (!prompt.inputs) {
328
+ prompt.inputs = [];
329
+ }
330
+ const regex = new RegExp(nameRegex, "g");
331
+ const variables = new Set([
332
+ ...text.matchAll(regex)
333
+ ].map((m) => m[1]));
334
+ const unclaimed = new Map(prompt.inputs?.filter(isNonNullable).map((input) => [
335
+ input.name,
336
+ input
337
+ ]));
338
+ const missing = [];
339
+ Array.from(variables.values()).forEach((name) => {
340
+ if (unclaimed.has(name)) {
341
+ unclaimed.delete(name);
342
+ } else {
343
+ missing.push(name);
344
+ }
345
+ });
346
+ const values = unclaimed.values();
347
+ missing.forEach((name) => {
348
+ const next = values.next().value;
349
+ if (next) {
350
+ next.name = name;
351
+ } else {
352
+ prompt.inputs?.push({
353
+ name
354
+ });
355
+ }
356
+ });
357
+ for (const input of values) {
358
+ prompt.inputs.splice(prompt.inputs.indexOf(input), 1);
359
+ }
360
+ }, [
361
+ prompt.template
362
+ ]);
363
+ };
364
+ var PromptEditor = ({ prompt, commandEditable = true }) => {
365
+ const { t } = useTranslation2(AUTOMATION_PLUGIN);
366
+ const { themeMode } = useThemeContext2();
367
+ const { parentRef } = useTextEditor2(() => ({
368
+ initialValue: prompt.template,
369
+ extensions: [
370
+ createDataExtensions({
371
+ id: prompt.id,
372
+ text: prompt.template !== void 0 ? createDocAccessor(prompt, [
373
+ "template"
374
+ ]) : void 0
375
+ }),
376
+ createBasicExtensions2({
377
+ bracketMatching: false,
378
+ lineWrapping: true,
379
+ placeholder: t("template placeholder")
380
+ }),
381
+ createThemeExtensions2({
382
+ themeMode,
383
+ slots: {
384
+ content: {
385
+ className: "!p-3"
386
+ }
387
+ }
388
+ }),
389
+ promptExtension
390
+ ]
391
+ }), [
392
+ themeMode,
393
+ prompt
394
+ ]);
395
+ usePromptInputs(prompt);
396
+ return /* @__PURE__ */ React3.createElement("div", {
397
+ className: mx3("flex flex-col w-full overflow-hidden gap-4", groupBorder)
398
+ }, commandEditable && /* @__PURE__ */ React3.createElement("div", {
399
+ className: "flex items-center pl-4"
400
+ }, /* @__PURE__ */ React3.createElement("span", {
401
+ className: "text-neutral-500"
402
+ }, "/"), /* @__PURE__ */ React3.createElement(Input.Root, null, /* @__PURE__ */ React3.createElement(Input.TextInput, {
403
+ placeholder: t("command placeholder"),
404
+ classNames: mx3("is-full bg-transparent m-2"),
405
+ value: prompt.command ?? "",
406
+ onChange: (event) => {
407
+ prompt.command = event.target.value.replace(/\w/g, "");
408
+ }
409
+ }))), /* @__PURE__ */ React3.createElement("div", {
410
+ ref: parentRef,
411
+ className: mx3(attentionSurface, "rounded", "min-h-[120px]")
412
+ }), (prompt.inputs?.length ?? 0) > 0 && /* @__PURE__ */ React3.createElement("div", {
413
+ className: "flex flex-col"
414
+ }, /* @__PURE__ */ React3.createElement("table", {
415
+ className: "w-full table-fixed border-collapse my-2"
416
+ }, /* @__PURE__ */ React3.createElement("tbody", null, prompt.inputs?.filter(isNonNullable).map((input) => /* @__PURE__ */ React3.createElement("tr", {
417
+ key: input.name
418
+ }, /* @__PURE__ */ React3.createElement("td", {
419
+ className: "w-[160px] p-1 font-mono text-sm whitespace-nowrap truncate"
420
+ }, /* @__PURE__ */ React3.createElement("code", {
421
+ className: "px-2"
422
+ }, input.name)), /* @__PURE__ */ React3.createElement("td", {
423
+ className: "w-[120px] p-1"
424
+ }, /* @__PURE__ */ React3.createElement(Input.Root, null, /* @__PURE__ */ React3.createElement(Select.Root, {
425
+ value: String(input.type),
426
+ onValueChange: (type) => {
427
+ input.type = getInputType(type) ?? ChainInputType.VALUE;
428
+ }
429
+ }, /* @__PURE__ */ React3.createElement(Select.TriggerButton, {
430
+ placeholder: "Type",
431
+ classNames: "is-full"
432
+ }), /* @__PURE__ */ React3.createElement(Select.Portal, null, /* @__PURE__ */ React3.createElement(Select.Content, null, /* @__PURE__ */ React3.createElement(Select.Viewport, null, inputTypes.map(({ value, label }) => /* @__PURE__ */ React3.createElement(Select.Option, {
433
+ key: value,
434
+ value: String(value)
435
+ }, label)))))))), /* @__PURE__ */ React3.createElement("td", {
436
+ className: "p-1 pr-2"
437
+ }, input.type !== void 0 && [
438
+ ChainInputType.VALUE,
439
+ ChainInputType.CONTEXT,
440
+ ChainInputType.RESOLVER,
441
+ ChainInputType.SCHEMA
442
+ ].includes(input.type) && /* @__PURE__ */ React3.createElement("div", null, /* @__PURE__ */ React3.createElement(Input.Root, null, /* @__PURE__ */ React3.createElement(Input.TextInput, {
443
+ placeholder: t("command placeholder"),
444
+ classNames: mx3("is-full bg-transparent"),
445
+ value: input.value ?? "",
446
+ onChange: (event) => {
447
+ input.value = event.target.value;
448
+ }
449
+ }))))))))));
450
+ };
451
+
452
+ // packages/plugins/experimental/plugin-automation/src/components/ServiceRegistry/ServiceRegistry.tsx
453
+ import React4, { useMemo } from "react";
454
+ import { Filter } from "@dxos/client/echo";
455
+ import { useQuery } from "@dxos/react-client/echo";
456
+ import { Icon as Icon2, Input as Input2, List, ListItem } from "@dxos/react-ui";
457
+ var ServiceRegistry = ({ space }) => {
458
+ const matchingServices = useServices(space);
459
+ const enabledServices = useQuery(space, Filter.schema(ServiceType));
460
+ const services = useMemo(() => {
461
+ return matchingServices.map((service) => enabledServices.find((s) => s.serviceId === service.serviceId) ?? service);
462
+ }, [
463
+ matchingServices,
464
+ enabledServices
465
+ ]);
466
+ const handleSetEnabled = (service, enabled) => {
467
+ if (enabled) {
468
+ space.db.add(service);
469
+ } else {
470
+ space.db.remove(service);
471
+ }
472
+ };
473
+ return /* @__PURE__ */ React4.createElement(List, {
474
+ classNames: "h-full grid auto-rows-[5rem] gap-2 p-2 pis-2 pie-2 overflow-y-auto scrollbar-thin"
475
+ }, services.map((service) => /* @__PURE__ */ React4.createElement(ServiceItem, {
476
+ key: service.serviceId,
477
+ service,
478
+ enabled: service.enabled,
479
+ setEnabled: (enabled) => handleSetEnabled(service, enabled)
480
+ })));
481
+ };
482
+ var ServiceItem = ({ service, enabled, setEnabled }) => {
483
+ return /* @__PURE__ */ React4.createElement(ListItem.Root, {
484
+ classNames: "flex flex-col gap-1 p-1 overflow-hidden rounded-md border border-separator"
485
+ }, /* @__PURE__ */ React4.createElement("div", {
486
+ className: "grid grid-cols-[40px_1fr_40px]"
487
+ }, /* @__PURE__ */ React4.createElement("div", {
488
+ className: "flex gow justify-center items-center"
489
+ }, /* @__PURE__ */ React4.createElement(Icon2, {
490
+ icon: categoryIcons[service.category ?? "default"] ?? "ph--placeholder--regular",
491
+ size: 6
492
+ })), /* @__PURE__ */ React4.createElement("div", {
493
+ className: "grow items-center truncate mie-2"
494
+ }, service.name), /* @__PURE__ */ React4.createElement("div", {
495
+ className: "flex gow justify-center items-center"
496
+ }, /* @__PURE__ */ React4.createElement(Input2.Root, null, /* @__PURE__ */ React4.createElement(Input2.Switch, {
497
+ checked: enabled,
498
+ onClick: () => setEnabled?.(!enabled)
499
+ })))), /* @__PURE__ */ React4.createElement("div", {
500
+ className: "grid grid-cols-[40px_1fr]"
501
+ }, /* @__PURE__ */ React4.createElement("div", null), /* @__PURE__ */ React4.createElement("div", {
502
+ className: "text-sm text-subdued line-clamp-2 mie-1"
503
+ }, service.description)));
504
+ };
505
+
506
+ // packages/plugins/experimental/plugin-automation/src/components/index.ts
507
+ import { lazy } from "react";
508
+ var AutomationPanel = lazy(() => import("./AutomationPanel-VW2XIUPU.mjs"));
509
+ var ChatContainer = lazy(() => import("./ChatContainer-OLRZNGWK.mjs"));
510
+
511
+ export {
512
+ AmbientChatDialog,
513
+ PromptEditor,
514
+ ServiceRegistry,
515
+ AutomationPanel,
516
+ ChatContainer
517
+ };
518
+ //# sourceMappingURL=chunk-MRBC5J4T.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/AmbientChatDialog/AmbientChatDialog.tsx", "../../../src/components/Prompt/Prompt.tsx", "../../../src/components/Prompt/prompt-autocomplete.ts", "../../../src/components/PromptEditor/PromptEditor.tsx", "../../../src/components/PromptEditor/prompt-extension.ts", "../../../src/components/ServiceRegistry/ServiceRegistry.tsx", "../../../src/components/index.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type PropsWithChildren, useState } from 'react';\n\nimport { Dialog, Icon, IconButton, useTranslation } from '@dxos/react-ui';\nimport { resizeAttributes, ResizeHandle, type Size, sizeStyle } from '@dxos/react-ui-dnd';\n\nimport { AUTOMATION_PLUGIN } from '../../meta';\nimport { Prompt } from '../Prompt';\n\nconst preventDefault = (event: Event) => event.preventDefault();\n\nexport const AmbientChatDialog = ({ children }: PropsWithChildren) => {\n const { t } = useTranslation(AUTOMATION_PLUGIN);\n const [size, setSize] = useState<Size>('min-content');\n const [iter, setIter] = useState(0);\n return (\n <div role='none' className='dx-dialog__overlay bg-transparent pointer-events-none' data-block-align='end'>\n <Dialog.Content\n onInteractOutside={preventDefault}\n classNames='pointer-events-auto relative overflow-hidden is-[500px] max-is-none'\n inOverlayLayout\n {...resizeAttributes}\n style={{\n ...sizeStyle(size, 'vertical'),\n maxBlockSize: 'calc(100dvh - env(safe-area-inset-bottom) - env(safe-area-inset-top) - 8rem)',\n }}\n >\n <ResizeHandle\n key={iter}\n side='block-start'\n defaultSize='min-content'\n minSize={5}\n fallbackSize={5}\n iconPosition='center'\n onSizeChange={setSize}\n />\n\n <div className='flex w-full items-center'>\n <Dialog.Title classNames='sr-only'>{t('ambient chat dialog title')}</Dialog.Title>\n <Dialog.Close>\n <Icon icon='ph--x--regular' size={4} />\n </Dialog.Close>\n <div className='grow' />\n <IconButton\n variant='ghost'\n icon='ph--caret-down--regular'\n iconOnly\n label='Shrink'\n onClick={() => {\n setIter((iter) => iter + 1);\n setSize('min-content');\n }}\n />\n </div>\n\n <Prompt autoFocus lineWrapping />\n </Dialog.Content>\n </div>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type ThemedClassName, useThemeContext } from '@dxos/react-ui';\nimport {\n type BasicExtensionsOptions,\n createBasicExtensions,\n createThemeExtensions,\n useTextEditor,\n type UseTextEditorProps,\n} from '@dxos/react-ui-editor';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { createAutocompleteExtension, type AutocompleteOptions } from './prompt-autocomplete';\n\nexport type PromptProps = ThemedClassName<\n AutocompleteOptions & Pick<UseTextEditorProps, 'autoFocus'> & Pick<BasicExtensionsOptions, 'lineWrapping'>\n>;\n\nexport const Prompt = ({ classNames, autoFocus, lineWrapping = false, onEnter, onSuggest }: PromptProps) => {\n const { themeMode } = useThemeContext();\n const { parentRef } = useTextEditor({\n autoFocus,\n extensions: [\n createBasicExtensions({\n bracketMatching: false,\n lineWrapping,\n placeholder: 'Ask a question...',\n }),\n createThemeExtensions({ themeMode }),\n createAutocompleteExtension({ onEnter, onSuggest }),\n ],\n });\n\n return <div ref={parentRef} className={mx(classNames)} />;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Prec, type Extension } from '@codemirror/state';\nimport {\n EditorView,\n Decoration,\n ViewPlugin,\n keymap,\n type DecorationSet,\n type ViewUpdate,\n WidgetType,\n} from '@codemirror/view';\n\nexport type AutocompleteOptions = {\n /**\n * Callback triggered when Enter is pressed.\n * @param text The current text in the editor\n */\n onEnter?: (text: string) => void;\n\n /**\n * Function that returns a list of suggestions based on the current text.\n * @param text The current text before the cursor\n * @returns Array of suggestion strings\n */\n onSuggest?: (text: string) => string[];\n};\n\nclass InlineSuggestionWidget extends WidgetType {\n constructor(private suffix: string) {\n super();\n }\n\n override toDOM() {\n const span = document.createElement('span');\n span.textContent = this.suffix;\n span.className = 'cm-inline-suggestion';\n return span;\n }\n\n override eq(other: InlineSuggestionWidget) {\n return other.suffix === this.suffix;\n }\n}\n\n/**\n * Creates an autocomplete extension that shows inline suggestions.\n * Pressing Tab will complete the suggestion.\n */\nexport const createAutocompleteExtension = ({ onEnter, onSuggest }: AutocompleteOptions): Extension => {\n const suggestionPlugin = ViewPlugin.fromClass(\n class {\n _decorations: DecorationSet;\n _currentSuggestion: string | null = null;\n\n constructor(view: EditorView) {\n this._decorations = this.computeDecorations(view);\n }\n\n update(update: ViewUpdate) {\n if (update.docChanged || update.selectionSet) {\n this._decorations = this.computeDecorations(update.view);\n }\n }\n\n private computeDecorations(view: EditorView): DecorationSet {\n const text = view.state.doc.toString();\n const suggestions = onSuggest?.(text) ?? [];\n if (!suggestions.length) {\n this._currentSuggestion = null;\n return Decoration.none;\n }\n\n // Get the first suggestion.\n this._currentSuggestion = suggestions[0];\n const suffix = this._currentSuggestion.slice(text.length);\n if (!suffix) {\n return Decoration.none;\n }\n\n // Always show ghost text at the end of the document.\n return Decoration.set([\n Decoration.widget({\n widget: new InlineSuggestionWidget(suffix),\n side: 1,\n }).range(view.state.doc.length),\n ]);\n }\n\n completeSuggestion(view: EditorView): boolean {\n if (!this._currentSuggestion) {\n return false;\n }\n\n const text = view.state.doc.toString();\n const suffix = this._currentSuggestion.slice(text.length);\n if (!suffix) {\n return false;\n }\n\n view.dispatch({\n changes: {\n from: view.state.doc.length,\n insert: suffix,\n },\n selection: {\n anchor: view.state.doc.length + suffix.length,\n },\n });\n\n return true;\n }\n },\n {\n decorations: (v) => v._decorations,\n },\n );\n\n return [\n suggestionPlugin,\n EditorView.theme({\n '.cm-inline-suggestion': {\n opacity: 0.4,\n },\n }),\n\n // Accept the current suggestion.\n Prec.highest(\n keymap.of([\n {\n key: 'Tab',\n run: (view) => {\n const plugin = view.plugin(suggestionPlugin);\n return plugin?.completeSuggestion(view) ?? false;\n },\n },\n {\n key: 'ArrowRight',\n run: (view) => {\n // Only complete if cursor is at the end\n if (view.state.selection.main.head !== view.state.doc.length) {\n return false;\n }\n\n const plugin = view.plugin(suggestionPlugin);\n return plugin?.completeSuggestion(view) ?? false;\n },\n },\n {\n key: 'Enter',\n preventDefault: true,\n run: (view) => {\n const text = view.state.doc.toString();\n if (onEnter) {\n onEnter(text);\n // Clear the document after calling onEnter\n view.dispatch({\n changes: {\n from: 0,\n to: view.state.doc.length,\n insert: '',\n },\n });\n return true;\n }\n return false;\n },\n },\n {\n key: 'Shift-Enter',\n run: (view) => {\n view.dispatch({\n changes: {\n from: view.state.selection.main.head,\n insert: '\\n',\n },\n });\n return true;\n },\n },\n {\n key: 'Escape',\n run: (view) => {\n // Clear the entire document.\n view.dispatch({\n changes: {\n from: 0,\n to: view.state.doc.length,\n insert: '',\n },\n });\n return true;\n },\n },\n ]),\n ),\n ];\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Schema as S } from '@effect/schema';\nimport React, { useEffect } from 'react';\n\nimport { createDocAccessor } from '@dxos/react-client/echo';\nimport { Input, Select, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport {\n createBasicExtensions,\n createDataExtensions,\n createThemeExtensions,\n useTextEditor,\n} from '@dxos/react-ui-editor';\nimport { attentionSurface, groupBorder, mx } from '@dxos/react-ui-theme';\nimport { isNonNullable } from '@dxos/util';\n\nimport { nameRegex, promptExtension } from './prompt-extension';\nimport { AUTOMATION_PLUGIN } from '../../meta';\nimport { type ChainInput, ChainInputType, type ChainPromptType } from '../../types';\n\nconst inputTypes = [\n {\n value: ChainInputType.VALUE,\n label: 'Value',\n },\n {\n value: ChainInputType.PASS_THROUGH,\n label: 'Pass through',\n },\n {\n value: ChainInputType.RETRIEVER,\n label: 'Retriever',\n },\n // {\n // value: ChainInputType.FUNCTION,\n // label: 'Function',\n // },\n // {\n // value: ChainInputType.QUERY,\n // label: 'Query',\n // },\n {\n value: ChainInputType.RESOLVER,\n label: 'Resolver',\n },\n {\n value: ChainInputType.CONTEXT,\n label: 'Context',\n },\n {\n value: ChainInputType.SCHEMA,\n label: 'Schema',\n },\n];\n\nconst getInputType = (type: string) => inputTypes.find(({ value }) => String(value) === type)?.value;\n\nconst usePromptInputs = (prompt: ChainPromptType) => {\n useEffect(() => {\n const text = prompt.template ?? '';\n if (!prompt.inputs) {\n prompt.inputs = []; // TODO(burdon): Required?\n }\n\n const regex = new RegExp(nameRegex, 'g');\n const variables = new Set<string>([...text.matchAll(regex)].map((m) => m[1]));\n\n // Create map of unclaimed inputs.\n const unclaimed = new Map<string, ChainInput>(\n prompt.inputs?.filter(isNonNullable).map((input) => [input.name, input]),\n );\n const missing: string[] = [];\n Array.from(variables.values()).forEach((name) => {\n if (unclaimed.has(name)) {\n unclaimed.delete(name);\n } else {\n missing.push(name);\n }\n });\n\n // Match or create new inputs.\n const values = unclaimed.values();\n missing.forEach((name) => {\n const next = values.next().value;\n if (next) {\n next.name = name;\n } else {\n prompt.inputs?.push({ name });\n }\n });\n\n // Remove unclaimed (deleted) inputs.\n // TODO(burdon): If user types incorrect name value, it will be deleted. Garbage collect?\n for (const input of values) {\n prompt.inputs.splice(prompt.inputs.indexOf(input), 1);\n }\n }, [prompt.template]);\n};\n\nexport type PromptEditorProps = {\n prompt: ChainPromptType;\n commandEditable?: boolean;\n schema?: S.Schema<any, any, any>;\n};\n\nexport const PromptEditor = ({ prompt, commandEditable = true }: PromptEditorProps) => {\n const { t } = useTranslation(AUTOMATION_PLUGIN);\n const { themeMode } = useThemeContext();\n\n const { parentRef } = useTextEditor(\n () => ({\n initialValue: prompt.template,\n extensions: [\n createDataExtensions({\n id: prompt.id,\n text: prompt.template !== undefined ? createDocAccessor(prompt, ['template']) : undefined,\n }),\n createBasicExtensions({\n bracketMatching: false,\n lineWrapping: true,\n placeholder: t('template placeholder'),\n }),\n createThemeExtensions({\n themeMode,\n slots: {\n content: { className: '!p-3' },\n },\n }),\n promptExtension,\n ],\n }),\n [themeMode, prompt],\n );\n\n usePromptInputs(prompt);\n\n return (\n <div className={mx('flex flex-col w-full overflow-hidden gap-4', groupBorder)}>\n {commandEditable && (\n <div className='flex items-center pl-4'>\n <span className='text-neutral-500'>/</span>\n <Input.Root>\n <Input.TextInput\n placeholder={t('command placeholder')}\n classNames={mx('is-full bg-transparent m-2')}\n value={prompt.command ?? ''}\n onChange={(event) => {\n prompt.command = event.target.value.replace(/\\w/g, '');\n }}\n />\n </Input.Root>\n </div>\n )}\n\n <div ref={parentRef} className={mx(attentionSurface, 'rounded', 'min-h-[120px]')} />\n\n {(prompt.inputs?.length ?? 0) > 0 && (\n <div className='flex flex-col'>\n {/* TODO(zan): Improve layout with grid */}\n <table className='w-full table-fixed border-collapse my-2'>\n <tbody>\n {prompt.inputs?.filter(isNonNullable).map((input) => (\n <tr key={input.name}>\n <td className='w-[160px] p-1 font-mono text-sm whitespace-nowrap truncate'>\n <code className='px-2'>{input.name}</code>\n </td>\n <td className='w-[120px] p-1'>\n <Input.Root>\n <Select.Root\n value={String(input.type)}\n onValueChange={(type) => {\n input.type = getInputType(type) ?? ChainInputType.VALUE;\n }}\n >\n <Select.TriggerButton placeholder='Type' classNames='is-full' />\n <Select.Portal>\n <Select.Content>\n <Select.Viewport>\n {inputTypes.map(({ value, label }) => (\n <Select.Option key={value} value={String(value)}>\n {label}\n </Select.Option>\n ))}\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n </Input.Root>\n </td>\n <td className='p-1 pr-2'>\n {input.type !== undefined &&\n [\n ChainInputType.VALUE,\n ChainInputType.CONTEXT,\n ChainInputType.RESOLVER,\n ChainInputType.SCHEMA,\n ].includes(input.type) && (\n <div>\n <Input.Root>\n <Input.TextInput\n placeholder={t('command placeholder')}\n classNames={mx('is-full bg-transparent')}\n value={input.value ?? ''}\n onChange={(event) => {\n input.value = event.target.value;\n }}\n />\n </Input.Root>\n </div>\n )}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </div>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { HighlightStyle, StreamLanguage, syntaxHighlighting } from '@codemirror/language';\nimport { type Extension } from '@codemirror/state';\n\nimport { tags } from '@dxos/react-ui-editor';\nimport { mx } from '@dxos/react-ui-theme';\n\nexport const nameRegex = /\\{([\\w-]+)}/;\n\nconst parser = StreamLanguage.define({\n token: (stream) => {\n if (stream.eatSpace()) {\n return null;\n }\n if (stream.match(/^#.*/)) {\n return 'lineComment';\n }\n if (stream.match(/^-+$/)) {\n return 'lineComment';\n }\n if (stream.match(nameRegex)) {\n return 'variableName';\n }\n stream.next();\n return null;\n },\n});\n\n/**\n * https://codemirror.net/examples/styling\n * https://lezer.codemirror.net/docs/ref/#highlight\n */\nconst highlightStyles = HighlightStyle.define([\n {\n tag: tags.variableName,\n class: mx('rounded border border-yellow-500 bg-yellow-100 text-black font-mono text-sm'),\n },\n]);\n\nexport const promptExtension: Extension = [parser, syntaxHighlighting(highlightStyles)];\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useMemo } from 'react';\n\nimport { Filter, type Space } from '@dxos/client/echo';\nimport { useQuery } from '@dxos/react-client/echo';\nimport { Icon, Input, List, ListItem } from '@dxos/react-ui';\n\nimport { useServices } from '../../hooks';\nimport { categoryIcons, ServiceType } from '../../types';\n\n// TODO(burdon): Option to show all/enabled/filter.\nexport const ServiceRegistry = ({ space }: { space: Space }) => {\n const matchingServices = useServices(space);\n const enabledServices = useQuery(space, Filter.schema(ServiceType));\n\n // Join matching services with enabled services.\n const services = useMemo(() => {\n return matchingServices.map((service) => enabledServices.find((s) => s.serviceId === service.serviceId) ?? service);\n }, [matchingServices, enabledServices]);\n\n // TODO(burdon): Reaplce with SpacePlugin intent.\n const handleSetEnabled = (service: ServiceType, enabled: boolean) => {\n if (enabled) {\n space.db.add(service);\n } else {\n // TODO(burdon): Remove or disable?\n space.db.remove(service);\n }\n };\n\n return (\n <List classNames='h-full grid auto-rows-[5rem] gap-2 p-2 pis-2 pie-2 overflow-y-auto scrollbar-thin'>\n {services.map((service) => (\n <ServiceItem\n key={service.serviceId}\n service={service}\n enabled={service.enabled}\n setEnabled={(enabled) => handleSetEnabled(service, enabled)}\n />\n ))}\n </List>\n );\n};\n\nconst ServiceItem = ({\n service,\n enabled,\n setEnabled,\n}: {\n service: ServiceType;\n enabled?: boolean;\n setEnabled?: (enabled: boolean) => void;\n}) => {\n return (\n <ListItem.Root classNames='flex flex-col gap-1 p-1 overflow-hidden rounded-md border border-separator'>\n <div className='grid grid-cols-[40px_1fr_40px]'>\n <div className='flex gow justify-center items-center'>\n <Icon icon={categoryIcons[service.category ?? 'default'] ?? 'ph--placeholder--regular'} size={6} />\n </div>\n <div className='grow items-center truncate mie-2'>{service.name}</div>\n <div className='flex gow justify-center items-center'>\n <Input.Root>\n <Input.Switch checked={enabled} onClick={() => setEnabled?.(!enabled)} />\n </Input.Root>\n </div>\n </div>\n <div className='grid grid-cols-[40px_1fr]'>\n <div />\n <div className='text-sm text-subdued line-clamp-2 mie-1'>{service.description}</div>\n </div>\n </ListItem.Root>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { lazy } from 'react';\n\nexport * from './AmbientChatDialog';\nexport * from './AutomationPanel';\nexport * from './ChatContainer';\nexport * from './MarkdownViewer';\nexport * from './PromptEditor';\nexport * from './ServiceRegistry';\nexport * from './Thread';\nexport * from './TriggerEditor';\n\nexport const AutomationPanel = lazy(() => import('./AutomationPanel'));\nexport const ChatContainer = lazy(() => import('./ChatContainer'));\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "useState", "Dialog", "Icon", "IconButton", "useTranslation", "resizeAttributes", "ResizeHandle", "sizeStyle", "React", "useThemeContext", "createBasicExtensions", "createThemeExtensions", "useTextEditor", "mx", "Prec", "EditorView", "Decoration", "ViewPlugin", "keymap", "WidgetType", "InlineSuggestionWidget", "WidgetType", "constructor", "suffix", "toDOM", "span", "document", "createElement", "textContent", "className", "eq", "other", "createAutocompleteExtension", "onEnter", "onSuggest", "suggestionPlugin", "ViewPlugin", "fromClass", "view", "_currentSuggestion", "_decorations", "computeDecorations", "update", "docChanged", "selectionSet", "text", "state", "doc", "toString", "suggestions", "length", "Decoration", "none", "slice", "set", "widget", "side", "range", "completeSuggestion", "dispatch", "changes", "from", "insert", "selection", "anchor", "decorations", "v", "EditorView", "theme", "opacity", "Prec", "highest", "keymap", "of", "key", "run", "plugin", "main", "head", "preventDefault", "to", "Prompt", "classNames", "autoFocus", "lineWrapping", "onEnter", "onSuggest", "themeMode", "useThemeContext", "parentRef", "useTextEditor", "extensions", "createBasicExtensions", "bracketMatching", "placeholder", "createThemeExtensions", "createAutocompleteExtension", "div", "ref", "className", "mx", "preventDefault", "event", "AmbientChatDialog", "children", "t", "useTranslation", "AUTOMATION_PLUGIN", "size", "setSize", "useState", "iter", "setIter", "React", "div", "role", "className", "data-block-align", "Dialog", "Content", "onInteractOutside", "classNames", "inOverlayLayout", "resizeAttributes", "style", "sizeStyle", "maxBlockSize", "ResizeHandle", "key", "side", "defaultSize", "minSize", "fallbackSize", "iconPosition", "onSizeChange", "Title", "Close", "Icon", "icon", "IconButton", "variant", "iconOnly", "label", "onClick", "Prompt", "autoFocus", "lineWrapping", "React", "useEffect", "createDocAccessor", "Input", "Select", "useThemeContext", "useTranslation", "createBasicExtensions", "createDataExtensions", "createThemeExtensions", "useTextEditor", "attentionSurface", "groupBorder", "mx", "isNonNullable", "HighlightStyle", "StreamLanguage", "syntaxHighlighting", "tags", "mx", "nameRegex", "parser", "StreamLanguage", "define", "token", "stream", "eatSpace", "match", "next", "highlightStyles", "HighlightStyle", "tag", "tags", "variableName", "class", "mx", "promptExtension", "syntaxHighlighting", "inputTypes", "value", "ChainInputType", "VALUE", "label", "PASS_THROUGH", "RETRIEVER", "RESOLVER", "CONTEXT", "SCHEMA", "getInputType", "type", "find", "String", "usePromptInputs", "prompt", "useEffect", "text", "template", "inputs", "regex", "RegExp", "nameRegex", "variables", "Set", "matchAll", "map", "m", "unclaimed", "Map", "filter", "isNonNullable", "input", "name", "missing", "Array", "from", "values", "forEach", "has", "delete", "push", "next", "splice", "indexOf", "PromptEditor", "commandEditable", "t", "useTranslation", "AUTOMATION_PLUGIN", "themeMode", "useThemeContext", "parentRef", "useTextEditor", "initialValue", "extensions", "createDataExtensions", "id", "undefined", "createDocAccessor", "createBasicExtensions", "bracketMatching", "lineWrapping", "placeholder", "createThemeExtensions", "slots", "content", "className", "promptExtension", "React", "div", "mx", "groupBorder", "span", "Input", "Root", "TextInput", "classNames", "command", "onChange", "event", "target", "replace", "ref", "attentionSurface", "length", "table", "tbody", "tr", "key", "td", "code", "Select", "onValueChange", "TriggerButton", "Portal", "Content", "Viewport", "Option", "includes", "React", "useMemo", "Filter", "useQuery", "Icon", "Input", "List", "ListItem", "ServiceRegistry", "space", "matchingServices", "useServices", "enabledServices", "useQuery", "Filter", "schema", "ServiceType", "services", "useMemo", "map", "service", "find", "s", "serviceId", "handleSetEnabled", "enabled", "db", "add", "remove", "React", "List", "classNames", "ServiceItem", "key", "setEnabled", "ListItem", "Root", "div", "className", "Icon", "icon", "categoryIcons", "category", "size", "name", "Input", "Switch", "checked", "onClick", "description", "lazy", "AutomationPanel", "lazy", "ChatContainer"]
7
+ }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  AUTOMATION_PLUGIN
3
- } from "./chunk-DQ7ZSYJJ.mjs";
3
+ } from "./chunk-R4JH4TLE.mjs";
4
4
 
5
5
  // packages/plugins/experimental/plugin-automation/src/components/AutomationPanel/AutomationPanel.tsx
6
6
  import React2, { useState as useState2 } from "react";
@@ -240,4 +240,4 @@ export {
240
240
  TriggerEditor,
241
241
  AutomationPanel_default
242
242
  };
243
- //# sourceMappingURL=chunk-6KJRL5KV.mjs.map
243
+ //# sourceMappingURL=chunk-NQFZ6XRX.mjs.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  AUTOMATION_PLUGIN
3
- } from "./chunk-DQ7ZSYJJ.mjs";
3
+ } from "./chunk-R4JH4TLE.mjs";
4
4
 
5
5
  // packages/plugins/experimental/plugin-automation/src/types/registry.ts
6
6
  var categoryIcons = {
@@ -147,4 +147,4 @@ export {
147
147
  ServiceType,
148
148
  AutomationAction
149
149
  };
150
- //# sourceMappingURL=chunk-43WRHV2L.mjs.map
150
+ //# sourceMappingURL=chunk-Q4IMHYGH.mjs.map
@@ -1,5 +1,6 @@
1
1
  // packages/plugins/experimental/plugin-automation/src/meta.ts
2
2
  var AUTOMATION_PLUGIN = "dxos.org/plugin/automation";
3
+ var AMBIENT_CHAT_DIALOG = `${AUTOMATION_PLUGIN}/ambient-chat/dialog`;
3
4
  var meta = {
4
5
  id: AUTOMATION_PLUGIN,
5
6
  name: "Automation",
@@ -13,6 +14,7 @@ var meta = {
13
14
 
14
15
  export {
15
16
  AUTOMATION_PLUGIN,
17
+ AMBIENT_CHAT_DIALOG,
16
18
  meta
17
19
  };
18
- //# sourceMappingURL=chunk-DQ7ZSYJJ.mjs.map
20
+ //# sourceMappingURL=chunk-R4JH4TLE.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 AMBIENT_CHAT_DIALOG = `${AUTOMATION_PLUGIN}/ambient-chat/dialog`;\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,sBAAsB,GAAGD,iBAAAA;AAE/B,IAAME,OAAO;EAClBC,IAAIH;EACJI,MAAM;EACNC,aACE;EACFC,MAAM;EACNC,QAAQ;EACRC,MAAM;IAAC;;AACT;",
6
+ "names": ["AUTOMATION_PLUGIN", "AMBIENT_CHAT_DIALOG", "meta", "id", "name", "description", "icon", "source", "tags"]
7
+ }