From 9545e1166db3a6282c0a7e44a78a2a65023f313a Mon Sep 17 00:00:00 2001 From: huangsen Date: Thu, 8 Oct 2026 21:43:47 +0800 Subject: [PATCH] fix(codex): simplify ReMe status layout and activity --- integrations/codex/README.md | 6 +- integrations/codex/README_ZH.md | 6 +- integrations/codex/figures/README.md | 6 +- .../plugins/reme/.codex-plugin/plugin.json | 2 +- .../codex/plugins/reme/ui/status.html | 133 +++++++++++------- integrations/codex/status-app/src/status.html | 59 ++++---- integrations/codex/status-app/src/status.js | 56 +++++--- .../test_codex_plugin_status_ui.py | 68 ++++++++- 8 files changed, 240 insertions(+), 96 deletions(-) diff --git a/integrations/codex/README.md b/integrations/codex/README.md index 7dcfae82..23578811 100644 --- a/integrations/codex/README.md +++ b/integrations/codex/README.md @@ -129,6 +129,7 @@ Use ReMe memory and include the source path in your answer. Expect Friday at 16:45 UTC, `amber-lynx-7319`, and a source path such as `daily/...md`. To confirm automatic recall, check **Auto Memory → Recent activity** for **Relevant memory recalled** (`recall_found`). A correct answer without that event does not confirm that automatic recall is enabled. +Use **Show all … events** if it is outside the latest five activities. > **Screenshot placeholder — `memory-recalled.png`:** Separate conversation B with the recalled facts and source path. @@ -168,7 +169,10 @@ Open **ReMe status** from MCP settings and choose the tab for what you want to c | Consolidation | When will memories next be organized, and did the last run succeed? | | Components | How much memory is ReMe using? Expand **Service details** when troubleshooting. | -Click **Refresh** for an updated view. If you prefer a text answer, ask Codex: +Click **Refresh** for an updated view. Recent activity initially shows the latest five events. +Expand an event for its full timestamp and diagnostic details; use **Show all … events** to see the available history. + +If you prefer a text answer, ask Codex: “Call `reme_status` and summarize my connection, pending memories, and next consolidation.” > **Screenshot placeholder — `plugin-status.png`:** Real ReMe status panel on Auto Memory, with queued turns and Recent activity expanded to show saved and recalled memories. diff --git a/integrations/codex/README_ZH.md b/integrations/codex/README_ZH.md index df6a963d..1c7e4651 100644 --- a/integrations/codex/README_ZH.md +++ b/integrations/codex/README_ZH.md @@ -125,6 +125,7 @@ ReMe-Example-7319 的评审时间和项目关键词是什么? 预期答复包含每周五 16:45 UTC、`amber-lynx-7319`,以及 `daily/...md` 等来源路径。 要确认自动召回生效,再查看 **自动记忆 → 最近活动** 中的 **已召回相关记忆**(`recall_found`)。 仅答对问题、却没有这条活动记录,不能证明自动召回已开启。 +如果不在最近五条活动中,点击 **查看全部 … 条活动**。 > **截图槽位 — `memory-recalled.png`:** 独立会话 B 中的正确事实和 ReMe 来源路径。 @@ -162,7 +163,10 @@ ReMe-Example-7319 的评审时间和项目关键词是什么? | 记忆整理 | 下次什么时候整理、最近一次是否成功。 | | 组件 | ReMe 的内存用量;排错时可展开 **服务详情**。 | -点击 **刷新** 更新状态。也可以在对话中要求:“调用 `reme_status`,用文字告诉我连接状态、 +点击 **刷新** 更新状态。最近活动默认展示五条;展开单条活动可查看完整时间和诊断信息, +点击 **查看全部 … 条活动** 可浏览其余记录。 + +也可以在对话中要求:“调用 `reme_status`,用文字告诉我连接状态、 待保存记忆和下次整理时间。” > **截图槽位 — `plugin-status.png`:** 真实 ReMe status 面板的自动记忆页签,保留待提交轮数,并展开最近活动展示保存和召回记录。 diff --git a/integrations/codex/figures/README.md b/integrations/codex/figures/README.md index f373bbb6..f173cf51 100644 --- a/integrations/codex/figures/README.md +++ b/integrations/codex/figures/README.md @@ -134,10 +134,12 @@ Use ReMe memory and include the source path in your answer. 确认回答包含 **每周五 16:45 UTC**、**amber-lynx-7319** 和真实的 ReMe 来源路径,例如 `daily/...md`。 再检查最近活动中出现 **已召回相关记忆 / Relevant memory recalled**(`recall_found`)。 +若不在最近五条中,点击 **查看全部 … 条活动 / Show all … events**;点击单条活动可查看事件码和完整时间。 答复正确且自动召回活动已确认后,截取 B 的问题、回答和来源路径,保存为 `memory-recalled.png`。 Expect Friday at 16:45 UTC, `amber-lynx-7319`, and a real ReMe source path. Also confirm Relevant memory recalled -in Recent activity. A correct answer alone does not establish that automatic recall ran. +in Recent activity. Use Show all … events if it is outside the latest five; expand an event for its code and full timestamp. +A correct answer alone does not establish that automatic recall ran. ### 6. 展示状态面板 / Capture the status panel @@ -145,9 +147,11 @@ in Recent activity. A correct answer alone does not establish that automatic rec 等待会话 B 的记录也保存完成、待提交轮数回到 `0`,再截取标题、页签、自动记录与召回状态及本次保存和召回活动, 保存为 `plugin-status.png`。 在最近活动仍保留这两条记录时拍摄,避免继续发送无关测试消息。 +若需要展示的记录不在最近五条中,先点击 **查看全部 … 条活动 / Show all … events**。 Open the real status panel, select Auto Memory, refresh, and expand Recent activity. Capture the tabs, automatic switches, zero pending turns after B is also saved, and the saved/recalled events before unrelated activity replaces them. +Use Show all … events if the needed entries are outside the latest five. 状态面板的总览、自动记忆和记忆整理是不同页签,不需要把所有内容挤到一张图里。 可另拍以下真实页面;没有开启每日计划时,显示暂停或没有计划是有效状态,无需为截图改动计划或执行整理。 diff --git a/integrations/codex/plugins/reme/.codex-plugin/plugin.json b/integrations/codex/plugins/reme/.codex-plugin/plugin.json index 99608b95..c18a883e 100644 --- a/integrations/codex/plugins/reme/.codex-plugin/plugin.json +++ b/integrations/codex/plugins/reme/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "reme", - "version": "0.2.3", + "version": "0.2.4", "description": "Automatic memory, focused recall, runtime status, and consolidation through ReMe MCP.", "author": { "name": "EconML team of Alibaba Tongyi Lab", diff --git a/integrations/codex/plugins/reme/ui/status.html b/integrations/codex/plugins/reme/ui/status.html index 021d8ccc..7621d342 100644 --- a/integrations/codex/plugins/reme/ui/status.html +++ b/integrations/codex/plugins/reme/ui/status.html @@ -11,12 +11,12 @@ :root[data-theme="dark"] { color-scheme: dark; --bg: #0b0d12; --surface: #12151d; --panel: #181c26; --ink: #f3f5f7; --muted: #979dab; --line: #292e3b; --blue: #79a8ff; --green: #63d4a3; --green-bg: #25382f; --amber: #f2be5c; --amber-bg: #3c3526; --red: #ff7b86; --red-bg: #40262c; } :root[data-theme="light"] { color-scheme: light; } * { box-sizing: border-box; } - body { margin: 0; padding: 24px; background: var(--color-background-primary, var(--bg)); color: var(--color-text-primary, var(--ink)); font: 14px/1.6 system-ui, -apple-system, sans-serif; } - main { max-width: 920px; margin: auto; overflow-wrap: anywhere; } - header { display: flex; align-items: start; justify-content: space-between; gap: 20px; margin-bottom: 24px; } + body { margin: 0; padding: clamp(16px, 4vw, 32px); background: var(--color-background-primary, var(--bg)); color: var(--color-text-primary, var(--ink)); font: 14px/1.6 system-ui, -apple-system, sans-serif; } + main { max-width: 880px; margin: auto; overflow-wrap: anywhere; } + header { display: flex; align-items: start; justify-content: space-between; gap: 24px; margin-bottom: 28px; } header > div { min-width: 0; } h1 { font-size: 22px; letter-spacing: -.4px; margin: 0; font-weight: 650; } - h2 { font-size: 15px; margin: 0 0 20px; font-weight: 600; } + h2 { font-size: 15px; line-height: 1.5; margin: 0 0 24px; font-weight: 600; } p { margin: 6px 0; } .muted, small { color: var(--muted); } .label { font-size: 13px; color: var(--muted); } @@ -25,35 +25,44 @@ button:hover:not(:disabled) { border-color: var(--blue); } button:focus-visible, summary:focus-visible { outline: 2px solid var(--blue); outline-offset: 3px; } button:disabled { opacity: .55; cursor: wait; } - .tabs { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 6px; padding: 5px; background: var(--panel); border: 1px solid var(--line); border-radius: 12px; margin-bottom: 24px; } - .tabs button { min-width: 0; color: var(--muted); background: transparent; border-color: transparent; padding: 10px 8px; font-weight: 600; white-space: normal; line-height: 1.4; } - .tabs button[aria-selected="true"] { color: var(--ink); background: var(--surface); border-color: var(--line); box-shadow: 0 1px 3px #0000000a; } - .grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 20px; } - .card { background: var(--surface); border: 1px solid var(--line); border-radius: 12px; padding: 24px; min-width: 0; } + .tabs { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 8px; border-bottom: 1px solid var(--line); margin-bottom: 28px; } + .tabs button { min-width: 0; min-height: 44px; color: var(--muted); background: transparent; border: 0; border-bottom: 2px solid transparent; border-radius: 0; padding: 12px 8px; font-weight: 500; white-space: normal; line-height: 1.4; } + .tabs button[aria-selected="true"] { color: var(--blue); border-bottom-color: var(--blue); font-weight: 600; } + .grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 360px), 1fr)); gap: 24px; align-items: start; } + .card { background: var(--surface); border: 1px solid var(--line); border-radius: 14px; padding: 28px; min-width: 0; } .full { grid-column: 1 / -1; } .value { font-size: 26px; line-height: 1.35; font-weight: 650; margin-top: 8px; } .compact { font-size: 16px; overflow-wrap: anywhere; } - .pill { display: inline-block; color: var(--green); background: var(--green-bg); border-radius: 99px; padding: 4px 10px; font-size: 12px; font-weight: 600; } + .pill { display: inline-block; flex-shrink: 0; color: var(--green); background: var(--green-bg); border-radius: 99px; padding: 4px 10px; font-size: 12px; font-weight: 600; } [data-tone="good"] { color: var(--green); } [data-tone="bad"] { color: var(--red); } .pill[data-tone="neutral"] { color: var(--muted); background: var(--bg); } .pill[data-tone="warn"] { color: var(--amber); background: var(--amber-bg); } .pill[data-tone="bad"] { color: var(--red); background: var(--red-bg); } - .section-heading { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 12px; margin-bottom: 20px; } + .section-heading { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 12px 20px; margin-bottom: 24px; } .section-heading h2 { margin: 0; } .metrics { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 24px; } + .service-metrics { margin-top: 24px; padding-top: 24px; border-top: 1px solid var(--line); } .properties { margin: 0; } - .properties > div { display: flex; align-items: baseline; justify-content: space-between; gap: 24px; padding: 14px 0; border-bottom: 1px solid var(--line); } + .properties > div { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); align-items: baseline; gap: 8px 24px; padding: 16px 0; border-bottom: 1px solid var(--line); } .properties > div:first-child { padding-top: 0; } .properties > div:last-child { padding-bottom: 0; border: 0; } .properties dt { color: var(--muted); } .properties dd { margin: 0; text-align: right; font-weight: 600; min-width: 0; } .rows { padding: 0; margin: 0; list-style: none; } - .rows li { display: flex; justify-content: space-between; align-items: baseline; gap: 20px; padding: 16px 0; border-bottom: 1px solid var(--line); } - .rows li:last-child { border: 0; padding-bottom: 0; } - .rows code { display: block; color: var(--muted); font-size: 11px; } - time { color: var(--muted); font-size: 12px; flex-shrink: 0; max-width: 45%; } - .component-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; } + .rows li { border-bottom: 1px solid var(--line); } + .rows li:last-child { border: 0; } + .rows .activity-entry { margin: 0; } + .activity-entry > summary { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: baseline; gap: 8px 20px; padding: 16px 0; color: var(--ink); list-style: none; } + .activity-entry > summary::-webkit-details-marker { display: none; } + .activity-title { display: flex; align-items: baseline; gap: 10px; min-width: 0; } + .activity-title::before { content: "▸"; color: var(--muted); flex-shrink: 0; } + .activity-entry[open] .activity-title::before { content: "▾"; } + .activity-entry[open] > summary { margin-bottom: 0; } + .activity-meta { display: block; color: var(--muted); font-size: 12px; margin: 0 0 16px 20px; } + time { color: var(--muted); font-size: 12px; } + #activity-more { margin-top: 16px; } + .component-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 260px), 1fr)); gap: 16px; } .component { border: 1px solid var(--line); background: var(--panel); padding: 18px; border-radius: 9px; min-width: 0; } .component strong { display: block; overflow-wrap: anywhere; font-size: 13px; } details { margin-top: 20px; } @@ -65,9 +74,9 @@ .note { margin: 20px 0 0; font-size: 13px; color: var(--muted); } #error { border: 1px solid var(--red); color: var(--red); padding: 12px; border-radius: 8px; margin-bottom: 16px; } [hidden] { display: none !important; } - @media (max-width: 700px) { .tabs { grid-template-columns: repeat(2, minmax(0, 1fr)); } } - @media (max-width: 640px) { body { padding: 16px; } .grid, .component-grid { grid-template-columns: 1fr; } .card { padding: 20px; } header { gap: 12px; } .rows li { flex-direction: column; gap: 6px; } time { max-width: 100%; } } - @media (max-width: 380px) { .metrics { grid-template-columns: 1fr; gap: 16px; } .metrics > div { display: flex; align-items: baseline; justify-content: space-between; gap: 16px; } .metrics .value { margin: 0; } } + @media (max-width: 600px) { .card { padding: 24px; } header { gap: 16px; } .activity-entry > summary { grid-template-columns: 1fr; gap: 4px; } .activity-entry time { padding-left: 20px; } } + @media (max-width: 560px) { .tabs { grid-template-columns: repeat(2, minmax(0, 1fr)); } } + @media (max-width: 380px) { .card { padding: 20px; } .properties > div { grid-template-columns: 1fr; gap: 4px; } .properties dd { text-align: left; } .metrics { grid-template-columns: 1fr; gap: 16px; } .metrics > div { display: flex; align-items: baseline; justify-content: space-between; gap: 16px; } .metrics .value { margin: 0; } } @@ -90,12 +99,12 @@

ReMe service

+
+
Queued turns
+
Queued sessions
+
Connection details

-
-
Queued turns
-
Queued sessions
-