IceStatic ice-static

ice-static pushed to master at ice-static/fmode-app

  • 2fa5eefab3 feat(chat): 登录落地态改为「新建对话」引导页 登录后进入 /desktop/chat 时,右侧原本是「选择一个会话」的纯空态, 没有任何可点动作;且 onRouteChange 在无容器分支会自动打开 conversations()[0] 并 replaceUrl —— 用户没选容器就被带进某条对话。 - 无容器时渲染引导页:图标 + 「开始一段新对话」+ 说明 + 「新建对话」按钮, 复用已有 .no-session 样式,新增 .landing 使整块主区垂直居中 - 删除 else 分支的自动打开首会话,无容器即停在落地页 - 新建按钮走 requestNewSession(),与左栏入口同一条链路 验证:tsc 0 错误;单测 1089/1089;冒烟 28/28;verify:ui 12/12; 截图确认落地页与点击后弹出的「选择数字生命」模态框 Co-Authored-By: Claude Code <noreply@anthropic.com>

2 days ago

ice-static pushed to master at ice-static/fmode-app

  • 9352ae131a feat(deploy): 环境切换机制重构 + 生产部署链路 + 发布手册 一、环境切换(后端地址收口到单一真源) - 新增 environment.base.ts:parseServer / functionsBase / parseAppId / matrixHs / matrixServerName 唯一真源,环境文件继承覆盖 - parse-api.ts 3 处、matrix-client.service.ts 2 处硬编码改读 environment - environment.production.ts 的 useMockData 由 true 改为 false (线上此前实际跑的是演示数据) - 新增 environment.mock.ts(冒烟/UI 走查)与 environment.local.example.ts (本地联调,.local.ts 不入库) 二、构建配置 - production 补 optimization: true / sourceMap: false(此前缺失,产出未优化) - 新增 mock / mock-production / local 三套构建与对应 serve 配置 - package.json 增 start:local / start:mock / build:mock / deploy 三、部署脚本 scripts/deploy.mjs(替代已删的 deploy.ps1) - 项目名与产物路径修正为 fmode-app-v2(原为 nova-aigc) - 产物自检:拦截演示包、空产物、缺 index.html - 凭据改由 obsutil / hcloud 自身配置提供,脚本内无明文 四、顺带修复 - ui-button 加载态内容被整块替换后无可访问名 → 无 ariaLabel 时兜底「加载中」 - smoke-imhub 左栏断言改查外壳 app-session-tree(10-30 左栏已提升) - smoke-imhub 等待加载态退场;可访问名判定补 aria-labelledby / title 五、文档 - 新增 docs/05-operations/部署发布手册.md(安装→发布→排障→踩坑) - README 重写为项目实际内容;docs 索引与操作追踪同步 验证:tsc 0 错误;单测 1089/1089;冒烟 28/28;verify:ui 12/12; verify:docs 80 文件通过;四套构建配置均通过;已实际发布至 ai.fmode.cn Co-Authored-By: Claude Code <noreply@anthropic.com>

2 days ago

ice-static pushed to master at ice-static/fmode-app

  • e4acee201f fix(switch): 开启态圆点改用 primary-content,修复铂金深色下白底白点 用户从 DOM 定位到:aria-checked=true + background-color: var(--primary)。 根因:铂金曜黑配色在深色模式下 --primary 是 #f1f2f3(近白), 那是配色本意(黑白极简风,强调色即白色)。开关拿它当开启轨道 + 白色圆点 = 白底白点,糊成一团。 修复: - 开启态圆点改用 --primary-content(压在 primary 上的文字色,天然相反) 深色 → 近白轨道 + 深色圆点;浅色 → 深蓝轨道 + 白色圆点 - 关闭态圆点永远白色,避免与开启态混淆 已用 Chrome 渲染核对浅色/铂金深色/其它配色深色共 6 种组合。 验证:tsc 0 错误;单测 1089/1089;构建通过;verify:ui 12/12 Co-Authored-By: Claude Code <noreply@anthropic.com>

3 days ago

