Commit Graph

42 Commits

Author SHA1 Message Date
qinglong fb8add1336 fix: 横版CSS — grid 2列布局 左信息右图表 2026-06-14 08:05:48 +08:00
qinglong 5ca68c9d13 fix: 横版复用网格DOM结构 — 仅追加row-extra + CSS差异 2026-06-14 07:58:24 +08:00
qinglong 62d49ff45f fix: 布局切换用 cssText 显式设置 (防止 style='' 残留) 2026-06-14 07:57:12 +08:00
qinglong 719e8b5d73 fix: MiniChart 仅新卡片创建一次 (避免重复) 2026-06-14 07:56:41 +08:00
qinglong f8dd44011f fix: MiniChart 创建移到 appendChild 之后 (canvas 需在 DOM 中) 2026-06-14 07:40:55 +08:00
qinglong d1e96331e2 fix: MiniChart canvas ID + 传字符串 (非 DOM 元素) 2026-06-14 07:39:20 +08:00
qinglong 99719398d7 fix: MiniChart 创建加 try-catch, 防止单设备失败中断循环 2026-06-14 07:38:11 +08:00
qinglong 02640f00bc feat: Sentinel 横版折线图 — MiniChart 正确放置 (innerHTML 外部, try-catch 保护) 2026-06-13 22:26:03 +08:00
qinglong 3839af81cf fix: NaN — oldCpu/oldMem 移到 if(isRow) 之前, 两模式共享 2026-06-13 22:23:23 +08:00
qinglong 06d5bf8071 fix: Sentinel 横版 — 完全移除 MiniChart, 纯文本数值展示 2026-06-13 22:19:47 +08:00
qinglong 5628f5d288 fix: 清理残留变量赋值 + 重写 renderNodes (行/网格统一逻辑) 2026-06-13 22:16:59 +08:00
qinglong 9a3e2aeda8 fix: MiniChart 代码从 innerHTML 字符串拼接中移出 (语法错误) 2026-06-13 22:12:50 +08:00
qinglong 765387981e feat: Sentinel 横版折线图 — MiniChart 复用主页 chart.js (SPA 全局可用) 2026-06-13 22:10:02 +08:00
qinglong 31f1a2e177 fix: Sentinel 横版模式 — 简化: 数值展示替代折线图 (去除 MiniChart 依赖)
横版布局现在显示大号CPU/MEM/NET数值,无需加载 chart.js
- 移除 _chartInstances / MiniChart 依赖
- 移除动态 chart.js 加载
- 移除 toggleLayout 中的图表销毁逻辑

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-13 22:03:57 +08:00
qinglong 02cae47292 fix: Sentinel 横版模式 — 移除无限回退循环, MiniChart 不可用时优雅降级 2026-06-13 21:58:56 +08:00
qinglong 06c432dbae fix: Sentinel JS 缺失 if(n.online) 闭合括号 → 脚本解析失败 2026-06-13 21:54:55 +08:00
qinglong 2c50bdfaff fix: Sentinel 动态加载 chart.js + 空节点容错 + 默认为网格模式 2026-06-13 21:47:26 +08:00
qinglong cf70f71b65 fix: Sentinel 加载 chart.js + MiniChart 未就绪回退网格 2026-06-13 21:45:01 +08:00
qinglong 6a669efe0a feat: Sentinel 横版卡片布局 — 折线图 + 全行展开
- 新增布局切换按钮: 网格/横版
- 横版: 每设备占满一行, 左信息 + 中折线图 + 右数字
- 复用 MiniChart 组件 (CPU/MEM/NET 三图)
- 切换时销毁旧图重建, 避免内存泄漏

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-13 21:43:53 +08:00
qinglong 68717daefb feat: Sentinel 支持自定义 API 路径前缀 (base_path)
- 节点编辑对话框新增「API 路径前缀」字段 (默认 /SenSu)
- 后端保存/读取 base_path
- API 响应包含 base_path 供前端回显

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-13 21:19:25 +08:00
qinglong 95a2f375e8 security: Sentinel 配置文件模板化 — config.yaml 不入库
- config.yaml → .gitignore (含 API Key 不入库)
- config.yaml.example 模板 (空节点列表)
- 首次启动自动从模板复制
- 所有插件 config.yaml 统一保护

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-13 21:04:52 +08:00
qinglong 3724021d81 style: Sentinel MEM 详情右对齐到标签旁 (12.8/14.8 GB) 2026-06-13 20:50:13 +08:00
qinglong 899bef7781 feat: 设备卡片显示系统名+版本 + 项目根 version.json
- SystemInfoCollector.platform 新增 release 字段 (内核版本)
- Sentinel 卡片每台设备显示: Linux 6.12.23 | aarch64
- 数据刷新时同步更新系统信息行
- 项目根 version.json: 本地版本清单

