mirror of
https://github.com/pchuan98/codex.git
synced 2026-07-01 00:31:56 +08:00
[app-server] type client response payloads (#20050)
## Why `pr17088` adds typed server-originated request/response plumbing, but successful client responses are still erased into bare JSON-RPC `result` values before app-server can make any typed decision about them. This precursor PR keeps successful client responses typed until the outgoing response seam. It is intentionally limited to protocol/app-server plumbing so the analytics behavior change can review separately on top. ## What changed - Add `ClientResponsePayload` as the pre-serialization client response body type. - Route app-server successful response paths through the typed payload seam while preserving existing handler-local analytics behavior. - Keep `InterruptConversation` JSON-RPC-only because it has no `ClientResponse` variant. - Move the new payload conversion tests into a dedicated protocol test module. ## Verification - `cargo check -p codex-app-server` - `cargo test -p codex-app-server-protocol`
This commit is contained in:
committed by
GitHub
Unverified
parent
b15074d0a4
commit
973c5c823e
@@ -43,6 +43,7 @@ use codex_app_server_protocol::CancelLoginAccountResponse;
|
||||
use codex_app_server_protocol::CancelLoginAccountStatus;
|
||||
use codex_app_server_protocol::ClientRequest;
|
||||
use codex_app_server_protocol::ClientResponse;
|
||||
use codex_app_server_protocol::ClientResponsePayload;
|
||||
use codex_app_server_protocol::CodexErrorInfo;
|
||||
use codex_app_server_protocol::CollaborationModeListParams;
|
||||
use codex_app_server_protocol::CollaborationModeListResponse;
|
||||
@@ -2118,7 +2119,7 @@ impl CodexMessageProcessor {
|
||||
let result = self
|
||||
.exec_one_off_command_inner(request_id.clone(), params)
|
||||
.await
|
||||
.map(|()| None::<serde_json::Value>);
|
||||
.map(|()| None::<ClientResponsePayload>);
|
||||
self.send_optional_result(request_id, result).await;
|
||||
}
|
||||
|
||||
@@ -2864,7 +2865,6 @@ impl CodexMessageProcessor {
|
||||
response: response.clone(),
|
||||
},
|
||||
);
|
||||
|
||||
listener_task_context
|
||||
.outgoing
|
||||
.send_response(request_id, response)
|
||||
@@ -3544,7 +3544,7 @@ impl CodexMessageProcessor {
|
||||
let result = self
|
||||
.thread_rollback_start(&request_id, params)
|
||||
.await
|
||||
.map(|()| None::<serde_json::Value>);
|
||||
.map(|()| None::<ClientResponsePayload>);
|
||||
self.send_optional_result(request_id, result).await;
|
||||
}
|
||||
|
||||
@@ -4401,6 +4401,7 @@ impl CodexMessageProcessor {
|
||||
permission_profile,
|
||||
reasoning_effort: session_configured.reasoning_effort,
|
||||
};
|
||||
|
||||
self.analytics_events_client.track_response(
|
||||
request_id.connection_id.0,
|
||||
ClientResponse::ThreadResume {
|
||||
@@ -4408,7 +4409,6 @@ impl CodexMessageProcessor {
|
||||
response: response.clone(),
|
||||
},
|
||||
);
|
||||
|
||||
let connection_id = request_id.connection_id;
|
||||
let token_usage_thread = include_turns.then(|| response.thread.clone());
|
||||
self.outgoing.send_response(request_id, response).await;
|
||||
@@ -5027,7 +5027,6 @@ impl CodexMessageProcessor {
|
||||
response: response.clone(),
|
||||
},
|
||||
);
|
||||
|
||||
let connection_id = request_id.connection_id;
|
||||
let token_usage_thread = include_turns.then(|| response.thread.clone());
|
||||
self.outgoing.send_response(request_id, response).await;
|
||||
@@ -5811,7 +5810,7 @@ impl CodexMessageProcessor {
|
||||
request_id: ConnectionRequestId,
|
||||
result: Result<Option<T>, JSONRPCErrorError>,
|
||||
) where
|
||||
T: serde::Serialize,
|
||||
T: Into<ClientResponsePayload>,
|
||||
{
|
||||
match result {
|
||||
Ok(Some(response)) => self.outgoing.send_response(request_id, response).await,
|
||||
|
||||
Reference in New Issue
Block a user