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

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.6. 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,14 @@ 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í.
35
+ Když jsou události regionu sebrané, roky, kdy v něm lidé stromu žili víc než 15 let po sobě bez jediné události,
36
+ se prohledají ještě jednou; prohledané roky se v žádném výzkumu znovu neotevřou, dokud se o region nepožádá znovu.
32
37
 
33
38
  ## 1.21.0
34
39
 
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.6. 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,16 @@ 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.
40
+ Sind die Ereignisse einer Region gesammelt, werden die Jahre, in denen die Personen des Stammbaums dort mehr als
41
+ 15 Jahre in Folge ohne ein Ereignis lebten, noch einmal durchsucht; durchsuchte Jahre werden in keiner Forschung
42
+ erneut aufgegriffen, bis die Region wieder angefragt wird.
37
43
 
38
44
  ## 1.21.0
39
45
 
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.6. 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,17 @@ 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.
39
+ Once a region's events are gathered, the years the tree's people lived there for more than 15 in a row with no
40
+ event are looked through once more; years looked through are not raised again, in any research, until the region
41
+ is asked for again.
34
42
 
35
43
  ## 1.21.0
36
44
 
@@ -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,13 +724,20 @@
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é",
734
+ "history.gaps.what": "Události dějin v regionu {region} pro roky, kdy katalog žádné nemá: {years}",
735
+ "history.gaps.why": "osoby stromu tam v těch letech žily a u jejich životů se z tehdejších dějin nic neukazuje",
736
+ "history.gaps.done": "zhruba jedna událost na 10–15 let každé mezery, každá ze stránky, kterou strom sám přečetl – nebo nic, když žádná událost hodná zápisu doložená není",
737
+ "history.gaps.filled": "v událostech regionu {region} už žádná mezera není",
738
+ "history.gaps.looked.none": "roky {years} v událostech regionu {region} už prohledal jiný výzkum: doložená událost v nich žádná",
739
+ "history.gaps.looked.some": "roky {years} v událostech regionu {region} už prohledal jiný výzkum: zapsaných událostí v nich: {n}",
740
+ "history.gaps.gone": "roky {years} už pro tento strom nejsou mezerou v událostech regionu {region}: údaje jeho osob v tom regionu se změnily",
735
741
  "review.reread.what": "Přečíst znovu modelem {model}, o co se opírají údaje osoby {name}: {list}{more}",
736
742
  "review.reread.why": "tyto zápisy četl jen jiný model; {model} je ten, kterým uživatel čte teď ({research})",
737
743
  "review.reread.done": "zápis každého údaje přečtený naslepo modelem {model} (strom read M… --blind): shoda → poznámka u údaje; rozdíl → rozpor s oběma čteními",
@@ -1169,6 +1175,7 @@
1169
1175
  "ui.history.past.hidden": "Skryto: {event} – {where}",
1170
1176
  "ui.history.past.shown": "Znovu zobrazeno: {event} – {where}",
1171
1177
  "ui.history.past.same": "Beze změny: {event} – {where}",
1178
+ "ui.history.past.first": "Dějiny regionu {region} přijdou na řadu první z regionů, při nejbližším sezení dějin.",
1172
1179
  "ui.history.past.redo": "Události regionu {region} se budou hledat znovu (nalezené zůstávají).",
1173
1180
  "ui.browse.plan": "Co agent udělá dál",
1174
1181
  "ui.review.new": "{name} — {n, plural, one {# nový úkol} few {# nové úkoly} other {# nových úkolů}}:",
@@ -1719,7 +1726,7 @@
1719
1726
  "ui.archives.agentbrowser.off": "Vrátit prohlížeč jen pro archivy přes prohlížeč?",
1720
1727
  "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
1728
  "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.",
1729
+ "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
1730
  "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
1731
  "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
1732
  "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 +2679,28 @@
2672
2679
  "ui.link.archive.none": "O tomto archivu tu není co rozhodnout. Nic se nestalo.",
2673
2680
  "ui.experiments.link": "Hledání událostí dějin se zapíná jen v terminálu, který otevře odkaz.",
2674
2681
  "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.",
