Alle Seiten
Auf dieser Seite

Previews

Eine Preview stellt etwas mit einer Weboberfläche unter einen öffentlichen Link: einen Dev-Server, der auf einem Port des Relay-Rechners lauscht, oder einen Ordner mit einfachen Dateien. Du öffnest den Link von jedem Gerät aus und kannst ihn an jeden schicken. Das Relay wird dabei nicht offengelegt: Previews liefert ein eigener Listener unter einem eigenen Hostnamen aus.

Typische Einsätze:

  • Die App auf dem Handy öffnen. Der Agent startet den Dev-Server, du tippst auf den Link und probierst das Layout auf dem echten Gerät aus.
  • Jemandem einen Link schicken. Eine Kollegin öffnet ein Mockup oder eine gebaute Website ohne Zugriff auf deinen Rechner oder dein Relay.
  • Einen Webhook auf einen Dev-Server richten. Ein Dienst, der eine öffentliche Adresse braucht, kann die App aufrufen, die du gerade baust.

Diese Seite ist die Anleitung für Besitzer und Betreiber. Das Tool des Agents mit seinen Parametern, Ergebnissen und Grenzen ist unter preview beschrieben.

Ein Preview-Link ist öffentlich

Das Token im Link (128 Bit) ist der einzige Schutz. Wer den Link hat, erreicht die App ohne Anmeldung. Eine Preview von etwas mit echten Daten legt diese Daten wirklich offen. Schließ eine Preview, wenn du fertig bist.

Wie Previews vom Relay getrennt bleiben #

Previews liefert ein zweiter HTTP-Listener auf einem eigenen Port aus, veröffentlicht unter einem eigenen Hostnamen. Daraus folgt zweierlei:

  • Das Relay ist nicht auf diesem Port. Seine API, seine Web-App, seine Live-Verbindung und seine Teilen-Links sind dort nicht eingehängt. Preview-Verkehr kann sie nicht erreichen, weil es sie auf diesem Listener nicht gibt. Eine Preview anlegen oder schließen braucht das Zugriffstoken des Relays und geschieht nur auf dem eigenen Port des Relays.
  • Der Hostname ist ein anderer. Eine App in der Preview läuft in einem anderen Browser-Origin als das Relay. Ihr JavaScript kann dein Anmelde-Cookie für das Relay nicht mitschicken und den Speicher der Relay-Web-App nicht lesen.

Der Hostname muss sich unterscheiden, nicht nur der Port. Cookies ignorieren Ports, also würde relay.example.com:3334 das Anmelde-Cookie von relay.example.com teilen. Das Relay weigert sich, die Lane zu starten, wenn die Hostnamen übereinstimmen.

Zusätzlich leitet die Lane nie das Anmelde-Cookie des Relays (copilot_auth) oder einen Authorization-Header mit dem Zugriffstoken des Relays an eine App in der Preview weiter, auch nicht, wenn eine handgemachte Anfrage sie mitbringt. Der eigene Authorization-Header einer App geht durch.

Untereinander teilen sich Previews einen Hostnamen, jede unter ihrem eigenen Pfad. Siehe Was du beachten solltest.

Einrichten #

Previews sind aus, bis der Betreiber sie einrichtet. Es sind drei Schritte.

1. Ein Hostname #

Wähl einen Hostnamen, über den du verfügst und der sich im Namen von dem des Relays unterscheidet, zum Beispiel preview.example.com neben relay.example.com. Richte sein DNS auf deinen vorgelagerten Proxy oder Tunnel. Previews werden über den Pfad getrennt, nicht über Subdomains, also reicht ein einziger Hostname eine Ebene unter einer Zone, die du schon hast. Bei Cloudflare deckt das Universal-Zertifikat diesen Namen ab. Ein Wildcard über zwei Ebenen wie *.preview.example.com wäre nicht abgedeckt; deshalb gibt es keine Subdomain pro Preview.

2. Ein vorgelagerter Proxy #

Der Proxy leitet den Preview-Hostnamen an den Preview-Listener, der standardmäßig auf dem Port des Relays plus eins lauscht (3334, wenn das Relay 3333 nutzt). Nimm einen Port, den du mit previews.port festlegst; der Proxy braucht ein stabiles Ziel.

Caddy

preview.example.com {
    reverse_proxy 127.0.0.1:3334
}

