ivoryos 1.0.9__py3-none-any.whl → 1.4.4__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.
Files changed (107) hide show
  1. docs/source/conf.py +84 -0
  2. ivoryos/__init__.py +17 -207
  3. ivoryos/app.py +154 -0
  4. ivoryos/config.py +1 -0
  5. ivoryos/optimizer/ax_optimizer.py +191 -0
  6. ivoryos/optimizer/base_optimizer.py +84 -0
  7. ivoryos/optimizer/baybe_optimizer.py +193 -0
  8. ivoryos/optimizer/nimo_optimizer.py +173 -0
  9. ivoryos/optimizer/registry.py +11 -0
  10. ivoryos/routes/auth/auth.py +43 -14
  11. ivoryos/routes/auth/templates/change_password.html +32 -0
  12. ivoryos/routes/control/control.py +101 -366
  13. ivoryos/routes/control/control_file.py +33 -0
  14. ivoryos/routes/control/control_new_device.py +152 -0
  15. ivoryos/routes/control/templates/controllers.html +193 -0
  16. ivoryos/routes/control/templates/controllers_new.html +112 -0
  17. ivoryos/routes/control/utils.py +40 -0
  18. ivoryos/routes/data/data.py +197 -0
  19. ivoryos/routes/data/templates/components/step_card.html +78 -0
  20. ivoryos/routes/{database/templates/database → data/templates}/workflow_database.html +14 -8
  21. ivoryos/routes/data/templates/workflow_view.html +360 -0
  22. ivoryos/routes/design/__init__.py +4 -0
  23. ivoryos/routes/design/design.py +348 -657
  24. ivoryos/routes/design/design_file.py +68 -0
  25. ivoryos/routes/design/design_step.py +171 -0
  26. ivoryos/routes/design/templates/components/action_form.html +53 -0
  27. ivoryos/routes/design/templates/components/actions_panel.html +25 -0
  28. ivoryos/routes/design/templates/components/autofill_toggle.html +10 -0
  29. ivoryos/routes/design/templates/components/canvas.html +5 -0
  30. ivoryos/routes/design/templates/components/canvas_footer.html +9 -0
  31. ivoryos/routes/design/templates/components/canvas_header.html +75 -0
  32. ivoryos/routes/design/templates/components/canvas_main.html +39 -0
  33. ivoryos/routes/design/templates/components/deck_selector.html +10 -0
  34. ivoryos/routes/design/templates/components/edit_action_form.html +53 -0
  35. ivoryos/routes/design/templates/components/info_modal.html +318 -0
  36. ivoryos/routes/design/templates/components/instruments_panel.html +88 -0
  37. ivoryos/routes/design/templates/components/modals/drop_modal.html +17 -0
  38. ivoryos/routes/design/templates/components/modals/json_modal.html +22 -0
  39. ivoryos/routes/design/templates/components/modals/new_script_modal.html +17 -0
  40. ivoryos/routes/design/templates/components/modals/rename_modal.html +23 -0
  41. ivoryos/routes/design/templates/components/modals/saveas_modal.html +27 -0
  42. ivoryos/routes/design/templates/components/modals.html +6 -0
  43. ivoryos/routes/design/templates/components/python_code_overlay.html +56 -0
  44. ivoryos/routes/design/templates/components/sidebar.html +15 -0
  45. ivoryos/routes/design/templates/components/text_to_code_panel.html +20 -0
  46. ivoryos/routes/design/templates/experiment_builder.html +44 -0
  47. ivoryos/routes/execute/__init__.py +0 -0
  48. ivoryos/routes/execute/execute.py +377 -0
  49. ivoryos/routes/execute/execute_file.py +78 -0
  50. ivoryos/routes/execute/templates/components/error_modal.html +20 -0
  51. ivoryos/routes/execute/templates/components/logging_panel.html +56 -0
  52. ivoryos/routes/execute/templates/components/progress_panel.html +27 -0
  53. ivoryos/routes/execute/templates/components/run_panel.html +9 -0
  54. ivoryos/routes/execute/templates/components/run_tabs.html +60 -0
  55. ivoryos/routes/execute/templates/components/tab_bayesian.html +520 -0
  56. ivoryos/routes/execute/templates/components/tab_configuration.html +383 -0
  57. ivoryos/routes/execute/templates/components/tab_repeat.html +18 -0
  58. ivoryos/routes/execute/templates/experiment_run.html +30 -0
  59. ivoryos/routes/library/__init__.py +0 -0
  60. ivoryos/routes/library/library.py +157 -0
  61. ivoryos/routes/{database/templates/database/scripts_database.html → library/templates/library.html} +32 -23
  62. ivoryos/routes/main/main.py +31 -3
  63. ivoryos/routes/main/templates/{main/home.html → home.html} +4 -4
  64. ivoryos/server.py +180 -0
  65. ivoryos/socket_handlers.py +52 -0
  66. ivoryos/static/ivoryos_logo.png +0 -0
  67. ivoryos/static/js/action_handlers.js +384 -0
  68. ivoryos/static/js/db_delete.js +23 -0
  69. ivoryos/static/js/script_metadata.js +39 -0
  70. ivoryos/static/js/socket_handler.js +40 -5
  71. ivoryos/static/js/sortable_design.js +107 -56
  72. ivoryos/static/js/ui_state.js +114 -0
  73. ivoryos/templates/base.html +67 -8
  74. ivoryos/utils/bo_campaign.py +180 -3
  75. ivoryos/utils/client_proxy.py +267 -36
  76. ivoryos/utils/db_models.py +300 -65
  77. ivoryos/utils/decorators.py +34 -0
  78. ivoryos/utils/form.py +63 -29
  79. ivoryos/utils/global_config.py +34 -1
  80. ivoryos/utils/nest_script.py +314 -0
  81. ivoryos/utils/py_to_json.py +295 -0
  82. ivoryos/utils/script_runner.py +599 -165
  83. ivoryos/utils/serilize.py +201 -0
  84. ivoryos/utils/task_runner.py +71 -21
  85. ivoryos/utils/utils.py +50 -6
  86. ivoryos/version.py +1 -1
  87. ivoryos-1.4.4.dist-info/METADATA +263 -0
  88. ivoryos-1.4.4.dist-info/RECORD +119 -0
  89. {ivoryos-1.0.9.dist-info → ivoryos-1.4.4.dist-info}/WHEEL +1 -1
  90. {ivoryos-1.0.9.dist-info → ivoryos-1.4.4.dist-info}/top_level.txt +1 -0
  91. tests/unit/test_type_conversion.py +42 -0
  92. tests/unit/test_util.py +3 -0
  93. ivoryos/routes/control/templates/control/controllers.html +0 -78
  94. ivoryos/routes/control/templates/control/controllers_home.html +0 -55
  95. ivoryos/routes/control/templates/control/controllers_new.html +0 -89
  96. ivoryos/routes/database/database.py +0 -306
  97. ivoryos/routes/database/templates/database/step_card.html +0 -7
  98. ivoryos/routes/database/templates/database/workflow_view.html +0 -130
  99. ivoryos/routes/design/templates/design/experiment_builder.html +0 -521
  100. ivoryos/routes/design/templates/design/experiment_run.html +0 -558
  101. ivoryos-1.0.9.dist-info/METADATA +0 -218
  102. ivoryos-1.0.9.dist-info/RECORD +0 -61
  103. /ivoryos/routes/auth/templates/{auth/login.html → login.html} +0 -0
  104. /ivoryos/routes/auth/templates/{auth/signup.html → signup.html} +0 -0
  105. /ivoryos/routes/{database → data}/__init__.py +0 -0
  106. /ivoryos/routes/main/templates/{main/help.html → help.html} +0 -0
  107. {ivoryos-1.0.9.dist-info → ivoryos-1.4.4.dist-info/licenses}/LICENSE +0 -0