2682
+ "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.",
2683
+ "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.",
2684
+ "ui.history.pace.ask": "Jak často hledat události dějin, když agent pracuje sám?",
2685
+ "ui.history.pace.sometimes": "občas – zhruba každé 5. sezení",
2686
+ "ui.history.pace.rare": "zřídka – zhruba každé 10. sezení",
2687
+ "ui.history.pace.idle": "jen když rodinný výzkum nemá co dělat",
2688
+ "ui.history.pace.default": " (výchozí)",
2689
+ "ui.history.pace.later": "Jak často, jde později změnit: strom config set experiments.historyPace sometimes|rare|idle.",
2690
+ "ui.history.pace.off": "vypnuto – dějiny se nehledají",
2691
+ "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:",
2692
+ "ui.alone.history": "Dějiny míst: {state}",
2693
+ "ui.consent.history.pace": "Hledat události dějin častěji – {pace}? Stojí to víc času agenta i čerpání předplatného.",
2694
+ "ui.plan.history": "Dějiny míst: {what} – {when}.",
2695
+ "ui.plan.history.now": "v příštím sezení",
2696
+ "ui.plan.history.places": "příští sezení – nejdřív zmapovat místa",
2697
+ "ui.plan.history.in": "za ~{n} sezení",
2698
+ "ui.plan.history.idle": "až rodinný výzkum nebude mít co dělat",
2699
+ "ui.plan.history.asked": "; přednost: {region}, na přání",
2700
+ "ui.plan.history.order": "Regiony na řadě, po jednom: {list}",
2701
+ "ui.plan.history.weight": "{region} (osob: {n})",
2702
+ "ui.plan.history.gaps": "{region}, roky bez událostí {years} (osob: {n})",
2703
+ "ui.plan.history.prefer": "; přednost: místo {place} z nedávného sezení",
2677
2704
  "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
2705
  "ui.link.experiment.on.done": "Hledání událostí dějin je pro tento výzkum zapnuté.",
2679
2706
  "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,13 +724,20 @@
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",
734
+ "history.gaps.what": "Ereignisse der Geschichte in {region} für die Jahre, in denen der Katalog keines hat: {years}",
735
+ "history.gaps.why": "Personen des Stammbaums lebten in diesen Jahren dort, und bei ihren Lebensläufen erscheint nichts von der damaligen Geschichte",
736
+ "history.gaps.done": "etwa ein Ereignis alle 10–15 Jahre jeder Lücke, jedes von einer Seite, die strom selbst gelesen hat – oder keines, wenn kein Ereignis, das einen Eintrag wert ist, belegt ist",
737
+ "history.gaps.filled": "in den Ereignissen von {region} ist keine Lücke mehr",
738
+ "history.gaps.looked.none": "die Jahre {years} in den Ereignissen von {region} hat schon eine andere Forschung durchsucht: kein Ereignis darin belegt",
739
+ "history.gaps.looked.some": "die Jahre {years} in den Ereignissen von {region} hat schon eine andere Forschung durchsucht: darin geschriebene Ereignisse: {n}",
740
+ "history.gaps.gone": "die Jahre {years} sind für diesen Stammbaum keine Lücke in den Ereignissen von {region} mehr: die Angaben seiner Personen dort haben sich geändert",
735
741
  "review.reread.what": "Mit {model} neu lesen, worauf die Angaben von {name} beruhen: {list}{more}",
736
742
  "review.reread.why": "diese Einträge hat nur ein anderes Modell gelesen; mit {model} liest der Nutzer jetzt ({research})",
737
743
  "review.reread.done": "der Eintrag jeder Angabe blind mit {model} gelesen (strom read M… --blind): übereinstimmend → Notiz an der Angabe; abweichend → ein Widerspruch mit beiden Lesungen",
@@ -1169,6 +1175,7 @@
1169
1175
  "ui.history.past.hidden": "Ausgeblendet: {event} – {where}",
1170
1176
  "ui.history.past.shown": "Wieder angezeigt: {event} – {where}",
1171
1177
  "ui.history.past.same": "Unverändert: {event} – {where}",
