merge: worker console redesign
# Conflicts: # web/workspace/src/lib/workspace-sidebar/WorkersNavSection.svelte
This commit is contained in:
@@ -0,0 +1 @@
|
||||
{"id":"orch-plan-20260626-174605-1","ticket_id":"00001KW2GCPYF","kind":"accepted_plan","note":"Dashboard Queue accepted. No relation blockers, no inprogress work, orchestration worktree clean. Previous Runtime/Backend/TUI/WebConsole foundations are on develop/orchestration HEAD.","accepted_plan":{"summary":"Workspace Web Console を Companion 専用 route/sidebar から任意 Worker attach route へ再設計する。Worker list から `runtime_id + worker_id` で開き、Backend transcript/input/observation WS と protocol event rendering を使う。旧 `/console` route/fallback と standalone Console sidebar entry は残さない。","branch":"work/00001KW2GCPYF-worker-console-redesign","worktree":"/home/hare/Projects/yoi/.worktree/00001KW2GCPYF-worker-console-redesign","role_plan":"Orchestrator が dedicated child worktree を作成し、coder Worker に `web/workspace` と必要な Backend API support (`crates/workspace-server`)、Cargo/package files の write scope を委譲する。reviewer Worker は read-only で route/navigation authority、runtime_id+worker_id attach、protocol::Event rendering semantics、metadata/diagnostics layout、legacy `/console` removal、Browser credential/path non-leak を確認する。merge/validation/done/cleanup は Orchestrator が行う。"},"author":"yoi-orchestrator","at":"2026-06-26T17:46:05Z"}
|
||||
@@ -1,8 +1,8 @@
|
||||
---
|
||||
title: 'Workspace Worker Consoleを任意Worker attach前提で再設計する'
|
||||
state: 'queued'
|
||||
state: 'done'
|
||||
created_at: '2026-06-26T17:42:10Z'
|
||||
updated_at: '2026-06-26T17:45:40Z'
|
||||
updated_at: '2026-06-26T18:22:51Z'
|
||||
assignee: null
|
||||
queued_by: 'workspace-panel'
|
||||
queued_at: '2026-06-26T17:45:40Z'
|
||||
|
||||
@@ -30,4 +30,352 @@ Marked ready by `yoi ticket state`.
|
||||
Ticket を `workspace-panel` が queued にしました。
|
||||
|
||||
|
||||
---
|
||||
|
||||
<!-- event: decision author: yoi-orchestrator at: 2026-06-26T17:46:30Z -->
|
||||
|
||||
## Decision
|
||||
|
||||
Routing decision: implementation_ready
|
||||
|
||||
Reason:
|
||||
- Dashboard Queue により routing 許可済み。
|
||||
- Relations はなし、OrchestrationPlan も未設定だった。blocking dependency は見当たらない。
|
||||
- Current `inprogress` is 0。orchestration worktree is clean and current HEAD already contains Runtime/Backend/WebSocket/WebConsole/TUI foundations.
|
||||
- Ticket body は navigation/route model、attach routing、UX redesign、protocol rendering model、input/observation、Non-goals、acceptance criteria が具体的。
|
||||
|
||||
Evidence checked:
|
||||
- Ticket body: Workspace top Worker list から任意 Worker Console、`runtime_id + worker_id` authority、Companion を通常 Worker として扱う、standalone Console sidebar entry / old `/console` fallback removal、protocol::Event rendering semantics、degrade path、validation requirements。
|
||||
- Relations: none。
|
||||
- Orchestration plan: accepted plan `orch-plan-20260626-174605-1` recorded。
|
||||
- Workspace state: queued 1 / inprogress 0、orchestration clean、child spawned count 0。
|
||||
|
||||
IntentPacket:
|
||||
|
||||
Intent:
|
||||
- Workspace Web Console を Companion 固定 UI から、Worker list 起点の任意 Worker attach Console に再設計する。
|
||||
|
||||
Binding decisions / invariants:
|
||||
- Console target authority は `runtime_id + worker_id`。
|
||||
- Browser は Runtime endpoint / credential / socket path / session path を扱わない。
|
||||
- Sidebar に standalone `Console` category / navigation entry を残さない。
|
||||
- Companion は通常 Worker として list から attach する。Companion 専用 route/sidebar/Console implementation は正規導線に残さない。
|
||||
- 旧 `/console` route redirect/fallback 互換は残さない。
|
||||
- Backend Worker API / Backend client-facing observation WS を使う。
|
||||
- TUI の見た目や keybinding は移植しない。移植対象は `protocol::Event` rendering semantics。
|
||||
- 未実装 Runtime/permission/advanced control UI、multi-worker split view、raw provider trace viewer は作らない。
|
||||
|
||||
Requirements / acceptance criteria:
|
||||
- Workspace top Worker list から任意 Worker Console を開ける。
|
||||
- Console route/state は `runtime_id + worker_id` を持つ。
|
||||
- Worker detail/capabilities、bounded transcript/Snapshot相当、observation WS、input API を使う。
|
||||
- `protocol::Event` 由来の user / assistant / thinking / tool call/result / status / error / usage / snapshot / in-flight を表示する。
|
||||
- Metadata/diagnostics は compact header/details/collapsible area に逃がし、主 transcript 幅を過剰に占有しない。
|
||||
- Streaming 非対応 Worker は transcript-only/manual refresh等の degrade path を明示。
|
||||
- Focused Web UI tests/component tests を追加する。
|
||||
- `deno task check/build`, `cargo check -p yoi`, `git diff --check`, `nix build .#yoi --no-link` が通る。
|
||||
|
||||
Implementation latitude:
|
||||
- Route naming、Worker list UI placement、component split、protocol event state model、degrade UI の詳細は Coder が existing `web/workspace` style に合わせて選べる。
|
||||
- Backend API に小さな不足があれば `crates/workspace-server` で最小 support を追加してよい。
|
||||
- Existing Companion provider-less backend can remain as a normal worker source, but no special Console UI path。
|
||||
|
||||
Escalate if:
|
||||
- Browser に Runtime endpoint/token/socket/session path を渡す必要が出る。
|
||||
- old `/console` fallback を残さないと navigation が成立しないと判明する。
|
||||
- Full TUI parity / tool UI / raw provider trace viewer / multi-worker split view が必要になる。
|
||||
- Backend protocol/WS foundation の大幅 redesign が必要になる。
|
||||
|
||||
Validation:
|
||||
- `cargo fmt --all`
|
||||
- `cargo check -p yoi`
|
||||
- `cd web/workspace && deno task check`
|
||||
- `cd web/workspace && deno task build`
|
||||
- `git diff --check`
|
||||
- 可能なら `nix build .#yoi --no-link`
|
||||
|
||||
Critical risks / reviewer focus:
|
||||
- Companion special-case route/sidebar implementation が残ること。
|
||||
- Route target が `runtime_id + worker_id` ではなく worker_id-only になること。
|
||||
- Runtime endpoint/token/socket/session path leak。
|
||||
- `protocol::Event` を簡易 chat message に潰しすぎること。
|
||||
- Metadata/diagnostics が主 transcript を圧迫すること。
|
||||
- Old `/console` redirect/fallback compatibility が残ること。
|
||||
|
||||
---
|
||||
|
||||
<!-- event: state_changed author: yoi-orchestrator at: 2026-06-26T17:46:39Z from: queued to: inprogress reason: routing_accepted_worker_console_redesign field: state -->
|
||||
|
||||
## State changed
|
||||
|
||||
Routing decision: implementation_ready。
|
||||
|
||||
Ticket body / relations / workspace state / accepted plan を確認し、Workspace Worker Console redesign は unblocked と判断した。Relations はなく、current `inprogress` は 0。accepted plan と IntentPacket は thread / orchestration plan に記録済み。
|
||||
|
||||
これ以降、worktree creation / coder Worker routing などの implementation side effect に進める。
|
||||
|
||||
---
|
||||
|
||||
<!-- event: implementation_report author: yoi-orchestrator at: 2026-06-26T17:47:26Z -->
|
||||
|
||||
## Implementation report
|
||||
|
||||
Implementation kickoff:
|
||||
|
||||
- Worktree created: `/home/hare/Projects/yoi/.worktree/00001KW2GCPYF-worker-console-redesign`
|
||||
- Branch: `work/00001KW2GCPYF-worker-console-redesign`
|
||||
- Coder Worker spawned: `yoi-coder-00001KW2GCPYF-worker-console`
|
||||
|
||||
Scope notes:
|
||||
- Coder has read access to the implementation worktree and non-recursive workspace root identity path needed by runtime startup.
|
||||
- Coder write scope is limited to `web/workspace/**`, `crates/workspace-server/**`, root `Cargo.toml`, `Cargo.lock`, and `package.nix` if dependency/package changes are needed.
|
||||
- Coder is instructed not to modify Ticket records and not to operate in root/orchestration worktrees.
|
||||
|
||||
---
|
||||
|
||||
<!-- event: implementation_report author: yoi-coder-00001KW2GCPYF-worker-console at: 2026-06-26T18:07:17Z -->
|
||||
|
||||
## Implementation report
|
||||
|
||||
Implementation report:
|
||||
|
||||
実装完了。merge / Ticket 更新 / close / cleanup は行っていない。
|
||||
|
||||
Commit:
|
||||
- `c3fed591095244223e6da7c84ac7f1a2e4cf8cb7 feat: worker attach workspace console`
|
||||
|
||||
変更概要:
|
||||
|
||||
### UI / routing
|
||||
|
||||
- 旧 canonical `/console` route を削除。
|
||||
- `web/workspace/src/routes/console/+page.svelte` 削除。
|
||||
- 新 Console route を追加。
|
||||
- `/runtimes/[runtimeId]/workers/[workerId]/console`
|
||||
- Console target authority は `runtime_id + worker_id`。
|
||||
- standalone Console / Companion sidebar entry を削除。
|
||||
- `CompanionNavSection.svelte` 削除。
|
||||
- sidebar は Workers section から各 Worker Console へ attach する形に変更。
|
||||
- Workspace top Worker list に `Open Console` attach action を追加。
|
||||
- Companion は特別 route ではなく通常 Worker row として attach される想定に変更。
|
||||
|
||||
### Worker Console
|
||||
|
||||
- Backend Worker API のみを使う Console を追加。
|
||||
- Worker detail: `/api/runtimes/{runtime_id}/workers/{worker_id}`
|
||||
- bounded transcript: `/api/runtimes/{runtime_id}/workers/{worker_id}/transcript?limit=200`
|
||||
- input: `/api/runtimes/{runtime_id}/workers/{worker_id}/input`
|
||||
- observation WS: `/api/runtimes/{runtime_id}/workers/{worker_id}/events/ws`
|
||||
- Browser 側では Runtime endpoint / credential / socket path / session path を扱わない。
|
||||
- `protocol::Event` 由来の表示モデルを追加。
|
||||
- user / assistant / thinking / tool / status / error / usage / snapshot / in-flight を区別表示。
|
||||
- transcript-only item と observation event を source として分離。
|
||||
- streaming unsupported Worker には明示的 degrade 表示を追加。
|
||||
- “bounded transcript + manual refresh” の経路を提示。
|
||||
- Worker detail / capabilities / diagnostics は右側 card の compact/collapsible 表示にして、transcript 幅を支配しない構成。
|
||||
|
||||
### tests
|
||||
|
||||
- Web Console projection/model tests 追加。
|
||||
- protocol segment rendering
|
||||
- event projection
|
||||
- snapshot / in-flight state
|
||||
- Worker target route href encoding
|
||||
- UI contract tests 追加。
|
||||
- Worker list/sidebar が Worker Console href を使うこと。
|
||||
- standalone Companion nav が canonical でないこと。
|
||||
- Console page が backend Worker APIs を使い `/api/companion` を使わないこと。
|
||||
- `deno task test` を追加。
|
||||
|
||||
主な変更ファイル:
|
||||
- `web/workspace/src/routes/runtimes/[runtimeId]/workers/[workerId]/console/+page.svelte`
|
||||
- `web/workspace/src/routes/runtimes/[runtimeId]/workers/[workerId]/console/+page.ts`
|
||||
- `web/workspace/src/lib/workspace-console/model.ts`
|
||||
- `web/workspace/src/lib/workspace-console/model.test.ts`
|
||||
- `web/workspace/src/lib/workspace-console/worker-console.ui.test.ts`
|
||||
- `web/workspace/src/lib/workspace-pages/WorkspacePage.svelte`
|
||||
- `web/workspace/src/lib/workspace-sidebar/WorkersNavSection.svelte`
|
||||
- `web/workspace/src/lib/workspace-sidebar/WorkspaceSidebar.svelte`
|
||||
- `web/workspace/src/lib/workspace-sidebar/types.ts`
|
||||
- `web/workspace/src/app.css`
|
||||
- `web/workspace/deno.json`
|
||||
- `web/workspace/tsconfig.json`
|
||||
|
||||
削除:
|
||||
- `web/workspace/src/routes/console/+page.svelte`
|
||||
- `web/workspace/src/lib/workspace-sidebar/CompanionNavSection.svelte`
|
||||
|
||||
Validation:
|
||||
- `cargo fmt --all`: success
|
||||
- `cargo check -p yoi`: success
|
||||
- `cd web/workspace && deno task test`: success(6 tests passed)
|
||||
- `cd web/workspace && deno task check`: success(0 errors / 0 warnings)
|
||||
- `cd web/workspace && deno task build`: success
|
||||
- `git diff --check`: success
|
||||
- `nix build .#yoi --no-link`: success(dirty tree warning は実装 commit 前の通常 warning。build 自体は完了)
|
||||
|
||||
Residual risks / review focus:
|
||||
- 実 Runtime / live Worker に対するブラウザ手動操作は未実施。特に observation WS の実イベント順序と snapshot/in-flight 表示の見え方は reviewer 側で確認推奨。
|
||||
- `protocol::Event` projection は現在の generated protocol union を広く扱う実装だが、UI は raw trace viewer ではなく compact transcript 表示に寄せている。イベント種類ごとの表示粒度が過不足ないか確認してほしい。
|
||||
- `deno task test` の UI contract tests は component runtime harness ではなく、現行 Deno/Svelte 構成に合わせた focused contract tests。将来 component test harness が入るなら置き換え候補。
|
||||
|
||||
---
|
||||
|
||||
<!-- event: review author: yoi-reviewer-00001KW2GCPYF-worker-console at: 2026-06-26T18:11:54Z status: request_changes -->
|
||||
|
||||
## Review: request changes
|
||||
|
||||
Review result: request_changes
|
||||
|
||||
ブロッカー:
|
||||
|
||||
- `web/workspace/src/routes/runtimes/[runtimeId]/workers/[workerId]/console/+page.svelte`
|
||||
- lines 263-267 の `$effect` が `refreshConsole()` を呼び、
|
||||
- `refreshConsole()` lines 128-130 が `reloadToken += 1` で `reloadToken` を読み書きしています。
|
||||
- Svelte runes の `$effect` は effect 内で同期的に読んだ state(ネストした関数呼び出し含む)を依存として追跡するため、この effect は `reloadToken` に依存しつつ自分で更新し、再実行ループになります。
|
||||
- 結果として Worker detail/transcript fetch が継続的に走り、line 269 の observation WS も `reloadToken` 依存で再接続を繰り返すリスクがあります。Console が安定して開けないため、Acceptance の「Worker list can open a Console」「observation WS/input/transcript を適切に使う」を満たせません。
|
||||
|
||||
確認済みの良い点:
|
||||
- old `web/workspace/src/routes/console` は存在せず、`/api/companion` 参照も Console 実装には残っていません。
|
||||
- 新 route は `/runtimes/[runtimeId]/workers/[workerId]/console`。
|
||||
- Worker list/sidebar は `runtime_id + worker_id` を `encodeURIComponent` して Console href を生成。
|
||||
- protocol event projection、snapshot/in-flight、非 streaming Worker の degrade 表示、compact/collapsible diagnostics card は実装されています。
|
||||
|
||||
検証は read-only 方針に従い、ソース確認・`find`/`rg`・git 状態確認のみ実施しました。ビルド/テスト再実行は artifact/cache 作成の可能性があるため未実施です。
|
||||
|
||||
---
|
||||
|
||||
<!-- event: implementation_report author: yoi-coder-00001KW2GCPYF-worker-console at: 2026-06-26T18:19:12Z -->
|
||||
|
||||
## Implementation report
|
||||
|
||||
Follow-up implementation report after review request_changes:
|
||||
|
||||
Commit:
|
||||
- `a1083908b681b420cd5fd911ac00da01ff8b7e5d fix: stabilize worker console refresh`
|
||||
|
||||
修正内容:
|
||||
- Worker Console の target-change `$effect` が `refreshConsole()` を経由して `reloadToken += 1` する構造を解消。
|
||||
- `reloadToken` は rune state のまま、非 reactive な `nextReloadToken` から `advanceReloadToken()` で単調更新する形に変更。
|
||||
- `reloadToken` 自体を同期 read/write しないため、target-change effect の dependency cycle を避ける。
|
||||
- 初期表示 / target-change refresh は `loadConsoleData(target)` を直接呼ぶように分離。
|
||||
- manual refresh は引き続き `advanceReloadToken()` してから Worker detail / transcript を再取得するため、WS reconnect semantics は維持。
|
||||
- observation WS effect は `worker + reloadToken + consoleTarget` に依存し、manual refresh / target-change で安定して reconnect。
|
||||
- focused static/contract test を追加・調整し、以下を確認。
|
||||
- `reloadToken += 1` が残っていない。
|
||||
- reload token advancement が `nextReloadToken` 経由。
|
||||
- target-change effect が `refreshConsole()` 経由の dependency cycle に戻らない。
|
||||
|
||||
Validation:
|
||||
- `cargo fmt --all`: success
|
||||
- `cargo check -p yoi`: success
|
||||
- `cd web/workspace && deno task test`: success(6 passed)
|
||||
- `cd web/workspace && deno task check`: success(0 errors / 0 warnings)
|
||||
- `cd web/workspace && deno task build`: success
|
||||
- `git diff --check`: success
|
||||
- `nix build .#yoi --no-link`: success(dirty tree warning は未 commit 差分によるもの。build は成功)
|
||||
|
||||
Residual risks / review focus:
|
||||
- 実ブラウザ + live Worker での操作確認は未実施。
|
||||
- 今回の fix は Svelte runes の dependency loop 解消に絞っている。WS の実接続タイミングや stale async response の UX は既存設計の範囲。
|
||||
|
||||
---
|
||||
|
||||
<!-- event: review author: yoi-reviewer-00001KW2GCPYF-worker-console at: 2026-06-26T18:21:17Z status: approve -->
|
||||
|
||||
## Review: approve
|
||||
|
||||
Review result: approve
|
||||
|
||||
確認結果:
|
||||
- 対象 worktree は branch `work/00001KW2GCPYF-worker-console-redesign`、HEAD は fix commit `a1083908b681b420cd5fd911ac00da01ff8b7e5d`。
|
||||
- 前回 blocker は解消済み。
|
||||
- `reloadToken += 1` は残っていない。
|
||||
- target-change `$effect` は `refreshConsole()` を呼ばず、`consoleTarget` を読んで `advanceReloadToken()` + `loadConsoleData(target)` のみ実行している。
|
||||
- `advanceReloadToken()` は非 reactive な `nextReloadToken` を増やして `reloadToken` に代入する形で、同じ effect 内で `reloadToken` を read/write する依存ループにはなっていない。
|
||||
- observation WS effect は `worker + reloadToken + consoleTarget` に依存し、manual refresh / target change で reconnect される構造として妥当。
|
||||
- regression なし。
|
||||
- old `/console` route は存在しない。
|
||||
- standalone `CompanionNavSection` / `/api/companion` 利用は Console 実装に戻っていない。
|
||||
- Worker list/sidebar は `workerConsoleHref(worker)` 経由で `runtime_id + worker_id` route に attach している。
|
||||
- Backend Worker detail/transcript/input/observation WS API の使用も維持されている。
|
||||
|
||||
検証:
|
||||
- read-only のソース確認、git 状態確認、`find`/`rg` による route/API/sidebar 残存確認。ビルド・テスト再実行はファイル生成の可能性があるため未実施。
|
||||
|
||||
---
|
||||
|
||||
<!-- event: implementation_report author: yoi-orchestrator at: 2026-06-26T18:21:56Z -->
|
||||
|
||||
## Implementation report
|
||||
|
||||
Integration / validation report:
|
||||
|
||||
Integration:
|
||||
- Implementation branch `work/00001KW2GCPYF-worker-console-redesign` を orchestration branch に merge 済み。
|
||||
- Merge commit: `864efe32 merge: 00001KW2GCPYF worker console redesign`
|
||||
|
||||
Included implementation commits:
|
||||
- `c3fed591095244223e6da7c84ac7f1a2e4cf8cb7 feat: worker attach workspace console`
|
||||
- `a1083908b681b420cd5fd911ac00da01ff8b7e5d fix: stabilize worker console refresh`
|
||||
|
||||
Validation in Orchestrator worktree:
|
||||
- `cargo fmt --all --check`: success
|
||||
- `cargo check -p yoi`: success
|
||||
- `cd web/workspace && deno task test`: success(6 tests passed)
|
||||
- `cd web/workspace && deno task check`: success(0 errors / 0 warnings)
|
||||
- `cd web/workspace && deno task build`: success
|
||||
- `git diff --check`: success
|
||||
- `nix build .#yoi --no-link`: success
|
||||
|
||||
Review:
|
||||
- Reviewer approve 済み。前回 blocker だった Svelte runes `$effect` / `reloadToken` dependency loop は解消済み。
|
||||
|
||||
Outcome:
|
||||
- Acceptance criteria を満たしたため `done` へ進める。
|
||||
|
||||
---
|
||||
|
||||
<!-- event: state_changed author: yoi-orchestrator at: 2026-06-26T18:22:10Z from: inprogress to: done reason: merged_reviewed_validated field: state -->
|
||||
|
||||
## State changed
|
||||
|
||||
Workspace Worker Console redesign の実装、review、merge、Orchestrator validation が完了した。
|
||||
|
||||
Done evidence:
|
||||
- Merge commit: `864efe32 merge: 00001KW2GCPYF worker console redesign`
|
||||
- Reviewer approve 済み。
|
||||
- Orchestrator validation:
|
||||
- `cargo fmt --all --check`: success
|
||||
- `cargo check -p yoi`: success
|
||||
- `cd web/workspace && deno task test`: success(6 tests passed)
|
||||
- `cd web/workspace && deno task check`: success(0 errors / 0 warnings)
|
||||
- `cd web/workspace && deno task build`: success
|
||||
- `git diff --check`: success
|
||||
- `nix build .#yoi --no-link`: success
|
||||
|
||||
Scope:
|
||||
- Workspace Web Console を Companion-specific route/sidebar から Worker list driven arbitrary Worker attach route (`runtime_id + worker_id`) へ再設計。
|
||||
- Old `/console` canonical route and standalone Companion Console sidebar entry were removed.
|
||||
- Advanced controls / multi-worker split / raw provider trace viewer / full auth-redaction policy は Non-goals として未実装。
|
||||
|
||||
---
|
||||
|
||||
<!-- event: implementation_report author: yoi-orchestrator at: 2026-06-26T18:22:51Z -->
|
||||
|
||||
## Implementation report
|
||||
|
||||
Cleanup report:
|
||||
|
||||
- Child Workers stopped one-by-one and scope reclaimed:
|
||||
- `yoi-coder-00001KW2GCPYF-worker-console`
|
||||
- `yoi-reviewer-00001KW2GCPYF-worker-console`
|
||||
- Child implementation worktree removed:
|
||||
- `/home/hare/Projects/yoi/.worktree/00001KW2GCPYF-worker-console-redesign`
|
||||
- Child implementation branch removed:
|
||||
- `work/00001KW2GCPYF-worker-console-redesign`
|
||||
|
||||
Operational note:
|
||||
- StopPod was executed sequentially, not in parallel.
|
||||
|
||||
---
|
||||
|
||||
Reference in New Issue
Block a user