Cloudflare Tunnel

Füge dem Tunnel, den du schon nutzt, einen zweiten öffentlichen Hostnamen hinzu (im Cloudflare-Dashboard unter Public Hostnames → Add oder in der config.yml des Tunnels):

ingress:
  - hostname: preview.example.com
    service: http://127.0.0.1:3334
  - hostname: relay.example.com
    service: http://127.0.0.1:3333
  - service: http_status:404

3. Der Block previews #

Füge den Block in die config.json des Relays ein und starte das Relay neu (siehe oar restart):

{
  "publicHostnames": ["relay.example.com"],
  "previews": {
    "enabled": true,
    "port": 3334,
    "bindHost": "127.0.0.1",
    "publicBaseUrl": "https://preview.example.com",
    "allowedTargetHosts": [],
    "maxLive": 8
  }
}
Key Was hineingehört
publicHostnames Jeder Hostname, unter dem das Relay selbst antwortet. Die Prüfung gegen publicBaseUrl nutzt diese Liste (und immer localhost und 127.0.0.1), ein Hostname, den du weglässt, wird also nicht geprüft.
previews.enabled true, um die Lane einzuschalten. Standardmäßig ist sie aus.
previews.port Der Port des Listeners. Standard: der Port des Relays plus eins. 0 wählt bei jedem Start einen freien Port, dem ein vorgelagerter Proxy nicht folgen kann.
previews.bindHost Wo der Listener bindet. Standard 127.0.0.1. Lass es auf Loopback: Der vorgelagerte Proxy läuft auf demselben Rechner.
previews.allowPublicBind Nur nötig, wenn bindHost nicht Loopback ist. Jede Preview ist dann ohne den Proxy aus dem Netzwerk erreichbar.
previews.publicBaseUrl Die öffentliche Adresse der Lane: https://preview.example.com. Aus ihr werden die Links gebaut.
previews.allowedTargetHosts Hosts außer diesem Rechner, auf die eine Port-Preview zeigen darf, etwa ein Container oder eine VM.
previews.maxLive Höchstzahl gleichzeitiger Previews für das ganze Relay. Standard 8.

Jeden Key, jeden Standardwert und jeden Sonderfall findest du in der Tabelle auf config.json.

Überschreiben per Umgebung #

COPILOT_PREVIEWS_ENABLED, COPILOT_PREVIEWS_PORT, COPILOT_PREVIEWS_BIND_HOST, COPILOT_PREVIEWS_PUBLIC_BASE_URL und COPILOT_PREVIEWS_ALLOWED_TARGET_HOSTS überschreiben die passenden Keys. Ihre Werte und was Vorrang vor was hat, stehen unter Umgebungsvariablen.

Wenn die Lane nicht startet #

Eine falsch eingerichtete Lane legt nie das Relay lahm. Das Relay läuft weiter, und die Lane bleibt aus. Keine dieser Prüfungen wird zu einer bloßen Warnung, weil jede die oben beschriebene Trennung schützt.

Grund Meldung
publicBaseUrl fehlt oder ist keine http(s)-Adresse previews.publicBaseUrl is required (an http(s) URL on a hostname of your own)
publicBaseUrl nutzt einen Hostnamen des Relays previews.publicBaseUrl must use a different hostname than the relay (got <hostname>)
Der Port liegt unter 1024 previews.port must be >= 1024 (got <port>)
Der Port ist der Port des Relays oder sein CLI-Port previews.port <port> collides with a relay port
Der Port lässt sich nicht ermitteln previews.port could not be resolved (set previews.port or config.port)
bindHost ist nicht Loopback previews.bindHost <address> is not loopback; set previews.allowPublicBind to override

Du siehst das an zwei Stellen:

  • Im Log des Relays, beim Start: eine Zeile PREVIEW LANE disabled: <message> pro gescheiterter Prüfung. Bestehen die Prüfungen, sagt das Log [preview] listener on http://127.0.0.1:3334 → https://preview.example.com. Wo das Log liegt: Dateien und Ordner.
  • In der Antwort auf eine Veröffentlichungsanfrage. Die API antwortet mit 503 und Preview lane failed its startup checks sowie den Meldungen in details. Das preview-Tool des Agents gibt das weiter, und der Agent wird angewiesen, es dir zu sagen. Ist previews.enabled nicht gesetzt, lautet die Antwort Preview lane is disabled (set previews.enabled and previews.publicBaseUrl), und das Log hat keine Zeile.

