strom-research 1.22.0-beta.4 → 1.22.0-beta.5

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.
package/CHANGELOG.cs.md CHANGED
@@ -7,7 +7,7 @@ Změny každé verze ve zkratce. Úplné poznámky a instalační řádky jsou n
7
7
 
8
8
  ## 1.22.0
9
9
 
10
- *Připravuje se: bety do 1.22.0-beta.4. Oddíl bude úplný s vydáním.*
10
+ *Připravuje se: bety do 1.22.0-beta.5. Oddíl bude úplný s vydáním.*
11
11
 
12
12
  - **Jméno jednou v tom, co čeká.** Úkol k materiálu poslanému z aplikace Strom jmenoval ve widgetu a na stránce
13
13
  telefonu každého člověka dvakrát (podruhé v hranatých závorkách) a jeho text bez jmen nechal prázdné závorky; menu,
@@ -26,9 +26,12 @@ Změny každé verze ve zkratce. Úplné poznámky a instalační řádky jsou n
26
26
  tam, kde skončil; když mlčí dál, hned skončí. Takový výpadek už nezmenšuje dávky čtení.
27
27
  - **Brána týdne předplatného pustí víc sezení za sebou.** Když jednou čeká na náskok, pustí znovu až se dvěma body navíc
28
28
  (při 15: 17), místo jednoho sezení po každém čekání.
29
- - **Experiment: co předek zažil.** Pokusné a ve výchozím stavu vypnuté: události v místech stromu – dějiny kraje ze
30
- stránek, které strom sám stáhl a ověřil, místní události z přečtených záznamů – ukáže aplikace Strom. Zapnout ho
31
- může jen člověk; dokud je vypnuté, nic se nehledá.
29
+ - **Co předek zažil.** Události v místech stromu – dějiny kraje ze stránek, které strom sám stáhl a ověřil, místní
30
+ události z přečtených záznamů – ukáže aplikace Strom; úvodní nastavení ho nabízí zapnuté, instalace nastavená dřív
31
+ zůstává, jak je, samo se nic nezapne. Zapnout ho může jen člověk; dokud je vypnuté, nic se nehledá. Po zapnutí se místa zmapují hned v dalším sezení a regiony se
32
+ prohledávají průběžně mezi sezeními rodinného výzkumu: zhruba každé 5. sezení (výchozí), každé 10., nebo jen když
33
+ není co jiného (`strom config set experiments.historyPace`, úvodní nastavení, Nastavení); kdy, řekne `strom plan`.
34
+ Nejdřív regiony s nejvíc osobami, země před státem nad ní.
32
35
 
33
36
  ## 1.21.0
34
37
 
package/CHANGELOG.de.md CHANGED
@@ -7,7 +7,7 @@ Die Änderungen jeder Version in Kürze. Die vollständigen Hinweise und die Ins
7
7
 
8
8
  ## 1.22.0
9
9
 
10
- *In Vorbereitung: die Betas bis 1.22.0-beta.4. Der Abschnitt ist mit dem Release vollständig.*
10
+ *In Vorbereitung: die Betas bis 1.22.0-beta.5. Der Abschnitt ist mit dem Release vollständig.*
11
11
 
12
12
  - **Jeder Name einmal in dem, was wartet.** Eine Aufgabe zu Material, das aus der Strom-App gesendet wurde, nannte im
13
13
  Widget und auf der Seite des Telefons jede Person zweimal (das zweite Mal in eckigen Klammern), und ihr Text ohne
@@ -30,10 +30,13 @@ Die Änderungen jeder Version in Kürze. Die vollständigen Hinweise und die Ins
30
30
  Ausfall verkleinert die Lesestapel nicht mehr.
31
31
  - **Das Tor der Abo-Woche lässt mehrere Sitzungen hintereinander laufen.** Wartet es einmal auf Vorsprung, lässt es
32
32
  erst mit zwei Punkten mehr wieder los (bei 15: 17), statt einer Sitzung nach jedem Warten.
33
- - **Ein Experiment: was die Vorfahren erlebten.** Experimentell und standardmäßig aus: die Ereignisse an den Orten des
34
- Stammbaums – die Geschichte einer Region aus Seiten, die strom selbst geladen und geprüft hat, örtliche Ereignisse
35
- aus gelesenen Einträgen – zeigt die Strom-App. Einschalten kann es nur ein Mensch; solange es aus ist, wird nichts
36
- gesucht.
33
+ - **Was die Vorfahren erlebten.** Die Ereignisse an den Orten des Stammbaums – die Geschichte einer Region aus Seiten,
34
+ die strom selbst geladen und geprüft hat, örtliche Ereignisse aus gelesenen Einträgen – zeigt die Strom-App. Die
35
+ Ersteinrichtung schlägt es eingeschaltet vor; eine früher eingerichtete Installation bleibt, wie sie ist, nichts
36
+ schaltet sich von selbst ein. Einschalten kann es nur ein Mensch; solange es aus ist, wird nichts gesucht. Eingeschaltet, werden die Orte in der nächsten Sitzung zugeordnet und die Regionen ab und zu zwischen den
37
+ Sitzungen der Familienforschung durchsucht: etwa jede 5. Sitzung (Standard), jede 10. oder nur, wenn nichts anderes
38
+ ansteht (`strom config set experiments.historyPace`, die Ersteinrichtung, die Einstellungen); wann, sagt `strom plan`.
39
+ Zuerst die Regionen mit den meisten Personen, ein Land vor dem Staat darüber.
37
40
 
38
41
  ## 1.21.0
39
42
 
package/CHANGELOG.md CHANGED
@@ -7,7 +7,7 @@ The changes of each version in short. The full notes and the install lines are o
7
7
 
8
8
  ## 1.22.0
9
9
 
10
- *In preparation: the betas up to 1.22.0-beta.4. The section is complete with the release.*
10
+ *In preparation: the betas up to 1.22.0-beta.5. The section is complete with the release.*
11
11
 
12
12
  - **Each name once in what waits.** A task for material sent from the Strom app named each person twice in the
13
13
  widget and on the phone's page (the second time in brackets), and its text without names kept empty brackets; the
@@ -28,9 +28,14 @@ The changes of each version in short. The full notes and the install lines are o
28
28
  smaller.
29
29
  - **The gate of the subscription's week lets several sessions run in a row.** Once it waits for points in hand, it goes again only
