splime 0.4.3__tar.gz → 0.4.5__tar.gz

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 (116) hide show
  1. {splime-0.4.3/src/splime.egg-info → splime-0.4.5}/PKG-INFO +36 -5
  2. {splime-0.4.3 → splime-0.4.5}/README.md +35 -4
  3. {splime-0.4.3 → splime-0.4.5}/pyproject.toml +1 -1
  4. {splime-0.4.3 → splime-0.4.5}/src/spl/_client.py +373 -124
  5. splime-0.4.5/src/spl/_http.py +289 -0
  6. splime-0.4.5/src/spl/_owner_ref.py +51 -0
  7. splime-0.4.5/src/spl/_process.py +128 -0
  8. splime-0.4.5/src/spl/_timeout.py +49 -0
  9. {splime-0.4.3 → splime-0.4.5}/src/spl/_views.py +116 -18
  10. {splime-0.4.3 → splime-0.4.5}/src/spl/core/_common.py +749 -116
  11. splime-0.4.5/src/spl/core/_graph.py +36 -0
  12. {splime-0.4.3 → splime-0.4.5}/src/spl/core/adapter_compat.py +313 -30
  13. {splime-0.4.3 → splime-0.4.5}/src/spl/core/entities/adapter.py +158 -2
  14. {splime-0.4.3 → splime-0.4.5}/src/spl/core/entities/function.py +78 -11
  15. {splime-0.4.3 → splime-0.4.5}/src/spl/core/entities/node_remote.py +63 -11
  16. splime-0.4.5/src/spl/core/entities/pipeline.py +1038 -0
  17. splime-0.4.5/src/spl/core/entities/scalar.py +86 -0
  18. {splime-0.4.3 → splime-0.4.5}/src/spl/core/fingerprint.py +7 -16
  19. splime-0.4.5/src/spl/core/json_contract.py +280 -0
  20. {splime-0.4.3 → splime-0.4.5}/src/spl/core/manifest.py +71 -42
  21. {splime-0.4.3 → splime-0.4.5}/src/spl/core/node_runtime.py +100 -29
  22. splime-0.4.5/src/spl/core/redaction.py +303 -0
  23. {splime-0.4.3 → splime-0.4.5}/src/spl/core/resume.py +108 -0
  24. splime-0.4.5/src/spl/daemon/artifact_access.py +249 -0
  25. splime-0.4.5/src/spl/daemon/callback_capability.py +276 -0
  26. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/canonical.py +20 -10
  27. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/cli.py +71 -3
  28. splime-0.4.5/src/spl/daemon/docker_pool.py +1331 -0
  29. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/environment.py +2 -5
  30. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/environment_base.py +21 -11
  31. splime-0.4.5/src/spl/daemon/heartbeat_service.py +371 -0
  32. splime-0.4.5/src/spl/daemon/home_lock.py +520 -0
  33. splime-0.4.5/src/spl/daemon/metadata.py +1297 -0
  34. splime-0.4.5/src/spl/daemon/remote_client.py +813 -0
  35. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/repositories/env.py +2 -5
  36. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/repositories/library.py +75 -34
  37. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/repositories/object.py +104 -11
  38. splime-0.4.5/src/spl/daemon/repositories/run.py +1059 -0
  39. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/repositories/server_connection.py +7 -2
  40. splime-0.4.5/src/spl/daemon/repositories/sync_event.py +512 -0
  41. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/routes/_helpers.py +107 -8
  42. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/routes/artifacts.py +18 -7
  43. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/routes/diagnostics.py +9 -10
  44. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/routes/envs.py +1 -1
  45. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/routes/libraries.py +39 -13
  46. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/routes/objects.py +16 -27
  47. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/routes/remote.py +21 -7
  48. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/routes/runs.py +20 -9
  49. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/routes/server_connections.py +44 -13
  50. splime-0.4.5/src/spl/daemon/run_lifecycle.py +70 -0
  51. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/runtime_backend.py +38 -3
  52. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/runtime_config.py +8 -0
  53. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/runtime_dependencies.py +88 -5
  54. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/secret_store.py +3 -1
  55. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/server.py +2130 -311
  56. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/server_connection.py +25 -1
  57. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/services/sync.py +11 -1
  58. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/signature.py +71 -52
  59. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/spl_free_runner.py +85 -6
  60. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/storage_base.py +280 -3
  61. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/store.py +105 -12
  62. splime-0.4.5/src/spl/daemon/telemetry.py +916 -0
  63. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/worker.py +127 -51
  64. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/worker_runtime_marker.py +1 -0
  65. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon_client.py +100 -17
  66. {splime-0.4.3 → splime-0.4.5}/src/spl/pipeline_widget.py +7 -10
  67. {splime-0.4.3 → splime-0.4.5}/src/spl/server_client.py +19 -9
  68. {splime-0.4.3 → splime-0.4.5/src/splime.egg-info}/PKG-INFO +36 -5
  69. {splime-0.4.3 → splime-0.4.5}/src/splime.egg-info/SOURCES.txt +11 -0
  70. splime-0.4.3/src/spl/_http.py +0 -30
  71. splime-0.4.3/src/spl/core/entities/pipeline.py +0 -526
  72. splime-0.4.3/src/spl/core/entities/scalar.py +0 -48
  73. splime-0.4.3/src/spl/daemon/docker_pool.py +0 -569
  74. splime-0.4.3/src/spl/daemon/heartbeat_service.py +0 -150
  75. splime-0.4.3/src/spl/daemon/metadata.py +0 -401
  76. splime-0.4.3/src/spl/daemon/remote_client.py +0 -519
  77. splime-0.4.3/src/spl/daemon/repositories/run.py +0 -584
  78. splime-0.4.3/src/spl/daemon/repositories/sync_event.py +0 -170
  79. {splime-0.4.3 → splime-0.4.5}/LICENSE +0 -0
  80. {splime-0.4.3 → splime-0.4.5}/NOTICE +0 -0
  81. {splime-0.4.3 → splime-0.4.5}/setup.cfg +0 -0
  82. {splime-0.4.3 → splime-0.4.5}/src/spl/__init__.py +0 -0
  83. {splime-0.4.3 → splime-0.4.5}/src/spl/_deprecate.py +0 -0
  84. {splime-0.4.3 → splime-0.4.5}/src/spl/client.py +0 -0
  85. {splime-0.4.3 → splime-0.4.5}/src/spl/core/__init__.py +0 -0
  86. {splime-0.4.3 → splime-0.4.5}/src/spl/core/common.py +0 -0
  87. {splime-0.4.3 → splime-0.4.5}/src/spl/core/entities/__init__.py +0 -0
  88. {splime-0.4.3 → splime-0.4.5}/src/spl/core/entities/artifact.py +0 -0
  89. {splime-0.4.3 → splime-0.4.5}/src/spl/core/entities/control.py +0 -0
  90. {splime-0.4.3 → splime-0.4.5}/src/spl/core/entities/distribution.py +0 -0
  91. {splime-0.4.3 → splime-0.4.5}/src/spl/core/entities/local_function.py +0 -0
  92. {splime-0.4.3 → splime-0.4.5}/src/spl/core/entities/misc.py +0 -0
  93. {splime-0.4.3 → splime-0.4.5}/src/spl/core/entities/module.py +0 -0
  94. {splime-0.4.3 → splime-0.4.5}/src/spl/core/entities/node.py +0 -0
  95. {splime-0.4.3 → splime-0.4.5}/src/spl/core/entities/node_function.py +0 -0
  96. {splime-0.4.3 → splime-0.4.5}/src/spl/core/ir/__init__.py +0 -0
  97. {splime-0.4.3 → splime-0.4.5}/src/spl/core/ir/common.py +0 -0
  98. {splime-0.4.3 → splime-0.4.5}/src/spl/core/ir/parse.py +0 -0
  99. {splime-0.4.3 → splime-0.4.5}/src/spl/core/ir/unparse.py +0 -0
  100. {splime-0.4.3 → splime-0.4.5}/src/spl/core/ir/utils.py +0 -0
  101. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/__init__.py +0 -0
  102. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/__main__.py +0 -0
  103. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/client.py +0 -0
  104. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/docker_environment.py +0 -0
  105. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/doctor.py +0 -0
  106. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/interpreter_visibility.py +0 -0
  107. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/repositories/__init__.py +0 -0
  108. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/routes/__init__.py +0 -0
  109. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/run_progress.py +0 -0
  110. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/services/__init__.py +0 -0
  111. {splime-0.4.3 → splime-0.4.5}/src/spl/daemon/spl_free_generator.py +0 -0
  112. {splime-0.4.3 → splime-0.4.5}/src/spl/py.typed +0 -0
  113. {splime-0.4.3 → splime-0.4.5}/src/splime.egg-info/dependency_links.txt +0 -0
  114. {splime-0.4.3 → splime-0.4.5}/src/splime.egg-info/entry_points.txt +0 -0
  115. {splime-0.4.3 → splime-0.4.5}/src/splime.egg-info/requires.txt +0 -0
  116. {splime-0.4.3 → splime-0.4.5}/src/splime.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: splime
