@sqaitech/visualizer 0.30.10

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 (148) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +9 -0
  3. package/dist/es/component/blackboard/index.css +33 -0
  4. package/dist/es/component/blackboard/index.mjs +278 -0
  5. package/dist/es/component/config-selector/index.mjs +104 -0
  6. package/dist/es/component/context-preview/index.mjs +38 -0
  7. package/dist/es/component/env-config/index.mjs +112 -0
  8. package/dist/es/component/env-config-reminder/index.css +22 -0
  9. package/dist/es/component/env-config-reminder/index.mjs +28 -0
  10. package/dist/es/component/form-field/index.mjs +163 -0
  11. package/dist/es/component/history-selector/index.css +135 -0
  12. package/dist/es/component/history-selector/index.mjs +170 -0
  13. package/dist/es/component/index.mjs +1 -0
  14. package/dist/es/component/logo/index.css +13 -0
  15. package/dist/es/component/logo/index.mjs +20 -0
  16. package/dist/es/component/misc/index.mjs +94 -0
  17. package/dist/es/component/nav-actions/index.mjs +32 -0
  18. package/dist/es/component/nav-actions/style.css +35 -0
  19. package/dist/es/component/player/index.css +185 -0
  20. package/dist/es/component/player/index.mjs +856 -0
  21. package/dist/es/component/playground/index.css +431 -0
  22. package/dist/es/component/playground/index.mjs +8 -0
  23. package/dist/es/component/playground/playground-demo-ui-context.json +290 -0
  24. package/dist/es/component/playground-result/index.css +34 -0
  25. package/dist/es/component/playground-result/index.mjs +62 -0
  26. package/dist/es/component/prompt-input/index.css +391 -0
  27. package/dist/es/component/prompt-input/index.mjs +730 -0
  28. package/dist/es/component/service-mode-control/index.mjs +105 -0
  29. package/dist/es/component/shiny-text/index.css +75 -0
  30. package/dist/es/component/shiny-text/index.mjs +15 -0
  31. package/dist/es/component/universal-playground/index.css +341 -0
  32. package/dist/es/component/universal-playground/index.mjs +302 -0
  33. package/dist/es/component/universal-playground/providers/context-provider.mjs +52 -0
  34. package/dist/es/component/universal-playground/providers/indexeddb-storage-provider.mjs +207 -0
  35. package/dist/es/component/universal-playground/providers/storage-provider.mjs +210 -0
  36. package/dist/es/hooks/usePlaygroundExecution.mjs +180 -0
  37. package/dist/es/hooks/usePlaygroundState.mjs +203 -0
  38. package/dist/es/hooks/useSafeOverrideAIConfig.mjs +24 -0
  39. package/dist/es/hooks/useServerValid.mjs +30 -0
  40. package/dist/es/icons/avatar.mjs +28 -0
  41. package/dist/es/icons/close.mjs +19 -0
  42. package/dist/es/icons/global-perspective.mjs +16 -0
  43. package/dist/es/icons/history.mjs +30 -0
  44. package/dist/es/icons/magnifying-glass.mjs +39 -0
  45. package/dist/es/icons/player-setting.mjs +26 -0
  46. package/dist/es/icons/setting.mjs +20 -0
  47. package/dist/es/icons/show-marker.mjs +16 -0
  48. package/dist/es/index.mjs +25 -0
  49. package/dist/es/store/history.mjs +89 -0
  50. package/dist/es/store/store.mjs +186 -0
  51. package/dist/es/types.mjs +70 -0
  52. package/dist/es/utils/color.mjs +35 -0
  53. package/dist/es/utils/constants.mjs +99 -0
  54. package/dist/es/utils/index.mjs +10 -0
  55. package/dist/es/utils/pixi-loader.mjs +16 -0
  56. package/dist/es/utils/playground-utils.mjs +67 -0
  57. package/dist/es/utils/replay-scripts.mjs +312 -0
  58. package/dist/lib/component/blackboard/index.css +33 -0
  59. package/dist/lib/component/blackboard/index.js +321 -0
  60. package/dist/lib/component/config-selector/index.js +148 -0
  61. package/dist/lib/component/context-preview/index.js +83 -0
  62. package/dist/lib/component/env-config/index.js +146 -0
  63. package/dist/lib/component/env-config-reminder/index.css +22 -0
  64. package/dist/lib/component/env-config-reminder/index.js +62 -0
  65. package/dist/lib/component/form-field/index.js +209 -0
  66. package/dist/lib/component/history-selector/index.css +135 -0
  67. package/dist/lib/component/history-selector/index.js +216 -0
  68. package/dist/lib/component/index.js +60 -0
  69. package/dist/lib/component/logo/index.css +13 -0
  70. package/dist/lib/component/logo/index.js +57 -0
  71. package/dist/lib/component/misc/index.js +150 -0
  72. package/dist/lib/component/nav-actions/index.js +66 -0
  73. package/dist/lib/component/nav-actions/style.css +35 -0
  74. package/dist/lib/component/player/index.css +185 -0
  75. package/dist/lib/component/player/index.js +902 -0
  76. package/dist/lib/component/playground/index.css +431 -0
  77. package/dist/lib/component/playground/index.js +113 -0
  78. package/dist/lib/component/playground/playground-demo-ui-context.json +290 -0
  79. package/dist/lib/component/playground-result/index.css +34 -0
  80. package/dist/lib/component/playground-result/index.js +106 -0
  81. package/dist/lib/component/prompt-input/index.css +391 -0
  82. package/dist/lib/component/prompt-input/index.js +774 -0
  83. package/dist/lib/component/service-mode-control/index.js +139 -0
  84. package/dist/lib/component/shiny-text/index.css +75 -0
  85. package/dist/lib/component/shiny-text/index.js +49 -0
  86. package/dist/lib/component/universal-playground/index.css +341 -0
  87. package/dist/lib/component/universal-playground/index.js +350 -0
  88. package/dist/lib/component/universal-playground/providers/context-provider.js +95 -0
  89. package/dist/lib/component/universal-playground/providers/indexeddb-storage-provider.js +247 -0
  90. package/dist/lib/component/universal-playground/providers/storage-provider.js +268 -0
  91. package/dist/lib/hooks/usePlaygroundExecution.js +214 -0
  92. package/dist/lib/hooks/usePlaygroundState.js +237 -0
  93. package/dist/lib/hooks/useSafeOverrideAIConfig.js +61 -0
  94. package/dist/lib/hooks/useServerValid.js +64 -0
  95. package/dist/lib/icons/avatar.js +62 -0
  96. package/dist/lib/icons/close.js +53 -0
  97. package/dist/lib/icons/global-perspective.js +50 -0
  98. package/dist/lib/icons/history.js +64 -0
  99. package/dist/lib/icons/magnifying-glass.js +73 -0
  100. package/dist/lib/icons/player-setting.js +60 -0
  101. package/dist/lib/icons/setting.js +54 -0
  102. package/dist/lib/icons/show-marker.js +50 -0
  103. package/dist/lib/index.js +187 -0
  104. package/dist/lib/store/history.js +96 -0
  105. package/dist/lib/store/store.js +196 -0
  106. package/dist/lib/types.js +116 -0
  107. package/dist/lib/utils/color.js +75 -0
  108. package/dist/lib/utils/constants.js +154 -0
  109. package/dist/lib/utils/index.js +63 -0
  110. package/dist/lib/utils/pixi-loader.js +56 -0
  111. package/dist/lib/utils/playground-utils.js +110 -0
  112. package/dist/lib/utils/replay-scripts.js +355 -0
  113. package/dist/types/component/blackboard/index.d.ts +15 -0
  114. package/dist/types/component/config-selector/index.d.ts +9 -0
  115. package/dist/types/component/context-preview/index.d.ts +9 -0
  116. package/dist/types/component/env-config/index.d.ts +6 -0
  117. package/dist/types/component/env-config-reminder/index.d.ts +6 -0
  118. package/dist/types/component/form-field/index.d.ts +17 -0
  119. package/dist/types/component/history-selector/index.d.ts +10 -0
  120. package/dist/types/component/index.d.ts +1 -0
  121. package/dist/types/component/logo/index.d.ts +5 -0
  122. package/dist/types/component/misc/index.d.ts +6 -0
  123. package/dist/types/component/nav-actions/index.d.ts +10 -0
  124. package/dist/types/component/player/index.d.ts +13 -0
  125. package/dist/types/component/playground/index.d.ts +7 -0
  126. package/dist/types/component/playground-result/index.d.ts +20 -0
  127. package/dist/types/component/prompt-input/index.d.ts +22 -0
  128. package/dist/types/component/service-mode-control/index.d.ts +6 -0
  129. package/dist/types/component/shiny-text/index.d.ts +12 -0
  130. package/dist/types/component/universal-playground/index.d.ts +4 -0
  131. package/dist/types/component/universal-playground/providers/context-provider.d.ts +37 -0
  132. package/dist/types/component/universal-playground/providers/indexeddb-storage-provider.d.ts +71 -0
  133. package/dist/types/component/universal-playground/providers/storage-provider.d.ts +58 -0
  134. package/dist/types/hooks/usePlaygroundExecution.d.ts +10 -0
  135. package/dist/types/hooks/usePlaygroundState.d.ts +26 -0
  136. package/dist/types/hooks/useSafeOverrideAIConfig.d.ts +16 -0
  137. package/dist/types/hooks/useServerValid.d.ts +1 -0
  138. package/dist/types/index.d.ts +27 -0
  139. package/dist/types/store/history.d.ts +16 -0
  140. package/dist/types/store/store.d.ts +36 -0
  141. package/dist/types/types.d.ts +161 -0
  142. package/dist/types/utils/color.d.ts +4 -0
  143. package/dist/types/utils/constants.d.ts +74 -0
  144. package/dist/types/utils/index.d.ts +4 -0
  145. package/dist/types/utils/pixi-loader.d.ts +5 -0
  146. package/dist/types/utils/playground-utils.d.ts +6 -0
  147. package/dist/types/utils/replay-scripts.d.ts +34 -0
  148. package/package.json +85 -0