30
30
  with two more (at 15: 17), instead of one session after every wait.
31
- - **An experiment: what the ancestors lived through.** Experimental and off by default: the events at the places of
32
- the tree — the history of a region from pages strom downloaded and checked itself, local events from the records
33
- read — shown by the Strom app. Only a person turns it on; while it is off, nothing is looked for.
31
+ - **What the ancestors lived through.** The events at the places of the tree — the history of a region from pages
32
+ strom downloaded and checked itself, local events from the records read — shown by the Strom app. The first setup
33
+ suggests it on; an installation set up before stays as it is, nothing turns on by itself. Only a person turns it
34
+ on; while it is off, nothing is looked for. Once on, the
35
+ places are mapped in the next session, and the regions are searched now and then between the family research's
36
+ sessions: about every 5th (the default), every 10th, or only when nothing else is left
37
+ (`strom config set experiments.historyPace`, the setup, the settings); `strom plan` says when. The regions
38
+ of the most people come first, a land before the state above it.
34
39
 
35
40
  ## 1.21.0
36
41
 
@@ -544,7 +544,6 @@
544
544
  "ui.run.stop.user": "zastaveno ručně",
545
545
  "ui.run.stop.time": "časový limit",
546
546
  "ui.run.stop.empty": "žádné otevřené úkoly",
547
- "ui.run.stop.history": "dějiny míst počkají do zítřka: bez podmínky (run.gate) jedno sezení denně, nic jiného k práci",
548
547
  "ui.run.stop.asleep": "do {at} není co dělat – zbylé úkoly potřebují {host}, který teď neodpovídá",
549
548
  "ui.run.stop.problems": "doklady mají problém – strom check",
550
549
  "ui.run.stop.denied": "agent nesměl spouštět strom – nepustila ho jeho oprávnění nebo sandbox; nic dalšího se nespustilo",
@@ -725,11 +724,11 @@
725
724
  "history.why.archive": "Dokud je výzkum vedený jako archiv, nic se nehledá.",
726
725
  "history.why.held": "Události regionu {region} hledá jiný výzkum na tomto počítači.",
727
726
  "history.places.what": "Místa údajů pro dějiny předků ({n}): regiony, kam které patřilo, i s roky",
728
- "history.places.why": "události dějin (války, epidemie, sčítání lidu, změny státu) se ukazují u míst údajů podle regionů, kam patřila – pokus",
727
+ "history.places.why": "události dějin (války, epidemie, sčítání lidu, změny státu) se ukazují u míst údajů podle regionů, kam patřila",
729
728
  "history.places.done": "každé místo přiřazené k regionům i s roky, nebo označené jako nedohledané",
730
729
  "history.region.what": "Události dějin v regionu {region}: války, epidemie, sčítání lidu, změny státu, vystěhovalectví",
731
730
  "history.region.where": "encyklopedie, státní instituce, archivy, Wikipedie v jazyce regionu s jejími odkazy",
732
- "history.region.why": "co předkové zažili, ukázané u jejich životů – pokus",
731
+ "history.region.why": "co předkové zažili, ukázané u jejich životů",
733
732
  "history.region.done": "důležité události období nalezené, každá ze stránky, kterou strom sám přečetl (nanejvýš asi 60); katalog regionu označený jako hotový",
734
733
  "history.region.finished": "události regionu {region} jsou hotové",
735
734
  "review.reread.what": "Přečíst znovu modelem {model}, o co se opírají údaje osoby {name}: {list}{more}",
@@ -1169,6 +1168,7 @@
1169
1168
  "ui.history.past.hidden": "Skryto: {event} – {where}",
1170
1169
  "ui.history.past.shown": "Znovu zobrazeno: {event} – {where}",
1171
1170
  "ui.history.past.same": "Beze změny: {event} – {where}",
1171
+ "ui.history.past.first": "Dějiny regionu {region} přijdou na řadu první z regionů, při nejbližším sezení dějin.",
1172
1172
  "ui.history.past.redo": "Události regionu {region} se budou hledat znovu (nalezené zůstávají).",
1173
1173
  "ui.browse.plan": "Co agent udělá dál",
1174
1174
  "ui.review.new": "{name} — {n, plural, one {# nový úkol} few {# nové úkoly} other {# nových úkolů}}:",
@@ -1719,7 +1719,7 @@
1719
1719
  "ui.archives.agentbrowser.off": "Vrátit prohlížeč jen pro archivy přes prohlížeč?",
1720
1720
  "ui.consent.remote": "Spouštět sezení Claude Code, která strom otevírá, se vzdáleným ovládáním (Remote Control), aby je šlo sledovat a řídit z claude.ai nebo z aplikace Claude v telefonu?",
1721
1721
  "ui.consent.addons": "Dovolit agentovi při samostatné práci načíst osobní doplňky z jeho nastavení (skilly, pluginy, MCP servery – třeba i poštu nebo dokumenty) jako v chatu? Pracuje přitom bez dozoru.",
1722
- "ui.consent.history": "Hledat události dějin v místech všech výzkumů na tomto počítači – války, epidemie, sčítání, změny státu? Experiment: agent je hledá, jen když rodinný výzkum nemá co dělat, a stojí to jeho čas i čerpání předplatného.",
1722
+ "ui.consent.history": "Hledat události dějin v místech všech výzkumů na tomto počítači – války, epidemie, sčítání, změny státu? Agent je hledá průběžně mezi sezeními rodinného výzkumu a stojí to jeho čas i čerpání předplatného.",
1723
1723
  "ui.consent.effort": "Nastavit sezením {agent}, která spouští strom, hloubku uvažování {effort}? Vyšší hloubka uvažování (high, xhigh) rychleji spotřebuje limity předplatného.",
1724
1724
  "ui.consent.webPerHost": "Dovolit vlastnímu webovému nástroji agenta až {n, plural, one {# požadavek} few {# požadavky} other {# požadavků}} na jeden web (jeho servery a zrcadla dohromady) v sezení (nyní {now})? Více požadavků víc zatěžuje web; více stránek jednoho webu je šetrnější stahovat přes konektor.",
1725
1725
  "ui.consent.effort.run": "Spustit samostatnou práci {agent} pro tento běh s hloubkou uvažování {effort}, vyšší než v nastavení ({now})? Vyšší hloubka uvažování (high, xhigh) rychleji spotřebuje limity předplatného.",
