Skip to content

🐛 fix(web): return DSH client plugin from loader bundle - #480

Open
zrr1999 wants to merge 3 commits into
mainfrom
fix/dsh-loader-factory-return
Open

🐛 fix(web): return DSH client plugin from loader bundle#480
zrr1999 wants to merge 3 commits into
mainfrom
fix/dsh-loader-factory-return

Conversation

@zrr1999

@zrr1999 zrr1999 commented Aug 19, 2026

Copy link
Copy Markdown
Collaborator

动机

🐛 fix(web): return DSH client plugin from loader bundle

通过普通 HTTP 的非 localhost 地址访问 Spark Web 时连续存在三个启动阻塞:

  1. scripts/build.mjs 生成的 ModuleLoader factory 没有返回插件对象;🐛 fix(cli): auto-pick web port and export the spark-web-dsh client bundle correctly #467 只手工修复了生成产物,后续 rebuild 会再次变成 undefined
  2. Chromium 在普通 HTTP 非 localhost origin 不提供 crypto.randomUUID(),选择工作区会失败。
  3. DSH credentials API 是 loopback-only,远程浏览器调用 /api/credentials.describe 会返回 403,但 onboarding 将其错误地呈现为配置失败。

解决方案

  • 在构建脚本 footer 中显式返回包含 named/default apply 的插件对象,并重新生成 bundle。
  • 安装基于 crypto.getRandomValues() 的 UUID v4 fallback。
  • 识别远程浏览器收到的 credentials 403,直接完成 secret onboarding;凭据继续由 Spark host 解析,不向 LAN 浏览器开放 secret API。
  • 增加 bundle factory、UUID fallback 和 loopback-only credentials rejection 回归测试。

说明

验证:

  • pnpm --filter @zendev-lab/spark-web-dsh run build
  • pnpm --filter @zendev-lab/spark-web-dsh check(5 tests passed)
  • git diff --check
  • 重新启动 spark web --host 0.0.0.0 --port 8888 --trusted-host 33.6.30.189:8888
  • http://33.6.30.189:8888/ 直连返回 HTTP/1.1 200 OK
  • 实际下发 bundle 已确认同时包含 UUID fallback、403 handling 和 return module.exports

包检查只有 esbuild helper 上既有的 typescript(unbound-method) warning,无类型错误。

zrr1999 added a commit that referenced this pull request Aug 20, 2026
…reams (#481)

## 动机

deepseek-v4-flash 的完整链式思考(CoT)仍持续泄露进 Spark 会话历史与制品:百度网关把 thinking 作为普通
`thinking` content block(明文 CoT)返回,而 pi-ai 只在
`redacted_thinking`(加密摘要)块上标记 `redacted:
true`,导致明文思维链一路透传到持久化层。同批次把另外两个本地已验证的改进一并合入:daemon lens 测试在慢文件系统/hook
负载下不再 flaky;cue 工具描述与守卫让模型在调用前就知道「不是 bash」并给出可重发的改写建议。

## 解决方案

- `spark-llm`(baidu-oneapi):归一化出口 `normalizeBaiduOneApiMessage` 新增
thinking 隐私处理——把非 redacted 的明文 thinking 折叠为 `{thinking: "", redacted:
true}`,保留 `thinkingSignature` 加密负载供多轮 continuity;新增 message/事件流单元测试。
- `spark-cue` / `dsh-tool-cue`:cue-* 工具描述与 system prompt 前置告知 "not bash"
+ 操作符摘要;`cueShellCommandIssue()` 返回结构化 `{reason, suggestion}`,对 `ls |
head`、`a; b` 直接给出可重发的改写建议;兼容旧 `cueShellCommandSyntaxIssue`。
- `spark-daemon` 测试硬化:lens 测试 tmpdir `git init`(preflight 超时后
`captureWorkspaceRevision` 不再在非 repo 目录里 `git diff --cached` 报
usage)、mock 掉真实 `vp lint` 子进程、restart arming 超时 30s。

## 说明

- 本地验证:`spark-cue` 266 passed、`spark-llm` 124 passed、`dsh-tool-cue` 11
passed、daemon lens/service 43 passed、`vp check --no-fmt --no-lint` 0
errors(7 个既有 warning:spark-cue unbound-method 与 spark-web-dsh esbuild
helper,与 #478/#480 已知一致)。
- 实时流中的 thinking(UI 展示)保持明文;本次修复覆盖持久化/历史路径。
- 基于最新 `origin/main`(0a993bf0),不含被 #478/#480 覆盖的 web onboarding/UUID
fallback 改动。
- 分支基于 cherry-pick,保留三提交结构(`fix(daemon)` → `feat(cue)` → `fix(llm)`)。

## 后续工作

- 可选:提供配置开关以在实时流中也屏蔽明文 thinking(当前仅持久化路径收口)。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant