Windows ๋ฐํํ๋ฉด์ ์์ฃผํ๋ Tauri ๊ธฐ๋ฐ Codex ์์ ฏ์ ๋๋ค. ์์ ๋ฐ์คํฌํฑ ์์ ฏ ์ฐฝ์์ Codex์ ๋ํํ๊ณ , ๋ธ๋ผ์ฐ์ DOM, ํ๋ฉด/๋น์ , ํฐ๋ฏธ๋/PTY ์ปจํ ์คํธ๋ฅผ ๋ก์ปฌ daemon์ ํตํด ์ฐ๊ฒฐํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
ํ์ฌ ์ํ๋ dogfooding ๊ฐ๋ฅํ ๊ฐ๋ฐ/๋ฆด๋ฆฌ์ค ํ๋ณด ์ํ์
๋๋ค. Chrome Web Store ๋๋ Microsoft Edge Add-ons ์ ์ถ์ dogfooding ์ดํ ์ฒ๋ฆฌํ๋๋ก docs/release/deferred-gates.json์ deferred gate๋ก ๊ธฐ๋ก๋์ด ์์ต๋๋ค.
- Windows ๋ฐ์คํฌํฑ ์์ ฏ: Tauri WebView, tray, start-at-login, hide-to-tray, pin, opacity, resize
- ์ค์๊ฐ ์ฑํ : daemon WebSocket streaming, markdown/GFM table/code block ๋ ๋๋ง, reconnect snapshot replay
- Codex ๋ฐํ์: ๊ธฐ๋ณธ
codex app-server์ธ์ ์ ์ง,codex execfallback, approval/user-input ์นด๋ - ๋ชจ๋ธ/์ถ๋ก ๋ ๋ฒจ ์ ํ: ์์ ฏ UI์ ํ๊ฒฝ๋ณ์๋ก ์ค์ ๊ฐ๋ฅ
- DOM ๋ชจ๋: Chrome/Edge extension ๋๋ bookmarklet/native host๋ฅผ ํตํ active-tab DOM snapshot ์์ง
- Vision ๋ชจ๋: Windows screen capture helper, crop selector, OCR, image hash/diff metadata
- PTY ๋ชจ๋: one-shot command, persistent node-pty/ConPTY session, direct input/key/mouse forwarding
- ํจํค์ง: release exe, MSI, NSIS installer, bundled Node/OCR/PTY runtime
- ๊ฒ์ฆ: release install smoke, release soak, browser-store packet, release readiness audit
๊ฐ๋ฐ/๋น๋ ๊ธฐ์ค:
- Windows 10/11
- Node.js
24+ - npm
- Rust/Cargo,
rustup - Microsoft C++ Build Tools,
Desktop development with C++ - Microsoft Edge WebView2 Runtime
- Codex CLI ๋ก๊ทธ์ธ ๊ฐ๋ฅํ ํ๊ฒฝ
Windows C++ toolchain์ด ์์ผ๋ฉด Tauri/Rust ๋น๋์์ link.exe not found๊ฐ ๋ฐ์ํฉ๋๋ค. Visual Studio Installer์์ Desktop development with C++๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์๋ ๋ช
๋ น์ ์ฌ์ฉํฉ๋๋ค.
winget install --id Microsoft.VisualStudio.2022.BuildTools -e --override "--passive --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended --norestart"ํ์ํ ๋ ํ์ฌ PowerShell์ MSVC ํ๊ฒฝ์ ๋ก๋ํฉ๋๋ค.
.\scripts\use-msvc-env.ps1git clone https://github.com/mir3626/codex-widget-for-desktop.git
cd codex-widget-for-desktop
npm install์ด๋ฏธ ์ ์ฅ์๊ฐ ์๋ค๋ฉด ์ต์ ์ํ๋ฅผ ๋ฐ๊ณ ์์กด์ฑ์ ๋ง์ถฅ๋๋ค.
git pull
npm install๊ธฐ๋ณธ ์ธ์ฆ ๋ฐฉ์์ CODEX_WIDGET_AUTH_MODE=codex์
๋๋ค. ์์ ฏ์ Sign in ๋ฒํผ์ ํ์ํ ๋ Codex CLI ๋ก๊ทธ์ธ ํ๋ฆ์ ์คํํฉ๋๋ค.
CLI์์ ๋จผ์ ๋ก๊ทธ์ธํด๋ ๋ฉ๋๋ค.
codex login๋ก๊ทธ์์์ด ํ์ํ ๊ฒฝ์ฐ ์ ์ญ Codex ๊ณ์ ์ํ๋ฅผ ์ง์ ๊ด๋ฆฌํฉ๋๋ค.
codex logout์์ ฏ์ Sign out์ ์์ ฏ ์ธ์ ๋ง ๋์ต๋๋ค. ์ฌ์ฉ์์ ์ ์ญ Codex CLI ์๊ฒฉ ์ฆ๋ช ์ ์ญ์ ํ์ง ์์ต๋๋ค.
npm run dev์คํ๋๋ฉด:
- Tauri ์์ ฏ ์ฐฝ์ด ์ด๋ฆฝ๋๋ค.
- Vite renderer dev server๋
http://127.0.0.1:5173์์ ์คํ๋ฉ๋๋ค. - widget daemon์
ws://127.0.0.1:4128์์ ์คํ๋ฉ๋๋ค. scripts/dev-hot.mjs๊ฐ daemon TypeScript watch, rebuild, restart๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
Vite URL์ ๊ฐ๋ฐ์ฉ asset server์ ๋๋ค. ์ ํ ํ๋ฉด์ ๋ธ๋ผ์ฐ์ ํญ์ด ์๋๋ผ Tauri ์์ ฏ ์ฐฝ์ ๋๋ค.
Tauri ์ฐฝ ์์ด renderer/daemon loop๋ง ๋ณด๊ณ ์ถ์ ๋ ์ฌ์ฉํฉ๋๋ค.
npm run dev:services5173์ด ์ ์ ๋์ด ์์ผ๋ฉด Vite ์คํ์ด ๋งํ๋๋ค.
$connections = Get-NetTCPConnection -LocalPort 5173 -State Listen -ErrorAction SilentlyContinue
$pids = @($connections | Select-Object -ExpandProperty OwningProcess -Unique)
foreach ($processId in $pids) { Stop-Process -Id $processId -Force }4128์ด ์ ์ ๋์ด ์์ผ๋ฉด daemon ์คํ์ด ๋งํ๋๋ค.
$connections = Get-NetTCPConnection -LocalPort 4128 -State Listen -ErrorAction SilentlyContinue
$pids = @($connections | Select-Object -ExpandProperty OwningProcess -Unique)
foreach ($processId in $pids) { Stop-Process -Id $processId -Force }npm run build:webํฌํจ ์์ :
- daemon TypeScript compile
- daemon standalone bundle ์์ฑ
- renderer Vite build
- bundled Node runtime ์ค๋น
- OCR runtime manifest ์ค๋น
- PTY runtime ์ค๋น
npm run build๊ฒฐ๊ณผ๋ฌผ:
src-tauri/target/release/codex-widget-for-desktop.exesrc-tauri/target/release/bundle/msi/Codex Widget_0.1.0_x64_en-US.msisrc-tauri/target/release/bundle/nsis/Codex Widget_0.1.0_x64-setup.exe
์ค์น๋ ์ฑ์ user-installed Node.js์ ์์กดํ์ง ์์ต๋๋ค. ๋น๋ ๊ณผ์ ์์ daemon bundle, Node runtime, OCR runtime, PTY runtime์ด Tauri resource๋ก ํฌํจ๋ฉ๋๋ค.
NSIS ์ค์น/์คํ/์ ๊ฑฐ smoke:
npm run smoke:release-installMSI ์ค์น/์คํ/์ ๊ฑฐ smoke:
npm run smoke:release-msi-install์ ์ฒด release gate:
npm run release:verifyrelease candidate readiness:
npm run release:readinessํ์ฌ browser-store-submission์ dogfooding ์ดํ ์ฒ๋ฆฌํ๋๋ก deferred ์ํ์
๋๋ค. strict public-release gate๋ ์ค์ store ์ ์ถ ํ์๋ง ํต๊ณผํฉ๋๋ค.
node scripts/release-readiness.mjs --require-manual-gates- ์ฑ ์์ด์ฝ/์ ๋ชฉ: ์์ ฏ ์๋ณ ์์ญ
- ๋๋๊ทธ ์์ญ: ์ฐฝ ์ด๋
- Pin ๋ฒํผ: always-on-top ์ํ ์ ํ
- Opacity slider: ์์ ฏ ํฌ๋ช ๋ ์กฐ์
- Minimize: ์ต์ํ
- Maximize: ์์ ฏ ํ๋/๋ณต์
- Close: ์ฑ ์ข ๋ฃ๊ฐ ์๋๋ผ tray๋ก ์จ๊น
tray ๋ฉ๋ด์์ ๋ค์ ๋ณด์ด๊ธฐ ๋๋ ์์ ์ข ๋ฃ๋ฅผ ํ ์ ์์ต๋๋ค.
- ๊ธฐ๋ณธ๊ฐ์ Codex CLI ์ธ์ฆ์ ๋๋ค.
- Sign in ํด๋ฆญ ์ Codex CLI ๋ก๊ทธ์ธ ์ํ๋ฅผ ํ์ธํฉ๋๋ค.
- ๋ก๊ทธ์ธ์ด ํ์ํ๋ฉด ๋ธ๋ผ์ฐ์ ์ธ์ฆ ํ๋ฆ์ ์ด ์ ์์ต๋๋ค.
- ๋ก๊ทธ์ธ ํ prompt๋ฅผ ์ ๋ ฅํ๋ฉด daemon์ด Codex runtime์ ์์ฒญ์ ์ ๋ฌํฉ๋๋ค.
- Sign out์ ์์ ฏ ์ธ์ ์ฐ๊ฒฐ๋ง ํด์ ํฉ๋๋ค.
ํ๋จ ์ ๋ ฅ์ฐฝ์ ๋ฉ์์ง๋ฅผ ์ ๋ ฅํ๊ณ ์คํ ๋ฒํผ์ ๋๋ฆ ๋๋ค. ์๋ต์ streaming์ผ๋ก ํ์๋ฉ๋๋ค.
์ง์๋๋ ๋ํ UX:
- markdown
- GFM table
- code block
- link rendering
- multi-turn history
- response regenerate
- response branch
- reconnect snapshot replay
Prompt ์์ญ ์ฃผ๋ณ์ selector์์ ๋ชจ๋ธ๊ณผ reasoning effort๋ฅผ ์ ํํฉ๋๋ค.
ํ๊ฒฝ๋ณ์ ๊ธฐ๋ณธ๊ฐ:
$env:CODEX_WIDGET_MODEL="gpt-5.5"
$env:CODEX_WIDGET_REASONING_EFFORT="medium"
npm run devNew chat์ visible chat history์ daemon-side Codex session/thread state๋ฅผ ํจ๊ป ์ด๊ธฐํํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ์๋ก๊ณ ์นจ๊ณผ ๋ค๋ฅด๊ฒ hidden runtime state๋ฅผ ๋ช ์์ ์ผ๋ก ๋ฆฌ์ ํฉ๋๋ค.
Assistant ๋ต๋ณ์ More menu์์ Branch๋ฅผ ์ ํํ๋ฉด:
- ํ์ฌ daemon runtime session์ ์๋ก ์์ํฉ๋๋ค.
- ์ ํํ user/assistant exchange๋ฅผ ๋ค์ prompt์ one-shot branch context๋ก ์ ๋ฌํฉ๋๋ค.
- ์ดํ prompt์๋ branch seed๊ฐ ๋ฐ๋ณต ์ฃผ์ ๋์ง ์์ต๋๋ค.
Regenerate๋ ์ ํํ ๋ต๋ณ ์ดํ์ visible message๋ฅผ ์ ๊ฑฐํ๊ณ , daemon์ regenerate.dropTurns๋ฅผ ๋ณด๋ด Codex app-server thread๋ ๊ฐ์ ๊ฒฝ๊ณ๊น์ง rollbackํ ๋ค ์ ๋ต๋ณ์ ์์ฒญํฉ๋๋ค.
More menu์ read-aloud ๊ธฐ๋ฅ์ ๋ธ๋ผ์ฐ์ /WebView speech API ๊ธฐ๋ฐ์ ๋๋ค. ํ์ฑํ ์ค์๋ stop ์ํ๋ก ์ ํ๋ฉ๋๋ค.
Agent ๋ชจ๋๋ ์ผ๋ฐ Codex ๋ํ์ ๋ก์ปฌ ํ์ผ/์์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ณธ ๋ชจ๋์ ๋๋ค.
๋์ ๊ตฌ์กฐ:
Widget Renderer
-> WebSocket
-> Local Node Daemon
-> Codex app-server
-> Streamed response events
๊ธฐ๋ณธ runtime:
CODEX_WIDGET_CODEX_RUNTIME=app-serverfallback runtime:
$env:CODEX_WIDGET_CODEX_RUNTIME="exec"
npm run dev๊ธฐ๋ณธ ์์ ๋๋ ํฐ๋ฆฌ๋ ์ฌ์ฉ์ ํ์ ๋๋ค. ์์ ฏ ์์ค ์ ์ฅ์๊ฐ ์๋๋ผ ์ฌ์ฉ์์ ๋ฐ์คํฌํฑ ์์ ์ ๋๋ ๋ฐฉํฅ์ ๋๋ค.
$env:CODEX_WIDGET_CODEX_WORKDIR="$HOME"
$env:CODEX_WIDGET_CODEX_SANDBOX="danger-full-access"
$env:CODEX_WIDGET_CODEX_APPROVAL_POLICY="on-request"
npm run devapproval/user-input ์์ฒญ์ด ์ค๋ฉด ์์ ฏ ์์ interaction card๊ฐ ํ์๋ฉ๋๋ค. ์ฌ์ฉ์๊ฐ ์น์ธ/๊ฑฐ์ /์ ๋ ฅํ๋ฉด daemon์ด Codex app-server์ ์๋ตํฉ๋๋ค.
DOM ๋ชจ๋๋ ํ์ฌ ๋ธ๋ผ์ฐ์ ํ์ด์ง์ URL, ์ ๋ชฉ, ์ ํ ํ ์คํธ, ๋ณธ๋ฌธ ํ ์คํธ ๋ฑ์ daemon์ ์ ๋ฌํ๊ณ ๋ชจ๋ธ ์์ฒญ์ ์ปจํ ์คํธ๋ก ๋ถ์ ๋๋ค.
providers/browser-dom-extensionํด๋๋ฅผ ํ์ธํฉ๋๋ค.- Chrome ๋๋ Edge์์ extension ๊ด๋ฆฌ ํ์ด์ง๋ฅผ ์ฝ๋๋ค.
- Developer mode๋ฅผ ์ผญ๋๋ค.
- Load unpacked๋ก
providers/browser-dom-extensionํด๋๋ฅผ ์ ํํฉ๋๋ค. - ์์ ฏ daemon์ด
127.0.0.1:4128์์ ์คํ ์ค์ธ์ง ํ์ธํฉ๋๋ค. - ๋ธ๋ผ์ฐ์ ์์ ์บก์ฒํ ํญ์ ์ฐ ๋ค extension action์ ์คํํฉ๋๋ค.
extension Options์์ daemon snapshot URL์ ๋ฐ๊ฟ ์ ์์ต๋๋ค. ํ์ฉ๋๋ URL์ local endpoint๋ฟ์ ๋๋ค.
์:
http://127.0.0.1:4128/providers/dom/snapshot
http://localhost:4128/providers/dom/snapshot
Invoke-RestMethod `
-Method Post `
-Uri http://127.0.0.1:4128/providers/dom/snapshot `
-ContentType application/json `
-Body '{"url":"https://example.com","title":"Example","selection":"selected text","text":"page text"}'๋ธ๋ผ์ฐ์ extension ์์ด ํ ์คํธํ๋ ค๋ฉด ์๋ ํ์ผ์ ์ฐธ๊ณ ํฉ๋๋ค.
docs/providers/dom-snapshot-bookmarklet.js
์ ํ์ ์ผ๋ก providers/browser-native-host๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. extension์ native messaging host๋ฅผ ๋จผ์ ์๋ํ๊ณ , ๋ฑ๋ก๋์ด ์์ง ์์ผ๋ฉด local HTTP POST๋ก fallbackํฉ๋๋ค.
๊ฒ์ฆ:
npm run smoke:dom
npm run smoke:extension
npm run smoke:browser-native-hostVision ๋ชจ๋๋ ํ๋ฉด snapshot, crop, OCR, image diff metadata๋ฅผ daemon์ ์ ๋ฌํฉ๋๋ค.
- ์์ ฏ์์ Vision ํญ์ ์ ํํฉ๋๋ค.
- Capture action์ ์คํํฉ๋๋ค.
- daemon์ด Windows screen capture helper๋ฅผ ์คํํฉ๋๋ค.
- ๊ฒฐ๊ณผ๊ฐ tool event๋ก ํ์๋๊ณ ๋ค์ ๋ชจ๋ธ ์์ฒญ์ context/image input์ผ๋ก ๋ถ์ต๋๋ค.
powershell -NoProfile -ExecutionPolicy Bypass -File providers/screen-capture-helper/capture-screen.ps1daemon์ผ๋ก ์ง์ snapshot์ ๋ณด๋ผ ์๋ ์์ต๋๋ค.
Invoke-RestMethod `
-Method Post `
-Uri http://127.0.0.1:4128/providers/screen/snapshot `
-ContentType application/json `
-Body '{"source":"manual","title":"Active desktop","description":"A settings dialog is open.","ocrText":"Visible screen text"}'Settings์์ crop ๊ฐ์ ์ค์ ํ๊ฑฐ๋ visual drag selector๋ฅผ ์ฌ์ฉํฉ๋๋ค.
ํ๊ฒฝ๋ณ์:
$env:CODEX_WIDGET_SCREEN_CROP_X="0"
$env:CODEX_WIDGET_SCREEN_CROP_Y="0"
$env:CODEX_WIDGET_SCREEN_CROP_WIDTH="1280"
$env:CODEX_WIDGET_SCREEN_CROP_HEIGHT="720"
npm run dev$env:CODEX_WIDGET_SCREEN_CAPTURE_MAX_WIDTH="1600"
$env:CODEX_WIDGET_SCREEN_CAPTURE_JPEG_QUALITY="72"
npm run devOCR์ ๋ก์ปฌ์์๋ง ์คํ๋ฉ๋๋ค.
์ฐ์ ์์:
- ๋น๋์ ํฌํจ๋ bundled Tesseract runtime
- ๋ช
์ํ
CODEX_WIDGET_SCREEN_OCR_COMMAND - PATH์์ ์ฐพ์
tesseract - OCR ๋นํ์ฑ/๋ฏธ์ฌ์ฉ
๋น๋ ์ tessdata๋ฅผ ์ค๋นํ๋ ค๋ฉด:
$env:CODEX_WIDGET_TESSDATA_LANGUAGES="eng,kor"
npm run build:ocr-runtime์๋ ๋ค์ด๋ก๋:
npm run ocr:fetch-languages -- eng kor๋ฐํ์ OCR ์ค์ :
$env:CODEX_WIDGET_SCREEN_OCR_LANGUAGE="eng+kor"
$env:CODEX_WIDGET_SCREEN_OCR_MAX_CHARS="4000"
npm run devcustom OCR command:
$env:CODEX_WIDGET_SCREEN_OCR_COMMAND='tesseract "{image}" stdout -l eng+kor'
npm run devOCR preprocessing์ ๊ธฐ๋ณธ์ ์ผ๋ก upscaled PNG๋ฅผ OCR ์ ๋ ฅ์ผ๋ก ์ฌ์ฉํฉ๋๋ค. ๋นํ์ฑํ:
$env:CODEX_WIDGET_SCREEN_OCR_DISABLE_PREPROCESS="1"
npm run devdaemon์ screen image hash, changed ์ฌ๋ถ, diff ratio, meaningful-change ์ฌ๋ถ๋ฅผ ๊ณ์ฐํฉ๋๋ค.
$env:CODEX_WIDGET_SCREEN_DIFF_THRESHOLD="0.01"
npm run dev๊ฒ์ฆ:
npm run smoke:screen
npm run smoke:screen-helper
npm run smoke:screen-helper:ocr
npm run smoke:screen-capture:liveTerminal ๋ชจ๋๋ ๋ช ์์ shell command์ persistent PTY session์ ์ง์ํฉ๋๋ค.
์ฑํ ์ฐฝ์์ ์๋ ํํ๋ฅผ ์ ๋ ฅํฉ๋๋ค.
/run Get-ChildItem
$ pwd
PS> Get-Process
fenced shell block๋ ์ธ์ํฉ๋๋ค.
```powershell
Get-ChildItem
```๋ช ๋ น ๊ฒฐ๊ณผ๋ tool output์ผ๋ก stream๋ฉ๋๋ค.
PTY session์ shell state๋ฅผ ์ ์งํฉ๋๋ค.
/pty start
/pty pwd
/pty cd C:\Users\Tony\Desktop
/pty dir
/pty status
/pty stop
ํฌ๊ธฐ ๋ณ๊ฒฝ:
/pty resize 120x30
raw input:
/pty write npm run dev
/pty key enter
/pty key ctrl-c
Terminal tab์ PTY viewport๋ quick action๊ณผ direct input controls๋ฅผ ์ ๊ณตํฉ๋๋ค.
renderer-daemon protocol์ chat turn์ ๋ง๋ค์ง ์๊ณ terminal.input์ผ๋ก text/key/mouse input์ ๋ณด๋ผ ์ ์์ต๋๋ค. UI์์๋ Terminal tab์ direct input row์ mouse-input toggle์ ์ฌ์ฉํฉ๋๋ค.
์ง์ ๋ฒ์:
- text input
- Enter, Tab, Escape, Ctrl+C
- SGR click/release/drag/wheel forwarding
- idle PTY output broadcast
command-oriented ์์ฒญ์์ ์ํํ destructive pattern์ ๊ธฐ๋ณธ ์ฐจ๋จ๋ฉ๋๋ค.
ํ์ฉ์ด ํ์ํ ๋๋ง:
$env:CODEX_WIDGET_TERMINAL_ALLOW_DESTRUCTIVE="1"
npm run dev๊ธฐํ terminal ์ค์ :
$env:CODEX_WIDGET_TERMINAL_WORKDIR="$HOME"
$env:CODEX_WIDGET_TERMINAL_TIMEOUT_MS="60000"
$env:CODEX_WIDGET_TERMINAL_MAX_OUTPUT_CHARS="32000"
npm run dev๊ฒ์ฆ:
npm run smoke:terminal
npm run smoke:terminal-session
npm run smoke:pty-runtime$env:CODEX_WIDGET_AUTH_MODE="codex"
npm run dev๊ถ์ฅ ๋ชจ๋์ ๋๋ค. ์ฌ์ฉ์๋ OpenAI/API key๋ฅผ ์์ ฏ์ ๋ฃ์ง ์์ต๋๋ค. Codex CLI ๋ก๊ทธ์ธ ์ํ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ธ๋ถ backend๊ฐ /oauth/authorize, /oauth/token, streaming agent proxy๋ฅผ ์ ๊ณตํ ๋ ์ฌ์ฉํฉ๋๋ค.
$env:CODEX_WIDGET_AUTH_MODE="pkce"
$env:CODEX_WIDGET_AUTH_BASE_URL="https://auth.example.com"
$env:CODEX_WIDGET_OAUTH_CLIENT_ID="codex-widget"
$env:CODEX_WIDGET_AGENT_PROXY_URL="https://auth.example.com/agent/stream"
npm run dev๋ช ์ URL override:
$env:CODEX_WIDGET_OAUTH_AUTHORIZE_URL="https://auth.example.com/oauth/authorize"
$env:CODEX_WIDGET_OAUTH_TOKEN_URL="https://auth.example.com/oauth/token"
$env:CODEX_WIDGET_AGENT_PROXY_URL="https://auth.example.com/agent/stream"
npm run devproxy request๋ Authorization: Bearer <OAuth access token>์ JSON body๋ฅผ ๋ฐ์ต๋๋ค.
์ด๋ฏธ ๋ฐ๊ธ๋ access token์ผ๋ก ๋ก์ปฌ ๊ฐ๋ฐํ ๋ ์ฌ์ฉํฉ๋๋ค.
$env:CODEX_WIDGET_AUTH_MODE="token"
$env:CODEX_WIDGET_AGENT_PROXY_URL="http://127.0.0.1:8787/agent/stream"
npm run devToken ๋ชจ๋์์ Sign in์ ๋๋ฅด๋ฉด inline token form์ด ์ด๋ฆฌ๊ณ , ์
๋ ฅ๊ฐ์ gitignored .env์ ์ ์ฅ๋ฉ๋๋ค. ์ฌ์ฉ์๊ฐ ์ง์ .env๋ฅผ ์ด ํ์๊ฐ ์์ต๋๋ค.
mock OAuth/proxy ์๋ต์ด ํ์ํ ๋๋ง ์ฌ์ฉํฉ๋๋ค.
npm run dev:auth-proxy๋๋:
$env:CODEX_WIDGET_DEV_AUTH_PROXY="1"
npm run dev.env.example์ ๊ธฐ๋ณธ๊ฐ์ด ์์ต๋๋ค. ์ฃผ์ ํญ๋ชฉ:
| ๋ณ์ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช |
|---|---|---|
CODEX_WIDGET_PORT |
4128 |
daemon WebSocket/HTTP port |
CODEX_WIDGET_AUTH_MODE |
codex |
codex, pkce, token |
CODEX_WIDGET_MODEL |
gpt-5.5 |
๊ธฐ๋ณธ ๋ชจ๋ธ |
CODEX_WIDGET_REASONING_EFFORT |
medium |
๊ธฐ๋ณธ ์ถ๋ก ๋ ๋ฒจ |
CODEX_WIDGET_CODEX_RUNTIME |
app-server |
app-server ๋๋ exec |
CODEX_WIDGET_CODEX_WORKDIR |
empty | Codex runtime workdir override |
CODEX_WIDGET_CODEX_SANDBOX |
danger-full-access |
Codex sandbox policy |
CODEX_WIDGET_CODEX_APPROVAL_POLICY |
on-request |
approval policy |
CODEX_WIDGET_TERMINAL_WORKDIR |
empty | terminal workdir override |
CODEX_WIDGET_TERMINAL_ALLOW_DESTRUCTIVE |
0 |
destructive command ํ์ฉ |
CODEX_WIDGET_SCREEN_CAPTURE_MAX_WIDTH |
1600 |
screen payload ์ต๋ ๋๋น |
CODEX_WIDGET_SCREEN_CAPTURE_JPEG_QUALITY |
72 |
JPEG ํ์ง |
์คํ ์ด ์ ์ถ์ ํ์ฌ dogfooding ์ดํ๋ก deferred ์ฒ๋ฆฌ๋์ด ์์ต๋๋ค.
์ํ ํ์ผ:
docs/release/deferred-gates.json
์ ์ถ runbook:
docs/release/browser-store-submission.md
์คํ ์ด ์ ์ถ ํจํท ์์ฑ:
npm run release:browser-store-packet๊ฒ์ฆ:
npm run smoke:browser-store
npm run release:readiness์ค์ Chrome Web Store ์ ์ถ ํ:
npm run release:confirm-browser-store -- --store chrome-web-store --submission-id <dashboard-submission-id>
node scripts/release-readiness.mjs --require-manual-gates์ค์ Edge Add-ons ์ ์ถ ํ:
npm run release:confirm-browser-store -- --store edge-add-ons --listing-url <listing-or-dashboard-url>
node scripts/release-readiness.mjs --require-manual-gates์ผ๋ฐ ๋ณ๊ฒฝ ํ:
npm run smoke:allUI/chat layout ๋ณ๊ฒฝ ํ:
npm run smoke:renderer-chatCodex app-server protocol ๋ณ๊ฒฝ ํ:
npm run smoke:app-server
npm run smoke:app-server:liveresident lifecycle ๋ณ๊ฒฝ ํ:
npm run smoke:resident
npm run smoke:resident-soakrelease ํ๋ณด:
npm run release:verify
npm run release:soak
npm run release:readinessTauri/Rust ๋ณ๊ฒฝ ํ:
npm run smoke:tauri-supervisor
.\scripts\use-msvc-env.ps1
Push-Location src-tauri
cargo check --no-default-features
Pop-LocationMSVC C++ toolchain์ด ์์ต๋๋ค. Visual Studio Build Tools์ Desktop development with C++๋ฅผ ์ค์นํ ๋ค ์ PowerShell์ ์ด๊ฑฐ๋ .\scripts\use-msvc-env.ps1๋ฅผ ์คํํฉ๋๋ค.
CODEX_WIDGET_AUTH_MODE๊ฐ ์๋ํ ๊ฐ์ธ์ง ํ์ธํฉ๋๋ค.- ๊ธฐ๋ณธ ๋ชจ๋๋ผ๋ฉด
codex login์ด ๋์ํ๋์ง ํ์ธํฉ๋๋ค. - daemon port
4128์ด ์ด๋ ค ์๋์ง ํ์ธํฉ๋๋ค. - dev auth proxy๋ ๊ธฐ๋ณธ ์ธ์ฆ ํ๋ฆ์ด ์๋๋๋ค. mock proxy ์คํ ๋๋ง
CODEX_WIDGET_DEV_AUTH_PROXY=1์ ์ฌ์ฉํฉ๋๋ค.
Tauri drag region์ด ์ ๋ ฅ์ฐฝ ์์ ๊ฒน์น๋ฉด ํด๋ฆญ์ด ๋งํ ์ ์์ต๋๋ค. ์ต์ main์์๋ titlebar/mascot drag์ prompt input์ด ๋ถ๋ฆฌ๋์ด ์์ต๋๋ค. UI ๋ณ๊ฒฝ ํ์๋ ์๋๋ฅผ ์คํํฉ๋๋ค.
npm run smoke:renderer-chat4128 ํ์ธ:
Get-NetTCPConnection -LocalPort 4128 -State Listen -ErrorAction SilentlyContinuedev log ํ์ธ:
Get-ChildItem dist\logs | Sort-Object LastWriteTime -Descending | Select-Object -First 5tesseract๊ฐ PATH์ ์๊ฑฐ๋ bundled OCR runtime์ด ๋น์ด ์์ ์ ์์ต๋๋ค.
npm run smoke:ocr-runtime
npm run smoke:screen-helper:ocrํ์ํ๋ฉด ์ธ์ด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
npm run ocr:fetch-languages -- eng kornode-pty runtime ํ์ธ:
npm run smoke:pty-runtimepipe fallback์ ๊ฐ์ ํ๋ ค๋ฉด:
$env:CODEX_WIDGET_TERMINAL_BACKEND="pipe"
npm run devnpm run smoke:resident
npm run smoke:resident-soakrelease exe ๊ธฐ์ค ์ฅ์๊ฐ ๊ฒ์ฆ:
npm run release:soaksrc/ React renderer
src-tauri/ Tauri shell and native daemon supervisor
scripts/ build, smoke, release, readiness scripts
providers/browser-dom-extension/
providers/browser-native-host/
providers/screen-capture-helper/
docs/context/ product, architecture, QA context
docs/providers/ provider payload examples
docs/release/ release/store/deferred gate runbooks
docs/reports/ generated reports and readiness evidence
dist/ generated daemon/runtime/provider artifacts
dist-renderer/ Vite renderer build output
Tauri Desktop Widget
- titlebar/window/tray/settings
- React chat and provider UI
- WebSocket client
Local Node Daemon
- WebSocket + local HTTP endpoints
- Codex app-server bridge
- provider registry
- terminal/session manager
- screen/DOM snapshot ingestion
External/Local Providers
- Browser extension/native host/bookmarklet
- Windows screen capture helper/OCR
- node-pty/ConPTY shell
daemon์ด session authority์ ๋๋ค. Renderer๋ client์ด๊ณ , provider๋ค์ daemon protocol์ ํตํด ๊ฐ์ ์ธ์ ์ context/tool output์ ๋ถ์ ๋๋ค.