strom-research 1.13.2-beta.10 → 1.13.2-beta.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1982,15 +1982,15 @@
1982
1982
  "ui.arg.what-the-family-knows": "co rodina ví",
1983
1983
  "ui.error.story.no-source": "{id} v rodokmenu není",
1984
1984
  "ui.error.story.no-source.hint": "pozadí místa a doby se nejdřív zapíše jako pramen: strom source add … --kind book|newspaper|web",
1985
- "ui.consent.archive.pace": "Tempo stahování snímků z archivů, jejichž podmínky automatizaci omezují, po svolení „pomalu“: nejméně {seconds} s mezi dvěma snímky, nejvýš {n} za hodinu. Nastavit?",
1985
+ "ui.consent.archive.pace": "Tempo stahování snímků z archivů, jejichž podmínky automatizaci omezují, po svolení „pomalu“: nejméně {seconds} s mezi dvěma snímky, nejvýš {n} požadavků na archiv za hodinu včetně katalogu. Nastavit?",
1986
1986
  "ui.archive.terms.known": "Podmínky: „{quote}“ ({terms})",
1987
1987
  "ui.archive.terms.connector": "Podmínky podle stahovače: {quote} ({terms})",
1988
1988
  "ui.archive.terms.none": "Podmínky archivu zatím nejsou známé (stahovač ještě nikdo nepotvrdil).",
1989
1989
  "ui.archive.terms.robots": "Jeho robots.txt: „{quote}“ ({terms}) – žádný automatický přístup jinak než přes prohlížeč člověka.",
1990
1990
  "ui.archive.terms.robots.none": "Jeho robots.txt nedovoluje automatický přístup ({terms}) – jen přes prohlížeč člověka.",
1991
1991
  "ui.archive.name": "{title} ({host})",
1992
- "ui.archive.ask.slow": "Povolit pomalé stahování snímků? Jeden snímek nejvýš za {seconds} s a nejvýš {n} za hodinu, jen snímky, které úkol potřebuje, nic dopředu. Bez svolení se snímky uloží ručně do připravené složky.",
1993
- "ui.archive.ask.browser": "Povolit stahování snímků přes prohlížeč na tomto počítači? Chrome s rozšířením Claude, tempo plánuje strom (jeden snímek nejvýš za {seconds} s, nejvýš {n} za hodinu); kontrolu, zda je u počítače člověk, projde člověk sám. Bez svolení se snímky uloží ručně.",
1992
+ "ui.archive.ask.slow": "Povolit pomalé stahování snímků? Jeden snímek nejvýš za {seconds} s a nejvýš {n} požadavků na archiv za hodinu včetně katalogu, jen snímky, které úkol potřebuje, nic dopředu. Bez svolení se snímky uloží ručně do připravené složky.",
1993
+ "ui.archive.ask.browser": "Povolit stahování snímků přes prohlížeč na tomto počítači? Chrome s rozšířením Claude, tempo plánuje strom (jeden snímek nejvýš za {seconds} s, nejvýš {n} požadavků na archiv za hodinu včetně katalogu); kontrolu, zda je u počítače člověk, projde člověk sám. Bez svolení se snímky uloží ručně.",
1994
1994
  "ui.archive.ask.change": "Platí pro tento archiv na tomto počítači; změnit jde kdykoli: strom allow archive {host}.",
1995
1995
  "ui.archive.btn.slow": "Povolit pomalu",
1996
1996
  "ui.archive.btn.browser": "Povolit přes prohlížeč",
@@ -2006,7 +2006,7 @@
2006
2006
  "ui.archive.window.browser": "Stahovat přes prohlížeč, jeden snímek za {seconds} s, jen co úkol potřebuje?",
2007
2007
  "ui.archive.window.change": "Změnit: nastavení → Archivy.",
2008
2008
  "ui.archive.choose": "{title} – jak získávat snímky?",
2009
- "ui.archive.way.slow": "Pomalu, lidským tempem (jeden snímek nejvýš za {seconds} s, nejvýš {n} za hodinu, jen co úkol potřebuje)",
2009
+ "ui.archive.way.slow": "Pomalu, lidským tempem (jeden snímek nejvýš za {seconds} s, nejvýš {n} požadavků na archiv za hodinu včetně katalogu, jen co úkol potřebuje)",
2010
2010
  "ui.archive.way.browser": "Přes prohlížeč na tomto počítači (Chrome s rozšířením Claude; tempo plánuje strom)",
2011
2011
  "ui.archive.way.manual": "Jen ručně – snímky se uloží do připravené složky",
2012
2012
  "ui.archive.way.later": "Později – nic se nemění",
@@ -2048,7 +2048,7 @@
2048
2048
  "ui.archive.woken": "Úkoly {ids} se vracejí do fronty.",
2049
2049
  "ui.archive.inbox": "{id}: ve složce už jsou snímky ({n}) – výzkum je zaeviduje a úkol se vrátí sám.",
2050
2050
  "ui.archive.manual.tasks": "Úkoly {ids} dál čekají na snímky uložené ručně.",
2051
- "ui.archive.pace": "jeden snímek nejvýš za {seconds} s, nejvýš {n} za hodinu",
2051
+ "ui.archive.pace": "jeden snímek nejvýš za {seconds} s, nejvýš {n} požadavků za hodinu včetně katalogu",
2052
2052
  "ui.archive.pace.line": "Tempo snímků pomalu: {pace} – změnit jde jen příkazem: strom allow host {host} --pace <s> --per-hour <n>, pro všechny archivy strom config set archive.pace \"<s> <n>\"",
2053
2053
  "ui.archive.allowed.line": "Platí: {level} – tady jen přísněji: snímky jen ručně.",
2054
2054
  "ui.archive.pace.service": "Tempo snímků: {pace} – změnit jde jen příkazem: strom allow host {host} --pace <s> --per-hour <n>",
@@ -2075,5 +2075,60 @@
2075
2075
  "ui.link.archive.none": "O tomto archivu tu není co rozhodnout. Nic se nestalo.",
2076
2076
  "ui.error.archive.permission": "stahování snímků z archivu {title} ({hosts}) čeká na rozhodnutí – podmínky archivu automatické stahování omezují; z archivu se nic nestahovalo",
2077
2077
  "ui.error.archive.permission.new": "stahování snímků z archivu {title} ({hosts}) čeká na rozhodnutí – čtení podmínek stahovačem zatím nikdo nepotvrdil; z archivu se nic nestahovalo",