1178
+ "ui.history.past.first": "Die Geschichte von {region} kommt als erste der Regionen an die Reihe, bei der nächsten Sitzung der Geschichte.",
1172
1179
  "ui.history.past.redo": "Die Ereignisse von {region} werden erneut gesucht (die gefundenen bleiben).",
1173
1180
  "ui.browse.plan": "Was der Agent als Nächstes tut",
1174
1181
  "ui.review.new": "{name} — {n, plural, one {# neue Aufgabe} other {# neue Aufgaben}}:",
@@ -1719,7 +1726,7 @@
1719
1726
  "ui.archives.agentbrowser.off": "Zurück zum Browser nur für Archive über den Browser?",
1720
1727
  "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
1728
  "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.",
1729
+ "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
1730
  "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
1731
  "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
1732
  "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 +2679,28 @@
2672
2679
  "ui.link.archive.none": "Über dieses Archiv gibt es hier nichts zu entscheiden. Es ist nichts geschehen.",
2673
2680
  "ui.experiments.link": "Die Suche nach den Ereignissen der Geschichte wird nur im Terminal eingeschaltet, das der Link öffnet.",
2674
2681
  "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.",
2682
+ "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.",
2683
+ "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.",
2684
+ "ui.history.pace.ask": "Wie oft nach den Ereignissen der Geschichte suchen, wenn der Agent allein arbeitet?",
2685
+ "ui.history.pace.sometimes": "gelegentlich – etwa jede 5. Sitzung",
2686
+ "ui.history.pace.rare": "selten – etwa jede 10. Sitzung",
2687
+ "ui.history.pace.idle": "nur wenn die Familienforschung nichts zu tun hat",
2688
+ "ui.history.pace.default": " (Standard)",
2689
+ "ui.history.pace.later": "Wie oft, lässt sich später ändern: strom config set experiments.historyPace sometimes|rare|idle.",
2690
+ "ui.history.pace.off": "aus – keine Geschichte gesucht",
2691
+ "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:",
2692
+ "ui.alone.history": "Geschichte der Orte: {state}",
2693
+ "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.",
2694
+ "ui.plan.history": "Geschichte der Orte: {what} – {when}.",
2695
+ "ui.plan.history.now": "in der nächsten Sitzung",
2696
+ "ui.plan.history.places": "nächste Sitzung – zuerst die Orte zuordnen",
2697
+ "ui.plan.history.in": "in ~{n} Sitzungen",
2698
+ "ui.plan.history.idle": "wenn die Familienforschung nichts zu tun hat",
2699
+ "ui.plan.history.asked": "; zuerst: {region}, auf Bitte",
2700
+ "ui.plan.history.order": "Regionen der Reihe nach, eine nach der anderen: {list}",
2701
+ "ui.plan.history.weight": "{region} (Personen: {n})",
2702
+ "ui.plan.history.gaps": "{region}, die Jahre ohne Ereignisse {years} (Personen: {n})",
2703
+ "ui.plan.history.prefer": "; zuerst: der Ort {place} aus einer kürzlichen Sitzung",
2677
2704
  "ui.link.experiment.all": "Es wird in den Einstellungen dieses Computers eingeschaltet: für alle Forschungen darauf (jede lässt sich einzeln ausschalten).",
2678
2705
  "ui.link.experiment.on.done": "Die Suche nach den Ereignissen der Geschichte ist für diese Forschung eingeschaltet.",
2679
2706
  "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, forGaps, GAP_DENSITY, gapsOfTask, gapText, 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;
@@ -44,7 +44,7 @@ const ONLY_FROM_PAGES = [
44
44
  export function historySections(tree, task, shared, alone) {
45
45
  const region = regionOfTask(task);
46
46
  if (region)
47
- return regionSections(tree, region, shared, alone);
47
+ return regionSections(tree, region, shared, alone, forGaps(task) ? gapsOfTask(task) : undefined);
48
48
  if (task.origin === HISTORY_PLACES_ORIGIN)
49
49
  return placesSections(tree, shared, alone);
50
50
  return undefined;
@@ -63,7 +63,10 @@ function closing(alone, lang, lines) {
63
63
  ].join("\n"),
64
64
  };
65
65
  }
