@sqaitech/visualizer 0.5.0

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 (152) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +9 -0
  3. package/dist/es/assets/sqai-logo.mjs +2 -0
  4. package/dist/es/component/blackboard/index.css +33 -0
  5. package/dist/es/component/blackboard/index.mjs +278 -0
  6. package/dist/es/component/config-selector/index.mjs +104 -0
  7. package/dist/es/component/context-preview/index.mjs +38 -0
  8. package/dist/es/component/env-config/index.mjs +112 -0
  9. package/dist/es/component/env-config-reminder/index.css +22 -0
  10. package/dist/es/component/env-config-reminder/index.mjs +28 -0
  11. package/dist/es/component/form-field/index.mjs +163 -0
  12. package/dist/es/component/history-selector/index.css +135 -0
  13. package/dist/es/component/history-selector/index.mjs +170 -0
  14. package/dist/es/component/index.mjs +1 -0
  15. package/dist/es/component/logo/index.css +13 -0
  16. package/dist/es/component/logo/index.mjs +21 -0
  17. package/dist/es/component/misc/index.mjs +94 -0
  18. package/dist/es/component/nav-actions/index.mjs +32 -0
  19. package/dist/es/component/nav-actions/style.css +35 -0
  20. package/dist/es/component/player/index.css +185 -0
  21. package/dist/es/component/player/index.mjs +856 -0
  22. package/dist/es/component/playground/index.css +431 -0
  23. package/dist/es/component/playground/index.mjs +8 -0
  24. package/dist/es/component/playground/playground-demo-ui-context.json +290 -0
  25. package/dist/es/component/playground-result/index.css +34 -0
  26. package/dist/es/component/playground-result/index.mjs +62 -0
  27. package/dist/es/component/prompt-input/index.css +391 -0
  28. package/dist/es/component/prompt-input/index.mjs +730 -0
  29. package/dist/es/component/service-mode-control/index.mjs +105 -0
  30. package/dist/es/component/shiny-text/index.css +75 -0
  31. package/dist/es/component/shiny-text/index.mjs +15 -0
  32. package/dist/es/component/universal-playground/index.css +341 -0
  33. package/dist/es/component/universal-playground/index.mjs +302 -0
  34. package/dist/es/component/universal-playground/providers/context-provider.mjs +52 -0
  35. package/dist/es/component/universal-playground/providers/indexeddb-storage-provider.mjs +207 -0
  36. package/dist/es/component/universal-playground/providers/storage-provider.mjs +210 -0
  37. package/dist/es/hooks/usePlaygroundExecution.mjs +180 -0
  38. package/dist/es/hooks/usePlaygroundState.mjs +203 -0
  39. package/dist/es/hooks/useSafeOverrideAIConfig.mjs +24 -0
  40. package/dist/es/hooks/useServerValid.mjs +30 -0
  41. package/dist/es/icons/avatar.mjs +28 -0
  42. package/dist/es/icons/close.mjs +19 -0
  43. package/dist/es/icons/global-perspective.mjs +16 -0
  44. package/dist/es/icons/history.mjs +30 -0
  45. package/dist/es/icons/magnifying-glass.mjs +39 -0
  46. package/dist/es/icons/player-setting.mjs +26 -0
  47. package/dist/es/icons/setting.mjs +20 -0
  48. package/dist/es/icons/show-marker.mjs +16 -0
  49. package/dist/es/index.mjs +25 -0
  50. package/dist/es/static/image/sqai-logo.png +0 -0
  51. package/dist/es/store/history.mjs +89 -0
  52. package/dist/es/store/store.mjs +186 -0
  53. package/dist/es/types.mjs +70 -0
  54. package/dist/es/utils/color.mjs +35 -0
  55. package/dist/es/utils/constants.mjs +99 -0
  56. package/dist/es/utils/index.mjs +10 -0
  57. package/dist/es/utils/pixi-loader.mjs +16 -0
  58. package/dist/es/utils/playground-utils.mjs +67 -0
  59. package/dist/es/utils/replay-scripts.mjs +312 -0
  60. package/dist/lib/assets/sqai-logo.js +24 -0
  61. package/dist/lib/component/blackboard/index.css +33 -0
  62. package/dist/lib/component/blackboard/index.js +321 -0
  63. package/dist/lib/component/config-selector/index.js +148 -0
  64. package/dist/lib/component/context-preview/index.js +83 -0
  65. package/dist/lib/component/env-config/index.js +146 -0
  66. package/dist/lib/component/env-config-reminder/index.css +22 -0
  67. package/dist/lib/component/env-config-reminder/index.js +62 -0
  68. package/dist/lib/component/form-field/index.js +209 -0
  69. package/dist/lib/component/history-selector/index.css +135 -0
  70. package/dist/lib/component/history-selector/index.js +216 -0
  71. package/dist/lib/component/index.js +60 -0
  72. package/dist/lib/component/logo/index.css +13 -0
  73. package/dist/lib/component/logo/index.js +68 -0
  74. package/dist/lib/component/misc/index.js +150 -0
  75. package/dist/lib/component/nav-actions/index.js +66 -0
  76. package/dist/lib/component/nav-actions/style.css +35 -0
  77. package/dist/lib/component/player/index.css +185 -0
  78. package/dist/lib/component/player/index.js +902 -0
  79. package/dist/lib/component/playground/index.css +431 -0
  80. package/dist/lib/component/playground/index.js +113 -0
  81. package/dist/lib/component/playground/playground-demo-ui-context.json +290 -0
  82. package/dist/lib/component/playground-result/index.css +34 -0
  83. package/dist/lib/component/playground-result/index.js +106 -0
  84. package/dist/lib/component/prompt-input/index.css +391 -0
  85. package/dist/lib/component/prompt-input/index.js +774 -0
  86. package/dist/lib/component/service-mode-control/index.js +139 -0
  87. package/dist/lib/component/shiny-text/index.css +75 -0
  88. package/dist/lib/component/shiny-text/index.js +49 -0
  89. package/dist/lib/component/universal-playground/index.css +341 -0
  90. package/dist/lib/component/universal-playground/index.js +350 -0
  91. package/dist/lib/component/universal-playground/providers/context-provider.js +95 -0
  92. package/dist/lib/component/universal-playground/providers/indexeddb-storage-provider.js +247 -0
  93. package/dist/lib/component/universal-playground/providers/storage-provider.js +268 -0
  94. package/dist/lib/hooks/usePlaygroundExecution.js +214 -0
  95. package/dist/lib/hooks/usePlaygroundState.js +237 -0
  96. package/dist/lib/hooks/useSafeOverrideAIConfig.js +61 -0
  97. package/dist/lib/hooks/useServerValid.js +64 -0
  98. package/dist/lib/icons/avatar.js +62 -0
  99. package/dist/lib/icons/close.js +53 -0
  100. package/dist/lib/icons/global-perspective.js +50 -0
  101. package/dist/lib/icons/history.js +64 -0
  102. package/dist/lib/icons/magnifying-glass.js +73 -0
  103. package/dist/lib/icons/player-setting.js +60 -0
  104. package/dist/lib/icons/setting.js +54 -0
  105. package/dist/lib/icons/show-marker.js +50 -0
  106. package/dist/lib/index.js +187 -0
  107. package/dist/lib/static/image/sqai-logo.png +0 -0
  108. package/dist/lib/store/history.js +96 -0
  109. package/dist/lib/store/store.js +196 -0
  110. package/dist/lib/types.js +116 -0
  111. package/dist/lib/utils/color.js +75 -0
  112. package/dist/lib/utils/constants.js +154 -0
  113. package/dist/lib/utils/index.js +63 -0
  114. package/dist/lib/utils/pixi-loader.js +56 -0
  115. package/dist/lib/utils/playground-utils.js +110 -0
  116. package/dist/lib/utils/replay-scripts.js +355 -0
  117. package/dist/types/component/blackboard/index.d.ts +15 -0
  118. package/dist/types/component/config-selector/index.d.ts +9 -0
  119. package/dist/types/component/context-preview/index.d.ts +9 -0
  120. package/dist/types/component/env-config/index.d.ts +6 -0
  121. package/dist/types/component/env-config-reminder/index.d.ts +6 -0
  122. package/dist/types/component/form-field/index.d.ts +17 -0
  123. package/dist/types/component/history-selector/index.d.ts +10 -0
  124. package/dist/types/component/index.d.ts +1 -0
  125. package/dist/types/component/logo/index.d.ts +5 -0
  126. package/dist/types/component/misc/index.d.ts +6 -0
  127. package/dist/types/component/nav-actions/index.d.ts +10 -0
  128. package/dist/types/component/player/index.d.ts +13 -0
  129. package/dist/types/component/playground/index.d.ts +7 -0
  130. package/dist/types/component/playground-result/index.d.ts +20 -0
  131. package/dist/types/component/prompt-input/index.d.ts +22 -0
  132. package/dist/types/component/service-mode-control/index.d.ts +6 -0
  133. package/dist/types/component/shiny-text/index.d.ts +12 -0
  134. package/dist/types/component/universal-playground/index.d.ts +4 -0
  135. package/dist/types/component/universal-playground/providers/context-provider.d.ts +37 -0
  136. package/dist/types/component/universal-playground/providers/indexeddb-storage-provider.d.ts +71 -0
  137. package/dist/types/component/universal-playground/providers/storage-provider.d.ts +58 -0
  138. package/dist/types/hooks/usePlaygroundExecution.d.ts +10 -0
  139. package/dist/types/hooks/usePlaygroundState.d.ts +26 -0
  140. package/dist/types/hooks/useSafeOverrideAIConfig.d.ts +16 -0
  141. package/dist/types/hooks/useServerValid.d.ts +1 -0
  142. package/dist/types/index.d.ts +27 -0
  143. package/dist/types/store/history.d.ts +16 -0
  144. package/dist/types/store/store.d.ts +36 -0
  145. package/dist/types/types.d.ts +161 -0
  146. package/dist/types/utils/color.d.ts +4 -0
  147. package/dist/types/utils/constants.d.ts +74 -0
  148. package/dist/types/utils/index.d.ts +4 -0
  149. package/dist/types/utils/pixi-loader.d.ts +5 -0
  150. package/dist/types/utils/playground-utils.d.ts +6 -0
  151. package/dist/types/utils/replay-scripts.d.ts +34 -0
  152. package/package.json +85 -0
