Zum Inhalt

Die Desktop-App

AgenticOS läuft im Browser, und so nutzen es die meisten. Die Desktop-App ist ein Zusatz für alle, die es im Dock haben wollen: die Konsole in einem eigenen Fenster, dazu ein Haustier und ein Screenshot-Kürzel. Nichts an der Plattform braucht sie.

Amigo, das Desktop-Haustier, sagt: No more caramba.

Amigo, eines von fünf Haustieren. No more caramba in your AI.

Die Anwendung im Fenster ist dieselbe Next.js-Konsole, die der Server ohnehin ausliefert, vom Server geladen, also trägt sie dieselbe Anmeldung, dieselben Berechtigungen und dieselben Mandantenprüfungen wie ein Browser-Tab.

Es ist eine Tauri-Hülle in desktop/, und sie hält genau eine Einstellung: die Adresse des Servers. Der erste Start fragt danach, "Shell → Change server…" fragt erneut, und alles dazwischen ist die Konsole.

Es ist eine Hülle, kein Build des Frontends

frontend/ ist eine Next.js-Anwendung mit einer Serverhälfte - neunzig und mehr Route-Handler, die zum Backend proxen, Session-Cookies, die sie setzen, Middleware, die die Locale wählt, und serverseitig gerenderte Seiten. Nichts davon läuft in einer Desktop-Binärdatei, also versucht es die Hülle gar nicht: sie öffnet die URL des Deployments so, wie ein Browser es täte. Ein Deployment ist das, was Sie installieren; die App ist, wie Sie es öffnen.

Sie ausführen

Rust von rustup und die Webview der Plattform - WebKit unter macOS, WebView2 unter Windows, WebKitGTK unter Linux - sind die Voraussetzungen; Tauris eigene Seite zu den Voraussetzungen hat die Liste pro Plattform. Die Tauri-CLI ist in desktop/package.json festgelegt, und make install holt sie mit allem anderen.

make desktop-dev     # opens the shell; type the address of a console
make desktop-build   # a .app / .dmg, .msi or .deb/.AppImage for this machine
make desktop-check   # rustfmt, clippy with warnings denied, and the tests

Beim ersten Mal zeigt das Fenster ein Formular mit der Frage, wo der Server ist, vorbelegt mit http://localhost:3000 - einem make dev-Stack. Ein bloßer Host (agenticos.acme.com) wird über HTTPS geöffnet. Alles, was keine Webadresse ist, wird im Formular abgelehnt.

Schlichtes http:// gilt nur für diese Maschine

localhost, 127.0.0.1 und ::1 dürfen im Klartext erreicht werden; jeder andere Host wird abgelehnt, bis er https:// ist. Die Konsole schickt das Passwort und bekommt das Token über diese Verbindung zurück, und ein LAN ist genau der Ort, an dem jemand anderes mitlesen kann.

Eine Adresse, auf der nichts antwortet, wird ebenfalls abgelehnt: die Hülle öffnet eine TCP-Verbindung, bevor sie die Webview irgendwohin zeigen lässt, denn WebKit malt eine abgewiesene Verbindung als leeres weißes Fenster. Dieselbe Probe läuft bei jedem Start, sodass ein Stack, der unten ist, Sie mit der Begründung zurück auf das Formular bringt statt vor ein leeres Fenster.

Die Antwort wird als server.json im Konfigurationsverzeichnis der Plattform für die App abgelegt - ~/Library/Application Support/co.vstorm.agenticos/ unter macOS, %APPDATA%\\co.vstorm.agenticos\\ unter Windows, ~/.config/co.vstorm.agenticos/ unter Linux - und bei jedem Start erneut gelesen.

Eine Datei, die sich nicht mehr parsen lässt - ein Tippfehler beim Bearbeiten von Hand - wird beim nächsten Start als server.json.invalid beiseitegelegt, und das Verbindungsformular speichert eine frische.

Eine falsche Adresse wird auf vier Wegen korrigiert, je nachdem welcher am nächsten liegt: Settings… (⌘,, auch am Tray-Symbol und im Rechtsklick-Menü des Haustiers, sodass es selbst dann erreichbar ist, wenn das Fenster die falsche Seite zeigt), Shell → Change server…, Bearbeiten dieser Datei, oder Start mit --server http://localhost:3000 aus einem Terminal, was sie ebenfalls speichert.

Das Haustier

Ein kleines Pixel-Art-Wesen in einem eigenen transparenten Fenster, das immer obenauf liegt: es sitzt auf dem Desktop, während die Konsole offen, minimiert oder geschlossen ist, so wie die Haustiere von Codex. Ziehen Sie es irgendwohin; klicken Sie es an, und es winkt; doppelklicken Sie es, und es hüpft und holt die Konsole nach vorn, wobei es sie wieder öffnet, falls Sie das Fenster geschlossen hatten. Sich selbst überlassen döst es vor sich hin, schaut sich um, schlendert ein Stück über den Bildschirm und dreht am Rand um, und hin und wieder nickt es ein.

