Dev.to · 4 min read

Cara osFoundry menemukan sesi Claude Code dan Codex kamu di disk, dibuat ulang dengan Python

Cara osFoundry menemukan sesi Claude Code dan Codex kamu di disk, dibuat ulang dengan Python

~/.claude/projects/-Users-alex-code-shop-api/c5e1a7b2-9d40-4f3e-8b16-2a7c0e9d4f58.jsonl ~/.claude/projects/-Users-alex-code-shop-api/c5e1a7b2-9d40-4f3e-8b16-2a7c0e9d4f58/subagents/agent-.jsonl ~/.codex/state_5.sqlite -> table threads (id, rollout_path, cwd, git_branch, title, …) ~/.codex/sessions/2026/11/04/rollout-2026-11-04T10-00-00-.jsonl $ claude --resume c5e1a7b2-9d40-4f3e-8b16-2a7c0e9d4f58 $ codex resume 019a2f1c-7d0e-7b31-9c4e-5a1f0e2d8b63 Hanya itu kontrak antara CLI dan sebuah session picker. Claude Code dan Codex masing-masing menyimpan sesinya sebagai file biasa di folder home kamu, dan masing-masing menerima sebuah id untuk melanjutkan satu sesi. Layar External agents di aplikasi desktop osFoundry adalah pembaca yang berjalan di atas file-file itu (Rust, runtime/session_inventory.rs dan runtime/external_sessions.rs). Layar ini menampilkan sesi dari dua belas aplikasi, mencocokkan pencarian dengan judul, folder, branch, aplikasi, dan id, lalu menjalankan perintah resume yang tepat di terminal. Di bawah ini bagian Claude Code dan Codex dari fitur itu, dibuat ulang sebagai skrip Python 150 baris dan dijalankan pada folder sesi asli di Mac tempat tulisan ini dibuat. Tidak ada isi transkrip yang ditampilkan di mana pun dalam tulisan ini. Setiap angka adalah jumlah, ukuran, atau waktu. Seperti apa satu sesi Claude Code di disk? Satu file JSONL per sesi, dinamai dengan id sesi, di dalam folder yang dinamai sesuai direktori kerja. Nama foldernya adalah path absolut dengan setiap karakter yang bukan huruf atau angka diganti -: re.sub(r"[^A-Za-z0-9]", "-", cwd) # /Users/alex/code/shop-api -> -Users-alex-code-shop-api Dicek terhadap 40 transkrip di mesin ini: 40 dari 40 folder sesuai aturan itu. Aturannya lossy (my.app dan my-app bentrok, begitu juga / dan .), jadi jangan pernah men-decode nama folder. Baca cwd dari record-nya. Sub-agent (Explore dan kawan-kawan dari tool Task) menulis transkripnya sendiri di /subagents/agent-.jsonl. Di sini ada 129. Itu bukan sesi yang akan di-resume orang, dan osFoundry melewati setiap file yang stem-nya diawali agent-. Setiap baris adalah satu record dengan sebuah type. Menghitung type di 400 baris pertama dari masing-masing 40 file: type record key yang penting untuk index assistant 4,060 requestedModel, effort, gitBranch, message.model attachment 3,197 cwd, gitBranch user 2,469 cwd, gitBranch, permissionMode, isSidechain, message.content, entrypoint custom-title 922 customTitle agent-name 827 agentName system, mode, queue-operation, file-history-, api-request, … 2,000+ tidak diperlukan Record percakapan (user, assistant, attachment, system) semuanya membawa sessionId, cwd, gitBranch, timestamp, dan version. message.content bisa berupa string atau list of blocks; di baris-baris itu tipe block-nya adalah tool_result 2,261, tool_use 2,223, thinking 1,224, dan text 754. Judul berasal dari record custom-title atau, pada build yang menulisnya, record ai-title dengan aiTitle. Di sini semua file punya custom-title dan tidak ada yang punya ai-title, jadi baca keduanya. Kenapa tidak parse semua file saja? Karena ukurannya besar. Ke-40 transkrip level atas di sini totalnya 19.4 GB. Median file-nya 168 MB, yang terbesar 2.07 GB, dan persentil ke-90 1.94 GB. Men-stream file median lewat json.loads baris per baris butuh 0.61 s (11,558 baris, sekitar 279 MB/s di Mac Apple Silicon, dengan page cache yang sudah hangat). Dengan kecepatan itu, parse penuh untuk semua 40 file akan makan sekitar 70 s, bahkan sebelum ada yang ditampilkan. Data yang dibutuhkan sebuah daftar ada di kedua ujung file. Diukur pada semua 40 file: record pertama yang punya cwd paling lambat ada di baris 2 (median 2) gitBranch pertama dan record user pertama: paling lambat baris 2 record judul ada di dalam 512 KiB terakhir pada 40 dari 40 file tidak ada baris di 80 baris pertama yang lebih dari 256 KiB Jadi index membaca 80 baris pertama dan 512 KiB terakhir. Itu juga yang dilakukan osFoundry: HEAD_LINES = 80 dengan batas 256 KiB per baris di session_inventory.rs, dan SETTINGS_TAIL = 512 * 1024 di external_sessions.rs, yang dibaca untuk model, effort, mode approval, dan branch terbaru. Membaca head dan tail dari semua 40 file butuh 86 ms. HEAD_LINES, LINE_CAP, TAIL_BYTES = 80, 256 * 1024, 512 * 1024 def head(p, n=HEAD_LINES): out = [] with open(p, "rb") as f: for _ in range(n): line = f.readline(LINE_CAP + 1) if not line: break if len(line) > LINE_CAP: # a pasted file or image: skip the rest of it while line and not line.endswith(b"\n"): line = f.readline(1 nbytes else lines # first piece is a cut line readline yang dibatasi itu penting. Satu giliran user yang berisi gambar yang di-paste adalah satu baris berukuran beberapa megabyte, dan for line in f biasa akan menarik semuanya ke memori hanya untuk dibuang. Field apa saja yang benar-benar dibutuhkan picker? Lima, ditambah waktu: aplikasi, id, folder, branch, judul. Head memberikan cwd, gitBranch pertama, dan judul cadangan dari pesan user asli yang pertama (bukan sidechain, dan bukan yang diawali

This is a summary aggregated from Dev.to. Read the complete article on the original site:

Read full article at Dev.to

More AI & Machine Learning News