@@ -1,218 +0,0 @@
1
- Metadata-Version: 2.1
2
- Name: ivoryos
3
- Version: 1.0.9
4
- Summary: an open-source Python package enabling Self-Driving Labs (SDLs) interoperability
5
- Home-page: https://gitlab.com/heingroup/ivoryos
6
- Author: Ivory Zhang
7
- Author-email: ivoryzhang@chem.ubc.ca
8
- License: MIT
9
- Description-Content-Type: text/markdown
10
- License-File: LICENSE
11
- Requires-Dist: bcrypt
12
- Requires-Dist: Flask-Login
13
- Requires-Dist: Flask-Session
14
- Requires-Dist: Flask-SocketIO
15
- Requires-Dist: Flask-SQLAlchemy
16
- Requires-Dist: Flask-WTF
17
- Requires-Dist: SQLAlchemy-Utils
18
- Requires-Dist: python-dotenv
19
- Requires-Dist: astor; python_version < "3.9"
20
-
21
- [![Documentation Status](https://readthedocs.org/projects/ivoryos/badge/?version=latest)](https://ivoryos.readthedocs.io/en/latest/?badge=latest)
22
- [![PyPI version](https://img.shields.io/pypi/v/ivoryos)](https://pypi.org/project/ivoryos/)
23
- ![License](https://img.shields.io/pypi/l/ivoryos)
24
- [![YouTube](https://img.shields.io/badge/YouTube-video-red?logo=youtube)](https://youtu.be/dFfJv9I2-1g)
25
- [![Published](https://img.shields.io/badge/Nature_Comm.-paper-blue)](https://www.nature.com/articles/s41467-025-60514-w)
26
- [![Discord](https://img.shields.io/discord/1313641159356059770?label=Discord&logo=discord&color=5865F2)](https://discord.gg/AX5P9EdGVX)
27
-
28
- ![](https://gitlab.com/heingroup/ivoryos/raw/main/docs/source/_static/ivoryos.png)
29
- # ivoryOS: interoperable Web UI for self-driving laboratories (SDLs)
30
- "plug and play" web UI extension for flexible SDLs.
31
-
32
- ## Table of Contents
33
- - [Description](#description)
34
- - [System requirements](#system-requirements)
35
- - [Installation](#installation)
36
- - [Instructions for use](#instructions-for-use)
37
- - [Demo](#demo)
38
- - [Roadmap](#roadmap)
39
-
40
-
41
- ## Description
42
- Granting SDLs flexibility and modularity makes it almost impossible to design a UI, yet it's a necessity for allowing more people to interact with it (democratisation).
43
- This web UI aims to ease up the control of any Python-based SDLs by displaying functions and parameters for initialized modules dynamically.
44
- The modules can be hardware API, high-level functions, or experiment workflow.
45
- With the least modification of the current workflow, user can design, manage and execute their experimental designs and monitor the execution process.
46
-
47
- ## System requirements
48
- This software is developed and tested using Windows. This software and its dependencies are compatible across major platforms: Linux, macOS, and Windows. Some dependencies (Flask-SQLAlchemy) may require additional setup.
49
-
50
- ### Python Version
51
- Python >=3.7 for best compatibility.
52
- ### Python dependencies
53
- This software is compatible with the latest versions of all dependencies.
54
- - bcrypt~=4.0
55
- - Flask-Login~=0.6
56
- - Flask-Session~=0.8
57
- - Flask-SocketIO~=5.3
58
- - Flask-SQLAlchemy~=3.1
59
- - SQLAlchemy-Utils~=0.41
60
- - Flask-WTF~=1.2
61
- - python-dotenv==1.0.1
62
- - openai (optional ~=1.53)
63
- - ax-platform (optional ~=0.3 or ~=0.4 for Python>=3.9)
64
-
65
- ## Installation
66
- ```bash
67
- pip install ivoryos
68
- ```
69
- or
70
- ```bash
71
- git clone https://gitlab.com/heingroup/ivoryos.git
72
- cd ivoryos
73
- pip install -e .
74
- ```
75
-
76
- The installation may take 10 to 30 seconds to install. The installation time may vary and take up to several minutes, depending on the network speed, computer performance, and virtual environment settings.
77
-
78
- ## Instructions for use
79
- ### Quick start
80
- In your SDL script, use `ivoryos(__name__)`.
81
- ```python
82
- import ivoryos
83
-
84
- ivoryos.run(__name__)
85
- ```
86
- ### Login
87
- Create an account and login (local database)
88
- ### Features
89
- - **Direct control**: direct function calling _Device_ tab
90
- - **Workflow design and iteration**:
91
- - **Design**: add function to canvas in _Design_ tab. click `Compile and Run` button to go to the execution page
92
- - **Execution**: configure iteration methods and parameters in _Compile/Run_ tab.
93
- - **Database**: manage workflows in _Library_ tab.
94
- - **Info page**: additional info in _About_ tab.
95
-
96
- [//]: # (![Discord]&#40;https://img.shields.io/discord/1313641159356059770&#41;)
97
-
98
- [//]: # (![PyPI - Downloads]&#40;https://img.shields.io/pypi/dm/ivoryos&#41;)
99
-
100
-
101
- ### Additional settings
102
- #### AI assistant
103
- To streamline the experimental design on SDLs, we also integrate Large Language Models (LLMs) to interpret the inspected functions and generate code according to task descriptions.
104
-
105
- #### Enable LLMs with [OpenAI API](https://github.com/openai/openai-python)
106
- 1. Create a `.env` file for `OPENAI_API_KEY`
107
- ```
108
- OPENAI_API_KEY="Your API Key"
109
- ```
110
- 2. In your SDL script, define model, you can use any GPT models.
111
-
112
- ```python
113
- ivoryos.run(__name__, model="gpt-3.5-turbo")
114
- ```
115
-
116
- #### Enable local LLMs with [Ollama](https://ollama.com/)
117
- 1. Download Ollama.
118
- 2. pull models from Ollama
119
- 3. In your SDL script, define LLM server and model, you can use any models available on Ollama.
120
-
121
- ```python
122
- ivoryos.run(__name__, llm_server="localhost", model="llama3.1")
123
- ```
124
-
125
- #### Add additional logger(s)
126
- ```python
127
- ivoryos.run(__name__, logger="logger name")
128
- ```
129
- or
130
- ```python
131
- ivoryos.run(__name__, logger=["logger 1", "logger 2"])
132
- ```
133
- #### Offline (design without hardware connection)
134
- After one successful connection, a blueprint will be automatically saved and made accessible without hardware connection. In a new Python script in the same directory, use `ivoryos.run()` to start offline mode.
135
-
136
- ```python
137
- ivoryos.run()
138
- ```
139
- ## Demo
140
- In the [abstract_sdl.py](https://gitlab.com/heingroup/ivoryos/-/blob/main/example/abstract_sdl_example/abstract_sdl.py), where instances of `AbstractSDL` is created as `sdl`,
141
- addresses will be available on terminal.
142
- ```Python
143
- ivoryos.run(__name__)
144
- ```
145
-
146
- * Running on all addresses (0.0.0.0)
147
- * Running on http://127.0.0.1:8000
148
- * Running on http://xxx.xx.xx.xxx:8000
149
-
150
- ### Deck function and web form
151
- ![](https://gitlab.com/heingroup/ivoryos/raw/main/docs/source/_static/demo.gif)
152
-
153
- ### Text-to-code demo
154
- ![](https://gitlab.com/heingroup/ivoryos/raw/main/docs/source/_static/text-to-code.gif)
155
-
156
- ### Directory structure
157
-
158
- When you run the application for the first time, it will automatically create the following folders and files in the same directory:
159
-
160
- - **`ivoryos_data/`**: Main directory for application-related data.
161
- - **`ivoryos_data/config_csv/`**: Contains iteration configuration files in CSV format.
162
- - **`ivoryos_data/llm_output/`**: Stores raw prompt generated for the large language model.
163
- - **`ivoryos_data/pseudo_deck/`**: Contains pseudo-deck `.pkl` files for offline access.
164
- - **`ivoryos_data/results/`**: Used for storing results or outputs during workflow execution.
165
- - **`ivoryos_data/scripts/`**: Holds Python scripts compiled from the visual programming script design.
166
-
167
- - **`default.log`**: Log file that captures application logs.
168
- - **`ivoryos.db`**: Database file that stores application data locally.
169
-
170
-
171
- ## Roadmap
172
-
173
- - [x] Allow plugin pages ✅
174
- - [x] pause, resume, abort current and pending workflows ✅
175
- - [x] dropdown input ✅
176
- - [x] show line number option ✅
177
- - [ ] snapshot version control
178
-
179
- ## Citing
180
-
181
- If you find this project useful, please consider citing the following manuscript:
182
-
183
- > Zhang, W., Hao, L., Lai, V. et al. [IvoryOS: an interoperable web interface for orchestrating Python-based self-driving laboratories.](https://www.nature.com/articles/s41467-025-60514-w) Nat Commun 16, 5182 (2025).
184
-
185
- ```bibtex
186
- @article{zhang_et_al_2025,
187
- author = {Wenyu Zhang and Lucy Hao and Veronica Lai and Ryan Corkery and Jacob Jessiman and Jiayu Zhang and Junliang Liu and Yusuke Sato and Maria Politi and Matthew E. Reish and Rebekah Greenwood and Noah Depner and Jiyoon Min and Rama El-khawaldeh and Paloma Prieto and Ekaterina Trushina and Jason E. Hein},
188
- title = {{IvoryOS}: an interoperable web interface for orchestrating {Python-based} self-driving laboratories},
189
- journal = {Nature Communications},
190
- year = {2025},
191
- volume = {16},
192
- number = {1},
193
- pages = {5182},
194
- doi = {10.1038/s41467-025-60514-w},
195
- url = {https://doi.org/10.1038/s41467-025-60514-w}
196
- }
197
- ```
198
-
199
- For an additional perspective related to the development of the tool, please see:
200
-
201
- > Zhang, W., Hein, J. [Behind IvoryOS: Empowering Scientists to Harness Self-Driving Labs for Accelerated Discovery](https://communities.springernature.com/posts/behind-ivoryos-empowering-scientists-to-harness-self-driving-labs-for-accelerated-discovery). Springer Nature Research Communities (2025).
202
-
203
- ```bibtex
204
- @misc{zhang_hein_2025,
205
- author = {Wenyu Zhang and Jason Hein},
206
- title = {Behind {IvoryOS}: Empowering Scientists to Harness Self-Driving Labs for Accelerated Discovery},
207
- howpublished = {Springer Nature Research Communities},
208
- year = {2025},
209
- month = {Jun},
210
- day = {18},
211
- url = {https://communities.springernature.com/posts/behind-ivoryos-empowering-scientists-to-harness-self-driving-labs-for-accelerated-discovery}
212
- }
213
- ```
214
-
215
- ## Authors and Acknowledgement
216
- Ivory Zhang, Lucy Hao
217
-
218
- Authors acknowledge all former and current Hein Lab members for their valuable suggestions.
@@ -1,61 +0,0 @@
1
- ivoryos/__init__.py,sha256=SEy7z9DYSYfSTDlBh8SuqEvBMkalkzeEpB-iE5WyBsI,8136
2
- ivoryos/config.py,sha256=sk4dskm-K_Nv4uaA3QuE6xtew8wL6q3HmIoLgRm7p8U,2153
3
- ivoryos/version.py,sha256=q2ACMkQx0Hm5xKo2YKJFBE7rTruciTSIN6AvWWL9nB8,22
4
- ivoryos/routes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
- ivoryos/routes/auth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
- ivoryos/routes/auth/auth.py,sha256=pvrYQN2XqH2OpZMxirFQZr9-c8yO29CpvQg9VR6JFsE,3256
7
- ivoryos/routes/auth/templates/auth/login.html,sha256=WSRrKbdM_oobqSXFRTo-j9UlOgp6sYzS9tm7TqqPULI,1207
8
- ivoryos/routes/auth/templates/auth/signup.html,sha256=b5LTXtpfTSkSS7X8u1ldwQbbgEFTk6UNMAediA5BwBY,1465
9
- ivoryos/routes/control/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
- ivoryos/routes/control/control.py,sha256=AaXqXqaIIed9xBVQsk52CNnNDTSofje5qQAfDGWd1Q0,16404
11
- ivoryos/routes/control/templates/control/controllers.html,sha256=iIp0h6WA68gQj9OsoiB7dU1BqH8CGomTueR73F4C8eY,4274
12
- ivoryos/routes/control/templates/control/controllers_home.html,sha256=qAM4iZBEuXvSgGUWWVVIe2E9MPJOeG7U214hYM84jIE,2976
13
- ivoryos/routes/control/templates/control/controllers_new.html,sha256=uOQo9kYmwX2jk3KZDkMUF_ylfNUIs_oIWb_kk_MMVDM,4921
14
- ivoryos/routes/database/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
- ivoryos/routes/database/database.py,sha256=JwFuWf9WHju0CepkuSz6OaOwV6O2f76Vv_0myCFMPFc,9833
16
- ivoryos/routes/database/templates/database/scripts_database.html,sha256=tEpKOj1UGz7mcDq11guwP48XJxwawjxjPvxRhKiIG2I,3640
17
- ivoryos/routes/database/templates/database/step_card.html,sha256=F4JRfacrEQfk2rrEbcI_i7G84nzKKDmCrMSmStLb4W4,290
18
- ivoryos/routes/database/templates/database/workflow_database.html,sha256=fsJHrYeEHGBKRn1pIxWITE6e93tdZsXH3zRs9Ob5FX0,4467
19
- ivoryos/routes/database/templates/database/workflow_view.html,sha256=u8_XYhiZ98PzglMzFEkuM1Tk9hVWf79xXIrpHVDxKa0,3618
20
- ivoryos/routes/design/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
- ivoryos/routes/design/design.py,sha256=ui9GvLoJ-0XNZT6q13KPgDh4NEEbVxaHKYcBtDqEkao,29866
22
- ivoryos/routes/design/templates/design/experiment_builder.html,sha256=4JjkwdMAWZA1XrGtoqBKykDikf-Qg7RbjqedqY_J-fU,32326
23
- ivoryos/routes/design/templates/design/experiment_run.html,sha256=UFqg6GMgkyYJfc1Ifg1jhyJggdZkCYpgQrNotiXWzwc,25582
24
- ivoryos/routes/main/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
- ivoryos/routes/main/main.py,sha256=yuVJzXAob1kc1dfflkTBIZQ0tdf6kChfuq-uQlN1e9Q,957
26
- ivoryos/routes/main/templates/main/help.html,sha256=IOktMEsOPk0SCiMBXZ4mpffClERAyX8W82fel71M3M0,9370
27
- ivoryos/routes/main/templates/main/home.html,sha256=8AhQOWakD-1TyWA0s-B9ZK96L_f8ywYUEGHW1UzMGZA,4634
28
- ivoryos/static/favicon.ico,sha256=RhlrPtfITOkzC9BjP1UB1V5L9Oyp6NwNtWeMcGOnpyc,15406
29
- ivoryos/static/logo.webp,sha256=lXgfQR-4mHTH83k7VV9iB54-oC2ipe6uZvbwdOnLETc,14974
30
- ivoryos/static/style.css,sha256=zQVx35A5g6JMJ-K84-6fSKtzXGjp_p5ZVG6KLHPM2IE,4021
31
- ivoryos/static/gui_annotation/Slide1.png,sha256=Lm4gdOkUF5HIUFaB94tl6koQVkzpitKj43GXV_XYMMc,121727
32
- ivoryos/static/gui_annotation/Slide2.PNG,sha256=z3wQ9oVgg4JTWVLQGKK_KhtepRHUYP1e05XUWGT2A0I,118761
33
- ivoryos/static/js/overlay.js,sha256=dPxop19es0E0ZUSY3d_4exIk7CJuQEnlW5uTt5fZfzI,483
34
- ivoryos/static/js/socket_handler.js,sha256=2Iyv_3METjhSlSavs_L9FE3PKY4xDEpfzJpd2FywY9o,5300
35
- ivoryos/static/js/sortable_card.js,sha256=ifmlGe3yy0U_KzMphV4ClRhK2DLOvkELYMlq1vECuac,807
36
- ivoryos/static/js/sortable_design.js,sha256=d55AEz8LpPX_j-hREom-I19i4l-SOG2RVSR4CnozRtY,4366
37
- ivoryos/templates/base.html,sha256=sDdwqOIUP2Get-py4E59PkieoGWLFpX6wAJe93s4aRo,8518
38
- ivoryos/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
- ivoryos/utils/bo_campaign.py,sha256=CVs7q15Pm2SRuJNaCvZKIxOFuv1xibM2yymtpAMAWOk,3285
40
- ivoryos/utils/client_proxy.py,sha256=0OT2xTMkqh_2ybgCxMV_71ZVUThWwrsnAhTIBY5vDR8,2095
41
- ivoryos/utils/db_models.py,sha256=HQSjMrZc1o1fvjx5Mf7W_53xPbT9aZ00xtUJJNPbwio,27502
42
- ivoryos/utils/form.py,sha256=k9d4AZz74FeOh4gkhDsZx3g4LZti_aJm9ZPRBkpOsE0,21933
43
- ivoryos/utils/global_config.py,sha256=OqfDrPgOzRdIUMD4V3pA9t6b-BATMjGZl8Jn7nkI56k,2138
44
- ivoryos/utils/llm_agent.py,sha256=-lVCkjPlpLues9sNTmaT7bT4sdhWvV2DiojNwzB2Lcw,6422
45
- ivoryos/utils/script_runner.py,sha256=0b5hLKAF2o0SQKiArhUsG8-4MA-eniAcjwi8gCNVwtY,14542
46
- ivoryos/utils/task_runner.py,sha256=u4nF0wOADu_HVlGYVTOXnUm1woWGgYAccr-ZCzgtb6Q,2899
47
- ivoryos/utils/utils.py,sha256=BzgKIMMb7vyUIwYMhGDsWtwJEy5vNKtEHRJHHSiTSnM,13881
48
- tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
49
- tests/conftest.py,sha256=u2sQ6U-Lghyl7et1Oz6J2E5VZ47VINKcjRM_2leAE2s,3627
50
- tests/integration/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
51
- tests/integration/test_route_auth.py,sha256=l3ZDqr0oiCWS3yYSXGK5yMP6qI2t7Sv5I9zoYTkiyQU,2754
52
- tests/integration/test_route_control.py,sha256=YYIll84bTUEKiAxFiFSz6LF3fTldPNfCtHs0IR3mSdM,3935
53
- tests/integration/test_route_database.py,sha256=mS026W_hEuCTMpSkdRWvM-f4MYykK_6nRDJ4K5a7QA0,2342
54
- tests/integration/test_route_design.py,sha256=PJAvGRiCY6B53Pu1v5vPAVHHsuaqRmRKk2eesSNshLU,1157
55
- tests/integration/test_route_main.py,sha256=bmuf8Y_9CRWhiLLf4up11ltEd5YCdsLx6I-o26VGDEw,1228
56
- tests/integration/test_sockets.py,sha256=4ZyFyExm7a-DYzVqpzEONpWeb1a0IT68wyFaQu0rY_Y,925
57
- ivoryos-1.0.9.dist-info/LICENSE,sha256=p2c8S8i-8YqMpZCJnadLz1-ofxnRMILzz6NCMIypRag,1084
58
- ivoryos-1.0.9.dist-info/METADATA,sha256=hQZ8qTQfJGOrlFzsPj364ZTGKpgEeW0FKs7DJXqIbQc,8931
59
- ivoryos-1.0.9.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
60
- ivoryos-1.0.9.dist-info/top_level.txt,sha256=mIOiZkdpSwxFJt1R5fsyOff8mNprXHq1nMGNKNULIyE,14
61
- ivoryos-1.0.9.dist-info/RECORD,,
File without changes