dsh-plugin-teamflow 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,67 +0,0 @@
1
- # ADR-0006:流水线「认知前置 + 架构落地」重构(质量优先于 token)
2
-
3
- - 状态:已接受(Accepted)
4
- - 日期:2026-08(v0.1.0)
5
- - 关联:`host/core/sanity.ts`(新)、`host/core/pipeline.ts`、`host/core/state.ts`、`host/core/triage.ts`、`host/util.ts`、`host/prompts/index.ts`、`store.ts`
6
-
7
- ## 背景
8
-
9
- 对同一持久化需求的 A/B 实测(见 `docs/benchmarks/pipeline-vs-native.md`)暴露根本问题:
10
- - **功能等价 ≠ 代码质量等价**。流水线 dev 输出 game.js/audio.js 两套几乎重复的 safeStorage 适配器、键名分散;原生 DSH 输出独立 storage.js + PERSIST_DEFS 单一事实来源 + verify-storage 专测。
11
- - 根因不是「流水线 vs 原生」,而是流水线**跳过了「建全局认知 → 架构决策」**:TOKEN_HYGIENE 让 dev「只读任务内文件」,state 只传"结论摘要"不传"架构蓝图" → dev 在无全局视野、无设计引导下散落实现。
12
-
13
- 原生工作流实证(`docs/benchmarks/native-workflow.md`):原生高质量 = 环境探索 → 全局 READ → **Design Decision** → 基线验证 → 实现,**次序不可跳过**。而流水线为省 token 压掉了这个自然涌现。
14
-
15
- DSH 无内置"认知构建"机制(standard preset persona 只有一句身份;仅 plan-mode 有 "Explore first")。所以流水线**必须显式化**这套认知流程,不能指望模型自觉。
16
-
17
- ## 决策
18
-
19
- ### 三情况协议(认知传递的总原则)
20
- - 情况一(全新会话 0 认知):读索引减量 + 定向精读,建认知。
21
- - 情况二(续会话):**默认认知已过期**(多人/场外提交/非流水线改动)→ 先状态核对再复用。
22
- - 情况三(新会话处理新需求):共用 state/记忆减量 + 轻量核对现状。
23
- - 核心:**认知资产可复用"减量",但永不能替代"对代码库当前真实状态的核对"**。
24
-
25
- ### M0 状态核对(`core/sanity.ts`)
26
- - `executePipeline` 开头(PRD 前)host 侧直接跑 `git branch/status/log`,产出 `externalDiffs` 摘要。
27
- - 注入所有后续阶段 prompt(经 `state.__runCtx.sanity`,`stateSliceFor` 统一渲染)。
28
- - 持久化到 `journal.sanity`(审计)。失败优雅降级为"无法核对",不阻断流程。
29
-
30
- ### M1 架构阶段全模式启用
31
- - `lite/tech/patch` 不再跳过技术/架构阶段——改为**轻量架构蓝图**(`architectPrompt`,只产蓝图 JSON,不写文档);`full/medium` 由 `techPrompt` 产蓝图 + 完整文档。
32
- - `architectPrompt` 明确**允许整文件 read 关键源文件**(豁免 TOKEN_HYGIENE「别整读」——架构决策需要全局视野),先读状态核对,再建全局认知,最后输出结构化蓝图。
33
- - 架构蓝图 = `<!-- blueprint -->{json}<!-- /blueprint -->` 块,host 用 `extractBlueprint` 解析,`render` 注入 `state.__runCtx.blueprint`。
34
-
35
- ### M2 dev 继承蓝图 + 自动拆任务
36
- - `devPrompt` 注入架构蓝图,契约升级为"按蓝图在既有架构上实现",允许小范围核实(不整读)。
37
- - dev 任务来源优先级:**蓝图 tasks(架构师自动拆,按文件边界)> 调用方 tasks > 整体开发**。
38
- - 冲突检测:蓝图任务 files 有交集 → 合并(保证并发不写同一文件);无交集才并行。
39
-
40
- ### M3 质量门禁
41
- - QA/验收 prompt 加「架构核验」:核对是否遵循蓝图、有无重复实现/适配器漂移/该抽象未抽象。
42
- - `parseAcceptanceVerdict` 扩展:命中架构打回信号(架构返工/重复实现/偏离蓝图/该拆未拆/该抽象未抽象/破坏既有结构)→ `rework`,即使结论行写"通过"。
43
- - 验收不再是"verify 全绿即通过";架构偏离 → 有条件通过(返工)或打回。
44
-
45
- ### triage 配套
46
- - SIGNALS 增架构性词(持久化/localStorage/存储/独立模块/抽象/跨模块等)。
47
- - 架构护栏:命中架构性信号且判 lite/tech/patch → **强制 medium**(必须有架构阶段)。
48
- - TRIAGE_PROMPT 增第 5 条架构判据。
49
-
50
- ## 理由(质量优先于 token)
51
-
52
- - **代码质量是生产底线**:不能为省 token 放弃架构。省 token 的正确方式是把建认知+出设计做成**一次共享**(tech→蓝图→dev 继承),而不是让每个 dev 各读一遍(重复)或都不读(没认知)。
53
- - 让「架构阶段」全模式存在,是把原生工作流最值钱的「全局读 → Design Decision」固化成一个真实阶段 + 一种共享数据(蓝图)。
54
- - 验收加架构门禁,把"防重复/防散落"变成可判定的门禁,而非靠各 agent 自觉。
55
-
56
- ## 影响
57
-
58
- - lite 语义变化:仍跑轻量架构阶段(产蓝图不写文档);triage 对架构性需求强升 medium。
59
- - dev 任务可能被蓝图自动拆解(架构性需求不再退化为"整体开发"单任务)。
60
- - 验收更严格:架构偏离会打回(首次可能增多返工,但这是质量投入)。
61
- - `journal.sanity`/`journal.blueprint` 新增字段;`state.__runCtx` 为运行时注入(不持久化)。
62
-
63
- ## 后续
64
-
65
- - 用「持久化」类需求重跑,验证:M0 状态核对注入、M1 蓝图产出、M2 dev 按蓝图拆任务、M3 验收架构核验效果。
66
- - full/medium 阶段集差异执行仍待做(ADR-0004 §影响)。
67
- - 认知传递的更深层(如共享向量/结构化知识)依赖 DSH 未来能力,当前用"蓝图 + 状态核对"显式化已覆盖根因。
@@ -1,65 +0,0 @@
1
- # ADR-0007:QA 发现缺陷 → 打回开发修复 → 复验 → 干净才验收(有界循环 + 人工兜底)
2
-
3
- - 状态:已接受(Accepted)
4
- - 日期:2026-08(v0.1.0)
5
- - 关联:`host/core/pipeline.ts`、`host/core/backlog.ts`、`host/constants.ts`、`host/prompts/index.ts`、`test/smoke.js`
6
-
7
- ## 背景
8
-
9
- 对照实验 run `tf-mt317a5e-0iwvuy`(干净分支 feat/persistence-localStorage2,tech 档)实测暴露两个流程缺陷:
10
-
11
- 1. **QA 发现的缺陷没有被解析**。QA 报告缺陷行按 markdown 加粗写严重级(`| BUG-P1-1 | **P1** | …`),
12
- `parseDefects` 旧正则是 `(P[0-3])\s*\|`,要求严重级后**紧跟管道符** → `**P1**` 匹配失败 → 缺陷 0 条。
13
- 于是日志记录「QA 未发现 P0/P1/P2 缺陷(未登记 Bug)」,任务静默进入 `pending-acceptance`。
14
- 2. **没有 QA→开发 打回闭环**。即使解析出缺陷,旧逻辑也只是登记 bug 后照样进产品验收;
15
- QA 的负向结论要等到验收(PM)再拦一次(本次是资深 PM 源码复核拦下的),
16
- 既浪费一次验收调用,也让「QA 报告已给出可执行缺陷」的事实被流程白白放过。
17
-
18
- 用户反馈明确要求:QA 发现缺陷 → **打回开发确认是否属实 → 属实则直接修复 → 复验 QA →
19
- QA 干净才到产品最终验收**;该循环需**限制轮次上限**(防无限循环),超限才转人工介入。
20
-
21
- ## 决策
22
-
23
- ### 1. 修复缺陷解析(`backlog.ts` `parseDefects`)
24
- - 改为按管道单元格解析:容忍 markdown 加粗(`**P1**`)、反引号、行首 `|` 偏移;不再要求固定列数。
25
- - 只认「三要素齐全(id / P0-P3 严重级 / 模块)+ 非表头 + 非 OBS」的行 → 真实缺陷(含 `**P1**`)必被解析。
26
- - 语义保持不变:P0/P1/P2 = 阻断缺陷;P3 = 观察项(非阻断)。
27
-
28
- ### 2. QA→开发→复验 有界闭环(`pipeline.ts`)
29
- - QA 阶段改为 `do…while` 循环,最多 `1 + QA_REWORK_LIMIT` 轮:
30
- - 第一轮:常规 QA(label「QA 测试工程师 · 功能测试」)。
31
- - 解析缺陷 → 阻断缺陷(P0-P2)> 0:
32
- - 未超上限 → `advanceTask('rework')`,启动开发修复子代理(新 prompt `qaFixPrompt`,
33
- 指令「**先确认缺陷是否属实 → 属实在既有架构上修复 → 交还复验**」,防"修错/臆造/无视误报")。
34
- - 修复摘要拼接进下一轮 QA 的开发结果上下文 → 复验(label「QA 复验 · 第N轮修复后」)。
35
- - 复验无阻断缺陷 → `verifyReqBugs` 关单 + `advanceTask('pending-acceptance')` → 进入产品验收。
36
- - **QA 干净是进产品验收的充分条件**:验收块由 `if (!qaBlocked)` 门控;QA 不干净绝不自动跑验收,
37
- 杜绝「QA 报告已列缺陷 → 还进验收 → 验收再打回」的浪费。
38
-
39
- ### 3. 轮次上限 + 人工兜底(`constants.ts` / `pipeline.ts`)
40
- - `QA_REWORK_LIMIT = 2`:最多 2 轮「打回开发修复 + 复验」;配合首轮共 3 次 QA 执行,防无限循环。
41
- - 超限 → `qaBlocked = true`:task/req 置 `needs-human`、`humanIntervention = true`、
42
- 日志明示「超出复验上限,需人工介入」,跳过产品验收,流水线以需人工收尾。
43
-
44
- ### 4. 缺陷单幂等 + 关单(`backlog.ts`)
45
- - `syncQaDefects`:按 `reqId + defectId` 幂等登记(多轮复验同一缺陷不重复建卡,只刷新严重级/状态)。
46
- - `verifyReqBugs`:QA 复验通过 / 验收通过时,关闭该需求全部 open 的 P0-P2 缺陷(P3 观察项保留)。
47
- - 验收通过分支复用 `verifyReqBugs`(原「存在未关闭缺陷 → pending-acceptance」逻辑中避免遗留僵尸 open 单)。
48
-
49
- ## 理由
50
-
51
- - **QA 是第一质量门禁**:它的负向结论应当驱动最近的正向反馈环(开发修复),而不是被推给下一阶段的验收。
52
- - **有界性是必须的**:无限复议 = 无限 token 烧毁 + 任务无终止;上限处转人工,让"工具化复盘"让位于"人的判断"。
53
- - 与 ADR-0006 一脉相承:M3 门禁管"验收拦截",本 ADR 管"QA 打回后快速自愈",两处都不可省。
54
-
55
- ## 影响
56
-
57
- - QA 阶段可能多次执行(最多 3 轮),token/调用数上升是**可预期成本**,换取「缺陷在 QA 内闭环」。
58
- - `advanceTask('rework')` 现用于 QA 打回(此前仅验收 rework 用);任务卡状态机本就含 `rework`,无需扩展。
59
- - `parseDefects` 行为收紧:表头/观察项/非管道行不再可能被误认作缺陷。
60
- - run 日志可见「QA 打回开发修复(第 N/N+1 轮)」「QA 复验通过(第 N 轮修复后)」等新阶段轨迹。
61
-
62
- ## 后续
63
-
64
- - 用「持久化修复」类需求实测一条完整打回链:QA 报 P1 → 开发修复 → 复验通过 → 验收 ✅,验证闭环行为与 token 成本。
65
- - 观察超限打回(needs-human)的人工介入路径是否顺畅(`teamflow_update`/认领后重跑)。
@@ -1,103 +0,0 @@
1
- # ADR-0008:文档层重构——活文档版本制 → 任务夹收口制(日期+需求+slug,历史不可变)
2
-
3
- - 状态:已接受(Accepted)
4
- - 日期:2026-08(v0.1.0)
5
- - 关联:`host/core/pipeline.ts`、`host/core/triage.ts`、`host/core/state.ts`、`host/core/backlog.ts`、`host/core/sanity.ts`、`host/prompts/index.ts`、`host/constants.ts`、`store.ts`、client 展示层、全部 smoke 断言
6
-
7
- ## 背景
8
-
9
- 现行文档层是「活文档 + 版本切片」模型:PRD/TECHNICAL/QA 等固定在 `docs/teamflow/{prd,technical,qa}/` 单一路径,
10
- 每次迭代先 mv 旧版到 `history/v<旧版本号>/` 再写新版,靠 prompt 纪律约束模型执行。实测暴露四类结构性缺陷:
11
-
12
- 1. **双归档升版**(实锤 tetris):阶段重试或断点续跑重入 PRD 阶段时,把自己上次的产物当「旧版」再归档一次,
13
- 版本号凭空 +1——已用「防双归档」prompt 补丁缓解,但补丁是概率性的。
14
- 2. **memory.md 段落堆积**(实锤 8 段「当前迭代记忆」并存):「更新记忆」语义模糊导致追加而非替换,
15
- 多段自称"当前",版本互相矛盾——同样只能靠 prompt 补丁。
16
- 3. **全局串行版本假设脆弱**:v2.* 隐含"所有变更排一条时间线"。多人并行、场外改动(不走流水线的功能)、
17
- 多分支开发任一发生,版本号即失真。tetris 三模块代码头 2.3.0/2.3.0/2.6.0 与文档 v2.9 三方漂移即实证。
18
- 4. **并行分支合并冲突**:两个分支各自迭代必然改同一份 PRD.md 的同区域(修订表/AC 清单)+ 同一份 memory.md
19
- ——文档层合并冲突在活文档模型下是结构必然而非偶然。
20
-
21
- 根因判断:**版本号是隐含全局锁的共享可变状态;归档是依赖模型自觉的写时动作**。两者都违背
22
- 「结构保证优于提示词恳求」原则(与 ADR-0007 同一哲学)。
23
-
24
- ## 决策
25
-
26
- ### 1. 任务夹 = 需求级档案单元
27
-
28
- ```
29
- docs/teamflow/
30
- ├── 20260825-r8-wallkick-toggle/ ← 任务夹(建后不可变;阶段重试/断点续跑复用同夹)
31
- │ ├── meta.json ← host 写:{reqId,runId,title,slug,mode,createdAt} 静态标识卡(建夹即定;status/endedAt 权威在 runs/<runId>.json journal,不落 meta——终态回写已废:避免「提交后再脏」与 run 误判时快照过时)
32
- │ ├── PRD.md ← 模型写:meta 头 + 基线声明/取代声明 + 本地 AC 编号(AC-1..n)
33
- │ ├── DESIGN.md / TECHNICAL.md ← 按档位出现(needDesign/非 lite),不再归档
34
- │ ├── QA-REPORT.md
35
- │ └── ACCEPTANCE.md ← 验收报告进夹(废除独立 acceptance/ 目录)
36
- ├── memory.md ← 收窄为产品约定层(技术栈/团队规矩),低频幂等更新
37
- └── (SUMMARY.md 废除:由 host 扫描各夹 meta.json 聚合,工作台渲染)
38
- ```
39
-
40
- - 命名 `<yyyyMMdd>-r<N>[-<slug>]`:日期=需求创建日;`r<N>` 为 reqId 序号(防撞兜底,triage 无 slug 时退化
41
- 为 `20260825-r9/`);slug 由 triage 新增输出(正则 `[a-z0-9-]{3,24}` 校验,非法降级)。
42
- - **身份 = reqId**:夹名在建夹时刻固定并持久化到 `journal.runDocs`;重试、续跑、隔天重跑一律复用同夹
43
- ——幂等性由「夹已存在直接复用」的结构规则保证,不再依赖模型自觉。
44
-
45
- ### 2. 共享写点清零策略
46
-
47
- | 旧共享写点 | 新方案 |
48
- |---|---|
49
- | prd/PRD.md(每分支必改) | 各分支写各的任务夹,路径不相交 |
50
- | memory.md 当前迭代段落 | 「当前迭代」制度废除——迭代细节天然在夹内;memory 收窄为约定层 |
51
- | SUMMARY.md 登记表 | 废除静态文件:host 扫描 meta.json 聚合,工作台按需渲染 |
52
-
53
- memory.md 仅在真正新增团队约定时追加一行(幂等:同主题替换),写入频率从每迭代一次降到偶发。
54
-
55
- ### 3. 回归基线:局部编号 + 显式指针 + 硬保障在代码层
56
-
57
- - AC 编号回归需求本体(夹内 AC-1..n),废除全局账本(中央登记表会重新引入共享写点)。
58
- - 新 PRD 头部两行声明:
59
- - `基线依赖:<其他任务夹名列表>(其既定行为不得回退)`
60
- - `取代:<某夹>#AC-n(语义变更说明)`——历史夹永不改动;查最新真相 = 按日期倒序找最后一条取代链。
61
- - 回归的硬保障仍是项目 verify-* 可执行套件(本就不依赖文档编号);QA 阶段照旧全量运行。
62
-
63
- ### 4. host/model 职责切分:结构归 host,内容归 model
64
-
65
- - host:建夹、命名、meta.json 静态标识卡(建夹一次写入,无终态回写)、journal.runDocs/state.__runCtx 注入;动态状态(status/endedAt)唯一权威 = runs/<runId>.json,目录聚合扫描时以 journal 为准。
66
- - model:只写自己夹内的产物文件;对索引零写入权。PRD 头部输出一行机器可读 meta
67
- (`<!-- meta: summary="…" -->`)供未来聚合使用(YAGNI:本轮不做解析消费)。
68
-
69
- ### 5. 代码头 VERSION 解耦
70
-
71
- devPrompt 明确:模块头部 VERSION 是发布版本,仅对外发版时升位;流水线迭代不碰。
72
- (修复 game.js 2.3.0 型漂移的再发——迭代计数器不得误植进代码。)
73
-
74
- ### 6. 存量过渡:零迁移
75
-
76
- 旧 `prd/`、`technical/`、`history/`、既有 SUMMARY.md 原样留存(历史可追溯性不受影响);
77
- 新需求自然落新夹。项目侧 verify 脚本的文档路径断言由项目自行调整(不在插件范围)。
78
-
79
- ## 理由
80
-
81
- - **结构消灭 bug 类别**:双归档/版本虚增/memory 堆积的全部前提是「固定路径上的覆盖式写入」;
82
- 任务夹让该前提取消,prompt 补丁(防双归档条款等)随之整体删除而非叠加。
83
- - **容忍乱序与旁路**:日期命名不假设任何全局顺序;场外改动、多分支、多团队并行都不再使任何计数器失真。
84
- - **审计单元对齐心智**:「一个需求的所有产物在一个文件夹」与 backlog req/task、journal run 天然一一对应;
85
- review/回滚/交接以文件夹为单位。
86
- - **已有先例**:`logs/teamflow/<runId>/` 早已是 per-run 收口模式,docs 对齐反而统一。
87
- - **resume 不受影响**:断点续跑的产物重建走 journal stage.output 全文,不依赖文档路径——改造影响面收敛在
88
- prompt 注入与展示层。
89
-
90
- ## 影响
91
-
92
- - 全部 10 个 prompt 的路径注入改为 `TF_RUN_DOCS`(本任务夹)+ `TF_PRODUCT_DOCS`(memory 层)两个变量。
93
- - triage 输出协议扩展 `slug` 字段(向后兼容:缺省为空)。
94
- - state.json `product.currentVersion` 废弃,改记 `lastRunFolder`。
95
- - client 文档引用路径跟随 journal.runDocs;目录浏览器不做(YAGNI)。
96
- - smoke 断言大改:删除版本切片/mv 归档/防双归档族断言,新增 runDocs 注入/meta.json/命名格式断言。
97
- - 单 commit 可整体回滚;运行中流水线不受影响,重启宿主生效。
98
-
99
- ## 后续
100
-
101
- - 用下一条真实需求实测完整生命周期:建夹命名 → 各阶段产物落位 → 续跑复用同夹 → 验收后由 runs/<runId>.json 反映终态。
102
- - 观察两分支并行迭代的真实合并场景,确认文档层零冲突。
103
- - 工作台聚合视图(扫 meta.json 渲染产品时间线)作为后续增强候选,本轮不做。
package/lib/client.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.js","names":["React"],"sources":["../descriptors.ts","../client/index.tsx"],"sourcesContent":["/**\n * dsh-plugin-teamflow — Remote 描述符(纯数据,host 与 client 共用)。\n *\n * host 侧:通过 ctx.typert.register() 注册为 strict 本地调用定义(免 @Remote 装饰器);\n * client 侧:通过 ctx.remote.$mount() 生成 `ctx.remote.teamflow.<method>` 调用面。\n * 两边使用同一份描述符,保证 endpoint(namespace/method)与 wire 参数一致。\n *\n * 参数规则:全部宽松 JSON,wire 字段名 = host 方法参数名,client 端按位置传参;\n * 参数允许省略(host 方法收到 undefined)。\n *\n * codec 为什么用 strict:client 的 $mount 只接受 mode: 'strict' 描述符\n * (requireStrictDescriptor),src-json 会被拒(\"field has no strict codec\")。\n * 本插件载荷本就是自由 JSON,因此 strict schema 用恒等 parse(不做形状校验;\n * host 侧 decode 仍会做 JSON 安全性检查,参数缺省语义与 src-json 一致)。\n */\n\nimport type { InvocationDescriptor } from '@deepseek-ai/dsh-typert-protocol'\n\n/** 恒等 parse:接受任意 JSON 值,原样返回。 */\nconst JSON_SCHEMA: { parse(value: unknown): unknown } = { parse: (value) => value }\n/** 统一 strict codec(本插件所有参数/结果均为自由 JSON)。 */\nconst strict = {\n mode: 'strict' as const,\n typeSymbol: 'dsh-plugin-teamflow/types#Json',\n schema: JSON_SCHEMA,\n}\ntype StrictCodec = typeof strict\n\nconst p = (name: string): InvocationParameter => ({ name, wire: name, source: 'json', codec: strict })\n\ninterface InvocationParameter {\n readonly name: string\n readonly wire: string\n readonly source: 'json'\n readonly codec: StrictCodec\n}\n\nexport const TEAMFLOW_DESCRIPTORS: readonly InvocationDescriptor[] = Object.freeze([\n {\n id: 'dsh-plugin-teamflow#teamflow/ping',\n service: 'teamflow',\n namespace: 'teamflow',\n method: 'ping',\n invocation: { kind: 'direct' },\n parameters: [],\n result: strict,\n },\n {\n id: 'dsh-plugin-teamflow#teamflow/list',\n service: 'teamflow',\n namespace: 'teamflow',\n method: 'list',\n invocation: { kind: 'direct' },\n parameters: [p('sessionId')],\n result: strict,\n },\n {\n id: 'dsh-plugin-teamflow#teamflow/snapshot',\n service: 'teamflow',\n namespace: 'teamflow',\n method: 'snapshot',\n invocation: { kind: 'direct' },\n parameters: [p('runId'), p('sessionId')],\n result: strict,\n },\n {\n id: 'dsh-plugin-teamflow#teamflow/start',\n service: 'teamflow',\n namespace: 'teamflow',\n method: 'start',\n invocation: { kind: 'direct' },\n parameters: [p('sessionId'), p('requirement'), p('options')],\n result: strict,\n },\n {\n id: 'dsh-plugin-teamflow#teamflow/cancel',\n service: 'teamflow',\n namespace: 'teamflow',\n method: 'cancel',\n invocation: { kind: 'direct' },\n parameters: [p('runId')],\n result: strict,\n },\n {\n id: 'dsh-plugin-teamflow#teamflow/backlog',\n service: 'teamflow',\n namespace: 'teamflow',\n method: 'backlog',\n invocation: { kind: 'direct' },\n parameters: [p('sessionId')],\n result: strict,\n },\n {\n id: 'dsh-plugin-teamflow#teamflow/backlogUpdate',\n service: 'teamflow',\n namespace: 'teamflow',\n method: 'backlogUpdate',\n invocation: { kind: 'direct' },\n parameters: [p('kind'), p('id'), p('to'), p('sessionId'), p('reason')],\n result: strict,\n },\n {\n id: 'dsh-plugin-teamflow#teamflow/assign',\n service: 'teamflow',\n namespace: 'teamflow',\n method: 'assign',\n invocation: { kind: 'direct' },\n parameters: [p('kind'), p('id'), p('role'), p('assignee'), p('sessionId')],\n result: strict,\n },\n {\n id: 'dsh-plugin-teamflow#teamflow/pause',\n service: 'teamflow',\n namespace: 'teamflow',\n method: 'pause',\n invocation: { kind: 'direct' },\n parameters: [p('sessionId')],\n result: strict,\n },\n {\n id: 'dsh-plugin-teamflow#teamflow/resumeSession',\n service: 'teamflow',\n namespace: 'teamflow',\n method: 'resumeSession',\n invocation: { kind: 'direct' },\n parameters: [p('sessionId')],\n result: strict,\n },\n {\n id: 'dsh-plugin-teamflow#teamflow/listTeams',\n service: 'teamflow',\n namespace: 'teamflow',\n method: 'listTeams',\n invocation: { kind: 'direct' },\n parameters: [p('sessionId')],\n result: strict,\n },\n {\n id: 'dsh-plugin-teamflow#teamflow/selectTeam',\n service: 'teamflow',\n namespace: 'teamflow',\n method: 'selectTeam',\n invocation: { kind: 'direct' },\n parameters: [p('sessionId'), p('teamId')],\n result: strict,\n },\n {\n id: 'dsh-plugin-teamflow#teamflow/getActiveTeam',\n service: 'teamflow',\n namespace: 'teamflow',\n method: 'getActiveTeam',\n invocation: { kind: 'direct' },\n parameters: [p('sessionId')],\n result: strict,\n },\n {\n id: 'dsh-plugin-teamflow#teamflow/clearTeam',\n service: 'teamflow',\n namespace: 'teamflow',\n method: 'clearTeam',\n invocation: { kind: 'direct' },\n parameters: [p('sessionId')],\n result: strict,\n },\n {\n id: 'dsh-plugin-teamflow#teamflow/resume',\n service: 'teamflow',\n namespace: 'teamflow',\n method: 'resume',\n invocation: { kind: 'direct' },\n parameters: [p('runId'), p('sessionId')],\n result: strict,\n },\n {\n id: 'dsh-plugin-teamflow#teamflow/stageDetail',\n service: 'teamflow',\n namespace: 'teamflow',\n method: 'stageDetail',\n invocation: { kind: 'direct' },\n parameters: [p('runId'), p('seq'), p('sessionId')],\n result: strict,\n },\n {\n id: 'dsh-plugin-teamflow#teamflow/itemDetail',\n service: 'teamflow',\n namespace: 'teamflow',\n method: 'itemDetail',\n invocation: { kind: 'direct' },\n parameters: [p('kind'), p('id'), p('sessionId')],\n result: strict,\n },\n])\n\n/** client 端 $mount 使用的贡献对象。 */\nexport const TEAMFLOW_REMOTE_CONTRIBUTION: {\n readonly package: string\n readonly descriptors: readonly InvocationDescriptor[]\n} = Object.freeze({\n package: 'dsh-plugin-teamflow',\n descriptors: TEAMFLOW_DESCRIPTORS,\n})\n","/**\n * dsh-plugin-teamflow — browser half(v0.7 视觉重构:「精密工程控制台」)。\n *\n * 注册 conversation.view tab「🏭 团队工作台」(与 chat / 轨迹并列):\n * - 流水线图形工作流:阶段泳道 + 节点卡片(状态/耗时/token/子代理会话)+ 实时轮询\n * - Backlog 拖拽看板:需求/任务/缺陷三组状态泳道,卡片拖拽流转(原生 HTML5 DnD,零依赖)\n * - 成本中心:每阶段 token + 总计 + 运行时长\n * - 人工介入中心:needs-human 项聚合 + 一键终态\n * - 历史 run 切换\n *\n * 视觉:全部使用 DSH 主题 token(--dsw-alias-*,自动适配深浅色)。\n * Remote 接入:$mount 后 ctx.get('remote.teamflow') 取全局实例传给组件\n * (不能 inject 'remote.teamflow'——自挂载自注入会让 fiber 死锁)。\n */\nimport React from 'react'\nimport { TEAMFLOW_REMOTE_CONTRIBUTION } from '../descriptors.js'\n\nexport const inject = ['remote', 'slots', 'sessions', 'locale']\n\n/* ── 主题 token(自动适配深浅色) ─────────────────────────────────── */\nconst T = {\n bg: 'var(--dsw-alias-bg-base)',\n layer1: 'var(--dsw-alias-bg-layer-1)',\n layer2: 'var(--dsw-alias-bg-layer-2)',\n border: 'var(--dsw-alias-border-l1)',\n border2: 'var(--dsw-alias-border-l2)',\n brand: 'var(--dsw-alias-brand-primary)',\n text: 'var(--dsw-alias-label-primary)',\n text2: 'var(--dsw-alias-label-secondary)',\n error: 'var(--dsw-alias-state-error-primary)',\n success: 'var(--dsw-alias-state-success-primary)',\n warn: 'var(--dsw-alias-state-warn-primary)',\n}\n\nconst STATUS_TEXT = {\n created: '立项', 'in-progress': '进行中', 'pending-acceptance': '待验收', accepted: '已验收', closed: '已关闭',\n pending: '待办', running: '开发中', testable: '待测试', testing: '测试中', rework: '打回',\n 'needs-human': '需人工', cancelled: '已关闭', open: '待认领', claimed: '处理中', fixed: '已修复待验',\n verified: '已关闭', reopened: '重开', done: '已完成', completed: '已完成', failed: '失败',\n interrupted: '已中断', superseded: '已取代',}\nconst STATUS_COLOR = {\n created: T.text2, pending: T.text2, open: T.text2,\n 'in-progress': T.brand, running: T.brand, claimed: T.brand, testing: T.brand, fixed: T.brand, reopened: '#8250df',\n 'pending-acceptance': T.warn, testable: T.warn,\n accepted: T.success, verified: T.success, completed: T.success, done: T.success,\n rework: T.error, failed: T.error, 'needs-human': T.error, cancelled: T.text2, closed: T.text2,\n interrupted: T.warn, superseded: T.text2,\n}\nconst PHASE_ICON = {\n 'PRD 产品需求': '📋', 'UI/UX 设计': '🎨', '架构规划': '🏗️', '技术方案': '📐',\n 开发: '💻', 'QA 测试': '🧪', '产品验收': '✅',\n}\nconst RUN_STATUS_TEXT = { pending: '等待中', running: '进行中', completed: '已完成', failed: '失败', cancelled: '已取消', interrupted: '已中断', superseded: '已取代' }\nconst COLUMNS = {\n req: ['created', 'in-progress', 'pending-acceptance', 'accepted', 'closed', 'needs-human'],\n task: ['pending', 'running', 'testable', 'testing', 'pending-acceptance', 'accepted', 'rework', 'needs-human', 'cancelled'],\n bug: ['open', 'claimed', 'fixed', 'verified', 'reopened', 'needs-human'],\n}\nconst KIND_TITLE = { req: '需求', task: '任务', bug: '缺陷' }\n\nconst h = React.createElement\nconst MONO = 'ui-monospace, SFMono-Regular, Consolas, \"Cascadia Mono\", monospace'\nconst SANS = '-apple-system, BlinkMacSystemFont, \"Segoe UI\", \"PingFang SC\", \"Microsoft YaHei\", sans-serif'\nconst flexRow = { display: 'flex', alignItems: 'center', gap: 6, flexWrap: 'wrap' }\n\n/** 状态徽章:半透明底 + 状态色文字 + 圆角 pill。 */\nconst chip = (text, color, opts: { style?: Record<string, string>; dot?: boolean } = {}) => h('span', {\n style: {\n display: 'inline-flex', alignItems: 'center', gap: 4,\n padding: '1px 8px', borderRadius: 999, fontSize: 11, fontWeight: 500, lineHeight: '16px',\n background: `color-mix(in srgb, ${color} 14%, transparent)`, color,\n whiteSpace: 'nowrap', ...(opts.style || {}),\n },\n}, opts.dot ? h('span', { style: { width: 5, height: 5, borderRadius: 999, background: color, display: 'inline-block' } }) : null, text)\n\n/** 可折叠长文本:默认只显示前几行预览,「展开全文」/「收起」双向切换(数据不动,纯展示层——summary/需求原文等富文本不再铺满抽屉)。 */\nfunction FoldableText({ text, charLimit = 280, lineLimit = 5, style }: { text: unknown; charLimit?: number; lineLimit?: number; style?: Record<string, unknown> }) {\n const [open, setOpen] = React.useState(false)\n if (!text) return null\n const t = String(text)\n const lines = t.split('\\n')\n const compact = lines.length <= lineLimit && t.length <= charLimit\n const body = (txt) => h('div', { style: { fontSize: 11.5, color: T.text, lineHeight: 1.6, whiteSpace: 'pre-wrap', wordBreak: 'break-word', ...(style || {}) } }, txt)\n if (compact) return body(t)\n if (open) return h('div', null,\n body(t),\n h('button', {\n onClick: () => setOpen(false),\n title: '收起全文',\n style: { marginTop: 3, font: 'inherit', fontSize: 10.5, fontWeight: 600, color: T.text2, background: 'transparent', border: 'none', padding: 0, cursor: 'pointer' },\n }, '收起'),\n )\n const pre = lines.length > lineLimit ? lines.slice(0, lineLimit).join('\\n') : t.slice(0, charLimit)\n const more = lines.length > lineLimit ? `… +${lines.length - lineLimit} 行` : '…'\n return h('div', null,\n body(pre),\n h('button', {\n onClick: () => setOpen(true),\n title: '点击查看全文',\n style: { marginTop: 3, font: 'inherit', fontSize: 10.5, fontWeight: 600, color: T.brand, background: 'transparent', border: 'none', padding: 0, cursor: 'pointer' },\n }, `展开全文${more}`),\n )\n}\n\nfunction fmtTime(t) {\n if (!t) return '—'\n const d = new Date(t)\n return `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}:${String(d.getSeconds()).padStart(2, '0')}`\n}\nfunction fmtDur(a, b) {\n if (!a) return ''\n const ms = (b || Date.now()) - a\n if (ms < 0) return ''\n const s = Math.floor(ms / 1000)\n if (s < 60) return `${s}s`\n return `${Math.floor(s / 60)}m${s % 60}s`\n}\nfunction fmtTokens(n) {\n if (n === null || n === undefined) return ''\n if (n >= 1e6) return `${(n / 1e6).toFixed(2)}M`\n if (n >= 1000) return `${(n / 1000).toFixed(1)}k`\n return String(n)\n}\n/** 官方口径计费合计(billed input + output)。 */\nfunction totalTokens(u) { return (u.input || 0) + (u.cacheRead || 0) + (u.cacheWrite || 0) + (u.output || 0) }\n/** 官方口径工具函数(与 DeepSeek usage 账单对齐,零额外概念):\n * - u.input : 输入(缓存未命中)\n * - u.cacheRead : 输入(缓存命中)\n * - u.cacheWrite : 输入写入缓存\n * - u.output : 输出\n * billed input = input + cacheRead + cacheWrite;命中率 = cacheRead / (input + cacheRead)。\n */\nfunction hitRate(u) {\n const total = (u.input || 0) + (u.cacheRead || 0)\n return total > 0 ? Math.round(((u.cacheRead || 0) / total) * 100) : null\n}\nfunction usageDetail(s) {\n const k = (n) => (n === null || n === undefined ? '—' : fmtTokens(n))\n if (s.usage) {\n const u = s.usage\n const hit = hitRate(u)\n return `输入(未命中) ${k(u.input)} / 输入(命中) ${k(u.cacheRead)} / 写缓存 ${k(u.cacheWrite)} / 输出 ${k(u.output)} · ${u.calls} 次调用${hit !== null ? ` · 缓存命中 ${hit}%` : ''}`\n }\n return '无 usage 明细'\n}\n/** 节点卡主 token 行:官方口径 —— 输入(未命中)/输入(命中)/输出 + 缓存命中率。 */\nfunction stageUsageLine(s) {\n const u = s && s.usage\n if (u && (u.input || u.cacheRead || u.cacheWrite || u.output)) {\n const hit = hitRate(u)\n return `⇅${fmtTokens(u.input)} ⇅${fmtTokens(u.cacheRead)} ⬆${fmtTokens(u.output)}${hit !== null ? ` ·${hit}%` : ''}`\n }\n return null\n}\nconst ROLE_NAME = { pm: '产品', design: '设计', arch: '架构', tech: '方案', dev: '开发', qa: '测试', acceptance: '验收', other: '其他' }\nconst roleUsage = (u) => {\n if (!u) return ''\n const hit = hitRate(u)\n return `⇅${fmtTokens(u.input || 0)}/${fmtTokens(u.cacheRead || 0)}·⬆${fmtTokens(u.output || 0)}${hit !== null ? `·${hit}%` : ''}`\n}\n/** 任务卡按角色累计的真实 token 摘要(官方口径:未命中/命中输入 + 输出 + 命中率)。 */\nfunction byRoleLine(task) {\n const roles = (task && task.byRole) || {}\n const parts = Object.keys(roles)\n .filter((k) => roles[k] && (roles[k].input + roles[k].output + roles[k].cacheRead + roles[k].cacheWrite) > 0)\n .map((k) => `${ROLE_NAME[k] || k} ${roleUsage(roles[k])}`)\n return parts.join(' · ')\n}\n/** 多阶段 usage 汇总(官方口径)。 */\nfunction totalUsage(stages) {\n const t = { input: 0, cacheRead: 0, cacheWrite: 0, output: 0, calls: 0 }\n for (const s of (stages || [])) {\n const u = s && s.usage\n if (!u) continue\n t.input += u.input || 0\n t.cacheRead += u.cacheRead || 0\n t.cacheWrite += u.cacheWrite || 0\n t.output += u.output || 0\n t.calls += u.calls || 0\n }\n return t\n}\nconst stText = (s) => STATUS_TEXT[s] || s\nconst stColor = (s) => STATUS_COLOR[s] || T.text2\n\n/* ── 流水线面板:横向蛇形流程画布(从左至右 · 弧线连接 · 流动动画 · 画布拖动/缩放) ── */\nconst NODE_W = 300 // 节点宽度\nconst PHASE_GAP = 88 // 相位间水平间距(连接线长度)\nconst WAVE = 56 // 相邻相位垂直错位幅度(产生上下弧线)\nconst CARD_H = 54 // 阶段卡固定高度\nconst CARD_H_RUN = 64 // 运行中卡略高(含进度条)\nconst HEAD_H = 38 // 相位头高度\nconst PAD_L = 46\nconst PAD_R = 72\nconst PAD_T = 42\nconst PAD_B = 46\nconst cardH = (s) => (s.status === 'running' ? CARD_H_RUN : CARD_H)\n\n/** 横向布局:相位从左至右一排,上下轻微波浪错位(弧线自然成形)+ 绝对定位节点 + 连接锚点。\n * 返回 nodes/conns/worldW/worldH。 */\nfunction layoutFlow(groups, viewW) {\n const nodes = []\n const conns = []\n let maxH = 0\n groups.forEach((g, i) => {\n const anyRun = g.stages.some((s) => s.status === 'running')\n const anyFail = g.stages.some((s) => s.status === 'failed' || s.status === 'needs-human' || s.status === 'cancelled')\n const allDone = g.stages.length > 0 && g.stages.every((s) => s.status === 'done')\n const headColor = anyRun ? T.brand : anyFail ? T.error : allDone ? T.success : T.text2\n const h = HEAD_H + 10 + g.stages.reduce((a, s) => a + cardH(s), 0) + Math.max(0, g.stages.length - 1) * 7\n maxH = Math.max(maxH, h)\n nodes.push({ i, phase: g.phase, stages: g.stages, left: PAD_L + i * (NODE_W + PHASE_GAP), h, headColor })\n })\n const axisY = PAD_T + WAVE / 2 + maxH / 2 // 垂直中心轴(两侧各留波浪余量)\n nodes.forEach((n) => {\n n.top = axisY + (n.i % 2 === 0 ? -1 : 1) * (WAVE / 2) - n.h / 2\n n.centerY = n.top + n.h / 2\n })\n for (let i = 1; i < nodes.length; i++) {\n const p = nodes[i - 1], n = nodes[i]\n conns.push({ x1: p.left + NODE_W, y1: p.centerY, x2: n.left, y2: n.centerY, color: n.headColor })\n }\n const worldW = PAD_L + nodes.length * (NODE_W + PHASE_GAP) - PHASE_GAP + PAD_R\n const worldH = PAD_T + WAVE + maxH + PAD_B\n return { nodes, conns, worldW, worldH }\n}\n\n/** S 形弧线路径(从左至右,前后锚点沿水平方向缓进出、垂直方向呈现波浪弧)。 */\nfunction connPath(c) {\n const dx = Math.max(48, (c.x2 - c.x1) / 2)\n return `M ${c.x1} ${c.y1} C ${c.x1 + dx} ${c.y1}, ${c.x2 - dx} ${c.y2}, ${c.x2} ${c.y2}`\n}\n\nfunction FlowStageCard(s, key, onOpen) {\n const color = stColor(s.status)\n const running = s.status === 'running'\n const usage = stageUsageLine(s)\n return h('div', {\n key,\n title: `${s.label} —— 点击查看阶段详情`,\n onMouseDown: (e) => e.stopPropagation(), // 不触发画布拖动,允许点击\n onClick: () => onOpen && onOpen(s),\n style: {\n boxSizing: 'border-box', height: cardH(s), borderRadius: 10, position: 'relative', overflow: 'hidden',\n display: 'flex', flexDirection: 'column', justifyContent: 'center', gap: 3, padding: '6px 11px 6px 13px',\n background: `linear-gradient(135deg, color-mix(in srgb, ${color} 8%, ${T.layer1}), ${T.layer1} 64%)`,\n border: `1px solid ${T.border}`, borderLeft: `3px solid ${color}`,\n opacity: s.status === 'pending' ? 0.56 : 1,\n cursor: 'pointer',\n transition: 'transform .12s ease, box-shadow .12s ease, border-color .12s ease',\n boxShadow: running ? `0 0 0 1px color-mix(in srgb, ${color} 32%, transparent), 0 6px 18px color-mix(in srgb, ${color} 15%, transparent)` : '0 1px 2px rgba(0,0,0,.05)',\n },\n },\n h('div', { style: { display: 'flex', alignItems: 'center', gap: 6 } },\n running ? h('span', { style: { width: 7, height: 7, borderRadius: 999, background: color, animation: 'tf-pulse 1.15s ease-in-out infinite' } })\n : h('span', { style: { width: 6, height: 6, borderRadius: 2, background: color } }),\n h('span', { title: s.label, style: { flex: 1, minWidth: 0, fontSize: 12, fontWeight: 600, color: T.text, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' } }, s.label),\n chip(stText(s.status), color, { dot: true }),\n h('span', { style: { color: T.text2, fontSize: 11, opacity: 0.5 } }, '↗'),\n ),\n h('div', { style: { display: 'flex', alignItems: 'center', gap: 8, paddingLeft: 13, fontSize: 10.5, color: T.text2, fontFamily: MONO, fontVariantNumeric: 'tabular-nums' } },\n s.startedAt ? h('span', {}, fmtDur(s.startedAt, s.endedAt)) : h('span', {}, '—'),\n usage ? h('span', { title: usageDetail(s), style: { marginLeft: 'auto', color } }, usage) : null,\n ),\n running ? h('div', { style: { position: 'absolute', left: 5, right: 5, bottom: 3, height: 2, borderRadius: 2, overflow: 'hidden', background: `color-mix(in srgb, ${color} 20%, transparent)` } },\n h('div', { style: { height: '100%', width: '42%', borderRadius: 2, background: color, animation: 'tf-shimmer 1.1s linear infinite' } }),\n ) : null,\n )\n}\n\nfunction FlowNode(node, onOpen) {\n const g = node\n const running = g.stages.some((s) => s.status === 'running')\n return h('div', {\n key: 'n' + g.i,\n style: { position: 'absolute', left: g.left, top: g.top, width: NODE_W, height: g.h, boxSizing: 'border-box', display: 'flex', flexDirection: 'column' },\n },\n /* 步骤序号徽标(悬在左上角,突出编号与次序) */\n h('div', {\n style: {\n position: 'absolute', top: -8, left: 12, width: 22, height: 22, borderRadius: 7, zIndex: 2,\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n fontFamily: MONO, fontSize: 10.5, fontWeight: 800, color: g.headColor,\n background: `color-mix(in srgb, ${g.headColor} 16%, ${T.layer1})`,\n border: `1px solid color-mix(in srgb, ${g.headColor} 36%, transparent)`,\n boxShadow: '0 2px 8px rgba(0,0,0,.14)',\n },\n }, String(g.i + 1).padStart(2, '0')),\n /* 相位头 */\n h('div', {\n style: {\n height: HEAD_H, boxSizing: 'border-box', borderRadius: 11, padding: '0 11px',\n display: 'flex', alignItems: 'center', gap: 7,\n color: g.headColor, fontSize: 12.5, fontWeight: 700,\n background: `linear-gradient(90deg, color-mix(in srgb, ${g.headColor} 13%, transparent), color-mix(in srgb, ${g.headColor} 5%, transparent))`,\n border: `1px solid color-mix(in srgb, ${g.headColor} 30%, transparent)`,\n },\n },\n h('span', { style: { fontSize: 13.5 } }, PHASE_ICON[g.phase] || '⚙️'),\n h('span', { style: { flex: 1, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' } }, g.phase),\n g.stages.length > 1 ? h('span', { style: { fontFamily: MONO, fontSize: 10, fontWeight: 800, background: `color-mix(in srgb, ${g.headColor} 16%, transparent)`, borderRadius: 999, padding: '0 7px', lineHeight: '16px' } }, `×${g.stages.length}`) : null,\n running ? h('span', { style: { width: 8, height: 8, borderRadius: 999, background: g.headColor, animation: 'tf-pulse 1.4s ease-in-out infinite' } }) : null,\n ),\n /* 卡片列 */\n h('div', { style: { flex: 1, minHeight: 0, display: 'flex', flexDirection: 'column', gap: 7, paddingTop: 10 } },\n g.stages.map((s) => FlowStageCard(s, s.seq, onOpen)),\n ),\n )\n}\n\n/** 阶段详情抽屉(卡片点击打开;浮于画布右侧,不参与拖动/缩放)。 */\nfunction StageDetailDrawer({ det, onClose, sessionId, sessions }) {\n const st = det.stage\n const d = det.data\n const color = (st && st.status) ? stColor(st.status) : T.text2\n // 跨会话判定:该 run 由另一会话发起(ownerSession ≠ 当前会话)→ 禁用跳转(DSH 目录按父会话加载,跨父导航暂不支持)\n const ownerSession = (d && d.ownerSession) ? String(d.ownerSession) : null\n const mySession = sessionId ? String(sessionId) : null\n const crossSession = !!ownerSession && !!mySession && ownerSession !== mySession\n const hasChild = !!(!crossSession && d && d.childId && sessions && typeof sessions.openSubagent === 'function')\n const openChild = () => {\n if (crossSession || !hasChild) return\n try { sessions.openSubagent({ parentSessionId: (ownerSession || sessionId), childSessionId: d.childId, mode: 'one-shot' }) } catch (e) { /* 会话跳转失败忽略 */ }\n }\n const outText = d && d.output ? d.output\n : d && d.summary ? `(该 run 未保存完整正文,展示摘要)\\n\\n${d.summary}`\n : det.err ? `⚠ 加载失败:${det.err}`\n : det.loading ? '加载中…'\n : '(无产物正文)'\n const closeBtn = { font: 'inherit', width: 26, height: 26, borderRadius: 8, cursor: 'pointer', border: `1px solid ${T.border}`, background: 'transparent', color: T.text2, display: 'flex', alignItems: 'center', justifyContent: 'center', fontSize: 13, lineHeight: 1 }\n // 悬浮于画布右上(不挤占画布宽度)。滚轮在浮层内只滚自身内容:\n // 用原生 wheel stopPropagation 在冒泡到画布前拦下,避免触发画布缩放。\n const pRef = React.useRef(null)\n React.useEffect(() => {\n const el = pRef.current\n if (!el) return\n const stop = (e) => e.stopPropagation()\n el.addEventListener('wheel', stop, { passive: true })\n return () => el.removeEventListener('wheel', stop)\n }, [])\n return h('div', {\n ref: pRef,\n style: {\n position: 'absolute', top: 10, right: 12, bottom: 10, width: 384, zIndex: 8,\n borderRadius: 14, overflow: 'hidden',\n display: 'flex', flexDirection: 'column',\n border: `1px solid ${T.border}`,\n background: `color-mix(in srgb, ${T.layer1} 90%, transparent)`,\n backdropFilter: 'blur(14px)',\n boxShadow: '0 14px 48px rgba(0,0,0,.30)',\n },\n },\n /* 头 */\n h('div', { style: { display: 'flex', alignItems: 'center', gap: 9, padding: '12px 14px', borderBottom: `1px solid ${T.border}`, background: `linear-gradient(135deg, color-mix(in srgb, ${color} 14%, transparent), transparent 62%)` } },\n h('span', { style: { fontSize: 17 } }, PHASE_ICON[st && st.phase] || '⚙️'),\n h('div', { style: { flex: 1, minWidth: 0 } },\n h('div', { title: st ? st.label : undefined, style: { fontSize: 12.5, fontWeight: 700, color: T.text, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' } }, st ? st.label : '阶段详情'),\n h('div', { style: { fontSize: 10.5, color: T.text2, marginTop: 1, fontFamily: MONO, fontVariantNumeric: 'tabular-nums' } },\n `${st ? `#${st.seq} · ${st.phase}` : ''}${(st && (st.startedAt || st.endedAt)) ? ` · ${fmtDur(st.startedAt, st.endedAt)}` : ''}`),\n ),\n st ? chip(stText(st.status), color, { dot: true }) : null,\n h('button', { onClick: onClose, style: closeBtn, title: '关闭' }, '✕'),\n ),\n /* 内容 */\n h('div', { style: { flex: 1, overflowY: 'auto', padding: '12px 14px', display: 'flex', flexDirection: 'column', gap: 11 } },\n /* usage 明细(官方口径全字段) */\n h('div', { style: { display: 'flex', flexDirection: 'column', gap: 4 } },\n h('span', { style: { fontSize: 10.5, fontWeight: 700, color: T.text2, letterSpacing: 0.3 } }, 'TOKEN · 官方口径'),\n h('span', { style: { fontSize: 11.5, fontFamily: MONO, color: T.text, lineHeight: 1.65 } }, usageDetail(d || st || {})),\n ),\n /* 跳子代理会话(当前 DSH 未暴露\"切 conversation.view 视图\"接口:openSubagent 仅完成跳转,\n 完整轨迹需到「对话」tab 查看;待官方 conversation.setView 支持后再一键直达,见 AGENTS §6 待办) */\n h('div', { style: { display: 'flex', flexDirection: 'column', gap: 5 } },\n h('button', {\n onClick: openChild, disabled: !hasChild,\n title: crossSession\n ? `该子代理由会话 ${ownerSession.slice(-6)} 发起,跨会话跳转暂不支持——请打开其发起会话的团队工作台查看`\n : hasChild ? '跳转到该阶段子代理会话(完整推理与工具调用轨迹);跳转后请切换「对话」tab 查看' : '该阶段无可用子代理会话',\n style: {\n font: 'inherit', fontSize: 12, fontWeight: 600, padding: '8px 12px', borderRadius: 9, cursor: 'pointer',\n display: 'flex', alignItems: 'center', gap: 6, justifyContent: 'center',\n border: `1px solid color-mix(in srgb, ${T.brand} 40%, transparent)`,\n background: `color-mix(in srgb, ${T.brand} 12%, transparent)`, color: T.brand,\n opacity: hasChild ? 1 : 0.45,\n },\n }, '🎬 跳转子代理会话'),\n crossSession\n ? h('div', { style: { fontSize: 10.5, color: T.text2, textAlign: 'center', lineHeight: 1.55 } },\n `跨会话暂不支持:该子代理由会话 ${ownerSession ? ownerSession.slice(-6) : ''} 发起。如需查看轨迹,请打开其发起会话的团队工作台。`)\n : hasChild ? h('div', { style: { fontSize: 10.5, color: T.text2, textAlign: 'center', lineHeight: 1.55 } },\n '跳转成功后,请切「对话」tab 查看该子代理的完整会话轨迹') : null,\n ),\n /* 产物全文 */\n h('div', { style: { display: 'flex', flexDirection: 'column', gap: 5 } },\n h('span', { style: { fontSize: 10.5, fontWeight: 700, color: T.text2, letterSpacing: 0.3 } }, '📄 阶段性产物'),\n h('div', {\n style: { whiteSpace: 'pre-wrap', wordBreak: 'break-word', fontSize: 12, lineHeight: 1.62, color: T.text, background: `color-mix(in srgb, ${T.layer2} 55%, transparent)`, border: `1px solid ${T.border}`, borderRadius: 10, padding: '10px 12px', maxHeight: 240, overflowY: 'auto' },\n }, outText),\n ),\n ),\n )\n}\n\nfunction PipelinePanel({ active, api, runId, sessionId, sessions }) {\n if (!active) return h('div', { style: { color: T.text2, fontSize: 13, padding: '28px 20px', textAlign: 'center' } },\n h('div', { style: { fontSize: 28, marginBottom: 8 } }, '🏭'),\n '暂无运行中的流水线——让模型调用 teamflow_start,或在上方输入需求')\n const groups = []\n for (const st of active.stages || []) {\n let g = groups.length ? groups[groups.length - 1] : null\n if (!g || g.phase !== st.phase) { g = { phase: st.phase, stages: [] }; groups.push(g) }\n g.stages.push(st)\n }\n const wrapRef = React.useRef(null)\n const [vw, setVw] = React.useState(900)\n const [view, setView] = React.useState({ x: 0, y: 44, s: 1 })\n const [grabbing, setGrabbing] = React.useState(false)\n const dragRef = React.useRef(null)\n const fittedRef = React.useRef(false)\n const [det, setDet] = React.useState(null) // { seq, stage, loading, data, err } —— 阶段详情浮层\n\n React.useEffect(() => {\n const el = wrapRef.current\n if (!el) return\n const doFit = () => {\n const W = el.clientWidth, H = el.clientHeight\n if (W <= 0) return\n if (W !== vw) setVw(W)\n if (!fittedRef.current) {\n const lay = layoutFlow(groups, W)\n const raw = Math.min((H - 46) / lay.worldH, (W - 40) / lay.worldW, 1)\n const s = Math.max(0.5, raw)\n setView({ x: (W - lay.worldW * s) / 2, y: (H - lay.worldH * s) / 2, s })\n fittedRef.current = true\n }\n }\n doFit()\n const ro = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(doFit) : null\n if (ro) ro.observe(el)\n return () => { if (ro) ro.disconnect() }\n }, [active])\n\n React.useEffect(() => {\n const el = wrapRef.current\n if (!el) return\n const onWheel = (e) => {\n e.preventDefault()\n const rect = el.getBoundingClientRect()\n const px = e.clientX - rect.left, py = e.clientY - rect.top\n setView((v) => {\n const ns = Math.min(1.65, Math.max(0.5, v.s * (e.deltaY < 0 ? 1.12 : 0.89)))\n const k = ns / v.s\n return { s: ns, x: px - (px - v.x) * k, y: py - (py - v.y) * k }\n })\n }\n el.addEventListener('wheel', onWheel, { passive: false })\n return () => el.removeEventListener('wheel', onWheel)\n }, [])\n\n // 切换 run 时关闭详情抽屉\n React.useEffect(() => { setDet(null) }, [active && active.id, runId])\n\n const openDetail = async (s) => {\n if (!api || !runId) return\n setDet({ seq: s.seq, stage: s, loading: true, data: null, err: null })\n try {\n const d = await api.stageDetail(runId, s.seq, sessionId)\n setDet({ seq: s.seq, stage: s, loading: false, data: unwrap(d, 'stageDetail') || null, err: null })\n } catch (e) {\n setDet({ seq: s.seq, stage: s, loading: false, data: null, err: String((e && e.message) || e) })\n }\n }\n const closeDet = () => setDet(null)\n\n const layout = layoutFlow(groups, vw)\n const fitNow = () => {\n const el = wrapRef.current\n if (!el) return\n const W = el.clientWidth, H = el.clientHeight\n const raw = Math.min((H - 46) / layout.worldH, (W - 40) / layout.worldW, 1)\n const s = Math.max(0.5, raw)\n setView({ x: (W - layout.worldW * s) / 2, y: (H - layout.worldH * s) / 2, s })\n }\n const zoomBy = (f) => {\n setView((v) => {\n const ns = Math.min(1.65, Math.max(0.5, v.s * f))\n const k = ns / v.s\n const el = wrapRef.current\n const px = el ? el.clientWidth / 2 : layout.worldW / 2\n const py = el ? el.clientHeight / 2 : 64\n return { s: ns, x: px - (px - v.x) * k, y: py - (py - v.y) * k }\n })\n }\n const zoomStyle = { font: 'inherit', fontSize: 13, width: 26, height: 24, borderRadius: 7, cursor: 'pointer', border: `1px solid ${T.border}`, background: T.layer1, color: T.text, display: 'flex', alignItems: 'center', justifyContent: 'center', lineHeight: 1 }\n const onDown = (e) => {\n if (e.button !== 0) return\n dragRef.current = { sx: e.clientX, sy: e.clientY, ox: view.x, oy: view.y }\n setGrabbing(true)\n e.preventDefault()\n }\n const onMove = (e) => {\n const d = dragRef.current\n if (!d) return\n setView((v) => ({ ...v, x: d.ox + (e.clientX - d.sx), y: d.oy + (e.clientY - d.sy) }))\n }\n const onUp = () => { dragRef.current = null; setGrabbing(false) }\n\n return h('div', {\n ref: wrapRef,\n onMouseDown: onDown, onMouseMove: onMove, onMouseUp: onUp, onMouseLeave: onUp,\n style: {\n position: 'relative', height: 560, borderRadius: 12, overflow: 'hidden', touchAction: 'none',\n border: `1px solid ${T.border}`, userSelect: 'none',\n cursor: grabbing ? 'grabbing' : 'grab',\n background: `radial-gradient(circle, ${T.border2} 1px, transparent 1px) 0 0 / 24px 24px, ${T.layer1}`,\n backgroundBlendMode: 'overlay',\n },\n },\n /* 世界层(整体可拖动/缩放的画布) */\n h('div', {\n style: { position: 'absolute', left: 0, top: 0, width: layout.worldW, height: layout.worldH, transform: `translate(${view.x}px, ${view.y}px) scale(${view.s})`, transformOrigin: '0 0' },\n },\n /* 连接弧线 SVG 层(置于节点之下) */\n h('svg', { width: layout.worldW, height: layout.worldH, style: { position: 'absolute', left: 0, top: 0, overflow: 'visible', zIndex: 0 } },\n h('defs', {}, layout.conns.map((c) => h('marker', { key: 'm' + c.x1 + '-' + c.y1, id: 'tfm-' + c.x1 + '-' + c.y1, viewBox: '0 0 10 10', refX: 8, refY: 5, markerWidth: 7, markerHeight: 7, orient: 'auto-start-reverse' }, h('path', { d: 'M 0 0 L 10 5 L 0 10 z', fill: c.color })))),\n layout.conns.map((c) => h('g', { key: 'c' + c.x1 + '-' + c.y1 },\n h('path', { d: connPath(c), fill: 'none', stroke: `color-mix(in srgb, ${c.color} 12%, transparent)`, strokeWidth: 7, strokeLinecap: 'round' }),\n h('path', { d: connPath(c), fill: 'none', stroke: `color-mix(in srgb, ${c.color} 45%, transparent)`, strokeWidth: 2.5, markerEnd: `url(#tfm-${c.x1}-${c.y1})` }),\n h('path', { d: connPath(c), fill: 'none', stroke: c.color, strokeWidth: 2, strokeLinecap: 'round', strokeDasharray: '5 9', animation: 'tf-flow .75s linear infinite' }),\n )),\n ),\n /* 节点层 */\n h('div', { style: { position: 'absolute', left: 0, top: 0, zIndex: 1 } },\n layout.nodes.map((n) => FlowNode(n, openDetail)),\n ),\n ),\n layout.nodes.length === 0 ? h('div', { style: { position: 'absolute', inset: 0, display: 'flex', alignItems: 'center', justifyContent: 'center', color: T.text2, fontSize: 13 } }, '流水线还没有开始执行节点') : null,\n /* 浮层控制簇(不参与画布拖拽) */\n h('div', {\n onMouseDown: (e) => e.stopPropagation(),\n style: { position: 'absolute', top: 10, right: 12, zIndex: 6, display: 'flex', alignItems: 'center', gap: 6, padding: 5, borderRadius: 11, border: `1px solid ${T.border}`, background: `color-mix(in srgb, ${T.layer1} 82%, transparent)`, backdropFilter: 'blur(8px)', boxShadow: '0 6px 20px rgba(0,0,0,.16)' },\n },\n h('button', { title: '缩小', onClick: () => zoomBy(0.86), style: zoomStyle }, '−'),\n h('span', { style: { fontFamily: MONO, fontSize: 10.5, color: T.text2, minWidth: 34, textAlign: 'center' } }, `${Math.round(view.s * 100)}%`),\n h('button', { title: '放大', onClick: () => zoomBy(1.16), style: zoomStyle }, '+'),\n h('span', { style: { width: 1, height: 14, background: T.border } }),\n h('button', { title: '适应画布', onClick: fitNow, style: { ...zoomStyle, fontSize: 13 } }, '⤢'),\n h('span', { style: { width: 1, height: 14, background: T.border } }),\n h('span', { style: { fontSize: 10.5, color: T.text2, paddingRight: 4, opacity: 0.85 } }, '✥ 拖动画布 · 滚轮缩放'),\n ),\n /* 阶段详情浮层:悬浮于画布右上,不挤占画布宽度;浮层内滚轮只滚正文(原生 stopPropagation),不触发画布缩放 */\n det ? h(StageDetailDrawer, { det, onClose: closeDet, sessionId, sessions }) : null,\n )\n}\n\n/* ── Backlog 拖拽看板 ────────────────────────────────────────────── */\nfunction BoardPanel({ backlog, api, onRefresh, sessionId, onShowRun }) {\n const [drag, setDrag] = React.useState(null)\n const [over, setOver] = React.useState(null)\n const [det, setDet] = React.useState(null)\n const openItem = async (kind, id) => {\n setDet({ kind, id, loading: true, data: null, err: null })\n try {\n const d = unwrap(await api.itemDetail(kind, id, sessionId), 'itemDetail')\n setDet({ kind, id, loading: false, data: d, err: null })\n } catch (e) {\n setDet({ kind, id, loading: false, data: null, err: String((e && e.message) || e) })\n }\n }\n if (!backlog) return h('div', { style: { color: T.text2, fontSize: 13, padding: '28px 20px', textAlign: 'center' } },\n h('div', { style: { fontSize: 28, marginBottom: 8 } }, '📋'),\n 'backlog 为空(还没有流水线运行过)')\n\n // 子卡查找表:subtaskId → subtask\n const subtaskMap = {}\n for (const t of (backlog.tasks || [])) {\n if (t.type === 'subtask' && t.id) subtaskMap[t.id] = t\n }\n\n const move = async (kind, id, to) => {\n try { await api.backlogUpdate(kind, id, to, sessionId, '看板拖拽流转') } catch (e) { /* 面板吞错,轮询自愈 */ }\n onRefresh()\n }\n const card = (item, kind) => h('div', {\n key: item.id,\n draggable: true,\n onClick: () => openItem(kind, item.id),\n onDragStart: () => setDrag({ kind, id: item.id, from: item.status }),\n onDragEnd: () => setDrag(null),\n style: {\n background: item.humanIntervention || item.status === 'needs-human' ? `color-mix(in srgb, ${T.error} 7%, ${T.layer1})` : T.layer1,\n border: `1px solid ${T.border}`, borderLeft: `3px solid ${stColor(item.status)}`,\n borderRadius: 8, padding: '7px 9px', cursor: 'grab', fontSize: 12,\n opacity: drag && drag.id === item.id ? .35 : 1,\n transition: 'opacity .1s ease, transform .12s ease',\n boxShadow: '0 1px 2px rgba(0,0,0,.05)',\n },\n title: `${item.id} · ${item.status}${item.summary ? '\\n' + item.summary : ''}(点击查看详情)`,\n },\n h('div', { style: { display: 'flex', alignItems: 'center', gap: 4 } },\n h('span', { style: { fontFamily: MONO, color: T.text2, fontSize: 10.5 } }, item.id),\n item.severity ? chip(item.severity, item.severity === 'P0' ? T.error : item.severity === 'P1' ? T.warn : T.text2) : null,\n item.owner ? h('span', { style: { marginLeft: 'auto', fontSize: 10.5, color: T.text2 } }, `👤 ${item.owner}`) : null,\n ),\n h('div', { title: item.title || undefined, style: { fontWeight: 500, margin: '3px 0 4px', lineHeight: 1.4 } }, (item.title || '').slice(0, 30)),\n h('div', { style: { ...flexRow, marginTop: 2 } },\n chip(stText(item.status), stColor(item.status)),\n typeof item.retries === 'number' && item.retries > 0 ? h('span', { style: { fontSize: 10.5, color: T.warn, fontFamily: MONO } }, `↻${item.retries}`) : null,\n item.humanIntervention || item.status === 'needs-human' ? h('span', { style: { fontSize: 10.5, color: T.error, fontWeight: 700 } }, '⚠') : null,\n ),\n (kind === 'task' && (item.devAssign || item.qaAssign || item.acceptBy)) ? h('div', { style: { ...flexRow, marginTop: 3, fontSize: 10.5, color: T.text2, fontFamily: MONO } },\n item.devAssign ? h('span', { title: `dev 分配\\n${item.devAssign}`, style: { display: 'inline-flex', alignItems: 'center', gap: 3, overflow: 'hidden', textOverflow: 'ellipsis', maxWidth: 130, whiteSpace: 'nowrap' } }, `👨‍💻${item.devAssign}`) : null,\n item.qaAssign ? h('span', { title: `qa 分配\\n${item.qaAssign}`, style: { display: 'inline-flex', alignItems: 'center', gap: 3, overflow: 'hidden', textOverflow: 'ellipsis', maxWidth: 130, whiteSpace: 'nowrap' } }, `🧪${item.qaAssign}`) : null,\n item.acceptBy ? h('span', { title: `验收/汇报人\\n${item.acceptBy}`, style: { display: 'inline-flex', alignItems: 'center', gap: 3, overflow: 'hidden', textOverflow: 'ellipsis', maxWidth: 130, whiteSpace: 'nowrap' } }, `✅${item.acceptBy}`) : null,\n ) : null,\n (kind === 'task' && byRoleLine(item)) ? h('div', { style: { ...flexRow, marginTop: 3, fontSize: 10.5, color: T.warn, fontFamily: MONO } },\n h('span', { style: { color: T.text2 } }, '⛽'),\n byRoleLine(item),\n ) : null,\n // 子卡摘要 + 子卡列表(主卡展开)\n (kind === 'task' && (item.subtaskIds || []).length > 0) ? (() => {\n const subs = item.subtaskIds.map((id) => subtaskMap[id]).filter(Boolean)\n if (subs.length === 0) return null\n const done = subs.filter((s) => s.status === 'done').length\n const failed = subs.filter((s) => s.status === 'failed').length\n const running = subs.filter((s) => s.status === 'running').length\n return h('div', { style: { marginTop: 5 } },\n h('div', { style: { ...flexRow, fontSize: 10.5, color: T.text2, fontFamily: MONO, marginBottom: 3 } },\n h('span', null, `📦 ${subs.length} 子卡`),\n done > 0 ? h('span', { style: { color: T.success } }, `${done}✓`) : null,\n running > 0 ? h('span', { style: { color: T.brand } }, `${running}⟳`) : null,\n failed > 0 ? h('span', { style: { color: T.error } }, `${failed}✗`) : null,\n ),\n subs.map((sub) => h('div', {\n key: sub.id,\n style: {\n display: 'flex', alignItems: 'center', gap: 4, fontSize: 10.5, fontFamily: MONO,\n padding: '2px 6px', borderRadius: 4, marginBottom: 2,\n background: sub.status === 'failed' ? `color-mix(in srgb, ${T.error} 7%, transparent)` : T.layer2,\n border: `1px solid ${stColor(sub.status)}30`,\n },\n },\n h('span', { style: { color: stColor(sub.status), fontWeight: 600, minWidth: 12 } }, sub.status === 'done' ? '✓' : sub.status === 'failed' ? '✗' : sub.status === 'running' ? '⟳' : '…'),\n h('span', { title: sub.title || undefined, style: { overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', maxWidth: 130 } }, (sub.title || '').replace(/^开发 · /, '')),\n sub.devAssign ? h('span', { title: `dev 分配\\n${sub.devAssign}`, style: { marginLeft: 'auto', color: T.text2, overflow: 'hidden', textOverflow: 'ellipsis', maxWidth: 70, whiteSpace: 'nowrap' } }, sub.devAssign) : null,\n ))\n )\n })() : null,\n )\n\n const groups = [\n { kind: 'req', list: backlog.requirements || [] },\n { kind: 'task', list: (backlog.tasks || []).filter((t) => t.type !== 'subtask') }, // 只展示主卡(子卡嵌套在主卡下)\n { kind: 'bug', list: backlog.bugs || [] },\n ]\n return h('div', { style: { display: 'flex', flexDirection: 'column', gap: 14, maxHeight: '72vh', overflowY: 'auto', paddingRight: 4 } },\n groups.map(({ kind, list }) => {\n const counts = {}\n for (const s of COLUMNS[kind]) counts[s] = 0\n for (const item of list) counts[item.status] = (counts[item.status] || 0) + 1\n return h('div', { key: kind },\n h('div', { style: { display: 'flex', alignItems: 'center', gap: 8, fontWeight: 700, fontSize: 13, marginBottom: 8 } },\n h('span', { style: { fontSize: 14 } }, kind === 'req' ? '📌' : kind === 'task' ? '🔧' : '🐞'),\n KIND_TITLE[kind],\n h('span', {\n style: { fontSize: 11, fontWeight: 600, color: T.text2, background: T.layer2, borderRadius: 999, padding: '0 8px', lineHeight: '18px' },\n }, String(list.length)),\n ),\n h('div', { style: { display: 'flex', gap: 8, overflowX: 'auto', paddingBottom: 6 } },\n COLUMNS[kind].map((s) => {\n const isOver = over === `${kind}:${s}`\n const color = stColor(s)\n return h('div', {\n key: s,\n onDragOver: (e) => { e.preventDefault(); setOver(`${kind}:${s}`) },\n onDragLeave: () => setOver((o) => (o === `${kind}:${s}` ? null : o)),\n onDrop: async () => {\n if (drag && drag.kind === kind && drag.from !== s) await move(kind, drag.id, s)\n setDrag(null); setOver(null)\n },\n style: {\n minWidth: 140, maxWidth: 172, flex: '0 0 auto',\n borderRadius: 10, padding: 7, minHeight: 84,\n maxHeight: 340, overflowY: 'auto', // 任务增多时列内滚动,不撑高页面\n background: isOver ? `color-mix(in srgb, ${color} 8%, ${T.layer1})` : T.layer2,\n border: `1px dashed ${isOver ? color : T.border}`,\n transition: 'background .12s ease, border-color .12s ease',\n },\n },\n h('div', { style: { ...flexRow, fontSize: 11, fontWeight: 600, color, marginBottom: 6, padding: '0 2px' } },\n h('span', null, stText(s)),\n h('span', { style: { marginLeft: 'auto', fontFamily: MONO, fontSize: 10, opacity: .75 } }, counts[s] || 0),\n ),\n h('div', { style: { display: 'flex', flexDirection: 'column', gap: 6 } },\n list.filter((item) => item.status === s).map((item) => card(item, kind)),\n ),\n )\n }),\n ),\n )\n }),\n det ? h(ItemDetailDrawer, { det, onClose: () => setDet(null), onShowRun }) : null,\n )\n}\n\n/* ── TeamFlow Backlog 条目详情抽屉 ──────────────────────────────── */\nfunction fmtAt(ts) { return ts ? new Date(ts).toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit' }) : '—' }\n\nfunction ItemDetailDrawer({ det, onClose, onShowRun }) {\n const d = det && det.data\n const loading = det && det.loading\n const err = det && det.err\n const kind = det && det.kind\n const icon = kind === 'req' ? '📌' : kind === 'task' ? '🔧' : '🐞'\n const color = d ? stColor(d.status) : T.text2\n const closeBtn = { font: 'inherit', width: 26, height: 26, borderRadius: 8, cursor: 'pointer', border: `1px solid ${T.border}`, background: 'transparent', color: T.text2, display: 'flex', alignItems: 'center', justifyContent: 'center', fontSize: 13, lineHeight: 1 }\n const secTitle = (label) => h('span', { style: { fontSize: 10.5, fontWeight: 700, color: T.text2, letterSpacing: 0.3 } }, label)\n const kv = (k, v, mono?: boolean) => h('div', { style: { display: 'flex', gap: 8, fontSize: 11.5, lineHeight: 1.6 } },\n h('span', { style: { flex: '0 0 72px', color: T.text2 } }, k),\n h('span', { title: v === null || v === undefined ? undefined : String(v), style: { flex: 1, minWidth: 0, fontFamily: mono ? MONO : undefined, color: T.text, wordBreak: 'break-all', textOverflow: 'ellipsis' } }, v === null || v === undefined ? '—' : String(v)),\n )\n const linkRow = (it, extra) => h('div', { key: it.id, style: { display: 'flex', flexDirection: 'column', gap: 2, padding: '5px 8px', borderRadius: 7, background: T.layer2, fontSize: 11.5 } },\n h('div', { style: { display: 'flex', gap: 7, alignItems: 'center' } },\n h('span', { style: { fontFamily: MONO, fontSize: 10.5, color: T.text2, flex: '0 0 auto' } }, it.id),\n it.severity ? chip(it.severity, it.severity === 'P0' ? T.error : it.severity === 'P1' ? T.warn : T.text2) : null,\n chip(stText(it.status), stColor(it.status)),\n extra && extra.usage ? h('span', { style: { fontSize: 10, fontFamily: MONO, color: T.warn, flex: '0 0 auto' } }, `⛽${fmtTokens((extra.usage.input || 0) + (extra.usage.cacheRead || 0) + (extra.usage.cacheWrite || 0) + (extra.usage.output || 0))}`) : null,\n extra && extra.assignee ? h('span', { title: `dev 分配\\n${extra.assignee}`, style: { display: 'inline-flex', alignItems: 'center', gap: 2, fontSize: 10, fontFamily: MONO, color: T.text2, flex: '0 0 auto', overflow: 'hidden', textOverflow: 'ellipsis', maxWidth: 90, whiteSpace: 'nowrap' } }, `👨‍💻${String(extra.assignee).slice(0, 14)}`) : null,\n h('span', { title: it.title || undefined, style: { flex: 1, minWidth: 0, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', color: T.text } }, (it.title || '').slice(0, 44)),\n ),\n it.summary ? h('div', { title: it.summary, style: { fontSize: 10.5, color: T.text2, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', maxWidth: '100%' } }, it.summary) : null,\n )\n return h('div', {\n style: {\n position: 'absolute', top: 10, right: 12, bottom: 10, width: 400, zIndex: 9,\n borderRadius: 14, overflow: 'hidden',\n display: 'flex', flexDirection: 'column',\n border: `1px solid ${T.border}`,\n background: `color-mix(in srgb, ${T.layer1} 92%, transparent)`,\n backdropFilter: 'blur(14px)',\n boxShadow: '0 14px 48px rgba(0,0,0,.30)',\n },\n },\n /* 头 */\n h('div', { style: { display: 'flex', alignItems: 'center', gap: 9, padding: '12px 14px', borderBottom: `1px solid ${T.border}`, background: `linear-gradient(135deg, color-mix(in srgb, ${color} 14%, transparent), transparent 62%)` } },\n h('span', { style: { fontSize: 17 } }, icon),\n h('div', { style: { flex: 1, minWidth: 0 } },\n h('div', { style: { fontSize: 12.5, fontWeight: 700, color: T.text, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }, title: d ? (d.title || d.id) : undefined },\n d ? (d.title || d.id) : `${det.kind} · ${det.id}`),\n d ? h('div', { style: { fontSize: 10.5, color: T.text2, marginTop: 1, fontFamily: MONO, fontVariantNumeric: 'tabular-nums' } },\n `${d.id} · ${d.kind}${d.severity ? ' · ' + d.severity : ''}`) : null,\n ),\n d ? chip(stText(d.status), color, { dot: true }) : null,\n h('button', { onClick: onClose, style: closeBtn, title: '关闭' }, '✕'),\n ),\n /* 内容 */\n h('div', { style: { flex: 1, overflowY: 'auto', padding: '12px 14px', display: 'flex', flexDirection: 'column', gap: 13 } },\n loading ? h('div', { style: { color: T.text2, fontSize: 12, padding: 12 } }, '加载中…') :\n err ? h('div', { style: { color: T.error, fontSize: 12, padding: 12 } }, '⚠ ' + err) :\n !d ? null :\n [\n /* 概览 */\n h('div', { style: { display: 'flex', flexDirection: 'column', gap: 4 } },\n secTitle('概览'),\n d.spec ? h(FoldableText, { text: d.spec, charLimit: 300, lineLimit: 4, style: { background: T.layer2, borderRadius: 8, padding: '8px 10px' } }) : null,\n h('div', { style: { display: 'flex', flexDirection: 'column', gap: 4 } },\n d.summary ? h(FoldableText, { text: d.summary }) : null,\n ),\n h('div', { style: { display: 'flex', flexDirection: 'column', gap: 2, marginTop: 2 } },\n d.devAssign ? kv('👨‍💻 dev', d.devAssign.slice(0, 26), true) : null,\n d.qaAssign ? kv('🧪 qa', d.qaAssign.slice(0, 26), true) : null,\n d.assignBy ? kv('✅ 验收', d.assignBy.slice(0, 26), true) : null,\n d.owner ? kv('👤 owner', d.owner.slice(0, 26), true) : null,\n (typeof d.retries === 'number' && d.retries > 0) ? kv('↻ 重试', String(d.retries)) : null,\n d.humanIntervention ? kv('⚠ 人工介入', '需人工介入') : null,\n kv('更新于', fmtAt(d.updatedAt) || '—'),\n ),\n ),\n /* 需求原文 + 运行信息(req / 关联 journal) */\n d.runInfo ? (() => {\n const ri = d.runInfo\n return h('div', { style: { display: 'flex', flexDirection: 'column', gap: 6 } },\n h('div', { style: { display: 'flex', flexDirection: 'column', gap: 3 } },\n h('div', { style: { display: 'flex', alignItems: 'center', gap: 8 } },\n secTitle('运行'),\n h('span', { style: { fontFamily: MONO, fontSize: 10.5, color: T.text2, whiteSpace: 'nowrap' } }, ri.runId),\n chip(stText(ri.status), stColor(ri.status)),\n onShowRun ? h('button', {\n onClick: () => onShowRun(ri.runId),\n title: `跳转到该需求的流水线视图 #${String(ri.runId).slice(-6)}`,\n style: { marginLeft: 'auto', flex: '0 0 auto', whiteSpace: 'nowrap', fontSize: 10.5, fontWeight: 600, padding: '2px 9px', borderRadius: 6, cursor: 'pointer', border: `1px solid color-mix(in srgb, ${T.brand} 38%, transparent)`, background: `color-mix(in srgb, ${T.brand} 10%, transparent)`, color: T.brand, lineHeight: '16px' },\n }, '▶ 流水线') : null,\n ),\n (ri.startedAt || ri.endedAt) ? h('span', { style: { fontSize: 10.5, color: T.text2, fontFamily: MONO } }, `${fmtAt(ri.startedAt)} → ${fmtAt(ri.endedAt)} · ${fmtDur(ri.startedAt, ri.endedAt)}`) : null,\n ),\n h('div', { style: { display: 'flex', flexDirection: 'column', gap: 4 } },\n secTitle('需求原文'),\n h(FoldableText, { text: ri.requirement || '(无原文)', charLimit: 300, lineLimit: 4, style: { background: T.layer2, borderRadius: 8, padding: '8px 10px' } }),\n ),\n )\n })() : null,\n /* 任务夹(ADR-0008) */\n d.runDocs ? h('div', { style: { display: 'flex', flexDirection: 'column', gap: 4 } },\n secTitle('任务夹'),\n h('div', { style: { fontSize: 11.5, fontFamily: MONO, color: T.brand, background: T.layer2, borderRadius: 8, padding: '7px 10px', wordBreak: 'break-all' } }, d.runDocs + '/'),\n ) : null,\n /* TOKEN(task) */\n (kind === 'task' && d.usage) ? h('div', { style: { display: 'flex', flexDirection: 'column', gap: 4 } },\n secTitle('TOKEN · 官方口径'),\n h('span', { style: { fontSize: 11.5, fontFamily: MONO, color: T.text, lineHeight: 1.65 } }, usageDetail(d)),\n (d.byRole && Object.keys(d.byRole).length > 0) ? h('div', { style: { display: 'flex', flexDirection: 'column', gap: 2, marginTop: 2 } },\n Object.entries(d.byRole).sort((a, b) => (totalTokens(b[1]) - totalTokens(a[1]))).map(([role, uRaw]) => {\n const u = uRaw as { input?: number; cacheRead?: number; cacheWrite?: number; output?: number; calls?: number }\n const label = role === 'dev' ? '👨‍💻 开发' : role === 'qa' ? '🧪 QA' : role === 'acceptance' ? '✅ 验收' : role === 'pm' ? '📌 产品' : role === 'design' ? '🎨 设计' : role === 'arch' ? '🏗 架构' : '⚙️ ' + role\n return h('div', { key: role, style: { display: 'flex', gap: 7, alignItems: 'center', fontSize: 10.5, fontFamily: MONO, color: T.text2 } },\n h('span', { style: { flex: '0 0 64px' } }, label),\n h('span', { style: { color: T.text } }, `⛽${fmtTokens(totalTokens(u))}`),\n h('span', null, `${fmtTokens(u.input || 0)}i / ${fmtTokens(u.cacheRead || 0)}c / ${fmtTokens(u.output || 0)}o · ${u.calls || 0} 次`),\n )\n }),\n ) : null,\n ) : null,\n /* 关联子卡 */\n (d.subtasks && d.subtasks.length > 0) ? h('div', { style: { display: 'flex', flexDirection: 'column', gap: 4 } },\n secTitle(`关联子卡(${d.subtasks.length})`),\n h('div', { style: { display: 'flex', flexDirection: 'column', gap: 5 } }, d.subtasks.map((s) => linkRow(s, { usage: s.usage, assignee: s.devAssign }))),\n ) : null,\n /* 关联缺陷 */\n (d.bugs && d.bugs.length > 0) ? h('div', { style: { display: 'flex', flexDirection: 'column', gap: 4 } },\n secTitle(`关联缺陷(${d.bugs.length})`),\n h('div', { style: { display: 'flex', flexDirection: 'column', gap: 5 } }, d.bugs.map((b) => linkRow(b, {}))),\n ) : null,\n /* 流转时间线 */\n (d.events && d.events.length > 0) ? h('div', { style: { display: 'flex', flexDirection: 'column', gap: 4 } },\n secTitle(`流转时间线(${d.events.length})`),\n h('div', { style: { display: 'flex', flexDirection: 'column', gap: 0 } },\n d.events.slice().reverse().map((ev) => h('div', { key: `${ev.at}-${ev.to}`, style: { display: 'flex', gap: 8, alignItems: 'baseline', padding: '5px 0', borderBottom: `1px dashed ${T.border}`, fontSize: 11.5 } },\n h('span', { style: { fontFamily: MONO, color: T.text2, fontSize: 10.5, flex: '0 0 42px' } }, fmtAt(ev.at)),\n h('span', { style: { color: T.text } }, ev.from || '—'),\n h('span', { style: { color: T.text2 } }, '→'),\n h('span', { style: { fontFamily: MONO, color: T.brand } }, ev.to),\n h('span', { style: { flex: 1, minWidth: 0, color: T.text2, fontSize: 10.5, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }, title: ev.reason || undefined }, ev.reason || ''),\n )),\n ),\n ) : null,\n ],\n ),\n )\n}\n\n/* ── 团队选择器(input.right 注入) ─────────────────────────────── */\nfunction TeamSelector({ sessionId, remote }) {\n const [teams, setTeams] = React.useState([])\n const [active, setActive] = React.useState(null)\n const [open, setOpen] = React.useState(false)\n const ref = React.useRef(null)\n\n const load = React.useCallback(async () => {\n if (!remote || !sessionId) return\n try {\n const tw = unwrap(await remote.listTeams(sessionId), 'listTeams')\n setTeams((tw && tw.teams) || [])\n const at = unwrap(await remote.getActiveTeam(sessionId), 'getActiveTeam')\n setActive(at && at.team ? at.team : null)\n } catch (e) { /* 静默 */ }\n }, [remote, sessionId])\n\n React.useEffect(() => { load() }, [load])\n\n // 点击外部关闭下拉\n React.useEffect(() => {\n if (!open) return\n const handler = (e) => { if (ref.current && !ref.current.contains(e.target)) setOpen(false) }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [open])\n\n const select = async (teamId) => {\n if (!remote || !sessionId) return\n try {\n if (!teamId) {\n await remote.clearTeam(sessionId)\n setActive(null)\n } else {\n const r = unwrap(await remote.selectTeam(sessionId, teamId), 'selectTeam')\n setActive(r && r.team ? r.team : null)\n }\n } catch (e) { /* 静默 */ }\n setOpen(false)\n }\n\n if (teams.length === 0) return null\n\n return h('div', { ref, style: { position: 'relative' } },\n h('button', {\n onClick: () => setOpen(!open),\n title: active ? `当前团队:${active.name}(点击切换)` : '选择团队',\n style: {\n display: 'inline-flex', alignItems: 'center', gap: 4,\n padding: '3px 8px', borderRadius: 6, cursor: 'pointer',\n fontSize: 11, fontFamily: MONO, fontWeight: 500,\n border: `1px solid ${active ? T.brand : T.border}`,\n background: active ? `color-mix(in srgb, ${T.brand} 10%, transparent)` : 'transparent',\n color: active ? T.brand : T.text2,\n transition: 'all .12s ease',\n },\n },\n h('span', { style: { fontSize: 12 } }, active ? active.icon : '🏭'),\n h('span', { title: active && active.name ? String(active.name) : '团队', style: { maxWidth: 80, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' } }, active ? active.name : '团队'),\n h('span', { style: { fontSize: 8, opacity: .6 } }, open ? '▲' : '▼'),\n ),\n open ? h('div', {\n style: {\n position: 'absolute', bottom: '100%', right: 0, marginBottom: 4,\n minWidth: 228, background: T.layer1, border: `1px solid ${T.border}`,\n borderRadius: 8, boxShadow: '0 4px 12px rgba(0,0,0,.15)',\n zIndex: 100, overflow: 'hidden',\n },\n },\n h('div', { style: { padding: '7px 12px', fontSize: 10, color: T.text2, borderBottom: `1px solid ${T.border}` } }, '选择团队'),\n // \"无团队\"选项:清除选择,回到原生模式\n h('button', {\n onClick: () => select(null),\n style: {\n display: 'flex', alignItems: 'flex-start', gap: 10, width: '100%',\n padding: '9px 12px', border: 'none', cursor: 'pointer', textAlign: 'left',\n background: !active ? `color-mix(in srgb, ${T.text2} 10%, transparent)` : 'transparent',\n color: T.text, fontSize: 12, transition: 'background .1s',\n borderBottom: `1px solid ${T.border}`,\n },\n },\n h('span', { style: { fontSize: 14, opacity: .5, width: 18, flexShrink: 0, lineHeight: 1.4 } }, '💬'),\n h('div', { style: { minWidth: 0, flex: 1 } },\n h('div', { style: { fontWeight: 600, lineHeight: 1.35 } }, '无团队(直接对话)'),\n h('div', { style: { fontSize: 10.5, color: T.text2, marginTop: 3, lineHeight: 1.45, whiteSpace: 'normal', wordBreak: 'break-word' } }, '不走 teamflow,模型直接工作'),\n ),\n !active ? h('span', { style: { marginLeft: 'auto', color: T.text2, fontSize: 12, flexShrink: 0 } }, '✓') : null,\n ),\n teams.map((team) => h('button', {\n key: team.id,\n onClick: () => select(team.id),\n style: {\n display: 'flex', alignItems: 'flex-start', gap: 10, width: '100%',\n padding: '9px 12px', border: 'none', cursor: 'pointer', textAlign: 'left',\n background: active && active.id === team.id ? `color-mix(in srgb, ${T.brand} 10%, transparent)` : 'transparent',\n color: T.text, fontSize: 12, transition: 'background .1s',\n },\n },\n h('span', { style: { fontSize: 14, width: 18, flexShrink: 0, lineHeight: 1.4 } }, team.icon),\n h('div', { style: { minWidth: 0, flex: 1 } },\n h('div', { style: { fontWeight: 600, lineHeight: 1.35 } }, team.name),\n h('div', { style: { fontSize: 10.5, color: T.text2, marginTop: 3, lineHeight: 1.45, whiteSpace: 'normal', wordBreak: 'break-word' } }, team.description),\n ),\n active && active.id === team.id ? h('span', { style: { marginLeft: 'auto', color: T.brand, fontSize: 12, flexShrink: 0 } }, '✓') : null,\n )),\n ) : null,\n )\n}\n\n/* ── 主视图 ──────────────────────────────────────────────────────── */\n/** Typert remote 的标准 RPC 信封:client 拿到的是 { ok, value }(或 { ok, error }),必须解包 .value。 */\ninterface RpcEnvelope {\n ok: boolean\n value?: unknown\n error?: { code?: string; message?: string }\n}\n\n/** 解包 remote 信封:失败抛错;成功返回 value。 */\nfunction unwrap(res: RpcEnvelope | undefined | null, what?: string): any {\n if (!res || !res.ok) {\n throw new Error(`${what || 'remote'} 调用失败:${(res && res.error && (res.error.message || res.error.code)) || '未知错误'}`)\n }\n return res.value\n}\n\n/** teamflow 服务实例的调用面($mount 后由 ctx.get 取得,方法返回 RPC 信封)。\n * 各方法带 sessionId:host 按该会话所属 workspace(项目)过滤,不同 workspace 数据互不可见。 */\ninterface TeamflowRemote {\n list(sessionId?: string | null): Promise<RpcEnvelope>\n snapshot(runId?: string | null, sessionId?: string | null): Promise<RpcEnvelope>\n backlog(sessionId?: string | null): Promise<RpcEnvelope>\n backlogUpdate(kind: string, id: string, to: string, sessionId?: string | null, reason?: string, meta?: Record<string, unknown>): Promise<RpcEnvelope>\n resume(runId: string, sessionId: string): Promise<RpcEnvelope>\n stageDetail(runId: string, seq: number, sessionId?: string | null): Promise<RpcEnvelope>\n itemDetail(kind: string, id: string, sessionId?: string | null): Promise<RpcEnvelope>\n}\n\ninterface TeamFlowViewProps {\n sessionId: string\n remote: unknown\n sessions?: {\n openSubagent?: (a: { parentSessionId: string; childSessionId: string; mode?: string }) => void\n } | null\n}\n\nfunction TeamFlowView(props: TeamFlowViewProps) {\n const api = props.remote as TeamflowRemote // $mount 后的 teamflow 服务实例(ctx.get 取得,普通对象)\n const [state, setState] = React.useState({ runs: [], active: null, backlog: null, err: null, workspace: null })\n const [runId, setRunId] = React.useState(null)\n const [tab, setTab] = React.useState('pipeline')\n const [busy, setBusy] = React.useState(false)\n\n const refresh = React.useCallback(async () => {\n if (!api) { setState((s) => ({ ...s, err: 'remote 未就绪' })); return }\n try {\n const lr = unwrap(await api.list(props.sessionId), 'list') as { runs?: Array<Record<string, unknown>>; workspace?: { slug?: string; path?: string | null } }\n const runsList = (lr && lr.runs) || []\n const workspace = (lr && lr.workspace) || null\n const id = runId || (runsList[0] && (runsList[0].id as string | undefined))\n const snapWrap = id ? await api.snapshot(id, props.sessionId) : null\n const snap = snapWrap ? (unwrap(snapWrap, 'snapshot') as Record<string, unknown> | null) : null\n const bo = unwrap(await api.backlog(props.sessionId), 'backlog') as Record<string, unknown>\n setState({ runs: (runsList || []).slice(0, 12), active: snap, backlog: bo, err: null, workspace })\n } catch (e) {\n setState((s) => ({ ...s, err: String((e && e.message) || e) }))\n }\n }, [runId, api, props.sessionId])\n\n React.useEffect(() => {\n refresh()\n const t = setInterval(refresh, 2000)\n return () => clearInterval(t)\n }, [refresh])\n\n const { runs, active, backlog, err, workspace } = state\n const total = totalUsage(active && active.stages)\n const needHuman = []\n if (backlog) {\n for (const item of [...(backlog.requirements || []), ...(backlog.tasks || []), ...(backlog.bugs || [])]) {\n if (item.humanIntervention || item.status === 'needs-human') needHuman.push(item)\n }\n }\n const activeRun = runs.find((r) => r.id === runId) || runs[0]\n // host 判定字段(list 不返回 stages 全量,只给 incompleteStages 布尔)+ 三态才可续\n const canResume = activeRun && activeRun.incompleteStages && (activeRun.status === 'interrupted' || activeRun.status === 'failed' || activeRun.status === 'cancelled')\n const onResume = async () => {\n if (!api || !activeRun || busy) return\n setBusy(true)\n try { await api.resume(activeRun.id, props.sessionId); refresh() }\n catch (e) { setState((s) => ({ ...s, err: String((e && e.message) || e) })) }\n setBusy(false)\n }\n const anyRunning = runs.some((r) => r.status === 'running' || r.status === 'pending')\n\n const btn = {\n font: 'inherit', fontSize: 12, padding: '4px 12px', borderRadius: 8, cursor: 'pointer',\n border: `1px solid ${T.border2}`, background: T.layer1, color: T.text,\n transition: 'border-color .12s ease, background .12s ease',\n }\n const tabBtn = (on) => ({\n font: 'inherit', fontSize: 12, fontWeight: on ? 600 : 500, padding: '5px 14px', borderRadius: 8, cursor: 'pointer',\n border: 'none',\n background: on ? `color-mix(in srgb, ${T.brand} 14%, transparent)` : 'transparent',\n color: on ? T.brand : T.text2,\n transition: 'background .12s ease, color .12s ease',\n })\n const chipBtn = (sel) => ({\n font: 'inherit', fontSize: 11, padding: '2px 10px', borderRadius: 999, cursor: 'pointer',\n border: `1px solid ${sel ? T.brand : T.border}`,\n background: sel ? `color-mix(in srgb, ${T.brand} 12%, transparent)` : 'transparent',\n color: sel ? T.brand : T.text2,\n fontFamily: MONO,\n })\n\n return h('div', { style: { fontFamily: SANS, fontSize: 13, color: T.text, display: 'flex', flexDirection: 'column', gap: 10, padding: '4px 16px' } },\n /* 顶部品牌条 */\n h('div', { style: { display: 'flex', alignItems: 'center', gap: 10 } },\n h('div', {\n style: {\n width: 28, height: 28, borderRadius: 8, display: 'flex', alignItems: 'center', justifyContent: 'center',\n fontSize: 15, background: `color-mix(in srgb, ${T.brand} 12%, transparent)`,\n border: `1px solid color-mix(in srgb, ${T.brand} 28%, transparent)`,\n },\n }, '🏭'),\n h('div', { style: { display: 'flex', flexDirection: 'column', gap: 1 } },\n h('span', { style: { fontWeight: 700, fontSize: 14, lineHeight: '18px' } }, '团队工作台'),\n h('span', { style: { fontSize: 11, color: T.text2, display: 'flex', alignItems: 'center', gap: 5 } },\n h('span', {\n style: {\n width: 7, height: 7, borderRadius: 999, display: 'inline-block',\n background: anyRunning ? T.success : T.text2,\n animation: anyRunning ? 'tf-pulse 1.6s ease-in-out infinite' : 'none',\n },\n }),\n anyRunning ? '流水线运行中' : '空闲',\n ),\n ),\n h('button', { onClick: refresh, style: { ...btn, marginLeft: 'auto', display: 'flex', alignItems: 'center', gap: 5 } }, '🔄 刷新'),\n canResume ? h('button', {\n onClick: onResume, disabled: busy,\n title: `断点续跑 ${activeRun.id}\\n当前状态:${RUN_STATUS_TEXT[activeRun.status] || activeRun.status};跳过已完成阶段,从第一个未完成阶段重跑`,\n style: { ...btn, background: T.error, color: '#fff', border: 'none', fontWeight: 600 },\n }, busy ? '续跑中…' : `↻ 从断点重跑 #${String(activeRun.id).slice(-6)}`) : null,\n ),\n\n err ? h('div', {\n style: {\n color: T.error, fontSize: 12, background: `color-mix(in srgb, ${T.error} 8%, transparent)`,\n border: `1px solid color-mix(in srgb, ${T.error} 30%, transparent)`, borderRadius: 8, padding: '7px 11px',\n },\n }, `⚠ ${err}(确认已安装 dsh-plugin-teamflow 且 web 已重启)`) : null,\n\n /* 人工介入横幅 */\n needHuman.length > 0 ? h('div', {\n style: {\n display: 'flex', alignItems: 'center', gap: 10, flexWrap: 'wrap',\n background: `color-mix(in srgb, ${T.warn} 9%, ${T.layer1})`,\n border: `1px solid color-mix(in srgb, ${T.warn} 35%, transparent)`,\n borderRadius: 10, padding: '9px 12px',\n },\n },\n h('span', { style: { fontWeight: 700, color: T.warn, fontSize: 12.5 } }, `⚠ ${needHuman.length} 项需人工介入`),\n needHuman.slice(0, 5).map((item) => {\n const kind = (backlog.requirements || []).some((r) => r.id === item.id) ? 'req'\n : (backlog.tasks || []).some((t) => t.id === item.id) ? 'task' : 'bug'\n const fin = kind === 'bug' ? 'verified' : 'accepted'\n return h('button', {\n key: item.id,\n onClick: async () => { await api.backlogUpdate(kind, item.id, fin, props.sessionId, '人工处理'); refresh() },\n style: { ...btn, background: T.success, color: '#fff', border: 'none', fontWeight: 600 },\n }, `处理 ${item.id}`)\n }),\n ) : null,\n\n /* tab 栏 */\n h('div', { style: { display: 'flex', alignItems: 'center', gap: 2, borderBottom: `1px solid ${T.border}` } },\n h('button', { onClick: () => setTab('pipeline'), style: tabBtn(tab === 'pipeline') }, '🔄 流水线'),\n h('button', { onClick: () => setTab('board'), style: tabBtn(tab === 'board') }, '📋 Backlog 看板'),\n h('div', { style: { marginLeft: 'auto', display: 'flex', alignItems: 'center', gap: 10 } },\n activeRun ? h('span', {\n title: `${activeRun.id}\\n${activeRun.requirement || ''}`,\n style: {\n fontSize: 11.5, fontFamily: MONO, padding: '2px 10px', borderRadius: 999,\n background: T.layer2, color: activeRun.status === 'interrupted' ? T.warn : T.text2,\n border: `1px solid ${T.border}`,\n },\n }, `#${String(activeRun.id).slice(-8)} · ${RUN_STATUS_TEXT[activeRun.status] || activeRun.status}`) : null, total && (total.input + total.cacheRead + total.cacheWrite + total.output) > 0 ? h('span', { style: { fontSize: 11.5, fontFamily: MONO, color: T.text2, cursor: 'help' }, title: '输入(未命中)/输入(命中)/输出 全部阶段合计' }, `∑ ⇅${fmtTokens(total.input)}/⇅${fmtTokens(total.cacheRead)}·⬆${fmtTokens(total.output)}`) : null,\n ),\n ),\n\n /* 作用域条:当前工作区(项目)+ 本工作区历史流水线 */\n h('div', { style: { display: 'flex', alignItems: 'center', gap: 8, fontSize: 12, flexWrap: 'wrap' } },\n h('span', {\n title: `当前工作区(workspace 级隔离):${(workspace && workspace.path) || '未连接工作区'}`,\n style: {\n display: 'inline-flex', alignItems: 'center', gap: 6, fontFamily: MONO,\n fontSize: 11.5, padding: '2px 10px', borderRadius: 999,\n background: `color-mix(in srgb, ${T.brand} 10%, transparent)`,\n border: `1px solid color-mix(in srgb, ${T.brand} 30%, transparent)`, color: T.brand,\n },\n },\n h('span', { style: { fontSize: 13 } }, '🗂'),\n h('span', { title: (workspace && workspace.path) ? String(workspace.path) : undefined, style: { overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', maxWidth: 220 } },\n (workspace && workspace.path) ? String(workspace.path).split(/[\\\\/]/).filter(Boolean).pop() : 'ungrouped'),\n ),\n /* 历史 run 切换:仅流水线 tab 下有意义(Backlog 看板是工作区级,不随 run 变化,\n 展示在这里点击无反应还会误导 —— 故只看板 tab 时隐藏) */\n tab === 'pipeline' ? h('div', { style: { display: 'flex', alignItems: 'center', gap: 5 } },\n h('span', { style: { color: T.text2 } }, '历史'),\n runs.length ? runs.map((r) => {\n const sel = r.id === (runId || (runs[0] && runs[0].id))\n return h('button', { key: r.id, onClick: () => setRunId(r.id), style: chipBtn(sel), title: `${r.id}\\n${r.requirement || ''}` },\n `#${String(r.id).slice(-6)}`)\n }) : h('span', { style: { color: T.text2, fontSize: 11.5 } }, '(暂无)'),\n ) : null,\n ),\n\n tab === 'pipeline' ? h(PipelinePanel, { active, api, runId: activeRun ? activeRun.id : null, sessionId: props.sessionId, sessions: props.sessions }) : h(BoardPanel, { backlog, api, onRefresh: refresh, sessionId: props.sessionId, onShowRun: (rid) => { setTab('pipeline'); setRunId(rid) } }),\n )\n}\n\n/* ── 动画 keyframes(注入一次) ───────────────────────────────────── */\nif (typeof document !== 'undefined') {\n const styleEl = document.createElement('style')\n styleEl.textContent = `\n@keyframes tf-pulse { 0%,100% { opacity: 1; transform: scale(1); } 50% { opacity: .45; transform: scale(.8); } }\n@keyframes tf-shimmer { 0% { transform: translateX(-100%); } 100% { transform: translateX(350%); } }\n@keyframes tf-flow { from { stroke-dashoffset: 0 } to { stroke-dashoffset: -28 } }`\n document.head.appendChild(styleEl)\n}\n\n/** 注册 conversation.view tab「团队工作台」+ input.right 团队选择按钮。 */\nexport async function apply(ctx) {\n await ctx.remote.$mount(TEAMFLOW_REMOTE_CONTRIBUTION)\n const teamflow = ctx.get('remote.teamflow')\n // 注册团队工作台 tab\n ctx.slots.inject('conversation.view', () => ctx.slots.register({\n name: 'conversation.view',\n id: 'teamflow',\n order: 20,\n label: '🏭 团队工作台',\n inject: (sessionId) => ({ sessionId, remote: teamflow, sessions: ctx.get('sessions') }),\n }, TeamFlowView))\n // 注册输入框旁的团队选择按钮\n ctx.slots.inject('conversation.input.right', () => ctx.slots.register({\n name: 'conversation.input.right',\n id: 'teamflow-team-select',\n order: 5,\n inject: (sessionId) => ({ sessionId, remote: teamflow }),\n }, TeamSelector))\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"descriptors.mjs","names":[],"sources":["../descriptors.ts"],"sourcesContent":["/**\n * dsh-plugin-teamflow — Remote 描述符(纯数据,host 与 client 共用)。\n *\n * host 侧:通过 ctx.typert.register() 注册为 strict 本地调用定义(免 @Remote 装饰器);\n * client 侧:通过 ctx.remote.$mount() 生成 `ctx.remote.teamflow.<method>` 调用面。\n * 两边使用同一份描述符,保证 endpoint(namespace/method)与 wire 参数一致。\n *\n * 参数规则:全部宽松 JSON,wire 字段名 = host 方法参数名,client 端按位置传参;\n * 参数允许省略(host 方法收到 undefined)。\n *\n * codec 为什么用 strict:client 的 $mount 只接受 mode: 'strict' 描述符\n * (requireStrictDescriptor),src-json 会被拒(\"field has no strict codec\")。\n * 本插件载荷本就是自由 JSON,因此 strict schema 用恒等 parse(不做形状校验;\n * host 侧 decode 仍会做 JSON 安全性检查,参数缺省语义与 src-json 一致)。\n */\n\nimport type { InvocationDescriptor } from '@deepseek-ai/dsh-typert-protocol'\n\n/** 恒等 parse:接受任意 JSON 值,原样返回。 */\nconst JSON_SCHEMA: { parse(value: unknown): unknown } = { parse: (value) => value }\n/** 统一 strict codec(本插件所有参数/结果均为自由 JSON)。 */\nconst strict = {\n mode: 'strict' as const,\n typeSymbol: 'dsh-plugin-teamflow/types#Json',\n schema: JSON_SCHEMA,\n}\ntype StrictCodec = typeof strict\n\nconst p = (name: string): InvocationParameter => ({ name, wire: name, source: 'json', codec: strict })\n\ninterface InvocationParameter {\n readonly name: string\n readonly wire: string\n readonly source: 'json'\n readonly codec: StrictCodec\n}\n\nexport const TEAMFLOW_DESCRIPTORS: readonly InvocationDescriptor[] = Object.freeze([\n {\n id: 'dsh-plugin-teamflow#teamflow/ping',\n service: 'teamflow',\n namespace: 'teamflow',\n method: 'ping',\n invocation: { kind: 'direct' },\n parameters: [],\n result: strict,\n },\n {\n id: 'dsh-plugin-teamflow#teamflow/list',\n service: 'teamflow',\n namespace: 'teamflow',\n method: 'list',\n invocation: { kind: 'direct' },\n parameters: [p('sessionId')],\n result: strict,\n },\n {\n id: 'dsh-plugin-teamflow#teamflow/snapshot',\n service: 'teamflow',\n namespace: 'teamflow',\n method: 'snapshot',\n invocation: { kind: 'direct' },\n parameters: [p('runId'), p('sessionId')],\n result: strict,\n },\n {\n id: 'dsh-plugin-teamflow#teamflow/start',\n service: 'teamflow',\n namespace: 'teamflow',\n method: 'start',\n invocation: { kind: 'direct' },\n parameters: [p('sessionId'), p('requirement'), p('options')],\n result: strict,\n },\n {\n id: 'dsh-plugin-teamflow#teamflow/cancel',\n service: 'teamflow',\n namespace: 'teamflow',\n method: 'cancel',\n invocation: { kind: 'direct' },\n parameters: [p('runId')],\n result: strict,\n },\n {\n id: 'dsh-plugin-teamflow#teamflow/backlog',\n service: 'teamflow',\n namespace: 'teamflow',\n method: 'backlog',\n invocation: { kind: 'direct' },\n parameters: [p('sessionId')],\n result: strict,\n },\n {\n id: 'dsh-plugin-teamflow#teamflow/backlogUpdate',\n service: 'teamflow',\n namespace: 'teamflow',\n method: 'backlogUpdate',\n invocation: { kind: 'direct' },\n parameters: [p('kind'), p('id'), p('to'), p('sessionId'), p('reason')],\n result: strict,\n },\n {\n id: 'dsh-plugin-teamflow#teamflow/assign',\n service: 'teamflow',\n namespace: 'teamflow',\n method: 'assign',\n invocation: { kind: 'direct' },\n parameters: [p('kind'), p('id'), p('role'), p('assignee'), p('sessionId')],\n result: strict,\n },\n {\n id: 'dsh-plugin-teamflow#teamflow/pause',\n service: 'teamflow',\n namespace: 'teamflow',\n method: 'pause',\n invocation: { kind: 'direct' },\n parameters: [p('sessionId')],\n result: strict,\n },\n {\n id: 'dsh-plugin-teamflow#teamflow/resumeSession',\n service: 'teamflow',\n namespace: 'teamflow',\n method: 'resumeSession',\n invocation: { kind: 'direct' },\n parameters: [p('sessionId')],\n result: strict,\n },\n {\n id: 'dsh-plugin-teamflow#teamflow/listTeams',\n service: 'teamflow',\n namespace: 'teamflow',\n method: 'listTeams',\n invocation: { kind: 'direct' },\n parameters: [p('sessionId')],\n result: strict,\n },\n {\n id: 'dsh-plugin-teamflow#teamflow/selectTeam',\n service: 'teamflow',\n namespace: 'teamflow',\n method: 'selectTeam',\n invocation: { kind: 'direct' },\n parameters: [p('sessionId'), p('teamId')],\n result: strict,\n },\n {\n id: 'dsh-plugin-teamflow#teamflow/getActiveTeam',\n service: 'teamflow',\n namespace: 'teamflow',\n method: 'getActiveTeam',\n invocation: { kind: 'direct' },\n parameters: [p('sessionId')],\n result: strict,\n },\n {\n id: 'dsh-plugin-teamflow#teamflow/clearTeam',\n service: 'teamflow',\n namespace: 'teamflow',\n method: 'clearTeam',\n invocation: { kind: 'direct' },\n parameters: [p('sessionId')],\n result: strict,\n },\n {\n id: 'dsh-plugin-teamflow#teamflow/resume',\n service: 'teamflow',\n namespace: 'teamflow',\n method: 'resume',\n invocation: { kind: 'direct' },\n parameters: [p('runId'), p('sessionId')],\n result: strict,\n },\n {\n id: 'dsh-plugin-teamflow#teamflow/stageDetail',\n service: 'teamflow',\n namespace: 'teamflow',\n method: 'stageDetail',\n invocation: { kind: 'direct' },\n parameters: [p('runId'), p('seq'), p('sessionId')],\n result: strict,\n },\n {\n id: 'dsh-plugin-teamflow#teamflow/itemDetail',\n service: 'teamflow',\n namespace: 'teamflow',\n method: 'itemDetail',\n invocation: { kind: 'direct' },\n parameters: [p('kind'), p('id'), p('sessionId')],\n result: strict,\n },\n])\n\n/** client 端 $mount 使用的贡献对象。 */\nexport const TEAMFLOW_REMOTE_CONTRIBUTION: {\n readonly package: string\n readonly descriptors: readonly InvocationDescriptor[]\n} = Object.freeze({\n package: 'dsh-plugin-teamflow',\n descriptors: TEAMFLOW_DESCRIPTORS,\n})\n"],"mappings":"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"}