Settings → Previews (Einstellungen → Previews) und der Hinweis von /preview zeigen den Grund nicht. Der Einstellungs-Tab listet die vorhandenen Previews, und der Hinweis sagt nur, dass die Veröffentlichung gescheitert ist (siehe /preview). Schau ins Log des Relays.

Ist der Port von einem anderen Programm belegt, bestehen die Prüfungen, aber der Listener kann nicht binden. Das Log sagt dann PREVIEW LANE failed to bind :<port> — <reason>. Für die API ist die Lane aktiv, aber auf dem Preview-Port antwortet nichts, also öffnen sich die Links nicht. Gib den Port frei oder setz einen anderen previews.port.

Drei Wege zu veröffentlichen #

Den Agent bitten #

Sag, was du willst: „Starte den Dev-Server und gib mir einen Link“, „Zeig mir die gebaute Website“. Der Agent nutzt das preview-Tool oder, wo ein Provider kein Tool hat, die Preview-API des Relays. Er nennt dir den Link und dass der Link öffentlich ist. Welche Provider das Tool haben, steht in der Tabelle auf der Referenzseite.

/preview im Eingabebereich #

Der Befehl läuft in deinem Browser gegen das Relay. Er funktioniert mit jedem Provider und kostet keinen Agent-Turn. Er läuft, wenn nichts an die Nachricht angehängt ist. Der Hinweis erscheint in der Konversation.

Du tippst Was passiert
/preview 5173 web app Veröffentlicht Port 5173 mit dem Label „web app“. Gibt Preview published: <url> aus.
/preview ./dist built site Veröffentlicht den Ordner ./dist als statische Preview, Label „built site“. Das erste Wort ist der Ordner, er darf also kein Leerzeichen enthalten. Gibt Preview published: <url> aus.
/preview list Listet jede Preview des Relays, eine pro Zeile: die ersten 8 Zeichen des Tokens, das Label, den Port oder Ordner, — offline, falls sie es ist, und den Link. Gibt No live previews. aus, wenn es keine gibt, und The preview lane is disabled on this relay., wenn die Lane aus ist.
/preview close Schließt die Preview dieser Konversation. Gibt es keine, wird No live previews in this conversation. ausgegeben. Bei mehreren werden die Treffer ausgegeben, und der Befehl fragt nach einem längeren Präfix.
/preview close 3f9c Schließt die Preview, deren Token mit diesen 4 bis 32 Hex-Zeichen beginnt, in jeder Konversation. Gibt Preview closed: <label> aus. Ohne Treffer: No preview matches "3f9c".
/preview Gibt die Nutzungszeile aus, ebenso bei allem, was er nicht lesen kann.

Ein erstes Wort aus Ziffern ist immer ein Port, und ein Port außerhalb von 1 bis 65535 gibt die Nutzungszeile aus. Für einen Ordner namens 8080 tippe ./8080.

Scheitert die Veröffentlichung, ist der Hinweis bei jeder Ursache derselbe (ein falscher Port, ein Ordner außerhalb des Arbeitsordners, eine volle Lane, eine abgeschaltete Lane):

Preview failed — check the port/path, or whether the preview lane is enabled (Settings → Live previews).

Der genaue Grund wird nicht gezeigt. Die Liste steht unter Settings → Previews, unter der Überschrift Live previews (Live-Previews). Um den Grund zu sehen, ruf die API auf (unten) oder sieh in der Tabelle unter Fehlerbehebung nach. Ist das Relay nicht erreichbar, lautet der Hinweis Preview command failed — could not reach the relay. Das Befehlsmenü und seine Tasten stehen unter Eingabebereich.

Die API #

Alles oben nutzt dieselbe API auf dem Port des Relays. Sie braucht das Zugriffs-Token des Relays (authToken in config.json, dasselbe Token, mit dem du dich anmeldest) als Bearer-Token. Registriere zuerst, damit du den Basispfad kennst, und starte dann den Dev-Server darunter:

