Skip to content

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

ย 

History

155 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Codex Widget for Desktop

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 exec fallback, 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.ps1

์„ค์น˜ ๋ฐ ์‹คํ–‰

1. ์ €์žฅ์†Œ ์ค€๋น„

git clone https://github.com/mir3626/codex-widget-for-desktop.git
cd codex-widget-for-desktop
npm install

์ด๋ฏธ ์ €์žฅ์†Œ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ตœ์‹  ์ƒํƒœ๋ฅผ ๋ฐ›๊ณ  ์˜์กด์„ฑ์„ ๋งž์ถฅ๋‹ˆ๋‹ค.

git pull
npm install

2. Codex CLI ๋กœ๊ทธ์ธ

๊ธฐ๋ณธ ์ธ์ฆ ๋ฐฉ์‹์€ CODEX_WIDGET_AUTH_MODE=codex์ž…๋‹ˆ๋‹ค. ์œ„์ ฏ์˜ Sign in ๋ฒ„ํŠผ์€ ํ•„์š”ํ•  ๋•Œ Codex CLI ๋กœ๊ทธ์ธ ํ๋ฆ„์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

CLI์—์„œ ๋จผ์ € ๋กœ๊ทธ์ธํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.

codex login

๋กœ๊ทธ์•„์›ƒ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ „์—ญ Codex ๊ณ„์ • ์ƒํƒœ๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

codex logout

์œ„์ ฏ์˜ Sign out์€ ์œ„์ ฏ ์„ธ์…˜๋งŒ ๋Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์˜ ์ „์—ญ Codex CLI ์ž๊ฒฉ ์ฆ๋ช…์„ ์‚ญ์ œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

3. ๊ฐœ๋ฐœ ๋ชจ๋“œ ์‹คํ–‰

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 ์œ„์ ฏ ์ฐฝ์ž…๋‹ˆ๋‹ค.

4. dev server๋งŒ ์‹คํ–‰

Tauri ์ฐฝ ์—†์ด renderer/daemon loop๋งŒ ๋ณด๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

npm run dev:services

5. ํฌํŠธ ์ถฉ๋Œ ํ•ด๊ฒฐ

5173์ด ์ ์œ ๋˜์–ด ์žˆ์œผ๋ฉด 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 }

๋นŒ๋“œ ๋ฐ ์„ค์น˜ ํŒŒ์ผ ์ƒ์„ฑ

์›น/daemon/runtime ๋ฆฌ์†Œ์Šค ๋นŒ๋“œ

npm run build:web

ํฌํ•จ ์ž‘์—…:

  • daemon TypeScript compile
  • daemon standalone bundle ์ƒ์„ฑ
  • renderer Vite build
  • bundled Node runtime ์ค€๋น„
  • OCR runtime manifest ์ค€๋น„
  • PTY runtime ์ค€๋น„

Tauri release ๋นŒ๋“œ

npm run build

๊ฒฐ๊ณผ๋ฌผ:

  • src-tauri/target/release/codex-widget-for-desktop.exe
  • src-tauri/target/release/bundle/msi/Codex Widget_0.1.0_x64_en-US.msi
  • src-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-install

MSI ์„ค์น˜/์‹คํ–‰/์ œ๊ฑฐ smoke:

npm run smoke:release-msi-install

์ „์ฒด release gate:

npm run release:verify

release candidate readiness:

npm run release:readiness

ํ˜„์žฌ browser-store-submission์€ dogfooding ์ดํ›„ ์ฒ˜๋ฆฌํ•˜๋„๋ก deferred ์ƒํƒœ์ž…๋‹ˆ๋‹ค. strict public-release gate๋Š” ์‹ค์ œ store ์ œ์ถœ ํ›„์—๋งŒ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค.

node scripts/release-readiness.mjs --require-manual-gates

๊ธฐ๋ณธ UI ์‚ฌ์šฉ๋ฒ•

ํƒ€์ดํ‹€๋ฐ”

  • ์•ฑ ์•„์ด์ฝ˜/์ œ๋ชฉ: ์œ„์ ฏ ์‹๋ณ„ ์˜์—ญ
  • ๋“œ๋ž˜๊ทธ ์˜์—ญ: ์ฐฝ ์ด๋™
  • Pin ๋ฒ„ํŠผ: always-on-top ์ƒํƒœ ์ „ํ™˜
  • Opacity slider: ์œ„์ ฏ ํˆฌ๋ช…๋„ ์กฐ์ ˆ
  • Minimize: ์ตœ์†Œํ™”
  • Maximize: ์œ„์ ฏ ํ™•๋Œ€/๋ณต์›
  • Close: ์•ฑ ์ข…๋ฃŒ๊ฐ€ ์•„๋‹ˆ๋ผ tray๋กœ ์ˆจ๊น€

