13/Documentation
Güvenlik: çalıştırmadan önce okuyun
Bir Collie'nin dışa açtıkları, savunmalar ve bir cihazı eşleme, her istek için kimlik bilgisi
Collie, tasarımı gereği makinenize uzaktan kabuk erişimi sağlar. Tek bir Collie API çağrısı, doğrudan canlı bir terminal paneline rastgele tuş vuruşları gönderir. Eşleştirdiğiniz herhangi bir cihaz her paneli okuyabilir (kaynak kodu, gizli anahtarlar, ortam değişkenleri, aracı çıktısı) ve kullanıcınız olarak komutlar çalıştırabilir. 1.18.0 sürümünden bu yana, okumalar da dahil olmak üzere her API isteği eşleştirilmiş bir cihazın belirtecine ihtiyaç duyar; dolayısıyla giriş kapısı eşleştirmenin kendisidir: URL'ye erişebilen ve geçerli bir eşleştirme koduna sahip olan herkes aynı erişimi elde eder. 1.18.0 sürümünden önce, URL'ye erişebilen herkes her paneli okuyabiliyordu.
Komutları filtrelemek aracın amacını geçersiz kılacağı için korumalı alan (sandbox) ve komut izin listesi yoktur. Eşleştirilmiş her cihaza bir root girişi, eşleştirme koduna ise bir parola gibi yaklaşın. Kaybolan bir cihazın yetkisini hemen collie devices revoke <label> ile iptal edin. Eşleştirme riski azaltır ancak tamamen ortadan kaldırmaz; bu nedenle URL'yi herkese açık internette değil, tailnet gibi özel bir ağda tutun.
Bir aygıtı eşleyin: yazma kimlik bilgisi
1.18.0 sürümünden bu yana bu, yalnızca yazmalar için değil, okumalar dahil her istek için geçerli kimlik bilgisidir.
# on the host — prints an 8-character code and a QR code, good for 10 minutes
bin/collie pairEşleme her zaman açıktır ve yazmaların yanı sıra okumalar da eşleme belirtecine ihtiyaç duyar. Bir cihaz eşlenene kadar Collie her telefona ve tarayıcıya 403 device not paired ile yanıt verir. Collie'yi telefonda açmadan önce ilk olarak ana makinede collie pair çalıştırın.
Telefonda Collie uygulamasını açın, Ayarlar → Eşlenmiş aygıtlar yoluna gidin ve aygıt için bir etiketle birlikte kodu girin ya da doğrudan bu ekranı kod doldurulmuş halde açmak için komut tarafından yazdırılan QR kodunu tarayın. Telefon, dönen belirteci saklar. Collie yalnızca özeti tutar ve belirteç bir kez görüntülenir. İşlemi yeniden başlatmanız gerekmez; çalışan arka plan programı eşlemeleri ve iptalleri bir sonraki istekte uygular.
İki aygıt denetimi farklı soruları yanıtlar; herhangi birini, ikisini birden veya hiçbirini çalıştırabilirsiniz:
| sorar | güvenir | iptal yöntemi | |
|---|---|---|---|
COLLIE_DEVICE_HEADER | bu aygıt operatörün listesinde mi? | vekil sunucunuza, arındırdığı bir adı eklemesi için | COLLIE_DEVICE_ALLOWLIST dosyasını düzenleyip yeniden başlatarak |
| eşleme | bu aygıt düzenlediğim bir kimlik bilgisini taşıyor mu? | ağdaki hiçbir şeye | collie devices revoke <label>: anında |
Eşleme ek bir altyapı gerektirmez. Üstbilgi ekleyecek bir vekil sunucunun bulunmadığı doğrudan bir tailscale serve kurulumuna uygundur.
Eşleştirme, okumalar dahil her /api rotasını sınırlar. Yalnızca iki rota açık kalır: Bir izleyicinin veya yük dengeleyicinin sorguladığı /api/health ve bir cihazın belirteç almadan önce ihtiyaç duyduğu /api/pair. /api/health derlemeyi, crew modunu ve son yedi günün üç sayacını (giriş kutusunun ne sıklıkla boş okunduğu, ne sıklıkla okunamadığı ve bir kişinin Collie'nin okuyamadığı bir ekranı atlayarak ne sıklıkla elle gönderim yaptığı) yanıtlar. Sayımlar hiçbir bölmeyi, metni veya kişiyi adlandırmaz.
Cihaz üstbilgisi yazma işlemlerini ve iki okuma işlemini denetler: bir çalışma alanının klasörü altındaki her dosyayı gösterebilen Files görünümü ve ev dizini altındaki klasör adlarını listeleyen Yeni sayfasının Gözat özelliği (ADR 0086).
bin/collie devices list # what holds a credential, and when each was last seen
bin/collie devices revoke old-phone # effective immediately, no restartYeni bir kurulumda eşleştirilmiş cihaz bulunmaz; bu nedenle siz collie pair komutunu çalıştırana kadar Collie hiçbir telefona yanıt vermez. Son cihazın yetkisini kaldırmak Collie'yi tekrar açmaz: ardından her cihaz device not paired alır. Kurtarmak için ana makinede collie pair çalıştırın ve telefonu tekrar eşleştirin. Hiçbir cihaz eşleştirilmemişken collie doctor uyarı verir.
Not. Crew bağlantısı ve standby kapısı kendi kimlik bilgilerini saklar. Bir lead, bir okuma isteğini sabitlenmiş karşılıklı TLS ve crew parolası üzerinden üyeye iletir; bu sayede bir üyenin kendine ait eşleştirilmiş bir cihaza ihtiyacı olmaz (crew).
Beş başarısız kod denemesi kodu geçersiz kılar; bu da collie pair komutunun tekrar çalıştırılmasını gerektirir. Buna ek olarak bridge, kaynak adres başına dakikada ondan fazla eşleştirme denemesini 429 ve Retry-After: 60 ile reddeder. Aynı makinedeki bir ön kapının arkasında, kaynak adres son X-Forwarded-For girdisidir; yani ön kapının eklediği girdidir. Başka herhangi bir uçtan gelen bu üstbilgi yoksayılır. Sayaçlar bellekte tutulur ve bridge yeniden başladığında sıfırlanır.
CLI'nin kendi okumaları
Bridge, her başlangıçta durum klasöründeki local-secret dosyasına yeni ve rastgele bir parola yazar. collie doctor ve collie crew update, aynı makinedeki kendi bridge'lerini okumak için bu parolayı gönderir. Dosya yalnızca sahibine özeldir; bu nedenle yalnızca sizin hesabınız okuyabilir ve temiz bir durdurma işlemi dosyayı siler. Bridge bu parolayı yalnızca okumalar için kabul eder; yazma veya Dosyalar görünümü için ve başka bir makineden kesinlikle kabul etmez. Parolayı yalnızca loopback üzerinden kabul eder ve X-Forwarded-For gibi bir proxy üstbilgisi taşıyan isteklerde asla kabul etmez. COLLIE_HOST değerini tailnet adresine bağlayan bir crew üyesinin loopback üzerinde hiçbir şeyi yoktur; bu nedenle bridge orada parolayı bu makinenin kendi adreslerinden de kabul eder. Aynı makinedeki socat veya ssh -L gibi düz bir TCP aktarıcısı parolayı iletmeye devam edebilir. Parolayı size özel kılan bu dosyadır; bu yüzden durum klasörünü yalnızca sahibine özel tutun.
Bir cihaza son kullanma süresi verme
Eşleştirilmiş bir cihaz, siz yetkisini kaldırana kadar belirtecini korur. Bunu sınırlandırmak için eşleştirme sırasında bir kullanım ömrü belirtin:
bin/collie pair --expires 30d # also 12h, 2w; at most 3650d
bin/collie devices set-expiry pixel 90d # a new lifetime, counted from now
bin/collie devices clear-expiry pixel # no expiry againKullanım ömrü, telefonun kodu talep ettiği andan itibaren sayılır. --expires olmadan bir belirtecin süresi tıpkı eskisi gibi hiçbir zaman dolmaz ve mevcut hiçbir belirteç değişmez. Süre dolduktan sonra bridge, belirteci device not paired yerine device expired ile reddeder. Ardından telefon eşleştirmenin bıraktıklarını temizler ve Ayarlar'da Tekrar eşleştirin gösterir; bu nedenle yeni bir kod için collie pair çalıştırın. collie devices list ve Ayarlar ekranı her cihazın son kullanma süresini gösterir. Süresi dolmuş bir cihaz, siz yetkisini kaldırana veya set-expiry ile yeni bir süre verene kadar listede kalır. Cihazı tekrar eşleştirmek için aynı adı kullanabilirsiniz: yeni eşleştirme, süresi dolmuş girdinin yerini alır ve eski belirtecin yetkisini kaldırır; denetim günlüğü de bu yetki kaldırma işlemini kaydeder. Bir cihazın halen kullandığı ve süresi dolmamış bir belirtece sahip olan ad reddedilir. Bir crew deputy'nin standby kapısı da süresi dolmuş belirteci reddeder.
Birden çok örneğin çalıştığı bir ana makinede, komutların başına COLLIE_INSTANCE=<name> ekleyin ve telefonda ilgili örneğin URL'sini açın (Tek bir konakta birden fazla Collie örneği).
Eşleştirmeyi kaldırmanın telefonda temizledikleri
Bir eşleştirme sona erdiğinde telefon, Collie'nin bu eşleştirme altında sakladığı verileri siler. Bu durum, Ayarlar'dan telefonun eşleştirmesini kaldırdığınızda ve bridge belirtecini device not paired veya device expired ile reddettiğinde gerçekleşir.
Telefon; jetonu, gönderilmemiş her taslağı, kaydedilen bölme metnini ve herd yapısını, anlık bildirim aboneliğini, "İstem yok" onaylarını ve uygulama kabuğu dışındaki Collie önbelleklerini siler. Ayarlarınız kalır: tema, dil, sabitlemeler ve diğer tercihler hiçbir oturum metni tutmaz. Ayarlar, herhangi bir cihazı iptal etmeden önce onaylamanızı ister.
Yalnızca telefonun kendi temizliği yapılır. Bridge hiçbir Clear-Site-Data üstbilgisi göndermez; çünkü bu üstbilgi ayarlarınızı ve çevrimdışı uygulamayı da temizler ve paylaşılan bir ana makine adında oradaki diğer uygulamalara da ulaşırdı.
Bridge, eşleştirilmiş cihazlar listesini okuyamazsa (örneğin yarım yazılmış bir dosya), bunun yerine 503 pairing unavailable yanıtını verir. Bu durumda telefon belirtecini ve sakladığı her şeyi korur ve tekrar dener.
Telefonun sakladıkları
Telefon, son gördüklerinin küçük ve sınırlandırılmış bir kopyasını saklar; böylece bridge erişilemez durumdayken soğuk başlatma bunu gösterebilir. Aşağıdaki her ögenin bir boyut sınırı ve kullanım ömrü vardır.
| Öğe | Konum | Süre | Eşleştirmeyi kaldırma sırasında |
|---|---|---|---|
| Eşleştirme belirteci | localStorage | eşleştirmeyi kaldırmaya, yetki iptaline veya süre bitimine kadar | silinir |
| Ayarlar: tema, dil, sabitlemeler | localStorage | siz değiştirene kadar | korunur |
| Gönderilmemiş taslaklar | localStorage | 48 saat | silinir |
| Anında iletme uç noktası | localStorage | değişene kadar | silinir |
| Uygulama kabuğu | Cache Storage | bir sonraki sürüme kadar | korunur |
| Yazı tipleri ve anlık bildirim başlıkları | Cache Storage | değiştirilene kadar | silinir |
| Whistle konuşma modeli ve motor dosyaları (yalnızca bunları kopyalamayı seçtiyseniz) | Cache Storage | siz kaldırana kadar | silinir |
| Herd ve bölme metni, son görüldüğü haliyle | IndexedDB collie-store | 24 saat | silinir |
| Her bölmenin en yeni Chat sıraları | IndexedDB collie-store | 1 gün veya "Sohbeti bu telefonda tut" ayarı | silinir |
Son iki satır cihazdaki depolama alanıdır. Yalnızca köprünün zaten maskelenmiş yaptığı metni tutar; bölme başına en fazla 256 KiB ve toplamda 10 MiB yer kaplar, ayrıca en eski kayıtları ilk önce siler. Bölme metni ve Chat sıralarının her biri, bir bölmenin 256 KiB'lık alanının yarısını alır; böylece biri diğerini asla dışarı atmaz. Chat sıraları, ham terminal ekranı olarak değil, Chat tarafından çizildiği şekliyle eksiksiz saklanır. "Sohbeti bu telefonda tut" ayarı Kapalı olduğunda hiçbirini tutmaz ve tutulanları siler. Bir bölme parola istediğinde telefon o bölmenin kayıtlarını siler. Depodaki hiçbir şey bir tuş veya yanıt gönderemez. Eşleşme kaldırıldığında yapılan silmeler Eşleştirmeyi kaldırmanın telefonda temizledikleri içindekilerdir.
Telefonun uygulama değiştiricisi de bir bölmeyi gösterebilir. Collie uygulamasından çıktığınızda telefon, son uygulamalar listesi için ekranın bir resmini saklar ve bu resim bölme metnini gösterebilir. Bir web uygulaması bunu engelleyemez: Android, sayfa arka plana geçtiğini algılamadan önce resmi çekmiştir (bir Pixel üzerinde test edildi, 2026-10-08); iOS tarafı da bir güvence vermez. Bu durum sizin için önemliyse telefonu birine vermeden önce kilitleyin veya Collie uygulamasını kapatın.
Risk modeli
Temel güvenlik sınırları ve riskler:
- Kullanıcı izinlerinizle çalışır. Collie;
~/.ssh,git push --force,rm -rfvesudodahil olmak üzere tüm erişim haklarınızı devralır. - Kimlik doğrulama insanları değil, cihazları tanımlar. Tailscale, donanımı tutan kullanıcıyı değil, doğrudan donanım uç noktasını doğrular. Parolalar veya kullanıcı oturumları yoktur; kilidi açılmış veya çalınmış bir telefon açık bir kabuk sunar. Eşleme, erişimi cihazdaki bir kimlik bilgisine bağlar (yukarıda); bu nedenle kaybolan bir telefonun yetkisini derhal iptal edin. Yerleşik boşta kalma kilidi yalnızca gözetimsiz bir ekranı karartır ve gerçek bir güvenlik sınırı sağlamaz (ADR 0007).
- Tüm yerel sistem kullanıcıları bağlantı noktasına erişebilir. Standart terminal çoğullayıcı soketleri (
tmux,zellij,herdr), diğer yerel kullanıcıların erişimini kısıtlamak için dosya sistemi izinlerini kullanır. Collie, kendisini her yerel UID'ye açık hale getiren yerel bir TCP bağlantı noktasını dinler. Okuma işlemleri eşleme belirtecini gerektirir; bu nedenle belirteci olmayan başka bir yerel kullanıcı/api/healthharicinde hiçbir şey okuyamaz. Sınır belirteçtir: Tarayıcı profilinizi okuyabilen yerel bir kullanıcı belirteci de okuyabilir (ARCHITECTURE.md §6). - Tutulan bir izin, bir kişinin dokunmasını bekler.
collie hooks install claude --hold-permissionsile Claude'un izin kancası köprüye bir soket dosyası aracılığıyla sorar. Yalnızca kullanıcınız bunu açabilir (0700 klasöründe 0600 modu). Kanca bağlanmadan önce soket sahibini, klasörü ve üstündeki durum dizinini denetler. Köprü yalnızca bir bölmeye yerleştirdiği bir süreç için yanıt verir. Asla tek başına yanıt vermez. Bir dokunma kartın gösterdiği şeyin karmasını taşımalıdır. Bir ekran kartı diyalogu ekranda olmayan bir isteği asla yanıtlamaz (Telefon için bekletilen izinler). - Files görünümü dosyaları diskinizden okur. Bir çalışma alanının klasörü altındaki herhangi bir dosyayı gösterir;
.gitklasörü, Collie'nin kendi durum ve yapılandırma klasörleri ile bir Collie durum sırrı gibi adlandırılmış dosyalar hariçtir. Bu nedenle, yazma işleminde olduğu gibi yetkilendirilmiş bir cihaz ister (ADR 0083). - Yeni sayfasının Gözat özelliği ev dizininizin altındaki klasör adlarını listeler. Yalnızca adlar, Files görünümünün sınırlarıyla: yazılmadığı sürece nokta ile başlayan klasörler yok,
.gityok, Collie durum veya yapılandırma klasörü yok, ev dizini dışına bağlantı yok, en fazla 200 satır. Ayrıca yetkilendirilmiş bir cihaza ihtiyaç duyar (Sık kullanılan ve son dizinler). - Eşlenen her cihaz, çalışma alanı klasörünün altındaki dosyaları okuyabilir. Buna
.envdosyaları dahildir. Yalnızca kabuğun kendisine emanet edecek kadar güvendiğiniz cihazları eşleyin. - Bir çalışma alanı klasörünün altındaki kimlik bilgisi dosyaları okunabilir.
~/.claude,~/.codex,~/.config/ghveya~/.sshiçinde açılan bir çalışma alanı orada ne varsa gösterir. Yapılandırma klasörü çalışma alanının altında bulunan ikinci bir Collie uygulamasının.envalanı da bunu yapar. Klasörün içinden dışındaki bir dosyaya verilen bir sabit bağlantı (hard link) da yakalanmaz. - Eşleştirilmiş bir cihaz başlatıcılar ekleyebilir. Varsayılan
[phone] adds = trueile, bir telefon bir tariften oluşturulmuş bir satır ekleyebilir: bir aracı ve bayraklarını köprünün kendi tablosundan seçtiği seçenek çipleri. Elle yazılan bir satır, varsayılan olarak kapalı olanfree_text = trueayarını gerektirir. Bir tarif yine de izin istemlerini atlayabilir. Böyle bir satır bir "İstem yok" rozeti taşır ve her cihaz bunu bir kez onaylar. Bir cihazın yetkisini kaldırmak, eklediği satırları kaldırır. Telefon tarafından eklenen her satırı kapatmak içinadds = falsedeğerini ayarlayın (Kendi başlatıcılarınız, ADR 0094). - Eşleştirilmiş bir cihaz tek seferlik bir komut çalıştırabilir. Varsayılan
[phone] run = trueile, bir telefon bir makinedeki yeni bir kabuğa kendi yazdığı bir satırı girebilir. Bu yeni bir yetki kazandırmaz, çünkü eşleştirilmiş bir telefon zaten bir kabuk açıp içine yazabilir. Satır, serbest satır karakter kuralına uyar ve köprü, eşleştirilmiş bir cihaz olmadığında bunu reddeder. Başlatılan her komut, en fazla 12 adet olmak üzere durum klasöründekicommands-recent.jsoniçinde tutulur (kip 0600). Gizli bir bilgi taşıyor gibi görünen bir satır (TOKEN=…gibi bir atama, parolalı bir URL veyatokenya dapasswordgibi bir sözcük) çalışır ancak tutulmaz. Bu denetim bir tahmindir, bu nedenle bir gizli bilgi yine de listeye sızabilir; denetim günlüğü bir satırın yalnızca ilk sözcüğünü ve uzunluğunu kaydeder. Bir cihazın eşleştirmesini kaldırmak veya yetkisini iptal etmek listeyi olduğu gibi bırakır, çünkü bir satırı yeniden çalıştırmak eşleştirilmiş bir cihaz gerektirir. Kısayolu kaldırmak içinrun = falsedeğerini ayarlayın (Tek seferlik komutlar, ADR 0095). - Her makine, Collie aracılığıyla gönderdiğiniz kabuk satırlarını tutar. Sent, bir kabuk bölmesine gönderdiğiniz bir satırı ve tek seferlik her komutu durum klasöründeki
sent.jsonliçinde saklar (0600 modu). Eşleştirilmiş bir cihaz, bölmeleri okuyabildiği gibi bunu da okuyabilir. Bazı sırlar yine de saklanır (Sent: gönderdiğiniz kabuk satırları). - Tek bir örnek tüm Herdr oturumlarını sunar. Varsayılan olarak tek bir Collie süreci, sanal alan oturumları dahil olmak üzere Herdr yapılandırma kökü altında bulunan her Herdr oturumuna öncülük eder (Çoklu oturum).
- Yazma işlemleri
<state-dir>/audit.logkonumuna kaydedilir,COLLIE_STATE_DIRtaşımadığı sürece~/.local/state/collie/audit.logyolundadır. Sunucu tüm gelen tuş vuruşlarını, yanıtları, dosya yüklemelerini ve bölme/sekme yaşam döngüsü olaylarını günlüğe kaydeder. Denetim günlüğünün erişim denetimi yerine olay sonrasında görünürlük sağladığını unutmayın. Type modunda gönderilen karakterler hiçbir zaman günlüğe yazılmaz:COLLIE_AUDIT_CONTENT=noneher birini sansürler ve varsayılan önizleme yalnızca•işaretlerinin sayısını kaydeder. Enter ve Ctrl+C gibi adlandırılmış tuşlar okunabilir kalır (ARCHITECTURE.md §6). Bir durable agent'ın yanıtları, gönderimleri, durdurmaları, düğme dokunmaları, başlatmaları, yeniden açmaları ve yeniden adlandırmaları da kaydedilir (Neler günlüğe kaydedilir). - Yanıt üstbilgileri. Her yanıt
X-Content-Type-Options: nosniff,Referrer-Policy: no-referrervePermissions-Policy: camera=(), geolocation=(), microphone=(self), payment=(), usb=()taşır. Mikrofon, eller serbest konuşma ayarı için izinli kalır. Uygulama kabuğundaki Content-Security-Policy şunları içerir:object-src 'none',form-action 'self'veframe-ancestors 'none'.Strict-Transport-Security, yalnızca bir istek HTTPS üzerinden geldiğinde gönderilir; bu ya bir TLS dinleyicisinde ya da proxy'nizden gelenX-Forwarded-Proto: httpsile olur. Collie genellikle üst etki alanını diğer hizmetlerle paylaştığından, yalnızca yanıt veren ana makine adını kapsar, alt etki alanlarını kapsamaz. Köprünün kendisitailscale servearkasında düz HTTP kullanır ve tarayıcı buradaki üstbilgiyi yoksayar./api/blobs/üzerinden sunulan resimler oturum içeriğidir; bu nedenleCache-Control: private, no-storetaşırlar ve telefonun kendi önbelleği dahil hiçbir önbellek bunları tutmaz. - Varsayılan savunma denetimleri. Collie yalnızca geri döngü (loopback) arabirimlerine bağlanır, trafiği yalnızca
tailscale serveveya eşdeğer bir ters proxy üzerinden yönlendirir ve katı CSP kuralları, aynı kök denetimleri ve host üstbilgisi doğrulaması uygular. Bölme çıktısıinnerHTMLyerine React metin düğümleri olarak işlenir. Aslatailscale funnelkullanmayın veya ham bir bağlantı noktasını dışa açmayın. Belirli donanımları yetkilendirmek için doğrudan eşleme kullanın veya proxy'niz cihaz kimlikleri ekliyorsa aşağıdaki ikiCOLLIE_DEVICE_*değişkenini kullanın.
| değişken | ne yapar |
|---|---|
COLLIE_ALLOW_NON_LOOPBACK_BIND=1 | Yalnızca geri döngüye bağlanma kuralını devre dışı bırakır; ayarlanmadığında köprü 0.0.0.0 adresine bağlanmayı reddeder. |
COLLIE_ALLOW_ANY_HOST=1 | Varsayılan olarak açık olan ve başarısızlık durumunda erişimi engelleyen host üstbilgisi doğrulamasını devre dışı bırakır. |
COLLIE_TRUSTED_USER | Tailscale-User-Login üstbilgisi eksik olan veya eşleşmeyen bir isteği reddeder. |
COLLIE_TRUSTED_USER_OPTIONAL=1 | Eksik bir Tailscale-User-Login üstbilgisine izin verir (etiketli düğümler bunu hiçbir zaman göndermez). |
COLLIE_ACCESS_TEAM + COLLIE_ACCESS_AUD | Yalnızca Cloudflare Tunnel. Bu Access uygulaması için Cf-Access-Jwt-Assertion doğrulanmadığı sürece tüm uzak istekleri reddeder. Yalnızca geri döngüdeki (loopback) yerel bir işlem, /api/health ve ekip bağlantıları bu adımı atlar; eşleştirme yine de geçerlidir. tailscale serve gibi diğer ön kapılar da reddedilir (Cloudflare Tunnel). |
COLLIE_DEVICE_HEADER | Vekil sunucunuzun bir aygıt kimliğiyle eklediği üstbilginin adı. |
COLLIE_DEVICE_ALLOWLIST | Yazma iznine sahip, virgülle ayrılmış aygıt kimlikleri; diğer tüm aygıtlar salt okunur kalır (docs/deployment.md). |
COLLIE_REDACT=off | Bölme metnindeki, farklardaki ve dosya metnindeki sır maskesini kapatır (aşağıda). Varsayılan olarak açıktır. |
COLLIE_SENT=off | Gönderdiğiniz kabuk satırlarının kaydını tutmaz (aşağıda). Varsayılan olarak açıktır. |
🚫 Collie iletailscale funnelseçeneğini asla kullanmayın. Funnel trafiği genel internete yönlendirir, oysatailscale serveerişimi özel tailnet ağınızla sınırlar. Collie uygulamasını Funnel üzerinden çalıştırmanın desteklenen bir kullanım senaryosu yoktur.
Tailscale ACL'leri ve COLLIE_TRUSTED_USER ile erişimi daha da sınırlandırın. Olduğu gibi, garanti verilmeksizin sağlanır.
Dayanıklı aracılar
Eklediğiniz bir durable agent, çalıştırdığınız veya dağıttığınız koddur ve Collie bunun metnini güvenilmeyen olarak değerlendirir. Özel bir soket diğer kullanıcıları dışarıda tutar ancak kendi kullanıcınızın bir sürecini tutmaz ve https üzerinden tek sınır bir belirteçtir. Aktarım başına güven kuralları, Collie'nin bir durable agent metnine ne uyguladığı ve denetim günlüğünün neleri sakladığı Dayanıklı bir aracının güvenliği içinde yer alır.
Konuşma motoru (Whistle)
Whistle üçüncü taraf kod çalıştırır: Cactus Compute kaynaklı bir WebAssembly motoru. Telefonda veya ana bilgisayarda bridge kullanıcısı olarak çalışır. Collie, bu kodun erişebileceği alanı sınırlar. Erişimi tamamen ortadan kaldıramaz.
- Pakete dahil edilmiş ve sabitlenmiş. Motor, yukarı akışın yayımladığı şekliyle bayt bayt korunan iki dosyadan (
needle.jsveneedle.wasm), yukarı akışın lisansından ve bir kaynak notundan (web/public/stt/needle-3-93e88ede/) oluşur. Bir test, her iki dosyanın sha256 özetini ve wasm'ın ana bilgisayardan isteyebileceği on altı işlevin listesini sabitler. Yeni bir içe aktarım durdurma nedenidir. Sabitlemeyi yalnızca bir insan günceller ve önce diff çıktısını okur. Modelin kendi sabitlenmiş özeti vardır ve Collie indirilen bir kopyayı yalnızca eşleştiğinde saklar. - Telefonda, kendi ilkesine sahip bir worker. wasm özel bir worker içinde çalışır. bridge,
stt/altındaki her betiği bu ilkeyle sunar ve başka hiçbir sayfa bu ilkeyi almaz:Content-Security-Policy: default-src 'none'; script-src 'self' 'wasm-unsafe-eval'; base-uri 'none'Worker'ın ağı, DOM'u ve başka bir yerden kod yükleme olanağı yoktur.
localStorageiçinde bulunan eşleme belirtecini okuyamaz ve worker'larınlocalStoragealanı yoktur. Başka bir işlem yapmadan önce küçük bir wasm modülü derler. Worker'a kendi ilkesini vermeyen bir tarayıcı bunu reddeder ve Bu telefon orada kullanılamıyor olarak görünür. - Sayfanın ilkesi değişmez. Belge ilkesi hiçbir zaman
'wasm-unsafe-eval'almaz veconnect-src 'self'korur. - Worker'ın hâlâ erişebildiği alanlar. Bu kaynağın hiçbir ilke direktifinin kapatmadığı IndexedDB ve Cache Storage alanlarını okuyabilir ve bunlara yazabilir.
collie-store, son bölme ve Chat metnini (Telefonun sakladıkları) tutar. Bu metin zaten maskelenmişti ancak okunabilirdir. Bu erişim kabul edilmiştir ve ADR içinde belirtilmiştir. Önem kazanmaya başlarsa bir sonraki adım worker çevresinde korumalı alan uygulanmış bir frame olacaktır. - Ana bilgisayarda, Collie'nin kendi ikili dosyasının bir alt süreci. Dikte başına kısa ömürlü bir alt süreç, Collie'nin yazdığı sabit bir bağımsız değişken listesiyle
_whistle-transcribeçalıştırır. Herhangi bir şeyi derlemeden önce motoru, wasm'ı ve modeli sabitlenen değerlerine göre doğrular. 60 saniyelik bir son süresi vardır, SIGKILL ile sonlandırılır, 256 KiB çıktı sınırına sahiptir ve aynı anda en fazla iki adet çalışır. bridge'inCOLLIE_*değişkenlerinin hiçbirini almaz. bridge yalnızca ikisini, durum klasörünü ve kurulum klasörünü, kendi çözümlediği yollara ayarlar. İstekten bağımsız değişken listesine kayıt dışında hiçbir şey ulaşmaz. - Bir kişinin dokunmasıyla yapılan ikinci giden çağrı. Güncelleme denetimi birincisidir. Model indirme ikincisidir: tek bir sabitlenmiş Hugging Face adresinden tek bir dosya, yalnızca özeti eşleştikten sonra yazılır. Telefon asla Hugging Face'e çağrı yapmaz. Modeli, eşleme belirteci ile birlikte ana bilgisayardan kopyalar. Yollar bir yazma cihazı gerektirir, yalnızca lead üzerinde çalışır, tek seferde bir indirmeye izin verir ve denetlenir.
- Settings üzerinden kurulum, "kurulum bir CLI eylemidir" kuralının bir istisnasıdır. Kimlik bilgisi depolayan veya bir komut adı belirten sağlayıcılar terminalde kalır. Whistle bunların hiçbirini yapmaz. Çalınan bir yazma belirteci terminallere zaten yazabilir ve bir güncelleme başlatabilir, bu nedenle kurulum dokunuşu ona yeni bir şey vermez.
- Settings üzerinden Codex'e geçiş diğer istisnadır. Bir yazma cihazı, ana bilgisayarı yalnızca Whistle, Codex ve Off arasında değiştirebilir, başka hiçbir şey yapamaz. Codex tam onay,
collie stt setuptarafından yazdırılan sözcüklerin aynısını ve Kabul ediyorum üzerine dokunulmasını gerektirir; bridge ardından CLI'ın kendi yoklamasını çalıştırır. Çalınan bir yazma belirteci, ana bilgisayarın konuşma özelliğini operatörün oturum açtığı ChatGPT hesabına yönlendirebilir. Bir anahtar veya komut ekleyemez ya da değiştiremez. Belirteç bir terminale zatencodexyazabilir. ADR 0097 bunu değerlendirir. Settings üzerinden yapılan bir değişiklik, eşlenen cihazın eşleme sırasında verilen adını ve zamanı dastt.jsoniçine yazar; böylece Ana bilgisayar konuşması en son kimin değiştirdiğini belirtebilir. Hiçbir belirteç ve adres yazılmaz.collie stt setupçalıştırması bu satırı kaldırır. - Eşlenen cihazlar, ana bilgisayarın konuşma ayarlarında belirtilenleri yalnızca ad olarak okuyabilir. Bu bir komutun adı, bir model dosyasının adı ve bir konuşma hizmetinin ana bilgisayar adıdır; asla bir yol, bağımsız değişken, anahtar veya URL yolu değildir.
Neden bu şekilde inşa edildi: ADR 0096. Kurulum adımları Ses girişi ve Web Push içindedir.
Telsiz
Walky talky, aracı oturumları arasında iletileri taşır; bu nedenle bu bölüm bir iletinin neyi kanıtlayıp neyi kanıtlamadığını belirtir. Komutlar Telsiz içindedir.
# in .env, then run `collie restart`
COLLIE_WALKY=offBu satır, bu makinenin bölmeleri için gelen tüm iletileri reddetmesini sağlar. Makinedeki CLI yine de gönderebilir.
- Bir ekip anahtarı, makineler arasında bir iletiyi imzalar. Bir üye, bir iletiyi ekip anahtarıyla imzalar. Lider, imzayı o üye için sabitlediği anahtara göre denetler, ardından iletiyi alan makine için kendi imzasını ekler. Tekil bir kurulumun ekip anahtarı yoktur. Hiçbir şeyi imzalamaz ve makine dışına hiçbir şey göndermez.
- Alıcı, liderin beyanı aracılığıyla göndericiyi denetler. Bir üye yalnızca liderini sabitler. Bu nedenle lider, göndericinin sertifikasını iletiyle birlikte gönderir ve bu sertifikanın ekibin o üyesine ait olduğuna dair kısa bir ifadeyi imzalar. Alıcı makine bu ifadeyi denetler, ardından göndericinin imzasını sertifikaya göre denetler. Herhangi bir denetim başarısız olursa iletiyi reddeder. Ekipte kimin olduğu konusunda lidere güvenmeye devam eder.
- Yalnızca lider bir sonucu geri yazabilir. Lider, bir üyeye o üyenin kendi iletilerinin sonuçlarını gönderir. Üye bunları yalnızca sabitlenmiş liderinden ve yalnızca gönderdiği ve hala günlüğe kaydettiği bir ileti için alır. Sonuçlar ve liderin aldıklarının kaydı bellekte kalır ve 10 dakika sonra silinir.
- Telefonun kartı günlüğe ihtiyaç duyar. Telefon, yalnızca köprünün kendi günlüğü o ileti kimliğini tuttuğunda bir ileti kartı çizer. Bir aracının yalnızca ekrana yazdırdığı bir üstbilgi, "bu makinede günlük kaydı yok" işaretiyle düz metin olarak kalır.
- Bir bölme belirteci sır değildir.
#k3f9gibi bir adresteki belirteç, bir iletinin kapatılmış bir bölmenin kimliğini alan yeni bir oturuma ulaşmasını engeller.collie walky whobunu her aracıya yazdırır ve<stateDir>/walky/instances.jsonkullanıcınız tarafından okunabilir. Kimin gönderdiği hakkında hiçbir şey kanıtlamaz. - Bir iletinin geçtiği her makine onu saklar. Göndericinin makinesi, lider ve alıcı makine iletiyi
<stateDir>/walky/içine kaydeder. Günlük 7 gün ve en fazla 2.000 satır saklar. Bir iletiye asla bir sır koymayın. - Bir aracının iletisi, bir eşin sözleridir. Bölme, göndericinin üstbilgisini içeren ve gövdesi olmayan tek bir satır alır. Aracı, gövdeyi bir koşumun yönergeniz olarak değil veri olarak ele aldığı
collie walky inbox <id>çıktısı olarak okur. Yüklü yetenek, aracıya bunu değerlendirmesini ve bir eş istedi diye asla yıkıcı bir komut çalıştırmamasını söyler.
Not. Bir aracı sizin kullanıcınız olarak çalışır; bu nedenle crew anahtarını okuyabilir ve yerel soketi açabilir. Bir iletiyi imzalayabilir veya kendisine ait olmayan bir bölmeyi sahiplenebilir. İmza, iletiyi makineler arasındaki yoldayken korur ve alıcıya iletiyi hangi makinenin gönderdiğini bildirir. Sizi, aynı makinede çalışan ve kendisi hakkında yalan söyleyen bir programdan korumaz.
Walky talky giden bir çağrı eklemez. Başka bir makineye giden ileti, halihazırda var olan crew bağlantısını kullanır; hiçbir model, bulut hizmeti veya üçüncü taraf bunu görmez.
Makineden ayrılan veriler maskelenir
Collie, bir telefona ulaşmadan önce bölme metnindeki ve dosya içeriğindeki bilinen sır biçimlerini maskeler.
# in your .env, only to turn the mask off; it is on by default
COLLIE_REDACT=offMaskeleme, köprü üzerinde beş yolda çalışır: terminal aynası, Chat ve History görünümleri, her anlık bildirim, Changes görünümündeki farklar ve Files görünümündeki dosya metni. Gizlediği kısımlar aynı genişlikte • işaretlerine dönüşür, böylece sütun ve satır sayıları korunur. Bir sağlayıcı öneki okunabilir kalır, böylece sk-o•••• neyin gizlendiğini size bildirmeye devam eder.
Yalnızca yüksek güvenilirlikli kalıplarla eşleşir:
| kalıp | maskelenen içeriğe örnek |
|---|---|
| önekli API anahtarları | sk-…, sk-ant-…, sk-or-v1-…, ghp_…, github_pat_…, xoxb-…, AKIA…, AIza…, glpat-…, npm_… |
| JWT'ler | üç base64url parçası; ilki eyJ ile başlar |
| PEM özel anahtarları | BEGIN … PRIVATE KEY ile ilgili END satırı arasındaki tüm satırlar |
| taşıyıcı belirteçleri (bearer tokens) | Bearer değerinden sonra gelen 20 karakter veya daha uzun belirteç |
| adlandırılmış değerler | password=, secret:, token=, api_key: ve benzerlerinden sonra gelen 8 karakter veya daha uzun değer |
Dikkat. Bu bir risk azaltma yöntemidir, kesin bir garanti değildir. Tek başına duran düz bir parola, yalın bir onaltılık (hex) veya base64 değeri ve listede olmayan bir öneke sahip anahtarlar bilerek atlanır. Bunları kapsayan bir kural, her ekrandaki sıradan metinleri ve kodları da maskelerdi.
Bazı sıradan metinler de maskelenir; örneğin token: something içeren bir düz metin veya YAML satırı. Yazıp gönderdiğiniz içerik hiçbir zaman maskelenmez ve denetim kaydı kendi kurallarını korur (COLLIE_AUDIT_CONTENT).
Bu anahtar yalnızca köprü üzerinde COLLIE_REDACT olarak bulunur. Ayarlar → Sistem altında "Secret masking" adıyla salt okunur gösterilir. Telefonda bilerek bir anahtar bulunmaz: Telefonda bir anahtar olması, eşleştirilmiş herhangi bir telefonun veya çalınan bir cihazın maskelemeyi kapatmasına izin verirdi. Maskelenmiş bir değeri okumak için makine üzerinden okuyun. Bir bölme ilk kez maskelenmiş metin gösterdiğinde, telefonda cihaz başına bir kez olmak üzere kısa bir bildirim satırı görüntülenir. Maskelenmiş metni bir yanıta yapıştırırsanız kutunun altındaki uyarı, bölmenin gizli bilgiyi değil noktaları alacağını belirtir.
Bir ekipte (crew) her üye kendi metnini maskeler ve lider, metin telefonunuza ulaşmadan önce metni tekrar maskeler. Lider; bir üyenin yansısını, Sohbet'ini, Geçmiş'ini, farklarını, dosya metnini ve bölme başlıklarını kendi kullandığı maskeyle maskeler; böylece hâlâ 1.17.x çalıştıran bir üye telefonunuza açık metin olarak anahtar gönderemez. Maskelenmiş metin tekrar maskelendiğinde olduğu gibi kalır. Metin telefonunuza yalnızca hem liderde hem de üyede COLLIE_REDACT=off ayarlandığında maskelenmemiş olarak ulaşır. İstisnai bir durum: 1.17.x sürümündeki bir üye kendi başına hiçbir şeyi maskelemez; bu nedenle yanıtın doğrulandığı satırlarda gizli bir bilgi bulunduğunda telefon bu yanıtı "The screen changed before that could be sent" diyerek reddedebilir. Yanıt bu durumda üye 1.18.0 çalıştırana kadar bekler.
Lider, maskelemek için üyenin yanıtını okuyamazsa yanıtı iletmez. Telefon bu okumayı, tıpkı erişemediği bir üyede yaptığı gibi, başarısız olarak gösterir.
Anlık bildirimler de bölmeyi yalnızca sizin verdiğiniz adla belirtir: bölmenin etiketi, Claude'un /rename adı veya tek bölmeli sekmenin adı. Bölmedeki bir programın belirlediği başlığı asla kullanmaz; çünkü herhangi bir program bu başlığı ayarlayabilir ve bir başlık yol, komut veya gizli bilgi içerebilir. Böyle bir adı olmayan bölme, örneğin claude gibi, kendi harness değeriyle anılır.
Sent: gönderdiğiniz kabuk satırları
Her makine, Collie aracılığıyla gönderdiğiniz kabuk satırlarının kaydını tutar; böylece bir satırı bulup yeniden gönderebilirsiniz.
# in your .env, to keep no record on this machine
COLLIE_SENT=off| soru | yanıt |
|---|---|
| Neler saklanır | Bir kabuk bölmesine gönderdiğiniz bir satır ve Yeni sayfasındaki her tek seferlik komut. Her satır için: metin, klasörü, zamanı ve ikisinden hangisi olduğu. |
| Neler asla saklanmaz | Bir aracıya verilen istemler, bir programa yönelik metinler, Tuşlar panosundaki tuşlar ve Yazma modu. |
| Konum | Durum klasöründeki sent.jsonl, COLLIE_STATE_DIR taşımadığı sürece ~/.local/state/collie/. Dosya 0600 modundadır ve 0700 modundaki bir klasörde yer alır. |
| Süre | Her makinede en fazla 5000 satır ve 365 günden eski olmayanlar. |
| Bunu kimler okuyabilir | Eşlenmiş bir cihaz okuyabilir; çünkü satırların gittiği bölmeleri okuma yetkisine sahiptir. |
| Bir crew içinde | Her makine kendi dosyasını tutar. Lider, telefonunuz sorduğunda üyelerine sorar ve hiçbir kopya saklamaz. |
Collie yazdığınız her satırı gönderir ve ardından onu saklayıp saklamayacağına karar verir. Aşağıdaki özellikleri taşıyan bir satır hakkında hiçbir şey saklamaz:
- bir boşluk veya sekme ile başlayan,
TOKEN=abc deployveyaexport AWS_SECRET_ACCESS_KEY=…gibi bir değişken tanımlayan,https://user:pass@hostgibi şifre içeren bir URL bulunduran,password,secret,token,bearerveyaauthorizationgibi bir sözcük bulunduran,- gizli anahtar maskesinin tanıdığı bir biçim bulunduran (örneğin bir
ghp_…veyask-…anahtarı), - 4096 karakterden uzun olan.
Böyle bir satır metniyle birlikte geride hiçbir satır, hiçbir sayaç ve hiçbir günlük satırı bırakmaz.
Bir satırı dışarıda tutmak için satıra bir boşlukla başlayın. Kabuk satırı her zamanki gibi çalıştırır ve Collie hiçbir şey saklamaz.
Dikkat. Bu denetim bir tahmindir. mysql -pPASS gibi düz bir bağımsız değişken olarak aktardığınız bir şifreyi ve biçimini tanımadığı herhangi bir gizli bilgiyi saklar. Böyle bir satıra bir boşlukla başlayın.Bir satırı unutmak için Gönderilenler sayfasındaki satırında Unut seçeneğini kullanın. Tüm bir makineyi unutmak için Gönderilenleri Temizle seçeneğini kullanın. İkisi de COLLIE_SENT=off ayarlanmışken çalışır. Denetim günlüğü, satırın kendisini değil, her unutma işlemini bir sayaçla kaydeder. Her satır, makineden ayrılmadan önce gizli anahtar maskesinden geçer.
Neden bu şekilde inşa edildi: ADR 0107.
Windows'ta gizli dosyalar
Windows'ta (deneysel), Collie gizli dosyalarını yalnızca hesabınıza, SYSTEM ve Administrators gruplarına özel tutar. "Hesabınız", Collie'yi çalıştıran Windows hesabıdır.
NTFS'te 0600 modu yoktur; bu nedenle Collie, durum klasörünün ve yapılandırma klasörünün erişim denetim listesini (ACL) kullanır. Collie'nin buraya yazdığı her dosya aynı listeyi alır. Kullanıcı profilinizdeki varsayılan klasörler diğer standart kullanıcılara zaten kapalıdır. Bu denetim en çok bir klasörü COLLIE_STATE_DIR veya başka bir ayarla taşıdığınızda önem taşır.
Başlangıçta köprü her iki klasörü ve bunların gizli dosyalarını denetler. Diğer hesaplar bunlardan birini okuyabiliyorsa köprü bunu onarır, ancak yalnızca Collie'nin kendi klasörlerinde. Önce eski listeyi durum klasöründeki acl-backups dosyasına kaydeder ve listeyi eski haline getiren icacls /restore komutunu yazdırır. Bu komutu yönetici olarak çalıştırılan bir terminalde çalıştırın. Başka dosyalar da içeren bir klasör yalnızca denetlenir, değiştirilmez: Collie çalıştırmanız için icacls komutunu yazdırır. collie version gibi diğer komutlar yalnızca denetler ve uyarır.
collie doctor, sonucu secrets-private olarak gösterir. Diğer hesapların okuyabildiği bir klasör, düzeltmesiyle birlikte bir hatadır. Collie'nin denetleyemediği bir klasör ise bir uyarıdır: cannot confirm.
| Durum | Ne olur |
|---|---|
Klasörü kopyalar, geri yükler veya eşitlerseniz (zip, /SEC olmadan robocopy, OneDrive, Dosya Geçmişi, bir USB sürücüsü) | Kopya, listeyi kaybedebilir. Collie bir sonraki başlangıçta yeniden denetler. |
| Antivirüs veya Denetimli klasör erişimi değişikliği engeller | Collie klasörü özel yapamadığını bildirir ve düzeltmeyi verir. |
| Klasör FAT, exFAT veya bir ağ paylaşımı üzerinde | Collie'nin kullanabileceği bir liste yoktur. Collie cannot confirm der. Durum klasörünü bu bilgisayardaki bir NTFS sürücüsüne taşıyın. |
COLLIE_NO_ACL_REPAIR=1 | Collie hiçbir listeyi değiştirmez. Yine de denetler ve uyarır; doctor ise raporlamaya devam eder. |
Not. Bu bir yöneticiden korunma sağlamaz. Yöneticiler dosyaları yine de okuyabilir. Ayrıca hesabınızla çalışan diğer programları, klasörün içindeki sabit bağlantıları, ~/.claude içindeki ajan yedeklerini veya OneDrive ya da Belgeler içindeki bir durum klasörünü kapsamaz.Makinenizden dışarı ne çıkar
Varsayılan olarak ve ilke gereği hiçbir şey. Collie hiçbir kurulum olayı, kullanım istatistiği, kilitlenme raporu veya analitik göndermez. Bunları etkinleştiren bir bayrak yoktur.
Kendiliğinden giden tek çağrı güncelleme denetimidir: sürümünüzü en yeni etiketle karşılaştıran, GitHub genel etiketler API'sine (bridge/update.ts) yönelik anonim bir HTTPS GET çağrısıdır. Sizin veya makineniz hakkında hiçbir veri taşımaz, yalnızca statik collie-update-check kullanıcı aracısını içerir.
Whistle model indirmesi diğer giden çağrıdır. Yalnızca bir kişi Host'a indir düğmesine dokunduğunda veya collie stt whistle komutunu çalıştırdığında gerçekleşir ve sizinle ilgili hiçbir veri göndermez (Konuşma motoru (Whistle)).
Walky talky giden bir çağrı eklemez. Başka bir makineye giden ileti, crew bağlantısını kullanır ve başka hiçbir yere gitmez (Telsiz).
Report a problem giden bir çağrı eklemez. Başarısız gönderimlerin ardından telefon, GitHub'ın yeni sorun formunu doldurulmuş olarak kendi tarayıcınızda bir bağlantı şeklinde açabilir. Önce metnin tamamını okur ve kendi hesabınız altında kendiniz gönderirsiniz. Collie hiçbir GitHub belirteci tutmaz ve telefon asla GitHub'ı aramaz (ADR 0123).
COLLIE_ACCESS_TEAM değerini ayarlarsanız Collie, başlangıçta ve saatte bir söz konusu Cloudflare Access ekibinin genel anahtarlarını da alır. Bu çağrıyı açmak sizin tercihinize bağlıdır ve hakkınızda hiçbir bilgi göndermez.
Bir durable agent'ı URL ile bağlarsanız Collie, durable agent'ın taşıyıcı belirtecini Authorization üstbilgisine ekleyerek her yoklamada bu URL'yi çağırır. Bu çağrıyı açmak da sizin elinizdedir ve siz bir tane ekleyene kadar hiçbir şey gönderilmez (Dayanıklı bir aracının güvenliği).
Veri toplama özelliği eklenirse, açık onay üst sınırdır: varsayılan olarak kapalıdır, görünür bir soru olarak sorulur, asla bir bayrakla veya varsayılan bir ayarla getirilmez. Bu sözün kaldırılması uyumsuz bir değişiklik olur (ADR 0034).
Bu sayfayı GitHub üzerinde düzenleyin