集成 OpenHub 与 WeKnora Page AI

This commit is contained in:
Agent Board
2026-06-26 20:01:02 +08:00
parent dabaf03bd7
commit e433c07061
63 changed files with 12678 additions and 332 deletions
+38 -4
View File
@@ -1,6 +1,7 @@
use crate::app::AppState;
use crate::context::RequestContext;
use crate::error::WebError;
use crate::provider_identity_sync::sync_provider_identities;
use crate::routes::local_folder_source::{
control_plane_db_path_display, create_default_local_workspace_for_actor,
ensure_local_workspace_read_access_with_state, is_local_access_policy_admin_context,
@@ -136,7 +137,7 @@ pub async fn auth_api(
return Ok(build_sqlite_sign_out_response(&state, &context));
}
handle_sqlite_auth_action(&state, &context, &payload)
handle_sqlite_auth_action(&state, &context, &payload).await
}
pub async fn auth_entry(
@@ -2069,7 +2070,7 @@ fn has_real_auth_context(state: &AppState, context: &RequestContext) -> bool {
|| extract_cookie_value(context, COOKIE_MNOTE_WEB_CONVEX_TOKEN).is_some()
}
fn handle_sqlite_auth_action(
async fn handle_sqlite_auth_action(
state: &AppState,
context: &RequestContext,
payload: &serde_json::Value,
@@ -2098,6 +2099,7 @@ fn handle_sqlite_auth_action(
})?;
let session_token = new_session_token();
let token_hash = session_token_hash(&session_token);
let password_for_provider_sync = password.clone();
let resolved = if flow == "signUp" {
let email = params
.get("email")
@@ -2200,14 +2202,46 @@ fn handle_sqlite_auth_action(
.unwrap_or_else(|_| "{}".to_string()),
});
Ok(build_sqlite_auth_response(
let provider_sync_results = if flow == "signUp" {
let results = sync_provider_identities(&resolved.user, &password_for_provider_sync).await;
let _ = state.control_plane().append_audit(AppendAuditInput {
actor_user_id: Some(resolved.user.id.clone()),
action: "control.auth.provider_identities_synced".to_string(),
target_kind: "user".to_string(),
target_id: Some(resolved.user.id.clone()),
metadata_json: serde_json::to_string(&json!({
"providers": results.iter().map(|item| json!({
"provider": item.provider,
"ok": item.ok,
"message": item.message,
"providerUserId": item.provider_user_id,
})).collect::<Vec<_>>(),
}))
.unwrap_or_else(|_| "{}".to_string()),
});
Some(results)
} else {
None
};
let mut response = build_sqlite_auth_response(
context,
&session_token,
&resolved.user.id,
resolved.user.email.as_deref().unwrap_or_default(),
&resolved.user.display_name,
&effective_sqlite_auth_actor_type(&resolved.user.id, &resolved.user.role),
))
);
if let Some(results) = provider_sync_results {
let all_ok = results.iter().all(|item| item.ok);
let header_value = if all_ok { "ok" } else { "partial" };
if let Ok(value) = HeaderValue::from_str(header_value) {
response
.headers_mut()
.insert("x-mnote-provider-identity-sync", value);
}
}
Ok(response)
}
fn sqlite_auth_error(