curl -sX POST http://127.0.0.1:3333/api/previews \
  -H "authorization: Bearer $RELAY_TOKEN" -H 'content-type: application/json' \
  -d '{"conversationId":"<conversation id>","port":5173,"label":"web app"}'
{
  "ok": true,
  "url": "https://preview.example.com/test_0123456789abcdef0123456789abcdef/",
  "basePath": "/test_0123456789abcdef0123456789abcdef/",
  "preview": { "token": "0123456789abcdef0123456789abcdef" },
  "existing": false
}

existing ist true, wenn die Konversation schon eine aktive Preview desselben Ports oder Ordners hatte und du diese zurückbekommen hast.

Anfrage Zweck
POST /api/previews port oder dir (nicht beides), optional conversationId, host, label.
GET /api/previews Alle Previews. ?conversationId= oder der Konversations-Header, den ein Session-Worker sendet, schränkt auf eine Konversation ein.
DELETE /api/previews/<token> Schließt eine. Der Dev-Server bleibt unberührt. Neu in 0.9.14 Eine Anfrage, die eine Konversation nennt (wie bei GET), darf nur die Previews dieser Konversation schließen; die einer anderen wird abgelehnt (403).

Eine App unter dem Pfad der Preview lauffähig machen #

Jede Preview liegt unter /test_<token>/ auf dem gemeinsamen Preview-Hostnamen. Die Regel, die aus dem folgt, was der Proxy tut:

  • Der Browser fragt nach /test_<token>/….
  • Die App bekommt den Pfad ohne dieses Präfix.
  • Also muss die App in ihre Seiten Links und Asset-URLs schreiben, die entweder das Präfix tragen oder relativ sind, und sie muss trotzdem auf Anfragen antworten, die es nicht tragen.

Was der Proxy unterwegs tut:

Der Proxy
Entfernt das Präfix Die App bekommt den Pfad nach /test_<token>, mit der Query. Ein Aufruf des nackten /test_<token> wird (301) auf dieselbe Adresse mit abschließendem Schrägstrich umgeleitet, damit relative URLs innerhalb der Preview aufgelöst werden.
Sendet X-Forwarded-Prefix Das Präfix ohne abschließenden Schrägstrich.
Sendet X-Forwarded-Host Den Host, den der Preview-Listener bekommen hat.
Sendet X-Forwarded-Proto Den, den der vorgelagerte Proxy gesendet hat; https, wenn er keinen gesendet hat.
Sendet X-Forwarded-For Die Adresse dessen, der sich mit dem Listener verbunden hat. Hinter einem vorgelagerten Proxy auf demselben Rechner ist das der Proxy.
Setzt Host Auf die eigene Adresse der App (127.0.0.1:5173), für Dev-Server, die ihn prüfen.
Schreibt Location um Eine Umleitung auf /x wird zu /test_<token>/x, ebenso eine absolute Umleitung auf die eigene Adresse der App. Eine Umleitung, die das Präfix schon trägt, eine mit //, eine relative oder eine auf eine andere Website bleibt unverändert.
Begrenzt Set-Cookie Das Cookie bekommt Path=/test_<token>/ und verliert Domain, sodass die Cookies einer Preview keine andere erreichen. Ein Cookie namens copilot_auth wird verworfen.
Markiert Antworten X-Robots-Tag: noindex, nofollow, noarchive, und er verwirft Service-Worker-Allowed.

Er schreibt nicht den Inhalt von Seiten, Stylesheets oder Skripten um. Eine App, die /assets/app.js in ihr HTML schreibt, fragt die Wurzel des Preview-Hostnamens, wo keine Preview liegt, und der Browser bekommt die Seite No such preview (404). Daran erkennst du, dass die App ihr Präfix nicht kennt.

Was funktioniert #

  • Relative URLs. Eine App, deren Seiten Adressen im Stil von ./assets/app.js nutzen, funktioniert, wie sie ist: Die Seite liegt unter /test_<token>/, also werden sie innerhalb der Preview aufgelöst. Das folgt aus der Arbeitsweise des Proxys; es wurde nicht pro Framework ausprobiert.
  • Das Präfix auslesen. Eine App, die auf Pfaden ohne Präfix routet und ihre Links aus X-Forwarded-Prefix baut, passt genau zur Regel.
  • Eine gebaute Website. Bau mit einer Basis, die relativ ist oder dem Präfix entspricht, und veröffentliche dann den Ausgabeordner als statische Preview. Anfragen nach /test_<token>/assets/… werden aus dem Ordner bedient, also funktionieren beide Arten von URL.

