From 397505cbec27cd20a800cbb671b70244aae66613 Mon Sep 17 00:00:00 2001 From: Nick Sweeting Date: Thu, 3 Sep 2026 18:26:28 -0700 Subject: [PATCH] Exercise OpenCode terminal tickets in proxy and browser regressions --- archivebox/tests/test_opencode_agent.py | 18 ++++++++++++++++++ archivebox/tests/test_opencode_browser.py | 7 +++++++ 2 files changed, 25 insertions(+) diff --git a/archivebox/tests/test_opencode_agent.py b/archivebox/tests/test_opencode_agent.py index 6aa91fad..f24a81db 100644 --- a/archivebox/tests/test_opencode_agent.py +++ b/archivebox/tests/test_opencode_agent.py @@ -339,6 +339,24 @@ def test_opencode_proxy_waits_for_owned_process_readiness(admin_client, live_ope assert runtime._PROCESS_READY is process +def test_opencode_proxy_preserves_protocol_headers(admin_client, live_opencode): + headers = {"HTTP_HOST": ADMIN_TEST_HOST, "HTTP_SEC_FETCH_SITE": "same-origin"} + created = admin_client.post( + "/admin/agent/opencode/pty", + data={"command": "/bin/sh", "args": []}, + content_type="application/json", + **headers, + ) + assert created.status_code == 200 + path = f"/admin/agent/opencode/pty/{created.json()['id']}" + try: + response = admin_client.post(path + "/connect-token", HTTP_X_OPENCODE_TICKET="1", **headers) + assert response.status_code == 200, response.content + assert response.json()["ticket"] + finally: + assert admin_client.delete(path, **headers).status_code == 200 + + def test_opencode_proxy_sse_response_is_unbuffered(admin_client, live_opencode): response = admin_client.get( "/admin/agent/opencode/global/event", diff --git a/archivebox/tests/test_opencode_browser.py b/archivebox/tests/test_opencode_browser.py index 5109fa2d..e4240513 100644 --- a/archivebox/tests/test_opencode_browser.py +++ b/archivebox/tests/test_opencode_browser.py @@ -72,8 +72,15 @@ const config = JSON.parse(require('node:fs').readFileSync(0, 'utf8')); if (!created.ok) throw new Error('PTY create: ' + created.status); const pty = await created.json(); try { + const authorized = await fetch(base + '/pty/' + pty.id + '/connect-token', { + method: 'POST', headers: {'x-opencode-ticket': '1'}, + }); + if (authorized.status !== 200) throw new Error('PTY ticket: ' + authorized.status); + const {ticket} = await authorized.json(); + if (!ticket) throw new Error('PTY ticket missing'); return await new Promise((resolve, reject) => { const url = new URL(base + '/pty/' + pty.id + '/connect'); + url.searchParams.set('ticket', ticket); url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:'; const socket = new WebSocket(url); const timer = setTimeout(() => { socket.close(); reject(new Error('PTY output timed out')); }, 10000);