Skip to content
 
 

Repository files navigation

Oracle Sol Pro

이 저장소는 steipete/oracle을 다음 용도로 경량화한 포크입니다.

로그인된 ChatGPT 웹에서 GPT-5.6 Sol을 Pro 모드로 고정해 질문과 검증된 첨부를 전달하고, 답변 또는 ChatGPT 관리형 생성 이미지 artifact를 받으며, 식별자를 이미 아는 실행을 복구합니다.

공개 MCP 도구는 정확히 consult, generate_image, run_status 세 개입니다. 제공자 API, 다른 채팅 모델, 다중 모델, 폴백, Deep Research, 후속 질문, 대화 보관 기능은 제공하지 않습니다. 공개 입력에는 model, engine, provider, backend 선택자가 없습니다.

보장하는 동작

  • 요청 모델은 gpt-5.6-sol-pro 하나로 고정됩니다.
  • GPT-5.6 Sol 모델과 Pro 모드를 post-navigation과 pre-submit 두 단계에서 화면 증거로 확인합니다.
  • 선택 증거가 없거나 다른 모델로 보이면 프롬프트를 보내지 않고 실패합니다.
  • 모든 첨부는 immutable temporary snapshot으로 만들며 브리지가 크기와 SHA-256을 다시 검증합니다.
  • 실제로 포함·제외·업로드한 항목은 attachment manifest로 반환합니다.
  • ChatGPT 로그인은 별도 Chrome 프로필(~/.oracle/browser-profile)에 유지합니다.
  • 브라우저가 실행되는 Windows 호스트와 MCP 클라이언트는 토큰으로 보호된 loopback 브리지로 통신합니다.

요구 사항

  • Node.js 24 이상
  • pnpm 12.1.0
  • Chrome
  • GPT-5.6 Sol과 Pro 모드 및 이미지 기능을 사용할 수 있는 ChatGPT 계정

소스에서 설치

git clone https://github.com/backryun/oracle.git
cd oracle
pnpm install --frozen-lockfile --trust-lockfile
pnpm build

Windows 브리지 시작

처음 한 번은 전용 Chrome 창에서 ChatGPT에 로그인해야 합니다. 브리지 호스트를 시작하고 출력된 연결 문자열을 같은 PC 또는 MCP 클라이언트에 등록합니다.

node dist/bin/oracle-cli.js bridge host --background --print
node dist/bin/oracle-cli.js bridge client --connect "<출력된 연결 문자열>"
node dist/bin/oracle-cli.js bridge doctor

Codex용 MCP 설정 조각은 다음 명령으로 확인합니다.

node dist/bin/oracle-cli.js bridge codex-config --print-token

MCP 실행 파일은 dist/bin/oracle-mcp.js입니다. ~/.oracle/config.json은 주석이나 후행 쉼표가 없는 표준 JSON이어야 합니다.

MCP 도구 계약

consult

입력은 { prompt: string, files?: string[], dryRun?: boolean }입니다.

{
  "prompt": "이 코드의 경쟁 조건을 검토해줘.",
  "files": ["src/sessionStore.ts", "tests/sessionStore.test.ts"],
  "dryRun": false
}
  • prompt: 비어 있지 않은 필수 질문
  • files: 선택적 파일·디렉터리·glob 목록이며, 생략하면 빈 목록
  • dryRun: true면 브라우저를 열지 않고 첨부 계획과 manifest만 검증

structured content의 필드는 상태에 따라 다음처럼 결정됩니다.

  • status: "completed"에는 sessionId, answer, transcriptPath, promptSubmitted, manifest, exclusions, selection이 필수이고 conversationUrlbundle은 선택 사항입니다. conversationUrl은 브라우저가 대화 URL을 보존했을 때만 옵니다.
  • status: "dry-run"에는 manifestexclusions가 필수이고 bundle은 필요한 경우에만 옵니다.
  • status: "failed"에는 error가 필수이며, handler는 오류 code, stage, message를 담습니다.

generate_image

입력은 { prompt: string, files?: string[] }입니다. files에는 선택적 참조 이미지나 문서를 넣습니다.

성공한 structured content의 계약은 다음과 같습니다.

{
  "sessionId": "sol-...",
  "status": "completed",
  "requestingModel": "gpt-5.6-sol-pro",
  "imageBackend": "chatgpt-web-managed",
  "images": [
    {
      "path": "C:/.../image-1.png",
      "mimeType": "image/png",
      "byteSize": 123456,
      "sha256": "...",
      "width": 1024,
      "height": 1024
    }
  ]
}

응답 content는 로컬 경로를 담은 text summary가 먼저 오고, 이어서 이미지마다 { type: "image", data, mimeType } MCP image block이 옵니다. Base64 bytes는 image block의 data에만 있고 structured content에는 포함되지 않습니다. requestingModel은 항상 gpt-5.6-sol-pro, imageBackend는 항상 chatgpt-web-managed입니다.

실패한 structured content는 { status: "failed", requestingModel, imageBackend, images: [], error }이며 sessionId와 image block을 반환하지 않습니다.

run_status

입력은 { sessionId: string } 하나뿐입니다.

{
  "sessionId": "sol-..."
}