ice-static pushed to master at ice-static/fmode-app

  • da6d6364f2 fix(theme): 开关配色随主题反转 + 主题状态统一到 ThemeService 一、开关(用户明确规则) 浅色模式:深色轨道 + 亮色圆点 深色模式:亮色轨道 + 深色圆点 开启态统一品牌蓝 + 白点 之前几版失效的真原因:class 由模板 [class] 动态拼出, Angular 样式封装配不上,写在组件 SCSS 里的规则整条被丢弃 (构建产物中搜不到该类,已实测)。改为内联 style 绑定。 二、主题状态统一 桌面/移动的 MinePage 各自维护 themeMode signal + 手写 classList/localStorage, 与左栏用户菜单的开关是两套状态,切换后互不同步。 现在三处入口统一读写 ThemeService。 验证:tsc 0 错误;单测 1089/1089;构建通过;verify:ui 12/12 Co-Authored-By: Claude Code <noreply@anthropic.com>

3 days ago

ice-static pushed to master at ice-static/fmode-app

  • 6c0f751211 fix(ui): 退出登录按钮悬停无变化 + 深色模式开关轨道不可辨 一、退出登录按钮 🔴 原样式 .logout-action:hover 的 background 与本体完全相同(都是 danger-subtle), 悬停等于没有任何视觉变化,用户感觉不到按钮是活的。 - 默认:danger 与 surface 混出浅红底 + 40% 红边 - 悬停:底色加深到 20%、边框变实到 72%、上浮 1px、图标右移 2px - 按下:scale(.98) 二、深色模式开关 关闭态轨道在深色主题下用 --faint/--edge-strong 都偏浅, 白圆点压上去退化成「白底白轨」,分不清开还是关。 - 关闭态改为固定深色 #3f4652,深色主题下 #4a515e + 内描边 - 开启态保持 primary 蓝 两套主题下都是「深色槽 + 白点 / 蓝槽 + 白点」的明确对比。 已用 Chrome 渲染核对浅色/深色主题下的开关与按钮默认/悬停效果。 验证:tsc 0 错误;单测 1089/1089;构建通过;verify:ui 12/12 Co-Authored-By: Claude Code <noreply@anthropic.com>

3 days ago

