soothe-client-python 1.0.17__tar.gz → 1.0.20__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.17 → soothe_client_python-1.0.20}/PKG-INFO +1 -1
  2. {soothe_client_python-1.0.17 → soothe_client_python-1.0.20}/src/soothe_client/appkit/daemon_session.py +18 -0
  3. {soothe_client_python-1.0.17 → soothe_client_python-1.0.20}/src/soothe_client/protocol_params.py +0 -24
  4. {soothe_client_python-1.0.17 → soothe_client_python-1.0.20}/src/soothe_client/websocket.py +63 -0
  5. {soothe_client_python-1.0.17 → soothe_client_python-1.0.20}/.gitignore +0 -0
  6. {soothe_client_python-1.0.17 → soothe_client_python-1.0.20}/LICENSE +0 -0
  7. {soothe_client_python-1.0.17 → soothe_client_python-1.0.20}/README.md +0 -0
  8. {soothe_client_python-1.0.17 → soothe_client_python-1.0.20}/pyproject.toml +0 -0
  9. {soothe_client_python-1.0.17 → soothe_client_python-1.0.20}/src/soothe_client/__init__.py +0 -0
  10. {soothe_client_python-1.0.17 → soothe_client_python-1.0.20}/src/soothe_client/appkit/__init__.py +0 -0
  11. {soothe_client_python-1.0.17 → soothe_client_python-1.0.20}/src/soothe_client/appkit/attachments.py +0 -0
  12. {soothe_client_python-1.0.17 → soothe_client_python-1.0.20}/src/soothe_client/appkit/broadcaster.py +0 -0
  13. {soothe_client_python-1.0.17 → soothe_client_python-1.0.20}/src/soothe_client/appkit/card_projection.py +0 -0
  14. {soothe_client_python-1.0.17 → soothe_client_python-1.0.20}/src/soothe_client/appkit/chunk_filter.py +0 -0
  15. {soothe_client_python-1.0.17 → soothe_client_python-1.0.20}/src/soothe_client/appkit/classifier.py +0 -0
  16. {soothe_client_python-1.0.17 → soothe_client_python-1.0.20}/src/soothe_client/appkit/events.py +0 -0
  17. {soothe_client_python-1.0.17 → soothe_client_python-1.0.20}/src/soothe_client/appkit/loop_session_store.py +0 -0
  18. {soothe_client_python-1.0.17 → soothe_client_python-1.0.20}/src/soothe_client/appkit/managed_client.py +0 -0
  19. {soothe_client_python-1.0.17 → soothe_client_python-1.0.20}/src/soothe_client/appkit/observability.py +0 -0
  20. {soothe_client_python-1.0.17 → soothe_client_python-1.0.20}/src/soothe_client/appkit/pool.py +0 -0
  21. {soothe_client_python-1.0.17 → soothe_client_python-1.0.20}/src/soothe_client/appkit/query_gate.py +0 -0
  22. {soothe_client_python-1.0.17 → soothe_client_python-1.0.20}/src/soothe_client/appkit/thinking_step.py +0 -0
  23. {soothe_client_python-1.0.17 → soothe_client_python-1.0.20}/src/soothe_client/appkit/turn.py +0 -0
  24. {soothe_client_python-1.0.17 → soothe_client_python-1.0.20}/src/soothe_client/appkit/turn_boundary.py +0 -0
  25. {soothe_client_python-1.0.17 → soothe_client_python-1.0.20}/src/soothe_client/appkit/turn_runner.py +0 -0
  26. {soothe_client_python-1.0.17 → soothe_client_python-1.0.20}/src/soothe_client/command_client.py +0 -0
  27. {soothe_client_python-1.0.17 → soothe_client_python-1.0.20}/src/soothe_client/errors.py +0 -0
  28. {soothe_client_python-1.0.17 → soothe_client_python-1.0.20}/src/soothe_client/helpers.py +0 -0
  29. {soothe_client_python-1.0.17 → soothe_client_python-1.0.20}/src/soothe_client/intent_hints.py +0 -0
  30. {soothe_client_python-1.0.17 → soothe_client_python-1.0.20}/src/soothe_client/py.typed +0 -0
  31. {soothe_client_python-1.0.17 → soothe_client_python-1.0.20}/src/soothe_client/schemas.py +0 -0
  32. {soothe_client_python-1.0.17 → soothe_client_python-1.0.20}/src/soothe_client/session.py +0 -0
  33. {soothe_client_python-1.0.17 → soothe_client_python-1.0.20}/src/soothe_client/stream_terminal.py +0 -0
  34. {soothe_client_python-1.0.17 → soothe_client_python-1.0.20}/src/soothe_client/turn_boundary.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: soothe-client-python
3
- Version: 1.0.17
3
+ Version: 1.0.20
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
@@ -764,6 +764,24 @@ class DaemonSession:
764
764
  interaction_mode=interaction_mode,
765
765
  )
766
766
 
767
+ async def set_clarification_mode(self, mode: str) -> bool:
768
+ """Hot-swap the clarification mode on the running goal (RFC-622).
769
+
770
+ Sends ``loop_set_clarification_mode`` on the RPC socket. Returns
771
+ ``True`` when the swap landed on a live goal; ``False`` when no goal
772
+ is currently running (retry on the next turn).
773
+ """
774
+ if not self._loop_id:
775
+ return False
776
+ async with self._rpc_lock:
777
+ await self._ensure_rpc_connected()
778
+ result = await self._rpc_client.request(
779
+ "loop_set_clarification_mode",
780
+ {"loop_id": self._loop_id, "mode": mode},
781
+ timeout=5.0,
782
+ )
783
+ return bool(result.get("applied", False))
784
+
767
785
  async def _ensure_rpc_connected(self) -> None:
768
786
  if self._rpc_connected:
769
787
  return
@@ -13,8 +13,6 @@ __all__ = [
13
13
  # Loop RPC params
14
14
  "LoopGetParams",
15
15
  "LoopListParams",
16
- "LoopTreeParams",
17
- "LoopPruneParams",
18
16
  "LoopDeleteParams",
19
17
  "LoopNewParams",
20
18
  "LoopReattachParams",
@@ -120,28 +118,6 @@ class LoopListParams(ParamsBase):
120
118
  limit: int | None = Field(default=None, ge=1, description="Maximum results")
121
119
 
122
120
 
123
- class LoopTreeParams(ParamsBase):
124
- """Params for ``method=loop_tree``.
125
-
126
- Attributes:
127
- loop_id: Loop identifier (required).
128
- """
129
-
130
- loop_id: str = Field(..., min_length=1, description="Loop identifier")
131
-
132
-
133
- class LoopPruneParams(ParamsBase):
134
- """Params for ``method=loop_prune``.
135
-
136
- Attributes:
137
- loop_id: Loop identifier (required).
138
- keep_latest: Number of recent branches to keep (default 1).
139
- """
140
-
141
- loop_id: str = Field(..., min_length=1)
142
- keep_latest: int = Field(default=1, ge=1)
143
-
144
-
145
121
  class LoopDeleteParams(ParamsBase):
146
122
  """Params for ``method=loop_delete``.
147
123
 
@@ -1123,6 +1123,69 @@ class WebSocketClient:
1123
1123
  params["as_node"] = as_node
1124
1124
  return await self.request("loop_state_update", params, timeout=timeout)
1125
1125
 
1126
+ async def loop_delete(self, loop_id: str, *, timeout: float = 15.0) -> dict[str, Any]:
1127
+ """Delete a loop and its checkpoints (``loop_delete``)."""
1128
+ return await self.request(
1129
+ "loop_delete",
1130
+ {"loop_id": loop_id},
1131
+ timeout=timeout,
1132
+ )
1133
+
1134
+ async def loop_reattach(self, loop_id: str, *, timeout: float = 15.0) -> dict[str, Any]:
1135
+ """Reattach to an existing loop (``loop_reattach``)."""
1136
+ return await self.request(
1137
+ "loop_reattach",
1138
+ {"loop_id": loop_id},
1139
+ timeout=timeout,
1140
+ )
1141
+
1142
+ async def config_get(
1143
+ self,
1144
+ section: str | None = None,
1145
+ *,
1146
+ timeout: float = 10.0,
1147
+ ) -> dict[str, Any]:
1148
+ """Fetch a daemon config section (``config_get``)."""
1149
+ params: dict[str, Any] = {}
1150
+ if section:
1151
+ params["section"] = section
1152
+ return await self.request("config_get", params, timeout=timeout)
1153
+
1154
+ async def config_reload(self, *, timeout: float = 15.0) -> dict[str, Any]:
1155
+ """Reload daemon config from disk (``config_reload``)."""
1156
+ return await self.request("config_reload", {}, timeout=timeout)
1157
+
1158
+ async def daemon_shutdown(self, *, timeout: float = 10.0) -> dict[str, Any]:
1159
+ """Request a graceful daemon shutdown (``daemon_shutdown``)."""
1160
+ return await self.request("daemon_shutdown", {}, timeout=timeout)
1161
+
1162
+ async def authenticate(
1163
+ self,
1164
+ access_key: str,
1165
+ secret_key: str,
1166
+ *,
1167
+ timeout: float = 15.0,
1168
+ ) -> dict[str, Any]:
1169
+ """Submit credentials for daemon-side auth (``auth``)."""
1170
+ return await self.request(
1171
+ "auth",
1172
+ {"access_key": access_key, "secret_key": secret_key},
1173
+ timeout=timeout,
1174
+ )
1175
+
1176
+ async def refresh_auth_token(
1177
+ self,
1178
+ refresh_token: str,
1179
+ *,
1180
+ timeout: float = 15.0,
1181
+ ) -> dict[str, Any]:
1182
+ """Refresh the daemon-side auth token (``auth_refresh``)."""
1183
+ return await self.request(
1184
+ "auth_refresh",
1185
+ {"refresh_token": refresh_token},
1186
+ timeout=timeout,
1187
+ )
1188
+
1126
1189
  def _reset_disconnect_signal(self) -> None:
1127
1190
  """Clear the mid-session drop signal (called from ``connect``)."""
1128
1191
  self._disconn_event = asyncio.Event()