@@ -0,0 +1,247 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ IndexedDBStorageProvider: ()=>IndexedDBStorageProvider,
28
+ NoOpStorageProvider: ()=>NoOpStorageProvider,
29
+ MemoryStorageProvider: ()=>MemoryStorageProvider
30
+ });
31
+ const baseDB_namespaceObject = require("@sqaitech/shared/baseDB");
32
+ function _define_property(obj, key, value) {
33
+ if (key in obj) Object.defineProperty(obj, key, {
34
+ value: value,
35
+ enumerable: true,
36
+ configurable: true,
37
+ writable: true
38
+ });
39
+ else obj[key] = value;
40
+ return obj;
41
+ }
42
+ const DB_NAME = 'midscene_playground';
43
+ const DB_VERSION = 1;
44
+ const MESSAGES_STORE = 'playground_messages';
45
+ const RESULTS_STORE = 'playground_results';
46
+ const MAX_STORED_MESSAGES = 100;
47
+ const MAX_STORED_RESULTS = 50;
48
+ class IndexedDBStorageProvider {
49
+ async saveMessages(messages) {
50
+ await (0, baseDB_namespaceObject.withErrorHandling)(async ()=>{
51
+ await this.dbManager.clear(MESSAGES_STORE);
52
+ const messagesToSave = messages.slice(-MAX_STORED_MESSAGES);
53
+ await Promise.all(messagesToSave.map((msg, index)=>{
54
+ const lightMessage = {
55
+ ...msg,
56
+ result: void 0
57
+ };
58
+ const data = {
59
+ id: msg.id || `msg-${index}`,
60
+ data: lightMessage,
61
+ timestamp: msg.timestamp ? msg.timestamp.getTime() : Date.now() + index
62
+ };
63
+ return this.dbManager.put(MESSAGES_STORE, data);
64
+ }));
65
+ }, 'Failed to save messages to IndexedDB', void 0, this.messagesCleanup);
66
+ }
67
+ async loadMessages() {
68
+ const result = await (0, baseDB_namespaceObject.withErrorHandling)(async ()=>{
69
+ const messages = await this.dbManager.getAll(MESSAGES_STORE, true);
70
+ if (0 === messages.length) return [];
71
+ return Promise.all(messages.map(async (msg)=>{
72
+ const item = msg.data;
73
+ const restoredItem = {
74
+ ...item,
75
+ timestamp: new Date(item.timestamp)
76
+ };
77
+ if ('result' === item.type && item.id) {
78
+ const fullResult = await this.loadResult(item.id);
79
+ if (fullResult) {
80
+ restoredItem.result = fullResult.result;
81
+ restoredItem.replayScriptsInfo = fullResult.replayScriptsInfo;
82
+ restoredItem.replayCounter = fullResult.replayCounter;
83
+ restoredItem.verticalMode = fullResult.verticalMode;
84
+ }
85
+ }
86
+ return restoredItem;
87
+ }));
88
+ }, 'Failed to load messages from IndexedDB', [], this.messagesCleanup);
89
+ return result || [];
90
+ }
91
+ async clearMessages() {
92
+ await (0, baseDB_namespaceObject.withErrorHandling)(async ()=>{
93
+ await Promise.all([
94
+ this.dbManager.clear(MESSAGES_STORE),
95
+ this.dbManager.clear(RESULTS_STORE)
96
+ ]);
97
+ }, 'Failed to clear messages from IndexedDB');
98
+ }
99
+ async saveResult(id, result) {
100
+ await (0, baseDB_namespaceObject.withErrorHandling)(async ()=>{
101
+ const compressedResult = this.compressResultForStorage(result);
102
+ const data = {
103
+ id,
104
+ data: compressedResult,
105
+ timestamp: Date.now(),
106
+ size: JSON.stringify(compressedResult).length
107
+ };
108
+ await this.dbManager.put(RESULTS_STORE, data);
109
+ }, 'Failed to save result to IndexedDB', void 0, this.resultsCleanup);
110
+ }
111
+ async loadResult(id) {
112
+ const result = await (0, baseDB_namespaceObject.withErrorHandling)(async ()=>{
113
+ const data = await this.dbManager.get(RESULTS_STORE, id);
114
+ return (null == data ? void 0 : data.data) || null;
115
+ }, 'Failed to load result from IndexedDB', null);
116
+ return result || null;
117
+ }
118
+ compressResultForStorage(result) {
119
+ var _result_result_dump, _result_result;
120
+ if (!(null == (_result_result = result.result) ? void 0 : null == (_result_result_dump = _result_result.dump) ? void 0 : _result_result_dump.executions)) return result;
121
+ const compressedExecutions = result.result.dump.executions.map((execution)=>{
122
+ var _execution_tasks;
123
+ return {
124
+ ...execution,
125
+ tasks: (null == (_execution_tasks = execution.tasks) ? void 0 : _execution_tasks.map((task)=>{
126
+ var _task_recorder;
127
+ var _this_compressScreenshotIfNeeded;
128
+ return {
129
+ ...task,
130
+ uiContext: task.uiContext ? {
131
+ ...task.uiContext,
132
+ screenshotBase64: null != (_this_compressScreenshotIfNeeded = this.compressScreenshotIfNeeded(task.uiContext.screenshotBase64)) ? _this_compressScreenshotIfNeeded : task.uiContext.screenshotBase64
133
+ } : task.uiContext,
134
+ recorder: null == (_task_recorder = task.recorder) ? void 0 : _task_recorder.map((record)=>({
135
+ ...record,
136
+ screenshot: this.compressScreenshotIfNeeded(record.screenshot)
137
+ }))
138
+ };
139
+ })) || []
140
+ };
141
+ });
142
+ return {
143
+ ...result,
144
+ result: {
145
+ ...result.result,
146
+ dump: {
147
+ ...result.result.dump,
148
+ executions: compressedExecutions
149
+ }
150
+ }
151
+ };
152
+ }
153
+ compressScreenshotIfNeeded(screenshot) {
154
+ if (!screenshot) return screenshot;
155
+ if (screenshot.length > 1048576) {
156
+ const sizeKB = Math.round(screenshot.length / 1024);
157
+ return `[COMPRESSED: ${sizeKB}KB screenshot removed for storage]`;
158
+ }
159
+ return screenshot;
160
+ }
161
+ async getStorageStats() {
162
+ const result = await (0, baseDB_namespaceObject.withErrorHandling)(async ()=>{
163
+ const [messageCount, resultCount] = await Promise.all([
164
+ this.dbManager.count(MESSAGES_STORE),
165
+ this.dbManager.count(RESULTS_STORE)
166
+ ]);
167
+ return {
168
+ messageCount,
169
+ resultCount
170
+ };
171
+ }, 'Failed to get storage statistics', {
172
+ messageCount: 0,
173
+ resultCount: 0
174
+ });
175
+ return result || {
176
+ messageCount: 0,
177
+ resultCount: 0
178
+ };
179
+ }
180
+ async cleanup() {
181
+ await Promise.all([
182
+ this.messagesCleanup(),
183
+ this.resultsCleanup()
184
+ ]);
185
+ }
186
+ constructor(namespace = 'playground'){
187
+ _define_property(this, "dbManager", void 0);
188
+ _define_property(this, "namespace", void 0);
189
+ _define_property(this, "messagesCleanup", void 0);
190
+ _define_property(this, "resultsCleanup", void 0);
191
+ this.namespace = namespace;
192
+ this.dbManager = new baseDB_namespaceObject.IndexedDBManager(`${DB_NAME}_${namespace}`, DB_VERSION, [
193
+ {
194
+ name: MESSAGES_STORE,
195
+ keyPath: 'id'
196
+ },
197
+ {
198
+ name: RESULTS_STORE,
199
+ keyPath: 'id'
200
+ }
201
+ ]);
202
+ this.messagesCleanup = (0, baseDB_namespaceObject.createCleanupFunction)(this.dbManager, MESSAGES_STORE, MAX_STORED_MESSAGES);
203
+ this.resultsCleanup = (0, baseDB_namespaceObject.createCleanupFunction)(this.dbManager, RESULTS_STORE, MAX_STORED_RESULTS);
204
+ }
205
+ }
206
+ class MemoryStorageProvider {
207
+ async saveMessages(messages) {
208
+ this.messages = [
209
+ ...messages
210
+ ];
211
+ }
212
+ async loadMessages() {
213
+ return [
214
+ ...this.messages
215
+ ];
216
+ }
217
+ async clearMessages() {
218
+ this.messages = [];
219
+ this.results.clear();
220
+ }
221
+ async saveResult(id, result) {
222
+ this.results.set(id, result);
223
+ }
224
+ constructor(){
225
+ _define_property(this, "messages", []);
226
+ _define_property(this, "results", new Map());
227
+ }
228
+ }
229
+ class NoOpStorageProvider {
230
+ async saveMessages(_messages) {}
231
+ async loadMessages() {
232
+ return [];
233
+ }
234
+ async clearMessages() {}
235
+ async saveResult(_id, _result) {}
236
+ }
237
+ exports.IndexedDBStorageProvider = __webpack_exports__.IndexedDBStorageProvider;
238
+ exports.MemoryStorageProvider = __webpack_exports__.MemoryStorageProvider;
239
+ exports.NoOpStorageProvider = __webpack_exports__.NoOpStorageProvider;
240
+ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
241
+ "IndexedDBStorageProvider",
242
+ "MemoryStorageProvider",
243
+ "NoOpStorageProvider"
244
+ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
245
+ Object.defineProperty(exports, '__esModule', {
246
+ value: true
247
+ });
@@ -0,0 +1,268 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ IndexedDBStorageProvider: ()=>external_indexeddb_storage_provider_js_namespaceObject.IndexedDBStorageProvider,
28
+ StorageType: ()=>storage_provider_StorageType,
29
+ detectBestStorageType: ()=>detectBestStorageType,
30
+ IndexedDBMemoryStorageProvider: ()=>external_indexeddb_storage_provider_js_namespaceObject.MemoryStorageProvider,
31
+ IndexedDBNoOpStorageProvider: ()=>external_indexeddb_storage_provider_js_namespaceObject.NoOpStorageProvider,
32
+ LocalStorageProvider: ()=>LocalStorageProvider,
33
+ NoOpStorageProvider: ()=>NoOpStorageProvider,
34
+ createStorageProvider: ()=>createStorageProvider,
35
+ MemoryStorageProvider: ()=>MemoryStorageProvider
36
+ });
37
+ const external_indexeddb_storage_provider_js_namespaceObject = require("./indexeddb-storage-provider.js");
38
+ function _define_property(obj, key, value) {
39
+ if (key in obj) Object.defineProperty(obj, key, {
40
+ value: value,
41
+ enumerable: true,
42
+ configurable: true,
43
+ writable: true
44
+ });
45
+ else obj[key] = value;
46
+ return obj;
47
+ }
48
+ class LocalStorageProvider {
49
+ checkStorageSpace() {
50
+ try {
51
+ const testKey = 'storage-test';
52
+ const testData = 'x'.repeat(102400);
53
+ localStorage.setItem(testKey, testData);
54
+ localStorage.removeItem(testKey);
55
+ return true;
56
+ } catch (e) {
57
+ return false;
58
+ }
59
+ }
60
+ async saveMessages(messages) {
61
+ try {
62
+ if (!this.checkStorageSpace()) {
63
+ console.warn('Low storage space detected, clearing old data...');
64
+ await this.handleQuotaExceeded();
65
+ }
66
+ const messagesToSave = messages.slice(-this.maxStorageItems);
67
+ const lightMessages = messagesToSave.map((msg)=>({
68
+ ...msg,
69
+ result: void 0
70
+ }));
71
+ const messageData = JSON.stringify(lightMessages);
72
+ localStorage.setItem(this.messagesKey, messageData);
73
+ } catch (error) {
74
+ if (error instanceof DOMException && 'QuotaExceededError' === error.name) {
75
+ console.warn('LocalStorage quota exceeded, attempting to clear old data and retry...');
76
+ await this.handleQuotaExceeded();
77
+ try {
78
+ const recentMessages = messages.slice(-10);
79
+ const lightRecentMessages = recentMessages.map((msg)=>({
80
+ ...msg,
81
+ result: void 0
82
+ }));
83
+ const messageData = JSON.stringify(lightRecentMessages);
84
+ localStorage.setItem(this.messagesKey, messageData);
85
+ console.info('Successfully saved recent messages after clearing storage');
86
+ } catch (retryError) {
87
+ console.error('Failed to save even after clearing storage:', retryError);
88
+ await this.clearMessages();
89
+ }
90
+ } else console.error('Failed to save messages to localStorage:', error);
91
+ }
92
+ }
93
+ async loadMessages() {
94
+ try {
95
+ const stored = localStorage.getItem(this.messagesKey);
96
+ if (!stored) return [];
97
+ const messages = JSON.parse(stored);
98
+ const restoredMessages = await Promise.all(messages.map(async (msg)=>{
99
+ if ('result' === msg.type && msg.id) {
100
+ const resultKey = `${this.resultsKey}-${msg.id}`;
101
+ const storedResult = localStorage.getItem(resultKey);
102
+ if (storedResult) try {
103
+ const resultItem = JSON.parse(storedResult);
104
+ return {
105
+ ...msg,
106
+ ...resultItem
107
+ };
108
+ } catch (e) {
109
+ console.warn('Failed to parse stored result:', e);
110
+ }
111
+ }
112
+ return msg;
113
+ }));
114
+ return restoredMessages;
115
+ } catch (error) {
116
+ console.error('Failed to load messages from localStorage:', error);
117
+ return [];
118
+ }
119
+ }
120
+ async clearMessages() {
121
+ try {
122
+ localStorage.removeItem(this.messagesKey);
123
+ const keys = Object.keys(localStorage);
124
+ keys.forEach((key)=>{
125
+ if (key.startsWith(this.resultsKey)) localStorage.removeItem(key);
126
+ });
127
+ } catch (error) {
128
+ console.error('Failed to clear messages from localStorage:', error);
129
+ }
130
+ }
131
+ async saveResult(id, result) {
132
+ try {
133
+ const resultKey = `${this.resultsKey}-${id}`;
134
+ localStorage.setItem(resultKey, JSON.stringify(result));
135
+ } catch (error) {
136
+ if (error instanceof DOMException && 'QuotaExceededError' === error.name) {
137
+ console.warn('LocalStorage quota exceeded when saving result, clearing old results...');
138
+ await this.handleQuotaExceeded();
139
+ try {
140
+ const resultKey = `${this.resultsKey}-${id}`;
141
+ localStorage.setItem(resultKey, JSON.stringify(result));
142
+ } catch (retryError) {
143
+ console.error('Failed to save result even after clearing storage:', retryError);
144
+ }
145
+ } else console.error('Failed to save result to localStorage:', error);
146
+ }
147
+ }
148
+ async handleQuotaExceeded() {
149
+ try {
150
+ const keys = Object.keys(localStorage);
151
+ const resultKeys = keys.filter((key)=>key.startsWith(this.resultsKey));
152
+ const keysToRemove = resultKeys.slice(0, Math.max(1, Math.floor(resultKeys.length / 2)));
153
+ keysToRemove.forEach((key)=>{
154
+ localStorage.removeItem(key);
155
+ });
156
+ console.info(`Cleared ${keysToRemove.length} old result entries to free up storage space`);
157
+ const playgroundKeys = keys.filter((key)=>key.includes('playground') || key.includes('agent') || key.startsWith('midscene'));
158
+ if (playgroundKeys.length > 10) {
159
+ const additionalKeysToRemove = playgroundKeys.slice(0, Math.floor(playgroundKeys.length / 3));
160
+ additionalKeysToRemove.forEach((key)=>{
161
+ if (key !== this.messagesKey) localStorage.removeItem(key);
162
+ });
163
+ console.info(`Cleared ${additionalKeysToRemove.length} additional playground-related entries`);
164
+ }
165
+ } catch (error) {
166
+ console.error('Failed to handle quota exceeded:', error);
167
+ }
168
+ }
169
+ constructor(namespace = 'playground'){
170
+ _define_property(this, "messagesKey", void 0);
171
+ _define_property(this, "resultsKey", void 0);
172
+ _define_property(this, "maxStorageItems", 50);
173
+ this.messagesKey = `${namespace}-messages`;
174
+ this.resultsKey = `${namespace}-results`;
175
+ }
176
+ }
177
+ class MemoryStorageProvider {
178
+ async saveMessages(messages) {
179
+ this.messages = [
180
+ ...messages
181
+ ];
182
+ }
183
+ async loadMessages() {
184
+ return [
185
+ ...this.messages
186
+ ];
187
+ }
188
+ async clearMessages() {
189
+ this.messages = [];
190
+ this.results.clear();
191
+ }
192
+ async saveResult(id, result) {
193
+ this.results.set(id, result);
194
+ }
195
+ constructor(){
196
+ _define_property(this, "messages", []);
197
+ _define_property(this, "results", new Map());
198
+ }
199
+ }
200
+ class NoOpStorageProvider {
201
+ async saveMessages(_messages) {}
202
+ async loadMessages() {
203
+ return [];
204
+ }
205
+ async clearMessages() {}
206
+ async saveResult(_id, _result) {}
207
+ }
208
+ var storage_provider_StorageType = /*#__PURE__*/ function(StorageType) {
209
+ StorageType["INDEXEDDB"] = "indexeddb";
210
+ StorageType["LOCALSTORAGE"] = "localStorage";
211
+ StorageType["MEMORY"] = "memory";
212
+ StorageType["NONE"] = "none";
213
+ return StorageType;
214
+ }({});
215
+ function createStorageProvider() {
216
+ let type = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "indexeddb", namespace = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 'playground';
217
+ switch(type){
218
+ case "indexeddb":
219
+ if ('undefined' != typeof indexedDB) return new external_indexeddb_storage_provider_js_namespaceObject.IndexedDBStorageProvider(namespace);
220
+ console.warn('IndexedDB not available, falling back to localStorage');
221
+ return createStorageProvider("localStorage", namespace);
222
+ case "localStorage":
223
+ if ('undefined' != typeof localStorage) return new LocalStorageProvider(namespace);
224
+ console.warn('localStorage not available, falling back to memory storage');
225
+ return createStorageProvider("memory", namespace);
226
+ case "memory":
227
+ return new MemoryStorageProvider();
228
+ case "none":
229
+ return new NoOpStorageProvider();
230
+ default:
231
+ throw new Error(`Unknown storage type: ${type}`);
232
+ }
233
+ }
234
+ function detectBestStorageType() {
235
+ if ('undefined' != typeof indexedDB) try {
236
+ indexedDB.open('test', 1).onerror = ()=>{};
237
+ return "indexeddb";
238
+ } catch (e) {}
239
+ if ('undefined' != typeof localStorage) try {
240
+ localStorage.setItem('test', 'test');
241
+ localStorage.removeItem('test');
242
+ return "localStorage";
243
+ } catch (e) {}
244
+ return "memory";
245
+ }
246
+ exports.IndexedDBMemoryStorageProvider = __webpack_exports__.IndexedDBMemoryStorageProvider;
247
+ exports.IndexedDBNoOpStorageProvider = __webpack_exports__.IndexedDBNoOpStorageProvider;
248
+ exports.IndexedDBStorageProvider = __webpack_exports__.IndexedDBStorageProvider;
249
+ exports.LocalStorageProvider = __webpack_exports__.LocalStorageProvider;
250
+ exports.MemoryStorageProvider = __webpack_exports__.MemoryStorageProvider;
251
+ exports.NoOpStorageProvider = __webpack_exports__.NoOpStorageProvider;
252
+ exports.StorageType = __webpack_exports__.StorageType;
253
+ exports.createStorageProvider = __webpack_exports__.createStorageProvider;
254
+ exports.detectBestStorageType = __webpack_exports__.detectBestStorageType;
255
+ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
256
+ "IndexedDBMemoryStorageProvider",
257
+ "IndexedDBNoOpStorageProvider",
258
+ "IndexedDBStorageProvider",
259
+ "LocalStorageProvider",
260
+ "MemoryStorageProvider",
261
+ "NoOpStorageProvider",
262
+ "StorageType",
263
+ "createStorageProvider",
264
+ "detectBestStorageType"
265
+ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
266
+ Object.defineProperty(exports, '__esModule', {
267
+ value: true
268
+ });