ice-static pushed to master at ice-static/fmode-app

  • ee6b836b79 fix(ui): 清除用户可见的 Matrix 表述 + 修复深色模式开关状态不可辨 一、界面文案去技术名词 - 删除会话确认框:「Matrix 服务器上的消息本身不会被删除」整句删除 - 「Matrix 登录失败」→「连接失败」 - 「Matrix 凭据不完整(缺 accessToken 或 userId)」→「登录凭据不完整,请重新进入」 - 「附件上传到 Matrix 失败」→「附件上传失败」 - 「Matrix 客户端未连接」→「尚未连接,请稍后重试」 代码注释与标识符保持不变(不进界面)。 二、深色模式开关 根因:关闭态轨道用 --edge-strong(#454b56),与白色圆点亮度接近, 边界消失,看起来像一团白、分不清开还是关。 - 关闭态轨道改用 --surface-active - 圆点加极淡描边使边界更实 - 开启态保持 --primary 蓝色 已用 Chrome 渲染核对深色主题下明/暗两种卡片的效果。 验证:tsc 0 错误;单测 1089/1089;构建通过;verify:ui 12/12 Co-Authored-By: Claude Code <noreply@anthropic.com>

3 days ago

ice-static pushed to master at ice-static/fmode-app

  • a85af69d2a feat(workspace): 工作区查重 + 删除二次确认 + 操作图标常驻 1. 重名校验 - WorkspaceService.hasName(name, exceptId?) 忽略大小写与首尾空白 - create/rename 均挡重名,重命名排除自己 - PromptModalService 新增 validate 钩子:校验失败不关闭弹窗并显示错误 (原先点了没反应,用户不知道哪里不对) 2. 删除工作区二次确认 - ui-modal 说明「其中 N 条对话会被移回日常对话,不会被删除」 3. 图标常驻 - 工作区行的新建/重命名/删除从 display:none 悬停显示改为常驻 - 分组头「新建工作区」+ 从 opacity:0 改为常驻 验证:tsc 0 错误;单测 1089/1089;构建通过;verify:ui 12/12 Co-Authored-By: Claude Code <noreply@anthropic.com>

3 days ago

ice-static pushed to master at ice-static/fmode-app

  • f05b388e9c feat(chat): 新建对话全局只留一条,持久化唯一前提是发过消息 用户裁决: - 新建对话可在工作区或日常对话发起 - 会话列表里只保留一条「新建对话」,别处新建时之前的直接清掉 - 不是定时清理,新建/切换那一刻就收敛 - 持久化的唯一前提是在该会话里发过消息 修复: 1. moveTo 对未落库会话不再发请求(原先新建到工作区就直接 upsert 落库) 2. pruneEmpty 改为「全局只留一条」:未落库删本地不发云端请求, 已落库删本地 + 云端软删;去掉 60 秒保护期 3. startBlank 取消同归属复用,每次新建并立刻清掉其它空壳 4. ChatService.open 进入时先收敛,切走时清掉上一条空会话 验证:tsc 0 错误;单测 1085/1085;构建通过;verify:ui 12/12 Co-Authored-By: Claude Code <noreply@anthropic.com>

3 days ago

ice-static pushed to master at ice-static/fmode-app

  • 9f5ef803bd feat(chat): 无会话时隐藏顶栏 顶栏内容(头像 / 容器名 / 会话名 / 状态 / 工具栏)全部依附于当前会话, 无会话时只是排不产生作用的控件,还把空白态压得不够空。 渲染条件从 agentId 收紧为 agentId && currentSession。 注意只隐藏顶栏,消息区仍渲染 —— 空白态卡片就在那里。 验证:tsc 0 错误;单测 1082/1082;构建通过;verify:ui 12/12 Co-Authored-By: Claude Code <noreply@anthropic.com>

3 days ago

ice-static pushed to master at ice-static/fmode-app

  • 768a57d9f4 feat(chat): 新建对话改为本地先建、落库推迟,空白态收敛为单张说明卡 一、新建逻辑 用户要求:本地先创建列表项,有对话内容后再落库。 - create() 不再推云端,只写本地并登记 _pendingPush,左侧立刻出现「新建对话」 - 新增 commit(id):首次发消息时才真正 upsert 到云端 - 未命名会话标题统一为「新建对话」(NEW_SESSION_TITLE 常量) - 修 pushOne 无条件 add 标记导致节流失效(已落库会话每条消息都打接口) 二、空白态 - 无当前会话时,右侧只有居中一张卡(图标 + 还没有对话 + 说明 + 按钮) - 不渲染输入框、不渲染右栏,内容区垂直水平居中 验证:tsc 0 错误;单测 1082/1082;构建通过;verify:ui 12/12 Co-Authored-By: Claude Code <noreply@anthropic.com>

3 days ago

ice-static pushed to master at ice-static/fmode-app

  • 15acd05d2d fix(chat): 修复工作区新建对话归属丢失 + 刚建会话被误删 现象:工作区显示「还没有对话」,日常对话里有内容 —— 会话建出来了但归属没留住。 根因一:moveTo 用 patchChatThread,而 patch 要求云端已有该记录。 「新建对话 → 立刻移动工作区」时 create() 的 upsert 还是异步的, 云端记录尚未落地 → patch 返回 404 → 被当成成功 → 归属压根没写进云端。 下次 hydrate 拉到的 workspaceId 为空,会话掉回「日常对话」。 → moveTo 改用 upsert(幂等,两种时序都正确) 根因二:新建后换 URL 触发第二轮 onRouteChange → open() → 又一次 pruneEmpty, 那一轮 keepId 因路由时序可能还没指向新会话,刚建的 0 条会话被当场删掉。 → pruneEmpty 给创建 60 秒内的空会话保护期 验证:tsc 0 错误;单测 1082/1082(新增 3 条回归);构建通过;verify:ui 12/12 Co-Authored-By: Claude Code <noreply@anthropic.com>

3 days ago

ice-static pushed to master at ice-static/fmode-app

  • 4b0059734b fix(chat): 修复新建对话后左侧列表没有内容 现象:点「新建对话」后聊天区是新的,但左侧列表里没有条目。 真根因(两个坑叠加): 1. create() 是异步推云端的,新建对话紧接着换 URL → 重新 open() → 又拉一次云端。那一刻云端还没有这条,hydrateFromCloud 按 「云端没有就丢弃」处理,刚建出来的会话当场消失 2. navigateByUrl 是异步的,紧接着调 pruneEmpty(chat.sessionId()) 时 会话指针还没切换,刚建的 0 条消息会话被当成空壳删掉 修复: - 新增 _pendingPush:本地已建但未确认推到云端的会话 id, hydrateFromCloud 整体替换时保留(推送成功后才撤销标记) - pushAll 成功时同样撤销标记 - onRouteChange 的 new 分支:建好 → 换 URL → 直接 return, 不再走 pruneEmpty;空壳收敛只发生在进入正常会话的分支 验证:tsc 0 错误;单测 1080/1080(新增 2 条回归);构建通过;verify:ui 12/12 Co-Authored-By: Claude Code <noreply@anthropic.com>

3 days ago

ice-static pushed to master at ice-static/fmode-app

  • 8816e9626f feat(chat): 新建对话改为点击即建,左侧立刻出现并选中 用户反馈:点「新建对话」后在左侧看不到任何条目,不知道操作有没有生效。 上一版是「首次发消息才建会话」——绝无空壳,但点击没反馈。 变更: - startBlank 立刻创建会话并选中,归属到对应工作区 / 日常对话 - 同容器 + 同归属下已有空会话时复用,连点不会攒出一排「新对话」 - 建出后立刻 replaceUrl 到真实会话地址,左侧高亮走 URL,刷新不回 new - 恢复 pruneEmpty:打开容器/切会话时收敛空壳(同步软删云端记录) 过程中修掉的缺陷: - startBlank 原先调用 open(),而 open() 会顺带打开「最近会话」, 把 _sessionId 指向别的会话 — 测试实测连点新建变成两条 - 建出的空会话 state 是 empty,发出消息时未切 ready,消息区继续渲染空态 验证:tsc 0 错误;单测 1078/1078(新增 5 条);构建通过;verify:ui 12/12 Co-Authored-By: Claude Code <noreply@anthropic.com>

3 days ago

ice-static pushed to master at ice-static/fmode-app

  • c15494c0f2 feat(workspace): 工作区上云,新建 FmodeWorkspace 表 背景:工作区此前只存 localStorage,换设备后文件夹全丢, 而会话的 workspaceId 还在云端——归属无处安放,只能落进「孤儿」区。 选型核查:逐表检查平台 873 张业务表 + 5 张 Fmode 表,无一张可复用。 - FmodeWorkGroup 是群聊表(roomId/members/goal),语义不同不能混用 - FmodeChatThread 是会话表,硬塞会破坏「一行一会话」,且空工作区/改名无处存放 云端(云函数 v0.1.5 已热更,复用 oR5O67i1Cm 不新开函数) - 新表 FmodeWorkspace:user / wsId / name / createdAtMs / isDeleted - 新增 op:wsList / wsUpsert(按 wsId 幂等)/ wsRemove(软删) 客户端 - WorkspaceService 接云端,syncFromCloud() 以云端为准 - 首次迁移:云端为空而本地有数据时整批推上去(老用户不丢) - create/rename/remove 同步回写 - 离线时仍可用本地(工作区是轻量组织数据,不做强一致) 验证:云函数端到端 5/5;tsc 0 错误;单测 1076/1076;构建通过;verify:ui 12/12 Co-Authored-By: Claude Code <noreply@anthropic.com>

3 days ago

ice-static pushed to master at ice-static/fmode-app

  • 7923eae3e4 fix(slider,session): 刻度严格等分 + 会话名称上云 一、字体滑块刻度改为等分 根因:刻度按字号数值在 13~20 线性定位,采样点 13/16/17/18/19/20 时 前两格间距是其它格的 3 倍;且 6 个刻度配 8 个档位必然对不上。 - ui-slider 新增 marksEvenly 输入,按下标均分而非数值比例 - 字号滑块改用档位下标(0..7)作为值,刻度数与档位数一致(8 个) - 手柄、轨道填充、刻度共用同一套等分坐标,拖动时永远落在刻度上 二、历史会话名称显示成「新对话」 根因:noteMessage() 只写本地、从不推云端。标题/计数/时间全在浏览器里, 云端记录一直停在「新对话 / 0 条消息」,换设备或重新拉列表就退回默认名。 - noteMessage 在标题变化或距上次推送 >10s 时 upsert 到云端(节流) - 新增 lastPushAt 记录推送时间 - 新增 2 条回归测试:标题变更必须上云、短时间内不重复打接口 数据:清理云端 2 条历史遗留空会话,该账号现只剩 1 条正常会话 验证:tsc 0 错误;单测 1076/1076;构建通过;verify:ui 12/12; 已用 Chrome 渲染截图核对 8 刻度等分效果 Co-Authored-By: Claude Code <noreply@anthropic.com>

3 days ago

ice-static pushed to master at ice-static/fmode-app

  • a164b51e99 feat(slider): 字体大小滑块按参考稿重做视觉 - 轨道 3px,已填充深色、未填充浅灰,对比清晰不厚重 - 手柄改为小号胶囊(8×20),浅芯 + 深边描边,明暗两套主题都可辨识 - 6 个等距刻度短线,仅第 1/2/6 个带文字(小 / 默认 / 大) - 刻度线紧贴轨道下沿,读起来像从轨道长出的标尺 - 刻度与手柄共用同一百分比坐标系,容器左右留内边距,首尾文字不被裁 - 移除设置页外部那套 legend,避免与滑块自带标签重复且对不齐 - 新增 ui-slider 的 label 输入,用于无障碍命名(原生 range 无可见文案时读屏只能念「滑块」) - 新增 prefers-reduced-motion 支持 验证:tsc 0 错误;单测 1074/1074;构建通过;verify:ui 12/12;已用 Chrome 实际渲染截图核对效果 Co-Authored-By: Claude Code <noreply@anthropic.com>

3 days ago

ice-static pushed to master at ice-static/fmode-app

  • f01d177809 fix(workspace): 工作区归属上云 + 输入中指示器归位到消息流末尾 问题一:在工作区里新建对话,结果掉进「日常对话」 根因两层: 1. ChatSession.workspaceId 从未上云,hydrateFromCloud 重建列表时靠本地缓存捡, 捡不到就回落 null(日常)—— 换设备/清缓存/刚新建未落盘都会触发 2. ownerOf() 写成 workspaceSvc.byId(id) ? id : null, 工作区列表晚于会话到达时会被静默改判成日常 修复: - 云端 FmodeChatThread 新增 workspaceId 字段(云函数 v0.1.4 已热更并端到端验证 5/5) - ChatThreadUpsert / ChatThreadRecord / patchChatThread 全链路补齐 - toUpsert 带归属;hydrateFromCloud 改为云端优先,云端为空才回落本地(兼容旧数据) - moveTo 同步 patch 到云端,用 '' 表示日常(空串是合法值,不能用真值判断) - ownerOf 直接返回 workspaceId,不再因工作区存在性改判 - 新增 orphanSessions 兜底:归属指向已删工作区的会话单独展示,不允许消失 问题二:容器「正在输入」动画位置不对 - 从输入框上方的独立槽位移入消息流末尾,出现在下一条消息的位置 - 修滚动:effect 改用双层 rAF,等 DOM 插入后贴底,否则指示器落在视口外 验证:tsc 0 错误;单测 1074/1074(新增 3 条工作区回归);构建通过;verify:ui 12/12 Co-Authored-By: Claude Code <noreply@anthropic.com>

3 days ago

ice-static pushed to master at ice-static/fmode-app

  • aa8830238d fix(chat): 新建会话后不停留在新建流程区 根因两处叠加: 1. startBlank() 把 state 置为 empty,首条消息建出会话后只设了 _sessionId, 没有把 state 切回 ready —— 消息区按 state 分派,继续渲染「还没有对话」 2. 待建态(选完容器未发消息)与「该容器无会话」都满足 !currentSession(), 被混为一谈,导致刚点完新建就提示「去点新建对话」 修复: - ChatService 新增 pendingNewSession 信号,明确区分两种状态 - 首条消息建出会话时同步 state=ready 并清除待建态 - openReal 打开真实会话、close 离开页面时复位待建态 - 待建态显示欢迎引导且输入框可用;真无会话才提示新建 - 待建态建出会话后 URL 用 replaceUrl 换成真实会话地址(避免刷新回空白页) 验证:tsc 0 错误;单测 1071/1071(新增 3 条回归);构建通过;verify:ui 12/12 Co-Authored-By: Claude Code <noreply@anthropic.com>

3 days ago

ice-static deleted branch fix/session-and-ui at ice-static/fmode-app

3 days ago

ice-static pushed to master at ice-static/fmode-app

  • 4ed298b7c7 chore: 撤回 .gitignore 忽略规则,补齐此前未入库的文档与素材 按用户裁决:内部仓库不考虑安全问题,明文凭据与截图素材允许入库。 - 移除对直连手册 / 登录凭据文档的忽略 - 移除对 image/ 截图素材的忽略 - 移除对 pnpm-lock.yaml / pnpm-workspace.yaml 的忽略 Co-Authored-By: Claude Code <noreply@anthropic.com>
  • 0f14056a06 fix(session): 会话目录单向同步 + 渲染预览修复 + 多端 UI 收敛 会话存储逻辑重构(根因:云端查重键含 roomId,房间变化即产生孤儿重复记录) - 云端会话目录改为唯一真相源,合并规则全部删除(不再「本地有云端没有就保留」) - 云端不可达时列表置为空并显示「加载失败 + 重试」,不展示过期缓存 - 本地缓存键改为 v2(一次性失效旧缓存) - 取消「空会话」:新建对话只进入待建态,首次发消息才创建会话 - 彻底关闭从 Matrix 房间扫描重建会话目录(删除 session-scan) - 删除 pruneEmpty / discard / ensureFor / mergeScanned 云函数 fmodeagent-chatthreads v0.1.3(已热更并端到端验证 9/9) - upsert 查重键从 (user, roomId, threadRoot) 改为 (user, threadRoot) 全局查 - 命中多条保留最新、其余物理删除,返回 collapsed 计数 - upsert 一律解除墓碑,不再依赖客户端传 revive 预览组件 - txt/代码缩放改为只影响字号,修正「位置在动、字没变」(去掉滚动补偿与内层 overflow) - 新增全局错误处理器,仅静音 Matrix SDK 断开时的 AbortError 交互与 UI - 「重新连接」失效修复:open() 新增 force 参数绕过幂等短路 - 登出停轮询、重登重启轮询并清理上一账号内存态(消除 401 刷屏) - 会话行补上删除入口(二次确认),归档也改为二次确认 - 成果卡片与「文件」栏统一:整行可点预览 + 进入箭头 - 个人中心左栏粘住跟随,断点改为 below-mobile 避免缩放下堆叠 - 设置页可查看/复制登录 Token(默认打码),移除无效的「重新登录」 - 移除群聊上下文开关、任务页「返回」、页脚版本号 - 界面文案去除 Matrix 等技术名词 验证:tsc 0 错误;单测 1068/1068;构建通过;verify:ui 12/12;verify:docs 79 文件 Co-Authored-By: Claude Code <noreply@anthropic.com>
  • View comparison for these 2 commits »

3 days ago