soothe-client-python 1.0.10__tar.gz → 1.0.11__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.
- {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/PKG-INFO +1 -1
- {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/command_client.py +18 -7
- {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/.gitignore +0 -0
- {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/LICENSE +0 -0
- {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/README.md +0 -0
- {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/pyproject.toml +0 -0
- {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/__init__.py +0 -0
- {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/__init__.py +0 -0
- {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/attachments.py +0 -0
- {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/broadcaster.py +0 -0
- {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/card_projection.py +0 -0
- {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/chunk_filter.py +0 -0
- {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/classifier.py +0 -0
- {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/daemon_session.py +0 -0
- {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/events.py +0 -0
- {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/loop_session_store.py +0 -0
- {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/managed_client.py +0 -0
- {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/observability.py +0 -0
- {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/pool.py +0 -0
- {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/query_gate.py +0 -0
- {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/thinking_step.py +0 -0
- {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/turn.py +0 -0
- {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/turn_boundary.py +0 -0
- {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/turn_runner.py +0 -0
- {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/errors.py +0 -0
- {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/helpers.py +0 -0
- {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/intent_hints.py +0 -0
- {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/protocol_params.py +0 -0
- {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/py.typed +0 -0
- {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/schemas.py +0 -0
- {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/session.py +0 -0
- {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/stream_terminal.py +0 -0
- {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/turn_boundary.py +0 -0
- {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/websocket.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: soothe-client-python
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.11
|
|
4
4
|
Summary: WebSocket client + appkit for soothe-daemon (Python)
|
|
5
5
|
Project-URL: Homepage, https://github.com/mirasoth/soothe-client-python
|
|
6
6
|
Project-URL: Documentation, https://soothe.readthedocs.io
|
{soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/command_client.py
RENAMED
|
@@ -158,7 +158,11 @@ class AsyncCommandClient:
|
|
|
158
158
|
self._timeout = timeout
|
|
159
159
|
|
|
160
160
|
async def _send_command(
|
|
161
|
-
self,
|
|
161
|
+
self,
|
|
162
|
+
command_type: str,
|
|
163
|
+
payload: dict[str, Any] | None = None,
|
|
164
|
+
*,
|
|
165
|
+
timeout: float | None = None,
|
|
162
166
|
) -> dict[str, Any]:
|
|
163
167
|
"""Send a protocol-1 request envelope and wait for the response.
|
|
164
168
|
|
|
@@ -171,6 +175,8 @@ class AsyncCommandClient:
|
|
|
171
175
|
Args:
|
|
172
176
|
command_type: RPC method name (e.g. ``"autopilot_status"``).
|
|
173
177
|
payload: Structured parameters object for the method.
|
|
178
|
+
timeout: Optional per-call override (seconds). Defaults to the
|
|
179
|
+
client constructor timeout.
|
|
174
180
|
|
|
175
181
|
Returns:
|
|
176
182
|
The ``result`` dict from the matching ``response`` envelope.
|
|
@@ -181,6 +187,7 @@ class AsyncCommandClient:
|
|
|
181
187
|
"""
|
|
182
188
|
import websockets
|
|
183
189
|
|
|
190
|
+
cmd_timeout = self._timeout if timeout is None else timeout
|
|
184
191
|
req_id = str(uuid4())
|
|
185
192
|
envelope = WireEnvelope(
|
|
186
193
|
type=MessageType.REQUEST.value,
|
|
@@ -190,15 +197,15 @@ class AsyncCommandClient:
|
|
|
190
197
|
)
|
|
191
198
|
|
|
192
199
|
try:
|
|
193
|
-
async with websockets.connect(self._ws_url, open_timeout=
|
|
194
|
-
await _perform_handshake(ws, timeout=
|
|
200
|
+
async with websockets.connect(self._ws_url, open_timeout=cmd_timeout) as ws:
|
|
201
|
+
await _perform_handshake(ws, timeout=cmd_timeout)
|
|
195
202
|
|
|
196
203
|
# Send the protocol-1 request envelope.
|
|
197
204
|
await ws.send(encode_envelope(envelope))
|
|
198
205
|
|
|
199
206
|
# Wait for the matching response/error envelope.
|
|
200
207
|
while True:
|
|
201
|
-
response_str = await asyncio.wait_for(ws.recv(), timeout=
|
|
208
|
+
response_str = await asyncio.wait_for(ws.recv(), timeout=cmd_timeout)
|
|
202
209
|
response = decode_envelope(response_str)
|
|
203
210
|
if not isinstance(response, dict):
|
|
204
211
|
raise RuntimeError(f"Unexpected response: {response_str!r}")
|
|
@@ -227,7 +234,7 @@ class AsyncCommandClient:
|
|
|
227
234
|
continue
|
|
228
235
|
|
|
229
236
|
except TimeoutError:
|
|
230
|
-
raise RuntimeError(f"Command timeout after {
|
|
237
|
+
raise RuntimeError(f"Command timeout after {cmd_timeout}s") from None
|
|
231
238
|
except websockets.exceptions.ConnectionClosedError as exc:
|
|
232
239
|
raise RuntimeError(f"WebSocket connection closed: {exc}") from exc
|
|
233
240
|
except RuntimeError:
|
|
@@ -249,13 +256,17 @@ class AsyncCommandClient:
|
|
|
249
256
|
workspace: str | None = None,
|
|
250
257
|
rail_id: str | None = None,
|
|
251
258
|
) -> dict[str, Any]:
|
|
252
|
-
"""Submit a new autopilot goal (returns ``goal_id``).
|
|
259
|
+
"""Submit a new autopilot goal (returns ``goal_id``).
|
|
260
|
+
|
|
261
|
+
Uses a 120s RPC timeout so placement analysis can finish before the
|
|
262
|
+
client gives up (intake may call the verifier LLM).
|
|
263
|
+
"""
|
|
253
264
|
payload: dict[str, Any] = {"description": description, "priority": priority}
|
|
254
265
|
if workspace:
|
|
255
266
|
payload["workspace"] = workspace
|
|
256
267
|
if rail_id:
|
|
257
268
|
payload["rail_id"] = rail_id
|
|
258
|
-
return await self._send_command("autopilot_submit", payload)
|
|
269
|
+
return await self._send_command("autopilot_submit", payload, timeout=120.0)
|
|
259
270
|
|
|
260
271
|
async def autopilot_list_goals(self) -> dict[str, Any]:
|
|
261
272
|
"""List all goals (including non-root children)."""
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/__init__.py
RENAMED
|
File without changes
|
{soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/attachments.py
RENAMED
|
File without changes
|
{soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/broadcaster.py
RENAMED
|
File without changes
|
|
File without changes
|
{soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/chunk_filter.py
RENAMED
|
File without changes
|
{soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/classifier.py
RENAMED
|
File without changes
|
|
File without changes
|
{soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/events.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/pool.py
RENAMED
|
File without changes
|
{soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/query_gate.py
RENAMED
|
File without changes
|
|
File without changes
|
{soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/turn.py
RENAMED
|
File without changes
|
|
File without changes
|
{soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/turn_runner.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/intent_hints.py
RENAMED
|
File without changes
|
{soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/protocol_params.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/stream_terminal.py
RENAMED
|
File without changes
|
{soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/turn_boundary.py
RENAMED
|
File without changes
|
|
File without changes
|