@@ -2672,8 +2672,27 @@
2672
2672
  "ui.link.archive.none": "O tomto archivu tu není co rozhodnout. Nic se nestalo.",
2673
2673
  "ui.experiments.link": "Hledání událostí dějin se zapíná jen v terminálu, který otevře odkaz.",
2674
2674
  "ui.link.what.experiment.history": "hledat události dějin v místech tohoto stromu – války, epidemie, sčítání, změny státu",
2675
- "ui.link.experiment.note": "Experiment: hledá se jen tehdy, když rodinný výzkum nemá co dělat, nejvýš jedno sezení denně do {minutes} minut.",
2676
- "ui.link.experiment.note.gate": "Experiment: hledá se jen tehdy, když rodinný výzkum nemá co dělat; kdy, rozhoduje brána běhů, sezení trvá nejvýš {minutes} minut.",
2675
+ "ui.link.experiment.note": "Hledá se průběžně mezi sezeními rodinného výzkumu (jak často, se vybere hned potom), sezení trvá nejvýš {minutes} minut.",
2676
+ "ui.link.experiment.note.gate": "Hledá se průběžně mezi sezeními rodinného výzkumu (jak často, se vybere hned potom); zda sezení začne, rozhoduje brána běhů, sezení trvá nejvýš {minutes} minut.",
2677
+ "ui.history.pace.ask": "Jak často hledat události dějin, když agent pracuje sám?",
2678
+ "ui.history.pace.sometimes": "občas – zhruba každé 5. sezení",
2679
+ "ui.history.pace.rare": "zřídka – zhruba každé 10. sezení",
2680
+ "ui.history.pace.idle": "jen když rodinný výzkum nemá co dělat",
2681
+ "ui.history.pace.default": " (výchozí)",
2682
+ "ui.history.pace.later": "Jak často, jde později změnit: strom config set experiments.historyPace sometimes|rare|idle.",
2683
+ "ui.history.pace.off": "vypnuto – dějiny se nehledají",
2684
+ "ui.setup.history": "Hledat i události dějin v místech předků – války, epidemie, sčítání, změny státu (agent je hledá mezi sezeními rodinného výzkumu)? Jak často:",
2685
+ "ui.alone.history": "Dějiny míst: {state}",
2686
+ "ui.consent.history.pace": "Hledat události dějin častěji – {pace}? Stojí to víc času agenta i čerpání předplatného.",
2687
+ "ui.plan.history": "Dějiny míst: {what} – {when}.",
2688
+ "ui.plan.history.now": "v příštím sezení",
2689
+ "ui.plan.history.places": "příští sezení – nejdřív zmapovat místa",
2690
+ "ui.plan.history.in": "za ~{n} sezení",
2691
+ "ui.plan.history.idle": "až rodinný výzkum nebude mít co dělat",
2692
+ "ui.plan.history.asked": "; přednost: {region}, na přání",
2693
+ "ui.plan.history.order": "Regiony na řadě, po jednom: {list}",
2694
+ "ui.plan.history.weight": "{region} (osob: {n})",
2695
+ "ui.plan.history.prefer": "; přednost: místo {place} z nedávného sezení",
2677
2696
  "ui.link.experiment.all": "Zapíná se v nastavení tohoto počítače: platí pro všechny výzkumy na něm (každý jde vypnout zvlášť).",
2678
2697
  "ui.link.experiment.on.done": "Hledání událostí dějin je pro tento výzkum zapnuté.",
2679
2698
  "ui.link.experiment.on.already": "Hledání událostí dějin je pro tento výzkum zapnuté už. Nic se nestalo.",
@@ -544,7 +544,6 @@
544
544
  "ui.run.stop.user": "von Hand angehalten",
545
545
  "ui.run.stop.time": "Zeitlimit",
546
546
  "ui.run.stop.empty": "keine offenen Aufgaben",
547
- "ui.run.stop.history": "die Geschichte der Orte wartet bis morgen: ohne Bedingung (run.gate) eine Sitzung am Tag, sonst nichts zu tun",
548
547
  "ui.run.stop.asleep": "bis {at} nichts zu tun – die übrigen Aufgaben brauchen {host}, der gerade nicht antwortet",
549
548
  "ui.run.stop.problems": "die Belege haben Probleme – strom check",
550
549
  "ui.run.stop.denied": "der Agent durfte strom nicht starten – seine Berechtigungen oder seine Sandbox ließen es nicht zu; nichts weiter wurde gestartet",
@@ -725,11 +724,11 @@
725
724
  "history.why.archive": "Solange die Forschung als Archiv geführt wird, wird nichts gesucht.",
726
725
  "history.why.held": "Die Ereignisse von {region} sucht eine andere Forschung auf diesem Computer.",
727
726
  "history.places.what": "Die Orte der Angaben für die Geschichte der Vorfahren ({n}): zu welchen Regionen jeder gehörte, mit den Jahren",
728
- "history.places.why": "die Ereignisse der Geschichte (Kriege, Epidemien, Volkszählungen, Wechsel des Staates) erscheinen an den Orten der Angaben nach den Regionen, zu denen sie gehörten – ein Experiment",
727
+ "history.places.why": "die Ereignisse der Geschichte (Kriege, Epidemien, Volkszählungen, Wechsel des Staates) erscheinen an den Orten der Angaben nach den Regionen, zu denen sie gehörten",
729
728
  "history.places.done": "jeder Ort seinen Regionen mit den Jahren zugeordnet oder als nicht auffindbar vermerkt",
730
729
  "history.region.what": "Ereignisse der Geschichte in {region}: Kriege, Epidemien, Volkszählungen, Wechsel des Staates, Auswanderung",
731
730
  "history.region.where": "Enzyklopädien, staatliche Institutionen, Archive, die Wikipedia in der Sprache der Region mit ihren Belegen",
732
- "history.region.why": "was die Vorfahren erlebten, bei ihren Lebensläufen gezeigt – ein Experiment",
731
+ "history.region.why": "was die Vorfahren erlebten, bei ihren Lebensläufen gezeigt",
733
732
  "history.region.done": "die wichtigen Ereignisse des Zeitraums gefunden, jedes von einer Seite, die strom selbst gelesen hat (höchstens etwa 60); der Katalog der Region als fertig vermerkt",
734
733
  "history.region.finished": "die Ereignisse von {region} sind fertig",
