Direkt zum Inhalt
ColliePWA

13/Documentation

Sicherheit: Vor der Ausführung lesen

Was Collie freigibt, die Schutzmaßnahmen und das Koppeln eines Geräts, das Berechtigungsnachweis für jede Anfrage

Collie bietet standardmäßig Shell-Fernzugriff auf Ihre Maschine. Ein einzelner Collie-API-Aufruf sendet beliebige Tastenanschläge direkt an einen aktiven Terminalbereich. Jedes gekoppelte Gerät kann jeden Bereich lesen (Quellcode, Geheimnisse, Umgebungsvariablen, Agenten-Ausgaben) und Befehle unter Ihrem Benutzerkonto ausführen. Seit Version 1.18.0 erfordert jede API-Anfrage das Token eines gekoppelten Geräts, Lesezugriffe eingeschlossen. Die Schwachstelle ist somit die Kopplung selbst: Wer die URL erreichen kann und über einen gültigen Kopplungscode verfügt, erhält denselben Zugriff. Vor Version 1.18.0 konnte jeder, der die URL erreichen konnte, jeden Bereich lesen.

Es gibt keine Sandbox und keine Befehls-Positivliste, da das Filtern von Befehlen den Zweck des Werkzeugs verfehlen würde. Behandeln Sie jedes gekoppelte Gerät wie eine Root-Anmeldung und einen Kopplungscode wie ein Passwort. Widerrufen Sie ein verloren gegangenes Gerät sofort mit collie devices revoke <label>. Die Kopplung verringert das Risiko, beseitigt es aber nicht. Belassen Sie die URL daher in einem privaten Netzwerk wie einem Tailnet und niemals im öffentlichen Internet.

Ein Gerät koppeln: der Schreibberechtigungsnachweis

Seit 1.18.0 ist dies der Berechtigungsnachweis für jede Anfrage, einschließlich Lesezugriffen, nicht mehr nur für Schreibzugriffe.

# on the host — prints an 8-character code and a QR code, good for 10 minutes
bin/collie pair

Die Kopplung ist immer aktiv, und Lesezugriffe erfordern das Kopplungstoken ebenso wie Schreibzugriffe. Bis ein Gerät gekoppelt ist, antwortet Collie jedem Telefon und Browser mit 403 device not paired. Führen Sie zuerst collie pair auf dem Host aus, bevor Sie Collie auf dem Telefon öffnen.

Öffnen Sie Collie auf dem Telefon, gehen Sie zu Einstellungen → Gekoppelte Geräte und geben Sie den Code zusammen mit einer Gerätebezeichnung ein, oder scannen Sie den vom Befehl ausgegebenen QR-Code, um direkt diesen Bildschirm mit bereits ausgefülltem Code zu öffnen. Das Telefon speichert das zurückgegebene Token. Collie behält nur den Hash, und das Token wird nur einmal angezeigt. Sie müssen den Prozess nicht neu starten; der laufende Daemon wendet Kopplungen und Widerrufe bei der nächsten Anfrage an.

Die beiden Geräteschranken beantworten unterschiedliche Fragen, und Sie können eine davon, beide oder keine verwenden:

fragtvertrautwiderrufen durch
COLLIE_DEVICE_HEADERsteht dieses Gerät auf der Liste des Betreibers?Ihrem Proxy, um einen bereinigten Namen einzufügenBearbeiten von COLLIE_DEVICE_ALLOWLIST und anschließenden Neustart
Koppelnbesitzt dieses Gerät einen von mir ausgestellten Berechtigungsnachweis?nichts im Netzwerkcollie devices revoke <label> – live

Das Koppeln erfordert keine zusätzliche Infrastruktur. Es eignet sich für ein direktes tailscale serve-Setup, bei dem kein Proxy zum Einfügen von Headern vorhanden ist.

Pairing beschränkt jede /api-Route, einschließlich Lesezugriffen. Nur zwei Routen bleiben offen: /api/health, das ein Monitor oder ein Load-Balancer abfragt, und /api/pair, das ein Gerät benötigt, bevor es ein Token hält. /api/health meldet den Build, den Crew-Modus und drei Zähler der letzten sieben Tage (wie oft das Eingabefeld als frei gelesen wurde, wie oft es nicht gelesen werden konnte und wie oft eine Person manuell an einem Bildschirm vorbeisendete, den Collie nicht lesen konnte). Die Zähler nennen kein Pane, keinen Text und keine Person.

Der Geräte-Header steuert Schreibvorgänge und zwei Lesevorgänge: Dateien-Ansicht, wodurch jede Datei im Ordner eines Arbeitsbereichs angezeigt werden kann, und Durchsuchen der New-Seite, das Ordnernamen unter Home (ADR 0086) auflistet.

bin/collie devices list             # what holds a credential, and when each was last seen
bin/collie devices revoke old-phone # effective immediately, no restart

Eine Neuinstallation hat kein gekoppeltes Gerät, daher antwortet Collie keinem Telefon, bis Sie collie pair ausführen. Das Widerrufen des letzten Geräts öffnet Collie nicht wieder: Jedes Gerät erhält dann device not paired. Führen Sie zur Wiederherstellung collie pair auf dem Host aus und koppeln Sie das Telefon erneut. collie doctor warnt, solange kein Gerät gekoppelt ist.

Hinweis. Die Crew-Verbindung und die Standby-Tür behalten ihre eigenen Anmeldedaten. Ein Lead leitet einen Lesevorgang über angeheftetes Mutual TLS und das Crew-Geheimnis an ein Mitglied weiter, sodass ein Mitglied kein eigenes gekoppeltes Gerät benötigt (Crew).

Fünf fehlgeschlagene Code-Versuche machen den Code ungültig, was eine erneute Ausführung von collie pair erfordert. Zudem verweigert die Bridge mehr als zehn Kopplungsversuche pro Quelladresse und Minute mit 429 und Retry-After: 60. Hinter einer Vordertür auf derselben Maschine ist die Quelladresse der letzte X-Forwarded-For-Eintrag, den die Vordertür hinzufügt. Von jedem anderen Peer wird dieser Header ignoriert. Die Zähler befinden sich im Arbeitsspeicher und werden beim Neustart der Bridge zurückgesetzt.

Die eigenen Lesevorgänge der CLI

