1) dsh-server-docs/ 从工作区(原 E:\...\aliyun-dsh-server\dsh-server-docs)**整体并入本仓**,
保留目录名 ⇒ 仓库内 dsh-server-docs/... 的相对引用天然继续有效;旧目录(含其 .git)已归档到
工作区 _中间产物_待清理/,未随本提交带入。
2) .gitattributes:新增 `dsh-server-docs/** -text` —— 原文档库是 `* -text` + autocrlf=false,
必须保持纯 LF,否则会被本仓的 CRLF 规则翻掉。
3) 活引用里的绝对路径已全部改到新位置(docs 的 INDEX / README / scripts / skills + 用户级 skills
+ ~/.workbuddy/settings.json 的 hooks);历史档案(04-调整方案/、archive/)按「只增不改」未动。
⚠️ hooks 路径改动需「完全重启会话」才生效(配置是会话启动快照)。
4) 交接单/T08:新增 §16「生产整体切换执行记录」(形态 / 落地动作 / **4 个只有真上线才暴露的真 bug** /
验收证据 / 回滚命令 / 残留项);台账 T08 行 → 已完成并归档;03-路线图 §二 登记 T08 收尾项。
5) 统一称谓:**「本机」只指跑 WorkBuddy 的开发机**,47 / 106 一律写「远程服务器」。
1.7 KiB
1.7 KiB
十六、方案 A 落地:launch/status 自动携带 dsh launch token(2026-09-08 19:30)
决策:用户选方案 A(小改上游,普通用户无需手动拿 token 即可打开聊天界面)。
改动(3 文件,已 git commit 29c8907,本地分叉 patch):
| 文件 | 改动 |
|---|---|
src/supervisor/spawner.ts |
Instance 接口加 launchToken?: string 字段 |
src/supervisor/orchestrator.ts |
① trackChild 监听子进程 stdout,正则 dsh web: http://127.0.0.1:\d+/\?token=([A-Za-z0-9_-]+) 解析 token 存入 instance;② 新增 waitForLaunchToken()(轮询最多 20s 等 token 出现,崩溃/停止即返回);③ launch()/restartMain() 返回前等待 token |
src/web/routes/dsh.ts |
dshUrl() 支持可选 token 参数;launch/restart/status 返回的 url 均拼接 ?token=(status 从 main.launchToken 取) |
验证结果(全链路):
| 步骤 | 结果 |
|---|---|
| launch 返回 | {launchToken, url: https://admin.dsh.alotbuy.com/?token=...} ✅ |
| 打开带 token url(带 sid,-L 跟随) | 200,24233B SPA,自动 303 种 dsh-auth cookie ✅ |
之后裸开 / |
200 ✅ |
/api/llm/listProviders |
ok:true, deepseek-official ✅ |
构建/部署:npm run build(tsc)+ systemctl restart dshs。TS 坑:RegExp.exec 返回 null 非 undefined,判空须 m !== null && m[1] !== undefined。
admin API Key 已配置:从旧 /opt/dsh/.env 取出 sk-81c... 经 /api/me/keys 注入(name=deepseek-main,AES-GCM 加密入库,自动触发实例重启生效)。KEY 为每用户独立——每个用户需在桌面"管理密钥"各自添加;无全局通用 key(原容器 .env 统一 key 模型已废弃)。