myagent-ai 1.2.0 → 1.2.2

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.
Files changed (70) hide show
  1. package/config.py +2 -1
  2. package/core/version.py +1 -1
  3. package/docs//351/205/215/347/275/256/344/275/277/347/224/250/350/257/264/346/230/216.md +797 -0
  4. package/install/install.sh +1 -1
  5. package/main.py +5 -5
  6. package/package.json +3 -2
  7. package/start.sh +65 -8
  8. package/web/api_server.py +15 -11
  9. package/agents/__pycache__/main_agent.cpython-312.pyc +0 -0
  10. package/departments/__pycache__/__init__.cpython-312.pyc +0 -0
  11. package/departments/__pycache__/manager.cpython-312.pyc +0 -0
  12. package/executor/__pycache__/engine.cpython-312.pyc +0 -0
  13. package/organization/__pycache__/manager.cpython-312.pyc +0 -0
  14. package/skills/aminer-open-academic/scripts/__pycache__/aminer_client.cpython-312.pyc +0 -0
  15. package/skills/blog-writer/__pycache__/manage_examples.cpython-312.pyc +0 -0
  16. package/skills/docx/ooxml/scripts/__pycache__/pack.cpython-312.pyc +0 -0
  17. package/skills/docx/ooxml/scripts/__pycache__/unpack.cpython-312.pyc +0 -0
  18. package/skills/docx/ooxml/scripts/__pycache__/validate.cpython-312.pyc +0 -0
  19. package/skills/docx/ooxml/scripts/validation/__pycache__/__init__.cpython-312.pyc +0 -0
  20. package/skills/docx/ooxml/scripts/validation/__pycache__/base.cpython-312.pyc +0 -0
  21. package/skills/docx/ooxml/scripts/validation/__pycache__/docx.cpython-312.pyc +0 -0
  22. package/skills/docx/ooxml/scripts/validation/__pycache__/pptx.cpython-312.pyc +0 -0
  23. package/skills/docx/ooxml/scripts/validation/__pycache__/redlining.cpython-312.pyc +0 -0
  24. package/skills/docx/scripts/__pycache__/__init__.cpython-312.pyc +0 -0
  25. package/skills/docx/scripts/__pycache__/add_toc_placeholders.cpython-312.pyc +0 -0
  26. package/skills/docx/scripts/__pycache__/document.cpython-312.pyc +0 -0
  27. package/skills/docx/scripts/__pycache__/utilities.cpython-312.pyc +0 -0
  28. package/skills/market-research-reports/scripts/__pycache__/generate_market_visuals.cpython-312.pyc +0 -0
  29. package/skills/pdf/scripts/__pycache__/add_zai_metadata.cpython-312.pyc +0 -0
  30. package/skills/pdf/scripts/__pycache__/check_bounding_boxes.cpython-312.pyc +0 -0
  31. package/skills/pdf/scripts/__pycache__/check_bounding_boxes_test.cpython-312.pyc +0 -0
  32. package/skills/pdf/scripts/__pycache__/check_fillable_fields.cpython-312.pyc +0 -0
  33. package/skills/pdf/scripts/__pycache__/convert_pdf_to_images.cpython-312.pyc +0 -0
  34. package/skills/pdf/scripts/__pycache__/create_validation_image.cpython-312.pyc +0 -0
  35. package/skills/pdf/scripts/__pycache__/extract_form_field_info.cpython-312.pyc +0 -0
  36. package/skills/pdf/scripts/__pycache__/fill_fillable_fields.cpython-312.pyc +0 -0
  37. package/skills/pdf/scripts/__pycache__/fill_pdf_form_with_annotations.cpython-312.pyc +0 -0
  38. package/skills/pdf/scripts/__pycache__/sanitize_code.cpython-312.pyc +0 -0
  39. package/skills/pptx/ooxml/scripts/__pycache__/pack.cpython-312.pyc +0 -0
  40. package/skills/pptx/ooxml/scripts/__pycache__/unpack.cpython-312.pyc +0 -0
  41. package/skills/pptx/ooxml/scripts/__pycache__/validate.cpython-312.pyc +0 -0
  42. package/skills/pptx/ooxml/scripts/validation/__pycache__/__init__.cpython-312.pyc +0 -0
  43. package/skills/pptx/ooxml/scripts/validation/__pycache__/base.cpython-312.pyc +0 -0
  44. package/skills/pptx/ooxml/scripts/validation/__pycache__/docx.cpython-312.pyc +0 -0
  45. package/skills/pptx/ooxml/scripts/validation/__pycache__/pptx.cpython-312.pyc +0 -0
  46. package/skills/pptx/ooxml/scripts/validation/__pycache__/redlining.cpython-312.pyc +0 -0
  47. package/skills/pptx/scripts/__pycache__/inventory.cpython-312.pyc +0 -0
  48. package/skills/pptx/scripts/__pycache__/inventory.cpython-313.pyc +0 -0
  49. package/skills/pptx/scripts/__pycache__/rearrange.cpython-312.pyc +0 -0
  50. package/skills/pptx/scripts/__pycache__/replace.cpython-312.pyc +0 -0
  51. package/skills/pptx/scripts/__pycache__/thumbnail.cpython-312.pyc +0 -0
  52. package/skills/qingyan-research/__pycache__/generate_html.cpython-312.pyc +0 -0
  53. package/skills/skill-creator/eval-viewer/__pycache__/generate_review.cpython-312.pyc +0 -0
  54. package/skills/skill-creator/scripts/__pycache__/__init__.cpython-312.pyc +0 -0
  55. package/skills/skill-creator/scripts/__pycache__/aggregate_benchmark.cpython-312.pyc +0 -0
  56. package/skills/skill-creator/scripts/__pycache__/generate_report.cpython-312.pyc +0 -0
  57. package/skills/skill-creator/scripts/__pycache__/improve_description.cpython-312.pyc +0 -0
  58. package/skills/skill-creator/scripts/__pycache__/package_skill.cpython-312.pyc +0 -0
  59. package/skills/skill-creator/scripts/__pycache__/quick_validate.cpython-312.pyc +0 -0
  60. package/skills/skill-creator/scripts/__pycache__/run_eval.cpython-312.pyc +0 -0
  61. package/skills/skill-creator/scripts/__pycache__/run_loop.cpython-312.pyc +0 -0
  62. package/skills/skill-creator/scripts/__pycache__/utils.cpython-312.pyc +0 -0
  63. package/skills/storyboard-manager/scripts/__pycache__/consistency_checker.cpython-312.pyc +0 -0
  64. package/skills/storyboard-manager/scripts/__pycache__/timeline_tracker.cpython-312.pyc +0 -0
  65. package/skills/ui-ux-pro-max/scripts/__pycache__/__init__.cpython-312.pyc +0 -0
  66. package/skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-312.pyc +0 -0
  67. package/skills/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-312.pyc +0 -0
  68. package/skills/ui-ux-pro-max/scripts/__pycache__/search.cpython-312.pyc +0 -0
  69. package/skills/xlsx/__pycache__/recalc.cpython-312.pyc +0 -0
  70. package/web/__pycache__/api_server.cpython-312.pyc +0 -0
