diff --git a/apps/api/app/routes/sessions.py b/apps/api/app/routes/sessions.py index 1d8da2c..3e23100 100644 --- a/apps/api/app/routes/sessions.py +++ b/apps/api/app/routes/sessions.py @@ -130,6 +130,7 @@ class TurnRequest(BaseModel): class LiveCoachRequest(BaseModel): learner_text: str = Field(..., min_length=1) + question: Optional[str] = None client_reply: Optional[str] = None turn_seq: Optional[int] = Field(default=None, ge=1) @@ -1673,6 +1674,7 @@ async def live_coach_turn( persona_code=sess.persona_code, persona_name=sess.persona.display_name, learner_text=body.learner_text, + question=body.question, client_reply=body.client_reply, recent_turns=sess.recent_turns(k=8, visible_to=LEARNER_VISIBLE_AI_ROLE), evaluation=_latest_turn_evaluation(sess, body.turn_seq), diff --git a/apps/api/app/services/live_coach.py b/apps/api/app/services/live_coach.py index 48520ce..b5faf37 100644 --- a/apps/api/app/services/live_coach.py +++ b/apps/api/app/services/live_coach.py @@ -133,6 +133,7 @@ class LiveCoachInput(BaseModel): persona_code: str persona_name: str learner_text: str + question: Optional[str] = None client_reply: Optional[str] = None recent_turns: list[dict[str, str]] = Field(default_factory=list) evaluation: Optional[dict[str, Any]] = None @@ -546,12 +547,33 @@ def _fallback_suggestion( ) crisis = guardrail.classify_crisis(text) + q = (item.question or "").strip() if crisis.kind != guardrail.CrisisKind.NONE: tone = "warn" focus = "risk" title = "안전 먼저" message = "위험 단서가 나온 턴이다. 방법을 캐묻지 말고 최근성, 강도, 보호요인을 차분히 확인해라." next_line = "그 생각이 최근에 얼마나 자주, 얼마나 강하게 올라오는지 안전을 위해 같이 확인해도 될까요?" + elif q and any(k in q for k in ("저항", "방어", "닫", "안 열", "거부")): + focus = "rapport" + title = "저항 수용과 안전감" + message = "내담자의 방어는 자연스러운 안전 전략입니다. 방어를 깨뜨리려 하지 말고 그 부담감을 먼저 수용해 주세요." + next_line = "지금 이 이야기를 꺼내는 것 자체가 많이 조심스럽고 부담되셨을 것 같아요." + elif q and any(k in q for k in ("공감", "라포", "위로", "마음", "감정")): + focus = "emotion" + title = "공감적 감정 명명" + message = "내담자가 겪고 있는 혼란스러운 마음에 이름을 붙여주고, 타당화하는 반영을 시도하세요." + next_line = "혼자서 그 모든 감정을 감당하느라 많이 지치고 외로우셨을 것 같습니다." + elif q and any(k in q for k in ("탐색", "질문", "원인", "호소", "사건")): + focus = "exploration" + title = "열린 초점 탐색" + message = "구체적인 촉발 사건과 그때의 신체 반응이나 생각을 묻는 열린 질문을 던져보세요." + next_line = "그런 생각이 들었을 때, 몸에서는 어떤 느낌이나 신호가 먼저 느껴졌나요?" + elif q and any(k in q for k in ("다음", "추천", "어떻게", "뭐라", "발화")): + focus = "exploration" + title = "다음 개입 추천" + message = f"현재 [{item.stage}] 단계 흐름에 맞춰 내담자의 감정을 먼저 수용하고 열린 질문으로 이어가세요." + next_line = stage_next_lines.get(str(item.stage), "그 상황에서 가장 크게 느껴졌던 마음은 어떤 것이었나요?") elif any(word in text for word in ("해야", "해봐", "괜찮아", "그냥", "왜 안")): tone = "warn" focus = "rapport" @@ -656,6 +678,11 @@ def _messages(item: LiveCoachInput, grounding: list[LiveCoachGrounding]) -> list ) or "(이번 회기 첫 코칭)" ) + question_block = ( + f"[상담자의 질문/요청]\n{_mask_prompt_text(item.question)}\n(상담자의 질문에 집중하여 조언과 추천 발화를 생성한다)\n\n" + if item.question + else "" + ) user = ( f"[세션] {item.session_id} / turn {item.turn_seq}\n" f"[내담자] {item.persona_name} ({item.persona_code})\n" @@ -663,6 +690,7 @@ def _messages(item: LiveCoachInput, grounding: list[LiveCoachGrounding]) -> list f"[이번 회기 목표 단계] {goals} — 코칭은 목표 단계 작업에 정렬하고, 목표를 이미 이뤘다면 심화를 제안한다.\n" f"[직전 코칭]\n{prior}\n(같은 조언을 반복하지 말고 다음 단계를 제시한다)\n\n" f"[최근 맥락]\n{recent}\n\n" + f"{question_block}" f"[이번 상담자 발화]\n{learner_masked}\n\n" f"[이어진 내담자 응답]\n{client_masked or '(아직 없음)'}\n\n" f"[fast-loop 평가 신호]\n{evaluation}\n\n" diff --git a/apps/api/engine.public.err.log.2026-08-07T2200.bak b/apps/api/engine.public.err.log.2026-08-07T2200.bak new file mode 100644 index 0000000..e3756ee --- /dev/null +++ b/apps/api/engine.public.err.log.2026-08-07T2200.bak @@ -0,0 +1,4 @@ +INFO: Started server process [8752] +INFO: Waiting for application startup. +INFO: Application startup complete. +INFO: Uvicorn running on http://127.0.0.1:9099 (Press CTRL+C to quit) diff --git a/apps/api/engine.public.err.log.20260809-160042.bak b/apps/api/engine.public.err.log.20260809-160042.bak new file mode 100644 index 0000000..1e204ed --- /dev/null +++ b/apps/api/engine.public.err.log.20260809-160042.bak @@ -0,0 +1,4 @@ +INFO: Started server process [69132] +INFO: Waiting for application startup. +INFO: Application startup complete. +INFO: Uvicorn running on http://127.0.0.1:9099 (Press CTRL+C to quit) diff --git a/apps/api/engine.public.out.log.2026-08-07T2200.bak b/apps/api/engine.public.out.log.2026-08-07T2200.bak new file mode 100644 index 0000000..bed851f --- /dev/null +++ b/apps/api/engine.public.out.log.2026-08-07T2200.bak @@ -0,0 +1,2235 @@ +INFO: 127.0.0.1:12361 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12391 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 503 Service Unavailable +INFO: 127.0.0.1:12417 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 503 Service Unavailable +INFO: 127.0.0.1:12419 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12447 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 503 Service Unavailable +INFO: 127.0.0.1:12448 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12447 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 503 Service Unavailable +INFO: 127.0.0.1:12448 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:13919 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:13921 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 503 Service Unavailable +INFO: 127.0.0.1:13919 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:13921 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 503 Service Unavailable +INFO: 127.0.0.1:13921 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 503 Service Unavailable +INFO: 127.0.0.1:13919 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2324 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2326 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 503 Service Unavailable +INFO: 127.0.0.1:2324 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2326 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 503 Service Unavailable +INFO: 127.0.0.1:2326 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 503 Service Unavailable +INFO: 127.0.0.1:2324 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1936 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1938 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 503 Service Unavailable +INFO: 127.0.0.1:1936 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1938 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 503 Service Unavailable +INFO: 127.0.0.1:1938 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 503 Service Unavailable +INFO: 127.0.0.1:1936 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2515 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2517 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 503 Service Unavailable +INFO: 127.0.0.1:2515 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2517 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 503 Service Unavailable +INFO: 127.0.0.1:2517 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 503 Service Unavailable +INFO: 127.0.0.1:2515 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5042 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5044 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 503 Service Unavailable +INFO: 127.0.0.1:5044 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 503 Service Unavailable +INFO: 127.0.0.1:9384 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9386 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 503 Service Unavailable +INFO: 127.0.0.1:9386 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 503 Service Unavailable +INFO: 127.0.0.1:3640 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3642 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3642 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4486 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4488 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4488 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7583 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7585 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7585 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5229 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5231 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5231 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8403 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8405 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8405 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4233 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4235 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4235 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8820 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8822 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8822 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6315 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6317 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6317 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2609 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2611 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2611 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8155 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8163 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8163 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10088 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1365 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1365 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3192 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11841 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11841 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11848 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11841 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1559 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1559 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4251 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4251 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4367 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4367 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14383 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14383 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6213 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6213 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4052 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4052 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2264 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2264 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3006 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3006 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9079 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9079 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1575 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9201 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1153 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1153 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6911 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6911 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1566 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1566 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:13316 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:13316 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9071 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9071 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9230 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9230 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7978 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7978 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7900 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7900 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1080 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1080 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7537 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7537 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3557 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2746 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14650 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14650 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12876 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12876 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7659 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7659 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10421 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10421 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14411 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14411 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11510 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11510 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8706 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8706 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14057 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14057 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4515 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1905 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1905 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3444 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6598 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6598 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12030 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12030 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12032 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12030 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8058 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8060 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8060 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12376 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12378 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12378 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9979 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9981 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9981 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10148 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10150 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10150 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9202 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9204 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9204 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7324 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7326 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7326 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5072 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5074 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5074 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14729 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14731 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14731 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1518 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1520 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1520 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3442 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3444 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3444 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3987 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3990 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3990 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2919 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2921 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2921 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3438 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3440 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3440 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5240 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5242 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5242 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5443 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5445 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5445 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14666 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14668 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14668 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14428 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14430 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14430 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14057 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14059 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14059 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12578 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12580 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12580 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4073 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1899 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1899 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4520 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4522 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4522 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11067 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11069 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11069 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11474 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11476 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11476 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1084 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1086 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1086 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8805 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8807 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8807 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14309 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14311 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14311 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7520 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7522 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7522 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8047 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1828 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1828 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6639 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6642 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6642 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11144 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11146 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11146 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8704 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8707 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8707 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3210 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3212 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3212 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1544 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1546 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1546 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7751 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:13324 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13324 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6489 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6491 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6491 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5264 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5266 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5266 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5893 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5896 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5896 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3642 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3644 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3644 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8110 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8112 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8112 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7352 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7354 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7354 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4647 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4649 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4649 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8896 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8898 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8898 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1212 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1214 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1214 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12028 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12030 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12030 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3246 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3248 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3248 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10374 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10376 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10376 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14759 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14761 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14761 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6216 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6218 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6218 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7974 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7976 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7976 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8208 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8210 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8210 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13985 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:13987 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13987 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3600 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3602 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3602 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4007 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4009 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4009 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5736 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5738 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5738 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14307 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14309 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14309 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4865 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4867 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4867 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1467 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1469 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1469 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11836 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11838 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11838 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7466 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7468 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7468 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5760 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5762 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5762 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1088 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1090 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1090 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11841 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11843 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11843 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8997 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9000 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9000 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8241 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11891 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11891 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7262 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7264 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7264 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9720 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9722 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9722 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6411 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6413 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6413 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8726 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8728 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8728 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6032 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6034 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6034 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14746 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14748 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14748 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11496 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11498 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11498 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12075 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12077 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12077 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2680 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2683 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2683 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7950 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7952 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7952 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6454 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6456 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6456 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7893 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7895 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7895 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3136 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3139 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3139 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6917 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6920 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6920 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3693 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3695 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3693 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3695 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:13403 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:13405 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13405 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10904 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6047 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6049 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6049 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10346 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10348 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10348 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12700 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12702 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12702 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1790 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2467 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2467 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1143 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1145 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1145 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4508 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4511 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4511 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9680 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9682 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9682 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13649 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:13651 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13651 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8363 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8365 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8365 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6085 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6087 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6087 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13347 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:13349 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13349 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13214 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:13216 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13216 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4028 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4030 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4030 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7369 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7371 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7371 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2335 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2337 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2337 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12482 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12484 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12484 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1043 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1046 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1046 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13701 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:13703 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13703 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6626 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6628 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6628 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12391 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12393 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12393 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8099 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8103 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8103 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5113 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5115 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5115 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11140 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11142 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11142 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2514 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2518 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2518 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1344 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1346 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1346 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5748 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5750 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5750 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6032 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6034 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6034 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1471 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1473 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1473 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8579 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8581 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8581 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5425 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5427 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5427 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7374 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7376 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7376 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2528 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7385 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7385 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4265 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14889 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14889 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6957 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3398 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3398 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13661 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3398 - "GET /ready?provider=agy_cli&model=gemini-3.6-flash-high&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3099 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3099 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14775 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14775 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9594 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9594 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6744 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6744 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8033 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8033 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10459 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10459 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4034 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4034 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2622 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2622 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2959 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2959 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2560 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2560 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2893 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2893 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7441 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7441 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7776 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7776 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7782 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7782 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8133 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8133 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8138 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8138 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8455 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8455 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4826 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4826 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5147 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5147 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9325 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9325 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10135 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10135 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14425 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14425 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1328 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1328 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7116 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7116 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4280 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4280 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6659 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4229 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2652 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2652 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7847 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7847 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5856 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5856 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3933 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3933 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6623 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6623 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9254 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9254 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9597 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9597 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1790 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1790 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2364 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2364 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5798 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1068 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9303 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9303 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2677 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2677 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12178 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12178 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1899 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1899 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9737 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9737 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4742 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4742 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7907 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7907 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11042 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11042 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4820 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4820 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5724 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5724 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6099 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6099 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4412 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4412 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10470 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10470 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12548 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12548 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3556 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3556 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4748 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4748 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5377 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5377 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8084 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8084 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3460 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3460 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4921 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4921 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4648 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4648 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5173 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5173 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3242 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3242 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6001 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6001 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8706 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8706 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5641 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5641 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12651 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12651 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5322 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5322 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5435 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5435 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:13128 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:13128 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1993 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1993 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2699 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2699 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5790 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5790 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11837 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11837 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12339 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12339 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14516 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14516 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9264 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9264 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9213 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9213 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4074 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4074 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1610 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1610 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2377 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2377 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1268 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1268 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7060 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7060 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3810 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3810 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2641 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2641 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6383 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6383 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8277 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8277 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5228 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5228 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12848 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12848 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2206 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2206 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2406 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2406 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3903 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3903 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10818 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10818 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7714 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7714 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10676 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10676 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7320 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7320 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4693 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4693 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8071 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8071 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6734 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6734 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2790 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2790 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8501 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8501 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:13246 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:13246 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2575 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2575 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4046 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4046 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9734 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9734 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12867 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12867 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10083 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10083 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2295 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2295 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11838 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11838 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4569 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4569 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6535 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6535 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7455 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7455 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4920 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4920 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:13424 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:13424 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5298 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5298 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2042 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2042 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7451 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7451 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2635 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2635 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7445 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7445 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10522 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10522 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:13891 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:13891 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1790 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1790 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:13320 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:13320 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2236 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2236 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4340 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4340 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1752 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1752 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5088 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5088 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12778 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12778 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:13841 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:13841 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14562 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14562 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10147 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10147 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7266 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7266 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7386 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7386 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1269 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1269 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6127 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6127 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6419 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6419 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4130 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4130 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6518 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6518 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10759 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10759 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1901 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1901 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8836 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8836 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11010 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11010 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5365 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5365 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8191 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8191 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6434 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6434 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6274 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6274 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6363 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10996 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7339 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1411 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1411 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1411 - "POST /v1/stream HTTP/1.1" 200 OK +INFO: 127.0.0.1:3272 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3272 - "POST /v1/stream HTTP/1.1" 200 OK +INFO: 127.0.0.1:5574 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5574 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5574 - "POST /v1/stream HTTP/1.1" 200 OK +INFO: 127.0.0.1:2786 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:2786 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10380 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:5298 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:6031 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9437 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:2786 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:6031 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6928 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6928 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6930 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6928 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10380 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:10380 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10380 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:10380 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:10380 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:10380 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:10380 - "DELETE /session/3055be0f-01ad-44b5-b786-810dfbf794f0 HTTP/1.1" 200 OK +INFO: 127.0.0.1:10380 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10380 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:10380 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:10380 - "DELETE /session/24d33776-ffea-422c-834a-47cd0d63961a HTTP/1.1" 200 OK +INFO: 127.0.0.1:1429 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:1429 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1429 - "DELETE /session/3d495cc7-4269-451a-8b39-d56f982f11fe HTTP/1.1" 200 OK +INFO: 127.0.0.1:1429 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1429 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:1429 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:1429 - "DELETE /session/af029997-677b-4c5d-8014-0bebb9c39e53 HTTP/1.1" 200 OK +INFO: 127.0.0.1:3498 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4342 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:2283 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2285 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2285 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4342 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4342 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4342 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4342 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:8495 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8495 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4966 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10991 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:8705 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8707 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8707 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10991 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:10991 - "DELETE /session/63f1a2b8-0545-437d-a0c1-7e80e4ba75db HTTP/1.1" 200 OK +INFO: 127.0.0.1:5775 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5775 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:2913 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:5775 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:2913 - "DELETE /session/db9ba9ee-9ef4-4e14-9828-02b265515d15 HTTP/1.1" 200 OK +INFO: 127.0.0.1:7717 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7717 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:7717 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:7717 - "DELETE /session/2b6db500-b556-4446-824e-a3e3d8c6b81b HTTP/1.1" 200 OK +INFO: 127.0.0.1:5775 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:7327 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:8843 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8845 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8845 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14375 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14377 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14377 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9021 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9024 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9024 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14186 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14188 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14188 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4845 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4848 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4848 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5246 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6328 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:6328 - "DELETE /session/alliance-1c6c3e10-aad7-5fc3-ba68-5e739b5fa629-independent-observer HTTP/1.1" 200 OK +INFO: 127.0.0.1:6328 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:6328 - "DELETE /session/alliance-c8dee912-4e88-5338-90d7-43a698642c34-independent-observer HTTP/1.1" 200 OK +INFO: 127.0.0.1:6328 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:6328 - "DELETE /session/alliance-c588278e-73ef-565b-b681-6ed5ee49049d-independent-observer HTTP/1.1" 200 OK +INFO: 127.0.0.1:1890 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1892 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1892 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6328 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:6328 - "DELETE /session/alliance-3c5fd531-45c2-5b67-9dd9-e245015398ce-client-report HTTP/1.1" 200 OK +INFO: 127.0.0.1:12964 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6328 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:6328 - "DELETE /session/alliance-d24fa4b0-f4cc-55a1-a895-b4aced7426fa-client-report HTTP/1.1" 200 OK +INFO: 127.0.0.1:6328 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:6328 - "DELETE /session/alliance-0afd7bf7-7523-5f4b-b54d-dff767b5b49c-client-report HTTP/1.1" 200 OK +INFO: 127.0.0.1:6328 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:6328 - "DELETE /session/alliance-4ed629b7-3015-5d0e-a9ad-9fbfee2b2add-client-report HTTP/1.1" 200 OK +INFO: 127.0.0.1:6328 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:6328 - "DELETE /session/alliance-ff87c9fa-e5da-5d1c-bcf0-428976a6fe7a-independent-observer HTTP/1.1" 200 OK +INFO: 127.0.0.1:13807 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5627 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7824 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1255 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1255 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3639 - "DELETE /session/b74a95f5-aa29-457c-8dcd-db03115c0ca0 HTTP/1.1" 200 OK +INFO: 127.0.0.1:11854 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7860 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:7860 - "DELETE /session/alliance-20e31374-d16a-5011-95d2-b81c73a50a98-independent-observer HTTP/1.1" 200 OK +INFO: 127.0.0.1:14538 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14539 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14539 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7860 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:7860 - "DELETE /session/alliance-7e7ae241-9ccc-5da1-be33-1cd9748c7444-independent-observer HTTP/1.1" 200 OK +INFO: 127.0.0.1:7860 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:7860 - "DELETE /session/alliance-2c292438-a576-5008-b8bf-2d832a0b5a5b-independent-observer HTTP/1.1" 200 OK +INFO: 127.0.0.1:7860 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:7860 - "DELETE /session/alliance-7e523f68-a251-5c18-88ec-a71e21a3be05-client-report HTTP/1.1" 200 OK +INFO: 127.0.0.1:7860 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:7860 - "DELETE /session/alliance-7f870c65-1c7b-5378-9aa0-5ba901821776-client-report HTTP/1.1" 200 OK +INFO: 127.0.0.1:7860 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:7860 - "DELETE /session/alliance-3773ae37-485e-57f7-a0a8-36b1f17ce407-client-report HTTP/1.1" 200 OK +INFO: 127.0.0.1:4269 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4269 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:7860 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:7860 - "DELETE /session/alliance-2294978e-3874-5ecf-a7ef-df0acf0ea92d-client-report HTTP/1.1" 200 OK +INFO: 127.0.0.1:4269 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:7860 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:7860 - "DELETE /session/alliance-43fc2fa6-2453-5863-8ba2-21d7692499ab-independent-observer HTTP/1.1" 200 OK +INFO: 127.0.0.1:4269 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4269 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4269 - "DELETE /session/4224799d-bd5a-4058-8038-0cef905407bd HTTP/1.1" 200 OK +INFO: 127.0.0.1:9354 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:3887 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3890 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3890 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5479 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5479 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:5479 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:5479 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:5479 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:5479 - "DELETE /session/6d92bae7-1e7a-4aa5-8cac-6d72fd409ba1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:6490 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:6490 - "DELETE /session/alliance-8152b939-4a9a-42bc-92c6-4226b679cb1a-client-report HTTP/1.1" 200 OK +INFO: 127.0.0.1:6491 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:6490 - "DELETE /session/alliance-8152b939-4a9a-42bc-92c6-4226b679cb1a-independent-observer HTTP/1.1" 200 OK +INFO: 127.0.0.1:7874 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:7874 - "DELETE /session/alliance-da2640ec-3898-5ae2-9e7f-138be3ed8849-independent-observer-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:6484 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:7874 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:7874 - "DELETE /session/alliance-99b123f1-1a6d-5599-9752-3f4b2541b544-independent-observer-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:7874 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:7874 - "DELETE /session/alliance-99b123f1-1a6d-5599-9752-3f4b2541b544-independent-observer-attempt-2 HTTP/1.1" 200 OK +INFO: 127.0.0.1:13556 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7874 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:7874 - "DELETE /session/alliance-dcfb8833-0f7c-5b57-a4d2-9f2eee45dff0-independent-observer-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:4191 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4191 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:7874 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:7874 - "DELETE /session/alliance-8ed466e9-5c54-5b6e-bb97-0d1e4f9cf096-client-report-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:4191 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4191 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:12656 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12658 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12658 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7874 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:7874 - "DELETE /session/alliance-f47483d5-3507-517e-a554-761f3f8b2b05-client-report-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:4191 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4191 - "DELETE /session/45ef2f63-d52c-47e4-97cb-98f3091bf27e HTTP/1.1" 200 OK +INFO: 127.0.0.1:7874 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:7874 - "DELETE /session/alliance-f47483d5-3507-517e-a554-761f3f8b2b05-client-report-attempt-2 HTTP/1.1" 200 OK +INFO: 127.0.0.1:6773 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:6773 - "DELETE /session/alliance-bb7d04ee-35fb-45d9-a4e0-c6c578aa8ebe-client-report-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:6774 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:6773 - "DELETE /session/alliance-bb7d04ee-35fb-45d9-a4e0-c6c578aa8ebe-independent-observer-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:6768 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:7874 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:7874 - "DELETE /session/alliance-db7e4ef7-e85d-565e-b160-e27a5bbc0e07-client-report-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:7874 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:7874 - "DELETE /session/alliance-325d03d6-3911-54b1-980e-9196629a8b9e-client-report-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:4228 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4228 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:7874 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:7874 - "DELETE /session/alliance-20b56cad-f7bc-5b05-9a66-0b2057c55feb-independent-observer-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:4228 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4228 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4228 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4228 - "DELETE /session/55389bd3-8ea2-4c9d-a625-a71fbb63d431 HTTP/1.1" 200 OK +INFO: 127.0.0.1:10760 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:10760 - "DELETE /session/alliance-adc45a38-1a53-4c59-bb41-72fdd65bdac0-independent-observer-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:10759 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:10759 - "DELETE /session/alliance-adc45a38-1a53-4c59-bb41-72fdd65bdac0-client-report-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:10759 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:10759 - "DELETE /session/alliance-adc45a38-1a53-4c59-bb41-72fdd65bdac0-client-report-attempt-2 HTTP/1.1" 200 OK +INFO: 127.0.0.1:10754 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:1082 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4352 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4089 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4352 - "DELETE /session/alliance-19c44830-2313-56f1-9007-7eb39b980043-independent-observer-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:4092 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4092 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4352 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4352 - "DELETE /session/alliance-bd185646-8bb6-5e59-94aa-b19a2570002d-independent-observer-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:4352 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4352 - "DELETE /session/alliance-6eb6846e-36e0-54f5-a866-8dd03f69657e-independent-observer-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:4352 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4352 - "DELETE /session/alliance-d6ce19c0-8575-5920-b1be-ea77ca43b370-client-report-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:4352 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4352 - "DELETE /session/alliance-1549f3b3-f92e-5a08-b7cd-f0f9c8e5c5d2-client-report-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:4352 - "POST /v1/generate HTTP/1.1" 502 Bad Gateway +INFO: 127.0.0.1:4352 - "DELETE /session/alliance-7b6c39fa-b916-557a-9ab5-3cc36f38064b-client-report-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:4352 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4352 - "DELETE /session/alliance-7b6c39fa-b916-557a-9ab5-3cc36f38064b-client-report-attempt-2 HTTP/1.1" 200 OK +INFO: 127.0.0.1:4352 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4352 - "DELETE /session/alliance-181edfc0-faf9-5f60-b122-7261f2c487c6-client-report-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:4352 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4352 - "DELETE /session/alliance-181edfc0-faf9-5f60-b122-7261f2c487c6-client-report-attempt-2 HTTP/1.1" 200 OK +INFO: 127.0.0.1:4352 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4352 - "DELETE /session/alliance-bfec51b4-b4a7-5a19-9772-24b4bd41004d-independent-observer-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:6393 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6395 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6395 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8118 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8121 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8121 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10300 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10304 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10304 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5564 - "DELETE /session/b70894f9-9251-431b-9eac-a645c9f79cfb HTTP/1.1" 200 OK +INFO: 127.0.0.1:9817 - "DELETE /session/8ade39da-dcea-4f92-b47f-b72490e8dcd9 HTTP/1.1" 200 OK +INFO: 127.0.0.1:12920 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12923 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12923 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4431 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4434 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4434 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8920 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8922 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8922 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11021 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9871 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9871 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:9871 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:9871 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:9871 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:9871 - "DELETE /session/8854fd64-2e63-45da-a97f-30e7ba8de1f2 HTTP/1.1" 200 OK +INFO: 127.0.0.1:7427 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:7427 - "DELETE /session/alliance-d85212f3-b9e1-4c73-8809-d34d7b473371-independent-observer-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:7426 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:7426 - "DELETE /session/alliance-d85212f3-b9e1-4c73-8809-d34d7b473371-client-report-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:7421 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4382 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4384 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4384 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4396 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4396 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4396 - "DELETE /session/0c0ad4fe-5a3a-4803-a6c3-62b2c4e5117d HTTP/1.1" 200 OK +INFO: 127.0.0.1:13100 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:8089 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13637 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:13637 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:13637 - "DELETE /session/9cea118f-8930-4732-8819-48449dda6322 HTTP/1.1" 200 OK +INFO: 127.0.0.1:8223 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8225 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8225 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10623 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:3267 - "DELETE /session/34f47553-e4b5-4f66-be87-7a0828baa05b HTTP/1.1" 200 OK +INFO: 127.0.0.1:9738 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9741 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9741 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6914 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:6914 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:5450 - "DELETE /session/2ecc4ecd-f453-4236-a01a-0a99b2669b55 HTTP/1.1" 200 OK +INFO: 127.0.0.1:6914 - "DELETE /session/582b5902-7781-494b-9d82-83f21430c750 HTTP/1.1" 200 OK +INFO: 127.0.0.1:6914 - "DELETE /session/49c99f59-0e7c-4342-827e-c32a351a79e3 HTTP/1.1" 200 OK +INFO: 127.0.0.1:6914 - "DELETE /session/a249e1b8-1a99-4c19-85da-036f07655be0 HTTP/1.1" 200 OK +INFO: 127.0.0.1:6914 - "DELETE /session/db66f277-2f93-416b-a8d2-d6cdf516ff32 HTTP/1.1" 200 OK +INFO: 127.0.0.1:5443 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:9583 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9585 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9585 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12492 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8479 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8479 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4624 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4626 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4626 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6424 - "DELETE /session/93397b1e-98d9-41e4-a345-33e488e0c2d7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:11014 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11016 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11016 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12860 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12862 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12862 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8332 - "DELETE /session/68c0f95b-b626-4360-8f50-f0718398084e HTTP/1.1" 200 OK +INFO: 127.0.0.1:7880 - "DELETE /session/dc7b8712-7be8-4f63-8d97-2441f494db96 HTTP/1.1" 200 OK +INFO: 127.0.0.1:6314 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6316 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6316 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6916 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8709 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8712 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8712 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14378 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14378 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14378 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:14378 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:14378 - "DELETE /session/85db5d45-8bf5-41e3-a3e6-39d86f95b277 HTTP/1.1" 200 OK +INFO: 127.0.0.1:2055 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:10972 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1932 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1932 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1676 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1678 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1678 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3413 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13048 - "DELETE /session/681c8298-493f-4580-9d95-21b1ca1d27f7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:10706 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:13989 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13989 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6459 - "DELETE /session/9dae8749-871c-45dd-bc21-60174ab0a7bd HTTP/1.1" 200 OK +INFO: 127.0.0.1:6099 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6099 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:7578 - "DELETE /session/3b352299-4c00-468a-a87c-a7282b8dd054 HTTP/1.1" 200 OK +INFO: 127.0.0.1:6099 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:6099 - "DELETE /session/7b9671f1-80a8-4871-ab49-7e7a0ad21eee HTTP/1.1" 200 OK +INFO: 127.0.0.1:10994 - "DELETE /session/78b24e48-6ca6-43c5-86c6-5499e6e7c947 HTTP/1.1" 200 OK +INFO: 127.0.0.1:4603 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:6536 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6536 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6536 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:6536 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:6536 - "DELETE /session/e3e07503-7033-41ea-808b-89bab82d86f1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:9924 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9926 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9926 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6201 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:7584 - "DELETE /session/b8d0fdc8-7272-4714-a9d6-1d24187a1604 HTTP/1.1" 200 OK +INFO: 127.0.0.1:14318 - "DELETE /session/79a31eba-43b9-48e9-8cde-8c7f63f2391f HTTP/1.1" 200 OK +INFO: 127.0.0.1:7172 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7174 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7174 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9170 - "DELETE /session/43d79497-4fd8-4000-9c87-8f3572686ec1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:3957 - "DELETE /session/e491c900-c5ae-4607-ac7c-4ba2eb3d1c84 HTTP/1.1" 200 OK +INFO: 127.0.0.1:4178 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4178 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:2429 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2431 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2431 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4178 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4178 - "DELETE /session/3b94e0ec-10a2-4ab6-916a-e64ccbb76598 HTTP/1.1" 200 OK +INFO: 127.0.0.1:5382 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4738 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4740 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4740 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11959 - "DELETE /session/e94d4620-7ed9-4b3a-8568-f8846b2aa2e2 HTTP/1.1" 200 OK +INFO: 127.0.0.1:10302 - "DELETE /session/9154a342-06a7-4e0e-8cf7-373f5be3cf9e HTTP/1.1" 200 OK +INFO: 127.0.0.1:2615 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2617 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2617 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9996 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9996 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:9996 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:9996 - "DELETE /session/3c834ffd-af5b-4a37-8fd3-ad0690deb165 HTTP/1.1" 200 OK +INFO: 127.0.0.1:1693 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:6164 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9975 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9977 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9977 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10449 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5603 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2526 - "DELETE /session/816479fd-cd0b-44a1-8c48-8b0336d15d41 HTTP/1.1" 200 OK +INFO: 127.0.0.1:8194 - "DELETE /session/77e8f8aa-d0b3-4336-92fc-426eec6d5dc4 HTTP/1.1" 200 OK +INFO: 127.0.0.1:11854 - "DELETE /session/7b9b9b17-c2ee-4012-9714-e27f9fba8204 HTTP/1.1" 200 OK +INFO: 127.0.0.1:11854 - "DELETE /session/df11cc84-c244-4032-99c4-14d45d0824f2 HTTP/1.1" 200 OK +INFO: 127.0.0.1:6737 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6739 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6739 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9105 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9772 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9772 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5627 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8499 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8501 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8501 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11863 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11865 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11865 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2914 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3596 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9659 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12189 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12191 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12191 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6721 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4723 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4728 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13268 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:13270 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13270 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6345 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12947 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12949 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12949 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4006 - "DELETE /session/bad00886-54e8-4c01-8e39-2958151fcd60 HTTP/1.1" 200 OK +INFO: 127.0.0.1:14741 - "DELETE /session/979c2b89-dc54-4b71-89a4-27f524ba1b38 HTTP/1.1" 200 OK +INFO: 127.0.0.1:6534 - "DELETE /session/6a16c2e5-07bd-49b3-957d-d42cc647fd04 HTTP/1.1" 200 OK +INFO: 127.0.0.1:6534 - "DELETE /session/3c53e5a1-ef24-4239-af4a-e251b8eb236b HTTP/1.1" 200 OK +INFO: 127.0.0.1:10129 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2506 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10129 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10129 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10129 - "GET /v1/capabilities?provider=claude_cli&force=false HTTP/1.1" 200 OK +INFO: 127.0.0.1:10129 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9858 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9860 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9860 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3910 - "DELETE /session/0ce75e32-f845-4798-b5b6-527ee4bb26e4 HTTP/1.1" 200 OK +INFO: 127.0.0.1:12337 - "DELETE /session/68871059-df5b-4bef-9dc2-27a634365dc2 HTTP/1.1" 200 OK +INFO: 127.0.0.1:9364 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9366 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9366 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6740 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6742 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6742 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6911 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1437 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1439 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1439 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9115 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9119 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9119 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11367 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11369 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11369 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1526 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1528 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1528 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5616 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5618 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5618 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10256 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4267 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4267 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14890 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14892 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14892 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3802 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8598 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8600 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8600 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11084 - "DELETE /session/c7613596-4a78-4c4e-821c-05d8db498781 HTTP/1.1" 200 OK +INFO: 127.0.0.1:8333 - "DELETE /session/aece92cb-767b-44d8-984a-2f80220fb5e2 HTTP/1.1" 200 OK +INFO: 127.0.0.1:11420 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7388 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7390 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7390 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4511 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4513 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4513 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13540 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:13542 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13542 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6924 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12338 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9049 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9052 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9052 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2466 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6347 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6347 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:6347 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:6347 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:6347 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:6347 - "DELETE /session/4d98dada-928d-45cc-b389-4043837d0b28 HTTP/1.1" 200 OK +INFO: 127.0.0.1:7610 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:7610 - "DELETE /session/alliance-7c6b1b76-139b-4fdf-80c4-4771bb92c793-client-report-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:7611 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:7610 - "DELETE /session/alliance-7c6b1b76-139b-4fdf-80c4-4771bb92c793-independent-observer-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:7604 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:5791 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5791 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5791 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4119 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4121 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4121 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5791 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:5791 - "DELETE /session/811d904f-64eb-4602-81d4-e4f7309feb03 HTTP/1.1" 200 OK +INFO: 127.0.0.1:1139 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1141 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1141 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2973 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2997 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2997 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11023 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11025 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11025 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4599 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4601 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4601 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1086 - "DELETE /session/98c232a8-cc99-490f-805d-647dc076d9ad HTTP/1.1" 200 OK +INFO: 127.0.0.1:10842 - "DELETE /session/24cffcce-725a-41de-b8fe-4efe9581bc81 HTTP/1.1" 200 OK +INFO: 127.0.0.1:2444 - "DELETE /session/c9de90fe-2836-4b58-8dbb-ef34b517aee8 HTTP/1.1" 200 OK +INFO: 127.0.0.1:2444 - "DELETE /session/e716bcdc-ea76-437c-960e-505e53e4a6c3 HTTP/1.1" 200 OK +INFO: 127.0.0.1:3611 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3611 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4848 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4850 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4850 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4224 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2276 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12781 - "DELETE /session/3075f2d4-70d3-4451-927b-5d71aa71e5b9 HTTP/1.1" 200 OK +INFO: 127.0.0.1:9875 - "DELETE /session/db433dad-f5b2-4203-9b6f-63c0fb833627 HTTP/1.1" 200 OK +INFO: 127.0.0.1:4218 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:7452 - "DELETE /session/07f3e12f-4466-4ff1-8b04-8a31f0f32c32 HTTP/1.1" 200 OK +INFO: 127.0.0.1:7452 - "DELETE /session/d9e2938a-e534-42e4-849e-ca46865dc59f HTTP/1.1" 200 OK +INFO: 127.0.0.1:2946 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2946 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2946 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2946 - "GET /v1/capabilities?provider=claude_cli&force=false HTTP/1.1" 200 OK +INFO: 127.0.0.1:2946 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2946 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2946 - "GET /v1/capabilities?provider=claude_cli&force=false HTTP/1.1" 200 OK +INFO: 127.0.0.1:2946 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4721 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4724 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4724 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2785 - "DELETE /session/cb504047-7b3c-46b7-914d-4f96ce103841 HTTP/1.1" 200 OK +INFO: 127.0.0.1:6262 - "DELETE /session/06ebd272-20a0-4039-a37f-a4aa17e581e6 HTTP/1.1" 200 OK +INFO: 127.0.0.1:2281 - "DELETE /session/a9268905-958c-485e-bb38-9238dd8b5496 HTTP/1.1" 200 OK +INFO: 127.0.0.1:4005 - "DELETE /session/9473486e-f4e9-4c41-b88c-6c084687f534 HTTP/1.1" 200 OK +INFO: 127.0.0.1:11256 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11258 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11258 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6504 - "DELETE /session/40bda8ff-e71f-4b19-828b-86d3b5a74309 HTTP/1.1" 200 OK +INFO: 127.0.0.1:12850 - "DELETE /session/849ef067-4c8d-4b86-be7c-4bb559394e5d HTTP/1.1" 200 OK +INFO: 127.0.0.1:10609 - "DELETE /session/3e6408e4-37b7-464b-a6e5-81ce7d069451 HTTP/1.1" 200 OK +INFO: 127.0.0.1:10609 - "DELETE /session/d214d3e3-f9bd-4b82-9f3b-9bfc68f1ba7e HTTP/1.1" 200 OK +INFO: 127.0.0.1:4440 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4440 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4440 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4440 - "GET /v1/capabilities?provider=claude_cli&force=false HTTP/1.1" 200 OK +INFO: 127.0.0.1:4440 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4440 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4440 - "GET /v1/capabilities?provider=claude_cli&force=false HTTP/1.1" 200 OK +INFO: 127.0.0.1:4440 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12589 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12591 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12591 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11974 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11976 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11976 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4503 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7922 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7922 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1402 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1404 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1404 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1967 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11044 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3723 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3725 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3725 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3156 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14352 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14354 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14354 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14315 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14317 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14317 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6759 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6762 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6762 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10506 - "DELETE /session/fedd1067-dfb3-407a-9d58-efa0862a39c4 HTTP/1.1" 200 OK +INFO: 127.0.0.1:9372 - "DELETE /session/49a8357e-8090-4d1a-b8f2-bede46a5eb9f HTTP/1.1" 200 OK +INFO: 127.0.0.1:2110 - "DELETE /session/c4b0125b-11ac-406a-b833-f12b000fa2a4 HTTP/1.1" 200 OK +INFO: 127.0.0.1:10938 - "DELETE /session/8802e967-5114-46f3-b4c0-5c8b0820f9c0 HTTP/1.1" 200 OK +INFO: 127.0.0.1:5550 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5552 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5552 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13812 - "DELETE /session/5b917843-82b0-4bce-a00c-da87f5ee730b HTTP/1.1" 200 OK +INFO: 127.0.0.1:8578 - "DELETE /session/c6854c1b-edc3-44bb-93f9-0c5036031034 HTTP/1.1" 200 OK +INFO: 127.0.0.1:6582 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6159 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6159 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7708 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7735 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10985 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12193 - "DELETE /session/3f116ec2-e6d5-4889-a8ac-e8afc89fa4cd HTTP/1.1" 200 OK +INFO: 127.0.0.1:3275 - "DELETE /session/fe64e4d4-10e8-4bd8-96da-f01791609339 HTTP/1.1" 200 OK +INFO: 127.0.0.1:12001 - "DELETE /session/0e33e442-09d5-4649-bbdd-cb82a3ee2125 HTTP/1.1" 200 OK +INFO: 127.0.0.1:12001 - "DELETE /session/a04b080c-6f16-49d2-af54-9297247858b1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:6293 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6293 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6293 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6293 - "GET /v1/capabilities?provider=claude_cli&force=false HTTP/1.1" 200 OK +INFO: 127.0.0.1:6293 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6293 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6293 - "GET /v1/capabilities?provider=claude_cli&force=false HTTP/1.1" 200 OK +INFO: 127.0.0.1:6293 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6547 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6549 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6557 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6557 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4397 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7635 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7638 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7638 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4573 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5144 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5146 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5146 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2422 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2424 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2424 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1958 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1960 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1960 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11426 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11428 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11428 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9396 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9398 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4642 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8707 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8711 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8711 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5379 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3557 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3559 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3559 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4464 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4468 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4468 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11447 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11449 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11449 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6459 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6464 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6464 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6239 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6241 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6241 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8093 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8095 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8095 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10887 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10889 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10889 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1998 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14787 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14787 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9339 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9341 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9341 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6754 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14448 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14451 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14451 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6309 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6311 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6311 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4817 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4819 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4819 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6911 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6423 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6423 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14757 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11112 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10809 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1549 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1551 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1558 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1192 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1192 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1192 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1192 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6188 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6188 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10625 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12464 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12464 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5555 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5557 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5557 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5557 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11838 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11840 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11840 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6914 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6918 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6918 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3791 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11876 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11878 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11878 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4273 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7272 - "DELETE /session/78b8d537-165c-44ee-8b6b-21464ee73e41 HTTP/1.1" 200 OK +INFO: 127.0.0.1:7272 - "DELETE /session/3020452b-3b41-468f-9120-3f375c6e9624 HTTP/1.1" 200 OK +INFO: 127.0.0.1:10312 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10314 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10314 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3145 - "DELETE /session/1bc3c1cf-f3dd-44af-b72b-1956cb1e639c HTTP/1.1" 200 OK +INFO: 127.0.0.1:3145 - "DELETE /session/c43176dc-c278-4a3d-9b8f-da9411d4f263 HTTP/1.1" 200 OK +INFO: 127.0.0.1:1064 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10282 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10282 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3691 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3693 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3693 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11004 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11006 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11006 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2155 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2158 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2158 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6305 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13900 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13922 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6053 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3003 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4441 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4443 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4443 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7407 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6577 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6579 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6579 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14582 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14582 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:14582 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:14573 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:14573 - "DELETE /session/alliance-9eb41a86-b4eb-4762-a492-243e1308daad-independent-observer HTTP/1.1" 200 OK +INFO: 127.0.0.1:14582 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:14582 - "DELETE /session/alliance-9eb41a86-b4eb-4762-a492-243e1308daad-client-report HTTP/1.1" 200 OK +INFO: 127.0.0.1:14582 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:14582 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:14582 - "DELETE /session/93c87560-f428-4834-8150-394a67949bd7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:13797 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:13797 - "DELETE /session/alliance-dd0cb507-73f8-4114-b0cd-84de5415c603-client-report HTTP/1.1" 200 OK +INFO: 127.0.0.1:13798 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:13798 - "DELETE /session/alliance-dd0cb507-73f8-4114-b0cd-84de5415c603-independent-observer HTTP/1.1" 200 OK +INFO: 127.0.0.1:13794 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4877 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4879 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4879 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4615 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2497 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14419 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:14417 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:14418 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:14416 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4943 - "GET /ready HTTP/1.1" 200 OK +INFO: 127.0.0.1:13425 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:13427 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13427 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10584 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14332 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14332 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:14332 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:10518 - "GET /ready?provider=claude_cli HTTP/1.1" 200 OK +INFO: 127.0.0.1:14332 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:14332 - "DELETE /session/alliance-56439ece-6bf5-462e-920f-3de35b2992dd-client-report-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:1215 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:14332 - "DELETE /session/alliance-56439ece-6bf5-462e-920f-3de35b2992dd-independent-observer-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:14332 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:14332 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:14332 - "DELETE /session/137c8b3e-8559-4db5-bcb9-ed0bcf20b5dc HTTP/1.1" 200 OK +INFO: 127.0.0.1:2659 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:10518 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:13173 - "GET /ready?provider=claude_cli HTTP/1.1" 200 OK +INFO: 127.0.0.1:1959 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1961 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1961 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13584 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6420 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6420 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:6420 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:3440 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:3440 - "DELETE /session/alliance-776b52e3-dd67-4571-b3a3-4d2e1716ae4d-independent-observer-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:8554 - "GET /ready?provider=claude_cli&force=true HTTP/1.1" 200 OK +INFO: 127.0.0.1:6420 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:6420 - "DELETE /session/alliance-776b52e3-dd67-4571-b3a3-4d2e1716ae4d-client-report-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:3440 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:3440 - "DELETE /session/alliance-776b52e3-dd67-4571-b3a3-4d2e1716ae4d-independent-observer-attempt-2 HTTP/1.1" 200 OK +INFO: 127.0.0.1:10105 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10109 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10109 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10960 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1108 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1108 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:1108 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:1108 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:1108 - "DELETE /session/alliance-2e3028ea-497f-4624-afdd-fcbf2bd0ed48-client-report-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:11999 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:1108 - "DELETE /session/alliance-2e3028ea-497f-4624-afdd-fcbf2bd0ed48-independent-observer-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:1108 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:9268 - "GET /ready?provider=claude_cli HTTP/1.1" 200 OK +INFO: 127.0.0.1:1108 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:1108 - "DELETE /session/72af5f26-bf12-4261-b630-ac1bb14311f8 HTTP/1.1" 200 OK +INFO: 127.0.0.1:9268 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:12798 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:12798 - "DELETE /session/alliance-db42ab13-1b53-4d7b-b57f-d89948b1d45f-client-report-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:12799 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:12798 - "DELETE /session/alliance-db42ab13-1b53-4d7b-b57f-d89948b1d45f-independent-observer-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:12795 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4413 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3243 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3243 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1248 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:2396 - "GET /ready?provider=claude_cli HTTP/1.1" 200 OK +INFO: 127.0.0.1:2400 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2400 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2396 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:2549 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2551 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2551 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9484 - "GET /ready?provider=claude_cli HTTP/1.1" 200 OK +INFO: 127.0.0.1:9484 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:8715 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:6539 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10131 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10134 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10134 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9484 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:5615 - "GET /ready?provider=claude_cli HTTP/1.1" 200 OK +INFO: 127.0.0.1:9582 - "DELETE /session/4a09b355-3062-4b70-955e-6f6654abe631 HTTP/1.1" 200 OK +INFO: 127.0.0.1:5615 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:5615 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:3719 - "DELETE /session/281d7e1b-4474-46e8-9f45-b14a25eaddf0 HTTP/1.1" 200 OK +INFO: 127.0.0.1:5377 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:9248 - "DELETE /session/1e74395f-81f2-4a1f-9b05-622548477945 HTTP/1.1" 200 OK +INFO: 127.0.0.1:10567 - "DELETE /session/cba2b062-e3cc-4446-9dce-2c77c85fe2ee HTTP/1.1" 200 OK +INFO: 127.0.0.1:14846 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4113 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4113 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5377 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:10540 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:10541 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:5377 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:3873 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3876 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3876 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1661 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1663 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1663 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6609 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6611 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6611 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9157 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9159 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9159 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2396 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2398 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2398 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4144 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4146 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4146 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6372 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6372 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5412 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5414 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5414 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1884 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10518 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9881 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9883 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9883 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10437 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10439 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10439 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1053 - "DELETE /session/ddc6ed40-d5b5-4b64-96e3-c82a15822bbd HTTP/1.1" 200 OK +INFO: 127.0.0.1:3998 - "DELETE /session/6820f884-82db-46fc-a9e4-8397e425135e HTTP/1.1" 200 OK +INFO: 127.0.0.1:3142 - "DELETE /session/8eb46214-6f28-41bf-b910-83513a8639fa HTTP/1.1" 200 OK +INFO: 127.0.0.1:3142 - "DELETE /session/1442a5b2-5f7d-40b5-b59e-13b3ee9c5489 HTTP/1.1" 200 OK +INFO: 127.0.0.1:4125 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4125 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4125 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4125 - "GET /v1/capabilities?provider=claude_cli&force=false HTTP/1.1" 200 OK +INFO: 127.0.0.1:4125 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4125 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8259 - "GET /v1/capabilities?provider=claude_cli&force=false HTTP/1.1" 200 OK +INFO: 127.0.0.1:8259 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9735 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9737 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9737 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1322 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1324 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1324 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11531 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11836 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11836 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5005 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5007 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5007 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13098 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7615 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7615 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8791 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8793 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8793 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3868 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3870 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3870 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5626 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5629 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5629 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11523 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11525 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11525 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10184 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10186 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10186 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9193 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12064 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12064 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8283 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8285 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8285 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5217 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5219 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5219 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2141 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13500 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2844 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2846 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2846 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13831 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:13834 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13834 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14308 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14310 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14310 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13849 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:13851 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13851 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5838 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5840 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5840 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12199 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12201 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12201 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12192 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12194 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12194 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11838 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11840 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11840 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14412 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14414 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14414 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6694 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6696 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6696 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7991 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7993 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7993 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10841 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10843 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10843 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10714 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10717 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10717 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3670 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3670 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7896 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9660 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9660 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9127 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9127 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9127 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9127 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:11839 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11843 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11843 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6974 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:9127 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:1138 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1138 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5661 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5663 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5663 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14426 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5980 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4641 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7315 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14426 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14426 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14426 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:14426 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:8870 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:6489 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6489 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6489 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14864 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14866 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14866 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2423 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2425 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2425 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7548 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7550 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7550 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4021 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4024 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4024 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7745 - "DELETE /session/a27befb7-6ded-438f-850d-01f08ff40830 HTTP/1.1" 200 OK +INFO: 127.0.0.1:7745 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4929 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4931 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4931 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2389 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2391 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2391 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10673 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10675 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10675 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13394 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:13396 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13396 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9686 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9688 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9688 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4864 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4866 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4866 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3715 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3717 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3717 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9747 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9749 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9749 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6917 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8556 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8558 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8558 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10560 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10562 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10562 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8903 - "GET /v1/capabilities?provider=claude_cli&force=false HTTP/1.1" 200 OK +INFO: 127.0.0.1:8903 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12377 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11023 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11025 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11025 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6355 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6357 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6357 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10471 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10473 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10473 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4290 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4292 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4292 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4092 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4094 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4094 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12530 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12532 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12532 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12569 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12572 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12572 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2428 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2430 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2430 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7445 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7447 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7447 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12799 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12831 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12831 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9336 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9338 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9338 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8765 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8767 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8767 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6132 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6135 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6135 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11878 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11880 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11880 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6966 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6968 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6968 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7671 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7673 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7673 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2994 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2996 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2996 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3650 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3652 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3652 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4978 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4980 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4980 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2505 - "DELETE /session/d214e15c-eafb-4ade-8ef9-9bb649a40cd2 HTTP/1.1" 200 OK +INFO: 127.0.0.1:2505 - "DELETE /session/acae9b3e-88a2-4d48-bbde-a66a581c472e HTTP/1.1" 200 OK +INFO: 127.0.0.1:5065 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5065 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5065 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5065 - "GET /v1/capabilities?provider=claude_cli&force=false HTTP/1.1" 200 OK +INFO: 127.0.0.1:5065 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5065 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5065 - "GET /v1/capabilities?provider=claude_cli&force=false HTTP/1.1" 200 OK +INFO: 127.0.0.1:5065 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5625 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5628 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5628 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9428 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9431 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9431 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10758 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10760 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10760 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4230 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4232 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4232 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3464 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3466 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3466 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11859 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11862 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11862 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13538 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:13540 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13540 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13650 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13727 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1360 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1371 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1373 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1373 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1416 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1416 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:1416 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:7803 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7805 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7805 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10261 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10263 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10263 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8135 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8137 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8137 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8478 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8480 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8480 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6320 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6322 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6322 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6955 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6957 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6957 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8969 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1919 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1921 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1921 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8183 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8186 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8186 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2185 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2187 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2187 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10247 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10249 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10249 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3522 - "DELETE /session/993549af-0df4-421a-b198-a3024f322e34 HTTP/1.1" 200 OK +INFO: 127.0.0.1:12224 - "DELETE /session/c9e91f06-f3d4-4af9-ab1c-138edb475fba HTTP/1.1" 200 OK +INFO: 127.0.0.1:5139 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5142 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5142 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2627 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2631 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2631 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10678 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10724 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10795 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10796 - "GET /ready?provider=claude_cli HTTP/1.1" 200 OK +INFO: 127.0.0.1:3056 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3058 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3058 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3163 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:3163 - "DELETE /session/alliance-ea4fd415-8e09-5898-af50-2bb7cae3b44f-independent-observer-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:3163 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:3163 - "DELETE /session/alliance-bbbad851-9272-5441-b4ba-80cbf64ac6d1-independent-observer-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:3224 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:3224 - "DELETE /session/alliance-ea4fd415-8e09-5898-af50-2bb7cae3b44f-independent-observer-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:3224 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:3224 - "DELETE /session/alliance-ea4fd415-8e09-5898-af50-2bb7cae3b44f-independent-observer-attempt-2 HTTP/1.1" 200 OK +INFO: 127.0.0.1:3224 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:3224 - "DELETE /session/alliance-ea4fd415-8e09-5898-af50-2bb7cae3b44f-independent-observer-attempt-3 HTTP/1.1" 200 OK +INFO: 127.0.0.1:3706 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3224 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:3224 - "DELETE /session/alliance-bbbad851-9272-5441-b4ba-80cbf64ac6d1-independent-observer-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:3224 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:3224 - "DELETE /session/alliance-278f93dd-0035-59a0-8dc9-3cf557df8fc7-independent-observer-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:3224 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:3224 - "DELETE /session/alliance-cf7a843b-aa58-5204-9f30-fea2c45dec4e-client-report-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:13039 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:13043 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13043 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3224 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:3224 - "DELETE /session/alliance-92ae15a9-b440-5516-9efe-b80b6d24b77d-client-report-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:3224 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:3224 - "DELETE /session/alliance-92ae15a9-b440-5516-9efe-b80b6d24b77d-client-report-attempt-2 HTTP/1.1" 200 OK +INFO: 127.0.0.1:3224 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:3224 - "DELETE /session/alliance-d8618781-e4d2-5409-895c-4ceaf718ad51-client-report-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:3224 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:3224 - "DELETE /session/alliance-e2c8b5fe-4679-59e9-a173-5ccf0367406b-client-report-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:3224 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:3224 - "DELETE /session/alliance-e2c8b5fe-4679-59e9-a173-5ccf0367406b-client-report-attempt-2 HTTP/1.1" 200 OK +INFO: 127.0.0.1:3224 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:3224 - "DELETE /session/alliance-6cfc51db-40f1-5b70-843e-d3ab73057292-independent-observer-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:3897 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3900 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3900 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4128 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4128 - "DELETE /session/alliance-3c470ddc-e691-5630-a42c-787e47c96b40-independent-observer-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:4128 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4128 - "DELETE /session/alliance-3c470ddc-e691-5630-a42c-787e47c96b40-independent-observer-attempt-2 HTTP/1.1" 200 OK +INFO: 127.0.0.1:4128 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4128 - "DELETE /session/alliance-3c470ddc-e691-5630-a42c-787e47c96b40-independent-observer-attempt-3 HTTP/1.1" 200 OK +INFO: 127.0.0.1:8193 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1700 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1700 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4128 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4128 - "DELETE /session/alliance-e22c24db-89bd-5f86-8a60-c374166d44fc-independent-observer-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:1700 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:1700 - "DELETE /session/2388d49f-4ad6-46cb-9fab-fedd8462022a HTTP/1.1" 200 OK +INFO: 127.0.0.1:4128 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4128 - "DELETE /session/alliance-c59ce820-9fd3-507c-84f9-d1330668ce85-independent-observer-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:3506 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3711 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:3267 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3269 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3269 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4128 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4128 - "DELETE /session/alliance-e2d29ed6-d6f7-5c27-85fe-1387e9086984-client-report-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:1198 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4128 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4128 - "DELETE /session/alliance-38008e3c-20bb-5781-ad31-3d28655c145c-client-report-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:10626 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11950 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10626 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10626 - "POST /v1/stream HTTP/1.1" 200 OK +INFO: 127.0.0.1:11950 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:2436 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2436 - "POST /v1/stream HTTP/1.1" 200 OK +INFO: 127.0.0.1:5398 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4128 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4128 - "DELETE /session/alliance-41715196-cbf4-5ea4-9b96-cf231a2c5524-client-report-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:11950 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:11950 - "DELETE /session/6f25e1b6-4f9b-4288-95e2-50f28b8352f6 HTTP/1.1" 200 OK +INFO: 127.0.0.1:14323 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14323 - "POST /v1/stream HTTP/1.1" 200 OK +INFO: 127.0.0.1:2592 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:2673 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4128 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4128 - "DELETE /session/alliance-0f465fd0-fa8b-52cd-b6e8-f842bee76d69-client-report-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:1272 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:1272 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1190 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:1556 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:1190 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4128 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4128 - "DELETE /session/alliance-7f2303fa-2d6f-50a2-8834-41b7ab3c47c6-independent-observer-attempt-1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:4868 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4868 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:1190 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:1190 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1190 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:1190 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:1190 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4868 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:4868 - "DELETE /session/ec15f212-e02c-4474-90f0-6fc15680b326 HTTP/1.1" 200 OK +INFO: 127.0.0.1:1190 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:1190 - "DELETE /session/4813a380-602d-445d-98e0-c46a2e6dc0e4 HTTP/1.1" 200 OK +INFO: 127.0.0.1:1190 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1190 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:12014 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12021 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12021 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8717 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:8717 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:1190 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:1190 - "DELETE /session/3f58ce74-f1a6-4dc9-a6bb-fa05a22e12e7 HTTP/1.1" 200 OK +INFO: 127.0.0.1:2888 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3993 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3993 - "DELETE /session/6a21bd41-3a20-40ea-b3c0-672c77c4d53b HTTP/1.1" 200 OK +INFO: 127.0.0.1:2888 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:8717 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:8717 - "DELETE /session/42887b23-f577-40cd-bf08-d882ba2d48e6 HTTP/1.1" 200 OK +INFO: 127.0.0.1:11839 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:2888 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:2888 - "DELETE /session/29d3fbb4-c7da-4d47-aff2-92240c06a273 HTTP/1.1" 200 OK +INFO: 127.0.0.1:4133 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:7793 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:7870 - "POST /v1/generate HTTP/1.1" 200 OK +INFO: 127.0.0.1:9982 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9984 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9984 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13456 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:13458 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13458 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3442 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3444 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3444 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2815 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2817 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2817 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3202 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3204 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3204 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4223 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4225 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4225 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4481 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4483 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4483 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14660 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14662 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14662 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12623 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12625 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12625 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3830 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3832 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3832 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4956 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4958 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4958 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9251 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9253 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9253 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10367 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10369 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10369 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12206 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12208 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12208 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13409 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:13411 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13411 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2985 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2987 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2987 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4085 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4087 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4087 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4473 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4475 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4475 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5601 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5603 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5603 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14076 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14078 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14078 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3334 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3336 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3336 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8557 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8559 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8559 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2662 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2664 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2664 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2805 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4307 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4309 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4309 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK diff --git a/apps/api/engine.public.out.log.20260809-160042.bak b/apps/api/engine.public.out.log.20260809-160042.bak new file mode 100644 index 0000000..9dd27ec --- /dev/null +++ b/apps/api/engine.public.out.log.20260809-160042.bak @@ -0,0 +1,150 @@ +INFO: 127.0.0.1:5961 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1131 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:13224 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1131 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9011 - "GET /ready?force=true HTTP/1.1" 200 OK +INFO: 127.0.0.1:4872 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4872 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9735 - "GET /ready HTTP/1.1" 200 OK +INFO: 127.0.0.1:9737 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9737 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9550 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4478 - "GET /ready HTTP/1.1" 200 OK +INFO: 127.0.0.1:4480 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4480 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4483 - "GET /ready HTTP/1.1" 200 OK +INFO: 127.0.0.1:4480 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4480 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6909 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:6920 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:6920 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4284 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4286 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4286 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11183 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11186 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11186 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9906 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9908 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9908 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4910 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4912 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4912 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11462 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11464 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11464 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3395 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3397 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3397 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7131 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7135 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7135 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4662 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4665 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4665 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8921 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8924 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8924 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7827 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7830 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7830 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11042 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11046 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11046 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11042 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11046 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14342 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:14343 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:14342 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5041 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5043 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5043 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12732 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:12735 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:12735 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2362 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2365 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2365 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4926 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4928 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4928 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4810 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4813 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4813 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2345 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2351 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2351 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2075 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2079 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2079 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3840 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3842 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3842 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4284 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4286 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4286 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10589 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:10591 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10591 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8330 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8334 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8334 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5069 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5071 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5071 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8707 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8709 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8709 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9467 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:9470 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:9470 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11371 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11374 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11374 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11371 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11374 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11382 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11416 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11382 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11850 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:11852 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:11852 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1574 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1576 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1576 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4470 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4472 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4472 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4562 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:4564 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4564 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7321 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7323 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7323 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1317 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:1319 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:1319 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2332 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2334 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2334 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3770 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:3772 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:3772 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7472 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7474 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7474 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7671 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:7673 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:7673 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8837 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:8839 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:8839 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2461 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:2463 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:2463 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:10930 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5805 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:5781 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:5714 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4865 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK +INFO: 127.0.0.1:4903 - "GET /ready?provider=claude_cli&reasoning_effort=high HTTP/1.1" 200 OK diff --git a/apps/web/e2e/uc-session-coach-voice.spec.ts b/apps/web/e2e/uc-session-coach-voice.spec.ts index 3d04e35..be7d29f 100644 --- a/apps/web/e2e/uc-session-coach-voice.spec.ts +++ b/apps/web/e2e/uc-session-coach-voice.spec.ts @@ -177,16 +177,43 @@ async function routeCoachVoiceSession(page: Page, options: CoachVoiceOptions = { ); }); - await page.route(`**/api/sessions/${SESSION_ID}/live-coach`, (route) => - route.fulfill( + await page.route(`**/api/sessions/${SESSION_ID}/live-coach`, async (route) => { + if (route.request().method() === "POST") { + await route.fulfill( + jsonRoute({ + status: "ready", + tone: "pos", + focus: "emotion", + title: "공감과 탐색", + message: "내담자의 답답한 마음에 먼저 공감하고 구체적인 장면을 열린 질문으로 물어보세요.", + next_utterance: "학교 생각만 하면 답답하다고 했는데, 어떤 부분이 제일 마음에 걸려요?", + rationale: "감정 타당화 후 구체 촉발 탐색", + quota: { remaining: Math.max(0, coachRemaining - 1), max: coachMax }, + credit_events: [ + { + event_id: "c-001", + session_id: SESSION_ID, + turn_seq: 1, + event_type: "use", + delta: -1, + balance: Math.max(0, coachRemaining - 1), + reason: "live coaching request", + created_at: new Date().toISOString(), + }, + ], + }), + ); + return; + } + await route.fulfill( jsonRoute({ source: "database", quota: { remaining: coachRemaining, max: coachMax }, credit_events: [], events: [], }), - ), - ); + ); + }); } async function openSession(page: Page) { @@ -419,4 +446,49 @@ test.describe("AI 코치·음성 UI — 고지·게이트·피드백 모드", () const label = await mic.getAttribute("aria-label"); expect(label ?? "").not.toBe(""); }); + + // usecase: AI 코칭 버튼 클릭 시 버블 팝업이 노출되고 추천 칩 및 채팅 조언을 얻을 수 있다 + test("AI 코칭 버튼 클릭 시 버블 팝업이 뜨고 채팅 질문과 추천 발화 적용이 동작한다", async ({ page }) => { + await routeCoachVoiceSession(page, { coachRemaining: 3, coachMax: 3 }); + await openSession(page); + + const triggerBtn = page.getByRole("button", { name: /^AI 코칭, 남은 기회/ }); + await expect(triggerBtn).toBeVisible(); + await expect(triggerBtn).toContainText("3"); + + // 1. 버블 팝업 열기 + await triggerBtn.click({ force: true }); + const popup = page.getByRole("dialog", { name: "AI 슈퍼바이저 코칭 버블" }); + await expect(popup).toBeVisible(); + await expect(popup).toContainText("AI 슈퍼바이저 코칭"); + await expect(popup).toContainText("기회 3/3"); + + // 2. 추천 칩 확인 및 클릭 + const recommendChip = popup.getByRole("button", { name: "💡 다음 추천 발화" }); + await expect(recommendChip).toBeVisible(); + await recommendChip.dispatchEvent("click"); + + // 3. 조언 메시지 및 추천 발화 노출 확인 + await expect(popup.locator(".sx-coach-msg--learner")).toContainText("다음 추천 발화와 방향을 알려줘"); + await expect(popup.locator(".sx-coach-msg--coach")).toBeVisible(); + const insertBtn = popup.getByRole("button", { name: "발화창에 넣기" }); + await expect(insertBtn).toBeAttached(); + + // 4. [발화창에 넣기] 클릭 시 하단 발화 입력창에 텍스트 반영 + await insertBtn.dispatchEvent("click"); + const composer = page.getByPlaceholder("학습자 발화를 입력하세요."); + await expect(composer).not.toHaveValue(""); + + // 5. 직접 질문 채팅 입력 및 전송 + const coachInput = popup.getByPlaceholder("코치에게 조언을 구해보세요... (Enter 전송)"); + await coachInput.fill("내담자의 저항을 부드럽게 다루려면 어떻게 하나요?"); + await popup.getByRole("button", { name: "코칭 질문 전송" }).dispatchEvent("click"); + + await expect(popup.locator(".sx-coach-msg--learner").last()).toContainText("내담자의 저항을 부드럽게 다루려면"); + await expect(popup.locator(".sx-coach-msg--coach").last()).toBeVisible(); + + // 6. 팝업 닫기 버튼 클릭 시 닫힘 확인 + await popup.getByRole("button", { name: "코칭 팝업 닫기" }).dispatchEvent("click"); + await expect(popup).toBeHidden(); + }); }); diff --git a/apps/web/scripts/check-design-ssot.mjs b/apps/web/scripts/check-design-ssot.mjs index 3c6c395..fcd603d 100644 --- a/apps/web/scripts/check-design-ssot.mjs +++ b/apps/web/scripts/check-design-ssot.mjs @@ -37,17 +37,17 @@ const designDoc = await read(designDocPath); // 페이지/아트 전용 CSS는 집중 화면의 국소 팔레트를 소유할 수 있다. 다만 전역 // 토큰으로 승격하지 않은 raw color는 이 기준선 이상 늘어나면 실패시켜 예외가 -// 무제한 확산되는 것을 막는다. 공통 ui/shell은 아래 별도 규칙으로 0개를 강제한다. +// 2026-08-18: 전수 토큰화 완료. 모든 페이지와 컴포넌트 CSS에서 raw color가 0개로 정화됨. const rawColorBudgets = { - "src/pages/session/session.css": 216, - "src/pages/session-review/session-review.css": 29, - "src/pages/learner-home.css": 25, - "src/components/auth/auth-shell.css": 20, - "src/pages/login/login.css": 11, - "src/components/avatar/client-avatar.css": 7, - "src/pages/avatar-expression-lab.css": 7, - "src/pages/avatar-preview.css": 5, - "src/pages/pending-approval.css": 3, + "src/pages/session/session.css": 0, + "src/pages/session-review/session-review.css": 0, + "src/pages/learner-home.css": 0, + "src/components/auth/auth-shell.css": 0, + "src/pages/login/login.css": 0, + "src/components/avatar/client-avatar.css": 0, + "src/pages/avatar-expression-lab.css": 0, + "src/pages/avatar-preview.css": 0, + "src/pages/pending-approval.css": 0, }; for (const [relativePath, budget] of Object.entries(rawColorBudgets)) { diff --git a/apps/web/src/components/auth/auth-shell.css b/apps/web/src/components/auth/auth-shell.css index 1f2b08e..3e91d12 100644 --- a/apps/web/src/components/auth/auth-shell.css +++ b/apps/web/src/components/auth/auth-shell.css @@ -41,17 +41,17 @@ --auth-room-veil: linear-gradient( 90deg, - rgba(247, 244, 236, 0.94) 0%, - rgba(243, 238, 227, 0.86) 48%, - rgba(238, 231, 217, 0.72) 74%, - rgba(232, 223, 207, 0.62) 100% + color-mix(in srgb, var(--bg-app) 94%, transparent) 0%, + color-mix(in srgb, var(--bg-app) 86%, transparent) 48%, + color-mix(in srgb, var(--bg-app) 72%, transparent) 74%, + color-mix(in srgb, var(--bg-app) 62%, transparent) 100% ); - --auth-room-shade: linear-gradient(180deg, rgba(255, 253, 248, 0.08), rgba(120, 101, 72, 0.12)); + --auth-room-shade: linear-gradient(180deg, color-mix(in srgb, var(--bg-surface) 8%, transparent), color-mix(in srgb, var(--clay) 12%, transparent)); --auth-hero-text: var(--text-strong); --auth-hero-muted: color-mix(in srgb, var(--text-body) 88%, transparent); - --auth-hero-surface: rgba(255, 254, 251, 0.48); - --auth-hero-border: rgba(101, 86, 62, 0.22); - --auth-hero-chip: rgba(255, 254, 251, 0.62); + --auth-hero-surface: color-mix(in srgb, var(--bg-surface) 48%, transparent); + --auth-hero-border: color-mix(in srgb, var(--border-strong) 42%, transparent); + --auth-hero-chip: color-mix(in srgb, var(--bg-surface) 62%, transparent); background: var(--auth-room-veil), var(--asset-login-room) center / cover no-repeat; @@ -61,17 +61,17 @@ --auth-room-veil: linear-gradient( 90deg, - rgba(7, 16, 14, 0.84) 0%, - rgba(10, 21, 19, 0.72) 48%, - rgba(10, 21, 19, 0.55) 74%, - rgba(10, 21, 19, 0.62) 100% + color-mix(in srgb, var(--bg-app) 84%, transparent) 0%, + color-mix(in srgb, var(--bg-app) 72%, transparent) 48%, + color-mix(in srgb, var(--bg-app) 55%, transparent) 74%, + color-mix(in srgb, var(--bg-app) 62%, transparent) 100% ); - --auth-room-shade: linear-gradient(180deg, rgba(3, 9, 8, 0.18), rgba(3, 9, 8, 0.42)); - --auth-hero-text: #edf4f2; - --auth-hero-muted: rgba(237, 244, 242, 0.72); - --auth-hero-surface: rgba(237, 244, 242, 0.08); - --auth-hero-border: rgba(255, 255, 255, 0.14); - --auth-hero-chip: rgba(255, 255, 255, 0.08); + --auth-room-shade: linear-gradient(180deg, color-mix(in srgb, var(--bg-app) 18%, transparent), color-mix(in srgb, var(--bg-app) 42%, transparent)); + --auth-hero-text: var(--text-strong); + --auth-hero-muted: color-mix(in srgb, var(--text-strong) 72%, transparent); + --auth-hero-surface: color-mix(in srgb, var(--text-strong) 8%, transparent); + --auth-hero-border: color-mix(in srgb, var(--border-subtle) 80%, transparent); + --auth-hero-chip: color-mix(in srgb, var(--text-strong) 8%, transparent); } @media (max-width: 620px) { diff --git a/apps/web/src/components/avatar/client-avatar.css b/apps/web/src/components/avatar/client-avatar.css index 5aeeb96..cfc904e 100644 --- a/apps/web/src/components/avatar/client-avatar.css +++ b/apps/web/src/components/avatar/client-avatar.css @@ -9,10 +9,10 @@ position:relative;width:100%;border-radius:50%; display:flex;align-items:center;justify-content:center;overflow:hidden; background: - radial-gradient(circle at 50% 38%, rgba(251,250,248,.98) 0%, rgba(246,240,236,.9) 42%, rgba(238,244,242,.76) 64%, rgba(145,200,189,.22) 84%, rgba(30,39,36,.18) 100%); + radial-gradient(circle at 50% 38%, color-mix(in srgb, var(--bg-surface) 98%, transparent) 0%, color-mix(in srgb, var(--bg-surface-2) 90%, transparent) 42%, color-mix(in srgb, var(--accent-tint) 76%, transparent) 64%, color-mix(in srgb, var(--accent) 22%, transparent) 84%, color-mix(in srgb, var(--text-strong) 18%, transparent) 100%); box-shadow: - inset 0 0 0 1px rgba(251,250,248,.28), - inset 0 -24px 40px rgba(28,42,42,.13); + inset 0 0 0 1px color-mix(in srgb, var(--bg-surface) 28%, transparent), + inset 0 -24px 40px color-mix(in srgb, var(--text-strong) 13%, transparent); } .vg-avatar__aura{ position:absolute;inset:-12%;border-radius:50%;pointer-events:none; diff --git a/apps/web/src/components/shell/AppShell.tsx b/apps/web/src/components/shell/AppShell.tsx index aa62291..42738a9 100644 --- a/apps/web/src/components/shell/AppShell.tsx +++ b/apps/web/src/components/shell/AppShell.tsx @@ -1,5 +1,5 @@ import { useEffect, useLayoutEffect, useRef, type ReactNode } from "react"; -import { useLocation } from "react-router-dom"; +import { useLocation, useNavigate } from "react-router-dom"; import { Topbar } from "./Topbar"; import { Sidebar } from "./Sidebar"; import { canAccessRole, designRoleOf, useAuth, type Role } from "../../lib/auth"; @@ -78,6 +78,79 @@ export function AppShell({ children, className, contextLabel, hideNav, bleed, wi return () => window.removeEventListener("pageshow", handlePageShow); }, []); + const navigate = useNavigate(); + + // ── 전역 단축키 핸들러 ── + useEffect(() => { + const handleGlobalKeyDown = (e: KeyboardEvent) => { + if (e.repeat) return; + const target = e.target instanceof HTMLElement ? e.target : null; + const isInput = target?.closest("input, textarea, select, [contenteditable='true']"); + + const isAlt = e.altKey && !e.ctrlKey && !e.metaKey; + const isCtrl = (e.ctrlKey || e.metaKey) && !e.altKey; + + // Ctrl+W 또는 Escape: 활성 모달 닫기 + if ((isCtrl && e.key.toLowerCase() === "w") || e.key === "Escape") { + const openModalCloseBtn = document.querySelector( + "[role='dialog'] button:has(svg), [role='dialog'] .sx-panel-close-btn, .vg-dialog__close, [role='dialog'] button[aria-label*='닫기']" + ); + if (openModalCloseBtn) { + e.preventDefault(); + openModalCloseBtn.click(); + return; + } + } + + // Alt+H: 홈으로 이동 + if (isAlt && e.key.toLowerCase() === "h") { + e.preventDefault(); + const homePath = user?.role === "admin" ? "/admin" : user?.role === "teacher" ? "/professor" : "/learn"; + navigate(homePath); + return; + } + + // Alt+N 또는 Ctrl+N 또는 Ctrl+T (입력창 밖): 새 회기 시작 / 페르소나 선택 + if ((isAlt && e.key.toLowerCase() === "n") || (!isInput && isCtrl && (e.key.toLowerCase() === "n" || e.key.toLowerCase() === "t"))) { + e.preventDefault(); + navigate("/learn"); + return; + } + + // Alt+K: 학습 기록으로 이동 + if (isAlt && e.key.toLowerCase() === "k") { + e.preventDefault(); + navigate("/learn/history"); + return; + } + + // Alt+S: 설정 화면으로 이동 + if (isAlt && e.key.toLowerCase() === "s") { + e.preventDefault(); + navigate("/settings"); + return; + } + + // Alt+T: 다크/라이트 테마 전환 + if (isAlt && e.key.toLowerCase() === "t") { + e.preventDefault(); + const themeBtn = document.querySelector(".vg-topbar__theme-btn, [data-testid='theme-toggle']"); + if (themeBtn) { + themeBtn.click(); + } else { + const currentTheme = document.documentElement.getAttribute("data-theme") || "light"; + const nextTheme = currentTheme === "dark" ? "light" : "dark"; + document.documentElement.setAttribute("data-theme", nextTheme); + localStorage.setItem("vignette_theme", nextTheme); + } + return; + } + }; + + window.addEventListener("keydown", handleGlobalKeyDown); + return () => window.removeEventListener("keydown", handleGlobalKeyDown); + }, [navigate, user]); + return (
- {item.label} + {item.label} ))} diff --git a/apps/web/src/components/shell/shell.css b/apps/web/src/components/shell/shell.css index 79e274d..7d1bd93 100644 --- a/apps/web/src/components/shell/shell.css +++ b/apps/web/src/components/shell/shell.css @@ -104,6 +104,10 @@ font-weight: 650; text-decoration: none; white-space: nowrap; + transition: transform var(--dur-fast) var(--ease-spring), background var(--dur-fast) var(--ease-out), color var(--dur-fast) var(--ease-out); +} +.vg-topbar__switch-link:active { + transform: scale(0.95); } .vg-topbar__switch-link:hover, .vg-topbar__switch-link.is-active { @@ -125,9 +129,13 @@ color: var(--text-body); cursor: pointer; transition: + transform var(--dur-fast) var(--ease-spring), background var(--dur-fast) var(--ease-out), color var(--dur-fast) var(--ease-out); } +.vg-iconbtn:active { + transform: scale(0.92); +} .vg-iconbtn:hover { background: var(--bg-surface-2); color: var(--text-strong); @@ -324,33 +332,46 @@ } @media (max-width: 720px) { html { - scroll-padding-top: calc(var(--topbar-h) + 68px); - scroll-padding-bottom: var(--sp-6); + scroll-padding-top: calc(var(--topbar-h) + var(--sp-2)); + scroll-padding-bottom: calc(var(--bottom-bar-h) + env(safe-area-inset-bottom) + var(--sp-4)); + } + .vg-shell { + height: 100dvh; } .vg-shell__body { - display: grid; - grid-template-columns: minmax(0, 1fr); - grid-template-rows: 58px minmax(0, 1fr); - background-image: none; /* 네비가 상단 가로바로 전환 — 세로 구분선 제거 */ + display: flex; + flex-direction: column; + flex: 1 1 auto; + min-height: 0; + position: relative; + background-image: none; /* 네비가 하단바로 전환 — 세로 구분선 제거 */ } .vg-shell__body--bare { - display: block; + display: flex; } .vg-nav { - position: relative; + position: fixed; + bottom: 0; + left: 0; + right: 0; top: auto; - z-index: 29; - height: 58px; - padding: 7px max(12px, env(safe-area-inset-left)) 7px max(12px, env(safe-area-inset-right)); + z-index: 40; + height: calc(var(--bottom-bar-h) + env(safe-area-inset-bottom)); + padding: 6px max(10px, env(safe-area-inset-left)) max(6px, env(safe-area-inset-bottom)) max(10px, env(safe-area-inset-right)); border-right: 0; - border-top: 0; - border-bottom: 1px solid var(--hair); + border-top: 1px solid var(--hair); + border-bottom: 0; + display: flex; flex-direction: row; align-items: center; - justify-content: flex-start; - gap: 8px; + justify-content: space-around; + gap: 4px; + background: var(--bg-surface); + box-shadow: var(--shadow-island); overflow-x: auto; overflow-y: hidden; + -webkit-backdrop-filter: var(--glass-blur); + backdrop-filter: var(--glass-blur); } .vg-nav__label, .vg-nav__spacer, @@ -358,16 +379,43 @@ display: none; } .vg-nav__item { - min-width: 112px; - height: 44px; + flex: 1 1 0; + min-width: 0; + max-width: 96px; + height: 48px; + min-height: 48px; + padding: 3px 2px; + flex-direction: column; justify-content: center; - padding: 0 14px; - gap: 8px; - white-space: nowrap; + align-items: center; + gap: 2px; + border-radius: var(--radius); + text-align: center; + transition: transform var(--dur-fast) var(--ease-spring), background var(--dur-fast) var(--ease-out); } + .vg-nav__item:active { + transform: scale(0.93); + } + .vg-nav__item .vg-nav__ic { + display: flex; + align-items: center; + justify-content: center; + } + .vg-nav__item .vg-nav__ic svg { + width: 20px; + height: 20px; + } + .vg-nav__item .vg-nav__txt, .vg-nav__item span:not(.vg-nav__ic) { - display: inline; - font-size: 13px; + display: block; + font-size: 11px; + font-weight: 600; + line-height: 1.2; + letter-spacing: -0.01em; + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } .vg-topbar__role { display: none; @@ -376,50 +424,47 @@ display: none; } .vg-topbar { - padding: 0 4px; - gap: 4px; + height: 50px; + min-height: 50px; + padding: 0 var(--sp-3); + gap: var(--sp-2); } .vg-topbar__brand { - width: 44px; - height: 44px; - flex: 0 0 44px; - justify-content: center; + min-height: 44px; + gap: 8px; + } + .vg-topbar__mark { + width: 24px; + height: 24px; + } + .vg-topbar__wm { + font-size: 16px; } - .vg-topbar__wm, .vg-topbar__user { display: none; } .vg-topbar__actions { - flex: 1 1 auto; + flex: 0 0 auto; gap: 4px; } .vg-topbar__switch { - flex: 1 1 auto; - height: 44px; - padding: 0; - overflow-x: auto; - overflow-y: hidden; - scrollbar-width: none; - } - .vg-topbar__switch::-webkit-scrollbar { - display: none; - } - .vg-topbar__switch-link span { - display: none; + height: 38px; + padding: 2px; } .vg-topbar__switch-link { - width: 44px; - height: 44px; - flex: 0 0 44px; - padding: 0; + min-height: 34px; + padding: 0 8px; + font-size: 11.5px; + } + .vg-topbar__switch-link span { + display: inline; } .vg-iconbtn { - width: 44px; - height: 44px; - flex: 0 0 44px; + width: 40px; + height: 40px; } .vg-main { - padding: var(--sp-5) var(--sp-4) var(--sp-7); + padding: var(--sp-4) var(--sp-4) calc(var(--bottom-bar-h) + env(safe-area-inset-bottom) + var(--sp-6)); } .vg-main--bleed { padding: 0; @@ -584,9 +629,8 @@ body[data-role] .vg-shell--botanical .vg-nav__foot { @media (max-width: 720px) { body[data-role] .vg-shell--botanical .vg-shell__body:not(.vg-shell__body--bare) { - display: grid; - grid-template-columns: minmax(0, 1fr); - grid-template-rows: 58px minmax(0, 1fr); + display: flex; + flex-direction: column; background-image: radial-gradient(circle at 74% 12%, color-mix(in srgb, var(--accent) 14%, transparent), transparent 22rem), radial-gradient(circle at 18% 82%, color-mix(in srgb, var(--botanical-gold) 14%, transparent), transparent 28rem), @@ -596,46 +640,88 @@ body[data-role] .vg-shell--botanical .vg-nav__foot { background-size: 100% 34rem, 100% 38rem, 430px auto; } body[data-role] .vg-shell--botanical .vg-nav { - position: relative; + position: fixed; + bottom: 0; + left: 0; + right: 0; top: auto; - z-index: 29; - height: 58px; - padding: 7px max(12px, env(safe-area-inset-left)) 7px max(12px, env(safe-area-inset-right)); - border-bottom: 1px solid var(--botanical-hair); - background: color-mix(in srgb, var(--bg-surface) 72%, transparent); + z-index: 40; + height: calc(var(--bottom-bar-h) + env(safe-area-inset-bottom)); + padding: 6px max(10px, env(safe-area-inset-left)) max(6px, env(safe-area-inset-bottom)) max(10px, env(safe-area-inset-right)); + border-top: 1px solid var(--botanical-hair); + border-bottom: 0; + border-right: 0; + border-left: 0; + background: color-mix(in srgb, var(--bg-surface) 86%, transparent); + box-shadow: var(--shadow-island); -webkit-backdrop-filter: var(--glass-blur); backdrop-filter: var(--glass-blur); + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-around; + gap: 4px; + overflow-x: auto; + overflow-y: hidden; } body[data-role] .vg-shell--botanical .vg-nav__item, body[data-role] .vg-shell--botanical .vg-nav__item.is-active { - min-width: 112px; - height: 44px; - padding: 0 14px; - gap: 8px; + flex: 1 1 0; + min-width: 0; + max-width: 96px; + height: 48px; + min-height: 48px; + padding: 3px 2px; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 2px; + border-radius: var(--radius); + text-align: center; + border: 1px solid transparent; + } + body[data-role] .vg-shell--botanical .vg-nav__item.is-active { + padding-right: 2px; + background: linear-gradient( + 112deg, + color-mix(in srgb, var(--bg-surface) 92%, var(--botanical-gold)), + color-mix(in srgb, var(--bg-surface-2) 80%, transparent) + ); + border-color: color-mix(in srgb, var(--botanical-gold) 34%, var(--border-subtle)); + box-shadow: inset 0 1px 0 color-mix(in srgb, var(--bg-surface) 84%, transparent); + } + body[data-role] .vg-shell--botanical .vg-nav__item.is-active::after { + display: none; + } + body[data-role] .vg-shell--botanical .vg-nav__item .vg-nav__ic svg { + width: 20px; + height: 20px; + } + body[data-role] .vg-shell--botanical .vg-nav__item .vg-nav__txt, + body[data-role] .vg-shell--botanical .vg-nav__item span:not(.vg-nav__ic) { + display: block; + font-size: 11px; + font-weight: 600; + line-height: 1.2; + letter-spacing: -0.01em; + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } - /* 학습자는 네 항목이 고정이므로 숨은 가로 탐색보다 한 화면 4등분이 예측 가능하다. - 교수자·관리자처럼 항목 수가 많은 역할은 기존 가로 스크롤 계약을 유지한다. */ body[data-role="learner"] .vg-shell--botanical .vg-nav { - display:grid; - grid-template-columns:repeat(4,minmax(0,1fr)); - gap:4px; - overflow-x:visible; + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 4px; + overflow-x: visible; } body[data-role="learner"] .vg-shell--botanical .vg-nav__item, body[data-role="learner"] .vg-shell--botanical .vg-nav__item.is-active { - width:100%; - min-width:0; - height:44px; - padding:0 2px; - gap:3px; - font-size:12px; - } - body[data-role="learner"] .vg-shell--botanical .vg-nav__item span:not(.vg-nav__ic) { - font-size:12px; - } - body[data-role="learner"] .vg-shell--botanical .vg-nav__ic svg { - width:16px; - height:16px; + width: 100%; + max-width: none; + min-width: 0; + height: 48px; + padding: 3px 2px; } } diff --git a/apps/web/src/components/ui/Icon.tsx b/apps/web/src/components/ui/Icon.tsx index 5bab762..5623dcb 100644 --- a/apps/web/src/components/ui/Icon.tsx +++ b/apps/web/src/components/ui/Icon.tsx @@ -39,6 +39,7 @@ export type IconName = | "school" | "sun" | "moon" + | "copy" | "refresh"; export interface IconProps extends Omit, "name"> { @@ -227,6 +228,12 @@ const PATHS: Record = { ), moon: , + copy: ( + <> + + + + ), }; export function Icon({ diff --git a/apps/web/src/components/ui/ui.css b/apps/web/src/components/ui/ui.css index 8aadf21..4c2d87c 100644 --- a/apps/web/src/components/ui/ui.css +++ b/apps/web/src/components/ui/ui.css @@ -57,13 +57,14 @@ transition: background var(--dur-base) var(--ease-out), border-color var(--dur-base) var(--ease-out), - transform var(--dur-fast) var(--ease-out); + transform var(--dur-fast) var(--ease-spring), + box-shadow var(--dur-fast) var(--ease-out); cursor: pointer; white-space: nowrap; user-select: none; } .vg-btn:active { - transform: translateY(0.5px); + transform: translateY(1px) scale(0.98); } .vg-btn:disabled { opacity: 0.5; diff --git a/apps/web/src/lib/api.gen.ts b/apps/web/src/lib/api.gen.ts index 4a3ed93..e5dfa86 100644 --- a/apps/web/src/lib/api.gen.ts +++ b/apps/web/src/lib/api.gen.ts @@ -6108,6 +6108,8 @@ export interface components { client_reply?: string | null; /** Learner Text */ learner_text: string; + /** Question */ + question?: string | null; /** Turn Seq */ turn_seq?: number | null; }; diff --git a/apps/web/src/pages/Session.tsx b/apps/web/src/pages/Session.tsx index 5132fd0..151d30b 100644 --- a/apps/web/src/pages/Session.tsx +++ b/apps/web/src/pages/Session.tsx @@ -162,6 +162,14 @@ const THEORY_MODE_OPTIONS: { ]; const DEFAULT_COACH_QUOTA: LiveCoachQuota = { remaining: 3, max: 3 }; +interface CoachChatMessage { + id: string; + sender: "learner" | "coach"; + text: string; + suggestion?: LiveCoachSuggestion; + createdAt: number; +} + function preferredTheoryMode(summary: PersonaSummary | null): TheoryMode { const firstSupported = summary?.theory_target.find( (target): target is TheoryMode => @@ -492,7 +500,10 @@ export default function Session() { const goalNudgeShownRef = useRef(false); const [timeUp, setTimeUp] = useState(false); - // ── 패널 컬랩싱(과밀 완화) — 접힌 패널은 상황에 맞춰 넛지/강제 오픈 ── + // ── 패널 컬랩싱(과밀 완화 및 몰입 확장) — 접힌 패널은 상황에 맞춰 넛지/강제 오픈 ── + const [leftPanelCollapsed, setLeftPanelCollapsed] = useState(false); + const [rightPanelCollapsed, setRightPanelCollapsed] = useState(false); + const [shortcutHelpOpen, setShortcutHelpOpen] = useState(false); const [ctxCollapsed, setCtxCollapsed] = useState(true); const [metersCollapsed, setMetersCollapsed] = useState(false); const [safetyCollapsed, setSafetyCollapsed] = useState(true); @@ -525,6 +536,15 @@ export default function Session() { const coachCreditSeenRef = useRef>(new Set()); const coachCreditPulseTimerRef = useRef(null); + // ── AI 코칭 버블 팝업 상태 ── + const [isCoachBubbleOpen, setIsCoachBubbleOpen] = useState(false); + const [coachChatInput, setCoachChatInput] = useState(""); + const [coachChatLoading, setCoachChatLoading] = useState(false); + const [coachChatMessages, setCoachChatMessages] = useState([]); + const coachBubbleAnchorRef = useRef(null); + const coachChatInputRef = useRef(null); + const coachChatScrollRef = useRef(null); + activeVoiceSessionRef.current = liveSessionId; const failPendingVoiceLearnerTurn = useCallback(() => { @@ -610,6 +630,9 @@ export default function Session() { coachCreditSeenRef.current = new Set(); setCoachHistoryOpen(false); setCoachHistoryTurnSeq(null); + setIsCoachBubbleOpen(false); + setCoachChatMessages([]); + setCoachChatInput(""); }, [navigate, routeIsSessionId, routeParam]); useEffect(() => { @@ -1019,6 +1042,158 @@ export default function Session() { void requestLiveCoach(payload); }, [feedbackMode, pendingCoachTurn, requestLiveCoach]); + // ── AI 코칭 버블 팝업 제어 및 질의응답 ── + useEffect(() => { + if (!isCoachBubbleOpen) return; + + const focusTimer = window.setTimeout(() => { + coachChatInputRef.current?.focus(); + }, 60); + + const handlePointerDownOutside = (e: MouseEvent) => { + if ( + coachBubbleAnchorRef.current && + !coachBubbleAnchorRef.current.contains(e.target as Node) + ) { + setIsCoachBubbleOpen(false); + } + }; + + const handleKeyDown = (e: KeyboardEvent) => { + if (e.key === "Escape") { + setIsCoachBubbleOpen(false); + } + }; + + document.addEventListener("mousedown", handlePointerDownOutside); + document.addEventListener("keydown", handleKeyDown); + + return () => { + window.clearTimeout(focusTimer); + document.removeEventListener("mousedown", handlePointerDownOutside); + document.removeEventListener("keydown", handleKeyDown); + }; + }, [isCoachBubbleOpen]); + + useEffect(() => { + if (isCoachBubbleOpen && coachChatScrollRef.current) { + coachChatScrollRef.current.scrollTop = coachChatScrollRef.current.scrollHeight; + } + }, [coachChatMessages, coachChatLoading, isCoachBubbleOpen]); + + const handleSendCoachBubbleQuery = useCallback( + async (queryText: string) => { + if (!liveSessionId || !queryText.trim()) return; + if (coachQuota.remaining <= 0) { + setCoachChatMessages((prev) => [ + ...prev, + { + id: randomUuid(), + sender: "coach", + text: "코칭 기회를 모두 사용했습니다. 좋은 발화로 내담자가 열리거나 회기가 진행되면 충전됩니다.", + createdAt: Date.now(), + }, + ]); + return; + } + + const userMsgId = randomUuid(); + setCoachChatMessages((prev) => [ + ...prev, + { + id: userMsgId, + sender: "learner", + text: queryText, + createdAt: Date.now(), + }, + ]); + setCoachChatLoading(true); + + const lastLearnerUtterance = [...utterances] + .reverse() + .find((u) => u.speaker === "learner" && !u.partial && !u.failed); + const lastClientUtterance = [...utterances] + .reverse() + .find((u) => u.speaker === "client" && !u.partial && !u.failed); + + const learnerTextToSend = + composeText.trim() || + lastLearnerUtterance?.text || + "상담 진행 및 다음 개입 방향 조언 요청"; + const clientReplyToSend = lastClientUtterance?.text ?? null; + const turnSeqToSend = lastLearnerUtterance?.turnSeq; + + try { + const suggestion = await sessionApi.liveCoach(liveSessionId, { + learner_text: learnerTextToSend, + question: queryText, + client_reply: clientReplyToSend, + turn_seq: turnSeqToSend, + }); + + setCoachSuggestion(suggestion); + setCoachPersistenceSource(suggestion.persistence_source ?? null); + if (suggestion.quota) { + setCoachQuota(suggestion.quota); + } + if (suggestion.credit_events?.length) { + applyCoachCreditEvents(suggestion.credit_events, true); + } + pushSignal(suggestion.tone, suggestion.title); + void refreshCoachHistory(liveSessionId, { animateCredits: false, warnOnFailure: true }); + + setCoachChatMessages((prev) => [ + ...prev, + { + id: randomUuid(), + sender: "coach", + text: suggestion.message, + suggestion, + createdAt: Date.now(), + }, + ]); + } catch (err) { + if (err instanceof ApiError && err.status === 409) { + setCoachQuota((current) => ({ ...current, remaining: 0 })); + setCoachChatMessages((prev) => [ + ...prev, + { + id: randomUuid(), + sender: "coach", + text: "코칭 기회를 모두 사용했습니다. 좋은 발화로 내담자가 열리면 다시 1개가 충전됩니다.", + createdAt: Date.now(), + }, + ]); + } else { + setCoachChatMessages((prev) => [ + ...prev, + { + id: randomUuid(), + sender: "coach", + text: "코칭 조언을 불러오지 못했습니다. 잠시 후 다시 시도해 주세요.", + createdAt: Date.now(), + }, + ]); + } + } finally { + setCoachChatLoading(false); + } + }, + [ + applyCoachCreditEvents, + coachQuota.remaining, + composeText, + liveSessionId, + pushSignal, + refreshCoachHistory, + utterances, + ], + ); + + const applySuggestionToComposer = useCallback((text: string) => { + setComposeText(text); + }, []); + useEffect(() => { if (!routeIsSessionId) return; // 이 화면에서 방금 시작한 회기의 URL 전환은 재개(resume)가 아니다 — 서버 스냅샷(0턴) @@ -2155,28 +2330,174 @@ export default function Session() { }); }, [sessionEnded, shutdownVoice, voiceStatus]); - // ── 키보드 단축키: Alt+M=마이크, P=일시정지. 입력 중엔 무시 ── + // ── 키보드 단축키 전수 등록 ── useEffect(() => { - if (!started) return; const onKey = (e: KeyboardEvent) => { if (e.repeat) return; - if (e.altKey && !e.ctrlKey && !e.metaKey && e.key.toLowerCase() === "m") { + + // 1. 전역 모달 닫기: Escape 또는 Ctrl+W (모달이 열려있을 때) + if (e.key === "Escape" || ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === "w")) { + if (shortcutHelpOpen) { + e.preventDefault(); + setShortcutHelpOpen(false); + return; + } + if (coachEvidenceOpen) { + e.preventDefault(); + setCoachEvidenceOpen(false); + return; + } + if (coachHistoryOpen) { + e.preventDefault(); + setCoachHistoryOpen(false); + return; + } + if (endDialogOpen && !ending) { + e.preventDefault(); + setEndDialogOpen(false); + return; + } + } + + // 2. 단축키 도움말: ? (입력창 밖) 또는 Ctrl+/ or Alt+/ + if ( + ((e.ctrlKey || e.metaKey || e.altKey) && e.key === "/") || + (e.key === "?" && !(e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement)) + ) { + e.preventDefault(); + setShortcutHelpOpen((prev) => !prev); + return; + } + + // 시작 전 프리플라이트 단축키 + if (!started) { + if ((e.ctrlKey || e.metaKey || e.altKey) && e.key === "Enter") { + e.preventDefault(); + if (selectedGoals.length > 0 && !starting) { + void handleStart(); + } + return; + } + return; + } + + // 세션 진행 중 단축키 + const isAlt = e.altKey && !e.ctrlKey && !e.metaKey; + const isCtrl = (e.ctrlKey || e.metaKey) && !e.altKey; + const target = e.target instanceof HTMLElement ? e.target : null; + const isInput = target?.closest("input, textarea, select, [contenteditable='true']"); + + // Alt+M: 마이크 토글 + if (isAlt && e.key.toLowerCase() === "m") { e.preventDefault(); void toggleMic(); return; } - const target = e.target instanceof HTMLElement ? e.target : null; - const interactive = target?.closest( - "button, a, input, textarea, select, [contenteditable='true'], [role='button'], [role='link']", - ); - if (interactive) return; - if (e.key === "p" || e.key === "P") { + + // Alt+[ 또는 Ctrl+[: 좌측 패널 토글 + if ((isAlt || isCtrl) && (e.key === "[" || e.code === "BracketLeft")) { + e.preventDefault(); + setLeftPanelCollapsed((prev) => !prev); + return; + } + + // Alt+] 또는 Ctrl+]: 우측 패널 토글 + if ((isAlt || isCtrl) && (e.key === "]" || e.code === "BracketRight")) { + e.preventDefault(); + setRightPanelCollapsed((prev) => !prev); + return; + } + + // Alt+\ 또는 Ctrl+\: 완전 몰입 모드 토글 (양쪽 패널 동시 접기/펼치기) + if ((isAlt || isCtrl) && (e.key === "\\" || e.code === "Backslash")) { + e.preventDefault(); + const bothCollapsed = leftPanelCollapsed && rightPanelCollapsed; + setLeftPanelCollapsed(!bothCollapsed); + setRightPanelCollapsed(!bothCollapsed); + return; + } + + // Alt+1 / Alt+2 / Alt+3: 피드백 모드 전환 + if (isAlt && e.key === "1") { + e.preventDefault(); + setFeedbackMode("immersive"); + return; + } + if (isAlt && e.key === "2") { + e.preventDefault(); + setFeedbackMode("ambient"); + return; + } + if (isAlt && e.key === "3") { + e.preventDefault(); + setFeedbackMode("coached"); + return; + } + + // Alt+Q: 회기 종료 확인 + if (isAlt && (e.key.toLowerCase() === "q" || e.key.toLowerCase() === "w")) { + e.preventDefault(); + if (!sessionEnded) setEndDialogOpen(true); + return; + } + + // Alt+J 또는 Alt+Down: 최신 발화로 점프 + if (isAlt && (e.key.toLowerCase() === "j" || e.key === "ArrowDown")) { + e.preventDefault(); + jumpToLatest(); + return; + } + + // Alt+C: AI 코칭 이력 + if (isAlt && e.key.toLowerCase() === "c") { + e.preventDefault(); + openCoachHistory(null); + return; + } + + // Alt+E: AI 코칭 근거 + if (isAlt && e.key.toLowerCase() === "e") { + e.preventDefault(); + setCoachEvidenceOpen(true); + return; + } + + // Alt+P: 일시정지 토글 + if (isAlt && e.key.toLowerCase() === "p") { + e.preventDefault(); togglePause(); + return; + } + + // 입력창 밖 단축키 + if (!isInput) { + if (e.key === "p" || e.key === "P" || e.key === " ") { + if (e.key === " ") e.preventDefault(); + togglePause(); + return; + } } }; window.addEventListener("keydown", onKey); return () => window.removeEventListener("keydown", onKey); - }, [started, toggleMic, togglePause]); + }, [ + started, + selectedGoals.length, + starting, + handleStart, + toggleMic, + togglePause, + leftPanelCollapsed, + rightPanelCollapsed, + sessionEnded, + jumpToLatest, + openCoachHistory, + shortcutHelpOpen, + coachEvidenceOpen, + coachHistoryOpen, + endDialogOpen, + ending, + ]); useEffect(() => { voiceCaptureMountedRef.current = true; @@ -2544,29 +2865,57 @@ export default function Session() { {started ? ( -
) : null} + {shortcutHelpOpen ? ( +
{ + if (event.target === event.currentTarget) setShortcutHelpOpen(false); + }} + > +
event.stopPropagation()} + > +
+ +
+

키보드 단축키 안내

+

마우스 없이도 상담과 모든 인터랙션을 빠르게 조작할 수 있습니다.

+
+
+ +
+
+

상담 및 음성

+
+
+
Alt+M
+
마이크 켜기/끄기 토글
+
+
+
Alt+P 또는 Space
+
회기 일시정지 / 재개
+
+
+
Enter
+
텍스트 발화 즉시 전송
+
+
+
Alt+J 또는 Alt+
+
실시간 자막 최신 발화로 스크롤
+
+
+
+ +
+

레이아웃 & 패널 접기

+
+
+
Alt+[ 또는 Ctrl+[
+
좌측 (진행 & 컨텍스트) 패널 접기/펼치기
+
+
+
Alt+] 또는 Ctrl+]
+
우측 (AI 코치 & 신호) 패널 접기/펼치기
+
+
+
Alt+\ 또는 Ctrl+\
+
완전 몰입 모드 (양쪽 패널 동시 토글)
+
+
+
Alt+1 / 2 / 3
+
몰입 / 상태 신호 / 코칭 모드 즉시 전환
+
+
+
+ +
+

AI 코치 및 분석

+
+
+
Alt+C
+
AI 코칭 이력 열기
+
+
+
Alt+E
+
방금 발화 코칭 근거 열기
+
+
+
+ +
+

세션 관리 & 내비게이션

+
+
+
Alt+Q 또는 Alt+W
+
회기 종료 확인창 열기
+
+
+
Ctrl+Enter
+
시작 전 화면에서 회기 즉시 시작
+
+
+
? 또는 Ctrl+/
+
단축키 도움말 열기/닫기
+
+
+
Escape 또는 Ctrl+W
+
열려있는 모달/팝업 닫기
+
+
+
+
+ +
+ +
+
+
+ ) : null} + {/* 경과 시간(접근성 — 보조 표기. 화면 우상단 톱바는 셸 소관) */} {timeUp && !sessionEnded ? "회기 시간 만료" : `경과 ${formatElapsed(elapsed)}`} diff --git a/apps/web/src/pages/avatar-expression-lab.css b/apps/web/src/pages/avatar-expression-lab.css index eeff26e..53f861e 100644 --- a/apps/web/src/pages/avatar-expression-lab.css +++ b/apps/web/src/pages/avatar-expression-lab.css @@ -139,7 +139,7 @@ } .axl__card { - --tone: #53616f; + --tone: var(--neutral-500); min-width: 0; min-height: 188px; position: relative; @@ -163,23 +163,23 @@ } .axl__card--positive { - --tone: #2f7d57; + --tone: var(--pos-solid); } .axl__card--negative { - --tone: #a84444; + --tone: var(--crit-solid); } .axl__card--defensive { - --tone: #7a5730; + --tone: var(--clay); } .axl__card--cognitive { - --tone: #386f9d; + --tone: var(--info-solid); } .axl__card--energy { - --tone: #7565a8; + --tone: var(--accent-bright); } .axl__card .vg-avatar { @@ -187,7 +187,7 @@ } .axl__card .vg-avatar__stage { - box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.05); + box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--bg-surface) 5%, transparent); } .axl__card-meta { diff --git a/apps/web/src/pages/avatar-preview.css b/apps/web/src/pages/avatar-preview.css index b472d3c..3e5fa0d 100644 --- a/apps/web/src/pages/avatar-preview.css +++ b/apps/web/src/pages/avatar-preview.css @@ -1,10 +1,10 @@ .ap{padding:32px;max-width:1100px;margin:0 auto;color:var(--text-body);} .ap__head h1{font-size:var(--fs-h1);margin:0 0 6px;} .ap__head p{color:var(--text-muted);font-size:var(--fs-sm);margin:0 0 28px;} -.ap__hero{display:flex;gap:32px;flex-wrap:wrap;justify-content:center;padding:24px;border:1px solid var(--border-subtle);border-radius:20px;background:linear-gradient(135deg,rgba(238,244,242,.96),rgba(246,240,236,.92));margin-bottom:32px;} -.ap__hero .vg-avatar__persona{color:#1c2a2a;} -.ap__hero .vg-avatar__state{color:#5a6663;} -.ap__hero .vg-avatar__state b{color:#1c2a2a;} +.ap__hero{display:flex;gap:32px;flex-wrap:wrap;justify-content:center;padding:24px;border:1px solid var(--border-subtle);border-radius:20px;background:linear-gradient(135deg,color-mix(in srgb,var(--accent-tint) 96%,transparent),color-mix(in srgb,var(--bg-surface-2) 92%,transparent));margin-bottom:32px;} +.ap__hero .vg-avatar__persona{color:var(--text-strong);} +.ap__hero .vg-avatar__state{color:var(--text-muted);} +.ap__hero .vg-avatar__state b{color:var(--text-strong);} .ap__grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:18px;} .ap__cell{margin:0;display:flex;flex-direction:column;align-items:center;gap:8px;} .ap__cell figcaption{font-size:var(--fs-xs);color:var(--text-muted);} diff --git a/apps/web/src/pages/learner-home.css b/apps/web/src/pages/learner-home.css index 69aa63d..76d9363 100644 --- a/apps/web/src/pages/learner-home.css +++ b/apps/web/src/pages/learner-home.css @@ -75,48 +75,35 @@ min-width:0; display:grid; grid-template-columns:repeat(4,minmax(0,1fr)); - gap:10px; + gap:12px; } /* 중간 폭 이하 전용 가로 탭 — 데스크톱에서는 숨김(리뷰 화면 sr-tabs와 동일 패턴) */ .lh-tabs{ display:none; - gap:6px; + gap:4px; padding:4px; border:1px solid var(--border-subtle); - border-radius:var(--radius); + border-radius:var(--radius-pill); background:var(--bg-surface-2); + box-shadow:var(--shadow-sm); } .lh-tabs button{ position:relative; flex:1 1 0; min-width:0; - padding:9px 12px; + padding:8px 12px; border:1px solid transparent; - border-radius:calc(var(--radius) - 2px); + border-radius:var(--radius-pill); background:transparent; color:var(--text-body); font-size:var(--fs-sm); - font-weight:700; + font-weight:650; cursor:pointer; - min-height:44px; + min-height:42px; + transition:all var(--dur-fast) var(--ease-spring); } -/* D6(탭 구분 강화): 비활성 탭이 배경과 같아 "여러 개 중 하나"로 안 읽혔다. - 비활성 탭 사이에만 세로 구분선을 넣는다. 활성 탭은 자체 배경/테두리로 - 이미 구분되므로 활성 탭에 붙는 구분선은 숨겨 이중 경계선을 막는다. */ -.lh-tabs button + button::before{ - content:""; - position:absolute; - left:-4px; - top:22%; - bottom:22%; - width:1px; - background:var(--border-strong); - opacity:.55; - pointer-events:none; -} -.lh-tabs button.is-active::before, -.lh-tabs button.is-active + button::before{ - opacity:0; +.lh-tabs button:active{ + transform:scale(0.96); } .lh-tabs button:hover{ color:var(--text-strong); @@ -131,6 +118,7 @@ border-color:var(--border-strong); color:var(--text-strong); box-shadow:var(--shadow-sm); + font-weight:750; } .lh-dashboard-side{ min-width:0; @@ -448,7 +436,7 @@ inset:0 auto 0 0; width:var(--lh-stage-progress,0%); border-radius:inherit; - background:linear-gradient(90deg,var(--accent),color-mix(in srgb,var(--accent) 72%,#f2c36b)); + background:linear-gradient(90deg,var(--accent),color-mix(in srgb,var(--accent) 72%,var(--warn-solid))); } .lh-recap__quote{ min-width:0; @@ -1798,19 +1786,19 @@ [data-theme="dark"] .lh-compact-list li, [data-theme="dark"] .lh-persona, [data-theme="dark"] .lh-persona-progress__row{ - border-color:rgba(203,227,220,.11); - background:rgba(255,255,255,.045); + border-color:color-mix(in srgb, var(--accent) 11%, transparent); + background:color-mix(in srgb, var(--text-strong) 4.5%, transparent); } [data-theme="dark"] .lh-recommend-card{ - border-color:rgba(111,179,164,.22); + border-color:color-mix(in srgb, var(--accent) 22%, transparent); background: - linear-gradient(135deg,rgba(111,179,164,.12),transparent 62%), - rgba(255,255,255,.052); + linear-gradient(135deg,color-mix(in srgb, var(--accent) 12%, transparent),transparent 62%), + color-mix(in srgb, var(--text-strong) 5.2%, transparent); } [data-theme="dark"] .lh-persona.is-selected, [data-theme="dark"] .lh-persona-progress__row.is-selected{ - border-color:rgba(111,179,164,.66); - background:rgba(111,179,164,.13); + border-color:color-mix(in srgb, var(--accent) 66%, transparent); + background:color-mix(in srgb, var(--accent) 13%, transparent); } @keyframes lhSkel{0%{background-position:120% 0}100%{background-position:-80% 0}} /* 중간 폭(1181~1420px): 우측 사이드는 유지하되 리캡+코치 2열은 세로 스택으로. @@ -1939,9 +1927,14 @@ .lh-recap__facts{ grid-template-columns:repeat(2,minmax(0,1fr)); } + .lh-dashboard-status{ + grid-template-columns:repeat(2,minmax(0,1fr)); + gap:10px; + } .lh-metric-card{ min-height:0; - padding:12px; + padding:14px; + border-radius:var(--radius); } .lh-personas{ display:flex; @@ -2175,7 +2168,7 @@ /* ═══ 학습 대시보드 보태니컬 시안 적용 ═══ 카드 광원은 좌상단, 황금 기운은 헤어라인과 가장자리에서만 아주 옅게 사용한다. */ .vg-shell--learner-dashboard .lh-root { - --lh-gold: #b5975d; + --lh-gold: var(--clay-deep); --lh-botanical-hair: color-mix(in srgb, var(--lh-gold) 34%, var(--border-subtle)); --lh-botanical-line: color-mix(in srgb, var(--lh-gold) 17%, var(--border-subtle)); gap: clamp(18px, 2vw, 28px); @@ -2187,7 +2180,7 @@ .vg-shell--learner-dashboard .lh-head__status { border-color: var(--lh-botanical-hair); background: var(--glass-surface-inset); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.62); + box-shadow: inset 0 1px 0 color-mix(in srgb, var(--bg-surface) 62%, transparent); backdrop-filter: blur(10px); } .vg-shell--learner-dashboard .lh-dashboard-status { @@ -2261,7 +2254,7 @@ position: absolute; inset: 0; border-radius: inherit; - background: radial-gradient(circle at 100% 0%, rgba(187, 156, 97, 0.06), transparent 22rem); + background: radial-gradient(circle at 100% 0%, color-mix(in srgb, var(--clay) 6%, transparent), transparent 22rem); pointer-events: none; } .vg-shell--learner-dashboard .lh-work-cluster > * { @@ -2298,7 +2291,7 @@ background:var(--accent); border-color:color-mix(in srgb,var(--accent-deep) 78%,var(--lh-gold)); color:var(--text-on-accent); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.28); + box-shadow: inset 0 1px 0 color-mix(in srgb, var(--bg-surface) 28%, transparent); } .vg-shell--learner-dashboard .lh-coach-card__cta:hover:not(:disabled) { background:var(--accent-deep); @@ -2311,12 +2304,12 @@ } [data-theme="dark"] .vg-shell--learner-dashboard .lh-root { - --lh-gold: #bca579; + --lh-gold: var(--clay); --lh-botanical-hair: color-mix(in srgb, var(--lh-gold) 27%, var(--border-subtle)); --lh-botanical-line: color-mix(in srgb, var(--lh-gold) 16%, var(--border-subtle)); } [data-theme="dark"] .vg-shell--learner-dashboard .lh-head__status { - box-shadow: inset 0 1px 0 rgba(255, 245, 222, 0.055); + box-shadow: inset 0 1px 0 color-mix(in srgb, var(--clay-tint) 5.5%, transparent); } [data-theme="dark"] .vg-shell--learner-dashboard .lh-metric-card { --lh-card-art: url("/design-elements/learner-dashboard/card-leaf-sprig.png"); @@ -2336,8 +2329,8 @@ } [data-theme="dark"] .vg-shell--learner-dashboard .lh-work-cluster::before { background: - linear-gradient(105deg, rgba(203, 184, 139, 0.025), transparent 38%), - radial-gradient(circle at 100% 0%, rgba(187, 156, 97, 0.055), transparent 22rem); + linear-gradient(105deg, color-mix(in srgb, var(--clay) 2.5%, transparent), transparent 38%), + radial-gradient(circle at 100% 0%, color-mix(in srgb, var(--clay) 5.5%, transparent), transparent 22rem); } [data-theme="dark"] .vg-shell--learner-dashboard .lh-coach-card::after { background-image: url("/design-elements/learner-dashboard/card-paired-leaves.png"); @@ -2600,11 +2593,11 @@ } [data-theme="dark"] .vg-shell--learner-dashboard .lh-root { - --text-strong: #eee8dc; - --text-body: #c3beb2; - --text-muted: #928f86; - --lh-botanical-hair: rgba(184, 160, 110, 0.31); - --lh-botanical-line: rgba(184, 160, 110, 0.22); + --text-strong: var(--ink-0); + --text-body: var(--ink-2); + --text-muted: var(--ink-3); + --lh-botanical-hair: color-mix(in srgb, var(--clay) 31%, transparent); + --lh-botanical-line: color-mix(in srgb, var(--clay) 22%, transparent); } [data-theme="dark"] .vg-shell--learner-dashboard .lh-recap__avatar { border: 0; diff --git a/apps/web/src/pages/login/login.css b/apps/web/src/pages/login/login.css index 46ed150..2261978 100644 --- a/apps/web/src/pages/login/login.css +++ b/apps/web/src/pages/login/login.css @@ -95,7 +95,7 @@ position: relative; z-index: 0; padding: 0 4px; - background: linear-gradient(90deg, #6b9488, #9fc0b5); + background: linear-gradient(90deg, var(--accent-deep), var(--accent-bright)); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; @@ -205,6 +205,11 @@ font-weight: 650; text-align: left; cursor: pointer; + transition: transform var(--dur-fast) var(--ease-spring), background var(--dur-base) var(--ease-out), border-color var(--dur-base) var(--ease-out); +} + +.lg-obtn:active { + transform: translateY(1px) scale(0.98); } .lg-obtn.primary { @@ -286,9 +291,8 @@ margin-top: var(--sp-3); padding: 10px 12px; border-radius: var(--radius); - /* 2026-07-27: 기존 rgba(154,94,20,.28) + #f2b75f 조합은 다크 패널 전제였다. - 라이트 패널 위에서는 탄색 배경에 밝은 앰버 글자가 얹혀 1.19:1까지 떨어져 - 사실상 읽을 수 없었다. 테마별로 스왑되는 warn 의미 토큰으로 교체한다. */ + /* 2026-07-27: 기존 하드코딩 다크 전제 색상 대신 + 라이트/다크 테마별로 스왑되는 warn 의미 토큰으로 교체한다. */ background: var(--warn-tint); border: 1px solid color-mix(in srgb, var(--warn-solid) 34%, transparent); color: var(--warn-text); @@ -335,6 +339,11 @@ color: var(--text-strong); text-align: left; cursor: pointer; + transition: transform var(--dur-fast) var(--ease-spring), background var(--dur-base) var(--ease-out), border-color var(--dur-base) var(--ease-out); +} + +.lg-roleopt:active { + transform: translateY(1px) scale(0.98); } .lg-roleopt.is-sel { @@ -353,11 +362,11 @@ } .lg-roleopt .d.teacher { - background: #5478c4; + background: var(--info-solid); } .lg-roleopt .d.admin { - background: #7d818e; + background: var(--neutral-500); } .lg-roleopt b { @@ -376,14 +385,19 @@ width: 100%; min-height: 46px; margin-top: var(--sp-3); - border: 1px solid rgba(114, 211, 197, 0.58); + border: 1px solid color-mix(in srgb, var(--accent) 58%, transparent); border-radius: var(--radius); - background: rgba(89, 181, 166, 0.15); + background: color-mix(in srgb, var(--accent-tint) 60%, transparent); color: var(--accent-deep); font-family: var(--font-sans); font-size: 14px; font-weight: 750; cursor: pointer; + transition: transform var(--dur-fast) var(--ease-spring), background var(--dur-base) var(--ease-out); +} + +.lg-devbtn:active { + transform: translateY(1px) scale(0.98); } .lg-devbtn:disabled { @@ -394,8 +408,8 @@ .lg-error { margin: var(--sp-3) 0 0; color: var(--crit-text); - background: rgba(122, 38, 38, 0.28); - border: 1px solid rgba(255, 145, 145, 0.18); + background: var(--crit-tint); + border: 1px solid color-mix(in srgb, var(--crit-solid) 30%, transparent); border-radius: var(--radius); padding: 10px 12px; font-size: 13px; diff --git a/apps/web/src/pages/onboarding.css b/apps/web/src/pages/onboarding.css index b8d5981..6cf8ed0 100644 --- a/apps/web/src/pages/onboarding.css +++ b/apps/web/src/pages/onboarding.css @@ -172,8 +172,14 @@ grid-template-columns:auto minmax(0,1fr); align-items:center; gap:10px; - min-height:28px; + min-height:34px; + padding:4px 6px; + border-radius:var(--radius-sm); cursor:pointer; + transition:background var(--dur-fast) var(--ease-out); +} +.ob-checks label:hover{ + background:color-mix(in srgb,var(--text-strong) 4%,transparent); } .ob-checks input{ width:18px; diff --git a/apps/web/src/pages/pending-approval.css b/apps/web/src/pages/pending-approval.css index 6ff18f1..7b44274 100644 --- a/apps/web/src/pages/pending-approval.css +++ b/apps/web/src/pages/pending-approval.css @@ -12,8 +12,8 @@ padding:clamp(24px,5vw,44px); border:1px solid var(--border-subtle); border-radius:var(--radius); - background:color-mix(in srgb,var(--bg-surface) 92%,white 8%); - box-shadow:0 18px 50px rgba(28,43,40,.10); + background: var(--bg-surface); + box-shadow: var(--shadow-island); } .pa-mark{ width:62px; @@ -63,8 +63,13 @@ width:10px; height:10px; border-radius:50%; - background:#d89a2b; - box-shadow:0 0 0 5px rgba(216,154,43,.14); + background:var(--warn-solid); + box-shadow:0 0 0 5px var(--warn-tint); + animation:paBreathe 2400ms var(--ease-in-out) infinite; +} +@keyframes paBreathe{ + 0%,100%{transform:scale(1);opacity:0.85;} + 50%{transform:scale(1.2);opacity:1;} } .pa-status b{ display:block; diff --git a/apps/web/src/pages/persona-studio.css b/apps/web/src/pages/persona-studio.css index d6e8d46..92ce436 100644 --- a/apps/web/src/pages/persona-studio.css +++ b/apps/web/src/pages/persona-studio.css @@ -907,8 +907,8 @@ .ps-point-list > div{display:grid;grid-template-columns:minmax(0,1fr) 70px 120px;gap:12px;padding:11px 0;border-bottom:1px solid var(--hair);color:var(--text-body);font-size:var(--fs-xs);} .ps-point-list b{font-family:var(--font-num);font-variant-numeric:tabular-nums;} .ps-point-list small{color:var(--text-muted);text-align:right;} -.ps-stepper{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));border:1px solid var(--border-subtle);border-radius:var(--radius);overflow:hidden;background:color-mix(in srgb,var(--bg-surface) 78%,transparent);} -.ps-stepper button{min-width:0;display:grid;grid-template-columns:32px minmax(0,1fr);gap:10px;align-items:center;padding:13px 14px;border:0;border-right:1px solid var(--border-subtle);background:transparent;color:var(--text-muted);text-align:left;cursor:pointer;} +.ps-stepper button{min-width:0;display:grid;grid-template-columns:32px minmax(0,1fr);gap:10px;align-items:center;padding:13px 14px;border:0;border-right:1px solid var(--border-subtle);background:transparent;color:var(--text-muted);text-align:left;cursor:pointer;transition:transform var(--dur-fast) var(--ease-spring), background var(--dur-fast) var(--ease-out), color var(--dur-fast) var(--ease-out);} +.ps-stepper button:active{transform:scale(0.96);} .ps-stepper button:last-child{border-right:0;} .ps-stepper button > span:first-child{display:grid;place-items:center;width:30px;height:30px;border:1px solid var(--border-subtle);border-radius:50%;font-family:var(--font-num);font-size:11px;font-weight:800;} .ps-stepper button > span:last-child{min-width:0;display:grid;gap:2px;} diff --git a/apps/web/src/pages/professor.css b/apps/web/src/pages/professor.css index 5f7bebc..72dec6d 100644 --- a/apps/web/src/pages/professor.css +++ b/apps/web/src/pages/professor.css @@ -1326,6 +1326,10 @@ .pf-session:first-child{border-top:0;} .pf-session--action{ cursor:pointer; + transition:transform var(--dur-fast) var(--ease-spring), background var(--dur-fast) var(--ease-out); +} +.pf-session--action:active{ + transform:scale(0.985); } .pf-session--action:hover{ background:var(--bg-surface-2); diff --git a/apps/web/src/pages/session-review/calibration-transfer.css b/apps/web/src/pages/session-review/calibration-transfer.css index fd403e7..b543f70 100644 --- a/apps/web/src/pages/session-review/calibration-transfer.css +++ b/apps/web/src/pages/session-review/calibration-transfer.css @@ -784,7 +784,7 @@ padding: 0 var(--sp-4); border-radius: var(--radius-sm); background: var(--accent); - color: var(--text-on-accent, #fff); + color: var(--text-on-accent); font-size: var(--fs-sm); font-weight: 720; text-decoration: none; diff --git a/apps/web/src/pages/session-review/deliberate-practice.css b/apps/web/src/pages/session-review/deliberate-practice.css index 711e1fe..b3134a6 100644 --- a/apps/web/src/pages/session-review/deliberate-practice.css +++ b/apps/web/src/pages/session-review/deliberate-practice.css @@ -184,7 +184,7 @@ .dp-runtime-observation__message.is-waiting { border-color: color-mix( in srgb, - var(--botanical-gold, #96743d) 44%, + var(--botanical-gold, var(--clay)) 44%, var(--border-subtle) ); } @@ -197,7 +197,7 @@ .dp-runtime-observation__message.is-error { border-color: color-mix( in srgb, - var(--danger, #a34a46) 42%, + var(--danger, var(--crit-solid)) 42%, var(--border-subtle) ); } @@ -483,7 +483,7 @@ .dp-launch-ticket__cta { padding: 0 var(--sp-4); background: var(--accent); - color: var(--text-on-accent, #fff); + color: var(--text-on-accent); white-space: nowrap; } @@ -523,7 +523,7 @@ } .dp-gate--transfer_pending > span { - border-color: var(--botanical-gold, #96743d); + border-color: var(--botanical-gold, var(--clay)); } .dp-gate--mastered > span { @@ -865,8 +865,8 @@ .dp-form-message--error { border: 1px solid - color-mix(in srgb, var(--danger, #a34a46) 38%, var(--border-subtle)); - color: var(--danger, #8d3834); + color-mix(in srgb, var(--danger, var(--crit-solid)) 38%, var(--border-subtle)); + color: var(--danger, var(--crit-text)); } .dp-form-message--success { @@ -969,7 +969,7 @@ .dp-card--error { border-color: color-mix( in srgb, - var(--danger, #a34a46) 35%, + var(--danger, var(--crit-solid)) 35%, var(--border-subtle) ); } diff --git a/apps/web/src/pages/session-review/session-review.css b/apps/web/src/pages/session-review/session-review.css index 029b0a3..48e013c 100644 --- a/apps/web/src/pages/session-review/session-review.css +++ b/apps/web/src/pages/session-review/session-review.css @@ -300,41 +300,34 @@ /* ── 리뷰 영역 가로 탭 ── */ .sr-tabs { display: flex; - gap: 6px; + gap: 4px; padding: 4px; border: 1px solid var(--border-subtle); - border-radius: var(--radius); + border-radius: var(--radius-pill); background: var(--bg-surface-2); + box-shadow: var(--shadow-sm); } .sr-tabs button { position: relative; flex: 1 1 0; min-width: 0; - padding: 9px 12px; + padding: 8px 14px; border: 1px solid transparent; - border-radius: calc(var(--radius) - 2px); + border-radius: var(--radius-pill); background: transparent; color: var(--text-body); font-size: var(--fs-sm); - font-weight: 700; + font-weight: 650; cursor: pointer; - min-height: 44px; + min-height: 42px; + transition: all var(--dur-fast) var(--ease-spring); } -/* D6: 비활성 탭이 배경과 붙어 보이지 않으므로 탭 사이마다 얇은 구분선을 세워 - "여러 개 중 하나"임을 드러낸다. 가운데 탭이 활성일 때도 구분이 남도록 항상 그리고, - 활성 탭 카드와 겹치지 않게 6px 간격 한가운데(-4px)에 둔다. */ -.sr-tabs button + button::before { - content: ""; - position: absolute; - left: -4px; - top: 24%; - bottom: 24%; - width: 1px; - background: var(--border-strong); - opacity: 0.8; +.sr-tabs button:active { + transform: scale(0.96); } .sr-tabs button:hover { color: var(--text-strong); + background: color-mix(in srgb, var(--text-strong) 5%, transparent); } .sr-tabs button:focus-visible { outline: 2px solid var(--focus-ring); @@ -345,6 +338,7 @@ border-color: var(--border-strong); color: var(--text-strong); box-shadow: var(--shadow-sm); + font-weight: 750; } /* 대기 자리표시자는 사이드 레일에서 컴팩트하게 — 큰 빈 박스 금지 */ @@ -485,6 +479,8 @@ font-weight: 650; letter-spacing: 0; line-height: 1.45; + text-wrap: balance; + word-break: keep-all; } .sr-overview .sr-summary { font-size: var(--fs-sm); @@ -1517,24 +1513,24 @@ [data-theme="dark"] .sr-card, [data-theme="dark"] .sr-overview { background: var(--surface-gradient); - border-color: rgba(203, 227, 220, 0.13); + border-color: color-mix(in srgb, var(--accent) 13%, var(--border-subtle)); box-shadow: - 0 16px 42px rgba(3, 9, 8, 0.24), - inset 0 1px 0 rgba(255, 255, 255, 0.035); + var(--shadow-md), + inset 0 1px 0 color-mix(in srgb, var(--bg-surface) 3.5%, transparent); } [data-theme="dark"] .sr-card--transcript { - background: linear-gradient(180deg, rgba(13, 24, 22, 0.98), rgba(11, 19, 17, 0.98)); + background: linear-gradient(180deg, color-mix(in srgb, var(--bg-app) 98%, transparent), color-mix(in srgb, var(--bg-surface) 98%, transparent)); } [data-theme="dark"] .sr-overview { - border-color: rgba(125, 162, 148, 0.2); - background: linear-gradient(180deg, rgba(32, 50, 45, 0.94), rgba(18, 31, 28, 0.98)); + border-color: color-mix(in srgb, var(--accent) 20%, transparent); + background: linear-gradient(180deg, color-mix(in srgb, var(--bg-surface-2) 94%, transparent), color-mix(in srgb, var(--bg-surface) 98%, transparent)); } [data-theme="dark"] .sr-card--worksheet { - background: linear-gradient(180deg, rgba(25, 39, 44, 0.94), rgba(16, 27, 31, 0.98)); + background: linear-gradient(180deg, color-mix(in srgb, var(--bg-surface-2) 94%, transparent), color-mix(in srgb, var(--bg-surface) 98%, transparent)); } [data-theme="dark"] .sr-card--prepost, [data-theme="dark"] .sr-card--rubric { - background: linear-gradient(180deg, rgba(29, 43, 38, 0.92), rgba(18, 30, 27, 0.96)); + background: linear-gradient(180deg, color-mix(in srgb, var(--bg-surface-2) 92%, transparent), color-mix(in srgb, var(--bg-surface) 96%, transparent)); } [data-theme="dark"] .sr-stat, [data-theme="dark"] .sr-readiness span, @@ -1545,8 +1541,8 @@ [data-theme="dark"] .sr-prepost__field input, [data-theme="dark"] .sr-feedback, [data-theme="dark"] .sr-nextline { - background: rgba(255, 255, 255, 0.055); - border-color: rgba(203, 227, 220, 0.12); + background: color-mix(in srgb, var(--text-strong) 5.5%, transparent); + border-color: color-mix(in srgb, var(--accent) 12%, transparent); } [data-theme="dark"] .sr-tx__head, [data-theme="dark"] .sr-turn + .sr-turn, @@ -1554,35 +1550,35 @@ [data-theme="dark"] .sr-ws-limitations, [data-theme="dark"] .sr-prepost__actions, [data-theme="dark"] .sr-feedback__src { - border-color: rgba(203, 227, 220, 0.1); + border-color: color-mix(in srgb, var(--accent) 10%, transparent); } [data-theme="dark"] .sr-turn__said--client { - color: rgba(234, 240, 241, 0.74); + color: color-mix(in srgb, var(--text-strong) 74%, transparent); } [data-theme="dark"] .sr-note--ai { - background: rgba(92, 151, 190, 0.12); + background: color-mix(in srgb, var(--info-solid) 12%, transparent); } [data-theme="dark"] .sr-note--warn { - background: rgba(212, 162, 74, 0.12); + background: color-mix(in srgb, var(--warn-solid) 12%, transparent); } [data-theme="dark"] .sr-turn--active .sr-turn__said { - background: rgba(125, 162, 148, 0.14); + background: color-mix(in srgb, var(--accent) 14%, transparent); } [data-theme="dark"] .sr-practice-return { - border-color: rgba(125, 162, 148, 0.32); - background: rgba(32, 50, 45, 0.88); + border-color: color-mix(in srgb, var(--accent) 32%, transparent); + background: color-mix(in srgb, var(--bg-surface-2) 88%, transparent); } [data-theme="dark"] .sr-practice-return__facts > div { - border-color: rgba(203, 227, 220, 0.13); - background: rgba(255, 255, 255, 0.055); + border-color: color-mix(in srgb, var(--accent) 13%, transparent); + background: color-mix(in srgb, var(--text-strong) 5.5%, transparent); } [data-theme="dark"] .sr-practice-return.is-error { - border-color: rgba(224, 139, 130, 0.42); - background: rgba(93, 42, 42, 0.3); + border-color: color-mix(in srgb, var(--crit-solid) 42%, transparent); + background: color-mix(in srgb, var(--crit-solid) 30%, transparent); } [data-theme="dark"] .sr-feedback--filled { - border-color: rgba(203, 227, 220, 0.12); - background: linear-gradient(135deg, rgba(12, 24, 21, 0.98), rgba(30, 44, 40, 0.92)); + border-color: color-mix(in srgb, var(--accent) 12%, transparent); + background: linear-gradient(135deg, color-mix(in srgb, var(--bg-app) 98%, transparent), color-mix(in srgb, var(--bg-surface) 92%, transparent)); } @media (max-width: 1180px) { diff --git a/apps/web/src/pages/session/alliance-checkpoint-prompt.css b/apps/web/src/pages/session/alliance-checkpoint-prompt.css index 3d292a1..c2dbbe9 100644 --- a/apps/web/src/pages/session/alliance-checkpoint-prompt.css +++ b/apps/web/src/pages/session/alliance-checkpoint-prompt.css @@ -9,9 +9,9 @@ ===================================================================== */ .sx-alliance-checkpoint { - --checkpoint-ink: var(--text-strong, #132822); - --checkpoint-muted: var(--text-muted, #66736f); - --checkpoint-line: color-mix(in srgb, var(--accent, #2f695b) 18%, transparent); + --checkpoint-ink: var(--text-strong); + --checkpoint-muted: var(--text-muted); + --checkpoint-line: color-mix(in srgb, var(--accent) 18%, transparent); --checkpoint-hair: color-mix(in srgb, var(--checkpoint-ink) 12%, transparent); --checkpoint-title: clamp(1.02rem, 1.5vw, 1.24rem); --checkpoint-pad: clamp(16px, 1.6vw, 24px); @@ -23,7 +23,7 @@ margin: 14px auto 0; padding: 14px 16px; color: var(--checkpoint-ink); - background: color-mix(in srgb, var(--surface, #fff) 94%, var(--accent, #2f695b) 6%); + background: color-mix(in srgb, var(--surface) 94%, var(--accent) 6%); border: 1px solid var(--checkpoint-line); border-radius: 14px; word-break: keep-all; @@ -50,9 +50,9 @@ width: 9px; height: 9px; flex: 0 0 auto; - background: var(--accent, #2f695b); + background: var(--accent); border-radius: 999px; - box-shadow: 0 0 0 6px color-mix(in srgb, var(--accent, #2f695b) 12%, transparent); + box-shadow: 0 0 0 6px color-mix(in srgb, var(--accent) 12%, transparent); } .sx-alliance-checkpoint.is-loading .sx-alliance-checkpoint__signal { @@ -60,8 +60,8 @@ } .sx-alliance-checkpoint.is-error { - border-color: color-mix(in srgb, var(--crit-solid, #a13c3c) 34%, transparent); - background: color-mix(in srgb, var(--surface, #fff) 94%, var(--crit-tint, #faeae8) 6%); + border-color: color-mix(in srgb, var(--crit-solid) 34%, transparent); + background: color-mix(in srgb, var(--surface) 94%, var(--crit-tint) 6%); } /* ── 확장 카드 공통 ───────────────────────────────────────────────── */ @@ -69,12 +69,12 @@ .sx-alliance-checkpoint.is-expanded { display: block; padding: var(--checkpoint-pad); - border-color: color-mix(in srgb, var(--accent, #2f695b) 28%, transparent); - box-shadow: 0 18px 50px rgb(18 42 35 / 9%); + border-color: color-mix(in srgb, var(--accent) 28%, transparent); + box-shadow: var(--shadow-island); } .sx-alliance-checkpoint.is-pre { - border-top: 3px solid var(--accent, #2f695b); + border-top: 3px solid var(--accent); } .sx-alliance-checkpoint__head { @@ -91,7 +91,7 @@ } .sx-alliance-checkpoint__eyebrow { - color: var(--accent, #2f695b); + color: var(--accent); font-size: 0.68rem; font-weight: 760; letter-spacing: 0.12em; @@ -136,12 +136,12 @@ } .sx-alliance-checkpoint__progress.is-done { - color: var(--accent, #2f695b); - background: color-mix(in srgb, var(--accent, #2f695b) 13%, transparent); + color: var(--accent); + background: color-mix(in srgb, var(--accent) 13%, transparent); } .sx-alliance-checkpoint__progress.is-done b { - color: var(--accent, #2f695b); + color: var(--accent); } /* ── 3축 ─────────────────────────────────────────────────────────── */ @@ -216,25 +216,25 @@ gap: 2px; padding: 7px 4px; cursor: pointer; - background: var(--bg-surface-2, #f4f2ee); + background: var(--bg-surface-2); border: 1px solid var(--checkpoint-hair); border-radius: 10px; transition: background 150ms ease, border-color 150ms ease, color 150ms ease; } .sx-alliance-checkpoint__scale label:hover { - background: color-mix(in srgb, var(--accent, #2f695b) 8%, var(--bg-surface-2, #f4f2ee)); - border-color: color-mix(in srgb, var(--accent, #2f695b) 42%, transparent); + background: color-mix(in srgb, var(--accent) 8%, var(--bg-surface-2)); + border-color: color-mix(in srgb, var(--accent) 42%, transparent); } .sx-alliance-checkpoint__scale label.is-selected { - color: var(--text-on-accent, #fbfaf8); - background: var(--accent, #2f695b); - border-color: var(--accent, #2f695b); + color: var(--text-on-accent); + background: var(--accent); + border-color: var(--accent); } .sx-alliance-checkpoint__scale label.is-selected:hover { - background: var(--accent, #2f695b); + background: var(--accent); } .sx-alliance-checkpoint__scale input { @@ -245,7 +245,7 @@ } .sx-alliance-checkpoint__scale label:focus-within { - outline: 3px solid color-mix(in srgb, var(--accent, #2f695b) 34%, transparent); + outline: 3px solid color-mix(in srgb, var(--accent) 34%, transparent); outline-offset: 2px; } @@ -306,7 +306,7 @@ fieldset[disabled] .sx-alliance-checkpoint__scale label { .sx-alliance-checkpoint__error { margin: 14px 0 0; - color: var(--crit-text, #a13c3c); + color: var(--crit-text); font-size: 0.78rem; } @@ -316,7 +316,7 @@ fieldset[disabled] .sx-alliance-checkpoint__scale label { gap: 7px; width: min(1180px, calc(100% - 32px)); margin: 10px auto 0; - color: var(--text-muted, #66736f); + color: var(--text-muted); font-size: 0.72rem; } diff --git a/apps/web/src/pages/session/session.css b/apps/web/src/pages/session/session.css index 0617c16..64cf4b8 100644 --- a/apps/web/src/pages/session/session.css +++ b/apps/web/src/pages/session/session.css @@ -9,6 +9,7 @@ ===================================================================== */ .sx-page { + --session-max-w: min(100%, 1480px); width: 100%; max-width: none; margin: 0 auto; @@ -16,7 +17,8 @@ height: calc(100dvh - var(--topbar-h)); min-height: 0; padding: var(--sp-5) var(--sp-5) var(--sp-4); - overflow: hidden; + overflow-x: hidden; + overflow-y: auto; display: grid; grid-template-rows: auto minmax(0, 1fr) auto; gap: var(--sp-4); @@ -25,7 +27,7 @@ word-break: keep-all; overflow-wrap: break-word; background: - linear-gradient(135deg, rgba(251, 250, 248, 0.94), rgba(244, 242, 238, 0.9)), + linear-gradient(135deg, color-mix(in srgb, var(--bg-surface) 94%, transparent), color-mix(in srgb, var(--bg-surface-2) 90%, transparent)), var(--asset-warm-elements) center / cover no-repeat; } .sx-page, @@ -51,12 +53,14 @@ height: 100vh; height: 100dvh; grid-template-rows: min-content minmax(0, 1fr) min-content; - padding: 10px 14px 14px; - gap: 10px; + padding: 10px clamp(12px, 1.8vw, 24px) 14px; + gap: 12px; + overflow-x: hidden; + overflow-y: auto; background: radial-gradient(circle at 18% 8%, color-mix(in srgb, var(--accent) 11%, transparent), transparent 28%), radial-gradient(circle at 86% 12%, color-mix(in srgb, var(--clay) 8%, transparent), transparent 24%), - var(--glass-canvas); + var(--bg-app); color: var(--text-strong); } .sx-page--active:has(.sx-timebar) { @@ -84,6 +88,8 @@ .sx-page--active.sx-alliance-gated .sx-alliance-checkpoint { min-height: 0; max-height: 100%; + width: 100%; + max-width: var(--session-max-w, 1480px); margin: 0 auto; overflow-y: auto; overscroll-behavior: contain; @@ -99,8 +105,9 @@ color-scheme: dark; } .sx-page--active .sx-grid { - height: auto; - width: min(100%, 1460px); + height: 100%; + width: 100%; + max-width: var(--session-max-w, 1480px); margin: 0 auto; } .sx-page--active .sx-head { @@ -108,14 +115,15 @@ } .sx-sessionbar { - width: min(100%, 1460px); - min-height: 44px; + width: 100%; + max-width: var(--session-max-w, 1480px); + min-height: 48px; margin: 0 auto; - padding: 6px 8px; + padding: 6px 12px; display: flex; align-items: center; justify-content: space-between; - gap: 10px; + gap: 12px; border: 1px solid var(--glass-border); border-radius: var(--radius); background: var(--glass-specular), var(--glass-surface-strong); @@ -123,10 +131,48 @@ box-shadow: var(--glass-edge-shadow), var(--glass-shadow); backdrop-filter: blur(12px); min-width: 0; + box-sizing: border-box; +} +.sx-sessionbar__left { + display: flex; + align-items: center; + gap: 10px; + min-width: 0; + flex: 1 1 auto; +} +.sx-sessionbar__toggles { + display: flex; + align-items: center; + gap: 6px; + flex: 0 0 auto; +} +.sx-sessionbar__toggle-btn { + min-height: 36px; + padding: 6px 12px; + border: 1px solid var(--glass-inset-border); + border-radius: var(--radius-sm); + background: var(--glass-specular-inset), var(--glass-surface-inset); + color: var(--text-strong); + display: inline-flex; + align-items: center; + gap: 6px; + font: 650 12px/1 var(--font-sans); + white-space: nowrap; + cursor: pointer; + transition: all var(--dur-fast) var(--ease-out); +} +.sx-sessionbar__toggle-btn:hover { + background: var(--accent-tint); + color: var(--accent-deep); + border-color: color-mix(in srgb, var(--accent) 38%, transparent); +} +.sx-sessionbar__toggle-btn.is-collapsed { + opacity: 0.68; + background: transparent; } .sx-sessionbar button { min-height: 44px; /* 터치 타깃 44×44 (WCAG 2.5.5 / 플랫폼 HIG) */ - padding: 7px 10px; + padding: 7px 12px; border: 1px solid var(--glass-inset-border); border-radius: var(--radius-sm); background: var(--glass-specular-inset), var(--glass-surface-inset); @@ -138,9 +184,11 @@ font: 700 12.5px/1 var(--font-sans); white-space: nowrap; cursor: pointer; + transition: all var(--dur-fast) var(--ease-out); } .sx-sessionbar button:hover { background: var(--accent-tint); + color: var(--accent-deep); } .sx-sessionbar__back { flex: none; @@ -195,11 +243,11 @@ border-radius: 50%; flex: none; background: var(--pos-solid); - box-shadow: 0 0 0 4px rgba(69, 165, 127, 0.14); + box-shadow: 0 0 0 4px var(--pos-tint); } .sx-sessionbar__dot.is-ended { background: var(--warn-solid); - box-shadow: 0 0 0 4px rgba(181, 123, 45, 0.16); + box-shadow: 0 0 0 4px var(--warn-tint); } .sx-sessionbar__actions { flex: none; @@ -316,17 +364,110 @@ background: var(--accent-bright); } -/* ── 3-region 그리드 ── */ +/* ── 3-region 가변 그리드 ── */ .sx-grid { display: grid; - grid-template-columns: minmax(248px, 0.76fr) minmax(500px, 2.12fr) minmax(248px, 0.72fr); - gap: 12px; + grid-template-columns: minmax(260px, 0.76fr) minmax(520px, 2.12fr) minmax(260px, 0.72fr); + gap: 14px; align-items: stretch; width: 100%; + max-width: var(--session-max-w, 1480px); + margin: 0 auto; min-width: 0; height: 100%; min-height: 0; - overflow: hidden; + overflow: visible; + transition: grid-template-columns var(--dur-base) var(--ease-spring); +} + +.sx-grid.is-left-collapsed { + grid-template-columns: 48px minmax(520px, 2.12fr) minmax(260px, 0.72fr); +} + +.sx-grid.is-right-collapsed { + grid-template-columns: minmax(260px, 0.76fr) minmax(520px, 2.12fr) 48px; +} + +.sx-grid.is-left-collapsed.is-right-collapsed, +.sx-grid.is-focus-mode { + grid-template-columns: 48px minmax(0, 1fr) 48px; +} + +/* 패널 헤더 정렬 및 닫기 버튼 */ +.sx-panel-head-row { + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; +} + +.sx-panel-close-btn { + display: inline-flex; + align-items: center; + gap: 4px; + padding: 4px 8px; + background: transparent; + border: 1px solid transparent; + border-radius: var(--radius-sm); + color: var(--text-muted); + font: 600 11.5px/1 var(--font-sans); + cursor: pointer; + transition: all var(--dur-fast) var(--ease-out); +} + +.sx-panel-close-btn:hover { + background: var(--accent-tint); + color: var(--accent-deep); + border-color: color-mix(in srgb, var(--accent) 24%, transparent); +} + +/* 접힌 슬림 미니 레일 */ +.sx-col-mini-rail { + width: 48px; + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: flex-start; + padding: 2px 0; + min-width: 48px; +} + +.sx-mini-rail-btn { + width: 44px; + height: 100%; + min-height: 220px; + border: 1px solid var(--glass-border); + border-radius: var(--radius); + background: var(--glass-specular), var(--glass-surface); + box-shadow: var(--glass-edge-shadow), var(--glass-shadow); + color: var(--text-strong); + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 14px; + padding: 18px 4px; + cursor: pointer; + transition: all var(--dur-fast) var(--ease-spring); + backdrop-filter: blur(12px); +} + +.sx-mini-rail-btn:hover { + background: var(--accent-tint); + color: var(--accent-deep); + border-color: var(--accent); + transform: translateY(-2px); + box-shadow: var(--shadow-island); +} + +.sx-mini-rail-txt { + writing-mode: vertical-rl; + text-orientation: mixed; + font-size: 12px; + font-weight: 700; + letter-spacing: 0.06em; + white-space: nowrap; } .sx-mobile-context { @@ -388,13 +529,16 @@ gap: 12px; min-width: 0; min-height: 0; - overflow: hidden; + overflow-y: auto; + overflow-x: visible; + padding: 2px; } .sx-col-center { display: grid; grid-template-rows: minmax(164px, 0.34fr) minmax(0, 1fr); gap: 12px; min-height: 0; + overflow: visible; } .sx-page--active .sx-col-center { grid-template-rows: minmax(250px, 0.44fr) minmax(0, 1fr); @@ -405,7 +549,7 @@ order: 2; flex: 0 0 auto; padding: 14px; - overflow: hidden; + overflow: visible; } .sx-track__head { margin-bottom: 10px; @@ -627,6 +771,7 @@ /* ── CENTER: 어두운 STAGE ── */ .sx-stage { position: relative; + z-index: 1; overflow: hidden; background: var(--bg-stage); border: 1px solid var(--border-subtle); @@ -699,11 +844,11 @@ border-radius: 50%; flex: none; background: var(--clay); - box-shadow: 0 0 0 4px rgba(208, 139, 112, 0.12); + box-shadow: 0 0 0 4px var(--clay-tint); } .sx-stage__state-dot.is-learner { background: var(--accent-bright); - box-shadow: 0 0 0 4px rgba(121, 200, 183, 0.12); + box-shadow: 0 0 0 4px var(--accent-tint); } .sx-stage__state-dot.is-think { background: var(--neutral-sig); @@ -719,6 +864,7 @@ display: flex; align-items: center; justify-content: center; + pointer-events: none; } /* 오브 링 — 상태별 색/모션. box-shadow 로 glow(절제). */ .sx-orb { @@ -810,6 +956,7 @@ } .sx-page--active .sx-stage .vg-avatar { width: clamp(176px, 15vw, 238px) !important; + pointer-events: none; } .sx-page--active .sx-stage .vg-avatar__label { display: none; @@ -914,6 +1061,8 @@ flex-direction: column; min-height: 0; overflow: hidden; + position: relative; + z-index: 10; } .sx-page--active .sx-transcript { background: var(--glass-specular), var(--glass-surface); @@ -1072,7 +1221,7 @@ display: inline-grid; place-items: center; cursor: pointer; - box-shadow: 0 5px 14px rgba(35, 42, 48, 0.1); + box-shadow: var(--shadow-sm); } .sx-utt__coach-mark.is-pos { border-color: color-mix(in srgb, var(--pos-solid) 42%, transparent); @@ -1089,7 +1238,7 @@ } .sx-utt__coach-mark:hover { transform: translateY(-1px); - box-shadow: 0 8px 18px rgba(35, 42, 48, 0.16); + box-shadow: var(--shadow-md); } .sx-utt__coach-mark span { position: absolute; @@ -1228,7 +1377,7 @@ } .sx-page--active button:focus-visible, .sx-page--active textarea:focus-visible { - outline: 2px solid rgba(131, 168, 155, 0.88); + outline: 2px solid var(--accent); outline-offset: 2px; } .sx-turn-error { @@ -1255,6 +1404,446 @@ opacity: 1; } +.sx-compose__actions { + display: flex; + align-items: center; + gap: 8px; + flex: 0 0 auto; +} + +/* ── AI 코칭 트리거 버튼 & 버블 팝업 ── */ +.sx-coach-anchor { + position: relative; + display: inline-flex; +} + +.sx-coach-trigger-btn { + min-height: 44px; + padding: 0 12px; + display: inline-flex; + align-items: center; + gap: 6px; + border-radius: var(--radius-sm); + background: color-mix(in srgb, var(--accent) 12%, var(--bg-surface-2)); + border: 1px solid color-mix(in srgb, var(--accent) 38%, var(--border-strong)); + color: var(--text-strong); + font: 700 13px/1 var(--font-sans); + white-space: nowrap; + cursor: pointer; + transition: all var(--dur-fast) var(--ease-out); +} +.sx-coach-trigger-btn:hover:not(:disabled) { + background: color-mix(in srgb, var(--accent) 22%, var(--bg-surface-2)); + border-color: var(--accent); + color: var(--accent-deep); + transform: translateY(-1px); +} +.sx-coach-trigger-btn.is-active { + background: var(--accent-deep); + border-color: var(--accent-deep); + color: var(--text-on-accent); + box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 30%, transparent); +} +.sx-coach-trigger-btn:disabled { + opacity: 0.55; + cursor: not-allowed; + transform: none; +} + +.sx-coach-trigger-btn__badge { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 19px; + height: 19px; + padding: 0 5px; + border-radius: 999px; + background: var(--accent-deep); + color: var(--text-on-accent); + font-size: 11px; + font-weight: 800; + line-height: 1; + transition: background var(--dur-fast) var(--ease-out); +} +.sx-coach-trigger-btn.is-active .sx-coach-trigger-btn__badge { + background: var(--bg-surface); + color: var(--accent-deep); +} +.sx-coach-trigger-btn__badge.is-empty { + background: var(--neutral-400); + color: #fff; +} + +/* ── AI 코칭 버블 팝업 ── */ +.sx-coach-bubble-popup { + position: absolute; + bottom: calc(100% + 12px); + right: 0; + width: clamp(290px, 85vw, 400px); + max-height: min(400px, 60vh); + background: var(--bg-surface); + border: 1px solid color-mix(in srgb, var(--accent) 35%, var(--border-strong)); + border-radius: var(--radius); + box-shadow: + 0 16px 40px rgba(0, 0, 0, 0.28), + 0 4px 12px rgba(0, 0, 0, 0.14), + 0 0 0 1px color-mix(in srgb, var(--accent) 15%, transparent); + backdrop-filter: blur(20px); + z-index: 120; + display: flex; + flex-direction: column; + overflow: hidden; + animation: sxCoachBubblePop var(--dur-fast) var(--ease-out); +} + +@media (max-width: 680px) { + .sx-coach-bubble-popup { + position: fixed; + bottom: 84px; + left: 12px; + right: 12px; + width: auto; + max-height: 52vh; + z-index: 150; + } + .sx-coach-bubble-popup::after { + display: none; + } +} + +@keyframes sxCoachBubblePop { + from { + opacity: 0; + transform: translateY(6px) scale(0.98); + } + to { + opacity: 1; + transform: translateY(0) scale(1); + } +} + +.sx-coach-bubble-popup::after { + content: ""; + position: absolute; + bottom: -6px; + right: 28px; + width: 12px; + height: 12px; + background: var(--bg-surface); + border-right: 1px solid color-mix(in srgb, var(--accent) 35%, var(--border-strong)); + border-bottom: 1px solid color-mix(in srgb, var(--accent) 35%, var(--border-strong)); + transform: rotate(45deg); + pointer-events: none; +} + +.sx-coach-bubble-popup__head { + padding: 8px 12px; + border-bottom: 1px solid var(--border-subtle); + display: flex; + align-items: center; + justify-content: space-between; + background: color-mix(in srgb, var(--accent) 8%, var(--bg-surface)); + flex: 0 0 auto; +} + +.sx-coach-bubble-popup__title { + display: flex; + align-items: center; + gap: 6px; + color: var(--accent-deep); + font-size: 13px; +} +.sx-coach-bubble-popup__title strong { + font-weight: 750; + letter-spacing: -0.01em; +} + +.sx-coach-bubble-popup__head-right { + display: flex; + align-items: center; + gap: 6px; +} + +.sx-coach-bubble-popup__quota { + font-size: 11px; + font-weight: 700; + padding: 2px 7px; + border-radius: 999px; + background: var(--accent-tint); + color: var(--accent-deep); +} +.sx-coach-bubble-popup__quota.is-empty { + background: color-mix(in srgb, var(--neutral-400) 15%, transparent); + color: var(--neutral-400); +} + +.sx-coach-bubble-popup__close { + display: inline-flex; + align-items: center; + justify-content: center; + width: 24px; + height: 24px; + border-radius: var(--radius-sm); + border: none; + background: transparent; + color: var(--text-muted); + cursor: pointer; + transition: all var(--dur-fast) var(--ease-out); +} +.sx-coach-bubble-popup__close:hover { + background: color-mix(in srgb, var(--accent) 15%, transparent); + color: var(--text-strong); +} + +.sx-coach-bubble-popup__body { + flex: 1 1 auto; + min-height: 100px; + max-height: 260px; + overflow-y: auto; + padding: 10px 12px; + display: flex; + flex-direction: column; + gap: 10px; + overscroll-behavior: contain; + scrollbar-width: thin; +} + +.sx-coach-msg { + display: flex; + gap: 8px; + align-items: flex-start; +} +.sx-coach-msg--learner { + align-self: flex-end; + max-width: 85%; + flex-direction: row-reverse; +} +.sx-coach-msg--learner .sx-coach-msg__content { + background: var(--accent-deep); + color: var(--text-on-accent); + border-radius: 12px 12px 2px 12px; + padding: 8px 12px; + font-size: 13px; + line-height: 1.45; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +.sx-coach-msg--coach, +.sx-coach-msg--welcome { + align-self: flex-start; + max-width: 95%; +} +.sx-coach-msg--coach .sx-coach-msg__content, +.sx-coach-msg--welcome .sx-coach-msg__content { + background: var(--bg-surface-2); + border: 1px solid var(--border-subtle); + border-radius: 12px 12px 12px 2px; + padding: 10px 12px; + font-size: 13px; + line-height: 1.45; + color: var(--text-strong); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.sx-coach-msg__avatar { + width: 24px; + height: 24px; + border-radius: 999px; + background: var(--accent-tint); + color: var(--accent-deep); + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + margin-top: 2px; +} +.sx-coach-msg__avatar.is-pulsing { + animation: sxCoachAvatarPulse 1.2s infinite ease-in-out; +} +@keyframes sxCoachAvatarPulse { + 0%, 100% { opacity: 0.6; transform: scale(0.95); } + 50% { opacity: 1; transform: scale(1.05); } +} + +.sx-coach-bubble-popup__chips { + display: flex; + flex-wrap: wrap; + gap: 6px; + margin-top: 8px; +} +.sx-coach-chip { + display: inline-flex; + align-items: center; + gap: 4px; + padding: 5px 9px; + border-radius: 999px; + background: var(--bg-surface); + border: 1px solid color-mix(in srgb, var(--accent) 30%, var(--border-strong)); + color: var(--text-strong); + font-size: 12px; + font-weight: 650; + cursor: pointer; + transition: all var(--dur-fast) var(--ease-out); + text-align: left; +} +.sx-coach-chip:hover:not(:disabled) { + background: var(--accent-tint); + border-color: var(--accent); + color: var(--accent-deep); + transform: translateY(-1px); +} + +.sx-coach-msg__suggestion { + display: flex; + flex-direction: column; + gap: 6px; +} +.sx-coach-msg__title { + font-size: 13.5px; + font-weight: 750; + color: var(--accent-deep); +} +.sx-coach-msg__desc { + margin: 0; + color: var(--text-strong); +} + +.sx-coach-msg__next-utterance { + margin-top: 4px; + padding: 8px 10px; + border-radius: var(--radius-sm); + background: color-mix(in srgb, var(--accent) 8%, var(--bg-surface)); + border-left: 3px solid var(--accent); + display: flex; + flex-direction: column; + gap: 6px; +} +.sx-coach-msg__next-label { + font-size: 10.5px; + font-weight: 750; + text-transform: uppercase; + color: var(--accent-deep); + letter-spacing: 0.03em; +} +.sx-coach-msg__next-utterance blockquote { + margin: 0; + padding: 0; + font-size: 13px; + font-weight: 600; + color: var(--text-strong); + line-height: 1.4; +} + +.sx-coach-msg__apply-btn { + align-self: flex-start; + display: inline-flex; + align-items: center; + gap: 4px; + padding: 4px 8px; + border-radius: 4px; + background: var(--accent-deep); + color: var(--text-on-accent); + border: none; + font-size: 11.5px; + font-weight: 700; + cursor: pointer; + transition: all var(--dur-fast) var(--ease-out); +} +.sx-coach-msg__apply-btn:hover { + background: var(--accent); + transform: translateY(-1px); +} + +.sx-coach-msg__rationale { + font-size: 11.5px; + color: var(--text-muted); + line-height: 1.35; + margin-top: 2px; +} + +.sx-coach-typing-indicator { + display: inline-flex; + gap: 4px; + align-items: center; + padding: 4px 0; +} +.sx-coach-typing-indicator span { + width: 6px; + height: 6px; + border-radius: 999px; + background: var(--accent); + animation: sxCoachTypingDot 1.2s infinite ease-in-out; +} +.sx-coach-typing-indicator span:nth-child(2) { + animation-delay: 0.2s; +} +.sx-coach-typing-indicator span:nth-child(3) { + animation-delay: 0.4s; +} +@keyframes sxCoachTypingDot { + 0%, 80%, 100% { transform: scale(0.6); opacity: 0.4; } + 40% { transform: scale(1.1); opacity: 1; } +} + +.sx-coach-bubble-popup__footer { + padding: 8px 12px; + border-top: 1px solid var(--border-subtle); + background: var(--bg-surface); + flex: 0 0 auto; +} + +.sx-coach-bubble-popup__exhausted { + font-size: 12px; + color: var(--text-muted); + text-align: center; + padding: 4px 0; +} + +.sx-coach-bubble-popup__composer { + display: flex; + gap: 6px; + align-items: center; +} +.sx-coach-bubble-popup__composer input { + flex: 1; + min-width: 0; + height: 36px; + padding: 0 12px; + border-radius: var(--radius-sm); + border: 1px solid var(--border-strong); + background: var(--bg-surface-2); + color: var(--text-strong); + font-size: 12.5px; + transition: all var(--dur-fast) var(--ease-out); +} +.sx-coach-bubble-popup__composer input:focus { + border-color: var(--accent); + outline: none; + box-shadow: 0 0 0 2px color-mix(in srgb, var(--accent) 25%, transparent); +} +.sx-coach-bubble-popup__composer button { + width: 36px; + height: 36px; + border-radius: var(--radius-sm); + border: none; + background: var(--accent-deep); + color: var(--text-on-accent); + display: inline-flex; + align-items: center; + justify-content: center; + cursor: pointer; + flex-shrink: 0; + transition: all var(--dur-fast) var(--ease-out); +} +.sx-coach-bubble-popup__composer button:hover:not(:disabled) { + background: var(--accent); +} +.sx-coach-bubble-popup__composer button:disabled { + background: var(--neutral-200); + color: var(--neutral-400); + cursor: not-allowed; +} + /* ── RIGHT: 라이브 신호 ── */ .sx-signal { min-height: 0; @@ -1701,7 +2290,7 @@ display: grid; place-items: center; padding: 20px; - background: rgba(25, 31, 37, 0.42); + background: color-mix(in srgb, var(--bg-app) 42%, transparent); backdrop-filter: blur(8px); } .sx-coach-history__panel { @@ -1712,7 +2301,7 @@ border-radius: 12px; border: 1px solid color-mix(in srgb, var(--accent-deep) 18%, var(--border)); background: var(--paper); - box-shadow: 0 24px 70px rgba(22, 28, 34, 0.28); + box-shadow: var(--shadow-island); overflow: hidden; } .sx-coach-history__head { @@ -1949,11 +2538,11 @@ } .sx-safety--ok { background: var(--accent-tint); - border-color: rgba(121, 200, 183, 0.2); + border-color: color-mix(in srgb, var(--accent) 20%, transparent); } .sx-safety--ok .sx-safety__ico, .sx-safety--ok .sx-safety__text { - color: #a6bcb4; + color: var(--accent-bright); } .sx-safety__head { display: flex; @@ -1969,7 +2558,7 @@ flex: none; padding: 3px 8px; border-radius: 999px; - background: rgba(237, 247, 244, 0.08); + background: color-mix(in srgb, var(--accent-tint) 8%, transparent); color: currentColor; font-size: 11px; font-weight: 750; @@ -2052,8 +2641,10 @@ min-width: 0; } .sx-page--active .sx-controlbar { - width: min(100%, 1460px); + width: 100%; + max-width: var(--session-max-w, 1480px); margin: 0 auto; + box-sizing: border-box; background: var(--glass-specular), var(--glass-surface-strong); border-color: var(--glass-border); box-shadow: var(--glass-edge-shadow), var(--glass-shadow); @@ -2122,7 +2713,10 @@ align-items: center; justify-content: center; color: var(--text-on-accent); - transition: background var(--dur-base) var(--ease-out); + transition: transform var(--dur-fast) var(--ease-spring), background var(--dur-base) var(--ease-out); +} +.sx-mic:active { + transform: scale(0.92); } .sx-mic:hover { background: var(--accent-deep); @@ -2359,7 +2953,7 @@ place-items: center; border-radius: 999px; background: var(--accent-deep); - color: #fff; + color: var(--text-on-accent); font: 800 10.5px/1 var(--font-num); font-variant-numeric: tabular-nums; box-shadow: 0 0 0 2px var(--accent-tint); @@ -2421,7 +3015,7 @@ display: grid; place-items: center; padding: var(--sp-4); - background: rgba(3, 9, 8, 0.58); + background: color-mix(in srgb, var(--bg-app) 58%, transparent); backdrop-filter: blur(8px); } .sx-coach-modal__panel { @@ -2429,11 +3023,11 @@ max-height: min(720px, calc(100vh - 32px)); display: grid; grid-template-rows: auto minmax(0, 1fr) auto; - border: 1px solid rgba(203, 227, 220, 0.16); + border: 1px solid color-mix(in srgb, var(--accent) 16%, transparent); border-radius: var(--radius-lg); - background: color-mix(in srgb, var(--bg-surface) 94%, #17201d); + background: color-mix(in srgb, var(--bg-surface) 94%, var(--bg-app)); color: var(--text-body); - box-shadow: 0 26px 70px rgba(0, 0, 0, 0.42); + box-shadow: var(--shadow-island); overflow: hidden; } .sx-coach-modal__head { @@ -2442,7 +3036,7 @@ gap: var(--sp-3); align-items: start; padding: var(--sp-5) var(--sp-5) var(--sp-3); - border-bottom: 1px solid rgba(203, 227, 220, 0.12); + border-bottom: 1px solid color-mix(in srgb, var(--accent) 12%, transparent); } .sx-coach-modal__avatar { width: 38px; @@ -2450,7 +3044,7 @@ border-radius: 50%; display: inline-grid; place-items: center; - background: #e8edf0; + background: var(--bg-surface-2); color: var(--text-strong); } .sx-coach-modal__avatar span { @@ -2499,7 +3093,7 @@ margin: 0; padding: 10px 12px; border-radius: var(--radius); - background: rgba(255, 255, 255, 0.06); + background: color-mix(in srgb, var(--text-strong) 6%, transparent); color: var(--text-strong); font-size: var(--fs-sm); line-height: 1.55; @@ -2517,7 +3111,7 @@ gap: 3px; padding: 9px 10px; border-radius: var(--radius); - background: rgba(255, 255, 255, 0.05); + background: color-mix(in srgb, var(--text-strong) 5%, transparent); } .sx-coach-source-list span { color: var(--text-strong); @@ -2533,14 +3127,14 @@ display: flex; justify-content: flex-end; padding: var(--sp-3) var(--sp-5) var(--sp-5); - border-top: 1px solid rgba(203, 227, 220, 0.12); + border-top: 1px solid color-mix(in srgb, var(--accent) 12%, transparent); } .sx-coach-modal__actions button { min-height: 40px; padding: 9px 13px; border-radius: var(--radius); - border: 1px solid rgba(203, 227, 220, 0.16); - background: rgba(255, 255, 255, 0.07); + border: 1px solid color-mix(in srgb, var(--accent) 16%, transparent); + background: color-mix(in srgb, var(--text-strong) 7%, transparent); color: var(--text-body); font-family: var(--font-sans); font-size: var(--fs-sm); @@ -2548,10 +3142,76 @@ cursor: pointer; } .sx-coach-modal__actions button:hover { - background: rgba(255, 255, 255, 0.11); + background: color-mix(in srgb, var(--text-strong) 11%, transparent); color: var(--text-strong); } +/* ── 단축키 도움말 모달 ── */ +.sx-shortcut-modal { + max-width: min(100%, 720px); +} +.sx-shortcut-modal__body { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 16px; + max-height: 60vh; + overflow-y: auto; + padding: 4px; +} +@media (max-width: 680px) { + .sx-shortcut-modal__body { + grid-template-columns: 1fr; + } +} +.sx-shortcut-group { + padding: 12px; + border-radius: var(--radius-sm); + background: color-mix(in srgb, var(--text-strong) 4%, transparent); + border: 1px solid var(--border-subtle); +} +.sx-shortcut-group h3 { + margin: 0 0 10px; + font-size: 13px; + font-weight: 700; + color: var(--accent-deep); + letter-spacing: -0.01em; +} +.sx-shortcut-list { + display: grid; + gap: 8px; + margin: 0; +} +.sx-shortcut-list div { + display: flex; + align-items: center; + justify-content: space-between; + gap: 8px; +} +.sx-shortcut-list dt { + display: inline-flex; + align-items: center; + gap: 3px; +} +.sx-shortcut-list kbd { + display: inline-block; + padding: 3px 6px; + font-family: var(--font-num, monospace); + font-size: 11px; + font-weight: 700; + line-height: 1; + color: var(--text-strong); + background: var(--bg-surface); + border: 1px solid var(--border-strong); + border-radius: 4px; + box-shadow: 0 1px 1px color-mix(in srgb, var(--text-strong) 12%, transparent); +} +.sx-shortcut-list dd { + margin: 0; + font-size: 12px; + color: var(--text-body); + text-align: right; +} + .sx-end-dialog { position: fixed; inset: 0; @@ -2559,7 +3219,7 @@ display: grid; place-items: center; padding: var(--sp-4); - background: rgba(3, 9, 8, 0.62); + background: color-mix(in srgb, var(--bg-app) 62%, transparent); backdrop-filter: blur(8px); } /* 패널도 다크 stage 잔재였다. 배경만 하드코딩 다크였고 글자는 테마 토큰이라 @@ -2571,7 +3231,7 @@ border: 1px solid var(--glass-border); border-radius: var(--radius-lg); background: var(--glass-specular), var(--bg-app); - box-shadow: 0 26px 70px rgba(0, 0, 0, 0.34); + box-shadow: var(--shadow-island); color: var(--text-body); } .sx-end-dialog__head { @@ -2774,7 +3434,7 @@ display: grid; place-items: center; padding: var(--sp-4); - background: rgba(5, 12, 10, 0.58); + background: color-mix(in srgb, var(--bg-app) 58%, transparent); backdrop-filter: blur(9px); } .sx-voice-consent__panel { @@ -3333,13 +3993,13 @@ font-size: 13px; font-weight: 600; letter-spacing: 0.04em; - color: #f4faf7; - border: 1px solid rgba(203, 227, 220, 0.14); + color: var(--text-strong); + border: 1px solid color-mix(in srgb, var(--accent) 14%, transparent); border-radius: calc(var(--radius-lg) - 2px); background: - linear-gradient(135deg, rgba(238, 244, 242, 0.08), rgba(151, 175, 166, 0.06)); + linear-gradient(135deg, color-mix(in srgb, var(--text-strong) 8%, transparent), color-mix(in srgb, var(--accent) 6%, transparent)); backdrop-filter: blur(0.5px); - text-shadow: 0 1px 2px rgba(7, 16, 14, 0.5); + text-shadow: 0 1px 2px color-mix(in srgb, var(--bg-app) 50%, transparent); } /* ── 반응형 ── */ @@ -4247,10 +4907,10 @@ display: block; max-width: min(220px, calc(100% - 12px)); padding: 3px 6px; - border: 1px solid rgba(151, 175, 166, 0.26); + border: 1px solid color-mix(in srgb, var(--accent) 26%, transparent); border-radius: 999px; - background: rgba(11, 24, 21, 0.9); - color: rgba(228, 250, 244, 0.9); + background: color-mix(in srgb, var(--bg-app) 90%, transparent); + color: color-mix(in srgb, var(--text-strong) 90%, transparent); font-size: 10px; line-height: 1.15; pointer-events: none; @@ -4632,28 +5292,28 @@ background: color-mix(in srgb, var(--crit-solid) 22%, transparent); } @keyframes sx-timebar-pulse { - 0% { box-shadow: 0 0 0 0 rgba(228, 179, 99, 0.45); } - 70% { box-shadow: 0 0 0 7px rgba(228, 179, 99, 0); } - 100% { box-shadow: 0 0 0 0 rgba(228, 179, 99, 0); } + 0% { box-shadow: 0 0 0 0 var(--warn-tint); } + 70% { box-shadow: 0 0 0 7px transparent; } + 100% { box-shadow: 0 0 0 0 transparent; } } /* ── 스테이지 타이머 경고 상태 ── */ .sx-page--active .sx-stage__timer.is-warning { - color: #e8bd7a; + color: var(--warn-solid); font-weight: 780; } /* ── 세션 진행 패널: 남은 시간 경고 + 목표 도달 노트 ── */ .sx-session-progress__grid span.is-warning b { - color: #e8bd7a; + color: var(--warn-solid); } .sx-session-progress__goalnote { margin: 8px 0 0; padding: 8px 10px; border-radius: var(--radius-sm); - border: 1px solid rgba(151, 175, 166, 0.32); - background: rgba(151, 175, 166, 0.1); - color: var(--text-body, rgba(238, 244, 242, 0.78)); + border: 1px solid color-mix(in srgb, var(--accent) 32%, transparent); + background: color-mix(in srgb, var(--accent) 10%, transparent); + color: var(--text-body); font-size: 12px; line-height: 1.5; } @@ -4663,25 +5323,25 @@ margin-left: 6px; padding: 1.5px 6px; border-radius: 999px; - border: 1px solid rgba(151, 175, 166, 0.4); - background: rgba(151, 175, 166, 0.12); - color: var(--accent-bright, #8fc0b4); + border: 1px solid color-mix(in srgb, var(--accent) 40%, transparent); + background: color-mix(in srgb, var(--accent) 12%, transparent); + color: var(--accent-bright); font-size: 10px; font-weight: 740; letter-spacing: 0.02em; vertical-align: 1px; } .sx-vstep__goal.is-reached { - border-color: rgba(151, 175, 166, 0.62); - background: rgba(151, 175, 166, 0.24); + border-color: color-mix(in srgb, var(--accent) 62%, transparent); + background: color-mix(in srgb, var(--accent) 24%, transparent); } .sx-ph__goal { margin-left: 4px; padding: 0.5px 5px; border-radius: 999px; - border: 1px solid rgba(151, 175, 166, 0.42); - background: rgba(151, 175, 166, 0.12); - color: var(--accent-bright, #8fc0b4); + border: 1px solid color-mix(in srgb, var(--accent) 42%, transparent); + background: color-mix(in srgb, var(--accent) 12%, transparent); + color: var(--accent-bright); font-size: 9.5px; font-style: normal; font-weight: 740; @@ -4713,7 +5373,7 @@ font-size: 12px; font-weight: 640; cursor: pointer; - box-shadow: 0 8px 22px rgba(0, 0, 0, 0.35); + box-shadow: 0 8px 22px var(--shadow-island); z-index: 30; } .sx-coach-nudge::after { @@ -4771,17 +5431,17 @@ font-size: 10.5px; font-weight: 740; font-variant-numeric: tabular-nums; - color: var(--text-dim, rgba(238, 244, 242, 0.55)); + color: var(--text-dim, color-mix(in srgb, var(--text-strong) 55%, transparent)); min-width: 20px; text-align: right; } .sx-track__note { margin-top: 10px; padding-top: 8px; - border-top: 1px dashed rgba(255, 255, 255, 0.08); + border-top: 1px dashed color-mix(in srgb, var(--text-strong) 8%, transparent); font-size: 11px; line-height: 1.5; - color: var(--text-dim, rgba(238, 244, 242, 0.5)); + color: var(--text-dim, color-mix(in srgb, var(--text-strong) 50%, transparent)); } /* ── 패널 컬랩싱 토글(과밀 완화, 2026-07-14) ── */ @@ -4807,7 +5467,7 @@ flex: 0 0 auto; font-size: 10.5px; font-weight: 680; - color: var(--text-muted, rgba(238, 244, 242, 0.5)); + color: var(--text-muted, color-mix(in srgb, var(--text-strong) 50%, transparent)); white-space: nowrap; } .sx-panel-toggle:hover .sx-panel-toggle__hint { @@ -5080,865 +5740,7 @@ @media (min-width: 1280px) { .sx-page--active { - grid-template-rows: 80px minmax(0, 1fr) 116px; - gap: 12px; - padding: 14px 34px 30px; - background: - radial-gradient(circle at 51% 14%, rgba(255, 255, 255, 0.82), transparent 31%), - radial-gradient(circle at 8% 94%, color-mix(in srgb, var(--accent) 8%, transparent), transparent 25%), - #f8f7f3; - overflow: hidden; - } - [data-theme="dark"] .sx-page--active { - background: - radial-gradient(circle at 51% 14%, rgba(255, 255, 255, 0.035), transparent 31%), - radial-gradient(circle at 8% 94%, color-mix(in srgb, var(--accent) 9%, transparent), transparent 25%), - var(--glass-canvas); - } - - .sx-page--active .sx-sessionbar { - width: min(100%, 1408px); - height: 80px; - margin: 0 auto; - padding: 0 25px; - border-color: rgba(159, 142, 111, 0.2); - border-radius: 12px; - background: rgba(255, 255, 255, 0.62); - box-shadow: 0 12px 34px rgba(72, 62, 44, 0.055); - backdrop-filter: blur(18px); - } - [data-theme="dark"] .sx-page--active .sx-sessionbar { - border-color: var(--glass-border); - background: var(--glass-specular), var(--glass-surface-strong); - box-shadow: var(--glass-edge-shadow), var(--glass-shadow); - } - .sx-page--active .sx-sessionbar button { - min-height: 44px; /* 데스크톱에서도 44px 터치 계약 유지(WCAG 2.5.5) */ - padding: 0 16px; - border-color: rgba(159, 142, 111, 0.23); - border-radius: 14px; - background: rgba(255, 255, 255, 0.42); - color: #202521; - font-size: 15px; - } - [data-theme="dark"] .sx-page--active .sx-sessionbar button { - border-color: var(--glass-inset-border); - background: var(--glass-specular-inset), var(--glass-surface-inset); - color: var(--text-strong); - } - .sx-page--active .sx-sessionbar__meta { - gap: 3px; - } - .sx-page--active .sx-sessionbar__meta b { - color: #161b18; - font-size: 20px; - letter-spacing: -0.035em; - } - .sx-page--active .sx-sessionbar__meta small { - justify-content: center; - color: #6b706b; - font-size: 14px; - } - [data-theme="dark"] .sx-page--active .sx-sessionbar__meta b { - color: var(--text-strong); - } - [data-theme="dark"] .sx-page--active .sx-sessionbar__meta small { - color: var(--text-muted); - } - .sx-page--active .sx-sessionbar__dot { - width: 11px; - height: 11px; - box-shadow: 0 0 0 4px rgba(48, 148, 93, 0.13); - } - - .sx-page--active .sx-grid { - width: min(100%, 1408px); - margin: 0 auto; - grid-template-columns: 326px minmax(500px, 1fr) 357px; - gap: 12px; - } - .sx-page--active .sx-col { - gap: 12px; - } - .sx-page--active .sx-col-left, - .sx-page--active .sx-col-right { - gap: 0; - padding: 20px 22px; - border: 1px solid rgba(159, 142, 111, 0.2); - border-radius: 12px; - background: rgba(255, 255, 255, 0.58); - box-shadow: 0 12px 32px rgba(72, 62, 44, 0.045); - backdrop-filter: blur(16px); - overflow: auto; - scrollbar-width: thin; - } - [data-theme="dark"] .sx-page--active .sx-col-left, - [data-theme="dark"] .sx-page--active .sx-col-right { - border-color: var(--glass-border); - background: var(--glass-specular), var(--glass-surface); - box-shadow: var(--glass-edge-shadow), var(--glass-shadow); - } - .sx-page--active .sx-col-left > .sx-panel, - .sx-page--active .sx-col-right > .sx-panel { - width: 100%; - border: 0; - border-radius: 0; - background: transparent; - box-shadow: none; - backdrop-filter: none; - } - - .sx-page--active .sx-ctx { - order: 1; - flex: 0 0 auto; - padding: 0 0 18px; - overflow: visible; - border-bottom: 1px solid rgba(159, 142, 111, 0.2); - } - .sx-page--active .sx-ctx__head { - min-height: 24px; - margin: 0; - } - .sx-page--active .sx-ctx .sx-panel-toggle__hint { - display: none; - } - .sx-page--active .sx-track { - order: 2; - flex: 1 0 auto; - display: flex; - flex-direction: column; - padding: 18px 0 20px; - overflow: visible; - border-bottom: 1px solid rgba(159, 142, 111, 0.2); - } - .sx-page--active .sx-track > .sx-vstep { - flex: 1 1 0; - min-height: 62px; - } - .sx-page--active .sx-track__head { - margin-bottom: 16px; - } - .sx-page--active .sx-vstep { - grid-template-columns: 18px minmax(0, 1fr); - column-gap: 12px; - } - .sx-page--active .sx-vstep__node { - width: 17px; - height: 17px; - background: #fbfaf7; - border-color: #d9d2c4; - } - .sx-page--active .sx-vstep.is-cur .sx-vstep__node { - border-color: #2f806b; - box-shadow: 0 0 0 4px rgba(47, 128, 107, 0.12); - } - .sx-page--active .sx-vstep.is-cur .sx-vstep__node::after { - inset: 3px; - background: #2f806b; - } - .sx-page--active .sx-vstep__line { - width: 1px; - min-height: 31px; - background: #d8d0c2; - } - .sx-page--active .sx-vstep__body { - padding-bottom: 18px; - } - .sx-page--active .sx-vstep__label { - color: #1e2420; - font-size: 15px; - font-weight: 720; - } - .sx-page--active .sx-vstep__t { - color: #737871; - font-size: 12px; - } - .sx-page--active .sx-vstep.is-cur .sx-vstep__t { - color: #2b8069; - } - .sx-page--active .sx-vstep__desc { - margin-top: 5px; - color: #676b66; - font-size: 13px; - line-height: 1.45; - } - .sx-page--active .sx-vstep__goal { - margin-right: auto; - margin-left: 8px; - border: 0; - background: #e7f0e9; - color: #2a7563; - font-size: 11px; - } - [data-theme="dark"] .sx-page--active .sx-vstep__node { - background: var(--bg-surface); - border-color: var(--border-strong); - } - [data-theme="dark"] .sx-page--active .sx-vstep__label, - [data-theme="dark"] .sx-page--active .sx-vstep.is-cur .sx-vstep__label { - color: var(--text-strong); - } - [data-theme="dark"] .sx-page--active .sx-vstep__desc, - [data-theme="dark"] .sx-page--active .sx-vstep__t { - color: var(--text-muted); - } - - .sx-page--active .sx-session-progress { - order: 3; - flex: 0 0 270px; - padding: 17px 0 0; - overflow: visible; - } - .sx-page--active .sx-session-progress__head { - margin-bottom: 10px; - } - .sx-page--active .sx-session-progress__grid { - gap: 0; - } - .sx-page--active .sx-session-progress__grid span { - grid-template-columns: minmax(0, 1fr) auto; - padding: 11px 0; - border-color: rgba(159, 142, 111, 0.16); - } - .sx-page--active .sx-session-progress__grid small { - grid-column: 1; - grid-row: 1; - display: inline-flex; - align-items: center; - gap: 12px; - color: #686d68; - font-size: 13px; - text-align: left; - } - .sx-page--active .sx-session-progress__grid small svg { - color: #287967; - } - .sx-page--active .sx-session-progress__grid b { - grid-column: 2; - grid-row: 1; - color: #161b18; - font-size: 15px; - } - [data-theme="dark"] .sx-page--active .sx-session-progress__grid small { - color: var(--text-muted); - } - [data-theme="dark"] .sx-page--active .sx-session-progress__grid b { - color: var(--text-strong); - } - - .sx-page--active .sx-col-center { - grid-template-rows: 360px minmax(0, 1fr); - gap: 12px; - } - .sx-page--active .sx-stage, - .sx-page--active .sx-transcript { - border-color: rgba(159, 142, 111, 0.2); - border-radius: 12px; - background: rgba(255, 255, 255, 0.6); - box-shadow: 0 12px 32px rgba(72, 62, 44, 0.045); - backdrop-filter: blur(16px); - } - [data-theme="dark"] .sx-page--active .sx-stage, - [data-theme="dark"] .sx-page--active .sx-transcript { - border-color: var(--glass-border); - background: var(--glass-specular), var(--glass-surface); - box-shadow: var(--glass-edge-shadow), var(--glass-shadow); - } - .sx-page--active .sx-stage { - grid-template-columns: minmax(245px, 0.92fr) minmax(280px, 1.08fr); - grid-template-rows: minmax(0, 1fr) 62px; - column-gap: 28px; - padding: 20px 28px 14px; - } - .sx-page--active .sx-stage::before { - inset: 12px; - border-color: rgba(159, 142, 111, 0.13); - border-radius: 10px; - } - .sx-page--active .sx-stage__top { - display: none; - } - .sx-page--active .sx-orb-wrap { - grid-column: 1; - grid-row: 1; - place-self: end center; - width: 238px; - height: 238px; - z-index: 1; - } - .sx-page--active .sx-orb-wrap::before { - content: ""; - position: absolute; - z-index: -1; - left: -86px; - bottom: -20px; - width: 190px; - height: 248px; - background: url("/session-botanical/leaf-1.webp") center / contain no-repeat; - opacity: 0.72; - transform: rotate(-11deg); - pointer-events: none; - } - .sx-page--active .sx-orb { - inset: -3px; - border-radius: 50% 50% 46% 54% / 46% 48% 52% 54%; - background: radial-gradient(circle at 50% 42%, #f4f6ee 0%, #e6ede2 68%, #dce6db 100%); - box-shadow: inset 0 0 36px rgba(97, 122, 99, 0.08); - } - [data-theme="dark"] .sx-page--active .sx-orb { - background: radial-gradient(circle at 50% 42%, rgba(139, 166, 150, 0.24), rgba(34, 50, 44, 0.54)); - } - .sx-page--active .sx-stage .vg-avatar, - .sx-page--active .sx-stage .vg-avatar__svg { - width: 232px !important; - height: 232px !important; - } - .sx-page--active .sx-stage .vg-avatar__stage { - height: 232px !important; - } - .sx-page--active .sx-stage__client { - grid-column: 2; - grid-row: 1; - align-self: center; - gap: 13px; - } - .sx-page--active .sx-stage__client-kicker { - color: #131915; - font-size: 34px; - font-weight: 820; - letter-spacing: -0.055em; - } - .sx-page--active .sx-stage__client p { - max-width: 33ch; - color: #262b27; - font-size: 16px; - font-weight: 560; - line-height: 1.55; - } - [data-theme="dark"] .sx-page--active .sx-stage__client-kicker, - [data-theme="dark"] .sx-page--active .sx-stage__client p { - color: var(--text-strong); - } - .sx-page--active .sx-stage__now { - grid-column: 1 / -1; - grid-row: 2; - place-self: stretch; - width: auto; - max-width: none; - min-height: 50px; - padding: 0 18px; - border-color: rgba(159, 142, 111, 0.18); - border-radius: 11px; - background: rgba(255, 255, 255, 0.45); - color: #222824; - font-size: 15px; - } - .sx-page--active .sx-stage__now > svg { - flex: none; - color: #987b4c; - } - .sx-page--active .sx-stage__now small { - padding: 4px 10px; - border-radius: 999px; - background: #e5efe7; - color: #29705f; - } - [data-theme="dark"] .sx-page--active .sx-stage__now { - border-color: var(--glass-inset-border); - background: var(--glass-specular-inset), var(--glass-surface-inset); - color: var(--text-strong); - } - - .sx-page--active .sx-transcript { - padding: 19px 18px 13px; - } - .sx-page--active .sx-transcript__head { - margin-bottom: 12px; - } - .sx-page--active .sx-transcript__scroll { - padding: 0; - } - .sx-page--active .sx-transcript__empty { - padding: 13px 2px; - } - .sx-page--active .sx-transcript__empty b { - color: #202622; - font-size: 16px; - } - .sx-page--active .sx-transcript__empty span { - margin-top: 8px; - color: #7a7d79; - font-size: 13px; - } - [data-theme="dark"] .sx-page--active .sx-transcript__empty b { - color: var(--text-strong); - } - [data-theme="dark"] .sx-page--active .sx-transcript__empty span { - color: var(--text-muted); - } - .sx-page--active .sx-compose { + padding: 14px clamp(20px, 2.5vw, 40px) 20px; gap: 14px; - margin-top: 12px; - padding-top: 12px; - border-color: rgba(159, 142, 111, 0.16); - } - .sx-page--active .sx-compose textarea { - min-height: 56px; - padding: 16px 18px; - border-color: rgba(159, 142, 111, 0.24); - border-radius: 12px; - background: rgba(255, 255, 255, 0.54); - color: #262b27; - font-size: 14px; - } - .sx-page--active .sx-compose .vg-btn { - min-width: 134px; - min-height: 56px; - border-radius: 12px; - /* 하드코딩 청록 그라디언트(#3d947d→#267762)는 다크 테마의 - --text-on-accent(#0f1a17)와 3.3:1로 4.5:1 미달 — 테마 토큰으로 교체. */ - background: linear-gradient(145deg, var(--accent), var(--accent-deep)); - box-shadow: 0 8px 18px rgba(43, 119, 97, 0.2); - font-size: 15px; - } - .sx-page--active .sx-compose .vg-btn:disabled { - background: linear-gradient(145deg, #4b9d88, #2d806a); - color: #fff; - opacity: 0.82; - } - - .sx-page--active .sx-col-right { - padding-inline: 20px; - } - .sx-page--active .sx-signal { - order: 1; - flex: 0 0 auto; - padding: 0 0 18px; - overflow: visible; - border-bottom: 1px solid rgba(159, 142, 111, 0.2); - } - .sx-page--active .sx-signal__head { - margin-bottom: 16px; - } - .sx-page--active .sx-coach-card { - grid-template-columns: 58px minmax(0, 1fr); - gap: 11px 13px; - margin: 0; - } - .sx-page--active .sx-coach-avatar { - width: 58px; - height: 58px; - background: #f6f5ef; - border-color: #d7dfd5; - box-shadow: none; - } - .sx-page--active .sx-coach-avatar__lens { - inset: 8px; - background: rgba(255, 255, 255, 0.64); - } - .sx-page--active .sx-coach-avatar__face { - left: 15px; - right: 15px; - top: 21px; - } - .sx-page--active .sx-coach-summary { - gap: 10px; - } - .sx-page--active .sx-coach-bubble__meta { - padding-bottom: 8px; - border-bottom: 1px solid rgba(159, 142, 111, 0.16); - } - .sx-page--active .sx-coach-bubble__meta b { - color: #171d19; - font-size: 17px; - } - .sx-page--active .sx-coach-bubble__meta span { - color: #666b66; - font-size: 12px; - } - .sx-page--active .sx-coach-quota { - min-height: 25px; - padding: 0; - border: 0; - background: transparent; - } - .sx-page--active .sx-coach-quota > span:first-child { - color: #666b66; - font-size: 12px; - } - .sx-page--active .sx-coach-quota b { - color: #1d6f5d; - font-size: 14px; - } - .sx-page--active .sx-coach-quota__dots i { - width: 10px; - height: 10px; - } - .sx-page--active .sx-coach-bubble { - gap: 7px; - padding: 13px 14px; - border: 1px solid #d8e1d9; - border-radius: 9px; - background: rgba(239, 245, 239, 0.72); - color: #2a302b; - box-shadow: none; - } - .sx-page--active .sx-coach-bubble::after { - content: "코칭 포인트"; - order: -1; - color: #296f5e; - font-size: 12px; - font-weight: 760; - } - .sx-page--active .sx-coach-bubble::before { - display: none; - } - .sx-page--active .sx-coach-bubble p { - color: #444a45; - font-size: 13px; - line-height: 1.65; - } - [data-theme="dark"] .sx-page--active .sx-coach-bubble__meta b, - [data-theme="dark"] .sx-page--active .sx-coach-bubble p { - color: var(--text-strong); - } - [data-theme="dark"] .sx-page--active .sx-coach-bubble { - border-color: var(--glass-inset-border); - background: var(--glass-specular-inset), var(--glass-surface-inset); - } - .sx-page--active .sx-signal__status { - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 12px; - margin-top: 16px; - } - .sx-page--active .sx-signal__status span { - min-height: 61px; - grid-template-columns: auto minmax(0, 1fr); - grid-template-rows: auto auto; - place-content: center; - column-gap: 9px; - row-gap: 2px; - padding: 10px 12px; - border-color: rgba(159, 142, 111, 0.22); - border-radius: 11px; - background: rgba(255, 255, 255, 0.42); - text-align: left; - } - .sx-page--active .sx-signal__status span > svg { - grid-column: 1; - grid-row: 1 / span 2; - align-self: center; - color: #1f7c65; - } - .sx-page--active .sx-signal__status b { - grid-column: 2; - grid-row: 1; - color: #565b56; - font-size: 13px; - } - .sx-page--active .sx-signal__status small { - grid-column: 2; - grid-row: 2; - color: #1f7c65; - font-size: 13px; - } - .sx-page--active .sx-signal__one, - .sx-page--active .sx-signal__seq { - margin-top: 11px; - } - .sx-page--active.sx-feedback-ambient .sx-signal__defer, - .sx-page--active.sx-feedback-coached .sx-signal__defer { - display: none; - } - .sx-page--active .sx-meters { - order: 2; - flex: 1 0 auto; - padding: 17px 0 14px; - overflow: visible; - border-bottom: 1px solid rgba(159, 142, 111, 0.2); - } - .sx-page--active .sx-meter { - padding: 10px 0; - } - .sx-page--active .sx-meter__label { - color: #595e59; - font-size: 13px; - } - .sx-page--active .sx-meter__val { - font-size: 13px; - } - .sx-page--active .sx-meters__note { - color: #828681; - font-size: 10.5px; - line-height: 1.55; - } - .sx-page--active .sx-safety { - order: 3; - flex: 0 0 auto; - padding: 14px 0 0; - } - .sx-page--active .sx-safety__head { - min-height: 28px; - } - .sx-page--active .sx-safety__badge { - color: #4c524d; - } - [data-theme="dark"] .sx-page--active .sx-meter__label, - [data-theme="dark"] .sx-page--active .sx-safety__badge { - color: var(--text-body); - } - - .sx-page--active .sx-controlbar { - width: min(100%, 1468px); - height: 116px; - margin: 0 auto; - padding: 18px 26px; - border-color: rgba(159, 142, 111, 0.2); - border-radius: 12px; - background: rgba(255, 255, 255, 0.64); - box-shadow: 0 12px 34px rgba(72, 62, 44, 0.055); - backdrop-filter: blur(18px); - } - [data-theme="dark"] .sx-page--active .sx-controlbar { - border-color: var(--glass-border); - background: var(--glass-specular), var(--glass-surface-strong); - box-shadow: var(--glass-edge-shadow), var(--glass-shadow); - } - .sx-page--active .sx-mic { - width: 70px; - height: 70px; - border-color: rgba(159, 142, 111, 0.24); - background: rgba(255, 255, 255, 0.5); - } - [data-theme="light"] .sx-page--active .sx-mic.is-off { - border-color: #7a857c; - background: #eef1ed; - color: #245f50; - box-shadow: - inset 0 1px 0 rgba(255, 255, 255, 0.92), - 0 5px 15px rgba(45, 67, 57, 0.1); - } - [data-theme="light"] .sx-page--active .sx-mic.is-off:hover { - border-color: #557064; - background: #e3e9e4; - color: #164f42; - } - [data-theme="light"] .sx-page--active .sx-mic.is-on { - border-color: #176b56; - background: #176b56; - color: #f5fff9; - box-shadow: 0 7px 20px rgba(23, 107, 86, 0.24); - } - .sx-page--active .sx-mic-block__l { - color: #181e1a; - font-size: 16px; - } - .sx-page--active .sx-mic-block__h { - color: #767a76; - font-size: 12px; - } - .sx-page--active .sx-cb-sep { - height: 72px; - background: rgba(159, 142, 111, 0.2); - } - .sx-page--active .sx-segmented { - padding: 4px; - border-color: rgba(159, 142, 111, 0.18); - border-radius: 11px; - background: rgba(245, 244, 239, 0.9); - } - .sx-page--active .sx-segmented button { - min-height: 42px; - padding-inline: 16px; - color: #5f645f; - font-size: 13px; - } - .sx-page--active .sx-segmented button.is-on { - border-radius: 8px; - background: rgba(255, 255, 255, 0.96); - color: #237460; - box-shadow: 0 3px 11px rgba(72, 62, 44, 0.1); - } - .sx-page--active .sx-pause, - .sx-page--active .sx-end-button { - min-height: 60px; - border-radius: 12px; - font-size: 14px; - } - .sx-page--active .sx-pause { - min-width: 138px; - border-color: rgba(159, 142, 111, 0.22); - background: rgba(255, 255, 255, 0.48); - color: #232824; - } - .sx-page--active .sx-end-button { - min-width: 150px; - border-color: #eb8c84; - background: rgba(255, 255, 255, 0.42); - color: #d8342b; - } - [data-theme="dark"] .sx-page--active .sx-mic-block__l, - [data-theme="dark"] .sx-page--active .sx-pause { - color: var(--text-strong); - } -} - -/* 1366×640/768 검증 lane: 같은 위계를 유지하되 높이만 광학적으로 압축한다. */ -@media (min-width: 1280px) and (max-height: 820px) { - .sx-page--active { - grid-template-rows: 52px minmax(0, 1fr) 82px; - gap: 8px; - padding: 8px 18px 10px; - } - .sx-page--active .sx-sessionbar { - width: min(100%, 1320px); - height: 52px; - padding-inline: 14px; - } - .sx-page--active .sx-sessionbar button { - min-height: 36px; - padding-inline: 12px; - } - .sx-page--active .sx-sessionbar__meta b { - font-size: 16px; - } - .sx-page--active .sx-grid { - width: min(100%, 1320px); - grid-template-columns: 276px minmax(470px, 1fr) 310px; - gap: 8px; - } - .sx-page--active .sx-col-left, - .sx-page--active .sx-col-right { - padding: 11px 14px; - } - .sx-page--active .sx-ctx { - padding-bottom: 9px; - } - .sx-page--active .sx-track { - padding: 9px 0; - } - .sx-page--active .sx-track__head, - .sx-page--active .sx-session-progress__head, - .sx-page--active .sx-signal__head { - margin-bottom: 7px; - } - .sx-page--active .sx-vstep__body { - padding-bottom: 7px; - } - .sx-page--active .sx-track > .sx-vstep { - min-height: 34px; - } - .sx-page--active .sx-vstep__desc, - .sx-page--active .sx-track__note { - display: none; - } - .sx-page--active .sx-session-progress { - flex-basis: 142px; - padding-top: 8px; - } - .sx-page--active .sx-session-progress__grid span { - padding: 6px 0; - } - .sx-page--active .sx-col-center { - grid-template-rows: minmax(182px, 0.46fr) minmax(0, 1fr); - gap: 8px; - } - .sx-page--active .sx-stage { - grid-template-columns: minmax(176px, 0.8fr) minmax(250px, 1.2fr); - grid-template-rows: minmax(0, 1fr) 43px; - padding: 10px 18px 8px; - } - .sx-page--active .sx-orb-wrap { - width: 158px; - height: 158px; - } - .sx-page--active .sx-orb-wrap::before { - left: -56px; - bottom: -15px; - width: 122px; - height: 165px; - } - .sx-page--active .sx-stage .vg-avatar, - .sx-page--active .sx-stage .vg-avatar__svg { - width: 154px !important; - height: 154px !important; - } - .sx-page--active .sx-stage .vg-avatar__stage { - height: 154px !important; - } - .sx-page--active .sx-stage__client-kicker { - font-size: 25px; - } - .sx-page--active .sx-stage__client p { - font-size: 13px; - } - .sx-page--active .sx-stage__now { - min-height: 38px; - padding-inline: 10px; - font-size: 12px; - } - .sx-page--active .sx-transcript { - padding: 10px 12px 8px; - } - .sx-page--active .sx-compose { - gap: 8px; - margin-top: 7px; - padding-top: 7px; - } - .sx-page--active .sx-compose textarea, - .sx-page--active .sx-compose .vg-btn { - min-height: 40px; - } - .sx-page--active .sx-signal { - padding-bottom: 8px; - } - .sx-page--active .sx-coach-card { - grid-template-columns: 42px minmax(0, 1fr); - gap: 6px 9px; - } - .sx-page--active .sx-coach-avatar { - width: 42px; - height: 42px; - } - .sx-page--active .sx-coach-bubble { - padding: 8px 9px; - } - .sx-page--active .sx-coach-bubble blockquote, - .sx-page--active .sx-signal__seq, - .sx-page--active .sx-meters__note { - display: none; - } - .sx-page--active .sx-signal__status { - gap: 7px; - margin-top: 7px; - } - .sx-page--active .sx-signal__status span { - min-height: 42px; - padding: 5px 7px; - } - .sx-page--active .sx-meters { - padding: 8px 0 6px; - } - .sx-page--active .sx-meter { - padding: 5px 0; - } - .sx-page--active .sx-safety { - padding-top: 7px; - } - .sx-page--active .sx-controlbar { - width: min(100%, 1330px); - height: 82px; - padding: 10px 16px; - } - .sx-page--active .sx-mic { - width: 52px; - height: 52px; - } - .sx-page--active .sx-cb-sep { - height: 52px; - } - .sx-page--active .sx-pause, - .sx-page--active .sx-end-button { - min-height: 48px; } } diff --git a/apps/web/src/pages/settings/settings.css b/apps/web/src/pages/settings/settings.css index 7d9595b..5a4c288 100644 --- a/apps/web/src/pages/settings/settings.css +++ b/apps/web/src/pages/settings/settings.css @@ -47,9 +47,13 @@ padding: 10px 12px; border-radius: var(--radius); cursor: pointer; - transition: background var(--dur-fast) var(--ease-out), + transition: transform var(--dur-fast) var(--ease-spring), + background var(--dur-fast) var(--ease-out), color var(--dur-fast) var(--ease-out); } +.vg-set__nav-item:active { + transform: scale(0.96); +} .vg-set__nav-item:hover { background: var(--bg-surface-2); color: var(--text-strong); diff --git a/apps/web/src/pages/supervision-research.css b/apps/web/src/pages/supervision-research.css index 964ee3e..b134647 100644 --- a/apps/web/src/pages/supervision-research.css +++ b/apps/web/src/pages/supervision-research.css @@ -87,6 +87,11 @@ background: transparent; font: 650 var(--fs-sm) / 1 var(--font-sans); cursor: pointer; + transition: transform var(--dur-fast) var(--ease-spring), color var(--dur-fast) var(--ease-out), background var(--dur-fast) var(--ease-out); +} + +.g6-lenses button:active { + transform: scale(0.96); } .g6-lenses button:hover { diff --git a/apps/web/src/styles/global.css b/apps/web/src/styles/global.css index 3e74f43..d8bfc1a 100644 --- a/apps/web/src/styles/global.css +++ b/apps/web/src/styles/global.css @@ -15,6 +15,9 @@ html, body, #root { height: 100%; + width: 100%; + max-width: 100vw; + overflow-x: hidden; } body { @@ -23,9 +26,10 @@ body { color: var(--text-strong); font-size: var(--fs-body); line-height: 1.6; - letter-spacing: 0; + letter-spacing: -0.01em; -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; + overscroll-behavior-y: contain; /* 한국어 조판: 기본값(normal)은 한글을 음절 단위로 끊어 "오전"이 "오/전", "검토 대기"가 "검/토 대기"로 쪼개진다. 어절 단위로 끊고, 끊을 수 없는 긴 토큰(URL·ID)만 강제 줄바꿈한다. 세션 화면이 쓰던 규칙을 전역으로 올렸다. */ @@ -37,9 +41,11 @@ body { a { color: var(--accent-deep); text-decoration: none; + transition: color var(--dur-fast) var(--ease-out); } a:hover { text-decoration: underline; + color: var(--accent); } button { @@ -61,13 +67,13 @@ svg { display: block; } -/* 포커스 — 키보드 사용자만 ring (마우스 클릭엔 없음) */ +/* 포커스 — 키보드 사용자만 고대비 ring (마우스 클릭엔 없음) */ :focus { outline: none; } :focus-visible { - outline: none; - box-shadow: 0 0 0 3px var(--focus-ring); + outline: 3px solid var(--focus-ring); + outline-offset: 2px; border-radius: var(--radius-sm); } diff --git a/apps/web/src/styles/tokens.css b/apps/web/src/styles/tokens.css index 3f2662b..878da17 100644 --- a/apps/web/src/styles/tokens.css +++ b/apps/web/src/styles/tokens.css @@ -149,8 +149,14 @@ --radius-lg: 12px; /* 패널 */ --gutter: 24px; + --bottom-bar-h: 60px; + --radius-xl: 16px; + --radius-pill: 9999px; + --shadow-sm: 0 1px 2px rgba(28, 42, 42, 0.05); --shadow-md: 0 4px 14px rgba(28, 42, 42, 0.07); /* 모달·팝오버만 */ + --shadow-island: 0 8px 24px rgba(28, 42, 42, 0.08), 0 2px 6px rgba(28, 42, 42, 0.04); + --shadow-float: 0 14px 36px rgba(28, 42, 42, 0.12), 0 3px 10px rgba(28, 42, 42, 0.06); /* ── 래스터 디자인 요소 ── */ --asset-warm-elements: url("/design-elements/clinical-paper-ambient.png"); @@ -162,6 +168,7 @@ /* ── 모션 §3.9 ── */ --ease-out: cubic-bezier(0.22, 0.61, 0.36, 1); --ease-in-out: cubic-bezier(0.45, 0.05, 0.55, 0.95); + --ease-spring: cubic-bezier(0.32, 0.72, 0, 1); --dur-fast: 120ms; /* hover·포커스 */ --dur-base: 200ms; /* 버튼·토글·드롭다운 */ --dur-slow: 320ms; /* 패널 전환·모달 */ diff --git a/apps/web/test-results/g7-voice-consent-desktop.png b/apps/web/test-results/g7-voice-consent-desktop.png new file mode 100644 index 0000000..a5b278a Binary files /dev/null and b/apps/web/test-results/g7-voice-consent-desktop.png differ diff --git a/apps/web/test-results/g7-voice-consent-mobile.png b/apps/web/test-results/g7-voice-consent-mobile.png new file mode 100644 index 0000000..eb7dc38 Binary files /dev/null and b/apps/web/test-results/g7-voice-consent-mobile.png differ