diff --git a/bin/pudox-run/src/main.rs b/bin/pudox-run/src/main.rs index 6e79674..1ae67e2 100644 --- a/bin/pudox-run/src/main.rs +++ b/bin/pudox-run/src/main.rs @@ -21,7 +21,7 @@ async fn main() -> Result<(), Box> { let args: Vec = std::env::args().collect(); let session_id = args.get(1).cloned().unwrap_or_default(); - let task = load_task().await?; + let task = load_task(&session_id).await?; tracing::info!("Loaded task '{}'", task.title); @@ -83,15 +83,25 @@ struct Task { description: String, } -async fn load_task() -> Result> { +async fn load_task(session_id: &str) -> Result> { #[derive(serde::Deserialize)] struct TaskPayload { title: String, description: String, } - let url = format!("{}", PUDOXD_TASK_URL); - let payload: TaskPayload = reqwest::get(&url).await?.json().await?; + let resp = reqwest::Client::new() + .get(PUDOXD_TASK_URL) + .header("X-Session-Id", session_id) + .send() + .await?; + + let status = resp.status(); + let body = resp.text().await?; + // tracing::info!("GET /task status={} body={}", status, body); + + let payload: TaskPayload = serde_json::from_str(&body) + .map_err(|e| format!("GET /task parse error (status={}): {}", status, e))?; Ok(Task { title: payload.title, diff --git a/bin/pudoxd/src/main.rs b/bin/pudoxd/src/main.rs index ca9d4a9..5b90cf5 100644 --- a/bin/pudoxd/src/main.rs +++ b/bin/pudoxd/src/main.rs @@ -59,10 +59,34 @@ struct TaskPayload { description: String, } -async fn task_handler(State(_app): State) -> impl IntoResponse { +async fn task_handler(State(app): State, headers: axum::http::HeaderMap) -> impl IntoResponse { + let session_id = match headers.get("X-Session-Id").and_then(|v| v.to_str().ok()) { + Some(id) => id.to_string(), + None => return (StatusCode::BAD_REQUEST, "Missing X-Session-Id header").into_response(), + }; + + let prompt_context = { + let sessions = app.sessions.read().await; + let s = sessions.get(&session_id); + tracing::info!( + "GET /task session_id={} found={} has_context={}", + session_id, + s.is_some(), + s.and_then(|s| s.prompt_context.as_ref()).is_some() + ); + s.and_then(|s| s.prompt_context.clone()) + }; + + let description = match prompt_context { + Some(ctx) => ctx, + None => { + return (StatusCode::NOT_FOUND, "Session not found or has no context").into_response() + } + }; + Json(TaskPayload { - title: "Update README".to_string(), - description: "Add the current date to the README.md file.".to_string(), + title: session_id, + description, }) .into_response() } @@ -382,6 +406,7 @@ async fn webhook_handler(State(app): State, body: String) -> &'static str { let session_id = payload.agent_session.id.clone(); let issue_id = payload.agent_session.issue.as_ref().map(|i| i.id.clone()); + let prompt_context = payload.prompt_context.clone(); let (tx, rx) = mpsc::channel::(32); let (sse_tx, _) = tokio::sync::broadcast::channel::(64); @@ -394,16 +419,18 @@ async fn webhook_handler(State(app): State, body: String) -> &'static str { sse_tx.clone(), )); - let _ = tx.send(SessionMessage::Init(payload)).await; app.sessions.write().await.insert( session_id, Session { handle, - tx, + tx: tx.clone(), issue_id, + prompt_context, sse_tx, }, ); + + let _ = tx.send(SessionMessage::Init(payload)).await; } else if payload.event_type == "AgentSessionEvent" && payload.action == "prompted" { let session_id = &payload.agent_session.id; let prompt_body = payload diff --git a/bin/pudoxd/src/session.rs b/bin/pudoxd/src/session.rs index 155d612..c29e8fa 100644 --- a/bin/pudoxd/src/session.rs +++ b/bin/pudoxd/src/session.rs @@ -16,6 +16,7 @@ pub struct Session { pub handle: tokio::task::JoinHandle<()>, pub tx: mpsc::Sender, pub issue_id: Option, + pub prompt_context: Option, pub sse_tx: tokio::sync::broadcast::Sender, }