use super::*;
impl AcpServer {
pub(super) async fn handle_incoming_message_scoped(&mut self, msg: serde_json::Value) {
if msg.get("method").is_none() && msg.get("id").is_some() {
if let Some(id) = msg["id"].as_u64() {
let mut pending = self.pending.lock().await;
if let Some(sender) = pending.remove(&id) {
let _ = sender.send(msg);
}
}
return;
}
let method = match msg.get("method").and_then(|v| v.as_str()) {
Some(m) => m.to_string(),
None => return,
};
let id = msg.get("id").cloned().unwrap_or(serde_json::Value::Null);
let params = msg.get("params").cloned().unwrap_or(serde_json::json!({}));
match method.as_str() {
"initialize" => {
self.handle_initialize(&id);
}
"authenticate" => {
self.handle_authenticate(&id, ¶ms).await;
}
HARN_PROVIDER_CATALOG_METHOD => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_provider_catalog(&id);
}
harn_vm::session_timeline::SESSION_TIMELINE_QUERY_METHOD => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_session_timeline_query(&id, ¶ms).await;
}
harn_vm::session_recap::SESSION_RECAP_QUERY_METHOD => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_session_recap_query(&id, ¶ms).await;
}
harn_vm::orchestration::SESSION_VIEW_QUERY_METHOD => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_session_view_query(&id, ¶ms).await;
}
harn_vm::session_timeline::SESSION_TIMELINE_SUBSCRIBE_METHOD => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_session_timeline_subscribe(&id, ¶ms).await;
}
harn_vm::session_timeline::SESSION_TIMELINE_UNSUBSCRIBE_METHOD => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_session_timeline_unsubscribe(&id, ¶ms);
}
"session/new" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_session_new(&id, ¶ms);
}
"session/load" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_session_load(&id, ¶ms).await;
}
"session/resume" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_session_resume(&id, ¶ms);
}
"session/fork" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_session_fork(&id, ¶ms);
}
"session/truncate" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_session_truncate(&id, ¶ms);
}
"session/set_mode" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_session_set_mode(&id, ¶ms);
}
"session/set_config_option" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_session_set_config_option(&id, ¶ms);
}
ACP_METHOD_SESSION_PLAN_DOCUMENT_MUTATE => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_plan_document_mutation(&id, ¶ms);
}
"session/fs_mode" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_session_fs_mode(&id, ¶ms);
}
"session/fs_commit_staged" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_session_fs_commit_staged(&id, ¶ms);
}
"session/fs_discard_staged" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_session_fs_discard_staged(&id, ¶ms);
}
"session/restore_tool_call" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_session_restore_tool_call(&id, ¶ms);
}
"session/rollback" | "harn.session_rollback" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_session_rollback(&id, ¶ms);
}
"session/redo" | "harn.session_redo" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_session_redo(&id, ¶ms);
}
"session/prompt" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_session_prompt(&id, ¶ms).await;
}
"session/cancel" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_session_cancel(&id, ¶ms);
}
"session/cancel_tool_call" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_session_cancel_tool_call(&id, ¶ms);
}
"session/close" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_session_close(&id, ¶ms, "session/close")
.await;
}
"session/live_clients" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_session_live_clients(&id, ¶ms);
}
"session/attach" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_session_attach(&id, ¶ms);
}
"session/takeover" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_session_takeover(&id, ¶ms);
}
"session/detach" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_session_detach(&id, ¶ms);
}
"session/heartbeat" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_session_heartbeat(&id, ¶ms);
}
"session/stop" => {
if self.reject_unauthenticated(&id) {
return;
}
tracing::warn!("ACP method session/stop is deprecated; use session/close instead");
eprintln!(
"warning: ACP method session/stop is deprecated; use session/close instead"
);
self.handle_session_close(&id, ¶ms, "session/stop")
.await;
}
"session/inject" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_session_inject(&id, ¶ms).await;
}
"session/inject_host_event" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_session_inject_host_event(&id, params);
}
"session/revoke_inject" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_session_revoke_inject(&id, ¶ms).await;
}
"session/replace_inject" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_session_replace_inject(&id, ¶ms).await;
}
"session/remind" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_session_remind(&id, ¶ms).await;
}
"session/pending_injections" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_session_pending_injections(&id, ¶ms).await;
}
"session/revoke_reminder" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_session_revoke_reminder(&id, ¶ms).await;
}
"agent/resume" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_agent_resume(¶ms);
}
"harn.hitl.respond" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_hitl_respond(&id, ¶ms).await;
}
"workflow/signal" | "harn.workflow.signal" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_workflow_signal(&id, ¶ms).await;
}
"workflow/query" | "harn.workflow.query" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_workflow_query(&id, ¶ms);
}
"workflow/update" | "harn.workflow.update" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_workflow_update(&id, ¶ms).await;
}
"workflow/pause" | "harn.workflow.pause" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_workflow_pause(&id, ¶ms);
}
"workflow/resume" | "harn.workflow.resume" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_workflow_resume(&id, ¶ms);
}
"session/list" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_session_list(&id, ¶ms).await;
}
"harn.session_workspace_roots" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_harn_session_workspace_roots(&id, ¶ms);
}
"harn.session_add_root" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_harn_session_add_root(&id, ¶ms);
}
"harn.session_reanchor" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_harn_session_reanchor(&id, ¶ms);
}
"mcp/catalog" | "harn.mcp.catalog" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_mcp_catalog(&id, ¶ms);
}
"mcp/status" | "harn.mcp.status" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_mcp_status(&id).await;
}
"mcp/authorize" | "harn.mcp.authorize" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_mcp_authorize(&id, ¶ms).await;
}
"mcp/authorize_batch" | "harn.mcp.authorize_batch" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_mcp_authorize_batch(&id, ¶ms).await;
}
"mcp/oauth_callback" | "harn.mcp.oauth_callback" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_mcp_oauth_callback(&id, ¶ms).await;
}
"mcp/import_token" | "harn.mcp.import_token" => {
if self.reject_unauthenticated(&id) {
return;
}
self.handle_mcp_import_token(&id, ¶ms).await;
}
_ => {
if !id.is_null() {
self.send_error(&id, -32601, &format!("Method not found: {method}"));
}
}
}
}
}