Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions docker/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,25 @@ RUN --mount=type=cache,target=/root/.cache/uv \
&& apt-get purge -y --auto-remove build-essential \
&& rm -rf /var/lib/apt/lists/* /tmp/*

# 临时修复: orcakit-harness-agent 0.9.19 中 _Agent 类的 MRO 顺序问题
#
# 问题: harness_agent/acp/server.py 中 `class _Agent(Agent, HarnessACPAgent)`
# 导致 Agent(Protocol 基类)的空实现优先于 HarnessACPAgent 的实际实现被调用,
# 使 ACP initialize / session/new 等方法返回 null,Octop 无法通过 ACP 对接
# 外部编排器(如 Multica)。
#
# 修复: 交换继承顺序为 `class _Agent(HarnessACPAgent, Agent)`,确保
# HarnessACPAgent 的方法在 MRO 中优先解析。
#
# 上游修复发布后可移除此段。参考: https://github.com/TencentCloud/harness-agent
RUN SERVER_PY="$(find /app/.venv/lib -path '*/harness_agent/acp/server.py' -print -quit)" \
&& if [ -n "$SERVER_PY" ] && [ -f "$SERVER_PY" ]; then \
sed -i 's/class _Agent(Agent, HarnessACPAgent):/class _Agent(HarnessACPAgent, Agent):/' "$SERVER_PY"; \
echo "[Dockerfile] Patched harness_agent MRO order in: $SERVER_PY"; \
else \
echo "[Dockerfile] WARNING: harness_agent/acp/server.py not found, skipping MRO patch"; \
fi

RUN mkdir -p /data/.octop

EXPOSE 8088
Expand Down
12 changes: 12 additions & 0 deletions docker/docker-entrypoint.sh
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,18 @@ PORT="${OCTOP_PORT:-8088}"

mkdir -p "$OCTOP_HOME"

# 运行时修复: harness-agent MRO 顺序问题(与 Dockerfile 补丁配合,覆盖已运行旧镜像的场景)
# 上游修复发布后可移除此段
_patch_mro() {
local server_py
server_py="$(find /app/.venv/lib -path '*/harness_agent/acp/server.py' -print -quit 2>/dev/null || true)"
if [ -n "$server_py" ] && [ -f "$server_py" ] && grep -q 'class _Agent(Agent, HarnessACPAgent):' "$server_py"; then
sed -i 's/class _Agent(Agent, HarnessACPAgent):/class _Agent(HarnessACPAgent, Agent):/' "$server_py"
echo "[entrypoint] Patched harness_agent MRO order in: $server_py"
fi
}
_patch_mro

if [ ! -f "$DB_FILE" ]; then
echo "[entrypoint] 首次启动,正在初始化 Octop..."

Expand Down
34 changes: 34 additions & 0 deletions docker/patch-harness-agent-mro.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#!/usr/bin/env bash
# =============================================================================
# 修复 orcakit-harness-agent 中 _Agent 类的 MRO 顺序问题
#
# 问题: harness_agent/acp/server.py 中 `class _Agent(Agent, HarnessACPAgent)`
# 导致 Agent(Protocol 基类)的空实现优先于 HarnessACPAgent 的实际实现,
# 使 ACP initialize / session/new 返回 null。
#
# 用法:
# # 在宿主机上修复运行中的容器
# docker exec <container_name> bash /docker/patch-harness-agent-mro.sh
#
# # 或在容器内直接执行
# bash /docker/patch-harness-agent-mro.sh
#
# 上游修复发布后可删除此脚本。
# =============================================================================
set -euo pipefail

SERVER_PY="$(find /app/.venv/lib -path '*/harness_agent/acp/server.py' -print -quit 2>/dev/null || true)"

if [ -z "$SERVER_PY" ] || [ ! -f "$SERVER_PY" ]; then
echo "[patch] ERROR: harness_agent/acp/server.py not found"
exit 1
fi

if ! grep -q 'class _Agent(Agent, HarnessACPAgent):' "$SERVER_PY"; then
echo "[patch] SKIP: $SERVER_PY 已修复或模式不匹配"
exit 0
fi

sed -i 's/class _Agent(Agent, HarnessACPAgent):/class _Agent(HarnessACPAgent, Agent):/' "$SERVER_PY"
echo "[patch] OK: 已修复 MRO 顺序 in $SERVER_PY"
echo "[patch] 请重启 Octop 服务使修复生效"