Based on repository activity, growth velocity and community engagement.
22
Growth2/30
Activity4/25
Popularity2/25
Trust14/20
2
Stars
High
Sentiment
Votes
2
README.md
AI Orchestrator Lab
데스크톱 AI 오케스트레이터와 dgx-02 서버를 함께 쓰는, 캐릭터 기반 멀티 에이전트 코딩 OS입니다. 맥북/홈 PC가 지휘실, dgx-02가 메인 authority·실행 서버입니다.
단순한 채팅 앱이나 토론 UI가 아니라, 애니메이션 캐릭터 페르소나를 입은 여러 에이전트가 한 화면에서 조율되고, 토론 결과가 실제 코딩 작업으로 이어지며, opencode처럼 대화창에서 코딩하고, 여러 에이전트가 각자의 터미널·워크트리에서 병렬로 일하는 전체 시스템을 목표로 합니다. 모든 명령은 권한·승인·리댁션 게이트를 통과하고, 서버가 죽으면 로컬 모델로 제한 운용됩니다.
방향을 한 줄로: "OpenCode/Claude/Codex를 대체하지 않고, 캐릭터화된 역할·worktree·tmux pane·permission policy·event stream으로 감싸는 오케스트레이터." (조사 근거: docs/45, docs/43)
목표
데스크톱 앱이 전체 지휘실 역할을 한다.
dgx-02는 메인 서버이자 원본 저장소다. 강한 모델, 로컬 LLM 서버, 장기 메모리, 원격 작업 실행, 모바일/원격 continuity, SimpleMem 검색 인덱스를 담당한다.
서버 접속이 불가능하면 맥북의 로컬 모델과 로컬 CLI만으로 오케스트레이션/토론을 계속한다.
DGX-02를 메인 authority와 원본 저장소로 두고, MacBook은 주 작업 클라이언트로 둔다. MacBook은 오프라인일 때만 로컬 SQLite cache/outbox에 임시 저장하고, 온라인 복귀 시 DGX-02로 동기화한다. 집 PC와 폰은 DGX-02 projection을 보고 입력/승인을 남긴다.
토론 기능을 끈 상태에서는 OpenClaw/Claude/Codex/로컬 모델과 1:1 대화하듯 작업한다.
하나의 API 또는 하나의 모델에서도 여러 가상 에이전트를 만들어 병렬 토론과 역할 분담을 수행한다.
여러 프로바이더 프로파일을 동시에 등록하고, 실행마다 모델/API 키/검증 모델을 바꿀 수 있다.
토론은 의사결정뿐 아니라 코딩 작업을 위한 구현 지시서, 컨텍스트 팩, 리뷰 패킷으로 이어진다.
일부 에이전트는 soul.md를 통해 장기 정체성과 판단 기준을 유지한다.
토론 결과와 실행 기록은 Obsidian/Notion으로 자동 백업하고, 폰에서는 읽기와 제한적 승인 중심으로 접근한다.
대화 워크벤치 OpenCode급 업그레이드 (2026-06-11, 14항목) — 대화 탭이 코딩 워크벤치와 같은 메커니즘으로 동작:
스트리밍 델타 렌더링(점진 드래프트 버블) + 중지 버튼(부분 응답 확정), 프록시 SSE 실패 시 비스트림 폴백
대화 내 도구 루프 — 답변의 tool 펜스를 승인 게이트(dispatch→approve→replay)로 실행, 결과 재투입 ≤8라운드, 변경 도구 성공 시 tsc --noEmit 진단 라운드 자동 실행(LSP 훅)
첨부 실전달 — 이미지→base64 비전 블록(OpenAI image_url/Anthropic image/vLLM), 텍스트류→본문 인라인. metadata_only 시대 종료
Plan/Build 모드 토글(컴포저) — Plan은 읽기 전용(변경 도구 차단) + 같은 프로바이더 저비용 모델로 워크로드 라우팅
자동 압축 — 컨텍스트 90% 도달 시 MT-OSC 응축기로 옛 턴 압축 후 시스템 프롬프트에 요약 주입(중복 응축 방지 워터마크)
/fork/compact/plan/build/help 슬래시 명령, busy 중 메시지 큐잉(턴 종료 후 자동 발송, 큐 칩 UI)
턴 롤백(비파괴: 대화 절단 + 변경 파일 안내), 패턴 영구 승인("이 명령 계열 세션 동안 허용" — 위험 명령은 항상 인간 게이트)
지수 백오프 재시도(권한/인증 오류는 절대 재시도 안 함), 토큰·비용 HUD 칩(컨텍스트 80% 경고 + 압축 배지)
실사용 안정화(동일자 후속): 응답 상한 512→4096(maxOutputTokens rider, MiMo max_completion_tokens 포함) + 완성 타임아웃 120초 — DGX-02 실호출로 4096토큰 출력 검증; SSE 스트림 정체 감시(연결 15초/무활동 90초 → 비스트림 폴백); 도구 승인 대기 시 인라인 카드 자동 표시 + 버블에 "⏳ 승인 대기" 노출; 에이전트가 확인 질문을 던지면 추천 칩이 "보낼 수 있는 답변" 3개로 전환(표 안 질문 인식)
Codex식 사이드 패널 — 대화를 가리지 않는 우측 분할(미리보기/Diff/터미널/파일/백그라운드 작업/계획).
진짜 라이브 터미널 — dgx-swarm tmux pane의 실제 출력을 capture-pane으로 폴링(읽기 전용), 게이트 통과 명령 전송.
답변 기반 추천대화 — 에이전트의 마지막 답변에서 파생, 클릭 즉시 전송 + 연필 수정.
리서치 (Manus + Kimi식)
리서치 스웜 (리서치 탭) — N 페르소나 요원이 한 주제를 병렬 조사. 마스터플랜 체크리스트 + Agent's Computer 타임라인 + 하단 동사 스트립 + 합본 보고서 다운로드. completion 기반(게이트/curl/pane 우회). docs/44
상세 PR 이력은 GitHub PR #448~#473 및 git 로그에 있습니다. docs/45 Phase A~F 중 /fork·모델 라우팅·Diff/Files 연동(워크스페이스 변경 원장)은 2026-06-11 대화 워크벤치 업그레이드로 구현됐고, 남은 단계는 Mission 객체 통합, verifier+순차병합, runtime isolation — 대부분 dgx-02 재배포 후 진행합니다.
참고 방향
tunaFlow: 데스크톱 오케스트레이터, CLI 에이전트 연결, 코드 작업 흐름
DCInside 토론 UI 글: 프론트엔드 톤, 모델별 패널, 토론 흐름
wonseokjung/connect-ai: 로컬에서 여러 에이전트를 굴리는 구성
Memento-MCP: 장기 기억, 회상, 반성, 작업 세션 연결
저장소 구조
apps/
desktop/ # 데스크톱 프론트엔드 (Vite/React, Tauri 셸 목표)
server/ # dgx-02에서 실행되는 오케스트레이션 서버
packages/
protocol/ # 데스크톱-서버-에이전트 공통 스키마 (Zod)
providers/ # OpenAI/Anthropic/OpenRouter/Ollama/리셀러 API 어댑터
agents/ # 에이전트 런타임, 토론 엔진, 코딩 전달, 로어북 엔진
memory/ # 장기 메모리 어댑터
mcp/ # 스웜 제어 MCP 프런트도어
agents/
<slug>/ # 캐릭터 18인: SOUL/AGENTS/IDENTITY/USER.md + avatar.* + expressions/
SAFETY.md # 공통 안전 경계
lorebooks/ # 월드인포 JSON (옵션·멀티테넌트)
scripts/ # dgx-02 배포, swarm-send/capture, import-expressions 등
docs/ # 00~45 설계 문서 (아래 주요 항목)
apps/server: health/runtime/heartbeat/model registry, /provider-completions(+stream), /events/sync, /sessions, tmux dispatch/capture(swarm-send/capture.sh), 권한·리댁션 게이트
실제 API 키는 SecretRef로만 표시하고 저장하지 않습니다. dgx-02 vLLM 호출은 server-proxy 우선·direct fallback, send-keys는 환경 게이트(ORCHESTRATOR_ENABLE_TMUX_SEND_KEYS)와 승인 뒤에만 실행됩니다.
알려진 미반영: dgx-02에 떠 있는 서버는 옛 배포 스냅샷이라 일부 최신 변경(CORS allow-headers의 x-dgx-*, 그동안 머지한 기능들)이 반영되지 않았습니다. 실제 Tauri 앱은 브라우저 CORS를 우회해 동작하지만, dev 브라우저 검증과 최신 서버 기능을 위해 dgx-02 재배포(scripts/dgx-02/)가 필요합니다.
Stage12
DGX-02 vLLM provider profile을 기본 등록한다.
DGX-02 모델 레지스트리는 qwen36-domain-lora-v5-prisma를 노출한다.
Probe DGX는 DGX-02 런타임 상태와 provider model discovery snapshot을 함께 갱신한다.
apps/server는 /models에서 DGX-02 모델 레지스트리 placeholder를 제공한다.
실제 프롬프트 전송은 브라우저에서 provider secret을 들고 직접 호출하지 않고, DGX-02 POST /provider-completions server proxy를 통과한다.
DeepSeek, APIFun, Grok OAuth, OpenClaw vLLM은 DGX-02 server-proxy provider로 등록하며, 모델 discovery는 GET /provider-models?providerProfileId=...를 우선 사용하고 실패 시 redacted static metadata로 fallback한다.
untrusted provider completion은 Permission Matrix의 provider_completion approval item으로 올라가며, 승인 전에는 대화 전송을 막는다.
Stage13
packages/protocol에 ProviderCompletionRequest와 ProviderCompletionResponse를 추가해 completion도 공통 타입 경계를 타게 했다.
apps/server는 POST /provider-completions를 제공하고, 데스크톱에서 받은 providerProfileId, modelId, 메시지만으로 DGX-02 vLLM에 프록시한다.
DGX-02 vLLM 실제 endpoint와 secret/base URL은 데스크톱 요청 body에 넣지 않는다.
데스크톱은 DGX provider 호출 시 http://dgx-02:4317/provider-completions를 먼저 시도하고, 서버 프록시가 아직 떠 있지 않으면 http://dgx-02:8001/v1/chat/completions 직접 호출로 fallback한다.
서버 프록시는 CORS preflight를 처리하며, chat_template_kwargs.enable_thinking=false를 강제해 reasoning/thinking 로그가 대화창에 새지 않게 한다.
Stage14
apps/server health/runtime/model registry는 vLLM /models를 probe해 DGX-02 모델 런타임 상태를 반영한다.
데스크톱의 Probe DGX는 더 이상 가짜 online 상태를 만들지 않고, http://dgx-02:4317의 /health, /heartbeat, /models를 실제 조회한다.
dgx-02:4317이 닫혀 있으면 데스크톱은 DGX를 offline/degraded로 표시하고 direct vLLM fallback 가능성을 event log에 남긴다.
scripts/dgx-02/run-server.sh와 scripts/dgx-02/ai-orchestrator-server.service를 추가해 DGX-02에서 서버를 상시 프로세스로 띄울 준비를 했다.
corepack pnpm server:smoke는 /health와 /provider-completions를 확인하는 smoke test로 사용한다.
apps/server는 POST /events/sync로 desktop/MacBook/Home PC client replica 이벤트를 받고, 같은 event id 재전송은 duplicate로 처리한다.
서버는 같은 event id의 다른 payload를 conflict로 분리하고, raw secret 패턴이 보이는 이벤트는 failed로 막는다.
apps/desktop은 이벤트를 만들 때 DGX-02 Event Storage로 sync를 시도하고, 실패하면 local outbox 상태로 남긴다.
Terminal dock의 Event Storage 카드에서 DGX-02 revision, outbox count, 수동 sync 버튼을 볼 수 있다.
scripts/smoke-dgx-server.mjs는 /health, /provider-completions, /events/sync를 함께 확인한다.
Stage16
Retired as a separate implementation surface.
The legacy browser outbox adapter has been folded into Stage29 LocalClientEventCache.
Stage29 is the single desktop-side client cache/outbox for DGX-02 Event Storage.
DGX-02 remains the authority. MacBook only keeps a local replay cache and unsynced event outbox.
Re-appending already-projected events must not resurrect them into the unsynced queue.
Stage17
DGX-02 서버 Event Storage를 프로세스 메모리에서 append-only JSONL 파일로 승격했다.
기본 저장 위치는 data/events/events.jsonl이고, EVENT_STORAGE_DIR로 바꿀 수 있다.
서버 재시작 후에도 event id, revision, duplicate/conflict 판정이 유지된다.
GET /event-storage로 storage mode, JSONL path, revision, event/session count를 확인할 수 있다.
scripts/smoke-dgx-server.mjs는 /event-storage와 /events pull 결과까지 함께 확인한다.
PR0 Authority Correction
DGX-02 is the authoritative shared server for Event Storage, MemoryRecord, WorkItem, approvals, drafts, and continuity storage.
MacBook is the primary work client with a persistent local cache/outbox and can continue with local models when DGX-02 is unavailable.
Home PC and Phone are clients over the DGX-02 projection; inputs created while MacBook is unavailable remain pending client inputs until they sync to DGX-02.
Conflict handling uses dgx02_authority_wins for mechanical conflicts and manual_review for semantic conflicts.
Local/remote writes use pending queues and replay/import to DGX-02 when the authority returns.
External ingress input is represented as external_legacy in persisted protocol data while UI labels use generic external-ingress wording.
Unknown external effects, device reboot, provider execution, secret access, and terminal actions are denied by default unless the Permission Matrix approves them.
Windows Obsidian export defaults to F:/obsidian/ai-headquarter.
Tauri is the accepted shell direction for Windows/macOS packaging; see docs/21-tauri-desktop-shell.md.
DGX-02 public endpoint is https://orchestrator.endruin.com; see docs/22-endruin-domain-dgx02.md.
DGX-02 provider registry source mapping is documented in docs/23-dgx02-provider-registry.md.
SimpleMem continuity memory is documented in docs/28-simplemem-continuity-memory.md.
Stage18
Conversation message event payload에 redacted content를 포함해 DGX-02 Event Storage가 실제 대화 복원의 원본이 되도록 했다.
apps/desktop/src/runtime/stage18EventReplay.ts에서 DGX-02 /events?sessionId=... pull, Conversation message 재구성, local message/event dedupe merge를 담당한다.
Terminal dock의 Event Storage 카드에 pull 버튼을 추가해 MacBook 또는 Home PC 화면에서 DGX-02에 저장된 세션 이벤트를 다시 불러올 수 있다.
오래된 이벤트처럼 content가 없는 message event는 안전하게 건너뛰고, 앞으로 생성되는 메시지는 redaction layer를 통과한 본문만 저장한다.
Stage19
coding_packet.created 이벤트 payload에 전체 CodingPacket 구조를 포함해, 코딩 전달 상태도 DGX-02 Event Storage에서 복원할 수 있게 했다.
apps/desktop/src/runtime/stage19CodingPacketReplay.ts는 최신 유효 packet 이벤트를 찾고 Zod schema로 검증한 뒤 UI 상태로 되돌린다.
content가 없는 구형 packet 이벤트는 건너뛰고, schema가 깨진 packet은 invalid로 분리해 나중에 conflict/review UI로 넘길 수 있게 했다.
Stage20
packages/protocol에 Event Storage session index response 타입을 추가했다.
DGX-02 서버는 GET /sessions로 sessionId, event count, 최신 이벤트 타입, source/trust 요약을 내려준다.
Desktop 좌측 레일에 Sessions 패널을 추가해 DGX-02 revision과 최근 세션을 확인하고, 현재 세션 replay를 바로 실행할 수 있게 했다.
Stage21
Desktop의 메시지 생성, 외부 인입, permission snapshot, Event Storage replay를 activeSessionId 기준으로 전환했다.
Sessions 패널에서 특정 sessionId를 누르면 해당 세션의 이벤트와 메시지를 DGX-02에서 pull하고, 선택된 세션을 active 상태로 표시한다.
새 메시지와 새 이벤트는 현재 active session에 기록되므로 MacBook/Home PC 간 세션 이동의 기본 경계가 생겼다.
Stage22
Sessions 패널에 새 세션 생성 버튼을 추가했다.
새 세션을 만들면 session.created 이벤트가 현재 active session으로 기록되고 DGX-02 Event Storage에 sync된다.
생성 직후 대화창과 이벤트 로그는 새 세션 기준으로 비워져, 이후 메시지와 코딩 패킷이 해당 sessionId 아래에 쌓인다.
Stage23
Event Storage session index 항목에 title과 createdByClient를 추가했다.
DGX-02 서버는 session.created 이벤트 payload의 title/sourceClient를 세션 인덱스 메타데이터로 승격한다.
Desktop Sessions 패널은 sessionId 대신 사람이 읽을 수 있는 title을 우선 표시하고, 세부 줄에 sessionId와 event count를 함께 보여준다.
Stage24
세션 이름 변경을 session.renamed 이벤트로 기록한다.
DGX-02 session index projection은 session.created와 최신 session.renamed 이벤트를 함께 읽어 title을 계산한다.
Desktop Sessions 패널에 active session 이름 변경 버튼을 추가했다.
Stage25
Backup projection snapshot과 Obsidian markdown destination을 activeSessionId 기준으로 생성한다.
applyStage7ProjectionStatuses는 projection status를 되돌릴 때도 snapshot sessionId를 반영한다.
세션을 전환한 뒤 백업을 실행해도 다른 세션의 Obsidian/Notion/Mobile projection으로 섞이지 않게 했다.
Stage26
Obsidian vault export plan runtime을 추가했다.
Obsidian artifact destination은 vault 내부 markdown 상대 경로만 허용하고, ./.. traversal은 차단한다.
Desktop 백업 생성 이벤트에 Obsidian export plan 메타데이터를 포함해 이후 Tauri/Electron 파일 writer와 바로 연결할 수 있게 했다.
Stage27
좌측 네비게이션의 프로바이더를 등록 런처로 승격했다.
등록 메뉴에서 API Key/환경변수/Claude Code JSON, CLI 세션, OAuth 세션을 각각 추가할 수 있다.
CLI/OAuth provider는 raw secret 없이 세션 바인딩으로 등록되고, 모델 discovery stub과 vault readiness가 바로 생성된다.
오른쪽 Provider Profiles의 기존 + 버튼은 API key/env 등록 단축 동작으로 유지한다.
Stage28
오른쪽 레일의 Provider Profiles 패널을 제거하고, provider 등록/이름 변경/모델 discovery/삭제 관리를 좌측 프로바이더 메뉴로 이동했다.
오른쪽 레일은 Agents와 Memento 2단 구조로 바꿨다.
Agents 패널은 3개 에이전트가 잘리지 않도록 높이를 확보하고, 남는 공간은 Memento에 배정했다.
Memento 내부 리스트 높이 제한을 풀고 recall trace와 memory record 표시 개수를 늘렸다.
Stage29
에이전트 설정 소스를 internal, markdown, off 중 하나만 선택하는 configSource 타입으로 명시했다.
internal과 markdown을 동시에 실행 프롬프트에 주입하지 않도록 프로토콜 테스트를 추가했다.
좌측 레일에서 프로바이더를 선택하면 세션/시스템/ops 패널을 숨기고 provider 등록/관리 화면만 보이게 했다.