myagent-ai 1.23.47 → 1.23.49
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/package.json +2 -2
- package/scripts/cli.py +3 -1
- package/web/api_server.py +25 -24
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "myagent-ai",
|
|
3
|
-
"version": "1.23.
|
|
3
|
+
"version": "1.23.49",
|
|
4
4
|
"description": "本地桌面端执行型AI助手 - Open Interpreter 风格 | Local Desktop Execution-Oriented AI Assistant",
|
|
5
5
|
"main": "main.py",
|
|
6
6
|
"bin": {
|
|
@@ -43,4 +43,4 @@
|
|
|
43
43
|
"python": ">=3.10",
|
|
44
44
|
"node": ">=18"
|
|
45
45
|
}
|
|
46
|
-
}
|
|
46
|
+
}
|
package/scripts/cli.py
CHANGED
|
@@ -378,9 +378,11 @@ async def cmd_ls(args):
|
|
|
378
378
|
"""列出目录内容"""
|
|
379
379
|
import argparse
|
|
380
380
|
# [v1.23.46] 过滤系统 ls 参数(-l, -a, -la 等)
|
|
381
|
+
# [v1.23.48] 过滤纯数字参数(LLM 误传如 myagent-ai ls 2)
|
|
382
|
+
args = [a for a in args if not a.isdigit()]
|
|
381
383
|
args = _filter_unknown_args(args, allowed_prefixes={"-p", "--pattern", "-r", "--recursive", "--max"})
|
|
382
384
|
p = argparse.ArgumentParser(prog="myagent-ai ls", description="列出目录内容")
|
|
383
|
-
p.add_argument("path", help="目录路径")
|
|
385
|
+
p.add_argument("path", nargs="?", default=".", help="目录路径 (默认当前目录)")
|
|
384
386
|
p.add_argument("-p", "--pattern", default="*", help="文件匹配模式 (如 *.py)")
|
|
385
387
|
p.add_argument("-r", "--recursive", action="store_true", help="递归列出")
|
|
386
388
|
p.add_argument("--max", type=int, default=500, help="最大返回条目数 (默认500)")
|
package/web/api_server.py
CHANGED
|
@@ -312,8 +312,6 @@ class ApiServer:
|
|
|
312
312
|
|
|
313
313
|
def _setup_routes(self):
|
|
314
314
|
r = self.app.router
|
|
315
|
-
print("DEBUG _setup_routes 被调用", flush=True)
|
|
316
|
-
print(f"DEBUG self.handle_test_llm = {self.handle_test_llm}", flush=True)
|
|
317
315
|
# ── 系统状态 ──
|
|
318
316
|
r.add_get("/api/status", self.handle_status)
|
|
319
317
|
r.add_post("/api/shutdown", self.handle_shutdown)
|
|
@@ -8096,28 +8094,7 @@ window.addEventListener('beforeunload', function() {{
|
|
|
8096
8094
|
except Exception:
|
|
8097
8095
|
pass
|
|
8098
8096
|
|
|
8099
|
-
#
|
|
8100
|
-
try:
|
|
8101
|
-
tp = self._get_task_persistence()
|
|
8102
|
-
interrupted = tp.get_all_tasks(status_filter=("running",))
|
|
8103
|
-
if interrupted:
|
|
8104
|
-
logger.warning(f"检测到 {len(interrupted)} 个上次未完成的任务,正在自动恢复...")
|
|
8105
|
-
for task in interrupted:
|
|
8106
|
-
try:
|
|
8107
|
-
await self._retry_interrupted_task(tp, task)
|
|
8108
|
-
except Exception as e:
|
|
8109
|
-
logger.error(f"自动恢复任务失败 ({task.get('task_id', '')}): {e}")
|
|
8110
|
-
# 恢复失败则标记为 failed
|
|
8111
|
-
tp.update_task_status(
|
|
8112
|
-
task.get("task_id", ""), "failed",
|
|
8113
|
-
metadata={"interrupted": True, "interrupt_reason": "自动恢复失败"},
|
|
8114
|
-
last_message=task.get("description", ""),
|
|
8115
|
-
)
|
|
8116
|
-
# 清理超过 7 天的旧已完成任务
|
|
8117
|
-
tp.cleanup_old_tasks(days=7)
|
|
8118
|
-
except Exception as e:
|
|
8119
|
-
logger.warning(f"任务持久化恢复检查失败(非关键): {e}")
|
|
8120
|
-
|
|
8097
|
+
# [v1.23.47] 先启动 Web 服务器,再恢复中断任务(避免任务恢复阻塞 Web 启动)
|
|
8121
8098
|
self._runner = web.AppRunner(self.app)
|
|
8122
8099
|
await self._runner.setup()
|
|
8123
8100
|
site = web.TCPSite(self._runner, host, port)
|
|
@@ -8133,6 +8110,30 @@ window.addEventListener('beforeunload', function() {{
|
|
|
8133
8110
|
raise
|
|
8134
8111
|
logger.info(f"管理后台: http://{host}:{port}/ui/")
|
|
8135
8112
|
|
|
8113
|
+
# [v1.23.47] 恢复被中断的任务:后台异步执行,不阻塞 Web 服务器
|
|
8114
|
+
async def _background_task_recovery():
|
|
8115
|
+
try:
|
|
8116
|
+
tp = self._get_task_persistence()
|
|
8117
|
+
interrupted = tp.get_all_tasks(status_filter=("running",))
|
|
8118
|
+
if interrupted:
|
|
8119
|
+
logger.warning(f"检测到 {len(interrupted)} 个上次未完成的任务,正在后台恢复...")
|
|
8120
|
+
for task in interrupted:
|
|
8121
|
+
try:
|
|
8122
|
+
await self._retry_interrupted_task(tp, task)
|
|
8123
|
+
except Exception as e:
|
|
8124
|
+
logger.error(f"自动恢复任务失败 ({task.get('task_id', '')}): {e}")
|
|
8125
|
+
tp.update_task_status(
|
|
8126
|
+
task.get("task_id", ""), "failed",
|
|
8127
|
+
metadata={"interrupted": True, "interrupt_reason": "自动恢复失败"},
|
|
8128
|
+
last_message=task.get("description", ""),
|
|
8129
|
+
)
|
|
8130
|
+
# 清理超过 7 天的旧已完成任务
|
|
8131
|
+
tp.cleanup_old_tasks(days=7)
|
|
8132
|
+
except Exception as e:
|
|
8133
|
+
logger.warning(f"任务持久化恢复检查失败(非关键): {e}")
|
|
8134
|
+
|
|
8135
|
+
asyncio.create_task(_background_task_recovery())
|
|
8136
|
+
|
|
8136
8137
|
async def stop(self):
|
|
8137
8138
|
if self._runner: await self._runner.cleanup()
|
|
8138
8139
|
|