Compare commits

..
Author SHA1 Message Date
weichen 7e123e5688 Record cardflow-r1 verification: 9/9 dual-state walkthrough plus per-layer evidence
Why: CF2 验收剧本(双态零页面走查)完成;证据入任务主记录。
Evidence: 无头 Chromium 9/9 通过(过程折叠不回退、锚点/展开全文/收件箱卡/D32 定位);各层测试与组合构建见记录。
Impact: 文档。
Refs: Dev 任务卡 feature/cardflow-r1。
2026-09-30 16:39:47 +00:00
weichen 4a55832e9d Add cardflow-and-process-split proposal (D39-D43) and update guides
Why: 卡流机制与中栏过程/回复分离的用户五项裁定(2026-09-30)入库:显式路由、卡片权威+引用回填、默认关、CF0 先行、完备性剧本修订;Cursor 式过程折叠决策(D41)。
Evidence: 提案 docs/proposals/2026-09-30-cardflow-and-process-split.md;usage.md 增过程折叠/长回复折叠/长结果进卡片三节;plugin-development.md 增通道外溢验收项(06 §2.7)。
Impact: 文档;决策编号 D39–D43(D34–D38 为认证提案预留段)。
Refs: Dev 任务卡 feature/cardflow-r1。
2026-09-30 16:39:47 +00:00
weichen 1f3e7ab441 Merge pull request 'Record the user adjudication of the preview decision points' (#25) from feature/file-preview-adjudicate into main 2026-09-30 16:15:59 +00:00
weichen 07a6acfc21 Ignore local mimosa hook status artifacts 2026-09-30 16:15:59 +00:00
weichen 4f3b22d601 Record the user adjudication of the preview decision points
Why: D1-D5 were settled by the user (deps in, full-fidelity pptx, OG
card plus optional embed, dual placement); the proposal status must
reflect that before implementation starts.

Evidence: decision section rewritten with the settled choices and the
accepted trade-off on D2 (fall back to outline level with evidence only
if no Vite-compatible renderer builds).

Impact: documentation only.

Refs: task feature/file-preview-caps.
2026-09-30 16:15:41 +00:00
weichen f0361f3856 Merge pull request 'Record Gitea access facts in AGENTS.md' (#24) from feature/gitea-access-facts into main 2026-09-30 16:08:29 +00:00
weichen baf8f22aa7 Record Gitea access facts in AGENTS.md
Why: agents rediscovered Gitea hosts and credential locations from
scratch each session, and the retired git-panel host kept failing with
TLS broken-pipe errors before the right host was recalled.

Evidence: curl git-home...:30319/api/v1/version with token from
~/.secrets/gitea -> {"version":"1.27.3"}; ssh -p 31411 git@git-ssh...
(BatchMode) -> "Hi there, weichen!" with key ~/.ssh/home_gitea (ED25519,
SHA256:GYXaOXIMeloQ1fKSfdJ/ndgPQzs/Ix7Hk62ekfkfQ20). Same section already
merged in Agent-System-Dev (PR #73).

Impact: AGENTS.md only; records hosts and credential locations, no
secret values (baseline hard boundary 2).

Refs: Agent-System-Dev PR #73
2026-09-30 16:06:17 +00:00
weichen ffb2aa7cc4 Merge pull request 'Propose file previews plus reserved delete and fs-tool capabilities' (#23) from feature/file-preview-proposal into main 2026-09-30 16:03:25 +00:00
7 changed files with 120 additions and 8 deletions
+1
View File
@@ -0,0 +1 @@
.mimosa/
+17
View File
@@ -17,3 +17,20 @@
- 模块边界、公开契约与隔离档位见 `policy/modules/`(如有)与 PROJECT.md。
- 跨仓 gitlink 变更须经组合验证后在 Dev 仓推进;受保护分支经 PR 合入。
- 验证命令见 PROJECT.md「验证」节;完成声明须附实际命令输出证据。
## Gitea 与 Git 访问事实(2026-09-30 实测)
历史文档与旧链接里的 `git-panel.u1680832.nyat.app:30319` 已失效(TLS 握手失败),
见到一律按过期处理,不要再试。当前权威通道:
- **Web / API(HTTPS)**:`https://git-home.u1680832.nyat.app:30319`(Gitea 1.27.3,
API 前缀 `/api/v1`;偶发 broken pipe / 超时,重试即可)。
- **Git over SSH**:`ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/<Repo>.git`
(各仓 origin 与 gitlink 均为此格式)。
- **API token**:`~/.secrets/gitea`,两行键值 `URL_PREFIX=…` 与
`ACCESS_TOKEN=<40 位 hex>`;取值 `grep ACCESS_TOKEN ~/.secrets/gitea | cut -d= -f2-`,
用作 `Authorization: token <值>` 请求头。**token 值不入仓、不回显、不写进产出物**
(baseline 硬边界 2:只记录来源、字段与可用状态)。
- **SSH key**:`~/.ssh/home_gitea`(ED25519,公钥指纹
`SHA256:GYXaOXIMeloQ1fKSfdJ/ndgPQzs/Ix7Hk62ekfkfQ20`,Gitea 侧密钥名 GMKtec);
`~/.ssh/config` 已有 `git-ssh.u1680832.nyat.app` 主机条目,克隆/推送直接可用。
+2
View File
@@ -96,6 +96,8 @@ panels/main.json:
cards/note.json:`{ "kind": "note", "data": [ …UINode ] }`。
**新卡片类型验收项(通道外溢约束,源自目标系统 06 §2.7)**:任何新卡片类型都必须能回答「这张卡在飞书/微信群里长什么样」——按钮回调走命令总线(与 Web 同源审计),无交互卡的通道降级为模板消息 + H5 确认页;深读类内容不做通道投影,深链回 Web 弹层。
**词汇边界**:section / list / kv / form / markdown / doc-ref / actions / chart-lite。
表达不了的高级交互 → 向 Core 提案新词汇(契约扩展流程),**不要**期望注入 React 组件——前端不开放此口子,这是插件不破坏前端的机制保证。
+3 -1
View File
@@ -81,7 +81,9 @@ AGENT_SYSTEM_CONFIG=/etc/agent-system.json agent-system serve # 环境变量
### 3.2 中栏对话
- **流式渲染**:正文逐字输出;思考过程(灰字竖线)与工具调用(芯片)实时展示;顶部状态点显示事件流连接。
- **过程折叠**:任务完成后,思考与工具调用折叠为「⚙ 过程输出 · N 次工具调用」摘要行,点击展开回看(设置 → 界面 → 可改默认行为)。
- **过程折叠(Cursor 式)**:流式期间思考/工具/中间轮解说照常显示;**最终回复一开始流式,过程立即折叠**为「过程输出 · N 次工具调用」摘要行,只显式显示回复(工具恢复时重新展开);任务终态后保持折叠,点击展开回看(设置 → 界面 → 可改默认行为)。
- **长回复折叠**:终态后超过 800 字的回复自动收成「📄 长回复 · N 字(点击展开)」摘要行——流式期间全文可见,历史消息同样适用。
- **长结果进右侧卡片(默认关)**:设置 → 界面 →「长结果进右侧卡片」开启后,报告/纪要/方案/对比/文档草稿等**产物型**长内容经 `submit_card` 进右栏收件箱(result 卡,可置顶/收纳);中栏保留结论摘要 + 锚点部件(`📄 标题 · N 字 ▸ 展开全文 · ↗ 收件箱`)——锚点可无跳转展开全文,右栏收起时阅读不残废;解释型长回答不进卡。下一轮对话上下文自动回填卡片全文(「🧩 上下文构成」可见 card(n) 条目)。
- **上下文构成观测**:每条助手消息尾部「🧩 上下文构成」折叠芯片——该轮模型实际看到什么(系统提示/历史条数/附件/知识命中)与裁剪记录(历史超窗/工具结果超限),输入规模可解释。
- **附件**:📎 上传 md/txt/docx/pdf/图片——文档经内置解析器(确定性代码解析:md/txt 直读、docx 解 OOXML、pdf 提取文本层)转为中间表示注入对话;解析结果与警告显式可见(不静默)。
- **输入增强**:`/` 唤起命令菜单(/new /mock /model /profile /help);`@knowledge` 在消息中触发知识检索注入。
@@ -0,0 +1,52 @@
# 卡流机制与中栏过程/回复分离 —— 设计与实施提案
状态:**已批准(2026-09-30 用户五项裁定)**;owner:weichen。
前置:[界面交互底座](2026-09-30-ui-inbox-command-workspace.md)(D25–D33:收件箱/卡片/双现/互定位地基)、[界面重构与多用户认证](2026-09-30-ui-redesign-and-auth.md)(R1/R2/R4 已实施)。
输入:目标系统设计全集 V2.2.1(`~/downloads/agent-system-design` 06 §3.3「助手卡片流」:AI 回复简短、长结果一律引导到右侧卡片);用户 2026-09-30 评估裁定。
---
## 1. 背景与裁定
评估报告结论:把目标系统「中栏短回复 + 右栏卡片承载产物」的交互泛化为基座通用能力。用户五项裁定:
1. **接受**模型显式路由为唯一切分机制(否决后处理自动拆分——拆分失败永远退化为现状,不丢内容);
2. **认可**数据模型:产物全文权威在卡片(ActivityCard),消息只存引用部件 + 锚点渲染,上下文组装回填;
3. **默认关**,用户手动打开(设置 → 界面 →「长结果进右侧卡片」);
4. **CF0 先行**(中栏长回复折叠止痛,纯前端);
5. **认可**对话完备性剧本修订:右栏不算「页面」,但卡内内容必须能从中栏锚点无跳转展开(验收项)。
同日新增需求:中栏过程/回复分离(Cursor 式)——流式期间思考/工具/中间轮解说照常显示,**一旦最终回复开始流式,过程即时折叠**,只显式显示回复,可手动展开回看。
## 2. 决策(D39 起:D34–D38 为认证提案 §5.1 预留段,虽未登记仍保持预留)
| # | 决策 | 理由 |
|---|---|---|
| D39 | **内容卡显式路由**:助手长产物经内置工具 `submit_card` 提交为收件箱 `kind=result` 卡;切分判据写进 prompt 模块 `style.cardflow` 的 outputContract(产物型进卡:报告/纪要/方案/对比/文档草稿;解释型长回答留中栏);不做后处理自动拆分 | 拆分发生在生成侧:可断言、可审计;失败模式安全(不出卡 = 全文留中栏) |
| D40 | **卡片为产物权威载体**:全文存 ActivityCard(cardsvc 持久化),消息 parts 只存 `Part.card{cardId}` 引用 + 摘要锚点;`ctxasm` 组装时对 card 部件回填卡片正文(上限默认 12000 字,超限记 Truncations),上下文观测如实显示 | 与「registry 工具大结果→artifact+ref」模式同构;下一轮模型不失忆;时间线审计保留引用记录 |
| D41 | **中栏过程/回复分离**:工具轮文本部件带 `process=true`(终轮文本无标记);live 流式期间 `phase=responding` 即时折叠过程(acting 重展开,交错轮不粘滞);终态 >800 字长回复折叠(CF0);LiveState 文本按 delta index 分桶(除末桶外均过程) | 用户裁定(Cursor 式);live 投影与落库消息同构,终态对账无跳变 |
| D42 | **开关挂两层**:用户设置 `ui.cardflow`(boolean,默认 false,effect=new-run)控制工具注册与 prompt 注入;画像 PromptModules 可显式引用/排除 `style.cardflow` 覆盖 | 「用户可选」与画像机制严丝合缝;设置面 schema 驱动自动出现 |
| D43 | **完备性剧本修订**(D31 增补):右栏收件箱不算「页面」;开启卡流时,零页面走查增加双态用例,卡内全文必须可从中栏锚点部件无跳转展开(窄屏/右栏收起时阅读不残废) | 「内容被藏起来」是分栏设计最高风险;中栏自足摘要是硬规则 |
## 3. 实施切分(三期)
| 期 | 内容 | 仓 |
|---|---|---|
| R1 过程分离 | D36 全部(backend 工具轮 process 标记 + Stream 注入缝;frontend 分桶/即时折叠/CF0) | backend / frontend |
| R1 卡流 | D34/D35/D37:core CardPart.CardID;backend submit_card 工具+锚点回填+style-cardflow 模块+设置+ctxasm 回填+mock `#cardflow`;frontend 锚点部件(展开全文/跳收件箱)+result 卡体限高 | core / backend / frontend / ui / documents |
| R2 收尾 | D32 另一半(卡→消息真定位,现误接 openInbox);result/待办轻分组;窄屏回退验证;双态零页面走查定稿 | frontend / documents |
跨仓顺序遵守 multi-repo 五步:core 先合入 → backend(同步 vendored core 副本)→ frontend/ui → Dev gitlink PR → 组合验证。
## 4. 契约与行为要点
- `CardPart{Kind, Data []UINode, CardID ID}`:CardID 非空 = 收件箱引用部件(submit_card);空 = 插件内嵌卡(现状不变)。
- `submit_card(title, summary, body)`:runner 内置工具(不经注册表,同 update_todos 先例),仅 `ui.cardflow=true` 时声明;执行 = `CreateCard(kind=result, status=done, tone=ok, body=[markdown+摘要kv])` + 消息追加引用部件 + 工具返回「已发卡,对话中只留简短结论」;finishRun 持久化助手消息后把卡 `AnchorMessageID` 回填为该消息 ID。
- 中栏锚点部件:`📄 {标题} · N 字 ▸ 展开全文 · ↗ 收件箱`——展开内联渲染卡片 body(数据从 store.cards 取),跳转走 openInbox;旧正则兜底保留(插件卡)。
- 卡片内容流式(v1 一次性出卡)、飞书/微信通道投影(2.7 约束:新卡型必须能回答「这张卡在群里长什么样」——写入插件开发指南验收项)、与 artifact 统一、跨会话项目级收件箱:**均留远期**。
## 5. 边界与不做
- 不改 `ResolveSystem` 签名(注入 = 向 prof.PromptModules 副本追加模块 id);不动 SSE 协议版本。
- `autoCollapseProcess` 偏好暂不加设置 UI(默认 true 即目标行为)。
- 收件箱 pendingCount 语义不变(内容卡 status=done 不计入待办)。
@@ -1,6 +1,6 @@
# 文件预览与保留能力(工件删除 / fs 工具)方案
日期:2026-09-30;状态:待裁定(D1–D5 决策点见 §5);作者:weichen + Agent
日期:2026-09-30;状态:已裁定(§5),实施任务 feature/file-preview-caps;作者:weichen + Agent
关联:2026-09-30-ui-redesign-and-auth.md §9(上轮"下载为主"的非目标,本提案补齐)
任务:feature/file-preview-proposal(本仓 PR 见任务卡)
@@ -96,13 +96,14 @@ mammoth + xlsx + jszip 全部动态 import,仅对应格式首次预览时加
| P3 URL 预览 | /api/url-preview + LinkPreview + 输入框 URL 卡 | go 测试:OG 解析正例 + SSRF 负例(localhost/私网/非 http 协议/超时);头链:链接卡→右栏预览 |
| P4 fs 工具 | 实现+门控+沙箱+测试(默认关) | go 测试:穿越负例全红、门控关时不注册;开启后 write_file 产物出现在工件面板 |
## 5. 决策点(待裁定后另立实施任务)
## 5. 决策点(2026-09-30 用户已裁定)
- **D1 Office 依赖**:引入 mammoth/SheetJS/JSZip(动态加载,推荐)|不引入(Office 维持下载)。
- **D2 pptx 深度**:文本大纲级(推荐)|全保真(需重型依赖,不推荐)|不做。
- **D3 URL 预览形态**:OG 卡 + 可选尝试内嵌(推荐)|仅 OG 卡|仅 iframe(不可靠,不推荐)。
- **D4 预览落位**:右栏 + 弹窗双落位(推荐)|仅弹窗|仅右栏。
- **D5 fs 开关可见性**:仅配置可开、设置页不显示(推荐)|设置页显示开关。
- **D1 Office 依赖**:✅ **引入** mammoth/SheetJS(动态加载,不进主包)。
- **D2 pptx 深度**:✅ **全保真渲染**(用户选择;接受重型依赖与还原度折衷——实施时在 pptx-preview / pptx2html 候选中取与 Vite 兼容者,若均不可构建则带回证据退回文本大纲级再裁定)。
- **D3 URL 预览形态**:✅ **OG 卡 + 可选尝试内嵌**。
- **D4 预览落位**:✅ **右栏 + 弹窗双落位**。
- **D5 fs 开关可见性**:按推荐默认执行——仅配置/环境可开(runtime.fsTools 默认 false),设置页不显示开关。
- 实施任务:feature/file-preview-caps(P1–P4 一体交付)。
## 6. 边界与不做
@@ -0,0 +1,37 @@
# 2026-09-30 · cardflow-r1 验证记录(CF1 机制 + CF2 收尾)
任务:Dev 仓 `feature/cardflow-r1`(提案 [2026-09-30-cardflow-and-process-split.md](../proposals/2026-09-30-cardflow-and-process-split.md),D39–D43)。
## 证据矩阵
| 层 | 验证 | 结果 |
|---|---|---|
| Core 契约 | `go test ./...`(golden message.json 锁定 `cardId` 线格式) | ok |
| Backend 机制 | `internal/runtime`(submit_card 门控/产卡/引用部件)、`internal/ctxasm`(回填/截断/占位/card(n) 观测) | ok |
| Backend 全链路 | `internal/server` e2e `TestMockCardflowFullLoop`:#cardflow → result 卡入收件箱 → 助手消息含 cardId 引用部件 → finishRun 回填 AnchorMessageID | ok |
| UI 组件 | `npx tsc --noEmit` 0 错误;`npx vitest run` 39/39(card-anchor 6 用例:摘要行/展开/收起/locate 不触发展开/无卡兜底/无 locate 不渲染按钮) | ok |
| Frontend | `npx tsc --noEmit` 0 错误;`npx vitest run` 27/27(live 分桶/过程标记 + 既有回归) | ok |
| Dev 组合 | `make test` 退出码 0;`make build` 版本串 core=bcfacee+backend=ef17ad0+frontend=832a2ad+ui=31019ad | ok |
## 双态零页面走查(无头 Chromium 1680×1000,mock 服务 127.0.0.1:18923)
| # | 断言 | 结果 |
|---|---|---|
| 1 | 关闭态:普通消息出现过程折叠(行为不回退) | PASS |
| 2 | 关闭态:无卡流锚点 | PASS |
| 3 | 设置:`ui.cardflow` 写入 user scope 200 | PASS |
| 4 | 设置:schema 含 ui.cardflow(ui 组,默认 false) | PASS |
| 5 | 开启态:#cardflow 后中栏出现卡流锚点 | PASS |
| 6 | 开启态:锚点内联展开全文(含决议正文——D38 中栏自足) | PASS |
| 7 | 开启态:收件箱出现 result 卡(会议纪要 · 第 12 次周会) | PASS |
| 8 | D32:收件箱卡「↙ 定位到对话」滚动中栏至产生消息(data-msg-id) | PASS |
| 9 | 锚点「↗ 收件箱」定位收件箱卡 | PASS |
合计 9/9 通过;构建组合:bin/agent-system(0c4e404+core=bcfacee+backend=ef17ad0+frontend=832a2ad)。
## 说明与剩余项
- backend/frontend 分支已 rebase 至并行任务 `feature/chat-process-split-r1` 演进 tip(ae8e5d0 / 754ce83)之上,冲突双方语义均保留(fakeRunCtx 字段合并、两套测试并存)。
- 任务 1(chat-process-split-r1)的 review-fix 与 PR 归并行会话所有者;本任务卡与 PR 链只覆盖 cardflow-r1。
- PR 链(core→documents→ui→backend→frontend→Dev gitlink)依赖 Gitea 面板可用性:面板中断期间全部分支已推送(SSH),PR 创建与合入由 `/tmp/cardflow-pr-chain.sh` 面板恢复后自动执行(含 Dev 分支落后基线检查,落后即中止转人工)。
- 远期(CF3):卡片内容流式、飞书/微信通道投影、与 artifact 统一、跨会话项目级收件箱。