2078
- "ui.error.archive.permission.hint": "rozhodnout v menu strom (Co čeká), nebo v terminálu: strom allow archive {host} --way {ways}"
2078
+ "ui.error.archive.permission.hint": "rozhodnout v menu strom (Co čeká), nebo v terminálu: strom allow archive {host} --way {ways}",
2079
+ "ui.error.archive.rerouted": "{title}: odteď {way} – tento příkaz tou cestou ještě nešel",
2080
+ "ui.error.archive.rerouted.hint": "spustit stejný příkaz znovu",
2081
+ "ui.archive.level.robots.manual": "robots.txt nedovoluje automatický přístup a stahovač neumí jít přes prohlížeč – snímky jen ručně",
2082
+ "ui.archive.level.browserOnly": "archiv pouští automatické nástroje jen přes prohlížeč člověka – snímky jen přes prohlížeč, se svolením",
2083
+ "ui.archive.level.browserOnly.manual": "archiv pouští automatické nástroje jen přes prohlížeč člověka a stahovač to neumí – snímky jen ručně",
2084
+ "ui.pace.text": "nejméně {seconds} s mezi dvěma požadavky, {cap}",
2085
+ "ui.host.pace.own": "{host}: {pace} – vlastní tempo",
2086
+ "ui.host.pace.service": "{host}: {pace} – zase tempo služby",
2087
+ "ui.host.revoked": "{host}: svolení odvoláno – žádný stahovač se tam teď nedostane",
2088
+ "ui.host.allowed": "{host}: automatický přístup povolen (strom consents)",
2089
+ "ui.host.notallowed": "Nepovoleno – nic se nezměnilo.",
2090
+ "ui.consents.on": "souhlasy: zapnuto – stahovač běží, až když ho člověk povolí, a stejně tak každý server archivu, ke kterému se připojí",
2091
+ "ui.consents.off": "souhlasy: vypnuto – stahovače běží bez ptaní (tempo hlídá strom, jen ke svým serverům); kód, který jde mimo strom, potřebuje souhlas člověka · aby se strom ptal předem: strom config set connectors.consent on",
2092
+ "ui.consents.connectors": "stahovače",
2093
+ "ui.consents.connector": "{name} {dir} od {date} servery {hosts}",
2094
+ "ui.consents.none": "(žádné)",
2095
+ "ui.consents.hosts": "servery (automatický přístup)",
2096
+ "ui.consents.host.refused": "⛔ {reason} – znovu to strom zkusí až od {when}",
2097
+ "ui.consents.host.refused.lifted": "⛔ {reason} – strom to znovu nezkusí, dokud to člověk nezruší: strom allow host {host} --unblock",
2098
+ "ui.consents.host.recent": "požadavků za poslední hodinu: {n}",
2099
+ "ui.consents.host.slowed": "zpomaleno ×{factor}",
2100
+ "ui.consents.host.limit": "jeho limit vyčerpán do {when}",
2101
+ "ui.consents.host.since": "povoleno od {date}",
2102
+ "ui.consents.pace": "nejméně {seconds} s mezi dvěma požadavky, {cap}",
2103
+ "ui.consents.pace.own": "{pace} (vlastní tempo)",
2104
+ "ui.consents.archives": "archivy (co jejich podmínky stromu dovolují: dovoleno · omezeno · jen ručně · zakázáno; neznámé jako omezeno)",
2105
+ "ui.consents.level.allowed": "dovoleno",
2106
+ "ui.consents.level.restricted": "omezeno",
2107
+ "ui.consents.level.manual": "jen ručně",
2108
+ "ui.consents.level.forbidden": "zakázáno",
2109
+ "ui.consents.level.unknown": "neznámé",
2110
+ "ui.consents.archive.refused": "jeho server odmítl automatický přístup stromu (odpověď serveru, ne podmínky archivu) – zruší to jen člověk: strom allow host {host} --unblock",
2111
+ "ui.consents.archive.browser": "jen přes prohlížeč člověka",
2112
+ "ui.consents.archive.browser.robots": "jen přes prohlížeč člověka (jeho robots.txt)",
2113
+ "ui.consents.archive.way": "svolení člověka: {way}",
2114
+ "ui.consents.way.slow": "pomalu",
2115
+ "ui.consents.way.browser": "přes prohlížeč",
2116
+ "ui.consents.way.manual": "ručně",
2117
+ "ui.consents.archive.ask": "snímky jen se svolením člověka",
2118
+ "ui.consents.archive.pace.service": "tempo služby: {pace}",
2119
+ "ui.consents.archive.pace.images": "snímky: {pace}",
2120
+ "ui.consents.pending": "čeká na rozhodnutí člověka: {items}",
2121
+ "ui.consents.pending.permission": "{title} (snímky)",
2122
+ "ui.consents.pending.takeover": "úrovně archivů u {names} (strom allow archive --accept)",
2123
+ "ui.consents.pending.milder": "{connector} uvádí pro {host} mírnější úroveň: {to}",
2124
+ "ui.consents.pace.about": "tempo: na každý server jeden požadavek po druhém – tempo služby (uvádí ho její stahovač), jinak nejméně {seconds} s mezi požadavky; hodinový limit jen tam, kde ho stanoví služba nebo člověk; pomaleji, když server odpovídá pomalu, čekání, když řekne, že je jeho limit vyčerpán; jeho robots.txt se čte jednou denně (cesty, kam nástroje nepouští, se nežádají, jeho Crawl-delay je nejpomalejší tempo); odmítnutí zastaví stahování na den – odmítnutí klienta stromu, dokud ho člověk nezruší (strom allow host <host> --unblock) · vlastní tempo pro server: strom allow host <host> --pace <seconds> --per-hour <n>",
2125
+ "ui.consents.logins": "uložená přihlášení (strom login): {names}",
2126
+ "ui.consents.revoke": "vzít zpět: strom allow connector <name> --revoke · strom allow host <host> --revoke · strom allow archive <host> --revoke",
2127
+ "ui.consents.reason.client": "odmítl automatický přístup stromu ({details})",
2128
+ "ui.consents.reason.refused": "odmítl automatický přístup ({details})",
2129
+ "ui.consents.reason.login": "odmítl přihlášení ({details})",
2130
+ "ui.consents.reason.slow": "dvakrát požádal o zpomalení ({details})",
2131
+ "ui.consents.reason.silent": "bez odpovědi ({details}; server neběží, nebo blokuje IP adresu tohoto počítače)",
2132
+ "ui.consents.reason.browser.slow": "požádal prohlížeč o zpomalení ({details})",
2133
+ "ui.consents.reason.browser": "odmítl prohlížeč ({details})"
2079
2134
  }
@@ -1982,15 +1982,15 @@
1982
1982
  "ui.arg.what-the-family-knows": "was die Familie weiß",
1983
1983
  "ui.error.story.no-source": "{id} gibt es im Stammbaum nicht",
1984
1984
  "ui.error.story.no-source.hint": "der Hintergrund von Ort und Zeit wird zuerst als Quelle erfasst: strom source add … --kind book|newspaper|web",
1985
- "ui.consent.archive.pace": "Tempo für Bilder aus Archiven, deren Bedingungen die Automatisierung einschränken, nach der Erlaubnis „langsam“: mindestens {seconds} s zwischen zwei Bildern, höchstens {n} pro Stunde. So einstellen?",
1985
+ "ui.consent.archive.pace": "Tempo für Bilder aus Archiven, deren Bedingungen die Automatisierung einschränken, nach der Erlaubnis „langsam“: mindestens {seconds} s zwischen zwei Bildern, höchstens {n} Anfragen an das Archiv pro Stunde, den Katalog mitgezählt. So einstellen?",
1986
1986
  "ui.archive.terms.known": "Bedingungen: „{quote}“ ({terms})",
