xenfra-sdk 0.1.7__tar.gz → 0.1.8__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.
- {xenfra_sdk-0.1.7 → xenfra_sdk-0.1.8}/PKG-INFO +1 -1
- {xenfra_sdk-0.1.7 → xenfra_sdk-0.1.8}/pyproject.toml +1 -1
- {xenfra_sdk-0.1.7 → xenfra_sdk-0.1.8}/src/xenfra_sdk/resources/deployments.py +26 -3
- {xenfra_sdk-0.1.7 → xenfra_sdk-0.1.8}/README.md +0 -0
- {xenfra_sdk-0.1.7 → xenfra_sdk-0.1.8}/src/xenfra_sdk/__init__.py +0 -0
- {xenfra_sdk-0.1.7 → xenfra_sdk-0.1.8}/src/xenfra_sdk/cli/__init__.py +0 -0
- {xenfra_sdk-0.1.7 → xenfra_sdk-0.1.8}/src/xenfra_sdk/cli/main.py +0 -0
- {xenfra_sdk-0.1.7 → xenfra_sdk-0.1.8}/src/xenfra_sdk/client.py +0 -0
- {xenfra_sdk-0.1.7 → xenfra_sdk-0.1.8}/src/xenfra_sdk/client_with_hooks.py +0 -0
- {xenfra_sdk-0.1.7 → xenfra_sdk-0.1.8}/src/xenfra_sdk/config.py +0 -0
- {xenfra_sdk-0.1.7 → xenfra_sdk-0.1.8}/src/xenfra_sdk/db/__init__.py +0 -0
- {xenfra_sdk-0.1.7 → xenfra_sdk-0.1.8}/src/xenfra_sdk/db/models.py +0 -0
- {xenfra_sdk-0.1.7 → xenfra_sdk-0.1.8}/src/xenfra_sdk/db/session.py +0 -0
- {xenfra_sdk-0.1.7 → xenfra_sdk-0.1.8}/src/xenfra_sdk/dependencies.py +0 -0
- {xenfra_sdk-0.1.7 → xenfra_sdk-0.1.8}/src/xenfra_sdk/dockerizer.py +0 -0
- {xenfra_sdk-0.1.7 → xenfra_sdk-0.1.8}/src/xenfra_sdk/engine.py +0 -0
- {xenfra_sdk-0.1.7 → xenfra_sdk-0.1.8}/src/xenfra_sdk/exceptions.py +0 -0
- {xenfra_sdk-0.1.7 → xenfra_sdk-0.1.8}/src/xenfra_sdk/mcp_client.py +0 -0
- {xenfra_sdk-0.1.7 → xenfra_sdk-0.1.8}/src/xenfra_sdk/models.py +0 -0
- {xenfra_sdk-0.1.7 → xenfra_sdk-0.1.8}/src/xenfra_sdk/patterns.json +0 -0
- {xenfra_sdk-0.1.7 → xenfra_sdk-0.1.8}/src/xenfra_sdk/privacy.py +0 -0
- {xenfra_sdk-0.1.7 → xenfra_sdk-0.1.8}/src/xenfra_sdk/recipes.py +0 -0
- {xenfra_sdk-0.1.7 → xenfra_sdk-0.1.8}/src/xenfra_sdk/resources/__init__.py +0 -0
- {xenfra_sdk-0.1.7 → xenfra_sdk-0.1.8}/src/xenfra_sdk/resources/base.py +0 -0
- {xenfra_sdk-0.1.7 → xenfra_sdk-0.1.8}/src/xenfra_sdk/resources/intelligence.py +0 -0
- {xenfra_sdk-0.1.7 → xenfra_sdk-0.1.8}/src/xenfra_sdk/resources/projects.py +0 -0
- {xenfra_sdk-0.1.7 → xenfra_sdk-0.1.8}/src/xenfra_sdk/security.py +0 -0
- {xenfra_sdk-0.1.7 → xenfra_sdk-0.1.8}/src/xenfra_sdk/templates/Dockerfile.j2 +0 -0
- {xenfra_sdk-0.1.7 → xenfra_sdk-0.1.8}/src/xenfra_sdk/templates/cloud-init.sh.j2 +0 -0
- {xenfra_sdk-0.1.7 → xenfra_sdk-0.1.8}/src/xenfra_sdk/templates/docker-compose.yml.j2 +0 -0
- {xenfra_sdk-0.1.7 → xenfra_sdk-0.1.8}/src/xenfra_sdk/utils.py +0 -0
|
@@ -133,6 +133,7 @@ class DeploymentsManager(BaseManager):
|
|
|
133
133
|
try:
|
|
134
134
|
# Use httpx to stream the SSE response
|
|
135
135
|
import httpx
|
|
136
|
+
import os
|
|
136
137
|
|
|
137
138
|
headers = {
|
|
138
139
|
"Authorization": f"Bearer {self._client._token}",
|
|
@@ -140,7 +141,19 @@ class DeploymentsManager(BaseManager):
|
|
|
140
141
|
"Content-Type": "application/json",
|
|
141
142
|
}
|
|
142
143
|
|
|
143
|
-
|
|
144
|
+
# Use streaming API URL if available (bypasses Cloudflare timeout)
|
|
145
|
+
# Otherwise fall back to regular API URL
|
|
146
|
+
streaming_api_url = os.getenv("XENFRA_STREAMING_API_URL")
|
|
147
|
+
if streaming_api_url:
|
|
148
|
+
base_url = streaming_api_url
|
|
149
|
+
elif self._client.api_url == "https://api.xenfra.tech":
|
|
150
|
+
# Production: use non-proxied streaming subdomain
|
|
151
|
+
base_url = "https://stream.xenfra.tech"
|
|
152
|
+
else:
|
|
153
|
+
# Local/dev: use regular API URL
|
|
154
|
+
base_url = self._client.api_url
|
|
155
|
+
|
|
156
|
+
url = f"{base_url}/deployments/stream"
|
|
144
157
|
|
|
145
158
|
with httpx.stream(
|
|
146
159
|
"POST",
|
|
@@ -179,13 +192,23 @@ class DeploymentsManager(BaseManager):
|
|
|
179
192
|
current_event = line[6:].strip()
|
|
180
193
|
elif line.startswith("data:"):
|
|
181
194
|
data = line[5:].strip()
|
|
195
|
+
|
|
196
|
+
# Get event type
|
|
197
|
+
event_type = current_event if 'current_event' in locals() else "message"
|
|
198
|
+
|
|
199
|
+
# Skip keep-alive events (used to prevent proxy timeouts)
|
|
200
|
+
if event_type == "keep-alive":
|
|
201
|
+
if 'current_event' in locals():
|
|
202
|
+
del current_event
|
|
203
|
+
continue
|
|
204
|
+
|
|
182
205
|
try:
|
|
183
206
|
# Try to parse as JSON
|
|
184
207
|
data_parsed = json.loads(data)
|
|
185
|
-
yield {"event":
|
|
208
|
+
yield {"event": event_type, "data": data_parsed}
|
|
186
209
|
except json.JSONDecodeError:
|
|
187
210
|
# If not JSON, yield as plain text
|
|
188
|
-
yield {"event":
|
|
211
|
+
yield {"event": event_type, "data": data}
|
|
189
212
|
|
|
190
213
|
# Reset current_event
|
|
191
214
|
if 'current_event' in locals():
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|