Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
342 commits
Select commit Hold shift + click to select a range
8f7dfeb
feat(desktop): inline attachment chips in messages + fix conductor ra…
dd3xp May 27, 2026
d8cea4b
chore: gitignore local BUG_*.md bug/limitation drafts
dd3xp May 27, 2026
58764c3
feat(frontend): add input length limits to all text fields
HYC-hsy May 27, 2026
e245668
Merge pull request #4 from dd3xp/feat/input-length-limits
dd3xp May 28, 2026
73fbb2a
feat(desktop): preset/composer/topbar restructure + conductor persist…
dd3xp May 28, 2026
c164a57
fix(desktop): token stats title fallback when sess.title is empty
yiqi-017 May 29, 2026
213873c
feat(desktop): conductor token stats summary row in token page
yiqi-017 May 29, 2026
390584d
fix(desktop): skip token delta recording while session is busy
yiqi-017 May 29, 2026
52fb037
feat(desktop): persist conductor token stats via bridge file storage
yiqi-017 May 29, 2026
6744d8b
fix(desktop): update model pricing + add pricing disclaimer
yiqi-017 May 29, 2026
9951f82
fix(desktop): conductor token accumulation loop on refresh
yiqi-017 May 29, 2026
22fa601
Conductor美化
LLYYXX May 30, 2026
443d2ab
Merge pull request #6 from dd3xp/Conductor前端优化
dd3xp May 30, 2026
4544d34
style(desktop): use conductor SVG icon in token stats rows
yiqi-017 May 30, 2026
a852a9c
chore(desktop): remove preset entry from conductor + menu (preset is …
dd3xp Jun 1, 2026
63fdd2b
feat(desktop): token stats tab bar separating chat and conductor
yiqi-017 Jun 1, 2026
61421df
feat: merge channels and status into one services page
weaselkns Jun 1, 2026
537e74d
i18n(desktop): localize conductor token stats and pricing disclaimer
yiqi-017 Jun 1, 2026
540376d
feat(desktop): add collapsible daily cost trend chart to token stats
yiqi-017 Jun 1, 2026
1fbf994
Merge PR #7: feat: merge channels and status into one services page
dd3xp Jun 1, 2026
9a9624e
feat(desktop): nav reorder + taller trend chart + token tabs use svc …
dd3xp Jun 1, 2026
5226c1a
chore(desktop): bump styles.css?v=93→94 to flush stale CSS cache
dd3xp Jun 1, 2026
927b445
Merge main into RoundSquisheen: catch up with PR#7 services tabs + 3 …
dd3xp Jun 1, 2026
04c6855
feat(desktop): per-page top bar with caret toggles + drop annotation …
dd3xp Jun 1, 2026
bd9c778
Merge RoundSquisheen: per-page top bar + annotation scaffold dropped
dd3xp Jun 1, 2026
4aca517
refactor(desktop): centralize bridge/conductor port + URL into constants
dd3xp Jun 2, 2026
28c8956
Merge RoundSquisheen: centralize bridge/conductor port constants
dd3xp Jun 2, 2026
5084924
fix(desktop): CONDUCTOR_ORIGIN follows location.protocol (not hardcod…
dd3xp Jun 2, 2026
fba63a8
Merge RoundSquisheen: CONDUCTOR_ORIGIN follows location.protocol
dd3xp Jun 2, 2026
22ae4e0
fix(desktop): bridge WS auto-reconnect + visibilitychange handler
dd3xp Jun 3, 2026
44b30e6
Merge RoundSquisheen: bridge WS auto-reconnect
dd3xp Jun 3, 2026
3b7ab5e
fix(desktop): pollSession retries with backoff before giving up
dd3xp Jun 3, 2026
127424e
Merge RoundSquisheen: pollSession backoff retry
dd3xp Jun 3, 2026
213aa0e
style(desktop): lighten dark appearance one step on GitHub Primer scale
LLYYXX Jun 4, 2026
17d9815
流式未收口的工具块先折进「输出中」折叠不再乱闪,并修稳工具假围栏误截、工具结果误拆成多个空折叠、刷新重播打字机、滚代码块弹回和难点展开。
LLYYXX Jun 4, 2026
3b923ff
feat(desktop): Plan 模式 todo 卡片初版
LLYYXX Jun 4, 2026
7d63de0
feat(desktop): Conductor 呼吸灯与进度 rail/drawer 状态优化
LLYYXX Jun 4, 2026
3c871ca
1. 聊天框和Conductor对齐
LLYYXX Jun 4, 2026
e018a97
fix(desktop): 打字机步长自适应 + 修复 details 自冻结循环
yiqi-017 Jun 4, 2026
6b409a9
merge: 冲突以远程为准,试远程打字机自适应
LLYYXX Jun 4, 2026
4f8c699
fix: 合并后以远程流式为准,修复自动合并损坏并接 composer DOM
LLYYXX Jun 4, 2026
4d54332
fix(desktop): Plan 与 TUI 对齐,按会话绑定且不因预设文案误激活
LLYYXX Jun 4, 2026
45c9388
fix(desktop): Plan 条稳定显示,对齐 TUI grace 与按会话 cwd 解析
LLYYXX Jun 4, 2026
a554973
fix(desktop): Plan 按会话绑定 plan_path,修复完成态与跨会话串扰
LLYYXX Jun 4, 2026
ff92f54
fix(desktop): Plan 完成态立即用最新 items 刷新卡片
LLYYXX Jun 4, 2026
c00899c
优化plan card视觉
LLYYXX Jun 4, 2026
f9cd288
feat(desktop): 三栏布局对齐与会话加载态
LLYYXX Jun 4, 2026
10d97cb
feat(desktop): 统一聊天与 Conductor 对话布局并复用 composer
LLYYXX Jun 4, 2026
2a6bf0d
Merge pull request #10 from dd3xp/feat/plan_card
yiqi-017 Jun 5, 2026
88c6289
[update]:修改文件上传大小至500MB
yiqi-017 Jun 5, 2026
439a5ef
feat(desktop): bridge auto-starts non-IM services on boot (L4 cron)
dd3xp Jun 5, 2026
3733505
Merge RoundSquisheen: bridge auto-starts L4 scheduler
dd3xp Jun 5, 2026
ac2779d
fix(reflect/scheduler): ensure sche_tasks/ exists before opening log …
dd3xp Jun 5, 2026
02b3d67
Merge RoundSquisheen: scheduler.py mkdir before log open
dd3xp Jun 5, 2026
5188720
[FIX]:估算价格改成缓存率
yiqi-017 Jun 6, 2026
fa18a73
fix: 持久化 llm_history 修复重启后模型幻觉工具调用
yiqi-017 Jun 6, 2026
e98d4f1
fix(reflect/scheduler): switch to lsdefine's mkdir fix (drop my variant)
dd3xp Jun 6, 2026
f3a8a0c
fix(reflect/scheduler): switch to lsdefine's mkdir fix (drop my variant)
dd3xp Jun 6, 2026
7803cdf
Merge branch 'main' into feat/desktop-ui
LLYYXX Jun 6, 2026
91a58fe
fix(desktop): 会话 loading 与 hydrate 生命周期分离
LLYYXX Jun 6, 2026
ee3fa89
fix(desktop): hydrate 用 limit=0 拉全量历史
LLYYXX Jun 6, 2026
47998b1
fix(desktop): 流式结束后 tool call 不再被 openIdx 误保持展开
LLYYXX Jun 6, 2026
7ea3b7f
fix(desktop): 轮次标题单行显示,避免窄栏折行
LLYYXX Jun 6, 2026
6994ccb
Merge main into RoundSquisheen: catch up team's commits (llm_history …
dd3xp Jun 6, 2026
ba46e37
chore: sync framework to upstream lsdefine/GenericAgent @ b365945
dd3xp Jun 6, 2026
b63b305
Merge RoundSquisheen: sync to lsdefine b365945
dd3xp Jun 6, 2026
fc21f1f
style(desktop): Conductor 分工进度抽屉更紧凑
LLYYXX Jun 6, 2026
c9135cc
Merge remote-tracking branch 'origin/main' into feat/desktop-ui
LLYYXX Jun 7, 2026
3418ed2
feat: turn_segs 结构化渲染,支持按轮独立渲染与模型切换
yiqi-017 Jun 6, 2026
5864d47
适配流式渲染
LLYYXX Jun 8, 2026
4e280ba
Merge pull request #12 from dd3xp/ljq_turn_segs
dd3xp Jun 10, 2026
f32760b
fix(desktop): rebuild assistant bubble from final m on done to avoid …
dd3xp Jun 10, 2026
8d035c3
fix: 修复两个侧边栏拖动延迟(拖拽时禁用transition)
yiqi-017 Jun 11, 2026
2a048c4
fix(desktop): 切换会话后恢复「已运行 Xs」elapsed badge
yiqi-017 Jun 11, 2026
4456c64
fix(desktop): onBridgeReady 无条件刷新状态条
yiqi-017 Jun 11, 2026
110a968
feat(desktop): 侧边栏新增 DeepSeek/Qwen 官方 API 快速接入入口与指引
weaselkns Jun 12, 2026
598fa94
feat(desktop): 快速接入卡片支持折叠,并改用 DeepSeek/Qwen 官方 logo
weaselkns Jun 12, 2026
d00d456
style(desktop): 快速接入卡片改用中性白/浅灰配色,去除主题色调
weaselkns Jun 12, 2026
d88955d
fix(desktop): 修复首次打开状态栏卡在「连接中」
weaselkns Jun 12, 2026
dc873cd
Merge pull request #13 from dd3xp/feat/official-api-quickstart
weaselkns Jun 12, 2026
82442ce
Add desktop release test materials
nianyucatfish Jun 16, 2026
c6772c4
Revert "Add desktop release test materials"
nianyucatfish Jun 16, 2026
2c40aa1
Add Windows desktop test release workflow
nianyucatfish Jun 16, 2026
6c0abe4
Fix Windows workflow npm install without lockfile
nianyucatfish Jun 16, 2026
e364192
Publish Windows portable desktop executable
nianyucatfish Jun 16, 2026
7a564b1
Add Linux desktop test build workflow
nianyucatfish Jun 16, 2026
d1b7ff6
Trigger Linux test build on test branch
nianyucatfish Jun 16, 2026
480dd14
Update desktop release test flow
nianyucatfish Jun 16, 2026
cbb191c
Make desktop test workflows manual only
nianyucatfish Jun 16, 2026
cf51b71
feat(desktop): fix trend chart text squish + remove color theme picker
dd3xp Jun 16, 2026
3ed85ce
Merge remote-tracking branch 'desktop/main' into RoundSquisheen
dd3xp Jun 16, 2026
85de745
feat(desktop): sidebar + token page UI polish
dd3xp Jun 17, 2026
14d0718
Merge remote-tracking branch 'origin/main' into test
nianyucatfish Jun 17, 2026
28a90b8
feat: typography alignment with system font baseline
Jun 17, 2026
a9ac47a
test linux desktop release package workflow
nianyucatfish Jun 17, 2026
1b3707c
Merge pull request #14 from dd3xp/feat/typography-alignment
dd3xp Jun 17, 2026
5595367
fix linux appimage python bridge env
nianyucatfish Jun 17, 2026
9fdae23
feat(desktop): collab offline UI — replace banner with topbar status …
dd3xp Jun 17, 2026
1104095
feat(desktop): UI polish + custom-task edit & input-limit fixes
nianyucatfish Jun 17, 2026
58ebf8e
style(desktop): collab retry button uses .preset-restore look (white …
dd3xp Jun 17, 2026
bf97393
Merge remote-tracking branch 'origin/main' into test
nianyucatfish Jun 17, 2026
d316ee5
docs(checklist): add desktop testing checklist
dd3xp Jun 17, 2026
bb19410
Merge remote-tracking branch 'origin/main' into test
nianyucatfish Jun 17, 2026
badfbb9
fix(desktop): UI polish, custom-task edit, input-limit fixes
nianyucatfish Jun 17, 2026
87cc985
Merge remote-tracking branch 'origin/main' into test
nianyucatfish Jun 17, 2026
5057d11
style: unify default font size to 13px
Jun 17, 2026
38e1670
refactor: relocate status indicator to sidebar footer
Jun 17, 2026
88db48e
copy: optimize connection status i18n strings
Jun 17, 2026
f78d172
ui: migrate inline SVGs to phosphor icon system
Jun 17, 2026
65e3407
style: add --divider token and refine panel borders
Jun 17, 2026
e7f6cc7
copy: update collab placeholder and preset card icons
Jun 17, 2026
5d855aa
feat(desktop): bridge auto-starts conductor on boot (--no-browser flag)
dd3xp Jun 18, 2026
e367fc8
Merge pull request #15 from dd3xp/feat/typography-alignment
dd3xp Jun 18, 2026
198d2e3
Merge remote-tracking branch 'origin/main' into test
nianyucatfish Jun 18, 2026
96beab1
feat(desktop): drop trend chart + windowed pagination for token table
dd3xp Jun 18, 2026
619357a
fix(desktop): bump mykey config editor max length 20000 → 1000000
dd3xp Jun 18, 2026
e5eefa8
feat(desktop): chat status restored to topbar + send btn ink-green + …
dd3xp Jun 18, 2026
4c684b7
feat(desktop): replace 自主探索 preset with 自主行动 (reflect SOP trigger)
dd3xp Jun 18, 2026
7cab306
Merge remote-tracking branch 'origin/main' into test
nianyucatfish Jun 18, 2026
8a8dfc2
feat(desktop): self-contained portable bundle (Windows + Linux)
nianyucatfish Jun 18, 2026
31cd50e
fix(ci): match URL-encoded python-build-standalone download url (+ ->…
nianyucatfish Jun 18, 2026
18e7c9e
ci+ui: Windows portable assembly workflow; drop loading sub-text
nianyucatfish Jun 18, 2026
60cc7c9
i18n(desktop): bilingual first-run progress text (zh/en by navigator.…
nianyucatfish Jun 18, 2026
cc2e12e
ci: remove old windows-test-release workflow (superseded by windows-d…
nianyucatfish Jun 18, 2026
e31772e
ci: remove old linux-test-build workflow (superseded by linux-desktop…
nianyucatfish Jun 18, 2026
2e8707e
fix: add macOS portable runtime packaging
Jun 18, 2026
dcdf3a7
ci(macos): drop npm cache and use npm install to match win/linux
yiqi-017 Jun 18, 2026
8dadfbc
ci(macos): authenticate python-build-standalone API call to avoid 403…
yiqi-017 Jun 18, 2026
03abf3e
ci(macos): fix 'app is damaged' — preserve signature, add unquarantin…
yiqi-017 Jun 18, 2026
6a6daa9
fix: use bundled venv python for desktop bridge
Jun 18, 2026
6ddd820
fix: prepare macos portable venv correctly
Jun 18, 2026
8211a09
fix(desktop): don't trust stale settings from inside macOS .app bundle
yiqi-017 Jun 18, 2026
294662c
assets(desktop): replace app/exe icon with new GA logo
nianyucatfish Jun 18, 2026
353f32a
style(desktop): tidy conductor token tab — auto table layout + 1em icon
yiqi-017 Jun 18, 2026
20a442d
fix(desktop): 单实例服务生命周期 — 端口占用拒绝启动与退出清理
LLYYXX Jun 18, 2026
dd3e685
Merge branch 'test' into fix/service-process-lifecycle
LLYYXX Jun 18, 2026
b3582e9
style(desktop): remove pricing disclaimer from token page
yiqi-017 Jun 18, 2026
0fa9d5c
fix(desktop): add standard line-clamp alongside -webkit prefix in .fc-d
dd3xp Jun 18, 2026
def5090
fix(desktop): show port_busy when bridge spawn fails on occupied ports
LLYYXX Jun 18, 2026
80cfeee
fix(linux): GAPROGRESS|venv polluted ensure_venv's captured python path
nianyucatfish Jun 18, 2026
4c4d228
fix(desktop): dispatch WebView UI updates on main thread (Windows)
LLYYXX Jun 18, 2026
79089d7
fix(desktop): lifecycle without bridge reuse; show port_busy reliably
LLYYXX Jun 18, 2026
90e64b2
fix(desktop): clear AppImage-injected PYTHONHOME/PYTHONPATH/LD_LIBRAR…
nianyucatfish Jun 18, 2026
cc56009
Merge branch 'test' into fix/service-process-lifecycle
LLYYXX Jun 18, 2026
25a10de
fix(desktop): clone AppHandle before run_on_main_thread closures
LLYYXX Jun 18, 2026
7fba733
fix(desktop): use separate AppHandle clone inside main-thread closures
LLYYXX Jun 18, 2026
d4b7760
fix(desktop): revert run_on_main_thread UI dispatch (restore buildabl…
LLYYXX Jun 18, 2026
2638a20
fix(desktop): dispatch UI on main thread via app.clone().run_on_main_…
LLYYXX Jun 18, 2026
5001e4d
fix(desktop): avoid run_on_main_thread in setup; restore test UI calls
LLYYXX Jun 18, 2026
111d72b
feat(conductor): follow desktop-selected model live + build on test_yiqi
yiqi-017 Jun 18, 2026
ab58fee
feat(desktop): auto start/stop conductor and scheduler
LLYYXX Jun 18, 2026
dce5dce
fix(desktop): block on port-busy MessageBox until extras ports clear
LLYYXX Jun 18, 2026
59c62de
Merge remote-tracking branch 'origin/test' into fix/service-process-l…
LLYYXX Jun 18, 2026
832b736
fix(desktop): restore loading-page alert for port-busy flow
LLYYXX Jun 18, 2026
e4ab833
Merge remote-tracking branch 'origin/main' into test
nianyucatfish Jun 18, 2026
8ed886a
feat(desktop): add conductor to status panel; group system services a…
dd3xp Jun 18, 2026
c262ecb
refactor(bridge): compact list_panel_state extras-first ordering into…
dd3xp Jun 18, 2026
d8531d8
ci(macos): bundle bilingual install guides (zh + en) with xattr worka…
yiqi-017 Jun 18, 2026
38a551e
Merge remote-tracking branch 'origin/main' into test
nianyucatfish Jun 18, 2026
4113e05
Merge remote-tracking branch 'origin/test' into fix/service-process-l…
LLYYXX Jun 18, 2026
b187a08
fix(desktop): align app.js cache bust with test after merge
LLYYXX Jun 18, 2026
0a2763e
ci: consolidate desktop release into one workflow (portable-only, uni…
nianyucatfish Jun 18, 2026
75c3eba
ci(linux): avoid SIGPIPE write error when listing tarball contents un…
nianyucatfish Jun 18, 2026
df317b1
feat(desktop): relocatable portable — install deps into embedded pyth…
nianyucatfish Jun 18, 2026
7a23ef5
ci: race-safe unified release (retry create until it exists before up…
nianyucatfish Jun 18, 2026
0c37bc7
fix(macos installer): create mykey.py from template on prepare (parit…
nianyucatfish Jun 18, 2026
c22c325
Merge pull request #16 from dd3xp/fix/service-process-lifecycle
nianyucatfish Jun 18, 2026
8c7b2c9
fix(desktop): take over stale/foreign bridge on 14168 (identity hands…
nianyucatfish Jun 18, 2026
2f3d88c
fix(desktop): drop extras port-busy probes that self-detect the bridg…
nianyucatfish Jun 18, 2026
96d60d3
fix(desktop): keep backend persistent on window close (Model A) — don…
nianyucatfish Jun 18, 2026
5b3fc81
Merge pull request #17 from dd3xp/fix/bridge-takeover
nianyucatfish Jun 18, 2026
0a95a59
1. 设置页模型配置下面新增“后台服务管理”按钮,点击后关闭设置弹窗并跳到 后台服务 -> 状态面板
LLYYXX Jun 19, 2026
c1f227d
feat(desktop): settings features, bridge panel fixes, align startup w…
LLYYXX Jun 19, 2026
3790ea9
fix(desktop): invalidate mykey cache on import save
LLYYXX Jun 19, 2026
05e9675
feat(desktop): export model config from settings (frontend-only)
LLYYXX Jun 19, 2026
22b6114
fix(desktop): export model config in WebView2 exe
LLYYXX Jun 19, 2026
032ecfb
fix(desktop): expose tauriInvoke for model config export
LLYYXX Jun 19, 2026
fc930c0
Merge pull request #18 from dd3xp/feat/persistent-bridge-controls
yiqi-017 Jun 21, 2026
54f257c
feat(desktop): auto-create desktop shortcut on first run (Windows)
yiqi-017 Jun 21, 2026
f5a2895
feat(desktop): add portable uninstaller for Windows
yiqi-017 Jun 21, 2026
19b5523
fix(desktop): first-run shortcut prompt + uninstaller folder deletion
yiqi-017 Jun 21, 2026
acf361f
chore(desktop): TEMP diagnostic banner for first-run shortcut prompt
yiqi-017 Jun 21, 2026
b60f353
chore(desktop): remove temp diagnostic banner from shortcut prompt
yiqi-017 Jun 21, 2026
f3a85d1
fix(desktop): uninstaller arg bug + no-cache for bridge static assets
yiqi-017 Jun 21, 2026
a25d30e
Revert no-cache middleware for bridge static assets
yiqi-017 Jun 21, 2026
47e32cc
feat(desktop): maximize main window + uninstall clears WebView2 data
yiqi-017 Jun 21, 2026
5aadd0b
feat(desktop): 渠道组(自动故障转移)模型管理 + 流式开关 + 运行态模型显示
nianyucatfish Jun 21, 2026
206d4ac
Merge origin/test_fast into test: Windows 快捷方式/卸载器/窗口最大化
nianyucatfish Jun 21, 2026
998475b
feat(desktop): Linux/mac 桌面快捷方式 + 便携卸载器(对齐 Windows)
nianyucatfish Jun 21, 2026
0e731fa
fix(desktop): Linux 快捷方式带图标 — .desktop Icon 指向包内 GenericAgent.png
nianyucatfish Jun 21, 2026
2b92f3e
fix(desktop): mac 卸载器 ps 用 -ww 防截断 + 跳过父进程(避免误杀 Terminal)
nianyucatfish Jun 21, 2026
17e3057
fix(desktop): 用 build-id 判别 bridge 归属 + 强制接管,杜绝连到旧 bridge
nianyucatfish Jun 21, 2026
d4950c3
fix(ci): release notes 改用 --notes-file,绕开 macOS runner(bash 3.2)命令替换+…
nianyucatfish Jun 21, 2026
2a9aa02
style(desktop): send button colors + clearer selected model in dropdown
yiqi-017 Jun 22, 2026
4578ec0
style(desktop): drop the accent left bar on selected model dropdown item
yiqi-017 Jun 22, 2026
6d9cf9c
fix(desktop): replace native dialogs and add mac dmg artifact
nianyucatfish Jun 22, 2026
53affbf
feat(desktop): standard macOS DMG and themed confirm dialogs
nianyucatfish Jun 22, 2026
60278d6
chore(release): publish macOS DMG only and update install notes
nianyucatfish Jun 22, 2026
864e7fd
chore(release): add macOS DMG helper and install guide
nianyucatfish Jun 22, 2026
5573ccc
chore(release): use English filenames in packages
nianyucatfish Jun 22, 2026
ca92ef2
chore(release): omit macOS internal checksum asset
nianyucatfish Jun 22, 2026
6bb8325
feat(desktop): merge tested desktop updates without release packaging
nianyucatfish Jun 22, 2026
16dab8b
chore: sync framework to upstream lsdefine/GenericAgent @ c85b59e (ex…
dd3xp Jun 22, 2026
42fa744
chore: sync conductor.py to upstream lsdefine/GenericAgent @ c85b59e
dd3xp Jun 22, 2026
c8e876a
merge: graft lsdefine/GenericAgent main as ancestor for PR
dd3xp Jun 22, 2026
1da889a
merge: reconcile main(lsdefine 70792af) with old desktop/main graft h…
dd3xp Jun 24, 2026
aa58d05
restore: bring back lsdefine's 70792af fix lost in -X theirs merge
dd3xp Jun 24, 2026
9554111
feat(desktop): per-session model binding with backend as source of truth
yiqi-017 Jun 24, 2026
fba3418
refactor(desktop): model switching only via /session/{sid}/model
yiqi-017 Jun 24, 2026
3d28728
fix(desktop): bind conductor model to its own session
nianyucatfish Jun 24, 2026
6a9ef24
fix(desktop): refresh conductor model chip on profile-only reloads
nianyucatfish Jun 26, 2026
3d0d2c3
fix(desktop): restart conductor/scheduler only when actually broken a…
nianyucatfish Jun 26, 2026
e453b21
fix(desktop): conductor reloads mykey per-task even with no bound model
nianyucatfish Jun 26, 2026
19231de
refactor(desktop): move desktop_release/ → frontends/desktop/packaging/
nianyucatfish Jun 26, 2026
62305f2
ci(desktop): bump checkout/setup-node/upload-artifact to v5
nianyucatfish Jun 26, 2026
3500a28
ci(desktop): bump upload-artifact v5 -> v7 (node24)
nianyucatfish Jun 26, 2026
914076d
merge: bring test desktop packaging and model fixes into main
dd3xp Jul 2, 2026
4310c1b
Fix desktop session rename editing
dd3xp Jul 5, 2026
04e160a
Align desktop plan mode activation with TUI
dd3xp Jul 5, 2026
aca6678
Clarify desktop plan collapse labels
dd3xp Jul 5, 2026
26a8b1f
feat(desktop): add import-memory feature in settings
yiqi-017 Jul 5, 2026
8ddda9a
fix(desktop): allow pick_directory command in ACL
yiqi-017 Jul 5, 2026
96f4c22
feat(desktop): clarify import-memory targets the GA root dir
yiqi-017 Jul 5, 2026
85d8c3c
feat(desktop): merge desktop_sessions.json on memory import
yiqi-017 Jul 5, 2026
2f55150
fix(desktop): render sidebar after importing sessions
yiqi-017 Jul 5, 2026
a34193b
Merge branch 'yiqi_memory' into main
yiqi-017 Jul 5, 2026
2d1eb6d
feat(desktop): connect to a separate GA source (thin-shell / design A)
yiqi-017 Jul 5, 2026
e624331
Merge branch 'yiqi_install' into main
yiqi-017 Jul 5, 2026
831f1b7
perf(desktop): store sessions one file each, not one monolithic JSON
yiqi-017 Jul 6, 2026
f7bc21a
Merge branch 'yiqi_sessions_perf' into main
yiqi-017 Jul 6, 2026
1bcb41d
fix(desktop): refine chat ui and persistence
dd3xp Jul 6, 2026
8bb91aa
merge main into RoundSquisheen
dd3xp Jul 6, 2026
dc18c6c
fix(desktop): restore corrupted zh i18n, surface prepare errors, bund…
nianyucatfish Jul 7, 2026
f0a2a32
fix(conductor): push error chat to frontend when LLM call fails
abraxas914 Jul 7, 2026
7ada6a8
Merge pull request #21 from abraxas914/fix/conductor-error-feedback
abraxas914 Jul 7, 2026
7d8e44f
fix(desktop): restore memory/import rpc case lost in merge 8bb91aa
nianyucatfish Jul 7, 2026
9f04537
chore(desktop): bump app.js cache version for memory/import rpc fix
nianyucatfish Jul 7, 2026
972a4e0
Merge fix/desktop-i18n-prepare-error-ucrt into main
nianyucatfish Jul 7, 2026
5ee58fb
fix(desktop): capture installer stderr/stdout tail in prepare errors
nianyucatfish Jul 7, 2026
3c6d887
fix(desktop): statically link MSVC CRT into the Windows exe
nianyucatfish Jul 7, 2026
d2806ed
Merge origin/main into main
dd3xp Jul 7, 2026
84dbfd0
feat(desktop): sync shell desktop files into 本体 on connect
yiqi-017 Jul 7, 2026
5e9d577
docs: mention Windows Defender loopback issue
dd3xp Jul 8, 2026
8743b3f
Merge branch 'yiqi_source_sync' into main
yiqi-017 Jul 9, 2026
2d08c28
Merge origin/main into main
yiqi-017 Jul 9, 2026
4593863
feat(desktop): thin-shell over external core via GA_ROOT (方案三)
yiqi-017 Jul 10, 2026
de22c5c
fix(desktop): accept external core without desktop bridge
nianyucatfish Jul 10, 2026
8a040a3
chore(desktop): drop local shell design note
nianyucatfish Jul 10, 2026
4c9125a
fix(desktop): load conductor IM plugins from external core
nianyucatfish Jul 10, 2026
66d23f0
Merge remote-tracking branch 'upstream/main' into merge-upstream-main…
nianyucatfish Jul 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
716 changes: 716 additions & 0 deletions .github/workflows/desktop-release-package.yml

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions agentmain.py
Original file line number Diff line number Diff line change
Expand Up @@ -241,16 +241,16 @@ def run(self):
histfile = histfile or os.path.join(d, '_history.json')
elif args.func:
infile = args.func; outfile = os.path.splitext(args.func)[0] + '.out.txt'

if histfile and os.path.isfile(histfile): agent.llmclient.backend.history = json.loads(open(histfile, encoding='utf-8').read())

if args.func or args.task:
agent.peer_hint = False
with open(infile, encoding='utf-8') as f: raw = f.read()
while True:
dq = agent.put_task(raw, source='func' if args.func else 'task')
while 'done' not in (item := dq.get(timeout=2200)):
if 'next' in item:
while 'done' not in (item := dq.get(timeout=2200)):
if 'next' in item:
with open(outfile, 'w', encoding='utf-8') as f: f.write(item.get('next', ''))
with open(outfile, 'w', encoding='utf-8') as f: f.write(item['done'] + '\n\n[ROUND END]\n')
if not args.task: break
Expand Down
6 changes: 6 additions & 0 deletions docs/installation.md
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,12 @@ type ga

If it resolves to something unexpected, do not rely on the shortcut. Run GA from the install directory with `python launch.pyw` or `python frontends/tuiapp_v2.py`.

#### Windows Defender blocks local loopback

The desktop app talks to its local bridge over `127.0.0.1` / `localhost`. On some Windows machines, Windows Defender Firewall may block this loopback connection, making the desktop app look like it cannot start or cannot connect to the service.

If this happens, allow `GenericAgent.exe` and the bundled `python.exe` through Windows Defender Firewall, then restart the desktop app.

#### Windows TUI rendering issues

TUI rendering on Windows depends on terminal, font, and `textual` version.
Expand Down
6 changes: 6 additions & 0 deletions docs/installation_zh.md
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,12 @@ type ga

如果解析到意料之外的位置,就不要依赖这个快捷命令。请进入安装目录运行 `python launch.pyw` 或 `python frontends/tuiapp_v2.py`。

#### Windows Defender 拦截本机回环网络

桌面端会通过 `127.0.0.1` / `localhost` 连接本机 bridge 服务。部分 Windows 机器上,Windows Defender 防火墙可能会拦截这个本机回环连接,导致桌面端看起来无法启动,或一直连不上服务。

如果遇到这种情况,请在 Windows Defender 防火墙中允许 `GenericAgent.exe` 和随包的 `python.exe` 通过,然后重启桌面端。

#### Windows 上 TUI 显示异常

TUI 在 Windows 上依赖终端、字体和 `textual` 版本。
Expand Down
92 changes: 73 additions & 19 deletions frontends/conductor.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,24 @@
import os, sys, re, time, json, uuid, queue, asyncio, threading
from dataclasses import dataclass, field
from typing import Dict, Any, Optional, List
from contextlib import asynccontextmanager
from contextlib import asynccontextmanager, suppress

from fastapi import FastAPI, WebSocket, WebSocketDisconnect
from fastapi.responses import FileResponse, PlainTextResponse, JSONResponse
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel

ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
def _resolve_ga_root() -> str:
"""External core dir when launched as the bundle's conductor (design 三).
Prefer GA_ROOT env (set by the desktop bridge), else derive from own location."""
val = (os.environ.get("GA_ROOT", "") or "").strip()
if val:
root = os.path.abspath(os.path.expanduser(val))
if os.path.exists(os.path.join(root, "agentmain.py")):
return root
return os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

ROOT = _resolve_ga_root()
if ROOT not in sys.path: sys.path.insert(0, ROOT)

from agentmain import GenericAgent
Expand All @@ -18,28 +28,60 @@
HTML_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), "conductor.html")


def _desktop_llm_no() -> Optional[int]:
"""Read the model index the user picked in the desktop UI.
Persisted by the bridge at ~/.ga_desktop_settings.json under ui.llmNo.
Returns None when unavailable, so callers keep the agent's default model."""
def _settings_doc() -> dict:
try:
from pathlib import Path
doc = json.loads((Path.home() / ".ga_desktop_settings.json").read_text(encoding="utf-8"))
no = (doc.get("ui") or {}).get("llmNo")
return int(no) if no is not None else None
return doc if isinstance(doc, dict) else {}
except Exception:
return None
return {}


def _apply_desktop_model(agent: "GenericAgent") -> None:
"""Switch a freshly built agent to the desktop-selected model (if any)."""
no = _desktop_llm_no()
if no is None:
def _conductor_llm_no() -> Optional[int]:
"""Read the model index bound to the conductor session.
Falls back to the legacy desktop default ui.llmNo for existing installs."""
doc = _settings_doc()
for section in (doc.get("conductor"), doc.get("ui")):
if isinstance(section, dict) and section.get("llmNo") is not None:
try:
return int(section.get("llmNo"))
except (TypeError, ValueError):
pass
return None


def _client_usable(agent: "GenericAgent") -> bool:
return hasattr(getattr(agent, "llmclient", None), "backend")


def _fallback_usable_model(agent: "GenericAgent") -> None:
for i, client in enumerate(getattr(agent, "llmclients", []) or []):
if not hasattr(client, "backend"):
continue
agent.llm_no = i
agent.llmclient = client
with suppress(Exception):
agent.llmclient.last_tools = ''
return
try:
agent.next_llm(int(no))
except Exception as e:
print(f"[conductor] failed to apply desktop model #{no}: {e}", file=sys.stderr)


def _apply_desktop_model(agent: "GenericAgent") -> None:
"""Make the conductor's session reflect the current desktop config before a task:
switch to its bound model if one is set, otherwise still refresh sessions from
mykey so live key/model edits (e.g. importing keys) take effect without a restart.
next_llm() already reloads internally; the no-bound-model branch must reload too,
or a conductor started on an empty/stale mykey would never pick up imported keys."""
no = _conductor_llm_no()
if no is not None:
try:
agent.next_llm(int(no))
except Exception as e:
print(f"[conductor] failed to apply conductor model #{no}: {e}", file=sys.stderr)
else:
agent.load_llm_sessions() # mtime-guarded; rebuilds only when mykey changed
if not _client_usable(agent):
print("[conductor] selected model is unavailable; falling back to first usable model", file=sys.stderr)
_fallback_usable_model(agent)


def _select_llm(agent: "GenericAgent", llm: Any) -> bool:
Expand Down Expand Up @@ -396,15 +438,27 @@ def _run(self):
_apply_desktop_model(self.agent)
dq = self.agent.put_task(prompt, source="conductor")
self._drain(dq, events)
except Exception as e: print(f"Conductor error: {e}")
except Exception as e:
print(f"Conductor error: {e}")
add_chat(f"⚠ 回复失败:{e}", role="error")

def start(self): threading.Thread(target=self._run, name="conductor-loop", daemon=True).start()


conductor = Conductor()

# ---- IM poller: 探测conductor_im_plugins/下各插件,信号变化→唤醒总管 ----
IM_DIR, IM_COOLDOWN = os.path.join(os.path.dirname(__file__), "conductor_im_plugins"), 300
def _resolve_im_dir() -> str:
# 方案三: conductor.py itself is bundle-owned, but IM plugins are user/environment
# integrations. Prefer the external core's plugins when GA_ROOT points at one; fall back
# to the bundle templates/examples when the external core has no plugin directory.
external = os.path.join(ROOT, "frontends", "conductor_im_plugins")
if os.path.isdir(external):
return external
return os.path.join(os.path.dirname(os.path.abspath(__file__)), "conductor_im_plugins")


IM_DIR, IM_COOLDOWN = _resolve_im_dir(), 300
IM_PROMPTS: Dict[str, str] = {} # source -> 采集prompt(派采集subagent时按需取)

def im_poll_loop():
Expand Down
48 changes: 48 additions & 0 deletions frontends/desktop/packaging/CHECKLIST.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# GenericAgent Desktop 测试 CHECKLIST

---

## 一、聊天页面

- [ ] 发消息能正常收到回复,顶栏状态在「运行中」「就绪」之间切换,中文输入法 Enter 不会误发,超长粘贴会被截断
- [ ] 上传文件、拖拽图片到输入框,能发送且 agent 能识别,流式回复中可中断,悬停消息能复制全文
- [ ] 代码块/数学公式/多轮折叠都正常,长回复(2000 字以上)末尾不丢字
- [ ] 起始页预设卡片可跳转(指挥家)或触发对应模式(Plan / Goal 等),自定义预设可增删且刷新后仍在
- [ ] 切换模型后用量页能记录新模型,设置页调字号后聊天字体实时变,ask_user 弹问题卡能正常答复
- [ ] 切换到一个 300 轮对话以上的 session,确保页面不卡顿

---

## 二、会话列表

- [ ] 新对话能创建,空态文案正常显示,搜索框能按标题过滤
- [ ] 置顶/取消置顶/重命名/删除(激活和非激活分别测),都即时生效且刷新后持久
- [ ] 右栏可拖窄拖宽和整体折叠,跑任务的会话有运行中视觉标识

---

## 三、指挥家

- [ ] 派一个多步骤目标,顶栏状态进入运行中,右侧分工进度出现子任务卡片,任务跑完主区有简报回复

---

## 四、后台服务

- [ ] 确保修改的配置能保存到本地,除此之外都是原有功能,不需要测试

---

## 五、用量

- [ ] 在聊天和指挥家页面发送消息并收到回复,确保聊天和指挥家都能被统计用量,且模型无误
- [ ] 表格列宽固定不跳动,会话名过长用省略号显示且悬停有 tooltip,点击会话行可展开按时间倒序的明细
- [ ] 趋势图折叠展开后不变形,日期范围筛选 + 重置生效,已删除的会话标「此会话已删除」

---

## 六、设置页面(外观 / 字号 / 语言 / 模型管理)

- [ ] 外观浅色/深色切换,浅色下「素色」开关可用,聊天字号 10-20 可调,关弹窗再开后所有设置仍生效
- [ ] 中英文切换后整个 UI 文案跟着变,无中英混杂
- [ ] 模型可添加/编辑/删除,添加弹窗里的 DeepSeek / 通义千问 快速接入会预填地址+协议+模型,用户只需粘贴 API key 就能保存使用
35 changes: 35 additions & 0 deletions frontends/desktop/packaging/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# packaging

桌面端发布相关材料。本目录的内容**不会**整体打进发布包——CI
(`.github/workflows/desktop-release-package.yml`)只从这里挑选 `scripts/` 下的
安装/卸载脚本拷进各平台的发布产物,其余文件对构建打包过程是只读参考。

## 目录结构

```
frontends/desktop/packaging/
├── README.md # 本说明
├── CHECKLIST.md # 发布前功能测试清单(测试协调用,不参与打包)
├── TODO.md # 各平台测试分工与计划(测试协调用,不参与打包)
└── scripts/ # ← 唯一被 CI 消费的内容
├── windows/
│ ├── install_windows.ps1 # 环境准备脚本
│ ├── uninstall.bat # 卸载入口(向用户确认后调用 ps1)
│ └── uninstall_windows.ps1
├── linux/
│ ├── install_linux.sh
│ └── uninstall.sh
└── macos/
├── install_macos.sh
└── uninstall.command
```

## CI 如何使用这些脚本

`desktop-release-package.yml` 在打各平台 portable 包时,把对应平台的脚本
`cp` 进发布目录(例如 Windows 包里放 `install_windows.ps1` /
`uninstall.bat` / `uninstall_windows.ps1`)。**修改安装/卸载行为只需改
`scripts/` 下的文件,不需要动 workflow。**

> 说明:实际的桌面壳二进制(`GenericAgent.exe` / `.AppImage` / `.app`)由 CI
> 构建生成并发布到 GitHub Release,不在本仓库内提交,也不在本目录占位。
85 changes: 85 additions & 0 deletions frontends/desktop/packaging/TODO.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
# GenericAgent Desktop 测试 TODO

## 目标

目前打算采用 git action 构建发布版,本轮测试主要关注三个结果:

1. 测试者优先验证已有 Release 产物是否能在目标系统运行。
2. 若 Release 产物不可用,再记录失败原因,并考虑本地构建或调整 GitHub Action 构建方法。
3. Release 产物能启动后,再做核心功能兼容性测试。

---

## 系统覆盖

重点测试 Windows 和 Linux;

| 优先级 | 系统 | 架构/版本 | 测试员 | 状态 | 备注 |
|---|---|---|---|---|---|
| P0 | Windows 11 | x64 | 无 | 开发过程中已测试 | 当前最优先 Windows 环境 |
| P0 | Windows 10 | x64 | 杨航 | TODO | 常见 Windows 环境 |
| P0 | Ubuntu 24.04 LTS | x64 | 张景铭 | TODO | 当前常见 Linux LTS |
| P0 | Ubuntu 22.04 LTS | x64 | 张景铭 | TODO | 仍然常见的 Linux LTS |
| P1 | Debian 12 | x64 | 曹兮 | TODO | 可选,覆盖 Debian 系 |
| Owner | macOS | Apple Silicon 或 Intel | 杨航 | TODO | |


---

## 每个系统需要完成的任务

### 任务 1:下载并验证已有 Release 产物

测试员优先使用已有 Release,不要求先在本机生成程序壳。

当前测试 Release:

```text
https://github.com/dd3xp/GenericAgent_Desktop/releases/tag/desktop-windows-test-3-1
```

当前资产命名:

```text
GenericAgent-Desktop-Windows.exe
GenericAgent-Desktop-Linux.AppImage
SHA256SUMS.txt
```

测试步骤:

1. 下载对应系统的 Release 产物和 `SHA256SUMS.txt`;
2. 启动环境配置脚本
3. 运行程序壳;
4. 记录是否能打开主界面、是否能连上本地 bridge/后端;

环境配置脚本 Windows 可参考:

```powershell
# 在仓库根目录执行
.\frontends\desktop\packaging\scripts\windows\install_windows.ps1
```

环境配置脚本 Linux 可参考:

```bash
chmod +x frontends/desktop/packaging/scripts/linux/install_linux.sh
./frontends/desktop/packaging/scripts/linux/install_linux.sh --mode PrepareOnly
chmod +x GenericAgent-Desktop-Linux.AppImage
./GenericAgent-Desktop-Linux.AppImage
```

说明:Linux 脚本 `frontends/desktop/packaging/scripts/linux/install_linux.sh` 目前作为参考实现使用,已在 Ubuntu 24.04.4 LTS x64 上做过初步试用,但仍需按清单做完整验证。脚本核心做法是准备运行环境,并写入用户级桌面配置(如 `~/.ga_desktop_settings.json`),让程序壳能找到 `project_dir`、`python_path` 和 bridge 脚本。

### 任务 2:Release 不可用时的升级路径

如果 Release 产物在目标系统不可用:
1. 如果只是目标机缺少运行环境,优先修正环境配置脚本;
2. 如果 Release 产物本身不兼容,尝试在目标系统本地构建;
3. 如果本地构建可行,再考虑修改 GitHub Action 的 Linux/Windows 构建方法,让 CI 产物与本地成功产物保持一致。

### 任务 3:核心功能兼容性测试

Release 产物可以启动并连上后端后,再根据 `frontends/desktop/packaging/CHECKLIST.md` 测试不同平台下的界面和核心功能兼容性。

---
Loading