dsh-plugin-teamflow 0.1.0
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.
- package/AGENTS.md +108 -0
- package/LICENSE +21 -0
- package/README.md +169 -0
- package/cordis.patch.yml +15 -0
- package/docs/adr/0001-self-hosted-journal-vs-langgraph.md +46 -0
- package/docs/adr/0002-agents-md-minimal-invasion.md +28 -0
- package/docs/adr/0003-release-deploy-and-token-metering.md +50 -0
- package/docs/adr/0004-triage-and-shared-state.md +52 -0
- package/docs/adr/0005-reject-invalid-requirement.md +38 -0
- package/docs/adr/0006-cognition-architecture-rework.md +67 -0
- package/docs/adr/0007-qa-rework-loop.md +65 -0
- package/docs/adr/0008-task-folder-docs.md +103 -0
- package/lib/client.js +2412 -0
- package/lib/client.js.map +1 -0
- package/lib/descriptors.mjs +201 -0
- package/lib/descriptors.mjs.map +1 -0
- package/lib/host.mjs +4147 -0
- package/lib/host.mjs.map +1 -0
- package/lib/store.mjs +258 -0
- package/lib/store.mjs.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1 @@
|
|
|
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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"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
//#region descriptors.ts
|
|
2
|
+
/** 统一 strict codec(本插件所有参数/结果均为自由 JSON)。 */
|
|
3
|
+
const strict = {
|
|
4
|
+
mode: "strict",
|
|
5
|
+
typeSymbol: "dsh-plugin-teamflow/types#Json",
|
|
6
|
+
schema: { parse: (value) => value }
|
|
7
|
+
};
|
|
8
|
+
const p = (name) => ({
|
|
9
|
+
name,
|
|
10
|
+
wire: name,
|
|
11
|
+
source: "json",
|
|
12
|
+
codec: strict
|
|
13
|
+
});
|
|
14
|
+
const TEAMFLOW_DESCRIPTORS = Object.freeze([
|
|
15
|
+
{
|
|
16
|
+
id: "dsh-plugin-teamflow#teamflow/ping",
|
|
17
|
+
service: "teamflow",
|
|
18
|
+
namespace: "teamflow",
|
|
19
|
+
method: "ping",
|
|
20
|
+
invocation: { kind: "direct" },
|
|
21
|
+
parameters: [],
|
|
22
|
+
result: strict
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
id: "dsh-plugin-teamflow#teamflow/list",
|
|
26
|
+
service: "teamflow",
|
|
27
|
+
namespace: "teamflow",
|
|
28
|
+
method: "list",
|
|
29
|
+
invocation: { kind: "direct" },
|
|
30
|
+
parameters: [p("sessionId")],
|
|
31
|
+
result: strict
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
id: "dsh-plugin-teamflow#teamflow/snapshot",
|
|
35
|
+
service: "teamflow",
|
|
36
|
+
namespace: "teamflow",
|
|
37
|
+
method: "snapshot",
|
|
38
|
+
invocation: { kind: "direct" },
|
|
39
|
+
parameters: [p("runId"), p("sessionId")],
|
|
40
|
+
result: strict
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
id: "dsh-plugin-teamflow#teamflow/start",
|
|
44
|
+
service: "teamflow",
|
|
45
|
+
namespace: "teamflow",
|
|
46
|
+
method: "start",
|
|
47
|
+
invocation: { kind: "direct" },
|
|
48
|
+
parameters: [
|
|
49
|
+
p("sessionId"),
|
|
50
|
+
p("requirement"),
|
|
51
|
+
p("options")
|
|
52
|
+
],
|
|
53
|
+
result: strict
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
id: "dsh-plugin-teamflow#teamflow/cancel",
|
|
57
|
+
service: "teamflow",
|
|
58
|
+
namespace: "teamflow",
|
|
59
|
+
method: "cancel",
|
|
60
|
+
invocation: { kind: "direct" },
|
|
61
|
+
parameters: [p("runId")],
|
|
62
|
+
result: strict
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
id: "dsh-plugin-teamflow#teamflow/backlog",
|
|
66
|
+
service: "teamflow",
|
|
67
|
+
namespace: "teamflow",
|
|
68
|
+
method: "backlog",
|
|
69
|
+
invocation: { kind: "direct" },
|
|
70
|
+
parameters: [p("sessionId")],
|
|
71
|
+
result: strict
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
id: "dsh-plugin-teamflow#teamflow/backlogUpdate",
|
|
75
|
+
service: "teamflow",
|
|
76
|
+
namespace: "teamflow",
|
|
77
|
+
method: "backlogUpdate",
|
|
78
|
+
invocation: { kind: "direct" },
|
|
79
|
+
parameters: [
|
|
80
|
+
p("kind"),
|
|
81
|
+
p("id"),
|
|
82
|
+
p("to"),
|
|
83
|
+
p("sessionId"),
|
|
84
|
+
p("reason")
|
|
85
|
+
],
|
|
86
|
+
result: strict
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
id: "dsh-plugin-teamflow#teamflow/assign",
|
|
90
|
+
service: "teamflow",
|
|
91
|
+
namespace: "teamflow",
|
|
92
|
+
method: "assign",
|
|
93
|
+
invocation: { kind: "direct" },
|
|
94
|
+
parameters: [
|
|
95
|
+
p("kind"),
|
|
96
|
+
p("id"),
|
|
97
|
+
p("role"),
|
|
98
|
+
p("assignee"),
|
|
99
|
+
p("sessionId")
|
|
100
|
+
],
|
|
101
|
+
result: strict
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
id: "dsh-plugin-teamflow#teamflow/pause",
|
|
105
|
+
service: "teamflow",
|
|
106
|
+
namespace: "teamflow",
|
|
107
|
+
method: "pause",
|
|
108
|
+
invocation: { kind: "direct" },
|
|
109
|
+
parameters: [p("sessionId")],
|
|
110
|
+
result: strict
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
id: "dsh-plugin-teamflow#teamflow/resumeSession",
|
|
114
|
+
service: "teamflow",
|
|
115
|
+
namespace: "teamflow",
|
|
116
|
+
method: "resumeSession",
|
|
117
|
+
invocation: { kind: "direct" },
|
|
118
|
+
parameters: [p("sessionId")],
|
|
119
|
+
result: strict
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
id: "dsh-plugin-teamflow#teamflow/listTeams",
|
|
123
|
+
service: "teamflow",
|
|
124
|
+
namespace: "teamflow",
|
|
125
|
+
method: "listTeams",
|
|
126
|
+
invocation: { kind: "direct" },
|
|
127
|
+
parameters: [p("sessionId")],
|
|
128
|
+
result: strict
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
id: "dsh-plugin-teamflow#teamflow/selectTeam",
|
|
132
|
+
service: "teamflow",
|
|
133
|
+
namespace: "teamflow",
|
|
134
|
+
method: "selectTeam",
|
|
135
|
+
invocation: { kind: "direct" },
|
|
136
|
+
parameters: [p("sessionId"), p("teamId")],
|
|
137
|
+
result: strict
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
id: "dsh-plugin-teamflow#teamflow/getActiveTeam",
|
|
141
|
+
service: "teamflow",
|
|
142
|
+
namespace: "teamflow",
|
|
143
|
+
method: "getActiveTeam",
|
|
144
|
+
invocation: { kind: "direct" },
|
|
145
|
+
parameters: [p("sessionId")],
|
|
146
|
+
result: strict
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
id: "dsh-plugin-teamflow#teamflow/clearTeam",
|
|
150
|
+
service: "teamflow",
|
|
151
|
+
namespace: "teamflow",
|
|
152
|
+
method: "clearTeam",
|
|
153
|
+
invocation: { kind: "direct" },
|
|
154
|
+
parameters: [p("sessionId")],
|
|
155
|
+
result: strict
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
id: "dsh-plugin-teamflow#teamflow/resume",
|
|
159
|
+
service: "teamflow",
|
|
160
|
+
namespace: "teamflow",
|
|
161
|
+
method: "resume",
|
|
162
|
+
invocation: { kind: "direct" },
|
|
163
|
+
parameters: [p("runId"), p("sessionId")],
|
|
164
|
+
result: strict
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
id: "dsh-plugin-teamflow#teamflow/stageDetail",
|
|
168
|
+
service: "teamflow",
|
|
169
|
+
namespace: "teamflow",
|
|
170
|
+
method: "stageDetail",
|
|
171
|
+
invocation: { kind: "direct" },
|
|
172
|
+
parameters: [
|
|
173
|
+
p("runId"),
|
|
174
|
+
p("seq"),
|
|
175
|
+
p("sessionId")
|
|
176
|
+
],
|
|
177
|
+
result: strict
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
id: "dsh-plugin-teamflow#teamflow/itemDetail",
|
|
181
|
+
service: "teamflow",
|
|
182
|
+
namespace: "teamflow",
|
|
183
|
+
method: "itemDetail",
|
|
184
|
+
invocation: { kind: "direct" },
|
|
185
|
+
parameters: [
|
|
186
|
+
p("kind"),
|
|
187
|
+
p("id"),
|
|
188
|
+
p("sessionId")
|
|
189
|
+
],
|
|
190
|
+
result: strict
|
|
191
|
+
}
|
|
192
|
+
]);
|
|
193
|
+
/** client 端 $mount 使用的贡献对象。 */
|
|
194
|
+
const TEAMFLOW_REMOTE_CONTRIBUTION = Object.freeze({
|
|
195
|
+
package: "dsh-plugin-teamflow",
|
|
196
|
+
descriptors: TEAMFLOW_DESCRIPTORS
|
|
197
|
+
});
|
|
198
|
+
//#endregion
|
|
199
|
+
export { TEAMFLOW_DESCRIPTORS, TEAMFLOW_REMOTE_CONTRIBUTION };
|
|
200
|
+
|
|
201
|
+
//# sourceMappingURL=descriptors.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
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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"}
|