1987
1987
  "ui.archive.terms.connector": "Bedingungen laut Downloader: {quote} ({terms})",
1988
1988
  "ui.archive.terms.none": "Die Bedingungen des Archivs sind noch nicht bekannt (der Downloader ist noch nicht bestätigt).",
1989
1989
  "ui.archive.terms.robots": "Seine robots.txt: „{quote}“ ({terms}) – kein automatischer Zugriff außer über den Browser eines Menschen.",
1990
1990
  "ui.archive.terms.robots.none": "Seine robots.txt erlaubt keinen automatischen Zugriff ({terms}) – nur über den Browser eines Menschen.",
1991
1991
  "ui.archive.name": "{title} ({host})",
1992
- "ui.archive.ask.slow": "Langsames Herunterladen der Bilder erlauben? Höchstens ein Bild alle {seconds} s und höchstens {n} pro Stunde, nur die Bilder, die eine Aufgabe braucht, nichts im Voraus. Ohne Erlaubnis werden die Bilder von Hand in einen vorbereiteten Ordner gespeichert.",
1993
- "ui.archive.ask.browser": "Herunterladen der Bilder über den Browser auf diesem Computer erlauben? Chrome mit der Claude-Erweiterung, das Tempo plant strom (höchstens ein Bild alle {seconds} s, höchstens {n} pro Stunde); eine Prüfung, ob ein Mensch da ist, besteht der Mensch selbst. Ohne Erlaubnis werden die Bilder von Hand gespeichert.",
1992
+ "ui.archive.ask.slow": "Langsames Herunterladen der Bilder erlauben? Höchstens ein Bild alle {seconds} s und höchstens {n} Anfragen an das Archiv pro Stunde, den Katalog mitgezählt, nur die Bilder, die eine Aufgabe braucht, nichts im Voraus. Ohne Erlaubnis werden die Bilder von Hand in einen vorbereiteten Ordner gespeichert.",
1993
+ "ui.archive.ask.browser": "Herunterladen der Bilder über den Browser auf diesem Computer erlauben? Chrome mit der Claude-Erweiterung, das Tempo plant strom (höchstens ein Bild alle {seconds} s, höchstens {n} Anfragen an das Archiv pro Stunde, den Katalog mitgezählt); eine Prüfung, ob ein Mensch da ist, besteht der Mensch selbst. Ohne Erlaubnis werden die Bilder von Hand gespeichert.",
1994
1994
  "ui.archive.ask.change": "Gilt für dieses Archiv auf diesem Computer; jederzeit zu ändern: strom allow archive {host}.",
1995
1995
  "ui.archive.btn.slow": "Langsam erlauben",
1996
1996
  "ui.archive.btn.browser": "Über den Browser erlauben",
@@ -2006,7 +2006,7 @@
2006
2006
  "ui.archive.window.browser": "Über den Browser herunterladen, ein Bild alle {seconds} s, nur was eine Aufgabe braucht?",
2007
2007
  "ui.archive.window.change": "Ändern: Einstellungen → Archive.",
2008
2008
  "ui.archive.choose": "{title} – wie sollen die Bilder kommen?",
2009
- "ui.archive.way.slow": "Langsam, im Tempo eines Menschen (höchstens ein Bild alle {seconds} s, höchstens {n} pro Stunde, nur was eine Aufgabe braucht)",
2009
+ "ui.archive.way.slow": "Langsam, im Tempo eines Menschen (höchstens ein Bild alle {seconds} s, höchstens {n} Anfragen an das Archiv pro Stunde, den Katalog mitgezählt, nur was eine Aufgabe braucht)",
2010
2010
  "ui.archive.way.browser": "Über den Browser auf diesem Computer (Chrome mit der Claude-Erweiterung; das Tempo plant strom)",
2011
2011
  "ui.archive.way.manual": "Nur von Hand – die Bilder werden in einen vorbereiteten Ordner gespeichert",
2012
2012
  "ui.archive.way.later": "Später – nichts ändert sich",
@@ -2048,7 +2048,7 @@
2048
2048
  "ui.archive.woken": "Die Aufgaben {ids} kehren in die Warteschlange zurück.",
2049
2049
  "ui.archive.inbox": "{id}: Im Ordner liegen schon Bilder ({n}) – die Forschung erfasst sie, und die Aufgabe kommt von selbst zurück.",
2050
2050
  "ui.archive.manual.tasks": "Die Aufgaben {ids} warten weiter auf die von Hand gespeicherten Bilder.",
2051
- "ui.archive.pace": "höchstens ein Bild alle {seconds} s, höchstens {n} pro Stunde",
2051
+ "ui.archive.pace": "höchstens ein Bild alle {seconds} s, höchstens {n} Anfragen pro Stunde, den Katalog mitgezählt",
2052
2052
  "ui.archive.pace.line": "Tempo der Bilder, langsam: {pace} – nur per Befehl zu ändern: strom allow host {host} --pace <s> --per-hour <n>, für alle Archive strom config set archive.pace \"<s> <n>\"",
2053
2053
  "ui.archive.allowed.line": "Es gilt: {level} – hier nur strenger: die Bilder nur von Hand.",
2054
2054
  "ui.archive.pace.service": "Tempo der Bilder: {pace} – nur per Befehl zu ändern: strom allow host {host} --pace <s> --per-hour <n>",
@@ -2075,5 +2075,60 @@
2075
2075
  "ui.link.archive.none": "Über dieses Archiv gibt es hier nichts zu entscheiden. Es ist nichts geschehen.",
2076
2076
  "ui.error.archive.permission": "das Herunterladen von Bildern aus dem Archiv {title} ({hosts}) wartet auf eine Entscheidung – seine Bedingungen schränken das automatische Herunterladen ein; beim Archiv wurde nichts angefragt",
2077
2077
  "ui.error.archive.permission.new": "das Herunterladen von Bildern aus dem Archiv {title} ({hosts}) wartet auf eine Entscheidung – die Lesart der Bedingungen durch den Downloader hat noch niemand bestätigt; beim Archiv wurde nichts angefragt",