structured content는 공통으로 sessionId, kind(consult 또는 generate-image), status, artifacts를 반환합니다. pending 또는 running이면 queuePosition이 있을 수 있고, 완료된 상담이면 answertranscriptPath가 필수입니다. 완료된 이미지 실행은 image artifact가 하나 이상 필요하며, 실패하면 status: "error"error가 옵니다.

run_status는 호출자가 session ID를 이미 알고 있을 때만 기존 실행을 재제출하지 않고 브리지 상태와 누락된 검증 artifact를 동기화·복구할 수 있습니다. 이 ID는 이전 완료 응답이나 별도로 보존한 로컬 session 기록에서 얻어야 합니다. blocking consult 또는 generate_image 호출의 MCP 연결이 결과 전에 끊기면 그 호출은 새로 생성된 session ID를 호출자에게 전달하지 못합니다.

첨부 manifest와 제한

consult dry-run 및 완료 결과의 manifestpolicy: "sol-attachments@2"이며 다음 필드를 가집니다.

  • 최상위: policy, workspaceRoot, files, exclusions, uploads, sourceBytes, uploadBytes
  • files 항목: path, kind, sizeBytes, sha256, uploadName
  • uploads 항목: name, kind, sourcePaths, sizeBytes, sha256
  • exclusions 항목: path, displayPath, reason, 선택적 pattern

exclusion reason은 explicit-exclude, gitignore, default-ignore, dotfile, secret-policy 중 하나입니다. sourceBytes는 선택된 원본 snapshot의 합계이고 uploadBytes는 실제 브라우저 업로드의 합계입니다.

uploadName과 upload name은 ChatGPT가 반복 업로드를 (1)로 자동 개명하지 못하도록 만든 실행별 충돌 방지 업로드 별칭입니다. 원본 상대 경로는 file path와 upload sourcePaths에 그대로 남고, 확장자·크기·SHA-256도 보존됩니다. 브라우저 전송 전과 전송된 사용자 턴에서 이 별칭을 완전일치로 검증합니다.

  • native image는 최대 10개, 각 20 MiB입니다.
  • document source는 최대 256개, 각 5 MiB입니다.
  • document 하나는 native document snapshot 하나로, 둘 이상은 document ZIP 하나로 전송합니다. 따라서 document 또는 document ZIP 업로드는 최대 하나입니다.
  • native image와 document/document ZIP을 합친 업로드 총량은 128 MiB입니다.

.env*, credential dotfile, 개인 키 파일명·확장자, 클라우드 credential 파일과 개인 키 내용은 override 없이 hard-block합니다. 명시적으로 선택한 secret은 secret-file-blocked로 실패하고, 디렉터리나 glob 탐색에서 발견한 secret은 업로드하지 않은 채 secret-policy exclusion으로 기록합니다. symlink·junction workspace escape도 허용하지 않습니다.

durable FIFO와 복구

브리지는 활성 실행 1개와 대기 실행 3개를 FIFO로 처리합니다. 네 자리가 모두 찬 뒤의 요청은 HTTP 429로 거절합니다. 동일 session ID와 동일 payload는 idempotent하지만, 같은 ID에 다른 payload를 보내면 충돌로 거절합니다.

MCP 연결이 유지되는 동안 consultgenerate_image는 durable 실행을 한 번 제출하고 완료까지 poll합니다. 연결이 끊겨도 브리지의 실행과 상태는 남지만, run_status 복구에는 호출자가 별도로 알고 있는 같은 session ID가 필요합니다. 재시작 때 아직 제출되지 않은 작업만 다시 대기열에 넣고, submission-uncertain 또는 prompt-submitted 실행은 자동 replay하지 않습니다.

생성 이미지 제한과 사용량

생성 이미지는 정확한 현재 assistant turn에서만 가져오며 최대 4개, 이미지당 16 MiB, 합계 64 MiB까지 허용합니다. PNG, JPEG, WebP, GIF의 magic signature와 MIME이 일치해야 하며 HTML, JSON, SVG, 이전 turn의 이미지는 거절합니다. 다운로드는 로그인된 브라우저 문맥에서 수행하고 크기·SHA-256·형식을 검증한 뒤 로컬 artifact로 원자적으로 저장합니다.

이 경로는 Codex $imagegen을 호출하지 않고 제공자 이미지 API도 사용하지 않습니다. 다만 이미지 생성은 로그인된 ChatGPT 웹 기능이므로 계정의 ChatGPT 웹 요금제, 사용량, 속도 제한은 그대로 적용됩니다.

개발 검증

pnpm format:check
pnpm lint
pnpm typecheck
pnpm build
pnpm test:package
pnpm test

보안

  • 브리지 token과 connection file을 외부에 공개하지 않습니다.
  • ChatGPT cookie, bearer token, prompt 본문, 첨부 bytes를 로그나 결과에 남기지 않습니다.
  • 생성 이미지 Base64는 MCP image content 외부, 특히 structured content에 넣지 않습니다.
  • 브리지 호스트는 기본적으로 127.0.0.1:9473에만 바인딩됩니다.

라이선스

MIT. 원본 저작권과 라이선스는 LICENSE를 따릅니다.

About

Ask the oracle when you're stuck. Invoke GPT-5 Pro with a custom context and files.

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages