feat: Page AI Reasonix desktop session alignment, settings IA cleanup, knowledge RAG hardening

- ACP client/session manager: Reasonix desktop live session context
- Hermes tools: knowledge_rag tool manifest and skill updates
- Browser runtime: sidebar page AI permission/profile/render/session/tree modules
- Routes: hermes_client, hermes_tools, knowledge_rag, web_shell
- Scripts: reasonix ACP wrapper, LightRAG MCP, smoke tasks 159/558/559/561/562
- Skills: mnote-knowledge-rag and mnote-lightrag-bridge SKILL.md updates
This commit is contained in:
lix-2026
2026-06-13 22:20:01 +08:00
parent 2236a053c0
commit 4a7efd4a30
30 changed files with 5321 additions and 291 deletions
File diff suppressed because it is too large Load Diff
@@ -374,6 +374,9 @@ pub(crate) async fn execute_mnote_tool_call(
}
"mnote.knowledge_rag.status" => knowledge_rag::status(&state, &context, &input).await,
"mnote.knowledge_rag.query" => knowledge_rag::query(&state, &context, &input).await,
"mnote.knowledge_rag.section_context" => {
knowledge_rag::section_context(&state, &context, &input).await
}
"mnote.knowledge_rag.open_reference" => {
knowledge_rag::open_reference(&state, &context, &input).await
}
@@ -726,6 +729,7 @@ fn is_read_tool(tool_name: &str) -> bool {
| "mnote.evidence.open"
| "mnote.knowledge_rag.status"
| "mnote.knowledge_rag.query"
| "mnote.knowledge_rag.section_context"
| "mnote.knowledge_rag.open_reference"
| "mnote.index.status"
| "mnote.index.refresh"
@@ -758,6 +762,7 @@ fn is_evidence_receipt_tool(tool_name: &str) -> bool {
| "mnote.evidence.open"
| "mnote.knowledge_rag.status"
| "mnote.knowledge_rag.query"
| "mnote.knowledge_rag.section_context"
| "mnote.knowledge_rag.open_reference"
)
}
File diff suppressed because it is too large Load Diff
+46
View File
@@ -91,6 +91,10 @@ pub fn build_router(state: AppState) -> Router {
.route("/api/knowledge-rag/ingest", post(knowledge_rag::ingest))
.route("/api/knowledge-rag/search", post(knowledge_rag::search))
.route("/api/knowledge-rag/query", post(knowledge_rag::query_rag))
.route(
"/api/knowledge-rag/section-context",
post(knowledge_rag::section_context),
)
.route(
"/api/knowledge-rag/open-reference",
post(knowledge_rag::open_reference),
@@ -517,6 +521,46 @@ pub fn build_router(state: AppState) -> Router {
"/api/page-ai/sessions/{session_id}/active-run",
get(hermes_client::get_page_ai_session_active_run),
)
.route(
"/api/page-ai/runtime/status",
get(hermes_client::get_page_ai_runtime_status),
)
.route(
"/api/page-ai/runtime/reset",
post(hermes_client::reset_page_ai_runtime),
)
.route(
"/api/page-ai/sessions",
get(hermes_client::list_sessions).post(hermes_client::create_session),
)
.route(
"/api/page-ai/sessions/search",
get(hermes_client::search_sessions),
)
.route(
"/api/page-ai/sessions/{session_id}",
get(hermes_client::get_session).delete(hermes_client::delete_session),
)
.route(
"/api/page-ai/sessions/{session_id}/resume",
post(hermes_client::resume_session),
)
.route(
"/api/page-ai/sessions/{session_id}/rename",
post(hermes_client::rename_session),
)
.route(
"/api/page-ai/sessions/{session_id}/export",
get(hermes_client::export_session),
)
.route(
"/api/page-ai/sessions/{session_id}/auto-title",
post(hermes_client::auto_title_session),
)
.route(
"/api/page-ai/sessions/{session_id}/queue/{queue_id}",
delete(hermes_client::cancel_queued_run),
)
.route(
"/api/onlyoffice/bridge/commands",
post(onlyoffice_bridge::enqueue_command),
@@ -936,6 +980,8 @@ mod tests {
assert!(!html.contains(">下载<"));
assert!(html.contains(r#"data-page-width-content-type="word""#));
assert!(html.contains("applyPreviewWidthPreference"));
assert!(html.contains("data-mnote-office-preview-footnotes-disabled"));
assert!(html.contains("renderFootnotes: false"));
}
#[tokio::test]
+16 -2
View File
@@ -1930,13 +1930,27 @@ pub async fn office_preview_page(Query(query): Query<OfficePreviewQuery>) -> Res
}}
const buffer = await fetchArrayBuffer();
viewer.replaceChildren();
await window.docx.renderAsync(buffer, viewer, null, {{
const options = {{
className: 'mnote-docx',
inWrapper: true,
breakPages: true,
renderHeaders: true,
renderFooters: true
}});
}};
try {{
await window.docx.renderAsync(buffer, viewer, null, options);
}} catch (error) {{
if (!String(error && error.message || '').includes("reading 'type'")) {{
throw error;
}}
viewer.replaceChildren();
document.documentElement.setAttribute('data-mnote-office-preview-footnotes-disabled', 'true');
await window.docx.renderAsync(buffer.slice(0), viewer, null, {{
...options,
renderFootnotes: false,
renderEndnotes: false
}});
}}
}}
async function renderWorkbook() {{