66
- function regionSections(tree, region, shared, alone) {
66
+ /** What events a region's catalog keeps: those that shaped the lives of ordinary people there. */
67
+ const SHAPED = "those that shaped the lives of ordinary people there: wars and their levies, epidemics, famines, censuses, changes of the state and its borders, waves of emigration, laws on serfdom, land, schools, religion, great disasters; no lists of rulers, no battles far away, no happening of one village";
68
+ /** A region's session — or, with its gaps, a session filling the gaps of its finished catalog (K2.6). */
69
+ function regionSections(tree, region, shared, alone, gaps) {
67
70
  const lang = tree.lang;
68
71
  const c = shared ? readCatalog(shared, region) : undefined;
69
72
  const name = regionName(c, lang, region);
@@ -80,19 +83,26 @@ function regionSections(tree, region, shared, alone) {
80
83
  if (hiddenOf.has(e.id))
81
84
  byKind.set(e.kind, (byKind.get(e.kind) ?? 0) + hiddenOf.get(e.id));
82
85
  const room = Math.max(0, REGION_DENSITY - live.length);
86
+ const span = (g) => g.to - g.from + 1;
87
+ const wanted = gaps?.reduce((n, g) => n + Math.max(1, Math.round(span(g) / GAP_DENSITY)), 0) ?? 0;
83
88
  const out = [];
84
89
  out.push({
85
90
  name: "history",
86
91
  required: true,
87
92
  pointer: "strom history status",
88
93
  text: [
89
- `## The history of ${name} (${region}) — an experiment, for the Strom app`,
94
+ gaps ? `## The gaps in the history of ${name} (${region}) — for the Strom app` : `## The history of ${name} (${region}) — for the Strom app`,
90
95
  "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
- `- 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`,
96
+ gaps
97
+ ? `- the region's catalog is finished, yet these years of this tree's people there have no event: ${gaps.map((g) => `${gapText(g)} (${span(g)} years)`).join(", ")} — look for events of these years alone (strom history add refuses others in this session); what the catalog has (below) is never looked for again`
98
+ : `- 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
99
  period.places.length
93
100
  ? `- this tree's places in it: ${period.places.map((p) => `${p.place}${p.from !== undefined || p.to !== undefined ? ` (${p.from ?? "…"}–${p.to ?? "…"})` : ""}${p.years.length ? ` facts ${years(Math.min(...p.years), Math.max(...p.years))}` : ""}`).join(" · ")}`
94
101
  : "",
95
- `- how many: at most about ${REGION_DENSITY} events for the region, rather fewer (${live.length} written${room ? `, room for about ${room} more` : ": enough — only what is missing badly"}) — those that shaped the lives of ordinary people there: wars and their levies, epidemics, famines, censuses, changes of the state and its borders, waves of emigration, laws on serfdom, land, schools, religion, great disasters; no lists of rulers, no battles far away, no happening of one village`,
102
+ gaps
103
+ ? `- how many: about one event every 10–15 years of each gap (about ${wanted} in all) — ${SHAPED}; none documented worth writing: nothing — a year is never filled for its own sake`
104
+ : `- how many: at most about ${REGION_DENSITY} events for the region, rather fewer (${live.length} written${room ? `, room for about ${room} more` : ": enough — only what is missing badly"}) — ${SHAPED}`,
105
+ gaps ? "" : "- spread over the period: the people of every part of it lived through something — rather an event each 10–15 years of it than many of a few decades",
96
106
  `- kinds: ${EVENT_KINDS.join(", ")}`,
97
107
  `- each event: its years (the day only when sure: --date); its texts in ${REGION_LANGS.join(", ")}, each ≤ 300 characters — factual and impersonal: what happened, where, how many; never addressed to anyone, never what to do, never speaking as yourself; --why-*: why it mattered for the people of the place; --tip-*: where a research may look because of it (a kind of record, an archive's series), impersonal too`,
98
108
  "- a hard event (persecution, deportation, expulsion, famine, a pogrom): --sensitive; sober and factual, no judgement, no words of horror, and never a guess about the people of this tree — whom it touched is the reader's to see",
@@ -118,14 +128,36 @@ function regionSections(tree, region, shared, alone) {
118
128
  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
129
  ].filter(Boolean).join("\n"),
120
130
  });
121
- const commands = [cmd(["history", "page"]), cmd(["history", "add"]), cmd(["history", "retract"]), cmd(["history", "status"]), cmd(["history", "done"])].filter(Boolean);
131
+ // a state whose lands are done: their catalogs hold its events for these places and years — only what they lack
132
+ const cover = coveredBy(tree, shared, region);
133
+ if (cover.length) {
134
+ const theirs = cover.flatMap((id) => (shared ? (readCatalog(shared, id)?.events ?? []) : []).filter((e) => !e.retracted && e.to >= period.from).map((e) => ({ id, e })));
135
+ out.push({
136
+ name: "covered",
137
+ first: true,
138
+ pointer: "strom history status --app --json",
139
+ text: [
140
+ `## Found already for the same places and years: ${cover.join(", ")} (finished, ${theirs.length} events) — the Strom app shows them at these places`,
141
+ "- 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)",
142
+ gaps ? "- they lack nothing worth writing: strom session close --done at once, no page read" : `- they lack nothing worth writing: strom history done ${region} at once, no page read`,
143
+ ...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] ?? "")}"`),
144
+ theirs.length > EVENTS_SHOWN ? ` … ${theirs.length - EVENTS_SHOWN} more: strom history status --app --json` : "",
145
+ ].filter(Boolean).join("\n"),
146
+ });
147
+ }
148
+ const commands = [cmd(["history", "page"]), cmd(["history", "add"]), cmd(["history", "retract"]), cmd(["history", "status"]), ...(gaps ? [] : [cmd(["history", "done"])])].filter(Boolean);
122
149
  if (commands.length)
123
150
  out.push({ name: "commands", first: true, pointer: "strom help history add", text: ["## Commands (each option as it is)", ...commands].join("\n") });
124
- out.push(closing(alone, lang, [
125
- `- the events of the period found (or nothing more worth writing): strom history done ${region}, then strom session close --done "how many events, of which kinds, from which sources" --next "…"`,
126
- `- time up before: strom session close --continue --summary "…" --next "the kinds or years not looked at yet" (the region stays this tree's for ${HOLD_DAYS} days)`,
127
- `- nothing could be found or read at all: strom session close --continue --summary "what was tried" --next "…"`,
128
- ]));
151
+ out.push(closing(alone, lang, gaps
152
+ ? [
153
+ `- the gaps looked at — events found, or none documented: strom session close --done "how many events, of which years and kinds, from which sources — or what was looked at" --next "…" (these years are never looked for again)`,
154
+ `- time up before: strom session close --continue --summary "…" --next "the years not looked at yet" (the region stays this tree's for ${HOLD_DAYS} days)`,
155
+ ]
156
+ : [
157
+ `- the events of the period found (or nothing more worth writing): strom history done ${region}, then strom session close --done "how many events, of which kinds, from which sources" --next "…"`,
158
+ `- time up before: strom session close --continue --summary "…" --next "the kinds or years not looked at yet" (the region stays this tree's for ${HOLD_DAYS} days)`,
159
+ `- nothing could be found or read at all: strom session close --continue --summary "what was tried" --next "…"`,
160
+ ]));
129
161
  return out;
130
162
  }
131
163
  function placesSections(tree, shared, alone) {
@@ -160,7 +192,7 @@ function placesSections(tree, shared, alone) {
160
192
  required: true,
161
193
  pointer: "strom history status",
162
194
  text: [
163
- "## The places of the facts on the map of history — an experiment, for the Strom app",
195
+ "## The places of the facts on the map of history — for the Strom app",
164
196
  "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
197
  "- 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
198
  "- 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 +241,7 @@ export function localEventsSection() {
209
241
  name: "local events",
210
242
  pointer: "strom help history local",
211
243
  text: [
212
- "## Local events (an experiment)",
244
+ "## Local events",
213
245
  "- 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
246
  line,
215
247
  ].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,28 @@ 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.gaps": "{region}, the years without events {years} (people: {n})",
2547
+ "ui.plan.history.prefer": "; first: the place {place} from a recent session",
2528
2548
  "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
2549
  "ui.link.experiment.on.done": "The search for the events of history is on for this research.",
2530
2550
  "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")