Skip to content
Draft
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
12 changes: 12 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,18 @@ jobs:
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v6
- name: Validate launcher installer with Windows PowerShell 5.1
if: runner.os == 'Windows'
shell: powershell
run: |
if ($PSVersionTable.PSVersion.Major -ne 5) {
throw "Expected Windows PowerShell 5.1, got $($PSVersionTable.PSVersion)"
}
$source = Get-Content scripts/install-launcher.ps1 -Raw
[void][scriptblock]::Create($source)
if (-not [Environment]::Is64BitOperatingSystem) {
throw "The Windows CI runner must be 64-bit"
}
- uses: oven-sh/setup-bun@v2
with:
bun-version: 1.3.11
Expand Down
38 changes: 33 additions & 5 deletions README.ko-KR.md
Original file line number Diff line number Diff line change
@@ -1,25 +1,39 @@
# Codex용 ChatGPT Web

Codex의 기본 모델 선택기에서 ChatGPT Web의 Instant, Medium, High, Extra High, Pro를 선택해
Codex의 기본 모델 선택기에서 ChatGPT Web의 임시대화·저장 대화·즉시·중간·높음·매우 높음·Pro를 선택해
사용하는 로컬 Responses 브리지입니다. 이 포크는 런처의 기본 언어를 한국어로 바꾸고,
한국어 UI를 추가했으며, GitHub/X 페이지를 반드시 열어야 했던 시작 절차를 선택 사항으로
바꿨습니다.

이 포크의 런타임은 upstream
[`miuuyy/codex-chatgpt-web`](https://github.com/miuuyy/codex-chatgpt-web) v1.0.1의
커밋 `4ad7abe428fe2226fa05038a36e1682de1670fcc`를 기반으로 합니다. 원 저작자 표시와 MIT
[`miuuyy/codex-chatgpt-web`](https://github.com/miuuyy/codex-chatgpt-web) v1.1.2의
커밋 `2e79cb15a6266916ef2298bda7cc94ead4f32af3`까지 반영합니다. 원 저작자 표시와 MIT
라이선스를 유지합니다.

## 권장 사용 방식

- 기본값은 브라우저 전용 모드입니다. 로컬 도구 없이 ChatGPT Web 모델로 계획·검토·조사를
수행할 때 적합합니다.
- 전체 하네스 모드는 명시적으로 필요한 경우에만 사용하세요. MCP 커넥터와 OpenAI Tunnel
설정이 필요하며, 쓰기 작업은 워크스페이스 정책과 수동 승인을 따라야 합니다.
- 전체 하네스 모드는 명시적으로 필요한 경우에만 사용하세요. MCP 커넥터와 OpenAI Secure MCP
Tunnel 설정이 필요하며, 쓰기 작업은 워크스페이스 정책과 수동 승인을 따라야 합니다.
- Web GPT가 전체 하네스를 사용하더라도 현재 Codex 작업의 프로젝트 루트만 전달됩니다. 외부 경로,
심볼릭 링크 탈출, 범용 도구 우회와 네트워크 접근은 별도 프로젝트 경계에서 차단됩니다.
- Pro는 깊은 계획과 검토에 적합하지만 현재 이 브리지의 로컬 MCP 도구를 직접 호출하지
못합니다.
- 공유 계정, 브라우저 프로필 공유, 과도한 동시 요청, 제한 우회는 사용하지 마세요.

## 모델과 라우팅

- 모델 선택은 `Web / 임시|저장 / 낮음|중간|높음|매우 높음`처럼 대화 보존 방식과 추론 수준을 함께 표시합니다.
- `Web / 임시 / ...`는 대화 기록에 남지 않는 Temporary Chat으로 실행되고, `Web / 저장 / ...`는 새 일반 대화로 저장됩니다.
- `ChatGPT Web — 저장 대화 (매우 높음)`은 일반 ChatGPT 대화를 만들어 ChatGPT 기록에 남깁니다.
- Web GPT 두 항목은 선택한 노력 수준이 낮게 들어와도 브리지에서 `매우 높음`으로 고정합니다.
- `gpt-5.6-sol`은 Codex 기본 설정에서 `높음`으로 두며, Web GPT 브리지가 브라우저를 열지 않고
공식 Codex 엔드포인트로 직접 전달합니다.
- 순수 네이티브 Codex는 `codex --profile codex-native`로 별도 실행할 수 있고, OCX는
`127.0.0.1:10100`에서 별도 프로세스로 유지됩니다. 한 경로가 내려가도 다른 경로의 인증·라우팅·런타임을
덮어쓰지 않습니다.

## 설치 및 시작

macOS 또는 Linux:
Expand All @@ -44,6 +58,20 @@ irm https://github.com/AgenticLab-SH/codex-chatgpt-web/releases/latest/download/
브라우저 창은 닫아도 됩니다. 설정의 백그라운드 실행이 켜져 있으면 런처와 내장 브라우저
프로세스는 계속 동작합니다. 다만 런처를 완전히 종료하면 브리지도 멈춥니다.

## MCP와 자동 시작

이 포크는 로컬 MCP를 외부에 공개하는 임의의 공개 터널 대신 OpenAI Secure MCP Tunnel을
사용합니다. 런처가 macOS 로그인 항목으로 실행되면 다음 순서를 자동으로 관리합니다.

1. 로컬 MCP 서버와 Responses 브리지를 시작합니다.
2. 저장된 최소 권한 런타임 키로 `tunnel-client`를 실행합니다.
3. Tunnel과 로컬 MCP가 준비된 뒤 Web GPT 요청을 받습니다.

따라서 매 작업마다 Tunnel이나 ChatGPT 앱을 다시 만들 필요는 없습니다. 다만 Mac이 꺼져 있거나
런처를 완전히 종료하면 로컬 파일 도구는 사용할 수 없습니다. ChatGPT Business에서 게시한 앱의
도구 이름·입력 스키마를 바꾼 경우에는 Business 정책상 기존 앱을 수정하는 대신 다시 게시해야 할
수 있으므로, 현재의 범용 7개 도구 표면을 안정적으로 유지합니다.

## 소스에서 실행

```bash
Expand Down
7 changes: 4 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,8 @@ connects ChatGPT back to the tools of that same Codex task.

- **A polished cross-platform launcher.** One command installs the native macOS, Windows, or Linux
app. It keeps sign-in, setup, smoke testing, MCP guidance, runtime health, and local logs in one
place, while the embedded browser lets you watch every ChatGPT turn as it happens.
place, while the embedded browser lets you watch every ChatGPT turn as it happens. Up to five
task-bound browser tabs can run in parallel; the cap avoids excessive parallel account traffic.
- **ChatGPT is the selected model.** It runs as a native Codex model, not as a tool called by
another host model. The original model picker, task lifecycle, streaming, tracing, and tool UI
remain intact.
Expand Down Expand Up @@ -113,8 +114,8 @@ This source path requires Bun 1.3.11. The command installs locked dependencies a

| Mode | Models | Local Codex tools | Extra setup |
| --- | --- | --- | --- |
| **Browser-only** | Instant through Pro | No; Codex shows a warning | None |
| **Full harness** | Instant through Pro | Instant–Extra High: yes; Pro: read-only | OpenAI tunnel + ChatGPT connector |
| **Browser-only** | Plus: Instant–High; Pro: adds Extra High and Pro | No; Codex shows a warning | None |
| **Full harness** | Plus: Instant–High; Pro: adds Extra High and Pro | Instant–Extra High: yes; Pro: read-only | OpenAI tunnel + ChatGPT connector |

Every picker entry has one fixed ChatGPT mode. Codex still displays its built-in Effort and Speed
rows, but changing them cannot silently change the selected browser model. Pro receives the full
Expand Down
3 changes: 2 additions & 1 deletion README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@ Codex 任务的工具。

- **精致的跨平台启动器。** 一条命令即可安装原生 macOS、Windows 或 Linux 应用。登录、设置、
冒烟测试、MCP 指南、运行状态和本地日志都集中在同一处;内置浏览器还能让你实时看到每个
ChatGPT 轮次的执行过程。
ChatGPT 轮次的执行过程。最多可同时运行五个与 Codex 任务绑定的浏览器标签页;此上限用于避免
对 ChatGPT 账户产生过多并行流量。
- **ChatGPT 就是所选模型。** 它作为 Codex 原生模型运行,而不是由另一个宿主模型调用的工具。
原有的模型选择器、任务生命周期、流式输出、追踪和工具界面保持不变。
- **本地优先的任务会话。** Codex 仍然是电脑上任务历史的真实来源。每个浏览器轮次都会从一个
Expand Down
10 changes: 6 additions & 4 deletions bun.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

25 changes: 14 additions & 11 deletions docs/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ Codex app / CLI
launcher-owned codex-chatgpt-web daemon
├─ official /models passthrough + fixed ChatGPT Web models
├─ native Responses passthrough or ChatGPT Responses/SSE bridge
├─ ChatGPT browser worker (embedded Electron surface, one turn at a time)
├─ ChatGPT browser worker (up to five task-bound Electron tabs)
├─ capability broker (full mode only)
└─ stdio MCP server
Expand All @@ -20,9 +20,9 @@ launcher-owned codex-chatgpt-web daemon

### `browser-only`

- Exposes Instant (`chatgpt-web/light`), Medium, High, and Extra High; each model advertises exactly one
immutable Codex effort matching its ChatGPT browser mode. `chatgpt-web/pro` is appended only when
the authenticated account exposes Pro.
- Exposes the conversation mode and effort as independent axes: temporary or saved, each combined with
Low, Medium, High, and Extra High. Pro is likewise exposed per conversation mode only when the
authenticated account exposes it. Legacy route ids remain accepted as hidden compatibility aliases.
- Sends the complete Codex context and image attachments to a fresh ChatGPT Temporary Chat.
- Never starts the broker, tunnel, or MCP server.
- Emits a nonfatal Codex commentary warning that local tools are unavailable for the selected model.
Expand All @@ -37,11 +37,14 @@ launcher-owned codex-chatgpt-web daemon

## Browser lifecycle

The desktop launcher owns one persistent Electron partition and one visible browser surface.
Playwright attaches to that exact surface through a launcher-owned loopback CDP endpoint; it does
not launch another browser or copy authentication state. A Codex turn navigates the owned surface
to a fresh Temporary Chat, and the surface returns to an inert local page after completion. The
login persists locally while browser conversations are not reused between tasks.
The desktop launcher owns one persistent Electron partition and up to five task-bound browser
tabs. Each Codex task is leased an independent `WebContentsView` and surface ID; Playwright attaches
to that exact surface through a launcher-owned loopback CDP endpoint. It does not launch another
browser or copy authentication state. Each tab opens a fresh Temporary Chat, shares only the local
login partition, and keeps its own document and lifecycle. Completed tabs remain inspectable until
closed. Closing a running tab destroys its page and terminates that browser turn. A sixth concurrent
turn fails explicitly; the cap avoids excessive parallel traffic that could trigger account abuse
controls.

The complete serialized Codex task is inserted as one inline JSON envelope. Image bytes stay out of
the JSON and are attached natively with stable references. The runtime does not create a context
Expand Down Expand Up @@ -104,8 +107,8 @@ launcher error.
- Store browser state and tunnel credentials under the application home with mode `0600`.
- Protect lifecycle control endpoints with a random application-owned bearer token.
- Never place secret values in command-line arguments, logs, generated profiles, or Git.
- Serialize browser turns and reject unsupported models explicitly. The selected routed model fixes
the adapter effort; a conflicting request effort cannot change it.
- Limit browser turns to five independent task-bound tabs and reject unsupported models explicitly.
The selected routed model fixes the adapter effort; a conflicting request effort cannot change it.
- Do not retry or switch modes to evade product usage limits.

See the complete [security model](security-model.md).
8 changes: 5 additions & 3 deletions docs/security-model.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,11 @@ transport, or returns a fabricated success.

### Cross-turn data leakage

Browser turns are serialized. Every outer Codex turn navigates to a fresh Temporary Chat page and
closes the prior page. Tool calls for that turn remain in the same ChatGPT response. The bounded
local continuation cache is private, expires, and exists only to implement Codex
Browser turns use at most five independent task-bound tabs in one private login partition. Every
outer Codex task owns a fresh Temporary Chat document and an exact launcher surface lease; chats are
never reused across tasks. Closing a running tab destroys its page and terminates that turn. The
five-tab limit bounds parallel account traffic. Tool calls remain in the same ChatGPT response. The
bounded local continuation cache is private, expires, and exists only to implement Codex
`previous_response_id` replay. ChatGPT Web context compaction remains inside the active browser
response; the bridge does not fabricate or install a Codex history checkpoint.

Expand Down
Loading