ivoryos 0.1.19__py3-none-any.whl → 0.1.20__py3-none-any.whl
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.
Potentially problematic release.
This version of ivoryos might be problematic. Click here for more details.
- ivoryos/routes/design/design.py +3 -1
- ivoryos/routes/design/templates/design/experiment_run.html +29 -2
- ivoryos/static/js/socket_handler.js +10 -0
- ivoryos/utils/db_models.py +21 -3
- ivoryos/utils/script_runner.py +22 -17
- ivoryos/version.py +1 -1
- {ivoryos-0.1.19.dist-info → ivoryos-0.1.20.dist-info}/METADATA +6 -7
- {ivoryos-0.1.19.dist-info → ivoryos-0.1.20.dist-info}/RECORD +11 -11
- {ivoryos-0.1.19.dist-info → ivoryos-0.1.20.dist-info}/LICENSE +0 -0
- {ivoryos-0.1.19.dist-info → ivoryos-0.1.20.dist-info}/WHEEL +0 -0
- {ivoryos-0.1.19.dist-info → ivoryos-0.1.20.dist-info}/top_level.txt +0 -0
ivoryos/routes/design/design.py
CHANGED
|
@@ -280,6 +280,7 @@ def experiment_run():
|
|
|
280
280
|
try:
|
|
281
281
|
for key, func_str in exec_string.items():
|
|
282
282
|
exec(func_str)
|
|
283
|
+
line_collection = script.convert_to_lines(exec_string)
|
|
283
284
|
except Exception:
|
|
284
285
|
flash(f"Please check {key} syntax!!")
|
|
285
286
|
return redirect(url_for("design.experiment_builder"))
|
|
@@ -323,7 +324,8 @@ def experiment_run():
|
|
|
323
324
|
flash(f"WARNING: Duplicate in config entries.")
|
|
324
325
|
except Exception as e:
|
|
325
326
|
flash(e)
|
|
326
|
-
return render_template('experiment_run.html', script=script.script_dict, filename=filename,
|
|
327
|
+
return render_template('experiment_run.html', script=script.script_dict, filename=filename,
|
|
328
|
+
dot_py=exec_string, line_collection=line_collection,
|
|
327
329
|
return_list=return_list, config_list=config_list, config_file_list=config_file_list,
|
|
328
330
|
config_preview=config_preview, data_list=data_list, config_type_list=config_type_list,
|
|
329
331
|
no_deck_warning=no_deck_warning, dismiss=dismiss, design_buttons=design_buttons,
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
<div class="accordion-body">
|
|
29
29
|
{% if script['script'] or script['prep'] or script['cleanup'] %}
|
|
30
30
|
<div class="row">
|
|
31
|
-
<div class="col-lg-6 col-sm-12">
|
|
31
|
+
<div class="col-lg-6 col-sm-12" id="run-panel">
|
|
32
32
|
<ul class="nav nav-tabs" id="myTabs" role="tablist">
|
|
33
33
|
<li class="nav-item" role="presentation">
|
|
34
34
|
<a class="nav-link {{ 'disabled' if config_list else '' }} {{ 'active' if not config_list else '' }}" id="tab1-tab" data-bs-toggle="tab" href="#tab1" role="tab" aria-controls="tab1" aria-selected="false">Repeat</a>
|
|
@@ -217,6 +217,16 @@
|
|
|
217
217
|
</div>
|
|
218
218
|
</div>
|
|
219
219
|
</div>
|
|
220
|
+
<div class="col-lg-6 col-sm-12" id="code-panel" style="display: none;">
|
|
221
|
+
<p>
|
|
222
|
+
<h5>Progress:</h5>
|
|
223
|
+
{% for stype, script in line_collection.items() %}
|
|
224
|
+
{% for code in script %}
|
|
225
|
+
<pre style="margin: 0; padding: 0; line-height: 1;"><code class="python" id="{{ stype }}-{{ loop.index0 }}" >{{code}}</code></pre>
|
|
226
|
+
{% endfor %}
|
|
227
|
+
{% endfor %}
|
|
228
|
+
</p>
|
|
229
|
+
</div>
|
|
220
230
|
<div class="col-lg-6 col-sm-12 logging-panel">
|
|
221
231
|
<p>
|
|
222
232
|
<div class="p d-flex justify-content-between align-items-center">
|
|
@@ -237,7 +247,6 @@
|
|
|
237
247
|
<small><strong>Note:</strong> The current step cannot be paused or stopped until it completes. </small>
|
|
238
248
|
</div>
|
|
239
249
|
|
|
240
|
-
</p>
|
|
241
250
|
<div class="progress" role="progressbar" aria-label="Animated striped example" aria-valuenow="10" aria-valuemin="0" aria-valuemax="100">
|
|
242
251
|
<div id="progress-bar-inner" class="progress-bar progress-bar-striped progress-bar-animated"></div>
|
|
243
252
|
</div>
|
|
@@ -338,4 +347,22 @@
|
|
|
338
347
|
}
|
|
339
348
|
});
|
|
340
349
|
</script>
|
|
350
|
+
|
|
351
|
+
<script>
|
|
352
|
+
var socket = io.connect(window.location.origin);
|
|
353
|
+
|
|
354
|
+
socket.on('execution', function(data) {
|
|
355
|
+
// Remove highlighting from all lines
|
|
356
|
+
document.querySelectorAll('pre code').forEach(el => el.style.backgroundColor = '');
|
|
357
|
+
|
|
358
|
+
// Get the currently executing line and highlight it
|
|
359
|
+
let executingLine = document.getElementById(data.section);
|
|
360
|
+
if (executingLine) {
|
|
361
|
+
executingLine.style.backgroundColor = '#cce5ff'; // Highlight
|
|
362
|
+
executingLine.style.transition = 'background-color 0.3s ease-in-out';
|
|
363
|
+
|
|
364
|
+
}
|
|
365
|
+
});
|
|
366
|
+
</script>
|
|
367
|
+
|
|
341
368
|
{% endblock %}
|
|
@@ -10,11 +10,21 @@ document.addEventListener("DOMContentLoaded", function() {
|
|
|
10
10
|
var progressBar = document.getElementById('progress-bar-inner');
|
|
11
11
|
progressBar.style.width = progress + '%';
|
|
12
12
|
progressBar.setAttribute('aria-valuenow', progress);
|
|
13
|
+
if (progress === 1) {
|
|
14
|
+
document.getElementById("run-panel").style.display = "none";
|
|
15
|
+
document.getElementById("code-panel").style.display = "block";
|
|
13
16
|
|
|
17
|
+
// Optional: Scroll to the code panel
|
|
18
|
+
document.getElementById("code-panel").scrollIntoView({ behavior: "smooth" });
|
|
19
|
+
}
|
|
14
20
|
if (progress === 100) {
|
|
15
21
|
// Remove animation and set green color when 100% is reached
|
|
16
22
|
progressBar.classList.remove('progress-bar-animated');
|
|
17
23
|
progressBar.classList.add('bg-success'); // Bootstrap class for green color
|
|
24
|
+
setTimeout(() => {
|
|
25
|
+
document.getElementById("code-panel").style.display = "none";
|
|
26
|
+
document.getElementById("run-panel").style.display = "block";
|
|
27
|
+
}, 1000); // Small delay to let users see the completion
|
|
18
28
|
}
|
|
19
29
|
});
|
|
20
30
|
socket.on('log', function(data) {
|
ivoryos/utils/db_models.py
CHANGED
|
@@ -390,6 +390,23 @@ class Script(db.Model):
|
|
|
390
390
|
string += "\t"
|
|
391
391
|
return string
|
|
392
392
|
|
|
393
|
+
def convert_to_lines(self, exec_str_collection: dict):
|
|
394
|
+
"""
|
|
395
|
+
Parse a dictionary of script functions and extract function body lines.
|
|
396
|
+
|
|
397
|
+
:param exec_str_collection: Dictionary containing script types and corresponding function strings.
|
|
398
|
+
:return: A dict containing script types as keys and lists of function body lines as values.
|
|
399
|
+
"""
|
|
400
|
+
line_collection = {}
|
|
401
|
+
for stype, func_str in exec_str_collection.items():
|
|
402
|
+
module = ast.parse(func_str)
|
|
403
|
+
func_def = next(node for node in module.body if isinstance(node, ast.FunctionDef))
|
|
404
|
+
|
|
405
|
+
# Extract function body as source lines
|
|
406
|
+
line_collection[stype] = [ast.unparse(node) for node in func_def.body if not isinstance(node, ast.Return)]
|
|
407
|
+
# print(line_collection[stype])
|
|
408
|
+
return line_collection
|
|
409
|
+
|
|
393
410
|
def compile(self, script_path=None):
|
|
394
411
|
"""
|
|
395
412
|
Compile the current script to a Python file.
|
|
@@ -401,8 +418,9 @@ class Script(db.Model):
|
|
|
401
418
|
exec_str_collection = {}
|
|
402
419
|
|
|
403
420
|
for i in self.stypes:
|
|
404
|
-
|
|
405
|
-
|
|
421
|
+
if self.script_dict[i]:
|
|
422
|
+
func_str = self._generate_function_header(run_name, i) + self._generate_function_body(i)
|
|
423
|
+
exec_str_collection[i] = func_str
|
|
406
424
|
if script_path:
|
|
407
425
|
self._write_to_file(script_path, run_name, exec_str_collection)
|
|
408
426
|
|
|
@@ -434,7 +452,7 @@ class Script(db.Model):
|
|
|
434
452
|
function_header += ", ".join(configure)
|
|
435
453
|
|
|
436
454
|
function_header += "):"
|
|
437
|
-
function_header += self.indent(1) + f"global {run_name}_{stype}"
|
|
455
|
+
# function_header += self.indent(1) + f"global {run_name}_{stype}"
|
|
438
456
|
return function_header
|
|
439
457
|
|
|
440
458
|
def _generate_function_body(self, stype):
|
ivoryos/utils/script_runner.py
CHANGED
|
@@ -35,10 +35,12 @@ class ScriptRunner:
|
|
|
35
35
|
return "Resumed"
|
|
36
36
|
|
|
37
37
|
def reset_stop_event(self):
|
|
38
|
+
"""Resets the stop event"""
|
|
38
39
|
self.stop_pending_event.clear()
|
|
39
40
|
self.stop_current_event.clear()
|
|
40
41
|
|
|
41
42
|
def abort_pending(self):
|
|
43
|
+
"""Abort the pending iteration after the current is finished"""
|
|
42
44
|
self.stop_pending_event.set()
|
|
43
45
|
# print("Stop pending tasks")
|
|
44
46
|
|
|
@@ -66,7 +68,7 @@ class ScriptRunner:
|
|
|
66
68
|
thread.start()
|
|
67
69
|
return thread
|
|
68
70
|
|
|
69
|
-
def execute_function_line_by_line(self,
|
|
71
|
+
def execute_function_line_by_line(self, lines:list, section_name, logger, socketio, **kwargs):
|
|
70
72
|
"""
|
|
71
73
|
Executes a function defined in a string line by line.
|
|
72
74
|
|
|
@@ -79,11 +81,7 @@ class ScriptRunner:
|
|
|
79
81
|
deck = global_config.deck
|
|
80
82
|
# func_str = script.compile()
|
|
81
83
|
# Parse function body from string
|
|
82
|
-
module = ast.parse(script)
|
|
83
|
-
func_def = next(node for node in module.body if isinstance(node, ast.FunctionDef))
|
|
84
84
|
|
|
85
|
-
# Extract function body as source lines
|
|
86
|
-
lines = [ast.unparse(node) for node in func_def.body if not isinstance(node, ast.Return)]
|
|
87
85
|
# Prepare execution environment
|
|
88
86
|
exec_globals = {"deck": deck} # Add required global objects
|
|
89
87
|
exec_locals = {} # Local execution scope
|
|
@@ -92,35 +90,41 @@ class ScriptRunner:
|
|
|
92
90
|
exec_locals.update(kwargs)
|
|
93
91
|
|
|
94
92
|
# Execute each line dynamically
|
|
95
|
-
for line in lines:
|
|
93
|
+
for index, line in enumerate(lines):
|
|
96
94
|
if self.stop_current_event.is_set():
|
|
97
95
|
logger.info(f'Stopping execution during {section_name}')
|
|
98
96
|
break
|
|
99
97
|
logger.info(f"Executing: {line}") # Debugging output
|
|
98
|
+
socketio.emit('execution', {'section': f"{section_name}-{index}"})
|
|
99
|
+
# self._emit_progress(socketio, 100)
|
|
100
100
|
exec(line, exec_globals, exec_locals)
|
|
101
101
|
self.pause_event.wait()
|
|
102
102
|
|
|
103
103
|
return exec_locals # Return the 'results' variable
|
|
104
104
|
|
|
105
|
-
def _run_with_stop_check(self, script: Script, repeat_count, run_name, logger, socketio, config, bo_args,
|
|
105
|
+
def _run_with_stop_check(self, script: Script, repeat_count: int, run_name: str, logger, socketio, config, bo_args,
|
|
106
106
|
output_path):
|
|
107
107
|
time.sleep(1)
|
|
108
108
|
func_str = script.compile()
|
|
109
|
+
func_str_lines = script.convert_to_lines(func_str)
|
|
109
110
|
self._emit_progress(socketio, 1)
|
|
110
111
|
try:
|
|
111
112
|
# Run "prep" section once
|
|
112
113
|
script_dict = script.script_dict
|
|
113
|
-
self._run_actions(script_dict.get("prep", []),
|
|
114
|
+
self._run_actions(script_dict.get("prep", []), func_str_lines.get("prep", []), section_name="prep", logger=logger, socketio=socketio)
|
|
114
115
|
output_list = []
|
|
115
116
|
_, arg_type = script.config("script")
|
|
116
117
|
_, return_list = script.config_return()
|
|
117
118
|
# Run "script" section multiple times
|
|
118
119
|
if repeat_count:
|
|
119
|
-
self._run_repeat_section(repeat_count, arg_type, bo_args, output_list,
|
|
120
|
+
self._run_repeat_section(repeat_count, arg_type, bo_args, output_list, func_str_lines.get("script", []),
|
|
121
|
+
run_name, return_list, logger, socketio)
|
|
120
122
|
elif config:
|
|
121
|
-
self._run_config_section(config, arg_type, output_list,
|
|
123
|
+
self._run_config_section(config, arg_type, output_list, func_str_lines.get("script", []), run_name, logger,
|
|
124
|
+
socketio)
|
|
122
125
|
# Run "cleanup" section once
|
|
123
|
-
self._run_actions(script_dict.get("cleanup", []), func_str.get("cleanup",
|
|
126
|
+
self._run_actions(script_dict.get("cleanup", []), func_str.get("cleanup", []), section_name="cleanup",
|
|
127
|
+
logger=logger, socketio=socketio)
|
|
124
128
|
# Save results if necessary
|
|
125
129
|
if output_list:
|
|
126
130
|
self._save_results(run_name, arg_type, return_list, output_list, logger, output_path)
|
|
@@ -131,12 +135,12 @@ class ScriptRunner:
|
|
|
131
135
|
self.is_running = False # Reset the running flag when done
|
|
132
136
|
self._emit_progress(socketio, 100)
|
|
133
137
|
|
|
134
|
-
def _run_actions(self, actions, func_str, section_name="", logger=None):
|
|
138
|
+
def _run_actions(self, actions, func_str, section_name="", logger=None, socketio=None):
|
|
135
139
|
logger.info(f'Executing {section_name} steps') if actions else logger.info(f'No {section_name} steps')
|
|
136
140
|
if self.stop_pending_event.is_set():
|
|
137
141
|
logger.info(f"Stopping execution during {section_name} section.")
|
|
138
142
|
return
|
|
139
|
-
self.execute_function_line_by_line(func_str, section_name, logger)
|
|
143
|
+
self.execute_function_line_by_line(func_str, section_name, logger, socketio)
|
|
140
144
|
|
|
141
145
|
def _run_config_section(self, config, arg_type, output_list, func_str, run_name, logger, socketio):
|
|
142
146
|
compiled = True
|
|
@@ -158,12 +162,13 @@ class ScriptRunner:
|
|
|
158
162
|
self._emit_progress(socketio, progress)
|
|
159
163
|
# fname = f"{run_name}_script"
|
|
160
164
|
# function = self.globals_dict[fname]
|
|
161
|
-
output = self.execute_function_line_by_line(func_str, "script", logger, **kwargs)
|
|
165
|
+
output = self.execute_function_line_by_line(func_str, "script", logger, socketio, **kwargs)
|
|
162
166
|
if output:
|
|
163
167
|
# kwargs.update(output)
|
|
164
168
|
output_list.append(output)
|
|
165
169
|
|
|
166
|
-
def _run_repeat_section(self, repeat_count, arg_types, bo_args, output_list,
|
|
170
|
+
def _run_repeat_section(self, repeat_count, arg_types, bo_args, output_list, func_str, run_name, return_list,
|
|
171
|
+
logger, socketio):
|
|
167
172
|
if bo_args:
|
|
168
173
|
logger.info('Initializing optimizer...')
|
|
169
174
|
ax_client = utils.ax_initiation(bo_args, arg_types)
|
|
@@ -180,7 +185,7 @@ class ScriptRunner:
|
|
|
180
185
|
logger.info(f'Output value: {parameters}')
|
|
181
186
|
# fname = f"{run_name}_script"
|
|
182
187
|
# function = self.globals_dict[fname]
|
|
183
|
-
output = self.execute_function_line_by_line(func_str, "script", logger, **parameters)
|
|
188
|
+
output = self.execute_function_line_by_line(func_str, "script", logger, socketio, **parameters)
|
|
184
189
|
|
|
185
190
|
_output = {key: value for key, value in output.items() if key in return_list}
|
|
186
191
|
ax_client.complete_trial(trial_index=trial_index, raw_data=_output)
|
|
@@ -191,7 +196,7 @@ class ScriptRunner:
|
|
|
191
196
|
else:
|
|
192
197
|
# fname = f"{run_name}_script"
|
|
193
198
|
# function = self.globals_dict[fname]
|
|
194
|
-
output = self.execute_function_line_by_line(func_str, "script", logger)
|
|
199
|
+
output = self.execute_function_line_by_line(func_str, "script", logger, socketio)
|
|
195
200
|
|
|
196
201
|
if output:
|
|
197
202
|
output_list.append(output)
|
ivoryos/version.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "0.1.
|
|
1
|
+
__version__ = "0.1.20"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: ivoryos
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.20
|
|
4
4
|
Summary: an open-source Python package enabling Self-Driving Labs (SDLs) interoperability
|
|
5
5
|
Home-page: https://gitlab.com/heingroup/ivoryos
|
|
6
6
|
Author: Ivory Zhang
|
|
@@ -21,6 +21,9 @@ Requires-Dist: python-dotenv
|
|
|
21
21
|
[](https://ivoryos.readthedocs.io/en/latest/?badge=latest)
|
|
22
22
|
[](https://pypi.org/project/ivoryos/)
|
|
23
23
|

|
|
24
|
+
[](https://youtu.be/dFfJv9I2-1g)
|
|
25
|
+
[](https://www.researchsquare.com/article/rs-5307798/v1)
|
|
26
|
+
|
|
24
27
|
|
|
25
28
|

|
|
26
29
|
# ivoryOS: interoperable Web UI for self-driving laboratories (SDLs)
|
|
@@ -32,6 +35,7 @@ Requires-Dist: python-dotenv
|
|
|
32
35
|
- [Installation](#installation)
|
|
33
36
|
- [Instructions for use](#instructions-for-use)
|
|
34
37
|
- [Demo](#demo)
|
|
38
|
+
- [Roadmap](#roadmap)
|
|
35
39
|
- [License](#license)
|
|
36
40
|
|
|
37
41
|
## Description
|
|
@@ -160,15 +164,10 @@ When you run the application for the first time, it will automatically create th
|
|
|
160
164
|
- **`ivoryos.db`**: Database file that stores application data locally.
|
|
161
165
|
|
|
162
166
|
|
|
163
|
-
### Demo video
|
|
164
|
-
Intro + Tutorial + Demo with PurPOSE platform
|
|
165
|
-
https://youtu.be/dFfJv9I2-1g
|
|
166
|
-
|
|
167
|
-
|
|
168
167
|
## Roadmap
|
|
169
168
|
|
|
170
169
|
- [x] Allow plugin pages ✅
|
|
171
|
-
- [
|
|
170
|
+
- [x] pause, resume, abort current and pending workflows ✅
|
|
172
171
|
- [ ] snapshot version control
|
|
173
172
|
- [ ] dropdown input
|
|
174
173
|
- [ ] show line number option
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
ivoryos/__init__.py,sha256=F3KenDZX1zqei3PZ3tx1U77yXsbeytgMMhVJyJMkmJ0,6071
|
|
2
2
|
ivoryos/config.py,sha256=3FPBYTIBhQTKDvsEoR8ZeTmg65D-CSFEdGmOuIL4pSI,1311
|
|
3
|
-
ivoryos/version.py,sha256=
|
|
3
|
+
ivoryos/version.py,sha256=8XalsVoLEfXslFvdtUEmkNOuYShzOzYOcFbgmOz1oSk,23
|
|
4
4
|
ivoryos/routes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
5
|
ivoryos/routes/auth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
6
|
ivoryos/routes/auth/auth.py,sha256=7CdXjGAr1B_xsmwweakTWOoROgsOJf0MNTzlMP_5Nus,3240
|
|
@@ -15,9 +15,9 @@ ivoryos/routes/database/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG
|
|
|
15
15
|
ivoryos/routes/database/database.py,sha256=IOrdtdsZ28bV7R1ZQfcwAeS5JDCkX-QYsP9i8BseD38,5684
|
|
16
16
|
ivoryos/routes/database/templates/database/experiment_database.html,sha256=ABchwHYDovzwECc7UD4Mh8C_9JUl0YZpAAF9sFjNCs0,3434
|
|
17
17
|
ivoryos/routes/design/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
18
|
-
ivoryos/routes/design/design.py,sha256=
|
|
18
|
+
ivoryos/routes/design/design.py,sha256=ckI5QMf9WR7T4qio9IoYNRm4UbwXa3TOl5eFTJMAWhE,21484
|
|
19
19
|
ivoryos/routes/design/templates/design/experiment_builder.html,sha256=-C84nHcK1grC8b_B5Lgbg6StJcP8x1oj2XAjRPj1oU0,28239
|
|
20
|
-
ivoryos/routes/design/templates/design/experiment_run.html,sha256=
|
|
20
|
+
ivoryos/routes/design/templates/design/experiment_run.html,sha256=e49CTbmFFUXYy0dCcdJ3ysM-sTMg5qQDm5MkRTTcyDE,25210
|
|
21
21
|
ivoryos/routes/main/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
22
22
|
ivoryos/routes/main/main.py,sha256=yuVJzXAob1kc1dfflkTBIZQ0tdf6kChfuq-uQlN1e9Q,957
|
|
23
23
|
ivoryos/routes/main/templates/main/help.html,sha256=IOktMEsOPk0SCiMBXZ4mpffClERAyX8W82fel71M3M0,9370
|
|
@@ -28,19 +28,19 @@ ivoryos/static/style.css,sha256=cbQ8T8h42smwuyF5qQ_pNhlptDXGcuyK2u4sUppqnyI,3717
|
|
|
28
28
|
ivoryos/static/gui_annotation/Slide1.png,sha256=Lm4gdOkUF5HIUFaB94tl6koQVkzpitKj43GXV_XYMMc,121727
|
|
29
29
|
ivoryos/static/gui_annotation/Slide2.PNG,sha256=z3wQ9oVgg4JTWVLQGKK_KhtepRHUYP1e05XUWGT2A0I,118761
|
|
30
30
|
ivoryos/static/js/overlay.js,sha256=dPxop19es0E0ZUSY3d_4exIk7CJuQEnlW5uTt5fZfzI,483
|
|
31
|
-
ivoryos/static/js/socket_handler.js,sha256=
|
|
31
|
+
ivoryos/static/js/socket_handler.js,sha256=G0bro6WwZBWeGsS26eg-xuwoS-I7SiqDzkf7mfuvy9U,3149
|
|
32
32
|
ivoryos/static/js/sortable_card.js,sha256=ifmlGe3yy0U_KzMphV4ClRhK2DLOvkELYMlq1vECuac,807
|
|
33
33
|
ivoryos/static/js/sortable_design.js,sha256=1lI1I8FbL66tv6n-SX2FkbHNDYo36xVo2qDBKVLmxnQ,1120
|
|
34
34
|
ivoryos/templates/base.html,sha256=8HDi7I74ugcCAV4c3ha4C__-7xopt4ZsC0OQ2E_AsQ8,8313
|
|
35
35
|
ivoryos/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
36
|
-
ivoryos/utils/db_models.py,sha256=
|
|
36
|
+
ivoryos/utils/db_models.py,sha256=voA-pteIFvlfV0U10H5O18aDwiAuAe6VhX8qEd2rjJs,24602
|
|
37
37
|
ivoryos/utils/form.py,sha256=1h6eytHz1tv5_CIc_C6KGYn5JEPYniIOxo49yzM37o0,17149
|
|
38
38
|
ivoryos/utils/global_config.py,sha256=Ojcz6xKATSbMLnTT0kiKqSnu_bNqCMyIAnZyHaKxJns,1589
|
|
39
39
|
ivoryos/utils/llm_agent.py,sha256=DTf-AF56vy1Em1fUKagl5NURKittmNoxTKIw1PlyC2o,6413
|
|
40
|
-
ivoryos/utils/script_runner.py,sha256=
|
|
40
|
+
ivoryos/utils/script_runner.py,sha256=OZ3RU6hvS82PubSx-RZqRvHyKuf1pxN5neziUBNR5iU,9622
|
|
41
41
|
ivoryos/utils/utils.py,sha256=nQbGSR_FmlZyBb9lwKy3ws4FDAWWfDyu96hZg2DVIeI,14081
|
|
42
|
-
ivoryos-0.1.
|
|
43
|
-
ivoryos-0.1.
|
|
44
|
-
ivoryos-0.1.
|
|
45
|
-
ivoryos-0.1.
|
|
46
|
-
ivoryos-0.1.
|
|
42
|
+
ivoryos-0.1.20.dist-info/LICENSE,sha256=p2c8S8i-8YqMpZCJnadLz1-ofxnRMILzz6NCMIypRag,1084
|
|
43
|
+
ivoryos-0.1.20.dist-info/METADATA,sha256=1k_i_szTZR_zgRVZauNtb1gpxNqgZp0s1VGaeAQATmw,6697
|
|
44
|
+
ivoryos-0.1.20.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
|
|
45
|
+
ivoryos-0.1.20.dist-info/top_level.txt,sha256=FRIWWdiEvRKqw-XfF_UK3XV0CrnNb6EmVbEgjaVazRM,8
|
|
46
|
+
ivoryos-0.1.20.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|