3
- Version: 0.4.3
3
+ Version: 0.4.5
4
4
  Summary: Reuse Python functions across projects without rewriting or redeploying them.
5
5
  Author-email: Yastrebov Kirill <yastrebovks@gmail.com>
6
6
  License-Expression: Apache-2.0
@@ -76,11 +76,14 @@ redeploying.
76
76
  ## Requirements
77
77
 
78
78
  - Python **3.13+**
79
+ - POSIX for local daemon environment builds and timeout-safe worker execution
80
+ in 0.4.5 (Windows Job Object support is not yet implemented; Windows
81
+ client-only use is unaffected)
79
82
 
80
83
  ## Install
81
84
 
82
85
  ```bash
83
- pip install splime
86
+ python3.13 -m pip install "splime==0.4.5"
84
87
  ```
85
88
 
86
89
  The distribution is named `splime`; the Python import package is `spl`.
@@ -119,7 +122,7 @@ it by name and get back the value (plus logs and any artifacts).
119
122
 
120
123
  The same `call` becomes a remote run when you point it at a library, an owner, or a
121
124
  target machine. This requires a connected splime server and a private worker; the local
122
- daemon builds an isolated environment on the worker before executing.
125
+ daemon builds the declared dependency environment on the worker before executing.
123
126
 
