diff --git a/manager/Dockerfile.qwenpaw b/manager/Dockerfile.qwenpaw index 8d17defc6..34fe8bc71 100644 --- a/manager/Dockerfile.qwenpaw +++ b/manager/Dockerfile.qwenpaw @@ -1,7 +1,7 @@ # ============================================================ -# AgentTeams Manager Agent - QwenPaw 2.0 Runtime +# AgentTeams Manager Agent - QwenPaw 2.2 Runtime # ============================================================ -# Lightweight Manager container with Python QwenPaw 2.0 runtime. +# Lightweight Manager container with Python QwenPaw 2.2 runtime. # Does NOT include Higress, Tuwunel, MinIO, or Element Web. # All infrastructure is provided by the controller (embedded) # or K8s Pods (incluster). AGENTTEAMS_RUNTIME env var selects mode. @@ -12,7 +12,7 @@ # Build args: # HIGRESS_REGISTRY - base image registry (default: cn-hangzhou) # AGENTTEAMS_CONTROLLER_IMAGE - pre-built controller image for agt CLI -# QWENPAW_PIP_SPEC - QwenPaw pip spec (default: qwenpaw==2.0.1) +# QWENPAW_PIP_SPEC - QwenPaw pip spec (default: qwenpaw==2.2.1) # PIP_INDEX_URL - PyPI mirror (default: official pypi.org) # APT_MIRROR - Debian APT mirror (default: empty; set to mirrors.aliyun.com for China) # ============================================================ @@ -60,8 +60,8 @@ RUN npm config set registry ${NPM_REGISTRY} && \ npm install -g mcporter skills @nacos-group/cli && \ rm -rf /root/.npm -# ---- Python virtual environment (single QwenPaw 2.0 venv) ---- -ARG QWENPAW_PIP_SPEC=qwenpaw==2.0.1 +# ---- Python virtual environment (single QwenPaw 2.2 venv) ---- +ARG QWENPAW_PIP_SPEC=qwenpaw==2.2.1 RUN python3 -m venv /opt/venv/qwenpaw \ && /opt/venv/qwenpaw/bin/pip install --no-cache-dir \ -i "${PIP_INDEX_URL}" \ diff --git a/manager/scripts/init/start-qwenpaw-manager.sh b/manager/scripts/init/start-qwenpaw-manager.sh index 9cad968fe..ad0c32646 100644 --- a/manager/scripts/init/start-qwenpaw-manager.sh +++ b/manager/scripts/init/start-qwenpaw-manager.sh @@ -1,5 +1,5 @@ #!/bin/bash -# start-qwenpaw-manager.sh - Start Manager Agent with QwenPaw 2.0 runtime +# start-qwenpaw-manager.sh - Start Manager Agent with QwenPaw 2.2 runtime # Called by start-manager-agent.sh when AGENTTEAMS_MANAGER_RUNTIME=copaw|qwenpaw # # This script converts an OpenClaw-style workspace to a QwenPaw-style workspace @@ -207,7 +207,7 @@ rm -f "${DM_ROOMS_FILE}" "${DM_ROOMS_FILE}.tmp" # Worker does this via api_client.disable_agent_if_present(). # Manager runs QwenPaw in-process (no API client), so we set # enabled=false in config.json's agents.profiles before startup. -# QwenPaw 2.0 start_all_configured_agents() skips enabled=false agents. +# QwenPaw 2.2 start_all_configured_agents() skips enabled=false agents. CONFIG_JSON="${QWENPAW_WORKING_DIR}/config.json" if [ -f "${CONFIG_JSON}" ]; then # AgentProfileRef requires id + workspace_dir (both mandatory). @@ -319,8 +319,16 @@ export QWENPAW_SECRET_DIR="${QWENPAW_SECRET_DIR:-${QWENPAW_WORKING_DIR}.secret}" export QWENPAW_RUNNING_IN_CONTAINER=true export QWENPAW_LOG_LEVEL="${COPAW_LOG_LEVEL:-info}" +# LLM stream stall detection (QwenPaw 2.2.0 #7150): aligned with the Worker +# entrypoint. Upstream default 30s; AgentTeams defaults 300s (8/26 +# QwenPaw001 false-kill precedent, lesson #386). Priority: native +# QWENPAW_LLM_STREAM_* vars > AGENTTEAMS_LLM_STREAM_TIMEOUT_S > 300. +AGENTTEAMS_LLM_STREAM_TIMEOUT_S="${AGENTTEAMS_LLM_STREAM_TIMEOUT_S:-300}" +export QWENPAW_LLM_STREAM_FIRST_CONTENT_TIMEOUT="${QWENPAW_LLM_STREAM_FIRST_CONTENT_TIMEOUT:-${AGENTTEAMS_LLM_STREAM_TIMEOUT_S}}" +export QWENPAW_LLM_STREAM_IDLE_TIMEOUT="${QWENPAW_LLM_STREAM_IDLE_TIMEOUT:-${AGENTTEAMS_LLM_STREAM_TIMEOUT_S}}" + # YOLO mode: AGENTTEAMS_YOLO=1 → set approval_level=OFF in agent.json -# (QwenPaw 2.0 equivalent of OpenClaw's tools.exec.ask=off). +# (QwenPaw 2.2 equivalent of OpenClaw's tools.exec.ask=off). # start-manager-agent.sh promotes the yolo-mode marker file to # AGENTTEAMS_YOLO=1 before calling this script. if [ "${AGENTTEAMS_YOLO:-}" = "1" ] && [ -f "${AGENT_JSON}" ]; then @@ -329,7 +337,7 @@ if [ "${AGENTTEAMS_YOLO:-}" = "1" ] && [ -f "${AGENT_JSON}" ]; then log "YOLO mode: approval_level set to OFF" fi -log "Starting QwenPaw 2.0 Manager (app mode)..." +log "Starting QwenPaw 2.2 Manager (app mode)..." # Keep canonical Manager skills under $HOME/skills synchronized with the # QwenPaw native workspace after startup. QwenPaw does not watch the OpenClaw diff --git a/plugins/agentteams-manager-tools/plugin.json b/plugins/agentteams-manager-tools/plugin.json index 084cd43c4..e017fe8da 100644 --- a/plugins/agentteams-manager-tools/plugin.json +++ b/plugins/agentteams-manager-tools/plugin.json @@ -9,9 +9,9 @@ "backend": "plugin.py" }, "dependencies": [], - "min_version": "2.0.1", + "min_version": "2.2.0", "qwenpaw_version": { - "min": "2.0.1", - "max": "2.1.0" + "min": "2.2.0", + "max": "2.3.0" } } diff --git a/tests/test-27-qwenpaw-manager-startup.sh b/tests/test-27-qwenpaw-manager-startup.sh index 0f6bb558a..e0d70ba3d 100755 --- a/tests/test-27-qwenpaw-manager-startup.sh +++ b/tests/test-27-qwenpaw-manager-startup.sh @@ -145,12 +145,17 @@ fi docker exec "${_AGENT_CTR}" bash -c \ "printf '%s\n' '---' 'name: ${_HOT_SKILL}' 'description: QwenPaw Manager updated hot loading regression skill.' '---' '' '# Hot Loading Regression Updated' > '/root/manager-workspace/skills/${_HOT_SKILL}/SKILL.md'" +# QwenPaw >= 2.2.0 skills API: the list endpoint (GET /api/skills) returns +# metadata only (SkillSpec, no content); skill content is served by the +# per-skill detail endpoint (GET /api/skills/{name}, SkillDetail) and read +# from disk at request time. Poll the detail endpoint: the Manager skill +# sync copies the canonical file into the workspace within ~1s, and the +# detail endpoint then serves the fresh content. _skill_updated=false _deadline=$(( $(date +%s) + 30 )) while [ "$(date +%s)" -lt "${_deadline}" ]; do - if docker exec "${_AGENT_CTR}" curl -fsS http://127.0.0.1:18799/api/skills 2>/dev/null \ - | jq -e --arg name "${_HOT_SKILL}" \ - '.[] | select(.name == $name and (.content | contains("# Hot Loading Regression Updated")))' \ + if docker exec "${_AGENT_CTR}" curl -fsS "http://127.0.0.1:18799/api/skills/${_HOT_SKILL}" 2>/dev/null \ + | jq -e '.content | contains("# Hot Loading Regression Updated")' \ >/dev/null 2>&1; then _skill_updated=true break