当前版本检测:
  UpdateService 每6h从 {repo}/raw/branch/{branch}/version.json 拉取
  对比 base_config.yaml 的 framework.version
  远程 > 本地 → 顶栏绿色按钮 + 设置页更新提示

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-13 20:47:22 +08:00
qinglong c8f2cb7b98 fix: Sentinel 编辑节点时 api_key 留空 → 保留旧值 2026-06-13 20:44:44 +08:00
qinglong cc50ecb813 fix: Windows兼容 + Textual 8.x + MD3 SVG图标替代emoji
1. Windows: reuse_port 仅非win32平台启用
2. Textual 8.2.7: refresh() 加 **kwargs 兼容 repaint 参数
3. WebUI: 设置页/插件页 emoji → SVG (fill:currentColor 日夜间适配)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-13 20:42:22 +08:00
qinglong 3ca001b938 fix: 进度条平滑过渡 — force reflow 技巧确保 CSS transition 生效
- 临时关 transition → 设旧值 → offsetWidth reflow → 开 transition → 设新值
- DOM 复用: 首次 innerHTML 创建, 后续只改属性
- 进度条从旧值滑到新值, 不再闪现

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-13 18:19:07 +08:00
qinglong 417213096f fix: Sentinel 清除占位卡片 + 动画延长至 1s 2026-06-13 18:17:26 +08:00
qinglong f3a6e5fbcd feat: Sentinel 数字跳动动画 + 进度条平滑过渡
- 数字 count-up/down: requestAnimationFrame + ease-out cubic, 350ms
- 中间值过渡: 15%→22% 会显示 15.2,16.1,17.5...22.0
- 进度条: CSS transition 自动处理宽度变化
- 卡片 DOM 复用: 更新值而非重建 innerHTML

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-13 18:12:37 +08:00
qinglong 51c1ee84f0 feat: Sentinel 卡片数据刷新动画
- 卡片更新时背景闪烁 (card-flash keyframe)
- 进度条平滑过渡 (cubic-bezier .6s)
- 数值涨跌颜色: 绿涨↑ 红跌↓ 不变灰色
- 渐变进度条背景
- 存储前值用于趋势对比

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-13 18:06:06 +08:00
qinglong c416b04798 fix: Sentinel 改用前端轮询替代 SSE (解决 EventSource 认证问题)
SSE 跨 panel_auth 认证层不可靠 → 改用 setInterval 每 2s fetch /sentinel/api/nodes

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-13 18:00:34 +08:00
qinglong a21e092207 fix: Sentinel SSE URL — /SenSu/plugin/... → /plugin/... (匹配实际路由) 2026-06-13 17:56:57 +08:00
qinglong b53410bc77 fix: Sentinel SSE 每次轮询都推送 (实时性) + isolation 默认 false + 文档
Sentinel:
- poll_interval 3s→2s, 每次轮询都推 SSE (不再等状态变化)
- 解决稳定状态下数据更新不实时问题

插件系统:
- 默认 isolation: false (避免插件 WebUI 不显示)
- example_plugin 显式设置 isolation: false
- 插件开发指南: settings 示例增加 isolation 说明

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-13 17:54:39 +08:00
qinglong a2361cf452 fix: Sentinel WebUI — 合并为单页面(仪表盘+节点管理Tab)
插件 Web 页面 key 必须匹配 plugin_name (/plugin/sentinel)
改为单页面 Tab 切换: 仪表盘 + 节点管理

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-13 15:17:17 +08:00
qinglong 634496d975 security: Sentinel 路由鉴权 + API Key CSRF + SSRF 防护
修复:
- Sentinel 路由 require_auth=False → True (严重: 未认证可访问)
- API Key 创建/删除加 csrf_protect=True
- SSRF 防护: 测试连接仅允许 http/https scheme
- 插件网络鉴权: 已加载插件自动放行 (不再要求 plugin.network.access)
- Sentinel 权限列表补充 plugin.network.access

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-13 15:13:56 +08:00
qinglong 5e74b0aad7 feat: 🛡️ Sentinel 集群监控插件 + API Key 系统 + 框架设置页
== API Key 系统 ==
- services/web_panel/routes/apikeys.py: CRUD + 权限模板 + 过期控制
- panel_auth + _check_plugin_auth 双重验证 (Session → API Key)
- 模板: readonly(只读) / monitor(监控) / full(管理)
- 持久化到 SenSuDB + 过期自动清理

