[Bug] ToolPkg hiddenExec 调用永久挂起:qqbot「开启监听」卡死(Operit 1.12.1)
环境
- Operit 1.12.1(versionCode 46)
- 设备:vivo V2180GA,Android 11(SDK 30)
- 插件:内置 qqbot.toolpkg v0.3.0(container
com.operit.qqbot_bundle)
- 终端环境(Ubuntu 24.04)正常;
qqbot_test_connection 返回 HTTP 200(凭证/网络正常)
问题
调用 qqbot:qqbot_service_start(restart=true / timeout_ms=10000 / 默认参数,各种组合都试过)后:
- 工具调用永不返回,持续挂起(实测 5~10+ 分钟);
- 只有用户发送新消息打断 AI 生成时才被取消(显示 "User cancelled");
- 重启应用(换新进程)后 100% 复现。
期望行为
hiddenExec 应正常执行并返回结果;即使执行失败也应返回错误(或至少超时),而不是让 Promise 永久挂起、把上层工具调用一起拖死。
复现步骤
- 启用内置 qqbot 工具包,配置 AppID/Secret(沙箱,连接测试正常)。
- 调用
qqbot:qqbot_service_start。
- 观察:调用挂起;日志停在下方"关键日志"最后一行,之后再无任何 hiddenExec 执行痕迹。
关键日志(logcat,新进程会话,2026-09-13 15:38:38)
工具执行到"应调用 hiddenExec 拉起 Python 网关服务"这一步即静默:
D/ToolExecutionManager: Found 1 tool invocations: [qqbot:qqbot_service_start]
D/AIToolHandler: Auto-activating package 'qqbot' for tool qqbot:qqbot_service_start
D/PackageManager: Successfully loaded and activated package: qqbot
(插件数据目录初始化、config.json 写入均成功)
D/Linux: [Posix_connect Debug]Process com.ai.assistance.operit :32145
E/HttpTools: java.net.ConnectException: Failed to connect to /***:32145 (ECONNREFUSED,此处预期:服务尚未启动)
之后没有任何后续日志:按插件源码(qqbot.toolpkg 内 dist/shared/qqbot_service.js),下一步是
Tools.System.terminal.hiddenExec("python3 ...", { executorKey: "qqbot_gateway_service" }),
该调用此后既无执行记录、也无失败返回,Promise 永不 resolve。
更早的会话中还出现过:
[qqbot_ipc] withContext call failed: kind=main, error=Script execution timed out after 15 seconds
[qqbot_listener_app_foreground] JS ERROR: Script execution timed out after 1800 seconds(JsEngine TimeoutException 堆栈)
已确认问题不在插件/凭证/网络侧(附验证方法)
手动运行插件资源中的 resources/qqbot_gateway_service.py(纯标准库、无第三方依赖)并让其绑定 127.0.0.1:32145 后:
- 插件的状态接口立即恢复正常:
healthy=true, running=true, connected=true, configMatchesCurrent=true,机器人成功登录网关并正常收发心跳。
- 说明:唯一故障点是
Tools.System.terminal.hiddenExec 这条系统调用通道(不执行、不报错、不超时)。
影响范围
- qqbot「开启监听」完全不可用;
- 内置包
code_runner(CODE_RUNNER_HIDDEN_EXECUTOR_KEY)、linux_ssh 也使用同一 Tools.System.terminal.hiddenExec API,预计同样受影响。
建议
- 排查
hiddenExec 执行链路(executorKey 的创建/调度),修复"调用不落地"问题;
- 为
hiddenExec 增加超时与错误返回,避免 Promise 永久挂起。
(完整日志摘录与堆栈见附楼/附件。)
[Bug] ToolPkg hiddenExec 调用永久挂起:qqbot「开启监听」卡死(Operit 1.12.1)
环境
com.operit.qqbot_bundle)qqbot_test_connection返回 HTTP 200(凭证/网络正常)问题
调用
qqbot:qqbot_service_start(restart=true / timeout_ms=10000 / 默认参数,各种组合都试过)后:期望行为
hiddenExec应正常执行并返回结果;即使执行失败也应返回错误(或至少超时),而不是让 Promise 永久挂起、把上层工具调用一起拖死。复现步骤
qqbot:qqbot_service_start。关键日志(logcat,新进程会话,2026-09-13 15:38:38)
工具执行到"应调用 hiddenExec 拉起 Python 网关服务"这一步即静默:
之后没有任何后续日志:按插件源码(qqbot.toolpkg 内
dist/shared/qqbot_service.js),下一步是Tools.System.terminal.hiddenExec("python3 ...", { executorKey: "qqbot_gateway_service" }),该调用此后既无执行记录、也无失败返回,Promise 永不 resolve。
更早的会话中还出现过:
[qqbot_ipc] withContext call failed: kind=main, error=Script execution timed out after 15 seconds[qqbot_listener_app_foreground] JS ERROR: Script execution timed out after 1800 seconds(JsEngine TimeoutException 堆栈)已确认问题不在插件/凭证/网络侧(附验证方法)
手动运行插件资源中的
resources/qqbot_gateway_service.py(纯标准库、无第三方依赖)并让其绑定127.0.0.1:32145后:healthy=true, running=true, connected=true, configMatchesCurrent=true,机器人成功登录网关并正常收发心跳。Tools.System.terminal.hiddenExec这条系统调用通道(不执行、不报错、不超时)。影响范围
code_runner(CODE_RUNNER_HIDDEN_EXECUTOR_KEY)、linux_ssh也使用同一Tools.System.terminal.hiddenExecAPI,预计同样受影响。建议
hiddenExec执行链路(executorKey 的创建/调度),修复"调用不落地"问题;hiddenExec增加超时与错误返回,避免 Promise 永久挂起。(完整日志摘录与堆栈见附楼/附件。)