Bei jedem Start schreibt die Bridge ein neues zufälliges Geheimnis in local-secret in ihrem Statusordner. collie doctor und collie crew update senden es, um ihre eigene Bridge auf derselben Maschine zu lesen. Die Datei ist nur für den Eigentümer zugänglich, sodass nur Ihr Benutzerkonto sie lesen kann, und ein sauberes Beenden löscht sie. Die Bridge akzeptiert es ausschließlich für Lesevorgänge, niemals für einen Schreibvorgang oder die Datei-Ansicht und niemals von einer anderen Maschine. Sie akzeptiert das Geheimnis nur über Loopback und niemals bei einer Anfrage, die den Header eines Proxys wie X-Forwarded-For trägt. Ein Crew-Mitglied, das COLLIE_HOST an seine Tailnet-Adresse bindet, hat nichts auf Loopback, daher akzeptiert die Bridge es dort auch von den eigenen Adressen dieser Maschine. Ein einfaches TCP-Relay auf derselben Maschine, wie socat oder ssh -L, kann das Geheimnis dennoch weiterleiten. Die Datei sorgt dafür, dass das Geheimnis bei Ihnen verbleibt; belassen Sie den Statusordner daher nur für den Eigentümer zugänglich.

Einem Gerät ein Ablaufdatum geben

Ein gekoppeltes Gerät behält sein Token, bis Sie es widerrufen. Um dies zu begrenzen, übergeben Sie beim Koppeln eine Lebensdauer:

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 again

Die Lebensdauer zählt ab dem Moment, in dem das Telefon den Code anfordert. Ohne --expires läuft ein Token nie ab, genau wie zuvor, und kein bestehendes Token ändert sich. Nach dem Ablauf verweigert die Bridge das Token mit device expired statt device not paired. Das Telefon löscht die Reste der Kopplung daraufhin und zeigt Erneut koppeln in den Einstellungen an; führen Sie also collie pair für einen neuen Code aus. collie devices list und der Einstellungsbildschirm zeigen das Ablaufdatum jedes Geräts an. Ein abgelaufenes Gerät verbleibt in der Liste, bis Sie es widerrufen oder ihm mit set-expiry ein neues Ablaufdatum zuweisen. Um es erneut zu koppeln, können Sie denselben Namen verwenden: Die neue Kopplung ersetzt den abgelaufenen Eintrag, widerruft dessen altes Token und das Überwachungsprotokoll zeichnet den Widerruf auf. Ein Name, den ein Gerät noch verwendet und dessen Token noch nicht abgelaufen ist, wird abgelehnt. Die Standby-Tür eines Crew-deputy verweigert ein abgelaufenes Token ebenfalls.

Stellen Sie auf einem Host mit mehreren Instanzen den Befehlen COLLIE_INSTANCE=<name> voran und öffnen Sie diese spezifische Instanz-URL auf dem Smartphone (Mehrere Collie-Instanzen auf einem Host).

Was das Entkoppeln auf dem Telefon löscht

Wenn eine Kopplung endet, löscht das Telefon alle darunter von Collie gespeicherten Daten. Dies geschieht, wenn Sie das Telefon über die Einstellungen entkoppeln und wenn die Bridge das Token mit device not paired oder device expired verweigert.

Das Telefon löscht das Token, jeden nicht gesendeten Entwurf, den gespeicherten Pane-Text samt Herd, das Push-Abonnement, die Bestätigungen für „Keine Abfragen“ sowie die Caches von Collie mit Ausnahme der App-Shell. Ihre Einstellungen bleiben erhalten: Design, Sprache, Fixierungen und andere Einstellungen enthalten keinen Sitzungstext. Die Einstellungen verlangen eine Bestätigung, bevor Sie ein Gerät widerrufen.

Das Löschen durch das Telefon selbst ist das einzige. Die Bridge sendet keinen Clear-Site-Data-Header, da dieser Header auch Ihre Einstellungen und die Offline-App löschen würde und er auf einem gemeinsam genutzten Hostnamen auch die anderen dortigen Apps erreichen würde.

Wenn die Bridge ihre Liste gekoppelter Geräte nicht lesen kann, beispielsweise bei einer unvollständig geschriebenen Datei, antwortet sie stattdessen mit 503 pairing unavailable. Das Telefon behält sein Token sowie alle gespeicherten Daten und versucht es erneut.

Was das Telefon behält

Das Telefon behält eine kleine, begrenzte Kopie des letzten Zustands, sodass ein Kaltstart diesen anzeigen kann, während die Bridge nicht erreichbar ist. Jeder unten aufgeführte Eintrag hat eine Größenbeschränkung und eine Lebensdauer.

WasOrtDauerBeim Entkoppeln
Kopplungs-TokenlocalStoragebis zum Entkoppeln, Widerruf oder Ablaufgelöscht
Einstellungen: Design, Sprache, PinslocalStoragebis zur Änderungbehalten
Nicht gesendete EntwürfelocalStorage48 Stundengelöscht
Push-EndpunktlocalStoragebis zur Änderunggelöscht
App-ShellCache-Speicherbis zum nächsten Buildbehalten
Schriftarten und Push-TitelCache-Speicherbis zum Ersetzengelöscht
Whistle-Sprachmodell- und Engine-Dateien (nur wenn Sie sich für deren Kopieren entschieden haben)Cache-Speicherbis Sie sie entfernengelöscht
Herd- und Pane-Text, wie zuletzt gesehenIndexedDB collie-store24 Stundengelöscht
Neueste Chat-Züge jedes PanesIndexedDB collie-store1 Tag oder die Einstellung „Chat auf diesem Smartphone behalten“gelöscht

Die letzten beiden Zeilen bilden den geräteeigenen Speicher. Er enthält nur Text, den die Bridge bereits maskiert hat, höchstens 256 KiB pro Pane und insgesamt 10 MiB, und verwirft die ältesten Einträge zuerst. Der Pane-Text und die Chat-Züge erhalten jeweils die Hälfte der 256 KiB eines Panes, sodass keiner den anderen verdrängt. Die Chat-Züge bleiben vollständig erhalten, wie der Chat sie gerendert hat, nie als roher Terminal-Bildschirm. Steht „Chat auf diesem Smartphone behalten“ auf Aus, wird nichts behalten und Vorhandenes gelöscht. Fragt ein Pane nach einem Passwort, verwirft das Smartphone die Einträge dieses Panes. Nichts im Speicher kann Tastendrücke oder Antworten senden. Die Löschungen beim Entkoppeln entsprechen denen in Was das Entkoppeln auf dem Telefon löscht.

