Repository navigation
Releases: 2026heshao/FloatPulse
Release list
FloatPulse v4.10.0 — startup flicker fixed, real text context menus
FloatPulse v4.10.0
A Windows floating ball that catches what you copy, drag or screenshot — clipboard snippets, temp assets, pinned reference shots — so they stay one hover away instead of getting lost in a chat log.
中文:一款 Windows 桌面常驻悬浮球:剪贴板自动留存 → 素材临时中转 → 截图钉屏对照。
Native PyQt6 + QSS. No Electron, no bundled browser engine. ~32 MB download, ~1 s cold start. Windows 10/11.
What's new
Fixes (both reported by users, both root-caused with frame-level evidence rather than guesswork):
- Nav sidebar no longer jumps on startup. The plugin-page assembly was deliberately deferred to ~960 ms after the window appeared (a startup-speed trade-off), so the sidebar first rendered without its plugin buttons and then grew 5 rows at once — measured as the "Settings" entry shifting 190 px in a single frame, with the scrollbar appearing from nothing. Nav slots are now reserved before
showvia a manifest-only pre-scan (~1.6 ms, no plugin modules imported), so the sidebar is at its final state on the very first frame; real pages later swap into place idempotently. Measured after the fix: 0 relayouts, 0 px shift, 0 changed pixel frames. - Context menus on text fields are now real, usable menus. Qt's built-in
createStandardContextMenu()is English-only, ignores the app theme, and is almost entirely greyed-out on an empty field (the "no real function" the user reported). A single application-level event filter now covers every window — including plugin pages created later — with a Chinese, theme-aware menu that lists only genuinely applicable actions. Password / no-echo fields deliberately never offer Cut or Copy.
Discoverability:
- Added a full English README (
README.en.md) with a 中文/English switcher, so the project is readable and searchable outside Chinese-speaking communities.
Download
| Recommended — installer | FloatPulse-v4.10.0-setup.exe (24.4 MB) |
| Portable zip | FloatPulse-v4.10.0-win64.zip (32.4 MB) — unzip and run, no Python needed |
Plugins are not bundled — grab only what you want from the assets below (10–40 KB each), drop into plugin_store\, then install from the in-app plugin store: ai-assistant, ai-text-workshop, kb-search, recurring-tasks, vault, weekly-report.
Verify your download
SHA256SUMS.txt is attached; run sha256sum -c SHA256SUMS.txt in the same folder.
Notes
- UI is Chinese only for now (i18n is on the roadmap); architecture, plugin API and tests are language-neutral.
- Portable zip keeps data next to the exe; the installer uses
%APPDATA%\FloatPulseso upgrades never lose your data. - Not a second brain, not a global file searcher (use Everything / Flow Launcher), no cross-device sync — it is a staging area by design.
Full changelog: https://github.com/2026heshao/FloatPulse/blob/main/CHANGELOG.md
v4.9.1
v4.9.0
v4.8.0
下载:
FloatPulse-v4.8.0-win64.zip解压即用(便携版,数据留在程序目录旁)。
插件按需下载.fpplug,放进程序目录的plugin_store\即可在「插件中心 → 插件商店」安装。
校验完整性:sha256sum -c SHA256SUMS.txt。
[v4.8.0] - 2026-10-02
本版把 v4.7.0 之后两天的打磨一次收口,主线是三件事:图标体系与高 DPI 显示彻底对齐(自绘图标全量替换 emoji、软件图标随卡片真正缩放)、设置页体验重整(番茄钟独立成页、新增窗口透明度 / 界面缩放 / 小卡片图标大小)、插件生态与数据安全补强(应用内插件市场、数据写入滚动备份与损坏自愈、安装版数据目录双轨)。
Added
- 插件「密码保险箱」(v1.0.0,本版首次随发布包提供):只活在本机的密码保险箱——自定义字段收纳账号密码与任意机密,
Ctrl+Alt+V开主界面、Ctrl+Alt+B热键快速取用,复制后 30 秒自动清剪贴板。加密是 DPAPI + 主密码(PBKDF2)双因子整形库加密:换机器或没主密码都打不开,不联网、不同步、不碰宿主数据。★能力声明恒为空(capabilities: [])——它拿不到宿主任何数据接口,也拿不到网络库;vault_core刻意不 import PyQt6(纯逻辑可单测),搜索路径永不命中 secret 字段。上一版 Release 的附件区只有 5 个插件包,本版起为 6 个(vault.fpplug)。回归:tests/test_vault_core.py115 项 + 离屏tools/verify_vault.py48/48;README 插件表与marketplace/index.json(生成器tools/build_marketplace.py,5 → 6 条)同步 - 小卡片软件图标大小独立可调(用户可见变更,2026-10-02 用户报「图标大小调不动」):设置 → 外观新增「小卡片图标大小」步进器(
app_mini_icon_size,24–56px、每档 4px,默认 36)。根因不是主窗口——主窗口软件导航页的图标一直是card_size - 20严格跟随(离屏实测 card 60/96/140 → 图标位图 40/76/120),用户看到「调不动」的是悬浮球旁那张小卡片:card_window._refresh_app_page里btn_size = 76/icon_px = 36是两处独立硬编码,与设置项完全脱钩。现改为读配置驱动,并抽出唯一换算点constants.mini_btn_size()(按钮边长 = 图标 + 40;36 → 76,与历史值一致,老用户视觉零变化)。范围常量MINI_ICON_{MIN,MAX,DEFAULT}/MINI_BTN_PAD收进src/constants.py(三处共用:card_window 渲染、settings_panel 步进器、config_CONFIG_RANGES),避免两处各写一个数字日后漂移;上限 56 的依据是内容区可用宽 ≈ 440−48−40 = 352px,按钮 96px 仍排得下 3 列。接线:CardWindow.mini_icon_size懒读 property(set_config_manager在构造之后注入,不能放__init__;换源即作废缓存;越界钳制、脏值静默回退默认)+ 公开门面apply_icon_size()(D3 契约,宿主不穿透私有成员;可见且停在 app 页才重建网格,不可见只更值、切页自然生效,同值不重复重建以免长按 ± 时反复重排);MainWindow.mini_icon_size_changed信号 →knowledge_ball.main()转发到ball.card_window.apply_icon_size;「恢复默认设置」广播区补该键。回归:新增tests/test_mini_icon_size.py25 项(常量与换算单调/钳制、配置三件套、property 懒读/越界/脏值/换源、apply 门面幂等与可见性门控、源码级钉子「_refresh_app_page里不得再出现icon_px = 36/btn_size = 76字面量」、真实渲染三档 iconSize 与按钮边长、设置页落盘/广播/钳制/refresh 不误广播、MainWindow 信号 AST 断言);新增离屏tools/verify_mini_icon_size.pyA–G 七段全通过(三档实测 iconSize 24/36/56、按钮边长 64/76/96,deleteLater 结算后按钮数恒为 5 无残留;主窗口卡片链路回归 card=140 → 图标 120px);test_settings_nav搬运完整性参数表补_set_mini_icon_size;verify_settings_groups8/8(外观组加行后分隔线动态校验通过,脚本零改动);全量 pytest 2035 passed / 3 skipped / 6 subtests;ruff 全绿;真截图目检build/shots/mini_icon_{24,36,56}.png+mini_icon_settings.png(24px 一行 5 个 / 56px 自动换行 3+2,布局不溢出)。⚠本条的「主窗口图标一直正常」结论有误,已在下方 Fixed 段修正:当时只量了 pixmap 对象尺寸(card_size - 20),没量真实渲染像素;实机上是 QIcon 不放大导致图标恒卡在源帧尺寸(.lnk 更是恒定 40px),主窗口同样受影响 - 番茄钟设置独立成页(用户可见变更,2026-10-02 用户拍板):设置页左侧分类导航新增「🍅 番茄钟」分类(原「⚡ 全局工具」卡内的 4 项整体搬迁:总开关 / 专注时长 / 休息时长 / 自动进入休息),工具卡此后只留快速捕捉与截图钉屏两组热键。纯 UI 重组,零行为变更——控件属性名、
_on_pomodoro_*回调、refresh()同步与pomodoro_changed广播链一律不动,float_data/config.json的pomodoro_*四键口径与老配置零迁移。设置分类 9 → 10(SETTINGS_CATEGORIES新增("pomodoro", "🍅", "番茄钟"),插在 tools 与 system 之间);「全局工具」卡的末行标记随搬迁改挂到截图热键行(末行无悬空分隔线的不变量保持)。回归:test_settings_nav分类数断言 9→10 + 搬运完整性参数表补「番茄钟」注释分组;verify_settings_groups期望卡序同步(A/B 段 11 张卡逐卡校验通过,含「软件更新」子卡);全量 pytest 2035 passed / 3 skipped / 6 subtests;test_init冒烟全 [OK];使用说明页「设置」章节的分类清单与「全局工具」描述同步改写;light/dark 双主题真截图目检(build/shots/settings_pomodoro_{light,dark}.png,临时截图脚本跑完即删) - 插件中心卡片降噪(用户可见变更,2026-10-01 用户拍板「降噪保留 + 动作保持逐行」):对照用户截图诊断——卡片信息全平铺(描述两三行 + 📖摘要 + 动作逐行 + 依赖行 + 能力行 + 4 按钮)导致单卡过高、一屏只能看两张。降噪三项:①描述截断:卡面最多
DESC_MAX=64字(双列卡宽 ≈2 行,一眼能扫完),超出截断加省略号、全文进悬停提示(新增纯函数clip_text);②依赖行消失:requires(PyQt6.QtCore 这类开发者信息)不再占卡面行,连同被截断的描述全文一起挂进卡片整体悬停提示(QToolTip 沿父链找最近有提示的控件,悬停卡面空白处可见)——有无能力行行为一致;③能力徽章化:原「能力: 🌐 网络访问、✍ 写入数据…」文字行改为一排胶囊徽章(pluginCapBadge,短文案 🌐 网络 / ✍ 写入 / 🛠 改删 / 🧠 AI,完整语义在徽章悬停提示CAP_TIPS,从_make_card局部 dict 提升为模块级三卡共用),淡主色底 QSS 与pluginStoreBadge同族(light/dark token 双主题齐备)。附带:标题行「名称 v版本」拆成两个 QLabel(版本弱化为灰小字),商店卡 / 在线市场卡同步同款降噪(版本拆分 + 徽章行 + 描述截断,源包名/热键/体积保留文字行);「(无注册动作)」从主文字色(pluginCardDesc)降为弱化灰(pluginActionTag)不与描述抢层级。信息零删除——描述全文、依赖清单、能力语义全部可悬停查看;动作清单按用户选择保持逐行不动。回归:新增tests/test_plugins_card_polish.py15 项(clip_text 边界 / 长描述截断+悬停全文 / 依赖不占卡面且悬停可见(有无能力两态)/ 徽章数量短文案语义提示 / 标题拆分 / 商店卡在线卡同款 / 网格回归);既有test_plugins_panel42 项全绿(文本存在性断言不受排版影响);全量 pytest 1965 → 1987 passed;verify_plugins_panel23/23 +verify_plugins_page19/19;light/dark 双主题真截图(build/shots/plugins_card_{light,dark}.png,临时探针跑完即删);test_init冒烟 RC=0。二次收敛(同日用户复看反馈「介绍重复太多,使用说明看 md 就行」):卡面 📖 使用说明摘要行整体移除(描述与摘自 md 的摘要两段都在介绍「这插件是干嘛的」,重复感是主要观感问题;详情点「查看使用说明」走程序内 md 查看器,信息零丢失)——usage_summary()函数与USAGE_SUMMARY_MAX常量随之删除(无消费者不留死代码),theme.py 的pluginCardUsage死规则清理;描述再收短DESC_MAX64→48 字(约一行半,悬停全文保留)。测试同步:test_plugins_panel的摘要函数三测删除、「摘要上卡」断言反转为「摘要不上卡 + 按钮保留」,verify_plugins_pageC6 反转,test_plugins_card_polishDESC_MAX 常量断言对齐;复验:插件相关 54 项 + 全量 pytest(我方改动面全绿)+verify_plugins_page19/19 +verify_plugins_panel23/23 + 双主题截图build/shots/plugins_card2_*.png目检(单卡高度再降约 1/3)+ 冒烟通过 - AI 助手 1.12.0:新增「清空全部任务」动作 + 动作协议防谎报强化(用户可见变更,2026-10-01 用户实测反馈):用户实测「将任务清空,设置明天任务为…」时模型编造
delete_task #1/#2编号(数据里根本不存在)被 id 护栏全部安全跳过,却在正文谎称「已清空了所有现有任务」——任务实际没清空。三处修复:①新增clear_tasks{}动作(无参数、manage 级 → 走既有确认卡「【清空】全部任务(当前 N 条)」),执行层现取现删(不用校验时旧快照,确认期间数据变化无碍)、逐条删除收集撤销令牌(清空 N 条 = N 个令牌,结果卡仍可「↩ 撤销删除」一键恢复;_execute_and_report支持 list 令牌 extend)、部分失败如实报「成功 2/3 条」、空列表如实说「无需清空」;②协议规则补两条:清空/批量删除用 clear_tasks 不要逐条编造 delete_task;文字说明必须与动作一致——动作被跳过或失败时如实说明未完成,禁止声称已删除/已清空;③parse 校验豁免 clear_tasks 的 content 必填(无参动作)。契约注意:clear_tasks 是唯一无 id 的 manage 级动作(不进_OP_TARGET),原「manage 级 ⟺ 需要 id」契约测试同步加例外。回归:test_ai_assistant_actions60 → 67 项(parse 无参通过 / 描述带快照数量 / 执行层桩替身三场景——全成功返令牌列表、部分失败如实报、空列表诚实 no-op /_execute_and_report聚合令牌 / 协议含防谎报条款);全量 pytest 1965 → 1972 passed;ruff 全绿;已重打包plugin_store/ai-assistant.fpplug(1.12.0,37.5KB) - AI 总配置新增本地模型参数:思考模式 + 上下文长度(用户可见变更,2026-10-01 用户拍板:思考默认关 / 上下文默认 16K / 改参自动重启):设置 → AI 配置在本地模式下新增两行——「思考模式」(关=响应更快 / 开=输出思维链,
ai_local_thinking)与「上下文长度」(8K/16K/32K/64K 档位,ai_local_ctx_size),仅对本地 llama-server 后端生效(纯启动参数,ctx.ai.params()契约零变化,插件无感零迁移)。实现:config 三件套同步(bool 不进 RANGES;ai_local_ctx_size(2048,131072) +ai_server.sanitize_ctx_size双层收敛);build_launch_args(gguf, port, ctx_size, thinking)参数化;新增AiServerManager.restart()状态驱动平滑重启(运行中改参 → stop 后等旧实例真正退出(finished 信号)再以新参数拉起,替代固定延迟猜测——Windows 下 terminate 对无窗口控制台程序可能迟至 3s 强杀才生效;重复调用以后一次参数为准,期间被手动拉起则丢弃 pending 防双启);设置页_ai_start_local统一保存/手动启动入口(参数未变不打断、变化自动重启并提示);两行随本地/云端模式显隐同步(_ai_apply_mode_ui补齐)。★参数选型实测存档:--reasoning-budget 0(预算立即耗尽)不被 Qwen3.5 模板遵循——同题对照实测 b10690:budget 0 与默认一样吐完整思维链(384 tokens 耗尽、content 为空、5.7s),--reasoning off才是真开关(直答 0.3s/14 tokens,快约 20 倍),故「关」实现为--reasoning off。回归:test_plugin_ai扩至 29 项(新键类型/范围/bool 不进 RANGES、launch args ctx 收敛与 reasoning 旗标有无、restart 直启/覆盖/防双启守卫);verify_settings_groups8/8(AI 卡加行后动态校验零改动通过);verify_ai_backend26/26(B3/B4 补两新行显隐断言;顺带修正过期的 C1——weekly-report 自 v1.1.0 声明 ai 能力后属合法候选,反例换真零能力的 kb-search);全量 pytest 1965 passed / 3 skipped / 6 subtests;本地模式 AI 卡 light/dark 双主题真截图目检(build/shots/ai_local_card_*.png,临时脚本跑完即删) - 设置新增「窗口透明度」(用户可见变更,2026-10-01 用户提出):设置 → 外观与主题新增「窗口透明度」步进器(
window_opacity,50–100%、每档 5%,默认 100=不透明)——主窗口整体半透明,方便「盯参考/对照材料」时让窗口退到背景(悬浮球、便签、卡片窗不受影响)。实现:config 三件套同步(int +_CONFIG_RANGES(50,100),下限 50 保文字可读——QtwindowOpacity=0时窗口命中测试直接穿透不可点击);主窗新增_target_window_opacity()(百分比→0.5~1.0 收敛,垃圾配置回 1.0 的防御纵深)与_apply_window_opacity()(setWindowOpacity单点应用,不走全量主题刷新);入场淡入终点改为读配置目标(_play_entrance_animation原硬编码setEndValue(1.0),预设半透明时启动动画直接到位,不闪「先不透明再变透明」);设置页 Stepper 改动即时持久化并直调主窗应用(getattr callable 守卫);「恢复默认设置」广播区补透明度回 100% + Stepper 同步刷新(refresh 走 blockSignals 护栏)。回归:新增tests/test_window_opacity.py17 项(config 三件套越界/错型拒写、垃圾加载回退、目标值收敛含防御纵深、真窗 show 后入场淡入终点=配置目标 70%≈0.7、Stepper 夹取/落盘/直调/同值省写、host 缺方法不崩、恢复默认回不透明且控件同步);全量 pytest 1948 → 1965 passed;verify_settings_groups8/8(外观组加行后分组结构 B 段动态校验通过,脚本零改动);test_init冒烟全 [OK] - 悬浮球右键菜单分组收纳(用户可见变更,2026-10-01 用户拍板):6 个插件动作此前全部平铺在一级菜单(站内搜索 / 周期任务 / 立即检查周期任务 / 密码保险箱 / 快速取用 / 生成日报周报草稿),装几个插件菜单就长一截。现参照 Win11 桌面右键「新建 >」的层级(用户提供的样图)把全部插件动作收进「🧩 插件功能」子菜单:一级菜单定型为「打开主窗口|开始专注|🧩 插件功能>|✂ 截图钉屏|退出程序」五段(分隔线分组不变,「截图钉屏」按用户选择留一级直达),二级保留各动作图标与标题、随启用/停用动态增删(
refresh_plugin_menu既有入口不变);子菜单显式套同一份get_menu_qss(与托盘「📌 便签」子菜单同款做法),light/dark 跟随宿主主题(ball.apply_theme正规换肤链覆盖)。回归:verify_plugin_loader35/35(E1/E2 期望列表更新为子菜单形态 + 新增 E2b 子菜单收纳断言;F1/G2 计数同步);verify_weekly_report65/65(D/E 段改走子菜单取 QAction);全量 pytest 1948 passed;test_init 冒烟全 OK;light/dark 四张真截图验证菜单结构与换肤(build/shots/ball_menu*,临时探针跑完即删)。★顺带对齐verify_plugin_loader三条过期断言(只改脚本不改产品):D1「.fpplug 自动解压后加载」→「残留 .fpplug 不再自动解压」(双目录模型 2026-09-27 移除自动解压后脚本一直没跟上,C4/F1/E2b 连锁红灯同源) - AI 助手思考动画自绘化(v1.11.0,用户可见变更):请求在途的「打字中」三点气泡从
●○○字符帧轮换(180ms/帧,4 帧往返) 换成 自绘连续动画控件ThinkingDots——①零字体依赖:●○几何符号在 msyh 下与▶▾▸同属supportsCharacter=False高危区(图标自绘铁律的既判场景),改为paintEvent画三个圆点后彻底摆脱字体;②观感:三点按正弦相位做垂直弹跳 + 透明度呼吸(33ms/帧 ≈30fps、周期 900ms、三点各差 1/3 相位,只取正半周弹跳落基线平滑),比 4 帧跳变顺滑;③主题跟随:颜色取宿主主题$primary并订阅theme_changed(IconButton/PageTitle 同款 callable 守卫),换主题即时换色;④减弱动效联动:设置「减弱动效」开启时不启动计时器,静止显示三点(相位取 0.125 让透明度呈阶梯,不呆板);⑤气泡壳chatBubbleThinkingQSS 不变,同步删除已无消费者的chatThinkingDots文字规则(theme.py)。接线:页面级_think_timer/_tick_thinking/_THINK_FRAMES删除(计时器归控件自管,_hide_thinking显式stop()双保险)。回归:新增tests/test_ai_thinking.py9 项(尺寸/启动即动画/stop 停/相位推进/离屏渲染非空/减弱动效静止但仍渲染/无宿主取色兜底/theme_changed 换色/页面挂气泡幂等+靠左+拆除计数回落+发送全链路在途挂起回复到达拆除);verify_ai_assistant121/121(C20b/C20c 断言对齐新实现;顺带修正过期的 A7——weekly-report 自 v1.1.0 声明 network+ai,「未声明」反例换真零能力的 kb-search);全量 pytest 1820 passed - 五插件第二批增强(2026-10-01,用户可见变更):首批「推荐项」之外的五个可选批次一次做完,版本齐升 —— ①AI 助手 1.10.0:会话导出 Markdown(会话栏「💾」→ 选路径落盘 utf-8+LF,逐轮问答原样导出,快捷指令只导界面文案不含数据块,空会话拦截)+ 自定义快捷指令(快捷行「+」弹小对话框添加,上限 6 条随 config 落盘,点击直发不附加数据块,右键删除)。②AI 文本工坊 1.5.1:源文超 8000 字在「处理中…」状态行明示「已按上限截断发送」(此前悄悄砍内...
v4.7.0
v4.6.0
v4.0.0
Full Changelog: https://github.com/2026heshao/FloatPulse/commits/v4.0.0