Merge remote-tracking branch 'origin/dev' into test-main-dev-merge-20260615

# Conflicts:
#	src/tool_implementations.py
#	static/js/research/panel.js
This commit is contained in:
pewdiepie-archdaemon
2026-06-15 21:20:15 +09:00
312 changed files with 20047 additions and 2952 deletions
+52 -29
View File
@@ -1324,7 +1324,10 @@ class TaskScheduler:
db.commit()
if self._session_manager:
try:
self._session_manager.sessions[session_id] = self._session_manager._db_to_session(sess)
self._session_manager.ensure_task_session(
session_id, f"[Task] {task.name}", endpoint_url, model,
owner=task.owner, task=task
)
except Exception:
pass
@@ -1430,6 +1433,7 @@ class TaskScheduler:
task's visible output target.
"""
from core.database import Session as DbSession, ChatMessage, CrewMember
from core.models import ChatMessage as MemChatMessage
output = task.output_target or "session"
if (
@@ -1486,7 +1490,10 @@ class TaskScheduler:
db.commit()
if self._session_manager:
try:
self._session_manager.sessions[session_id] = self._session_manager._db_to_session(sess)
self._session_manager.ensure_task_session(
session_id, f"[Task] {task.name}", endpoint_url, model_name,
owner=task.owner, task=task
)
except Exception:
pass
@@ -1495,36 +1502,50 @@ class TaskScheduler:
meta["model"] = model_name
if crew and crew.is_default_assistant:
meta.update({"source": "cron", "task_id": task.id, "task_name": task.name})
msg_meta = json.dumps(meta)
user_content = task.prompt or f"[Task] {task.name}"
user_msg = ChatMessage(
id=str(uuid.uuid4()),
session_id=session_id,
role="user",
content=user_content,
timestamp=_utcnow(),
meta_data=msg_meta,
)
assistant_msg = ChatMessage(
id=str(uuid.uuid4()),
session_id=session_id,
role="assistant",
content=result or "",
timestamp=_utcnow(),
meta_data=msg_meta,
)
db.add(user_msg)
db.add(assistant_msg)
db.commit()
if self._session_manager:
# Use SessionManager for persistence so in-memory cache stays in sync
if self._session_manager and session_id:
try:
from core.models import ChatMessage as MemMsg
sess_obj = self._session_manager.get_session(session_id)
sess_obj.history.append(MemMsg(role="user", content=user_msg.content, metadata=meta))
sess_obj.history.append(MemMsg(role="assistant", content=assistant_msg.content, metadata=meta))
self._session_manager.add_message(
session_id,
MemChatMessage(
"user",
task.prompt or f"[Task] {task.name}",
metadata=dict(meta),
),
)
self._session_manager.add_message(
session_id,
MemChatMessage(
"assistant",
result or "",
metadata=dict(meta),
),
)
except Exception:
pass
logger.exception("Failed to deliver task %s through SessionManager", task.id)
else:
# Fallback: raw DB write (no session manager available)
msg_meta = json.dumps(meta)
user_msg = ChatMessage(
id=str(uuid.uuid4()),
session_id=session_id,
role="user",
content=task.prompt or f"[Task] {task.name}",
timestamp=_utcnow(),
meta_data=msg_meta,
)
assistant_msg = ChatMessage(
id=str(uuid.uuid4()),
session_id=session_id,
role="assistant",
content=result or "",
timestamp=_utcnow(),
meta_data=msg_meta,
)
db.add(user_msg)
db.add(assistant_msg)
db.commit()
@staticmethod
def _is_email_output_target(output: str) -> bool:
@@ -1641,6 +1662,8 @@ class TaskScheduler:
data = json.loads(event_str[6:])
# Capture text from all event types, not just delta
if "delta" in data:
if data.get("thinking"):
continue
full_text += data["delta"]
elif data.get("type") == "tool_output":
# Tool results — capture summary so we have SOMETHING even