735
734
  "review.reread.what": "Mit {model} neu lesen, worauf die Angaben von {name} beruhen: {list}{more}",
@@ -1169,6 +1168,7 @@
1169
1168
  "ui.history.past.hidden": "Ausgeblendet: {event} – {where}",
1170
1169
  "ui.history.past.shown": "Wieder angezeigt: {event} – {where}",
1171
1170
  "ui.history.past.same": "Unverändert: {event} – {where}",
1171
+ "ui.history.past.first": "Die Geschichte von {region} kommt als erste der Regionen an die Reihe, bei der nächsten Sitzung der Geschichte.",
1172
1172
  "ui.history.past.redo": "Die Ereignisse von {region} werden erneut gesucht (die gefundenen bleiben).",
1173
1173
  "ui.browse.plan": "Was der Agent als Nächstes tut",
1174
1174
  "ui.review.new": "{name} — {n, plural, one {# neue Aufgabe} other {# neue Aufgaben}}:",
@@ -1719,7 +1719,7 @@
1719
1719
  "ui.archives.agentbrowser.off": "Zurück zum Browser nur für Archive über den Browser?",
1720
1720
  "ui.consent.remote": "Die Claude-Code-Sitzungen, die strom öffnet, mit Remote Control starten, damit sie sich auf claude.ai oder in der Claude-App auf dem Telefon verfolgen und steuern lassen?",
1721
1721
  "ui.consent.addons": "Dem allein arbeitenden Agenten erlauben, die persönlichen Erweiterungen aus seinen Einstellungen zu laden (Skills, Plugins, MCP-Server – auch E-Mail oder Dokumente), wie im Chat? Er arbeitet dabei unbeaufsichtigt.",
1722
- "ui.consent.history": "Die Ereignisse der Geschichte an den Orten aller Forschungen auf diesem Computer suchen – Kriege, Epidemien, Volkszählungen, Änderungen des Staates? Ein Experiment: der Agent sucht sie nur, wenn die Familienforschung nichts zu tun hat, und es kostet seine Zeit und die Nutzung des Abos.",
1722
+ "ui.consent.history": "Die Ereignisse der Geschichte an den Orten aller Forschungen auf diesem Computer suchen – Kriege, Epidemien, Volkszählungen, Änderungen des Staates? Der Agent sucht sie ab und zu zwischen den Sitzungen der Familienforschung, und es kostet seine Zeit und die Nutzung des Abos.",
1723
1723
  "ui.consent.effort": "Den Sitzungen von {agent}, die strom startet, den Denkaufwand {effort} geben? Ein höherer Denkaufwand (high, xhigh) verbraucht die Limits des Abonnements schneller.",
1724
1724
  "ui.consent.webPerHost": "Dem eigenen Webabruf des Agenten bis zu {n, plural, one {# Anfrage} other {# Anfragen}} an eine Website (ihre Server und Spiegel zusammen) in einer Sitzung erlauben (jetzt {now})? Mehr Anfragen belasten die Website stärker; mehr Seiten einer Website gehen schonender über einen Connector.",
1725
1725
  "ui.consent.effort.run": "{agent} für diesen Lauf mit dem Denkaufwand {effort} allein arbeiten lassen, höher als in der Einstellung ({now})? Ein höherer Denkaufwand (high, xhigh) verbraucht die Limits des Abonnements schneller.",
@@ -2672,8 +2672,27 @@
2672
2672
  "ui.link.archive.none": "Über dieses Archiv gibt es hier nichts zu entscheiden. Es ist nichts geschehen.",
2673
2673
  "ui.experiments.link": "Die Suche nach den Ereignissen der Geschichte wird nur im Terminal eingeschaltet, das der Link öffnet.",
2674
2674
  "ui.link.what.experiment.history": "die Ereignisse der Geschichte an den Orten dieses Stammbaums suchen – Kriege, Epidemien, Volkszählungen, Änderungen des Staates",
2675
- "ui.link.experiment.note": "Ein Experiment: gesucht wird nur, wenn die Familienforschung nichts zu tun hat, höchstens eine Sitzung am Tag bis {minutes} Minuten.",
2676
- "ui.link.experiment.note.gate": "Ein Experiment: gesucht wird nur, wenn die Familienforschung nichts zu tun hat; wann, entscheidet das Tor der Läufe, eine Sitzung dauert höchstens {minutes} Minuten.",
2675
+ "ui.link.experiment.note": "Gesucht wird ab und zu zwischen den Sitzungen der Familienforschung (wie oft, wird gleich danach gewählt), eine Sitzung dauert höchstens {minutes} Minuten.",
2676
+ "ui.link.experiment.note.gate": "Gesucht wird ab und zu zwischen den Sitzungen der Familienforschung (wie oft, wird gleich danach gewählt); ob eine Sitzung beginnt, entscheidet das Tor der Läufe, eine Sitzung dauert höchstens {minutes} Minuten.",
2677
+ "ui.history.pace.ask": "Wie oft nach den Ereignissen der Geschichte suchen, wenn der Agent allein arbeitet?",
2678
+ "ui.history.pace.sometimes": "gelegentlich – etwa jede 5. Sitzung",
2679
+ "ui.history.pace.rare": "selten – etwa jede 10. Sitzung",
2680
+ "ui.history.pace.idle": "nur wenn die Familienforschung nichts zu tun hat",
2681
+ "ui.history.pace.default": " (Standard)",
2682
+ "ui.history.pace.later": "Wie oft, lässt sich später ändern: strom config set experiments.historyPace sometimes|rare|idle.",
2683
+ "ui.history.pace.off": "aus – keine Geschichte gesucht",
2684
+ "ui.setup.history": "Auch die Ereignisse der Geschichte an den Orten der Vorfahren suchen – Kriege, Epidemien, Volkszählungen, Änderungen des Staates (der Agent sucht sie zwischen den Sitzungen der Familienforschung)? Wie oft:",
2685
+ "ui.alone.history": "Geschichte der Orte: {state}",
2686
+ "ui.consent.history.pace": "Öfter nach den Ereignissen der Geschichte suchen – {pace}? Das kostet mehr Zeit des Agenten und mehr von der Nutzung des Abos.",
2687
+ "ui.plan.history": "Geschichte der Orte: {what} – {when}.",
2688
+ "ui.plan.history.now": "in der nächsten Sitzung",
2689
+ "ui.plan.history.places": "nächste Sitzung – zuerst die Orte zuordnen",
2690
+ "ui.plan.history.in": "in ~{n} Sitzungen",
2691
+ "ui.plan.history.idle": "wenn die Familienforschung nichts zu tun hat",
2692
+ "ui.plan.history.asked": "; zuerst: {region}, auf Bitte",
2693
+ "ui.plan.history.order": "Regionen der Reihe nach, eine nach der anderen: {list}",
2694
+ "ui.plan.history.weight": "{region} (Personen: {n})",
2695
+ "ui.plan.history.prefer": "; zuerst: der Ort {place} aus einer kürzlichen Sitzung",
2677
2696
  "ui.link.experiment.all": "Es wird in den Einstellungen dieses Computers eingeschaltet: für alle Forschungen darauf (jede lässt sich einzeln ausschalten).",