@@ -0,0 +1,730 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { BorderOutlined, DownOutlined, SendOutlined } from "@ant-design/icons";
3
+ import "./index.css";
4
+ import { Button, Dropdown, Form, Input, Radio, Tooltip } from "antd";
5
+ import react, { useCallback, useEffect, useMemo, useRef, useState } from "react";
6
+ import { useHistoryStore } from "../../store/history.mjs";
7
+ import { extractDefaultValue, isLocateField, isZodObjectSchema, unwrapZodType } from "../../types.mjs";
8
+ import { apiMetadata, defaultMainButtons } from "../../utils/constants.mjs";
9
+ import { actionNameForType, getPlaceholderForType, isRunButtonEnabled as playground_utils_mjs_isRunButtonEnabled } from "../../utils/playground-utils.mjs";
10
+ import { ConfigSelector } from "../config-selector/index.mjs";
11
+ import { BooleanField, EnumField, LocateField, NumberField, TextField } from "../form-field/index.mjs";
12
+ import { HistorySelector } from "../history-selector/index.mjs";
13
+ const { TextArea } = Input;
14
+ const PromptInput = (param)=>{
15
+ let { runButtonEnabled, form, serviceMode, selectedType, dryMode, stoppable, loading, onRun, onStop, clearPromptAfterRun = true, actionSpace, hideDomAndScreenshotOptions = false } = param;
16
+ const [hoveringSettings, setHoveringSettings] = useState(false);
17
+ const [promptValue, setPromptValue] = useState('');
18
+ const placeholder = getPlaceholderForType(selectedType);
19
+ const textAreaRef = useRef(null);
20
+ const modeRadioGroupRef = useRef(null);
21
+ const params = Form.useWatch('params', form);
22
+ const lastHistoryRef = useRef(null);
23
+ const history = useHistoryStore((state)=>state.history);
24
+ const lastSelectedType = useHistoryStore((state)=>state.lastSelectedType);
25
+ const addHistory = useHistoryStore((state)=>state.addHistory);
26
+ const setLastSelectedType = useHistoryStore((state)=>state.setLastSelectedType);
27
+ const historyForSelectedType = useMemo(()=>history[selectedType] || [], [
28
+ history,
29
+ selectedType
30
+ ]);
31
+ const needsStructuredParams = useMemo(()=>{
32
+ if (actionSpace) {
33
+ const action = actionSpace.find((a)=>a.interfaceAlias === selectedType || a.name === selectedType);
34
+ if (!(null == action ? void 0 : action.paramSchema)) return false;
35
+ if (isZodObjectSchema(action.paramSchema)) {
36
+ const schema = action.paramSchema;
37
+ const shape = schema.shape || {};
38
+ const shapeKeys = Object.keys(shape);
39
+ return shapeKeys.length > 0;
40
+ }
41
+ return true;
42
+ }
43
+ return false;
44
+ }, [
45
+ selectedType,
46
+ actionSpace
47
+ ]);
48
+ const needsAnyInput = useMemo(()=>{
49
+ if (actionSpace && actionSpace.length > 0) {
50
+ const action = actionSpace.find((a)=>a.interfaceAlias === selectedType || a.name === selectedType);
51
+ if (action) {
52
+ if (action.paramSchema && isZodObjectSchema(action.paramSchema)) {
53
+ const schema = action.paramSchema;
54
+ const shape = schema.shape || {};
55
+ const hasRequiredFields = Object.keys(shape).some((key)=>{
56
+ const field = shape[key];
57
+ const { isOptional } = unwrapZodType(field);
58
+ return !isOptional;
59
+ });
60
+ return hasRequiredFields;
61
+ }
62
+ return !!action.paramSchema;
63
+ }
64
+ }
65
+ return true;
66
+ }, [
67
+ selectedType,
68
+ actionSpace
69
+ ]);
70
+ const showDataExtractionOptions = useMemo(()=>{
71
+ const dataExtractionMethods = [
72
+ 'aiQuery',
73
+ 'aiBoolean',
74
+ 'aiNumber',
75
+ 'aiString',
76
+ 'aiAsk',
77
+ 'aiAssert'
78
+ ];
79
+ return dataExtractionMethods.includes(selectedType);
80
+ }, [
81
+ selectedType
82
+ ]);
83
+ const showDeepThinkOption = useMemo(()=>{
84
+ if ('aiLocate' === selectedType) return true;
85
+ if (actionSpace) {
86
+ const action = actionSpace.find((a)=>a.interfaceAlias === selectedType || a.name === selectedType);
87
+ if ((null == action ? void 0 : action.paramSchema) && isZodObjectSchema(action.paramSchema)) {
88
+ const schema = action.paramSchema;
89
+ const shape = schema.shape || {};
90
+ const hasLocateField = Object.keys(shape).some((key)=>{
91
+ const field = shape[key];
92
+ const { actualField } = unwrapZodType(field);
93
+ return isLocateField(actualField);
94
+ });
95
+ return hasLocateField;
96
+ }
97
+ }
98
+ return false;
99
+ }, [
100
+ selectedType,
101
+ actionSpace
102
+ ]);
103
+ const hasConfigOptions = useMemo(()=>{
104
+ const hasTracking = 'In-Browser-Extension' === serviceMode;
105
+ const hasDeepThink = showDeepThinkOption;
106
+ const hasDataExtraction = showDataExtractionOptions && !hideDomAndScreenshotOptions;
107
+ return hasTracking || hasDeepThink || hasDataExtraction;
108
+ }, [
109
+ serviceMode,
110
+ showDeepThinkOption,
111
+ showDataExtractionOptions,
112
+ hideDomAndScreenshotOptions
113
+ ]);
114
+ const availableDropdownMethods = useMemo(()=>{
115
+ const metadataMethods = Object.keys(apiMetadata);
116
+ if (!actionSpace || 0 === actionSpace.length) return metadataMethods;
117
+ const availableMethods = actionSpace.map((action)=>action.interfaceAlias || action.name);
118
+ const finalMethods = new Set();
119
+ metadataMethods.forEach((method)=>{
120
+ const methodInfo = apiMetadata[method];
121
+ if ((null == methodInfo ? void 0 : methodInfo.group) === 'extraction' || (null == methodInfo ? void 0 : methodInfo.group) === 'validation') finalMethods.add(method);
122
+ else if (availableMethods.includes(method)) finalMethods.add(method);
123
+ });
124
+ availableMethods.forEach((method)=>{
125
+ finalMethods.add(method);
126
+ });
127
+ return Array.from(finalMethods);
128
+ }, [
129
+ actionSpace
130
+ ]);
131
+ const getDefaultParams = useCallback(()=>{
132
+ if (!needsStructuredParams || !actionSpace) return {};
133
+ const action = actionSpace.find((a)=>a.interfaceAlias === selectedType || a.name === selectedType);
134
+ if ((null == action ? void 0 : action.paramSchema) && isZodObjectSchema(action.paramSchema)) {
135
+ const defaultParams = {};
136
+ const schema = action.paramSchema;
137
+ const shape = schema.shape || {};
138
+ Object.keys(shape).forEach((key)=>{
139
+ const field = shape[key];
140
+ const defaultValue = extractDefaultValue(field);
141
+ if (void 0 !== defaultValue) defaultParams[key] = defaultValue;
142
+ });
143
+ return defaultParams;
144
+ }
145
+ return {};
146
+ }, [
147
+ selectedType,
148
+ needsStructuredParams,
149
+ actionSpace
150
+ ]);
151
+ useEffect(()=>{
152
+ if (!form.getFieldValue('type') && lastSelectedType) form.setFieldValue('type', lastSelectedType);
153
+ }, [
154
+ form,
155
+ lastSelectedType
156
+ ]);
157
+ useEffect(()=>{
158
+ if (selectedType && selectedType !== lastSelectedType) setLastSelectedType(selectedType);
159
+ }, [
160
+ selectedType,
161
+ lastSelectedType,
162
+ setLastSelectedType
163
+ ]);
164
+ const scrollToSelectedItem = useCallback(()=>{
165
+ const container = modeRadioGroupRef.current;
166
+ if (!container) return;
167
+ let targetElement = null;
168
+ const selectedRadioButton = container.querySelector('.ant-radio-button-wrapper-checked');
169
+ const dropdownButton = container.querySelector('.more-apis-button.selected-from-dropdown');
170
+ if (selectedRadioButton) targetElement = selectedRadioButton;
171
+ else if (dropdownButton) targetElement = dropdownButton;
172
+ if (targetElement) {
173
+ const containerRect = container.getBoundingClientRect();
174
+ const targetRect = targetElement.getBoundingClientRect();
175
+ const targetLeft = targetRect.left - containerRect.left + container.scrollLeft;
176
+ const targetWidth = targetRect.width;
177
+ const containerWidth = containerRect.width;
178
+ const optimalScrollLeft = targetLeft - (containerWidth - targetWidth) / 2;
179
+ container.scrollTo({
180
+ left: Math.max(0, optimalScrollLeft),
181
+ behavior: 'smooth'
182
+ });
183
+ }
184
+ }, []);
185
+ useEffect(()=>{
186
+ const lastHistory = historyForSelectedType[0];
187
+ if (lastHistory && lastHistoryRef.current && lastHistory.timestamp === lastHistoryRef.current.timestamp) return;
188
+ if (lastHistory) {
189
+ form.setFieldsValue({
190
+ type: lastHistory.type,
191
+ prompt: lastHistory.prompt || '',
192
+ params: lastHistory.params
193
+ });
194
+ setPromptValue(lastHistory.prompt || '');
195
+ lastHistoryRef.current = lastHistory;
196
+ } else {
197
+ const defaultParams = getDefaultParams();
198
+ form.setFieldsValue({
199
+ prompt: '',
200
+ params: defaultParams
201
+ });
202
+ setPromptValue('');
203
+ lastHistoryRef.current = null;
204
+ }
205
+ }, [
206
+ selectedType,
207
+ historyForSelectedType,
208
+ form,
209
+ getDefaultParams
210
+ ]);
211
+ useEffect(()=>{
212
+ const timeoutId = setTimeout(()=>{
213
+ scrollToSelectedItem();
214
+ }, 100);
215
+ return ()=>clearTimeout(timeoutId);
216
+ }, [
217
+ selectedType,
218
+ scrollToSelectedItem
219
+ ]);
220
+ const formPromptValue = Form.useWatch('prompt', form);
221
+ useEffect(()=>{
222
+ if (formPromptValue !== promptValue) setPromptValue(formPromptValue || '');
223
+ }, [
224
+ formPromptValue,
225
+ promptValue
226
+ ]);
227
+ const handleSelectHistory = useCallback((historyItem)=>{
228
+ form.setFieldsValue({
229
+ prompt: historyItem.prompt,
230
+ type: historyItem.type,
231
+ params: historyItem.params
232
+ });
233
+ setPromptValue(historyItem.prompt);
234
+ }, [
235
+ form
236
+ ]);
237
+ const handlePromptChange = useCallback((e)=>{
238
+ const value = e.target.value;
239
+ setPromptValue(value);
240
+ }, []);
241
+ const hasSingleStructuredParam = useMemo(()=>{
242
+ if (!needsStructuredParams || !actionSpace) return false;
243
+ const action = actionSpace.find((a)=>a.interfaceAlias === selectedType || a.name === selectedType);
244
+ if ((null == action ? void 0 : action.paramSchema) && isZodObjectSchema(action.paramSchema)) {
245
+ const schema = action.paramSchema;
246
+ const shape = schema.shape || {};
247
+ return 1 === Object.keys(shape).length;
248
+ }
249
+ return false;
250
+ }, [
251
+ selectedType,
252
+ needsStructuredParams,
253
+ actionSpace
254
+ ]);
255
+ const isRunButtonEnabled = useMemo(()=>playground_utils_mjs_isRunButtonEnabled(runButtonEnabled, !!needsStructuredParams, params, actionSpace, selectedType, promptValue), [
256
+ runButtonEnabled,
257
+ needsStructuredParams,
258
+ selectedType,
259
+ actionSpace,
260
+ promptValue,
261
+ params
262
+ ]);
263
+ const handleRunWithHistory = useCallback(()=>{
264
+ const values = form.getFieldsValue();
265
+ let historyPrompt = '';
266
+ if (needsStructuredParams && values.params && actionSpace) {
267
+ const action = actionSpace.find((a)=>a.interfaceAlias === selectedType || a.name === selectedType);
268
+ if ((null == action ? void 0 : action.paramSchema) && isZodObjectSchema(action.paramSchema)) {
269
+ let locateValue = '';
270
+ const otherValues = [];
271
+ const schema = action.paramSchema;
272
+ const shape = schema.shape || {};
273
+ Object.keys(shape).forEach((key)=>{
274
+ var _values_params;
275
+ const paramValue = null == (_values_params = values.params) ? void 0 : _values_params[key];
276
+ if (null != paramValue && '' !== paramValue) {
277
+ const field = shape[key];
278
+ const { actualField } = unwrapZodType(field);
279
+ if (isLocateField(actualField)) locateValue = String(paramValue);
280
+ else if ('distance' === key) otherValues.push(`${paramValue}`);
281
+ else otherValues.push(String(paramValue));
282
+ }
283
+ });
284
+ const mainPart = otherValues.join(' ');
285
+ historyPrompt = locateValue ? `${locateValue} - ${mainPart}` : mainPart;
286
+ } else historyPrompt = values.prompt || '';
287
+ } else historyPrompt = values.prompt || '';
288
+ const newHistoryItem = {
289
+ type: values.type,
290
+ prompt: historyPrompt,
291
+ params: values.params,
292
+ timestamp: Date.now()
293
+ };
294
+ addHistory(newHistoryItem);
295
+ onRun();
296
+ if (clearPromptAfterRun) {
297
+ lastHistoryRef.current = newHistoryItem;
298
+ setPromptValue('');
299
+ if (needsStructuredParams) {
300
+ const defaultParams = getDefaultParams();
301
+ form.setFieldValue('params', defaultParams);
302
+ } else form.setFieldValue('prompt', '');
303
+ }
304
+ }, [
305
+ form,
306
+ addHistory,
307
+ onRun,
308
+ needsStructuredParams,
309
+ selectedType,
310
+ clearPromptAfterRun,
311
+ actionSpace,
312
+ getDefaultParams
313
+ ]);
314
+ const handleKeyDown = useCallback((e)=>{
315
+ if ('Enter' === e.key && e.metaKey && isRunButtonEnabled) {
316
+ handleRunWithHistory();
317
+ e.preventDefault();
318
+ e.stopPropagation();
319
+ } else if ('Enter' === e.key) setTimeout(()=>{
320
+ if (textAreaRef.current) {
321
+ var _textAreaRef_current_resizableTextArea;
322
+ const textarea = null == (_textAreaRef_current_resizableTextArea = textAreaRef.current.resizableTextArea) ? void 0 : _textAreaRef_current_resizableTextArea.textArea;
323
+ if (textarea) {
324
+ const selectionStart = textarea.selectionStart;
325
+ const value = textarea.value;
326
+ const lastNewlineIndex = value.lastIndexOf('\n');
327
+ const isAtLastLine = -1 === lastNewlineIndex || selectionStart > lastNewlineIndex;
328
+ if (isAtLastLine) textarea.scrollTop = textarea.scrollHeight;
329
+ }
330
+ }
331
+ }, 0);
332
+ }, [
333
+ handleRunWithHistory,
334
+ isRunButtonEnabled
335
+ ]);
336
+ const handleStructuredKeyDown = useCallback((e)=>{
337
+ if ('Enter' === e.key && e.metaKey && isRunButtonEnabled) {
338
+ handleRunWithHistory();
339
+ e.preventDefault();
340
+ e.stopPropagation();
341
+ }
342
+ }, [
343
+ handleRunWithHistory,
344
+ isRunButtonEnabled
345
+ ]);
346
+ const renderStructuredParams = useCallback(()=>{
347
+ if (!needsStructuredParams) return null;
348
+ if (actionSpace) {
349
+ const action = actionSpace.find((a)=>a.interfaceAlias === selectedType || a.name === selectedType);
350
+ if ((null == action ? void 0 : action.paramSchema) && isZodObjectSchema(action.paramSchema)) {
351
+ const schema = action.paramSchema;
352
+ const shape = schema.shape || {};
353
+ const schemaKeys = Object.keys(shape);
354
+ if (1 === schemaKeys.length) {
355
+ const key = schemaKeys[0];
356
+ const field = shape[key];
357
+ const { actualField } = unwrapZodType(field);
358
+ const isLocateFieldFlag = isLocateField(actualField);
359
+ const placeholderText = (()=>{
360
+ var _fieldWithRuntime__def;
361
+ const fieldWithRuntime = actualField;
362
+ if (null == (_fieldWithRuntime__def = fieldWithRuntime._def) ? void 0 : _fieldWithRuntime__def.description) return fieldWithRuntime._def.description;
363
+ if (fieldWithRuntime.description) return fieldWithRuntime.description;
364
+ if (actionSpace) {
365
+ const action = actionSpace.find((a)=>a.interfaceAlias === selectedType || a.name === selectedType);
366
+ if ((null == action ? void 0 : action.paramSchema) && 'object' == typeof action.paramSchema && 'shape' in action.paramSchema) {
367
+ var _fieldDef__def;
368
+ const shape = action.paramSchema.shape || {};
369
+ const fieldDef = shape[key];
370
+ if (null == fieldDef ? void 0 : null == (_fieldDef__def = fieldDef._def) ? void 0 : _fieldDef__def.description) return fieldDef._def.description;
371
+ if (null == fieldDef ? void 0 : fieldDef.description) return fieldDef.description;
372
+ }
373
+ }
374
+ if (isLocateFieldFlag) return 'Describe the element you want to interact with';
375
+ if ('keyName' === key) return 'Enter key name or text to type';
376
+ if ('value' === key) return 'Enter text to input';
377
+ return `Enter ${key}`;
378
+ })();
379
+ return /*#__PURE__*/ jsx(Form.Item, {
380
+ name: [
381
+ 'params',
382
+ key
383
+ ],
384
+ style: {
385
+ margin: 0
386
+ },
387
+ children: /*#__PURE__*/ jsx(Input.TextArea, {
388
+ className: "main-side-console-input-textarea",
389
+ rows: 4,
390
+ placeholder: placeholderText,
391
+ autoFocus: true,
392
+ onKeyDown: handleStructuredKeyDown
393
+ })
394
+ });
395
+ }
396
+ const fields = [];
397
+ const sortedKeys = schemaKeys.sort((keyA, keyB)=>{
398
+ const fieldSchemaA = shape[keyA];
399
+ const fieldSchemaB = shape[keyB];
400
+ const { isOptional: isOptionalA } = unwrapZodType(fieldSchemaA);
401
+ const { isOptional: isOptionalB } = unwrapZodType(fieldSchemaB);
402
+ if (!isOptionalA && isOptionalB) return -1;
403
+ if (isOptionalA && !isOptionalB) return 1;
404
+ return 0;
405
+ });
406
+ sortedKeys.forEach((key, index)=>{
407
+ var _actualField__def, _actualField__def1, _actualField__def2;
408
+ const fieldSchema = shape[key];
409
+ const { actualField, isOptional } = unwrapZodType(fieldSchema);
410
+ const isLocateFieldFlag = isLocateField(actualField);
411
+ const label = key.charAt(0).toUpperCase() + key.slice(1);
412
+ const isRequired = !isOptional;
413
+ const marginBottom = index === sortedKeys.length - 1 ? 0 : 12;
414
+ const placeholder = (()=>{
415
+ var _fieldWithRuntime__def;
416
+ const fieldWithRuntime = actualField;
417
+ if (null == (_fieldWithRuntime__def = fieldWithRuntime._def) ? void 0 : _fieldWithRuntime__def.description) return fieldWithRuntime._def.description;
418
+ if (fieldWithRuntime.description) return fieldWithRuntime.description;
419
+ if (actionSpace) {
420
+ const action = actionSpace.find((a)=>a.interfaceAlias === selectedType || a.name === selectedType);
421
+ if ((null == action ? void 0 : action.paramSchema) && 'object' == typeof action.paramSchema && 'shape' in action.paramSchema) {
422
+ var _fieldDef__def;
423
+ const shape = action.paramSchema.shape || {};
424
+ const fieldDef = shape[key];
425
+ if (null == fieldDef ? void 0 : null == (_fieldDef__def = fieldDef._def) ? void 0 : _fieldDef__def.description) return fieldDef._def.description;
426
+ if (null == fieldDef ? void 0 : fieldDef.description) return fieldDef.description;
427
+ }
428
+ }
429
+ if (isLocateFieldFlag) return 'Describe the element you want to interact with';
430
+ })();
431
+ const fieldProps = {
432
+ name: key,
433
+ label,
434
+ fieldSchema: actualField,
435
+ isRequired,
436
+ marginBottom,
437
+ placeholder
438
+ };
439
+ if (isLocateFieldFlag) fields.push(/*#__PURE__*/ jsx(LocateField, {
440
+ ...fieldProps
441
+ }, key));
442
+ else if ((null == (_actualField__def = actualField._def) ? void 0 : _actualField__def.typeName) === 'ZodEnum') fields.push(/*#__PURE__*/ jsx(EnumField, {
443
+ ...fieldProps
444
+ }, key));
445
+ else if ((null == (_actualField__def1 = actualField._def) ? void 0 : _actualField__def1.typeName) === 'ZodNumber') fields.push(/*#__PURE__*/ jsx(NumberField, {
446
+ ...fieldProps
447
+ }, key));
448
+ else if ((null == (_actualField__def2 = actualField._def) ? void 0 : _actualField__def2.typeName) === 'ZodBoolean') fields.push(/*#__PURE__*/ jsx(BooleanField, {
449
+ ...fieldProps
450
+ }, key));
451
+ else fields.push(/*#__PURE__*/ jsx(TextField, {
452
+ ...fieldProps
453
+ }, key));
454
+ });
455
+ if ('aiScroll' === selectedType) {
456
+ const directionField = fields.find((field)=>/*#__PURE__*/ react.isValidElement(field) && 'direction' === field.props.name);
457
+ const distanceField = fields.find((field)=>/*#__PURE__*/ react.isValidElement(field) && 'distance' === field.props.name);
458
+ const otherFields = fields.filter((field)=>/*#__PURE__*/ react.isValidElement(field) && 'direction' !== field.props.name && 'distance' !== field.props.name);
459
+ if (directionField && distanceField) return /*#__PURE__*/ jsxs("div", {
460
+ className: "structured-params",
461
+ children: [
462
+ /*#__PURE__*/ jsxs("div", {
463
+ style: {
464
+ display: 'flex',
465
+ gap: 12,
466
+ marginBottom: 12
467
+ },
468
+ children: [
469
+ directionField,
470
+ distanceField
471
+ ]
472
+ }),
473
+ otherFields
474
+ ]
475
+ });
476
+ }
477
+ return /*#__PURE__*/ jsx("div", {
478
+ className: "structured-params",
479
+ children: fields
480
+ });
481
+ }
482
+ }
483
+ return null;
484
+ }, [
485
+ selectedType,
486
+ needsStructuredParams,
487
+ actionSpace,
488
+ handleStructuredKeyDown
489
+ ]);
490
+ const handleMouseEnter = useCallback(()=>{
491
+ setHoveringSettings(true);
492
+ }, []);
493
+ const handleMouseLeave = useCallback(()=>{
494
+ setHoveringSettings(false);
495
+ }, []);
496
+ const renderActionButton = useCallback(()=>{
497
+ const runButton = (text)=>/*#__PURE__*/ jsx(Button, {
498
+ type: "primary",
499
+ icon: /*#__PURE__*/ jsx(SendOutlined, {}),
500
+ style: {
501
+ borderRadius: 20,
502
+ zIndex: 999
503
+ },
504
+ onClick: handleRunWithHistory,
505
+ disabled: !isRunButtonEnabled,
506
+ loading: loading,
507
+ children: text
508
+ });
509
+ if (dryMode) return 'aiAction' === selectedType ? /*#__PURE__*/ jsx(Tooltip, {
510
+ title: "Start executing until some interaction actions need to be performed. You can see the process of planning and locating.",
511
+ children: runButton('Dry Run')
512
+ }) : runButton('Run');
513
+ if (stoppable) return /*#__PURE__*/ jsx(Button, {
514
+ icon: /*#__PURE__*/ jsx(BorderOutlined, {}),
515
+ onClick: onStop,
516
+ style: {
517
+ borderRadius: 20,
518
+ zIndex: 999
519
+ },
520
+ children: "Stop"
521
+ });
522
+ return runButton('Run');
523
+ }, [
524
+ dryMode,
525
+ loading,
526
+ handleRunWithHistory,
527
+ onStop,
528
+ isRunButtonEnabled,
529
+ selectedType,
530
+ stoppable
531
+ ]);
532
+ return /*#__PURE__*/ jsxs("div", {
533
+ className: "prompt-input-wrapper",
534
+ children: [
535
+ /*#__PURE__*/ jsxs("div", {
536
+ className: "mode-radio-group-wrapper",
537
+ children: [
538
+ /*#__PURE__*/ jsxs("div", {
539
+ className: "mode-radio-group",
540
+ ref: modeRadioGroupRef,
541
+ children: [
542
+ /*#__PURE__*/ jsx(Form.Item, {
543
+ name: "type",
544
+ style: {
545
+ margin: 0
546
+ },
547
+ children: /*#__PURE__*/ jsx(Radio.Group, {
548
+ buttonStyle: "solid",
549
+ disabled: !runButtonEnabled,
550
+ children: defaultMainButtons.map((apiType)=>{
551
+ var _apiMetadata_apiType;
552
+ return /*#__PURE__*/ jsx(Tooltip, {
553
+ title: (null == (_apiMetadata_apiType = apiMetadata[apiType]) ? void 0 : _apiMetadata_apiType.title) || '',
554
+ children: /*#__PURE__*/ jsx(Radio.Button, {
555
+ value: apiType,
556
+ children: actionNameForType(apiType)
557
+ })
558
+ }, apiType);
559
+ })
560
+ })
561
+ }),
562
+ /*#__PURE__*/ jsx(Dropdown, {
563
+ menu: (()=>{
564
+ const hiddenAPIs = availableDropdownMethods.filter((api)=>!defaultMainButtons.includes(api));
565
+ const groupedItems = [];
566
+ const interactionAPIs = hiddenAPIs.filter((api)=>{
567
+ var _apiMetadata_api;
568
+ return (null == (_apiMetadata_api = apiMetadata[api]) ? void 0 : _apiMetadata_api.group) === 'interaction';
569
+ });
570
+ if (interactionAPIs.length > 0) groupedItems.push({
571
+ key: 'interaction-group',
572
+ type: 'group',
573
+ label: 'Interaction APIs',
574
+ children: interactionAPIs.map((api)=>{
575
+ var _apiMetadata_api;
576
+ return {
577
+ key: api,
578
+ label: actionNameForType(api),
579
+ title: (null == (_apiMetadata_api = apiMetadata[api]) ? void 0 : _apiMetadata_api.title) || '',
580
+ onClick: ()=>{
581
+ form.setFieldValue('type', api);
582
+ }
583
+ };
584
+ })
585
+ });
586
+ const extractionAPIs = hiddenAPIs.filter((api)=>{
587
+ var _apiMetadata_api;
588
+ return (null == (_apiMetadata_api = apiMetadata[api]) ? void 0 : _apiMetadata_api.group) === 'extraction';
589
+ });
590
+ if (extractionAPIs.length > 0) groupedItems.push({
591
+ key: 'extraction-group',
592
+ type: 'group',
593
+ label: 'Data Extraction APIs',
594
+ children: extractionAPIs.map((api)=>{
595
+ var _apiMetadata_api;
596
+ return {
597
+ key: api,
598
+ label: actionNameForType(api),
599
+ title: (null == (_apiMetadata_api = apiMetadata[api]) ? void 0 : _apiMetadata_api.title) || '',
600
+ onClick: ()=>{
601
+ form.setFieldValue('type', api);
602
+ }
603
+ };
604
+ })
605
+ });
606
+ const validationAPIs = hiddenAPIs.filter((api)=>{
607
+ var _apiMetadata_api;
608
+ return (null == (_apiMetadata_api = apiMetadata[api]) ? void 0 : _apiMetadata_api.group) === 'validation';
609
+ });
610
+ if (validationAPIs.length > 0) groupedItems.push({
611
+ key: 'validation-group',
612
+ type: 'group',
613
+ label: 'Validation APIs',
614
+ children: validationAPIs.map((api)=>{
615
+ var _apiMetadata_api;
616
+ return {
617
+ key: api,
618
+ label: actionNameForType(api),
619
+ title: (null == (_apiMetadata_api = apiMetadata[api]) ? void 0 : _apiMetadata_api.title) || '',
620
+ onClick: ()=>{
621
+ form.setFieldValue('type', api);
622
+ }
623
+ };
624
+ })
625
+ });
626
+ const deviceSpecificAPIs = hiddenAPIs.filter((api)=>!apiMetadata[api]);
627
+ if (deviceSpecificAPIs.length > 0) groupedItems.push({
628
+ key: 'device-specific-group',
629
+ type: 'group',
630
+ label: 'Device-Specific APIs',
631
+ children: deviceSpecificAPIs.map((api)=>({
632
+ key: api,
633
+ label: actionNameForType(api),
634
+ title: '',
635
+ onClick: ()=>{
636
+ form.setFieldValue('type', api);
637
+ }
638
+ }))
639
+ });
640
+ return {
641
+ items: groupedItems
642
+ };
643
+ })(),
644
+ placement: "bottomLeft",
645
+ trigger: [
646
+ 'click'
647
+ ],
648
+ disabled: !runButtonEnabled,
649
+ children: /*#__PURE__*/ jsxs(Button, {
650
+ className: `more-apis-button ${!defaultMainButtons.includes(selectedType) ? 'selected-from-dropdown' : ''}`,
651
+ children: [
652
+ selectedType && !defaultMainButtons.includes(selectedType) ? actionNameForType(selectedType) : 'more',
653
+ /*#__PURE__*/ jsx(DownOutlined, {
654
+ style: {
655
+ fontSize: '10px',
656
+ marginLeft: '2px'
657
+ }
658
+ })
659
+ ]
660
+ })
661
+ })
662
+ ]
663
+ }),
664
+ /*#__PURE__*/ jsxs("div", {
665
+ className: "action-icons",
666
+ children: [
667
+ hasConfigOptions && /*#__PURE__*/ jsx("div", {
668
+ className: hoveringSettings ? 'settings-wrapper settings-wrapper-hover' : 'settings-wrapper',
669
+ onMouseEnter: handleMouseEnter,
670
+ onMouseLeave: handleMouseLeave,
671
+ children: /*#__PURE__*/ jsx(ConfigSelector, {
672
+ enableTracking: 'In-Browser-Extension' === serviceMode,
673
+ showDeepThinkOption: showDeepThinkOption,
674
+ showDataExtractionOptions: showDataExtractionOptions,
675
+ hideDomAndScreenshotOptions: hideDomAndScreenshotOptions
676
+ })
677
+ }),
678
+ /*#__PURE__*/ jsx(HistorySelector, {
679
+ onSelect: handleSelectHistory,
680
+ history: historyForSelectedType,
681
+ currentType: selectedType
682
+ })
683
+ ]
684
+ })
685
+ ]
686
+ }),
687
+ /*#__PURE__*/ jsxs("div", {
688
+ className: `main-side-console-input ${!runButtonEnabled ? 'disabled' : ''} ${loading ? 'loading' : ''}`,
689
+ children: [
690
+ needsAnyInput ? needsStructuredParams ? hasSingleStructuredParam ? renderStructuredParams() : /*#__PURE__*/ jsx("div", {
691
+ className: "structured-params-container",
692
+ children: renderStructuredParams()
693
+ }) : /*#__PURE__*/ jsx(Form.Item, {
694
+ name: "prompt",
695
+ style: {
696
+ margin: 0
697
+ },
698
+ children: /*#__PURE__*/ jsx(TextArea, {
699
+ className: "main-side-console-input-textarea",
700
+ disabled: !runButtonEnabled,
701
+ rows: 4,
702
+ placeholder: placeholder,
703
+ autoFocus: true,
704
+ onKeyDown: handleKeyDown,
705
+ onChange: handlePromptChange,
706
+ ref: textAreaRef
707
+ })
708
+ }) : /*#__PURE__*/ jsxs("div", {
709
+ className: "no-input-method",
710
+ style: {
711
+ padding: '20px',
712
+ textAlign: 'center',
713
+ color: '#666',
714
+ fontSize: '14px'
715
+ },
716
+ children: [
717
+ 'Click "Run" to execute ',
718
+ actionNameForType(selectedType)
719
+ ]
720
+ }),
721
+ /*#__PURE__*/ jsx("div", {
722
+ className: "form-controller-wrapper",
723
+ children: renderActionButton()
724
+ })
725
+ ]
726
+ })
727
+ ]
728
+ });
729
+ };
730
+ export { PromptInput };