@@ -21,7 +21,7 @@ NO_DEPS=false
21
21
  DRY_RUN=false
22
22
  SCRIPT_URL="https://raw.githubusercontent.com/ctz168/myagent/main/install/install.sh"
23
23
  PKG_NAME="myagent-ai"
24
- PKG_VERSION="1.1.0"
24
+ PKG_VERSION="1.2.1"
25
25
 
26
26
  for arg in "$@"; do
27
27
  case "$arg" in
package/main.py CHANGED
@@ -586,7 +586,7 @@ class MyAgentApp:
586
586
  # 系统托盘
587
587
  # ==============================================================================
588
588
 
589
- def create_tray_icon(app: MyAgentApp, web_port: int = 8765):
589
+ def create_tray_icon(app: MyAgentApp, web_port: int = 8767):
590
590
  """
591
591
  创建系统托盘图标。
592
592
 
@@ -838,7 +838,7 @@ def create_tray_icon(app: MyAgentApp, web_port: int = 8765):
838
838
  return tray_icon
839
839
 
840
840
 
841
- def run_with_tray(app: MyAgentApp, web_port: int = 8765):
841
+ def run_with_tray(app: MyAgentApp, web_port: int = 8767):
842
842
  """在系统托盘中运行 MyAgent"""
843
843
  tray = create_tray_icon(app, web_port)
844
844
  if tray is None:
@@ -979,9 +979,9 @@ def main():
979
979
 
980
980
  parser = argparse.ArgumentParser(description="MyAgent - 本地桌面端执行型AI助手")
981
981
  parser.add_argument("--tray", action="store_true", help="以系统托盘模式运行")
982
- parser.add_argument("--web", type=int, nargs="?", const=8765, default=None,
983
- help="启动管理后台 Web UI (可选端口,默认8765)")
984
- parser.add_argument("--port", type=int, default=8765, help="Web UI 端口")
982
+ parser.add_argument("--web", type=int, nargs="?", const=8767, default=None,
983
+ help="启动管理后台 Web UI (可选端口,默认8767)")
984
+ parser.add_argument("--port", type=int, default=8767, help="Web UI 端口")
985
985
  parser.add_argument("--autostart", action="store_true", help="设置开机自启")
986
986
  parser.add_argument("--no-autostart", action="store_true", help="取消开机自启")
987
987
  parser.add_argument("--config", type=str, help="指定配置文件路径")
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "myagent-ai",
3
- "version": "1.2.0",
3
+ "version": "1.2.2",
4
4
  "description": "本地桌面端执行型AI助手 - Open Interpreter 风格 | Local Desktop Execution-Oriented AI Assistant",
5
5
  "main": "main.py",
6
6
  "bin": {
@@ -11,7 +11,7 @@
11
11
  "start:web": "python main.py --web",
12
12
  "start:tray": "python main.py --tray",
13
13
  "start:server": "python main.py --server",
14
- "install:deps": "pip install -r requirements.txt",
14
+ "install:deps": "pip install -r requirements.txt --break-system-packages 2>/dev/null || pip install -r requirements.txt",
15
15
  "test": "python -m pytest tests/"
16
16
  },
17
17
  "keywords": [
@@ -50,6 +50,7 @@
50
50
  "requirements.txt",
51
51
  "start.sh",
52
52
  "install/",
53
+ "docs/",
53
54
  "core/",
54
55
  "memory/",
55
56
  "executor/",
package/start.sh CHANGED
@@ -1,9 +1,42 @@
1
1
  #!/bin/bash
2
2
  # MyAgent Unix/macOS 启动脚本
3
3
  # 用法: ./start.sh [cli|web|tray|server|setup]
4
+ # 支持 npm 全局安装后从任意目录运行
4
5
 
5
6
  set -euo pipefail
6
7
 
8
+ # ── 解析脚本真实路径(兼容 symlink) ─────────
9
+ # npm 全局安装时 start.sh 会被 symlink 到 /usr/local/bin/myagent-ai
10
+ # 需要解析 symlink 找到实际的包目录
11
+ resolve_script_dir() {
12
+ local src="${BASH_SOURCE[0]}"
13
+ # 循环解析所有 symlink
14
+ while [ -L "$src" ]; do
15
+ local dir="$(cd -P "$(dirname "$src")" && pwd)"
16
+ src="$(readlink "$src")"
17
+ # 如果是相对路径,拼接上目录
18
+ [[ "$src" != /* ]] && src="$dir/$src"
19
+ done
20
+ cd -P "$(dirname "$src")" && pwd
21
+ }
22
+
23
+ SCRIPT_DIR="$(resolve_script_dir)"
24
+ PROJECT_DIR="$SCRIPT_DIR"
25
+
26
+ # 如果 main.py 不在脚本目录(npm link 等场景),向上查找
27
+ if [ ! -f "$PROJECT_DIR/main.py" ]; then
28
+ # 尝试 npm global prefix 方式
29
+ NPM_PKG_DIR="$(npm root -g 2>/dev/null)/myagent-ai"
30
+ if [ -f "$NPM_PKG_DIR/main.py" ]; then
31
+ PROJECT_DIR="$NPM_PKG_DIR"
32
+ else
33
+ echo -e "\033[31m[✗]\033[0m 错误: 找不到 main.py"
34
+ echo " 脚本目录: $SCRIPT_DIR"
35
+ echo " 请确保从正确位置运行,或重新安装: npm install -g myagent-ai"
36
+ exit 1
37
+ fi
38
+ fi
39
+
7
40
  BOLD='\033[1m'
8
41
  ACCENT='\033[36m'
9
42
  INFO='\033[90m'
@@ -38,6 +71,8 @@ if [ -z "$PY" ]; then
38
71
  echo " macOS: brew install python@3.12"
39
72
  echo " Linux: sudo apt install python3.12 python3-pip"
40
73
  echo " Windows: https://www.python.org/downloads/"
74
+ echo ""
75
+ echo " 一键安装: curl -fsSL https://raw.githubusercontent.com/ctz168/myagent/main/install/install.sh | bash"
41
76
  exit 1
42
77
  fi
43
78
 
@@ -55,6 +90,29 @@ check_python_version() {
55
90
  }
56
91
  check_python_version
57
92
 
93
+ # ── pip install (处理 PEP668) ──────────────────────
94
+ pip_install() {
95
+ local req_file="$1"
96
+ $PY -m pip install -r "$req_file" --break-system-packages 2>/dev/null || \
97
+ $PY -m pip install -r "$req_file" 2>/dev/null || \
98
+ {
99
+ warn "pip install 失败 (可能受 PEP668 限制)"
100
+ info "尝试使用 venv 安装..."
101
+ local venv_dir="$HOME/.myagent/venv"
102
+ $PY -m venv "$venv_dir" 2>/dev/null
103
+ if [ -f "$venv_dir/bin/pip" ]; then
104
+ "$venv_dir/bin/pip" install -r "$req_file"
105
+ success "已安装到虚拟环境 $venv_dir"
106
+ info "启动时请使用: $venv_dir/bin/python main.py --web"
107
+ return 0
108
+ fi
109
+ err "所有安装方式均失败"
110
+ info "请手动安装: pip3 install -r $req_file --break-system-packages"
111
+ info "或使用虚拟环境: python3 -m venv venv && source venv/bin/activate && pip install -r $req_file"
112
+ return 1
113
+ }
114
+ }
115
+
58
116
  # ── 检查核心依赖 ─────────────────────────────────
59
117
  check_deps() {
60
118
  local missing=0
@@ -82,18 +140,14 @@ check_deps() {
82
140
  echo ""
83
141
  warn "部分核心依赖缺失,正在自动安装..."
84
142
  local req_file=""
85
- # 优先查找同目录 requirements.txt
86
- if [ -f "$(dirname "$0")/requirements.txt" ]; then
87
- req_file="$(dirname "$0")/requirements.txt"
143
+ # 优先查找项目目录 requirements.txt
144
+ if [ -f "$PROJECT_DIR/requirements.txt" ]; then
145
+ req_file="$PROJECT_DIR/requirements.txt"
88
146
  elif [ -f "requirements.txt" ]; then
89
147
  req_file="requirements.txt"
90
148
  fi
91
149
  if [ -n "$req_file" ]; then
92
- pip3 install -r "$req_file" --break-system-packages 2>/dev/null || \
93
- pip3 install -r "$req_file" 2>/dev/null || \
94
- pip install -r "$req_file" --break-system-packages 2>/dev/null || \
95
- pip install -r "$req_file" 2>/dev/null || \
96
- warn "自动安装失败,请手动运行: pip3 install -r requirements.txt"
150
+ pip_install "$req_file" || warn "依赖安装失败,请手动处理"
97
151
  else
98
152
  warn "未找到 requirements.txt,请手动安装依赖"
99
153
  fi
@@ -134,6 +188,9 @@ if [ -z "$MODE" ]; then
134
188
  esac
135
189
  fi
136
190
 
191
+ # 切换到项目目录(确保 main.py 的相对路径正确)
192
+ cd "$PROJECT_DIR"
193
+
137
194
  case "$MODE" in
138
195
  cli)
139
196
  check_deps
package/web/api_server.py CHANGED
@@ -92,14 +92,14 @@ class ApiServer:
92
92
 
93
93
  def _setup_routes(self):
94
94
  r = self.app.router
95
+ # ── 系统状态 ──
95
96
  r.add_get("/api/status", self.handle_status)
96
97
  r.add_post("/api/shutdown", self.handle_shutdown)
98
+ # ── Agent 列表/创建 ──
97
99
  r.add_get("/api/agents", self.handle_list_agents)
98
100
  r.add_get("/api/agents/tree", self.handle_agents_tree)
99
101
  r.add_post("/api/agents", self.handle_create_agent)
100
- r.add_get("/api/agents/{name:[a-zA-Z0-9_/-]+}", self.handle_get_agent)
101
- r.add_put("/api/agents/{name:[a-zA-Z0-9_/-]+}", self.handle_update_agent)
102
- r.add_delete("/api/agents/{name:.+}", self.handle_delete_agent)
102
+ # ── Agent 子资源路由(必须在通用 {name} 路由之前注册) ──
103
103
  r.add_get("/api/agents/{name:[a-zA-Z0-9_/-]+}/soul", self.handle_get_soul)
104
104
  r.add_put("/api/agents/{name:[a-zA-Z0-9_/-]+}/soul", self.handle_set_soul)
105
105
  r.add_get("/api/agents/{name:[a-zA-Z0-9_/-]+}/identity", self.handle_get_identity)
@@ -109,6 +109,15 @@ class ApiServer:
109
109
  r.add_get("/api/agents/{name:[a-zA-Z0-9_/-]+}/sessions", self.handle_agent_sessions)
110
110
  r.add_get("/api/agents/{name:[a-zA-Z0-9_/-]+}/children", self.handle_list_children)
111
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)
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)
119
+ r.add_delete("/api/agents/{name:.+}", self.handle_delete_agent)
120
+ # ── 平台管理 ──
112
121
  r.add_get("/api/platforms", self.handle_list_platforms)
113
122
  r.add_post("/api/platforms", self.handle_add_platform)
114
123
  r.add_get("/api/platforms/{name}", self.handle_get_platform)
@@ -122,8 +131,7 @@ class ApiServer:
122
131
  r.add_post("/api/models", self.handle_add_model)
123
132
  r.add_put("/api/models/{model_id}", self.handle_update_model)
124
133
  r.add_delete("/api/models/{model_id}", self.handle_delete_model)
125
- # ── Agent 绑定查询 ──
126
- r.add_get("/api/agents/{name:[a-zA-Z0-9_/-]+}/bindings", self.handle_agent_bindings)
134
+ # ── 会话管理 ──
127
135
  r.add_get("/api/sessions", self.handle_list_sessions)
128
136
  r.add_get("/api/sessions/{sid}/messages", self.handle_get_messages)
129
137
  r.add_delete("/api/sessions/{sid}", self.handle_clear_session)
@@ -165,10 +173,6 @@ class ApiServer:
165
173
  r.add_get("/api/organization/knowledge/file", self.handle_read_org_knowledge)
166
174
  r.add_post("/api/organization/knowledge/upload", self.handle_upload_org_knowledge)
167
175
  r.add_delete("/api/organization/knowledge", self.handle_delete_org_knowledge)
168
- # ── Agent 知识库 ──
169
- r.add_get("/api/agents/{name:[a-zA-Z0-9_/-]+}/knowledge", self.handle_list_agent_knowledge)
170
- r.add_post("/api/agents/{name:[a-zA-Z0-9_/-]+}/knowledge/upload", self.handle_upload_agent_knowledge)
171
- r.add_delete("/api/agents/{name:[a-zA-Z0-9_/-]+}/knowledge", self.handle_delete_agent_knowledge)
172
176
  # ── 知识库 RAG 搜索 ──
173
177
  r.add_post("/api/knowledge/search", self.handle_knowledge_search)
174
178
  # ── 配置管理 (热重载/导入/导出) ──
@@ -1044,7 +1048,7 @@ class ApiServer:
1044
1048
  return web.json_response({"ok": True})
1045
1049
 
1046
1050
  async def handle_get_soul(self, request):
1047
- path = request.match_info["name"]
1051
+ path = request.match_info.get("name", "")
1048
1052
  p = self._agent_dir(path) / "soul.md"
1049
1053
  if not p.parent.exists() or not (p.parent / "config.json").exists():
1050
1054
  return web.json_response({"error": "not found"}, status=404)
@@ -2804,7 +2808,7 @@ class ApiServer:
2804
2808
  ok = mgr.clear_messages(gid)
2805
2809
  return web.json_response({"ok": ok})
2806
2810
 
2807
- async def start(self, port: int = 8765):
2811
+ async def start(self, port: int = 8767):
2808
2812
  # 加载禁用技能列表
2809
2813
  self._load_disabled_skills()
2810
2814