Fahren Sie darüber, und über seinem Kopf erscheint eine Schaltfläche + New chat; sie setzt die Konsole auf eine frische Unterhaltung und öffnet das Fenster, falls es geschlossen war. Klicken Sie es an, und es sagt etwas, in einer Sprechblase, mit eigener Stimme. Streicheln Sie es - den Cursor ein paar Mal hin und her darüber - und es schließt die Augen, und ein Herz steigt auf. Während es herumsteht, folgen seine Augen dem Cursor. Nach Einbruch der Dunkelheit döst es dort, wo es sonst geschlendert wäre. Nach einem Zug abgesetzt, landet es mit einem kleinen Hüpfer.

Rechtsklick auf das Haustier öffnet sein Menü: ein neuer Chat, die Konsole, welches Haustier es ist und ob es angezeigt wird. Dasselbe Menü liegt am Tray-Symbol (dem Menüleisten-Extra unter macOS) und unter Pet in der Menüleiste, und alle drei sind ein einziger Satz von Einträgen, sodass ein Haken, der an einer Stelle geändert wird, auch an den anderen geändert ist.

Show pet (Cmd/Ctrl+Shift+P) räumt es weg und holt es zurück; dasselbe Menü wählt, welches Haustier es ist - Orbit, ein rundes mit Antenne; Boxy, ein Terminal auf Beinen; Ghost, das schwebt; Sprout, ein Samen mit einem Blatt; Amigo, mit Sombrero und Schnurrbart, für no more caramba in your AI. Wo es zurückgelassen wurde, ob es angezeigt wird und welches Haustier es ist, liegt neben der Serveradresse, sodass das Haustier beim nächsten Start dort ist, wo Sie es hingesetzt haben. Unter der Einstellung des Betriebssystems für reduzierte Bewegung steht es still und bleibt ziehbar.

Die Grafik wird zur Laufzeit in desktop/ui/pet-sprites.js zusammengesetzt: jedes Haustier ist ein Körper und eine Beschreibung, wo Augen, Füße und Arm sitzen, und jede Animation sind ein paar Zeilen Positionen, die sich alle fünf teilen, statt eines Sprite-Sheets pro Haustier. Was jedes sagt, steht in pet-lines.js; das Verhalten und jede Regel darüber, wann ein Streicheln zählt oder wohin die Augen zeigen, steht in pet-engine.js, rein und getestet. Sein eigenes Fenster ist das, was es zu einem Haustier statt zu einem Widget macht, und was es kostet: macOSPrivateApi in tauri.conf.json, weil ein transparentes Fenster unter macOS das braucht, was den Mac App Store ausschließt - kein Ort, an den eine selbst gehostete Konsole ohnehin wollte.

Es weiß noch nicht, was die Agents tun

Das Haustier von Codex trägt eine Sprechblase, die sagt, dass ein Run läuft oder eine Freigabe wartet. Unseres kann das noch nicht: die Konsole ist eine entfernte Seite ohne IPC in die Hülle, und ihr eine zu geben bedeutet eine Capability mit remote-URLs plus einen Hook im Frontend, der Aktivität meldet. Das ist die Nacharbeit; das Haustier hier ist Gesellschaft, keine Statuslampe.

Screenshot in einen neuen Chat

Drücken Sie das Kürzel - standardmäßig ⌘⇧A, wo immer Sie sind - und das Fadenkreuz von Cmd+Shift+4 erscheint. Wählen Sie einen Bereich, und die Konsole kommt in einem frischen Chat nach vorn, mit dem Bild bereits angehängt, bereit für die Frage. Escape bricht ab. Dieselbe Aktion liegt im Menü des Haustiers und am Tray-Symbol.

Settings… (⌘,, unter Shell, am Tray-Symbol und im Rechtsklick-Menü des Haustiers) legt es neu: Feld anklicken, die Modifikatoren halten und eine Taste drücken. Eine Kombination braucht mindestens einen Modifikator - ein globales Kürzel auf einem bloßen Buchstaben würde das Tippen in jeder Anwendung verschlucken - und eine, die eine andere Anwendung bereits hält, wird abgelehnt, wobei die alte Belegung erhalten bleibt. Clear schaltet es aus. Belegungen liegen neben der Serveradresse. Eine Belegung, die beim Start nicht genommen werden konnte, weil eine andere Anwendung zuerst da war, wird auf derselben Seite benannt, sodass sie ersetzt werden kann, statt dort belegt auszusehen.

Zwei Modifikatoren allein können kein Kürzel sein

Linke Command-Taste plus rechte Command-Taste ist ein Akkord, keine Taste: die Hotkey-Registrierung des Betriebssystems, die die Hülle nutzt, braucht eine Taste, die kein Modifikator ist, in der Kombination. Einen Akkord aus reinen Modifikatoren zu erkennen bedeutet einen Accessibility-Event-Tap, der jeden Tastendruck beobachtet, und jeden Nutzer darum zu bitten, das zu gewähren. Nicht in dieser Version.

