记在这里的债都是有意欠的,不是忘了。每条写清:是什么、为什么先欠着、 什么条件下该还。
question="1",API 由序号映射到原候选",
而当前前端提交的是选项全部内容拼接的文本(公司名 + 信用代码 + 状态 + 负责人)。status: found)的流程,
选中一家,确认返回的是选定公司后的结果而不是又弹候选列表。
若循环,两条路:①改回提交序号(序号取自当前显示顺序);②后端扩语义识别全字段文本。provider_failure,status: found 一次都没出现过,因此从未验证。answer.text 与 summary.text 首句重复answer.text(渲染在消息正文)又放进 summary.text 的开头,
实测两者首句逐字相同,用户会看到同一段话出现两次。Question.message 字段未被渲染QuestionCard 的 Question 接口里定义了 message 字段,
但模板从未渲染它 —— 适配层写的提示文案一直不可见。height: 100dvh 没有 100vh 兜底(BusinessAssistantMobile.vue)——
dvh 是较新的单位(Chrome 108+ / Safari 15.4+),国产浏览器内核多基于更老的版本
→ 该声明被整条丢弃 → 容器高度塌陷,而外层是 overflow: hidden → 内容被裁掉text-size-adjust: 100% —— 移动端浏览器会按各自策略自动放大文字,
各家不同 → 同一份文案在不同手机上长度不同(也是"不同浏览器不一样"的直接来源)width: max-content 决定「单行省略 vs 换行」:
updateMaxWidthReached() 用 getBoundingClientRect() 比卡片与父容器宽度。
而字体首选 "HarmonyOS Sans SC"(手机多无此字体 → 回退到系统字体)→ 字宽不同
→ 测量结果不同 → 该换行时判成"没撑满" → 单行 nowrap 撑出屏幕chrome://inspect
最省事)—— 没有这个只能猜dvh 加 vh 兜底、全局 text-size-adjust: 100%、
给 flex 链补 min-width: 0is-max-width-reached
与 width: max-content。现在这套先天不稳定(字体/时机/内核都会影响测量)browserslist;
项目当前没有任何 browserslist / postcss 降级配置,而代码里用了
dvh(4) / gap(151) / inset(22) / backdrop-filter(24) 等较新特性dvh 仍无 vh 兜底、
仍无 text-size-adjust、思考卡片仍靠 JS 测量切样式,padding-bottom: 180px 也仍是写死的)。
换台手机、或用户调大系统字号,仍可能变样;方案 A/B/C 依然有效,等用户决定要不要做。/dms-api/ 代理,token 由代理服务端注入
(dev 是 vite.config.ts,生产计划是 nginx 同款转发)。这个 token 不区分调用者 ——
任何能打开站点的人,在浏览器 devtools 里对 /dms-api/content/selectContentList 发任意查询,
就能读到 DMS 的全部数据:1887 会话、1888 企业工商信息、1889 问答记录,
包括别家企业的。代理只做「补 /dms 前缀 + 注入 token」,不做任何鉴权。.env.production 没配 VITE_DMS_API)。
dev 环境无所谓(本机、只有自己)。docs/plans/active/dms-api-replacement.md 里"前端直连还是后端转发"
那道待拍板的问题是同一件事,这里给出了必须选后端的理由;.env.development 里有 VITE_DMS_API="/dms-api" + VITE_DMS_TARGET,
而 .env.production 也没有(2026-09-24 起只剩开发/生产两份 env,见 progress.md 续 38)。
这些环境构建出的包里 getDmsApiBaseUrl() 返回空串,后果两条:
①uploadDmsAttachment 直接抛「未配置 DMS 接口地址,无法上传附件」→ 附件功能在这些环境整体不可用;
②DMS 会话/问答/反馈请求走 client.ts 的「未配置就跳过」,静默不落库。
(构建产物可自证:dist/index.html 里 globalThis.VITE_DMS_API = "%VITE_DMS_API%" 原样留着。)http://121.43.55.7:10081)从部署环境是否可达;
②token 谁注入 —— 开发环境是 vite 代理在转发时加 token 头(浏览器不持有 token,
见 vite.config.ts 的 /dms-api/),生产要由 nginx(或后端网关)做同样的事,
否则 DMS 会因鉴权失败而拒;顺带 /dms-api 还要把 /dms 前缀补回去。
③index.html 的 %VITE_DMS_API% 支持运行时注入(globalThis.VITE_DMS_API 优先),
所以也可以不改构建、只改部署产物里的这一行——但同样绕不开 ②。进展:用户 2026-09-24 给了后端网关的 token 端点
GET http://121.43.55.7:10011/proxy/verify/getALYToken→{code:200, content:"<token>"}, 前端已改为调它(同源/aly-api/…,dev 走 vite 代理)。前端侧不再需要 AK/SK, vite 里那段自签中间件已删除。 剩下的(部署侧,仍未做): ① nginx 把/aly-api/转发到http://121.43.55.7:10011/(去掉前缀,与/ip-api/同法); ② 生产 env 要配VITE_NLS_APPKEY(实测:.env.production都没有 → 生产构建打出来的包里 appkey 为空 → 识别会失败)。 详见../reference/asr-nls.md。
asr_hub 中转,换成阿里云 NLS 直连
(协议与实现见 ../reference/asr-nls.md)。exp 2034-12-29)已随旧实现删除;
② token 改由后端网关 /proxy/verify/getALYToken 签发,前端不持有任何云凭据。c_credit_code 只放真实信用代码」后,访客行也带着
对话提到的那家公司的代码;而 fetchDmsSessions(读「我的会话」)按 c_credit_code 查、
且只在登录后调用 → 那家公司登录后会看到陌生访客的会话。fetchDmsSessions 增加一道过滤 —— 排除「明确是访客」的行
(c_is_login === "0")。只排除显式访客行(c_is_login 缺失的历史行照旧返回),
因此可见范围与改造前完全一致。c_is_login === "1")不再允许访客对话改写
它的公司字段 —— 否则退登后再问到别的公司,会把这行改到那家公司名下、而 c_is_login
仍是 "1",既串台又会被读侧当登录行返回。verify-dms-chat-storage.mjs 打真实 DMS,两个方向都断言(访客行查不到 /
登录行查得到),且实测「拿掉过滤该断言立刻失败」——是真守卫。{thread_id, question},多一个字段 422,
旧协议的 transmission.files / file_pos 发不出去 —— 上传入口虽然活着,
但附件只能把 OSS 地址拼进 question 文本(方案②),模型会把 URL 当正文读,
本地消息、会话标题、DMS 记录也都跟着被 URL 污染。pictures: string[] —— 图片 URL 列表(后端自己去取图,须公网可达)files: string[] —— 非图片文件 URL 列表[{url,name}] 会被 422 invalid_request 拒掉);
带上 pictures 问「这张图片里是什么」,模型确实描述出了图的内容(不是收下就忽略);
空数组与不传都接受。toChatAttachmentUrls() 按 isImage 拆成两个列表随请求体发出;
地址不再拼进 question。旧函数 buildQuestionWithAttachments 按约定注释保留。thread_id + question ——
既不多传无意义字段,也让「后端若回滚」只影响带附件的那几轮。harness/tools/verify-attachment-question.mjs 19/19(拆分纯逻辑 + 真正发出的
请求体 + 「旧函数无活跃调用点」的源码级断言);字段生效是打真实后端探针实测的。token-streaming.md:「完整校验后绑定真实链接,随最终替换出现」;
「answer_end 无论 status 是 completed 还是 fallback,均用 text 覆盖已有内容……
不能只停止光标而保留草稿」### 高新技术企业认定… → ### 一、高新技术企业认定…)、
把纯文本渠道换成了 markdown 链接(- 国家高新技术企业认定管理工作网先行注册… →
- [查看办事指南](https://zwdt.sh.gov.cn/…))。链接只在最终校验后才绑定,草稿必然没有。status: fallback 那一类更直接:草稿被判不可用 → 换成降级答复
(「已查到相关资料,但这次未能完成答复整理。您可以查看下方原文资料,或稍后重试。」)/api/chat 原始载荷,比对 concat(answer_delta) 与 answer_end.text
的公共前缀长度(harness/tools/probe-answer-tail-timing.mjs 可改造成此用途)。