2678
2697
  "ui.link.experiment.on.done": "Die Suche nach den Ereignissen der Geschichte ist für diese Forschung eingeschaltet.",
2679
2698
  "ui.link.experiment.on.already": "Die Suche nach den Ereignissen der Geschichte ist für diese Forschung schon eingeschaltet. Es ist nichts geschehen.",
@@ -6,7 +6,7 @@ import { langName } from "../core/lang.js";
6
6
  import { foldText } from "../core/text.js";
7
7
  import { match } from "../cli/registry.js";
8
8
  import { synopsis } from "./sheet.js";
9
- import { catalogIds, EVENT_KINDS, HISTORY_PLACES_ORIGIN, HOLD_DAYS, readCatalog, readHidden, readPlaces, regionName, regionOfTask, regionPeriod, REGION_LANGS, unmappedPlaces, } from "../core/pastevents.js";
9
+ import { catalogIds, EVENT_KINDS, HISTORY_PLACES_ORIGIN, HOLD_DAYS, readCatalog, readHidden, readPlaces, coveredBy, regionName, regionOfTask, regionPeriod, REGION_LANGS, unmappedPlaces, } from "../core/pastevents.js";
10
10
  import { factPlaces } from "../gedcom/export.js";
11
11
  /** About so many events a region at most: rather fewer. */
12
12
  export const REGION_DENSITY = 60;
@@ -86,7 +86,7 @@ function regionSections(tree, region, shared, alone) {
86
86
  required: true,
87
87
  pointer: "strom history status",
88
88
  text: [
89
- `## The history of ${name} (${region}) — an experiment, for the Strom app`,
89
+ `## The history of ${name} (${region}) — for the Strom app`,
90
90
  "What the ancestors lived through: the events of this region's history, shown in the Strom app with the lives of the people of its places. " + NOTHING_ELSE,
91
91
  `- period: ${period.from}–${period.to} — this tree's places only (the oldest year of their facts in the region, never before 1600, to this year); another tree sharing the region adds its own years when it takes it`,
92
92
  period.places.length
@@ -118,6 +118,23 @@ function regionSections(tree, region, shared, alone) {
118
118
  c?.tried.length ? `Pages strom could not read (never tried again): ${c.tried.slice(-20).map((t) => `${t.url} (${short(t.why, 40)})`).join(" · ")}` : "",
119
119
  ].filter(Boolean).join("\n"),
120
120
  });
121
+ // a state whose lands are done: their catalogs hold its events for these places and years — only what they lack
122
+ const cover = coveredBy(tree, shared, region);
123
+ if (cover.length) {
124
+ const theirs = cover.flatMap((id) => (shared ? (readCatalog(shared, id)?.events ?? []) : []).filter((e) => !e.retracted && e.to >= period.from).map((e) => ({ id, e })));
125
+ out.push({
126
+ name: "covered",
127
+ first: true,
128
+ pointer: "strom history status --app --json",
129
+ text: [
130
+ `## Found already for the same places and years: ${cover.join(", ")} (finished, ${theirs.length} events) — the Strom app shows them at these places`,
131
+ "- write only what they lack: an event of the whole state they do not have; one of them again is never written (not even with --same-as)",
132
+ `- they lack nothing worth writing: strom history done ${region} at once, no page read`,
133
+ ...theirs.slice(0, EVENTS_SHOWN).map(({ e }) => ` ${e.id} ${years(e.from, e.to)} ${e.kind} "${short(e.text[lang] ?? e.text.en ?? Object.values(e.text)[0] ?? "")}"`),
134
+ theirs.length > EVENTS_SHOWN ? ` … ${theirs.length - EVENTS_SHOWN} more: strom history status --app --json` : "",
135
+ ].filter(Boolean).join("\n"),
136
+ });
137
+ }
121
138
  const commands = [cmd(["history", "page"]), cmd(["history", "add"]), cmd(["history", "retract"]), cmd(["history", "status"]), cmd(["history", "done"])].filter(Boolean);
122
139
  if (commands.length)
123
140
  out.push({ name: "commands", first: true, pointer: "strom help history add", text: ["## Commands (each option as it is)", ...commands].join("\n") });