124
127
  ```python
125
128
  client = SPLClient(user_token="…", machine_token="…") # connect the daemon to your server
@@ -157,10 +160,38 @@ splime runs code that you publish on purpose, on machines you control. It is bui
157
160
 
158
161
  - **explicit ownership** of every published object,
159
162
  - **scoped access** grants per library (read metadata, read objects, execute),
160
- - **private worker boundaries** — the server coordinates, your own workers execute,
161
- - **isolated environments** built by the daemon before a run,
163
+ - **private worker topology** — the server coordinates, your own workers execute,
164
+ - **dependency environments** built by the daemon before a run,
165
+ - **metadata-only central telemetry by default** — local inputs, results,
166
+ error details, streams, and artifact bodies stay on the machine; diagnostic
167
+ adds only redacted/truncated error and stdout/stderr text, while full also
168
+ opts in to redacted inputs, results, and supported text artifacts,
162
169
  - an **auditable run history**.
163
170
 
171
+ Credentialed central-server traffic requires a direct HTTPS endpoint and never
172
+ follows redirects. Loopback HTTP remains available for local development; the
173
+ only other plaintext path is the exact Docker callback carrying only a scoped
174
+ run capability.
175
+
176
+ Native and `venv-subprocess` runtimes execute trusted code under the
177
+ conductor's OS identity—the daemon user for daemon-managed runs. A virtual
178
+ environment separates dependencies and a subprocess separates execution, but
179
+ neither is an OS sandbox. Docker or a deliberately separate OS identity is
180
+ required when code must not read same-UID daemon files. Docker provides the
181
+ configured process/filesystem boundary, subject to its mounts and network
182
+ options and to trust in the Docker daemon and host.
183
+
184
+ Scoped callback capabilities limit the authority intentionally passed over the
185
+ worker protocol. They do not protect against arbitrary same-UID file reads and
186
+ do not turn a native or virtual-environment worker into a sandbox.
187
+
188
+ Docker object runs use one container per run by default and mount only that
189
+ run's writable directory. Warm pooling is explicitly opt-in with
190
+ `spl-daemon serve --docker-pool-enabled --docker-pool-size N`; pooled
191
+ containers share all runs for that daemon and are suitable only for
192
+ single-tenant, mutually trusting workloads. One process also exclusively locks
193
+ each daemon home before opening its database or publishing its endpoint.
194
+
164
195
  ## How it fits together
165
196
 
166
197
  | Piece | What it does |
@@ -21,11 +21,14 @@ redeploying.
21
21
  ## Requirements
22
22
 
23
23
  - Python **3.13+**
24
+ - POSIX for local daemon environment builds and timeout-safe worker execution
25
+ in 0.4.5 (Windows Job Object support is not yet implemented; Windows
26
+ client-only use is unaffected)
24
27
 
25
28
  ## Install
26
29
 
27
30
  ```bash
