@godscene/visualizer 1.7.11
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.
- package/LICENSE +21 -0
- package/README.md +9 -0
- package/dist/es/component/blackboard/highlights.mjs +47 -0
- package/dist/es/component/blackboard/index.css +118 -0
- package/dist/es/component/blackboard/index.mjs +122 -0
- package/dist/es/component/config-selector/index.mjs +251 -0
- package/dist/es/component/context-preview/index.mjs +37 -0
- package/dist/es/component/env-config/index.mjs +237 -0
- package/dist/es/component/env-config-reminder/index.css +30 -0
- package/dist/es/component/env-config-reminder/index.mjs +27 -0
- package/dist/es/component/form-field/index.mjs +158 -0
- package/dist/es/component/history-selector/index.css +237 -0
- package/dist/es/component/history-selector/index.mjs +197 -0
- package/dist/es/component/index.mjs +1 -0
- package/dist/es/component/logo/index.css +19 -0
- package/dist/es/component/logo/index.mjs +20 -0
- package/dist/es/component/logo/logo.mjs +2 -0
- package/dist/es/component/misc/index.mjs +96 -0
- package/dist/es/component/nav-actions/index.mjs +14 -0
- package/dist/es/component/nav-actions/style.css +35 -0
- package/dist/es/component/player/index.css +296 -0
- package/dist/es/component/player/index.mjs +702 -0
- package/dist/es/component/player/playback-controls.mjs +4 -0
- package/dist/es/component/player/report-download.mjs +61 -0
- package/dist/es/component/player/scenes/StepScene.mjs +194 -0
- package/dist/es/component/player/scenes/derive-frame-state.mjs +229 -0
- package/dist/es/component/player/scenes/export-branded-video.mjs +360 -0
- package/dist/es/component/player/scenes/frame-calculator.mjs +149 -0
- package/dist/es/component/player/scenes/playback-frame.mjs +6 -0
- package/dist/es/component/player/scenes/playback-layout.mjs +12 -0
- package/dist/es/component/player/scenes/pointer-layout.mjs +36 -0
- package/dist/es/component/player/use-frame-player.mjs +87 -0
- package/dist/es/component/playground/index.css +930 -0
- package/dist/es/component/playground/playground-demo-ui-context.json +290 -0
- package/dist/es/component/playground-result/index.css +92 -0
- package/dist/es/component/playground-result/index.mjs +232 -0
- package/dist/es/component/prompt-input/index.css +832 -0
- package/dist/es/component/prompt-input/index.mjs +959 -0
- package/dist/es/component/screenshot-viewer/index.css +237 -0
- package/dist/es/component/screenshot-viewer/index.mjs +319 -0
- package/dist/es/component/service-mode-control/index.mjs +107 -0
- package/dist/es/component/shiny-text/index.css +107 -0
- package/dist/es/component/shiny-text/index.mjs +15 -0
- package/dist/es/component/universal-playground/empty-state.mjs +5 -0
- package/dist/es/component/universal-playground/index.css +619 -0
- package/dist/es/component/universal-playground/index.mjs +558 -0
- package/dist/es/component/universal-playground/providers/context-provider.mjs +90 -0
- package/dist/es/component/universal-playground/providers/indexeddb-storage-provider.mjs +280 -0
- package/dist/es/component/universal-playground/providers/storage-provider.mjs +279 -0
- package/dist/es/component/universal-playground/universal-playground-electron.mjs +668 -0
- package/dist/es/hooks/useMinimalTypeGate.mjs +47 -0
- package/dist/es/hooks/usePlaygroundExecution.mjs +435 -0
- package/dist/es/hooks/usePlaygroundState.mjs +278 -0
- package/dist/es/hooks/useSafeOverrideAIConfig.mjs +20 -0
- package/dist/es/hooks/useServerValid.mjs +55 -0
- package/dist/es/hooks/useTheme.mjs +25 -0
- package/dist/es/icons/action-chevron.mjs +61 -0
- package/dist/es/icons/avatar.mjs +70 -0
- package/dist/es/icons/close.mjs +61 -0
- package/dist/es/icons/global-perspective.mjs +58 -0
- package/dist/es/icons/history.mjs +72 -0
- package/dist/es/icons/magnifying-glass.mjs +81 -0
- package/dist/es/icons/player-setting.mjs +68 -0
- package/dist/es/icons/prompt-history.mjs +70 -0
- package/dist/es/icons/setting.mjs +62 -0
- package/dist/es/icons/show-marker.mjs +58 -0
- package/dist/es/index.mjs +26 -0
- package/dist/es/static/image/logo.png +0 -0
- package/dist/es/store/history.mjs +128 -0
- package/dist/es/store/store.mjs +277 -0
- package/dist/es/types.mjs +73 -0
- package/dist/es/utils/action-label.mjs +15 -0
- package/dist/es/utils/color.mjs +35 -0
- package/dist/es/utils/constants.mjs +99 -0
- package/dist/es/utils/device-capabilities.mjs +13 -0
- package/dist/es/utils/empty-state-scroll.mjs +8 -0
- package/dist/es/utils/highlight-element.mjs +62 -0
- package/dist/es/utils/index.mjs +13 -0
- package/dist/es/utils/playground-utils.mjs +43 -0
- package/dist/es/utils/progress-action-icon.mjs +30 -0
- package/dist/es/utils/prompt-input-utils.mjs +49 -0
- package/dist/es/utils/prompt-placeholder.mjs +19 -0
- package/dist/es/utils/replay-scripts.mjs +428 -0
- package/dist/lib/component/blackboard/highlights.js +84 -0
- package/dist/lib/component/blackboard/index.css +118 -0
- package/dist/lib/component/blackboard/index.js +169 -0
- package/dist/lib/component/config-selector/index.js +295 -0
- package/dist/lib/component/context-preview/index.js +82 -0
- package/dist/lib/component/env-config/index.js +271 -0
- package/dist/lib/component/env-config-reminder/index.css +30 -0
- package/dist/lib/component/env-config-reminder/index.js +61 -0
- package/dist/lib/component/form-field/index.js +204 -0
- package/dist/lib/component/history-selector/index.css +237 -0
- package/dist/lib/component/history-selector/index.js +243 -0
- package/dist/lib/component/index.js +58 -0
- package/dist/lib/component/logo/index.css +19 -0
- package/dist/lib/component/logo/index.js +67 -0
- package/dist/lib/component/logo/logo.js +24 -0
- package/dist/lib/component/misc/index.js +152 -0
- package/dist/lib/component/nav-actions/index.js +48 -0
- package/dist/lib/component/nav-actions/style.css +35 -0
- package/dist/lib/component/player/index.css +296 -0
- package/dist/lib/component/player/index.js +747 -0
- package/dist/lib/component/player/playback-controls.js +38 -0
- package/dist/lib/component/player/report-download.js +98 -0
- package/dist/lib/component/player/scenes/StepScene.js +228 -0
- package/dist/lib/component/player/scenes/derive-frame-state.js +266 -0
- package/dist/lib/component/player/scenes/export-branded-video.js +403 -0
- package/dist/lib/component/player/scenes/frame-calculator.js +186 -0
- package/dist/lib/component/player/scenes/playback-frame.js +40 -0
- package/dist/lib/component/player/scenes/playback-layout.js +46 -0
- package/dist/lib/component/player/scenes/pointer-layout.js +88 -0
- package/dist/lib/component/player/use-frame-player.js +121 -0
- package/dist/lib/component/playground/index.css +930 -0
- package/dist/lib/component/playground/playground-demo-ui-context.json +290 -0
- package/dist/lib/component/playground-result/index.css +92 -0
- package/dist/lib/component/playground-result/index.js +276 -0
- package/dist/lib/component/prompt-input/index.css +832 -0
- package/dist/lib/component/prompt-input/index.js +1005 -0
- package/dist/lib/component/screenshot-viewer/index.css +237 -0
- package/dist/lib/component/screenshot-viewer/index.js +353 -0
- package/dist/lib/component/service-mode-control/index.js +141 -0
- package/dist/lib/component/shiny-text/index.css +107 -0
- package/dist/lib/component/shiny-text/index.js +49 -0
- package/dist/lib/component/universal-playground/empty-state.js +39 -0
- package/dist/lib/component/universal-playground/index.css +619 -0
- package/dist/lib/component/universal-playground/index.js +607 -0
- package/dist/lib/component/universal-playground/providers/context-provider.js +133 -0
- package/dist/lib/component/universal-playground/providers/indexeddb-storage-provider.js +320 -0
- package/dist/lib/component/universal-playground/providers/storage-provider.js +337 -0
- package/dist/lib/component/universal-playground/universal-playground-electron.js +717 -0
- package/dist/lib/hooks/useMinimalTypeGate.js +81 -0
- package/dist/lib/hooks/usePlaygroundExecution.js +478 -0
- package/dist/lib/hooks/usePlaygroundState.js +312 -0
- package/dist/lib/hooks/useSafeOverrideAIConfig.js +57 -0
- package/dist/lib/hooks/useServerValid.js +89 -0
- package/dist/lib/hooks/useTheme.js +59 -0
- package/dist/lib/icons/action-chevron.js +95 -0
- package/dist/lib/icons/avatar.js +104 -0
- package/dist/lib/icons/close.js +95 -0
- package/dist/lib/icons/global-perspective.js +92 -0
- package/dist/lib/icons/history.js +106 -0
- package/dist/lib/icons/magnifying-glass.js +115 -0
- package/dist/lib/icons/player-setting.js +102 -0
- package/dist/lib/icons/prompt-history.js +104 -0
- package/dist/lib/icons/setting.js +96 -0
- package/dist/lib/icons/show-marker.js +92 -0
- package/dist/lib/index.js +204 -0
- package/dist/lib/static/image/logo.png +0 -0
- package/dist/lib/store/history.js +135 -0
- package/dist/lib/store/store.js +287 -0
- package/dist/lib/types.js +119 -0
- package/dist/lib/utils/action-label.js +52 -0
- package/dist/lib/utils/color.js +75 -0
- package/dist/lib/utils/constants.js +172 -0
- package/dist/lib/utils/device-capabilities.js +50 -0
- package/dist/lib/utils/empty-state-scroll.js +42 -0
- package/dist/lib/utils/highlight-element.js +99 -0
- package/dist/lib/utils/index.js +69 -0
- package/dist/lib/utils/playground-utils.js +86 -0
- package/dist/lib/utils/progress-action-icon.js +67 -0
- package/dist/lib/utils/prompt-input-utils.js +89 -0
- package/dist/lib/utils/prompt-placeholder.js +53 -0
- package/dist/lib/utils/replay-scripts.js +474 -0
- package/dist/types/component/blackboard/highlights.d.ts +11 -0
- package/dist/types/component/blackboard/index.d.ts +10 -0
- package/dist/types/component/config-selector/index.d.ts +15 -0
- package/dist/types/component/context-preview/index.d.ts +9 -0
- package/dist/types/component/env-config/index.d.ts +8 -0
- package/dist/types/component/env-config-reminder/index.d.ts +6 -0
- package/dist/types/component/form-field/index.d.ts +17 -0
- package/dist/types/component/history-selector/index.d.ts +13 -0
- package/dist/types/component/index.d.ts +1 -0
- package/dist/types/component/logo/index.d.ts +5 -0
- package/dist/types/component/misc/index.d.ts +6 -0
- package/dist/types/component/nav-actions/index.d.ts +12 -0
- package/dist/types/component/player/index.d.ts +15 -0
- package/dist/types/component/player/playback-controls.d.ts +1 -0
- package/dist/types/component/player/report-download.d.ts +32 -0
- package/dist/types/component/player/scenes/StepScene.d.ts +9 -0
- package/dist/types/component/player/scenes/derive-frame-state.d.ts +40 -0
- package/dist/types/component/player/scenes/export-branded-video.d.ts +33 -0
- package/dist/types/component/player/scenes/frame-calculator.d.ts +40 -0
- package/dist/types/component/player/scenes/playback-frame.d.ts +3 -0
- package/dist/types/component/player/scenes/playback-layout.d.ts +7 -0
- package/dist/types/component/player/scenes/pointer-layout.d.ts +20 -0
- package/dist/types/component/player/use-frame-player.d.ts +17 -0
- package/dist/types/component/playground-result/index.d.ts +22 -0
- package/dist/types/component/prompt-input/index.d.ts +23 -0
- package/dist/types/component/screenshot-viewer/index.d.ts +23 -0
- package/dist/types/component/service-mode-control/index.d.ts +6 -0
- package/dist/types/component/shiny-text/index.d.ts +12 -0
- package/dist/types/component/universal-playground/empty-state.d.ts +3 -0
- package/dist/types/component/universal-playground/index.d.ts +4 -0
- package/dist/types/component/universal-playground/providers/context-provider.d.ts +37 -0
- package/dist/types/component/universal-playground/providers/indexeddb-storage-provider.d.ts +71 -0
- package/dist/types/component/universal-playground/providers/storage-provider.d.ts +58 -0
- package/dist/types/component/universal-playground/universal-playground-electron.d.ts +4 -0
- package/dist/types/hooks/useMinimalTypeGate.d.ts +72 -0
- package/dist/types/hooks/usePlaygroundExecution.d.ts +40 -0
- package/dist/types/hooks/usePlaygroundState.d.ts +26 -0
- package/dist/types/hooks/useSafeOverrideAIConfig.d.ts +16 -0
- package/dist/types/hooks/useServerValid.d.ts +1 -0
- package/dist/types/hooks/useTheme.d.ts +7 -0
- package/dist/types/index.d.ts +29 -0
- package/dist/types/store/history.d.ts +16 -0
- package/dist/types/store/store.d.ts +57 -0
- package/dist/types/types.d.ts +278 -0
- package/dist/types/utils/action-label.d.ts +11 -0
- package/dist/types/utils/color.d.ts +4 -0
- package/dist/types/utils/constants.d.ts +80 -0
- package/dist/types/utils/device-capabilities.d.ts +9 -0
- package/dist/types/utils/empty-state-scroll.d.ts +11 -0
- package/dist/types/utils/highlight-element.d.ts +3 -0
- package/dist/types/utils/index.d.ts +5 -0
- package/dist/types/utils/playground-utils.d.ts +11 -0
- package/dist/types/utils/progress-action-icon.d.ts +12 -0
- package/dist/types/utils/prompt-input-utils.d.ts +24 -0
- package/dist/types/utils/prompt-placeholder.d.ts +1 -0
- package/dist/types/utils/replay-scripts.d.ts +50 -0
- package/package.json +82 -0
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import { IndexedDBManager, createCleanupFunction, withErrorHandling } from "@godscene/shared/baseDB";
|
|
2
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
3
|
+
try {
|
|
4
|
+
var info = gen[key](arg);
|
|
5
|
+
var value = info.value;
|
|
6
|
+
} catch (error) {
|
|
7
|
+
reject(error);
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
if (info.done) resolve(value);
|
|
11
|
+
else Promise.resolve(value).then(_next, _throw);
|
|
12
|
+
}
|
|
13
|
+
function _async_to_generator(fn) {
|
|
14
|
+
return function() {
|
|
15
|
+
var self = this, args = arguments;
|
|
16
|
+
return new Promise(function(resolve, reject) {
|
|
17
|
+
var gen = fn.apply(self, args);
|
|
18
|
+
function _next(value) {
|
|
19
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
|
|
20
|
+
}
|
|
21
|
+
function _throw(err) {
|
|
22
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
|
|
23
|
+
}
|
|
24
|
+
_next(void 0);
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function _define_property(obj, key, value) {
|
|
29
|
+
if (key in obj) Object.defineProperty(obj, key, {
|
|
30
|
+
value: value,
|
|
31
|
+
enumerable: true,
|
|
32
|
+
configurable: true,
|
|
33
|
+
writable: true
|
|
34
|
+
});
|
|
35
|
+
else obj[key] = value;
|
|
36
|
+
return obj;
|
|
37
|
+
}
|
|
38
|
+
function _object_spread(target) {
|
|
39
|
+
for(var i = 1; i < arguments.length; i++){
|
|
40
|
+
var source = null != arguments[i] ? arguments[i] : {};
|
|
41
|
+
var ownKeys = Object.keys(source);
|
|
42
|
+
if ("function" == typeof Object.getOwnPropertySymbols) ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
|
|
43
|
+
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
|
|
44
|
+
}));
|
|
45
|
+
ownKeys.forEach(function(key) {
|
|
46
|
+
_define_property(target, key, source[key]);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
return target;
|
|
50
|
+
}
|
|
51
|
+
function indexeddb_storage_provider_ownKeys(object, enumerableOnly) {
|
|
52
|
+
var keys = Object.keys(object);
|
|
53
|
+
if (Object.getOwnPropertySymbols) {
|
|
54
|
+
var symbols = Object.getOwnPropertySymbols(object);
|
|
55
|
+
if (enumerableOnly) symbols = symbols.filter(function(sym) {
|
|
56
|
+
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
|
57
|
+
});
|
|
58
|
+
keys.push.apply(keys, symbols);
|
|
59
|
+
}
|
|
60
|
+
return keys;
|
|
61
|
+
}
|
|
62
|
+
function _object_spread_props(target, source) {
|
|
63
|
+
source = null != source ? source : {};
|
|
64
|
+
if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
|
|
65
|
+
else indexeddb_storage_provider_ownKeys(Object(source)).forEach(function(key) {
|
|
66
|
+
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
67
|
+
});
|
|
68
|
+
return target;
|
|
69
|
+
}
|
|
70
|
+
const DB_NAME = 'midscene_playground';
|
|
71
|
+
const DB_VERSION = 1;
|
|
72
|
+
const MESSAGES_STORE = 'playground_messages';
|
|
73
|
+
const RESULTS_STORE = 'playground_results';
|
|
74
|
+
const MAX_STORED_MESSAGES = 100;
|
|
75
|
+
const MAX_STORED_RESULTS = 50;
|
|
76
|
+
class IndexedDBStorageProvider {
|
|
77
|
+
saveMessages(messages) {
|
|
78
|
+
return _async_to_generator(function*() {
|
|
79
|
+
yield withErrorHandling(()=>_async_to_generator(function*() {
|
|
80
|
+
yield this.dbManager.clear(MESSAGES_STORE);
|
|
81
|
+
const messagesToSave = messages.slice(-MAX_STORED_MESSAGES);
|
|
82
|
+
yield Promise.all(messagesToSave.map((msg, index)=>{
|
|
83
|
+
const lightMessage = _object_spread_props(_object_spread({}, msg), {
|
|
84
|
+
result: 'result' === msg.type ? void 0 : msg.result
|
|
85
|
+
});
|
|
86
|
+
const data = {
|
|
87
|
+
id: msg.id || `msg-${index}`,
|
|
88
|
+
data: lightMessage,
|
|
89
|
+
timestamp: msg.timestamp ? msg.timestamp.getTime() : Date.now() + index
|
|
90
|
+
};
|
|
91
|
+
return this.dbManager.put(MESSAGES_STORE, data);
|
|
92
|
+
}));
|
|
93
|
+
}).call(this), 'Failed to save messages to IndexedDB', void 0, this.messagesCleanup);
|
|
94
|
+
}).call(this);
|
|
95
|
+
}
|
|
96
|
+
loadMessages() {
|
|
97
|
+
return _async_to_generator(function*() {
|
|
98
|
+
const result = yield withErrorHandling(()=>_async_to_generator(function*() {
|
|
99
|
+
const messages = yield this.dbManager.getAll(MESSAGES_STORE, true);
|
|
100
|
+
if (0 === messages.length) return [];
|
|
101
|
+
return Promise.all(messages.map((msg)=>_async_to_generator(function*() {
|
|
102
|
+
const item = msg.data;
|
|
103
|
+
const restoredItem = _object_spread_props(_object_spread({}, item), {
|
|
104
|
+
timestamp: new Date(item.timestamp)
|
|
105
|
+
});
|
|
106
|
+
if ('result' === item.type && item.id) {
|
|
107
|
+
const fullResult = yield this.loadResult(item.id);
|
|
108
|
+
if (fullResult) {
|
|
109
|
+
restoredItem.result = fullResult.result;
|
|
110
|
+
restoredItem.replayScriptsInfo = fullResult.replayScriptsInfo;
|
|
111
|
+
restoredItem.replayCounter = fullResult.replayCounter;
|
|
112
|
+
restoredItem.verticalMode = fullResult.verticalMode;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return restoredItem;
|
|
116
|
+
}).call(this)));
|
|
117
|
+
}).call(this), 'Failed to load messages from IndexedDB', [], this.messagesCleanup);
|
|
118
|
+
return result || [];
|
|
119
|
+
}).call(this);
|
|
120
|
+
}
|
|
121
|
+
clearMessages() {
|
|
122
|
+
return _async_to_generator(function*() {
|
|
123
|
+
yield withErrorHandling(()=>_async_to_generator(function*() {
|
|
124
|
+
yield Promise.all([
|
|
125
|
+
this.dbManager.clear(MESSAGES_STORE),
|
|
126
|
+
this.dbManager.clear(RESULTS_STORE)
|
|
127
|
+
]);
|
|
128
|
+
}).call(this), 'Failed to clear messages from IndexedDB');
|
|
129
|
+
}).call(this);
|
|
130
|
+
}
|
|
131
|
+
saveResult(id, result) {
|
|
132
|
+
return _async_to_generator(function*() {
|
|
133
|
+
yield withErrorHandling(()=>_async_to_generator(function*() {
|
|
134
|
+
const compressedResult = this.compressResultForStorage(result);
|
|
135
|
+
const data = {
|
|
136
|
+
id,
|
|
137
|
+
data: compressedResult,
|
|
138
|
+
timestamp: Date.now(),
|
|
139
|
+
size: JSON.stringify(compressedResult).length
|
|
140
|
+
};
|
|
141
|
+
yield this.dbManager.put(RESULTS_STORE, data);
|
|
142
|
+
}).call(this), 'Failed to save result to IndexedDB', void 0, this.resultsCleanup);
|
|
143
|
+
}).call(this);
|
|
144
|
+
}
|
|
145
|
+
loadResult(id) {
|
|
146
|
+
return _async_to_generator(function*() {
|
|
147
|
+
const result = yield withErrorHandling(()=>_async_to_generator(function*() {
|
|
148
|
+
const data = yield this.dbManager.get(RESULTS_STORE, id);
|
|
149
|
+
return (null == data ? void 0 : data.data) || null;
|
|
150
|
+
}).call(this), 'Failed to load result from IndexedDB', null);
|
|
151
|
+
return result || null;
|
|
152
|
+
}).call(this);
|
|
153
|
+
}
|
|
154
|
+
compressResultForStorage(result) {
|
|
155
|
+
var _result_result_dump, _result_result;
|
|
156
|
+
if (!(null == (_result_result = result.result) ? void 0 : null == (_result_result_dump = _result_result.dump) ? void 0 : _result_result_dump.tasks)) return result;
|
|
157
|
+
const compressedTasks = result.result.dump.tasks.map((task)=>{
|
|
158
|
+
var _task_recorder;
|
|
159
|
+
return _object_spread_props(_object_spread({}, task), {
|
|
160
|
+
uiContext: task.uiContext ? _object_spread_props(_object_spread({}, task.uiContext), {
|
|
161
|
+
screenshot: task.uiContext.screenshot
|
|
162
|
+
}) : task.uiContext,
|
|
163
|
+
recorder: null == (_task_recorder = task.recorder) ? void 0 : _task_recorder.map((record)=>_object_spread_props(_object_spread({}, record), {
|
|
164
|
+
screenshot: record.screenshot
|
|
165
|
+
}))
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
return _object_spread_props(_object_spread({}, result), {
|
|
169
|
+
result: _object_spread_props(_object_spread({}, result.result), {
|
|
170
|
+
dump: _object_spread_props(_object_spread({}, result.result.dump), {
|
|
171
|
+
tasks: compressedTasks
|
|
172
|
+
})
|
|
173
|
+
})
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
compressScreenshotIfNeeded(screenshot) {
|
|
177
|
+
if (!screenshot) return screenshot;
|
|
178
|
+
if (screenshot.length > 1048576) {
|
|
179
|
+
const sizeKB = Math.round(screenshot.length / 1024);
|
|
180
|
+
return `[COMPRESSED: ${sizeKB}KB screenshot removed for storage]`;
|
|
181
|
+
}
|
|
182
|
+
return screenshot;
|
|
183
|
+
}
|
|
184
|
+
getStorageStats() {
|
|
185
|
+
return _async_to_generator(function*() {
|
|
186
|
+
const result = yield withErrorHandling(()=>_async_to_generator(function*() {
|
|
187
|
+
const [messageCount, resultCount] = yield Promise.all([
|
|
188
|
+
this.dbManager.count(MESSAGES_STORE),
|
|
189
|
+
this.dbManager.count(RESULTS_STORE)
|
|
190
|
+
]);
|
|
191
|
+
return {
|
|
192
|
+
messageCount,
|
|
193
|
+
resultCount
|
|
194
|
+
};
|
|
195
|
+
}).call(this), 'Failed to get storage statistics', {
|
|
196
|
+
messageCount: 0,
|
|
197
|
+
resultCount: 0
|
|
198
|
+
});
|
|
199
|
+
return result || {
|
|
200
|
+
messageCount: 0,
|
|
201
|
+
resultCount: 0
|
|
202
|
+
};
|
|
203
|
+
}).call(this);
|
|
204
|
+
}
|
|
205
|
+
cleanup() {
|
|
206
|
+
return _async_to_generator(function*() {
|
|
207
|
+
yield Promise.all([
|
|
208
|
+
this.messagesCleanup(),
|
|
209
|
+
this.resultsCleanup()
|
|
210
|
+
]);
|
|
211
|
+
}).call(this);
|
|
212
|
+
}
|
|
213
|
+
constructor(namespace = 'playground'){
|
|
214
|
+
_define_property(this, "dbManager", void 0);
|
|
215
|
+
_define_property(this, "namespace", void 0);
|
|
216
|
+
_define_property(this, "messagesCleanup", void 0);
|
|
217
|
+
_define_property(this, "resultsCleanup", void 0);
|
|
218
|
+
this.namespace = namespace;
|
|
219
|
+
this.dbManager = new IndexedDBManager(`${DB_NAME}_${namespace}`, DB_VERSION, [
|
|
220
|
+
{
|
|
221
|
+
name: MESSAGES_STORE,
|
|
222
|
+
keyPath: 'id'
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
name: RESULTS_STORE,
|
|
226
|
+
keyPath: 'id'
|
|
227
|
+
}
|
|
228
|
+
]);
|
|
229
|
+
this.messagesCleanup = createCleanupFunction(this.dbManager, MESSAGES_STORE, MAX_STORED_MESSAGES);
|
|
230
|
+
this.resultsCleanup = createCleanupFunction(this.dbManager, RESULTS_STORE, MAX_STORED_RESULTS);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
class MemoryStorageProvider {
|
|
234
|
+
saveMessages(messages) {
|
|
235
|
+
return _async_to_generator(function*() {
|
|
236
|
+
this.messages = [
|
|
237
|
+
...messages
|
|
238
|
+
];
|
|
239
|
+
}).call(this);
|
|
240
|
+
}
|
|
241
|
+
loadMessages() {
|
|
242
|
+
return _async_to_generator(function*() {
|
|
243
|
+
return [
|
|
244
|
+
...this.messages
|
|
245
|
+
];
|
|
246
|
+
}).call(this);
|
|
247
|
+
}
|
|
248
|
+
clearMessages() {
|
|
249
|
+
return _async_to_generator(function*() {
|
|
250
|
+
this.messages = [];
|
|
251
|
+
this.results.clear();
|
|
252
|
+
}).call(this);
|
|
253
|
+
}
|
|
254
|
+
saveResult(id, result) {
|
|
255
|
+
return _async_to_generator(function*() {
|
|
256
|
+
this.results.set(id, result);
|
|
257
|
+
}).call(this);
|
|
258
|
+
}
|
|
259
|
+
constructor(){
|
|
260
|
+
_define_property(this, "messages", []);
|
|
261
|
+
_define_property(this, "results", new Map());
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
class NoOpStorageProvider {
|
|
265
|
+
saveMessages(_messages) {
|
|
266
|
+
return _async_to_generator(function*() {})();
|
|
267
|
+
}
|
|
268
|
+
loadMessages() {
|
|
269
|
+
return _async_to_generator(function*() {
|
|
270
|
+
return [];
|
|
271
|
+
})();
|
|
272
|
+
}
|
|
273
|
+
clearMessages() {
|
|
274
|
+
return _async_to_generator(function*() {})();
|
|
275
|
+
}
|
|
276
|
+
saveResult(_id, _result) {
|
|
277
|
+
return _async_to_generator(function*() {})();
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
export { IndexedDBStorageProvider, MemoryStorageProvider, NoOpStorageProvider };
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import { IndexedDBStorageProvider, MemoryStorageProvider, NoOpStorageProvider } from "./indexeddb-storage-provider.mjs";
|
|
2
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
3
|
+
try {
|
|
4
|
+
var info = gen[key](arg);
|
|
5
|
+
var value = info.value;
|
|
6
|
+
} catch (error) {
|
|
7
|
+
reject(error);
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
if (info.done) resolve(value);
|
|
11
|
+
else Promise.resolve(value).then(_next, _throw);
|
|
12
|
+
}
|
|
13
|
+
function _async_to_generator(fn) {
|
|
14
|
+
return function() {
|
|
15
|
+
var self = this, args = arguments;
|
|
16
|
+
return new Promise(function(resolve, reject) {
|
|
17
|
+
var gen = fn.apply(self, args);
|
|
18
|
+
function _next(value) {
|
|
19
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
|
|
20
|
+
}
|
|
21
|
+
function _throw(err) {
|
|
22
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
|
|
23
|
+
}
|
|
24
|
+
_next(void 0);
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function _define_property(obj, key, value) {
|
|
29
|
+
if (key in obj) Object.defineProperty(obj, key, {
|
|
30
|
+
value: value,
|
|
31
|
+
enumerable: true,
|
|
32
|
+
configurable: true,
|
|
33
|
+
writable: true
|
|
34
|
+
});
|
|
35
|
+
else obj[key] = value;
|
|
36
|
+
return obj;
|
|
37
|
+
}
|
|
38
|
+
function _object_spread(target) {
|
|
39
|
+
for(var i = 1; i < arguments.length; i++){
|
|
40
|
+
var source = null != arguments[i] ? arguments[i] : {};
|
|
41
|
+
var ownKeys = Object.keys(source);
|
|
42
|
+
if ("function" == typeof Object.getOwnPropertySymbols) ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
|
|
43
|
+
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
|
|
44
|
+
}));
|
|
45
|
+
ownKeys.forEach(function(key) {
|
|
46
|
+
_define_property(target, key, source[key]);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
return target;
|
|
50
|
+
}
|
|
51
|
+
function storage_provider_ownKeys(object, enumerableOnly) {
|
|
52
|
+
var keys = Object.keys(object);
|
|
53
|
+
if (Object.getOwnPropertySymbols) {
|
|
54
|
+
var symbols = Object.getOwnPropertySymbols(object);
|
|
55
|
+
if (enumerableOnly) symbols = symbols.filter(function(sym) {
|
|
56
|
+
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
|
57
|
+
});
|
|
58
|
+
keys.push.apply(keys, symbols);
|
|
59
|
+
}
|
|
60
|
+
return keys;
|
|
61
|
+
}
|
|
62
|
+
function _object_spread_props(target, source) {
|
|
63
|
+
source = null != source ? source : {};
|
|
64
|
+
if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
|
|
65
|
+
else storage_provider_ownKeys(Object(source)).forEach(function(key) {
|
|
66
|
+
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
67
|
+
});
|
|
68
|
+
return target;
|
|
69
|
+
}
|
|
70
|
+
class LocalStorageProvider {
|
|
71
|
+
checkStorageSpace() {
|
|
72
|
+
try {
|
|
73
|
+
const testKey = 'storage-test';
|
|
74
|
+
const testData = 'x'.repeat(102400);
|
|
75
|
+
localStorage.setItem(testKey, testData);
|
|
76
|
+
localStorage.removeItem(testKey);
|
|
77
|
+
return true;
|
|
78
|
+
} catch (unused) {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
saveMessages(messages) {
|
|
83
|
+
return _async_to_generator(function*() {
|
|
84
|
+
try {
|
|
85
|
+
if (!this.checkStorageSpace()) {
|
|
86
|
+
console.warn('Low storage space detected, clearing old data...');
|
|
87
|
+
yield this.handleQuotaExceeded();
|
|
88
|
+
}
|
|
89
|
+
const messagesToSave = messages.slice(-this.maxStorageItems);
|
|
90
|
+
const lightMessages = messagesToSave.map((msg)=>_object_spread_props(_object_spread({}, msg), {
|
|
91
|
+
result: 'result' === msg.type ? void 0 : msg.result
|
|
92
|
+
}));
|
|
93
|
+
const messageData = JSON.stringify(lightMessages);
|
|
94
|
+
localStorage.setItem(this.messagesKey, messageData);
|
|
95
|
+
} catch (error) {
|
|
96
|
+
if (error instanceof DOMException && 'QuotaExceededError' === error.name) {
|
|
97
|
+
console.warn('LocalStorage quota exceeded, attempting to clear old data and retry...');
|
|
98
|
+
yield this.handleQuotaExceeded();
|
|
99
|
+
try {
|
|
100
|
+
const recentMessages = messages.slice(-10);
|
|
101
|
+
const lightRecentMessages = recentMessages.map((msg)=>_object_spread_props(_object_spread({}, msg), {
|
|
102
|
+
result: 'result' === msg.type ? void 0 : msg.result
|
|
103
|
+
}));
|
|
104
|
+
const messageData = JSON.stringify(lightRecentMessages);
|
|
105
|
+
localStorage.setItem(this.messagesKey, messageData);
|
|
106
|
+
console.info('Successfully saved recent messages after clearing storage');
|
|
107
|
+
} catch (retryError) {
|
|
108
|
+
console.error('Failed to save even after clearing storage:', retryError);
|
|
109
|
+
yield this.clearMessages();
|
|
110
|
+
}
|
|
111
|
+
} else console.error('Failed to save messages to localStorage:', error);
|
|
112
|
+
}
|
|
113
|
+
}).call(this);
|
|
114
|
+
}
|
|
115
|
+
loadMessages() {
|
|
116
|
+
return _async_to_generator(function*() {
|
|
117
|
+
try {
|
|
118
|
+
const stored = localStorage.getItem(this.messagesKey);
|
|
119
|
+
if (!stored) return [];
|
|
120
|
+
const messages = JSON.parse(stored);
|
|
121
|
+
const restoredMessages = yield Promise.all(messages.map((msg)=>_async_to_generator(function*() {
|
|
122
|
+
if ('result' === msg.type && msg.id) {
|
|
123
|
+
const resultKey = `${this.resultsKey}-${msg.id}`;
|
|
124
|
+
const storedResult = localStorage.getItem(resultKey);
|
|
125
|
+
if (storedResult) try {
|
|
126
|
+
const resultItem = JSON.parse(storedResult);
|
|
127
|
+
return _object_spread({}, msg, resultItem);
|
|
128
|
+
} catch (e) {
|
|
129
|
+
console.warn('Failed to parse stored result:', e);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return msg;
|
|
133
|
+
}).call(this)));
|
|
134
|
+
return restoredMessages;
|
|
135
|
+
} catch (error) {
|
|
136
|
+
console.error('Failed to load messages from localStorage:', error);
|
|
137
|
+
return [];
|
|
138
|
+
}
|
|
139
|
+
}).call(this);
|
|
140
|
+
}
|
|
141
|
+
clearMessages() {
|
|
142
|
+
return _async_to_generator(function*() {
|
|
143
|
+
try {
|
|
144
|
+
localStorage.removeItem(this.messagesKey);
|
|
145
|
+
const keys = Object.keys(localStorage);
|
|
146
|
+
keys.forEach((key)=>{
|
|
147
|
+
if (key.startsWith(this.resultsKey)) localStorage.removeItem(key);
|
|
148
|
+
});
|
|
149
|
+
} catch (error) {
|
|
150
|
+
console.error('Failed to clear messages from localStorage:', error);
|
|
151
|
+
}
|
|
152
|
+
}).call(this);
|
|
153
|
+
}
|
|
154
|
+
saveResult(id, result) {
|
|
155
|
+
return _async_to_generator(function*() {
|
|
156
|
+
try {
|
|
157
|
+
const resultKey = `${this.resultsKey}-${id}`;
|
|
158
|
+
localStorage.setItem(resultKey, JSON.stringify(result));
|
|
159
|
+
} catch (error) {
|
|
160
|
+
if (error instanceof DOMException && 'QuotaExceededError' === error.name) {
|
|
161
|
+
console.warn('LocalStorage quota exceeded when saving result, clearing old results...');
|
|
162
|
+
yield this.handleQuotaExceeded();
|
|
163
|
+
try {
|
|
164
|
+
const resultKey = `${this.resultsKey}-${id}`;
|
|
165
|
+
localStorage.setItem(resultKey, JSON.stringify(result));
|
|
166
|
+
} catch (retryError) {
|
|
167
|
+
console.error('Failed to save result even after clearing storage:', retryError);
|
|
168
|
+
}
|
|
169
|
+
} else console.error('Failed to save result to localStorage:', error);
|
|
170
|
+
}
|
|
171
|
+
}).call(this);
|
|
172
|
+
}
|
|
173
|
+
handleQuotaExceeded() {
|
|
174
|
+
return _async_to_generator(function*() {
|
|
175
|
+
try {
|
|
176
|
+
const keys = Object.keys(localStorage);
|
|
177
|
+
const resultKeys = keys.filter((key)=>key.startsWith(this.resultsKey));
|
|
178
|
+
const keysToRemove = resultKeys.slice(0, Math.max(1, Math.floor(resultKeys.length / 2)));
|
|
179
|
+
keysToRemove.forEach((key)=>{
|
|
180
|
+
localStorage.removeItem(key);
|
|
181
|
+
});
|
|
182
|
+
console.info(`Cleared ${keysToRemove.length} old result entries to free up storage space`);
|
|
183
|
+
const playgroundKeys = keys.filter((key)=>key.includes('playground') || key.includes('agent') || key.startsWith('midscene'));
|
|
184
|
+
if (playgroundKeys.length > 10) {
|
|
185
|
+
const additionalKeysToRemove = playgroundKeys.slice(0, Math.floor(playgroundKeys.length / 3));
|
|
186
|
+
additionalKeysToRemove.forEach((key)=>{
|
|
187
|
+
if (key !== this.messagesKey) localStorage.removeItem(key);
|
|
188
|
+
});
|
|
189
|
+
console.info(`Cleared ${additionalKeysToRemove.length} additional playground-related entries`);
|
|
190
|
+
}
|
|
191
|
+
} catch (error) {
|
|
192
|
+
console.error('Failed to handle quota exceeded:', error);
|
|
193
|
+
}
|
|
194
|
+
}).call(this);
|
|
195
|
+
}
|
|
196
|
+
constructor(namespace = 'playground'){
|
|
197
|
+
_define_property(this, "messagesKey", void 0);
|
|
198
|
+
_define_property(this, "resultsKey", void 0);
|
|
199
|
+
_define_property(this, "maxStorageItems", 50);
|
|
200
|
+
this.messagesKey = `${namespace}-messages`;
|
|
201
|
+
this.resultsKey = `${namespace}-results`;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
class storage_provider_MemoryStorageProvider {
|
|
205
|
+
saveMessages(messages) {
|
|
206
|
+
return _async_to_generator(function*() {
|
|
207
|
+
this.messages = [
|
|
208
|
+
...messages
|
|
209
|
+
];
|
|
210
|
+
}).call(this);
|
|
211
|
+
}
|
|
212
|
+
loadMessages() {
|
|
213
|
+
return _async_to_generator(function*() {
|
|
214
|
+
return [
|
|
215
|
+
...this.messages
|
|
216
|
+
];
|
|
217
|
+
}).call(this);
|
|
218
|
+
}
|
|
219
|
+
clearMessages() {
|
|
220
|
+
return _async_to_generator(function*() {
|
|
221
|
+
this.messages = [];
|
|
222
|
+
this.results.clear();
|
|
223
|
+
}).call(this);
|
|
224
|
+
}
|
|
225
|
+
saveResult(id, result) {
|
|
226
|
+
return _async_to_generator(function*() {
|
|
227
|
+
this.results.set(id, result);
|
|
228
|
+
}).call(this);
|
|
229
|
+
}
|
|
230
|
+
constructor(){
|
|
231
|
+
_define_property(this, "messages", []);
|
|
232
|
+
_define_property(this, "results", new Map());
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
class storage_provider_NoOpStorageProvider {
|
|
236
|
+
saveMessages(_messages) {
|
|
237
|
+
return _async_to_generator(function*() {})();
|
|
238
|
+
}
|
|
239
|
+
loadMessages() {
|
|
240
|
+
return _async_to_generator(function*() {
|
|
241
|
+
return [];
|
|
242
|
+
})();
|
|
243
|
+
}
|
|
244
|
+
clearMessages() {
|
|
245
|
+
return _async_to_generator(function*() {})();
|
|
246
|
+
}
|
|
247
|
+
saveResult(_id, _result) {
|
|
248
|
+
return _async_to_generator(function*() {})();
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
var storage_provider_StorageType = /*#__PURE__*/ function(StorageType) {
|
|
252
|
+
StorageType["INDEXEDDB"] = "indexeddb";
|
|
253
|
+
StorageType["LOCALSTORAGE"] = "localStorage";
|
|
254
|
+
StorageType["MEMORY"] = "memory";
|
|
255
|
+
StorageType["NONE"] = "none";
|
|
256
|
+
return StorageType;
|
|
257
|
+
}({});
|
|
258
|
+
function createStorageProvider(type = "indexeddb", namespace = 'playground') {
|
|
259
|
+
switch(type){
|
|
260
|
+
case "indexeddb":
|
|
261
|
+
if ("u" > typeof indexedDB) return new IndexedDBStorageProvider(namespace);
|
|
262
|
+
console.warn('IndexedDB not available, falling back to localStorage');
|
|
263
|
+
return createStorageProvider("localStorage", namespace);
|
|
264
|
+
case "localStorage":
|
|
265
|
+
if ("u" > typeof localStorage) return new LocalStorageProvider(namespace);
|
|
266
|
+
console.warn('localStorage not available, falling back to memory storage');
|
|
267
|
+
return createStorageProvider("memory", namespace);
|
|
268
|
+
case "memory":
|
|
269
|
+
return new storage_provider_MemoryStorageProvider();
|
|
270
|
+
case "none":
|
|
271
|
+
return new storage_provider_NoOpStorageProvider();
|
|
272
|
+
default:
|
|
273
|
+
throw new Error(`Unknown storage type: ${type}`);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
function detectBestStorageType() {
|
|
277
|
+
return "memory";
|
|
278
|
+
}
|
|
279
|
+
export { MemoryStorageProvider as IndexedDBMemoryStorageProvider, NoOpStorageProvider as IndexedDBNoOpStorageProvider, IndexedDBStorageProvider, LocalStorageProvider, storage_provider_MemoryStorageProvider as MemoryStorageProvider, storage_provider_NoOpStorageProvider as NoOpStorageProvider, storage_provider_StorageType as StorageType, createStorageProvider, detectBestStorageType };
|