From 8474354121b99ddd5dfe1bb769bc953416bac339 Mon Sep 17 00:00:00 2001 From: EMRG Evolution Date: Sat, 22 Aug 2026 09:03:28 +0800 Subject: [PATCH] emrg: fix open-session from panel returning to session view + add GitHub issue path to promotion feedback --- Agent.md | 4 ++-- emrg/gui/renderer/js/app.js | 6 ++++++ emrg/gui/test/renderer.smoke.test.js | 11 +++++++++++ emrg/server/promote_prompt.md | 8 ++++++++ 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/Agent.md b/Agent.md index a837ae8c..31028552 100644 --- a/Agent.md +++ b/Agent.md @@ -85,7 +85,7 @@ Usage: say "tool loop" for the whole process, "round N" for a single LLM request - Streaming chat with delta rendering (16ms batching), markdown on done (marked + DOMPurify + local highlight.js subset), tool call status cards (2000-char truncation + expand) - Session list/switch/new/delete + right-click rename (context menu, #423) synced with daemon; own-stream busy lock (G65); broadcast streams from other clients tagged "来自其他客户端" - Disconnect/reconnect: red status dot, auto daemon respawn (stale-port detection), session resume, input bar restored on disconnect (no 30s fake-timeout) - - Unit tests `npm test` (258: 45 daemon_client + 19 conn-manager + 22 app-commands + 129 renderer smoke + 15 i18n + 8 integration + 3 commands + 8 build-config + 7 gui-state + 2 tool-group); RESPONSE_TYPES mirror daemon protocol verified against `daemon.py` + - Unit tests `npm test` (259: 45 daemon_client + 19 conn-manager + 22 app-commands + 130 renderer smoke + 15 i18n + 8 integration + 3 commands + 8 build-config + 7 gui-state + 2 tool-group); RESPONSE_TYPES mirror daemon protocol verified against `daemon.py` - **Scheduled tasks** — Task generalization + CRUD (rant 2026-08-12T18:23:15, #709/#710/#711) - Task handler generalized: `TaskHandler` (renamed from `EvolutionHandler`), repo-configured self-heal for any project, template lookup builtin → `~/.emrg/task-templates/.md` → fallback - Daemon commands: `task_create/update/delete` + `task_template_create/list/update/delete` (tasks stored in `~/.emrg/tasks.yml`, custom type templates in `~/.emrg/task-templates/`) @@ -119,7 +119,7 @@ pkill -f "emrg.server"; rm -f ~/.emrg/emrgd.token; python -m emrg ``` Python: `uv run pytest tests/ -v` (1003) — import check: `uv run python -c "from emrg.client.app import run_client"` -GUI: `cd emrg/gui && npm test` (258: 45 daemon_client + 19 conn-manager + 22 app-commands + 129 renderer smoke + 15 i18n + 8 integration + 3 commands + 8 build-config + 7 gui-state + 2 tool-group) — syntax: `node --check main.js preload.js daemon_client.js renderer/js/*.js` +GUI: `cd emrg/gui && npm test` (259: 45 daemon_client + 19 conn-manager + 22 app-commands + 130 renderer smoke + 15 i18n + 8 integration + 3 commands + 8 build-config + 7 gui-state + 2 tool-group) — syntax: `node --check main.js preload.js daemon_client.js renderer/js/*.js` CI: `uv run pytest` (ubuntu + **windows-2025 matrix** — Windows pytest 回归在 PR CI 即失败,v0.2.29 教训 #725) + GUI tests + **actionlint workflow lint** (`rhysd/actionlint@v1.7.12` gate, #444 — workflow 解析错误在 PR CI 即失败,如 `if:` secrets 上下文) Re-trigger: `scripts/re-trigger-ci.sh [branch]` (workflow_dispatch, #527 — 替代空 commit 重触发:Actions outage 会整段丢弃 push 事件,dispatch 走 API 路径不受影响) diff --git a/emrg/gui/renderer/js/app.js b/emrg/gui/renderer/js/app.js index e1f318e0..9722417e 100644 --- a/emrg/gui/renderer/js/app.js +++ b/emrg/gui/renderer/js/app.js @@ -668,6 +668,12 @@ const App = (() => { if (sidState(sid).disconnected) { Chat.addSystemMessage(_t("app.sessionDisconnected"), sid); } + // rant 2026-08-22T08:07:47:任务/rant/项目面板点"打开会话"只切 sessionId 不切视图, + // 界面毫无变化。switchSession 成功后若仍在面板视图则切回会话视图(所有入口一致)。 + // 递归/初始化路径用 silent,不会在这里触发重复 switchView。 + if (!opts.silent && state.activeView !== "sessions") { + switchView("sessions"); + } updateEmptyState(); Sidebar.highlight(sid, opts.scopeNav); // rant 22:04:02:点击哪列表只高亮该列表(scopeNav 缺省则两列表) setComposerDisabled(false); // 防御性:独立调用 switchSession 也确保输入框可用 diff --git a/emrg/gui/test/renderer.smoke.test.js b/emrg/gui/test/renderer.smoke.test.js index 7f23b16a..e071ef40 100644 --- a/emrg/gui/test/renderer.smoke.test.js +++ b/emrg/gui/test/renderer.smoke.test.js @@ -2081,6 +2081,17 @@ test("rant 22:04:02: highlight(sid, navEl) 列表作用域 — 只高亮指定 assert.strictEqual(els["open-sessions"].children[0].classList.contains("active"), true, "无 navEl 时 open-sessions 高亮"); }); +test("rant 08:07:47: switchSession 从面板视图调用成功 → 切回会话视图", async () => { + const { ctx } = makeSandbox({ switchSession: async () => ({}) }); + await tick(); + // 模拟任务面板激活 → 点"打开会话" → switchSession + await vm.runInContext('App.state.sessionId = "sess-a"; App.state.sessions = [{ session_id: "sess-a" }]; App.switchView("tasks");', ctx); + assert.strictEqual(vm.runInContext("App.state.activeView", ctx), "tasks", "进入任务面板后 activeView=tasks"); + await vm.runInContext('App.switchSession("sess-a");', ctx); + await tick(); + assert.strictEqual(vm.runInContext("App.state.activeView", ctx), "sessions", "switchSession 成功后 activeView 切回 sessions(界面有响应)"); +}); + test("P4 s2: closeOpenSession 关闭激活会话 → 切到剩余打开会话 + 容器释放", async () => { let closed = null; const { ctx, els } = makeSandbox({ diff --git a/emrg/server/promote_prompt.md b/emrg/server/promote_prompt.md index 6e6a6de7..d64d6439 100644 --- a/emrg/server/promote_prompt.md +++ b/emrg/server/promote_prompt.md @@ -246,6 +246,14 @@ with open(rants_file, "w", encoding="utf-8") as f: - Use `json.dumps(..., ensure_ascii=False)`; no Chinese escaping - Each message notes the source (channel + link) so the evolution task can trace back +**Also file a public GitHub issue on the promoted project** (rant 2026-08-22T08:14:31) — a rant is an internal queue (no issue number, not community-visible); a public issue is transparent, traceable, and lets the community participate. For **valuable feedback** (same table above — feature request / bug report / negative experience / new problem / inspiration): + +1. Open a public issue on the target repo: `gh issue create -R {{ owner }}/{{ repo }} --title "" --body " (source: )"` — English title/body (language policy), body includes the source link for traceability. +2. On success → record the issue number + link in the state file (e.g. `- filed issues: <#N> (, )`), and optionally reference that issue number in the rant entry to avoid the evolution task re-processing the same feedback. +3. Reuse the existing value table for the bar; **do NOT file** for pure praise / unrelated / duplicate / low-information. Do not over-encourage the community: only nudge someone to file an issue themselves if **both** hold (per host 2026-08-22): (a) the discussion already explicitly referenced the promoted project, and (b) you judge them likely willing (engaged / interested / proactively asking). Otherwise **file it yourself** (the `gh issue create` path above) rather than nudging. +4. If the target repo has issues disabled (some open-source projects), degrade to the rants.jsonl path only. +5. The promotion task does not implement these — it only collects (rant + issue) and hands off, consistent with the existing rant handoff semantics. + --- ### 4. State File