tray ๋ฉ”๋‰ด์—์„œ ๋‹ค์‹œ ๋ณด์ด๊ธฐ ๋˜๋Š” ์™„์ „ ์ข…๋ฃŒ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Sign in / Sign out

  • ๊ธฐ๋ณธ๊ฐ’์€ Codex CLI ์ธ์ฆ์ž…๋‹ˆ๋‹ค.
  • Sign in ํด๋ฆญ ์‹œ Codex CLI ๋กœ๊ทธ์ธ ์ƒํƒœ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ € ์ธ์ฆ ํ๋ฆ„์„ ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋กœ๊ทธ์ธ ํ›„ prompt๋ฅผ ์ž…๋ ฅํ•˜๋ฉด daemon์ด Codex runtime์— ์š”์ฒญ์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • Sign out์€ ์œ„์ ฏ ์„ธ์…˜ ์—ฐ๊ฒฐ๋งŒ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.

Prompt ์ž…๋ ฅ

ํ•˜๋‹จ ์ž…๋ ฅ์ฐฝ์— ๋ฉ”์‹œ์ง€๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ์‹คํ–‰ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค. ์‘๋‹ต์€ 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 dev

New Chat

New chat์€ visible chat history์™€ daemon-side Codex session/thread state๋ฅผ ํ•จ๊ป˜ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ์ƒˆ๋กœ๊ณ ์นจ๊ณผ ๋‹ค๋ฅด๊ฒŒ hidden runtime state๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋ฆฌ์…‹ํ•ฉ๋‹ˆ๋‹ค.

Branch

Assistant ๋‹ต๋ณ€์˜ More menu์—์„œ Branch๋ฅผ ์„ ํƒํ•˜๋ฉด:

  • ํ˜„์žฌ daemon runtime session์„ ์ƒˆ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • ์„ ํƒํ•œ user/assistant exchange๋ฅผ ๋‹ค์Œ prompt์— one-shot branch context๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • ์ดํ›„ prompt์—๋Š” branch seed๊ฐ€ ๋ฐ˜๋ณต ์ฃผ์ž…๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Regenerate

Regenerate๋Š” ์„ ํƒํ•œ ๋‹ต๋ณ€ ์ดํ›„์˜ visible message๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , daemon์— regenerate.dropTurns๋ฅผ ๋ณด๋‚ด Codex app-server thread๋„ ๊ฐ™์€ ๊ฒฝ๊ณ„๊นŒ์ง€ rollbackํ•œ ๋’ค ์ƒˆ ๋‹ต๋ณ€์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

Read aloud

More menu์˜ read-aloud ๊ธฐ๋Šฅ์€ ๋ธŒ๋ผ์šฐ์ €/WebView speech API ๊ธฐ๋ฐ˜์ž…๋‹ˆ๋‹ค. ํ™œ์„ฑํ™” ์ค‘์—๋Š” stop ์ƒํƒœ๋กœ ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค.

Agent ๋ชจ๋“œ

Agent ๋ชจ๋“œ๋Š” ์ผ๋ฐ˜ Codex ๋Œ€ํ™”์™€ ๋กœ์ปฌ ํŒŒ์ผ/์ž‘์—… ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ๋ณธ ๋ชจ๋“œ์ž…๋‹ˆ๋‹ค.

๋™์ž‘ ๊ตฌ์กฐ:

Widget Renderer
  -> WebSocket
  -> Local Node Daemon
  -> Codex app-server
  -> Streamed response events

๊ธฐ๋ณธ runtime:

CODEX_WIDGET_CODEX_RUNTIME=app-server

fallback 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 dev

approval/user-input ์š”์ฒญ์ด ์˜ค๋ฉด ์œ„์ ฏ ์•ˆ์— interaction card๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์Šน์ธ/๊ฑฐ์ ˆ/์ž…๋ ฅํ•˜๋ฉด daemon์ด Codex app-server์— ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.

DOM ๋ชจ๋“œ

DOM ๋ชจ๋“œ๋Š” ํ˜„์žฌ ๋ธŒ๋ผ์šฐ์ € ํŽ˜์ด์ง€์˜ URL, ์ œ๋ชฉ, ์„ ํƒ ํ…์ŠคํŠธ, ๋ณธ๋ฌธ ํ…์ŠคํŠธ ๋“ฑ์„ daemon์— ์ „๋‹ฌํ•˜๊ณ  ๋ชจ๋ธ ์š”์ฒญ์— ์ปจํ…์ŠคํŠธ๋กœ ๋ถ™์ž…๋‹ˆ๋‹ค.

