From 7b0a43d86b897887f803b3a533b1193418afbba7 Mon Sep 17 00:00:00 2001 From: LiuShiyuMath Date: Wed, 13 May 2026 18:22:28 +0800 Subject: [PATCH 1/2] docs(ask-user): require gist hosting + visual content, supersede /tmp file:// flow When agent needs to talk to users, the canonical flow is now: 1. haiku subagent writes self-contained visual HTML (cards/chips/SVG/ASCII art - no raw boring text) 2. gh gist create --public uploads to the maintainer's own gist 3. open -a 'Google Chrome' "https://htmlpreview.github.io/?" Rationale: cross-device access, persistent audit trail, zero extra infra, reuses VISUAL-PROOF-FORMAT.md hosting convention, avoids Chrome file:// Clipboard API restrictions. --- docs/ASK-USER-VIA-HTML.md | 156 +++++++++++++++++++------------------- 1 file changed, 78 insertions(+), 78 deletions(-) diff --git a/docs/ASK-USER-VIA-HTML.md b/docs/ASK-USER-VIA-HTML.md index bc1350d7..40c798f5 100644 --- a/docs/ASK-USER-VIA-HTML.md +++ b/docs/ASK-USER-VIA-HTML.md @@ -1,123 +1,123 @@ -# ASK-USER-VIA-HTML — 用 haiku subagent 生成 HTML 问卷再开 Chrome 问用户 +# ASK-USER-VIA-HTML — 用 haiku subagent 生成 visual HTML,托管在 maintainer 自己的 GitHub Gist,pop open Chrome 给用户 ```text -┌─ 触发条件 ──────────────┐ -│ agent 需要向用户提问 │ -│ (澄清需求 / 选项决策) │ -└──────────┬──────────────┘ +┌─ 触发条件 ──────────────────────────────────┐ +│ agent 任何要向用户「talk to user」的瞬间 │ +│ - 澄清需求 / 收集选项 / 让用户做决策 │ +│ - 列出 N 个候选 plan / 候选 design │ +│ - 收集 free-form 备注 + 多选 tag │ +└──────────┬──────────────────────────────────┘ ▼ -┌─ STEP 1 ────────────────┐ ┌─ STEP 2 ──────────────┐ ┌─ STEP 3 ───────────┐ -│ 用 haiku subagent 写 │ ─► │ 路径写到 /tmp/*.html │ ─► │ 用 open -a Chrome │ -│ 一个独立 HTML 问卷 │ │ (单文件、自包含、无依赖)│ │ 打开该文件 │ -└─────────────────────────┘ └────────────────────────┘ └──────────┬─────────┘ - ▼ - 用户在浏览器里答题 - (回到 agent 复述选择) +┌─ STEP 1 ─────────────┐ ┌─ STEP 2 ──────────────────┐ ┌─ STEP 3 ────────────────────────┐ +│ haiku subagent 写 │ ─► │ gh gist create --public │ ─► │ open -a "Google Chrome" │ +│ visual HTML 问卷 │ │ ask--.html │ │ "https://htmlpreview.github.io/ │ +│ (cards / chips / │ │ → 拿到 raw URL │ │ ?" │ +│ color / ASCII / │ │ (公网永久 / 跨设备) │ │ (Chrome / 任何浏览器都能开) │ +│ diagrams) │ └───────────────────────────┘ └──────────┬──────────────────────┘ +└──────────────────────┘ ▼ + 用户在浏览器里点选 / 多选 / 填备注 + → 按「复制选择回 agent」→ 粘回 chat ``` ## TL;DR -每次 agent 本来要调 `AskUserQuestion` 工具向用户提问时,改走以下流程: +每次 agent 本来要调 `AskUserQuestion` 工具 / 在 chat 里列 N 个选项让用户挑,**统一**走以下四步——**不写 `/tmp` file://、不弹本地默认浏览器、不出 raw boring text**: -1. 派一个 **haiku subagent** 去写一个独立的 `/tmp/ask--.html`,里面把问题、选项、单选 / 多选、free-form 备注框都用纯 HTML + 内联 CSS 渲染成一个 self-contained 页面(**不**依赖 CDN、**不**调外部 JS)。 -2. 文件落到 `/tmp/`(macOS / Linux 通用临时目录;Windows 同义用 `%TEMP%\`)。 -3. 在主 session 里调 `open -a "Google Chrome" /tmp/ask--.html`(Linux 用 `xdg-open`、Windows 用 `start chrome`)把页面弹给用户。 -4. 用户在浏览器里点选 / 填写 → 回到 agent 会话把选择口述或粘贴回来 → agent 继续推进。 +1. **派 haiku subagent** 写一个 self-contained **visual** HTML 文件(cards / chips / color-coded sections / 内联 SVG / ASCII art 框图),落地到 `/tmp/ask--.html` 作为本地暂存。**不**允许只写「label + radio + button」的朴素表单——HTML 必须带视觉层次(最少:分区底色 + chip 圆角标签 + 中间分隔线 + 颜色对比的选中态)。 +2. **托管到 maintainer 自己的 GitHub Gist**:`gh gist create --public /tmp/ask--.html`,拿到 gist raw blob URL(形如 `https://gist.githubusercontent.com///raw/.html`)。 +3. **Pop open via htmlpreview.github.io in Chrome**:`open -a "Google Chrome" "https://htmlpreview.github.io/?"`(Linux `xdg-open`、Windows `start chrome`)。htmlpreview 是无依赖的纯前端 render proxy,把 raw blob 在浏览器里 fetch + display;用户可以从任何设备(手机 / 第二台机器 / iPad)打开同一个链接。 +4. 用户在浏览器里点选 / 填写 → 按底部「复制选择回 agent」按钮(`navigator.clipboard.writeText` 把答案序列化成 markdown)→ 切回 agent terminal 粘贴 → agent 解析继续。 -> 备注:本规则**不**取代 `AskUserQuestion` 工具的存在;它规定的是「agent 在什么场景下用 HTML+Chrome 流程代替工具调用」。在用户明确要求快速文字回答、或当前没有 GUI 环境(远端 SSH 无浏览器、CI、headless)时,可以退回原生 `AskUserQuestion`。 +> 备注:本规则**取代**早期版本的 `/tmp` file:// 直开本地浏览器流程。`/tmp` 文件仅作为 `gh gist create` 的上传源,最终用户看到的是 gist + htmlpreview 公网 URL。 -## 为什么不直接调 `AskUserQuestion` 工具? +## 为什么 gist + htmlpreview 不直接弹 `/tmp` file:// -- HTML 问卷可以**长期保存证据**(`/tmp/*.html` 在 session 结束后仍可重新打开),方便后续 grill / review 复盘“当时给了哪些选项”。 -- 多选 / 长 free-form 输入在 `AskUserQuestion` 工具里只能逐题展开;HTML 一页可以同时呈现所有问题、说明、preview snippet,**用户认知负担更低**。 -- haiku 写 HTML 成本远低于 opus / sonnet;把"渲染表单"这种格式化工作下放给小模型,节省主 session token。 -- 浏览器渲染天然支持代码高亮、表格、ASCII art 框图、图片预览——比终端 UI 表达力更强。 +- **跨设备**:`/tmp` 只有本机能看到;gist URL 任何设备 / 手机 / 二台机器 / 远端 SSH user 都能开。 +- **持久审计**:session 结束后 gist 仍在,事后 grill / review 复盘能回看「当时给了哪些选项 / 用户选了啥」。 +- **零额外基础设施**:`gh gist create` 一行命令,免 S3 / Pages / CDN bootstrap(与 `docs/VISUAL-PROOF-FORMAT.md § Hosting` 默认推荐同一套)。 +- **Chrome `file://` Clipboard API 受限**:某些 macOS Chrome 配置下 `file://` 来源不允许 `navigator.clipboard.writeText`,gist + htmlpreview 走 `https://` 来源就没这个限制。 +- **复用 visual-proof 同一套 hosting 约定**:项目内 visual-proof artifact 已经走 gist + htmlpreview(per `docs/VISUAL-PROOF-FORMAT.md`),ask-user 问卷复用,maintainer 心智一致。 -## STEP 1 — 派 haiku subagent 写 HTML +## 为什么必须 visual content 不允许 raw boring text -主 agent 调 `Agent` 工具时显式指定 `model: "haiku"`,并把以下要点写进 prompt: +raw `
` + `