strom-research 1.22.0-beta.7 → 1.22.0-beta.8

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.7. Oddíl bude úplný s vydáním.*
10
+ *Připravuje se: bety do 1.22.0-beta.8. 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,
@@ -21,7 +21,8 @@ Změny každé verze ve zkratce. Úplné poznámky a instalační řádky jsou n
21
21
  nesmažou. Po odmítnutí přijde otázka ještě jednou, když `.strom` výrazně přeroste samotný výzkum.
22
22
  Pomalý start na OneDrive nebo síťovém disku: menu a `strom doctor` už neotevírají každý sken, návrat do menu je
23
23
  okamžitý, doctor ukazuje průběh a řekne, když výzkum leží v cloudu nebo na síťovém disku; `strom doctor --timing`
24
- ukáže, co trvalo dlouho.
24
+ ukáže, co trvalo dlouho. Na dlouhém výzkumu (stovky lidí, desítky tisíc skenů) ukáže menu hned, co čeká: počet se
25
+ drží vedle výzkumu, dokud se nezmění nic, z čeho vychází, a pak se spočítá znovu za zlomek sekundy.
25
26
  - **Archiv, který neodpovídá, zastaví smyčku agenta.** `strom fetch` řekne, kdy to zkusit znovu a co dělat mezitím;
26
27
  stejný dotaz ve stejném sezení skončí hned (exit 8) a nic neodešle. Úkol, jehož archiv má pauzu, počká mimo frontu
27
28
  (plán ho ukáže odložený do té doby) a `strom run --loop` do té doby počká, místo aby pouštěl sezení bez práce.
@@ -43,9 +44,16 @@ Změny každé verze ve zkratce. Úplné poznámky a instalační řádky jsou n
43
44
  Region se prohledává jen v letech, kdy v jeho místech žili lidé stromu (jejich údaje tam a pět let kolem nich; až
44
45
  do dneška, jen když údaje sahají do posledních 30 let) – pár let ve válce v cizině jsou jen ty roky. Když později
45
46
  nalezený předek žil v regionu dřív nebo později, nebo region sdílí jiný výzkum, prohledají se jednou jen nové roky.
47
+ Region, v jehož letech nežil nikdo ze stromu (údaje v jeho místech leží všechny před ním nebo po něm), se
48
+ neprohledává vůbec; přehled i aplikace Strom řeknou, že tam v těch letech nikdo ze stromu nežil.
46
49
  `strom history status` a `strom plan` ukážou roky každého regionu a co čeká.
47
50
  Co se ukazuje, spravuje člověk v aplikaci Strom nebo přes `strom history`: událost skrytá, nebo smazaná – ze všech
48
51
  výzkumů na tomto počítači, znovu se nezapíše – a obnovená; region nebo místo vynechané; regiony místa přiřazené ručně.
52
+ Dějiny jednoho místa a okolí – požáry, povodně, bitvy poblíž, panství, farnost, škola – se hledají na slovo
53
+ člověka (z karty osoby v aplikaci Strom), první při nejbližším sezení, a zůstanou pro všechny výzkumy na tomto
54
+ počítači s tímto místem. Každé místo se souřadnicemi se může hledat samo, nejdřív místa s nejvíc osobami: Nastavení
55
+ → Samostatná práce agenta → Dějiny jednotlivých míst automaticky (vypnuté, dokud se nezapne). Událost, o kterou se
56
+ požádá v rozhovoru, přidá agent ze stránky, kterou strom přečetl, s jejím zdrojem.
49
57
  Vyprávění ji berou jako pozadí doby: události z let, kdy člověk žil v místech svých údajů, každou s jejím zdrojem,
50
58
  nikdy jako to, co dělal (u páru jen z let, kdy žili oba); nic skrytého ani smazaného. Schválené vyprávění zůstane, jak je – dějiny přijdou až s jeho
51
59
  další verzí, která čeká na schválení. Vypnout se dá v nastavení nebo v aplikaci Strom
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.7. Der Abschnitt ist mit dem Release vollständig.*
10
+ *In Vorbereitung: die Betas bis 1.22.0-beta.8. 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
@@ -23,7 +23,9 @@ Die Änderungen jeder Version in Kürze. Die vollständigen Hinweise und die Ins
23
23
  `.strom` weit über die Forschung hinauswächst.
24
24
  Langsamer Start auf OneDrive oder einem Netzlaufwerk: Menü und `strom doctor` öffnen nicht mehr jeden Scan, die
25
25
  Rückkehr ins Menü ist sofort da, doctor zeigt den Fortschritt und meldet, wenn die Forschung in einem Cloud-Ordner
26
- oder auf einem Netzlaufwerk liegt; `strom doctor --timing` zeigt, was lange dauerte.
26
+ oder auf einem Netzlaufwerk liegt; `strom doctor --timing` zeigt, was lange dauerte. Bei einer langen Forschung
27
+ (viele hundert Personen, Zehntausende Scans) zeigt das Menü sofort, was wartet: Die Zahl wird neben der Forschung
28
+ gehalten, bis sich etwas ändert, worauf sie beruht, und dann in einem Bruchteil einer Sekunde neu gezählt.
27
29
  - **Ein Archiv, das nicht antwortet, beendet die Schleife des Agenten.** `strom fetch` sagt, wann es wieder zu
28
30
  versuchen ist und was bis dahin zu tun ist; dieselbe Anfrage in derselben Sitzung endet sofort (Exit 8) und sendet