2078
- "ui.error.archive.permission.hint": "im Menü von strom entscheiden (Was wartet) oder im Terminal: strom allow archive {host} --way {ways}"
2078
+ "ui.error.archive.permission.hint": "im Menü von strom entscheiden (Was wartet) oder im Terminal: strom allow archive {host} --way {ways}",
2079
+ "ui.error.archive.rerouted": "{title}: ab jetzt {way} – dieser Befehl ging diesen Weg noch nicht",
2080
+ "ui.error.archive.rerouted.hint": "denselben Befehl noch einmal starten",
2081
+ "ui.archive.level.robots.manual": "die robots.txt erlaubt keinen automatischen Zugriff, und der Downloader kann nicht über den Browser gehen – Bilder nur von Hand",
2082
+ "ui.archive.level.browserOnly": "das Archiv lässt automatische Werkzeuge nur über den Browser eines Menschen zu – Bilder nur über den Browser, mit Erlaubnis",
2083
+ "ui.archive.level.browserOnly.manual": "das Archiv lässt automatische Werkzeuge nur über den Browser eines Menschen zu, und der Downloader kann das nicht – Bilder nur von Hand",
2084
+ "ui.pace.text": "mindestens {seconds} s zwischen zwei Anfragen, {cap}",
2085
+ "ui.host.pace.own": "{host}: {pace} – eigenes Tempo",
2086
+ "ui.host.pace.service": "{host}: {pace} – wieder das Tempo des Dienstes",
2087
+ "ui.host.revoked": "{host}: Zustimmung zurückgenommen – kein Downloader erreicht ihn jetzt",
2088
+ "ui.host.allowed": "{host}: automatischer Zugriff erlaubt (strom consents)",
2089
+ "ui.host.notallowed": "Nicht erlaubt – nichts geändert.",
2090
+ "ui.consents.on": "Zustimmungen: an – ein Downloader läuft erst, wenn ein Mensch ihn erlaubt, und ebenso jeder Server eines Archivs, den er erreicht",
2091
+ "ui.consents.off": "Zustimmungen: aus – Downloader laufen ohne Nachfrage (im Tempo von strom, nur zu ihren Servern); Code, der an strom vorbeigeht, braucht das Ja eines Menschen · um vorher gefragt zu werden: strom config set connectors.consent on",
2092
+ "ui.consents.connectors": "Downloader",
2093
+ "ui.consents.connector": "{name} {dir} seit {date} Server {hosts}",
2094
+ "ui.consents.none": "(keine)",
2095
+ "ui.consents.hosts": "Server (automatischer Zugriff)",
2096
+ "ui.consents.host.refused": "⛔ {reason} – strom versucht es erst wieder ab {when}",
2097
+ "ui.consents.host.refused.lifted": "⛔ {reason} – strom versucht es nicht wieder, bis ein Mensch es aufhebt: strom allow host {host} --unblock",
2098
+ "ui.consents.host.recent": "Anfragen in der letzten Stunde: {n}",
2099
+ "ui.consents.host.slowed": "verlangsamt ×{factor}",
2100
+ "ui.consents.host.limit": "sein Limit aufgebraucht bis {when}",
2101
+ "ui.consents.host.since": "erlaubt seit {date}",
2102
+ "ui.consents.pace": "mindestens {seconds} s zwischen zwei Anfragen, {cap}",
2103
+ "ui.consents.pace.own": "{pace} (eigenes Tempo)",
2104
+ "ui.consents.archives": "Archive (was ihre Bedingungen strom erlauben: erlaubt · eingeschränkt · nur von Hand · verboten; unbekannt wie eingeschränkt)",
2105
+ "ui.consents.level.allowed": "erlaubt",
2106
+ "ui.consents.level.restricted": "eingeschränkt",
2107
+ "ui.consents.level.manual": "nur von Hand",
2108
+ "ui.consents.level.forbidden": "verboten",
2109
+ "ui.consents.level.unknown": "unbekannt",
2110
+ "ui.consents.archive.refused": "sein Server hat den automatischen Zugriff von strom abgelehnt (die Antwort des Servers, nicht die Bedingungen des Archivs) – nur ein Mensch hebt das auf: strom allow host {host} --unblock",
2111
+ "ui.consents.archive.browser": "nur über den Browser eines Menschen",
2112
+ "ui.consents.archive.browser.robots": "nur über den Browser eines Menschen (seine robots.txt)",
2113
+ "ui.consents.archive.way": "Erlaubnis des Menschen: {way}",
2114
+ "ui.consents.way.slow": "langsam",
2115
+ "ui.consents.way.browser": "über den Browser",
2116
+ "ui.consents.way.manual": "von Hand",
2117
+ "ui.consents.archive.ask": "Bilder nur mit Erlaubnis des Menschen",
2118
+ "ui.consents.archive.pace.service": "Tempo des Dienstes: {pace}",
2119
+ "ui.consents.archive.pace.images": "Bilder: {pace}",
2120
+ "ui.consents.pending": "wartet auf die Entscheidung des Menschen: {items}",
2121
+ "ui.consents.pending.permission": "{title} (Bilder)",
2122
+ "ui.consents.pending.takeover": "die Stufen der Archive von {names} (strom allow archive --accept)",
2123
+ "ui.consents.pending.milder": "{connector} gibt für {host} eine mildere Stufe an: {to}",
2124
+ "ui.consents.pace.about": "Tempo: je Server eine Anfrage nach der anderen – das Tempo des Dienstes (sein Downloader nennt es), sonst mindestens {seconds} s Abstand; ein Stundenlimit nur, wo der Dienst oder ein Mensch eines setzt; langsamer, solange ein Server langsam antwortet, eine Pause, wenn er sein Limit für aufgebraucht erklärt; seine robots.txt einmal am Tag gelesen (die Pfade, die er Werkzeugen verwehrt, nicht angefragt, sein Crawl-delay das langsamste Tempo); eine Ablehnung hält einen Tag an – eine des Clients von strom, bis ein Mensch sie aufhebt (strom allow host <host> --unblock) · eigenes Tempo für einen Server: strom allow host <host> --pace <seconds> --per-hour <n>",
2125
+ "ui.consents.logins": "gespeicherte Anmeldungen (strom login): {names}",
2126
+ "ui.consents.revoke": "zurücknehmen: strom allow connector <name> --revoke · strom allow host <host> --revoke · strom allow archive <host> --revoke",
2127
+ "ui.consents.reason.client": "hat den automatischen Zugriff von strom abgelehnt ({details})",
2128
+ "ui.consents.reason.refused": "hat den automatischen Zugriff abgelehnt ({details})",
2129
+ "ui.consents.reason.login": "hat die Anmeldung abgelehnt ({details})",
2130
+ "ui.consents.reason.slow": "hat zweimal um ein langsameres Tempo gebeten ({details})",
2131
+ "ui.consents.reason.silent": "keine Antwort ({details}; der Server ist nicht erreichbar oder sperrt die IP-Adresse dieses Computers)",
2132
+ "ui.consents.reason.browser.slow": "hat den Browser um ein langsameres Tempo gebeten ({details})",
2133
+ "ui.consents.reason.browser": "hat den Browser abgelehnt ({details})"
2079
2134
  }
@@ -91,6 +91,21 @@ conclusion so the next researcher can follow it.
91
91
  the records decide it. You read no records here: what would
92
92
  decide a hypothesis is a task (`strom task add … --about H…`), not a search now.
93
93
  <!-- end -->
