omo thread는 설치가 깨져 이 기기에서만 스레드가 유지되는 상황을 알려 줍니다. 로드할 수 없는 thread client sidecar가 있어도 omo thread read <alias>가 조용히 not_found를 반환하지 않습니다. stderr에 sidecar 이름, 오류 내용, 재설치 단계가 표시됩니다. CLI 로그인 자체의 경고(폐기된 신뢰 pin, 기기 서비스 forget 실패)도 이제 stderr로 출력됩니다. (#12936)
바쁜 스레드에 보낸 메시지는 기본적으로 실행 중인 턴에 바로 전달됩니다. 전달 모드를 지정하지 않은 thread_send와 thread_handoff(그리고 --mode 없는 omo thread send)는 수신자의 실행 중 턴에 steer하며, 턴이 유휴 상태이면 새 턴을 시작합니다. 이는 같은 기기든 다른 기기든 동일하게 적용됩니다. 호출자가 follow_up을 요청하거나, 턴이 steer를 받을 수 없는 경우(응답 대기 중인 질문, compaction, 턴 epoch를 보고하지 않는 엔진)에만 메시지가 실행 중인 턴 뒤에 대기열로 들어갑니다. 바로 그 순간 종료되는 턴에 대한 steer 전송은 실패하지 않고, 대상이 그때 가진 레인으로 대체 전달됩니다. (#12921, #12879의 일부)
OmO는 senpi 2026.11.9-2에서 동작합니다. eval 셀이 기다리는 도구가 끝나도, 셀 자체의 출력이나 결과가 그 내용을 대체하기 전까지 스트리밍된 줄이 유지되므로 실행 중인 셀이 잠시 빈 상태로 보이지 않습니다 (senpi#6257). (#12920)
omo remote send는 이제 세션의 thread_send가 다른 기기로 가는 경로와 같은 경로를 사용하며, 다른 기기의 모든 응답은 하나의 매핑으로 설명됩니다. 터미널에서 다른 기기의 세션으로 메시지를 보내는 사용자는 relay transport를 거칩니다(같은 오프라인 확인, 실행 중인 턴에 대한 동일한 steer 사전 점검, 이 기기 gateway store에 대한 수신 기록). 동시에 자신의 프롬프트 기록은 그대로 유지됩니다. 다른 기기의 명령이 거부되었을 때 사용자에게 보이는 내용(omo remote, attach TUI, 스레드 도구, SDK)은 하나의 모듈에서 생성되므로, 응답하지 않은 기기, 누락된 grant, 결과가 불확실한 경우가 어디서나 동일하게 표시됩니다. (#12911, #12879의 일부, #12885 수정)
OmO는 senpi 2026.11.9에서 동작합니다. senpi의 admit_external_message를 도입하여, 다른 기기의 세션에서 중계된 메시지를 일반 전달로 수락합니다. 또한 중계된 전달이 같은 기기에서 온 것과 정확히 같아 보이도록 하며, 기기 정보는 메타데이터에만 보관합니다. 단일 채널 relay transport(#12879)에는 두 가지가 모두 필요합니다. (#12904)
omo.dev 헤더의 Install 버튼이 더 이상 알약 모양 메뉴의 오른쪽 가장자리에 붙거나 밖으로 밀려나지 않습니다. 떠 있는 내비게이션 바는 마지막 컨트롤에 왼쪽 로고와 같은 여백을 주며, 1000px 미만에서는 섹션 링크가 메뉴로 이동하여 어떤 언어에서도 아무것도 알약 밖으로 밀려나지 않습니다. (#12893)
에이전트가 thread_create로 생성하거나 포크한 스레드는 이제 이 기기에서도 호스트의 기본값이 아니라 생성자 자신의 승인 모드로 시작합니다. 다른 기기에서 생성된 세션은 이미 그렇게 동작했으며(#6189), 이제 두 경로가 하나의 로직을 따릅니다. 이름은 스레드가 생성되는 기기를 기준으로 검사되고(해당 기기에 이미 실시간으로 존재하는 이름이면 그곳에서 name_conflict), 다른 기기에서 이미 실행 중인 스레드를 열면 다시 열지 않고 해당 스레드를 응답합니다. 생성된 스레드의 정보(이름, 작업 디렉터리, 타임스탬프)는 두 기기 모두에서 엔진의 응답에서 가져옵니다. (#12891, #12879의 일부)
스레드를 중지, 닫기, 이름 변경, 모델 재설정, 추론 수준 변경, 읽기 작업은 해당 스레드가 이 기기에서 실행되든 계정의 다른 기기에서 실행되든 동일하게 동작합니다. thread_set_reasoning도 이제 다른 기기의 스레드에 적용됩니다. 아직 파일이 없지만 다른 클라이언트가 여전히 보유한 세션은 두 기기 모두에서 같은 결과를 반환합니다. (#12890, #12879의 일부)
에이전트가 다른 기기의 세션으로 보낸 메시지는 이제 같은 기기 내 세션 간 메시지와 똑같이 도착합니다. 수신 세션은 사용자 메시지가 아닌 전달 항목을 받으며, 같은 기기 전달과 동일한 발신자 표시와 권한 고지가 포함되고 같은 키로 중복이 제거됩니다. 수신 시 깨어나는 방식도 같습니다. 응답은 단순히 다시 보내는 메시지입니다. 전달된 텍스트 어디에도 메시지가 건너온 기기 이름은 포함되지 않으며, 터미널에서 실행하는 omo remote send는 변경되지 않습니다. omo thread send로 다른 기기의 세션에 보내는 메시지는 데이터로 간주되어 거부되며(엔진은 명령줄 전달을 자기 기기에서 온 것만 허용합니다), omo remote send 사용을 안내합니다. (#12889, #12879의 일부, #12882, #12877, #12346, #12865, #12857 수정)
다른 세션으로 보내는 메시지는 그 세션이 이 기기에 있든 다른 기기에 있든 이제 하나의 전달 파이프라인을 거칩니다. 기기 간 차이는 하나의 포트 뒤에 있는 transport 모듈로 분리되며, 이번 릴리스에서 사용자가 보는 내용은 바뀌지 않습니다. (#12887, #12879의 일부)
다른 기기의 세션으로 보낸 메시지는 이제 같은 기기의 세션에서 온 메시지와 정확히 같아 보입니다. 수신 에이전트는 어느 기기에서 왔는지가 아니라 어느 세션에서 보냈는지를 확인하며, 평소처럼 해당 세션에 응답합니다. (#12878)
응답을 시작하는 데 90초 이상 걸리는 모델의 서브에이전트는 더 이상 런타임 폴백에 의해 중단되지 않습니다. runtime_fallback이 활성화된 상태에서 첫 프롬프트 watchdog은 고정된 90초 안에 진행 상황을 보이지 않는 모든 서브에이전트를 중단하고 폴백 모델에 프롬프트를 다시 보냈습니다. 그래서 첫 토큰 전에 정당하게 더 오래 추론하는 추론 중심 모델이 강제 종료되고 프롬프트가 두 번 전송되었습니다. 이제 watchdog은 300초를 기다리며, 이는 엔진이 사용하는 스트림 시작 제한과 같습니다. runtime_fallback.first_prompt_timeout_seconds로 이 값을 설정할 수 있으며, 0이면 비활성화됩니다. (#11893, #11887 수정)
omo thread send를 다른 워크스페이스에서 실행하면, 이제 omo thread read와 같은 방식으로 해당 스레드에 도달합니다. 이전에는 보이는 스레드가 없다는 응답이 나왔습니다. (#12860)session_shutdown 핸들러 하나에 자체 경고 임계값, 핸들러별 타임아웃, 전체 종료 예산을 적용합니다(기본값 2초 / 10초 / 2초, 모두 사용자가 조정할 수 있고 0으로 비활성화 가능). 1500ms 드레인 예산은 이 기본값 아래로 설정되었으며, 설치된 senpi에서 값을 읽는 테스트로 고정되어 있으므로, 호스트 릴리스가 기본값을 드레인 예산 아래로 낮추면 테스트에서 실패합니다. OmO는 호스트 상한을 추가하지 않았고, 호스트의 abort를 우회하는 경로도 없습니다. 예산 때문에 건너뛴 저널 플러시는 여전히 error 수준 알람을 발생시킵니다. (#12795, #10336 참고)^0.3.0)를 위한 BrowserSkill 0.4 공유 제어 방식을 설명합니다. 제한된 모든 페이지 동작에는 새로 호출한 session.cooperate("sync")의 컨텍스트가 포함되어야 하며, cooperation_sync_required 거부는 사용자가 session.cooperate("wait")로 응답할 때까지 기다린 뒤 다시 동기화하고 계획을 다시 세워야 합니다. 또한 어떤 호출이 제한되는지, 제한된 동작에서 알 수 없는 옵션 키를 넘기면 TypeError가 발생하는지(잘못된 키를 그대로 전달하는 두 호출은 예외)를 명시하고, page.on("dialog") 리스너가 응답할 수 있는 Dialog를 받는다는 점도 설명합니다. 이 릴리스의 omowright에는 DevToolsActivePort를 통한 실행 중 브라우저 탐색, 희소 페이지와 frameset 페이지의 goto, BrowserSkill IPC 청크 간 UTF-8 디코딩, 고유한 경우에만 수행하는 오래된 ref 복구가 포함됩니다(감사합니다 @ashmoonori-afk, code-yeongyu/omowright#115~#118). 또한 에이전트 탭을 별도 창에 여는 기능도 포함됩니다(감사합니다 @devxoul, code-yeongyu/omowright#120). (#12494)Skills: ulw-research와 mass-ulw의 대규모 리서치는 이제 모든 결론이 도구가 실제로 관찰한 근거에 기반해야 합니다. 작업자는 주장에 OBSERVED:를, 막다른 길에는 PROBED:를 표시하며, 기억에만 의존하는 내용은 단서로 되돌려 보냅니다. 대규모 리서치의 검증 노드는 관찰된 각 출처를 다시 열어 확인합니다. 두 리서치 버전 모두 시작 계약에 이 규칙을 명시하며, 모든 mass-ulw 노드 프롬프트는 VERIFY 항목에 이를 포함합니다. (#12832, #12830 수정)
d5ff246 Pull request #12921 머지 (feat/12879-steer-default 브랜치에서)
21f8f3f Pull request #12911 머지 (feat/12879-same-ports-cli 브랜치에서)
d14722a feat/12879-same-ports-cli 머지 (#12911 train head ee1f3b5을 feat/12879-steer-default에 반영)
e2c6724 feat/12879-same-ports-cli 머지 (#12911 dev a05f240을 feat/12879-steer-default에 반영)
0fe5b50 origin/dev 원격 추적 브랜치 머지 (#12936을 feat/12879-same-ports-cli에 반영)
a05f240 Pull request #12936 머지 (fix/12848-cli-sidecar-warnings 브랜치에서)
f3579e6 feat/12879-same-ports-cli 머지 (#12911 train base on dev 9d08e26을 feat/12879-steer-default에 반영)
0ad891c origin/dev 원격 추적 브랜치 머지 (#12890 session-control port를 feat/12879-same-ports-cli에 반영)
9d08e26 Pull request #12890 머지 (feat/12879-session-control-port 브랜치에서)
60cdebb origin/dev 원격 추적 브랜치를 feat/12879-steer-default에 머지
95d1076 origin/dev 원격 추적 브랜치를 feat/12879-same-ports-cli에 머지
a1e771d origin/dev (d0a6ad0, #12860)를 feat/12879-session-control-port에 머지; 번들 재생성
d0a6ad0 Pull request #12860 머지 (fix/cli-thread-send-own-alias 브랜치에서)
885207e origin/dev 원격 추적 브랜치를 feat/12879-steer-default에 머지
9d99a2b fix(thread): gateway store가 확장 리졸버를 import하는 대신 생성자로부터 받도록 변경 (#12911 full RED)
f349dff chore(omo-native): 주석 문구 수정 후 service-auth.generated.js 재생성 (#12911)
b2adedc origin/dev 원격 추적 브랜치를 fix/12848-cli-sidecar-warnings에 머지
5a490f2 fix(thread): GATEWAY_STORE_WORKER_BUNDLE_NAME의 오래된 knip 항목을 제거하고 두 주석에서 엔진을 일반적으로 지칭하도록 변경 (#12911 full RED)
f71b3fe Pull request #12494 머지 (chore/12451-omowright-pin 브랜치에서)
69fe735 origin/dev (a09b243, #12920)를 feat/12879-session-control-port에 머지; 번들 재생성
271d1db origin/dev 원격 추적 브랜치를 chore/12451-omowright-pin에 머지
30be881 test(omo-native): loadThreadSdk 테스트의 모든 호출이 stderr와 reinstall을 전달하도록 변경 (#12848)
eab37a6 origin/dev (2faeda0)를 fix/cli-thread-send-own-alias에 머지
ab157c0 origin/dev 원격 추적 브랜치를 feat/12879-steer-default에 머지
21c87ba fix(omo-native): 깨진 sidecar가 이 기기에서만 스레드를 유지하는 경우를 omo thread가 알리고, 로그인에 로그를 전달하도록 변경 (#12848)
f1973f6 test(omo-native): omo thread가 깨진 thread client sidecar와 로그인 경고를 보고하는지 검증 (#12848)
a97783d origin/dev 원격 추적 브랜치를 feat/12879-same-ports-cli에 머지
97d52c3 docs(thread): SessionControl 포트 설명 추가; #12890용 changelog fragment 추가
da00328 refactor(thread): 제어 도구마다 SessionControl 포트 위에서 하나의 본문만 사용하도록 변경하고, 원격 전용 구현을 제거 (#12883, #12879의 일부)
7799d1d refactor(thread): 로컬 및 relay 구현을 가진 SessionControl 포트를 도입하고, 두 경로 모두에서 하나의 종료 로직을 사용하도록 변경 (#12883, #12879의 일부)
2faeda0 Pull request #12891 머지 (feat/12879-session-host-port 브랜치에서)
0fb2665 origin/dev 원격 추적 브랜치를 feat/12879-session-host-port에 머지
c16a4ff origin/dev 원격 추적 브랜치를 feat/12879-same-ports-cli에 머지
6e95977 origin/dev 원격 추적 브랜치를 feat/12879-steer-default에 머지
c8f9ff2 origin/dev (5a1db39)를 fix/cli-thread-send-own-alias에 머지
d68f8bb test(remote): 지정된 패키지 루트 아래 깨진 staged sidecar가 전송을 실패시켜 루트가 사용됨을 검증 (#12911 review LOW)
d4dac69 origin/dev 원격 추적 브랜치를 feat/12879-same-ports-cli에 머지
276d891 chore(omo-native): 컴파일된 런타임 루트 변경 후 service-auth.generated.js 재생성 (#12911)
2aad141 fix(remote): 컴파일된 omo가 런타임 디렉터리 이름을 지정하여 remote send가 gateway store worker를 찾도록 변경 (#12911 delta review)
421e9d2 fix(thread): 보류된 기본 모드 steer를 turn_conflict로 잃지 않고 follow-up으로 다시 전송 (#12921 review)
11da2a9 chore(omo-native): remote send worker 앵커 변경 후 service-auth.generated.js 재생성 (#12911)
fb797fe feat(thread): 기본 전달 모드가 실행 중인 턴에 steer하도록 변경 (#12879의 일부)
db38bd0 fix(remote): 배포된 구조에서 omo remote send가 gateway store worker를 찾고, 모든 종료 경로에서 해제하도록 변경 (#12911 review)
5a1db39 Pull request #11706 머지 (fix/10993-residency-progress-watchdog 브랜치에서)
492cd2c refactor(thread): SessionHost 포트 위에서 하나의 생성 본문으로 통합하고, 새 세션이 두 기기 모두에서 생성자의 승인 모드로 시작하도록 변경 (#12884, #12879의 일부)
716d84b refactor(thread): 로컬 및 relay 구현을 가진 SessionHost 포트 도입 (#12884, #12879의 일부)
a471e59 Pull request #12889 머지 (feat/12879-relay-transport 브랜치에서)
2c17e6d feat(thread): transport 포트를 통한 omo remote send 구현, 모든 relay 응답에 대해 하나의 결과 매핑 적용 (#12879의 일부)
8852286 origin/dev 원격 추적 브랜치를 feat/12879-relay-transport에 머지
779cfc0 Pull request #12832 머지 (docs/ulw-research-observed-conclusions 브랜치에서)
084d73a origin/dev 원격 추적 브랜치를 fix/10993-residency-progress-watchdog에 머지
e237699 origin/dev 원격 추적 브랜치를 chore/12451-omowright-pin에 머지
2ee7232 Pull request #11893 머지 (fix/11887-first-prompt-watchdog-bound 브랜치에서)
ad02852 Pull request #12471 머지 (fix/10814-test-budget-wait-primitive 브랜치에서)
41308e3 docs(skills): #12834의 데이터 우선 문구를 시작 계약과 mass-ulw VERIFY 항목에 반영 (#12830)
2fc29c1 origin/dev 원격 추적 브랜치를 feat/12879-relay-transport에 머지
27ff5de Pull request #12887 머지 (feat/12879-delivery-transport-port 브랜치에서)
c281a16 Pull request #12893 머지 (fix/web-nav-pill-inset-12892 브랜치에서)
d66aaa2 refactor(thread): 아무도 import하지 않는 지연 로딩 promptRemote 래퍼 제거 (#12882, #12879의 일부)
1a8f847 fix(web): 내비게이션 알약이 잘리지 않도록 1000px부터 섹션 링크만 표시 (#12892)
832dc1f fix(thread): 유휴 수신자에 대한 보류 중이거나 이미 가져간 전달을 위치 1에 대기시키고, dispose 테스트가 실패할 수 있도록 변경 (#12882, #12879의 일부)
13c4c96 test(thread): 직렬화된 admit_external_message 기록의 chainCount 검증 및 device service를 통한 turn_conflict 경쟁 상태 테스트 (#12882, #12879의 일부)
ccab345 test(web): non-null assertion 없이 내비게이션 여백 결과 좁히기 (#12892)
0959f04 fix(thread): 수신자의 열린 초안 뒤에 보류된 전달을 즉시 대기열에 넣고 백그라운드에서 다시 전송 (#12882, #12879의 일부)
분량 관계로 이후 내용은 번역에서 제외했습니다. 전체 내용은 위 원문 링크에서 확인하세요.