Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 0 additions & 22 deletions desktop/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -477,28 +477,6 @@ app.whenReady().then(async () => {
}
});

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

try {
if (DEV_BACKEND_URL) {
// 开发模式:直接连开发者后端
Expand Down
5 changes: 0 additions & 5 deletions desktop/preload.js
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,3 @@ contextBridge.exposeInMainWorld("__mykOnCloseChoice__", (payload) => {
contextBridge.exposeInMainWorld("__mykOpenExternal__", (url) => {
return ipcRenderer.invoke("open-external", url);
});

// 使用手册系统级打开(本地文件,路径由主进程硬编码,渲染层不传参,避免任意路径注入)
contextBridge.exposeInMainWorld("__mykOpenManual__", () => {
return ipcRenderer.invoke("open-manual");
});
13 changes: 0 additions & 13 deletions frontend/css/components.css
Original file line number Diff line number Diff line change
Expand Up @@ -2561,19 +2561,6 @@
color: var(--text-secondary);
font-style: italic;
}
/* Enchante Agent「参考使用手册」行内链接:与置灰状态文字同级,不额外抢视觉焦点 */
.ai-platform-row__manual-link {
margin-left: 6px;
font-size: 12px;
color: var(--accent);
text-decoration: underline;
text-underline-offset: 2px;
cursor: pointer;
}
.ai-platform-row__manual-link:hover {
color: var(--accent-hover, var(--accent));
}

/* ── 连接态(MCP 卡平台行右,平台级四态:not_connected/connected/inactive/lost;置灰仅 !installed) ── */
.ai-platform-row__connection {
display: inline-flex;
Expand Down
13 changes: 4 additions & 9 deletions frontend/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@
<link rel="stylesheet" href="css/sidebar.css?v=a098a49cbe" />
<link rel="stylesheet" href="css/viewer.css?v=326a61002d" />
<link rel="stylesheet" href="css/editor.css?v=e811a96156" />
<link rel="stylesheet" href="css/components.css?v=a560dd30c4" />
<link rel="stylesheet" href="css/components.css?v=6bb8efbf3b" />
<link rel="stylesheet" href="css/markdown-content.css?v=6c10b2632f" />

<!-- highlight.js 主题 -->
Expand All @@ -69,7 +69,7 @@
<script src="js/converter.js?v=d8110f4a62"></script>
<script src="js/renderer.js?v=95b7ca304e"></script>
<script src="js/splash.js?v=9bc7eee6bd"></script>
<script src="js/store.js?v=72bb9afc4a"></script>
<script src="js/store.js?v=7e579b12ba"></script>
<script src="js/router.js?v=a1968069d7"></script>
<script src="js/app.js?v=5c96193949"></script>
<script src="js/components/doc.js?v=16de8d15b7"></script>
Expand Down Expand Up @@ -1759,8 +1759,6 @@ <h2 class="modal__title" style="text-align:center;">AI 协作初始化</h2>
: ($store.app.deeplinkClickedFor('mcp') ? 'MCP 已生成 · 可再次点击' : '⚡ 生成 MCP 链接')"></span>
</button>
<span class="guide-conclusion-row__action--native">配置 Agent 参考使用手册</span>
<a class="ai-platform-row__manual-link"
href="#" @click.prevent="$store.app.openEnchanteAgentManual()">查看手册</a>
<span class="guide-conclusion-row__hint"
x-show="!$store.app.clientInstalled('Enchante')">请先安装 Enchanté</span>
</span>
Expand Down Expand Up @@ -2037,11 +2035,8 @@ <h3 class="settings-body__title" x-text="kind.label"></h3>
? ($store.app.clientStatus(plat.key, kind.key) ? '请在安装 ' + plat.label + ' 后使用' : '请先安装 ' + plat.label)
: ($store.app.clientStatus(plat.key, kind.key) ? '已配置'
: ($store.app.usesDeeplink(plat.key, kind.key) ? '生成专属链接' : '未配置 · 点击开关开启'))"></span>
<!-- Enchante Agent:deeplink 在真机验证不可靠,改为引导看使用手册(置灰
不可点开关 + 手册链接),不再生成安装链接。 -->
<a class="ai-platform-row__manual-link"
x-show="$store.app.isEnchanteAgentManual(plat.key, kind.key)"
href="#" @click.prevent="$store.app.openEnchanteAgentManual()">查看手册</a>
<!-- Enchante Agent:deeplink 在真机验证不可靠,改为置灰不可点开关 +「参考
使用手册」纯文字提示,不再生成安装链接,也不带任何手册链接。 -->
<!-- deeplink 平台(当前仅 Enchante MCP):单按钮「生成专属链接」,不走 toggle。
未安装时禁用(状态文字已显示「请先安装 X」,与引导页结论行一致) -->
<button class="btn btn--sm btn--deeplink"
Expand Down
21 changes: 2 additions & 19 deletions frontend/js/store.js
Original file line number Diff line number Diff line change
Expand Up @@ -1729,29 +1729,12 @@ let _tocCollapsedSet = {};
},

/** Enchante 的 Agent 安装入口已停用(deeplink 在真机上验证不可靠,2026-08-26
* 决定改为引导用户看使用手册)——设置页 Agent 分组行 + 引导结论页命中该判断时,
* 一律渲染为置灰不可点开关 +「参考使用手册」+ 手册链接,不再走 usesDeeplink。 */
* 决定改为纯文字「参考使用手册」提示,不带链接)——设置页 Agent 分组行 + 引导
* 结论页命中该判断时,一律渲染为置灰不可点开关 + 纯文字提示,不再走 usesDeeplink。 */
isEnchanteAgentManual(platform, kind) {
return platform === "Enchante" && kind === "agent";
},

/** 打开 MyKnowledge 使用手册(桌面端走现有 IPC 系统级打开外链,同 enchante:// deeplink
* 的机制)。手册路径当前是占位符,分发前需替换为打包进 app 资源目录的真实路径。 */
openEnchanteAgentManual() {
// TODO(分发前替换):这是本机路径,占位用;正式版应指向打包进 app 的手册文件
// (如 resources/docs/MyKnowledge使用手册.html),由主进程解析,不应硬编码本机用户路径。
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";
if (window.__MYK_APP_MODE__ && typeof window.__mykOpenManual__ === "function") {
window.__mykOpenManual__().then((res) => {
if (res && res.ok === false) {
showToast("打开使用手册失败,请联系管理员确认手册路径", "error");
}
});
} else {
window.open(url, "_blank", "noopener");
}
},

/**
* Enchante deeplink 专属链接流程(MCP / Agent 共用):GET deeplink → 复制剪贴板 →
* 隐藏 <a target=_blank> 触发唤起(避免 SPA location.href 跳转中断)→ toast。失败给出可读提示。
Expand Down
22 changes: 13 additions & 9 deletions tests/frontend/test_stage3.py
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,8 @@ def test_store_kind_filter_upgrade(self):
assert 'return platform === "Enchante" && kind === "mcp"' in js, \
"Missing usesDeeplink Enchante MCP-only rule"
assert "isEnchanteAgentManual" in js, "Missing isEnchanteAgentManual (Enchante Agent 停用判定)"
assert "openEnchanteAgentManual" in js, "Missing openEnchanteAgentManual (使用手册打开入口)"
assert "openEnchanteAgentManual" not in js, \
"openEnchanteAgentManual 应已移除(手册链接下线,只留纯文字提示)"
# deeplink 流程 + 状态(MCP 仍在用)
assert "generateEnchanteDeeplink" in js, "Missing generateEnchanteDeeplink"
assert "deeplinkBusy" in js, "Missing deeplinkBusy state"
Expand Down Expand Up @@ -210,18 +211,21 @@ def test_index_guide_wizard(self):
assert "guide-progress" in html, "Missing guide-progress (执行进度条)"
assert "正在为" in html, "Missing 执行文案"
assert "guide-conclusion-row" in html, "Missing guide-conclusion-row (结论行)"
# Enchante 专属入口:MCP 走 deeplink;Agent(2026-08-26 起,真机测试反馈后二次修正)
# 改为纯文字「配置 Agent 参考使用手册」+ 手册链接,不放开关(不可点的开关本身无信息量)
# Enchante 专属入口:MCP 走 deeplink;Agent(2026-08-26 起,三次修正后定稿)
# 纯文字「配置 Agent 参考使用手册」,不放开关、不带任何手册链接(手册没打包,
# 链接指向的是开发机本地路径,2026-08-26 决定连链接一起下线,只留文字提示)
assert "⚡ 生成 MCP 链接" in html, "Missing Enchante MCP deeplink 按钮"
assert "⚡ 生成 Agent 链接" not in html, "Enchante Agent deeplink 按钮应已移除(改为使用手册引导)"
assert "deeplinkClickedFor" in html, "Missing deeplinkClickedFor (Enchante 点击后态,按 kind)"
assert "generateEnchanteDeeplink('Enchante', 'mcp')" in html, "Missing MCP deeplink handler (kind=mcp)"
assert "generateEnchanteDeeplink('Enchante', 'agent')" not in html, \
"Agent deeplink handler 调用应已移除(改为 openEnchanteAgentManual)"
"Agent deeplink handler 调用应已移除(改为纯文字提示)"
assert "需手动安装" in html, "Missing Enchante「需手动安装」说明"
assert "请先安装 Enchanté" in html, "Missing Enchante 未安装防御提示"
assert "配置 Agent 参考使用手册" in html, "Missing 引导页 Enchante Agent 文案(结论页专属,非设置页那句「参考使用手册」)"
assert "openEnchanteAgentManual" in html, "Missing openEnchanteAgentManual (使用手册打开入口)"
assert "openEnchanteAgentManual" not in html, \
"openEnchanteAgentManual 应已移除(手册链接下线,只留纯文字提示)"
assert "ai-platform-row__manual-link" not in html, "手册链接元素应已移除"

def test_index_settings_modal_markup(self):
"""配置 modal:settings-nav 5 平级 + settings-body 分组页 + 5 态开关"""
Expand Down Expand Up @@ -382,7 +386,7 @@ def test_standalone_contains_stage3(self):
"connectionClass", "connectionLabel", "connectionTooltip",
"connection-tip", "connection-dot",
"guide-modal", "guideStep1Valid", "guide-platform-row", "guide-progress",
"⚡ 生成 MCP 链接", "参考使用手册", "配置 Agent 参考使用手册", "openEnchanteAgentManual",
"⚡ 生成 MCP 链接", "参考使用手册", "配置 Agent 参考使用手册",
"企业名称", "组织代码", "guideExecute", "deeplinkClickedFor",
# 桌面壳隔离片段(sidebar-titlebar / 关闭 modal / 关闭行为卡)
"sidebar-titlebar", "desktop-close-modal", "desktopCloseChoice",
Expand Down Expand Up @@ -635,8 +639,8 @@ def vnext():
expect(page.locator(".guide-conclusion-row:visible").first).to_be_visible(timeout=3000)
expect(page.locator(".guide-modal", has_text="你可以在 设置 → MCP / Hooks / Agent 中查看或调整")).to_be_visible(timeout=3000)
# 若选了 Enchante:结论行 MCP 仍是专属 deeplink 按钮(初始态「⚡ 生成 MCP 链接」);
# Agent(2026-08-26 起,真机测试反馈第二次修正:去掉了置灰开关,纯文字更清楚)
# 改为纯文字「配置 Agent 参考使用手册」+ 手册链接,不再生成安装链接,也不放开关
# Agent(2026-08-26 起,三次修正后定稿:去掉了置灰开关,也去掉了手册链接,
# 只留纯文字「配置 Agent 参考使用手册」,不再生成安装链接,也不带任何链接)
enchante_row = page.locator(".guide-conclusion-row", has_text="Enchanté")
if selected_key == "Enchante":
mcp_btn = enchante_row.locator(".btn--deeplink")
Expand All @@ -645,7 +649,7 @@ def vnext():
expect(mcp_btn).to_contain_text("⚡ 生成 MCP 链接") # 初始态(未点击)
expect(enchante_row.locator(".toggle")).to_have_count(0) # Agent 不再有任何开关
expect(enchante_row).to_contain_text("配置 Agent 参考使用手册")
expect(enchante_row.locator(".ai-platform-row__manual-link")).to_be_visible(timeout=3000)
expect(enchante_row.locator(".ai-platform-row__manual-link")).to_have_count(0) # 手册链接已下线
# 2.2 完成后「下一步」enabled → Step3 完成
expect(vnext()).to_be_enabled(timeout=3000)
vnext().click()
Expand Down
Loading