myagent-ai 1.2.2 → 1.3.1

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/start.sh CHANGED
@@ -56,13 +56,14 @@ echo ""
56
56
 
57
57
  # ── 获取 Python 命令 ───────────────────────────────
58
58
  get_python() {
59
- if command -v python3 &>/dev/null; then
60
- echo "python3"
61
- elif command -v python &>/dev/null; then
62
- echo "python"
63
- else
64
- echo ""
65
- fi
59
+ hash -r 2>/dev/null || true
60
+ if command -v python3 &>/dev/null; then
61
+ echo "python3"
62
+ elif command -v python &>/dev/null; then
63
+ echo "python"
64
+ else
65
+ echo ""
66
+ fi
66
67
  }
67
68
 
68
69
  PY="$(get_python)"
@@ -115,6 +116,8 @@ pip_install() {
115
116
 
116
117
  # ── 检查核心依赖 ─────────────────────────────────
117
118
  check_deps() {
119
+ # 刷新命令缓存
120
+ hash -r 2>/dev/null || true
118
121
  local missing=0
119
122
 
120
123
  # 必需依赖
@@ -127,12 +130,22 @@ check_deps() {
127
130
  fi
128
131
  done
129
132
 
133
+ # 内置技能依赖(缺一不可,启动时自动安装)
134
+ for mod in duckduckgo_search bs4 psutil playwright mss pynput; do
135
+ if $PY -c "import $mod" 2>/dev/null; then
136
+ success "$mod"
137
+ else
138
+ warn "$mod 未安装"
139
+ missing=1
140
+ fi
141
+ done
142
+
130
143
  # 可选依赖(不阻断启动)
131
- for mod in duckduckgo_search bs4 psutil PIL edge_tts pystray; do
144
+ for mod in pygetwindow PIL edge_tts pystray; do
132
145
  if $PY -c "import $mod" 2>/dev/null; then
133
146
  success "$mod"
134
147
  else
135
- info "$mod 未安装(可选)"
148
+ info "$mod 未安装(可选,不影响核心功能)"
136
149
  fi
137
150
  done
138
151
 
package/web/__init__.py CHANGED
File without changes
package/web/api_server.py CHANGED
@@ -100,22 +100,22 @@ class ApiServer:
100
100
  r.add_get("/api/agents/tree", self.handle_agents_tree)
101
101
  r.add_post("/api/agents", self.handle_create_agent)
102
102
  # ── Agent 子资源路由(必须在通用 {name} 路由之前注册) ──
103
- r.add_get("/api/agents/{name:[a-zA-Z0-9_/-]+}/soul", self.handle_get_soul)
104
- r.add_put("/api/agents/{name:[a-zA-Z0-9_/-]+}/soul", self.handle_set_soul)
105
- r.add_get("/api/agents/{name:[a-zA-Z0-9_/-]+}/identity", self.handle_get_identity)
106
- r.add_put("/api/agents/{name:[a-zA-Z0-9_/-]+}/identity", self.handle_set_identity)
107
- r.add_get("/api/agents/{name:[a-zA-Z0-9_/-]+}/user", self.handle_get_user)
108
- r.add_put("/api/agents/{name:[a-zA-Z0-9_/-]+}/user", self.handle_set_user)
109
- r.add_get("/api/agents/{name:[a-zA-Z0-9_/-]+}/sessions", self.handle_agent_sessions)
110
- r.add_get("/api/agents/{name:[a-zA-Z0-9_/-]+}/children", self.handle_list_children)
111
- r.add_post("/api/agents/{name:[a-zA-Z0-9_/-]+}/children", self.handle_create_child)
112
- r.add_get("/api/agents/{name:[a-zA-Z0-9_/-]+}/bindings", self.handle_agent_bindings)
113
- r.add_get("/api/agents/{name:[a-zA-Z0-9_/-]+}/knowledge", self.handle_list_agent_knowledge)
114
- r.add_post("/api/agents/{name:[a-zA-Z0-9_/-]+}/knowledge/upload", self.handle_upload_agent_knowledge)
115
- r.add_delete("/api/agents/{name:[a-zA-Z0-9_/-]+}/knowledge", self.handle_delete_agent_knowledge)
103
+ r.add_get("/api/agents/{name:[^/]+}/soul", self.handle_get_soul)
104
+ r.add_put("/api/agents/{name:[^/]+}/soul", self.handle_set_soul)
105
+ r.add_get("/api/agents/{name:[^/]+}/identity", self.handle_get_identity)
106
+ r.add_put("/api/agents/{name:[^/]+}/identity", self.handle_set_identity)
107
+ r.add_get("/api/agents/{name:[^/]+}/user", self.handle_get_user)
108
+ r.add_put("/api/agents/{name:[^/]+}/user", self.handle_set_user)
109
+ r.add_get("/api/agents/{name:[^/]+}/sessions", self.handle_agent_sessions)
110
+ r.add_get("/api/agents/{name:[^/]+}/children", self.handle_list_children)
111
+ r.add_post("/api/agents/{name:[^/]+}/children", self.handle_create_child)
112
+ r.add_get("/api/agents/{name:[^/]+}/bindings", self.handle_agent_bindings)
113
+ r.add_get("/api/agents/{name:[^/]+}/knowledge", self.handle_list_agent_knowledge)
114
+ r.add_post("/api/agents/{name:[^/]+}/knowledge/upload", self.handle_upload_agent_knowledge)
115
+ r.add_delete("/api/agents/{name:[^/]+}/knowledge", self.handle_delete_agent_knowledge)
116
116
  # ── Agent 通用 CRUD(放在子资源之后,name 不含斜杠避免吞掉子路由) ──
117
- r.add_get("/api/agents/{name:[a-zA-Z0-9_\\-]+}", self.handle_get_agent)
118
- r.add_put("/api/agents/{name:[a-zA-Z0-9_\\-]+}", self.handle_update_agent)
117
+ r.add_get("/api/agents/{name:[^/]+}", self.handle_get_agent)
118
+ r.add_put("/api/agents/{name:[^/]+}", self.handle_update_agent)
119
119
  r.add_delete("/api/agents/{name:.+}", self.handle_delete_agent)
120
120
  # ── 平台管理 ──
121
121
  r.add_get("/api/platforms", self.handle_list_platforms)
@@ -243,14 +243,18 @@ class ApiServer:
243
243
  r.add_post("/api/execution-lock", self.handle_execution_lock)
244
244
  r.add_post("/api/chat/check-text-size", self.handle_check_text_size)
245
245
  r.add_post("/api/chat/save-to-knowledge", self.handle_save_to_knowledge)
246
+ r.add_get("/ui/", self.handle_ui_index)
247
+ r.add_get("/", self.handle_index)
246
248
  ui_dir = Path(__file__).parent / "ui"
247
249
  if ui_dir.exists():
248
250
  r.add_static("/ui", str(ui_dir))
249
- r.add_get("/", self.handle_index)
250
251
 
251
252
  async def handle_index(self, request):
252
253
  raise web.HTTPFound("/ui/chat.html")
253
254
 
255
+ async def handle_ui_index(self, request):
256
+ raise web.HTTPFound("/ui/index.html")
257
+
254
258
  def _get_group_manager(self):
255
259
  """获取群聊管理器实例(懒加载)"""
256
260
  if not hasattr(self, '_group_manager'):
File without changes
package/web/ui/chat.html CHANGED
@@ -3067,14 +3067,19 @@ function newChat() {
3067
3067
  document.getElementById('headerTitle').textContent = '新对话';
3068
3068
  const agent = findAgentByPath(state.activeAgent);
3069
3069
  if (agent) {
3070
- document.getElementById('welcomeEmoji').textContent = agent.avatar_emoji || '👋';
3071
- document.getElementById('welcomeTitle').textContent = `你好,我是 ${agent.name}`;
3072
- document.getElementById('welcomeSubtitle').textContent = agent.description || '你的 AI 助手';
3070
+ const emojiEl = document.getElementById('welcomeEmoji');
3071
+ if (emojiEl) emojiEl.textContent = agent.avatar_emoji || '👋';
3072
+ const titleEl = document.getElementById('welcomeTitle');
3073
+ if (titleEl) titleEl.textContent = `你好,我是 ${agent.name}`;
3074
+ const subEl = document.getElementById('welcomeSubtitle');
3075
+ if (subEl) subEl.textContent = agent.description || '你的 AI 助手';
3073
3076
  }
3074
- document.getElementById('welcomeCard').style.display = '';
3077
+ const welcomeCard = document.getElementById('welcomeCard');
3078
+ if (welcomeCard) welcomeCard.style.display = '';
3075
3079
  renderMessages();
3076
3080
  renderSessions();
3077
- document.getElementById('userInput').focus();
3081
+ const userInput = document.getElementById('userInput');
3082
+ if (userInput) userInput.focus();
3078
3083
  }
3079
3084
 
3080
3085
  async function selectSession(id) {
@@ -3565,7 +3570,7 @@ function showConfigModal() {
3565
3570
  + '<div class="config-action-row">'
3566
3571
  + '<button class="config-action-btn primary" onclick="hotReloadConfig()" id="reloadBtn">'
3567
3572
  + '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="23 4 23 10 17 10"/><path d="M20.49 15a9 9 0 1 1-2.12-9.36L23 10"/></svg>'
3568
- + '热重载配置'</button>'
3573
+ + '热重载配置</button>'
3569
3574
  + '</div>'
3570
3575
  + '<div class="config-status" id="reloadStatus"></div>'
3571
3576
  + '</div>'
package/web/ui/index.html CHANGED
File without changes