Chrome/Edge extension ์‚ฌ์šฉ

  1. providers/browser-dom-extension ํด๋”๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  2. Chrome ๋˜๋Š” Edge์—์„œ extension ๊ด€๋ฆฌ ํŽ˜์ด์ง€๋ฅผ ์—ฝ๋‹ˆ๋‹ค.
  3. Developer mode๋ฅผ ์ผญ๋‹ˆ๋‹ค.
  4. Load unpacked๋กœ providers/browser-dom-extension ํด๋”๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  5. ์œ„์ ฏ daemon์ด 127.0.0.1:4128์—์„œ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  6. ๋ธŒ๋ผ์šฐ์ €์—์„œ ์บก์ฒ˜ํ•  ํƒญ์„ ์—ฐ ๋’ค 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

DOM snapshot API ์ง์ ‘ ํ˜ธ์ถœ

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"}'

Bookmarklet fallback

๋ธŒ๋ผ์šฐ์ € extension ์—†์ด ํ…Œ์ŠคํŠธํ•˜๋ ค๋ฉด ์•„๋ž˜ ํŒŒ์ผ์„ ์ฐธ๊ณ ํ•ฉ๋‹ˆ๋‹ค.

docs/providers/dom-snapshot-bookmarklet.js

Native messaging host

์„ ํƒ์ ์œผ๋กœ 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-host

Vision ๋ชจ๋“œ

Vision ๋ชจ๋“œ๋Š” ํ™”๋ฉด snapshot, crop, OCR, image diff metadata๋ฅผ daemon์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

์œ„์ ฏ์—์„œ ์บก์ฒ˜

  1. ์œ„์ ฏ์—์„œ Vision ํƒญ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  2. Capture action์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  3. daemon์ด Windows screen capture helper๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  4. ๊ฒฐ๊ณผ๊ฐ€ tool event๋กœ ํ‘œ์‹œ๋˜๊ณ  ๋‹ค์Œ ๋ชจ๋ธ ์š”์ฒญ์— context/image input์œผ๋กœ ๋ถ™์Šต๋‹ˆ๋‹ค.

Screen helper ์ง์ ‘ ์‹คํ–‰

powershell -NoProfile -ExecutionPolicy Bypass -File providers/screen-capture-helper/capture-screen.ps1

daemon์œผ๋กœ ์ง์ ‘ 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"}'

Crop ์„ค์ •

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 dev

OCR

OCR์€ ๋กœ์ปฌ์—์„œ๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์šฐ์„ ์ˆœ์œ„:

  1. ๋นŒ๋“œ์— ํฌํ•จ๋œ bundled Tesseract runtime
  2. ๋ช…์‹œํ•œ CODEX_WIDGET_SCREEN_OCR_COMMAND
  3. PATH์—์„œ ์ฐพ์€ tesseract
  4. 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 dev

custom OCR command:

$env:CODEX_WIDGET_SCREEN_OCR_COMMAND='tesseract "{image}" stdout -l eng+kor'
npm run dev

OCR preprocessing์€ ๊ธฐ๋ณธ์ ์œผ๋กœ upscaled PNG๋ฅผ OCR ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋น„ํ™œ์„ฑํ™”:

$env:CODEX_WIDGET_SCREEN_OCR_DISABLE_PREPROCESS="1"
npm run dev

์ด๋ฏธ์ง€ ๋ณ€ํ™” ๊ฐ์ง€

daemon์€ 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:live

PTY / Terminal ๋ชจ๋“œ

Terminal ๋ชจ๋“œ๋Š” ๋ช…์‹œ์  shell command์™€ persistent PTY session์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

One-shot command

์ฑ„ํŒ…์ฐฝ์—์„œ ์•„๋ž˜ ํ˜•ํƒœ๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

/run Get-ChildItem
$ pwd
PS> Get-Process

fenced shell block๋„ ์ธ์‹ํ•ฉ๋‹ˆ๋‹ค.

```powershell
Get-ChildItem
```

๋ช…๋ น ๊ฒฐ๊ณผ๋Š” tool output์œผ๋กœ stream๋ฉ๋‹ˆ๋‹ค.

Persistent PTY session

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๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Direct terminal input

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

์ธ์ฆ ๋ชจ๋“œ

Codex ๋ชจ๋“œ, ๊ธฐ๋ณธ๊ฐ’

$env:CODEX_WIDGET_AUTH_MODE="codex"
npm run dev

๊ถŒ์žฅ ๋ชจ๋“œ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” OpenAI/API key๋ฅผ ์œ„์ ฏ์— ๋„ฃ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Codex CLI ๋กœ๊ทธ์ธ ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

PKCE/OAuth proxy ์‹คํ—˜

์™ธ๋ถ€ 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 dev

proxy request๋Š” Authorization: Bearer <OAuth access token>์™€ JSON body๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.

Token ๋ชจ๋“œ

์ด๋ฏธ ๋ฐœ๊ธ‰๋œ access token์œผ๋กœ ๋กœ์ปฌ ๊ฐœ๋ฐœํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

