caoqianming
|
eb45e771fa
|
fix(rendering+chip): 修 task d9c74a5a 三处独立缺陷——chip 粗体路径 404 / docx emoji 缺字 / 单文件被迫建 sections(bump 0.58.37)
一次"今日新闻 md→word"暴露三个不相干的坑,逐个定层修:
1) 前端文件 chip 点开弹框 404 —— media.js::extractArtifactRels 的 tail
字符集 _TAIL_CLS 没排除 `*`,助手把路径写成 markdown 粗体
`**<wd>/x.md**` 时前导 `**` 被 lead 边界吃掉、尾部 `**` 被贪婪吞进
rel(星号既不在 tail 集也不在尾部 strip 集),生成 `x.md**` →
/v1/files/download 404。修:`*` 加进 _TAIL_CLS 排除集,同反引号一样
在 emphasis 处干净截断;文件名含 `*` 在 Windows 非法、误伤≈0。
2) 导出 word 图标(emoji)缺失 —— docx_manuscript 正文/标题字体是宋体/
黑体/Times New Roman,无 emoji 字形,📰🔥🇨🇳📊 写进宋体 run →
Word 渲染成豆腐块。修:common.py 加 EMOJI_RE + add_fonted_runs
(按 emoji 边界拆 run,emoji 段走 Segoe UI Emoji、其余走原中西文字体),
接进 _emit_plain_with_chem(不破坏化学式下标)与 add_inline
(bold/italic/code);标题走 add_inline 自动覆盖。
3) 过程中冒出 sections/ 文件夹 —— render.py docstring 承诺 src 可为
"目录或单个 .md",但 docx 三 profile 的 render_sections 全是 is_dir()+
glob 只认目录(只有 pdf 支持单文件),模型传单 .md 撞
`sections dir not found` → 被迫 mkdir sections && cp 兜底。修:
common.py 抽 collect_md_files(文件→[src],目录→glob),docx_manuscript
+ docx_brief 共用,figures 基准取 src.parent;兑现 docstring 承诺。
验证(实跑非仅单测):emoji 满满的今日新闻 md 跑单文件 --profile report
退出 0(不再报 sections 缺失),解包 docx 校 run 字体——emoji 全
Segoe UI Emoji、中文仍宋体、SiO2/CaCO3 下标未被破坏;正则修复 4 组样本
(粗体/反引号+间隔号/裸路径+中文句号/斜体)全绿;目录多文件+brief+
不存在输入三路回归无破坏。三处互不相干可独立修,均 additive,不碰对外
API/DB 契约。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-17 22:15:34 +08:00 |
caoqianming
|
d3bd40fad7
|
fix(web): 对话正文文件锚点两处回归——含·的 pptx 丢 chip + 链接点击整页404(bump 0.58.29)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-15 13:40:12 +08:00 |
caoqianming
|
4a591e1a90
|
fix(web): 历史消息丢图片预览/chip——taskMeta 竞态 + 中文路径抽取(bump 0.58.17)
两根因:
1. selectTask 并发化(0.12.16)后 renderMessages 在 Promise.all 内执行,
state.taskMeta 必然还是旧值/null → wd 错 → chip+inline 图整体丢失。
loadMessages 加 {render} 开关,首屏渲染延后到 taskMeta 赋值后(零额外 RTT)。
2. extractArtifactRels lead 边界不认汉字("已保存到<wd>/xxx.png"不命中),
tail 会把紧贴的中文标点连后文吞进文件名。lead 改任意非 [A-Za-z0-9._-],
tail 排除集抽 _TAIL_CLS 常量补中文标点(主规则+legacy 双处)。
node 离线回归 12 用例全绿;CHANGELOG 面向用户补记。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-13 10:29:23 +08:00 |
caoqianming
|
5a8f5bd930
|
feat(media): 第二图像后端 gpt_image(unifyllm 网关,pro 档)(bump 0.58.0)
- config/media/unifyllm.yaml + tools/gpt_image.py:仅 prompt 参数(网关忽略
size/quality,尺寸上游自动定,不支持 i2i),b64 直落 figures/,banner 协议
同 seedream,价目未知期 cost 记 0、usage tokens 进 units 留对账
- 媒体装配泛化:ArkConfig 通用键名(api_key_env/base_url,ark_* 兜底);
_choose_image_variant 跨 provider 选 image variant(默认仍 seedream_5,
本 run 只挂一个图像工具);_MEDIA_TOOLS_BLOCK 拆分段按实挂工具拼装
- web:_list_media_variants 扫 config/media/*.yaml(image/video 清单 +
admin 门控 catalog);media.js 三处白名单加 gpt_image;prompt 润色 hint
无 default_size 不再谎报 2048
- gpt_image 进 pro 档,与 seedream 共享 images_per_day 配额
- 手工验证 scripts/test_gpt_image_manual.py 全过(含真调网关落图),
unittest 201 过
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-10 20:47:06 +08:00 |
caoqianming
|
e5940266ca
|
refactor(dev): 前端模块化 Step 2 — 抽出 media.js + 收敛 downloadFile 反向依赖
对话内工具活动标签 + artifact(产物)抽取/渲染:toolActivityLabel /
extractArtifactRels / extractMediaBanner / renderArtifactBarHtml /
upgradeMediaArtifacts / downloadFile → media.js(237 行,原 main 1134–1359)。
收敛点:downloadFile 移入 media 后,preview.js / files.js 对它的 import
从 ./main.js 改指 ./media.js —— 把这条反向依赖从 main 挪开。media 导入极少
(escapeHtml / _categorize(preview)/ state / logout),与 preview 成
media↔preview 环(均运行时调用,安全)。
两次险漏靠校验抓回:
- 共享 const ARTIFACT_PRODUCING_TOOLS(main renderMessages/SSE 用 4 处,
.has() 访问非函数调用,"被调标识符"法漏掉)
- 内部函数 _flushMediaArtifactCache(selectTask 切任务清缓存用)
两者经残留符号检查发现后补 export。
新增全模块 import/export 一致性校验脚本(每个 import{X} 必在目标 export),
11 模块全过。main.js 删至 1393 行。node --check 11 模块全过、静态测试 2 过。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-07 19:05:48 +08:00 |