Der App-Umschalter des Smartphones kann ebenfalls ein Pane anzeigen. Wenn Sie Collie verlassen, behält das Smartphone ein Bild des Bildschirms für seine Liste kürzlich genutzter Apps, und dieses Bild kann Pane-Text zeigen. Eine Web-App kann dies nicht verhindern: Android hat die Bildschirmaufnahme erstellt, bevor die Seite vom Wechsel in den Hintergrund erfuhr (getestet auf einem Pixel am 08.10.2026), und iOS gibt ebenfalls keine Garantie. Wenn dies für Sie eine Rolle spielt, sperren Sie das Smartphone oder schließen Sie Collie, bevor Sie es jemandem übergeben.

Risikomodell

Zentrale Sicherheitsgrenzen und Risiken:

  • Es läuft mit Ihren Benutzerberechtigungen. Collie übernimmt Ihre vollständigen Zugriffsrechte, einschließlich ~/.ssh, git push --force, rm -rf und sudo.
  • Die Authentifizierung identifiziert Geräte, keine Personen. Tailscale verifiziert den Hardware-Endpunkt statt den Benutzer, der ihn bedient. Es gibt keine Passwörter oder Benutzersitzungen; ein entsperrtes oder gestohlenes Smartphone bietet eine offene Shell. Die Kopplung bindet den Zugriff an Zugangsdaten auf dem Gerät (oben); sperren Sie ein verlorenes Smartphone daher sofort. Die integrierte Inaktivitätssperre blendet einen unbeaufsichtigten Bildschirm lediglich aus und stellt keine echte Sicherheitsgrenze dar (ADR 0007).
  • Alle lokalen Systembenutzer können den Port erreichen. Standard-Sockets von Terminal-Multiplexern (tmux, zellij, herdr) nutzen Dateisystemberechtigungen, um den Zugriff für andere lokale Benutzer einzuschränken. Collie lauscht an einem lokalen TCP-Port, was den Dienst für jede lokale UID erreichbar macht. Lesezugriffe erfordern das Kopplungs-Token, sodass ein anderer lokaler Benutzer ohne Token lediglich /api/health sieht. Das Token ist die Grenze: Ein lokaler Benutzer, der Ihr Browserprofil lesen kann, kann auch das Token lesen (ARCHITECTURE.md §6).
  • Eine gehaltene Berechtigung wartet auf das Tippen einer Person. Mit collie hooks install claude --hold-permissions fragt Claudes Berechtigungs-Hook die Bridge über eine Socket-Datei ab. Nur Ihr Benutzer kann sie öffnen (Modus 0600 in einem 0700-Verzeichnis). Der Hook prüft den Socket-Eigentümer, das Verzeichnis und das darüber liegende Zustandsverzeichnis, bevor er sich verbindet. Die Bridge antwortet nur für einen Prozess, den sie auf einem Pane platziert. Sie antwortet nie allein. Ein Tippen muss den Hash dessen enthalten, was die Karte angezeigt hat. Eine Bildschirmkarte beantwortet niemals eine Anfrage, deren Dialog nicht auf dem Bildschirm zu sehen ist (Berechtigungen für das Smartphone vorgehalten).
  • Die Datei-Ansicht liest Dateien von Ihrer Festplatte. Sie zeigt jede Datei im Ordner eines Arbeitsbereichs an, außer einem Ordner .git, Collies eigenen Zustands- und Konfigurationsordnern sowie Dateien, deren Namen wie ein Zustandsschlüssel von Collie aufgebaut sind. Sie verlangt daher ein autorisiertes Gerät, genau wie ein Schreibzugriff (ADR 0083).
  • Das Durchsuchen der New-Seite listet Ordnernamen in Ihrem Home-Verzeichnis auf. Nur Namen mit den Einschränkungen der Files-Ansicht: keine Punkt-Ordner, es sei denn, sie werden eingetippt, kein .git, kein Collie-Zustands- oder Konfigurationsordner, kein Link aus dem Home-Verzeichnis heraus, maximal 200 Zeilen. Erfordert ebenfalls ein autorisiertes Gerät (Favoriten und zuletzt verwendete Ordner).
  • Jedes gekoppelte Gerät kann Dateien im Ordner des Arbeitsbereichs lesen. Das schließt .env-Dateien ein. Koppeln Sie nur Geräte, denen Sie auch die Shell selbst anvertrauen.
  • Zugangsdatendateien im Ordner eines Arbeitsbereichs sind lesbar. Ein in ~/.claude, ~/.codex, ~/.config/gh oder ~/.ssh geöffneter Arbeitsbereich zeigt an, was vorhanden ist. Das gilt auch für .env einer zweiten Collie-Instanz, deren Konfigurationsordner unterhalb des Arbeitsbereichs liegt. Ein Hardlink innerhalb des Ordners auf eine Datei außerhalb wird ebenfalls nicht abgefangen.
  • Ein gekoppeltes Gerät kann Starter hinzufügen. Mit der Standardeinstellung [phone] adds = true darf ein Telefon eine aus einer Vorlage erstellte Zeile hinzufügen: einen Agenten nebst Optionsfeldern, deren Flags die Bridge aus ihrer eigenen Tabelle wählt. Eine von Hand getippte Zeile erfordert free_text = true, was standardmäßig deaktiviert ist. Eine Vorlage kann Berechtigungsabfragen dennoch überspringen. Eine solche Zeile trägt das Abzeichen „Keine Abfragen“, und jedes Gerät bestätigt sie einmalig. Das Widerrufen eines Geräts entfernt die von ihm hinzugefügten Zeilen. Setzen Sie adds = false, um alle vom Telefon hinzugefügten Zeilen zu deaktivieren (Eigene Starter, ADR 0094).
  • Ein gekoppeltes Gerät kann Einmalbefehle ausführen. Mit der Standardeinstellung [phone] run = true darf ein Telefon eine eingegebene Zeile in eine frische Shell auf einer Maschine übertragen. Dies bringt keine erweiterten Rechte, da ein gekoppeltes Telefon bereits eine Shell öffnen und Text eingeben kann. Die Zeile unterliegt den Zeichenregeln für Freitextzeilen, und ohne gekoppeltes Gerät verweigert die Bridge den Vorgang. Jeder gestartete Befehl wird gespeichert, bis zu 12 Einträge, in commands-recent.json im Statusordner (Dateimodus 0600). Eine Zeile, die augenscheinlich ein Geheimnis enthält (eine Zuweisung wie TOKEN=…, eine URL mit Passwort oder ein Wort wie token oder password), wird ausgeführt, aber nicht gespeichert. Die Prüfung beruht auf Heuristiken, weshalb dennoch ein Geheimnis in die Liste gelangen kann; das Überwachungsprotokoll erfasst nur das erste Wort einer Zeile und deren Länge. Das Entkoppeln oder Widerrufen eines Geräts belässt die Liste unverändert, da das erneute Ausführen einer Zeile ein gekoppeltes Gerät voraussetzt. Setzen Sie run = false, um den Schnellzugriff zu entfernen (Einmalbefehle, ADR 0095).
  • Jede Maschine speichert die Shell-Zeilen, die Sie über Collie senden. Sent speichert eine Zeile, die Sie an einen Shell-Bereich senden, sowie jeden Einmalbefehl in sent.jsonl im Zustandsordner (Modus 0600). Ein gekoppeltes Gerät kann diese Zeilen lesen, ebenso wie die Bereiche. Manche Geheimnisse bleiben dennoch geschützt (Sent: die von Ihnen gesendeten Shell-Zeilen).
  • Eine einzelne Instanz stellt alle Herdr-Sitzungen bereit. Standardmäßig verwaltet ein einzelner Collie-Prozess jede Herdr-Sitzung, die unter Herdrs Konfigurationswurzel gefunden wird, einschließlich Sandbox-Sitzungen (Mehrere Sitzungen).
  • Schreibvorgänge werden in <state-dir>/audit.log aufgezeichnet, was ~/.local/state/collie/audit.log ist, sofern COLLIE_STATE_DIR es nicht verschiebt. Der Server protokolliert alle eingehenden Tastenanschläge, Antworten, Datei-Uploads und Pane/Tab-Lebenszyklusereignisse. Beachten Sie, dass ein Prüfprotokoll nachträgliche Transparenz statt Zugriffskontrolle bietet. Zeichen, die im Type-Modus gesendet werden, werden nie in das Protokoll geschrieben: COLLIE_AUDIT_CONTENT=none schwärzt jedes einzelne, und die Standardvorschau zeichnet nur die Anzahl der •-Zeichen auf. Benannte Tasten wie Enter und Ctrl+C bleiben lesbar (ARCHITECTURE.md §6). Die Antworten, Sendevorgänge, Stopps, Schaltflächen-Tipps, Starts, Wiedereröffnungen und Umbenennungen eines durable agents werden ebenfalls aufgezeichnet (Was protokolliert wird).
  • Antwort-Header. Jede Antwort enthält X-Content-Type-Options: nosniff, Referrer-Policy: no-referrer und Permissions-Policy: camera=(), geolocation=(), microphone=(self), payment=(), usb=(). Das Mikrofon bleibt für die Einstellung der Freisprechfunktion zugelassen. Die Content-Security-Policy der App-Shell enthält object-src 'none', form-action 'self' und frame-ancestors 'none'. Strict-Transport-Security wird nur gesendet, wenn eine Anfrage über HTTPS eingegangen ist, entweder an einem TLS-Listener oder mit X-Forwarded-Proto: https von Ihrem Proxy. Es gilt für den antwortenden Hostnamen und nicht für dessen Subdomänen, da Collie die übergeordnete Domäne oft mit anderen Diensten teilt. Die Bridge selbst kommuniziert über reines HTTP hinter tailscale serve, und ein Browser ignoriert den Header dort. Von /api/blobs/ ausgelieferte Bilder sind Sitzungsinhalte; sie tragen daher Cache-Control: private, no-store, und kein Cache behält sie, nicht einmal der des Smartphones.
  • Standardmäßige Schutzmechanismen. Collie bindet ausschließlich an Loopback-Schnittstellen, leitet Datenverkehr ausschließlich über tailscale serve oder einen gleichwertigen Reverse-Proxy weiter und wendet strenge CSP-Regeln, Same-Origin-Prüfungen sowie Host-Header-Validierungen an. Bereichsausgaben werden als React-Textknoten statt als innerHTML gerendert. Verwenden Sie niemals tailscale funnel und geben Sie keinen ungeschützten Port frei. Um bestimmte Hardware zu autorisieren, verwenden Sie direkt Koppeln oder, falls Ihr Proxy Geräte-IDs einfügt, die beiden unten stehenden COLLIE_DEVICE_*-Variablen.
VariableFunktion
COLLIE_ALLOW_NON_LOOPBACK_BIND=1Deaktiviert die ausschließliche Loopback-Bindung; ist die Option nicht gesetzt, verweigert die Bridge das Binden an 0.0.0.0.
COLLIE_ALLOW_ANY_HOST=1Deaktiviert die Host-Header-Validierung, die ansonsten standardmäßig aktiv ist und Anfragen bei Fehlern abweist.
COLLIE_TRUSTED_USERWeist eine Anfrage ab, deren Tailscale-User-Login-Header fehlt oder nicht übereinstimmt.
COLLIE_TRUSTED_USER_OPTIONAL=1Erlaubt einen fehlenden Tailscale-User-Login-Header (getaggte Knoten senden diesen nie).
COLLIE_ACCESS_TEAM + COLLIE_ACCESS_AUDNur Cloudflare Tunnel. Weist jede Remote-Anfrage ab, sofern deren Cf-Access-Jwt-Assertion nicht für diese Access-App verifiziert wird. Nur ein lokaler Prozess auf Loopback, /api/health und die Crew-Links umgehen dies; das Pairing gilt weiterhin. Andere Zugänge wie tailscale serve werden ebenfalls abgewiesen (Cloudflare Tunnel).
COLLIE_DEVICE_HEADERName des Headers, über den Ihr Proxy eine Geräte-ID einfügt.
COLLIE_DEVICE_ALLOWLISTKommagetrennte Geräte-IDs mit Schreibberechtigung; alle anderen Geräte bleiben schreibgeschützt (docs/deployment.md).
COLLIE_REDACT=offDeaktiviert die Maskierung von Geheimnissen in Pane-Text, Diffs und Dateitext (unten). Standardmäßig aktiv.
COLLIE_SENT=offSpeichert keine Aufzeichnung der von Ihnen gesendeten Shell-Zeilen (unten). Standardmäßig aktiviert.
🚫 Verwenden Sie niemals tailscale funnel mit Collie. Funnel leitet Datenverkehr in das öffentliche Internet weiter, wohingegen tailscale serve den Zugriff auf Ihr privates Tailnet beschränkt. Es gibt keinen unterstützten Anwendungsfall für den Betrieb von Collie über Funnel.

