list_panel_state now emits bridge → extras (conductor + scheduler) → IM,
giving conductor a friendly 指挥家 / Conductor label and grouping system
services together at the top of the panel.
Old '自主探索' (auto-explore) was just a browse+summarize prompt, unrelated
to the framework's reflect/autonomous.py module. Teacher requested a real
trigger for autonomous mode — same behavior as the 30-min idle reflect cron
but user-initiated via preset click.
- BUILTIN_PRESETS: key 'explore' → 'autonomous', icon 'compass' → 'gridFour'
- i18n rename (zh + en):
preset.explore.* → preset.autonomous.* ('自主行动' / 'Autonomous mode')
presetPrompt.explore → presetPrompt.autonomous
- New prompt points at memory/autonomous_operation_sop.md so the agent
reads the same SOP that reflect/autonomous.py uses. Mirror of the cron
trigger '[AUTO]🤖 用户已经离开...' but framed as user-initiated.
- Side effect: users who had 'explore' hidden in localStorage will see the
new '自主行动' card show up by default. Acceptable for a feature change.
Cache buster: app.js 189 → 190.
UI cleanup wave:
Chat status indicator:
- Move .run-state ('服务在线' chip) back from sidebar foot to chat page-top
(reverts the PR #1538e1670 relocation only; other PR #15 changes kept)
- Restore .foot-ver version label block in sidebar foot
- Restore .page > .page-top .run-state grid positioning rule
- Drop all .foot-status CSS + i18n + breathing-dot selectors
- .run-state height switched to var(--shell-head-h) so it sits flush with
the 28px topbar grid (no more 2px overshoot)
Send button:
- .send background var(--accent) → var(--ink-green) (#1f6f53), hover →
var(--ink-green-hover) (#175a44). Two new CSS vars introduced in :root
to avoid hardcoded colors per project convention.
- Stop-state (.send.is-stop) still uses var(--danger) — no change
New preset card ('找点事做'):
- Adds BUILTIN_PRESETS entry between review and mine using phosphor robot
icon. Sends the same fixed prompt as stapp.py's autonomous-action button:
按照自主行动的规划部分,充分分析我的情况,给我生成一批 TODO,务必让我感兴趣。
- New i18n keys: preset.findwork.t/d + presetPrompt.findwork (zh + en)
Token pager arrows:
- Replace Unicode '‹' '›' with phosphor caretLeft/caretRight SVGs (12×12,
muted2 → txt-2 on hover), matching the sidebar .chev style
- Drop the font-size 20px + padding-bottom workaround that tried to
visually center the Unicode characters
Real mykey.py configs with many providers + IM tokens + Langfuse + heavy
comments easily exceed 20000 chars. 1M ceiling effectively removes the
limit for any realistic config while still preventing accidental
multi-megabyte paste from misbehaving content.
Trend chart removed from this release:
- index.html: drop the entire tok-chart-wrap block (toggle button + chart)
- app.js: drop renderTokChart() function, tokChartEl/tokChartToggle/tokChartWrap
const+listener, all conditional display branches in tab switching and
loadTokenPage, and the tok.chartToggle i18n key (zh + en)
- styles.css: drop .tok-chart-wrap, .tok-chart-toggle, .tok-chart rules
Token table paginator no longer dumps every page button:
- New renderTokPager() builds first / last / current ± 2 / ellipsis / prev /
next, capped at ~9 DOM nodes regardless of total pages. 1000 pages and
10 pages render the same shape, no more flex row overflow.
- Add .tok-pager-gap style for ellipsis spans, :disabled style for endpoint
arrows, and flex-wrap:wrap fallback on .tok-pager.
Cache busters: styles.css 153→154, app.js 186→187.
Conductor used to be a separately-launched service that opens its own UI
in the user's browser. With the desktop app, users access conductor via
the built-in 「指挥家」 page connecting to port 8900, so the standalone UI
window is redundant and confusing.
- conductor.py: gain a --no-browser flag that skips the webbrowser.open
call. Default behavior (no flag) unchanged for backward compat with
start_conductor.ps1 / GAConductor scheduled task / manual python runs.
- desktop_bridge.py discover_extra_services: also enumerate conductor.py
alongside scheduler.py, with --no-browser baked into the spawn cmd.
autostart_extras then picks it up automatically on bridge boot.
- Introduce --divider-base and --divider CSS custom properties
- Light themed: rgba(15,74,133,0.22) blended with accent
- Dark mode: #569cd6 base
- Right panel now has visible border-left: 1px solid var(--divider)
- Resize handle narrowed to 6px with -3px margin for better grab UX
- Add #cdb-model-chip .model-name to monospace selector
- Replace all inline <svg> in index.html with data-ga-icon attributes
- Add 7 new phosphor icons: crosshair, compass, gitFork, hexagon, fileText, star, liFork
- Preset cards in app.js now use GA_ICON() getter instead of raw SVG strings
- Bump cache-bust: phosphor-icons.js?v=2, app.js?v=186
- Unify Chinese naming to 指挥家 (remove English 'Conductor' from user-facing copy)
- Remove hardcoded port 8900 from error messages
- Status labels: 就绪→服务在线, 运行中→处理中, 未连接→服务离线, 空闲→待命
- collab.offline: simplified to generic guidance (no tunnel mention)
- Add Chinese err.bridge: 服务未响应
Drop the var(--line-soft) gray background — too dim against the topbar.
Match .preset-restore button styling:
- background: var(--card) (clean white panel)
- border: var(--line)
- hover: bg var(--hover-2), color + border become var(--accent)
styles.css?v=152→153.
The previous collab page showed a wide banner with the long offline message
plus a "重试" chip button across the top, which looked clunky. Move both
into the existing page-top status bar:
- Drop .collab-offline and .collab-reconnect <div> banners entirely
(HTML, CSS rules, and JS show/hide logic).
- Wrap .run-state and a new .collab-retry-btn in a .page-top-center flex
container (grid-column:2 of the page-top grid).
- Topbar text replaces "未连接" with the new collab.offlineShort string
("无法连接 Conductor(8900)" / "Cannot reach Conductor (8900)") via
collabStatus.set(longer, 'offline').
- The retry button is a 24×24 button styled like .new-conv (var(--line-soft)
bg + 1px border + 4px radius, hover var(--hover-2)), holding a 14×14
inline SVG refresh-cw icon. Hidden by default, shown only when offline
AND no auto-reconnect is in progress.
- setConnUi simplified to just toggle the retry icon's [hidden] attribute.
- Existing click handler on #collab-retry preserved (id unchanged).
- Consolidate font stack: remove GA Lexend/Noto Sans, use system sans (SF Pro/Segoe UI)
- Reduce CSS font variables from 6 to 3 (--font-sans, --font-mono, --font-brand)
- Converge font-weights to match reference spec (700→600 headings, 600→500 labels)
- Add explicit font-family to pre/code blocks
- Compact nav-item: 28px height, 8px padding, 16px icons
- Remove 'token' from all UI copy, simplify to 'Usage'/'用量'
- Add cache-buster to fonts.css link
Sidebar:
- 快速接入官方模型 header restyled to match 配置 button (foot-row style:
transparent bg, padding, hover state, lightning icon on left,
caretRight chevron on right that rotates 90deg when expanded).
- Drop the "填好 API Key 即可使用" subtitle for single-line consistency.
- Drop the "展开/折叠" tooltip on the head.
- Bump both .pq-head and .foot-row padding to 14px so the buttons look
substantial.
- Set .sidebar-foot margin-top:6px to match .provider-quickstart's internal
gap:6px — uniform 6px rhythm between pq-head→DeepSeek→Qwen→配置.
Services page:
- Remove the "IM 消息通道与后台进程,集中查看、启停与日志" subtitle.
- Align .svc-tabs margin with .tok-tabs (margin:10px 0 0) so the title
position and tab bar position match the Token usage page.
Token page (i18n):
- zh: "Conductor" → "指挥家" on tab label, total/current row labels,
tooltip, and the new tok.condOffline string (replaces hard-coded text).
- en remains "Conductor" (English UI keeps the English name).
Token table column widths:
- Switch to table-layout:fixed. Number columns 80px each, cache-rate 85px.
- First column (session name) gets the rest of the width; overflow truncates
with ellipsis. JS adds title="<full name>" so hover shows the complete
session title as a tooltip. No more column-width jitter when switching
Chat/指挥家 tabs.
Color tweaks (no hardcoded values):
- .pq-btn background var(--bg-base) → var(--field-bg) (lighter).
- .model-guide border var(--accent) → var(--line-base); background
var(--accent-bg) → var(--field-bg) (lighter, neutral).
Trend chart fix:
- SVG had preserveAspectRatio="none" which stretched the viewBox 600x260
non-uniformly to the container (max-width 760 x height 280), making text
~15% wider than tall ("扁").
- Switch to preserveAspectRatio="xMidYMid meet" so text renders at correct
aspect, and replace fixed container height with aspect-ratio:600/260 +
min-height:280px so chart fills naturally without distortion.
Color theme cleanup (user-requested):
- Drop 8-color mac-style palette, keep only a single gray light theme.
- --accent now hard-coded gray (#8e8e93); removed --swatch-2..8 and all
html[data-theme="N"] / .swatch[data-theme="N"] CSS rules.
- Remove the entire "颜色" (set.theme) block from settings page.
- applyTheme() stubbed: still callable for backward compat with stored
ga_theme values, but always normalizes to theme '1'.
- Drop set.theme i18n entries (zh + en).
Cache busters: styles.css 136→137, app.js 181→182.
Post-merge ljq's "reuse draftEl, update in-place on done" optimization relied
on partial stream having delivered the complete content by the time the done
signal arrives. Over the frp tunnel (~80-300ms RTT), the bridge can flip to
idle before the last partial chunk reaches the browser, leaving the bubble
with truncated content from the partial accumulation.
Replace both turn_segs and no-turn_segs branches with a single in-place rebuild
that takes the final m as canonical source:
- assistantTurnSegs(m) handles both turn_segs and content fallback (same as
the refresh path through msgNode)
- bubble.innerHTML = renderAssistantTurnsHtml(...) + postRenderEnhance for
code highlighting and other post-render hooks
- sync r.draftSegs/draftTurn/streamTurn/twState so later cursor/badge/copy
logic reads consistent state
Keeps ljq's no-flicker bubble reuse; same DOM element survives, only its
innerHTML gets replaced by the canonical full content. Local low-latency
behavior unchanged.
lsdefine/main b365945 had independently landed the same makedirs fix
I added in ac2779d, but at module top-level and creating DONE/ instead
of dirname(_LOG).
Functionally equivalent (both unblock fresh-deploy scheduler import), but
to keep this fork aligned with upstream we adopt lsdefine's version
verbatim. After future content-overlay syncs from upstream, no diff in
this file.
lsdefine/main b365945 had independently landed the same makedirs fix
I added in ac2779d, but at module top-level and creating DONE/ instead
of dirname(_LOG).
Functionally equivalent (both unblock fresh-deploy scheduler import), but
to keep this fork aligned with upstream we adopt lsdefine's version
verbatim. After future content-overlay syncs from upstream, no diff in
this file.