29
31
  nichts. Eine Aufgabe, deren Archiv pausiert, wartet bis dahin außerhalb der Warteschlange (der Plan zeigt sie bis zu
@@ -49,11 +51,19 @@ Die Änderungen jeder Version in Kürze. Die vollständigen Hinweise und die Ins
49
51
  Eine Region wird nur in den Jahren durchsucht, in denen Personen des Stammbaums an ihren Orten lebten (ihre Angaben
50
52
  dort und fünf Jahre darum; bis heute nur, wenn die Angaben in die letzten 30 Jahre reichen) – ein paar Jahre im
51
53
  Krieg im Ausland sind nur diese Jahre. Lebte ein später gefundener Vorfahre früher oder später dort, oder teilt eine
52
- andere Forschung die Region, werden einmal nur die neuen Jahre durchsucht. `strom history status` und `strom plan`
53
- zeigen die Jahre jeder Region und was wartet.
54
+ andere Forschung die Region, werden einmal nur die neuen Jahre durchsucht. Eine Region, in deren Jahren niemand
55
+ aus dem Stammbaum lebte (die Angaben an ihren Orten liegen alle davor oder danach), wird gar nicht durchsucht; die
56
+ Übersicht und die Strom-App sagen, dass dort in jenen Jahren niemand aus dem Stammbaum lebte. `strom history status`
57
+ und `strom plan` zeigen die Jahre jeder Region und was wartet.
54
58
  Was gezeigt wird, verwaltet der Mensch in der Strom-App oder mit `strom history`: ein Ereignis ausgeblendet, oder
55
59
  gelöscht – aus jeder Forschung auf diesem Computer, nie wieder eingetragen – und wiederhergestellt; eine Region oder
56
60
  ein Ort übersprungen; die Regionen eines Orts von Hand zugeordnet.
61
+ Die Geschichte eines einzelnen Ortes und seiner Umgebung – Brände, Hochwasser, Schlachten in der Nähe, die
62
+ Herrschaft, die Pfarrei, die Schule – wird auf das Wort eines Menschen gesucht (aus der Personenkarte der
63
+ Strom-App), zuerst in der nächsten Sitzung, und bleibt für jede Forschung auf diesem Computer mit diesem Ort. Jeder
64
+ Ort mit Koordinaten kann von selbst gesucht werden, die Orte mit den meisten Personen zuerst: Einstellungen → Der
65
+ Agent allein → Geschichte der einzelnen Orte automatisch (aus, bis es eingeschaltet wird). Ein Ereignis, um das im
66
+ Gespräch gebeten wird, trägt der Agent von einer Seite ein, die strom gelesen hat, mit seiner Quelle.
57
67
  Die Erzählungen nehmen sie als Hintergrund ihrer Zeit: die Ereignisse der Jahre, in denen ein Mensch an den Orten
58
68
  seiner Angaben lebte, jedes mit seiner Quelle, nie als das, was er tat (bei einem Paar nur die Jahre, in denen
59
69
  beide lebten); nichts Ausgeblendetes oder Gelöschtes. Eine
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.7. The section is complete with the release.*
10
+ *In preparation: the betas up to 1.22.0-beta.8. 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
@@ -21,7 +21,9 @@ The changes of each version in short. The full notes and the install lines are o
21
21
  smaller then, never removed. After a no, the question comes once more when `.strom` grows far beyond the research.
22
22
  Slow start on OneDrive or a network drive found and fixed: the menu and `strom doctor` no longer open every scan,
23
23
  return to the menu at once, doctor shows its progress and says when the research lies in a cloud folder or on a
24
- network drive; `strom doctor --timing` tells what took long.
24
+ network drive; `strom doctor --timing` tells what took long. On a long research (hundreds of people, tens of
25
+ thousands of scans) the menu shows what waits at once: its count is kept beside the research until something it
26
+ stands on changes, and counted again in a fraction of a second.
25
27
  - **An archive that stops answering stops the agent's loop.** `strom fetch` says when to try again and what to do
26
28
  meanwhile; asked again in the same session it ends at once (exit 8) and sends nothing. A task whose archive is left
27
29
  alone waits out of the queue until then (the plan shows it put off until that time), and `strom run --loop` waits
@@ -48,10 +50,18 @@ The changes of each version in short. The full notes and the install lines are o
48
50
  A region is searched only in the years the tree's people lived at its places (their facts there and five years
49
51
  around them; up to today only when the facts reach the last 30 years) — a few years at a war abroad are those years
50
52
  alone. When an ancestor found later lived there earlier or later, or another research shares the region, only the
51
- new years are searched, once. `strom history status` and `strom plan` show each region's years and what waits.
53
+ new years are searched, once. A region whose years none of the tree's people lived in (the facts at its places all
54
+ lie before or after it) is not searched at all; the status and the Strom app say nobody of the tree lived there in
55
+ those years. `strom history status` and `strom plan` show each region's years and what waits.
52
56
  What is shown is the person's to manage, in the Strom app or with `strom history`: an event hidden, or deleted —
53
57
  from every research on this computer, never written again — and restored; a region or a place skipped; a place's
54
58
  regions assigned by hand.
59
+ The history of a single place and its surroundings — fires, floods, battles nearby, the estate, the parish, the
60
+ school — is looked for at a person's word (from a person's card in the Strom app), first at the next session, and
61
+ kept for every research on this computer with that place. Each place with coordinates can be looked for by itself,
62
+ the places of the most people first: Settings → The agent working alone → History of each place, by itself (off
63
+ until turned on). An event asked for in a conversation is added by the agent from a page strom read, with its
64
+ source.
55
65
  The stories take it as the background of their time: the events of the years each person lived at their places,
