From 7f60b0a79bb01509154f9a8f42931e22f6ee1cf9 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Thu, 7 May 2026 16:39:19 +0800 Subject: [PATCH] fix: multi-user isolation and sqlor-compatible queries - Replace all sor.sqlExe(ORDER BY/LIMIT) with sor.R(ns={sort:...}) pattern - _get_config: add user_id parameter and filter - _find_relevant_skills: use sor.R with $or and $like filters - list_reasoning_sessions: use sor.R with ns sort and Python slicing - All queries now include user_id filter for multi-user isolation --- harnessed_reasoning/.core.py.swp | Bin 0 -> 16384 bytes .../__pycache__/core.cpython-311.pyc | Bin 41707 -> 41638 bytes harnessed_reasoning/core.py | 32 ++++++++++-------- 3 files changed, 17 insertions(+), 15 deletions(-) create mode 100644 harnessed_reasoning/.core.py.swp diff --git a/harnessed_reasoning/.core.py.swp b/harnessed_reasoning/.core.py.swp new file mode 100644 index 0000000000000000000000000000000000000000..2d17f3dffb4250393b5157745c92f14049c99b33 GIT binary patch literal 16384 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 W-xJ_vA3vEaRULGTw29EwVD>*kfvZ*k literal 0 HcmV?d00001 diff --git a/harnessed_reasoning/__pycache__/core.cpython-311.pyc b/harnessed_reasoning/__pycache__/core.cpython-311.pyc index fac43591212c975d9b6b35383e1fd49ca405f264..8ee1b1161aec8e9735eb03e80719a199f4e919d4 100644 GIT binary patch delta 7354 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 delta 7492 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 diff --git a/harnessed_reasoning/core.py b/harnessed_reasoning/core.py index 5f7df9a..7093feb 100644 --- a/harnessed_reasoning/core.py +++ b/harnessed_reasoning/core.py @@ -117,8 +117,8 @@ class HermesReasoningEngine: # Config helpers # -------------------------------------------------------- - async def _get_config(self) -> Dict[str, Any]: - """Get reasoning config from DB, fall back to defaults.""" + async def _get_config(self, user_id: str = None) -> Dict[str, Any]: + """Get reasoning config from DB for current user, fall back to defaults.""" try: env = ServerEnv() dbname = env.get_module_dbname('harnessed_reasoning') @@ -127,8 +127,10 @@ class HermesReasoningEngine: try: async with self.db.sqlorContext(dbname) as sor: - sql = "SELECT * FROM harnessed_reasoning_config ORDER BY updated_at DESC LIMIT 1" - rows = await sor.sqlExe(sql, {}) + where = {} + if user_id: + where['user_id'] = user_id + rows = await sor.R('harnessed_reasoning_config', where if where else None, ns={'sort': 'updated_at desc'}) if rows: return rows[0] except Exception as e: @@ -196,15 +198,14 @@ class HermesReasoningEngine: try: async with self.db.sqlorContext('default') as sor: for kw in list(keywords)[:3]: - sql = """SELECT * FROM hermes_skills - WHERE user_id = :user_id - AND (name LIKE :kw1 OR description LIKE :kw2) - LIMIT 2""" - rows = await sor.sqlExe(sql, { - 'user_id': user_id, - 'kw1': f'%{kw}%', - 'kw2': f'%{kw}%' + rows = await sor.R('hermes_skills', { + 'user_id': user_id, + '$or': [ + {'name': {'$like': f'%{kw}%'}}, + {'description': {'$like': f'%{kw}%'}} + ] }) + rows = (rows or [])[:2] skills.extend(rows) # Deduplicate @@ -433,7 +434,7 @@ class HermesReasoningEngine: except Exception: pass - config = await self._get_config() + config = await self._get_config(user_id) safety_mode = config.get('safety_mode', 'strict') result = { @@ -689,8 +690,9 @@ class HermesReasoningEngine: try: async with self.db.sqlorContext('default') as sor: - sql = f"SELECT * FROM harnessed_reasoning_sessions WHERE user_id = :user_id ORDER BY created_at DESC LIMIT {limit} OFFSET {offset}" - rows = await sor.sqlExe(sql, {'user_id': user_id}) + rows = await sor.R('harnessed_reasoning_sessions', {'user_id': user_id}, ns={'sort': 'created_at desc'}) + rows = rows or [] + rows = rows[offset:offset + limit] sessions = [] for s in rows: