* harmonyos_setup — 下载文档到本地知识库
*
* 首次使用时调用,从华为开发者官网爬取全部文档。
* 支持断点续爬,预计耗时 60-90 分钟。
*/
import { z } from 'zod';
import { crawlAll } from '../scraper/crawler.js';
import { isKnowledgeReady, getReferencesRoot, getTotalDocCount } from '../lib/knowledge.js';
const SetupInputSchema = z.object({
action: z.enum(['status', 'download', 'resume'])
.default('status')
.describe('操作类型: status=查看状态, download=开始下载, resume=继续下载'),
}).strict();
export function registerSetupTool(server) {
server.registerTool('harmonyos_setup', {
title: 'Setup Knowledge Base',
description: `管理本地 HarmonyOS 知识库的下载和状态。
首次使用时,需要从华为开发者官网下载全部文档到本地(~/.harmonyos-docs/)。
**操作:**
- status: 查看当前知识库状态(是否就绪、文档数量)
- download: 开始全量下载(约 10,843 篇文档,耗时 60-90 分钟,支持断点续爬)
- resume: 继续上次中断的下载
**注意:** download 是异步操作——调用后立即返回,下载在后台进行。使用 status 查看进度。`,
inputSchema: SetupInputSchema,
annotations: {
readOnlyHint: false,
destructiveHint: false,
idempotentHint: true,
openWorldHint: true,
},
}, async (params) => {
const rootPath = getReferencesRoot();
if (params.action === 'status') {
if (isKnowledgeReady()) {
const count = getTotalDocCount();
return {
content: [{
type: 'text',
text: `✅ 知识库已就绪\n\n路径: ${rootPath}\n文档数: ${count.toLocaleString()}\n\n可直接使用 harmonyos_search_docs 等工具查询。`,
}],
};
}
return {
content: [{
type: 'text',
text: `⚠️ 知识库未就绪\n\n预期路径: ${rootPath}\n\n请调用 harmonyos_setup 并设置 action="download" 开始下载文档。\n预计下载 10,843 篇文档,耗时约 60-90 分钟。`,
}],
};
}
if (params.action === 'download' || params.action === 'resume') {
if (isKnowledgeReady()) {
const count = getTotalDocCount();
return {
content: [{
type: 'text',
text: `✅ 知识库已存在(${count.toLocaleString()} 篇文档)\n\n如需重新下载,请先删除 ${rootPath} 目录。`,
}],
};
}
const lastProgress = { catalog: '', done: 0, total: 0, phase: 'tree', errors: 0 };
crawlAll(rootPath, (p) => {
Object.assign(lastProgress, p);
}).then(summary => {
console.error(`\n[harmonyos_setup] 下载完成: ${summary.totalDocs} 篇文档`);
}).catch(err => {
console.error(`\n[harmonyos_setup] 下载出错: ${err}`);
});
return {
content: [{
type: 'text',
text: `🚀 开始下载 HarmonyOS 文档到本地...
目标路径: ${rootPath}
预计耗时: 60-90 分钟
预计文档: ~10,843 篇
下载在后台进行,你可以:
- 稍后调用 harmonyos_setup action="status" 查看进度
- 下载完成后即可使用所有检索工具
当前状态: 正在获取文档树...`,
}],
};
}
return {
content: [{ type: 'text', text: `未知操作: ${params.action}` }],
};
});
}
* 检查知识库是否就绪,如果未就绪返回引导消息
* 用于在其他工具的 handler 开头调用
*/
export function guardKnowledge() {
if (isKnowledgeReady())
return null;
const rootPath = getReferencesRoot();
return `⚠️ 知识库尚未下载。\n\n请先调用 harmonyos_setup:\n- action="status" 查看状态\n- action="download" 开始下载 ${rootPath}\n\n预计 60-90 分钟完成下载。`;
}