$env:CODEX_WIDGET_AUTH_MODE="token"
$env:CODEX_WIDGET_AGENT_PROXY_URL="http://127.0.0.1:8787/agent/stream"
npm run dev

Token ๋ชจ๋“œ์—์„œ Sign in์„ ๋ˆ„๋ฅด๋ฉด inline token form์ด ์—ด๋ฆฌ๊ณ , ์ž…๋ ฅ๊ฐ’์€ gitignored .env์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ .env๋ฅผ ์—ด ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

Dev auth proxy

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 ํ’ˆ์งˆ

Browser store ์ œ์ถœ

์Šคํ† ์–ด ์ œ์ถœ์€ ํ˜„์žฌ 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:all

UI/chat layout ๋ณ€๊ฒฝ ํ›„:

npm run smoke:renderer-chat

Codex app-server protocol ๋ณ€๊ฒฝ ํ›„:

npm run smoke:app-server
npm run smoke:app-server:live

resident lifecycle ๋ณ€๊ฒฝ ํ›„:

npm run smoke:resident
npm run smoke:resident-soak

release ํ›„๋ณด:

npm run release:verify
npm run release:soak
npm run release:readiness

Tauri/Rust ๋ณ€๊ฒฝ ํ›„:

npm run smoke:tauri-supervisor
.\scripts\use-msvc-env.ps1
Push-Location src-tauri
cargo check --no-default-features
Pop-Location

๋ฌธ์ œ ํ•ด๊ฒฐ

link.exe not found

MSVC C++ toolchain์ด ์—†์Šต๋‹ˆ๋‹ค. Visual Studio Build Tools์— Desktop development with C++๋ฅผ ์„ค์น˜ํ•œ ๋’ค ์ƒˆ PowerShell์„ ์—ด๊ฑฐ๋‚˜ .\scripts\use-msvc-env.ps1๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Sign in์ด ๋ฐ˜์‘ํ•˜์ง€ ์•Š์Œ

  1. CODEX_WIDGET_AUTH_MODE๊ฐ€ ์˜๋„ํ•œ ๊ฐ’์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ธฐ๋ณธ ๋ชจ๋“œ๋ผ๋ฉด codex login์ด ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  3. daemon port 4128์ด ์—ด๋ ค ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  4. dev auth proxy๋Š” ๊ธฐ๋ณธ ์ธ์ฆ ํ๋ฆ„์ด ์•„๋‹™๋‹ˆ๋‹ค. mock proxy ์‹คํ—˜ ๋•Œ๋งŒ CODEX_WIDGET_DEV_AUTH_PROXY=1์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Prompt ์ž…๋ ฅ์ด ์•ˆ ๋จ

Tauri drag region์ด ์ž…๋ ฅ์ฐฝ ์œ„์— ๊ฒน์น˜๋ฉด ํด๋ฆญ์ด ๋ง‰ํž ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ์‹  main์—์„œ๋Š” titlebar/mascot drag์™€ prompt input์ด ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. UI ๋ณ€๊ฒฝ ํ›„์—๋Š” ์•„๋ž˜๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

npm run smoke:renderer-chat

daemon ์—ฐ๊ฒฐ ์‹คํŒจ

4128 ํ™•์ธ:

Get-NetTCPConnection -LocalPort 4128 -State Listen -ErrorAction SilentlyContinue

dev log ํ™•์ธ:

Get-ChildItem dist\logs | Sort-Object LastWriteTime -Descending | Select-Object -First 5

screen OCR์ด ๋™์ž‘ํ•˜์ง€ ์•Š์Œ

tesseract๊ฐ€ PATH์— ์—†๊ฑฐ๋‚˜ bundled OCR runtime์ด ๋น„์–ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

npm run smoke:ocr-runtime
npm run smoke:screen-helper:ocr

ํ•„์š”ํ•˜๋ฉด ์–ธ์–ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

npm run ocr:fetch-languages -- eng kor

PTY๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š์Œ

node-pty runtime ํ™•์ธ:

npm run smoke:pty-runtime

pipe fallback์„ ๊ฐ•์ œํ•˜๋ ค๋ฉด:

$env:CODEX_WIDGET_TERMINAL_BACKEND="pipe"
npm run dev

์œ„์ ฏ์ด ๋งŽ์€ ๋ฆฌ์†Œ์Šค๋ฅผ ์“ฐ๋Š”์ง€ ํ™•์ธ

npm run smoke:resident
npm run smoke:resident-soak

release exe ๊ธฐ์ค€ ์žฅ์‹œ๊ฐ„ ๊ฒ€์ฆ:

npm run release:soak

ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

src/                         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์„ ๋ถ™์ž…๋‹ˆ๋‹ค.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages