feat(my-deepagent): v0.3 PR #8 — conversation-centric Web GUI (/conversation.html)
Workflow run 페이지를 archive 로 격하시키고, 사용자가 처음 보는 화면을
chat-style 대화 thread 로 전환. Claude Code 의 Web GUI 와 동일한 UX.
핵심 동작:
- 새 페이지 `/conversation.html` 에서 세션을 picker 로 고르거나 "새 대화"
버튼으로 만들고 메시지 입력. Cmd/Ctrl+Enter 로 전송.
- POST /api/sessions/{id}/messages 가 user MessageRow 를 영속한 즉시 200 응답
후 `asyncio.create_task(invoke_session_agent(...))` 로 백그라운드 invoke 발사.
- 백그라운드 task 는 lifespan 에서 1회 열어둔 LangGraph saver 를 재사용하고
agent.ainvoke → assistant MessageRow 영속 → 자동 compaction 까지 처리.
- 기존 SSE 스트림 (`/api/sessions/{id}/stream`) 이 새 메시지를 push,
프론트엔드의 `EventSource` 가 받아 thread 에 렌더.
신규 / 수정 파일:
- `static/conversation.html` (신규): chat UI 마크업. data-page="conversation".
- `static/app.js`: 새 페이지 핸들러 `bootstrapConversationPage` +
세션 picker + 메시지 thread 렌더 + SSE 구독 + Cmd/Ctrl+Enter 단축키.
XSS 정책 동일: 모든 사용자 콘텐츠는 `textContent` 만 사용.
- `static/style.css`: `.messages-thread`, `.msg-bubble`, `.conv-topbar`,
`.conv-input-bar` 등 chat UI 스타일.
- `api/app.py`: lifespan 에서 LangGraph saver 를 1회 열어 `app.state.saver`
에 보관 (Postgres 일 때만).
- `api/agent_runner.py` (신규): `invoke_session_agent(...)` — REPL 의
`InteractiveSession + _invoke_and_stream` 와 동일한 stack 을 HTTP background
context 용으로 재구성. 실패는 로깅 + return.
- `api/routes/sessions.py`: POST /messages 가 background task 발사 + ref 를
`app.state.pending_invocations` set 에 보관 (RUF006 / GC drop 방지).
테스트 (`tests/integration/test_conversation_gui.py`, 4 케이스):
- GET /conversation.html → 200 + 필수 마크업
- POST /messages → 200 + user row 영속 + 스텁 runner 호출 확인
- 백그라운드 task ref 가 `pending_invocations` 에 잡혀있고 완료 후 자동 discard
- 스텁 runner 가 assistant row 영속 → user + assistant 시퀀스 검증
게이트:
- ruff check / format --check / mypy: PASS
- pytest -q --ignore=tests/integration/test_e2e_workflow.py
--ignore=tests/integration/test_openrouter_smoke.py: 675 passed (4 신규 포함)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -2,6 +2,46 @@
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
### Added
|
||||
- **v0.3 PR #8 — Conversation-centric Web GUI (`/conversation.html`)**.
|
||||
Workflow run 페이지는 archive 로 격하; 사용자가 처음 보는 화면은 chat-style
|
||||
대화 thread. Claude Code 의 Web GUI 와 동일한 사용성.
|
||||
- `static/conversation.html` (신규): session picker + 메시지 thread +
|
||||
입력 박스. data-page="conversation".
|
||||
- `static/app.js`:
|
||||
- 새 페이지 핸들러 `bootstrapConversationPage` 추가.
|
||||
- `loadSessionList()` → GET /api/sessions, picker 채움.
|
||||
- `loadAndAttachSession(sid)` → GET /api/sessions/{id}, 메시지 thread 렌더,
|
||||
SSE 구독 시작.
|
||||
- `attachEventSource` → 기존 SSE message/done 이벤트 처리. 새 user 메시지
|
||||
전송 시 `pending` 풍선 표시, assistant 메시지 도착 시 교체.
|
||||
- `createNewSession` → default-interactive persona 로 POST /api/sessions.
|
||||
- XSS 정책 동일: 모든 사용자 콘텐츠는 `textContent` 만 사용.
|
||||
- `static/style.css`: `.messages-thread`, `.msg-bubble`, `.conv-topbar`,
|
||||
`.conv-input-bar` 등 chat UI 스타일 추가.
|
||||
- `api/app.py`:
|
||||
- lifespan 에서 LangGraph saver 를 `from_conn_string` 으로 1회 열고
|
||||
`app.state.saver` 에 보관 (Postgres 일 때만, SQLite 테스트는 None).
|
||||
백그라운드 invoke 가 재사용. 종료 시 `__aexit__` 호출.
|
||||
- `api/agent_runner.py` (신규):
|
||||
- `invoke_session_agent(db, config, personas, session_id, user_message, saver=...)` —
|
||||
세션 로우 로드 → persona 해상 → 디렉터리 부트스트랩 (memory / skills /
|
||||
MYDEEPAGENT.md) → middleware 스택 (plan-mode + cost + audit) 생성 →
|
||||
`build_agent` → `ainvoke` → assistant MessageRow 영속 → 자동 compaction.
|
||||
- 모든 실패는 로깅 + return (raise 안 함) — HTTP 응답은 이미 200 이고
|
||||
SSE 가 진행 상태를 보여줌.
|
||||
- `api/routes/sessions.py`:
|
||||
- `POST /api/sessions/{id}/messages` 가 user row 영속 후
|
||||
`asyncio.create_task(invoke_session_agent(...))` 로 백그라운드 invoke 발사.
|
||||
task ref 를 `app.state.pending_invocations` set 에 보관 (RUF006 + GC
|
||||
drop 방지), 완료 시 `discard`.
|
||||
- `tests/integration/test_conversation_gui.py` (신규, 4 케이스):
|
||||
- GET /conversation.html → 200 + 필수 마크업
|
||||
- POST /messages → 200 + user row 영속 + 백그라운드 invoke 호출
|
||||
- 백그라운드 task ref 가 `app.state.pending_invocations` 에 잡혀있고 완료
|
||||
후 자동 discard
|
||||
- 스텁 runner 가 assistant row 영속 → user + assistant 시퀀스 검증
|
||||
|
||||
### Added
|
||||
- **v0.3 PR #7 — MYDEEPAGENT.md instruction-file hierarchy**. Claude Code 의
|
||||
CLAUDE.md 글로벌/프로젝트 레이어링 등가. 세션 시작 시 다음 두 파일을 자동
|
||||
|
||||
Reference in New Issue
Block a user