InsClaw 客户端发版
internal
当前最新Beta· 2026年6月1日

v0.4.0-beta

本次更新

[0.4.0-beta] - 2026-06-01

🚀 GEO 监测报告生成器 + 客户端 dev/prod 双 scheme 隔离 + 网媒打标 V2 + portal 部署稳定性

本版本主线是面向客户的 GEO 监测报告全新功能:从监测中心一键生成图文结合、可白标、可流式生成、可导出 PDF 的售前/汇报报告(独立 BrowserWindow + V2 麦肯锡风模板 + Paged.js 真实分页 + Electron printToPDF)。同时落地了三块基础设施重构:① 客户端 dev/prod 双 scheme 隔离insclaw:// / insclaw-dev://),让开发者本机 dev Electron + prod InsClaw 同时运行时 macOS LaunchServices 不再错投递 deep link;② 网媒打标任务中心 V2(持久化 + 互斥锁 + 失败队列 + worker pool 并发 + Gemini 3)+ 单轨化清理;③ portal 与 server 的部署稳定性全套修复(trust proxy + 真实 IP 转发 + IPv6 rate-limit 归并 + Next-Action 拦截 + 字体本地化)。

Added

  • GEO 监测报告生成器(efe34ee → cfd60a2,30+ 提交):监测任务面板底部新增"生成监测报告"主按钮,点击后异步任务后台跑,进度通过 report-task:* IPC 实时推到面板;完成后用户主动点"查看报告"打开独立 BrowserWindow 加载主进程渲染的 V2 模板 HTML(顶层文档,@page 分页 / Paged.js polyfill / printToPDF 才能正确生效)。报告结构:封面 + 执行摘要 + 8 章正文(信息可见度 / 情感归因 / 竞争生态 / 内容生态 / 趋势对比 / 提及深度 / 行动总分总 / 诊断聚合),其中 brand / sentiment / competitor / ecosystem / trend / mentionDepth / action / diagnosis 八个 Agent 章节均按"总分总"叙述(图下判断 + per-platform 引述)。技术亮点:① viewModel 契约单一真源,确定性数据 + LLM JSON narrative 严格分层;② Handlebars + partial 主壳模板工程化,每章独立 partial;③ Paged.js 0.4.3 屏幕预览 ≡ PDF 导出(@page running header、string-set chapter-label、@top-left/@bottom-right 页眉页脚、break-before/break-inside avoid 守护单卡片);④ 失败章节单独重试面板(不消耗报告额度);⑤ 本地数据为空的章节跳过 LLM 调用,直接渲染统一空状态占位(chapterEmpty);⑥ per-platform 信源层确定性扩展(reportNormalize.js)+ enriched 全量并入避免内容生态等章节空白;⑦ PDF 导出webContents.printToPDF + 保存对话框;⑧ 白标配置支持自定义品牌/Logo/页眉页脚,0.4.0-beta 暂时隐藏入口(HIDE_WHITELABEL_ENTRY flag)但底层管线完整保留;⑨ 错误页 + 重试取代 V1 React 回退路径(loadFile 失败时显示明确错误页,单一渲染方案唯一性);⑩ 端到端契约测试 tests/test-report-*.js 钉死生成清单 ↔ V2 模板不漂移。
  • 客户端 dev/prod 双 scheme 隔离 deep link(e7c8501 + 139354a + eaa2900)src/main/services/protocolHandler.js 新增 getScheme()(按 app.isPackaged 派生 insclaw://insclaw-dev://)+ installProtocolHandler({ isDev }) 单一收口;package.json build.protocols[0].schemes 永久只列 prod scheme insclaw,dev scheme 仅运行时 setAsDefaultProtocolClient 注册(永远不写 plist)。portal desktop-login 白名单同时允许两类 callback。永久红线:prod scheme 是项目级永久契约,等同于 API URL;线上跨用户碎片化(v0.3.x / v0.4.0 同时在用)是常态,改 prod scheme = 让所有未升级旧客户端登录全断。详见 docs/系统部署与协同手册.md §7 不变式 #6。
  • 网媒打标任务中心 V2(29cf263):持久化任务表 + 启动互斥锁(防止同 catalog 并发打标污染)+ 失败队列(自动重试 + 手动重跑) + 任务详情抽屉 UI(实时刷新节点状态 / 滚动加载更多 / 「正在打标」徽章)。
  • 行动方案推荐快照持久化 + 发布弹窗双分组重塑(5737ac1):用户在 Dashboard 看到的"推荐行动"会持久化到磁盘,刷新后保留;发布弹窗按"推荐 / 已订阅"双分组展示,避免长列表淹没。
  • Dashboard 卡片标题旁"问号说明"浮层(f071aa3):所有 KPI 卡片支持 hover 显示口径定义,不再需要查文档。
  • portal/bff SSR 全链路转发访客真实 IP(eba1a17):portal 作为 BFF 转发到 server 时,把 x-forwarded-for 链路完整透传,server 端的 rate-limit / 审计能拿到真实访客 IP。

Changed

  • 网媒打标交互大重构(ed18cf6 + 73d6474 + 00dc2b8 + cc19b4d):① 打标改为逐条调用 + worker pool 并发(替代旧的批量单次大请求) + Gemini 3 模型;② admin-ui 打标交互降级为目录管理的批量操作,去掉抽屉/Modal 化;③ 清理打标任务中心双轨期残留(V1 旧路径 + V2 新路径),统一为单轨实现;④ 打标候选不再硬编码屏蔽百家号(业务策略从代码下沉到运营配置)。
  • portal/fonts 中文字体改用系统字体栈(4be4cad):移除 Google Fonts 运行时依赖,国内访问 portal 不再被字体加载阻塞首屏。
  • server/trust-proxy + 客户端 IP 抽取统一(a06e35d + 232a921):Express app.set('trust proxy', ...) 启用,新增 lib/getClientIp.js 单一收口;rate-limit keyGeneratoripKeyGenerator 归并 IPv6 子网(000af0e),避免一个 IPv6 用户拿满整个 /64 段绕过限流。
  • 下线 V1 React 报告渲染路径(24aad35):报告窗口统一加载主进程渲染的 V2 HTML 作为唯一方案,去掉 React 路由回退分支。
  • 章节集合对齐 V2 模板(f2ca4ad):下线两个孤儿章节,生成清单严格 == 模板 partial 集合,进度计数全链路对齐。
  • 报告卡片在刚生成完保留执行摘要 + KPI 数据摘要(00e7aa9):发起者面板 done 态优先用 hook 内存里的 task.results,避免被持久化快照"抢先命中"退化成"封面 + 按钮"。

Fixed

  • auth / 登录后偶发卡 needActivation 自动恢复(6c8640e)SessionContext'authorized' 事件后做一次入口 entitlement 自检,发现状态卡死时自动重新拉取,不再需要手动重启客户端。
  • auth / offline_expired 退回登录页 + toast(2462226):离线 token 过期时不再停在激活页,而是回退到登录页 + 顶部 toast 提示用户重新扫码登录。
  • portal/middleware 拦截扫描器伪造的 Next-Action POST 请求(6c5ce03):避免 Next.js Server Actions 被外部恶意构造调用。
  • profiling/stats 500(6dc9a06 + bc60f7d):SQL 别名反引号化 + 错误细节透传定位 500 根因;后续 c812ebe 切回标准 _sendProfilingError 收口。
  • profiling 任务详情多个 race(c51b32c + 55b1904 + 1d5b5e5):① 滚动加载在快速切 filter 时的 race;② 任务运行中详情列表不再"折叠后展开";③ 任务详情深页节点 status 不刷新。
  • network-media/catalog 编辑/新增媒体时同步 profiling_status(aab494d):避免老媒体被改后打标状态错位。
  • admin-ui/network-media 统一打标按钮口径(fab1f8b):补全勾选打标警示,避免误触发大批量任务。
  • report 系列稳定性修复:① PDF 导出与 Paged.js 页眉页脚稳定性(3c6964f);② 品牌缺席时情感分布不再误判中性 100%(56e5a8d);③ 前端生成进度步骤对齐当前章节结构(13fb167)。
  • report / 暂时隐藏「白标设置」入口(cfd60a2):监测任务面板"生成监测报告"按钮下方的"白标设置"折叠按钮 + 展开面板暂时隐藏(仅 UI,保留 state / brandConfig payload 兜底走默认品牌),后续品牌定制功能上线时移除 HIDE_WHITELABEL_ENTRY flag 即可恢复。

Removed

  • 下线 V1 React 报告渲染路径(24aad35):报告窗口不再回退到 React 路由,渲染失败统一显示错误页 + 重试按钮。
  • 清理网媒打标任务中心双轨期残留(00dc2b8):V1 旧路径完全移除,统一为 V2 单轨。
  • profiling 批量打标 dry_run 模式(d4c1300):实际从未启用,下线减少分支。

历史版本

  1. v0.3.3-betaBeta

    ️ 引用链接卡片来源分离 + UI 文案「提示词库」对齐

    更新日志

    🛠️ 引用链接卡片来源分离 + UI 文案「提示词库」对齐

    本版本两个改动:① geo-monitor 在引擎层把"卡片来源"与"整页扫描兜底"显式拆开,下游优先消费卡片来源,干掉 Kimi 等平台把官网导航/历史会话链接抽进引用列表的污染;② 用户侧把「关键词库」相关文案统一改为「提示词库」(侧边栏 tab + 页面标题 + 个别交互文案),仅文案层,未触及任何字段名 / tab id / 组件名 / props。

    Changed

    • engine + agent / 引用链接卡片来源分离 + 下游卡片优先取值:引擎只负责"抓",下游 geoAgent 负责"选"。inspector-engine.js 新增 cardLinks 字段(与 links 并行输出):Method 1 引用面板卡片 + Method 2.5 embeddedCards 双推 links + cardLinks,Method 2/3/4/5 兜底来源仅推 linksaddLink 末尾 return item 让卡片 Method 同步推同一引用、零数据漂移;Input not found / catch err 两处 early-return 也补 cardLinks: []geoAgent.js 新增 _pickPreferredLinks(result) helper(卡片非空时用 cardLinks,缺失/非数组/空数组严格回退 result.links),runInspectorOnlyrunInspectorsParallel 两个消费点统一调用。Kimi excludeDomains'kimi.com'(新主域名兼容),引擎 endsWith('.kimi.com') 一条覆盖所有子域,拦截 www.kimi.com/{docs,slides,chat/{uuid}} 等导航 + 历史会话链接。100% 不断链:Array.isArray + cards.length > 0 严格大于零 + result.links 完整保留 → 任何字段缺失/异常自动降级走兜底;links 数组保留全量、向后兼容旧引擎。配套 23 项单测 tests/inspector-cardlinks-fallback.test.js 全绿。
    • client / UI 文案「关键词库」统一为「提示词库」:仅 UI 文案,未触及任何代码标识。涉及位置:Sidebar 侧边栏 tab(关键词 → 提示词库)、KeywordsTab 顶部 H1 与「初始化关键词库」标题、KeywordMatrixStep 保存到词库的 tooltip / 提示文案、KeywordGeoReportDrawer「添加到关键词库」按钮、CreateContentModal「从关键词库」tab 标签与空态文案。保留表格列头 / placeholder / CSV 表头 / 「添加关键词」按钮等单条「关键词」字眼(指代词条本身,不指代集合)。KeywordsTab 组件名 / activeTab === 'keywords' / props 名等结构性标识 100% 不动,零功能影响。
  2. v0.3.2-betaBeta

    ️ 修复新建项目被瞬时误判为只读

    更新日志

    🛠️ 修复新建项目被瞬时误判为只读

    本版本专修一个高频体验 bug:用户新建项目时,顶部立刻弹出「当前项目已超出专业版项目数上限,已转为只读,可继续查看」红条,但实际并未超 cap;切换 Tab 或在 Sidebar 切换项目再切回来,banner 又自动消失。根因是「客户端 activeProject 已切到刚建的新项目 id,但 licenseInfo 还是创建之前的快照、writableProjectIds 不含新 id」的 race window,要等下次 window focus / SSE 触发 refreshEntitlements 才自愈。本次走两路修复互为兜底:UI 判定改为正向;主进程在服务端镜像写成功后立即 fire-and-forget 触发 entitlement 刷新,让数据真正一致。

    Fixed

    • client / 新建项目瞬时误判为只读 bannerfrontend/src/App.jsxisCurrentProjectReadOnly 原本用 !writableProjectIds.includes(activeProject.id) 的反向判定,create-project 完成后 setActiveProject(新id) 立刻命中(因 licenseInfo 是旧快照),顶部 ReadOnlyBanner 当场弹出。改为 readOnlyProjectIds.includes(activeProject.id) 的正向判定,与 Sidebar.isProjectReadOnly 完全对齐;entitlement 尚未同步到的本地新项目天然不在任何列表里 → 视为可写(fail-open),UI 当场就对,无需等异步刷新。其它消费方(KeywordsTab / ContentTab / GeoWorkbench / ManagedTab / KnowledgeTab)通过 props 传递的 isCurrentProjectReadOnly 一并受益。
    • main / requestCreateProject 后主动刷 entitlement 让数据真正一致src/main/services/userResourceSync.jsrequestCreateProject 在服务端 POST /api/user-resources 200 ok 后,新增 fire-and-forget 调用 sc.refreshEntitlements(),让 server entitlement.aggregate 重新切分出包含新项目 id 的 ownedProjectIds / writableProjectIds / readOnlyProjectIds,通过现有 sessionContext.entitlementUpdated 事件广播给渲染进程,useAuth.onChange 被动同步 licenseInfoApp.jsx / Sidebar.jsx 等调用方零改动;不 await 不阻塞 IPC;新增单测加固 200 ok 后必须触发一次 refresh,避免回归。
  3. v0.3.1-betaBeta

    ️ 关键词管理 5 问题修复 + 弹窗配额预算前置 + 删除二次确认

    更新日志

    🛠️ 关键词管理 5 问题修复 + 弹窗配额预算前置 + 删除二次确认

    本版本聚焦关键词管理 Tab 用户反馈的 5 个易错点,根因都集中在「前端不消化主进程 IPC 返回值 + 顶部 drag 浮条物理盖住按钮 + 新词进队尾不易察觉」三条链路。修完同时把"配额预算"从"点提交才告知"前移到"弹窗里实时算",并给所有删除入口接上项目通用 ConfirmDialog 二次确认。配套小修:数据中心标题栏给卡片 hover 上浮留出 4px 缓冲。

    Fixed

    • client / 关键词添加按钮上半被 drag 浮条吞点击:原 App.jsx 顶部 absolute h-11 drag z-20 浮条作为 z-20 DOM 元素物理盖住下方按钮上半 16px(KeywordsTab 添加按钮 y=2858 与浮条 044 重叠 2844),DOM 事件命中浮条 → 浮条没 onClick → 冒泡到父级而非按钮 → 点击丢失。button 全局 no-drag 规则只控制窗口拖动 region 不影响 DOM hit-test。修复方案:drag 浮条加 pointer-events: none,让 DOM 事件穿过浮条命中按钮,drag region 由 Chromium 在 mouseDown 时单独从全局 region 集合查询、不依赖 DOM 事件,所以窗口拖动不受影响。这是全局修复,DashboardTab 顶部"刷新"按钮等所有落在 044px 内的按钮一并受益。
    • client / 手动连续添加多条只生效 1 条 / 弹窗输入多条点添加无反应 / 降级超 cap 后删除失败:根因都是 keywordAgent 7 个写方法吃 React 漂移的 existingData 入参 + 不检查 saveKeywords 主进程返回值。当主进程 cap_guard / access guard 拒绝写入(quota_exceeded / project_read_only)时,前端把 result.data 当成功一律塞回 state,与磁盘真相分叉,下次 refreshList 又从磁盘读回正确版本,呈现"加了又消失/删了又回来"。本次:① keywordAgent 7 个写方法(addKeywords / deleteKeywords / updateKeyword / batchUpdate / addTagToKeywords / removeTagFromKeywords / deleteTag)统一改为不再吃 existingData、内部强制 loadKeywords 取磁盘最新版作基线、检查 saveKeywords 返回 success,失败抛 Error 把后端 payload 挂在 error.cause(保留 error / cap / current / limit / planMeta / message);② KeywordsTab 8 个 handler(handleManualAdd / handleAiCategoryAdd / handleSaveInitMatrix / handleDelete / handleBatchCategory / handleBatchIntent / handleBatchAddTag / handleDeleteTag)加 try/catch,按 quota_exceeded → 升级对话框、project_read_only → 顶部红色 listError banner(3.5s 自动消失 + 关闭按钮)、其它 → 通用 listError 三类分流提示;③ 行内 / 批量 / 标签等所有写按钮统一加 disabled={isCurrentProjectReadOnly} + tooltip,与顶部添加按钮和 ReadOnlyBanner 行为对齐,不再"按钮欢快接受点击但写下去被 access guard 静默拒"。
    • client / 新关键词出现在列表底部不易察觉addKeywordsdata.keywords = [...(data.keywords||[]), ...newItems](push)改为 [...newItems, ...(data.keywords||[])](unshift),新词出现在列表第一行,不动后端排序逻辑。

    Changed

    • client / 添加关键词弹窗 header 加"剩余 N · 已用/总额"配额徽章:以前用户只能点提交后才知道"超出上限",现在弹窗一打开就在标题旁看到「剩余 20 · 80/100」徽章,颜色随余量分档(>5 灰色 / ≤5 琥珀 / =0 红色),hover tooltip 显示"当前版本上限 100,已使用 80"完整上下文。
    • client / 手动添加 textarea 实时预算预警:新增 manualAddPreview useMemo,输入时实时拆行 + 与已有词去重(语义和 keywordAgent.addKeywords 完全对齐),下方两段信息「已输入 N 行 / 将新增 X / Y 重复」+「剩余 R 或 超出 K」;超额时 textarea 边框变红 + focus ring 变红 + 红色 banner 提示 + 提交按钮 disable,按钮文案从"添加 (N=输入行数)"改成"添加 (X=去重后实际新增数)"所见即所得。
    • client / AI 模式同步显示剩余配额:5/10/20 数量按钮中超过剩余配额的变琥珀色提示(仍可选,因 AI 内部去重,实际新增可能小于生成数),右下角显示"剩余配额 R"徽章,aiCount > remainingQuota 时显示"AI 最多生成 X 个候选词,但实际只能保存 R 个",remainingQuota === 0 时整体红色提示 + 按钮 disabled。
    • client / 关键词列表 cap 超额瘦身引导条:项目可写但关键词数已超 cap 时(典型场景:从大版本降到小版本),列表上方加一条琥珀色引导条「当前关键词数 120 已超出 xxx 上限 100,新增已停用。删除任意 21 条即可恢复正常添加」,避免用户面对 disable 的添加按钮不知道删几条能恢复。
    • client / 行内 / 批量 / 标签 3 个删除入口接 ConfirmDialog 二次确认:复用项目通用 ConfirmDialog(与 KnowledgeTab 删产品/文档/竞品、App 删项目同款),统一红色警示图标 + ESC/点遮罩可取消。文案区分关键词删除("确定要删除关键词「X」吗?此操作不可撤销",多条时展示前 3 个名字 + "等 N 个")和标签删除("确定要删除标签「X」吗?此标签将从 N 个关键词上移除(关键词本身不会被删除)"),消除"标签删除是否会删了带这个标签的所有关键词"的误解。
    • client / 数据中心标题栏 pb-2 + 滚动容器 pt-1 缓冲:原 pb-3 让滚动容器紧贴标题栏底部,顶部卡片 hover 时 -translate-y-0.5 + 1px 细边框会被外层 overflow-y-auto 裁切。拆成 pb-2 + pt-1 各自承担 4px 缓冲,视觉上仍是 12px 等距,hover 上浮空间不被裁。
  4. v0.3.0-betaBeta

    网媒智能推荐主链路(P0+P1+P2) + 行动方案角度推荐胶囊 + 项目镜像同步重构

    更新日志

    🎯 网媒智能推荐主链路(P0+P1+P2) + 行动方案角度推荐胶囊 + 项目镜像同步重构

    本版本最大主题是网络媒体投放完整闭环:从云端目录维护(P0)→ LLM 画像 + 智能推荐加权(P1)→ 自学习指标反馈(P2)三阶段一次性落齐,并在用户侧把"行动方案角度 → 推荐胶囊 → 已选清单 + 二级抽屉 → 下单"主链路打通。同时合入针对 CoolGuaTest "2/10 项目但被判 over-cap" 暴露的「项目镜像同步一致性」根因修复(客户端 tombstone 日志 + tombstone-driven 反向清理 + 服务端 add-only 铺底),Agent / GEO 主流程多处稳定性 fix,以及主界面拖拽 / 滚动条 / 数据中心标题栏的 macOS 化收口。

    Added

    • server / 网媒推荐主链路(P0 智能投放 + P1 画像 + P2 自学习闭环):完整三阶段落齐。P0(e7ad1cd):云端 catalog(CRUD + 上下架 + 权重 + 价格 + 批量操作 + 审计日志)+ 推荐服务(关键词 + 行业匹配 + 推荐缓存 + 反馈打点)+ 用户端订单服务;admin 新增「网媒目录」「网媒订单」「网媒积分」三个页面。P1(35631d7):网媒画像(industry_tags / content_form_tags / ai_citation_preference / risk_tags / keyword_affinity)参与推荐加权;admin 编辑面板支持 LLM 单条预览自动填写 + 批量打标(异步 job + 实时进度推送 + dry-run 预览);新增 server/scripts/profile-existing-network-media.js 离线打标。P2(3cd00bb):order_metrics / recommendation_feedback 数据基建 + 离线聚合脚本(30d / 90d 窗口)+ admin「网媒指标」看板(30d 单量 / 成功率 / 退款率 / 推荐采纳率 / 复购用户 / 平均耗时)。
    • client / 行动方案每个内容角度挂"推荐网媒胶囊"71bf8a9):用户在生成行动方案时,3 个 contentAngle 卡片底部直接看到针对该角度的真实网媒推荐(数据库里有 id 的媒体)。新增 AngleNetworkMediaChips.jsx 折叠 / 懒加载 / 三态(loading/empty/error)/ 胶囊渲染(媒体名 + 行业/类型 + tooltip 价格/理由)。服务端按 (projectId, contentId, actionPlanHash) 缓存推荐;前端把 angleIndex 拼进 contentId(contentId::angle::N)让不同角度独立缓存。
    • client / PublishModal 网媒 Tab 重塑为"已选清单 + 二级抽屉"b933daf):旧形态 AI 推荐展开后大列表区被压扁 + 按钮错位。新形态:AIRecommendSection 简化为"套餐 pill 控制器"(默认应用 basic 套餐);主区改为"已选媒体清单"渲染 selected Map;新建 NetworkMediaPickerDrawer.jsx 右侧滑入抽屉承载完整浏览能力(常用/筛选/搜索/大列表/分页)。selected Map 数据契约 + onToggle/onSelectMany/onRemoveMany 签名 + PublishSummaryBar + 确认下单 + ConfirmDialog 二次确认严格不动。
    • server / 项目镜像同步 Phase 0+3 服务端铺底b0ee85d,纯 add-only 不破坏老客户端):① user-resources 四端点(list/create/claim/delete)补结构化日志(含 sync_source / 失败 reason / actor_id);② admin 新增 GET /api/admin/diagnostics/resource-cap-mismatch 扫 active brand_project 数 vs entitlement cap,输出 over-by + readOnlyIds(按 createdAt 排序),支持 email/includeAll 过滤;③ 运维脚本 server/scripts/reconcile-orphan-resources.js 只读列出 over-cap 用户清单 + 生成手动 soft-delete SQL 模板,支持 table/csv/json + email/type 过滤;④ POST /api/user-resources/claim 新增可选 exclusive:true 分支调用新增的 replaceResources(事务内 resurrect items 中的 id + soft-delete 不在 items 中的 active 资源),不传或 false 时行为 100% 不变。
    • client / 项目镜像同步 Phase 1+2 客户端e9e0365,带 USE_TOMBSTONE_DELETE / USE_REVERSE_RECONCILE 双 feature flag 可即时回退):针对 CoolGuaTest 类"本地项目数 ≠ 服务端 mirror"的三个根因做客户端那一半根治。① 新增 projectTombstoneLoguserData/project-tombstones.json 持久化、原子写、损坏自愈、cap 1000 按 acked 老旧丢弃、acked 超 30 天 gc);② delete-project 改写为本地 fs.rmSync 后入 tombstoneLog 并立即触发 flushTombstones;③ userResourceSync.flushTombstones() 遍历 pending → DELETE /api/user-resources(带 X-Sync-Source: retry header),200/404 markAcked、其它 markFailed,互斥锁防并发;④ syncOnAuthorized 头部 fire-and-forget flushTombstones + tombstone-driven 反向清理审计(pending hit 触发 flush、untracked 显式保留作多设备场景兜底,详见 docs/03-业务功能/多设备数据同步方案.md)+ 本地为空但 remote 非空时跳过反向清理(fresh install / 清 userData 防护)。配套监控运行手册:docs/03-业务功能/项目镜像同步监控手册.md(4 指标 + SOP)。
    • server / admin 激活码备注字段licenses 新增 notes TEXT NULL(运营备注,批次/客户/用途等)。POST /api/admin/licenses/generate 新增可选参数 notes,本批次生成的激活码共享该备注;新增 PATCH /api/admin/licenses/:id 端点用于事后编辑(严格白名单仅允许 notes 字段,避免误改 status/plan/agent_id 等核心列影响分润口径)。前端 licenses.html 生成弹窗加备注 textarea、表格新增「备注」列与行内编辑、CSV 导出同步加列;管理后台激活码列表新增"使用用户"列(d200719),便于追溯消费人。
    • server / admin 后台授予渠道来源POST /api/admin/users/:id/grants 接受可选 agentId 参数,路由先校验 agent 存在且 status='active',再透传给 entitlementService.addGrantSource;后者将 agent_id 写入 entitlement_sources.metadata.agent_id(不参与 aggregateSources 聚合,valid/plan/expiresAt 计算零变化)。前端 users.html 详情抽屉 grant 表单新增「渠道来源」下拉(默认"官方直销",预选用户已有 users.agent_id),授权来源列表对 grant 类型解析 metadata 渲染渠道徽标。

    Changed

    • client / 顶部标题栏 44px 自然拖拽浮条1b7a9cd):原本主区域顶部只有一条 12px 拖拽条,需要精确瞄准窗口顶部窄边才能拖窗,与 Cursor / 微信等 macOS App 整条标题栏可拖的体验差距较大。本次在 App.jsx 顶部叠加 absolute 定位的 44px drag 浮条(标题栏标准高度),z-20 不占布局,下方所有按钮/标题/内容位置完全保持原样;index.css 给 button / input / textarea / select / a 全局加 no-drag,44px 范围内按钮位置自动从 drag region 中被减去 → 按钮可点击,按钮间空白可拖窗。只读 banner 显示时禁用浮条回退到原 12px 拖拽条;browser tab 不启用(其工具栏已自带 drag 处理)。
    • client / 全局滚动条改为 macOS overlay 隐形风格cee0319 + 17af39c):默认不占布局透明隐形,hover 时浮现胶囊型滑块,与 macOS 系统体验完全一致。两次 commit:首次把全局滚动条统一改为 macOS 风格胶囊(圆角 + 灰底);二次进一步改为 overlay 隐形风格。
    • client / 数据中心标题栏固定顶部42992bb):原 Dashboard 标题放在 overflow-y-auto 滚动容器内部,往下滚标题就跟着滚走;监测中心 GeoWorkbench 早已采用"flex-col + 标题 shrink-0 + 内容 flex-1 overflow-y-auto"的 pattern。本次把 Dashboard 改成同款结构标题始终可见;视觉位置完全等价(pt/pb/px 全部不变);animate-in-scale 上提到外层让整个 Tab 一起淡入入场更连贯。

    Fixed

    • client / Agent 最后一轮 tools=none + 进度排序 + 字典 token 自愈3ee30a0):解决"循环结束仍无最终输出 → 降级非流式"高频出现。① _streamAgentRound 引入 isFinal 参数:仅在最后一轮 emit answer_start,避免中间轮次模型输出片段文本时前端误显示"生成行动方案中",导致进度步骤出现"0步已完成 → 行动方案生成中 → 工具检索"乱序;② 主循环识别 isLastRound:最后一轮强制 tools=[] + tool_choice='none' 直接索要 JSON,若模型仍回 tool_calls 直接忽略取 finalContent 兜底;③ llm-response-utils.stripModelNoise 增强移除 DeepSeek 私有 DSML token(<||DSML||tool_calls> / <||DSML||invoke ...>)及通用 <tool_call> / <function_call> 痕迹标签;④ networkMediaDictionary 字典预热:_fetchOnce / _resolveAccessToken 改为接受 getAccessToken 回调而非静态 token,每次重试取最新 token,避免冷启动时拿到过期 token 永远 401;新增 tokenRefreshed 监听 token 刷新后若字典仍未缓存则自动补刷一次。
    • client / ActionPlanAgent 流式超时导致 abortedd2e41ec):普通轮 SSE 超时 90s → 180s;最后一轮无工具收 JSON 单独 300s;catch 中对 Abort/aborted 打根因提示。新增 docs/03-业务功能/GEO/geo-action-plan-agent-logs.md 主进程日志对照表。
    • client / 网媒 prompt 与 JSON 解析回归08d87c4):geoActionPlan agent 的 networkMediaProfile 字典推断 + JSON parse 健壮性增强;落 inputDigest / parseSource / outputSize 三件可观测日志。
    • server / 网媒推荐反馈鉴权 + metrics 聚合脚本目标库守卫4ae1e46):补 admin 反馈端点鉴权 + 限制聚合脚本只能跑在已配置的目标 DB(防止误打到 dev DB)。
    • server / 网媒推荐 source 列扩宽 + 长关键词分词降级70edcd1):migration 042 把 network_media_recommendations.sourceENUM('llm','rule_fallback','mixed') 扩成 VARCHAR(32) DEFAULT 'rule_p1',修复 P2 引入 rule_p1 / rule_p2 后写缓存触发 Data truncated for column 'source' SQL 错误(接口 500、推荐看不到的根因)。networkMediaRecommendService._coarseFilter:当 networkMediaProfile 缺失、仅有长句关键词(如"台球厅会员数据怎么从旧系统迁移?")时,按中英标点+空格切词 + 过滤停用词 + 对 2-12 字片段做 LIKE OR 匹配,最多 12 个片段;切不出有效片段时按 weight 兜底,避免长句 LIKE 永远 0 匹配。
    • client / 无 networkMediaProfile 时仍展示网媒智能推荐9726129):之前无画像时直接隐藏 AI 推荐区,本次改为基于关键词降级展示通用推荐,UI 上与"已有画像"路径对齐避免用户体验断链。
    • admin / 网媒指标页左侧导航消失 hotfix9932eaf):network-media-metrics.html 漏写了 admin 页面统一的两行初始化(checkAuth() + renderNav('network-media-metrics')common.jsADMIN_NAV_GROUPS 已登记 metrics 项)。补回与其他 17 个 admin 页面完全一致的两行;未登录访问该页面现在会自动跳转 /admin/login.html

    Database Migration

    • 035_licenses_notes.sqlALTER TABLE licenses ADD COLUMN notes TEXT NULL,新列可空、向下兼容老 INSERT。回滚:ALTER TABLE licenses DROP COLUMN notes; + 删除对应 _migrations 行。
    • 036_network_media_availability.sqlnetwork_media_catalog 新增 availability ENUM('online','offline') + 软删字段,支持上下架管理。
    • 037_network_media_audit_log.sqlnetwork_media_audit_log 新表,记录 catalog 所有写操作(create/update/bulk_update/soft_delete/restore)的 diff + actor。
    • 038_network_media_recommendations.sqlnetwork_media_recommendations 新表,推荐结果缓存(按 projectId/contentId/actionPlanHash 维度)。
    • 039_network_media_profile.sqlnetwork_media_catalog 新增 5 个画像字段(industry_tags JSON / content_form_tags JSON / ai_citation_preference VARCHAR / risk_tags JSON / keyword_affinity JSON)。
    • 040_network_media_metrics.sqlnetwork_media_order_metrics 新表,30d / 90d 窗口聚合(单量、成功率、退款率、复购用户、平均耗时)。
    • 041_network_media_recommendation_feedback.sqlnetwork_media_recommendation_feedback 新表 + 采纳率(applied / shown)字段,支持 P2 自学习。
    • 042_network_media_recommendations_source_widen.sqlnetwork_media_recommendations.sourceENUM('llm','rule_fallback','mixed') 扩成 VARCHAR(32) DEFAULT 'rule_p1',兼容 rule_p1 / rule_p2 标识。

    server / portal(独立部署,不打入客户端)

    • portal / GEO 叙事预览页与营销首页迭代55dff31):portal 端独立部署,已随 server commit 一起 push 到 https://insclaw.jingya.ai,新增 7 链路架构介绍 + GEO 叙事预览页 + sitemap + 多语言文案。

    已知不向前兼容点

    无。本版客户端:

    • LLM Auth / SC 状态机 / SecretManager / 'authorized' 事件总线 / _emitAuthorized 触发条件均与 v0.2.3-beta 完全一致;
    • 项目镜像同步客户端逻辑全部带双 feature flag 可即时回退到 v0.2.3-beta 行为;
    • 老客户端(v0.2.3-beta 及更早)安装在用户端不需做任何操作,与 server 端 add-only 改动 100% 向后兼容。