dsh-decision-split
Advanced tools
+54
-10
@@ -109,6 +109,17 @@ window.__ModuleLoader__.load({ | ||
| function hasTable(text) { | ||
| // 语义判定:只有内容确实呈现「多个决策点」或「多个可选方案」时才触发, | ||
| // 而不是看标题存在与否,也不是看内容长短。判定只依赖内容本身。 | ||
| function hasCompareTable(text) { | ||
| var lines = text.split("\n"); | ||
| for (var i = 0; i < lines.length - 1; i++) { | ||
| if (/^\s*\|[^\n]+\|\s*$/.test(lines[i]) && /^\s*\|?[\s:\-|]+\|?\s*$/.test(lines[i + 1]) && lines[i + 1].indexOf("-") !== -1) return true; | ||
| if (/^\s*\|[^\n]+\|\s*$/.test(lines[i]) && /^\s*\|?[\s:\-|]+\|?\s*$/.test(lines[i + 1]) && lines[i + 1].indexOf("-") !== -1) { | ||
| if (!/方案|选项|备选|对比|选择/.test(lines[i])) continue; | ||
| var rows = 0; | ||
| for (var j = i + 2; j < lines.length; j++) { | ||
| var row = lines[j].trim(); | ||
| if (row === "" || row.charAt(0) !== "|") break; | ||
| rows++; | ||
| } | ||
| if (rows >= 2) return true; | ||
| } | ||
| } | ||
@@ -118,14 +129,45 @@ return false; | ||
| function headingCount(text) { | ||
| var m = text.match(/^#{1,6}\s+\S/gm); | ||
| function decisionPointCount(text) { | ||
| var m = text.match(/\*{0,2}\s*(?:决策|决策点|待决策|需决策|待确认)[^::]{0,6}[::]/g); | ||
| return m === null ? 0 : m.length; | ||
| } | ||
| function isPlanLike(text) { | ||
| function alternatives(text) { | ||
| var seen = {}; | ||
| var re = /(?:方案|选项|备选)\s*([A-Za-z一二三四五六七八九十0-9]+)/g; | ||
| var m; | ||
| while ((m = re.exec(text)) !== null) { | ||
| if (seen[m[0]] === undefined) seen[m[0]] = true; | ||
| } | ||
| return Object.keys(seen).length; | ||
| } | ||
| function needsDecision(text) { | ||
| if (typeof text !== "string") return false; | ||
| text = text.replace(/\r\n?/g, "\n"); | ||
| if (hasTable(text)) return true; | ||
| return text.length >= 800 && headingCount(text) >= 2; | ||
| if (decisionPointCount(text) >= 2) return true; | ||
| if (alternatives(text) >= 2) return true; | ||
| if (hasCompareTable(text)) return true; | ||
| return false; | ||
| } | ||
| // 无决策段标题时,把命中的决策点/方案条目抽取成列表,便于逐个阅读拍板。 | ||
| function decisionSummary(text) { | ||
| text = text.replace(/\r\n?/g, "\n"); | ||
| var lines = text.split("\n"); | ||
| var out = []; | ||
| var seen = {}; | ||
| var re = /(?:方案|选项|备选|决策|决策点|待决策|待确认)\s*[A-Za-z一二三四五六七八九十0-9]+\s*[::]|(?:方案|选项|备选)\s*[A-Za-z一二三四五六七八九十0-9]+/; | ||
| for (var i = 0; i < lines.length; i++) { | ||
| var t = lines[i].replace(/\r$/, "").trim(); | ||
| if (t === "" || /^#{1,6}\s/.test(t) || /^```/.test(t) || t.charAt(0) === "|") continue; | ||
| var ln = t.replace(/^[-*+]?\s*/, ""); | ||
| if (re.test(ln) && seen[ln] === undefined) { | ||
| seen[ln] = true; | ||
| out.push("- " + ln); | ||
| } | ||
| } | ||
| return out.join("\n"); | ||
| } | ||
| function tocOf(text) { | ||
@@ -268,6 +310,8 @@ text = text.replace(/\r\n?/g, "\n"); | ||
| var setDraft = st[1]; | ||
| var hasSection = summary !== null && summary.trim() !== ""; | ||
| var isFallback = false; | ||
| if (summary === null) { | ||
| if (!isPlanLike(text)) return null; | ||
| summary = tocMarkdown(text); | ||
| // 触发条件:要么有 agent 主动写的决策段(内容非空),要么内容语义上呈现多个决策点/多个方案。 | ||
| if (!hasSection && !needsDecision(text)) return null; | ||
| if (!hasSection) { | ||
| summary = decisionSummary(text) || tocMarkdown(text); | ||
| isFallback = true; | ||
@@ -274,0 +318,0 @@ } |
+1
-1
@@ -7,4 +7,4 @@ export const inject = ["systemPrompt"]; | ||
| order: 190, | ||
| text: '当你的回复包含需要用户拍板的决策点,或给出多个方案让用户选择时,请在回复末尾追加一个「## 决策摘要」段,用「**决策 N:**」逐条列出需要用户决定的点(N 从 1 开始)。界面会自动据此弹出决策卡片,用户可在卡片里直接输入决策并回传给你。仅在确实需要用户决策时才添加。', | ||
| text: '当你的回复需要用户就「多个决策点」或「多个可选方案」逐一作出选择时,请在回复末尾追加一个「## 决策摘要」段,用「**决策 N:**」(或「**方案 N:**」,N 从 1 开始)逐条列出每个待决定的点或方案。界面会自动据此弹出决策卡片,用户可在卡片里直接输入决策并回传给你。仅当确实存在需要用户拍板的多个决策点或多个备选方案时才添加;普通说明、无需用户决策的回复不要添加。', | ||
| }); | ||
| } |
+1
-1
| { | ||
| "name": "dsh-decision-split", | ||
| "version": "0.1.8", | ||
| "version": "0.1.9", | ||
| "description": "决策分屏:agent 输出含「决策摘要」段的方案时,主窗口显示摘要与决策编辑框,右侧详情栏独立展示完整 markdown,决策一键发回 agent。", | ||
@@ -5,0 +5,0 @@ "type": "module", |
+8
-4
@@ -39,10 +39,14 @@ # dsh-decision-split | ||
| 装上即用,无需额外配置: | ||
| 装上即用,无需额外配置。触发遵循一个核心原则:**只有当回复确实呈现「多个决策点」或「多个可选方案」、需要你逐个阅读逐个拍板时才出卡**,而不是看标题存不存在、也不是看内容长短。 | ||
| - **自动触发(host 注入提示词)**:插件会在系统提示中告知 agent——当回复包含需要你拍板的决策点、或给出多个方案让你选择时,自动在回复末尾追加 `## 决策摘要` 段。agent 据此按需输出决策段,决策卡随之出现。 | ||
| - **长方案兜底(客户端自动识别)**:即使 agent 没写决策标题,只要回复含 markdown 表格、或较长且含多个标题(≥800 字且 ≥2 个标题),决策分屏卡片也会自动出现——摘要区显示方案目录、右侧栏展示全文。 | ||
| - **标题触发**:回复中出现以下任一标题(任意层级 `#`–`######`、忽略大小写、允许结尾冒号)即触发: | ||
| - **语义触发(客户端识别)**:回复内容满足以下任一条件即触发(纯说明性长文、普通问答不会误触发): | ||
| - **≥2 个决策点**:如 `**决策 1:**`、`**决策 2:**`、`决策点二:`、`待确认:` 等; | ||
| - **≥2 个方案/选项**:如 `方案 A`、`方案 一`、`选项 1`、`备选 2` 等; | ||
| - **对比类表格**:表头含 `方案/选项/备选/对比/选择` 且有 ≥2 行对比数据。 | ||
| - **决策段触发**:回复中出现 agent 主动写的非空决策段标题(任意层级 `#`–`######`、忽略大小写、允许结尾冒号)也触发,摘要区展示该段内容: | ||
| `决策摘要` · `决策要点` · `待决策清单` · `决策清单` · `决策事项` · `方案对比` · `方案选择` · `需要决策` · `待决策` · `待确认` · `待拍板` · `请你决定` · `请拍板` · `决策项` · `决策点` · `Decision Summary` · `Decision Points` · `Decision Required` · `Decision Needed` · `Please Decide` · `Please Choose` · `Need Your Decision` · `Options` · `Choices` | ||
| - **host 注入提示词**:插件会在系统提示中告知 agent——当回复包含需要你拍板的决策点、或给出多个方案让你选择时,用 `**决策 N:**` 逐条列出,以便即便 agent 不写标题、客户端也能按上面的语义规则识别出来。 | ||
| > 也可在对话里给 agent 补一句「输出方案时若需我拍板,请在最后用 `## 决策摘要` 段列出决策点」——手动约定与自动注入效果相同,属可选的加强。 | ||
@@ -49,0 +53,0 @@ |
27762
10.84%388
12.46%60
7.14%