code-analysis-client 1.6.304__tar.gz → 1.6.306__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 (30) hide show
  1. {code_analysis_client-1.6.304 → code_analysis_client-1.6.306}/PKG-INFO +8 -6
  2. {code_analysis_client-1.6.304 → code_analysis_client-1.6.306}/README.md +7 -5
  3. {code_analysis_client-1.6.304 → code_analysis_client-1.6.306}/code_analysis_client/client.py +3 -1
  4. {code_analysis_client-1.6.304 → code_analysis_client-1.6.306}/code_analysis_client/exceptions.py +5 -1
  5. {code_analysis_client-1.6.304 → code_analysis_client-1.6.306}/code_analysis_client/queue_wait.py +12 -5
  6. {code_analysis_client-1.6.304 → code_analysis_client-1.6.306}/code_analysis_client/server_api.py +4 -8
  7. code_analysis_client-1.6.306/code_analysis_client/version.txt +1 -0
  8. {code_analysis_client-1.6.304 → code_analysis_client-1.6.306}/code_analysis_client.egg-info/PKG-INFO +8 -6
  9. code_analysis_client-1.6.304/code_analysis_client/version.txt +0 -1
  10. {code_analysis_client-1.6.304 → code_analysis_client-1.6.306}/code_analysis_client/__init__.py +0 -0
  11. {code_analysis_client-1.6.304 → code_analysis_client-1.6.306}/code_analysis_client/check_chain.py +0 -0
  12. {code_analysis_client-1.6.304 → code_analysis_client-1.6.306}/code_analysis_client/commands_proxy.py +0 -0
  13. {code_analysis_client-1.6.304 → code_analysis_client-1.6.306}/code_analysis_client/config.py +0 -0
  14. {code_analysis_client-1.6.304 → code_analysis_client-1.6.306}/code_analysis_client/file_session.py +0 -0
  15. {code_analysis_client-1.6.304 → code_analysis_client-1.6.306}/code_analysis_client/project.py +0 -0
  16. {code_analysis_client-1.6.304 → code_analysis_client-1.6.306}/code_analysis_client/py.typed +0 -0
  17. {code_analysis_client-1.6.304 → code_analysis_client-1.6.306}/code_analysis_client/responses.py +0 -0
  18. {code_analysis_client-1.6.304 → code_analysis_client-1.6.306}/code_analysis_client/schema_disk_cache.py +0 -0
  19. {code_analysis_client-1.6.304 → code_analysis_client-1.6.306}/code_analysis_client/server_schema.py +0 -0
  20. {code_analysis_client-1.6.304 → code_analysis_client-1.6.306}/code_analysis_client/symbol_tree.py +0 -0
  21. {code_analysis_client-1.6.304 → code_analysis_client-1.6.306}/code_analysis_client/universal_file.py +0 -0
  22. {code_analysis_client-1.6.304 → code_analysis_client-1.6.306}/code_analysis_client/validation.py +0 -0
  23. {code_analysis_client-1.6.304 → code_analysis_client-1.6.306}/code_analysis_client/vectorizer_state.py +0 -0
  24. {code_analysis_client-1.6.304 → code_analysis_client-1.6.306}/code_analysis_client/worktree.py +0 -0
  25. {code_analysis_client-1.6.304 → code_analysis_client-1.6.306}/code_analysis_client.egg-info/SOURCES.txt +0 -0
  26. {code_analysis_client-1.6.304 → code_analysis_client-1.6.306}/code_analysis_client.egg-info/dependency_links.txt +0 -0
  27. {code_analysis_client-1.6.304 → code_analysis_client-1.6.306}/code_analysis_client.egg-info/requires.txt +0 -0
  28. {code_analysis_client-1.6.304 → code_analysis_client-1.6.306}/code_analysis_client.egg-info/top_level.txt +0 -0
  29. {code_analysis_client-1.6.304 → code_analysis_client-1.6.306}/pyproject.toml +0 -0
  30. {code_analysis_client-1.6.304 → code_analysis_client-1.6.306}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-analysis-client
3
- Version: 1.6.304
3
+ Version: 1.6.306
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
@@ -73,11 +73,13 @@ out = await client.call("some_long_running_command", {...})
73
73
  Failures raise instead of returning an error envelope:
74
74
 
75
75
  * `CommandFailedError` — the command ran but its inner result is