Was so nicht funktioniert #

Eine Tool-Einstellung, die die App nur auf Anfragen mit Präfix antworten lässt, passt nicht, weil der Proxy das Präfix entfernt.

  • Vite-Dev-Server mit base auf dem Präfix (--base). Geprüft am Quellcode von Vite 8.3.1 auf dem Rechner des Relays: Der Dev-Server bearbeitet nur Pfade, die mit base beginnen. Auf eine Anfrage nach / antwortet er mit einer Umleitung auf base, die der Proxy unverändert lässt, also dreht sich der Browser im Kreis. Andere Anfragen ohne Präfix bekommen ein 404, das sagt, der Server habe eine „public base URL“. Hot Reload lauscht nur auf dem Pfad unter base, zu dem die gekürzte Anfrage nicht passt. Nutze den Weg über die gebaute Website oder ein Vite-Setup, das von der Wurzel aus mit relativen URLs ausliefert.
  • Express mit dem Router auf dem Präfix eingehängt (app.use(prefix, router)). Die App bekommt /x, nicht /test_<token>/x, also passt das Einhängen nicht. Häng den Router auf / ein und bau Links aus X-Forwarded-Prefix.

Next.js (basePath, assetPrefix) und SvelteKit (kit.paths.base) werden in OARs eigenen Hinweisen für Agents genannt, aber diese Hinweise wurden nicht gegen das geprüft, was der Proxy tut, und keins der beiden Tools ist hier zum Testen verfügbar. Lässt ihre Basis-Einstellung die App das Präfix bei jeder Anfrage erwarten, passt sie aus demselben Grund nicht wie Vite. Nicht verifiziert: Probier es aus, bevor du dich darauf verlässt.

Zuerst veröffentlichen, wenn die App das Präfix braucht

Ein Agent ruft create auf, bevor er den Dev-Server startet, damit die App das Präfix bekommen kann, falls sie es braucht. Für eine App, die mit relativen URLs funktioniert, spielt die Reihenfolge keine Rolle.

Statische Previews #

Mit dir statt port liefert das Relay einen Ordner selbst aus. Nichts muss laufen; das passt für eine Build-Ausgabe, ein Mockup, eine einzelne HTML-Datei oder einen Coverage-Bericht.

  • Der Ordner wird vom Arbeitsordner der Konversation aus genommen (absolut oder relativ dazu) und muss darin liegen. Eine Preview, die ohne Konversation veröffentlicht wird, nutzt den eigenen Arbeitsordner des Relays. Das wird beim Veröffentlichen und bei jeder Anfrage geprüft, sodass ein später angelegter Symlink nicht hinausführen kann.
  • Für einen Ordnerpfad wird index.html ausgeliefert. Nichts wird gecacht.
  • Nie ausgeliefert: Dateien und Ordner, deren Name mit einem Punkt beginnt (.git, .env), und Schlüsseldateien (*.pem, *.key, Namen, die mit id_rsa, id_ed25519, id_ecdsa oder id_dsa beginnen).
  • Relative Asset-Pfade funktionieren. Ebenso solche, die mit dem Präfix der Preview beginnen. Wurzel-absolute (/assets/app.js) nicht.
  • Ein Ordner ohne index.html und jede fehlende Datei bekommen eine Seite Not found (404).
  • Eine statische Preview ist immer online und lehnt WebSocket-Verbindungen ab.

Previews verwalten #

  • Die Karte in der Leiste der Hintergrund-Tasks. Jede Preview der Konversation hat eine Karte mit ihrem Label, dem Port, einem Hinweis, dass der Link öffentlich ist, einem Badge online oder offline, sobald das Relay sie geprüft hat, und den Buttons Open (Öffnen), Copy link (Link kopieren) und Close (Schließen). Die Leiste ist unter Hintergrund-Tasks beschrieben.
  • Eine Link-Karte im Verlauf. Wird eine Preview veröffentlicht, während ein Turn der Konversation läuft, trägt die Antwort eine Link-Karte, egal ob der Agent oder du mit /preview sie veröffentlicht hat. Eine Preview, die zwischen Turns veröffentlicht wird, hat keine Karte im Verlauf. Ist die Preview weg, zeigt die Karte ein Badge closed und keinen Link. Eine geteilte Konversation zeigt die Karte nur mit ihrem Label, und jeder Preview-Link, der in ihrem Text zitiert ist, lautet [preview link removed].
  • Settings → Previews. Die Liste Live previews zeigt jede Preview des Relays aus allen Konversationen, mit den ersten 8 Zeichen der Konversations-ID und Neu in 0.9.11 wann sie veröffentlicht und zuletzt geöffnet wurde. Schließ hier eine, wenn du ihre Konversation verlassen hast. Siehe Settings.

