myagent-ai 1.23.80 → 1.23.82
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/core/agent_storage.py +0 -0
- package/data/novnc/lib/base64.js +0 -0
- package/data/novnc/lib/decoders/copyrect.js +0 -0
- package/data/novnc/lib/decoders/hextile.js +0 -0
- package/data/novnc/lib/decoders/jpeg.js +0 -0
- package/data/novnc/lib/decoders/raw.js +0 -0
- package/data/novnc/lib/decoders/rre.js +0 -0
- package/data/novnc/lib/decoders/tight.js +0 -0
- package/data/novnc/lib/decoders/tightpng.js +0 -0
- package/data/novnc/lib/decoders/zrle.js +0 -0
- package/data/novnc/lib/deflator.js +0 -0
- package/data/novnc/lib/des.js +0 -0
- package/data/novnc/lib/display.js +0 -0
- package/data/novnc/lib/encodings.js +0 -0
- package/data/novnc/lib/inflator.js +0 -0
- package/data/novnc/lib/input/domkeytable.js +0 -0
- package/data/novnc/lib/input/fixedkeys.js +0 -0
- package/data/novnc/lib/input/gesturehandler.js +0 -0
- package/data/novnc/lib/input/keyboard.js +0 -0
- package/data/novnc/lib/input/keysym.js +0 -0
- package/data/novnc/lib/input/keysymdef.js +0 -0
- package/data/novnc/lib/input/util.js +0 -0
- package/data/novnc/lib/input/vkeys.js +0 -0
- package/data/novnc/lib/input/xtscancodes.js +0 -0
- package/data/novnc/lib/ra2.js +0 -0
- package/data/novnc/lib/rfb.js +0 -0
- package/data/novnc/lib/util/browser.js +0 -0
- package/data/novnc/lib/util/cursor.js +0 -0
- package/data/novnc/lib/util/element.js +0 -0
- package/data/novnc/lib/util/events.js +0 -0
- package/data/novnc/lib/util/eventtarget.js +0 -0
- package/data/novnc/lib/util/int.js +0 -0
- package/data/novnc/lib/util/logging.js +0 -0
- package/data/novnc/lib/util/md5.js +0 -0
- package/data/novnc/lib/util/strings.js +0 -0
- package/data/novnc/lib/vendor/pako/lib/utils/common.js +0 -0
- package/data/novnc/lib/vendor/pako/lib/zlib/adler32.js +0 -0
- package/data/novnc/lib/vendor/pako/lib/zlib/constants.js +0 -0
- package/data/novnc/lib/vendor/pako/lib/zlib/crc32.js +0 -0
- package/data/novnc/lib/vendor/pako/lib/zlib/deflate.js +0 -0
- package/data/novnc/lib/vendor/pako/lib/zlib/gzheader.js +0 -0
- package/data/novnc/lib/vendor/pako/lib/zlib/inffast.js +0 -0
- package/data/novnc/lib/vendor/pako/lib/zlib/inflate.js +0 -0
- package/data/novnc/lib/vendor/pako/lib/zlib/inftrees.js +0 -0
- package/data/novnc/lib/vendor/pako/lib/zlib/messages.js +0 -0
- package/data/novnc/lib/vendor/pako/lib/zlib/trees.js +0 -0
- package/data/novnc/lib/vendor/pako/lib/zlib/zstream.js +0 -0
- package/data/novnc/lib/websock.js +0 -0
- package/groups/manager.py +66 -0
- package/myagent/core/agent_storage.py +0 -0
- package/myagent/data/novnc/lib/base64.js +0 -0
- package/myagent/data/novnc/lib/decoders/copyrect.js +0 -0
- package/myagent/data/novnc/lib/decoders/hextile.js +0 -0
- package/myagent/data/novnc/lib/decoders/jpeg.js +0 -0
- package/myagent/data/novnc/lib/decoders/raw.js +0 -0
- package/myagent/data/novnc/lib/decoders/rre.js +0 -0
- package/myagent/data/novnc/lib/decoders/tight.js +0 -0
- package/myagent/data/novnc/lib/decoders/tightpng.js +0 -0
- package/myagent/data/novnc/lib/decoders/zrle.js +0 -0
- package/myagent/data/novnc/lib/deflator.js +0 -0
- package/myagent/data/novnc/lib/des.js +0 -0
- package/myagent/data/novnc/lib/display.js +0 -0
- package/myagent/data/novnc/lib/encodings.js +0 -0
- package/myagent/data/novnc/lib/inflator.js +0 -0
- package/myagent/data/novnc/lib/input/domkeytable.js +0 -0
- package/myagent/data/novnc/lib/input/fixedkeys.js +0 -0
- package/myagent/data/novnc/lib/input/gesturehandler.js +0 -0
- package/myagent/data/novnc/lib/input/keyboard.js +0 -0
- package/myagent/data/novnc/lib/input/keysym.js +0 -0
- package/myagent/data/novnc/lib/input/keysymdef.js +0 -0
- package/myagent/data/novnc/lib/input/util.js +0 -0
- package/myagent/data/novnc/lib/input/vkeys.js +0 -0
- package/myagent/data/novnc/lib/input/xtscancodes.js +0 -0
- package/myagent/data/novnc/lib/ra2.js +0 -0
- package/myagent/data/novnc/lib/rfb.js +0 -0
- package/myagent/data/novnc/lib/util/browser.js +0 -0
- package/myagent/data/novnc/lib/util/cursor.js +0 -0
- package/myagent/data/novnc/lib/util/element.js +0 -0
- package/myagent/data/novnc/lib/util/events.js +0 -0
- package/myagent/data/novnc/lib/util/eventtarget.js +0 -0
- package/myagent/data/novnc/lib/util/int.js +0 -0
- package/myagent/data/novnc/lib/util/logging.js +0 -0
- package/myagent/data/novnc/lib/util/md5.js +0 -0
- package/myagent/data/novnc/lib/util/strings.js +0 -0
- package/myagent/data/novnc/lib/vendor/pako/lib/utils/common.js +0 -0
- package/myagent/data/novnc/lib/vendor/pako/lib/zlib/adler32.js +0 -0
- package/myagent/data/novnc/lib/vendor/pako/lib/zlib/constants.js +0 -0
- package/myagent/data/novnc/lib/vendor/pako/lib/zlib/crc32.js +0 -0
- package/myagent/data/novnc/lib/vendor/pako/lib/zlib/deflate.js +0 -0
- package/myagent/data/novnc/lib/vendor/pako/lib/zlib/gzheader.js +0 -0
- package/myagent/data/novnc/lib/vendor/pako/lib/zlib/inffast.js +0 -0
- package/myagent/data/novnc/lib/vendor/pako/lib/zlib/inflate.js +0 -0
- package/myagent/data/novnc/lib/vendor/pako/lib/zlib/inftrees.js +0 -0
- package/myagent/data/novnc/lib/vendor/pako/lib/zlib/messages.js +0 -0
- package/myagent/data/novnc/lib/vendor/pako/lib/zlib/trees.js +0 -0
- package/myagent/data/novnc/lib/vendor/pako/lib/zlib/zstream.js +0 -0
- package/myagent/data/novnc/lib/websock.js +0 -0
- package/myagent/groups/manager.py +66 -0
- package/myagent/package.json +1 -1
- package/myagent/web/api_server.py +336 -10
- package/myagent/web/ui/admin/admin-agentchat.js +0 -0
- package/myagent/web/ui/admin/admin-agents.js +0 -0
- package/myagent/web/ui/admin/admin-core.js +14 -6
- package/myagent/web/ui/admin/admin-dashboard.js +0 -0
- package/myagent/web/ui/admin/admin-executor.js +0 -0
- package/myagent/web/ui/admin/admin-files.js +0 -0
- package/myagent/web/ui/admin/admin-llm.js +0 -0
- package/myagent/web/ui/admin/admin-logs.js +0 -0
- package/myagent/web/ui/admin/admin-memory.js +0 -0
- package/myagent/web/ui/admin/admin-org.js +0 -0
- package/myagent/web/ui/admin/admin-permissions.js +0 -0
- package/myagent/web/ui/admin/admin-platforms.js +0 -0
- package/myagent/web/ui/admin/admin-sessions.js +0 -0
- package/myagent/web/ui/admin/admin-skills.js +0 -0
- package/myagent/web/ui/admin/admin-system.js +0 -0
- package/myagent/web/ui/admin/admin-tasks.js +0 -0
- package/myagent/web/ui/chat/chat.css +2 -1
- package/myagent/web/ui/chat/chat.js +1 -1
- package/myagent/web/ui/chat/chat_main.js +40 -28
- package/myagent/web/ui/chat/groupchat.js +123 -22
- package/package.json +1 -1
- package/skills/fullstack-dev/SKILL.md +120 -952
- package/skills/pdf/SKILL.md +1 -7
- package/web/api_server.py +335 -0
- package/web/ui/admin/admin-agentchat.js +0 -0
- package/web/ui/admin/admin-agents.js +0 -0
- package/web/ui/admin/admin-core.js +14 -6
- package/web/ui/admin/admin-dashboard.js +0 -0
- package/web/ui/admin/admin-executor.js +0 -0
- package/web/ui/admin/admin-files.js +0 -0
- package/web/ui/admin/admin-llm.js +0 -0
- package/web/ui/admin/admin-logs.js +0 -0
- package/web/ui/admin/admin-memory.js +0 -0
- package/web/ui/admin/admin-org.js +0 -0
- package/web/ui/admin/admin-permissions.js +0 -0
- package/web/ui/admin/admin-platforms.js +0 -0
- package/web/ui/admin/admin-sessions.js +0 -0
- package/web/ui/admin/admin-skills.js +0 -0
- package/web/ui/admin/admin-system.js +0 -0
- package/web/ui/admin/admin-tasks.js +0 -0
- package/web/ui/chat/chat.css +2 -1
- package/web/ui/chat/chat.js +1 -1
- package/web/ui/chat/chat_main.js +40 -28
- package/web/ui/chat/groupchat.js +123 -22
- package/worklog.md +42 -0
package/core/agent_storage.py
CHANGED
|
File without changes
|
package/data/novnc/lib/base64.js
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/data/novnc/lib/des.js
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/data/novnc/lib/ra2.js
CHANGED
|
File without changes
|
package/data/novnc/lib/rfb.js
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/groups/manager.py
CHANGED
|
@@ -258,6 +258,14 @@ class GroupManager:
|
|
|
258
258
|
db_path = self._data_dir / "groups" / "messages.db"
|
|
259
259
|
self._db_conn = sqlite3.connect(str(db_path), check_same_thread=False)
|
|
260
260
|
self._db_conn.row_factory = sqlite3.Row
|
|
261
|
+
# [v1.23.81] 群聊 session 映射表(每个群一个纯数字 session ID)
|
|
262
|
+
self._db_conn.execute("""
|
|
263
|
+
CREATE TABLE IF NOT EXISTS group_sessions (
|
|
264
|
+
group_id TEXT PRIMARY KEY,
|
|
265
|
+
session_id TEXT NOT NULL UNIQUE,
|
|
266
|
+
created_at REAL NOT NULL
|
|
267
|
+
)
|
|
268
|
+
""")
|
|
261
269
|
self._db_conn.execute("""
|
|
262
270
|
CREATE TABLE IF NOT EXISTS group_messages (
|
|
263
271
|
id TEXT PRIMARY KEY,
|
|
@@ -638,6 +646,64 @@ class GroupManager:
|
|
|
638
646
|
|
|
639
647
|
return group
|
|
640
648
|
|
|
649
|
+
# ==================================================================
|
|
650
|
+
# [v1.23.81] 群聊 Session 管理(纯数字 ID,嵌入 URL 用于导航恢复)
|
|
651
|
+
# ==================================================================
|
|
652
|
+
|
|
653
|
+
def get_or_create_group_session(self, group_id: str) -> str:
|
|
654
|
+
"""
|
|
655
|
+
获取或创建群聊的 session ID。
|
|
656
|
+
每个群有且仅有一个 session ID(纯数字,以 9 开头,递增)。
|
|
657
|
+
此 session ID 用于前端 URL 参数,确保从后台管理返回时能正确恢复群聊视图。
|
|
658
|
+
"""
|
|
659
|
+
if not self._db_conn:
|
|
660
|
+
return ""
|
|
661
|
+
# 查找已有 session
|
|
662
|
+
row = self._db_conn.execute(
|
|
663
|
+
"SELECT session_id FROM group_sessions WHERE group_id = ?", (group_id,)
|
|
664
|
+
).fetchone()
|
|
665
|
+
if row:
|
|
666
|
+
return row["session_id"]
|
|
667
|
+
# 生成新的纯数字 session ID(9 开头,13 位数字,时间戳后 8 位 + 随机 4 位)
|
|
668
|
+
import random
|
|
669
|
+
ts_part = str(int(time.time()))[-8:]
|
|
670
|
+
rand_part = str(random.randint(1000, 9999))
|
|
671
|
+
new_sid = "9" + ts_part + rand_part # 共 13 位纯数字
|
|
672
|
+
# 确保唯一性
|
|
673
|
+
for _ in range(10):
|
|
674
|
+
existing = self._db_conn.execute(
|
|
675
|
+
"SELECT 1 FROM group_sessions WHERE session_id = ?", (new_sid,)
|
|
676
|
+
).fetchone()
|
|
677
|
+
if not existing:
|
|
678
|
+
break
|
|
679
|
+
rand_part = str(random.randint(1000, 9999))
|
|
680
|
+
new_sid = "9" + ts_part + rand_part
|
|
681
|
+
self._db_conn.execute(
|
|
682
|
+
"INSERT INTO group_sessions (group_id, session_id, created_at) VALUES (?, ?, ?)",
|
|
683
|
+
(group_id, new_sid, time.time()),
|
|
684
|
+
)
|
|
685
|
+
self._db_conn.commit()
|
|
686
|
+
logger.info(f"群聊 session 创建: group={group_id}, session={new_sid}")
|
|
687
|
+
return new_sid
|
|
688
|
+
|
|
689
|
+
def get_group_id_by_session(self, session_id: str) -> Optional[str]:
|
|
690
|
+
"""通过 session ID 查找 group_id(用于前端 URL 恢复)"""
|
|
691
|
+
if not self._db_conn:
|
|
692
|
+
return None
|
|
693
|
+
row = self._db_conn.execute(
|
|
694
|
+
"SELECT group_id FROM group_sessions WHERE session_id = ?", (session_id,)
|
|
695
|
+
).fetchone()
|
|
696
|
+
return row["group_id"] if row else None
|
|
697
|
+
|
|
698
|
+
def get_session_by_group(self, group_id: str) -> Optional[str]:
|
|
699
|
+
"""通过 group_id 查找 session_id"""
|
|
700
|
+
if not self._db_conn:
|
|
701
|
+
return None
|
|
702
|
+
row = self._db_conn.execute(
|
|
703
|
+
"SELECT session_id FROM group_sessions WHERE group_id = ?", (group_id,)
|
|
704
|
+
).fetchone()
|
|
705
|
+
return row["session_id"] if row else None
|
|
706
|
+
|
|
641
707
|
# ==================================================================
|
|
642
708
|
# 消息管理
|
|
643
709
|
# ==================================================================
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -258,6 +258,14 @@ class GroupManager:
|
|
|
258
258
|
db_path = self._data_dir / "groups" / "messages.db"
|
|
259
259
|
self._db_conn = sqlite3.connect(str(db_path), check_same_thread=False)
|
|
260
260
|
self._db_conn.row_factory = sqlite3.Row
|
|
261
|
+
# [v1.23.81] 群聊 session 映射表(每个群一个纯数字 session ID)
|
|
262
|
+
self._db_conn.execute("""
|
|
263
|
+
CREATE TABLE IF NOT EXISTS group_sessions (
|
|
264
|
+
group_id TEXT PRIMARY KEY,
|
|
265
|
+
session_id TEXT NOT NULL UNIQUE,
|
|
266
|
+
created_at REAL NOT NULL
|
|
267
|
+
)
|
|
268
|
+
""")
|
|
261
269
|
self._db_conn.execute("""
|
|
262
270
|
CREATE TABLE IF NOT EXISTS group_messages (
|
|
263
271
|
id TEXT PRIMARY KEY,
|
|
@@ -638,6 +646,64 @@ class GroupManager:
|
|
|
638
646
|
|
|
639
647
|
return group
|
|
640
648
|
|
|
649
|
+
# ==================================================================
|
|
650
|
+
# [v1.23.81] 群聊 Session 管理(纯数字 ID,嵌入 URL 用于导航恢复)
|
|
651
|
+
# ==================================================================
|
|
652
|
+
|
|
653
|
+
def get_or_create_group_session(self, group_id: str) -> str:
|
|
654
|
+
"""
|
|
655
|
+
获取或创建群聊的 session ID。
|
|
656
|
+
每个群有且仅有一个 session ID(纯数字,以 9 开头,递增)。
|
|
657
|
+
此 session ID 用于前端 URL 参数,确保从后台管理返回时能正确恢复群聊视图。
|
|
658
|
+
"""
|
|
659
|
+
if not self._db_conn:
|
|
660
|
+
return ""
|
|
661
|
+
# 查找已有 session
|
|
662
|
+
row = self._db_conn.execute(
|
|
663
|
+
"SELECT session_id FROM group_sessions WHERE group_id = ?", (group_id,)
|
|
664
|
+
).fetchone()
|
|
665
|
+
if row:
|
|
666
|
+
return row["session_id"]
|
|
667
|
+
# 生成新的纯数字 session ID(9 开头,13 位数字,时间戳后 8 位 + 随机 4 位)
|
|
668
|
+
import random
|
|
669
|
+
ts_part = str(int(time.time()))[-8:]
|
|
670
|
+
rand_part = str(random.randint(1000, 9999))
|
|
671
|
+
new_sid = "9" + ts_part + rand_part # 共 13 位纯数字
|
|
672
|
+
# 确保唯一性
|
|
673
|
+
for _ in range(10):
|
|
674
|
+
existing = self._db_conn.execute(
|
|
675
|
+
"SELECT 1 FROM group_sessions WHERE session_id = ?", (new_sid,)
|
|
676
|
+
).fetchone()
|
|
677
|
+
if not existing:
|
|
678
|
+
break
|
|
679
|
+
rand_part = str(random.randint(1000, 9999))
|
|
680
|
+
new_sid = "9" + ts_part + rand_part
|
|
681
|
+
self._db_conn.execute(
|
|
682
|
+
"INSERT INTO group_sessions (group_id, session_id, created_at) VALUES (?, ?, ?)",
|
|
683
|
+
(group_id, new_sid, time.time()),
|
|
684
|
+
)
|
|
685
|
+
self._db_conn.commit()
|
|
686
|
+
logger.info(f"群聊 session 创建: group={group_id}, session={new_sid}")
|
|
687
|
+
return new_sid
|
|
688
|
+
|
|
689
|
+
def get_group_id_by_session(self, session_id: str) -> Optional[str]:
|
|
690
|
+
"""通过 session ID 查找 group_id(用于前端 URL 恢复)"""
|
|
691
|
+
if not self._db_conn:
|
|
692
|
+
return None
|
|
693
|
+
row = self._db_conn.execute(
|
|
694
|
+
"SELECT group_id FROM group_sessions WHERE session_id = ?", (session_id,)
|
|
695
|
+
).fetchone()
|
|
696
|
+
return row["group_id"] if row else None
|
|
697
|
+
|
|
698
|
+
def get_session_by_group(self, group_id: str) -> Optional[str]:
|
|
699
|
+
"""通过 group_id 查找 session_id"""
|
|
700
|
+
if not self._db_conn:
|
|
701
|
+
return None
|
|
702
|
+
row = self._db_conn.execute(
|
|
703
|
+
"SELECT session_id FROM group_sessions WHERE group_id = ?", (group_id,)
|
|
704
|
+
).fetchone()
|
|
705
|
+
return row["session_id"] if row else None
|
|
706
|
+
|
|
641
707
|
# ==================================================================
|
|
642
708
|
# 消息管理
|
|
643
709
|
# ==================================================================
|