Schränken Sie den Zugriff mit Tailscale-ACLs und COLLIE_TRUSTED_USER weiter ein. Bereitstellung ohne Mängelgewähr.

Persistente Agenten

Ein durable agent, den Sie anhängen, ist Code, den Sie ausführen oder bereitstellen, und Collie behandelt seinen Text als nicht vertrauenswürdig. Ein privater Socket hält andere Benutzer fern, aber keinen Prozess Ihres eigenen Benutzers, und ein Token ist die einzige Schranke über HTTPS. Die Vertrauensregeln pro Transport, was Collie mit dem Text eines durable agents macht und was das Prüfprotokoll behält, finden Sie in Sicherheit eines persistenten Agenten.

Die Sprach-Engine (Whistle)

Whistle führt Drittanbieter-Code aus: eine WebAssembly-Engine von Cactus Compute. Sie läuft auf dem Telefon oder auf dem Host als Benutzer der Bridge. Collie begrenzt, worauf dieser Code zugreifen kann. Es kann den Zugriff nicht vollständig aufheben.

  • Im Repository verwaltet und fixiert. Die Engine besteht aus zwei Dateien, needle.js und needle.wasm, die Byte für Byte wie von Upstream veröffentlicht aufbewahrt werden, mit der Upstream-Lizenz und einem Herkunftshinweis (web/public/stt/needle-3-93e88ede/). Ein Test fixiert den sha256 beider Dateien und die Liste der sechzehn Funktionen, die das wasm von seinem Host anfordern darf. Ein neuer Import ist ein Grund anzuhalten. Nur ein Mensch aktualisiert die Fixierung und liest zuvor das Diff. Das Modell hat seinen eigenen fixierten Hash, und Collie behält eine heruntergeladene Kopie nur, wenn dieser übereinstimmt.
  • Auf dem Telefon ein Worker mit eigener Policy. Das wasm läuft in einem dedizierten Worker. Die Bridge liefert jedes Skript unter stt/ mit dieser Policy aus, und keine andere Seite erhält sie:
    Content-Security-Policy: default-src 'none'; script-src 'self' 'wasm-unsafe-eval'; base-uri 'none'

    Der Worker hat kein Netzwerk, kein DOM und keine Möglichkeit, Code von woanders zu laden. Er kann das Kopplungs-Token nicht lesen, das in localStorage liegt, und Worker haben kein localStorage. Bevor er irgendetwas anderes tut, kompiliert er ein winziges wasm-Modul. Ein Browser, der dem Worker keine eigene Policy zuweist, lehnt das ab, und Dieses Telefon wird dort als nicht verfügbar angezeigt.

  • Die Policy der Seite ändert sich nicht. Die Document-Policy erhält niemals 'wasm-unsafe-eval', und sie behält connect-src 'self'.
  • Worauf der Worker noch zugreifen kann. Er kann IndexedDB und Cache Storage dieses Origins lesen und schreiben, was keine Policy-Direktive schließt. collie-store enthält aktuellen Text aus Pane und Chat (Was das Telefon behält). Dieser Text war bereits maskiert, ist aber lesbar. Dieser Zugriff wird akzeptiert und im ADR benannt. Wenn dies relevant wird, ist der nächste Schritt ein Sandbox-Frame um den Worker.
  • Auf dem Host ein Kindprozess von Collies eigener Binärdatei. Ein kurzlebiger Kindprozess pro Diktat führt _whistle-transcribe mit einer festen Argumentliste aus, die Collie geschrieben hat. Er prüft die Engine, das wasm und das Modell gegen ihre Fixierungen, bevor er etwas kompiliert. Er hat ein Zeitlimit von 60 Sekunden, wird mit SIGKILL beendet, hat eine Ausgabebegrenzung von 256 KiB und maximal zwei gleichzeitig. Er erhält keine der COLLIE_*-Variablen der Bridge. Die Bridge setzt nur zwei, den State-Ordner und den Installationsordner, auf Pfade, die sie selbst aufgelöst hat. Nichts aus der Anfrage gelangt in die Argumentliste außer der Aufnahme.
  • Ein zweiter ausgehender Aufruf, durch Antippen einer Person. Die Update-Prüfung ist der erste. Der Modell-Download ist der zweite: eine Datei, von einer fixierten Hugging-Face-Adresse, geschrieben erst nachdem ihr Hash übereinstimmte. Ein Telefon ruft Hugging Face niemals auf. Es kopiert das Modell vom Host, mit dem Kopplungs-Token. Die Routen erfordern ein Schreibgerät, laufen nur auf dem Lead, erlauben jeweils einen Download und werden auditiert.
  • Einrichtung über die Einstellungen ist eine Ausnahme von „Einrichtung ist ein CLI-Vorgang“. Provider, die Anmeldedaten speichern oder einen Befehl benennen, bleiben im Terminal. Whistle tut nichts davon. Ein gestohlenes Schreib-Token kann bereits Eingaben in Terminals tätigen und ein Update starten, daher gewährt das Antippen zur Einrichtung ihm nichts Neues.
  • Das Umschalten auf Codex über die Einstellungen ist die andere Ausnahme. Ein Schreibgerät darf den Host zwischen Whistle, Codex und Off umschalten, und sonst nichts. Codex erfordert die vollständige Zustimmung, dieselben Worte, die collie stt setup ausgibt, und ein Antippen von Ich akzeptiere; die Bridge führt dann die eigene Prüfung der CLI aus. Ein gestohlenes Schreib-Token könnte die Spracheingabe des Hosts auf das angemeldete ChatGPT-Konto des Betreibers lenken. Es kann keinen Schlüssel oder Befehl hinzufügen oder ersetzen. Das Token kann bereits codex in ein Terminal eingeben. ADR 0097 wägt dies ab. Ein Umschalten über die Einstellungen schreibt auch den Namen des gekoppelten Geräts, wie bei der Kopplung angegeben, und den Zeitpunkt in stt.json, sodass Host-Spracheingabe angeben kann, wer es zuletzt geändert hat. Kein Token und keine Adresse wird geschrieben. Ein Ausführen von collie stt setup entfernt diese Zeile.
  • Gekoppelte Geräte können lesen, was die Spracheinstellungen des Hosts benennen, ausschließlich nach Namen. Das ist der Name des Befehls, der Name einer Modelldatei und der Hostname eines Sprachdienstes, niemals ein Pfad, ein Argument, ein Schlüssel oder ein URL-Pfad.