28
- pip install splime
31
+ python3.13 -m pip install "splime==0.4.5"
29
32
  ```
30
33
 
31
34
  The distribution is named `splime`; the Python import package is `spl`.
@@ -64,7 +67,7 @@ it by name and get back the value (plus logs and any artifacts).
64
67
 
65
68
  The same `call` becomes a remote run when you point it at a library, an owner, or a
66
69
  target machine. This requires a connected splime server and a private worker; the local
67
- daemon builds an isolated environment on the worker before executing.
70
+ daemon builds the declared dependency environment on the worker before executing.
68
71
 
69
72
  ```python
70
73
  client = SPLClient(user_token="…", machine_token="…") # connect the daemon to your server
@@ -102,10 +105,38 @@ splime runs code that you publish on purpose, on machines you control. It is bui
102
105
 
103
106
  - **explicit ownership** of every published object,
104
107
  - **scoped access** grants per library (read metadata, read objects, execute),
105
- - **private worker boundaries** — the server coordinates, your own workers execute,
106
- - **isolated environments** built by the daemon before a run,
108
+ - **private worker topology** — the server coordinates, your own workers execute,
109
+ - **dependency environments** built by the daemon before a run,
110
+ - **metadata-only central telemetry by default** — local inputs, results,
111
+ error details, streams, and artifact bodies stay on the machine; diagnostic
112
+ adds only redacted/truncated error and stdout/stderr text, while full also
113
+ opts in to redacted inputs, results, and supported text artifacts,
107
114
  - an **auditable run history**.
108
115
 
116
+ Credentialed central-server traffic requires a direct HTTPS endpoint and never
117
+ follows redirects. Loopback HTTP remains available for local development; the
118
+ only other plaintext path is the exact Docker callback carrying only a scoped
119
+ run capability.
120
+
121
+ Native and `venv-subprocess` runtimes execute trusted code under the
122
+ conductor's OS identity—the daemon user for daemon-managed runs. A virtual
123
+ environment separates dependencies and a subprocess separates execution, but
124
+ neither is an OS sandbox. Docker or a deliberately separate OS identity is
125
+ required when code must not read same-UID daemon files. Docker provides the
126
+ configured process/filesystem boundary, subject to its mounts and network
127
+ options and to trust in the Docker daemon and host.
128
+
129
+ Scoped callback capabilities limit the authority intentionally passed over the
130
+ worker protocol. They do not protect against arbitrary same-UID file reads and
131
+ do not turn a native or virtual-environment worker into a sandbox.
132
+
133
+ Docker object runs use one container per run by default and mount only that
134
+ run's writable directory. Warm pooling is explicitly opt-in with
135
+ `spl-daemon serve --docker-pool-enabled --docker-pool-size N`; pooled
136
+ containers share all runs for that daemon and are suitable only for
137
+ single-tenant, mutually trusting workloads. One process also exclusively locks
138
+ each daemon home before opening its database or publishing its endpoint.
139
+
109
140
  ## How it fits together
110
141
 
111
142
  | Piece | What it does |
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "splime"
7
- version = "0.4.3"
7
+ version = "0.4.5"
8
8
 
9
9
  description = "Reuse Python functions across projects without rewriting or redeploying them."
10
10
  readme = "README.md"