94
+ <!-- for link verify enrich locate connector -->
95
+ - **Fetch only what you read**, as the archive allows (the brief's `archive`
96
+ line). An image known exactly from another source (an online reference, a
97
+ published edition): start with it. An archive that restricts automation (its
98
+ images slowly or through the browser, by the person's permission): sparing
99
+ and targeted — an index searched by halving (its middle image first, then the
100
+ half the name falls in; never batches from one end), only the images of the
101
+ name's letter fetched; a page number from the index turned into an image
102
+ number by one or two images, never a batch of ten; an entry: its image ±1
103
+ (it may run over a page). An archive that allows automation: batches as
104
+ usual (about ±5 around the target, an index in batches) — fewer turns.
105
+ <!-- end -->
106
+ - **What strom or the tree denies stays denied.** Never offer the user to
107
+ change your permissions or settings, strom's or the tree's, to get round it:
108
+ another way, or say what was refused.
94
109
  - **Stay within the task.** New questions become new tasks (`strom task add`,
95
110
  with where and done-when), not detours.
96
111
  <!-- for link verify enrich intake locate -->
@@ -14,6 +14,7 @@ import { isArchive } from "../core/mode.js";
14
14
  import { Settings } from "../core/config.js";
15
15
  import { agentAppUrl, appSite } from "../core/stromapp.js";
16
16
  import { configDir } from "../core/paths.js";
17
+ import { within } from "../core/relocate.js";
17
18
  import { agentBrowser } from "../core/connector.js";
18
19
  import { CHROME_ALLOW, CHROME_DENY, chromeDomain } from "../core/browser.js";
19
20
  import { claudeScanReader, opencodeScanReader, SCAN_READER, scanReaderModel, treeReading } from "./scanreader.js";
@@ -68,6 +69,10 @@ the researcher; \`strom\` is your only way to read and change the research.
68
69
  either — check with \`strom net web --check <url>\`. Another way to the
69
70
  same records first; a task for the user (\`strom task wait T… --check
70
71
  <url> --on "…"\`) only if the source stays necessary.
72
+ 11. What strom or this tree denies you (a command, a site, a file) stays
73
+ denied: never offer the user to change your permissions or settings,
74
+ strom's or the tree's, to get round it — go another way, or say what was
75
+ refused.
71
76
 
72
77
  ## Working with the user
73
78
 
@@ -164,6 +169,43 @@ export function permissionPath(abs) {
164
169
  const win = /^([A-Za-z]):\/(.*)$/.exec(p);
165
170
  return win ? `//${win[1].toLowerCase()}/${win[2]}` : `/${p}`;
166
171
  }
172
+ /** What strom keeps in its settings folder that no agent reads or edits: the seal keys, the person's settings,
173
+ * consents, permissions, logins. */
174
+ const SETTINGS_KEPT = ["keys", "config.json", "consents.json", "archives.json", "logins.json", "agents-taught.json", "shortcut"];
175
+ /**
176
+ * The parts of strom's settings folder kept from the agents, each with whether it is a folder. The whole folder —
177
+ * unless the research is in it (an isolated installation's home is "Strom research" inside it: a deny of the whole
178
+ * folder outweighs every allow and cuts the agent off its connectors, its inbox and the research itself). Then what
179
+ * strom keeps there always, and every other entry that holds none of the research's folders.
180
+ */
181
+ export function settingsKeptFrom(dir, research, platform = process.platform) {
182
+ const keep = research.map((p) => path.resolve(p));
183
+ if (!keep.some((p) => within(p, dir, platform)))
184
+ return [{ path: dir, folder: true }];
185
+ let entries = [];
186
+ try {
187
+ entries = fs.readdirSync(dir);
188
+ }
189
+ catch {
190
+ // no settings folder yet: what strom will keep there
191
+ }
192
+ const names = [...new Set([...SETTINGS_KEPT, ...entries])].filter((n) => !keep.some((p) => within(p, path.join(dir, n), platform)));
193
+ return names.sort().map((n) => {
194
+ const p = path.join(dir, n);
195
+ let folder = n === "keys";
196
+ try {
197
+ folder = fs.statSync(p).isDirectory();
198
+ }
199
+ catch {
200
+ // not there yet: as strom makes it
201
+ }
202
+ return { path: p, folder };
203
+ });
204
+ }
205
+ /** The folders of the research the agent works in: its home, the shared folder, the tree. */
206
+ function researchFolders(tree, settings) {
207
+ return [settings.home()?.value, settings.shared()?.value, tree.root].filter((p) => !!p);
208
+ }
167
209
  /**
168
210
  * The tree's rules for Claude Code or Grok Build. Grok reads Claude Code's rules too, but an absolute
169
211
  * path in Claude Code's words ("//Users/x") is plain text to it: its own file gets the path as it is.
@@ -175,7 +217,7 @@ function treeRules(tree, agent) {
175
217
  const shared = settings.shared()?.value;
176
218
  const claude = agent === "claude";
177
219
  const at = (abs) => (claude ? permissionPath(abs) : abs.replace(/\\/g, "/"));
178
- const keys = at(configDir(tree.env));
220
+ const kept = settingsKeptFrom(configDir(tree.env), researchFolders(tree, settings)).map((k) => (k.folder ? `${at(k.path)}/**` : at(k.path)));
179
221
  // Browser tools (Claude in Chrome): for the sites of the connectors fetching through the browser — or, agent.browser
180
222
  // always, of every archive of the research (anything else is asked in a conversation, not used in a run).
181
223
  const web = claude ? agentBrowser(tree, shared) : { on: false, hosts: [] };
@@ -217,9 +259,8 @@ function treeRules(tree, agent) {
217
259
  ...(shared ? [`Edit(${at(path.join(shared, "net"))}/**)`] : []),
218
260
  // A session ends with its turn: nothing wakes it up later (a live run waited for a wake-up that never came).
219
261
  ...(claude ? ["ScheduleWakeup", "CronCreate"] : []),
220
- // The seal keys: an agent that could read them could forge the seal.
221
- `Read(${keys}/**)`,
222
- `Edit(${keys}/**)`,
262
+ // The seal keys: an agent that could read them could forge the seal; the person's settings, consents and logins.
263
+ ...kept.flatMap((k) => [`Read(${k})`, `Edit(${k})`]),
223
264
  // What the browser downloads is strom's to take over; the rest of the folder is the user's.
224
265
  `Read(${downloads}/**)`,
225
266
  ...(claude ? CHROME_DENY : []),
@@ -321,8 +362,8 @@ export function opencodeConfig(tree) {
321
362
  [`${abs(path.join(shared, "net"))}/*`]: "deny",
322
363
  }
323
364
  : {}),
324
- // the seal keys, and what the browser downloads (strom's to take over)
325
- [`${abs(configDir(tree.env))}/*`]: "deny",
365
+ // the seal keys and the person's settings, and what the browser downloads (strom's to take over)
366
+ ...Object.fromEntries(settingsKeptFrom(configDir(tree.env), researchFolders(tree, settings)).map((k) => [k.folder ? `${abs(k.path)}/*` : abs(k.path), "deny"])),
326
367
  [`${abs(settings.downloads())}/*`]: "deny",
327
368
  },
328
369
  webfetch: "allow",
@@ -736,6 +736,9 @@ function archiveLine(tree, b, repo, shared, installed, qs = []) {
736
736
  : ((q) => (q ? `the person's decision on its images waits since ${q.at.slice(0, 10)}` : "no decision of the person's yet: a fetch of its images asks them once, and the question then waits — never fetch there again until they decide"))(qs.find((x) => onHost(a.host, x.host))));
737
737
  else if (a.permission === "manual")
738
738
  parts.push("the person: images by hand only");
739
+ // a restricted archive's images, allowed slowly or through the browser: sparing (the method's "Fetch only what you read")
740
+ if ((a.level === "restricted" || a.level === "unknown") && (a.permission === "slow" || a.permission === "browser"))
741
+ parts.push("fetch sparingly: an index by halving, a page to its image by 1–2 images, an entry ±1");
739
742
  if (a.refused)
740
743
  parts.push(`${a.refused.host} refused strom's client — left alone ${a.refused.until && a.refused.until < REFUSED_FOREVER ? `until ${clock(a.refused.until)}` : "until the person lifts it"}; not through your web tools or a browser either`);
741
744
  else if (net) {
@@ -61,6 +61,10 @@ export function numberIn(lang, n, o = { maximumFractionDigits: 1 }) {
61
61
  return new Intl.NumberFormat("en", o).format(n);
62
62
  }
63
63
  }
64
+ /** Seconds of a pace as a language writes them: 0,5 in Czech and German, 0.5 in English (no grouping: 3600, never 3,600). */
65
+ export function secondsIn(lang, ms) {
66
+ return numberIn(lang, ms / 1000, { maximumFractionDigits: 2, useGrouping: false });
67
+ }
64
68
  /** An argument as it is typed in a shell: quoted when it holds spaces or special characters. */