Warum es so aufgebaut ist: ADR 0096. Die Einrichtungsschritte stehen in Spracheingabe und Web-Push.

Walky-Talky

Walky-Talky überträgt Nachrichten zwischen Agenten-Sitzungen; dieser Abschnitt beschreibt daher, was eine Nachricht nachweist und was nicht. Die Befehle befinden sich in Walky-Talky.

# in .env, then run `collie restart`
COLLIE_WALKY=off

Diese Zeile sorgt dafür, dass diese Maschine jede Nachricht für ihre Bereiche ablehnt. Die CLI auf der Maschine kann weiterhin senden.

  • Ein Crew-Schlüssel signiert eine Nachricht maschinenübergreifend. Ein Mitglied signiert eine Nachricht mit seinem Crew-Schlüssel. Der Lead prüft die Signatur anhand des Schlüssels, den er für dieses Mitglied hinterlegt hat, und fügt dann seine eigene Signatur für die empfangende Maschine hinzu. Eine Solo-Installation besitzt keinen Crew-Schlüssel. Sie signiert nichts und sendet nichts von der Maschine weg.
  • Der Empfänger überprüft den Absender über die Bestätigung des Leads. Ein Mitglied hinterlegt ausschließlich seinen Lead. Daher sendet der Lead das Zertifikat des Absenders mit der Nachricht und signiert eine kurze Bestätigung, dass dieses Zertifikat zu diesem Mitglied der Crew gehört. Die empfangende Maschine prüft diese Bestätigung und gleicht anschließend die Signatur des Absenders mit dem Zertifikat ab. Schlägt eine Prüfung fehl, lehnt sie die Nachricht ab. Sie vertraut weiterhin dem Lead bezüglich der Crew-Zugehörigkeit.
  • Nur der Lead kann ein Ergebnis zurückschreiben. Der Lead sendet einem Mitglied die Ergebnisse von dessen eigenen Nachrichten. Das Mitglied akzeptiert diese nur von seinem hinterlegten Lead und nur für eine Nachricht, die es selbst gesendet hat und noch protokolliert. Ergebnisse und die Aufzeichnung der Eingänge beim Lead verbleiben im Arbeitsspeicher und werden nach 10 Minuten gelöscht.
  • Die Karte des Telefons erfordert das Protokoll. Das Telefon stellt eine Nachrichtenkarte nur dar, wenn das eigene Protokoll der Bridge diese Nachrichten-ID enthält. Ein Header, den ein Agent lediglich auf dem Bildschirm ausgibt, bleibt reiner Text mit dem Vermerk „kein Protokolleintrag auf dieser Maschine“.
  • Ein Bereichs-Token ist kein Geheimnis. Das Token in einer Adresse wie #k3f9 verhindert, dass eine Nachricht eine neue Sitzung erreicht, die die ID eines geschlossenen Bereichs übernommen hat. collie walky who gibt es an jeden Agenten aus, und <stateDir>/walky/instances.json ist für Ihren Benutzer lesbar. Es beweist nichts über den Absender.
  • Jede Maschine, die eine Nachricht passiert, speichert diese. Die Maschine des Absenders, der Lead und die empfangende Maschine protokollieren die Nachricht jeweils in <stateDir>/walky/. Das Protokoll bleibt 7 Tage und maximal 2.000 Zeilen lang erhalten. Hinterlegen Sie niemals ein Geheimnis in einer Nachricht.
  • Die Nachricht eines Agenten sind die Worte eines Peers. Der Bereich erhält eine Zeile mit dem Header des Absenders und ohne Inhalt. Der Agent liest den Inhalt als Ausgabe von collie walky inbox <id>, die von einem Test-Harness als Daten und nicht als Ihre Anweisung behandelt wird. Der installierte Skill weist den Agenten an, dies abzuwägen und niemals einen destruktiven Befehl auszuführen, nur weil ein Peer darum gebeten hat.
Hinweis. Ein Agent läuft unter Ihrem Benutzer, er kann also den Crew-Schlüssel lesen und den lokalen Socket öffnen. Er könnte eine Nachricht signieren oder einen Bereich beanspruchen, der ihm nicht gehört. Die Signatur schützt eine Nachricht auf ihrem Weg zwischen Maschinen und teilt dem Empfänger mit, welche Maschine sie gesendet hat. Sie schützt Sie nicht vor einem Programm auf derselben Maschine, das falsche Angaben über sich selbst macht.

Walky-Talky erzeugt keinen ausgehenden Aufruf. Eine Nachricht an eine andere Maschine nutzt die bereits bestehende Crew-Verbindung, und kein Modell, kein Cloud-Dienst und kein Dritter sieht sie.

Was die Maschine verlässt, wird maskiert

Collie maskiert bekannte Strukturen von Geheimnissen im Pane-Text und im Dateiinhalt, bevor diese ein Smartphone erreichen.

# in your .env, only to turn the mask off; it is on by default
COLLIE_REDACT=off

Die Maskierung läuft auf der Bridge auf fünf Pfaden: dem Terminal-Spiegel, den Chat- und Verlaufsansichten, jeder Push-Benachrichtigung, den Diffs in der Änderungsansicht und dem Dateitext in der Datei-Ansicht. Was verborgen wird, wird zu •-Zeichen gleicher Breite, sodass Spalten- und Zeilenzahlen erhalten bleiben. Ein Herstellerpräfix bleibt lesbar, sodass sk-o•••• weiterhin erkennen lässt, was verborgen wurde.

Es werden nur Muster mit hoher Erkennungsgenauigkeit abgeglichen:

MusterBeispiel für die Maskierung
API-Schlüssel mit Präfixsk-…, sk-ant-…, sk-or-v1-…, ghp_…, github_pat_…, xoxb-…, AKIA…, AIza…, glpat-…, npm_…
JWTsdrei Base64url-Teile, von denen der erste mit eyJ beginnt
Private PEM-Schlüsseljede Zeile zwischen BEGIN … PRIVATE KEY und der zugehörigen END-Zeile
Bearer-Tokensdas Token nach Bearer , ab 20 Zeichen
Benannte Werteder Wert nach password=, secret:, token=, api_key: und Ähnlichem, ab 8 Zeichen
Achtung. Dies ist eine Schutzmaßnahme, keine Garantie. Ein einzelnes Klartextpasswort, ein reiner Hex- oder Base64-Wert sowie ein Schlüssel mit einem Präfix außerhalb der Liste werden absichtlich übergangen. Ein Muster dafür würde normalen Text und Code auf jedem Bildschirm maskieren.

Mancher normaler Text wird ebenfalls maskiert, etwa eine Fließtext- oder YAML-Zeile mit token: something. Was Sie eingeben und absenden, wird nie maskiert, und das Überwachungsprotokoll behält seine eigenen Regeln (COLLIE_AUDIT_CONTENT).

Der Schalter befindet sich ausschließlich auf der Bridge als COLLIE_REDACT. Einstellungen → System zeigt ihn schreibgeschützt als "Secret masking" an. Das Telefon hat absichtlich keinen Schalter: Ein Schalter auf dem Telefon würde es jedem gekoppelten oder gestohlenen Telefon erlauben, die Maskierung zu deaktivieren. Um einen maskierten Wert zu lesen, lesen Sie ihn auf der Maschine. Wenn ein Bereich zum ersten Mal maskierten Text anzeigt, weist ein kurzer Hinweis auf dem Telefon einmalig pro Gerät darauf hin. Fügen Sie maskierten Text in eine Antwort ein, warnt ein Hinweis unter dem Eingabefeld, dass der Bereich die Punkte erhält, nicht das Geheimnis.

In einer Crew maskiert jedes Mitglied seinen eigenen Text, und die Leitung maskiert ihn erneut, bevor Ihr Telefon ihn erhält. Die Leitung maskiert Mirror, Chat, History, Diffs, Dateiinhalte und Bereichstitel eines Mitglieds mit derselben Maske wie ihre eigenen Daten. Ein Mitglied, auf dem noch 1.17.x läuft, kann daher keinen Schlüssel im Klartext an Ihr Telefon senden. Maskierter Text bleibt unverändert, wenn er erneut maskiert wird. Text erreicht das Telefon nur dann unmaskiert, wenn COLLIE_REDACT=off sowohl auf der Leitung als auch auf dem Mitglied gesetzt ist. Ein Sonderfall: Ein Mitglied unter 1.17.x maskiert selbst nichts. Befindet sich ein Geheimnis in den Zeilen, gegen die eine Antwort geprüft wird, kann das Telefon die Antwort mit "The screen changed before that could be sent" verweigern. Die Antwort wartet dann, bis auf dem Mitglied 1.18.0 läuft.

Kann die Leitung die Antwort eines Mitglieds nicht lesen, um sie zu maskieren, leitet sie die Antwort nicht weiter. Das Telefon zeigt diesen Lesevorgang dann als fehlgeschlagen an, genau wie bei einem nicht erreichbaren Mitglied.

Eine Push-Benachrichtigung benennt einen Bereich ebenfalls nur mit dem von Ihnen vergebenen Namen: die Bereichsbeschriftung, Claudes /rename-Name oder der Name eines Ein-Bereich-Reiters. Sie verwendet nie den Titel, den ein Programm im Bereich gesetzt hat, da jedes Programm diesen Titel setzen kann und ein Titel einen Pfad, einen Befehl oder ein Geheimnis enthalten kann. Ein Bereich ohne solchen Namen wird nach seinem Harness benannt, beispielsweise claude.

Sent: die von Ihnen gesendeten Shell-Zeilen

Jede Maschine zeichnet die Shell-Zeilen auf, die Sie über Collie senden, damit Sie sie wiederfinden und erneut senden können.

# in your .env, to keep no record on this machine
COLLIE_SENT=off
FrageAntwort
Was gespeichert wirdEine Zeile, die Sie an einen Shell-Bereich senden, und jeder Einzelbefehl von der Seite „Neu“. Für jede Zeile: der Text, ihr Ordner, der Zeitpunkt und um welche der beiden Arten es sich handelte.
Was niemals gespeichert wirdPrompts an einen Agenten, Text für ein Programm, Schlüssel aus der Schlüsselübersicht und der Schreibmodus.
Ortsent.jsonl im Statusordner, ~/.local/state/collie/, sofern COLLIE_STATE_DIR ihn nicht verschiebt. Die Datei hat den Dateimodus 0600 in einem Ordner mit 0700.
DauerHöchstens 5000 Zeilen auf jeder Maschine und keine, die älter als 365 Tage ist.
Wer sie lesen kannEin gekoppeltes Gerät, da es die Bereiche lesen kann, an die die Zeilen gingen.
In einer CrewJede Maschine führt ihre eigene Datei. Die Hauptinstanz fragt ihre Mitglieder ab, wenn Ihr Telefon anfragt, und behält keine Kopie.

Collie sendet jede Zeile, die Sie antippen, und entscheidet dann, ob sie gespeichert wird. Es speichert nichts über eine Zeile, die:

  • mit einem Leerzeichen oder einem Tabulator beginnt,
  • eine Variable setzt, wie etwa TOKEN=abc deploy oder export AWS_SECRET_ACCESS_KEY=…,
  • eine URL mit einem Passwort enthält, wie etwa https://user:pass@host,
  • ein Wort wie password, secret, token, bearer oder authorization enthält,
  • ein Muster aufweist, das die Geheimnismaske kennt, wie etwa einen ghp_…- oder sk-…-Schlüssel,
  • länger als 4096 Zeichen ist.

Eine solche Zeile hinterlässt keinen Eintrag, keine Zählung und keine Protokollzeile mit ihrem Text.

Um eine Zeile auszuschließen, beginnen Sie sie mit einem Leerzeichen. Die Shell führt sie wie gewohnt aus, und Collie speichert nichts.

Achtung. Die Prüfung ist eine Schätzung. Sie speichert ein Passwort, das Sie als einfaches Argument übergeben, wie etwa mysql -pPASS, und jedes Geheimnis mit einem Muster, das sie nicht kennt. Beginnen Sie eine solche Zeile mit einem Leerzeichen.