offline und closed sind verschieden. Das Relay prüft jede Port-Preview alle 15 Sekunden, indem es versucht, sich mit dem Port zu verbinden (und einmal sofort beim Veröffentlichen). Antwortet nichts, zeigt die Karte ein Badge offline und den Hinweis „offline — dev server not responding“. Der Link bleibt gültig: Starte den Server wieder auf demselben Port, und derselbe Link funktioniert. closed heißt, die Preview ist weg und der Link führt nirgends mehr hin.

Eine Preview zu schließen, beendet nur den Link. Der Dev-Server läuft als der Hintergrund-Task weiter, der er ist.

Eine Preview läuft nicht von selbst ab. Sie endet, wenn du sie schließt, oder Neu in 0.9.11 wenn du ihre Konversation löschst (auch über einen Neuaufbau des Caches des Relays). Eine Konversation zu archivieren, lässt ihre Previews aktiv, in Settings → Previews.

Veröffentlichst du denselben Port oder Ordner in derselben Konversation noch einmal, bekommst du die schon aktive Preview zurück, mit demselben Link und unverändertem Label, statt einer neuen.

Höchstens 8 Previews sind gleichzeitig aktiv, für das ganze Relay (previews.maxLive). Die Ablehnung nennt die drei ältesten, jeweils mit dem Zeitpunkt der Veröffentlichung und des letzten Öffnens, und wie man sie schließt.

Nach einem Relay-Neustart Neu in 0.9.11 #

Previews überstehen einen Neustart des Relays, ein Update oder einen Absturz: Das Relay hält sie in seiner Datenbank und stellt sie beim Start wieder her, sodass ein Link, den du weitergegeben hast, weiter funktioniert. Jede wird vorher erneut geprüft und endet, wenn die Prüfung sie nicht mehr für gültig befindet:

  • eine Ordner-Preview, deren Ordner weg ist oder nicht mehr im Arbeitsordner ihrer Konversation liegt;
  • eine Port-Preview nach einem Neustart des Rechners: Der Dev-Server ist weg, und der Port gehört später vielleicht etwas anderem;
  • eine Preview, deren Konversation nicht mehr existiert.

Linux und macOS melden einen Neustart zuverlässig. Unter Windows zählt Restart (Neu starten) als einer, aber mit eingeschaltetem fast startup (Schnellstart; Windows-Standard) zählt Shut down (Herunterfahren) und Wiedereinschalten nicht: Eine Port-Preview von vorher kommt zurück und erreicht dann, was auch immer auf ihrem Port lauscht. Schließ Previews, die du nicht mehr brauchst.

Eine Prüfung, die keine Antwort geben kann, weil die Datenbank beschäftigt ist oder der Ordner aus einem anderen Grund als seinem Verschwinden nicht lesbar ist, beendet die Preview nicht. Sie wird solange nicht ausgeliefert: Settings → Previews und list des Tools zeigen sie als nicht ausgeliefert (unverified), sie zählt zum Limit, und sie lässt sich schließen. Das Relay prüft sie alle 15 Sekunden erneut und liefert sie wieder unter ihrem Link aus, sobald die Prüfung eine Antwort gibt; denselben Port oder Ordner in ihrer Konversation erneut zu veröffentlichen, bewirkt das sofort. Nach zehn Minuten ohne Antwort endet die Preview, und das Log sagt es.

Eine Port-Preview wird außerdem gleich nach dem Start einmal geprüft, damit ihr Badge online oder offline aktuell ist. Das Log des Relays nennt eine Preview mit einem kurzen Hash, nie mit ihrem Token. Siehe auch Was ein Neustart behält und was er verliert.

WebSockets #

