WMOS

개요

구조 한 장

셀은 격리의 단위입니다. 셀 안에는 라우터가 모든 작업을 이동 전에 저장하고, 디렉터리가 좌석 토큰을 발급·회수하며, 데이터베이스는 그 셀에만 속합니다. 좌석은 셀 밖에서 연결해 들어옵니다.

테넌트는 셀이다

테넌트 사이에 공유되는 것은 호스트뿐입니다. 좌석은 어느 기기에서든 토큰을 가진 프로세스이고, 라우터는 토큰을 검증하고 작업을 저장한 뒤 좌석이 열어 둔 스트림으로 밀어 넣습니다.

                ┌──────────────── 테넌트 셀 ──────────────────┐
  에이전트 좌석 ─▶│                                              │◀── 브라우저 좌석 (PC)
  (어느 호스트)   │   라우터 ── 스트림 ──▶ 좌석                  │
                │      │                                        │◀── 실행기 좌석 (호스트)
  메일 좌석 ───▶│      │ 내구 큐 (SQLite, 셀 소유)               │
  (어댑터)       │      ▼                                        │◀── 테스트 좌석 (CI)
                │   디렉터리 (토큰, 회수 스냅샷)                 │
                └───────────────────────────────────────────────┘

작업의 생애

작업은 배달 전에 저장되고, 확인 응답 기준으로 한 번 배달되며, 결과는 요청한 좌석으로 돌아갑니다. 듣고 있는 아무에게나 가지 않습니다.

호출 좌석 ──① POST /agents/caller/a2a──▶ 라우터 ──② 저장──▶ SQLite
                                        │
                                        ├──③ SSE 작업──────▶ 좌석 (어댑터)
                                        │                     │ 실행
                                        │◀──④ POST 결과───────┘
                                        └──⑤ SSE egress────▶ 호출 좌석
                                                              │
                                                    ⑥ ack ────┘
                                       (ack 없으면 TTL까지 재시도)

네 가지 좌석

라우터는 좌석 뒤에 무엇이 있는지 모릅니다. 다른 것은 어디서 도는지, 어떤 신원을 갖는지, 무엇을 반환할 수 있는지입니다.

사람 ─┬─ 에이전트 좌석   어디서나        모델이 판단하는 작업
      ├─ 메일 좌석       어댑터 호스트   메일을 읽고 초안만 반환
      ├─ 브라우저 좌석   소유자 PC       실제 세션, 개인은 메타데이터만
      └─ 실행기 좌석     소유자 호스트   승인된 명령, 과업에 결속
                                       테스트 좌석: CI, 결정적 스위트

어디서 도는가

호스팅 테넌트와 고객 호스트의 셀이 같은 모양입니다. PC 좌석은 인바운드 포트가 필요 없습니다. 밖으로 연결하므로 NAT 뒤의 노트북도 정상 좌석입니다.

(a) 호스팅 테넌트   VPS ─ 셀(라우터, 디렉터리, DB) ─ 웹 콘솔
(b) 고객 호스트     고객 서버 ─ 셀 ─ 고객 좌석
(c) PC 좌석         노트북/PC ── 아웃바운드 스트림 ──▶ 셀   (포트 개방 없음)
(d) 테스트          CI 러너 ── 스위트 ──▶ 실패 번들 ──▶ 개발 에이전트

사설 라우터와 공인 라우터

사설과 공인은 서로 다른 제품이 아니라 **같은 라우터 소스의 두 배포 프로필**입니다. 계약(API·봉투·상관관계·원 대화 반환·멱등)은 공유하고, 차이는 전송 계층에 있습니다: 인증, 등록, 주소 정책.

공인 라우터는 인터넷을 향합니다: 검증된 TLS, 좌석 토큰, 테넌트·주소 정책, 요청 쿼터. 사설 라우터는 소유자 기기나 사내망 안에 있습니다: 루프백 전용, 인증 없음, 좌석이 스스로 등록하고 주소 임차를 갖습니다.

        인터넷
           │  검증된 TLS · 좌석 토큰 · 테넌트/주소/쿼터
     ┌─────▼──────┐
     │ 공인 셀    │  라우터 · 디렉터리 · DB · 웹 콘솔
     └─────▲──────┘
           │  r2r 링크: 서명된 봉투, 경로는 전송 전에 고정,
           │            영수증이 원래 경로로 반환
     ┌─────▼──────┐
     │ 사설 라우터│  루프백 · 인증 없음 · 자동 등록 좌석
     │            │  (소유자 기기 또는 사내망)
     └─────┬──────┘
           │
   로컬 좌석: 실행기 · 브라우저 · codex · opencode

어댑터의 구조와 동작

어댑터는 메시지가 시스템 행동이 되는 유일한 지점입니다. 좌석 토큰을 들고 스트림을 열어 두고, 작업을 받아 허용 여부를 판단하고, 실행한 뒤 요청한 좌석에 결과를 돌려줍니다.

라우터는 본문을 해석하지 않습니다. 저장·배달·재시도·기록만 하고, 해석과 권한 확인, 무엇을 건드렸는지의 기록은 어댑터가 소유합니다.

좌석 토큰 ─▶ [ 전송 ]    SSE 수신 · POST 결과 / egress ack
                 │
                 ▼
            [ 정책 ]      origin 허용목록 · 도메인 목록 · 콘텐츠 정책
                 │
                 ▼
            [ 실행기 ]    시스템 API · 브라우저 스텝 · 메일 초안
                 │
                 ▼
            [ 결과 ]      상태 · 데이터 · 활동 ──▶ 원래 좌석
                 │
   ↺ 백오프 재연결 · 토큰 갱신 · 일시 오류는 1회 재시도

어댑터의 종류

위 루프는 모든 어댑터에서 동일하고, 실행기만 바뀝니다. 그래서 새 연동은 새 프로토콜이 아니라 새 실행기입니다.

메일      Gmail 푸시 / IMAP 폴링 ─▶ 접수 좌석 ─▶ 제안 ─▶ 사람 ─▶ 초안
브라우저  스텝 목록 ─▶ 소유자 PC의 ego lite ─▶ 페이지 데이터 / 스크린샷
실행기    과업 ─▶ 호스트의 승인된 명령 ─▶ 과업에 결속된 결과
엔진      작업 ─▶ codex / opencode 세션 ─▶ 대화에 결속된 결과
라우터    봉투 ─▶ 다음 라우터 ─▶ 같은 경로로 영수증 반환