Refactor session handling and auth flow
This commit is contained in:
parent
51c9aea63b
commit
37d8fab617
5 changed files with 674 additions and 646 deletions
|
|
@ -136,11 +136,10 @@ pub fn set_user_keyword(state: Arc<AppState>, user: UserSession, engine: &mut En
|
||||||
let state_for_spawn = Arc::clone(&state_clone);
|
let state_for_spawn = Arc::clone(&state_clone);
|
||||||
let user_clone_spawn = user_clone.clone();
|
let user_clone_spawn = user_clone.clone();
|
||||||
|
|
||||||
tokio::spawn(async move {
|
let mut session_manager =
|
||||||
let mut session_manager = state_for_spawn.session_manager.lock().await;
|
futures::executor::block_on(state_for_spawn.session_manager.lock());
|
||||||
|
|
||||||
if let Err(e) = session_manager.update_user_id(user_clone_spawn.id, user_id)
|
if let Err(e) = session_manager.update_user_id(user_clone_spawn.id, user_id) {
|
||||||
{
|
|
||||||
error!("Failed to update user ID in session: {}", e);
|
error!("Failed to update user ID in session: {}", e);
|
||||||
} else {
|
} else {
|
||||||
info!(
|
info!(
|
||||||
|
|
@ -148,7 +147,6 @@ pub fn set_user_keyword(state: Arc<AppState>, user: UserSession, engine: &mut En
|
||||||
user_clone_spawn.id, user_id
|
user_clone_spawn.id, user_id
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
debug!("Invalid UUID format for SET USER: {}", e);
|
debug!("Invalid UUID format for SET USER: {}", e);
|
||||||
|
|
|
||||||
|
|
@ -305,7 +305,7 @@ impl BotOrchestrator {
|
||||||
e
|
e
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
let bot_id = if let Ok(bot_guid) = std::env::var("BOT_GUID") {
|
let _bot_id = if let Ok(bot_guid) = std::env::var("BOT_GUID") {
|
||||||
Uuid::parse_str(&bot_guid).map_err(|e| {
|
Uuid::parse_str(&bot_guid).map_err(|e| {
|
||||||
warn!("Invalid BOT_GUID from env: {}", e);
|
warn!("Invalid BOT_GUID from env: {}", e);
|
||||||
e
|
e
|
||||||
|
|
@ -714,16 +714,6 @@ async fn websocket_handler(
|
||||||
let session_id_clone = session_id.clone();
|
let session_id_clone = session_id.clone();
|
||||||
let user_id_clone = user_id.clone();
|
let user_id_clone = user_id.clone();
|
||||||
|
|
||||||
tokio::spawn(async move {
|
|
||||||
tokio::time::sleep(tokio::time::Duration::from_millis(500)).await;
|
|
||||||
if let Err(e) = orchestrator_clone
|
|
||||||
.trigger_auto_welcome(&session_id_clone, &user_id_clone, &bot_id, None)
|
|
||||||
.await
|
|
||||||
{
|
|
||||||
error!("Failed to trigger auto welcome: {}", e);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
let web_adapter = data.web_adapter.clone();
|
let web_adapter = data.web_adapter.clone();
|
||||||
let session_id_clone1 = session_id.clone();
|
let session_id_clone1 = session_id.clone();
|
||||||
let session_id_clone2 = session_id.clone();
|
let session_id_clone2 = session_id.clone();
|
||||||
|
|
@ -855,7 +845,7 @@ async fn auth_handler(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
let session_id_clone = session.id.clone();
|
||||||
let auth_script_path = "./templates/annoucements.gbai/annoucements.gbdialog/auth.bas";
|
let auth_script_path = "./templates/annoucements.gbai/annoucements.gbdialog/auth.bas";
|
||||||
let auth_script = match std::fs::read_to_string(auth_script_path) {
|
let auth_script = match std::fs::read_to_string(auth_script_path) {
|
||||||
Ok(content) => content,
|
Ok(content) => content,
|
||||||
|
|
@ -863,15 +853,41 @@ async fn auth_handler(
|
||||||
};
|
};
|
||||||
|
|
||||||
let script_service = crate::basic::ScriptService::new(Arc::clone(&data), session.clone());
|
let script_service = crate::basic::ScriptService::new(Arc::clone(&data), session.clone());
|
||||||
if let Err(e) = script_service
|
match script_service
|
||||||
.compile(&auth_script)
|
.compile(&auth_script)
|
||||||
.and_then(|ast| script_service.run(&ast))
|
.and_then(|ast| script_service.run(&ast))
|
||||||
{
|
{
|
||||||
error!("Failed to run auth script: {}", e);
|
Ok(result) => {
|
||||||
return Ok(
|
if result.to_string() == "false" {
|
||||||
HttpResponse::InternalServerError().json(serde_json::json!({"error": "Auth failed"}))
|
error!("Auth script returned false, authentication failed");
|
||||||
);
|
return Ok(HttpResponse::Unauthorized()
|
||||||
|
.json(serde_json::json!({"error": "Authentication failed"})));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
Err(e) => {
|
||||||
|
error!("Failed to run auth script: {}", e);
|
||||||
|
return Ok(HttpResponse::InternalServerError()
|
||||||
|
.json(serde_json::json!({"error": "Auth failed"})));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let session = {
|
||||||
|
let mut sm = data.session_manager.lock().await;
|
||||||
|
|
||||||
|
match sm.get_session_by_id(session_id_clone) {
|
||||||
|
Ok(Some(s)) => s,
|
||||||
|
Ok(None) => {
|
||||||
|
error!("Failed to retrieve session");
|
||||||
|
return Ok(HttpResponse::InternalServerError()
|
||||||
|
.json(serde_json::json!({"error": "Failed to retrieve session"})));
|
||||||
|
}
|
||||||
|
Err(e) => {
|
||||||
|
error!("Failed to retrieve session: {}", e);
|
||||||
|
return Ok(HttpResponse::InternalServerError()
|
||||||
|
.json(serde_json::json!({"error": e.to_string()})));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
Ok(HttpResponse::Ok().json(serde_json::json!({
|
Ok(HttpResponse::Ok().json(serde_json::json!({
|
||||||
"user_id": session.user_id,
|
"user_id": session.user_id,
|
||||||
|
|
|
||||||
|
|
@ -6,3 +6,4 @@ REM user = FIND "users", "external_id=" + result.user_id
|
||||||
REM SET_USER user.id
|
REM SET_USER user.id
|
||||||
|
|
||||||
SET_USER "92fcffaa-bf0a-41a9-8d99-5541709d695b"
|
SET_USER "92fcffaa-bf0a-41a9-8d99-5541709d695b"
|
||||||
|
return true;
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
TALK "Welcome to General Bots!"
|
TALK "Oi from BASIC"
|
||||||
|
|
||||||
REM text = GET "default.pdf"
|
REM text = GET "default.pdf"
|
||||||
REM resume = LLM "Build a resume from " + text
|
REM resume = LLM "Say Hello and present a a resume from " + text
|
||||||
REM TALK resume
|
REM TALK resume
|
||||||
|
|
||||||
REM SET_CONTEXT text
|
REM SET_CONTEXT text
|
||||||
|
|
|
||||||
|
|
@ -270,7 +270,10 @@
|
||||||
const wsUrl =
|
const wsUrl =
|
||||||
"ws://" +
|
"ws://" +
|
||||||
window.location.host +
|
window.location.host +
|
||||||
"/ws?session_id=" + currentSessionId + "&user_id=" + currentUserId;
|
"/ws?session_id=" +
|
||||||
|
currentSessionId +
|
||||||
|
"&user_id=" +
|
||||||
|
currentUserId;
|
||||||
ws = new WebSocket(wsUrl);
|
ws = new WebSocket(wsUrl);
|
||||||
|
|
||||||
ws.onmessage = function (event) {
|
ws.onmessage = function (event) {
|
||||||
|
|
@ -281,7 +284,19 @@
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!response.is_complete) {
|
// Handle normal complete messages (like from TALK)
|
||||||
|
if (response.is_complete) {
|
||||||
|
isStreaming = false;
|
||||||
|
streamingMessageId = null;
|
||||||
|
// Only add message if there's actual content
|
||||||
|
if (
|
||||||
|
response.content &&
|
||||||
|
response.content.trim() !== ""
|
||||||
|
) {
|
||||||
|
addMessage("assistant", response.content);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Handle streaming messages
|
||||||
if (!isStreaming) {
|
if (!isStreaming) {
|
||||||
isStreaming = true;
|
isStreaming = true;
|
||||||
streamingMessageId = "streaming-" + Date.now();
|
streamingMessageId = "streaming-" + Date.now();
|
||||||
|
|
@ -294,9 +309,6 @@
|
||||||
} else {
|
} else {
|
||||||
updateLastMessage(response.content);
|
updateLastMessage(response.content);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
isStreaming = false;
|
|
||||||
streamingMessageId = null;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -305,7 +317,7 @@
|
||||||
"Connected to WebSocket with session:",
|
"Connected to WebSocket with session:",
|
||||||
currentSessionId,
|
currentSessionId,
|
||||||
"user:",
|
"user:",
|
||||||
currentUserId
|
currentUserId,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -360,7 +372,8 @@
|
||||||
|
|
||||||
function hideThinkingIndicator() {
|
function hideThinkingIndicator() {
|
||||||
if (!isThinking) return;
|
if (!isThinking) return;
|
||||||
const thinkingDiv = document.getElementById("thinking-indicator");
|
const thinkingDiv =
|
||||||
|
document.getElementById("thinking-indicator");
|
||||||
if (thinkingDiv) {
|
if (thinkingDiv) {
|
||||||
thinkingDiv.remove();
|
thinkingDiv.remove();
|
||||||
}
|
}
|
||||||
|
|
@ -605,7 +618,8 @@
|
||||||
"Isso parece ótimo",
|
"Isso parece ótimo",
|
||||||
"Estou ouvindo sua voz",
|
"Estou ouvindo sua voz",
|
||||||
];
|
];
|
||||||
const randomPhrase = phrases[Math.floor(Math.random() * phrases.length)];
|
const randomPhrase =
|
||||||
|
phrases[Math.floor(Math.random() * phrases.length)];
|
||||||
|
|
||||||
if (voiceRoom) {
|
if (voiceRoom) {
|
||||||
const message = {
|
const message = {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue