메모리에서 변경 내역을 읽는 동안 세션의 첫 프롬프트가 공유 호스트를 멈추지 않도록 수정 (#10728). 마지막 턴 이후 몇 시간 뒤에 재개된 세션은 그 이후의 메모리 커밋을 커밋마다 git diff-tree 프로세스 하나씩으로 읽었고, 이 프로세스들이 모두 동시에 시작되었습니다. 메모리 저장소가 바쁜 경우 수천 개의 프로세스가 생겼고, 이를 시작하는 동안 같은 호스트의 모든 세션이 세션 1개일 때 28초, 7개일 때 142초 동안 막혔으며, 종료된 프로세스는 회수되지 않고 쌓였습니다. 이제 범위를 git log 한 번으로 읽으며, 같은 알림이 출력됩니다. 세션 7개일 때 가장 긴 차단 시간은 16초로 줄었고, 프롬프트 처리 중 호스트의 메모리 사용량 중앙값은 1,258MB에서 813MB로 줄었습니다. (#10726)
메모리 커밋마다 공유 호스트가 멈추던 현상을 수정 (#10731). 리콜은 대화에 이미 언급된 메모리 노트를 건너뛰는데, 메모리 커밋이 있을 때마다 최근 200개 메시지를 모든 노트와 다시 대조했고, 노트를 한 번에 하나씩 처리했습니다. 노트 7,500개짜리 메모리에서는 세션당 프롬프트마다 1~1.7초가 걸렸고, 호스트의 모든 세션이 그동안 대기했습니다. 이제 이전 결과를 이어받아 커밋이 새로 추가한 노트만 검사하므로, 재검사는 약 6ms, 첫 검사는 약 0.2초가 걸립니다. 세션 7개와 20초마다 커밋이 발생하는 상황에서 4분 30초 동안 호스트의 차단 시간이 185초에서 28초로 줄었습니다. 건너뛰는 노트의 기준은 바뀌지 않았습니다. (#10729)
재실행 후 첫 프롬프트에서 메모리를 다시 컴파일하지 않도록 개선. 컴파일된 메모리 블록과 크기 추정값을 메모리 저장소의 .git 폴더 안에 커밋 단위로 저장하며, 이 데이터는 커밋되거나 동기화되지 않습니다. 다음 실행 시 이를 다시 읽습니다. 노트 6,862개짜리 메모리에서 데스크톱 앱 기준 프롬프트의 메모리 단계 중앙값이 약 178ms에서 약 52ms로 줄었습니다. git 읽기가 실패한 뒤 만든 블록은 한 번만 사용하고 저장하지 않습니다. (#10674)
익명 사용 통계가 이제 제공자별로 연결된 계정 수를 집계합니다. session_started는 제공자 종류별로, 엔진이 해당 제공자에 대해 나열하는 계정 수(앱의 계정 목록에 표시되는 목록과 같으며, 로그인된 계정과 환경 변수 슬롯을 포함)를 사용 여부와 관계없이 상한이 적용된 개수로만 보고합니다. 계정 이름, 이메일, 토큰, 값은 전송하지 않습니다. (#10919)
데스크톱 앱과 omo login이 한 기기를 공유할 수 있도록 개선. 새로운 숨김 명령 omo account(show, adopt, token, export, forget)를 추가하여, 데스크톱 앱이 CLI가 기록한 것과 같은 OS 키체인 로그인을 사용할 수 있습니다. 이에 따라 한 기기는 메모리 동기화에서 하나의 기기로 계산되며, 토큰을 갱신하는 프로세스도 하나뿐입니다. 비밀 값은 표준 입력과 표준 출력으로만 전달되고, 갱신이 거부되면(종료 코드 5) 서비스의 거부 코드를 함께 알려 데스크톱 앱이 로그인이 종료된 이유를 표시할 수 있습니다. OS 키체인이 잠겨 있으면 일반 실패가 아닌 별도 결과(종료 코드 7)로 보고합니다. Linux에서는 잠긴 Secret Service 컬렉션이 비어 있는 것으로 읽히기 때문에, 비밀 값을 요청하기 전에 D-Bus를 통해 기본 컬렉션의 잠금 상태를 먼저 확인합니다(그렇지 않으면 libsecret이 키링의 잠금 해제 창을 띄웁니다). 잠긴 컬렉션은 읽지 않고 보고합니다(종료 코드 7). 이 확인이 결과를 내지 못하는 경우(최소 설치에 gdbus가 없거나, 버스에 Secret Service가 없거나, 버스가 느린 경우)에는 CLI가 알림을 한 번 출력하고 이전처럼 libsecret을 직접 사용하므로, 로그인이 gdbus에 의존하지 않습니다. (#10658)
메모리 동기화에 새 기기를 추가할 수 있습니다. omo sync enable은 해당 기기의 메모리 동기화를 켜며, 계정이 이미 동기화 중이면 동기화 중인 기기에 승인을 요청합니다. 그 기기에서 omo sync approve를 실행하면 요청에 응답합니다. 두 화면에는 같은 6자리 코드가 표시되며, 사용자가 코드가 일치함을 확인한 후에만 새 기기가 추가됩니다. 키를 바꿔치기하는 중계 서버는 다른 코드를 만들어 내므로 거부됩니다. omo sync recover는 데스크톱 앱의 패스키 복구 기능을 안내합니다. (#10625, #10634)
태스크 호스트에서 시작된 작업이 처음부터 자신의 세션 ID를 기록합니다 (#10885). 이전에는 호스트된 모든 작업의 ID가 비어 있었기 때문에, 자식 세션으로부터 부모 작업을 찾는 기능(데스크톱 앱의 작업 트리, 작업 취소 시의 정리 등)이 호스트된 작업을 놓쳤습니다. ID는 세션이 열릴 때 이미 호스트의 응답에 포함되어 있었고, 이제 이를 보관합니다.
익명 사용 통계가 설정한 제공자뿐 아니라 로그인한 제공자도 집계합니다. session_started는 models.json에 있는 제공자만 집계했기 때문에, 구독에 방금 로그인했거나 API 키를 추가한 사용자는 제공자 수가 0으로 표시되었습니다. 이제 두 가지를 모두 집계하며, signed_in_provider_count와 configured_provider_count를 따로 보고합니다. OmO가 기본 제공하는 제공자의 이름만 전송하고(그 외에는 custom), 계정, 키, 자격 증명은 전송하지 않습니다. (#10889)
Linux에서도 쓰기 프로세스가 비정상 종료된 뒤 메모리 쓰기가 스스로 복구됩니다. 메모리 쓰기 프로세스가 커밋 도중 강제 종료되면, 다음 쓰기는 쓰기 프로세스가 종료되었음이 확인된 뒤 남겨진 git 잠금을 제거하도록 되어 있습니다. 그런데 Linux에서는 이 확인이 /proc을 통해 다른 프로세스를 읽었고, 일반적인 systemd 로그인(또는 SSH 세션, CI 러너)에서는 사용자 자신의 일부 프로세스도 읽을 수 없어서 잠금이 항상 유지되었고, /memory unlock을 실행하기 전까지 모든 쓰기가 실패했습니다. 이제 메모리의 git 명령은 커널 파일 잠금을 걸고, 그 git 프로세스가 이를 상속합니다. 정리 단계는 이 중 아직 실행 중인 프로세스가 있는지를 커널에 물어봅니다. 살아 있는 쓰기 프로세스의 잠금은 여전히 절대 제거되지 않습니다. (#10604)
세션을 재개할 때 고정된 커밋이 현재 HEAD이면 그 커밋이 아직 존재하는지 git에 더 이상 묻지 않습니다. 재개 후 첫 프롬프트에서 git 프로세스를 최대 2개 줄입니다. (#10707, #10854)
프롬프트마다 메모리의 git HEAD를 최대 3번이 아니라 1번만 읽습니다. 메모리 알림, 소울 알림, 세션 고정이 하나의 읽기 결과를 공유하므로, 모든 프롬프트에서 git 프로세스를 최대 2개 줄입니다. (#10707, #10855)
Bun 프로젝트에서 TypeScript 디렉터리에 대한 lsp_diagnostics는 bun check로 타입 검사를 수행합니다. bun.lock, bun.lockb, bunfig.toml, 또는 bun@ 형식의 packageManager가 있는 프로젝트에서는 bun check가 보고하는 오류를 받습니다. 이 오류는 tsc 7과 같은 오류입니다. 설치된 bun에 린터가 있으면 bun lint 진단도 추가됩니다. prettier로 포맷하는 프로젝트에서는 Senpi 포맷터가 prettier 바이너리 대신 bun format --write를 실행하되, bun이 파일을 제자리에서 다시 쓴다는 것을 확인한 후에만 실행합니다. 각 명령은 빈 디렉터리에서 bun <command> --help가 성공한 경우에만 사용하며, 프로젝트 자체의 같은 이름 스크립트가 대신 실행되는 경우에는 사용하지 않습니다. 시간 초과된 확인은 없는 것으로 기억하지 않고 다시 시도합니다. 그 밖의 프로젝트는 기존 언어 서버 경로를 그대로 유지합니다 (#10840, #10843).
디스크 플러시가 느릴 때 작업 저장소 등록으로 세션이 멈추지 않도록 수정 (#10867, #10868). 태스크 호스트가 시작되기 전에 세션의 작업 저장소를 등록할 때 수행하는 영속 쓰기(fsync, rename, 디렉터리 fsync)를 이제 이벤트 루프 밖에서 처리합니다. 따라서 부하가 큰 Linux 디스크에서는 그 등록만 지연되고, 프로세스의 모든 타이머, 소켓, 프롬프트가 멈추지 않습니다.
메모리가 어시스턴트의 제안을 "사용자가 결정했다"로 바꾸지 않도록 수정. 이제 메모리는 참고용으로만 사용됩니다. 기억된 결정이나 승인은 그 근거(receipt)가 사용자의 말을 인용한 경우에만 인정됩니다. 모든 메모리 쓰기와 추출된 사실에는 출처(source: user, agent, inferred)가 기록됩니다. user 근거는 사용자의 전체 응답이 어시스턴트 제안 직후에 보낸 짧고 명시적인 승인("yes", "ok", "delete it", "네", "지워줘" 등)인 경우에만 보관되며, 근거에는 승인한 제안이 명시됩니다. 그 밖의 경우(유보, 질문, 중간에 끼어든 이미지 전용 메시지, 오래된 "ok" 등)는 어시스턴트 제안으로 저장되므로, 에이전트는 메모리를 근거로 행동하지 않고 다시 묻습니다. @wuhaoyujerry님의 제보에 감사드립니다. (#10488, #10498)
작업을 취소하면 그 작업이 시작한 작업도 함께 중지됩니다 (#10824). 이전에는 취소된 작업의 세션이 실행 중인 하위 작업을 나중에 재개할 수 있는 것처럼 일시 중단했기 때문에, 이들은 아무도 수거할 수 없는 상태로 태스크 호스트에서 계속 도구를 실행했습니다. 이제 취소, 손실, 강제 종료된 작업은 세션이 종료될 때 하위 작업도 취소하며, 같은 규칙이 한 단계 아래에도 적용됩니다. 실행 중인 작업의 종료나 리로드는 여전히 하위 작업을 유지하므로, 재개 시 수거할 수 있습니다.
바쁜 머신에서 모델 확인이 끝나지 못해도 작업 시작이 거부되지 않도록 수정. 작업 하위 항목을 시작하기 전에 OmO는 20초 제한 시간 안에 새 CLI에서 모델 목록을 조회해 해당 모델을 사용할 수 있는지 확인합니다. 부하가 큰 머신에서는 이 조회가 두 번 시간 초과되었고, 유효한 모델이라도 작업 시작이 catalog_probe_timed_out으로 실패했습니다. 이제 확인이 시간 초과되면 작업 시작을 진행하고 그 사실을 로그에 남기며, 최근 30분 이내의 모델 목록이 있으면 그 로그에 함께 기록합니다. 모델을 실제로 사용할 수 없는 하위 항목은 자체 오류와 함께 model_unavailable로 실패합니다 (#10863, #10865).
내부: telemetry-core가 OpenTelemetry를 호스팅하고, 기록 전 임시 저장(write-ahead spool)을 거쳐 제품 이벤트를 OTLP로 전송할 수 있습니다. 새로운 @oh-my-opencode/telemetry-core/otlp 진입점은 최소한의 OpenTelemetry 로거 및 트레이서 프로바이더, 이벤트를 큐에 넣기 전에 모두 디스크에 기록하는 spool(따라서 충돌해도 이미 발생한 이벤트는 손실되지 않음), 재시도가 있는 OTLP/HTTP 전송기, 5MB spool 상한, 버려진 이벤트 카운터, 2초 종료 상한을 제공합니다. 모든 텔레메트리 수신 거부 설정과 OTEL_SDK_DISABLED=true는 계속 적용됩니다. 텔레메트리가 꺼져 있으면 아무것도 기록하지 않으며, 수신 거부 시 이전 실행에서 spool 자체가 만든 파일을 모두 삭제하되 같은 디렉터리의 다른 항목은 건드리지 않습니다. spool 이름을 가진 항목 중 현재 사용자의 일반 파일이 아닌 것은 건너뛰고 그 사실을 보고하며, 삭제하지 못한 각 파일은 오류 코드와 함께 불완전한 수신 거부로 보고합니다. spool 디렉터리가 심볼릭 링크이거나, 다른 사용자의 소유이거나, 호출자가 지정한 루트 밖으로 해석되면 손대지 않습니다. 요청을 받고 응답하지 않는 수집기 때문에 전송이 멈추지는 않습니다. 각 요청은 10초 후 시간 초과되기 때문입니다. 아직 아무것도 이를 사용하지 않으며, 전환은 이후 telemetry.sink 설정과 함께 제공됩니다. 진입점은 아무것도 가져오기 전에 수신 거부 설정과 동의를 먼저 읽으므로, 텔레메트리가 꺼진 상태로 실행하면 OpenTelemetry나 protobuf 코드를 전혀 로드하지 않습니다. 모든 이벤트는 호출자가 전달하는 프로젝션(스키마 아티팩트의 이벤트별 허용 목록이며 기본값은 없음)을 거치고, 스팬은 스팬 허용 목록에 있는 속성만 유지하며, 자유 텍스트 슬롯(LogRecord 본문이나 심각도 텍스트, 목록에 없는 스팬 이름)은 전송되지 않습니다. (#10272, #10273)
OmO Native가 사용자가 핸드오프 힌트를 사용하는지 기록합니다. senpi가 핸드오프 힌트(큰 세션의 캐시가 만료된 뒤 새 세션을 제안하는 줄, code-yeongyu/senpi#3230)를 표시하면, OmO Native는 표시된, 수락된, 닫힌 힌트마다 handoff_hint 이벤트를 하나씩 보냅니다. 이 이벤트에는 컨텍스트 크기, 힌트가 표시한 두 가지 가격, 세션이 구독 중이었는지 여부가 포함되며, 일반적인 텔레메트리 동의와 수신 거부 설정을 따릅니다. 핸드오프 요약, 세션 텍스트, 파일 경로는 기기 밖으로 나가지 않습니다 (#10607).
하위 항목을 기다리는 전송은 "전달됨"이 아니라 "대기 중"으로 표시됩니다. 워크플로 노드 전송과 평가 핸들 전송이 로컬에서만 수락된 경우, 호스트가 메시지를 받기 전에 하위 항목의 실행이 끝나더라도 전달을 주장하지 않고 queued로 보고합니다. 입력 식별자 회귀 테스트는 순서를 확인하기 전에 호스트의 입력 이벤트를 기다립니다 (#10318, #10668).
OmO 세션이 프롬프트 캐시를 다시 미리 준비(prewarm)하며, 이를 막는 요소는 이름으로 표시됩니다. v5.1.17부터 모든 OmO 세션은 게이트웨이, 온보딩, 태스크 호스트의 before_agent_start 핸들러가 미리보기에 안전하지 않은 것으로 등록되어 senpi의 프롬프트 캐시 프리워밍을 건너뛰었습니다. 이제 이 핸들러들은 미리보기에 안전하게 등록되며, 미리보기는 상태를 전혀 바꾸지 않습니다(온보딩 점유 없음, 게이트웨이 저장소 없음, 호스트 실행 없음). 안전하지 않은 before_agent_start 등록은 즉시 경고하며, 시작 후에 추가된 것도 포함합니다. 기록된 건너뛴 프리워밍은 다음 수명 주기 이벤트에서 세션당 한 번 보고되며, 그 이유와 차단 요소 및 소스 위치를 함께 표시합니다. 게이트웨이 미리보기 조회 오류는 이제 예외를 던지는 대신 프롬프트를 그대로 통과시키고 한 번만 경고합니다 (#10356, #10372).
위임된 작업이 다음 대체 모델로 넘어가는 동안, 해당 행, task_output, 완료 알림이 아직 실행된 적 없는 모델에서 실행되었다고 표시하지 않도록 수정. 기록은 새 모델이 보고할 때까지 하위 항목이 마지막으로 실행된 것으로 확인된 모델을 유지하며, 핸드오프 중에는 부모 모델 메모에 "전환 중"으로 표시되고, 작업이 끝날 때까지 하위 항목이 그 모델에서 실행된 것이 확인되지 않았다면 "실행이 확인되지 않음"으로 표시됩니다 (#10797). (#10807)
8318651 Merge pull request #10964 from code-yeongyu/release/v5.1.43-source-state
cb2885f docs(changelog): 미출시 변경 조각들을 5.1.43으로 정리하고 측정된 최적화를 앞에 배치
3314359 Merge pull request #10899 from code-yeongyu/batch/memsync-coord-2
dfd839f batch2: merge #10946 @8628ffe200 (hooks 테스트 정리 시 하위 항목 대기)
843be3b batch2: merge #10947 @f175f53687 (host-prewarm 미리보기 테스트의 win32 건너뛰기)
8628ffe test(memory-core): hooks 테스트 정리 시 임시 루트를 제거하기 전에 살아 있는 하위 항목을 중지하고 대기
2ffa198 batch2: merge #10939 @9727ba7bb9 (#10372 후속: 제한된 정리, 안정된 연결)
5cdde7a chore(bundles): v5.1.42 dev 병합 후 batch #2의 생성된 번들 재생성 (bun 1.4.3)
f763e9d batch2: merge #10372 @0ae78c639e (복원 우선 정리, 제한된 연결 대기)
d6b49d2 batch2: merge #10372 @44aacbcd05 (prompt-cache 미리보기 형제 누출 수정)
303a574 chore(bundles): #10922 런타임 import 수정이 포함된 bundle-train batch #2의 생성된 번들 재생성 (bun 1.4.3)
a5c136b batch2: merge #10372 @df0e2f9f24 (prewarm 테스트 임시 디렉터리 누출 수정)
b4c70f6 batch2: merge #10658 @79672fd997 (Windows 정리 잔여물 수정)
79672fd test(omo-native): gdbus가 없는 픽스처가 빈 bin 디렉터리를 테스트 HOME 안에 유지 (#10658)
5a6ec62 fix(telemetry): pi-ai를 정적으로 가져오지 않고 보호된 동적 import로 로드하여 설치된 플러그인이 항상 로드되도록 수정 (batch #2 영수증)
11df909 chore(bundles): dev 병합 후 bundle-train batch #2의 생성된 번들 재생성 (bun 1.4.3)
335faa2 chore(bundles): #10922 엔진 동등성을 포함한 bundle-train batch #2의 생성된 번들 재생성 (bun 1.4.3)
dddeca7 fix(telemetry): Claude의 빈 계정 목록 = 엔진의 플랫 슬롯; getCredentialAccounts 기준 생성 동등성; 지연 안전한 pi-ai 네임스페이스 import (#10922 리뷰)
cf6937c chore(bundles): #10922을 포함한 bundle-train batch #2의 생성된 번들 재생성 (bun 1.4.3)
14a8500 fix(telemetry): 빈 계정 목록은 연결된 것이 아님; 목록이 없는 제공자 항목은 연결된 계정 1개; 잘못된 auth.json에 대한 진단 1개 (#10922 리뷰)
c1894a7 feat(telemetry): 제공자별 연결된 계정만 집계; 동시 활성 수 제거 (Q, #10919)
47a3735 feat(telemetry): session_started가 제공자별 계정을 집계(연결 및 동시 활성 포함) (#10919)
fa056ea chore(bundles): 재구성된 bundle-train batch #2의 생성된 번들 재생성 (bun 1.4.3)
f02c1c1 docs(changelog): 5.1.41 컷 이후 batch #2 항목을 [Unreleased] 아래에 유지
526f3e3 test(omo-native): 리터럴 경로가 아닌 package.json bin에서 omo 진입점 확인 (#10658)
6142224 fix(telemetry): models.json 파싱 오류는 고정된 메시지만 보고하고 파서 텍스트는 보고하지 않음 (#10889 리뷰)
9403ee9 Merge remote-tracking branch 'origin/dev' into fix/store-admission-async-fsync
ee8ab06 docs(changelog): provider_count가 로그인된 제공자를 집계 (#10889)
c116516 Merge remote-tracking branch 'origin/dev' into fix/10322-git-lock-flock-liveness
af73088 fix(telemetry): models.json 없이도 로그인된 제공자 집계; auth.json 진단이 파일 내용을 인용하지 않음; changes.md 복원 (#10887)
9ac95d7 docs(changes): provider_count가 로그인된 제공자를 집계 (#10887)
1584fda fix(telemetry): provider_count가 설정된 제공자와 함께 로그인된 제공자(auth.json)도 집계 (#10887)
185872c test(qa): 컴파일된 바이너리의 첫 --version이 레거시 평문 자격 증명을 남기지 않음 (#10658 2차)
d55bbe0 fix(omo-native): 이른 hook이 릴리스 진입점이 명령에 응답하기 전에 레거시 평문 자격 증명을 삭제 (#10658 2차 MEDIUM)
분량 관계로 이후 내용은 번역에서 제외했습니다. 전체 내용은 위 원문 링크에서 확인하세요.