65
69
  export function shellArg(arg) {
66
70
  return /^[\p{L}\p{M}\p{N}._\/:@+-]+$/u.test(arg) ? arg : `"${arg.replace(/["\\$`]/g, "\\$&")}"`;
@@ -4,19 +4,21 @@
4
4
  // menu is the person's own terminal: each choice runs the ordinary command (strom allow archive …), 0 goes back with
5
5
  // nothing changed, and the current state is the suggested answer. Tasks that waited for the archive's images go back
6
6
  // to the queue once they may come — unless the images are in their folder already (saved by hand meanwhile).
7
+ import { ui } from "./ui.js";
8
+ import { secondsIn } from "./format.js";
7
9
  import { claudeHere, pause, subMenu, translator } from "./menu-parts.js";
8
10
  import { humanDay } from "./human.js";
9
11
  import { Tree } from "../core/tree.js";
10
12
  import { isArchive } from "../core/mode.js";
11
- import { bareHost, listConnectors, routeOf } from "../core/connector.js";
13
+ import { bareHost, listConnectors, routeOf, routesOf } from "../core/connector.js";
12
14
  import { claimOf, loadArchives, rank } from "../core/terms.js";
13
15
  import { archiveQuestions, connectorFor, levelWords, tasksStanding, tasksWaitingOn, termsText, waysOffered, wokenLines } from "../core/archiveasks.js";
14
16
  import { wakeForArchive } from "../core/archivewait.js";
15
17
  import { archivesOverview, levelsOf, paceFor } from "../commands/archives.js";
16
18
  /** A pace in the person's words: "one image at most every 10 s, at most 120 an hour". */
17
- export function paceWords(t, p) {
19
+ export function paceWords(lang, p) {
18
20
  const n = p.perHour === null || !Number.isFinite(p.perHour) ? "∞" : p.perHour;
19
- return t("ui.archive.pace", { seconds: p.minIntervalMs / 1000, n });
21
+ return ui(lang, "ui.archive.pace", { seconds: secondsIn(lang, p.minIntervalMs), n });
20
22
  }
21
23
  function connectorsHere(ctx) {
22
24
  return listConnectors(ctx.settings.shared()?.value, ctx.env);
@@ -115,15 +117,15 @@ export async function decideArchive(ctx, run, lang, root, host, q) {
115
117
  const allowed = a?.level === "allowed";
116
118
  if (allowed) {
117
119
  out(` ${t("ui.archive.allowed.line", { level: levelWords(lang, "allowed") })}`);
118
- out(` ${t("ui.archive.pace.service", { pace: paceWords(t, archivesOverview(ctx).find((r) => r.host === host && r.connector === c.name)?.pace ?? slow), host })}`);
120
+ out(` ${t("ui.archive.pace.service", { pace: paceWords(lang, archivesOverview(ctx).find((r) => r.host === host && r.connector === c.name)?.pace ?? slow), host })}`);
119
121
  }
120
122
  else
121
- out(` ${t("ui.archive.pace.line", { pace: paceWords(t, slow), host })}`);
123
+ out(` ${t("ui.archive.pace.line", { pace: paceWords(lang, slow), host })}`);
122
124
  const ways = allowed ? ["manual"] : waysOffered(c, claudeHere(ctx, tree?.config), q?.way, !!(a?.browserOnly ?? q?.browserOnly));
123
125
  const now = a?.permission;
124
126
  const choices = ways.map((w) => ({
125
127
  way: w,
126
- label: t(w === "slow" ? "ui.archive.way.slow" : w === "browser" ? "ui.archive.way.browser" : "ui.archive.way.manual", { seconds: slow.minIntervalMs / 1000, n: Number.isFinite(slow.perHour) ? slow.perHour : "∞" }),
128
+ label: t(w === "slow" ? "ui.archive.way.slow" : w === "browser" ? "ui.archive.way.browser" : "ui.archive.way.manual", { seconds: secondsIn(lang, slow.minIntervalMs), n: Number.isFinite(slow.perHour) ? slow.perHour : "∞" }),
127
129
  }));
128
130
  if (now)
129
131
  choices.push({ label: t("ui.archive.way.revoke") });
@@ -216,6 +218,15 @@ async function decideMilder(ctx, run, lang, q, title) {
216
218
  if ((await run(["allow", "archive", c.name, i === 0 ? "--accept" : "--keep"], true)) === 0)
217
219
  out(t(i === 0 ? "ui.archive.milder.accepted" : "ui.archive.milder.kept", { title }));
218
220
  }
221
+ /** An archive only a person's browser goes to, in the person's words: through the browser, or by hand where the downloader cannot. */
222
+ function onlyBrowser(t, c, robots) {
223
+ const browser = routesOf(c).includes("browser");
224
+ return t(robots ? (browser ? "ui.archive.level.robots" : "ui.archive.level.robots.manual") : browser ? "ui.archive.level.browserOnly" : "ui.archive.level.browserOnly.manual");
225
+ }
226
+ /** Does only a person's browser go to an archive of this downloader (its robots.txt, strom's known terms)? Its line says how. */
227
+ export function browserOnlyHere(ctx, c) {
228
+ return archivesOverview(ctx).some((r) => r.connector === c.name && r.browserOnly && r.level !== "manual" && r.level !== "forbidden");
229
+ }
219
230
  /** What holds for a downloader's archive, on its line in the settings: its level, the person's way and since when, the pace. */
220
231
  export function archiveState(ctx, lang, c) {
221
232
  const t = translator(lang);
@@ -226,8 +237,11 @@ export function archiveState(ctx, lang, c) {
226
237
  const rec = store[r.host];
227
238
  const level = r.level;
228
239
  const closed = level === "manual" || level === "forbidden";
229
- const way = !closed && r.way ? t("ui.archives.state.way", { way: t(`ui.archive.is.${r.way}`), date: rec?.at ? humanDay(rec.at, lang) : "–" }) : levelWords(lang, level, !!r.robots, r.from);
230
- const pace = !closed && r.way !== "manual" && (level === "allowed" || r.way) ? `; ${paceWords(t, r.pace)}` : "";
240
+ // only a person's browser goes to the archive (its robots.txt, strom's known terms): said so — through the browser
241
+ // where the downloader can go that way, else by hand only; never "directly" (that is not the way here)
242
+ const only = !closed && !r.way && r.browserOnly ? onlyBrowser(t, c, !!r.robots) : undefined;
243
+ const way = only ?? (!closed && r.way ? t("ui.archives.state.way", { way: t(`ui.archive.is.${r.way}`), date: rec?.at ? humanDay(rec.at, lang) : "–" }) : levelWords(lang, level, !!r.robots, r.from));
244
+ const pace = !closed && r.way !== "manual" && (level === "allowed" || r.way) ? `; ${paceWords(lang, r.pace)}` : "";
231
245
  return `${rows.length > 1 ? `${r.host}: ` : ""}${way}${pace}`;
232
246
  })
233
247
  .join(" · ");
@@ -22,7 +22,7 @@ import { chooseMode } from "./menu-mode.js";
22
22
  import { agentsHere } from "../core/apps.js";
23
23
  import { mb, tidyPlan, TIDY_SAID } from "../core/tidy.js";
24
24
  import { calibrationOffer, viewSizesFor } from "../core/viewsizes.js";
25
- import { archivePermissions, archiveState } from "./menu-archives.js";
25
+ import { archivePermissions, archiveState, browserOnlyHere } from "./menu-archives.js";
26
26
  export async function settingsMenu(ctx, run, lang, root, newer) {
27
27
  const t = translator(lang);
28
28
  return subMenu(ctx, lang, () => {
@@ -346,7 +346,9 @@ async function archives(ctx, run, lang, shared, root) {
346
346
  const login = !c.manifest.login ? "" : `; ${saved[c.name] ? t("ui.archives.login.saved", { date: saved[c.name].at.slice(0, 10) }) : t("ui.archives.login.none")}`;
347
347
  // what its archive's terms let it do here, the person's decision and since when, the pace (read only: the commands change it)
348
348
  const state = archiveState(ctx, lang, c);
349
- return ` • ${c.manifest.title ?? c.name} — ${t(`ui.archives.via.${via(c)}`)}${login}${state ? `; ${state}` : ""}`;
349
+ // an archive only a person's browser goes to: its state says the way (never "directly", a route it cannot take there)
350
+ const how = browserOnlyHere(ctx, c) && state ? "" : t(`ui.archives.via.${via(c)}`);
351
+ return ` • ${c.manifest.title ?? c.name} — ${[how, login.replace(/^; /, ""), state].filter(Boolean).join("; ")}`;
350
352
  });
351
353
  // Through the browser: only Claude Code can, with the Claude in Chrome extension — said as it is here.
352
354
  const browser = connectors.filter((c) => via(c) === "browser");
package/dist/cli/ui.js CHANGED
@@ -1782,15 +1782,15 @@ export const UI = {
1782
1782
  "ui.conflict.tasks-open": "still open about {id}: {tasks} \u2014 close them: strom task done {first} --result \"\u2026\"",
1783
1783
  "ui.error.story.no-source": "{id} is not in the family tree",
1784
1784
  "ui.error.story.no-source.hint": "the background of place and time is recorded first: strom source add \u2026 --kind book|newspaper|web",
1785
- "ui.consent.archive.pace": "The pace for the images of archives whose terms restrict automated access, once allowed slowly: at least {seconds} s between two images, at most {n} an hour. Set it so?",
1785
+ "ui.consent.archive.pace": "The pace for the images of archives whose terms restrict automated access, once allowed slowly: at least {seconds} s between two images, at most {n} requests to the archive an hour, its catalogue counted too. Set it so?",
1786
1786
  "ui.archive.terms.known": "Terms: “{quote}” ({terms})",
1787
1787
  "ui.archive.terms.connector": "Terms as its downloader reads them: {quote} ({terms})",
1788
1788
  "ui.archive.terms.none": "The archive's terms are not known yet (nobody has confirmed its downloader).",
1789
1789
  "ui.archive.terms.robots": "Its robots.txt: “{quote}” ({terms}) – no automated access other than through a person's browser.",
1790
1790
  "ui.archive.terms.robots.none": "Its robots.txt allows no automated access ({terms}) – only through a person's browser.",
1791
1791
  "ui.archive.name": "{title} ({host})",
1792
- "ui.archive.ask.slow": "Allow slow downloading of its images? At most one image every {seconds} s and at most {n} an hour, only the images a task needs, nothing in advance. Without permission the images are saved by hand into a folder made ready for them.",
1793
- "ui.archive.ask.browser": "Allow downloading its images through the browser on this computer? Chrome with the Claude extension; strom plans the pace (at most one image every {seconds} s, at most {n} an hour); a check whether a person is there is passed by the person, never by strom. Without permission the images are saved by hand.",
1792
+ "ui.archive.ask.slow": "Allow slow downloading of its images? At most one image every {seconds} s and at most {n} requests to the archive an hour, its catalogue counted too, only the images a task needs, nothing in advance. Without permission the images are saved by hand into a folder made ready for them.",
1793
+ "ui.archive.ask.browser": "Allow downloading its images through the browser on this computer? Chrome with the Claude extension; strom plans the pace (at most one image every {seconds} s, at most {n} requests to the archive an hour, its catalogue counted too); a check whether a person is there is passed by the person, never by strom. Without permission the images are saved by hand.",
1794
1794
  "ui.archive.ask.change": "For this archive on this computer; to be changed at any time: strom allow archive {host}.",
1795
1795
  "ui.archive.btn.slow": "Allow slowly",
1796
1796
  "ui.archive.btn.browser": "Allow through the browser",
@@ -1806,7 +1806,7 @@ export const UI = {
1806
1806
  "ui.archive.window.browser": "Download through the browser, one image every {seconds} s, only what a task needs?",
1807
1807
  "ui.archive.window.change": "To change: settings → Archives.",
1808
1808
  "ui.archive.choose": "{title} – how to get its images?",
1809
- "ui.archive.way.slow": "Slowly, at a person's pace (one image at most every {seconds} s, at most {n} an hour, only what a task needs)",
1809
+ "ui.archive.way.slow": "Slowly, at a person's pace (one image at most every {seconds} s, at most {n} requests to the archive an hour, its catalogue counted too, only what a task needs)",
1810
1810
  "ui.archive.way.browser": "Through the browser on this computer (Chrome with the Claude extension; strom plans the pace)",
1811
1811
  "ui.archive.way.manual": "By hand only – the images are saved into a folder made ready",
1812
1812
  "ui.archive.way.later": "Later – nothing changes",
@@ -1848,7 +1848,7 @@ export const UI = {
1848
1848
  "ui.archive.woken": "Tasks {ids} go back to the queue.",
1849
1849
  "ui.archive.inbox": "{id}: images already in its folder ({n}) \u2013 the research registers them and the task comes back by itself.",
1850
1850
  "ui.archive.manual.tasks": "Tasks {ids} keep waiting for the images saved by hand.",
1851
- "ui.archive.pace": "one image at most every {seconds} s, at most {n} an hour",
1851
+ "ui.archive.pace": "one image at most every {seconds} s, at most {n} requests an hour, the catalogue too",
1852
1852
  "ui.archive.pace.line": "Pace of its images, slowly: {pace} \u2013 changed only by a command: strom allow host {host} --pace <s> --per-hour <n>, for every archive strom config set archive.pace \"<s> <n>\"",
1853
1853
  "ui.archive.allowed.line": "What holds: {level} – here only stricter: its images by hand.",
1854
1854
  "ui.archive.pace.service": "Pace of its images: {pace} – changed only by a command: strom allow host {host} --pace <s> --per-hour <n>",
@@ -1876,6 +1876,61 @@ export const UI = {
1876
1876
  "ui.error.archive.permission": "downloading images from {title} ({hosts}) waits for a decision \u2013 its terms restrict automated downloading; nothing was asked of the archive",
1877
1877
  "ui.error.archive.permission.new": "downloading images from {title} ({hosts}) waits for a decision \u2013 nobody has confirmed its downloader's reading of the terms yet; nothing was asked of the archive",
1878
1878
  "ui.error.archive.permission.hint": "to be decided in strom's menu (What waits), or in a terminal: strom allow archive {host} --way {ways}",
1879
+ "ui.error.archive.rerouted": "{title}: {way} from now on – this command did not go that way yet",
1880
+ "ui.error.archive.rerouted.hint": "run the same command again",
1881
+ "ui.archive.level.robots.manual": "its robots.txt allows no automated access and the downloader cannot go through the browser – images by hand only",
1882
+ "ui.archive.level.browserOnly": "the archive lets automated tools in only through a person's browser – images only through the browser, with permission",
1883
+ "ui.archive.level.browserOnly.manual": "the archive lets automated tools in only through a person's browser and the downloader cannot go that way – images by hand only",
1884
+ "ui.pace.text": "at least {seconds} s between two requests, {cap}",
1885
+ "ui.host.pace.own": "{host}: {pace} – its own pace",
1886
+ "ui.host.pace.service": "{host}: {pace} – the service's pace again",
1887
+ "ui.host.revoked": "{host}: consent taken back – no downloader reaches it now",
1888
+ "ui.host.allowed": "{host}: automated access allowed (strom consents)",
1889
+ "ui.host.notallowed": "Not allowed – nothing changed.",
1890
+ "ui.consents.on": "consents: on — a connector runs only once the person allows it, and each archive host it contacts",
1891
+ "ui.consents.off": "consents: off — connectors run without asking (paced by strom, only to their hosts); code that goes round strom needs the person's yes · to be asked first: strom config set connectors.consent on",
1892
+ "ui.consents.connectors": "connectors",
1893
+ "ui.consents.connector": "{name} {dir} since {date} hosts {hosts}",
1894
+ "ui.consents.none": "(none)",
1895
+ "ui.consents.hosts": "hosts (automated access)",
1896
+ "ui.consents.host.refused": "⛔ {reason} — strom tries again only from {when}",
1897
+ "ui.consents.host.refused.lifted": "⛔ {reason} — strom will not try again until the person lifts it: strom allow host {host} --unblock",
1898
+ "ui.consents.host.recent": "{n} request(s) in the last hour",
1899
+ "ui.consents.host.slowed": "slowed ×{factor}",
1900
+ "ui.consents.host.limit": "its limit used up until {when}",
1901
+ "ui.consents.host.since": "allowed since {date}",
1902
+ "ui.consents.pace": "at least {seconds} s apart, {cap}",
1903
+ "ui.consents.pace.own": "{pace} (the person's own)",
1904
+ "ui.consents.archives": "archives (what their terms let strom do: allowed · restricted · manual · forbidden; unknown as restricted)",
1905
+ "ui.consents.level.allowed": "allowed",
1906
+ "ui.consents.level.restricted": "restricted",
1907
+ "ui.consents.level.manual": "manual",
1908
+ "ui.consents.level.forbidden": "forbidden",
1909
+ "ui.consents.level.unknown": "unknown",
1910
+ "ui.consents.archive.refused": "its server refused strom's automated access (the server's answer, not the archive's terms) — only the person lifts it: strom allow host {host} --unblock",
1911
+ "ui.consents.archive.browser": "only through a person's browser",
1912
+ "ui.consents.archive.browser.robots": "only through a person's browser (its robots.txt)",
1913
+ "ui.consents.archive.way": "the user's permission: {way}",
1914
+ "ui.consents.way.slow": "slow",
1915
+ "ui.consents.way.browser": "browser",
1916
+ "ui.consents.way.manual": "manual",
1917
+ "ui.consents.archive.ask": "images only with the user's permission",
1918
+ "ui.consents.archive.pace.service": "the service's pace {pace}",
1919
+ "ui.consents.archive.pace.images": "images {pace}",
1920
+ "ui.consents.pending": "waiting for the user's word: {items}",
1921
+ "ui.consents.pending.permission": "{title} (images)",
1922
+ "ui.consents.pending.takeover": "the archives' levels of {names} (strom allow archive --accept)",
1923
+ "ui.consents.pending.milder": "{connector} gives {host} a milder level: {to}",
1924
+ "ui.consents.pace.about": "pace: one request at a time per host — the service's pace (its connector says it), else ≥{seconds} s apart; an hourly cap only where the service or the person sets one; slower while a host answers slowly, a wait when it says its limit is used up; its robots.txt read once a day (the paths it keeps tools off not asked, its Crawl-delay the slowest pace); a refusal stops for a day — one of strom's client until the person lifts it (strom allow host <host> --unblock) · the person's own for a host: strom allow host <host> --pace <seconds> --per-hour <n>",
1925
+ "ui.consents.logins": "logins saved (strom login): {names}",
1926
+ "ui.consents.revoke": "take back: strom allow connector <name> --revoke · strom allow host <host> --revoke · strom allow archive <host> --revoke",
1927
+ "ui.consents.reason.client": "refused strom's automated access ({details})",
1928
+ "ui.consents.reason.refused": "refused automated access ({details})",
1929
+ "ui.consents.reason.login": "refused the login ({details})",
1930
+ "ui.consents.reason.slow": "asked twice to slow down ({details})",
1931
+ "ui.consents.reason.silent": "no answer ({details}; the server is down, or it blocks this computer's IP address)",
1932
+ "ui.consents.reason.browser.slow": "asked the browser to slow down ({details})",
1933
+ "ui.consents.reason.browser": "refused the browser ({details})",
1879
1934
  };
1880
1935
  /** A text for the person, in their language. */
1881
1936
  export function ui(lang, key, values = {}) {