원문: totec448-spec/chat-on-steroids · 조사 기준: main / 9e27c0fafc20bf2c81509844d5f92868678b4168 · 조사일: 2026-08-29

핵심 요지

Chat On Steroids는 ChatGPT 웹에 로컬 파일·터미널·세션·선택적 Windows 데스크톱 제어를 MCP로 연결하고, Chrome 확장으로 ChatGPT 대화의 귀속·상태 관찰·Compact & Resume·멀티 에이전트 채팅을 보강하는 Electron 앱이다.[1][2][9]

자체 모델 호스팅이나 별도 채팅 UI가 중심이 아니라, ChatGPT가 로컬 capability를 호출하도록 하는 권한 경계·브리지에 가깝다.[2][5]

현재 package manifest 버전은 2.0.2이고 MIT 라이선스이며, 저장소 설명은 Chrome 통합·Goal·Compact & Resume·durable multi-agent workflow를 핵심 범위로 든다.[4][9]

조사 시점 GitHub API 스냅샷은 stars 496, forks 68, open issues 10, TypeScript, main 기본 브랜치였다.[9]

재현 가능한 조사 범위

  • checkout: 9e27c0fafc20bf2c81509844d5f92868678b4168 (Merge pull request #20 from Bemirror99/fix/stale-fiber-request-attribution)
  • remote 확인: git ls-remote origin refs/heads/main이 checkout과 같은 SHA를 반환함.
  • 최신 공개 release API는 v2.0.2(2026-08-26 공개)이며, 현재 pinned main은 release tag의 peeled commit 이후에 추가된 커밋이다.[10]
  • tracked 파일 232개와 테스트 파일 69개를 확인했으며, README·보안/도구 문서·설정·MCP·세션·에이전트·Goal·computer-use·브리지·계약 테스트 28개를 raw 매니페스트에 저장했다.
  • 이전 README-only 캡처의 body SHA-256은 32d6677407b56695f7b99f600e12d680acbb5e42f9404f20c2754e3175743a0d였고, 이번 캡처의 body SHA-256은 ec6602f817f473a721817606b8cc53819cc1634a8e2717ffa1a656d026c81819이다.

구조: 두 개의 MCP connector

Core는 Windows·macOS·Linux에서 동작하는 필수 connector다.[5][12]

read, view_image, find, apply_patch, exec_command, write_stdin, session, agents라는 8개 가능 도구를 선언하지만, findexec_command/write_stdin이 상호 배타적이어서 fresh all-on snapshot에서는 최대 7개 schema만 노출된다.[5][12]

Desktop은 Windows에서만 유효한 선택 connector이며 observecomputer 두 도구로 화면·창·UI Automation·마우스/키보드·클립보드를 다룬다.[5][12]

Core와 Desktop은 별도의 discovery·권한 경계와 secret-tokenized local path를 가진다.[5][12]

read는 승인된 경로를 읽고 파일·디렉터리·bounded glob·라인 범위를 지원하며, 기본적으로 파일당 256KB·호출 aggregate 512KB payload를 제한한다.[5]

apply_patch는 V4A multi-file patch를 쓰기 전에 preflight하고 create/edit/move/delete 권한을 분리한다.[5]

exec_command는 승인된 working directory에서 시작하지만 정상 사용자 권한의 실제 PowerShell/cmd 또는 POSIX shell을 실행하며, 승인 폴더 안으로 제한되는 sandbox가 아니다.[3][5][20]

긴 실행은 opaque session_id로 반환되고 write_stdin이 이어받는다.[5]

로컬 MCP와 권한 경계

MCP listener는 127.0.0.1의 ephemeral port에만 bind하고, 요청 전에 tokenized path·loopback Host·Origin·body-size를 검사한다.[11]

body는 8MiB로 제한되며 surface별 secret path가 분리되고 앱 재시작 때 토큰이 재생성된다.[11]

저장된 API·bridge credential은 Electron safeStorage를 사용하며 OS별로 Windows DPAPI, macOS Keychain, Linux secure desktop secret store를 사용한다.[3][19]

Linux basic_text 저장은 거부되고 일반 Activity log는 redacted·capped·memory-only다.[3]

브라우저 bridge도 별도 loopback service로 분리되어 파일·명령·설정 변경 route를 노출하지 않는다.[3][21]

번들 확장은 Chrome Manifest V3 구성으로 background/content/fiber/popup 경로를 제공하며, 실제 ChatGPT DOM을 관찰하는 증강 계층은 MCP listener와 별개다.[21][22]

중요한 해석은 이것이 OS/VM 보안 경계가 아니라는 점이다.[3]

승인 root는 파일 도구의 application-level containment일 뿐 same-user filesystem race를 막지 않으며, 명령과 Windows Desktop capability는 로그인한 사용자가 할 수 있는 범위까지 도달할 수 있다.[3][20]

새 설치 기본값과 capability 모델

현재 설정 코드의 missing-config 경로는 현 플랫폼에서 가능한 capability를 모두 켜고 readOnly: false로 시작한다.[13]

Windows fresh install은 Desktop도 켜지만 macOS/Linux는 Windows-only Desktop capability를 runtime에서 mask한다.[3][5][13]

세션 recording은 새 설치에서 켜지고 기본 보존 기간은 30일이다.[5][13]

compaction advisory window는 400,000 token으로 재조정되며 auto-compaction이 켜진다.[5][13]

Goal은 자동으로 ChatGPT에 메시지를 입력하는 기능이라 fresh default에서는 꺼져 있고, 기존 사용자의 명시적 설정이나 손상된 config는 보수적으로 복구한다.[13]

멀티 에이전트는 구현상 experimental 기능이며 현재 fresh config에서는 enabled, 기본 worker 수 2로 설정된다.[5][13]

하나의 prime ChatGPT conversation이 worker를 spawn/message/status/finish하고, 실행 중인 run은 전역적으로 하나만 허용되며 worker는 완료 뒤 sleeping 상태로 대화를 유지해 재사용된다.[5][14]

worker/prime identity는 모델이 bearer credential을 들고 다니는 방식이 아니라 extension이 증명한 ChatGPT conversation에 묶인다.[5][14]

worker 간 직접 통신은 없고, 다른 run이 실행 중일 때 낯선 conversation은 다른 prime의 history를 보지 못한 채 AGENTS_BUSY로 거절된다.[5][14]

세션·Compact & Resume

durable session store는 events.jsonl, 논리적 메시지별 JSON shard, meta.json, asset, handoff로 나뉜다.[16]

streaming 중인 메시지를 매 snapshot마다 중복 저장하지 않고 stable website identity별로 교체하며, 큰 tool args/results는 bounded inline 값과 별도 asset reference로 보존한다.[16]

세션 파일은 애플리케이션 기록이며 safeStorage로 암호화되지 않는다.[3][16]

따라서 같은 OS 계정에 접근할 수 있는 사용자가 대화·tool activity를 읽을 수 있다는 점을 명시적인 limitation으로 둔다.[3]

Compact & Resume은 단순 요약 후 새 세션을 만드는 기능이 아니라, local session identity를 ChatGPT chat A에서 B로 원자적으로 rebind하는 transaction이다.[15]

awaiting-summary → awaiting-chat → claimed → committing → committed 상태를 거치고 한 번만 continuation을 claim하며, 경쟁 claimant는 거부된다.[15]

새 chat B가 존재하고 handoff를 수락했다는 증거가 있을 때만 commit하며, 중간 실패는 session을 chat A에 남긴다.[15]

handoff brief는 B 모델에게 맥락을 주는 용도이고 앱이 이전 상태를 그 brief만으로 재구성하는 저장 포맷은 아니다.[15]

Goal: 별도 모델의 완료 판정 loop

Goal은 사용자의 요청한 concrete work가 끝났는지 별도 모델에 물어보고, 계속 필요하면 다음 user message를 ChatGPT chat에 입력하는 선택 기능이다.[17]

app main process가 OpenRouter에 strict { action, reply } 결정을 요청하고, malformed output·tokenizer/control marker·no-reply를 검증해 브라우저로 전달할 문장만 만든다.[17]

Goal model context는 로컬 recording의 authored user message와 최종 ChatGPT answer 및 Compact bootstrap만 사용하며 tool call arguments/results와 파일 내용은 보내지 않는다.[17]

OpenRouter API key도 extension이 아니라 main process의 OS 보호 저장소에 머문다.[17][19]

Windows computer-use 구현 상태

Desktop connector는 model-facing schema를 observecomputer 두 개로 유지하면서, computerclick_ref, set_value, click, double_click, move, drag, scroll, type, keypress, focus, wait, read_clipboard, write_clipboard 13개 action을 담는다.[5][6]

구현은 최근 screenshot frame을 별도 보관하고 frame·window geometry·helper generation을 검증한다.[6][18]

UI Automation ref가 stale이면 RuntimeId로 재탐색하지 않고 실패하며, background-first PrintWindow와 visible-screen fallback, partial-batch의 completed_count/failed_index, foreground/UI-control postcondition을 제공한다.[6]

Windows.Graphics.Capture/Direct3D persistent stream, binary image transport, helper multiplexing, per-window concurrency, caller/session namespace, observation delta 등은 해당 구현 문서에서 deferred로 남아 있다.[6]

문서의 2026-08-24 검증 수치는 당시 보고이며 이번 pinned HEAD에서 재현한 결과와 섞지 않았다.[6]

릴리스·설치·운영 리스크

v2.0.2 release note는 Windows x64/Arm64, macOS Intel/Apple silicon, Linux x64/Arm64 native packaging과 extension zip, SHA256SUMS를 설명한다.[7]

macOS artifact는 publisher-unsigned·unnotarized이고 Linux AppImage에는 namespace 제한 시 --no-sandbox fallback이 있을 수 있으므로, 배포 artifact를 실행하기 전 checksum과 플랫폼별 caveat를 확인해야 한다.[7]

package script는 npm ci, npm run typecheck, npm test, npm run build와 OS/architecture별 dist 명령을 제공한다.[4]

그러나 이 저장소는 beta이고, ChatGPT 웹 자동화·추가 탭·DOM 관찰 경로는 공개 ChatGPT 자동화 API가 아니므로 OpenAI 약관과 rate-limit·접근 제어 조건을 별도로 검토해야 한다.[2][3]

이번 환경에서 실행한 검증

검증실제 결과
npm ci --ignore-scripts성공
npm run typecheck성공
npm run build성공 — main/preload/renderer production bundle 생성
핵심 경계 focused suite9개 파일 통과, 1개 skip; 474 passed, 47 skipped
전체 npm test66개 파일 통과, 1개 실패, 2개 skip; 1,730 passed, 1 failed, 93 skipped
실패 위치test/search.test.ts: filesScanned 기대 3, 실제 1
npm run verify:privacy실패 — 현재 pinned merge commit의 작성자 identity가 저장소의 noreply 조건을 만족하지 않음
미실행Windows helper/GUI, 실제 ChatGPT 로그인·turn, Secure MCP Tunnel, Chrome extension 실사용, packaged installer·target OS smoke

저장소는 2026-08-24 privacy incident 문서에서 과거 Git metadata의 개인 maintainer email과 Claude provenance URL 노출, tag/branch cleanup, 예방용 privacy gate를 기록한다.[8]

이번 pinned HEAD에서 npm run verify:privacy를 직접 실행한 결과는 위 문서의 cleanup 서술과 달리 현재 reachable merge commit identity에 대해 실패했으며, 개인 이메일 값은 이 문서에 보존하지 않는다.[8]

따라서 이번 조사에서 확인된 것은 소스 build/typecheck와 다수의 unit/contract test이며, 실제 ChatGPT 계정 연결이나 Windows desktop control의 end-to-end 성공이 아니다. 특히 privacy gate 실패와 검색 count 단일 테스트 실패 때문에 저장소의 verify 전체를 통과했다고 기록하지 않는다.

평가와 관련 노트

이 프로젝트의 핵심 선택은 “ChatGPT의 모델/대화를 바꾸는 클라이언트”보다 “ChatGPT 웹에 로컬 capability를 붙이는 application-level control plane”이다.[5][12]

Core는 코드 작업에 집중시키고 Desktop을 별도 connector로 분리해 no-query discovery와 권한 회수 범위를 줄인 설계다.[5][12]

도입 시 우선 확인할 위험은 fresh install의 넓은 기본 권한, shell의 비-sandbox 특성, 암호화되지 않은 상세 session recording, unsigned/unnotarized artifact, 그리고 브라우저 증강 약관 범위다.[3][7][13]

실사용 전에는 read-only, 승인 root, Desktop/Goal/multi-agent 설정을 의도적으로 검토하고 실제 연결 없이 정적·focused 검증부터 재현하는 편이 안전하다.[3][13]

Sources

[1] https://github.com/totec448-spec/chat-on-steroids — chat-on-steroids repository [2] https://raw.githubusercontent.com/totec448-spec/chat-on-steroids/9e27c0fafc20bf2c81509844d5f92868678b4168/README.md — README at pinned commit 9e27c0f [3] https://raw.githubusercontent.com/totec448-spec/chat-on-steroids/9e27c0fafc20bf2c81509844d5f92868678b4168/SECURITY.md — SECURITY.md at pinned commit [4] https://raw.githubusercontent.com/totec448-spec/chat-on-steroids/9e27c0fafc20bf2c81509844d5f92868678b4168/package.json — package.json at pinned commit [5] https://raw.githubusercontent.com/totec448-spec/chat-on-steroids/9e27c0fafc20bf2c81509844d5f92868678b4168/docs/tool-surface.md — tool-surface.md at pinned commit [6] https://raw.githubusercontent.com/totec448-spec/chat-on-steroids/9e27c0fafc20bf2c81509844d5f92868678b4168/docs/computer-use-overhaul-implementation.md — computer-use-overhaul-implementation.md at pinned commit [7] https://raw.githubusercontent.com/totec448-spec/chat-on-steroids/9e27c0fafc20bf2c81509844d5f92868678b4168/docs/release-notes/v2.0.2.md — v2.0.2 release notes at pinned commit [8] https://raw.githubusercontent.com/totec448-spec/chat-on-steroids/9e27c0fafc20bf2c81509844d5f92868678b4168/docs/public-history-privacy-incident-2026-08-24.md — public-history privacy incident at pinned commit [9] https://api.github.com/repos/totec448-spec/chat-on-steroids — GitHub repository API metadata [10] https://api.github.com/repos/totec448-spec/chat-on-steroids/releases/latest — GitHub latest release API [11] https://raw.githubusercontent.com/totec448-spec/chat-on-steroids/9e27c0fafc20bf2c81509844d5f92868678b4168/src/main/mcp/server.ts — MCP server implementation at pinned commit [12] https://raw.githubusercontent.com/totec448-spec/chat-on-steroids/9e27c0fafc20bf2c81509844d5f92868678b4168/src/main/mcp/surfaces.ts — MCP surface definitions at pinned commit [13] https://raw.githubusercontent.com/totec448-spec/chat-on-steroids/9e27c0fafc20bf2c81509844d5f92868678b4168/src/main/config.ts — configuration implementation at pinned commit [14] https://raw.githubusercontent.com/totec448-spec/chat-on-steroids/9e27c0fafc20bf2c81509844d5f92868678b4168/src/main/agents.ts — multi-agent broker at pinned commit [15] https://raw.githubusercontent.com/totec448-spec/chat-on-steroids/9e27c0fafc20bf2c81509844d5f92868678b4168/src/main/session/continuation.ts — Compact & Resume continuation at pinned commit [16] https://raw.githubusercontent.com/totec448-spec/chat-on-steroids/9e27c0fafc20bf2c81509844d5f92868678b4168/src/main/session/store.ts — session store at pinned commit [17] https://raw.githubusercontent.com/totec448-spec/chat-on-steroids/9e27c0fafc20bf2c81509844d5f92868678b4168/src/main/goal.ts — Goal loop at pinned commit [18] https://raw.githubusercontent.com/totec448-spec/chat-on-steroids/9e27c0fafc20bf2c81509844d5f92868678b4168/src/main/computer/index.ts — computer-use runtime at pinned commit [19] https://raw.githubusercontent.com/totec448-spec/chat-on-steroids/9e27c0fafc20bf2c81509844d5f92868678b4168/src/main/secrets.ts — secret storage at pinned commit [20] https://raw.githubusercontent.com/totec448-spec/chat-on-steroids/9e27c0fafc20bf2c81509844d5f92868678b4168/src/main/sandbox.ts — filesystem sandbox at pinned commit [21] https://raw.githubusercontent.com/totec448-spec/chat-on-steroids/9e27c0fafc20bf2c81509844d5f92868678b4168/src/main/bridge.ts — browser bridge at pinned commit [22] https://raw.githubusercontent.com/totec448-spec/chat-on-steroids/9e27c0fafc20bf2c81509844d5f92868678b4168/extension/manifest.json — Chrome extension manifest at pinned commit