code-analysis-client 1.6.201__tar.gz → 1.6.203__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 (28) hide show
  1. {code_analysis_client-1.6.201 → code_analysis_client-1.6.203}/PKG-INFO +1 -1
  2. {code_analysis_client-1.6.201 → code_analysis_client-1.6.203}/code_analysis_client/check_chain.py +1 -0
  3. {code_analysis_client-1.6.201 → code_analysis_client-1.6.203}/code_analysis_client/exceptions.py +10 -2
  4. {code_analysis_client-1.6.201 → code_analysis_client-1.6.203}/code_analysis_client/file_session.py +31 -1
  5. {code_analysis_client-1.6.201 → code_analysis_client-1.6.203}/code_analysis_client/responses.py +12 -3
  6. {code_analysis_client-1.6.201 → code_analysis_client-1.6.203}/code_analysis_client/server_api.py +2 -0
  7. code_analysis_client-1.6.203/code_analysis_client/version.txt +1 -0
  8. {code_analysis_client-1.6.201 → code_analysis_client-1.6.203}/code_analysis_client.egg-info/PKG-INFO +1 -1
  9. code_analysis_client-1.6.201/code_analysis_client/version.txt +0 -1
  10. {code_analysis_client-1.6.201 → code_analysis_client-1.6.203}/README.md +0 -0
  11. {code_analysis_client-1.6.201 → code_analysis_client-1.6.203}/code_analysis_client/__init__.py +0 -0
  12. {code_analysis_client-1.6.201 → code_analysis_client-1.6.203}/code_analysis_client/client.py +0 -0
  13. {code_analysis_client-1.6.201 → code_analysis_client-1.6.203}/code_analysis_client/commands_proxy.py +0 -0
  14. {code_analysis_client-1.6.201 → code_analysis_client-1.6.203}/code_analysis_client/config.py +0 -0
  15. {code_analysis_client-1.6.201 → code_analysis_client-1.6.203}/code_analysis_client/py.typed +0 -0
  16. {code_analysis_client-1.6.201 → code_analysis_client-1.6.203}/code_analysis_client/queue_wait.py +0 -0
  17. {code_analysis_client-1.6.201 → code_analysis_client-1.6.203}/code_analysis_client/schema_disk_cache.py +0 -0
  18. {code_analysis_client-1.6.201 → code_analysis_client-1.6.203}/code_analysis_client/server_schema.py +0 -0
  19. {code_analysis_client-1.6.201 → code_analysis_client-1.6.203}/code_analysis_client/universal_file.py +0 -0
  20. {code_analysis_client-1.6.201 → code_analysis_client-1.6.203}/code_analysis_client/validation.py +0 -0
  21. {code_analysis_client-1.6.201 → code_analysis_client-1.6.203}/code_analysis_client/vectorizer_state.py +0 -0
  22. {code_analysis_client-1.6.201 → code_analysis_client-1.6.203}/code_analysis_client/worktree.py +0 -0
  23. {code_analysis_client-1.6.201 → code_analysis_client-1.6.203}/code_analysis_client.egg-info/SOURCES.txt +0 -0
  24. {code_analysis_client-1.6.201 → code_analysis_client-1.6.203}/code_analysis_client.egg-info/dependency_links.txt +0 -0
  25. {code_analysis_client-1.6.201 → code_analysis_client-1.6.203}/code_analysis_client.egg-info/requires.txt +0 -0
  26. {code_analysis_client-1.6.201 → code_analysis_client-1.6.203}/code_analysis_client.egg-info/top_level.txt +0 -0
  27. {code_analysis_client-1.6.201 → code_analysis_client-1.6.203}/pyproject.toml +0 -0
  28. {code_analysis_client-1.6.201 → code_analysis_client-1.6.203}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-analysis-client
3
- Version: 1.6.201
3
+ Version: 1.6.203
4
4
  Summary: Async JSON-RPC client for the code-analysis MCP server (mcp-proxy-adapter JsonRpcClient)
5
5
  Author-email: Vasiliy Zdanovskiy <vasilyvz@gmail.com>
6
6
  Requires-Python: >=3.10
@@ -43,6 +43,7 @@ FCP_ERROR_CODES = frozenset(
43
43
  "FCP_CHECK_TOOL_TIMEOUT",
44
44
  "WORKTREE_COMMIT_FAILED",
45
45
  "FCP_PROMOTE_RACE",
46
+ "FCP_CANCELLED_BY_CLEANUP",
46
47
  "GIT_NOT_AVAILABLE",
47
48
  "GIT_NOT_A_REPO",
48
49
  }
@@ -13,7 +13,12 @@ from typing import Any, Dict, Optional
13
13
 
14
14
 
15
15
  class ClientValidationError(ValueError):
16
- """Parameters do not match the command JSON schema (from server ``help``)."""
16
+ """Parameters do not match the command JSON schema, or the server refused a command.
17
+
18
+ ``code`` is ``VALIDATION_ERROR`` for a client-side parameter failure; when the server
19
+ answered with a refusal, ``code`` is the exact server error code (for example
20
+ ``SESSION_OPEN_IN_EDITOR``) and ``details`` is the server's error details object.
21
+ """
17
22
 
18
23
  code = "VALIDATION_ERROR"
19
24
 
@@ -23,11 +28,14 @@ class ClientValidationError(ValueError):
23
28
  *,
24
29
  field: Optional[str] = None,
25
30
  details: Optional[Dict[str, Any]] = None,
31
+ code: Optional[str] = None,
26
32
  ) -> None:
