feat: add minimum API and web GUI

This commit is contained in:
chungyeong
2026-05-14 01:16:41 +09:00
parent e5020a59f0
commit c9fed71cc9
21 changed files with 3757 additions and 11 deletions

View File

@@ -1460,9 +1460,16 @@ Events:
Reconnect:
- `Last-Event-ID` is last `run_events.seq`.
- server replays `seq > lastSeq`.
- non-run-event SSE types are not replayed; state is re-derived by fetch.
- Run-scoped `/sse/runs/:runId`:
- `Last-Event-ID` is last `run_events.seq` for that run.
- server replays `run.event_appended` for `seq > lastSeq`.
- derived non-`run.event_appended` SSE types are not replayed for historical rows; state is re-derived by fetch.
- Global `/sse/global`:
- `Last-Event-ID` is last global `run_events.id`, because `run_events.seq` is only monotonic within a run.
- fresh connects start at the latest global event id and emit only new summary events.
- reconnects replay rows with `id > lastId`.
- global stream emits only scope=`both` events: `run.state_changed`, `approval.created`, `approval.resolved`.
- global stream never emits `run.event_appended`.
## 18. Errors
@@ -1768,6 +1775,9 @@ M5+:
| CC-33 | API-side already-applied `reject` / `abort` replay tried to dispose sessions through DB-only replay validation runtime | API replay side effects are report-repair only; worker-side decision application owns session disposal |
| CC-34 | Closed-workflow approval settlement waited for reports but did not replay approval side effects | settlement now verifies the requested decision, replays side effects, then waits for the terminal report |
| CC-35 | Baseline-protected BUSY replay recorded synthetic prompt proof before the baseline wait was durable | baseline replay no longer records synthetic prompt events; replay without real prompt proof keeps treating existing files as stale |
| CC-36 | SSE reconnect wording used per-run `seq` for global stream even though `seq` is not globally monotonic | `/sse/runs/:runId` uses per-run `seq`; `/sse/global` uses global `run_events.id` and emits only scope=`both` summary events |
| CC-37 | Run SSE replay could emit historical derived events after the first page | run SSE drains historical rows up to a high-water `seq` with only `run.event_appended`, then switches to live derived events |
| CC-38 | Normal phase start changed run state to `planning` / `executing` without a summary event source | `phase.started` payload includes `runState`; SSE derives `run.state_changed` from that live event |
### Future Open Questions