Commit Graph

1267 Commits

Author SHA1 Message Date
Eyejoker
74cb43b1d8 Extract dashboard ServicePanel component (#66)
* review: harden readonly git checks and lint verification

* test: satisfy readonly reviewer sandbox typing

* test: fix readonly reviewer sandbox assertions

* test: remove impossible readonly sandbox guards

* test: relax readonly sandbox assertions

* test: cast readonly sandbox expectation shape

* test: cast readonly sandbox expectation through unknown

* Phase 0 — STEP_DONE/TASK_DONE split + owner-follow-up integration smoke

* Add STEP_DONE guards, verdict storage, and stale delivery suppression

* style: format paired stepdone telemetry files

* Route STEP_DONE through reviewer

* Add structured Discord attachments

* style: format structured attachment test

* Fix room thread bot output parity

* Remove duplicate work item attachment migration from owner branch

* Remove legacy dashboard rooms renderer

* Extract dashboard parsed body renderer

* Extract dashboard redaction helpers

* Extract dashboard RoomCardV2 component

* Include RoomCardV2 test in vitest suite

* Extract dashboard RoomBoardV2 component

* Extract dashboard EmptyState component

* Extract dashboard InboxPanel component

* Split dashboard InboxPanel card renderer

* Extract dashboard TaskPanel component

* Extract dashboard UsagePanel component

* Fix dashboard room thread chunk rendering

* Extract dashboard ServicePanel component
2026-04-28 16:18:54 +09:00
ejclaw
549016e84c Extract dashboard ServicePanel component 2026-04-28 16:12:07 +09:00
ejclaw
baf52678e2 Merge remote-tracking branch 'origin/main' into codex/owner/ejclaw 2026-04-28 16:04:18 +09:00
Eyejoker
5902960144 Fix dashboard room thread chunk rendering (#65)
* review: harden readonly git checks and lint verification

* test: satisfy readonly reviewer sandbox typing

* test: fix readonly reviewer sandbox assertions

* test: remove impossible readonly sandbox guards

* test: relax readonly sandbox assertions

* test: cast readonly sandbox expectation shape

* test: cast readonly sandbox expectation through unknown

* Phase 0 — STEP_DONE/TASK_DONE split + owner-follow-up integration smoke

* Add STEP_DONE guards, verdict storage, and stale delivery suppression

* style: format paired stepdone telemetry files

* Route STEP_DONE through reviewer

* Add structured Discord attachments

* style: format structured attachment test

* Fix room thread bot output parity

* Remove duplicate work item attachment migration from owner branch

* Remove legacy dashboard rooms renderer

* Extract dashboard parsed body renderer

* Extract dashboard redaction helpers

* Extract dashboard RoomCardV2 component

* Include RoomCardV2 test in vitest suite

* Extract dashboard RoomBoardV2 component

* Extract dashboard EmptyState component

* Extract dashboard InboxPanel component

* Split dashboard InboxPanel card renderer

* Extract dashboard TaskPanel component

* Extract dashboard UsagePanel component

* Fix dashboard room thread chunk rendering
2026-04-28 16:03:52 +09:00
ejclaw
680677111a Fix dashboard room thread chunk rendering 2026-04-28 15:56:18 +09:00
ejclaw
4ee9006492 Merge remote-tracking branch 'origin/main' into codex/owner/ejclaw 2026-04-28 15:47:08 +09:00
Eyejoker
72f71d5abf Extract dashboard UsagePanel component (#64)
* review: harden readonly git checks and lint verification

* test: satisfy readonly reviewer sandbox typing

* test: fix readonly reviewer sandbox assertions

* test: remove impossible readonly sandbox guards

* test: relax readonly sandbox assertions

* test: cast readonly sandbox expectation shape

* test: cast readonly sandbox expectation through unknown

* Phase 0 — STEP_DONE/TASK_DONE split + owner-follow-up integration smoke

* Add STEP_DONE guards, verdict storage, and stale delivery suppression

* style: format paired stepdone telemetry files

* Route STEP_DONE through reviewer

* Add structured Discord attachments

* style: format structured attachment test

* Fix room thread bot output parity

* Remove duplicate work item attachment migration from owner branch

* Remove legacy dashboard rooms renderer

* Extract dashboard parsed body renderer

* Extract dashboard redaction helpers

* Extract dashboard RoomCardV2 component

* Include RoomCardV2 test in vitest suite

* Extract dashboard RoomBoardV2 component

* Extract dashboard EmptyState component

* Extract dashboard InboxPanel component

* Split dashboard InboxPanel card renderer

* Extract dashboard TaskPanel component

* Extract dashboard UsagePanel component
2026-04-28 15:46:47 +09:00
ejclaw
7fb562ae1f Extract dashboard UsagePanel component 2026-04-28 15:41:24 +09:00
ejclaw
59bcb5c250 Merge remote-tracking branch 'origin/main' into codex/owner/ejclaw 2026-04-28 15:35:21 +09:00
Eyejoker
c19665a134 Extract dashboard TaskPanel component (#63)
* review: harden readonly git checks and lint verification

* test: satisfy readonly reviewer sandbox typing

* test: fix readonly reviewer sandbox assertions

* test: remove impossible readonly sandbox guards

* test: relax readonly sandbox assertions

* test: cast readonly sandbox expectation shape

* test: cast readonly sandbox expectation through unknown

* Phase 0 — STEP_DONE/TASK_DONE split + owner-follow-up integration smoke

* Add STEP_DONE guards, verdict storage, and stale delivery suppression

* style: format paired stepdone telemetry files

* Route STEP_DONE through reviewer

* Add structured Discord attachments

* style: format structured attachment test

* Fix room thread bot output parity

* Remove duplicate work item attachment migration from owner branch

* Remove legacy dashboard rooms renderer

* Extract dashboard parsed body renderer

* Extract dashboard redaction helpers

* Extract dashboard RoomCardV2 component

* Include RoomCardV2 test in vitest suite

* Extract dashboard RoomBoardV2 component

* Extract dashboard EmptyState component

* Extract dashboard InboxPanel component

* Split dashboard InboxPanel card renderer

* Extract dashboard TaskPanel component
2026-04-28 15:35:02 +09:00
ejclaw
bf1bd6e6dd Extract dashboard TaskPanel component 2026-04-28 15:24:53 +09:00
ejclaw
a653c212b4 Merge remote-tracking branch 'origin/main' into codex/owner/ejclaw 2026-04-28 15:05:24 +09:00
Eyejoker
6d13c3aa49 Extract dashboard InboxPanel component (#62)
* review: harden readonly git checks and lint verification

* test: satisfy readonly reviewer sandbox typing

* test: fix readonly reviewer sandbox assertions

* test: remove impossible readonly sandbox guards

* test: relax readonly sandbox assertions

* test: cast readonly sandbox expectation shape

* test: cast readonly sandbox expectation through unknown

* Phase 0 — STEP_DONE/TASK_DONE split + owner-follow-up integration smoke

* Add STEP_DONE guards, verdict storage, and stale delivery suppression

* style: format paired stepdone telemetry files

* Route STEP_DONE through reviewer

* Add structured Discord attachments

* style: format structured attachment test

* Fix room thread bot output parity

* Remove duplicate work item attachment migration from owner branch

* Remove legacy dashboard rooms renderer

* Extract dashboard parsed body renderer

* Extract dashboard redaction helpers

* Extract dashboard RoomCardV2 component

* Include RoomCardV2 test in vitest suite

* Extract dashboard RoomBoardV2 component

* Extract dashboard EmptyState component

* Extract dashboard InboxPanel component

* Split dashboard InboxPanel card renderer
2026-04-28 15:04:37 +09:00
ejclaw
77ad6fa51d Split dashboard InboxPanel card renderer 2026-04-28 14:58:06 +09:00
ejclaw
eb13c3d332 Extract dashboard InboxPanel component 2026-04-28 14:51:38 +09:00
ejclaw
e849a8ee3b Merge remote-tracking branch 'origin/main' into codex/owner/ejclaw 2026-04-28 14:36:46 +09:00
Eyejoker
13f05273d7 Extract dashboard EmptyState component (#61)
* review: harden readonly git checks and lint verification

* test: satisfy readonly reviewer sandbox typing

* test: fix readonly reviewer sandbox assertions

* test: remove impossible readonly sandbox guards

* test: relax readonly sandbox assertions

* test: cast readonly sandbox expectation shape

* test: cast readonly sandbox expectation through unknown

* Phase 0 — STEP_DONE/TASK_DONE split + owner-follow-up integration smoke

* Add STEP_DONE guards, verdict storage, and stale delivery suppression

* style: format paired stepdone telemetry files

* Route STEP_DONE through reviewer

* Add structured Discord attachments

* style: format structured attachment test

* Fix room thread bot output parity

* Remove duplicate work item attachment migration from owner branch

* Remove legacy dashboard rooms renderer

* Extract dashboard parsed body renderer

* Extract dashboard redaction helpers

* Extract dashboard RoomCardV2 component

* Include RoomCardV2 test in vitest suite

* Extract dashboard RoomBoardV2 component

* Extract dashboard EmptyState component
2026-04-28 14:35:43 +09:00
ejclaw
705cb596b9 Extract dashboard EmptyState component 2026-04-28 14:28:57 +09:00
ejclaw
dde015fb24 Merge remote-tracking branch 'origin/main' into codex/owner/ejclaw 2026-04-28 14:24:42 +09:00
Eyejoker
d99c0bc6be Extract dashboard RoomBoardV2 component (#60)
* review: harden readonly git checks and lint verification

* test: satisfy readonly reviewer sandbox typing

* test: fix readonly reviewer sandbox assertions

* test: remove impossible readonly sandbox guards

* test: relax readonly sandbox assertions

* test: cast readonly sandbox expectation shape

* test: cast readonly sandbox expectation through unknown

* Phase 0 — STEP_DONE/TASK_DONE split + owner-follow-up integration smoke

* Add STEP_DONE guards, verdict storage, and stale delivery suppression

* style: format paired stepdone telemetry files

* Route STEP_DONE through reviewer

* Add structured Discord attachments

* style: format structured attachment test

* Fix room thread bot output parity

* Remove duplicate work item attachment migration from owner branch

* Remove legacy dashboard rooms renderer

* Extract dashboard parsed body renderer

* Extract dashboard redaction helpers

* Extract dashboard RoomCardV2 component

* Include RoomCardV2 test in vitest suite

* Extract dashboard RoomBoardV2 component
2026-04-28 14:23:43 +09:00
ejclaw
a2dc27ca2e Extract dashboard RoomBoardV2 component 2026-04-28 14:17:33 +09:00
ejclaw
7580f74313 Merge remote-tracking branch 'origin/main' into codex/owner/ejclaw 2026-04-28 14:05:44 +09:00
Eyejoker
05865197c7 Extract dashboard RoomCardV2 component (#59)
* review: harden readonly git checks and lint verification

* test: satisfy readonly reviewer sandbox typing

* test: fix readonly reviewer sandbox assertions

* test: remove impossible readonly sandbox guards

* test: relax readonly sandbox assertions

* test: cast readonly sandbox expectation shape

* test: cast readonly sandbox expectation through unknown

* Phase 0 — STEP_DONE/TASK_DONE split + owner-follow-up integration smoke

* Add STEP_DONE guards, verdict storage, and stale delivery suppression

* style: format paired stepdone telemetry files

* Route STEP_DONE through reviewer

* Add structured Discord attachments

* style: format structured attachment test

* Fix room thread bot output parity

* Remove duplicate work item attachment migration from owner branch

* Remove legacy dashboard rooms renderer

* Extract dashboard parsed body renderer

* Extract dashboard redaction helpers

* Extract dashboard RoomCardV2 component

* Include RoomCardV2 test in vitest suite
2026-04-28 14:04:34 +09:00
ejclaw
1f7310e526 Include RoomCardV2 test in vitest suite 2026-04-28 13:56:51 +09:00
ejclaw
2251a69f1a Extract dashboard RoomCardV2 component 2026-04-28 13:49:43 +09:00
ejclaw
c67462b477 Merge remote-tracking branch 'origin/main' into codex/owner/ejclaw 2026-04-28 13:25:57 +09:00
Eyejoker
f162f42c6b Extract dashboard redaction helpers
Centralize dashboard secret redaction helpers and add focused regression tests.
2026-04-28 13:25:46 +09:00
ejclaw
ca83a1f0b7 Extract dashboard redaction helpers 2026-04-28 13:20:55 +09:00
ejclaw
646d1f1f19 Merge remote-tracking branch 'origin/main' into codex/owner/ejclaw 2026-04-28 13:16:10 +09:00
Eyejoker
23c5be6ecd Extract dashboard parsed body renderer
Extract the dashboard markdown renderer into ParsedBody.tsx and remove stale inline parser helpers from App.tsx.
2026-04-28 13:15:59 +09:00
ejclaw
f5ff45859c Extract dashboard parsed body renderer 2026-04-28 13:08:58 +09:00
ejclaw
a751db2464 Merge remote-tracking branch 'origin/main' into codex/owner/ejclaw 2026-04-28 13:01:13 +09:00
Eyejoker
880e1bfe24 Remove legacy dashboard rooms renderer
Remove unused Rooms v1 renderer and stale CSS after Rooms V2 became the only active dashboard path.
2026-04-28 13:00:58 +09:00
ejclaw
6bfedc28f0 Remove legacy dashboard rooms renderer 2026-04-28 12:55:44 +09:00
ejclaw
4deb8b51de Merge remote-tracking branch 'origin/main' into codex/owner/ejclaw 2026-04-28 11:18:44 +09:00
Eyejoker
727aa3446e Fix room thread bot output parity
Fix dashboard room thread rendering so regular Discord bot outputs from messages[] are shown when paired outputs are missing, while keeping watcher messages separated and deduplicating paired outputs.
2026-04-28 11:18:16 +09:00
ejclaw
76313b9ebd Remove duplicate work item attachment migration from owner branch 2026-04-28 11:17:22 +09:00
ejclaw
c89da09f27 Fix room thread bot output parity 2026-04-28 11:09:11 +09:00
ejclaw
a00946c398 Merge remote-tracking branch 'origin/main' into codex/owner/ejclaw 2026-04-28 10:54:45 +09:00
Eyejoker
2d6711f4c7 Unify dashboard mobile navigation (#54) 2026-04-28 10:53:13 +09:00
ejclaw
166833a255 Merge remote-tracking branch 'origin/main' into codex/owner/ejclaw 2026-04-28 01:35:44 +09:00
Eyejoker
8bb77ffaa3 Fix structured IPC envelope leakage
Normalize EJClaw structured send_message envelopes, preserve attachments, unwrap stored room payloads, and add regression tests.
2026-04-28 01:35:26 +09:00
Eyejoker
20e1a1e5e1 Fix mobile rooms and live progress parity
Improve mobile room UX, separate live progress from recent chat, and lock the parity behavior with service tests.
2026-04-28 01:27:55 +09:00
Eyejoker
79efa6b37c Add code quality gates
Add ESLint/quality gates, per-file ratchet budgets, and regression tests for code quality checks.
2026-04-28 01:19:06 +09:00
ejclaw
79b9e74386 Merge remote-tracking branch 'origin/main' into codex/owner/ejclaw 2026-04-28 00:53:46 +09:00
Eyejoker
e2dd12a235 Codex switch: translate settings-index ↔ rotation-index by auth path (#51)
settings-store lists codex accounts as
  index 0 = ~/.codex/auth.json (default)
  index N = ~/.codex-accounts/{N}/auth.json
but codex-token-rotation only loads ~/.codex-accounts/{N} when those
dirs exist (it ignores ~/.codex/auth.json in that mode), so the
rotation array's indices are off-by-one vs settings indices.

Old buggy behavior:
- "사용중" badge pointed at the wrong account.
- Clicking 전환 on UI #N called setCurrentCodexAccountIndex(N) which
  selected rotation array element N — typically a different
  ~/.codex-accounts/{N+1} entry. Effectively the UI told us a
  different account was now active than what the next codex spawn
  actually used.

Fix
- New findCodexAccountIndexByAuthPath(path) on the rotation module
  exposes a path-based lookup.
- New getActiveCodexSettingsIndex() / setActiveCodexSettingsIndex(idx)
  in settings-store translate via codexAuthPath() ↔
  findCodexAccountIndexByAuthPath().
- /api/settings/accounts.codexCurrentIndex and PUT
  /api/settings/accounts/codex/current both go through the
  settings-side translation, so UI indices are now authoritative.

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-27 22:47:40 +09:00
Eyejoker
4ed12332d4 Codex refresh: pull live plan_type from /wham/usage (#50)
* Settings: clarify Codex 만료=결제, drop Claude expiry badge

- Codex expiry badge now says "결제 만료/까지" so it's unambiguous that
  this is the ChatGPT Pro/Team subscription end-date, not an OAuth
  access-token TTL.
- Claude rows no longer show an expiry badge: Claude credentials only
  expose an OAuth access_token TTL (auto-refreshed every few minutes
  by the existing claude token refresh loop), which is meaningless to
  the user. Replace it with a static "토큰 자동갱신" tag so the column
  alignment stays consistent.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* Codex refresh: pull live plan_type from /wham/usage (sidecar override)

OAuth refresh_token grant returns a fresh JWT but auth0 caches the
chatgpt_plan_type and chatgpt_subscription_active_until claims at issue
time. So users who upgrade/downgrade their plan kept seeing the old
plan in the dashboard even after a forced refresh.

After each refreshCodexAccount() call, additionally GET
https://chatgpt.com/backend-api/wham/usage with the freshly-issued
access_token. That endpoint returns the current plan_type and email
from OpenAI's account service. Persist it to a sidecar
plan-status.json next to auth.json (not into auth.json itself, since
codex CLI may rewrite that file). readCodexAccount prefers the live
plan_type and uses the sidecar's checked_at as subscriptionLastChecked,
so the dashboard immediately reflects post-billing-event plan changes.

Confirmed end-to-end: account that was billed-down from Pro to Plus
now shows plus instead of stale pro after one refresh.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-27 22:33:22 +09:00
Eyejoker
dafb84fa4d Settings: clarify Codex 만료=결제, drop Claude expiry badge (#49)
- Codex expiry badge now says "결제 만료/까지" so it's unambiguous that
  this is the ChatGPT Pro/Team subscription end-date, not an OAuth
  access-token TTL.
- Claude rows no longer show an expiry badge: Claude credentials only
  expose an OAuth access_token TTL (auto-refreshed every few minutes
  by the existing claude token refresh loop), which is meaningless to
  the user. Replace it with a static "토큰 자동갱신" tag so the column
  alignment stays consistent.

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-27 22:26:17 +09:00
Eyejoker
c2a6889567 Codex accounts: 6h auto-refresh, manual refresh, manual switch (#48)
Auto refresh
- New refreshCodexAccount(index) calls https://auth.openai.com/oauth/token
  with grant_type=refresh_token and persists rotated tokens back to
  ~/.codex-accounts/{N}/auth.json. JWT's subscription_active_until
  reflects the latest plan state OpenAI hands back.
- startCodexAccountRefreshLoop() runs every 6h (first run delayed 60s
  after boot to keep startup snappy). Hooked into main()/shutdown()
  alongside the existing claude token refresh loop.

Manual controls (Settings → 계정 → Codex)
- "갱신" button per row: forces an immediate refresh for that account.
- "전체 갱신" button: refreshes all codex accounts in sequence.
- "전환" button: writes data/codex-rotation-state.json so the next codex
  spawn picks the chosen account. Active account marked with a green-
  bordered card and "사용중" badge.

Endpoints
- POST /api/settings/accounts/codex/{i}/refresh
- POST /api/settings/accounts/codex/refresh-all
- PUT  /api/settings/accounts/codex/current  { index }
- GET  /api/settings/accounts now also returns codexCurrentIndex.

Why
JWTs cache subscription state at issue-time. When a Pro plan lapses or
a user upgrades/downgrades, the dashboard kept showing stale data until
the user logged in again. Periodic refresh + explicit "갱신" button
keeps the displayed state honest, and the manual switch unblocks the
user when rotation lands on a known-bad account.

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-27 22:23:06 +09:00
Eyejoker
2f7e09e194 Settings: relax 480px panel cap and align account row right side (#47)
- Bump .settings-panel max-width 480px → 760px so settings page actually
  uses available desktop width (the 480px cap was a leftover from an
  initial mobile-first sketch).
- Account row main grid columns become fixed: 28px tag · 1fr email ·
  60px plan · 180px expiry. Plan and expiry badges now line up
  vertically across rows regardless of email length.

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-27 22:11:59 +09:00