42 ms, 68 MB로 긴 세션 끝부분 읽기 — 기존 40 s, 1.8 GB 대비. session_read, session_search, session_info가 세션 전체를 불러오는 대신 OpenCode의 메시지 API를 페이지 단위로 읽도록 바뀌었습니다. 23,000개 메시지 세션에서 limit: 2, from_end: true로 session_read를 실행하면 39.6 s, 피크 메모리 1,848 MB에서 42 ms, 68 MB로 줄었습니다. 60초 타임아웃에 도달한 검색은 반환 시점에 읽기를 멈추며, 이전에는 백그라운드에서 228 MB를 더 읽었습니다 (#10738, #10741).
OmO 확장이 실행하지 않는 LSP 엔진을 더 이상 포함하지 않습니다. 네이티브 LSP 도구와 편집 후 진단은 이미 패키지된 LSP 데몬을 통해 동작하지만, 포매터의 import가 lsp-core 전체 인프로세스 엔진을 omo.js에 끌어들이고 있었습니다. 실제로 사용하는 헬퍼만 import하도록 바꿔 확장 크기가 약 82 KB 줄었으며, 동작 변화는 없습니다 (#10659).
세션을 시작할 때마다 omo.js를 약 33 KB 덜 읽습니다. 메모리 슬래시 명령 11개와 메모리 동기화의 디바이스 계정이 첫 사용 시점에 로드됩니다 (#10902, #10860). 명령(/memory, /remember, /init, /recompile, /memory-repository, /sleeptime, /reflect, /dream, /search, /facts, /agreements)은 시작 시 기존과 같은 이름, 설명, 힌트로 계속 표시되며, 핸들러는 extensions/omo-memory-commands.js에서 로드됩니다. 로그인된 디바이스 계정은 세션이 동기화를 처음 확인할 때 extensions/omo-device-account.js에서 로드됩니다. 이 파일을 불러오지 못하면 메모리 동기화는 로그아웃 상태로 보이는 대신 이유와 함께 sync-unavailable을 보고합니다.
ulw-research는 리서치 보고서용 팩트 원장, 충실도 상태 파일, 클레임 인덱스를 제공합니다. 각 리서치 실행마다 사실과 검증된 주장을 기계가 읽을 수 있는 형태로 기록합니다. 아직 CLI에서 이를 사용하는 곳은 없습니다 (#11046, #11009 일부; 배치 #11148).
Windows에서 dori 사이드카 경로가 확장의 경로 검사를 통과합니다. omo-senpi 테스트가 사이드카 경로의 Windows 형식을 허용하도록 바뀌어, 올바른 경로에서 Windows 테스트 스위트가 더 이상 실패하지 않습니다 (#11111, #11110 수정).
자식 작업, 워크플로, 워크풀의 wake 소스가 종류 children으로 보고됩니다. (#11114, #10782 일부)
읽을 수 없는 워크풀 저장소 때문에 children wake 소스가 누락되거나 잘못 비워지지 않습니다. (#11118, #10782 일부)
children wake 소스는 스냅샷마다 워크풀 저장소를 한 번만 읽습니다. (#11124, #10782 일부) (배치 #11148)
wake 큐에서 대기 중인 자식 결과 때문에 부모가 완료된 것으로 읽히는 문제가 해결되었습니다. (#11115, #10782 일부)
wake 큐 개수 때문에 전달 영수증을 잃을 수 없으며, 세션 세대별로 다시 게시됩니다. (#11121, #10782 일부)
영수증 처리 중 예외가 발생해도 wake 큐 개수가 올라간 채로 남지 않습니다. (#11122, #10782 일부)
전달 영수증은 서로 격리되며, 폐기(retire) 시에도 마찬가지입니다. 영수증 오류도 누락되지 않습니다. (#11123, #10782 일부) (배치 #11148)
wake 큐 플러시는 각 영수증과 자식 개수를 한 번씩만 정산하며, onReceiptError가 예외를 던져도 나머지 처리가 멈추지 않습니다. (#11137, #10782 일부) (배치 #11148)
Windows 헬퍼 프로세스 트리 종료 시 재사용된 부모 PID를 방어합니다. QA 헬퍼가 부모의 PID를 재사용한 무관한 프로세스 트리를 더 이상 중지하지 않습니다 (#11007).
종료 중인 세션이 일시 중지한 작업이 여전히 실행 중인 이유를 표시합니다. 소유 세션을 종료하면 실행 중인 모든 자식이 보류 상태가 되지만, 보류된 기록에는 이유 없이 단순 running 상태만 남아 있었습니다. 그래서 그 세션을 다시 재개하지 않고 재시작하면, 아무도 움직이지 않을 실행 중 작업으로 보였습니다. 이제 종료 시 보류 기록에 session_quit이 기록되며, task_output과 작업 스냅샷에는 "재개 중 (세션 종료)"로 표시됩니다. 이후 재개 시 reconcile이 부활을 미루면 그 보류 사유로 대체됩니다 (senpi#3493, #10533, 감사합니다 @Bearmancer).
프로젝트의 스킬이 프로젝트 밖으로 접근할 수 없고, 해당 MCP 서버가 전체 환경 변수를 받지 않습니다. 프로젝트 밖을 가리키는 스킬 링크는 거부되며, 그 이유는 스킬 도구 결과와 OpenCode에 표시됩니다. 직접 설정한 스킬 폴더로의 링크는 계속 동작합니다. 프로젝트 스킬에서 온 MCP 서버는 작은 안전 기본값(경로, 홈, 임시 디렉터리, 로케일, CA 경로)과 선언한 변수만으로 시작합니다. 서버가 받지 못한 변수를 요청하면, 결과에 해당 변수 이름과 해당 서버 선언에 대한 허용을 저장하는 정확한 /omo-mcp-env-grant 명령이 표시됩니다. 저장되는 것은 변수 이름뿐이며, 엔진이 사용하는 것과 같은 파일에 기록됩니다. 직접 설치한 스킬(전역 OpenCode 설정의 경로 포함)은 기존 환경을 그대로 유지합니다. 작업 탐색은 중첩된 참조 문서를 스킬에서 제외하고, 같은 저장소 안의 패키지 간 링크는 허용합니다. 읽을 수 없거나 없는 스킬은 보안 차단이 아니라 실제 파일 오류를 보고합니다. 교체되거나 밀려난 허용 명령은 만료되며, 서버를 다시 열면 필요할 때 새 명령을 제공합니다 (#10716).
컴퓨터 사용 기능이 거부된 macOS 실행 컨텍스트를 설명하며, 엔진이 닫혔다고 보고하지 않습니다. 실제 엔진 자식 프로세스가 시작을 거부하면, 초기 활성화와 이후 재시작 시 복구 안내와 함께 COMPUTER_LAUNCH_CONTEXT_REQUIRED를 보고합니다. 권한 오류, 데스크톱 전환, 네이티브 실행 게이트는 기존 동작을 유지합니다 (#11073, #11086).
스레드 도구는 세션을 변경하기 전에 선택한 RPC 호스트가 맞는지 확인합니다 (#10712). 클라이언트는 챌린지-응답으로 호스트의 키를 검증하고, 같은 연결에서 선택한 세션을 영구 ID로 지정합니다. 그래서 라우팅 ID를 재사용한 호스트가 다른 세션의 변경을 받을 수 없습니다. 종료 중인 호스트는 실패로 처리하지 않고 재시도 가능한 host_draining 오류로 응답하며, 실제로 적용된 변경은 실패로 보고되지 않습니다.
빌드가 각 번들 산출물이 어떤 파일로부터 만들어졌는지 기록합니다. packages/omo-senpi/bundle-inputs.json은 커밋된 번들을 생성하는 생성기가 읽는 모든 저장소 파일을 나열합니다. 이 목록은 빌드 레시피 자체에서 추적되며, CI가 최신 상태인지 확인합니다. 이제 병합 도구는 스킬만 변경된 경우 번들이 바뀌지 않는다는 것을 알 수 있습니다 (#11079, #11084).
텔레메트리가 꺼진 세션은 시작하자마자 남아 있던 세션 요약을 삭제합니다. 비정상 종료된 세션이 남긴 요약 파일은 이후 텔레메트리가 켜진 세션이 가져갈 때까지 디스크에 남아 있었습니다. 이제 텔레메트리가 꺼진 세션은 omo.json에서 해당 프로젝트의 텔레메트리를 끈 경우 시작 시 이 파일들을 삭제합니다. DO_NOT_TRACK 같은 환경 변수로만 설정한 옵트아웃은 해당 세션에만 적용되고, 다른 세션의 요약은 그대로 둡니다. omo.json에서 텔레메트리를 끄면 최대 5초 뒤가 아니라 다음 턴부터 바로 적용됩니다. 프로젝트를 구분할 수 없는 요약은 절대 전송되지 않습니다 (#10234) (#10267) (배치 #11148).
세션 요약은 어느 단계에서 충돌하더라도 살아남으며, 두 번 집계되지 않습니다. 각 요약 윈도우는 고유 ID를 가지며 이벤트 ID로 전송됩니다. 전송 전에 로컬 대기 파일에 기록되고, 전달이 확인된 후에만 삭제됩니다. 이후 OmO가 시작되면 남은 항목을 같은 ID로 다시 전송합니다. 강제 종료된 프로세스가 남긴 윈도우는 그 프로세스가 사라지고 1분마다 보내는 하트비트가 5분 동안 멈춘 뒤에 한 번만 전송되므로, 잠든 노트북은 자신의 윈도우를 유지합니다. 세션 시퀀스는 재시작 후에도 유지되며, 실행마다 무작위로 정해지는 summary_epoch 안에서 증가합니다. 다른 프로세스가 이어받거나 복구한 세션은 새 시퀀스를 시작하므로, 한 프로세스가 죽은 것으로 잘못 판단되더라도 두 프로세스가 같은 (epoch, sequence) 쌍을 보내는 일이 없습니다. 비용은 1/10,000 USD 단위의 정수(cost_1e4)로 더해져서 요약과 원시 턴이 정확히 일치합니다. dropped_events는 14일이 지나 버려야 했던 항목 수를 집계합니다. telemetry.rawTurnSampleRate(또는 OMO_TELEMETRY_RAW_TURN_SAMPLE_RATE)는 원시 턴 행도 함께 보내는 세션의 비율을 설정하며, 기본값은 0.05입니다 (#10198, #10225) (배치 #11148).
모든 세션 이벤트는 사용자가 연 세션에서 발생했는지, OmO가 생성한 세션에서 발생했는지 표시합니다. session_started, turn_completed, session_summary에는 session_role(root, child, unknown)이 포함되므로, 위임된 자식의 사용량이 부모 위에 다시 집계되지 않습니다 (#10198, #10225) (배치 #11148).
원시 턴 행은 사용자의 자체 게이트웨이를 거친 공개 모델의 이름을 유지합니다. 제공자가 OmO에 포함되지 않은 것이면 turn_completed는 모델을 custom으로 가렸지만, session_summary와 다른 모든 이벤트는 라우팅 제공자와 관계없이 공개된 모델 ID를 이미 유지하고 있었습니다. 게이트웨이 이름 자체는 여전히 전송되지 않습니다 (#10198, #10225) (배치 #11148).
재시작 또는 세션 복원 후에도 플랜 리뷰가 계속 동작합니다 (#10558). plan-consultant와 plan-reviewer는 사용자가 ulw-plan을 요청하고 플랜 파일이 존재한 뒤에만 생성됩니다. 이 상태는 메모리에만 있었기 때문에, 재시작, 데스크톱 복원, 세션 재개 후에는 게이트가 비어 있어 다시 요청하기 전까지 플랜 리뷰가 거부되었습니다. 이제 게이트는 세션 시작 시 세션 자체의 트랜스크립트로부터 다시 구성됩니다. 플랜 파일 읽기와 쓰기가 다시 집계되며, 엔진이 사용자가 입력했다고 기록한 요청만 집계됩니다(senpi 2026.10.21-2 이상). 따라서 확장이 주입한 텍스트로는 여전히 게이트가 열리지 않습니다. 리로드로 넘겨받은 상태도 유지됩니다 (#10378).
엔진이 senpi 2026.10.23-1로 올라갑니다. 예약된 프롬프트와 /loop 틱이 턴 중에도 열린 세션에 도달하고, 푸터에 서브에이전트가 사용한 비용이 표시되며, 매우 긴 세션과 턴에서 컴팩션이 다시 동작합니다 (#11126). 예약된 프롬프트는 이제 열린 세션에 도착하며, 에이전트가 작업 중이면 실행 중인 턴에 주입됩니다. 턴 중에 도래한 /loop 틱은 다음 단계에서 읽힙니다. 각 세션은 모델별 thinking 수준을 기억합니다. Stop은 입력하거나 /resume할 때까지 세션을 일시 중지합니다. 저장된 로그인이 없는 HTTP MCP 서버가 프로세스를 최대 30초 동안 멈추게 하던 문제가 사라졌고, 백그라운드 사용량 확인이 네트워크 오류로 정상 Claude 로그인을 잠그지 않으며, 가격이 없는 models.json 항목은 $0으로 과금하지 않고 내장 가격을 유지합니다. 내장 /llama llama.cpp 연동은 업스트림에서 제거되었으며, 저장된 llama.cpp 제공자는 무시됩니다.
Bun으로 설치된 omo는 이후 업그레이드가 성공하도록 명령 링크를 그대로 유지합니다. 실행은 여전히 Bun에서 직접 시작되며, 새 버전으로 실행하면 이전에 생성된 래퍼를 심볼릭 링크로 복원합니다. 이로써 Bun 1.4.4에서 반복되던 EEXIST 실패가 해결되며, 오래된 래퍼에서 처음 업그레이드할 때는 PR에 설명된 일회성 삭제가 필요할 수 있습니다 (#11024).
엔진이 senpi 2026.10.21-3으로 올라갑니다. 긴 1M 컨텍스트 대화가 캐시된 프리픽스를 다시 쓰지 않으며, Anthropic 구독 컨텍스트는 한 번만 계산되고, "No credential slots available"가 모든 계정을 잠그지 않습니다 (#10965). 1M 윈도우에서 컨텍스트 축소가 긴 대화를 줄이면, 축소된 프리픽스가 동일하게 유지되고 캐시 체크포인트도 그대로 남으므로 각 단계는 변경된 부분만 씁니다. 내부 SDK 재요청이 있는 Anthropic 구독 턴은 더 이상 컨텍스트 비율을 두 배로 계산하거나 컴팩션을 너무 일찍 시작하지 않습니다. 설정된 컴팩션 모델은 세션 제공자가 정상인 동안 임계값, 추측적, 유휴 컴팩션을 수행합니다. 구독 레인만 계정을 선택하므로, 취소되었거나 잠시 속도 제한에 걸린 계정 하나가 다시 로그인하기 전까지 나머지를 막지 않습니다. 모든 턴 종료 시 다음에 일어날 일을 알려주고, 턴 종료 보고서는 대기 중이던 메시지가 해제한 보류를 명시합니다. 네이티브 질문을 지원하지 않는 클라이언트에서 끝에 표시되던 "Anything else? (optional)" 카드는 사라졌고, 기기 간 세션 이동은 하나의 구현으로 처리됩니다. 컨텍스트 오버플로 후 강제 복구는 보이지 않는 항목이 세션 앞에 있을 때 같은 컴팩션 지점을 다시 고르지 않습니다. 오버플로 때문에 작업이 다음 대체 모델로 넘어가는 일은 여전히 없습니다.
작업은 제공자 설정이 모델과 짝지은 -fast 모델 별칭을 존중합니다. Kibitzer는 시작이 거부된 모델에서 멈추지 않고 다음 모델로 대체합니다 (#10538, #10536 수정).
자식 시작 실패는 원인을 유지합니다. 부모가 stdin에 쓰는 도중 작업 자식이 종료되면, broken-pipe 오류 대신 자식 자신이 보고한 타입이 있는 실패 원인이 보고됩니다 (#11097, #11096 수정).
사이드 패널은 열 표시에 전체 화면 TUI가 필요하다는 점을 한 번 알려줍니다. side_panel.enabled는 오른쪽 열을 전체 화면 TUI에서만 그립니다(--tui-mode fullscreen, 또는 senpi 설정의 tuiMode). 기본 일반 모드에서는 섹션이 편집기 위의 블록으로 유지됩니다. 문서의 side_panel 표 맨 위에 이 내용이 추가되었고, 패널을 켠 상태에서 일반 모드를 처음 실행하면 두 가지 전환 방법을 알려주는 일회성 알림이 표시됩니다 (#10560, #10565).
스스로 깨어나거나 작업 호스트가 재시작된 후 재연결하는 백그라운드 작업은 호스트에서 올바른 완료/실행 표시를 유지합니다 (#11094). 이전 턴이 끝나는 순간 작업이 스스로 새 실행을 시작하면 완료로 표시된 상태로 남을 수 있었고, 그러면 교체된 작업 호스트가 아직 작업 중인 작업을 버릴 수 있었습니다. 완료된 작업의 호스트가 재시작되면 완료 표시를 잃어, 새 호스트가 작업을 다시 열 수 있었습니다. 이제 둘 다 올바른 표시를 유지합니다 (#11092).
구독 사용량은 로그인되어 있지만 엔진이 환경 변수 토큰으로 응답하는 경우에도 사이드 패널에 표시됩니다 (#10564). 기존에는 이 경우 아무것도 표시되지 않았습니다. 다른 로그인 계정의 수치는 여전히 표시되지 않습니다 (#11101).
한 줄 Linux 설치 스크립트는 musl 패키지가 설치된 glibc 호스트에서 glibc 빌드를 선택합니다. install.sh는 /lib/ld-musl-*.so.1 로더가 있으면 무조건 musl 시스템으로 판단했기 때문에, musl-tools나 musl-dev가 설치된 Debian 또는 Ubuntu 호스트는 omo-linux-x64-musl을 내려받아 이후 업데이트용으로 기록했습니다. 이제 glibc 호스트(getconf GNU_LIBC_VERSION이 응답하는 호스트)는 항상 glibc 빌드를 받습니다. musl 검사도 ldd --version을 pipefail에서도 맞게 읽도록 바뀌었습니다. musl의 ldd는 버전을 출력한 뒤 1로 종료하기 때문입니다 (#10562, #10612).
bun run lint가 다시 복사 검사를 실행하며, Bun은 저장소의 모든 프로세스마다 경고를 출력하지 않습니다. 병합 후 루트 package.json에 "lint" 스크립트가 두 개 있었기 때문에 복사 검사가 조용히 건너뛰어졌고, Bun은 시작할 때마다 stderr에 "Duplicate key" 경고를 출력했습니다. 이 경고 때문에 조용한 자식 프로세스를 기대하는 테스트가 실패했습니다. 이제 하나의 lint 스크립트가 두 검사를 모두 실행하며, 테스트는 모든 package.json의 중복 키를 거부합니다 (#11108).
메모 노트는 Windows에서 원래의 줄바꿈을 유지합니다. Git for Windows는 기본적으로 줄바꿈을 변환하므로, LF나 혼합 줄바꿈으로 커밋된 노트가 reflection 워크트리에서 CRLF로 바뀌어 돌아왔습니다. 그러면 설명 이외의 모든 바이트를 유지해야 하는 설명 사전 검사가 실패했습니다. 이제 모든 메모리 저장소는 core.autocrlf=false를 고정하며, 오래된 저장소를 열면 커밋된 노트와의 차이가 변환된 줄바꿈뿐인 작업 사본만 복원됩니다 (#11112, #11109 수정) (배치 #11148).
메모리 reflection과 dream 실행은 완료 검증 전에 지나치게 긴 노트 설명을 잘라냅니다. 노트 본문은 보존되며, 실행이 계속 실패하여 정체성이 중단되는 일이 없습니다 (#10999).
프런트엔드 스킬은 화면을 그리기 전에 무엇을 뺄지 결정하며, 시각 QA는 재디자인이 개선되었는지 증명하고 몇 라운드 후 멈춥니다 (#11023). 코드를 작성하기 전에 모든 화면은 하나의 기본 액션, 정보 우선순위, 의도적으로 제외할 항목, 반드시 유지해야 할 콘텐츠를 명시합니다. 초안이 렌더링된 후에는 감산 단계가 사용자에게 필요 없는 것을 제거하고, 필수 항목이 누락되거나 병합되지 않았는지 확인합니다. 작은 변경은 전체 라이브러리 대신 프로젝트의 디자인 파일과 최대 하나의 참조만 읽으며, 분위기 연출과 수상급 스타일링은 브리프가 요구할 때만 만들어집니다. 시각 QA에는 첫 편집 전에 고정된 케이스를 캡처하고 나란히 비교하는 전/후 모드가 추가되었습니다. 리뷰 루프는 이제 2~3라운드 후 끝나며, 레이아웃, 기능, 접근성, 누락된 콘텐츠 결함은 추가 라운드를 받고, 취향에 관한 메모는 기록만 되고 루프를 멈춥니다.
컴퓨터 사용 기능은 정지 키 조합을 들을 수 없을 때 입력을 거부합니다. macOS에서 비밀번호 필드나 Secure Keyboard Entry가 Secure Event Input을 켜면, 키 입력이 정지 키 조합의 리스너에서 숨겨졌습니다. 그럼에도 컴퓨터 사용은 계속 실행되어 정지 조합이 멈추지 못했습니다. 이제 보안 입력이 끝날 때까지 StopPathUnavailable(secure-input-active)로 입력을 거부하며, 이후 자동으로 재개합니다. 진행 중인 type은 정지 경로가 입력 허가를 취소하면 텍스트를 끝까지 치는 대신 다음 글자에서 멈춥니다. Linux X11 리스너는 XInput 2.0 서버에서 활성화되지 않습니다. 이 서버에서는 키보드 그랩이 정지 조합을 가로챌 수 있기 때문입니다. 일반 Esc는 평범한 키로 남습니다 (#10534, #9651, #10537).
프런트엔드 초안 가드는 강조 줄무늬뿐 아니라 홍보성 문구, 이모지 아이콘, 과장된 배지, 허영 지표도 잡아냅니다 (#11022). 명령 하나인 check-draft-guard.ts가 강조 줄무늬 규칙에 더해 화면에 보이는 마크업 텍스트에 대한 네 가지 검사를 실행합니다. 영어와 한국어 문구의 홍보성 군더더기, 아이콘으로 쓰인 이모지, 내용이 "New"나 "AI-powered" 같은 과장 라벨뿐인 배지, 그리고 "10x", "500+", "24/7" 같은 마케팅형 숫자를 담은 통계 타일입니다. "42%"나 "1.2k" 같은 측정값은 통과합니다. 코드(TypeScript 제네릭과 비교 연산 포함), 스크립트, 스타일, 주석, 숨겨진 요소, 바인딩된 값, 상태 속성이 있는 배지는 플래그되지 않습니다. <Badge> 같은 React 컴포넌트 태그, <Stat value="10x">, cn() 클래스 목록, aria-label과 placeholder 같은 공지되는 속성은 검사됩니다. 프런트엔드와 visualize 스킬은 시각 QA 전에 check-accent-stripes.ts 대신 이 명령을 실행합니다. check-accent-stripes.ts도 단독으로 계속 동작합니다. 두 명령 모두 검사 폴더의 깨진 심볼릭 링크를 건너뛰어 충돌하지 않으며, 명령줄에서 주어진 읽을 수 없는 경로는 종료 코드 2로 보고합니다.
동작하지 않는 메모리 동기화는 TUI에서 그 사실과 해결 방법을 알려줍니다. 동기화 주기가 실패하면 오류는 로그에만 남았고, 상태 표시는 마지막 성공 동기화를 계속 보고했습니다. 이제 동기화가 실패하는 동안 메모리 푸터에 sync blocked가 표시되며, 알림 하나가 이유와 조치를 알려줍니다. 충돌한 작성자가 남긴 git 잠금에는 /memory unlock <path>, 만료된 로그인에는 다시 로그인, 동기화 서비스에 연결할 수 없으면 연결 확인을 안내합니다. 단일 요청 실패는 조용히 재시도되며, 오프라인 알림은 연속 세 번의 주기가 실패한 뒤에만 나타납니다. 동기화가 복구되면 알림이 그 사실을 알리고 푸터가 지워집니다 (#10637, #10958).
에이전트는 하나의 툴킷 SDK를 통해 dori 확장에 접근할 수 있으며, 재시도된 턴이 이미 실행된 호출을 반복하지 않습니다. dori 섹션을 켜면 툴킷에 route, reply, room, send, thread, describe, file, rules, iam, call, work 네임스페이스가 추가되고, help()가 시그니처와 함께 이를 나열합니다. 끄면 이들이 존재하지 않으며 dori 코드도 로드되지 않습니다. 모든 호출에는 엔진이 기록한 호출자와 재생 키가 포함됩니다. 재생된 턴은 기록된 결과를 돌려받고, 인자가 다른 재생은 타입이 있는 오류로 중단되며, 7일이 지난 호출은 다시 실행되지 않고 거부됩니다. dori 요청을 기다리던 세션은 타임아웃까지 잠들지 않고, macOS 파일 감시가 wake 이벤트를 놓쳐도 깨어납니다 (#10458).
스토어 확장은 세션에서 호출 가능한 작업을 실제 도구로 노출할 수 있으며, 워커가 모든 스토어에 스키마 라이브러리를 끌어들이지 않습니다. 스토어 확장의 sessionCallable 선언은 작업마다 toolName, description, JSON Schema parameters를 포함할 수 있습니다. 세션의 엔진은 이를 ext_<extension>_<toolName>으로 등록하며, 도구는 호출 세션의 영구 ID를 인자가 아니라 엔진에서 받습니다. 워커는 작업의 트랜잭션 안에서 caller_session_durable_id와, 호출자가 대상을 thread_create한 경우 caller_created_target을 기록합니다. 이 호출자 필드 이름이 들어간 인자는 검증 전에 거부되며, 공개 extensionCall 채널은 선언된 세션 작업을 모두 거부합니다. 워커는 작업 인자를 JSON Schema 부분 집합(type, properties, required, additionalProperties true/false, enum, const, pattern, 길이/항목/숫자 범위, items, anyOf)에 대해 직접 검증하며, register()는 그 외 키워드를 거부하므로 제약이 건너뛰어지지 않습니다. 이 과정에서 스토어 워커에서 typebox/value도 제거되었습니다. 번들은 206 KB에서 115 KB로 줄었고, 워커를 시작할 때마다(유휴 후 재시작 포함) 모듈 그래프를 불러오던 비용이 사라졌습니다. statusOp/expireOp/timeoutMs와 함께 선언된 await는 wake 파일 대기를 설정하며, thread_creations는 호스트 재시작 후에도 누가 어떤 세션을 생성했는지 영구 기록합니다 (#9551).
제품 문구는 em dash 대신 더 명확한 문장부호를 사용합니다 (#10994). 에이전트 프롬프트, 알림, 메모리 회상 도입부, 웹 메타데이터는 이제 쉼표, 콜론, 괄호를 사용하며, 빈 값 자리표시자는 하이픈을 사용합니다. 소스 AST 검사는 제품 문자열, 템플릿 요소, JSX 텍스트에 새 em dash가 들어가는 것을 막으며, 주석, 정규식, 테스트, 생성된 코드, 벤더링된 소스는 건드리지 않습니다. 같은 검사는 이제 lint와 TypeScript 억제 주석에 이유를 요구하며, 그 이유는 인라인이나 바로 위 주석에 있어야 하고 Biome 무시 규칙도 포함됩니다.
OmO 데스크톱 안에서 브라우저 스킬은 터미널에서처럼 동작하며, 앱 내장 브라우저도 사용할 수 있습니다. 에이전트의 브라우저(BrowserSkill을 통한 사용자 브라우저 또는 에이전트가 직접 시작한 브라우저)는 앱 안에서 더 이상 거부되거나 변경되지 않습니다. connectBuiltinBrowser()는 앱 내장 브라우저에 해당 스레드의 탭을 추가하므로, 채팅 옆에서 그 과정을 지켜볼 수 있습니다 (#11066).
OmO 데스크톱 앱의 Built-in browser 모드 세션은 앱에 내장 브라우저를 요청할 수 있습니다. 브라우저 스킬은 에이전트에게 앱 내장 브라우저 도구를 사용하라고 안내했지만 OmO 세션에는 그런 도구가 없었기 때문에, 에이전트는 기기에 있는 외부 브라우저를 찾아 사용했습니다 (sisyphuslabs/omo-desktop-app#3292). 새로운 평가 전용 omo_desktop_toolkit 도구는 세션 스레드를 위해 앱이 호스팅하는 툴킷을 요청하며, 브라우저 스킬의 connectBuiltinBrowser()는 이를 사용해 OmOWright를 해당 스레드의 탭에 연결합니다. 앱의 권한 부여는 loopback 엔드포인트와 토큰 파일을 지정하므로, 토큰은 도구 결과에 나타나지 않습니다. 툴킷을 제공하지 않는 앱에는 즉시 응답하며, 15초 안에 응답하지 않으면 타임아웃이 발생합니다. 데스크톱 앱이 해당 기능을 배포한 후에 동작합니다 (#10602, #10601 수정).
보류된 사실은 내용을 잃지 않고 활성 큐에서 빠집니다. 기존 백로그는 한 번 마이그레이션되고, 수동 재시도로 복원되며, 턴 종료 스캔은 활성 항목만 읽습니다 (#11038).
사이드 패널의 사용량 섹션은 엔진이 이미 보관하는 구독 한도를 읽으므로, 데스크톱과 같은 수치를 첫 턴 이전에도 보여주며 자체 네트워크 요청을 하지 않습니다 (#10553). senpi는 이제 로그인된 Claude와 ChatGPT 구독을 직접 폴링합니다 (code-yeongyu/senpi#3687). 패널은 제공 중인 계정을 고르고 그 기록을 그릴 뿐입니다. 엔진이 아직 읽지 않은 계정으로 전환되면 이전 계정의 수치 대신 아무것도 표시하지 않습니다. side_panel.usage_poll_seconds는 폐기되었습니다. 여전히 허용되지만 이제 무시됩니다.
작업 호스트가 재시작된 후 완료된 백그라운드 작업이 스스로 다시 깨어나지 않습니다 (#11083). 공유 작업 호스트에서 실행된 작업은 완료된 뒤에도 세션이 그 호스트에 로드된 상태로 남았고, 완료되었다는 표시도 없었습니다. 호스트가 교체되면 새 호스트가 그 세션을 다시 열었고, 작업의 후속 작업이 아무도 지켜보지 않는 상태로 다시 실행되어 사용량을 소모할 수 있었습니다. 이제 작업이 끝나는 즉시, 그리고 세션을 놓아주기 전에 다시 호스트에 완료로 표시하므로, 부모 세션이 비정상 종료되어도 새 호스트는 이를 닫힌 상태로 둡니다. task_send로 계속 진행하는 완료된 작업은 메시지가 전달되기 전에 실행 중으로 다시 표시됩니다. 연결이 끊겼다가 재연결되어도 표시는 바뀌지 않습니다 (#10778).
웹 터미널 시각 QA 드라이버는 입력하기 전에 텍스트를 기다릴 수 있습니다. 시작이 느린 TUI는 고정된 시작 지연 때문에 처음 입력한 키를 잃곤 했습니다. --input에 {WaitFor:<text>}를 넣으면, 드라이버는 <text>가 나타날 때까지 렌더링된 xterm 버퍼를 확인한 뒤 계속합니다. --wait-for-timeout-ms(기본값 10000) 안에 나타나지 않으면 캡처가 텍스트와 시간 초과를 명시한 오류로 실패하며, 빈 {WaitFor:}는 거부됩니다. @cynkai님께 감사드립니다 (#9583, #9666).
분량 관계로 이후 내용은 번역에서 제외했습니다. 전체 내용은 위 원문 링크에서 확인하세요.