Der erste Druck fragt macOS, ob AgenticOS den Bildschirm aufzeichnen darf. Solange das nicht erlaubt ist, kann nichts aufgenommen werden - das Werkzeug des Systems beendet sich still ohne Fadenkreuz - also prüft die Hülle zuerst, öffnet Systemeinstellungen → Privacy & Security → Screen Recording, und das Haustier sagt "Allow screen recording, then restart me." Die Erlaubnis geht an die verantwortliche Anwendung: das AgenticOS-Bundle, sobald es paketiert ist, aber unter make desktop-dev an das Terminal, aus dem die Binärdatei gestartet wurde, oder an die IDE, die sie beherbergt - und die ist es, die in dieser Liste anzuhaken ist. Eine Erlaubnis wirkt nach einem Neustart.

Das Bild erreicht den Composer so, wie es eine ausgewählte Datei tut: die Hülle führt ein Skript in der Konsolenseite aus, das das PNG an das Datei-Eingabefeld des Composers übergibt, sodass Upload, Größenbegrenzung und Vorschau die der Konsole selbst sind. Es wird nur an die Chat-Seite auf dem Origin des konfigurierten Servers übergeben - nie an eine andere Seite, zu der das Fenster abgewandert sein mag - und nur innerhalb von zwei Minuten nach dem Druck; eine Aufnahme, die nirgendwo ankam, wird verworfen. Für Windows und Linux ist noch keine Aufnahme verdrahtet.

Was sie bewusst nicht tut

  • Keine lokale Ausführung. Die Hülle hat über eine einzige JSON-Datei hinaus keinen Zugriff auf die Maschine. Ein Agent, der Befehle auf dem Laptop ausführt, von dem aus er geöffnet wurde, ist ein anderes Feature mit einem anderen Berechtigungsmodell - eine dritte Art von Sandbox-Verbindung neben Docker und Daytona, an die Maschine einer Person gebunden statt an die Organisation - und dieses ist es nicht.
  • Kein Offline-Modus. Ist der Server nicht erreichbar, zeigt das Fenster die eigene Fehlerseite der Webview; "Shell → Reload" versucht es erneut.
  • Keine Navigationssperre. Ein Link, der den Origin des Servers verlässt, öffnet sich im Fenster statt im Systembrowser, denn ein OAuth-Ablauf - Anmelden, einen MCP-Server verbinden - verlässt den Origin und muss zu derselben Webview zurückkommen, damit sein Cookie landet. Solange das Fenster eine andere Seite zeigt, nennt sein Titel diesen Host - das eine Stück Chrom, das eine Seite nicht malen kann, da es keine Adressleiste gibt - und ⌘, oder "Shell → Change server…" ist der Weg zurück, wenn eine Seite keinen Link nach Hause hat. Diese Abläufe in den Systembrowser zu verlegen ist #1532.
  • Die Anmeldung bleibt im Fenster, und das Fenster sagt, es sei Safari. WebKits nackter User Agent ist das, was Google als eingebetteten Browser ablehnt (disallowed_useragent); das Konsolenfenster trägt Safaris Versions-Token auf derselben Engine, sodass die Google-Anmeldung funktioniert. Die Übergabe, die Google bevorzugt - der Systembrowser und ein Deep Link zurück - braucht einen einmaligen Austausch, den das Backend noch nicht hat, und ist #1532.

Wo sie im Baum liegt

desktop/ui/ ist das Verbindungsformular und das Haustier, statische Dateien ohne Build-Schritt; bun test führt dort die Sprite- und Verhaltenstests des Haustiers aus. desktop/src-tauri/ ist die Rust-Seite: die Befehle, die die beiden Seiten aufrufen, die beiden Fenster und das Menü. desktop-check ist weder Teil von make lint noch von make check: die CI hat noch keine Rust-Toolchain, und tests/test_ci_parity.py würde ein check ablehnen, das einen Schritt ausführt, den die CI nicht ausführt. Führen Sie es aus, bevor Sie eine Änderung unter desktop/ pushen.

Zusammenfassung

  • Die Konsole bleibt auf dem Server. Die Hülle öffnet sie; nichts wird mitgeliefert.
  • Eine Datei mit Einstellungen. Die Serveradresse, einmal erfragt, und wo das Haustier zurückgelassen wurde, beides über das Menü änderbar.
  • Ein Screenshot ist ein Kürzel entfernt. ⌘⇧A, ein Bereich, ein frischer Chat mit dem Bild daran; neu belegt unter Settings (⌘,).
  • Noch nichts Lokales. Lokale Ausführung ist eine Art von Sandbox-Verbindung, die zu entwerfen ist, und kein Schalter an dieser Hülle.