OmO는 senpi 2026.11.10-2 위에서 동작합니다. 클라이언트는 read_project_file / write_project_file을 통해 RPC로 워크스페이스의 지침 파일을 읽고 편집할 수 있습니다(senpi#6307 기준). 빌드된 세션은 claim_session으로 보류되었다가 넘겨질 수 있습니다(senpi#6350). Fable 5.2 프롬프트 프리셋에 코드베이스 소유권 문장이 추가되었습니다(senpi#6360). generate_image는 bash와 마찬가지로 eval 전용이 되었습니다(senpi#6272). eval 셀은 tool.<name>(...) 및 agent()/output() 헬퍼를 통해 모든 eval 전용 도구에 접근합니다(senpi#6276). EQ 골든 파일에는 새 프롬프트가 반영되었습니다(senpi#6355). (#13054)
다른 에이전트의 메시지에 답했던 에이전트는 엔진이 프롬프트 없이 자체적으로 시작하는 턴에서도 계속 답할 수 있습니다. 소비된 전달이 부여하는 답장 허용(발신자의 id 또는 명시된 이름으로 보내는 답장을 전달 자체만으로 승인)은 이제 그 전달이 시작한 작업 전체에 적용됩니다. 즉, 전달을 소비한 턴과 엔진이 스스로 시작하는 이후의 모든 턴(미완료 todo 알림, 목표 연속 실행, 모니터 깨우기)이 포함됩니다. 정산(settle)만으로는 허용이 끝나지 않으며, 그 답변 이후에 새 메시지가 작업을 시작할 때 종료됩니다. 새 메시지란 사용자 메시지이거나, 새 그룹이 보유하는 발신자를 가진 모든 전달을 말합니다(실행 중인 작업에 합류하는 전달은 자신의 발신자를 추가합니다). 적용 범위 내 턴의 답장은 다음 홉에서 전달 체인을 이어가므로, 체인 한도가 여전히 이를 종결합니다. (#13042, #12996의 일부) (#13044)
omo remote send는 이제 다른 모든 전송과 같은 전달 파이프라인을 거치며, --steer는 세션을 한 번만 읽습니다. 다른 기기에 있는 세션으로 보내는 사용자 메시지는 <device>/<session> 주소에 대한 릴레이 주소록 참조와 함께 createDeliveryPipeline에 진입합니다. 따라서 CLI는 더 이상 자체 전송 호출을 만들지 않습니다. 릴레이 전송은 실행 중인 턴을 한 번만 읽고 steer를 적용하며, 이전에는 CLI가 먼저 한 번 더 읽었습니다. 아무것도 실행 중이지 않은 세션에 대한 --steer는 여전히 아무것도 보내지 않습니다. 사용되지 않던 두 번째 프롬프트 구현(promptRemote)과 그 인자 검사는 제거되었습니다. 각 기기가 허용하는 발신자 유형은 변경되지 않았습니다. (#13038)
이 기기의 세션이 질문에 대한 응답을 기다리는 중일 때 보내는 메시지는, 다른 기기의 경우와 마찬가지로 그 사실을 알려줍니다. 전송은 여전히 큐에 들어가며, 해당 delivery에는 이제 waiting_on: { kind: "approval", device }가 포함됩니다. device는 이 설치본의 계정 기기이며, 설치에 기기 식별 정보가 없으면 생략됩니다. (#13035)
한 세션이 다른 세션에 보내는 모든 메시지는 이제 이 기기에서든 여러 기기에 걸쳐서든 보낸 기기의 이름을 포함하며, 다른 기기에서 온 메시지도 로컬 메시지와 같은 방식으로 수신 실행의 다음 전송 원인으로 집계됩니다. 기기 id를 읽을 수 없는 경우(기기 서비스가 없거나 응답하지 않는 경우)에도 메시지는 전송되며, 기기 이름이 없는 이유를 함께 기록합니다. (#13034, #13004의 일부)
다른 기기의 세션으로 보내거나 넘긴 메시지는 이제 이 기기 안에서 보낸 메시지처럼 delivery_id, effective_mode, endpoint를 보고합니다. 기존 응답은 계정의 세션 목록에서 가져왔기 때문에 이 필드들이 빠져 있었습니다. 이제 릴레이 전송 계층이 가진 전달 정보를 그대로 전달합니다. 발신자는 해당 기기의 엔드포인트를 알지 못하므로 endpoint는 null입니다. (#13033)
다른 기기의 에이전트에 대한 답장은 이제 메시지 헤더의 id 또는 이름으로 도달하며, 같은 계정이라면 프롬프트 없이 처리됩니다. 하나의 리졸버가 이 기기의 스레드와 계정의 다른 기기들에 걸친 스레드를 함께 찾습니다. 순서는 정확한 영속 id, 계정 별칭, 그리고 모든 항목을 대상으로 판단하는 이름 순위입니다. 이름이 같은 두 기기는 조용히 하나를 고르지 않고, 두 기기를 모두 명시하는 ambiguous_target이 됩니다. thread_send, thread_handoff, 제어 도구, thread_create(열기 또는 포크), omo thread CLI가 모두 이 리졸버를 사용합니다. 실행이 수신한 전달의 발신자에 대한 답장은 그 전달만으로 승인되며(발신자의 영속 id 또는 발신자가 밝힌 이름 기준), 반드시 해당 발신자로 해석되어야 합니다. 그렇지 않으면 전송 없이 reply_target_mismatch로 거부됩니다. 다른 기기의 스레드에 표시되는 id는 영속 id이며, 기기가 공개하는 경우 릴레이 목록에 포함됩니다. omo remote 명령은 여전히 입력한 id를 기기의 세션 키로 사용해 디스패치하므로, 해당 경로가 공유 리졸버로 옮겨질 때까지는 기기 목록에 표시된 id를 입력하세요. (#13000)
다른 기기의 에이전트로 보내는 메시지는 이제 이 기기에서 보내는 것과 같은 정보를 보고합니다. 다른 기기에 있는 대상에 대해서도 thread_send와 thread_handoff가 delivery_id와 effective_mode를 응답하므로, 스레드가 어느 기기에 있든 호출자는 전달의 id와 전달이 탄 경로를 같은 방식으로 읽을 수 있습니다. message_seq와 endpoint는 이 기기의 게이트웨이 행에 해당하는 정보로 남으며, device는 다른 기기의 이름을 나타냅니다. 답장 허용(실행이 수신한 전달의 에이전트에 대해, 해당 에이전트의 id 또는 밝힌 이름으로, 프롬프트 없이 답하는 경우)은 같은 기기와 다른 기기 전달에서 동일하게 동작함이 검증되었습니다. 또한 하나의 패리티 테이블이 두 경로 모두에 대해 모든 전송 검증을 실행하므로, 전송 계층을 읽는 규칙이 있다면 사용자에게 도달하기 전에 빌드가 실패합니다. (#13006, #13000 위에 추가)
작업 자식 프로세스는 프로세스 전역 리댁션 레지스트리를 거부한 senpi 엔진에 더 이상 시작되지 않으며, 시작은 SenpiEngineRestartRequiredError와 함께 실패합니다. 이 오류는 omo를 재시작하라고 안내합니다. 엔진은 자신이 설치하지 않은 레지스트리 슬롯 옆에서는 로드되지 않으며, 이 거부는 프로세스 전체 기간 동안 유지되므로 재시작만이 해결책입니다. (#12991)
omo는 이제 0.1.3 대신 서명된 기기 서비스 0.1.27을 설치합니다. 기기 서비스 고정 버전이 0.1.3에 머물러 있어서, 0.1.3 이후의 모든 기기 서비스 릴리스가 배포되지 않았습니다. 설치된 omo는 고정 버전보다 오래된 서비스만 교체하기 때문에, 어떤 기기도 더 새로운 서비스를 받지 못했습니다. (#12981)
thread_* 도구는 이제 bash와 마찬가지로 eval 전용입니다. eval 도구가 있을 때 모델의 직접 도구 목록에서 제외되며, eval 셀 안에서 tool.thread_*()로 호출합니다. 동작, 권한, 결과는 변경되지 않았으며, eval이 없는 경우에는 일반 직접 도구로 남습니다. (#12907, #12903 해결)
오래 실행되는 엔진이 충돌한 일회성 메모리 실행을 계속 회수합니다. 메모리 컴포넌트가 포기된 일회성 실행을 정리하는 작업은 엔진 프로세스당 한 번, 세션 열기와 별개로 실행되었습니다. 이제 데스크톱이나 데몬 호스트처럼 계속 실행 중인 엔진에서는 재시작을 기다리지 않고 하루에 한 번 반복됩니다. (#12899)
세션을 열 때 메모리 루트를 다시 훑지 않습니다. 메모리 컴포넌트가 포기된 일회성 실행을 정리하는 작업은 이제 엔진 프로세스당 한 번, 첫 세션 열기 직후에 실행되며, 모든 세션 열기마다 실행되지 않습니다. 정리가 시작되기 전에 끝난 세션은 정리 작업을 다음 열기로 넘기므로, 충돌한 실행은 여전히 회수됩니다. (#12896)
/D:/... 지정자로 배럴을 가져와 Windows에서 실패했고, dev 브랜치를 빨간색으로 만들었습니다(#13068). 이제 파일 URL로 배럴을 가져옵니다. (#13068)click처럼 다른 동작만 나열한 Linux 버튼에 대해 press를 더 이상 거부하지 않습니다. 백엔드가 첫 번째 동작을 실행하기 때문입니다. (#13055)queued로 응답된 뒤 아무 알림 없이 사라졌습니다(#12927). 이제 전송은 이 거부를 기록합니다. 같은 idempotency_key로 같은 전송을 재시도하면 queued 대신, 전달을 명시하는 turn_conflict로 응답합니다. (#12935)computer.intervention: "continue"). 입력이 사용자를 기다리고 UserIntervened로 중지하도록 하려면 "pause"로 설정하세요. (#13055)InputBusy로 거부되는 대신 계속 입력을 보낼 수 있습니다. 대상은 동작 직전에 기다리지 않고 한 번 더 확인합니다. (#13055)omo doctor에서 보고됩니다. (#12831)컴퓨터 사용은 동작하기 전에 접근성 대상이 조작 가능해질 때까지 기다리고, 동작으로 열린 시트, 창, 메뉴를 나열하며, 호출이 거부되면 다음 호출을 제안합니다. 또한 키 조합이 강제되지 않는 한 cmd+q, alt+f4, win+l을 거부합니다. (#13055)
Wayland(Hyprland): windowInput 기능 탐지(no_eis, hyprland_ipc_missing 사유) 뒤의 libei를 통한 창 대상 포인터 입력. (#12831)
Wayland(KWin): 같은 libei 경로를 통한 창 대상 포인터 입력, 그리고 캡처와 클릭 사이에서 좌표가 왕복되도록 KWin 프레임 사각형에 맞춘 창 캡처. (#12831)
senpi-desktop-sdk: computer-use v2 소비자를 위한 타입 파사드 패키지(연결, Computer / Window / Element / Frame, 보고 및 검증, 타입 에러). 고정된 파사드 매니페스트와 패키지 경계 테스트가 포함됩니다. (#12831)
데스크톱 엔진: skeleton 관찰(논리 깊이 3), 웹 래퍼 규칙, 하위 세대를 포함한 root: <ref> 드릴(객체 모드 전용). (#12831)
senpi-desktop-sdk: 세션 내 거부(spawn_inside_session)가 있는 spawn 전송 계층. 서비스 실행 파사드는 창, 디스플레이, 기능을 SDK를 통해 라우팅합니다. (#12831)
데스크톱 엔진 호스트: 엔진이 지원을 알릴 때만 전송되는 기능 게이트 기반 session.open 옵션(intervention, macosKeyPriming, trace, reportMode). 7개의 유효한 처분 쌍을 가진 타입화된 ActionReport 실행 결과. 예약 설정 computer.run_sandbox, intervention, macos_key_priming, trace(기본값 유지). data.reason 힌트를 가진 에러 코드 COMPUTER_AMBIGUOUS_TARGET, COMPUTER_CAPTURE_CONSENT_REQUIRED, COMPUTER_PROTECTED_PROCESS. (#12831)
데스크톱 엔진: 중지 후 도착한 늦은 응답은 격리되며(Suspended, 처분 unknown / unknown, stderr에 감사 기록), macOS 헬퍼(오버레이, 키맵, 카나리)에 부모 프로세스 종료 격리가 추가되었습니다. (#12831)
데스크톱 서비스: 세션을 열기 전에 매번 새 프로세스에서 권한을 다시 확인하므로, 거부 후 부여된 캡처/접근성 권한을 서비스를 재시작하지 않고도 인식합니다. (#12831)
computer.run: 벽시계 시간, 호출 횟수, 페이로드 한도와 이스케이프 배터리를 갖춘 QuickJS 셀(아직 호스트 브리지 없음). (#12831)
macOS 캡처: SCK/레거시 폴백을 갖춘 SkyLight 우선 창 캡처, 다른 Space에 있는 창 캡처, 측정된 replayd 동의 탐지(옵트인, 동작을 막지 않음). (#12831)
데스크톱 엔진: 에포크 소스(디스플레이 변경, 잠금, 절전, Space 전환, 엔진 재시작)가 epoch.changed로 알려집니다. 에포크 변경 후의 오래된 프레임은 InvalidCoordinateFrame superseded로 응답합니다. (#12831)
데스크톱 엔진: ref 세대 저장소는 대상마다 8개의 살아 있는 세대와 최대 65,536개의 보존 객체를 유지합니다. 세대가 지난 ref는 StaleRef로 응답합니다. (#12831)
데스크톱 엔진: 객체 모드 ax.snapshot은 기본 3000ms 마감 시간과 노드 예산 안에서 부분 관찰(complete, nodesObserved, cuts)을 반환합니다. null 모드는 v1과 바이트 단위로 동일합니다. (#12831)
데스크톱 엔진: 액션 보고서의 단계별 소요 시간과 개인정보가 제거된 trace JSONL 싱크. 둘 다 trace 세션 옵션(기본값 꺼짐) 뒤에 있습니다. (#12831)
Wayland(KWin): windowInput 기능 탐지 뒤의 libei를 통한 창 대상 포인터 입력과 KDE QA 드라이버. (#12831)
커널 computer 전역 객체(JS 및 Python 프렐류드)는 SDK 파사드 매니페스트에서 생성됩니다. verify는 데스크톱 루트에, drill은 창 핸들에 있습니다. (#12831)
Wayland(GNOME): 세션 버스로 창 목록을 게시하는 작은 Shell 확장을 통한 창 대상 포인터 입력. (#12831)
def0749 Merge pull request #13038 from code-yeongyu/fix/13016-one-route-senders
143aaf5 Merge pull request #13069 from code-yeongyu/fix/windows-barrel-test-import
3d5df08 chore(train/omo-or): dev의 0a0213d 기준으로 train 최상단의 번들 재생성 (#13034 #13033 #13035 #13038)
ab2aa1f Merge origin/dev (0a0213d, train F) into train/omo-or - 생성 파일을 최상단에서 재생성
075c9c5 docs(thread): AGENTS.md의 remote/ 행 - 전체 #13004 발신자 기기 문장(코드 스팬 안에서 잘렸던 문장. 구성 FIX_FIRST는 7c5cb07)
7c5cb07 docs(thread): AGENTS.md의 remote/ 행 = dev 행에서 기존 기기 없음 문장을 #13004 발신자 기기 문장으로 대체(중복 꼬리 제거. 구성 FIX_FIRST는 09c468e)
0a0213d Merge pull request #13055 from code-yeongyu/cu-v2/train-f
051479d Merge pull request #12866 from cynkai/fix/12638-process-chain-deadline
09c468e chore(train/omo-or): dev의 61e8020 기준으로 train 최상단의 번들 재생성 (#13034 #13033 #13035 #13038)
217d10f Merge pull request #12827 from cynkai/fix/12498-sync-bunshin-ts-shell-path
99add91 docs(thread): AGENTS.md의 remote/ 행 = dev 텍스트에서 기존 기기 없음 문장을 #13004 발신자 기기 문장으로 대체(train 병합. #12927 재전송 steer 절 유지)
8504a2d Merge #13038 (021b461) into train/omo-or (one-route. 생성 파일을 최상단에서 재생성)
ab46a42 Merge #13035 (c868730) into train/omo-or (one-route. 생성 파일을 최상단에서 재생성)
2d8677a Merge #13033 (cc664b7) into train/omo-or (one-route. 생성 파일을 최상단에서 재생성)
0a8fb80 Merge #13034 (c10cf79) into train/omo-or (one-route. 생성 파일을 최상단에서 재생성)
61e8020 Merge pull request #12826 from cynkai/fix/12453-memory-core-slow-test-budgets
459d6b7 fix(desktop-session): 조작 가능성 검사가 press를 요소의 기본 동작으로 취급하도록 수정(#13055 리뷰)
cecf1b3 Merge pull request #12824 from cynkai/fix/12527-scan-eviction-coverage
74a9e08 Merge pull request #12981 from code-yeongyu/fix/device-service-pin-0.1.25
8714de5 Merge remote-tracking branch 'origin/dev' into fix/device-service-pin-0.1.25
cf79b42 test(device-service-core): omo 5.1.66 디코더를 knip의 엔트리 글롭 밖에 vendor
0682d51 Merge pull request #12991 from code-yeongyu/fix/12965-redaction-slot-restart
4567269 Merge origin/dev into fix/12965-redaction-slot-restart
55ef6da test(device-service-core): 5.1.66까지의 omo가 0.1.27 서비스가 기록한 응답을 디코딩하는지 검증
52f22bd test(eq): dev 555b394(skill digest) 병합 후 linux-x64 E21-E24 재기록
e136a2a fix(device-service): 서명된 기기 서비스를 0.1.27로 고정
acc23cf Merge remote-tracking branch 'origin/dev' into fix/device-service-pin-0.1.25
f4fa586 Merge pull request #13024 from code-yeongyu/chore/cu-v3-row2-guards
eeaa316 Merge pull request #13059 from cynkai/test/12985-fable-52-boundary
ee23ae4 test(computer): v3 가드 테스트(row 2)에서 격리된 git 설정 사용
018ebc4 Merge remote-tracking branch 'origin/dev' into chore/cu-v3-row2-guards
d7ab82b fix(desktop-session): 상호작용 잠금을 잡기 전에 조작 가능 상태를 기다리도록 수정(#13055 리뷰)
26b5a8c Merge pull request #13044 from code-yeongyu/fix/13042-allowance-across-engine-turns
4671a77 train F: changes/unreleased를 검토된 헤드 4e80a04에 맞춤(멤버 프래그먼트는 13055.md로 병합)
01bb776 chore(regen): train F 최상단에서 생성 번들 재빌드(node 24, 정식)
345f46d docs(changes): row 29 프래그먼트 추가
9c6146e chore(regen): train F에서 row 29의 생성 번들과 프렐류드 에셋 재생성
6fa7bc8 fix(desktop-session): 위험한 보유 키 조합을 거부하고 거부된 백그라운드 입력이 대상 창을 가리키도록 수정
7be4420 feat(desktop): 자동 대기, 열린 표면, 다음 호출 힌트, 위험 조합 강제가 포함된 조작 가능성 배터리
분량 관계로 이후 내용은 번역에서 제외했습니다. 전체 내용은 위 원문 링크에서 확인하세요.