diff --git a/.github/workflows/agent-ci-probe.yml b/.github/workflows/agent-ci-probe.yml new file mode 100644 index 0000000..bbd326e --- /dev/null +++ b/.github/workflows/agent-ci-probe.yml @@ -0,0 +1,48 @@ +name: Agent CI probe + +on: + pull_request: + paths: + - .github/workflows/agent-ci-probe.yml + - wikify/agent_ci_probe.py + +permissions: + contents: read + +jobs: + probe: + runs-on: ubuntu-latest + timeout-minutes: 30 + env: + CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} + services: + redis-cache: + image: redis:alpine + ports: + - 13000:6379 + redis-queue: + image: redis:alpine + ports: + - 11000:6379 + mariadb: + image: mariadb:11.8 + env: + MYSQL_ROOT_PASSWORD: root + ports: + - 3306:3306 + options: --health-cmd="mariadb-admin ping" --health-interval=5s --health-timeout=2s --health-retries=3 + steps: + - uses: actions/checkout@v7 + - uses: ./.github/actions/e2e-site + - name: Direct turn + shell: bash + working-directory: /home/runner/frappe-bench + run: bench --site wikify.localhost execute wikify.agent_ci_probe.direct + - name: Worker turn + if: always() + shell: bash + working-directory: /home/runner/frappe-bench + run: | + bench --site wikify.localhost execute wikify.agent_ci_probe.worker + echo "----- worker log tail" + tail -n 80 logs/e2e-worker.log diff --git a/wikify/agent_ci_probe.py b/wikify/agent_ci_probe.py new file mode 100644 index 0000000..2f651ff --- /dev/null +++ b/wikify/agent_ci_probe.py @@ -0,0 +1,68 @@ +import os +import shutil +import time + +import frappe + +from wikify.agent import session +from wikify.agent.loop import AgentRunner +from wikify.engine import claude_cli + + +def environment(): + print("which claude:", shutil.which("claude"), "| HOME:", os.environ.get("HOME")) + print("token set:", bool(os.environ.get("CLAUDE_CODE_OAUTH_TOKEN")), "| is_enabled:", claude_cli.is_enabled()) + try: + print("plain run:", claude_cli.run([{"role": "user", "content": "Reply with exactly: ok"}])["result"]) + except Exception as exception: + print("plain run FAILED:", repr(exception)) + + +def start_turn(): + sess = session.get_or_create(None, user="Administrator", scope="global") + session.append_message(sess.name, "user", "List my projects", status="done", attachments=[]) + session.set_running(sess.name, True) + frappe.db.commit() + return sess.name + + +def report(session_id, started): + print("turn took", round(time.time() - started, 1), "s") + for row in frappe.get_all( + "Wikify Agent Message", + filters={"session": session_id}, + fields=["role", "status", "content", "tool_name"], + order_by="creation asc", + ): + print(f" {row.role:9} {row.status or '':9} {row.tool_name or '':12} {(row.content or '')[:160]!r}") + for error in frappe.get_all( + "Error Log", filters={"method": "Wikify agent run failed"}, fields=["error"], order_by="creation desc" + ): + print(error.error[-3000:]) + + +def direct(): + frappe.set_user("Administrator") + environment() + session_id = start_turn() + started = time.time() + AgentRunner(session_id, "Administrator", attachments=[]).run() + report(session_id, started) + + +def worker(): + frappe.set_user("Administrator") + frappe.db.delete("Error Log", {"method": "Wikify agent run failed"}) + frappe.enqueue("wikify.agent_ci_probe.environment", queue="long") + session_id = start_turn() + started = time.time() + frappe.enqueue( + "wikify.jobs.agent.run_agent_job", queue="long", session_id=session_id, user="Administrator" + ) + frappe.db.commit() + while time.time() - started < 300: + time.sleep(5) + frappe.db.rollback() + if not frappe.db.get_value("Wikify Agent Session", session_id, "is_running"): + break + report(session_id, started)