@@ -160,7 +177,7 @@ function placesSections(tree, shared, alone) {
160
177
  required: true,
161
178
  pointer: "strom history status",
162
179
  text: [
163
- "## The places of the facts on the map of history — an experiment, for the Strom app",
180
+ "## The places of the facts on the map of history — for the Strom app",
164
181
  "Each place of the tree's facts gets the regions it belonged to, with the years: the historical land or province and the state whose history its people lived through (a land of a crown, then the state after it). The events are looked for later, region by region. " + NOTHING_ELSE,
165
182
  "- a region's ID: a–z, 0–9 and hyphens, at most 24, the country's code first; a region that exists (below) is used again whenever it is the same unit; a new one gets its names in cs, en and de (strom history region)",
166
183
  "- the years each place belonged to a region: --region <id>:<from>-<to> (an open end allowed); a place in two units at once (a land and its state): both",
@@ -209,7 +226,7 @@ export function localEventsSection() {
209
226
  name: "local events",
210
227
  pointer: "strom help history local",
211
228
  text: [
212
- "## Local events (an experiment)",
229
+ "## Local events",
213
230
  "- an event of the place a source read in this session tells of (a fire, a flood, an epidemic, soldiers quartered — the priest's note in a register): written once, as the source says it, never guessed",
214
231
  line,
215
232
  ].join("\n"),
@@ -13,6 +13,7 @@ import { isArchive } from "../core/mode.js";
13
13
  import { actsAsArchive, kindOf } from "../core/state.js";
14
14
  import { Tree } from "../core/tree.js";
15
15
  import { DEFAULT_RUN_MINUTES } from "../core/config.js";
16
+ import { choosePace } from "../commands/setup.js";
16
17
  import { costPartial, monthSpend, sessionCost } from "../core/session.js";
17
18
  import { adoptAskedSince, adoptFailedSince, adoptedAt, adoptionNeverCame, awaitAdoption, nothingSince, removedByItsDecision, SYNC_INBOX, undoSync, withoutImages } from "../core/sync.js";
18
19
  import { moveToTrash } from "../core/trash.js";
@@ -206,6 +207,12 @@ export async function experimentDo(ctx, run, lang, root, what) {
206
207
  const note = lines(t(ctx.settings.runGate() ? "ui.link.experiment.note.gate" : "ui.link.experiment.note", { minutes }), userOn ? undefined : t("ui.link.experiment.all"));
207
208
  if (!(await asks(ctx, lang, root, t("ui.link.what.experiment.history"), note, false)))
208
209
  return false;
210
+ // how often, asked once it is on for this computer (the pace chosen before suggested): this computer's too
211
+ if (!userOn) {
212
+ const pace = (await choosePace(ctx, ctx.settings.historyPace(undefined))) ?? ctx.settings.historyPace(undefined);
213
+ if ((await run(["config", "set", "experiments.historyPace", pace], true)) !== 0)
214
+ return false;
215
+ }
209
216
  if (!userOn && (await run(["config", "set", "experiments.history", "on"], true)) !== 0)
210
217
  return false;
211
218
  if (treeOff && (await run(["config", "unset", "experiments.history", "--for-tree"], true)) !== 0)
@@ -11,6 +11,7 @@ import { Tree, VERSION } from "../core/tree.js";
11
11
  import { replacedOnDisk } from "../core/self.js";
12
12
  import { modelStep, shortcutName } from "./wizard.js";
13
13
  import { DEFAULT_RUN_MINUTES } from "../core/config.js";
14
+ import { chooseHistory, historySuggested } from "../commands/setup.js";
14
15
  import { askGate, ensureGatesDir, listGates, loadGate } from "../core/gate.js";
15
16
  import { ensureHooksDir, hooksDir, listHooks } from "../core/hooks.js";
16
17
  import { byHandOnly, listConnectors, routeOf, routesOf } from "../core/connector.js";
@@ -365,6 +366,18 @@ async function alone(ctx, run, lang, root) {
365
366
  },
366
367
  });
367
368
  }
369
+ // the experiment of history: how often between the family research's sessions, or off — the person's choice here
370
+ // (before the test of a gate, which shows only with one set: the numbers never move)
371
+ const history = ctx.settings.experimentsHistory(undefined);
372
+ items.push({
373
+ key: "5",
374
+ label: t("ui.alone.history", { state: history ? t(`ui.history.pace.${ctx.settings.historyPace(undefined)}`) : t("ui.settings.off") }),
375
+ act: async () => {
376
+ const h = await chooseHistory(ctx, t("ui.setup.history"), historySuggested(ctx), { back: t("ui.browse.back") });
377
+ if (h)
378
+ await applyHistory(ctx, run, h);
379
+ },
380
+ });
368
381
  if (set && shared)
369
382
  items.push({
370
383
  key: "3",
@@ -390,6 +403,22 @@ async function alone(ctx, run, lang, root) {
390
403
  return { title: t("ui.alone.title"), items };
391
404
  });
392
405
  }
406
+ /**
407
+ * History on at the pace chosen, or off (the settings): through strom config set, as the person would type it — the
408
+ * pace first, so turning it on asks nothing more.
409
+ */
410
+ async function applyHistory(ctx, run, choice) {
411
+ const on = ctx.settings.experimentsHistory(undefined);
412
+ if (choice === "off") {
413
+ if (on)
414
+ await run(["config", "set", "experiments.history", "off"], true);
415
+ return;
416
+ }
417
+ if (choice !== ctx.settings.historyPace(undefined) || ctx.settings.config.experimentsHistoryPace === undefined)
418
+ await run(["config", "set", "experiments.historyPace", choice], true);
419
+ if (!on)
420
+ await run(["config", "set", "experiments.history", "on"], true);
421
+ }
393
422
  /** The gate's name in "claude-usage 10". */
394
423
  function loadGateName(spec) {
395
424
  return spec.trim().split(/\s+/u)[0] ?? "";
package/dist/cli/ui.js CHANGED
@@ -521,7 +521,6 @@ export const UI = {
521
521
  "ui.run.stop.user": "by hand",
522
522
  "ui.run.stop.time": "time limit",
523
523
  "ui.run.stop.empty": "no open tasks",
524
- "ui.run.stop.history": "the history of the places waits until tomorrow: one session a day without a gate (run.gate), nothing else to do",
525
524
  "ui.run.stop.asleep": "nothing to do until {at} — the tasks left need {host}, which is not answering now",
526
525
  "ui.run.stop.problems": "the evidence has problems — strom check",
527
526
  "ui.run.stop.denied": "the agent was not allowed to run strom — its permissions or its sandbox kept it away; nothing more was started",
@@ -1139,6 +1138,7 @@ export const UI = {
1139
1138
  "ui.history.past.hidden": "Hidden: {event} at {where}",
1140
1139
  "ui.history.past.shown": "Shown again: {event} at {where}",
1141
1140
  "ui.history.past.same": "Nothing changed: {event} at {where}",
1141
+ "ui.history.past.first": "The history of {region} comes first of the regions, at the next turn of history.",
1142
1142
  "ui.history.past.redo": "The events of {region} will be looked for again (those found stay).",
1143
1143
  "ui.browse.plan": "What the agent will do next",
1144
1144
  "ui.review.new": "{name} — {n, plural, one {# new task} other {# new tasks}}:",
@@ -1699,7 +1699,7 @@ export const UI = {
1699
1699
  "ui.archives.agentbrowser.off": "Back to the browser only for archives through the browser?",
1700
1700
  "ui.consent.remote": "Start the Claude Code sessions strom opens with Remote Control, so that they can be followed and steered from claude.ai or the Claude app on a phone?",
1701
1701
  "ui.consent.addons": "Let the agent working alone load the personal add-ons of its own settings (skills, plugins, MCP servers — mail or documents among them), as in a conversation? It works with nobody watching.",
1702
- "ui.consent.history": "Look for the events of history at the places of every research on this computer — wars, epidemics, censuses, changes of the state? An experiment: the agent looks for them only when the family research has nothing to do, and it takes its time and the plan's usage.",
1702
+ "ui.consent.history": "Look for the events of history at the places of every research on this computer — wars, epidemics, censuses, changes of the state? The agent looks for them now and then between the sessions of the family research, and it takes its time and the plan's usage.",
1703
1703
  "ui.consent.effort": "Let the {agent} sessions strom starts reason with the effort {effort}? A higher reasoning effort (high, xhigh) uses up the subscription's limits sooner.",
1704
1704
  "ui.consent.webPerHost": "Let the agent's own web fetch make up to {n, plural, one {# request} other {# requests}} to one site (its servers and mirrors together) in a session (now {now})? More requests to one site put more load on it; more pages of one site go more gently through a connector.",
1705
1705
  "ui.consent.effort.run": "Start {agent} working alone with the reasoning effort {effort} for this run, above the setting ({now})? A higher reasoning effort (high, xhigh) uses up the subscription's limits sooner.",
@@ -2523,8 +2523,27 @@ export const UI = {
2523
2523
  "ui.link.archive.none": "There is nothing to decide about this archive here. Nothing was done.",
2524
2524
  "ui.experiments.link": "The search for the events of history is turned on only in the terminal the link opens.",
2525
2525
  "ui.link.what.experiment.history": "look for the events of history at the places of this tree — wars, epidemics, censuses, changes of the state",
2526
- "ui.link.experiment.note": "An experiment: looked for only when the family research has nothing to do, at most one session a day of up to {minutes} minutes.",
2527
- "ui.link.experiment.note.gate": "An experiment: looked for only when the family research has nothing to do; when, the gate of the runs decides, a session of up to {minutes} minutes.",
2526
+ "ui.link.experiment.note": "Looked for now and then between the sessions of the family research (how often is chosen next), a session of up to {minutes} minutes.",
2527
+ "ui.link.experiment.note.gate": "Looked for now and then between the sessions of the family research (how often is chosen next); whether a session starts, the gate of the runs decides, a session of up to {minutes} minutes.",
2528
+ "ui.history.pace.ask": "How often to look for the events of history while the agent works alone?",
2529
+ "ui.history.pace.sometimes": "sometimes — about every 5th session",
2530
+ "ui.history.pace.rare": "rarely — about every 10th session",
2531
+ "ui.history.pace.idle": "only when the family research has nothing to do",
2532
+ "ui.history.pace.default": " (default)",
2533
+ "ui.history.pace.later": "How often changes later: strom config set experiments.historyPace sometimes|rare|idle.",
2534
+ "ui.history.pace.off": "off — not looked for",
2535
+ "ui.setup.history": "The events of history at the ancestors' places too — wars, epidemics, censuses, changes of the state (the agent looks for them between the sessions of the family research)? How often:",
2536
+ "ui.alone.history": "History of the places: {state}",
2537
+ "ui.consent.history.pace": "Look for the events of history more often — {pace}? It takes more of the agent's time and the plan's usage.",
2538
+ "ui.plan.history": "History of the places: {what} — {when}.",
2539
+ "ui.plan.history.now": "next session",
2540
+ "ui.plan.history.places": "next session — the places to map first",
2541
+ "ui.plan.history.in": "in ~{n} sessions",
2542
+ "ui.plan.history.idle": "when the family research has nothing to do",
2543
+ "ui.plan.history.asked": "; first: {region}, as asked",
2544
+ "ui.plan.history.order": "Regions in turn, one at a time: {list}",
2545
+ "ui.plan.history.weight": "{region} (people: {n})",
2546
+ "ui.plan.history.prefer": "; first: the place {place} from a recent session",
2528
2547
  "ui.link.experiment.all": "It is turned on in this computer's settings: for every research on it (each can be turned off on its own).",
2529
2548
  "ui.link.experiment.on.done": "The search for the events of history is on for this research.",
2530
2549
  "ui.link.experiment.on.already": "The search for the events of history is on for this research already. Nothing was done.",
@@ -15,14 +15,14 @@ import { chooseTerminal, suggestedTerminal } from "./terminals.js";
15
15
  import { terminalsHere } from "../core/terminal.js";
16
16
  import { chooseEffort, chooseModel } from "./model-choice.js";
17
17
  import { ADDON_SWITCHES, PROFILES } from "../agents/profiles.js";
18
- import { writeStored, PERMISSION_LEVELS } from "../core/config.js";
18
+ import { DEFAULT_HISTORY_PACE, writeStored, PERMISSION_LEVELS } from "../core/config.js";
19
19
  import { globalTargets, installGlobal } from "../agents/global.js";
20
20
  import { appCopyOfInstall, appOpensLinks, defaultAppUrl, noticeStromApp, researchUrl, STROM_APP_URL, stromAppState, appUrlSetting } from "../core/stromapp.js";
21
21
  import { openForUser } from "../core/open.js";
22
22
  import { createShortcut } from "../core/shortcut.js";
23
23
  import { appMarkFromInstall, linkFiles, linkHandlerState, linkOwner, linksTakeable, registerLinks } from "../core/links.js";
24
24
  import { configDir, desktopDir, isolated, noLinks } from "../core/paths.js";
25
- import { ensureShared } from "../commands/setup.js";
25
+ import { chooseHistory, ensureShared, historySuggested } from "../commands/setup.js";
26
26
  import { moveHome, planMove, repointSettings, sameFolder } from "../core/relocate.js";
27
27
  import { adoptSeal, foundTrees, offerAdopt } from "./seal.js";
28
28
  import { Tree } from "../core/tree.js";
@@ -213,6 +213,19 @@ export async function setupWizard(ctx, opts = {}) {
213
213
  else
214
214
  delete cfg.agentAddons;
215
215
  }
216
+ // 6c. The history of the places — the events at the ancestors' places, looked for between the sessions of the family
217
+ // research: how often, or off. The first setup suggests it on, sometimes (Milan, 28 Oct 2026: no longer an
218
+ // experiment); run again, what is now — an older setup never decided is off and stays so on Enter, nothing turned on
219
+ // by itself. The person's own choice here, in their terminal — as strom config set experiments.history on asks it.
220
+ if (agent) {
221
+ const h = await chooseHistory(ctx, ui(lang, "ui.setup.history"), first ? DEFAULT_HISTORY_PACE : historySuggested(ctx), keep);
222
+ if (h === "off")
223
+ delete cfg.experimentsHistory;
224
+ else if (h) {
225
+ cfg.experimentsHistory = "on";
226
+ cfg.experimentsHistoryPace = h;
227
+ }
228
+ }
216
229
  s.save();
217
230
  // 7. A shortcut on the desktop (asked here, a no suggested again; refreshed quietly after) — none for an isolated
218
231
  // installation (found on Windows: asked, while doctor said "none, on purpose")
@@ -16,6 +16,7 @@ export { humanTask };
16
16
  import { lacksImages, waitsForArchive } from "../core/queue.js";
17
17
  import { clockUp } from "../core/net.js";
18
18
  import { forStory } from "../core/stories.js";
19
+ import { forHistory, HISTORY_PLACES_ORIGIN, historyOn, historyTurn, readCatalog, regionName, regionOfTask } from "../core/pastevents.js";
19
20
  import { isArchive } from "../core/mode.js";
20
21
  import { actsAsArchive, stateOf } from "../core/state.js";
21
22
  import { rankedQueue } from "./tasks.js";
@@ -236,6 +237,17 @@ register({
236
237
  if (stories.length)
237
238
  out.push(ui(lang, "ui.plan.stories", { n: stories.length, names: storyNames.join(", ") }));
238
239
  }
240
+ // the history of the places (strom run's alone): when its next task comes, and why it goes first
241
+ const history = historyPlan(ctx, tree);
242
+ if (history)
243
+ out.push(ui(lang, "ui.plan.history", { what: truncate(humanTask(tree, history.task.what, lang), 110), when: history.when }));
244
+ if (history?.regions.length)
245
+ out.push(ui(lang, "ui.plan.history.order", {
246
+ list: [
247
+ ...history.regions.slice(0, HISTORY_REGIONS).map((r) => ui(lang, "ui.plan.history.weight", { region: r.name, n: r.persons })),
248
+ ...(history.regions.length > HISTORY_REGIONS ? [`… (+${history.regions.length - HISTORY_REGIONS})`] : []),
249
+ ].join(" · "),
250
+ }));
239
251
  if (waiting)
240
252
  out.push(waitingLine(lang, waits, "ui.plan.waiting"));
241
253
  if (queue.length)
@@ -243,7 +255,7 @@ register({
243
255
  const item = (t) => ({ id: t.id, what: humanTask(tree, t.what, lang), level: t.level, state: t.state, needsImages: lacksImages(tree, t) });
244
256
  return {
245
257
  text: lines(...out),
246
- data: { tasks: work.map(item), stories: stories.map(item), waiting, ...(later.length ? { later: later.map(({ t, a }) => ({ ...item(t), until: new Date(a.until).toISOString(), host: a.host })) } : {}) },
258
+ data: { tasks: work.map(item), stories: stories.map(item), waiting, ...(history ? { history: { ...item(history.task), pace: history.turn.pace, now: history.turn.now, ...(history.turn.in !== undefined ? { in: history.turn.in } : {}), ...(history.prefer ? { prefer: history.prefer } : {}), ...(history.asked ? { asked: history.asked } : {}), regions: history.regions } } : {}), ...(later.length ? { later: later.map(({ t, a }) => ({ ...item(t), until: new Date(a.until).toISOString(), host: a.host })) } : {}) },
247
259
  };
248
260
  },
249
261
  }, {
@@ -287,3 +299,39 @@ register({
287
299
  return { text: lines(...out), data: { days, ...r, ...(tuning.length ? { tuning } : {}), ...(refusals.length ? { refusals } : {}) } };
288
300
  },
289
301
  });
302
+ /** How many regions strom plan names in the order they come. */
303
+ const HISTORY_REGIONS = 6;
304
+ /**
305
+ * The next task of history strom run takes (the experiment on): when — the next session, in about n sessions, or once
306
+ * the family research has nothing to do (experiments.historyPace) — the place of a recent session or the person's word
307
+ * that put it first, and the regions in the order they come, one a turn (core/pastevents.ts regionOrder).
308
+ */
309
+ function historyPlan(ctx, tree) {
310
+ const lang = ctx.uiLang();
311
+ if (!historyOn(tree, ctx.settings))
312
+ return undefined;
313
+ const shared = ctx.settings.shared()?.value;
314
+ const turn = historyTurn(tree, shared, ctx.settings);
315
+ const ranked = rankedQueue(tree, { strategy: ctx.settings.strategy(tree.config), history: true }).filter((r) => forHistory(r.task));
316
+ const task = ranked[0]?.task;
317
+ if (!task)
318
+ return undefined;
319
+ const name = (id) => regionName(shared ? readCatalog(shared, id) : undefined, lang, id);
320
+ const asked = turn.asked?.task === task.id ? turn.asked.region : undefined;
321
+ const prefer = !asked && turn.prefer?.task === task.id ? turn.prefer.place : undefined;
322
+ const when = task.origin === HISTORY_PLACES_ORIGIN ? ui(lang, "ui.plan.history.places") : turn.now ? ui(lang, "ui.plan.history.now") : turn.in === undefined ? ui(lang, "ui.plan.history.idle") : ui(lang, "ui.plan.history.in", { n: Math.max(1, turn.in) });
323
+ const weight = new Map((turn.order ?? []).map((w) => [w.id, w]));
324
+ // the regions as the queue ranks their tasks: asked for, a recent session's place, then by weight
325
+ const regions = ranked
326
+ .map((r) => regionOfTask(r.task))
327
+ .filter((id) => !!id)
328
+ .map((id) => ({ id, name: name(id), persons: weight.get(id)?.persons ?? 0 }));
329
+ return {
330
+ task,
331
+ turn,
332
+ when: `${when}${asked ? ui(lang, "ui.plan.history.asked", { region: name(asked) }) : prefer ? ui(lang, "ui.plan.history.prefer", { place: prefer }) : ""}`,
333
+ ...(prefer ? { prefer } : {}),
334
+ ...(asked ? { asked } : {}),
335
+ regions,
336
+ };
337
+ }