2026-05-14 15:10:33 +08:00
|
|
|
use serde_json::{json, Value};
|
|
|
|
|
|
|
|
|
|
pub const MANIFEST_SCHEMA_VERSION: &str = "mnote.hermes_tool_manifest.v1";
|
|
|
|
|
pub const TOOL_SCHEMA_VERSION: &str = "mnote.hermes_tool.v1";
|
|
|
|
|
|
|
|
|
|
pub fn manifest() -> Value {
|
|
|
|
|
json!({
|
|
|
|
|
"schemaVersion": MANIFEST_SCHEMA_VERSION,
|
|
|
|
|
"plugin": {
|
|
|
|
|
"name": "mnote",
|
|
|
|
|
"description": "mnote 页面、树、artifact 与 edge 工具",
|
|
|
|
|
"runtimeOwner": "mnote-web",
|
|
|
|
|
"writeOwner": "rust-runtime-kernel"
|
|
|
|
|
},
|
|
|
|
|
"tools": [
|
|
|
|
|
page_get_tool(),
|
2026-05-16 12:34:48 +08:00
|
|
|
page_save_tool(),
|
|
|
|
|
available_tool("mnote.page.update_title", "更新当前页面标题", ["page.write"]),
|
|
|
|
|
available_tool("mnote.page.update_options", "更新当前页面设置", ["page.write"]),
|
|
|
|
|
available_tool("mnote.artifact.create_summary", "为当前页面创建或更新 AI Summary", ["artifact.write"]),
|
|
|
|
|
available_tool("mnote.artifact.create_ai_note", "基于当前页面创建新的 AI Note", ["artifact.write"])
|
2026-05-14 15:10:33 +08:00
|
|
|
]
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn page_get_tool() -> Value {
|
|
|
|
|
json!({
|
|
|
|
|
"name": "mnote.page.get",
|
|
|
|
|
"description": "读取当前页面 Page Aggregate 摘要",
|
|
|
|
|
"schemaVersion": TOOL_SCHEMA_VERSION,
|
|
|
|
|
"capabilityScope": ["page.read"],
|
|
|
|
|
"inputSchema": {
|
|
|
|
|
"type": "object",
|
|
|
|
|
"required": ["workspaceId", "documentId", "sessionId", "runId", "toolCallId", "traceId"],
|
|
|
|
|
"properties": {
|
|
|
|
|
"workspaceId": { "type": "string" },
|
|
|
|
|
"documentId": { "type": "string" },
|
|
|
|
|
"sessionId": { "type": "string" },
|
|
|
|
|
"runId": { "type": "string" },
|
|
|
|
|
"toolCallId": { "type": "string" },
|
|
|
|
|
"traceId": { "type": "string" },
|
|
|
|
|
"includeBody": { "type": "boolean", "default": true },
|
|
|
|
|
"includeOptions": { "type": "boolean", "default": true },
|
|
|
|
|
"includeBlocks": { "type": "boolean", "default": true }
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-16 12:34:48 +08:00
|
|
|
fn page_save_tool() -> Value {
|
2026-05-14 15:10:33 +08:00
|
|
|
json!({
|
2026-05-16 12:34:48 +08:00
|
|
|
"name": "mnote.page.save",
|
|
|
|
|
"description": "保存当前页面正文;replace 覆盖正文,append/prepend 会先读取当前 Page Aggregate 后合成完整正文再保存",
|
2026-05-14 15:10:33 +08:00
|
|
|
"schemaVersion": TOOL_SCHEMA_VERSION,
|
2026-05-16 12:34:48 +08:00
|
|
|
"capabilityScope": ["page.write"],
|
|
|
|
|
"status": "available",
|
|
|
|
|
"inputSchema": {
|
|
|
|
|
"type": "object",
|
|
|
|
|
"required": ["workspaceId", "documentId", "sessionId", "runId", "toolCallId", "traceId", "content", "dryRun", "idempotencyKey"],
|
|
|
|
|
"properties": {
|
|
|
|
|
"workspaceId": { "type": "string" },
|
|
|
|
|
"documentId": { "type": "string" },
|
|
|
|
|
"sessionId": { "type": "string" },
|
|
|
|
|
"runId": { "type": "string" },
|
|
|
|
|
"toolCallId": { "type": "string" },
|
|
|
|
|
"traceId": { "type": "string" },
|
|
|
|
|
"content": {
|
|
|
|
|
"description": "要写入的正文块数组、{blocks:[...]}、TipTap content 数组或纯文本",
|
|
|
|
|
"type": ["array", "object", "string"]
|
|
|
|
|
},
|
|
|
|
|
"mode": {
|
|
|
|
|
"type": "string",
|
|
|
|
|
"enum": ["replace", "append", "prepend"],
|
|
|
|
|
"default": "replace"
|
|
|
|
|
},
|
|
|
|
|
"dryRun": { "type": "boolean" },
|
|
|
|
|
"idempotencyKey": { "type": "string" }
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn available_tool(
|
|
|
|
|
name: &str,
|
|
|
|
|
description: &str,
|
|
|
|
|
scope: impl IntoIterator<Item = &'static str>,
|
|
|
|
|
) -> Value {
|
|
|
|
|
json!({
|
|
|
|
|
"name": name,
|
|
|
|
|
"description": description,
|
|
|
|
|
"schemaVersion": TOOL_SCHEMA_VERSION,
|
2026-05-14 15:10:33 +08:00
|
|
|
"capabilityScope": scope.into_iter().collect::<Vec<_>>(),
|
2026-05-16 12:34:48 +08:00
|
|
|
"status": "available"
|
2026-05-14 15:10:33 +08:00
|
|
|
})
|
|
|
|
|
}
|