Eine Port-Preview reicht WebSocket-Verbindungen unter demselben Präfix durch, mit entferntem Präfix wie bei jeder Anfrage, sodass die eigenen Sockets einer App funktionieren, wenn sich der Browser über den Preview-Link verbindet. (Hot Reload ist Sache der App: siehe den Vite-Hinweis oben.) Eine statische Preview sowie ein unbekannter oder geschlossener Link beantworten eine WebSocket-Anfrage mit 404. Antwortet die App auf das Upgrade mit einer gewöhnlichen Antwort, bekommt der Browser diesen Status. Ist die App nicht erreichbar, 502.

Was du beachten solltest #

  • Previews teilen sich untereinander einen Origin. Cookies sind auf den Pfad jeder Preview begrenzt, und die Tokens lassen sich nicht erraten, aber zwei Previews sind nicht so streng voneinander getrennt wie jede vom Relay.
  • Standardmäßig nur dein eigener Rechner. Eine Port-Preview darf nur auf Loopback-Adressen zeigen, plus die Hosts in previews.allowedTargetHosts. Die eigenen Ports des Relays werden immer abgelehnt, weil deren Veröffentlichung die Anmeldeseite des Relays auf den öffentlichen Hostnamen stellen würde.
  • Das Relay betreibt die App nicht. Es startet einen Dev-Server nie und startet ihn nie neu. Hält der Server an, wechselt die Karte auf offline.

Nach Provider #

Previews sehen bei jedem Provider gleich aus; nur der Weg, auf dem ein Agent veröffentlicht, unterscheidet sich, wie die Referenzseite zeigt. /preview und Settings → Previews funktionieren mit allen.

Fehlerbehebung #

Was du siehst Ursache und Lösung
Der Agent oder die API antwortet Preview lane is disabled oder Preview lane failed its startup checks (503) Die Lane ist aus oder hat den Start verweigert. Lies die Zeilen PREVIEW LANE disabled im Log des Relays, korrigiere previews und starte das Relay neu. Siehe Wenn die Lane nicht startet.
Der Link zeigt eine Seite Preview upstream unreachable (502) Auf dem Port lauscht nichts, oder die Verbindung ist gescheitert. Starte den Dev-Server wieder auf demselben Port und lade neu; der Link bleibt gültig.
Assets fehlen oder die Seite ist leer, und Anfragen nach /assets/... bekommen No such preview (404) Die App schreibt wurzel-absolute Pfade. Lass sie relative URLs oder URLs mit Präfix ausgeben (Regel).
Die Seite lädt in einer Schleife, oder die App antwortet mit 404 und einem Hinweis auf eine „public base URL“ Die App erwartet das Präfix bei jeder Anfrage, aber der Proxy entfernt es (was nicht funktioniert).
No such preview auf dem ganzen Link Der Link ist unbekannt oder geschlossen, seine Konversation wurde gelöscht, oder ein Neustart hat ihn als nicht mehr gültig befunden (nach einem Neustart). Veröffentliche erneut.
Eine Preview erscheint als nicht ausgeliefert (unverified) Das Relay konnte sie bei seinem Start nicht prüfen. Sie wird alle 15 Sekunden erneut geprüft; dasselbe Ziel in ihrer Konversation erneut zu veröffentlichen, holt sie sofort zurück.
Der Link öffnet sich überhaupt nicht Der vorgelagerte Proxy oder das DNS ist nicht eingerichtet, oder der Listener konnte seinen Port nicht binden (PREVIEW LANE failed to bind im Log).
Die Karte sagt offline Der Dev-Server antwortet nicht mehr. Starte ihn wieder auf demselben Port.
Too many live previews (max 8); previews stay until closed. Oldest: … (429) Schließ eine in Settings → Previews, mit /preview close oder mit DELETE /api/previews/<token>; ein Agent kann die seiner eigenen Konversation mit der Aktion close des Tools schließen; oder erhöhe previews.maxLive.
Port <n> belongs to the relay and cannot be previewed (400) Du hast den Port des Relays, seinen CLI-Port oder den Preview-Port angegeben. Veröffentliche den Port des Dev-Servers.
Target port must be between 1024 and 65535 (400) Nimm einen höheren Port.
Target host ... is not loopback and not in previews.allowedTargetHosts (400) Füge den Host zu previews.allowedTargetHosts hinzu.
dir must live inside the workspace root (...), Directory not found: ... oder Not a directory: ... (400) Der Ordner muss existieren und im Arbeitsordner der Konversation liegen.