56
66
  each with its source, never as what the person did (a couple's, only the years both lived); nothing hidden or
57
67
  deleted. An approved story stays as it is —
@@ -732,6 +732,7 @@
732
732
  "archive.wait": "Rozhodnutí o stahování z archivu {title}",
733
733
  "history.why.archive": "Dokud je výzkum vedený jako archiv, nic se nehledá.",
734
734
  "history.why.held": "Události regionu {region} hledá jiný výzkum na tomto počítači.",
735
+ "history.why.nobody": "V těch letech tu nikdo ze stromu nežil.",
735
736
  "history.places.what": "Místa údajů pro dějiny předků ({n}): regiony, kam které patřilo, i s roky",
736
737
  "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",
737
738
  "history.places.done": "každé místo přiřazené k regionům i s roky, nebo označené jako nedohledané",
@@ -740,6 +741,7 @@
740
741
  "history.region.why": "co předkové zažili, ukázané u jejich životů",
741
742
  "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ý",
742
743
  "history.region.finished": "události regionu {region} jsou hotové",
744
+ "history.region.nobody": "v letech regionu {region} tam nikdo ze stromu nežil: jeho události se nehledají",
743
745
  "history.gaps.what": "Události dějin v regionu {region} pro roky, kdy katalog žádné nemá: {years}",
744
746
  "history.gaps.why": "osoby stromu tam v těch letech žily a u jejich životů se z tehdejších dějin nic neukazuje",
745
747
  "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í",
@@ -754,6 +756,15 @@
754
756
  "history.extend.gone": "roky {years} už nejsou roky osob tohoto stromu v regionu {region}: údaje jeho osob v tom regionu se změnily",
755
757
  "history.years.what": "Události dějin v regionu {region} pro roky, které se ještě neprohledaly: {added}; a pro roky, kdy katalog žádné nemá: {gaps}",
756
758
  "history.years.why": "osoby stromu tam v těch letech žily: část roků se nikdy neprohledala, u zbytku se z tehdejších dějin nic neukazuje",
759
+ "history.place.area": "{place} s farností, panstvím a okolím do zhruba {km} km",
760
+ "history.place.what": "Dějiny místa {place} a okolí: požáry, povodně, bitvy poblíž, změny panství a farnosti, škola, kronika",
761
+ "history.place.where": "kronika místa, jeho farnost a panství, místní muzeum, stránky obce, regionální literatura — do zhruba {km} km",
762
+ "history.place.why": "co předkové prožili přímo ve svém místě, ukázané u jejich životů",
763
+ "history.place.done": "události místa a okolí nalezené, každá ze stránky, kterou strom sám přečetl, a řečeno, co se prohledalo — nebo nic, když žádná událost hodná zápisu doložená není",
764
+ "history.place.finished": "dějiny místa {place} jsou hotové",
765
+ "history.place.why.off": "Dějiny předků jsou vypnuté.",
766
+ "history.place.why.skipped": "Dějiny tohoto místa se v tomto výzkumu nehledají.",
767
+ "history.place.why.pace": "Čeká na řadu v tempu dějin.",
757
768
  "review.reread.what": "Přečíst znovu modelem {model}, o co se opírají údaje osoby {name}: {list}{more}",
758
769
  "review.reread.why": "tyto zápisy četl jen jiný model; {model} je ten, kterým uživatel čte teď ({research})",
759
770
  "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",
@@ -1195,6 +1206,8 @@
1195
1206
  "ui.history.past.shown": "Znovu zobrazeno: {event} – {where}",
1196
1207
  "ui.history.past.same": "Beze změny: {event} – {where}",
1197
1208
  "ui.history.past.first": "Dějiny regionu {region} přijdou na řadu první z regionů, při nejbližším sezení dějin.",
1209
+ "ui.history.place.asked": "Dějiny místa {place} a okolí přijdou na řadu první, při nejbližším sezení výzkumu.",
1210
+ "ui.history.place.again": "Dějiny místa {place} a okolí se budou hledat znovu, první, při nejbližším sezení výzkumu; co se našlo, zůstane.",
1198
1211
  "ui.history.past.redo": "Události regionu {region} se budou hledat znovu (nalezené zůstávají).",
1199
1212
  "ui.history.past.where.tree": "v celém stromu",
1200
1213
  "ui.history.past.region.hidden": "Skryto: vše z regionu {region}",
@@ -2712,6 +2725,7 @@
2712
2725
  "ui.archives.state.way": "{way}, rozhodnuto {date}",
2713
2726
  "ui.link.archive.none": "O tomto archivu tu není co rozhodnout. Nic se nestalo.",
2714
2727
  "ui.experiments.link": "Hledání událostí dějin se zapíná jen v terminálu, který otevře odkaz.",
2728
+ "ui.history.place.link": "Dějiny místa se hledají jen na slovo dané v terminálu, který otevře odkaz.",
2715
2729
  "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",
2716
2730
  "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.",
2717
2731
  "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.",
@@ -2724,11 +2738,17 @@
2724
2738
  "ui.history.pace.off": "vypnuto – dějiny se nehledají",
2725
2739
  "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:",
2726
2740
  "ui.alone.history": "Dějiny míst: {state}",
2741
+ "ui.alone.places": "Dějiny jednotlivých míst automaticky: {state}",
2742
+ "ui.alone.places.about": "Dějiny každého místa se souřadnicemi a jeho okolí – požáry, povodně, bitvy poblíž, panství, farnost, škola – se hledají samy, jedno místo po druhém v tempu dějin, nejdřív místa, kde žilo nejvíc lidí. Jednou prohledané místo se znovu nehledá. Jedno místo se hledá na požádání vždy, i když je tohle vypnuté.",
2743
+ "ui.alone.places.on": "Zapnout?",
2744
+ "ui.alone.places.off": "Vypnout? Co se našlo, zůstane.",
2745
+ "ui.alone.places.history": "Dějiny jednotlivých míst se hledají jen při zapnutých dějinách míst (5).",
2727
2746
  "ui.history.offer": "Novinka této verze: události dějin v místech předků – války, epidemie, sčítání, změny státu, každá se zdrojem; aplikace Strom je ukáže v průběhu života. Zatím se nehledají a samo se nic nezapne.",
2728
2747
  "ui.history.offer.no": "teď ne – nic se nezapne",
2729
2748
  "ui.history.offer.later": "Dějiny se nehledají. Později: Nastavení → Samostatná práce agenta → Dějiny míst, nebo z aplikace Strom.",
2730
2749
  "ui.history.offer.on": "Dějiny se hledají: {pace}. Jak často, jde změnit: Nastavení → Samostatná práce agenta → Dějiny míst, nebo z aplikace Strom.",
2731
2750
  "ui.consent.history.pace": "Hledat události dějin častěji – {pace}? Stojí to víc času agenta i čerpání předplatného.",
2751
+ "ui.consent.history.places": "Hledat samo dějiny každého místa se souřadnicemi a jeho okolí – požáry, povodně, bitvy poblíž, panství, farnost, škola? Jedno sezení agenta na místo, v tempu dějin; stojí to čas agenta i čerpání předplatného.",
2732
2752
  "ui.plan.history": "Dějiny míst: {what} – {when}.",
2733
2753
  "ui.plan.history.now": "v příštím sezení",
2734
2754
  "ui.plan.history.places": "příští sezení – nejdřív zmapovat místa",
@@ -2751,6 +2771,19 @@
2751
2771
  "ui.link.experiment.off.already": "Hledání událostí dějin je pro tento výzkum vypnuté už. Nic se nestalo.",
2752
2772
  "ui.link.experiment.archive": "Dokud je výzkum vedený jako archiv, události dějin se nehledají. Nic se nestalo.",
2753
2773
  "ui.link.experiment.waiting": "Na tomto výzkumu se na tomto počítači nepracuje, a tak se události dějin nehledají. Nic se nestalo.",
2774
+ "ui.link.what.history.place": "hledat dějiny místa {place} a okolí – požáry, povodně, bitvy poblíž, panství, farnost, škola",
2775
+ "ui.link.history.place.minutes": "Jedno sezení agenta, zhruba {from}–{to} minut; stojí to čas agenta i čerpání předplatného.",
2776
+ "ui.link.history.place.usd": "Taková sezení tu zatím stála {from}–{to}.",
2777
+ "ui.link.history.place.done": "Dějiny místa {place} a okolí jsou ve frontě první.",
2778
+ "ui.link.history.place.now": "Spustit sezení hned?",
2779
+ "ui.link.history.place.none": "Místo {place} v tomto výzkumu není. Nic se neudělalo.",
2780
+ "ui.link.history.off": "Hledání událostí dějin je pro tento výzkum vypnuté a dějiny místa se hledají jen při zapnutém. Nic se neudělalo.",
2781
+ "ui.link.what.experiment.places": "hledat samo dějiny každého místa se souřadnicemi a jeho okolí, jedno místo po druhém",
2782
+ "ui.link.experiment.places.count": "Míst se souřadnicemi: {n}, z nich už prohledaných: {done}.",
2783
+ "ui.link.experiment.places.on.done": "Dějiny jednotlivých míst se hledají samy, v tempu dějin.",
2784
+ "ui.link.experiment.places.on.already": "Dějiny jednotlivých míst se už hledají samy. Nic se neudělalo.",
2785
+ "ui.link.experiment.places.off.done": "Dějiny jednotlivých míst se v tomto výzkumu už samy nehledají; co se našlo, zůstane, a místo na požádání se hledá dál.",
2786
+ "ui.link.experiment.places.off.already": "Dějiny jednotlivých míst se v tomto výzkumu samy nehledají. Nic se neudělalo.",
2754
2787
  "ui.error.archive.permission": "stahování snímků z archivu {title} ({hosts}) čeká na rozhodnutí – podmínky archivu automatické stahování omezují; z archivu se nic nestahovalo",
2755
2788
  "ui.error.archive.permission.new": "stahování snímků z archivu {title} ({hosts}) čeká na rozhodnutí – čtení podmínek stahovačem zatím nikdo nepotvrdil; z archivu se nic nestahovalo",
2756
2789
  "ui.error.archive.permission.hint": "rozhodnout v menu strom (Co čeká), nebo v terminálu: strom allow archive {host} --way {ways}",
@@ -732,6 +732,7 @@
732
732
  "archive.wait": "Entscheidung über das Herunterladen aus dem Archiv {title}",
733
733
  "history.why.archive": "Solange die Forschung als Archiv geführt wird, wird nichts gesucht.",
734
734
  "history.why.held": "Die Ereignisse von {region} sucht eine andere Forschung auf diesem Computer.",
735
+ "history.why.nobody": "In jenen Jahren lebte hier niemand aus dem Stammbaum.",
735
736
  "history.places.what": "Die Orte der Angaben für die Geschichte der Vorfahren ({n}): zu welchen Regionen jeder gehörte, mit den Jahren",
736
737
  "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",
737
738
  "history.places.done": "jeder Ort seinen Regionen mit den Jahren zugeordnet oder als nicht auffindbar vermerkt",
@@ -740,6 +741,7 @@
740
741
  "history.region.why": "was die Vorfahren erlebten, bei ihren Lebensläufen gezeigt",
741
742
  "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",
742
743
  "history.region.finished": "die Ereignisse von {region} sind fertig",
744
+ "history.region.nobody": "in den Jahren von {region} lebte dort niemand aus dem Stammbaum: keine Ereignisse gesucht",
743
745
  "history.gaps.what": "Ereignisse der Geschichte in {region} für die Jahre, in denen der Katalog keines hat: {years}",
744
746
  "history.gaps.why": "Personen des Stammbaums lebten in diesen Jahren dort, und bei ihren Lebensläufen erscheint nichts von der damaligen Geschichte",
745
747
  "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",
@@ -754,6 +756,15 @@
754
756
  "history.extend.gone": "die Jahre {years} sind keine Jahre der Personen dieses Stammbaums in {region} mehr: die Angaben seiner Personen dort haben sich geändert",
755
757
  "history.years.what": "Ereignisse der Geschichte in {region} für die noch nicht durchsuchten Jahre: {added}; und für die Jahre, in denen der Katalog keines hat: {gaps}",
756
758
  "history.years.why": "Personen des Stammbaums lebten dort in diesen Jahren: ein Teil wurde nie durchsucht, beim Rest erscheint nichts von der damaligen Geschichte",
759
+ "history.place.area": "{place} mit Pfarrei, Herrschaft und Umgebung im Umkreis von etwa {km} km",
760
+ "history.place.what": "Geschichte von {place} und Umgebung: Brände, Hochwasser, Schlachten in der Nähe, Wechsel der Herrschaft und der Pfarrei, die Schule, die Chronik",
761
+ "history.place.where": "die Chronik des Ortes, seine Pfarrei und Herrschaft, das örtliche Museum, die Seiten der Gemeinde, die regionale Literatur — im Umkreis von etwa {km} km",
762
+ "history.place.why": "was die Vorfahren an ihrem eigenen Ort erlebten, bei ihrem Leben gezeigt",
763
+ "history.place.done": "die Ereignisse des Ortes und der Umgebung gefunden, jedes von einer Seite, die strom selbst gelesen hat, und gesagt, was durchsucht wurde — oder nichts, wenn kein Ereignis belegt ist, das einen Eintrag verdient",
764
+ "history.place.finished": "die Geschichte von {place} ist fertig",
765
+ "history.place.why.off": "Die Geschichte der Vorfahren ist ausgeschaltet.",
766
+ "history.place.why.skipped": "Die Geschichte dieses Ortes wird in dieser Forschung nicht gesucht.",
767
+ "history.place.why.pace": "Wartet auf die Reihe im Tempo der Geschichte.",
757
768
  "review.reread.what": "Mit {model} neu lesen, worauf die Angaben von {name} beruhen: {list}{more}",
758
769
  "review.reread.why": "diese Einträge hat nur ein anderes Modell gelesen; mit {model} liest der Nutzer jetzt ({research})",
759
770
  "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",
@@ -1195,6 +1206,8 @@
1195
1206
  "ui.history.past.shown": "Wieder angezeigt: {event} – {where}",
1196
1207
  "ui.history.past.same": "Unverändert: {event} – {where}",
1197
1208
  "ui.history.past.first": "Die Geschichte von {region} kommt als erste der Regionen an die Reihe, bei der nächsten Sitzung der Geschichte.",
1209
+ "ui.history.place.asked": "Die Geschichte von {place} und Umgebung kommt zuerst an die Reihe, bei der nächsten Sitzung der Forschung.",
1210
+ "ui.history.place.again": "Die Geschichte von {place} und Umgebung wird erneut gesucht, zuerst, bei der nächsten Sitzung der Forschung; was gefunden wurde, bleibt.",
1198
1211
  "ui.history.past.redo": "Die Ereignisse von {region} werden erneut gesucht (die gefundenen bleiben).",
1199
1212
  "ui.history.past.where.tree": "im ganzen Stammbaum",
1200
1213
  "ui.history.past.region.hidden": "Ausgeblendet: alles aus {region}",
@@ -2712,6 +2725,7 @@
2712
2725
  "ui.archives.state.way": "{way}, entschieden am {date}",
2713
2726
  "ui.link.archive.none": "Über dieses Archiv gibt es hier nichts zu entscheiden. Es ist nichts geschehen.",
2714
2727
  "ui.experiments.link": "Die Suche nach den Ereignissen der Geschichte wird nur im Terminal eingeschaltet, das der Link öffnet.",
2728
+ "ui.history.place.link": "Die Geschichte eines Ortes wird nur auf das Wort hin gesucht, das im Terminal gegeben wird, das der Link öffnet.",
2715
2729
  "ui.link.what.experiment.history": "die Ereignisse der Geschichte an den Orten dieses Stammbaums suchen – Kriege, Epidemien, Volkszählungen, Änderungen des Staates",
2716
2730
  "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.",
2717
2731
  "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.",
@@ -2724,11 +2738,17 @@
2724
2738
  "ui.history.pace.off": "aus – keine Geschichte gesucht",
2725
2739
  "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:",
2726
2740
  "ui.alone.history": "Geschichte der Orte: {state}",
2741
+ "ui.alone.places": "Geschichte der einzelnen Orte automatisch: {state}",
2742
+ "ui.alone.places.about": "Die Geschichte jedes Ortes mit Koordinaten und seiner Umgebung – Brände, Hochwasser, Schlachten in der Nähe, Herrschaft, Pfarrei, Schule – wird von selbst gesucht, ein Ort nach dem anderen im Tempo der Geschichte, zuerst die Orte mit den meisten Menschen. Ein einmal durchsuchter Ort wird nicht wieder gesucht. Ein einzelner Ort wird auf Wunsch immer gesucht, auch wenn dies aus ist.",
2743
+ "ui.alone.places.on": "Einschalten?",
2744
+ "ui.alone.places.off": "Ausschalten? Was gefunden wurde, bleibt.",
2745
+ "ui.alone.places.history": "Die Geschichte der einzelnen Orte wird nur gesucht, solange die Geschichte der Orte an ist (5).",
2727
2746
  "ui.history.offer": "Neu in dieser Version: die Ereignisse der Geschichte an den Orten der Vorfahren – Kriege, Epidemien, Volkszählungen, Änderungen des Staates, jedes mit seiner Quelle; die Strom-App zeigt sie im Lebenslauf. Noch nicht gesucht, nichts schaltet sich von selbst ein.",
2728
2747
  "ui.history.offer.no": "jetzt nicht – nichts wird eingeschaltet",
2729
2748
  "ui.history.offer.later": "Nicht gesucht. Später: Einstellungen → Der Agent allein → Geschichte der Orte, oder aus der Strom-App.",
2730
2749
  "ui.history.offer.on": "Geschichte wird gesucht: {pace}. Wie oft, lässt sich ändern: Einstellungen → Der Agent allein → Geschichte der Orte, oder aus der Strom-App.",
2731
2750
  "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.",
2751
+ "ui.consent.history.places": "Die Geschichte jedes Ortes mit Koordinaten und seiner Umgebung von selbst suchen – Brände, Hochwasser, Schlachten in der Nähe, Herrschaft, Pfarrei, Schule? Eine Sitzung des Agenten je Ort, im Tempo der Geschichte; das kostet Zeit des Agenten und Nutzung des Abos.",
2732
2752
  "ui.plan.history": "Geschichte der Orte: {what} – {when}.",
2733
2753
  "ui.plan.history.now": "in der nächsten Sitzung",
2734
2754
  "ui.plan.history.places": "nächste Sitzung – zuerst die Orte zuordnen",
@@ -2751,6 +2771,19 @@
2751
2771
  "ui.link.experiment.off.already": "Die Suche nach den Ereignissen der Geschichte ist für diese Forschung schon ausgeschaltet. Es ist nichts geschehen.",
2752
2772
  "ui.link.experiment.archive": "Solange die Forschung als Archiv geführt wird, wird nach Ereignissen der Geschichte nicht gesucht. Es ist nichts geschehen.",
2753
2773
  "ui.link.experiment.waiting": "An dieser Forschung wird auf diesem Computer nicht gearbeitet, daher wird nach Ereignissen der Geschichte nicht gesucht. Es ist nichts geschehen.",
2774
+ "ui.link.what.history.place": "die Geschichte von {place} und Umgebung suchen – Brände, Hochwasser, Schlachten in der Nähe, Herrschaft, Pfarrei, Schule",
2775
+ "ui.link.history.place.minutes": "Eine Sitzung des Agenten, etwa {from}–{to} Minuten; das kostet Zeit des Agenten und Nutzung des Abos.",
2776
+ "ui.link.history.place.usd": "Solche Sitzungen kosteten hier bisher {from}–{to}.",
2777
+ "ui.link.history.place.done": "Die Geschichte von {place} und Umgebung steht in der Warteschlange an erster Stelle.",
2778
+ "ui.link.history.place.now": "Die Sitzung gleich starten?",
2779
+ "ui.link.history.place.none": "Den Ort {place} gibt es in dieser Forschung nicht. Nichts wurde getan.",
2780
+ "ui.link.history.off": "Die Suche nach Ereignissen der Geschichte ist für diese Forschung aus, und die Geschichte eines Ortes wird nur gesucht, solange sie an ist. Nichts wurde getan.",
2781
+ "ui.link.what.experiment.places": "die Geschichte jedes Ortes mit Koordinaten und seiner Umgebung von selbst suchen, einen Ort nach dem anderen",
2782
+ "ui.link.experiment.places.count": "Orte mit Koordinaten: {n}, davon schon durchsucht: {done}.",
2783
+ "ui.link.experiment.places.on.done": "Die Geschichte der einzelnen Orte wird von selbst gesucht, im Tempo der Geschichte.",
2784
+ "ui.link.experiment.places.on.already": "Die Geschichte der einzelnen Orte wird schon von selbst gesucht. Nichts wurde getan.",
2785
+ "ui.link.experiment.places.off.done": "Die Geschichte der einzelnen Orte wird in dieser Forschung nicht mehr von selbst gesucht; was gefunden wurde, bleibt, und ein gewünschter Ort wird weiter gesucht.",
2786
+ "ui.link.experiment.places.off.already": "Die Geschichte der einzelnen Orte wird in dieser Forschung nicht von selbst gesucht. Nichts wurde getan.",
2754
2787
  "ui.error.archive.permission": "das Herunterladen von Bildern aus dem Archiv {title} ({hosts}) wartet auf eine Entscheidung – seine Bedingungen schränken das automatische Herunterladen ein; beim Archiv wurde nichts angefragt",
2755
2788
  "ui.error.archive.permission.new": "das Herunterladen von Bildern aus dem Archiv {title} ({hosts}) wartet auf eine Entscheidung – die Lesart der Bedingungen durch den Downloader hat noch niemand bestätigt; beim Archiv wurde nichts angefragt",
2756
2789
  "ui.error.archive.permission.hint": "im Menü von strom entscheiden (Was wartet) oder im Terminal: strom allow archive {host} --way {ways}",
@@ -1,5 +1,5 @@
1
1
  // The brief of a session on the history of the places (the experiment experiments.history, core/pastevents.ts): a
2
- // region's events looked for on the web, or the places of the facts mapped to regions — and, in a session that reads
2
+ // region's events looked for on the web, a place's own history and its surroundings, or the places of the facts mapped to regions — and, in a session that reads
3
3
  // records, one line on the local events read in them. Only a brief of such a session speaks of it: the commands are
4
4
  // behind the experiment's gate (hidden), the guide, help and strom commands say nothing of them.
5
5
  import { langName } from "../core/lang.js";
@@ -8,6 +8,7 @@ import { match } from "../cli/registry.js";
8
8
  import { synopsis } from "./sheet.js";
9
9
  import { catalogIds, EVENT_KINDS, forGaps, GAP_DENSITY, gapsOfTask, gapText, HISTORY_PLACES_ORIGIN, HOLD_DAYS, placeNotes, readCatalog, readHidden, readPlaces, coveredBy, regionName, regionOfTask, regionPeriod, REGION_LANGS, LIVED_MARGIN, PRESENT_YEARS, searchedSpans, storyHistory, unmappedPlaces, } from "../core/pastevents.js";
10
10
  import { factPlaces } from "../gedcom/export.js";
11
+ import { AREA_KM, defaultArea, factsByRecord, placeKeyOf, placeLabel, placeOfTask, placeRecord, readPlaceCatalog, regionEventsAt, yearsAt } from "../core/placehistory.js";
11
12
  /** About so many events a region at most: rather fewer. */
12
13
  export const REGION_DENSITY = 60;
13
14
  /** So many events written already, listed in the brief (the rest: strom history status). */
@@ -47,6 +48,9 @@ export function historySections(tree, task, shared, alone) {
47
48
  return regionSections(tree, region, shared, alone, forGaps(task) ? gapsOfTask(task) : undefined);
48
49
  if (task.origin === HISTORY_PLACES_ORIGIN)
49
50
  return placesSections(tree, shared, alone);
51
+ const place = placeOfTask(task);
52
+ if (place)
53
+ return placeSections(tree, place, shared, alone);
50
54
  return undefined;
51
55
  }
52
56
  function closing(alone, lang, lines) {
@@ -112,9 +116,11 @@ function regionSections(tree, region, shared, alone, gaps) {
112
116
  ]
113
117
  .filter(Boolean)
114
118
  .join("\n")
115
- : period.undated
116
- ? `- period: ${period.from}–${period.to} — no fact at this tree's places in the region has a year: the years its places belonged to it (never before 1600), to this year`
117
- : `- period: ${period.spans.map(gapText).join(", ")} — the years this tree's people lived at its places: their facts there, ${LIVED_MARGIN} years before and after, to this year only when the facts reach the last ${PRESENT_YEARS} years; look for events of these years alone; another tree sharing the region adds its own years later`,
119
+ : period.nobody
120
+ ? "- period: none — the facts at this tree's places in the region all lie in other years: nobody of this tree lived there in its years; nothing to look for (strom session close --continue …, another task)"
121
+ : period.undated
122
+ ? `- period: ${period.from}–${period.to} — no fact at this tree's places in the region has a year: the years those places belonged to it (never before 1600), to the region's end (this year when it lasts)`
123
+ : `- period: ${period.spans.map(gapText).join(", ")} — the years this tree's people lived at its places: their facts there, ${LIVED_MARGIN} years before and after, to this year only when the facts reach the last ${PRESENT_YEARS} years; look for events of these years alone; another tree sharing the region adds its own years later`,
118
124
  period.places.length
119
125
  ? `- 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(" · ")}`
120
126
  : "",
@@ -179,6 +185,71 @@ function regionSections(tree, region, shared, alone, gaps) {
179
185
  ]));
