Metona
|
6b793f669b
|
fix: RAG检索状态消息在AI回复后自动清除
给 appendSystemMessage 增加可选 tempClass 参数,
所有 RAG 状态消息标记为 'rag-status' class,
流式结束后和报错时统一移除这些临时消息。
|
2026-04-05 00:44:12 +08:00 |
|
Metona
|
1e3f4d4ba5
|
fix: 彻底修复RAG下消息不显示 - 用模块变量替代CSS选择器
根本原因:所有CSS选择器方案都依赖DOM位置关系,
而 appendSystemMessage 在 placeholder 之后插入 div 会破坏这种关系。
解决方案:用模块变量 currentPlaceholder 直接持有 placeholder DOM 引用,
updateLastAssistantMessage 直接读取该引用,完全不依赖选择器。
- appendAssistantPlaceholder: 设置 currentPlaceholder = div
- updateLastAssistantMessage: 使用 currentPlaceholder,首次调用移除 loading
- clearMessages: 清除 currentPlaceholder
|
2026-04-05 00:38:35 +08:00 |
|
Metona
|
1de1084173
|
fix: 第一个chunk后loading class被移除导致后续内容更新全部跳过
updateLastAssistantMessage 的首次调用找到 .message.assistant.loading 后
立即 remove('loading'),导致后续 chunk 调用时选择器找不到元素,直接 return。
修复:
- 首次调用:找到 .loading,移除 loading 指示器,但保留 class 直到流结束
- 后续调用:.loading 选择器失败时回退到 .message.assistant:last-of-type
- loading class 在 sendMessage 的 try/finally 或 catch 中统一移除
|
2026-04-05 00:34:23 +08:00 |
|
Metona
|
86a2797d44
|
fix: 用 loading class 精确定位placeholder,修复RAG下loading不消失
上次用 :last-of-type 修复无效(:last-of-type 也是按元素类型div匹配,
系统消息也是div,一样命中不了placeholder)。
改用给 placeholder 加 .loading class 的方案:
- appendAssistantPlaceholder 添加 .loading class
- updateLastAssistantMessage 用 .message.assistant.loading 选择器
- 成功/失败后移除 .loading class
选择器不再依赖 DOM 位置,彻底不受 appendSystemMessage 影响。
|
2026-04-05 00:29:08 +08:00 |
|
Metona
|
f3589ae057
|
fix: RAG开启时AI回复后loading动画不消失的问题
根因:appendSystemMessage() 在 assistant placeholder 之后插入了一个无 .message class 的 div,
导致 CSS 选择器 .message.assistant:last-child 无法命中 placeholder(它不再是 :last-child)。
updateLastAssistantMessage() 返回 null,loading 动画永远不会被移除。
修复:将 3 处 :last-child 改为 :last-of-type,使选择器基于元素类型(div)而非精确的最后一个子节点匹配。
|
2026-04-05 00:22:24 +08:00 |
|
thzxx
|
8d4ab5c98c
|
chore: 版本号升级至 v3.0.2
|
2026-04-05 00:03:46 +08:00 |
|
thzxx
|
08cd0de89b
|
feat: 新建会话时自动释放显存,清理模型上下文
|
2026-04-05 00:01:35 +08:00 |
|
thzxx
|
292e84651c
|
fix: RAG上下文根据numCtx和已有消息动态计算可用预算,智能截取
|
2026-04-05 00:00:14 +08:00 |
|
thzxx
|
492a4027b6
|
fix: RAG请求增加system prompt长度限制(12000字节),增加错误提示和调试日志
|
2026-04-04 23:58:03 +08:00 |
|
thzxx
|
20876713d3
|
feat: RAG检索过程可视化,显示检索状态和结果提示
|
2026-04-04 23:53:02 +08:00 |
|
thzxx
|
ce930560f8
|
feat: RAG回复显示知识库来源,含文件名和相似度分数
|
2026-04-04 23:46:16 +08:00 |
|
thzxx
|
30c6916d6f
|
fix: 修复文档上传无反馈的bug,FileList在清空前被读取导致丢失;增加分块数和批量汇总提示
|
2026-04-04 23:41:09 +08:00 |
|
thzxx
|
8c7ad06dce
|
chore: 版本号升级至 v3.0.1
|
2026-04-04 23:31:26 +08:00 |
|
thzxx
|
ebaacb5631
|
fix: 嵌入模型检测改用 /api/show capabilities 判断
|
2026-04-04 23:24:16 +08:00 |
|
thzxx
|
582661146b
|
feat: 嵌入模型下拉仅显示 embedding 模型
|
2026-04-04 23:22:37 +08:00 |
|
thzxx
|
2048d98d96
|
docs: 完善 RAG 知识库文档,更新 API 清单和项目结构
|
2026-04-04 23:15:09 +08:00 |
|
thzxx
|
2c72fc570f
|
chore: 版本号升级至 v3.0.0,更新README功能列表
|
2026-04-04 23:10:24 +08:00 |
|
developer
|
76d33108e2
|
fix: 嵌入模型下拉收窄并与工具栏同行
|
2026-04-04 22:57:52 +08:00 |
|
developer
|
3749d5c2de
|
feat: 添加帮助按钮和使用说明弹框
|
2026-04-04 22:56:34 +08:00 |
|
developer
|
dc3cb77dd2
|
fix: 嵌入模型选择栏固定不被挤压
|
2026-04-04 22:53:56 +08:00 |
|
developer
|
a790060b87
|
fix: 修复知识库弹框布局错位,添加 flex 约束和溢出控制
|
2026-04-04 22:51:18 +08:00 |
|
developer
|
33d3122e93
|
feat: RAG 本地知识库 - 向量存储、文档分块、语义检索、知识库管理面板
|
2026-04-04 22:46:29 +08:00 |
|
developer
|
e15e102eec
|
chore: 版本号升级至 v2.2.0,更新README
|
2026-04-04 22:28:17 +08:00 |
|
developer
|
af290829ef
|
fix: 兼容非HTTPS环境,crypto.subtle不可用时降级为XOR加密
|
2026-04-04 22:24:55 +08:00 |
|
developer
|
c736dbbca4
|
feat: 会话导出加密(.metona),导入仅支持.metona格式
|
2026-04-04 22:22:25 +08:00 |
|
developer
|
3dfe64cd93
|
fix: 修复刷新后模型选择恢复为排序第一个的问题
|
2026-04-04 22:16:46 +08:00 |
|
developer
|
0a85ff3dfa
|
feat: 选中模型持久化为默认,刷新后自动恢复选中
|
2026-04-04 22:13:57 +08:00 |
|
developer
|
e435f0f1a0
|
feat: 模型列表按名称排序,同名称按大小升序
|
2026-04-04 22:09:15 +08:00 |
|
developer
|
dcb66df200
|
fix: 模型下拉框展示磁盘实际文件大小替代参数量
|
2026-04-04 22:06:46 +08:00 |
|
Metona
|
4542b225a2
|
chore: 版本号升级至 v2.1.0,更新 README 文档
|
2026-04-04 21:47:16 +08:00 |
|
Metona
|
c8bf90f64b
|
fix: 修复 chatAreaEl 重复声明报错
|
2026-04-04 21:43:32 +08:00 |
|
Metona
|
12843f09a5
|
feat: 智能滚动 - 流式回复时可向上查看历史,浮动按钮回到底部
- 流式输出时不再强制锁定底部,用户可自由滚动查看历史
- 滚动离开底部时显示「回到底部」浮动按钮(sticky 定位)
- 点击按钮平滑滚动并恢复自动跟踪
- 用户手动滚回底部时自动恢复跟踪
- 发送消息/新建会话时自动重置为跟踪状态
- 首次渲染(加载历史)强制滚到底部
|
2026-04-04 21:41:26 +08:00 |
|
Metona
|
d61764a5e9
|
fix: 禁用按钮保留 hover 提示,提高 think 禁用态可见度
|
2026-04-04 21:35:22 +08:00 |
|
Metona
|
d82455b079
|
feat: 模型 vision 能力检测,不支持时禁用图片上传
- model-bar.js: 新增 setVisionAvailable() 控制图片按钮状态
- model-bar.js: 导出 isVisionAvailable() 供其他组件查询
- input-area.js: 点击图片按钮时校验 vision 能力
- input-area.js: 发送消息时二次校验,防止绕过
- style.css: .icon-btn.disabled 灰显不可点击样式
|
2026-04-04 21:30:47 +08:00 |
|
Metona
|
35a3b5815f
|
fix: 文件图标按类型区分,统一两个组件的图标映射
|
2026-04-04 21:20:20 +08:00 |
|
Metona
|
5259b8017a
|
refactor: 文件上传展示与发送逻辑分离
- 消息对象新增 files 元数据数组(name/language/size)和 _fileContents 内容数组
- content 字段仅保留用户输入的纯文本
- 新增 buildApiMessages() 构建 API 消息时动态拼接文件内容
- chat-area 渲染时从 msg.files 取文件名+图标展示 chip,不暴露文件内容
- 用户消息气泡内文件 chip 用紫色主题区分于输入区的青色 chip
- 导出功能(MD/HTML/TXT)同步适配
|
2026-04-04 21:15:02 +08:00 |
|
Metona
|
7f31034073
|
feat: 支持上传文本/代码文件给 Ollama 分析
- utils.js: 新增 fileToText() 读取文件文本、detectLanguage() 识别编程语言
- index.html: 新增文件上传按钮(📄)和文件预览容器
- input-area.js: 完整文件上传流程(校验/读取/预览/消息构造/发送)
- style.css: 文件 chip 预览样式
支持 50+ 种文本/代码扩展名,文件内容以代码块格式嵌入消息。
单文件限制 500KB,支持多文件同时上传。
|
2026-04-04 21:08:21 +08:00 |
|
thzxx
|
2fa274e1b1
|
docs: README.md 全面重写
- 新增 Ollama API 调用清单(接口/方法/调用位置/用途)
- 新增流式聊天 NDJSON 数据格式说明
- 新增聊天请求参数完整示例
- 新增强制停止机制流程图
- 更新版本号至 v2.0.0
- 功能特性改为表格
- 设置项关联 API 参数
|
2026-04-03 13:21:34 +08:00 |
|
thzxx
|
194b402623
|
fix: 模型栏图标改为方块/列表,避免与 Think 灯泡重复
|
2026-04-03 13:17:59 +08:00 |
|
thzxx
|
66acfb7f3e
|
ui: 模型选择栏布局重设计
- 新增渐变图标指示器
- select 更大圆角 + 更粗边框 + hover/focus 渐变高亮
- 能力标签改为独立彩色 pill(Think 紫色、Vision 青色)
- 箭头图标改为青色
- model-bar.js 适配新 badge 元素
|
2026-04-03 13:10:00 +08:00 |
|
thzxx
|
7f842fc02e
|
ui: 导航按钮和 Think 按钮统一渐变风格
所有按钮统一为青紫渐变 + 发光风格:
- 导航按钮: 渐变背景、白色图标、hover 放大 + 光晕
- Think 按钮选中态: 渐变背景、白色图标,与发送按钮一致
- Think 按钮未选中: 玻璃态,hover 紫色放大
- 尺寸统一 40-42px,与发送按钮对齐
|
2026-04-03 13:05:25 +08:00 |
|
thzxx
|
2e1b0ad066
|
ui: 导航按钮和 Think 按钮视觉增强
导航按钮 (.icon-btn):
- 增加玻璃背景 + 边框,不再透明
- hover 时青色高亮 + 发光 + 上浮
- 图标 18px → 20px
Think 按钮:
- 尺寸 38px → 40px,默认色 text-muted → text-secondary
- hover 时紫色发光 + 上浮
- 选中态渐变背景 + 更强光晕
|
2026-04-03 13:00:20 +08:00 |
|
thzxx
|
be4e7bf101
|
fix: 移除 safeMarkdown 中的 sanitize 调用,修复消息渲染问题
- safeMarkdown 不再调 sanitize,直接用 marked 输出
- marked 产出的 HTML 已经足够安全(代码块、列表等)
- sanitizer.js 保留供 marked-config.js 链接安全检查使用
- 修复 catch 块中改用 assistantContent 而非 DOM textContent
|
2026-04-03 12:54:17 +08:00 |
|
thzxx
|
17a818c3da
|
fix: 停止时消息内容显示 undefined — 彻底修复
根本原因:catch 块从 DOM 读 textContent 存在时序问题,改为直接用
assistantContent 变量(已在 try 外声明),完全绕过 DOM 读取。
改动:
- catch 块:不再读 contentDiv.textContent,直接用 assistantContent
- appendMessageDOM:空内容不调 safeMarkdown 避免生成空 <p>
- 通用错误处理同样改用 assistantContent
|
2026-04-03 12:46:30 +08:00 |
|
thzxx
|
eb04a6baa8
|
fix: 历史记录分页 — 会话丢失导致数据不完整
问题根因:
1. startNewSession() 未保存当前会话 → 点「新建会话」时旧会话丢失
2. 用户消息发送后未立即保存 → 刷新/关闭页面丢失对话
3. 通用错误处理中 saveCurrentSession() 缺少 await
修复:
- startNewSession: 新建前先保存当前会话(有消息时)
- sendMessage: 发送用户消息后立即 saveCurrentSession
- catch 块中 saveCurrentSession 补上 await
|
2026-04-03 12:39:59 +08:00 |
|
thzxx
|
27317f4d32
|
fix: 停止时消息内容变 undefined — 变量作用域问题
assistantContent/thinkContent/modelName 声明在 try 块内,
catch 中访问不到导致全部为 undefined。
将声明提到 try 外部,catch 正常访问已生成内容。
|
2026-04-03 12:33:02 +08:00 |
|
thzxx
|
f80dd7f390
|
feat: 强制停止AI回复 - 真正中止Ollama接口请求
- ollama-api.js: chatStream 新增 AbortController 参数,同时中止 fetch 和 reader
- input-area.js: 发送按钮流式时变为停止按钮(红色方块),点击立即 abort
- abort 时保留已生成内容,标记 [已停止]
- 停止按钮带脉冲动画,视觉反馈明确
- 真正的接口级别终止:fetch abort + reader.cancel 双重保险
|
2026-04-03 12:31:04 +08:00 |
|
thzxx
|
6088ea4629
|
feat: 重新设计模型选择栏与 Think 模式
模型选择栏:
- 去掉原生 select 样式,自定义 appearance:none + 箭头图标
- 模型列表显示参数大小 (如 qwen2.5 · 7B)
- 选中模型后展示能力标签 (🧠 Think / 👁️ Vision)
Think 模式:
- 从模型栏移至输入区域,紧邻发送按钮
- 使用灯泡图标按钮替代原来的 toggle 开关
- 默认 disabled,切换模型时调用 /api/show 检测 capabilities
- capabilities 包含 'thinking' 时才启用,否则禁用并灰显
- 模型能力结果缓存,避免重复请求
|
2026-04-03 11:46:29 +08:00 |
|
thzxx
|
41b512c779
|
chore: 项目文件归类整理
- assets/icons/ → 图标资源 (llama.ico, llama.png)
- css/ → 样式文件 (style.css)
- js/ → 所有业务代码
- js/lib/ → 第三方库 (marked.esm.js)
- js/components/ → UI 组件
修正所有 import 路径、HTML 引用、SW 缓存列表
|
2026-04-03 11:40:01 +08:00 |
|
thzxx
|
38edaee0f0
|
refactor: 模块化架构重构
将单文件巨型 IIFE (1608行) 拆分为 14 个 ES Module:
核心层:
- js/state.js - 轻量级响应式状态管理 (发布-订阅)
- js/utils.js - 通用工具函数
- js/sanitizer.js - HTML XSS 净化器
- js/marked-config.js - Markdown 渲染器配置
组件层:
- js/components/chat-area.js - 消息渲染/流式更新/导出
- js/components/input-area.js - 文本输入/图片上传/发送
- js/components/history-modal.js - 历史记录面板/搜索/分页
- js/components/settings-modal.js - 设置面板/数据管理
- js/components/header.js - 顶部导航/连接状态
- js/components/model-bar.js - 模型选择栏
- js/components/toast.js - Toast 通知
- js/components/lightbox.js - 图片预览
入口层:
- js/app.js - 主入口/初始化协调
index.html: 1608行 → 204行纯模板
|
2026-04-03 11:34:24 +08:00 |
|