Skip to content

Commit fc4701c

Browse files
chenyida7-progCoderMoray
authored andcommitted
feat(frontend): Enchante Agent 改为置灰开关 + 参考使用手册链接,停用 agent deeplink
Enchante 的 Agent deeplink(enchante://agent/install)在真机上验证不可靠 (即便 PR #3 补上了缺失的顶层 name 字段,deeplink 本身对 Enchanté 版本/环境的 依赖仍不稳定),改为引导用户直接看使用手册,避免继续给一个不可靠的安装入口。 改动范围仅 Enchante + agent 这一格: - 设置弹窗 Agent 分组、首次引导 2.2 结论页,Enchante 那一行都改成不可点的置灰 开关(视觉与 Hooks 分组里 Enchante 那行「平台原生不支持」的置灰渲染一致), 描述文字改为「参考使用手册」,旁边加一个「查看手册」链接。 - store.js: usesDeeplink() 收窄为仅 Enchante+MCP;新增 isEnchanteAgentManual() 判定 + openEnchanteAgentManual() 打开手册。 - desktop/main.js + preload.js: 新增独立的 open-manual IPC 通道,用 shell.openPath 打开手册文件。没有复用 open-external,因为那个通道专门 block 了 file: 前缀(避免渲染层任意打开本地文件/命令);手册路径由主进程硬编码, 渲染层不传参,同样是为了不给渲染层传任意本地路径的口子。 TODO(分发前必须替换,已在代码里标注):MANUAL_PATH 目前是本机开发路径占位, 正式版应指向打包进 app 资源目录的手册文件,并加入 electron-builder 的 extraResources / build-backend datas。 Enchante 的 MCP deeplink、其它平台的 Agent 配置均未改动。 测试:只跑了改动直接影响的静态结构测试(不含全局前端/浏览器测试套件): pytest tests/frontend/test_stage3.py::TestStage3StaticStructure # 16 passed pytest tests/frontend/test_stage3.py::TestStage3Build # 1 passed(对新 build 的 standalone 断言) 同时更新了这两类测试里跟 Agent deeplink 按钮相关的断言(按钮已移除、改为手册引导), 以及一个受影响的浏览器测试(TestStage3Browser,未在本地跑,留给 review/CI)。
1 parent c096266 commit fc4701c

6 files changed

Lines changed: 112 additions & 29 deletions

File tree

desktop/main.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,28 @@ app.whenReady().then(async () => {
477477
}
478478
});
479479