27
- """Initialize validation error with optional field and details payload."""
33
+ """Initialize with optional field, details payload and the server error code."""
28
34
  super().__init__(message)
29
35
  self.field = field
30
36
  self.details = details or {}
37
+ if code:
38
+ self.code = code
31
39
 
32
40
 
33
41
  class QueueJobError(RuntimeError):
@@ -171,7 +171,11 @@ class FileSessionClient:
171
171
  deleted.
172
172
 
173
173
  Returns ``session_id``, ``deleted``, ``released_lock_count``,
174
- ``released_subordinate_count``, and ``released_advisory_lease_count``.
174
+ ``released_subordinate_count``, ``released_advisory_lease_count``,
175
+ ``worktrees_removed``, ``checks_stopped`` and ``branches_deleted``. The session's checks
176
+ are stopped and every owned worktree and ``cas-worktree/*`` branch is removed whatever
177
+ ``force`` is. Every server refusal RAISES :class:`ClientValidationError` with ``code``
178
+ equal to the server error code and ``details`` the server details.
175
179
  """
176
180
  params: Dict[str, Any] = {"session_id": session_id}
177
181
  if force:
@@ -183,6 +187,32 @@ class FileSessionClient:
183
187
  )
184
188
  )
185
189
 
190
+ async def session_worktrees_delete(
191
+ self, project_id: str, session_id: str
192
+ ) -> Dict[str, Any]:
193
+ """Delete every check worktree and branch of a session in one project.
194
+
195
+ Calls ``session_worktrees_delete`` (the editor's cleanup after it closed its last file;
196
+ the session itself stays valid). Returns ``project_id``, ``session_id``,
197
+ ``session_valid``, ``checks_stopped``, ``worktrees_removed``, ``directory_removed``,
198
+ ``branches_deleted`` and ``already_clean``.
199
+
200
+ Every server refusal RAISES :class:`ClientValidationError` whose ``code`` is the server
201
+ error code (``SESSION_OPEN_IN_EDITOR`` with ``details['files']``,
202
+ ``SESSION_EDITOR_UNREACHABLE``, ``SESSION_CHECKS_STILL_RUNNING``,
203
+ ``WORKTREE_REMOVE_FAILED``, ``PROJECT_NOT_FOUND``, ``SESSION_NOT_FOUND``, ...) and whose
204
+ ``details`` is the server details object.
205
+ """
206
+ return _unwrap(
207
+ await self._client.call_validated(
208
+ "session_worktrees_delete",
209
+ {
210
+ "project_id": _require_non_empty(project_id, field="project_id"),
211
+ "session_id": _require_non_empty(session_id, field="session_id"),
212
+ },
213
+ )
214
+ )
215
+
186
216
  async def delete_foreign_session(
187
217
  self, session_id: str, *, force: bool = False
188
218
  ) -> Dict[str, Any]:
@@ -46,7 +46,11 @@ def unwrap_command_result(
46
46
  *,
47
47
  session_not_found_type: type[ClientValidationError] | None = None,
48
48
  ) -> Dict[str, Any]:
49
- """Return success ``data`` dict or raise :class:`ClientValidationError`."""
49
+ """Return success ``data`` dict or raise :class:`ClientValidationError`.
50
+
51
+ A refusal raises with ``.code`` equal to the server error code and ``.details`` equal to the
52
+ server's error details object (``{}`` when it carries none).
53
+ """
50
54
  if data.get("success"):
51
55
  inner = data.get("data")
52
56
  return inner if isinstance(inner, dict) else data
@@ -57,8 +61,11 @@ def unwrap_command_result(
57
61
  message = err.get("message")
58
62
  if message is None:
59
63
  message = str(data)
64
+ server_details = vectorizer_error_details(data)
60
65
  if code == "SESSION_NOT_FOUND" and session_not_found_type is not None:
61
- raise session_not_found_type(message, field="session_id", details=data)
66
+ raise session_not_found_type(
67
+ message, field="session_id", details=server_details, code=code
68
+ )
62
69
  if code == "VECTORIZER_UNAVAILABLE":
63
70
  details = vectorizer_error_details(data)
64
71
  raise VectorizerUnavailableError(
@@ -71,4 +78,6 @@ def unwrap_command_result(
71
78
  retry_after_seconds=details.get("retry_after_seconds"),
72
79
  details=details,
73
80
  )
74
- raise ClientValidationError(message, field="command", details=data)
81
+ raise ClientValidationError(
82
+ message, field="command", details=server_details, code=code or None
83
+ )
@@ -133,6 +133,7 @@ FILE_SESSION_COMMANDS: FrozenSet[str] = frozenset(
133
133
  "session_create",
134
134
  "session_validate",
135
135
  "session_delete",
136
+ "session_worktrees_delete",
136
137
  "session_list",
137
138
  "session_view",
138
139
  "session_open_file",
@@ -170,6 +171,7 @@ FILE_SESSION_FACADE_METHODS: Dict[str, str] = {
170
171
  "session_create": "create_session",
171
172
  "session_validate": "validate_session",
172
173
  "session_delete": "delete_session",
174
+ "session_worktrees_delete": "session_worktrees_delete",
173
175
  "session_list": "list_sessions",
174
176
  "session_view": "view_session",
175
177
  "session_open_file": "lock_file",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-analysis-client
3
- Version: 1.6.201
3
+ Version: 1.6.203
4
4
  Summary: Async JSON-RPC client for the code-analysis MCP server (mcp-proxy-adapter JsonRpcClient)
5
5
  Author-email: Vasiliy Zdanovskiy <vasilyvz@gmail.com>
6
6
  Requires-Python: >=3.10