76
- `{"success": false}` (immediate and queued commands alike; a failing result is
77
- never returned as a dict). Carries `.command`, `.job_id`, `.error` (the server's
78
- error object, e.g. `.error["code"]`) and `.result` (the inner envelope).
79
- * `JobFailedError` — the job failed/stopped/cancelled. Carries `.job_id`, `.status`
80
- and `.error` (always a structured error dict).
76
+ `{"success": false}`, or a queued job ended `failed` (immediate and queued
77
+ commands alike; a failing result is never returned as a dict). Carries
78
+ `.command`, `.job_id`, `.error` (the server's error object, e.g. `.error["code"]`)
79
+ and `.result` (the inner envelope, when there is one).
80
+ * `JobFailedError` — the job was stopped or cancelled, or the queue reported a
81
+ queue-level error. Carries `.job_id`, `.status` and `.error` (always a
82
+ structured error dict).
81
83
  * `JobTimeoutError` — only when a positive `timeout` elapses; the call detaches and
82
84
  the job keeps running server-side (`websocket.on_timeout` is `detach`).
83
85
  * `ClientValidationError` — the server refused the parameters (JSON-RPC `-32602`),
@@ -61,11 +61,13 @@ out = await client.call("some_long_running_command", {...})
61
61
  Failures raise instead of returning an error envelope:
62
62
 
63
63
  * `CommandFailedError` — the command ran but its inner result is
64
- `{"success": false}` (immediate and queued commands alike; a failing result is
65
- never returned as a dict). Carries `.command`, `.job_id`, `.error` (the server's
66
- error object, e.g. `.error["code"]`) and `.result` (the inner envelope).
67
- * `JobFailedError` — the job failed/stopped/cancelled. Carries `.job_id`, `.status`
68
- and `.error` (always a structured error dict).
64
+ `{"success": false}`, or a queued job ended `failed` (immediate and queued
65
+ commands alike; a failing result is never returned as a dict). Carries
66
+ `.command`, `.job_id`, `.error` (the server's error object, e.g. `.error["code"]`)
67
+ and `.result` (the inner envelope, when there is one).
68
+ * `JobFailedError` — the job was stopped or cancelled, or the queue reported a
69
+ queue-level error. Carries `.job_id`, `.status` and `.error` (always a
70
+ structured error dict).
69
71
  * `JobTimeoutError` — only when a positive `timeout` elapses; the call detaches and
70
72
  the job keeps running server-side (`websocket.on_timeout` is `detach`).
71
73
  * `ClientValidationError` — the server refused the parameters (JSON-RPC `-32602`),
@@ -305,7 +305,9 @@ class CodeAnalysisAsyncClient:
305
305
 
306
306
  An inner ``success=false`` raises
307
307
  :class:`~code_analysis_client.exceptions.CommandFailedError` (never returned as a dict);
308
- a job that ended failed/stopped/cancelled raises
308
+ a queued job that ended failed raises
309
+ :class:`~code_analysis_client.exceptions.CommandFailedError` with the server error code,
310
+ message and data (same as an immediate error); a job that was stopped or cancelled raises
309
311
  :class:`~code_analysis_client.exceptions.JobFailedError`; a server -32602 refusal raises
310
312
  :class:`~code_analysis_client.exceptions.ClientValidationError`. A negative ``timeout`` or
311
313
  a non-positive ``poll_interval`` raises ``ValueError`` before anything is sent.
@@ -63,7 +63,11 @@ class QueueJobError(RuntimeError):
63
63
 
64
64
 
65
65
  class JobFailedError(QueueJobError):
66
- """A queued job failed/stopped/cancelled, or reported an ``error`` status."""
66
+ """A queued job was stopped or cancelled, or reported a queue-level error status.
67
+
68
+ A queued job that ended ``failed`` with the command's own error raises
69
+ :class:`CommandFailedError` instead (owner decision 2026-11-07, bug e58c5982).
70
+ """
67
71
 
68
72
  def __init__(
69
73
  self,
@@ -7,7 +7,8 @@ for an existing job id). This module only turns what the adapter returns or rais
7
7
  client's public result/exception contract:
8
8
 
9
9
  * inner ``success=false`` -> :class:`~code_analysis_client.exceptions.CommandFailedError`
10
- * job failed / stopped / cancelled -> :class:`~code_analysis_client.exceptions.JobFailedError`
10
+ * job failed (the command's own error) -> :class:`~code_analysis_client.exceptions.CommandFailedError`
11
+ * job stopped / cancelled -> :class:`~code_analysis_client.exceptions.JobFailedError`
11
12
  * caller wait timeout (job keeps running) -> :class:`~code_analysis_client.exceptions.JobTimeoutError`
12
13
  * server JSON-RPC refusal -> :class:`~code_analysis_client.exceptions.ClientValidationError`
13
14
  (mapped in ``client.py`` next to the transport call)
@@ -138,12 +139,15 @@ def job_failure(
138
139
  terminal_event: Optional[Dict[str, Any]] = None,
139
140
  *,
140
141
  command: Optional[str] = None,
141
- ) -> Union[JobFailedError, ClientValidationError]:
142
+ ) -> Union[CommandFailedError, JobFailedError, ClientValidationError]:
142
143
  """Build the error for a job that ended failed / stopped / cancelled.
143
144
 
144
145
  A job whose structured error carries JSON-RPC ``-32602`` (the server validates after
145
- enqueueing) yields :class:`ClientValidationError` exactly like a top-level refusal; every other
146
- failure yields :class:`JobFailedError`.
146
+ enqueueing) yields :class:`ClientValidationError` exactly like a top-level refusal. A job that
147
+ ended ``failed`` (its command returned an error, or the job itself failed) yields
148
+ :class:`CommandFailedError` carrying the structured error, the same as an immediate command
149
+ that returns an error envelope (owner decision 2026-11-07, bug e58c5982, contract RC7). Only a
150
+ ``stopped`` / ``cancelled`` job yields :class:`JobFailedError`.
147
151
 
148
152
  ``error`` is always the structured error object: the failed command's own error when the
149
153
  status payload carries one, else the queue-level error (a bare string is wrapped as
@@ -167,6 +171,8 @@ def job_failure(
167
171
  error.get("data"),
168
172
  code=validation_error_code_for_command(command),
169
173
  )
174
+ if status == "failed":
175
+ return CommandFailedError(command, job_id, error)
170
176
  return JobFailedError(job_id, error, status=status)
171
177
 
172
178
 
@@ -212,7 +218,8 @@ def map_adapter_error(
212
218
 
213
219
  * ``CommandSessionTimeoutError`` / ``asyncio.TimeoutError`` -> ``JobTimeoutError`` (the job keeps running)
214
220
  * ``CommandInnerFailureError`` -> ``CommandFailedError``
215
- * ``CommandSessionFailedError`` with a terminal event -> ``JobFailedError`` (structured error)
221
+ * ``CommandSessionFailedError`` with a terminal event -> ``CommandFailedError`` when the job
222
+ ``failed``, ``JobFailedError`` when it was stopped / cancelled (structured error)
216
223
  * ``CommandSessionFailedError`` for a refused open (numeric ``code``) -> ``ClientRemoteResponseError``
217
224
  so the caller's JSON-RPC handling (-32602, -32601) is the same as on the HTTP path
218
225
  * ``CommandSessionFailedError`` for a refused open carrying the server's own string error
@@ -87,15 +87,11 @@ EDITING_REMOVED_COMMANDS: FrozenSet[str] = frozenset(
87
87
  "session_undo",
88
88
  "session_redo",
89
89
  "session_write",
90
- "delete_file",
91
- "delete_files_by_mask",
92
- "restore_deleted_files",
93
- "unmark_deleted_file",
94
- "cleanup_deleted_files",
90
+ # Bug 9ba69ede-a5fc-416a-a4db-f91fffad5aa2 (K6, commit 958c266c) re-registered delete_file, unmark_deleted_file,
91
+ # delete_files_by_mask, restore_deleted_files and cleanup_deleted_files; restore_backup_file, delete_backup and
92
+ # clear_all_backups are registered in hooks_register_part2 (F5 backup contract). They are served commands, so
93
+ # they are no longer listed here (live-deployed-server reported them as DISCREPANCY: listed removed but live-present).
95
94
  "collapse_versions",
96
- "restore_backup_file",
97
- "delete_backup",
98
- "clear_all_backups",
99
95
  "format_code",
100
96
  }
101
97
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-analysis-client
3
- Version: 1.6.304
3
+ Version: 1.6.306
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
@@ -73,11 +73,13 @@ out = await client.call("some_long_running_command", {...})
73
73
  Failures raise instead of returning an error envelope:
74
74
 
75
75
  * `CommandFailedError` — the command ran but its inner result is
76
- `{"success": false}` (immediate and queued commands alike; a failing result is
77
- never returned as a dict). Carries `.command`, `.job_id`, `.error` (the server's
78
- error object, e.g. `.error["code"]`) and `.result` (the inner envelope).
79
- * `JobFailedError` — the job failed/stopped/cancelled. Carries `.job_id`, `.status`
80
- and `.error` (always a structured error dict).
76
+ `{"success": false}`, or a queued job ended `failed` (immediate and queued
77
+ commands alike; a failing result is never returned as a dict). Carries
78
+ `.command`, `.job_id`, `.error` (the server's error object, e.g. `.error["code"]`)
79
+ and `.result` (the inner envelope, when there is one).
80
+ * `JobFailedError` — the job was stopped or cancelled, or the queue reported a
81
+ queue-level error. Carries `.job_id`, `.status` and `.error` (always a
82
+ structured error dict).
81
83
  * `JobTimeoutError` — only when a positive `timeout` elapses; the call detaches and
82
84
  the job keeps running server-side (`websocket.on_timeout` is `detach`).
83
85
  * `ClientValidationError` — the server refused the parameters (JSON-RPC `-32602`),