480+
// ── 使用手册系统级打开(IPC)──────────────────────────────
481+
// Enchante 的 Agent deeplink 在真机验证不可靠(2026-08-26),改为引导用户看使用
482+
// 手册。手册是本地文件,open-external 专门 block 了 file: 前缀(避免渲染层任意打
483+
// 开本地文件/命令),所以走独立的、路径由主进程硬编码(渲染层不传路径)的 IPC 通
484+
// 道,用 shell.openPath 交给系统默认程序(.html → 默认浏览器)打开。
485+
//
486+
// TODO(分发前替换):MANUAL_PATH 目前是本机开发路径占位,正式版应改为打包进 app
487+
// 资源目录的手册文件(如 path.join(process.resourcesPath, "docs", "MyKnowledge使用手册.html")),
488+
// 并把手册一并加入 electron-builder 的 extraResources / build-backend datas。
489+
const MANUAL_PATH =
490+
"/Users/chenyida/Library/Containers/com.tencent.xinWeChat/Data/Documents/xwechat_files/wxid_6qcy1jhgv90312_a764/msg/file/2026-08/MyKnowledge使用手册3_2.html";
491+
ipcMain.handle("open-manual", async () => {
492+
try {
493+
const err = await shell.openPath(MANUAL_PATH);
494+
// shell.openPath 失败时返回非空错误字符串(不像 openExternal 那样 reject)
495+
if (err) return { ok: false, error: err };
496+
return { ok: true };
497+
} catch (err) {
498+
return { ok: false, error: String(err) };
499+
}
500+
});
501+
480502
try {
481503
if (DEV_BACKEND_URL) {
482504
// 开发模式:直接连开发者后端

desktop/preload.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,8 @@ contextBridge.exposeInMainWorld("__mykOnCloseChoice__", (payload) => {
5858
contextBridge.exposeInMainWorld("__mykOpenExternal__", (url) => {
5959
return ipcRenderer.invoke("open-external", url);
6060
});
61+
62+
// 使用手册系统级打开(本地文件,路径由主进程硬编码,渲染层不传参,避免任意路径注入)
63+
contextBridge.exposeInMainWorld("__mykOpenManual__", () => {
64+
return ipcRenderer.invoke("open-manual");
65+
});

frontend/css/components.css

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2561,6 +2561,18 @@
25612561
color: var(--text-secondary);
25622562
font-style: italic;
25632563
}
2564+
/* Enchante Agent「参考使用手册」行内链接:与置灰状态文字同级,不额外抢视觉焦点 */
2565+
.ai-platform-row__manual-link {
2566+
margin-left: 6px;
2567+
font-size: 12px;
2568+
color: var(--accent);
2569+
text-decoration: underline;
2570+
text-underline-offset: 2px;
2571+
cursor: pointer;
2572+
}
2573+
.ai-platform-row__manual-link:hover {
2574+
color: var(--accent-hover, var(--accent));
2575+
}
25642576

25652577
/* ── 连接态(MCP 卡平台行右,平台级四态:not_connected/connected/inactive/lost;置灰仅 !installed) ── */
25662578
.ai-platform-row__connection {

frontend/index.html

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
<link rel="stylesheet" href="css/sidebar.css?v=a098a49cbe" />
4848
<link rel="stylesheet" href="css/viewer.css?v=326a61002d" />
4949
<link rel="stylesheet" href="css/editor.css?v=e811a96156" />
50-
<link rel="stylesheet" href="css/components.css?v=77f20937a1" />
50+
<link rel="stylesheet" href="css/components.css?v=a560dd30c4" />
5151
<link rel="stylesheet" href="css/markdown-content.css?v=6c10b2632f" />
5252

5353
<!-- highlight.js 主题 -->
@@ -69,7 +69,7 @@
6969
<script src="js/converter.js?v=d8110f4a62"></script>
7070
<script src="js/renderer.js?v=95b7ca304e"></script>
7171
<script src="js/splash.js?v=9bc7eee6bd"></script>
72-
<script src="js/store.js?v=e8407d2f87"></script>
72+
<script src="js/store.js?v=72bb9afc4a"></script>
7373
<script src="js/router.js?v=a1968069d7"></script>
7474
<script src="js/app.js?v=5c96193949"></script>
7575
<script src="js/components/doc.js?v=16de8d15b7"></script>
@@ -1743,7 +1743,8 @@ <h2 class="modal__title" style="text-align:center;">AI 协作初始化</h2>
17431743
<span class="guide-conclusion-row__dot" :style="'background:' + plat.dot"
17441744
:class="{ 'guide-conclusion-row__dot--skip': !$store.app.clientInstalled(plat.key) }"></span>
17451745
<span class="guide-conclusion-row__name" x-text="plat.label"></span>
1746-
<!-- Enchante:专属 deeplink 安装入口(MCP / Agent 两个按钮,各自四态) -->
1746+
<!-- Enchante:MCP 走专属 deeplink 安装;Agent deeplink 在真机验证不可靠
1747+
(2026-08-26),改为置灰不可点开关 + 引导看使用手册,不再生成安装链接。 -->
17471748
<template x-if="plat.key === 'Enchante'">
17481749
<span class="guide-conclusion-row__body">
17491750
<span class="guide-conclusion-row__action">需手动安装</span>
@@ -1753,12 +1754,12 @@ <h2 class="modal__title" style="text-align:center;">AI 协作初始化</h2>
17531754
<span x-text="$store.app.deeplinkBusy ? '生成中…'
17541755
: ($store.app.deeplinkClickedFor('mcp') ? 'MCP 已生成 · 可再次点击' : '⚡ 生成 MCP 链接')"></span>
17551756
</button>
1756-
<button class="btn btn--sm btn--deeplink guide-conclusion-row__deeplink"
1757-
:disabled="$store.app.deeplinkBusy || !$store.app.clientInstalled('Enchante')"
1758-
@click="$store.app.generateEnchanteDeeplink('Enchante', 'agent')">
1759-
<span x-text="$store.app.deeplinkBusy ? '生成中…'
1760-
: ($store.app.deeplinkClickedFor('agent') ? 'Agent 已生成 · 可再次点击' : '⚡ 生成 Agent 链接')"></span>
1757+
<button class="toggle toggle--off" disabled aria-label="Enchante Agent:参考使用手册">
1758+
<span class="toggle__knob"></span>
17611759
</button>
1760+
<span class="guide-conclusion-row__action guide-conclusion-row__action--native">参考使用手册</span>
1761+
<a class="ai-platform-row__manual-link"
1762+
href="#" @click.prevent="$store.app.openEnchanteAgentManual()">查看手册</a>
17621763
<span class="guide-conclusion-row__hint"
17631764
x-show="!$store.app.clientInstalled('Enchante')">请先安装 Enchanté</span>
17641765
</span>
@@ -2013,7 +2014,7 @@ <h3 class="settings-body__title" x-text="kind.label"></h3>
20132014
<div class="settings-card__desc" x-text="'为各 AI 客户端配置 ' + kind.label + ';开关关闭 = 移除配置'"></div>
20142015
<template x-for="plat in $store.app.platformsForKind(kind.key)" :key="kind.key + '-' + plat.key">
20152016
<div>
2016-
<div class="ai-platform-row" :class="{ 'ai-platform-row--unsupported': !plat.supported }"
2017+
<div class="ai-platform-row" :class="{ 'ai-platform-row--unsupported': !plat.supported || $store.app.isEnchanteAgentManual(plat.key, kind.key) }"
20172018
:data-platform="plat.key" :data-kind="kind.key">
20182019
<span class="status-indicator__dot"
20192020
:class="$store.app.clientStatus(plat.key, kind.key) === true ? 'status-indicator__dot--success'
@@ -2022,18 +2023,25 @@ <h3 class="settings-body__title" x-text="kind.label"></h3>
20222023
:style="$store.app.clientStatus(plat.key, kind.key) !== null && !$store.app.clientInstalled(plat.key) ? 'opacity:0.5' : ''"></span>
20232024
<span class="ai-platform-row__name" x-text="plat.label"></span>
20242025
<span class="ai-platform-row__state"
2025-
:class="!plat.supported ? 'ai-platform-row__state--unsupported'
2026+
:class="$store.app.isEnchanteAgentManual(plat.key, kind.key) ? 'ai-platform-row__state--unsupported'
2027+
: !plat.supported ? 'ai-platform-row__state--unsupported'
20262028
: $store.app.clientStatus(plat.key, kind.key) === null ? 'ai-platform-row__state--fail'
20272029
: !$store.app.clientInstalled(plat.key) ? 'ai-platform-row__state--soft'
20282030
: ($store.app.clientStatus(plat.key, kind.key) ? 'ai-platform-row__state--ok' : 'ai-platform-row__state--off')"
2029-
x-text="!plat.supported ? '平台原生不支持'
2031+
x-text="$store.app.isEnchanteAgentManual(plat.key, kind.key) ? '参考使用手册'
2032+
: !plat.supported ? '平台原生不支持'
20302033
: $store.app.clientStatus(plat.key, kind.key) === null
20312034
? '检测失败 · 重新检测'
20322035
: !$store.app.clientInstalled(plat.key)
20332036
? ($store.app.clientStatus(plat.key, kind.key) ? '请在安装 ' + plat.label + ' 后使用' : '请先安装 ' + plat.label)
20342037
: ($store.app.clientStatus(plat.key, kind.key) ? '已配置'
20352038
: ($store.app.usesDeeplink(plat.key, kind.key) ? '生成专属链接' : '未配置 · 点击开关开启'))"></span>
2036-
<!-- deeplink 平台(当前 Enchante MCP/Agent):单按钮「生成专属链接」,不走 toggle。
2039+
<!-- Enchante Agent:deeplink 在真机验证不可靠,改为引导看使用手册(置灰
2040+
不可点开关 + 手册链接),不再生成安装链接。 -->
2041+
<a class="ai-platform-row__manual-link"
2042+
x-show="$store.app.isEnchanteAgentManual(plat.key, kind.key)"
2043+
href="#" @click.prevent="$store.app.openEnchanteAgentManual()">查看手册</a>
2044+
<!-- deeplink 平台(当前仅 Enchante MCP):单按钮「生成专属链接」,不走 toggle。
20372045
未安装时禁用(状态文字已显示「请先安装 X」,与引导页结论行一致) -->
20382046
<button class="btn btn--sm btn--deeplink"
20392047
x-show="$store.app.usesDeeplink(plat.key, kind.key)"
@@ -2043,12 +2051,13 @@ <h3 class="settings-body__title" x-text="kind.label"></h3>
20432051
</button>
20442052
<button class="toggle"
20452053
x-show="!$store.app.usesDeeplink(plat.key, kind.key)"
2046-
:class="!plat.supported ? 'toggle--off'
2054+
:class="$store.app.isEnchanteAgentManual(plat.key, kind.key) ? 'toggle--off'
2055+
: !plat.supported ? 'toggle--off'
20472056
: $store.app.clientStatus(plat.key, kind.key) === null ? 'toggle--failed'
20482057
: !$store.app.clientInstalled(plat.key)
20492058
? ($store.app.clientStatus(plat.key, kind.key) ? 'toggle--on-soft' : 'toggle--off-soft')
20502059
: ($store.app.clientStatus(plat.key, kind.key) ? 'toggle--on' : 'toggle--off')"
2051-
:disabled="!plat.supported || $store.app.clientStatus(plat.key, kind.key) === null || $store.app.isClientConfiguring(plat.key, kind.key)"
2060+
:disabled="$store.app.isEnchanteAgentManual(plat.key, kind.key) || !plat.supported || $store.app.clientStatus(plat.key, kind.key) === null || $store.app.isClientConfiguring(plat.key, kind.key)"
20522061
@click="$store.app.clientStatus(plat.key, kind.key) === null
20532062
? $store.app.loadClientConfig()
20542063
: $store.app.configureClient(plat.key, kind.key)">

frontend/js/store.js

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1714,9 +1714,10 @@ let _tocCollapsedSet = {};
17141714
}));
17151715
},
17161716

1717-
/** 该平台该 kind 是否走 deeplink 安装(当前仅 Enchante MCP/Agent:无配置文件,客户端捕获链接) */
1717+
/** 该平台该 kind 是否走 deeplink 安装(当前仅 Enchante MCP:无配置文件,客户端捕获链接。
1718+
* Enchante Agent 已改为「参考使用手册」,见 isEnchanteAgentManual)。 */
17181719
usesDeeplink(platform, kind) {
1719-
return platform === "Enchante" && (kind === "mcp" || kind === "agent");
1720+
return platform === "Enchante" && kind === "mcp";
17201721
},
17211722

17221723
/** 正在生成 deeplink(Enchante deeplink 按钮 spinner / 防重复点击) */
@@ -1727,6 +1728,30 @@ let _tocCollapsedSet = {};
17271728
return !!(this.deeplinkClicked && this.deeplinkClicked[kind]);
17281729
},
17291730

1731+
/** Enchante 的 Agent 安装入口已停用(deeplink 在真机上验证不可靠,2026-08-26
1732+
* 决定改为引导用户看使用手册)——设置页 Agent 分组行 + 引导结论页命中该判断时,
1733+
* 一律渲染为置灰不可点开关 +「参考使用手册」+ 手册链接,不再走 usesDeeplink。 */
1734+
isEnchanteAgentManual(platform, kind) {
1735+
return platform === "Enchante" && kind === "agent";
1736+
},
1737+
1738+
/** 打开 MyKnowledge 使用手册(桌面端走现有 IPC 系统级打开外链,同 enchante:// deeplink
1739+
* 的机制)。手册路径当前是占位符,分发前需替换为打包进 app 资源目录的真实路径。 */
1740+
openEnchanteAgentManual() {
1741+
// TODO(分发前替换):这是本机路径,占位用;正式版应指向打包进 app 的手册文件
1742+
// (如 resources/docs/MyKnowledge使用手册.html),由主进程解析,不应硬编码本机用户路径。
1743+
const url = "file:///Users/chenyida/Library/Containers/com.tencent.xinWeChat/Data/Documents/xwechat_files/wxid_6qcy1jhgv90312_a764/msg/file/2026-08/MyKnowledge%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C3_2.html";
1744+
if (window.__MYK_APP_MODE__ && typeof window.__mykOpenManual__ === "function") {
1745+
window.__mykOpenManual__().then((res) => {
1746+
if (res && res.ok === false) {
1747+
showToast("打开使用手册失败,请联系管理员确认手册路径", "error");
1748+
}
1749+
});
1750+
} else {
1751+
window.open(url, "_blank", "noopener");
1752+
}
1753+
},
1754+
17301755
/**
17311756
* Enchante deeplink 专属链接流程(MCP / Agent 共用):GET deeplink → 复制剪贴板 →
17321757
* 隐藏 <a target=_blank> 触发唤起(避免 SPA location.href 跳转中断)→ toast。失败给出可读提示。

0 commit comments

Comments
 (0)