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.
Files changed (34) hide show
  1. {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/PKG-INFO +1 -1
  2. {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/command_client.py +18 -7
  3. {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/.gitignore +0 -0
  4. {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/LICENSE +0 -0
  5. {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/README.md +0 -0
  6. {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/pyproject.toml +0 -0
  7. {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/__init__.py +0 -0
  8. {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/__init__.py +0 -0
  9. {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/attachments.py +0 -0
  10. {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/broadcaster.py +0 -0
  11. {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/card_projection.py +0 -0
  12. {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/chunk_filter.py +0 -0
  13. {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/classifier.py +0 -0
  14. {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/daemon_session.py +0 -0
  15. {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/events.py +0 -0
  16. {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/loop_session_store.py +0 -0
  17. {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/managed_client.py +0 -0
  18. {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/observability.py +0 -0
  19. {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/pool.py +0 -0
  20. {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/query_gate.py +0 -0
  21. {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/thinking_step.py +0 -0
  22. {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/turn.py +0 -0
  23. {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/turn_boundary.py +0 -0
  24. {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/appkit/turn_runner.py +0 -0
  25. {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/errors.py +0 -0
  26. {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/helpers.py +0 -0
  27. {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/intent_hints.py +0 -0
  28. {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/protocol_params.py +0 -0
  29. {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/py.typed +0 -0
  30. {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/schemas.py +0 -0
  31. {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/session.py +0 -0
  32. {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/stream_terminal.py +0 -0
  33. {soothe_client_python-1.0.10 → soothe_client_python-1.0.11}/src/soothe_client/turn_boundary.py +0 -0
  34. {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.10
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
@@ -158,7 +158,11 @@ class AsyncCommandClient:
158
158
  self._timeout = timeout
159
159
 
160
160
  async def _send_command(
161
- self, command_type: str, payload: dict[str, Any] | None = None
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=self._timeout) as ws:
194
- await _perform_handshake(ws, timeout=self._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=self._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 {self._timeout}s") from None
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)."""