== WebUI 框架设置页 ==
- static/web_panel/pages/settings.html: API Key 管理界面
- 创建对话框 (名称/权限/TTL), 列表表格, 一键删除

== 热重载修复 ==
- PluginService._reload_plugin: 路由器冻结时跳过 (避免破坏已注册路由)

== 🛡️ Sentinel 插件 ==
- 多节点 SenSu 集群性能监控
- 后台 urllib+run_in_executor 轮询 (避免事件循环死锁)
- SSE 实时推送仪表盘
- 节点管理页 (增删改+连接测试+备注)
- 路径: /sentinel/api/nodes

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-13 15:05:38 +08:00
qinglong 9de094ea54 fix: 移除遗留fmfuncs目录创建 + 清理init_service无用导入 + 文件管理器SVG图标 + 示例插件MD3改造
- init_service: 删除_load_fmfuncs方法和fmfuncs目录创建(已迁移到sdk/)
- init_service: 清理未使用的importlib.util和sys导入
- 文件管理器: 全部emoji替换为MD3 SVG矢量图标(文件夹/文件类型/右键菜单)
- 示例插件: dashboard.html改为MD3风格 CSS变量自动适配日夜主题
- 面包屑: 加底色+模糊+左右外边距
- CSS: .btn::after加pointer-events:none
- 插件开发指南: 更新2.6节MD3主题同步和完善的CSS变量/组件类参考表

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 19:00:19 +08:00
AskaEth e52f7f3566 Phase 3: PluginWebMixin SDK + web plugin control panels
- New: sdk/plugin_web.py (PluginWebMixin: web pages, API routes, SSE)
- New: services/web_panel/routes/plugin_web.py (3 endpoints)
- New: plugins/example_plugin/dashboard.html (counter + SSE demo)
- Updated: example_plugin uses PluginWebMixin
- Tests: 28/28 passing
2026-06-10 20:54:11 +08:00
AskaEth f5800cc6c3 Debug: fix headless mode, plugin compat, psutil optional, module imports
- headless: TUI skip now works correctly
- example_plugin: keyword args compat (plugin_name=, config=, bridge=)
- sysmon: psutil made optional (graceful degrade)
- tui_service: SysMonWidget optional
- All 22 modules import clean, 23 tests pass, integration verified
2026-06-10 19:26:41 +08:00
AskaEth c73e569958 v0.2.2: headless mode, debug server auto-start, WS fix, watchdog hot-reload, example plugin
- --headless flag (skip TUI for SSH/systemd)
- InitService auto-starts cyrene_debug_server.py
- Fixed log WS URL (home.html/api/logs/ws -> api/logs/ws)
- PluginService watchdog hot-reload (plugins/ dir)
- example_plugin: 2 commands (echo, plugin_status)
- Tests: 15/15 passing
2026-06-10 18:50:10 +08:00
AskaEth 3270a84c4e Rename core -> sdk (plugin SDK, self-documenting) 2026-06-10 18:19:05 +08:00
AskaEth 2bc00f8207 Rename fmfuncs -> core (cleaner, semantic) 2026-06-10 18:17:21 +08:00
AskaEth e6875f0b4b Initial commit: SenSu Alpha 0.2.0
- 13-service async plugin framework
- Textual TUI with CLI fallback
- Plugin hot-reload + permission system
- Web management panel (aiohttp)
- Bridge-based inter-module communication
- 10 regression tests

Fixes applied:
- PBKDF2-SHA256 auth (was plain SHA256)
- Auth bypass removed (was allow-all on fail)
- Bare excepts replaced with logged errors
- CatFramework/DreamSu -> SenSu naming unified
- ServiceManager: health checks + startup_order
- Env var credentials (SENSU_ADMIN_PASSWORD etc)
2026-06-10 12:28:05 +08:00