diff --git a/tests/test_static_vendor.py b/tests/test_static_vendor.py
index 8c037e1..dd277fb 100644
--- a/tests/test_static_vendor.py
+++ b/tests/test_static_vendor.py
@@ -140,6 +140,17 @@ class StaticVendorTests(unittest.TestCase):
self.assertIn(":focus-visible", css)
self.assertIn("@media (max-width: 640px)", css)
+ def test_admin_entry_lives_in_main_conversation_panel(self) -> None:
+ html = DEV_HTML.read_text(encoding="utf-8")
+ header = html.split("", 1)[0]
+ conversation_head = html.split('id="pane-mid"', 1)[1].split(
+ 'id="chat-meta"', 1
+ )[0]
+
+ self.assertNotIn('id="hd-admin"', header)
+ self.assertIn('id="hd-admin"', conversation_head)
+ self.assertIn('href="/static/admin.html"', conversation_head)
+
def test_file_toolbar_keeps_hidden_toggle_and_groups_add_actions(self) -> None:
html = DEV_HTML.read_text(encoding="utf-8")
files_js = (JS_DIR / "files.js").read_text(encoding="utf-8")
diff --git a/web/static/dev.html b/web/static/dev.html
index e1341e1..4da8da4 100644
--- a/web/static/dev.html
+++ b/web/static/dev.html
@@ -1730,14 +1730,12 @@
header .who { display: none; }
header .brand { min-width: 0; flex-shrink: 1; }
header .title { font-size: 14px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
- /* tab 行:order 让 tabs 换行到 header 末行,「管理」(order 更大)跟到 tabs 右侧
- 成小按钮 —— 首行只留 brand + 改密码/退出。flex-basis 70% 是换行开关:
- 首行剩余空间塞不下 70% → tabs 必换行;换行后 70% + 管理(~15%)同行放得下 */
+ /* tab 行换到 header 末行。flex-basis 70% 是换行开关:
+ 首行剩余空间塞不下 70% → tabs 必换行。 */
.mobile-tabs { display: flex; order: 99; flex: 1 1 70%; }
.mobile-tabs button { flex: 1; }
- #hd-admin { order: 100; flex-shrink: 0; padding: 5px 10px; font-size: 12px; }
#hd-chpw, #hd-logout { padding: 4px 8px; font-size: 12px; }
- /* embed(企业微信免登)时 brand/改密码/退出已藏 → tabs +「管理」自然收成单行 */
+ /* embed(企业微信免登)时 brand/改密码/退出已藏 → tabs 自然收成单行 */
body.embed-mode header .spacer { display: none; }
/* 浮层菜单:加大触控目标(桌面 6px 高度在手机上难点准) */
@@ -2132,8 +2130,6 @@
- 管理
@@ -2218,6 +2214,8 @@
对话
+
管理
diff --git a/web/static/js/main.js b/web/static/js/main.js
index ab7afa3..d02a90a 100644
--- a/web/static/js/main.js
+++ b/web/static/js/main.js
@@ -39,7 +39,7 @@ export function enterApp(initialTaskId = "") {
loadModels(); // 模型清单缓存:chat-meta 下拉 + 新建对话框 + 历史小标
loadFolderSuggestions(); // 灌 filter-wd select(modal 打开时会重拉,这里让左 pane 先有选项)
loadStorage(); // 顶栏存储用量(后台扫描快照,非实时)
- loadRole(); // 拉 /v1/me,admin 才显「管理」入口(/static/admin.html)
+ loadRole(); // 拉 /v1/me,admin 才显对话面板的「管理」入口(/static/admin.html)
refreshProcs(); // 后台进程(bg proc):上个会话遗留的 running proc 恢复轮询/展示
initSoftwareJobs();
}
@@ -53,7 +53,7 @@ function renderWho() {
}
// 当前用户身份 + 角色:/v1/me 返 {user_id, role, name, user_name, email}。
-// admin → 显顶栏「管理」链接;并用服务端权威值校准顶栏用户名(platform_key 登录 / 老 token
+// admin → 显对话面板「管理」链接;并用服务端权威值校准顶栏用户名(platform_key 登录 / 老 token
// 升级后,name/user_name 这一刻才到齐)。失败静默(增量功能,拉不到就维持登录时的兜底值)。
async function loadRole() {
const link = $("hd-admin");