Um eine Zeile zu verwerfen, verwenden Sie „Verwerfen“ in ihrer Zeile im Gesendet-Blatt. Um eine ganze Maschine zu verwerfen, verwenden Sie „Gesendete löschen“. Beides funktioniert, solange COLLIE_SENT=off gesetzt ist. Das Prüfprotokoll zeichnet jeden Löschvorgang mit einem Zähler auf, niemals die Zeile. Jede Zeile durchläuft die Geheimnismaske, bevor sie die Maschine verlässt.

Warum es so aufgebaut ist: ADR 0107.

Geheimdateien unter Windows

Unter Windows (experimentell) beschränkt Collie den Zugriff auf seine Geheimnisdateien auf Ihr Konto, SYSTEM und Administratoren. „Ihr Konto“ ist das Windows-Konto, unter dem Collie ausgeführt wird.

NTFS kennt keinen 0600-Modus, daher verwendet Collie die Zugriffssteuerungsliste (ACL) seines Statusordners und seines Konfigurationsordners. Jede Datei, die Collie dort schreibt, erhält dieselbe Liste. Die Standardordner in Ihrem Benutzerprofil sind für andere Standardbenutzer bereits gesperrt. Die Prüfung ist besonders wichtig, wenn Sie einen Ordner mit COLLIE_STATE_DIR oder einer anderen Einstellung verschieben.

Beim Start prüft die Bridge beide Ordner und deren Geheimnisdateien. Wenn andere Konten eine Datei lesen können, repariert die Bridge dies, jedoch nur in Collies eigenen Ordnern. Sie sichert die alte Liste zuerst in acl-backups im Statusordner und gibt den icacls /restore-Befehl aus, der sie wiederherstellt. Führen Sie diesen Befehl in einem als Administrator ausgeführten Terminal aus. Ein Ordner, der auch andere Dateien enthält, wird nur geprüft, nicht geändert: Collie gibt den icacls-Befehl aus, den Sie selbst ausführen müssen. Andere Befehle wie collie version prüfen lediglich und geben eine Warnung aus.

collie doctor zeigt das Ergebnis als secrets-private an. Ein Ordner, den andere Konten lesen können, gilt als Fehler inklusive Fehlerbehebung. Ein Ordner, den Collie nicht prüfen kann, ist eine Warnung: cannot confirm.

FallWas passiert
Sie kopieren, stellen wieder her oder synchronisieren den Ordner (Zip, robocopy ohne /SEC, OneDrive, Dateiversionsverlauf, ein USB-Laufwerk)Die Kopie kann die Liste verlieren. Collie prüft dies beim nächsten Start erneut.
Virenschutz oder überwachter Ordnerzugriff blockiert die ÄnderungCollie meldet, dass der Ordner nicht geschützt werden konnte, und gibt die Fehlerbehebung an.
Der Ordner liegt auf FAT, exFAT oder einer NetzwerkfreigabeEs gibt keine Liste, die Collie verwenden kann. Collie gibt cannot confirm aus. Verschieben Sie den Statusordner auf ein NTFS-Laufwerk auf diesem PC.
COLLIE_NO_ACL_REPAIR=1Collie ändert keine Liste. Es prüft und warnt weiterhin, und doctor berichtet weiterhin.
Hinweis. Dies schützt nicht vor einem Administrator. Administratoren können die Dateien weiterhin lesen. Es schützt zudem nicht vor anderen Programmen, die unter Ihrem Konto laufen, vor Hardlinks innerhalb des Ordners, vor Agenten-Sicherungen in ~/.claude oder vor einem Statusordner innerhalb von OneDrive oder Dokumente.

Was Ihre Maschine verlässt

Nichts, standardmäßig und laut Richtlinie. Collie sendet keine Installationsereignisse, keine Nutzungsstatistiken, keine Absturzberichte und keine Analysedaten. Es gibt kein Flag, das diese aktiviert.

Der einzige unaufgeforderte ausgehende Aufruf ist die Update-Prüfung: ein anonymer HTTPS-Aufruf GET an die öffentliche Tags-API von GitHub (bridge/update.ts), der Ihre Version mit dem neuesten Tag vergleicht. Er überträgt keine Daten über Sie oder Ihre Maschine, sondern nur den statischen User-Agent collie-update-check.

Der Download des Whistle-Modells ist der andere ausgehende Aufruf. Er erfolgt nur, wenn jemand auf Auf den Host herunterladen tippt oder collie stt whistle ausführt, und sendet keine Daten über Sie (Die Sprach-Engine (Whistle)).

Walky-Talky erzeugt keinen ausgehenden Aufruf. Eine Nachricht an eine andere Maschine nutzt die Crew-Verbindung und geht nirgendwo sonst hin (Walky-Talky).

„Problem melden“ fügt keinen ausgehenden Aufruf hinzu. Nach fehlgeschlagenen Eingaben kann das Telefon das Formular für ein neues Issue auf GitHub ausgefüllt als Link in Ihrem eigenen Browser öffnen. Sie lesen den gesamten Text zuerst und übermitteln ihn selbst unter Ihrem eigenen Konto. Collie besitzt kein GitHub-Token und das Telefon ruft GitHub niemals auf (ADR 0123).

Wenn Sie COLLIE_ACCESS_TEAM setzen, ruft Collie beim Start und einmal pro Stunde zusätzlich die öffentlichen Schlüssel dieses Cloudflare Access-Teams ab. Dieser Abruf muss von Ihnen aktiviert werden und übermittelt ebenfalls keine Daten über Sie.

Wenn Sie einen durable agent per URL anhängen, ruft Collie diese URL bei jedem Poll mit dem Bearer-Token des durable agents im Header Authorization auf. Sie entscheiden, ob dieser Aufruf aktiviert wird, und nichts wird gesendet, bis Sie einen anhängen (Sicherheit eines persistenten Agenten).

Sollte jemals eine Datenerfassung hinzugefügt werden, ist ein explizites Opt-in das Maximum: standardmäßig deaktiviert, als sichtbare Frage formuliert, niemals über ein Flag oder einen Standardwert vorgegeben. Die Aufhebung dieses Versprechens wäre eine inkompatible Änderung (ADR 0034).

Diese Seite auf GitHub bearbeiten

The rest of the documentation