One approval for app and agent; /api/v2 files and show; app_api 2

- The app's device login asks for `app models` and, where discovery says
  login.device.agent_scope, `agent_scope=models memory link` in the same
  approval. The agent's token goes to the bundled CLI on stdin
  (`lembas login --token-stdin --server <url> --json`) and is never kept
  here; if the CLI does not take it, it is given up on the server. A
  computer linked already keeps its link; a server without agent_scope
  gets the old two steps.
- The server pane reads GET /api/v2/files and /files/content (mounts open
  like folders; `withheld` shown in the server's words). The "not offered
  yet" state is gone.
- A show card's file comes from GET /api/v2/chats/{chat}/show?node=&version=
  or ?shown= as plain text (new `api_text` command, 1 MB cap); args.path is
  read only for agent chats on this computer, locally.
- The gate is link protocol 3 plus app_api 2 (APP_API = 2), not the
  server's version number, which says 1.7.2 on dev until its first beta.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
HomerandClaude Opus 5.5 committed 2026-11-03 14:48:00 +00:00
1 parent b82d4c688a
commit ab0c1434c4
9 files changed
+383 -164

No files matched your search

+9 -9
View File
@@ -88,7 +88,6 @@ KEYS = (
"Empty folder",
"No project folder yet: the agent can open nothing on this computer.",
"Add folder…",
"This server does not offer its files to the app yet.",
# list.js
"No agent chat yet. Start one: it works in a folder on this computer.",
"No chat yet.",
@@ -145,6 +144,7 @@ KEYS = (
"Try again",
"Sign in",
"The app signs in to your server once, in your browser, as any device does. It may then read and write your chats, as the web interface does.",
"The app signs in to your server once, in your browser, as any device does. It may then read and write your chats, as the web interface does, and the same approval links this computer for the agent.",
"Open the page again",
"Cancel",
"Waiting for the browser…",
@@ -212,7 +212,6 @@ OWN: dict[str, dict[str, str]] = {
"Empty folder": "Prázdná složka",
"No project folder yet: the agent can open nothing on this computer.": "Zatím žádná složka projektu: agent na tomto počítači nemůže nic otevřít.",
"Add folder…": "Přidat složku…",
"This server does not offer its files to the app yet.": "Tento server zatím nenabízí své soubory aplikaci.",
"No agent chat yet. Start one: it works in a folder on this computer.": "Zatím žádná agentní konverzace. Začněte ji: pracuje ve složce na tomto počítači.",
"No chat yet.": "Zatím žádná konverzace.",
"Other devices": "Jiná zařízení",
@@ -256,6 +255,7 @@ OWN: dict[str, dict[str, str]] = {
"Connect": "Připojit",
"Address of your LLeMbas server": "Adresa vašeho serveru LLeMbas",
"The app signs in to your server once, in your browser, as any device does. It may then read and write your chats, as the web interface does.": "Aplikace se k vašemu serveru přihlásí jednou, ve vašem prohlížeči, jako každé zařízení. Pak může číst a psát vaše konverzace, jako webové rozhraní.",
"The app signs in to your server once, in your browser, as any device does. It may then read and write your chats, as the web interface does, and the same approval links this computer for the agent.": "Aplikace se k vašemu serveru přihlásí jednou, ve vašem prohlížeči, jako každé zařízení. Pak může číst a psát vaše konverzace, jako webové rozhraní, a stejné schválení propojí tento počítač pro agenta.",
"Open the page again": "Otevřít stránku znovu",
"Waiting for the browser…": "Čeká se na prohlížeč…",
"agent off": "agent vypnutý",
@@ -313,7 +313,6 @@ OWN: dict[str, dict[str, str]] = {
"Empty folder": "Leerer Ordner",
"No project folder yet: the agent can open nothing on this computer.": "Noch kein Projektordner: Der Agent kann auf diesem Computer nichts öffnen.",
"Add folder…": "Ordner hinzufügen…",
"This server does not offer its files to the app yet.": "Dieser Server bietet der App seine Dateien noch nicht an.",
"No agent chat yet. Start one: it works in a folder on this computer.": "Noch kein Agenten-Chat. Starten Sie einen: Er arbeitet in einem Ordner auf diesem Computer.",
"No chat yet.": "Noch kein Chat.",
"Other devices": "Andere Geräte",
@@ -357,6 +356,7 @@ OWN: dict[str, dict[str, str]] = {
"Connect": "Verbinden",
"Address of your LLeMbas server": "Adresse Ihres LLeMbas-Servers",
"The app signs in to your server once, in your browser, as any device does. It may then read and write your chats, as the web interface does.": "Die App meldet sich einmal an Ihrem Server an, in Ihrem Browser, wie jedes Gerät. Danach kann sie Ihre Chats lesen und schreiben, wie die Weboberfläche.",
"The app signs in to your server once, in your browser, as any device does. It may then read and write your chats, as the web interface does, and the same approval links this computer for the agent.": "Die App meldet sich einmal an Ihrem Server an, in Ihrem Browser, wie jedes Gerät. Danach kann sie Ihre Chats lesen und schreiben, wie die Weboberfläche, und dieselbe Freigabe verbindet diesen Computer für den Agenten.",
"Open the page again": "Seite erneut öffnen",
"Waiting for the browser…": "Warte auf den Browser…",
"agent off": "Agent aus",
@@ -414,7 +414,6 @@ OWN: dict[str, dict[str, str]] = {
"Empty folder": "Carpeta vacía",
"No project folder yet: the agent can open nothing on this computer.": "Aún no hay carpeta de proyecto: el agente no puede abrir nada en este equipo.",
"Add folder…": "Añadir carpeta…",
"This server does not offer its files to the app yet.": "Este servidor aún no ofrece sus archivos a la aplicación.",
"No agent chat yet. Start one: it works in a folder on this computer.": "Aún no hay chats de agente. Inicie uno: trabaja en una carpeta de este equipo.",
"No chat yet.": "Aún no hay chats.",
"Other devices": "Otros dispositivos",
@@ -458,6 +457,7 @@ OWN: dict[str, dict[str, str]] = {
"Connect": "Conectar",
"Address of your LLeMbas server": "Dirección de su servidor LLeMbas",
"The app signs in to your server once, in your browser, as any device does. It may then read and write your chats, as the web interface does.": "La aplicación inicia sesión en su servidor una vez, en su navegador, como cualquier dispositivo. Después puede leer y escribir sus chats, como la interfaz web.",
"The app signs in to your server once, in your browser, as any device does. It may then read and write your chats, as the web interface does, and the same approval links this computer for the agent.": "La aplicación inicia sesión en su servidor una vez, en su navegador, como cualquier dispositivo. Después puede leer y escribir sus chats, como la interfaz web, y la misma aprobación vincula este ordenador para el agente.",
"Open the page again": "Abrir la página de nuevo",
"Waiting for the browser…": "Esperando al navegador…",
"agent off": "agente apagado",
@@ -515,7 +515,6 @@ OWN: dict[str, dict[str, str]] = {
"Empty folder": "Dossier vide",
"No project folder yet: the agent can open nothing on this computer.": "Aucun dossier de projet pour l'instant : l'agent ne peut rien ouvrir sur cet ordinateur.",
"Add folder…": "Ajouter un dossier…",
"This server does not offer its files to the app yet.": "Ce serveur n'offre pas encore ses fichiers à l'application.",
"No agent chat yet. Start one: it works in a folder on this computer.": "Aucune discussion d'agent pour l'instant. Commencez-en une : elle travaille dans un dossier de cet ordinateur.",
"No chat yet.": "Aucune discussion pour l'instant.",
"Other devices": "Autres appareils",
@@ -559,6 +558,7 @@ OWN: dict[str, dict[str, str]] = {
"Connect": "Se connecter",
"Address of your LLeMbas server": "Adresse de votre serveur LLeMbas",
"The app signs in to your server once, in your browser, as any device does. It may then read and write your chats, as the web interface does.": "L'application se connecte une fois à votre serveur, dans votre navigateur, comme tout appareil. Elle peut ensuite lire et écrire vos discussions, comme l'interface web.",
"The app signs in to your server once, in your browser, as any device does. It may then read and write your chats, as the web interface does, and the same approval links this computer for the agent.": "L'application se connecte une fois à votre serveur, dans votre navigateur, comme tout appareil. Elle peut ensuite lire et écrire vos discussions, comme l'interface web, et la même approbation relie cet ordinateur pour l'agent.",
"Open the page again": "Rouvrir la page",
"Waiting for the browser…": "En attente du navigateur…",
"agent off": "agent arrêté",
@@ -616,7 +616,6 @@ OWN: dict[str, dict[str, str]] = {
"Empty folder": "Üres mappa",
"No project folder yet: the agent can open nothing on this computer.": "Még nincs projektmappa: az ügynök semmit sem nyithat meg ezen a számítógépen.",
"Add folder…": "Mappa hozzáadása…",
"This server does not offer its files to the app yet.": "Ez a szerver még nem kínálja fel a fájljait az alkalmazásnak.",
"No agent chat yet. Start one: it works in a folder on this computer.": "Még nincs ügynökcsevegés. Indítson egyet: egy mappában dolgozik ezen a számítógépen.",
"No chat yet.": "Még nincs csevegés.",
"Other devices": "Más eszközök",
@@ -660,6 +659,7 @@ OWN: dict[str, dict[str, str]] = {
"Connect": "Csatlakozás",
"Address of your LLeMbas server": "A LLeMbas-kiszolgáló címe",
"The app signs in to your server once, in your browser, as any device does. It may then read and write your chats, as the web interface does.": "Az alkalmazás egyszer jelentkezik be a szerverére, a böngészőjében, mint bármely eszköz. Ezután olvashatja és írhatja a csevegéseit, mint a webes felület.",
"The app signs in to your server once, in your browser, as any device does. It may then read and write your chats, as the web interface does, and the same approval links this computer for the agent.": "Az alkalmazás egyszer jelentkezik be a szerverére, a böngészőjében, mint bármely eszköz. Ezután olvashatja és írhatja a csevegéseit, mint a webes felület, és ugyanez a jóváhagyás összekapcsolja ezt a számítógépet az ügynök számára.",
"Open the page again": "Oldal újbóli megnyitása",
"Waiting for the browser…": "Várakozás a böngészőre…",
"agent off": "ügynök kikapcsolva",
@@ -717,7 +717,6 @@ OWN: dict[str, dict[str, str]] = {
"Empty folder": "Cartella vuota",
"No project folder yet: the agent can open nothing on this computer.": "Nessuna cartella di progetto ancora: l'agente non può aprire nulla su questo computer.",
"Add folder…": "Aggiungi cartella…",
"This server does not offer its files to the app yet.": "Questo server non offre ancora i suoi file all'app.",
"No agent chat yet. Start one: it works in a folder on this computer.": "Nessuna chat con agente ancora. Ne inizi una: lavora in una cartella di questo computer.",
"No chat yet.": "Nessuna chat ancora.",
"Other devices": "Altri dispositivi",
@@ -761,6 +760,7 @@ OWN: dict[str, dict[str, str]] = {
"Connect": "Connetti",
"Address of your LLeMbas server": "Indirizzo del tuo server LLeMbas",
"The app signs in to your server once, in your browser, as any device does. It may then read and write your chats, as the web interface does.": "L'app accede al suo server una volta, nel suo browser, come ogni dispositivo. Poi può leggere e scrivere le sue chat, come l'interfaccia web.",
"The app signs in to your server once, in your browser, as any device does. It may then read and write your chats, as the web interface does, and the same approval links this computer for the agent.": "L'app accede al suo server una volta, nel suo browser, come ogni dispositivo. Poi può leggere e scrivere le sue chat, come l'interfaccia web, e la stessa approvazione collega questo computer per l'agente.",
"Open the page again": "Riapri la pagina",
"Waiting for the browser…": "In attesa del browser…",
"agent off": "agente spento",
@@ -818,7 +818,6 @@ OWN: dict[str, dict[str, str]] = {
"Empty folder": "Pusty folder",
"No project folder yet: the agent can open nothing on this computer.": "Jeszcze nie ma folderu projektu: agent nie może niczego otworzyć na tym komputerze.",
"Add folder…": "Dodaj folder…",
"This server does not offer its files to the app yet.": "Ten serwer nie udostępnia jeszcze swoich plików aplikacji.",
"No agent chat yet. Start one: it works in a folder on this computer.": "Jeszcze nie ma czatu z agentem. Zacznij go: pracuje w folderze na tym komputerze.",
"No chat yet.": "Jeszcze nie ma czatu.",
"Other devices": "Inne urządzenia",
@@ -862,6 +861,7 @@ OWN: dict[str, dict[str, str]] = {
"Connect": "Połącz",
"Address of your LLeMbas server": "Adres Twojego serwera LLeMbas",
"The app signs in to your server once, in your browser, as any device does. It may then read and write your chats, as the web interface does.": "Aplikacja loguje się do Twojego serwera raz, w przeglądarce, jak każde urządzenie. Potem może czytać i pisać Twoje czaty, jak interfejs WWW.",
"The app signs in to your server once, in your browser, as any device does. It may then read and write your chats, as the web interface does, and the same approval links this computer for the agent.": "Aplikacja loguje się do Twojego serwera raz, w przeglądarce, jak każde urządzenie. Potem może czytać i pisać Twoje czaty, jak interfejs WWW, a to samo zatwierdzenie łączy ten komputer dla agenta.",
"Open the page again": "Otwórz stronę ponownie",
"Waiting for the browser…": "Czekam na przeglądarkę…",
"agent off": "agent wyłączony",
@@ -919,7 +919,6 @@ OWN: dict[str, dict[str, str]] = {
"Empty folder": "Prázdny priečinok",
"No project folder yet: the agent can open nothing on this computer.": "Zatiaľ žiadny priečinok projektu: agent na tomto počítači nemôže nič otvoriť.",
"Add folder…": "Pridať priečinok…",
"This server does not offer its files to the app yet.": "Tento server zatiaľ neponúka svoje súbory aplikácii.",
"No agent chat yet. Start one: it works in a folder on this computer.": "Zatiaľ žiadna agentská konverzácia. Začnite ju: pracuje v priečinku na tomto počítači.",
"No chat yet.": "Zatiaľ žiadna konverzácia.",
"Other devices": "Iné zariadenia",
@@ -963,6 +962,7 @@ OWN: dict[str, dict[str, str]] = {
"Connect": "Pripojiť",
"Address of your LLeMbas server": "Adresa vášho servera LLeMbas",
"The app signs in to your server once, in your browser, as any device does. It may then read and write your chats, as the web interface does.": "Aplikácia sa na váš server prihlási raz, vo vašom prehliadači, ako každé zariadenie. Potom môže čítať a písať vaše konverzácie, ako webové rozhranie.",
"The app signs in to your server once, in your browser, as any device does. It may then read and write your chats, as the web interface does, and the same approval links this computer for the agent.": "Aplikácia sa na váš server prihlási raz, vo vašom prehliadači, ako každé zariadenie. Potom môže čítať a písať vaše konverzácie, ako webové rozhranie, a to isté schválenie prepojí tento počítač pre agenta.",
"Open the page again": "Otvoriť stránku znova",
"Waiting for the browser…": "Čaká sa na prehliadač…",
"agent off": "agent vypnutý",