180
186
  return out;
181
187
  }
188
+ /** A place's session (spec 020 K7.1–K7.3): the history of the place itself, its parish, estate and surroundings. */
189
+ function placeSections(tree, id, shared, alone) {
190
+ const lang = tree.lang;
191
+ const p = placeRecord(tree, id);
192
+ if (!p)
193
+ return [];
194
+ const key = placeKeyOf(tree, p);
195
+ const c = shared ? readPlaceCatalog(shared, key) : undefined;
196
+ const at = factsByRecord(tree).get(p.id);
197
+ const span = yearsAt(at);
198
+ const name = placeLabel(p, lang);
199
+ const names = [...new Set(p.names.map((n) => n.name))];
200
+ const area = c?.area ?? defaultArea(p);
201
+ const events = c?.events ?? [];
202
+ const live = events.filter((e) => !e.retracted);
203
+ const theirs = regionEventsAt(tree, shared, p.id, at);
204
+ const out = [];
205
+ out.push({
206
+ name: "history",
207
+ required: true,
208
+ pointer: "strom history status",
209
+ text: [
210
+ `## The history of ${name} (${p.id}) and its surroundings — for the Strom app`,
211
+ "The person asked for it: what the ancestors lived through at this place itself, shown in the Strom app with the lives of its people. " + NOTHING_ELSE,
212
+ `- the place: ${names.join(" · ")}${p.coords ? ` (${p.coords.lat.toFixed(3)}, ${p.coords.lon.toFixed(3)})` : ""}; ${at ? `${at.persons.size} ${at.persons.size === 1 ? "person" : "persons"} of the tree, ${at.facts} ${at.facts === 1 ? "fact" : "facts"} there${at.keys.length ? ` (as the facts write it: ${at.keys.slice(0, 5).join(" · ")})` : ""}` : "no fact of the tree there yet"}`,
213
+ `- the surroundings: the place, its parish and its estate, and what lies within about ${AREA_KM} km; what was looked through is said once, in ${REGION_LANGS.join(", ")} (strom history area ${p.id} --text-cs "…" --text-en "…" --text-de "…", ≤ 200 characters each), now: "${short(area[lang] ?? area.en ?? "", 120)}"`,
214
+ span
215
+ ? `- period: ${years(Math.max(1600, span.from - LIVED_MARGIN), Math.min(new Date().getUTCFullYear(), span.to + LIVED_MARGIN))} — the years of this tree's facts there, ${LIVED_MARGIN} years before and after; look for events of these years`
216
+ : "- period: no fact there has a year — the years the place's records speak of, never before 1600",
217
+ "- what: what happened at the place or near enough to touch its people — fires, floods, storms and hail, an epidemic there, armies passing or quartered, a battle nearby, the estate sold or divided, the parish founded or moved, the church or the school built, the railway, a factory, the end of serfdom there, the village chronicle; never what the region's catalog has (below), never a battle far away",
218
+ "- how many: rather few, only what a page documents — about 5–20; none documented: nothing written (the place is looked for, its catalog empty)",
219
+ `- kinds: ${EVENT_KINDS.join(", ")}`,
220
+ `- each event: strom history add --place ${p.id} …; 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, impersonal too`,
221
+ "- a hard event (persecution, deportation, expulsion, famine, a pogrom): --sensitive; sober and factual, no judgement, and never a guess about the people of this tree",
222
+ ...ONLY_FROM_PAGES,
223
+ "- prefer the village's or the parish's own pages, the chronicle, the municipality, the regional museum and archive, the Wikipedia of the place in its language with its references",
224
+ "- the same event again (one more source): --same-as <event>; the same kind and years yet another event: --distinct \"<why>\"; a better one in the place of one written: --replaces <event>; one that was wrong: strom history retract <event> --why \"…\"",
225
+ ].join("\n"),
226
+ });
227
+ out.push({
228
+ name: "events",
229
+ first: true,
230
+ pointer: "strom history status --app --json",
231
+ text: [
232
+ `## Events of ${p.id} written already (${live.length}${events.length > live.length ? `, ${events.length - live.length} taken back` : ""}) — never one again; another source of one: --same-as`,
233
+ ...(events.length
234
+ ? events.slice(0, EVENTS_SHOWN).map((e) => {
235
+ const mark = e.retracted?.by === "person" && !e.retracted.replacedBy ? " [deleted by the person: never again]" : e.retracted ? " [taken back]" : "";
236
+ return ` ${e.id} ${years(e.from, e.to)} ${e.kind} "${short(e.text[lang] ?? e.text.en ?? Object.values(e.text)[0] ?? "")}"${mark}`;
237
+ })
238
+ : [" none yet"]),
239
+ theirs.length ? `The regions' events at this place in its years (${theirs.length}) — the Strom app shows them here already, never written for the place (refused):` : "No region's event at this place yet.",
240
+ ...theirs.slice(0, EVENTS_SHOWN).map(({ event: e, region }) => ` ${e.id} ${years(e.from, e.to)} ${e.kind} (${region.region.id}) "${short(e.text[lang] ?? e.text.en ?? Object.values(e.text)[0] ?? "")}"`),
241
+ c?.tried.length ? `Pages strom could not read (never tried again): ${c.tried.slice(-20).map((t) => `${t.url} (${short(t.why, 40)})`).join(" · ")}` : "",
242
+ ].filter(Boolean).join("\n"),
243
+ });
244
+ const commands = [cmd(["history", "page"]), cmd(["history", "add"]), cmd(["history", "area"]), cmd(["history", "retract"])].filter(Boolean);
245
+ if (commands.length)
246
+ out.push({ name: "commands", first: true, pointer: "strom help history add", text: ["## Commands (each option as it is)", ...commands].join("\n") });
247
+ out.push(closing(alone, lang, [
248
+ `- the place looked through — events found, or none documented: strom history area ${p.id} … (what was looked through), then strom session close --done "how many events, of which years and kinds, from which sources — or what was looked at" --next "…" (the place is not looked for again unless the person asks)`,
249
+ `- time up before: strom session close --continue --summary "…" --next "what was not looked at yet" (the place stays this tree's for ${HOLD_DAYS} days)`,
250
+ ]));
251
+ return out;
252
+ }
182
253
  function placesSections(tree, shared, alone) {
183
254
  const lang = tree.lang;
184
255
  const facts = factPlaces(tree);
@@ -284,7 +355,7 @@ export function storyHistorySection(tree, task, shared) {
284
355
  if (!events.length)
285
356
  return undefined;
286
357
  const lines = events.slice(0, STORY_EVENTS_SHOWN).map((e) => {
287
- const where = [e.region ? `(${e.region})` : "", e.places.length ? `at ${e.places.join(", ")}` : "", e.age !== undefined ? `aged ${e.age}` : ""].filter(Boolean).join(" ");
358
+ const where = [e.region ? `(${e.region})` : e.place ? `(${e.place})` : "", e.places.length ? `at ${e.places.join(", ")}` : "", e.age !== undefined ? `aged ${e.age}` : ""].filter(Boolean).join(" ");
288
359
  const from = "url" in e.source ? `${e.source.title} ${e.source.url}` : `${e.source.record} ${short(e.source.cite, 60)}`;
289
360
  return ` ${e.id} ${e.date ?? years(e.from, e.to)} ${e.kind}${where ? ` ${where}` : ""}: "${short(e.text)}"${e.sensitive ? " [sensitive]" : ""} — ${from}`;
290
361
  });
@@ -44,6 +44,8 @@ import { inboxOf, requestFile, sameGroup } from "../core/waiting.js";
44
44
  import { SENDABLE, waitGroupOf, waitKindOf } from "../core/waitkind.js";
45
45
  import { openForUser } from "../core/open.js";
46
46
  import { fileRefused } from "../core/taskfiles.js";
47
+ import { historyOn } from "../core/pastevents.js";
48
+ import { placeEstimate, placeLabel, placeRecord, placesWithCoords, placeTask } from "../core/placehistory.js";
47
49
  /** What the Strom app asks, said before anything is done; true when the person goes on. */
48
50
  export async function asks(ctx, lang, root, what, note, suggested = true) {
49
51
  const name = Tree.open(root, ctx.env).config.name;
@@ -187,7 +189,9 @@ export async function archiveAsked(ctx, run, lang, root, host) {
187
189
  * asked once — what it does, how long, and that it is this computer's setting for every research on it when that
188
190
  * changes — then this computer's setting on and the research's own off taken away; off is the research's at once.
189
191
  */
190
- export async function experimentDo(ctx, run, lang, root, what) {
192
+ export async function experimentDo(ctx, run, lang, root, what, name = "history") {
193
+ if (name === "places")
194
+ return placesDo(ctx, run, lang, root, what);
191
195
  const t = translator(lang);
192
196
  const tree = Tree.open(root, ctx.env);
193
197
  const treeOff = tree.config.experimentsHistory === "off";
@@ -220,6 +224,67 @@ export async function experimentDo(ctx, run, lang, root, what) {
220
224
  out(ctx, t("ui.link.experiment.on.done"));
221
225
  return true;
222
226
  }
227
+ /** How long a session on a place's history takes, and what such sessions cost here so far (three of them measured); the menu's settings say the same. */
228
+ export function placeCost(t, lang, tree) {
229
+ const e = placeEstimate(tree);
230
+ return lines(t("ui.link.history.place.minutes", { from: e.minutes[0], to: e.minutes[1] }), e.usd ? t("ui.link.history.place.usd", { from: humanCost(e.usd[0], lang), to: humanCost(e.usd[1], lang) }) : undefined);
231
+ }
232
+ /**
233
+ * The history of each place with coordinates looked for by itself (strom-research://experiment&name=places): on is
234
+ * asked here — how many places, how long each, what such a session costs — and set in this computer's settings (only
235
+ * the person turns it on); off is the research's at once. Only while the search for the events of history is on.
236
+ */
237
+ async function placesDo(ctx, run, lang, root, what) {
238
+ const t = translator(lang);
239
+ const tree = Tree.open(root, ctx.env);
240
+ const treeOff = tree.config.experimentsHistoryPlaces === "off";
241
+ if (what === "off") {
242
+ if (treeOff || !ctx.settings.historyPlacesAuto(tree.config))
243
+ return stop(ctx, t("ui.link.experiment.places.off.already"));
244
+ if ((await run(["config", "set", "experiments.historyPlaces", "off", "--for-tree"], true)) !== 0)
245
+ return false;
246
+ out(ctx, t("ui.link.experiment.places.off.done"));
247
+ return true;
248
+ }
249
+ if (!historyOn(tree, ctx.settings))
250
+ return stop(ctx, t("ui.link.history.off"));
251
+ if (ctx.settings.historyPlacesAuto(tree.config))
252
+ return stop(ctx, t("ui.link.experiment.places.on.already"));
253
+ const userOn = ctx.settings.historyPlacesAuto(undefined);
254
+ const gps = placesWithCoords(tree, ctx.settings.shared()?.value);
255
+ const note = lines(t("ui.link.experiment.places.count", { n: gps.places, done: gps.done }), placeCost(t, lang, tree), userOn ? undefined : t("ui.link.experiment.all"));
256
+ if (!(await asks(ctx, lang, root, t("ui.link.what.experiment.places"), note, false)))
257
+ return false;
258
+ if (!userOn && (await run(["config", "set", "experiments.historyPlaces", "on"], true)) !== 0)
259
+ return false;
260
+ if (treeOff && (await run(["config", "unset", "experiments.historyPlaces", "--for-tree"], true)) !== 0)
261
+ return false;
262
+ out(ctx, t("ui.link.experiment.places.on.done"));
263
+ return true;
264
+ }
265
+ /**
266
+ * The history of one place and its surroundings asked for from the Strom app (strom-research://history&place=L…):
267
+ * the estimate said and asked here, its task on top of the queue (strom history place), then started now if wanted.
268
+ */
269
+ export async function placeSearch(ctx, run, lang, root, id) {
270
+ const t = translator(lang);
271
+ const tree = Tree.open(root, ctx.env);
272
+ const p = placeRecord(tree, id);
273
+ if (!p)
274
+ return stop(ctx, t("ui.link.history.place.none", { place: id }));
275
+ if (!historyOn(tree, ctx.settings))
276
+ return stop(ctx, t("ui.link.history.off"));
277
+ const place = placeLabel(p, lang);
278
+ if (!(await asks(ctx, lang, root, t("ui.link.what.history.place", { place }), placeCost(t, lang, tree), false)))
279
+ return false;
280
+ if ((await run(["history", "place", p.id], true)) !== 0)
281
+ return false;
282
+ const task = placeTask(Tree.open(root, ctx.env), p.id);
283
+ out(ctx, t("ui.link.history.place.done", { place }));
284
+ if (!task || !(await ctx.confirm(t("ui.link.history.place.now"), false)))
285
+ return true;
286
+ return (await run(["run", "--task", task.id])) === 0;
287
+ }
223
288
  /** A direction of the research paused, ended (each with the person's reason, if they give one) or taken up again. */
224
289
  export async function directionDo(ctx, run, lang, root, id, what) {
225
290
  const t = translator(lang);
@@ -6,6 +6,7 @@
6
6
  // and the person's help — each at a number of its own. Only the user changes these; here
7
7
  // the person at the terminal does, through the ordinary commands.
8
8
  import path from "node:path";
9
+ import { lines } from "./format.js";
9
10
  import { claudeHere, pause, subMenu, translator } from "./menu-parts.js";
10
11
  import { Tree, VERSION } from "../core/tree.js";
11
12
  import { replacedOnDisk } from "../core/self.js";
@@ -29,6 +30,8 @@ import { phoneState } from "../core/phone.js";
29
30
  import { fixEnv, pendingCount, pendingFixes } from "../commands/fixchecks.js";
30
31
  import { isArchive as archiveHere } from "../core/mode.js";
31
32
  import { isAgent } from "../core/which.js";
33
+ import { placesWithCoords } from "../core/placehistory.js";
34
+ import { placeCost } from "./menu-links.js";
32
35
  export async function settingsMenu(ctx, run, lang, root, newer) {
33
36
  const t = translator(lang);
34
37
  return subMenu(ctx, lang, () => {
@@ -383,6 +386,29 @@ async function alone(ctx, run, lang, root) {
383
386
  await applyHistory(ctx, run, h);
384
387
  },
385
388
  });
389
+ // the history of each place with coordinates, looked for by itself (spec 020 K7.4): this computer's, off unless the
390
+ // person turns it on here or from the app's link; a research may have turned it off for itself
391
+ const places = ctx.settings.historyPlacesAuto(tree);
392
+ items.push({
393
+ key: "6",
394
+ label: t("ui.alone.places", { state: t(places ? "ui.settings.on" : "ui.settings.off") }),
395
+ act: async () => {
396
+ if (!places && !ctx.settings.experimentsHistory(tree)) {
397
+ out(t("ui.alone.places.history"));
398
+ await pause(ctx, lang);
399
+ return;
400
+ }
401
+ const tr = root ? Tree.open(root, ctx.env) : undefined;
402
+ const gps = tr ? placesWithCoords(tr, shared) : undefined;
403
+ out(lines(t("ui.alone.places.about"), gps ? t("ui.link.experiment.places.count", { n: gps.places, done: gps.done }) : undefined, tr ? placeCost(t, lang, tr) : undefined));
404
+ if (!(await ctx.confirm(t(places ? "ui.alone.places.off" : "ui.alone.places.on"), false)))
405
+ return;
406
+ await run(["config", "set", "experiments.historyPlaces", places ? "off" : "on"], true);
407
+ // turned on here: a research's own off goes with it (this computer's choice is the person's)
408
+ if (!places && root && tree?.experimentsHistoryPlaces === "off")
409
+ await run(["config", "unset", "experiments.historyPlaces", "--for-tree"], true);
410
+ },
411
+ });
386
412
  if (set && shared)
387
413
  items.push({
388
414
  key: "3",
@@ -418,12 +444,13 @@ export async function offerHistory(ctx, run, lang) {
418
444
  if (!ctx.interactive || isAgent(ctx.env) || !historyOfferDue(ctx))
419
445
  return;
420
446
  const t = translator(lang);
421
- markHistoryAsked(ctx);
422
- ctx.settings.save();
423
447
  ctx.io.stdout(`\n${t("ui.history.offer")}\n`);
424
448
  const h = await chooseHistory(ctx, t("ui.setup.history"), "off", { off: t("ui.history.offer.no") });
425
449
  if (h === undefined)
426
450
  return;
451
+ // kept as asked once answered: a terminal closed on the question asks it again (found on Windows)
452
+ markHistoryAsked(ctx);
453
+ ctx.settings.save();
427
454
  if (h === "off") {
428
455
  ctx.io.stdout(`${t("ui.history.offer.later")}\n`);
429
456
  return;