Gönderildi, teslim edildi demek değil

Switchyard, her gün kullandığım dört kodlama ajanı için yerel bir panel. Oturumlarını tek arşivde tutuyor, canlı gösteriyor, zamanlanmış görevlerini listeliyor ve bir hesap kullanım limitine takılınca konuşmayı başka bir hesaba taşıyor. Açık kaynak, MIT lisanslı ve 127.0.0.1 dışına çıkmıyor.

  • 8araç: 4'ü arşivleniyor, 4'ü salt okunur listeleniyor
  • 693oturum, tek gerçek içe aktarmada, hatasız
  • 80test, 17 dosyada
  • ~19.8ksatır, yaklaşık 15.3k TypeScript
  • 0telemetri ya da dış çağrı

Bir devrin yerine ulaşması

Limiti dolan bir Claude hesabındaki iki sohbet, yeni bir hesaba taşınmış. Her biri ancak yeni sohbetin kendi kaydında bir cevap görününce sayılıyor.

switchyard · demo modu · 127.0.0.1Etkileşimli
Demo modunda Switchyard toplu devir ekranı: yeni bir Claude hesabına teslim edilmiş iki konuşmalık paket, ikisi de Reply observed ve Title verified, 2/2 doğrulandı
Demo modundaki gerçek Switchyard arayüzü. Hesaplar, projeler ve sohbetler sentetik (demo-a@example.com, acme-web). Bu sayfada hiçbir ajan çağrılmıyor.

Teslim, cevap gelince olur

Bir devir ancak yeni sohbet cevap verince sayılıyor. Prompt'u yapıştırmak kanıt değil, gönder tuşuna basmak da değil.

Bir hesap limitine takılınca Switchyard takılan sohbeti paketliyor ve yeni bir Claude Desktop hesabında yeniden açıyor. En kolay sinyal "gönderildi". Ama tam da can yakan durumlarda başarı bildiriyor: yeni hesabın da limiti dolmuş, uygulama cevap yerine bir hata kartı göstermiş ya da mesaj yanlış proje klasörüne düşmüş.

Bu yüzden paketteki her öğe benzersiz bir işaret taşıyor. Kontrolcü aracın diskteki kendi oturum kaydını okuyor, önce işareti, sonra onun ardından gelen gerçek bir asistan cevabını bekliyor: tamamlanmış bir tur, API hatası değil, sentetik bir mesaj değil. Çalışma dizini eşleşmeli, sohbet başlığı da birebir geri okunmalı. Öğe ancak o zaman reply-observed durumuna geçiyor.

function deliveryEvidence(records, marker) {
  let sent = null, reply = null, error = null;
  for (const record of records) {
    const text = textOf(record);
    if (record.type === 'user' && text.includes(marker)) sent = record;
    if (!sent || record.type !== 'assistant') continue;
    if (record.timestamp < sent.timestamp) continue;
    if (record.isApiErrorMessage || record.message?.model === '<synthetic>') {
      error = text;
    } else if (text.trim() && record.message?.stop_reason === 'end_turn') {
      reply = record;
      error = null;
    }
  }
  return { sent, reply, error };
}

İşin öbür yarısı, kontrolcünün emin olmadığı an. Yardımcı program, prompt belki girmişken zaman aşımına uğrarsa öğe uncertain oluyor ve belirsiz bir öğe asla otomatik olarak yeniden gönderilmiyor. Yeni hesapta aynı sohbetin ikinci kopyası, durmuş bir partiden daha kötü. O yüzden parti duruyor ve beni bekliyor.

Zamanlanmış görevler ekranı da aynı kuralı kullanıyor. Her Claude koşumu, kendi transkriptindeki son gerçek cevapla eşleştiriliyor. Başarılı görünüp hiç cevap bırakmayan bir koşum, hiçbir şey yapmamış olabilecek bir koşum olarak görünüyor.

Ne yapıyor

Arşiv
Codex, Claude Code, OpenCode ve Antigravity oturumlarını, araç güncellemelerinden ve temizliklerinden etkilenmeyen tek bir SQLite dosyasına alıyor. VS Code, VS Code Insiders, Cursor ve Kiro sohbetleri salt okunur listeleniyor.
Canlı
Dosya izleme üzerinden server-sent events, araçlar yazdıkça yeni mesajları gösteriyor. Cevap kutusu, yerel oturumu aracın kendi CLI'ı ile sürdürüyor.
Zamanlama
Codex otomasyonları, Claude Desktop zamanlanmış görevleri ve Antigravity zamanlamaları tek listede; koşum geçmişi her transkriptle karşılaştırılıyor.
Paket
Markdown özet (turlar, dokunulan dosyalar, açık işler, git durumu), maskelenmiş transkript, bayt bayt aynı yerel oturum dosyası ve projenin talimat dosyaları. Her dosyanın SHA-256 özeti alınıyor ve dosyalar atomik yazılıyor.
Teslim
Windows'ta yeni bir Claude Desktop hesabına, global bir arayüz kilidi ve paket başına bir kilit arkasında. Hedef hesap, yerel Desktop metadata'sından okunuyor ve kaynaktan farklı olmak zorunda. Uygulamayı küçük bir UI Automation yardımcısı sürüyor.
Hesaplar
Hesap taşıma, Claude Desktop zamanlanmış görevlerini yeni hesaba kopyalıyor. Skill'ler makinedeki her Claude hesabına eşitleniyor.

Kendiniz çalıştırın

Gereken
Node.js 22.13 ya da üstü (yerleşik node:sqlite kullanıyor), npm ve Git.
Demo
npm ci, ardından npm run demo, sonra http://127.0.0.1:3011 adresini açın. Sentetik bir ev klasörü üretiyor, gerçek hiçbir şey okumuyor.
Gerçek mod
npm run build ve npm start. Yerel dosyalar salt okunur açılıyor. Onlara yalnızca bir düğme bunu açıkça söylediğinde yazıyor ve önce yedek alıyor.
Yığın
127.0.0.1 üzerinde Next.js 15 ve React 19, 53 React bileşeni, 21 API rotası, telemetri yok.
Yapım
Benim yönetimimde Claude Code ve Codex ile yazıldı. Mimari, kararlar, inceleme ve doğrulama bendeydi.

Sınırlar

  1. Desktop teslimi yalnızca Windows'ta ve Claude Desktop ile çalışıyor. macOS'ta arşiv, paketler ve anlık görüntüler çalışıyor; arayüz üzerinden teslim kapalı.
  2. Codex alıcı taraf olduğunda yalnızca yazılı talimat alıyor. Switchyard Codex arayüzünü sürmüyor.
  3. Kontrolcü başka bir uygulamanın arayüzünü sürüyor. Pencere yapısını değiştiren bir güncelleme, yardımcı düzeltilene kadar onu bozabilir; o zaman tahmin etmek yerine duruyor.
  4. Windows kontrolcüsü, gerçek bir yeni hesapta yapılan tek bir pilotla ve sahte adaptörlü testlerle doğrulandı; birçok hesapta uzun bir koşumla değil.
  5. Devir, model durumu değil; bir özet ve kanıt. Gizli akıl yürütme, çalışan süreçler ve yalnızca uzakta duran geçmiş taşınmıyor.
  6. Araçların kendi disk formatlarını okuyor ve bu formatlar haber vermeden değişiyor. Ayrıştırıcılar sürümlü; format değişince yeniden içe aktarıyor.

Çözmeye değer bir problemin mi var?Birlikte çözelim

Konuşmaya başla

Full-stack ve uygulamalı AI rollerine açığım, uzaktan veya hibrit.

Rolü, ekibi ve problemi anlat.